尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Linux权限提升实战:从系统枚举到提权路径

Linux权限提升实战:从系统枚举到提权路径 说个真实经历。我刚开始练OSCP实验室的时候拿到一个Linux靶机的普通用户shell第一反应是查内核版本然后去搜exploit结果编译了半天要么目标打了补丁要么直接跑崩了白白浪费几个小时。后来老手一句话点醒我权限提升的大头在枚举不在exp。你要先知道这台机器上藏了什么能用的东西再判断走哪条路。哪怕你在考试里不靠内核漏洞靠配置错误、计划任务、SUID、sudo权限这些路径也完全能拿到root。而这一切的起点就是系统枚举。这篇文章是Linux权限提升系列的第一篇核心讲手动枚举。内容面向正在备考OSCP、或者在实战中拿到shell后不知道从哪下手的同学。枚举不是让你把每个命令都敲一遍就完事而是要明白每一条输出背后的含义以及它对你提权有什么帮助。下面我按实际渗透的推进顺序把系统枚举这件事拆透。1. 系统枚举在权限提升中的定位1.1 为什么枚举必须排在第一位权限提升的本质是回答三个问题这台机器是什么系统、上面跑着什么东西、有哪些配置错误可以被我利用。枚举就是在回答前两个问题同时为第三个问题提供线索。很多人忽略的是枚举本身风险极低而直接打内核exp风险极高——一旦失败轻则提权无效重则机器崩溃等于把入口也搞丢了。在OSCP考试中我见过太多人栽在“不做枚举就冲exp”上面。考试限时内刷内核exp的性价比其实很差因为你要判断内核版本、编译环境、防御机制还要赌漏洞一定能利用成功。相比之下通过枚举找到一条配置错误的路径往往会稳得多。真正高效的提权思路是先花几分钟把系统的关键信息摸清楚筛选出3到5条高价值路径再逐一验证。这样即使某条路径不通你还有备选方案不会卡死在一个点上。1.2 手动枚举和自动化脚本怎么选自动化工具很诱人但我的建议是先手动后工具。原因很简单手动命令能让你理解系统结构自动化脚本只是把结果汇总。你如果不知道自己找什么工具输出的几百行结果对你来说就是一堆噪音。而且很多自动化脚本在目标机上跑起来动静很大写入临时文件、占用CPU在真实场景里容易引起注意。反过来讲等到你手动摸了一遍底之后再用LinPEAS或LinEnum做一次全面扫描作为查漏补缺两者结合效果最好。OSCP考试里我一般是先手动敲5分钟关键命令心里有数了再挂一个自动脚本慢慢跑同时去分析已经拿到的信息。这样既不浪费时间也不会盲信工具的完整性。记住自动化工具的输出也有遗漏手动排查才是底线。2. 系统与内核信息枚举2.1 内核版本与发行版信息收集拿到shell第一步确认你所在的系统环境。基础命令就是这几条uname -a cat /etc/os-release cat /etc/issue lsb_release -a 2/dev/nulluname -a 输出的内核版本是后续判断内核漏洞可能性的关键依据。比如你看到内核是 4.4.0发行版是 Ubuntu 16.04那你心里就要有数这机器年代比较久可能存在与内核版本相关的已知漏洞。但注意知道版本只是起点还要看补丁打了多少这是后话。发行版信息也很重要。Debian/Ubuntu 用 aptCentOS/RHEL 用 yum不同包管理器会对后续你能拿到的工具链产生影响。还有系统架构x86_64和ARM的exp是不同的如果目标机是ARM架构很多现成的exp编译都过不了你得调整策略。真遇到过嵌入式Linux的设备uname -a能看到armv7l那你基本可以放弃内核exp路线了转而排查配置错误更现实。2.2 防御机制与漏洞可行性判断知道内核版本后别急着搜exp先检查系统的防御机制。现在的Linux内核普遍开启了各种安全特性比如SMEP、SMAP、KASLR这些都会直接影响内核exp能否成功。查看方式cat /proc/cmdline cat /proc/cpuinfo | grep -E smep|smap zcat /proc/config.gz 2/dev/null | grep -E CONFIG_RANDOMIZE_BASE|CONFIG_SMEP|CONFIG_SMAP如果 /proc/cmdline 里能看到 smep、smap 这些字样说明内核启用了用户态与内核态的隔离机制很多老式内核exp直接失效。同样KASLR开启后固定的内核地址不再可靠exp需要额外绕过复杂度提升一个量级。我在实际评估中如果看到一台机器开着SMEPSMAPKASLR基本就不会在内核漏洞上花太多时间了。找到一个能用的POC代价太高而且不稳定把精力转向sudo、SUID、计划任务这些配置层面成功率反而高。OSCP考试说到底不是搞内核研究你更需要的是找到一条能在合理时间内走通的提权路径。2.3 环境变量、主机名与系统状态系统状态里藏着容易被忽略的信息。几条基本命令hostname id env uptime datehostname 输出往往暴露机器角色比如web01、dc01、backup-server你拿到主机名就能推断这台机器在目标网络里的定位后续横向移动的方向也就清楚了。env 看环境变量有时里面就有数据库连接串、API key之类的敏感信息虽然不常见但看到就赚到。uptime 看系统运行了多久date 看当前时间。这两个信息结合起来配合接下来的计划任务枚举能帮你判断系统是否刚重启过、计划任务是否在执行。如果系统刚重启说明管理员近期维护过系统补丁可能比较新内核漏洞路径的可行性进一步降低你要有心理准备。3. 用户、权限与可写文件枚举3.1 当前用户身份与sudo权限权限提升的核心是搞清楚你当前有多少权限、能通过什么方式扩大权限。先看三条id whoami sudo -lid 输出你的uid、gid和所属组这是判断你权限边界的基础。如果你在docker组里直接就能走docker组提权路径如果你在disk组可以用debugfs读取磁盘文件包括shadow。whoami 只是快速确认身份但id信息量更大养成习惯优先看id。sudo -l 可以说是OSCP考试里最常考的提权入口。如果输出显示某个用户可以在目标机上以root身份执行某个命令或脚本那这条路就非常清晰了。比如输出显示你可以在root下运行 /usr/bin/vim那就用GTFOBins里vim的提权方式直接进入root shell。如果sudo -l要求输入密码先试密码复用——很多环境里用户的ssh密码和sudo密码是同一个尤其是有web后台拿到的shell配置里的数据库密码也可能被复用为系统密码。3.2 系统用户、分组与登录用户信息确认你自己是谁之后再看看整个系统里都有谁。查看方式cat /etc/passwd cat /etc/group ls -la /home/ lastlog wcat /etc/passwd 的重点不是逐行看所有用户而是筛选出有shell的用户。如果 /home 下面有多个用户目录说明系统上有多个真实登录用户这些用户的密码可能在配置文件或历史记录里存在是横向移动的潜在目标。有些老系统还会在 /etc/passwd 里直接暴露密码哈希x表示存储在shadow里如果字段直接是哈希串就发财了属于极少数情况但值得扫一眼。/etc/group 里的敏感组记得标记docker组、sudo组、adm组、disk组。docker组提权的方法是挂载宿主机根目录到容器然后直接读写宿主机的shadow文件这个必须烂熟于心。adm组成员可以读 /var/log 下的日志日志里偶尔会有其他用户在终端里输错密码的记录。w 和 lastlog 看当前登录用户和最近登录记录可以了解这台机器是否活跃判断管理员什么时候会上线同时避免在提权过程中撞上管理员。3.3 可写文件与敏感配置低权限用户常常拥有对某些系统文件的写权限这是典型的配置错误。查找可写文件find / -writable -type f 2/dev/null | grep -vE ^/proc|^/sys|^/tmp find / -writable -type d 2/dev/null | grep -vE ^/proc|^/sys为什么排除 /tmp因为 /tmp 默认全世界可写但单纯在 /tmp 里写文件并不能直接提权除非配合其他漏洞比如root的计划任务执行 /tmp 下的脚本。真正有价值的是 /etc 目录下的可写文件比如 /etc/passwd 或 /etc/shadow 如果可写你可以直接添加一个新root用户或者清空root密码。还有 /etc/cron.d/ 下的任务文件如果可写也能插入自己的计划任务。另外重点检查web目录如 /var/www/html很多应用会把数据库密码写死在配置文件里。虽然这不直接是系统枚举的内容但和文件权限检查是同一阶段的工作。检查 /etc/shadow 是否可读、/home/*/.ssh/authorized_keys 是否可写这些都能快速形成提权或持久化路径。真实案例里遇到过 /home/user/.ssh/authorized_keys 对当前用户可写的情况直接写入自己的公钥后面用ssh登录比反弹shell稳得多。4. 网络、服务与挂载点枚举4.1 网络接口、路由与DNS配置拿到shell后网络信息决定了你是否需要横向移动。基本命令ip addr ip route cat /etc/resolv.conf cat /etc/hostsip addr 看网卡数量和IP段。如果发现除了当前网段之外还有另一个内网段说明这台机器是双网卡它在目标内网里可能承担着更重要的角色后续横向移动就要从这里展开。ip route 看默认路由判断这台机器是不是网关角色。DNS配置如果指向一个内网IP说明网络里可能有域控这台机器很可能是域内成员后续的枚举方向要朝着域环境调整。/etc/hosts 也值得看有时候管理员会把常见主机名和IP手动写进去等于给你提供了一份内网主机清单。OSCP考试里的环境多以独立靶机为主但同样会存在双网卡的情况认真看网络配置能帮你找到通往下一台机器的路径。4.2 监听端口与服务分析知道网络拓扑后看看这台机器自己对外开放了什么服务。命令ss -tlnp 2/dev/null || netstat -tlnp ps aux | grep -vE \[.*\] | head -50监听端口的重点是发现非标准端口和未知服务。如果看到某个高端口在监听而且这个服务是root权限启动的这就可能是突破口。特别是老旧服务、自带Web管理界面的服务经常存在未授权访问或已知漏洞。举个例子发现8080端口跑的是一个老版本Jenkins而Jenkins是以root身份运行的那你就可以先拿到Jenkins执行命令的权限再用root权限做后续操作。ps aux 看进程列表能帮你把端口和服务对应起来。注意看进程是以什么用户身份运行的如果MySQL、Nginx这些服务是root启动一旦服务本身存在代码执行漏洞你拿到的就是root权限。这个过程里目标机上存在哪些不常见的进程比如备份脚本、自定义daemon往往比标准服务更有价值。4.3 挂载点与NFS共享检查文件系统挂载和网络共享也可能指向提权路径。查看方式mount -l cat /etc/fstab showmount -e 2/dev/nullmount -l 看当前挂载的文件系统重点看有没有带 noexec、nosuid、nodev 之外的异常挂载以及有没有临时挂载的目录。特别是 /tmp、/dev/shm 如果被单独挂载且没有 noexec你之后传脚本上去执行就没有障碍。如果 /tmp 是noexec但 /dev/shm 可执行那你在目标机上跑自动化工具时就要把脚本放到 /dev/shm。/etc/fstab 看开机自动挂载里面有时会出现包含credentials文件的CIFS挂载credential文件里保存的是共享访问凭据。如果这个文件对当前用户可读你就能拿到一个内网账号。showmount 看NFS共享如果共享目录配置了no_root_squash你在攻击机上mount过去创建一个setuid root二进制再回到目标机上执行直接获得root权限。这条路径在OSCP考试里也出现过值得每次枚举时都顺手查一下。5. 计划任务、SUID与特权文件枚举5.1 计划任务逐一排查计划任务是Linux提权的高频路径因为管理员经常写脚本来自动化备份、清理日志而这些脚本常常存在可写或路径可劫持的问题。排查命令crontab -l crontab -u root -l 2/dev/null cat /etc/crontab ls -la /etc/cron.d/ ls -la /etc/cron.hourly/ /etc/cron.daily/ /etc/cron.weekly/ /etc/cron.monthly/ systemctl list-timers 2/dev/null看到计划任务列表后先判断哪些是以root身份运行的然后去看对应脚本的权限。如果脚本是root运行但普通用户能修改脚本内容那就直接改写脚本加入反弹shell命令等待root执行即可。整个过程要快因为计划任务可能只在特定时间执行你要么等要么用篡改脚本的方式让命令在下次执行时生效。还有一个容易忽略的点是PATH劫持。有些计划任务脚本内部调用了外部命令比如 tar、python但脚本里写的是相对路径而管理员没有设置安全的PATH环境变量那你有机会在可写的目录里放置一个同名恶意文件让计划任务执行你的脚本。实际排查时要看脚本内容而不仅仅是脚本是否存在。5.2 SUID/SGID文件搜索与利用SUID是Linux里最经典的提权漏洞点。目标程序以文件所有者的权限运行如果所有者是root而程序本身可被利用来执行命令那你就能以root权限执行任意命令。查找命令find / -perm -4000 -type f 2/dev/null find / -perm -2000 -type f 2/dev/null拿到SUID文件列表后先排除常规的passwd、su、mount等这些虽然带SUID但本身没有提供提权功能。真正危险的是python、perl、ruby、env、find、vim、bash、nmap这些带SUID的程序它们具备执行外部命令或读取文件的能力。逐项对照GTFOBins比如 /usr/bin/find 带SUID直接执行 find / -exec whoami ; 验证是不是root是的话用 find / -exec sh -p ; 进入root shell。注意bash的-p参数是保留真实uid的关键。普通用户执行sh不会保留SUID权限但带-p参数时sh会以真实uid运行这样SUID才能生效。这个细节很多人会忽略直接在GTFOBins里抄命令结果发现弹出的是普通用户shell其实就是少了-p参数。5.3 capabilities特权和特殊权限除了SUID现代Linux系统越来越多地用capabilities来分配特权这也是枚举时不能漏掉的一环。查找命令getcap -r / 2/dev/null重点关注cap_setuid和cap_setgid。比如 /usr/bin/python3 带有 cap_setuid你就可以用一行脚本把进程的uid设置为0python3 -c import os; os.setuid(0); os.system(/bin/bash)capabilities的存在是因为有些管理员觉得给程序加SUID权限太粗暴改用setcap来精确分配能力但配置不当造成的提权路径和SUID一模一样。我在靶机上遇到过 /usr/bin/tar 带cap_dac_read_search的情况这意味着可以绕过文件读权限检查直接读 /etc/shadow。如果你的SUID列表里没找到突破口一定要看看capabilities。6. 日志、历史与隐藏信息6.1 bash历史记录与vim信息用户的历史记录里藏着大量敏感信息是低权限枚举里最容易捡漏的地方。查看命令cat ~/.bash_history 2/dev/null cat /home/*/.bash_history 2/dev/null cat /root/.bash_history 2/dev/null ls -la /home/*/.viminfo 2/dev/null管理员在配置服务器时经常直接在命令行里输密码比如 mysql -u root -ppassword、su - 之后跟密码、sshpass -p xxx。如果你能读到root的bash历史基本等于拿到了账户密码。即使读不到root的历史普通用户的历史里也可能包含数据库口令可以通过密码复用尝试sudo。.viminfo记录了vim的编辑历史和搜索历史能看到曾打开过的文件路径和搜索过的字符串这些路径能指引你去看哪些敏感文件。如果用户用vim打开过某个配置文件里面很可能有密码那这个文件就值得深入检查。6.2 配置文件中的硬编码密码系统里到处是配置文件密码硬编码的情况非常普遍。常用搜索命令grep -rniE password|passwd|pwd|secret|token /etc/ 2/dev/null grep -rniE password|passwd|pwd|secret|token /var/www/ 2/dev/null find / -name *.conf -o -name *.config -o -name *.env 2/dev/null | xargs grep -niE password 2/dev/null注意覆盖面要广包括web目录下的wp-config.php、config.php、.env、settings.py这些文件。拿到数据库密码后优先尝试复用root用户密码、其他系统用户密码、数据库密码有很大概率是同一个。SSL证书的私钥、SSH的id_rsa私钥也属于高价值文件找到后可以直接用来ssh登录。隐藏文件也值得扫一眼用 ls -la 就能看到。有些管理员会把备份文件放在当前目录比如config.php.bak、db.sql文件名不起眼但内容非常敏感。这类备份文件经常是老的配置里面可能有不同的密码甚至没有修改过的默认密码。6.3 临时目录、备份文件与敏感数据/tmp、/var/tmp、/var/backups 这几个目录值得仔细翻。查看命令ls -la /tmp/ /var/tmp/ /var/backups/ /var/log/ find /var/backups -type f 2/dev/null find / -name *.bak -o -name *.old -o -name *backup* 2/dev/null | grep -v ^/proc/var/backups 下面经常有系统的备份文件比如shadow.bak、passwd.bak。如果这些文件可读直接看是否包含密码哈希。有些系统还会做passwd和shadow的定期备份权限配置不当导致普通用户可读这就是一条直达root的路径。日志文件也值得检查。/var/log/auth.log 里能看到ssh登录记录可能存在密码尝试记录。/var/log/mysql/ 或其他应用日志里可能记录了SQL查询包含敏感数据。如果管理员配置了应用日志级别为debug那里面可能记录了大量环境变量、请求参数甚至明文密码。日志看完了结合历史记录已经把这台机器上最有价值的信息挖得差不多了。7. 自动化枚举工具与手动命令的组合7.1 三款主流脚本实测对比手动枚举掌握之后自动化工具是提升效率的利器。我常用的三款是LinEnum、LinPEAS和Linux Smart Enumeration各有优劣工具输出风格运行依赖适用场景LinEnum结构清晰按段输出bash依赖较少快速摸底结果便于人工阅读LinPEAS彩色高亮按风险等级标记bash 可选python/perl全面扫描高亮风险项最适合OSCP阶段Linux Smart Enumeration (LSE)分级别从低危到高危逐级运行bash老旧系统、精简系统、资源受限环境LinPEAS虽然输出冗长但它把提权相关的条目用颜色标了出来适合查漏补缺。不过它的输出越多越容易让人迷失你必须有手动枚举的基础才能从一堆结果中筛选出真正有价值的信息。LSE的好处是它按级别执行连bash版本太老的情况都考虑到了适合目标机是一些精简的嵌入式系统。7.2 手动编辑枚举脚本的思路推荐的做法是把常用命令串成一个脚本每次拿shell后先跑一遍这样既能保证不漏项也方便快速记录。脚本不一定要写得复杂把上面提到的命令按类别组织好输出重定向到文件再逐段分析。我自己整理的脚本大概分四段系统信息、用户权限、网络服务、文件搜索。每段之间加分隔符后续分析时定位更快。自动化工具跑完后的关键动作是去验证而不是盲信。比如LinPEAS标红了某个用户的计划任务你还要去手动确认这个计划任务是否存在、脚本是否真的可写、执行时间是什么时候。工具只是帮你把候选清单拉出来最终的利用还是要靠手动验证。这个习惯能避免你在考试中走弯路因为工具高亮的内容不一定都能利用而工具没标红的东西也可能被忽略。8. 常见问题与排查技巧实录8.1 常见问题速查表症状可能原因排查方向find 输出大量Permission denied普通用户权限不足加 2/dev/null 过滤或用 -readable 选项只显示可读文件ss 或 netstat 命令不存在目标系统精简或使用busybox用 cat /proc/net/tcp 查看端口或检查 /bin/busyboxsudo -l 要求输入密码且不知道密码当前用户无免密sudo权限尝试密码复用或从配置文件/历史记录找突破口LinPEAS/LinEnum 运行失败/tmp 挂载为noexec或缺少依赖先看挂载选项改用 /dev/shm 或 /var/tmp 执行脚本SUID文件列表里程序无法利用程序本身不含可执行命令功能对照GTFOBins逐项验证不要凭文件名臆断内核exp编译失败缺少gcc/make或版本不匹配检查编译环境考虑换静态编译版本或者放弃内核路径计划任务脚本内容无法修改文件属主是root且无写权限检查脚本调用的命令是否在可写目录中尝试PATH劫持找不到任何可写文件当前用户权限极低扩大搜索范围到/tmp、/var/tmp检查是否可写登录用户的.ssh目录8.2 实测踩坑记录第一个坑是/bin/sh 和 /bin/bash 的行为差异。用SUID的sh提权时如果不小心用成 /bin/sh 而没有加-p参数只会得到一个普通shell白忙一场。Ubuntu的 /bin/sh 是dash表现得和bash不一样用GTFOBins的命令时要看清楚目标系统默认的shell。第二个坑是find命令的括号语法。执行 find / -perm -4000 -type f后面的2/dev/null不能省不然输出会被一堆权限报错淹没。还有一个细节是 -perm -4000 和 -perm 4000 的区别前者表示权限位中包含setuid即可后者要求精确匹配。搜索SUID时用 -perm -4000 更合适因为二进制文件可能同时还有其他权限位。第三个坑是计划任务实际执行时间不确定。检查到可写脚本后脚本可能每小时、每天才执行一次等待的时间容易被忽略。我遇到过写好了payload但迟迟不触发的情况后来发现目标机在特定时间才执行任务中间隔了几个小时。为了避免干等可以同时准备其他提权路径不要把所有希望寄托在计划任务上。最后提醒一下枚举输出一定要记录下来。用脚本跑完后把结果保存到本地或者自己复制粘贴到笔记里方便后续反复查看。提权卡住的时候回头看枚举输出的细节往往能找到之前没发现的线索。这一点在考试里非常重要——时间不是用来反复跑同样命令的而是用来深度分析已有信息的。
返回列表