权限提升是渗透测试和真实攻击链条中最具决定性的一环。拿到一个WebShell往往只是开始,它代表的权限通常是IIS、Apache或Nginx等中间件运行的低权限服务账户。在这个受限环境下,无法直接操作系统核心文件、无法获取最高价值数据、更无法建立持久化的隐蔽后门。攻击者必须完成从WebShell到Root的跨越,这个过程本质上是利用系统配置缺陷、服务漏洞、内核漏洞或不当权限设置来突破操作系统施加的安全边界。
Linux环境下的提权路径最为丰富。拿到WebShell后,第一件事是收集系统信息。uname -a能直接显示内核版本和架构,这是判断是否存在内核漏洞提权机会的关键依据。cat /etc/issue和cat /etc/*-release则揭示发行版具体版本。很多攻击者会立即在本地建立内核漏洞利用库,针对特定版本寻找已公开的本地提权漏洞,比如经典的DirtyCow、DirtyPipe、OverlayFS系列漏洞。这些漏洞利用程序通常用C语言编写,需要在目标系统上编译执行。如果目标安装了gcc,可以直接上传源码编译;如果没装编译环境,需要提前在同版本系统上静态编译好再上传。
# 信息收集命令示例 uname -a cat /etc/issue cat /etc/*-release cat /proc/version # 查看可写目录 find / -writable -type d 2>/dev/null
SUID提权是Linux下最常见的手法之一。系统中有一些可执行文件设置了SUID位,意味着任何用户执行该文件时都以文件所有者的权限运行。如果root拥有的程序存在命令注入或路径遍历漏洞,就能被利用来提权。查找SUID文件用find / -perm -u=s -type f 2>/dev/null命令。重点关注那些不常见的SUID程序,或者已知存在漏洞的版本。比如某些系统管理员为了方便,会给vim、less、find这类工具设置SUID,攻击者可以通过这些工具的内置命令逃逸到shell。以find为例,如果find具有SUID权限,直接执行find . -exec /bin/sh \; -quit就能获得root shell。类似的,nmap在老版本中支持--interactive模式进入交互界面,再通过!sh执行系统命令。
计划任务和Cron是另一个高频利用点。系统级别的cron任务通常以root权限执行,如果这些任务调用的脚本或二进制文件对低权限用户可写,攻击者就能替换或修改脚本内容,等待cron执行时获得root权限。检查/etc/crontab、/var/spool/cron/目录、以及各个用户的cron配置。特别留意那些执行频率高且路径包含可写目录的脚本。有些运维脚本会调用相对路径的命令,如果PATH环境变量中优先搜索的目录可写,就可以通过创建同名恶意程序实现劫持。检查可写的PATH目录用find / -writable -type d 2>/dev/null | grep -v proc命令,然后对比echo $PATH的输出。
服务配置缺陷往往被忽视。某些以root运行的服务,其配置文件或启动脚本对普通用户可写。systemd服务单元文件如果权限设置不当,攻击者可以修改ExecStart指向自己的恶意程序,重启服务后获得root权限。检查/etc/systemd/system/和/usr/lib/systemd/system/下服务文件的权限。同样,init.d脚本如果可写,也能注入恶意代码。一些Web应用部署时会在root权限下运行,但配置文件中可能存储了数据库密码,这些密码经常被管理员复用为系统root密码,这种凭证复用是跨服务提权的捷径。
内核漏洞提权虽然威力巨大,但操作风险也最高。直接在线上服务器执行内核漏洞利用程序可能导致系统崩溃或重启,这在APT攻击中通常被禁止,但在普通网络犯罪中仍被频繁使用。Linux内核漏洞利用需要精确匹配内核版本,很多利用程序对内核编译选项敏感,需要针对性调整。常见的利用思路包括内核模块加载、内存越界写、竞态条件触发等。工具方面,linux-exploit-suggester和LinEnum这类脚本能自动检测系统信息并推荐可能的利用程序,大大降低了信息收集的工作量。
# 使用linux-exploit-suggester ./linux-exploit-suggester.sh # LinEnum信息收集 ./LinEnum.sh -t -k keyword
Windows环境下的提权逻辑与Linux有本质区别。IIS默认以ApplicationPoolIdentity运行,这是一个虚拟账户,权限极低。从ASPX或PHP WebShell起步,第一步通常是升级到本地服务账户或管理员权限。Windows提权的核心在于令牌操作、服务配置、计划任务和注册表权限。whoami /priv查看当前账户拥有的特权,这是判断提权可能性的重要依据。如果看到SeImpersonatePrivilege或SeAssignPrimaryTokenPrivilege,意味着可以使用令牌模拟攻击,这类攻击的代表工具是JuicyPotato、RoguePotato和PrintSpoofer系列。
服务配置错误是Windows提权的重灾区。很多第三方软件安装的Windows服务以LocalSystem权限运行,但服务对应的可执行文件路径对普通用户可写,或者服务启动时加载的DLL存在劫持可能。用accesschk或icacls检查服务二进制文件的权限,如果Authenticated Users或Users组有写入权限,直接替换该文件并重启服务就能获得SYSTEM权限。PowerShell命令Get-WmiObject win32_service | Where-Object {$_.StartName -eq 'LocalSystem'}能列出所有以SYSTEM运行的服务,再逐个检查路径权限。不带引号的服务路径漏洞虽然古老,但在一些老旧系统中仍然存在,利用方式是在路径空格处放置恶意程序。
# 检查服务权限
icacls "C:\Program Files\VulnerableService\service.exe"
# 列出SYSTEM权限运行的服务
Get-WmiObject win32_service | Where-Object {$_.StartName -eq 'LocalSystem'} | Format-Table Name,PathName
# 检查可写目录
Get-ChildItem "C:\Program Files\" -Recurse | Where-Object {$_.PSIsContainer -and (Get-Acl $_.FullName).Access | Where-Object {$_.FileSystemRights -match 'Write' -and $_.IdentityReference -match 'Users'}}
注册表权限配置不当同样致命。AlwaysInstallElevated如果被启用,允许普通用户以SYSTEM权限安装MSI包。检查HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer和HKCU对应路径下的AlwaysInstallElevated键值,如果都设置为1,就可以用msfvenom生成一个MSI格式的payload,通过msiexec /quiet /qn /i payload.msi执行获得SYSTEM权限。注册表中的Run键和RunOnce键如果可写,也能实现持久化和提权,系统启动时会以当前用户或SYSTEM权限执行指定的程序。
凭证窃取在Windows提权中扮演关键角色。拿到WebShell后,可以尝试读取IIS应用程序池的配置文件,其中可能包含明文或可解密的连接字符串密码。applicationHost.config和web.config文件中经常存储着高权限数据库账户。如果数据库服务以SYSTEM运行,通过xp_cmdshell就能直接执行系统命令。Mimikatz类工具需要较高权限才能读取LSASS进程内存,但通过procdump转储LSASS进程再离线提取凭证,对权限要求更低。一旦获取到域管理员或本地管理员的明文密码或哈希,整个内网横向移动的大门就打开了。
DLL劫持是Windows特有的提权技术,利用的是Windows的DLL搜索顺序。如果某个高权限进程在启动时加载DLL,而该DLL的搜索路径中包含攻击者可写的目录,就可以放置恶意DLL实现代码注入。用Process Monitor监控目标进程的DLL加载行为,找到那些NAME NOT FOUND且路径可写的DLL。常用的劫持位置包括程序目录、System32目录(需要先通过其他方式获得写入权限)以及PATH环境变量中的可写目录。编译恶意DLL时需要在DllMain中执行提权代码,或者导出原DLL的所有函数并转发,保证程序正常运行不被发现。
容器逃逸是云原生时代的新战场。从WebShell到容器内,权限通常是root,但这个root是命名空间隔离的,无法直接访问宿主机资源。容器逃逸的经典手法包括挂载docker.sock、利用特权容器、内核漏洞共享和配置缺陷。如果容器内挂载了/var/run/docker.sock,就可以在容器内安装docker客户端,通过它与宿主机docker守护进程通信,直接创建特权容器或执行宿主机命令。特权容器拥有所有设备访问权限,可以通过挂载宿主机磁盘设备来读写任意文件。cgroup逃逸利用的是cgroup的notify_on_release机制,在容器内触发宿主机执行命令,这是CVE-2022-0492等漏洞的利用原理。
无论哪种环境,提权成功后的操作同样需要谨慎。拿到root或SYSTEM后,清理日志是基本动作,但过度清理反而会引起怀疑。更隐蔽的做法是选择性清除与自己操作相关的日志条目。在Linux下,history -c清除当前会话历史,但更彻底的是删除~/.bash_history并创建符号链接到/dev/null。utmp、wtmp、btmp记录登录信息,可以用工具如logtamper进行选择性修改。Windows下的事件日志通过wevtutil清理,但需要SYSTEM权限,拿到权限后可以针对性删除安全日志中的特定事件ID。建立持久化时,避免使用常见的注册表Run键或计划任务,考虑使用WMI事件订阅、服务DLL劫持或内核模块等更隐蔽的方式。
# Linux清理痕迹 echo "" > /var/log/auth.log echo "" > /var/log/syslog # 选择性清理bash历史 unset HISTFILE # Windows清理安全日志 wevtutil cl Security # 删除特定事件日志 wevtutil epl Security filtered.evtx "/q:*[System[EventID=4624]]"
权限提升的防御需要纵深策略。最小权限原则是根本,Web应用不应该以root或SYSTEM运行,数据库账户不应该具有系统管理权限。定期审计SUID文件、服务权限、计划任务和注册表关键键值,建立配置基线并监控偏离。内核和软件及时打补丁,但更重要的是通过SELinux、AppArmor等强制访问控制机制限制进程行为,即使攻击者利用了漏洞,也被限制在最小权限域内。日志监控要关注异常的进程创建、权限变更和敏感文件访问,建立基于行为的检测规则而非单纯依赖特征签名。提权攻击的手法会不断演进,但核心始终是利用配置与权限的错配,从架构层面消除这些错配,比事后修补更有价值。
