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权限的二进制文件.
|
|
好了,我们继续完善检测规则.
检测规则:检测当前进程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 撰写中,持续更新,建议收藏连接