挖证据的利器:如何从任何 SQLite 数据库中提取电子邮件账户?#OSINT

  • 一直以来“取证”都是他们对我们用,但为什么不可以反过来用呢……本系列文章介绍和演示的 OSINT 技术就是这个想法

首先我会告诉你,与大多数执法或私人取证审查员相比,我对取证知之甚少。在查看取证采集的结果,看到从中流出的所有神奇数据时,我总是会发现令人惊讶的事。电子邮件地址、电话号码、用户名、社交媒体、图像、列表等等,这总是让我感到震惊,因为 #OSINT 可以利用后续应用程序来尝试扩展您对所购设备和所有者的了解。

所以我联系了一些取证专家,询问他们哪里有一个很好的取证信息来源, 我可以用来开始查询在线服务以获取更多信息。他们推荐了 Skype 数据库采用 SQLite 格式,这是一个名副其实的信息宝库。

所以我们在这篇文章中要做的是双重的:我们将构建一个 Python 脚本,可以从任何 SQLite 数据库中提取电子邮件,利用 Full Contact API 对我们找到的电子邮件帐户执行查找。我们尝试的最终输出将是一个电子表格,其中包含所有发现的社交媒体配置文件。有意思吧~那么开始。

Python 和 SQLite

SQLite 是一个基于文件的数据库系统,它具有大多数基于服务器的数据库系统所具有的许多强大功能,所有这些功能都被压缩成一个很小的文件。奇妙之处在于 Python 内置了对 SQLite 的支持,因此这将使我们很容易与我们选择的任何 SQLite 文件进行交互。

此脚本的设计将使得无论传入何种数据库,我们都将系统地遍历每个已发现的表,并搜索每个列以查找电子邮件地址,这样您就可以超越 Skype 进行探索。

SQLite 有一个名为 SQLITE_MASTER 的表,用于描述数据库的模式。我们将对此表执行查询以提取数据库中包含的所有表。从那里我们将遍历每个表 并执行 SQL SELECT 语句以从每个表中选择所有记录。当结果返回时,它们被分解为列,将逐个遍历每一列并尝试提取电子邮件地址。

开始创建一个名为 sqlite_parser.py 的 Python 脚本并输入以下代码:

第1–3行:导入我们将用于解析数据库的必要库。

第8–10行:设置一个命令行参数解析器来处理想要解析的数据库文件。

第9行:初始化一个空列表,该列表将包含我们从数据库中提取的所有匹配项。

第10行:这里我们设置一个正则表达式来匹配电子邮件地址。这不是一个详尽的模式,但它完成了这项工作。最棒的是,你可以修改为 IP 地址 (我们将在第2部分中进行)或您希望从 SQLite 数据库中提取的任何其他模式。

现在让我们连接到 SQLite 数据库并找到所有可用的表:

第13行:通过传递数据库文件的路径连接到 SQLite 数据库文件。路径来自我们传入的命令行参数。

第14行:连接后,我们创建一个 SQLite 游标对象,我们将用它向数据库发出 SQL 语句。

第16行:执行查询以从 sqlite_master 表中提取所有表,这将为我们提供可以操作的表的列表。

第18行:我们使用 fetchall()函数从第 16 行的先前查询中检索查询结果。这将返回一个列表,然后我们可以循环并执行后续查询。

现在我们需要遍历每个表,查询它的所有数据,然后遍历每一列,应用我们的正则表达式来尝试提取电子邮件地址。这将是一个更长的代码块,所以:

第20–27行:在表列表上循环(第20行),打印出有用的消息(第22行),然后在表上执行 SELECT 语句以从表中检索所有记录(第25行)。再 次使用 fetchall()函数从 SELECT 查询中检索所有记录(第27行)。

第29–31行:循环遍历结果中的每一行(第29行),然后对于每一行,循环遍历其每一列(第31行)。

第33–36行:尝试应用我们的电子邮件正则表达式(第34行),如果不匹配(第36行),回到第33行的循环顶部开始查看下一列。

第38–42行:从正则表达式中浏览匹配列表(第38行),如果遇到尚未添加的新匹配(第40行),将其添加到全局匹配列表(第42行)。

现在我们对脚本进行最后的修改,以关闭我们的数据库资源并打印出所有匹配项。将以下代码行添加到脚本中:

第43–44行:关闭数据库游标(第43行)和SQLite文件(第44行)的连接。

第48–49行:遍历所有匹配项并打印出来。

做得好! 现在让它运行起来,以确保它可以正常工作。您可以找到 Skype 的 SQLite 文件,如下所示:

对于 Mac OSX

/Users/<your_mac_username>/Library/Application\ Support/Skype/<your_skype_username>/main.db

对于 Windows

%appdata%\Skype\main.db

让它运行起来!

那么让这个小单元运行起来,查看输出结果。在这种情况下,我将 main.db 文件放在与我的 Python 脚本相同的路径:

[*] Scanning table…DbMeta

[*] Scanning table…AppSchemaVersion

[*] Scanning table…Contacts

[*] Scanning table…LegacyMessages

[*] Scanning table…Calls

[*] Scanning table…Accounts

[*] Scanning table…Transfers

…more tables scanned here

[*] Discovered 68 matches.

[email protected]

… 67 other email addresses here.

如果您得到如上所述的输出,那么您就知道一切正常! 现在让我们集成 Full Contact API,这样我们就可以在我们提取的电子邮件地址上做一些 OSINT。

集成 FullContact

现在我们可以从任何 SQLite 中提取电子邮件帐户,现在当然要利用我们想要尝试将这些电子邮件帐户归因于社交媒体或其他一些我们可以用来获取额外情报的在线展示。

我们将利用 FullContact(数据聚合器)对我们发现的电子邮件帐户进行一些额外的查找。当我们发现帐户时,我们会将它们添加到 CSV 文件中,以便我们可以使用 Excel 或 Google Fusion Tables 浏览数据,这也可以让我们轻松地将这些数据添加到其他工具中。

第一步是注册 FullContact API 密钥。完成后,将 sqlite_parser.py 脚本保存为sqlite_fullcontact.py(从此处下载),然后进行一些修改。在 import sqlite3 这一行之后添加以下内容:

完美,我们只是添加一些额外的模块和用来保存 Full Contact API 密钥的变量。如果您没有 requests 库,可以使用 pip 进行安装(在此处查看视频以获取帮助)。现在我们将开始在第 53 行的脚本底部添加代码。请执行以下操作:

第54行:打开 CSV 文件的文件句柄,将存储检索到的信息。

第55行:设置了一个字段名称列表,它将成为我们电子表格中的列。

第56行:使用 csv 模块的 DictWriter 类,传入我们在第 54 行创建的文件句柄和第55行创建的字段名称列表。DictWriter 类允许我们通过传入字典在 电子表格中写行。

第57行:我们写出了电子表格的顶行(标题),它将为我们提供任何好的电子表格应该具有的列名。

接下来,我们需要遍历 SQLite 解析到的匹配列表,并将每个电子邮件地址传递给 FullContact API,以尝试检索它们可能具有的任何结果。我们现在实 现代码来执行此操作:

第59行:只要有要处理的电子邮件地址,此代码块将继续执行。

第62–63行:为了对FullContact API进行身份验证,我们必须传入X-FullContact-APIKey HTTP头。通过设置headers字典(第62行),然后设置所需的头部和API密钥的值(第63行)来完成此操作。

第65–68行:从列表中获取一个电子邮件地址(第65行)将其打印出来(第67行),然后我们构建一个以将电子邮件地址传递给 FullContact API 端点的 URL(第68行)。

第70–72行:将请求发送到 FullContact API,在 headers 变量(第70行)中传入我们的 HTTP 头,然后休眠两秒钟(第72行)以遵守 Full Contact 服务器施加的速率限制。

我们已将请求发送出去,现在是时候测试结果了,如果有匹配,我们需要将它们存储在我们的 CSV 文件中。让我们实现代码来执行此操作:

第74行:如果从 FullContact API 收到良好的响应,我们就可以测试匹配了。

第76行:我们让 requests 库解析来自服务器的 JSON 响应,并将结果存储在 contact_object 变量中。

第78行:测试 contact_object(现在是字典)的 socialProfiles 键,它将向我们指示社交媒体配置文件的命中。

第80行:单个电子邮件帐户可以有多个社交媒体配置文件,它们存储在 socialProfiles 键的列表中。我们开始浏览每个社交媒体配置文件,并将每个配置文件存储在 profile 变量

第82–87行:初始化一个名为 record(第82行)的空字典,并用从 FullContact API 检索到的所有数据填充它。get() 函数将尝试检索您看到的每个值(type,id,username,url),如果没有值,它将自动返回 “N/A”。

第89行:将 record 字典作为新行写入 CSV 文件。

第91–96行:打印出我们找到的信息,这样就可以在脚本运行时监控输出。

我们现在需要实现一个单独的检查,以查看 FullContact API 是否希望我们在检索结果之前等待。这可能是随机发生的,老实说我不知道为什么。

我们将测试 HTTP 响应代码 202 而不是 200,然后将测试的电子邮件地址重新添加回我们的匹配列表,以确保我们不会丢弃电子邮件地址。请注意这里的缩进,它应该缩进到状态代码 200 检查:

就这样! 我们测试 202 代码,如果遇到它,我们将电子邮件地址推回到电子邮件地址列表中进行检查,然后我们休眠 30 秒。最后一行代码只是关闭与 CSV 文件关联的文件句柄。现在是时候试一试了。

让它运行起来!

您将以与运行前一个脚本完全相同的方式运行此脚本,但输出应该不同,假设您从 FullContact API 获得了良好的结果:

Justins-MacBook-Pro:Desktop justin$ python sqlite_osint_fullcontact.py -d main.db

[*] Scanning table…DbMeta

[*] Scanning table…AppSchemaVersion

[*] Scanning table…Contacts

[*] Trying [email protected]

Network: twitter

Username: jms_dot_py

URL: https://twitter.com/jms_dot_py

ID: 817668451

当然,除了这个电子邮件地址之外还有更多的命中,但是一旦掌握了 SQLite 数据库,就可以大大扩展您的调查。

在下一部分中,我们将了解如何使用 IP 地址构建映射,以演示 SQLite 解析的灵活性以及调整脚本的容易程度。下次见!⚪️

广告

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据