type
status
date
slug
summary
tags
category
icon
password
Property
Sep 1, 2023 10:47 AM
DirtyPipe漏洞利用:https://github.com/polygraphene/DirtyPipe-Android
相关内核基础
task_struct 结构体
cred 结构体
字段 | 解释 |
uid/gid | 实际用户/组id,取决于登陆的是哪个用户 |
suid/sgid | 保存的用户/组uid,针对文件而言 |
euid/egid | 有效的用户/组id,判断进程对某文件是否有权限用的是这个 |
cap_inheritable | 子进程可以继承的权限 |
cap_permitted | 进程能够使用的权限 |
cap_effective | 进程实际使用的权限 |
让我们开始吧
如何将一个进程提权成root
- *id 置0
- cap_* 所有bit置1
如何触发后门
这方法就多种多样了,比如:
- 在proc目录下生成一个666的文件,对其写入指定内容后提权到root
- 给进程发送某指定信号
- 修改某指定系统调用,传入某指定参数后触发
建议:使用冷门系统调用减少对性能的影响
等等等等,都可以触发,看哪个更适合自己就行。
代码时间到
本例子触发方式:
chroot(”Nahida”)
内核模块
用户层
测试一下吧
可以看到,uid,gid,groups 已经变成 root了,但是selinux context还没有变,怎么解决selinux context的问题呢?
命令行 chroot 不行的原因: 他是先 chdir xxx 然后 chroot .
解决SELINUX
方法一:简单粗暴法
修改两处
- security/commoncap.c - cap_capable
- security/selinux/avc.c - avc_denied
在函数最前面添加下面代码
即可让selinux对root进程失效
使用内核模块的话可以用 kretprobe 修改上述两个函数的返回值
方法二:修改context
方法三:摆烂permissive
将
selinux_state->enforcing
赋值为0kprobe_get_addr 可以在上一篇文章中找到
继续测试吧
这里使用摆烂大法