什么是提权
利用里系统存在的漏洞,执行漏洞利用程序,从低权限的用户获取到一个高权限的shell。
SUID提权
演示
1 |
|
2 |
|
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
passwd误报:
使用低权限用户修改自己账号密码
动态监控进程
watch -n 1 -d 'ps -ef | grep passwd'
观察到进程权限为root
其他含有suid的文件(包括docker文件,图中排除了),这些文件运行可能会触发误报。
检测
动态进程监控:
- 监控新建的进程,如果当前进程是root权限,并且父进程是低权限用户,则执行第2步
- 排除白名单suid的误报,查看当前进程的子进程是否启动了shell进程
- shell进程的判断可通过
/proc/[pid]/exe
对应的具体文件判断
静态文件检测:
通过Inotify技术实时监控系统环境变量$PATH下可执行文件的所有者和S_ISUID、S_ISGID位的改变,主要针对通过chown、chmod等命令修改文件所有者和文件权限的行为。
内核漏洞提权
内核提权过程
检测
- 监控新建的进程,如果当前进程是低权限用户,而子进程的shell是高权限用户,则告警
- 除了上述分析的误报,实际情况中可能还存在误报情况,可结合后期运营优化规则降低误报
进程自身提权
- 检测进程自身权限提升的行为,即:非root进程转变成了root进程。
- 进程将权限提升为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等信息。
判断规则如下:
cap_setuid是否从无效变成有效
uid从非0提升为0
euid从非0提升为0
egid从非0提升为0
父进程的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