| || | | || || || || | | |
| _____|| |_| || _ || _ || _ || |_| |
| |_____ | || | | || | | || |_| || |
|_____ || _ || |_| || |_| || ___||_ _|
_____| || | | || || || | | |
|_______||_| |__||_______||_______||___| |___|
V0.1
“艾米,技术本身没有善恶之分,关键在于如何使用它。就像死亡射线一样。”
——法恩斯沃思教授
欢迎使用 Snoopy;一个分布式跟踪与分析框架。Snoopy 仍在开发中,如有建议或更正,请随时提交。本文档概述了基本用法。如需进一步了解背景,请参阅以下内容:
客户端软件运行在我们称之为“无人机”(Drone)的设备上。无人机可以是任何具有 WiFi 接口(支持注入驱动)和出站互联网连接的 Linux 设备。Snoopy 已在诺基亚 N900 和运行 BackTrack 的笔记本电脑上测试过。无人机执行以下两项操作:
收集到的探测请求(例如,Bob 的 iPhone 搜索 BTHomeHub-4123)会定期上传到 Snoopy 服务器。所有连接到恶意 AP 的设备将通过 Snoopy 服务器访问互联网。
服务器将所有探测请求存入数据库,并使用 Wigle 确定 GPS 坐标,利用 Google Maps 确定街道地址(以及街景照片)。这意味着,如果你正在探测你的家庭网络,我可能会获得你房子的照片。
每个无人机通过 OpenVPN 连接到服务器,并拥有自己的子网。关联的客户端从无人机获取 IP 地址,并通过它路由流量。这意味着在服务器端,我们可以将客户端 IP 地址(以及 MAC 地址)与互联网活动进行匹配。
在服务器端,会发生以下操作:
网络拓扑图如下:
Client1 Drone1 Snoopy Server
+----------+ +-----------------------+ +-----------------------+
| wlan0-|<---WiFi--->|-at0 | | eth0|<-squid-sslstrip-mitmproxy->Internet
| | | | 10.2.0.1 | | 11.22.33.44| |
| dhclient | | | | | | Traffic inspection
| | | | tap0-|<-openvpn----->|-tap0 | Social media analysis
+----------+ | | 192.168.42.2 | +--/| 192.168.42.1 |
10.2.0.2 | +-----------------------+ | +-----------------------+
| |
| | route 10.2.0.0 via 192.168.42.2
| | route 10.3.0.0 via 192.168.42.3
Client2 | |
+----------+ | |
| wlan0-|<---+ |
| | |
| dhclient | |
| | |
+----------+ |
10.2.0.3 |
|
|
|
Client3 Drone2 |
+----------+ +-----------------------+ |
| wlan0-|<---WiFi--->|-at0 | |
| | | | 10.3.0.1 | |
| dhclient | | | | |
| | | | tap0-|<-openvpn--+
+----------+ | | 192.168.42.3 |
10.3.0.2 | +-----------------------+
|
|
|
Client4 |
+----------+ |
| wlan0-|<---+
| |
| dhclient |
| |
+----------+
10.3.0.3
Walter 为 Snoopy 编写了一个网页界面。可通过 http://your-snoopy-server.com:5000/ 访问。
提供了几个 Maltego 转换,用于以图形方式探索收集的数据(详情见下文)。
安装 ================ 服务器安装应该比较简单。仅在 Ubuntu 12.04 LTS 32 位的标准安装上测试过。由于会对多个服务器组件进行修改,强烈建议在全新安装的系统上运行安装脚本,并且不要在该机器上运行其他服务(如有必要)。如有疑问,请查看 install.sh 文件并手动进行修改。否则,直接运行(./install.sh)安装程序。
使用 ======== 安装完成后,你应该可以直接输入“snoopy”来加载服务器菜单。如果不行(或有疑问),请进入安装阶段创建的用户的家目录。在“snoopy/server/”目录中有一个“snoopy.sh”文件,你可以运行它。以下是菜单:
+---------------------------------------------------------------+
| Welcome to Snoopy V0.1 |
| SERVER SIDE |
| |
| SensePost Information Security |
| [email protected] / www.sensepost.com |
+---------------------------------------------------------------+
Date: Thu Nov 1 16:37:08 CET 2012
Snoopy Server Status: Stopped
Connected Drones: 0
Wigle User: setYourWigleAccount
Would you like to:
[1] (Re)Start Snoopy server components
[2] Stop Snoopy server components
[3] Manage drone configuration packs
[4] Configure server options
[5] Set web traffic injection string
[6] Observe logs
[X] Exit
[?] Help
创建无人机包 菜单中的选项 [3] 允许你为无人机设备创建客户端“包”。每个无人机都有自己的 OpenVPN 和 SSH 密钥、DHCP 范围以及路由表。你会获得每个无人机设备的下载 URL。确保服务器和无人机的时间设置正确,否则 VPN 连接将无法建立。
在无人机上安装和运行 Snoopy 你最多可以拥有 100 架无人机(如需更多,请查看源代码或给我发邮件,实际上没有限制)。安装包括下载上一步中的配置包,并运行相应的设置脚本。对于诺基亚 N900,桌面上会放置一个图标。例如:
haxor@drone001# wget http://snoopy-server.com/secretdir/drone001.tar.gz
haxor@drone001# tar xzvf drone001.tar.gz
haxor@drone001# cd snoopy && ./setup_n900.sh
查找 SSID 位置 在 www.wigle.net 上创建一个账户,并通过“配置服务器选项”设置你的凭据。
每个 Snoopy 实体可以应用不同的转换。将“Snoopy”实体拖到你的图上即可开始。如果你在实体属性中未指定开始或结束日期,默认会获取最近 5 分钟的结果(此值可在服务器配置菜单中更改)。
Snoopy 机器允许你自动排序转换,并根据需求过滤/删除节点。源代码/注释应充分说明其工作原理。
法律考虑 ======================= Snoopy 的全部或部分组件可能在你所在地区是非法的。请在使用软件前了解情况。在英国,由于广播性质,探测收集组件是合法的。然而,恶意接入点组件在大多数地区很可能是非法的。SensePost 不对你因使用此工具而惹上麻烦承担任何责任。
安全考虑 ========================== 每个“无人机包”都包含 OpenVPN 和 SSH 密钥。如果无人机被入侵(例如被盗或其他情况),可能对服务器构成安全风险。强烈建议 Snoopy 服务器专用。在服务器上创建的用户会自动在 *.ssh/authorized_hosts 文件中添加以下内容,以增加一点安全性:
"no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,command="/usr/bin/rsync ${SSH_ORIGINAL_COMMAND#* }""
未来工作 =============== 还有很多事情要做/添加。此版本更像是一个概念验证。
感谢以下人员提供的帮助/建议/意见:
问:我们知道一名外国间谍将于 11 月 11 日抵达希思罗机场,但不知道具体时间和航班。情报显示他抵达后将入住希尔顿酒店,并于 14 日从卢顿机场乘飞机离开(同样不知道时间和目的地)。他擅长伪装。我们如何识别他?
答:在希思罗机场、希尔顿酒店和卢顿机场部署 Snoopy 无人机。Maltego 的“CommonLocation”转换将找出在这三个地点同时出现的设备交集。希望只有一个结果——我们的目标人物。 一旦发现,我们可以查看 Google 地图和街景照片,了解间谍去过的地方。如果他的设备被诱骗连接到 Snoopy 恶意接入点(例如通过他的 Facebook、Twitter 或电子邮件),他的身份就可能被揭露。
让 Snoopy 记录所有连接到某个 WiFi 点并且来自某些特定国家(可能是不受欢迎的国家)的人。
在你的 10 家百货商店部署 Snoopy。记录人流量、回头客、客户类型。
注入恶意代码以接管客户端设备并安装恶意软件。由于路由表的存在,可以直接从服务器向连接的受害者发起利用。
TFL 可以在每条伦敦地铁线路上部署一个 Snoopy 无人机。他们可以监控人流量,记录高峰和低谷时段/日期,并相应分配/减少工作人员。
在伦敦各地部署 500 架 Snoopy 无人机。当人们经过无人机时监控他们的移动。如果持续数周/月,一定会出现有趣的人类移动模式。
对于基于 Linux 的桌面/笔记本电脑,Alfa AWUS036H 网卡性能一般。更可靠的网卡是 Ubiquity SR-71。欢迎提供关于哪些卡在注入驱动方面工作良好/不工作的反馈。
对于 N900,你会注意到加载注入驱动会严重缩短电池寿命。TecNet 6600mAh 电池组在测试中提供了大约 6-8 小时的使用时间。不过,你需要一个适配器将 N900 连接到任何电池组。减少(或禁用)GPS 轮询频率也有助于延长电池寿命。
关于通过 USB 将 N900 连接到笔记本电脑(用于 SSH)的技巧,请参见此处
我目前正在 RaspberryPi、Alfa R36 迷你 AP 和 SheevaPlug 上进行测试。结果稍后公布。
你可以创建自己的 Maltego 转换来探索收集的数据。提供的转换主要用于演示功能。请查看源代码,并阅读:
如有任何疑问,请联系 [email protected](或者询问出色的 Maltego 团队)。
Web UI 代码位于 ~user/snoopy/server/bin/snoopy/src/snoopy/
插件由两部分组成:
插件是一个可调用对象,由 Snoopy 应用程序动态加载。 让我们从一个例子开始:
from snoopy import db, pluginregistry
@pluginregistry.add('client-data', 'ssidlist', 'SSID List', js='/static/js/ssidlist.js')
def ssid_list(mac):
with db.SessionCtx() as session:
query = session.query(
distinct(db.Probe.probe_ssid) # SELECT DISTINCT probe_ssid FROM probes
).filter_by(
device_mac=mac # WHERE device_mac=$mac
).order_by(
db.Probe.probe_ssid # ORDER BY probe_ssid
)
return query.all()
现在逐行解释...
from snoopy import db, pluginregistry
我们需要 db 来访问 Snoopy 数据库,以及 pluginregistry 来注册我们的插件。
@pluginregistry.add('client-data', 'ssidlist', 'SSID List', js='/static/js/ssidlist.js')
这是我们注册插件的方式(插件可以是任何可调用对象)。第一个参数指定插件所属的组名。我们指定了 client-data,因为该插件接受一个 MAC 地址,并返回要在客户端数据窗口中显示的数据。除了 client-data,还有 session-data 组,该组的插件对邻近会话进行操作。第二个参数是插件名称,仅供内部使用,应为 JSON 友好格式。第三个参数是插件标题,本质上与名称相同,但标题会显示在 GUI 中。更具体地说,这是客户端数据窗口中数据区域的标题。
标题之后的所有关键字参数都保存为选项。虽然插件系统不要求任何选项,但 Snoopy 支持 js 选项。此选项指定插件 JavaScript 组件的 URL(从浏览器端,而不是从 Snoopy/服务器端)。
def ssid_list(mac):
该插件是一个简单的函数。它接受一个 MAC 地址字符串,符合 client-data 插件的定义。可调用对象的名称不会被使用。这个示例插件的主体只是执行一个 SQLAlchemy 查询,该查询基本上执行 SELECT DISTINCT probe_ssid FROM probes WHERE device_mac=$mac,并将结果作为列表返回。插件的返回值通常作为 JSON 响应的一部分添加。因此,结果必须符合 JSON 友好性(正如 Flask 的 jsonify() 函数所支持的)。
就这么简单!
用于客户端数据的前端插件被称为客户端数据处理器。它们通过 Snoopy.registerPlugin(sectionName, dataHandler) 函数注册。sectionName 是数据处理器想要处理的数据分节名称,该名称与生成数据的后端插件名称相同。dataHandler 必须是一个具有以下签名的函数:function($section, clientData) {...}。$section 是一个 jQuery 对象,代表数据处理器可以显示数据或产生影响变化的 div 元素。客户端数据(由后端插件生成)通过 clientData 参数提供。
由于数据处理器的唯一允许输出是对给定 div ($section) 的更改,因此无需返回值。
网页界面 你可以通过 http://your-snoopy-server:5000/ 访问网页界面。你可以编写自己的插件来遍历和显示数据。Walter 简化了此过程(请参见本文档附录)。
使用 Maltego 探索数据 在 Snoopy 服务器菜单中,进入“配置服务器选项” > “Maltego”。在这里你将看到用于下载 Snoopy 实体、机器以及转换 URL 的链接。要使用 Maltego 转换,你需要: