Linux 提权检测研究


作者:老路(Dean)  
微信号:dean2029  (欢迎来撩)
文章来源:主机安全 (知识星球)

一、基于SUID提权检测

1.1、原理介绍

寻找具备suid权限的二进制程序文件,并且该文件需要具备自定义执行命令条件(如:nmap),或者该二进制程序存在漏洞,利用注入shellcode执行命令(如:缓冲区溢出漏洞)。(PS: 如果不能执行命令,读写文件也可以)

1.2、提权复现

这里我们给系统find命令赋予suid权限,之所以选择find命令,是因为改命令的exec参数具备执行命令能力.

[dean@centos-linux--1---1- ~]$ sudo su
[sudo] password for dean: 
[root@centos-linux--1---1- dean]# chmod 4777 /usr/bin/find
[root@centos-linux--1---1- dean]# exit
exit
[dean@centos-linux--1---1- ~]$ find /usr/bin/passwd -exec /bin/sh -p \;
sh-4.2# whoami
root
sh-4.2# 

如上可以看到已拿到一个root权限的shell.

1.3、分析过程

首先我们看一下进程监控程序打印的进程树日志:

sh(euid:0)<-find(euid:0)<-bash(euid:1000)<-sshd(euid:1000)<-sshd(euid:0)<-sshd(euid:0)

可以看得到sh进程euid为0,回溯sh父进程链条会发现bash进程的euid却不是0,初步检测规则已形成:

检测规则:检测当前进程euid为0,父进程中存在euid不为0的情况。

但仍有误报的情况,例如用户修改自身密码时,因为passwd命令也具备suid权限,用户修改密码的进程树如下:

passwd(euid:0)<-bash(euid:1007)<-sshd(euid:1007)<-sshd(euid:0)<-sshd(euid:0)

像passwd这样的二进制程序有很多,我们可以通过如下命令查找具备suid权限的二进制文件.

1
 find / -user root -perm -4000 -print 2>/dev/null

好了,我们继续完善检测规则.

检测规则:检测当前进程euid为0,并且当前进程不在白名单列表内(白名单通过如上命令收集),父进程中存在euid不为0情况。

如上规则仍有误报的情况,例如正常用户通过sudo su切换到root用户,然后执行whoami命令,进程树如下:

whoami(euid:0)<-sh(euid:0)<-find(euid:0)<-bash(euid:0)<-su(euid:0)<-sudo(euid:0)<-bash(euid:1000)<-sshd(euid:1000)<-sshd(euid:0)<-sshd(euid:0)

可以看到进程链条中有sudo、su就会造成误报,我们继续完善规则.

检测规则:检测当前进程euid为0,并且当前进程不在白名单列表内(白名单通过如上命令收集),父进程中存在euid不为0情况,且该父进程和当前进程之间没有sudo、su进程。

1.4、总结

检测规则:检测当前进程euid为0,并且当前进程不在白名单列表内(白名单通过如上命令收集),父进程中存在euid不为0情况,且该父进程和当前进程之间没有sudo、su进程。

注意:如上检测方案并未投入实战中使用,规则需要在实战中不断优化,减少误报,提高检出。

二、基于内核漏洞提权检测

// TODO 撰写中,持续更新,建议收藏连接

三、基于软件漏洞提权检测

// TODO 撰写中,持续更新,建议收藏连接