问题标签 [rootkit]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 读取系统调用表函数地址时内核模块崩溃
我正在研究 rootkit 并试图挂钩系统调用表。由于我已经可以从 /boot/System.map-$(uname -r) 动态检索表的地址,因此我跟踪并将代码的问题部分隔离到一个独立的、更简单的模块中,如下所示。它尝试检索并显示 kill 系统调用的地址,但 insmod 在模块加载时返回“Killed”,这是在强调的行上专门引发的错误。
内核版本:5.2.0-3-amd64
模块:
dmesg:
dmesg(重启后):
我有以下问题:
(0. 为什么它会崩溃,我该怎么办?)
1. 为什么 "%p" 打印的值与 "%lx" 的打印值不同?
2. 为什么“%p”在重启后打印不同的值,而“%lx”总是打印正确的值?
c - 写入系统调用表函数地址时内核模块崩溃
据我了解,由于 KASLR ,该模块无法使用系统调用表地址。/boot/System.map-$(uname -r)
通过启动nokaslr
,模块工作。解决了这个问题后,我继续实际挂钩 kill 功能,但不能;insmod
再次在模块加载时返回“Killed”,而dmesg
现在记录写访问权限错误,该错误发生在强调的行上。
我认为取消控制寄存器上的写保护位的目的是“取消写保护”。除了那个(或我的代码)之外,还有什么能阻止内核模块覆盖系统调用表吗?
代码
dmesg
hook - 是否可以从 inotify 子系统中转储 inode 信息?
我试图弄清楚我的编辑正在观看哪些文件。我了解到计算 inotify fds 的数量是/proc/${PID}/fd
可能的,我的问题是:是否可以通过一个进程转储监视的 inode 列表?
更新:我已经更新了一个可行的解决方案,并感谢您在此处提供有用的参考。
更新 2:好吧,最近我发现kallsyms_lookup_name
(和更多符号) not export since Linux Kernel v5.7
,所以如果其他人关心,我决定更新我自己的解决方案。
c - 为什么不能使用 System.map 中的 system_wq 导出 sys_call_table 的地址?
在尝试了在关于该主题的上一个问题上推导 KASLR 偏移偏移的建议解决方案后,我意识到运行时地址与是否启用 KASLR 不同(尽管在不同的禁用 KASLR 时它确实保持相同system_wq
)/boot/System.map-$(uname -r)
靴子,这显然不会发生在相反的情况下)。
以下代码段应sys_call_table
使用 and 的运行时地址和两者的 System.map 地址来计算地址(system_wq
假设包含相应的 System.map 地址)。输出位于代码段下方。system_wq
sys_call_table
sysmap_*
dmesg
启用 KASLR
引导 1:
引导 2:
KASLR 已禁用
引导 1:
引导 2:
问题
1 . 为什么sys_call_table
当 KASLR 被禁用时,运行时地址与 System.map 的运行时地址匹配(我知道是因为系统调用已成功挂接)而system_wq
没有?
2 . 为什么代码片段无法计算sys_call_table
是否启用了 KASLR 的运行时地址?
3 . 如果它的运行时地址system_wq
与 System.map 的运行时地址不同,那么还有哪些其他导出符号可用于派生sys_call_table
?
centos - Centos 7 上的加密货币恶意软件
我托管在 Google Cloud 上的 VPS 服务器受到加密货币恶意软件的攻击。它从“/tmp/init”运行并占用所有 CPU 资源。我所做的是终止进程并删除 /tmp/init 文件。我不知道如何,但几天后,/tmp/init 将再次出现并运行。
我尝试使用 rkhunter、lynis、chkrootkit 和 clamav 等几个 rootkit 工具找到它的来源,但什么也没找到,所有配置都正常。有 3 个从外部开放的端口:80(apache web 服务器)、20(只接受没有 root 登录的私钥)和 8983(Apache Solr)
有没有什么好的工具可以找到原因,或者有什么方法可以防止这种情况发生?
谢谢
c - 内核开发:挂钩执行和打印 char *const argv[]
我正在尝试 HookExecve 并打印参数。我可以很好地打印文件名。如何在内核模式下打印char *const argv[]的参数?我需要能够获得它们的数量并且能够打印它们。
因此,如果我运行 ls -lah 。我应该在 argv ["ls", "-lah"] 中看到;我可以在用户空间中执行此操作,但是所有将信息从用户空间复制到内核空间的尝试似乎都会导致崩溃。
linux-kernel - rootkit 如何隐藏进程?
我正在尝试了解 rootkit 的工作原理(出于教育目的)。我有Kbeast rootkit 的源代码。从 ps|| 隐藏进程 pstree 等命令它具有以下功能,
此函数覆盖 sys_call_table [__NR_write]。我的理解是 *buf,包含它试图隐藏的进程的名称。使用 copy_from_user(),将 buf 复制到内核缓冲区 kbuf 中,然后在ps||pstree||...
使用 strstr() 检测到命令时,它会查找 process_to_hide(H4X0R)。然后找到匹配项,释放内核缓冲区 kbuf。我的理解正确吗?
我检查buf的内容。它不包含任何内容,因此它永远不会起作用。
为了使它工作,我做了一些解决方法(不确定这是否是正确的方法,因为我说我是初学者)。我做了以下操作,将进程名称(我试图隐藏的进程)放入buf中,然后使用copy_from_user()将其复制到内核空间中。我有一个看起来像原始 Kbeast 代码的工作代码,
在运行 ps 命令时,它显示以下内容,
这里发生了什么?
我在考虑另一种方法,如在task_struct链接列表中包含所有进程名称,如果我能以某种方式从task_struct取消链接目标进程应该可以做到这一点,但我不知道如何做到这一点。
c - 无法在 ARM64 上的 Linux 内核中使用 set_memory_rw
我正在尝试开发一个挂钩read()
系统调用的内核模块。由于某种原因,该set_memory_rw()
功能似乎不起作用。
我看到了另一个类似的问题,但我真的不明白该怎么做。
我正在使用 Raspberry-pi 4 开发 Kali 4.19.93
我的代码:
如何使set_memory_rw()
函数工作以覆盖系统调用表?还是我应该使用其他方法?
bios - 写只读 ACPI 表
我想在 Windows 启动之前从某种简单的 rootkit 修改我的 ACPI 表。
-> 不,我不能更改 BIOS 代码
->我知道 Clover 能够胜任这项工作,但我正在启动旧模式并且没有设法为旧设备安装它,但是
但现在我开始使用 RSDP 指针:
->int 15h E820 将其内存区域报告为“类型 2:保留 - 不可用”
这似乎是正确的,因为我写不出来。我认为它不是硬编码到 BIOS 中而是在启动时编写的,所以我的结论是我必须对 DRAM 控制器进行编程......
对于 INTEL32 和 AMD64 等所有平台,是否有一种通用的方法来对 DRAM 控制器进行编程以在这些区域获得写访问权限?
或任何其他方法来获得 ACPI 表的写访问权限?
编辑 1: EBDA 由 PAM 寄存器写保护,并且 TSEG 防止写入更高的区域,例如 ACPI 表。AMD64平台与这些等价物是什么?
linux-kernel - 无法在 ARM 上的 Linux 内核 4.19 中系统调用挂钩/写入受保护的内存页面 syscall_table
我正在尝试开发一个挂钩系统调用的内核模块。我正在运行 raspbian buster Linux 4.19.97-v7+ armv7l 的 Raspberry Pi 3B 上进行测试。
所以通常在 x86 上我们可以覆盖 CR0 寄存器,但 ARM 架构上没有类似的寄存器。我尝试通过 set_memory_rw 执行此操作,然后在使用 set_memory_ro 退出之前启用它,就像在 不能在 ARM64 上的 Linux 内核中使用 set_memory_rw 中的类似问题的一个答案, 但它不起作用。
我的代码:
Dmesg 跟踪错误如下
我还尝试了ARM64 的其他一些建议——Linux 内存写保护不会禁用,它通过使用 Linux 内核函数通过相应的 PTE 对虚拟地址禁用内存写保护。它也不起作用。
我现在真的很困惑,非常感谢您的建议!