ARM64 内核研究 (二)
2022-11-28
| 2023-9-1
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
Property
Sep 1, 2023 10:47 AM

相关内核基础

task_struct 结构体

cred 结构体

字段
解释
uid/gid
实际用户/组id,取决于登陆的是哪个用户
suid/sgid
保存的用户/组uid,针对文件而言
euid/egid
有效的用户/组id,判断进程对某文件是否有权限用的是这个
cap_inheritable
子进程可以继承的权限
cap_permitted
进程能够使用的权限
cap_effective
进程实际使用的权限

让我们开始吧

如何将一个进程提权成root

  1. *id 置0
  1. cap_* 所有bit置1

如何触发后门

这方法就多种多样了,比如:
  1. 在proc目录下生成一个666的文件,对其写入指定内容后提权到root
  1. 给进程发送某指定信号
  1. 修改某指定系统调用,传入某指定参数后触发
    1. 建议:使用冷门系统调用减少对性能的影响
等等等等,都可以触发,看哪个更适合自己就行。

代码时间到

本例子触发方式:
chroot(”Nahida”)

内核模块

用户层

测试一下吧

notion image
可以看到,uid,gid,groups 已经变成 root了,但是selinux context还没有变,怎么解决selinux context的问题呢?
命令行 chroot 不行的原因: 他是先 chdir xxx 然后 chroot .

解决SELINUX

方法一:简单粗暴法

修改两处
  1. security/commoncap.c - cap_capable
  1. security/selinux/avc.c - avc_denied
在函数最前面添加下面代码
即可让selinux对root进程失效
使用内核模块的话可以用 kretprobe 修改上述两个函数的返回值

方法二:修改context

方法三:摆烂permissive

selinux_state->enforcing 赋值为0
kprobe_get_addr 可以在上一篇文章中找到

继续测试吧

这里使用摆烂大法
notion image
 
  • Kernel
  • Hook
  • WireShark+OpenWrt 抓包ARM64 内核研究 (一)
    • Giscus
    目录