首页
社区
课程
招聘
[原创]Linux Kernel CVE-2013-1763 Local Privilege Escalation Vulnerability 利用分析
发表于: 2013-7-28 22:43 5664

[原创]Linux Kernel CVE-2013-1763 Local Privilege Escalation Vulnerability 利用分析

2013-7-28 22:43
5664

近日闲的蛋疼, 刚开始把自己的Ubuntu执行命令sudo apt-get remove libc6, 然后又重新编内核,重新装各种东西,最终终于看到图形界面.
然后忽然网上出现了apache struts2的漏洞,又在思考tomcat的帐号在linux平台上如何get root.
于是准备搭环境自己黑自己一把.

上网搜了一下,最新的提权的漏洞是CVE-2013-1763, 影响的版本具多, 有现成的poc, 值得一试.

(1)漏洞描述

系统在处理sock_diag_handlers数组的时候, 未对传入的值进行验证, 从而导致越界,进而导致可执行代码的漏洞.
未授权用户可以通过执行代码, 得到root权限.

(2)漏洞产生的原因
首先看sock_diag_handlers的定义

static struct sock_diag_handler *sock_diag_handlers[AF_MAX];  //可以看出,这个指针数组最大为AF_MAX AF_MAX = 41.
static int __sock_diag_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
{
        int err;
        struct sock_diag_req *req = NLMSG_DATA(nlh);
        struct sock_diag_handler *hndl;

        if (nlmsg_len(nlh) < sizeof(*req))
                return -EINVAL;

        hndl = sock_diag_lock_handler(req->sdiag_family);//这里传入sdiag_family的值,然后返回sock_diag_handlers中存放的hanlder.我们看一下sock_diag_lock_handler函数
        if (hndl == NULL)
                err = -ENOENT;
        else
                err = hndl->dump(skb, nlh);
        sock_diag_unlock_handler(hndl);

        return err;
}
----
static inline struct sock_diag_handler *sock_diag_lock_handler(int family)
{
        if (sock_diag_handlers[family] == NULL)
                request_module("net-pf-%d-proto-%d-type-%d", PF_NETLINK,
                                NETLINK_SOCK_DIAG, family);

        mutex_lock(&sock_diag_table_mutex);
        return sock_diag_handlers[family]; //这个函数没有对传入的family的值的范围,进行验证,从而造成数组越界.
}
if (hndl == NULL)
    err = -ENOENT;
else
    err = hndl->dump(skb, nlh);
struct sock_diag_handler {
        __u8 family;//
        int (*dump)(struct sk_buff *skb, struct nlmsghdr *nlh);
};

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 5
支持
分享
最新回复 (14)
雪    币: 4536
活跃值: (902)
能力值: ( LV16,RANK:480 )
在线值:
发帖
回帖
粉丝
2
顶!!!!
2013-7-28 22:52
0
雪    币: 219
活跃值: (778)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
3
出租~~
2013-7-29 01:07
0
雪    币: 6
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
有意思哦
2013-7-29 08:43
0
雪    币: 190
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
定顶顶爱爱爱
2013-7-29 14:01
0
雪    币: 41
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
顶。学习,这个要仔细地读一下。
2013-7-29 15:47
0
雪    币: 1626
活跃值: (148)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
7
Good thanks for share
2013-7-29 18:02
0
雪    币: 433
活跃值: (1870)
能力值: ( LV17,RANK:1820 )
在线值:
发帖
回帖
粉丝
8
都搞Linux内核漏洞了,学习了
2013-7-29 22:24
0
雪    币: 27
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
Mark。
2013-7-29 23:55
0
雪    币: 341
活跃值: (138)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
10
MARK。
2013-7-30 13:22
0
雪    币: 1839
活跃值: (295)
能力值: ( LV9,RANK:370 )
在线值:
发帖
回帖
粉丝
11
顶!!!!
2013-7-30 16:46
0
雪    币: 324
活跃值: (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
发现数组溢出不容易,能够用这个溢出执行到需要的代码段就是艺术啊~
2013-7-31 10:26
0
雪    币: 692
活跃值: (40)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
13
刚才看了下,分析的很好,就是有一个问题,就是数组越界后,挖掘者是怎么想到nl_table这个地址的,也就是说,为什么非要跳到这里来,按理来说,只要让sock_diag_handlers[family]越界,然后我map随便一个越界后的地址,写上跳转代码,非得要nl_table这块地址么?

理论上来说,找到了sock_diag_handlers的地址,只要传一个family>41的值,会返回一个地址,假设不为NULL,这个地址向上+4字节,是一个函数(*dump)的地址,系统会call这个函数,

举个例子,我找到了sock_diag_handlers的地址,然后在sock_diag_handlers+4*42(假设family=42)的地方做修改修改,应该也是可以的吧?
2013-8-2 17:18
0
雪    币: 6
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
为什么完全一样的内核,我用这个exploit就不行,运行了进程会死掉
2015-4-10 10:29
0
雪    币: 88
活跃值: (335)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
15
楼主,问你个问题,我使用的是centos,kernel 2.6.9 ,我看好多exp都是使用prepare_kernel_cred来提权,但是我运行都是提示没有这个符号?是不是由于内核版本的原因?cat kallsyms | grep prepare_kernel_cred检查了一下返回为空
2016-8-4 22:37
0
游客
登录 | 注册 方可回帖
返回
//