强化渗透测试Dropbox
Joff Thyer//
你们中的许多人可能已经看过Beau Bullock关于渗透测试dropbox的优秀博客文章。Beau提供了关于如何使用不同平台构建基础dropbox平台的出色指导。在这种情况下,我选择了运行KALI(ARM)版本的ODroid-C2平台,并将在其基础上扩展,添加一些重要功能。我建议你们在这里阅读Beau的文章,因为我将写的内容建立在该基础之上。简而言之,Beau的优秀工作谈到了部署一个临时接入点用于攻击者/渗透测试者通信,但在某些场景中(例如多租户/多层建筑),这样的部署可能无法通过802.11访问。
作为修改后的解决方案,我将解决的两个具体问题如下:
- 添加两个额外的以太网NIC以创建透明桥接中间人(MiTM)能力。
- 添加蜂窝调制解调器用于反向通道通信,而不是802.11 WiFi。
透明桥接中间人(MiTM)能力在红队场景中非常有用。只要部署的dropbox有电池供电,测试人员可以通过任何可用方式进入组织,将dropbox连接在服务器/桌面系统和以太网墙插孔之间,然后快速离开!
想法是,一旦dropbox通电,它连接到选定的蜂窝网络,执行反向SSH连接出站到几个渗透测试者控制的系统,以便渗透测试者可以远程使用所述系统。此外,仍然非常有用的是为系统连接无线NIC以用于无线流量拦截目的。
配置透明网桥
我对透明桥接的要求非常基本。桥接解决方案必须转发任何ARP请求和带有0x0800 IP以太网类型的以太网帧。桥接还必须能够转发以太网类型0x888E的帧,这些是局域网上的可扩展认证协议(EAPOL)。这很重要,以便可以捕获未启用MACSEC的802.1X帧。部署MACSEC后,以太网帧在端点和以太网交换机之间加密,使MiTM解决方案无法操作,除非MiTM解决方案本身参与MACSEC协议。我不会解决这个方面,但MACSEC并不经常部署。
一旦你的KALI系统启动并运行,你应该首先在系统上安装“bridge-utils”。这可以通过root shell使用“apt-get”轻松完成,如下所示:
|
|
当然,这假设你的ODroid-C2通过其内部以太网接口连接到互联网。然后我建议你从你喜欢的供应商那里获取两个可靠的USB以太网NIC。我强烈建议你获取一个基于USB3的NIC,具有10/100/1000Mbps能力。我使用了一个IOCrest品牌的适配器,在亚马逊上列出这里。
系统启动后,你现在应该看到总共三个NIC,命名为eth0、eth1和eth2。你可以使用“ip link”命令来确认这一点。我们现在需要做的是创建一个透明桥接接口,以便流量可以在“eth1”和“eth2”之间桥接。我们需要确保这个桥接在系统启动时被创建。
要手动执行此操作,我们使用“brctl”命令,创建并将以太网接口添加到桥接接口。我们必须确保在此过程中生成树保持禁用。我建议为了简单起见将桥接接口命名为“br0”。要创建这个桥接,我们执行以下操作:
|
|
随后,要检查我们的工作,我们可以输入这个命令。
|
|
下一个要解决的挑战是如何让蜂窝调制解调器拨号回提供商。在我的情况下,我选择使用Ting,这是一个移动虚拟网络运营商(MVNO),利用Sprint的网络。最重要的第一步是确保你的蜂窝调制解调器正确注册到你的提供商。Ting和其他MVNO使这个过程相当容易。
配置你的蜂窝调制解调器
在继续之前,有一些软件包你必须拥有。为确保你拥有它们,执行以下步骤。
|
|
非常重要的一点是获取一个未锁定任何提供商的蜂窝调制解调器,并且与你的选定提供商兼容。在我的情况下,我选择了一个与任何GSM提供商兼容的GSM调制解调器。获取的亚马逊链接是这里。
你需要让调制解调器工作的UNIX/Linux工具叫做“wvdial”(https://en.wikipedia.org/wiki/WvDial),这是一个点对点(PPP)协议拨号器。信不信由你,蜂窝调制解调器仍然使用那个旧的“AT”命令集语法,你可能还记得使用拨号调制解调器的日子!拨号初始化命令集和其他参数将根据你的提供商而变化。在我的情况下,/etc/wvdial.conf
文件如下所列。
|
|
/etc/wvdial.conf
的内容
你必须用蜂窝调制解调器解决的另一个挑战是它们通常有两种模式。一种模式会将调制解调器挂载为USB驱动器(通常用于安装软件),而另一种模式会将调制解调器识别为调制解调器,从而产生对/dev/ttyUSB0
的访问。如果你没有正确切换模式,那么你无法访问调制解调器。/etc/usb_modeswitch.conf
的内容决定了这是如何发生的。如果你选择与本文所列不同的调制解调器,你应该在互联网上搜索正确的“MessageContent”参数。“DefaultVendor”和“DefaultProduct”可以在调制解调器连接时使用“lsusb”命令确定。
|
|
/etc/usb_modeswitch.conf
的内容
你不应该需要担心手动运行“usb_modeswitch”,因为udev守护进程会处理它。如果有任何担忧,你可以检查文件/lib/udev/rules.d/40-usb_modeswitch.rules
中的这个条目是否存在。你还可以在插入调制解调器后在/var/log/syslog
中搜索“usb_modeswitch”来确认。
现在你已经有了这些项目,你可以连接键盘和监视器并从控制台测试。确保“wvdial”正确拨号到你的蜂窝提供商非常重要。假设一切正确,你应该在成功时看到类似于下面截图的输出。使用上述名为“Ting”的配置拨号的命令如下:
|
|
假设你所有这些都正常工作,我建议在/etc/init.d
中创建一个文件,在系统启动时自动启动你的“wvdial”。我的启动脚本看起来像这样:
|
|
反向SSH隧道
现在你有一个功能正常的蜂窝调制解调器通道,下一步是建立一个反向SSH隧道到你喜欢的互联网目的地。这将使你可以随时通过反向隧道SSH到你的dropbox。
最简单的方法是在你的dropbox系统上生成一个SSH密钥,然后将公钥复制到互联网目的地系统上的SSH authorized_keys文件中。你还需要确保有一些冗余,空闲超时检查,并且SSH隧道在系统启动时立即建立。
对于反向SSH隧道,以下SSH参数很有用。
|
|
为了生成和使用密钥,我推荐椭圆曲线密码学密码,因为它在CPU消耗上总体更容易一些。
在dropbox系统上,生成你的新私钥/公钥。
然后,将“.ssh/id_ecdsa.pub”文本复制到你希望dropbox连接回的互联网连接主机的“~/.ssh/authorized_keys”文件中。这与任何其他受信任密钥SSH配置没有什么不同。
如果我们假设你要连接回的系统的互联网地址是255.99.99.99,那么你要用于建立隧道的SSH命令如下:
|
|
这意味着我们连接到远程IP地址,并要求远程系统在127.0.0.1(localhost)接口上绑定TCP端口2222,我们将随后使用它来SSH回我们的dropbox。
在我们的远程系统上,每当我们想登录到dropbox时,我们执行以下操作:
|
|
很可能,你还会希望从该远程系统交换一个公钥回你的dropbox,以便你为root账户有双向信任。这只是在连接回你的系统时使事情变得简单和快速。
对于SSH隧道的冗余,你可以选择实现多个IP地址目的地,并可能多个TCP端口。你还希望反向SSH隧道在蜂窝调制解调器连接成功完成后立即自动建立。我发现最好的方法是编写一个小脚本并将其放入“/etc/ppp/ip-up.d”目录,该目录将在PPP守护进程成功运行后立即执行。
最后,在服务器端(255.99.99.99远程端),设置几个空闲超时参数非常有帮助。原因是如果你的dropbox重新启动,我们真的需要隧道化的ssh会话超时以释放我们正在绑定的TCP端口。如果我们不这样做,我们会得到挂起的SSH守护进程会话,随后的SSH隧道将失败。
我对此的解决方案是修改远程服务器端的/etc/ssh/sshd_config
文件,以便“ClientAliveInterval”和“ClientAliveMax”选项适当设置为在5秒间隔的3次重试后超时连接。我的修改截图如下。
远程互联网主机上的“sshd_config”
额外的数据包过滤和转发
在这个阶段,我们有一个系统,有一个配置好的透明桥接接口(称为br0
),它将愉快地转发流量,并且还将SSH隧道回家供你享受!这是一个很棒的成就,但仍有几个问题你必须处理。我将这些问题总结如下:
- dropbox需要在网络上真正静默。这意味着在我们的“eth1”和“eth2”网络接口上,我们根本不能发出任何数据包。
- dropbox需要能够转发局域网上的可扩展认证协议(EAPOL)数据包。不幸的是,Linux透明桥接内核代码默认不这样做。
- 保持静默的默认行为需要在启动时配置。
- 桥接接口需要在启动时正确配置。
我通常假设我的“eth2”端口将面向网络交换机,并相应地标记事物。这在使用系统时很有帮助,尽管始终记住“eth1”和“eth2”都直接桥接到“br0”接口。
我们需要意识到的另一个行为是第2层/第3层多播流量。如果一个系统尝试向224.0.0.0/4范围内的目的地地址发出多播数据包,该数据包将自动映射到第2层,并且多播以太网帧将发往01:xx:xx:xx:xx:xx地址空间中的地址(即:设置了多播位的帧)。
使用保持静默的原则,我们需要抑制不仅潜在的多播,还有任何潜在的ARP流量。首先,在dropbox上安装额外的过滤工具,即“arptables”和“ebtables”。这使你有能力在第2层过滤数据包,并过滤ARP流量。
|
|
完成此操作并进行大量实验后,我想出了一个配置,我完全将其放入/etc/network/interfaces
文件中,以执行我需要的所有任务,这些任务是:
- 配置eth0、eth1和eth2
- 配置桥接接口(br0)
- 在桥接接口上放置链接范围本地地址
- 过滤eth2端口上的ARP流量出口
- 过滤eth2端口上的IP流量出口
- 过滤任何多播以太网流量
- 启用EAPOL流量被转发
配置也包含在这里供你使用。
|
|
关于电源预算不足的一些话
对你们中的许多人来说,电源在USB总线上经常被超额订阅可能并不奇怪。标准USB端口按规格可以提供500毫瓦,除非是USB 3.0,最多可以提供900毫瓦。好吧,让我们考虑一下,你向USB总线添加了两个以太网NIC和一个蜂窝调制解调器。你可能在每个端口的基础上没问题,但总体瓦数消耗会增加。另一件要考虑的事情是,我们的dropbox解决方案需要便携性,意味着你需要用电池为这个东西供电!
因为我完全痴迷,我决定进行一个实验。使用瓦特计,我将完全配置的dropbox插入USB充电器。ODroid-C2、两个USB NIC和蜂窝调制解调器的组合使用了总共4.7瓦(4700毫瓦)。减去蜂窝调制解调器,它下降到3000毫瓦。减去两个NIC,它下降到2700毫瓦。所以我们的附加设备单独使用高达2000毫瓦,ODroid使用剩余的2700毫瓦。我只是猜测你还会想向这个东西添加一个802.11 NIC。如果你这样做,那么你最好再考虑300-900毫瓦的最佳猜测。
蜂窝调制解调器 = 1700毫瓦 USB NIC = 150毫瓦(x 2)
使用一点数学,我们得到1安培 x 5 VDC电源能够提供最大5000毫瓦(物理学说:P(瓦特)= 伏特 x 安培)。我的测量是在空闲状态下进行的,这意味着我们非常接近最大电源预算。
答案是请确保你使用的电池解决方案能够提供至少2安培,最多可达10,000毫瓦。即使我使用了2安培电池供应,如果电池没有完全充电,我也看到蜂窝调制解调器有问题。如果你不遵循这个建议?好吧,我怀疑你的USB设备将会有电源不足,并开始表现得非常奇怪,这将是最不理想的。
前进吧,中间人所有东西!