什么是提权

利用里系统存在的漏洞,执行漏洞利用程序,从低权限的用户获取到一个高权限的shell。

SUID提权

演示

1
#include <unistd.h>
2
#include <stdlib.h>
3
int main(void)
4
{
5
    setuid(0);
6
    setgid(0);
7
    system("ps");
8
    return 0;
9
}

误报排除

查找suid权限

find / -perm -u=s -type f 2>/dev/null | grep -v docker

sudo误报:

1
#!/bin/bash
2
3
while :
4
do
5
    sleep 5
6
done
  • 低权限用户运行上述脚本

  • 动态监控进程watch -n 1 -d 'ps -ef | grep passwd'

  • 观察到进程权限为root

img

passwd误报:

img

  • 使用低权限用户修改自己账号密码

  • 动态监控进程watch -n 1 -d 'ps -ef | grep passwd'

  • 观察到进程权限为root

其他含有suid的文件(包括docker文件,图中排除了),这些文件运行可能会触发误报。

img

检测

动态进程监控:

  1. 监控新建的进程,如果当前进程是root权限,并且父进程是低权限用户,则执行第2步
  2. 排除白名单suid的误报,查看当前进程的子进程是否启动了shell进程
  3. shell进程的判断可通过/proc/[pid]/exe对应的具体文件判断

静态文件检测:

通过Inotify技术实时监控系统环境变量$PATH下可执行文件的所有者和S_ISUID、S_ISGID位的改变,主要针对通过chown、chmod等命令修改文件所有者和文件权限的行为。

内核漏洞提权

内核提权过程

img

检测

  1. 监控新建的进程,如果当前进程是低权限用户,而子进程的shell是高权限用户,则告警
  2. 除了上述分析的误报,实际情况中可能还存在误报情况,可结合后期运营优化规则降低误报

进程自身提权

  1. 检测进程自身权限提升的行为,即:非root进程转变成了root进程。
  2. 进程将权限提升为CAP_SETUID和CAP_SETGID

检测

扫描/proc下的进程UID、PID信息,保存起来作为基线。Netlink可以通过回调实时监测所有进程的PID/UID是否有修改。如果有修改,则存在提权行为。

Netlink实时监测通过commit_creds、setuid、setresuid等系统API修改uid和gid的行为。提权判断规则如下:

  • euid从非0提升为0

  • egid从非0提升为0

进程提升capbility

进程将权限提升为CAP_SETUID和CAP_SETGID

检测

主要针对通过内核模块修改进程结构体的方式提升进程的权限。通过周期性的对比proc/[pid]/status中记录的egid、euid的变化来判断进程是否被提权。proc/[pid]/status中记录了进程的基本信息,包括:pid,uid,以及CapInh,CapPrm,CapEff等信息。

判断规则如下:

  1. cap_setuid是否从无效变成有效

  2. uid从非0提升为0

  3. euid从非0提升为0

  4. egid从非0提升为0

  5. 父进程的euid和egid非0,但子进程的euid为0。

参考:

https://blog.csdn.net/Fly_hps/article/details/80301935

https://mochazz.github.io/2018/06/09/Linux提权之SUID/#环境搭建

https://security.tencent.com/index.php/blog/msg/21