ARTICLE DETAIL

资讯详情

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

从Web打点到密码破解:乌托邦·王靶场如何构建渗透能力链路

从Web打点到密码破解:乌托邦·王靶场如何构建渗透能力链路 做安全这行绕不开靶场。我自己从单关的DVWA、Pikachu一路刷到综合环境中间很长一段时间处于一种状态关是过了但脑子里没有地图换个场景就不会了。后来我开始琢磨靶场设计本身发现一套好的靶场其实是一条经过编排的“能力链路”。“好靶场”平台里那套“乌托邦·王”系列是我这几年见过的、把路线讲得最清楚的一套。它把训练内容分成Web和密码两条主线再在最后合并成综合场景。往小了说它能帮入门者建立从Web打点到口令降维的完整思路往大了说它把渗透测试中最常用的两类技术能力做了体系化拆解。这篇文章不做谜题索引而是按它的进阶逻辑把两条线的关卡设计、背后的知识点、以及实际跑关时的坑都梳理一遍。适合正在刷Web靶场、想补密码学应用基础、或者准备把零散技能串成路线的朋友。1. 为什么叫“乌托邦·王”先设计能力地图再排关卡顺序1.1 从单点靶场到系列靶场缺的不是题目是依赖关系很多入门者刷完XSS-Labs、SQLi Labs之后觉得自己已经会了。但真扔给他一个业务系统他的流程是乱的看到登录框就想着绕过看到参数就想着注入不会先做信息收集、不会判断入口点优先级。“乌托邦·王”系列在这一点上的做法和普通题库完全不同。它每一条线的关卡都强制要求你使用前面关卡学过的技能否则到不了下一关。比如Web线第一关要求你注入出管理员密码但拿到了也不是终点——第二关的XSS点藏在登录后台的功能里直接利用第一关的注入点拿到cookie反而更省事。这种“上一关是下一关的必要条件”的设计才是系列靶场和单关合集最大的区别。这自然引出一个问题既然依赖关系这么重要为什么不直接上综合靶场像红日那样原因是综合靶场的信息量太大对新手不友好。“乌托邦·王”采用了一种折中单条线内保持强依赖两条线之间保持弱耦合。Web线和密码线可以单独刷最后在综合关卡合并。这样既不会一上来就把人淹没在海量资产里又保留了链路的长度。1.2 Web线的能力地图注入、跨站、上传、越权与内网入口这条线具体怎么组织按系列里的关卡顺序Web线大概分为五个阶段注入阶段覆盖数字型、字符型、搜索型、宽字节等SQL注入目标是从数据库中提取关键信息。跨站阶段反射型XSS、存储型XSS和DOM型XSS目标是理解浏览器端如何被控制。上传阶段前端校验、MIME校验、扩展名双重校验、内容校验目标是拿webshell或者落地文件。越权与逻辑阶段水平越权、垂直越权、验证码逻辑、支付逻辑这类业务漏洞目标是理解“功能越多可攻击面越大”。内网入口阶段把Web权限转换成系统命令执行读取内网配置为最后的综合渗透做铺垫。这个顺序不是拍脑袋定的。SQL注入和XSS是Web安全里最具代表性的两类漏洞一在后端一在前端先刷这两个能建立基本的“数据流”概念。上传属于典型的“从漏洞到能力转换”没有前面数据库和浏览器端的认知很难理解文件落地的意义。越权属于业务逻辑的深水区放后面是合理的。1.3 密码线的能力地图古典密码、哈希口令、无线会话与系统恢复密码线很多刷靶场的人会忽略觉得密码学难、抽象。“乌托邦·王”这条线的设计把密码从古典到现代再到系统应用做了拆分古典密码栅栏、凯撒、维吉尼亚、可视密码图片分片叠加。哈希与口令MD5、SHA1、加盐哈希、彩虹表、字典攻击。无线密码WPA2握手包捕获、字典破解。系统密码路由器console口密码恢复、Linux单用户模式重置、数据库root口令找回。看到没有第四条和传统的密码学关系不大它练的是“密码存储和认证机制”。密码靶场如果只练古典密码和哈希就跟数学题一样很难看到真实世界的投影。加入系统密码恢复之后你会意识到所谓密码攻防本质是对“认证机制缺陷”的利用而不是对加密算法本身的数学攻击。这一点我觉得是整个密码线最值钱的设计。1.4 两条线怎么合并综合关卡的装配原则当我刷到综合关卡时第一感受是这个关卡把Web和密码串成了一条攻击链。具体思路是这样Web线拿到数据库权限后发现数据库里存着一组设备的配置文件里面包含一个无线网络的SSID和加密信息密码线的任务就是把这份配置解析、还原出明文口令再回到网络环境中验证。设计者没有把两条线简单并列而是让Web线的“结果”变成密码线的“输入”。这种交叉点就是实战的常态。到这里可能有人会问你这样解析是不是把靶场说大了我的看法是如果你只是把靶场当成刷题工具那确实无所谓但如果你想通过靶场建立能力体系那么“为什么这么排关卡”比“这一关怎么过”重要得多。这也是我认为“乌托邦·王”系列值得完整拆一遍的根本原因。2. Web线核心关卡拆解万能密码、XSS三兄弟、文件上传的坑位在哪里2.1 万能密码不是魔法SQL拼接语义的现场教学“乌托邦·王”Web线第一关是一个典型的登录绕过。你打开一个看似正常的管理后台只有一个账号密码框。随便输点东西提示用户名或密码错误。网上一搜很多人直接背payload or 11 --。这一关如果只是这样过去就浪费了。先看后台代码大概长什么样$sql SELECT * FROM admin WHERE username $username AND password $password;这里username和password是从表单原样拼接进去的。当你在用户名框输入admin or 11 --时最终SQL变成SELECT * FROM admin WHERE username admin or 11 -- AND password xxx--把后面的密码判断注释掉了or 11让条件恒真所以查询结果就是全表管理员。这个payload看起来玄拆开全是SQL语法基础。我在实际刷这关时踩过的坑有两个一是把单引号写成了中文引号导致整个参数被当成字符串不生效二是URL访问时没有对空格做编码后端把空格换成%20或者用代替我一开始用的--后面没加空格就会被后面的SQL拼接吃掉。靶场虽然在第一个版本里不设过滤但在后续关卡中增加了注释符和空格的限制这就逼着你掌握--、#、/**/三种注释形式。2.2 XSS三兄弟反射、存储、DOM的差异不在“弹窗”第二关开始靶场把XSS分成了三个子关卡。很多初学者会把三者的区别背下来反射型不落地、存储型落库、DOM型不出网。但真正做题时真正的判断依据是数据流的终点在哪里。类型数据流终点是否经过服务端典型场景反射型XSS当前响应里是搜索关键词回显存储型XSS数据库所有访问者可见是评论区、留言板DOM型XSS前端JS拼接DOM否URL hash取值后innerHTML“乌托邦·王”在这部分比较花心思的是三个子关卡用的是同一个“评论系统”界面只是在不同位置埋了注入点。第一关评论内容直接回显在页面存储型第二关搜索关键词回显在结果框反射型第三关URL里的hash值被js读取后写入页面DOM型。这种同一个业务反复使用的做法比开三个独立页面更能让你直观感受“同一个功能漏洞点不同”。实操里的坑DOM型XSS经常被怀疑“这是不是XSS”因为它不出现在请求响应里你得把断点打在document.write或者innerHTML上顺着前端代码找注入点。靶场这一关会在页面上留一段压缩过的JS我一开始看到压缩代码就看不下去后来养成了先格式化再搜innerHTML和eval关键字的习惯。2.3 文件上传从前端绕过到内容检测的层层剥洋葱上传关卡其实是最容易让人“爽”的一关因为绕过很快就有结果。但“乌托邦·王”故意把这一关做成了多步的每一层防护变更都要求你换思路关卡阶段防护措施绕过思路我实测的坑第一层前端JS校验扩展名禁用JS或改包浏览器开着缓存改了包名又跳回表单第二层后端校验MIME类型把Content-Type改成image/png只改外层Content-Type没注意文件名仍带.php第三层黑名单扩展名尝试php3、phtml、.user.ini等不同中间件解析规则不同需先探明第四层文件头校验在php文件前补GIF89a附加字节引入多余内容需要补闭合逻辑比较关键的是第三层到第四层的切换。很多人看到黑名单用php、php5堵死之后就觉得无路可走。实际上得先探测中间件服务器是Apache就可能存在.user.ini的利用方式服务器是IIS就有分号截断的玩法Nginx则有解析配置错误导致的畸形上传。“乌托邦·王”每台靶机使用的中间件不同这一点官方文档不会写需要自己从响应头里猜。我因为偷懒直接按黑名单绕过方式打结果撞了一鼻子灰后来才意识到上传题的答案一半在中间件一半在防护代码。2.4 Web线和DVWA、Pikachu等主流靶场的横向对比刷这个系列时我脑子里一直有一个对比它和DVWA、Pikachu、XSS-Labs到底差在哪。做个表靶场主要特点关卡间关系适合人群DVWA漏洞类型齐全难度分等级关卡独立无强依赖刚接触Web安全的新手Pikachu贴近业务场景有配套文档关卡独立题型丰富想补全漏洞知识面的学习者XSS-Labs专精XSS逐级加防护递进关系明确但仅限XSS专练前端攻防乌托邦·王Web密码双线有强依赖链路强依赖跨域综合想建立能力体系的学习者不是说其他靶场不好而是定位不同。DVWA和Pikachu适合“扫盲”一套刷下来对漏洞类型有认知乌托邦·王适合“串线”刷完之后你会形成从输入点开始到凭据获取再到下一跳入口的完整思维。如果只刷单点靶场你学到的是“点”刷这种链路靶场学到的才是“路径”。3. 密码线核心关卡拆解栅栏密码、可视密码到WPA2握手包3.1 古典密码关手推一遍栅栏和维吉尼亚胜过背诵十条脚本密码线第一段古典密码难度不高但很多人直接拿在线工具把答案跑出来然后跳过原理。“乌托邦·王”在这些关卡里刻意把题目设计成不依赖在线工具就能手算比如给出一段密文和栅栏的栏数要求明文里自然出现某个确切的字段又比如把维吉尼亚密码的密钥隐藏在一张图片的EXIF里。栅栏密码的原理不复杂把明文按栏数分成若干组然后按列读取形成密文。解密就是反过来按列分组再按行拼接Python写出来也就十几行def rail_fence_decrypt(cipher, rails): rail_positions [] rail 0 direction 1 for _ in range(len(cipher)): rail_positions.append(rail) rail direction if rail rails - 1 or rail 0: direction -direction positions_by_rail [[] for _ in range(rails)] for idx, rail_pos in enumerate(rail_positions): positions_by_rail[rail_pos].append(idx) counter 0 plain_chars [] * len(cipher) for rail in range(rails): for pos in positions_by_rail[rail]: plain_chars[pos] cipher[counter] counter 1 return .join(plain_chars)代码不是重点重点是理解“锯齿走位”。这个走位搞清楚了后面不管是栏数变化还是W型加密变种你都能自己推。我在这关最大的体会是古典密码的核心不是算法复杂而是“置换规则”。理解了置换规则你才能看懂它为什么在历史上会被频率分析干掉。3.2 可视密码关一张图分两张叠起来才能看“可视密码”在靶场里就是visual cryptography很多人第一次听说。它的玩法很简单把一张秘密图片拆成两张随机噪点图任何一张单独看都是纯噪点把两张图叠在一起像素做异或或叠加原来的图案就显示出来。“乌托邦·王”在这一关里给出了两张PNG要求你把它们叠加后读取里面藏的一个口令。原理上每一对像素的拆分规则是这样的如果原图像素是黑色两张图对应位置的子像素是互补的如果原图像素是白色则两张图对应位置的子像素是相同的。叠加之后互补块显示黑相同块显示白于是图案浮现。用Python就能还原from PIL import Image import numpy as np img1 np.array(Image.open(share1.png).convert(L)) img2 np.array(Image.open(share2.png).convert(L)) result ((img1 127) ^ (img2 127)) * 255 Image.fromarray(result.astype(uint8)).save(recovered.png)我用这段代码跑出来的图案是一个包含口令的二维码扫出来之后进下一关。也是从这一关开始我意识到密码靶场不只是教你解密而是通过图形化的手段让你理解“秘密拆分”的思想——这个思想后来在密钥分享甚至多方计算里都有影子。3.3 哈希口令关MD5失效又复活的关键是“加盐”进入现代密码部分后关卡开始涉及口令哈希。靶场里给了几个后台数据库的备份文件里面是用户的MD5。第一问很简单直接把MD5丢到彩虹表网站立即还原出弱口令。但仅仅这样这关就太水了。它的第二问是数据库里有一部分用户的口令哈希和第一问格式相同却始终还原不出原因在于后台代码对部分用户口令做了加盐处理。加盐的逻辑很简单如果直接hash(password)两个用户设置相同口令哈希值相同加上随机盐之后hash(salt password)相同口令的哈希也完全不同。这就解释了为什么不能用同一张彩虹表破解。这关的核心操作是你得从配置文件中找到盐字段重新构造字典针对每个用户单独生成候选哈希再比对。脚本大概是import hashlib salt a1b2c3 with open(top-passwords.txt, r, errorsignore) as f: for line in f: pwd line.strip() digest hashlib.md5((salt pwd).encode()).hexdigest() if digest target_hash: print(found:, pwd) break不少新手看到MD5就直接认为“MD5不安全”这其实不准确。MD5在抗碰撞性上确实已被攻破但这里强调的不是算法本身而是设计模式未加盐、快速哈希在任何算法下都是低配。靶场最后还埋了一个“连续叠加MD5”的坑把口令做1000次MD5而不是一次看起来好像更复杂但因为没有加入随机盐它依然可以被逐次迭代字典攻击。真正值钱的实践是PBKDF2、bcrypt这类带成本因子的方案。靶场没有强行讲算法细节但通过连续关卡引导你去了解这些名字我觉得克制得刚好。3.4 WPA2无线关握手包与字典攻击的授权实验这可能是整个系列最让人兴奋的关卡同时也是最需要强调边界的一关。“乌托邦·王”在实验说明里反复写只允许在自有AP、自有设备环境下操作攻击目标必须是实验环境里跑着的仿真AP绝不能用于任何非授权网络。WPA2握手包破解的基本逻辑是客户端和AP在四次握手过程中会基于PSK、SSID和一个随机数生成成对主密钥。你抓到合法的四次握手包之后虽然不知道PSK但可以拿字典里的每个候选口令结合嗅探到的SSID与随机数重新计算握手校验值再用比对方式找出真口令。操作流程大概是这样把无线网卡设为监听模式sudo airmon-ng start wlan0扫描目标AP记录BSSID和信道sudo airodump-ng wlan0mon锁频抓包sudo airodump-ng -c 6 --bssid AA:BB:CC:DD:EE:FF -w cap wlan0mon如果有已连接客户端发送deauth让其重连抓取完整握手sudo aireplay-ng -0 3 -a AA:BB:CC:DD:EE:FF wlan0mon用字典跑握手包sudo aircrack-ng -w dict.txt cap-01.cap这里要注意deauth操作在非授权网络里是明确的干扰行为只有在自有实验环境里才能做。在靶场里仿真AP会生成固定SSID并且故意使用常见弱口令让破解可以在一两分钟内完成。我第一次跑的时候卡在监听模式上笔记本内置网卡不支持后来换了个外接USB网卡才能收到包。所以在进这一关之前先确认网卡是否支持monitor模式不然整个流程根本启动不了。另外字典文件的选择也有讲究。直接用rockyou.txt也可以但它体积很大在靶场里纯属浪费时间。“乌托邦·王”提供了一个精简过的top密码字典覆盖了弱口令和常见组合。字典不是越大越好关键是覆盖率和命中率。实际工作中我们通常还会加入目标单位的品牌词、年份、电话号码后缀做定制这比背一个超大的通用字典更有效。3.5 系统密码恢复嵌入式Linux、路由器console与数据库口令密码线最后一段不是理论全是运维向的系统密码处理。这类内容看起来和“破解”无关恰恰是靶场设计的高明之处它把密码存储机制、认证机制放到真实系统里检验。比如“嵌入式linux忘了密码”对应的关卡靶机给的是一个跑着嵌入式Linux的小路由固件要求你通过串口或控制台进入在uboot阶段中断启动修改init参数进入单用户模式再重置root口令。操作要点在路由器通电后快速在串口终端输入命令中断内核启动进入bootloader。在bootloader里修改启动参数比如给内核追加init/bin/sh让系统直接进入shell。挂载根文件系统一般需要重新挂载为读写mount -o remount,rw /用passwd重置root口令再正常启动完成验证。这里有个大坑直接进入shell后根文件系统很可能是只读挂载如果忘记remountpasswd会报错。我当时在这卡了十分钟后来意识到这是典型的“只读根文件系统”问题才想起来要先查mount输出。数据库口令恢复关则对应“给mariadb root设置密码”和“es密码忘记怎么重置”这类问题。这种题的通用思路是先停服务再用跳过授权表的方式启动MySQL/MariaDB登录后直接修改密码。比如MariaDBsudo systemctl stop mariadb sudo mysqld_safe --skip-grant-tables mysql -uroot MariaDB [(none)] FLUSH PRIVILEGES; MariaDB [(none)] ALTER USER rootlocalhost IDENTIFIED BY newpass; MariaDB [(none)] FLUSH PRIVILEGES;重新正常启动服务后新密码就生效了。这里要提醒一句--skip-grant-tables重启后千万不能留在生产环境这种操作本质上就是绕过认证一旦长时间开着任何人都可能直接登录数据库。4. 综合场景Web打点与密码破解的链路是怎么串起来的4.1 综合关卡的叙事设计为什么“Web先行、密码殿后”“乌托邦·王”的综合关卡只有一关但这一关把整条路走完了。场景大致是这样的你拿到一个业务系统的测试授权入口是一个公开的Web应用。你按Web线的习惯先信息收集再找注入点最后拿到数据库权限。数据库里有一张备份表里面保存着设备配置的导出文件其中包含一台无线AP的SSID、BSSID以及一份四步握手的抓包文件。到这里Web线的产出就变成了密码线的输入。为什么是“Web先行、密码殿后”因为在真实渗透测试里Web应用往往是最容易撕开的口子而无线口令、账户口令往往是内网扩散的载体。先拿到Web权限才有机会接触到那些和密码相关的配置文件反过来拿到密码口令之后又能回到Web管理后台、路由器控制台做提权验证。两者互为阶梯。4.2 一条完整攻击链的实操回放我把当时跑通综合关卡的步骤做个简化回放方便你理解链路是怎么“接上”的信息收集访问Web应用扫目录发现后台入口和一个备份压缩包。压缩包里有源码和数据库dump文件。源码审计在登录函数里发现SQL注入点拼接方式基本是Web线第一关的升级版加了简单的关键字过滤。注入取数绕过过滤拿到管理员账号口令哈希再用密码线第三关的字典攻击还原出口令。登录后台后台有一个“设备配置导出”功能导出一份包含无线信息的配置文件。密码线切换解析配置拿到实验AP的SSID。结合系统提示用外接网卡抓取握手包用定制字典破解出Wi-Fi口令。权限验证用Wi-Fi口令接入仿真AP访问内网服务在内网另外一台机器上找到刚才那个管理口令的复用情况完成完整闭环。每一步之间都有信息交接点注入拿到的哈希交给字典跑后台导出的配置交给无线抓包解析。“依赖上一关输出”这个设计在综合关卡里体现得淋漓尽致。我当时只用了不到四十分钟就完成了一遍不是因为技术多强而是因为整个链路已经被前面的关卡预埋好了我做的只是按顺序执行。4.3 踩坑复盘串链路时最容易被忽略的三个点第一个坑是格式转换。Web线拿到的哈希可能是加了前缀的格式比如用phpass生成的带$P$标记的哈希直接丢给通用破解工具可能识别不了得先确认哈希类型、适配格式否则会一直跑不出结果。第二个坑是无线网卡的监听模式。Web线整个流程在虚拟机里跑完毫无压力但到了无线捕获阶段虚拟机如果没做网卡透传就抓不到真实的802.11帧。这个我在前面提到过综合关卡里会直接导致卡关。第三个坑是字典定制。除了通用字典综合关卡的配置文件里藏着域名、电话、年份这类线索把它们拼进字典破解速度能快一个数量级。拿到配置文件后先别急着跑字典把这些“个人信息”生成候选词再做补充。4.4 复盘记录法把每一关的失败变成可复用的清单综合关卡跑完之后我的习惯是把整个过程的“失败点”整理成清单而不是只记录“成功路径”。一份简单的复盘表格可以长这样阶段我最初的操作失败原因可复用结论注入直接上万能密码payload被关键字过滤拦截先测注释符、空格编码再考虑大小写混淆哈希直接跑rockyou哈希格式带前缀工具不支持先识别哈希类型再选工具无线虚拟机直接抓包网卡未透传监听模式没生效用外接网卡并确认monitor模式字典直接用通用字典已知线索没有进字典根据配置生成定制字典优先跑不要觉得记失败很丢人。恰恰是这些失败才是下一次面对类似环境时最快反应的依据。靶场的价值不完全在于能通关而在于你知道自己会卡在哪、为什么卡以及下一次怎么避开。跑完“乌托邦·王”整套系列我最大的收获不是学会了某个技巧而是第一次在脑子里形成了一张“从输入点到凭据再到下一跳入口”的地图。诚然它不是功能最全的靶场论单点题型DVWA和Pikachu都比它丰富但论链路设计它把一个容易被忽略的东西做出来了那就是“关卡之间的依赖关系”。如果只推荐给一类人我会推荐给那些刷了不少单关但总觉得串不起来的人。如果有条件我建议你在刷完Web线和密码线之后隔一两周再回来做综合关卡测试一下自己是不是真的记住了前两条线的依赖。按照我自己的经验能不看笔记走通综合关才算是真的把这条进阶之路走完了。
返回列表