Linux下用gdb检测内核rootkit

System.map符号表解析 System.map是内核符号表文件,是由“nm vmlinux”命令产生的,位于源码根目录。 所谓“符号”就是函数名,全局变量名等东东,这个表就记录的这些“符号”在内核中的运行地址。(这个地址是Effective Address,虚地址) 下面是文件的一个片段: 阅读详情
【理解攻击向量】

前面两段废话直接掠过...实在浪费感情-_-!

内核rookit通常以系统调用为攻击目标,主要出于两个原因:
  a.在内核态劫持系统调用能以较小的代价控制整个系统,不必修太多东西;
  b.应用层大多数函数是一个或多个系统调用不同形式的封装,更改系统调用意味着其上层所有的
函数都会被欺骗;
  在kernel-2.4.27中大约有230多个系统调用,而kernel-2.6.9中大约有290多个系统调用,系统调
用的个数取决于内核版本.完整的系统调用列表可以在 /usr/include/asm/unistd.h头文件中获得.
另外需要注意的是入侵者并不更改所有的系统调用,而只是替换其中一些比较有用的.这些系统调用
如表一所示,他们可以被系统管理员及入侵检测系统(OS kernel级IDS)监视,可以用man命令得到
每个系统调用的完整描述。

System call name    Short description          ID
-------------------------------------------------------------------------------------------
sys_read      used for reading from files       3
sys_write      used for writing to files         4
sys_open      used to create or open files       5
sys_getdents/sys_getdents64  used to list a content of directories(also /proc)   141/220
sys_socketcall    used for managing sockets        102
sys_query_module    used for querying loaded modules       167
sys_setuid/sys_getuid  used for managing UIDs         23/24
sys_execve    used for executing binary files       11
sys_chdir      used to change the directory       12
sys_fork/sys_clone    used to create a child process       2/120
sys_ioctl      used to control devices         54
sys_kill      used to send signal to processes       37

我们注意上表的系统调用号,这些ID都是针对kernel-2.4.18-3的。

本文所有的例子都在Redhat7.3 kernel-2.4.18-3上通过测试,我们也可以在其他版本包括最新的2.6.x上
用相似的步骤研究,不同之处可能在于2.6的一些内部结构,比如系统调用表的地址原来内含在系统调用
处理例程system_call中,现在改成在syscall_call函数中。

【更改系统调用表】

当前的系统调用地址保存在系统调用表中,位于操作系统为内核保留的内存空间(虚拟地址最高1GB),系统
调用入口地址的存放顺序同/usr/include/asm/unistd.h中的排列顺序,按系统调用号递增。

-_-!鉴于原文废话很多,我就跳着翻译或者概括起来翻译,有兴趣的可以找本Linux内核的书看看(e.g:ULK2)

在0x80软中断发生之前,对应的系统调用号被压入eax寄存器,例如sys_write被调用时,其对应的系统调用
ID:4会被压入eax

入侵者使用的第一种方法是:更改系统调用表中的系统调用地址,这样系统调用发生时会跳转到攻击者自己
编写的函数去执行。通过观察系统调用表中的系统调用入口地址,使用gdb我们可以比较容易检测到这种攻
击行为。

原始的系统调用地址在内核编译阶段被指定,不会更改,通过比较原始的系统调用地址和当前内核态中的系统
调用地址我们就可以发现系统调用有没有被更改。原始的系统调用地址在编译阶段被写入两个文件:
a.System.map该文件包含所有的符号地址,系统调用也包含在内
b.系统初始化时首先被读入内存的内核映像文件vmlinux-2.4.x
vmlinux-2.4.x文件通常以压缩的格式存放在/boot目录下,所以在比较之前必须解压这个文件,另一个问题是:
我们的比较的前提是假设system.map及vmlinuz image都没有被入侵者更改,所以更安全的做法是在系统干净
时已经创建这两个文件的可信任的拷贝,并创建文件的md5 hash。

原文中也列举了一个内核模块[gcc -c scprint.c -I/usr/src/`uname -r`/include/ ]使用该模块打印系统
调用地址,并自动写入syslog,这样可以进行实时的比较。

在大多数被装载内核后门情况中,内核在系统初始化之后才被更改,更改发生在加载了rootkit的module或者被
植入直接读写/dev/kmem的on-the-fly kernel patch之后。而通常情况下rootkit并不更改vmlinuz和system.map
这两个文件,所以打印这两个文件中的符号地址就可以知道系统原始的系统调用地址,系统当前运行中的系统
调用地址(可能被更改)可以同过/proc下的kcore文件得到,比较两者就知道结果。

1.首先找出系统调用表地址:

[root@rh8 boot]# cat System.map-2.4.18-13 | grep sys_call_table c0302c30 D sys_call_table

2.使用nm命令可以打印出未被strip过的image文件中所有的符号地址:

[root@rh8 boot]# nm vmlinux-2.4.18-13 | grep sys_call_table
c0302c30 D sys_call_table

使用gdb可以打印出所有的系统调用入口地址,这些对应的地址在内核源代码的entry.S文件中定义,例如:
entry 0 (0xc01261a0)是sys_ni_syscall系统调用
entry 1 (0xc011e1d0)是sys_exit系统调用
entry 2 (0xc01078a0)是sys_fork系统调用

#gdb /boot/vmlinux-2.4.*
(gdb) x/255 0xc0302c30
0xc0302c30 <sys_call_table>:  0xc01261a0 0xc011e1d0 0xc01078a0 0xc013fb70
0xc0302c40 <sys_call_table+16>: 0xc013fcb0 0xc013f0e0 0xc013f230 0xc011e5b0 
0xc0302c50 <sys_call_table+32>: 0xc013f180 0xc014cb10 0xc014c670 0xc0107940
0xc0302c60 <sys_call_table+48>: 0xc013e620 0xc011f020 0xc014bcd0 0xc013e9a0
...

我们也可以通过系统调用名打印出系统调用的地址:

(gdb) x/x sys_ni_syscall
0xc01261a0 <sys_ni_syscall>:   0xffffdab8
((gdb) x/x sys_fork
0xc01078a0 <sys_fork>:  0x8b10ec83

要打印出当前运行系统中的系统调用地址我们必须给gdb加两个参数:
a.第一个参数是内核映像文件vmliux-2.4.x
b.第二个参数是/proc/kcore二进制文件

#gdb /boot/vmlinux-2.4.* /proc/kcore
(gdb) x/255x 0xc0302c30          
0xc0302c30 <sys_call_table>:  0xc01261a0  0xc011e1d0  0xc01078a0  0xc88ab11a <<--
0xc0302c40 <sys_call_table+16>: 0xc013fcb0  0xc013f0e0  0xc013f230  0xc011e5b0
0xc0302c50 <sys_call_table+32>: 0xc013f180  0xc014cb10  0xc014c670  0xc0107940
0xc0302c60 <sys_call_table+48>: 0xc013e620  0xc011f020  0xc014bcd0  0xc013e9a0
...

  我们注意到第一行最后的0xc88ab11a这个地址明显不正常,这是系统调用号为3的系统调用,即
sys_read (系统调用从0开始)

  我们说它不正常的显著标志是它的地址高于0xc8xxxxxx,Linux默认4GB线性地址,其中最高1GB
0x00000000-0xffffffff为内核保留,当一个模块被插入内核时,vmalloc函数为其分配一段地址空间,
这个地址通常从0xc8800000开始...到这里已经很明显了吧?

【系统调用劫持】

  劫持系统调用与上一种方法不同之处在于:它并不直接修改系统调用表中的入口地址,即指向
每个系统调用的跳转指针,而是在想要hook的系统调用之前加一段跳转代码,使执行流重定向到入
侵者自己的内核态函数,这些被hook的系统调用前部通常有call,jmp之类的汇编指令。

  要检测这种攻击,同样使用gdb加vmlinux-2.4.*及/proc/kcore两个参数,然后反汇编系统调用:

#gdb /boot/vmlinux-2.4.* /proc/kcore
(gdb) disass sys_read
Dump of assembler code for function sys_read:
0xc013fb70 <sys_read>:         mov   $0xc88ab0a6,%ecx
0xc013fb73 <sys_read+3>:        jmp   *%ecx       <<--
0xc013fb77 <sys_read+7>:        mov   %esi,0x1c(%esp,1)
0xc013fb7b <sys_read+11>:       mov   %edi,0x20(%esp,1)
0xc013fb7f <sys_read+15>:       mov   $0xfffffff7,%edi
...

我们注意“mov $0xc88ab0a6,%ecx -- jmp *%ecx”这两条指令,他跳转到了其他的地方去执行了

然后再来看一下被hook之前的系统调用指令:

#gdb /boot/vmlinx-2.4.*
(gdb) disass sys_read
Dump of assembler code for function sys_read:
0xc013fb70 <sys_read>:        sub   $0x28,%esp
0xc013fb73 <sys_read+3>:       mov   0x2c(%esp,1),%eax
0xc013fb77 <sys_read+7>:       mov   %esi,0x1c(%esp,1)
0xc013fb7b <sys_read+11>:       mov   %edi,0x20(%esp,1)
0xc013fb7f <sys_read+15>:       mov   $0xfffffff7,%edi
...

看到了吧,不一样的。

【更改系统调用处理例程】

  入侵者可能修改一些重要的内核函数,比如系统调用处理例程system_call函数,顾名思义,这个函数
对用户请求的系统调用作出响应,在系统调用表中寻找对应的入口地址,然后跳转到那里执行,这个函数
中保存了系统调用表的地址。攻击者能做什么呢?另辟一块内存空间,在那里攻击者伪造自己的系统调用
表,然后修改system_call函数中的系统调用表地址指向那里就可以了。

通过反汇编system_call函数可以找出系统调用表的地址:

(gdb) disass system_call
Dump of assembler code for function system_call:
0xc01090dc <system_call>:    push  %eax
0xc01090dd <system_call+1>:   cld
0xc01090de <system_call+2>:   push  %es
0xc01090df <system_call+3>:   push  %ds
0xc01090e0 <system_call+4>:   push  %eax
0xc01090e1 <system_call+5>:   push  %ebp
0xc01090e2 <system_call+6>:   push  %edi
0xc01090e3 <system_call+7>:   push  %esi
0xc01090e4 <system_call+8>:   push  %edx
0xc01090e5 <system_call+9>:   push  %ecx
0xc01090e6 <system_call+10>:   push  %ebx
0xc01090e7 <system_call+11>:   mov   $0x18,%edx
0xc01090ec <system_call+16>:   mov   %edx,%ds
0xc01090ee <system_call+18>:   mov   %edx,%es
0xc01090f0 <system_call+20>:   mov   $0xffffe000,%ebx
0xc01090f5 <system_call+25>:   and   %esp,%ebx
0xc01090f7 <system_call+27>:   testb  $0x2,0x18(%ebx)
0xc01090fb <system_call+31>:   jne   0xc010915c <tracesys>
0xc01090fd <system_call+33>:   cmp   $0x100,%eax
0xc0109102 <system_call+38>:   jae   0xc0109189 <badsys>
0xc0109108 <system_call+44>:   call  *0xc0302c30 (,%eax,4)  <<--系统调用表地址
0xc010910f <system_call+51>:   mov   %eax,0x18(%esp,1)
0xc0109113 <system_call+55>:   nop
End of assembler dump.

注意:上面的输出中显示的是一个正常的系统调用表地址。

【实用工具】 

一种方法是使用基于主机的入侵检测系统HIDS实时监控重要的内核结构,比如使用Samhain工具,
可以监视系统调用表、IDT等,在"Host Integrity Monitoring: Best Practices for Deployment"
一文中有相关描述

【译者注】

  本文提及的方法在kstat2.4版中都有代码的实现,可以参阅kstat/2.4/src/syscall.c,使用gdb
是一种手工检测方法,它能解决的问题是检测系统是否被更改,至于怎么样找出内核rootkit还需要一些
工具,比如madsys在phrack 60上的module_hunter.c,有2.4和2.6的版本,grip2、coolq对其做了一
些修改,并且该代码不断完善中,另外偶还从jbtzhm那儿挖了点东西,~_~ 
Linux内存取证实战:从原理到工具,系统化检测用户态与内核态Rootkit 内存取证是数字取证领域的关键技术,它通过分析系统运行时内存中的易失性数据,来揭示恶意活动的真实痕迹。其核心原理在于,操作系统和所有进程的代码、数据、网络连接及内核结构都必须在内存中加载和执行,这为检测高级威胁提供了不可篡改的“现场快照”。这项技术的核心价值在于对抗那些能够逃避传统基于文件和日志检测的深度隐藏威胁,例如Rootkit。在应用场景上,它尤其适用于应急响应、恶意软件分析和系统安全审计。本文将聚焦于Linux环境,深入探讨如何利用内存取证技术,系统性地检测和分析用户态与内核态的Rootkit,涵盖从 阅读详情

相关推荐

Linux Rootkit攻防实战:从原理到检测与防御体系构建

系统安全的核心挑战之一在于内核级威胁的检测与防御。在Linux系统中,系统调用作为用户空间与内核空间交互的接口,其完整性直接关系到操作系统的可信性。当恶意代码以内核模块形式加载并劫持系统调用表时,便形成了内核态Rootkit,它能篡改系统调用、隐藏进程与文件,使常规管理工具失效。这种技术通过破坏操作系统自身的可信基,实现了深度隐蔽,对服务器安全构成严重威胁。其技术价值在于揭示了传统基于API监控的安全模型的局限性,推动了基于内存取证、行为分析和硬件可信根等纵深防御理念的发展。在实际应用场景中,运维人员需面对

weixin_33829657的博客 455

在Linux下用gdb检测内核rootkit

在Linux下用gdb检测内核rootkit                                                                     来源:黑客基地 作者:未知 本文涉及的技术原理都不是新的,对研究人员没什么特别大的价值,不过对工程人员应急相应来说不失为一种新的方法。

1089

Linux系统Rootkit应急响应:从原理到实战的深度检测与清除指南

Rootkit是一种高级恶意软件技术,其核心原理在于通过替换系统工具、挂钩系统调用或感染内核模块等方式,实现进程、文件、网络连接等系统资源的深度隐藏,以维持攻击者对系统的持久控制权。从技术价值看,理解Rootkit的工作机制是构建有效主机入侵检测与防御体系的基础,尤其在云原生和容器化环境中,系统可信状态的维护至关重要。在应用场景上,面对服务器性能异常、日志被清空或发现未知进程等安全事件时,系统管理员和安全工程师需要一套系统性的应急响应方法。本文聚焦于Linux环境下Rootkit的检测与清除,详细解析了用户

weixin_30550081的博客 418

Linux下基于内存分析的Rootkit检测方法

路人甲 · 2015/01/23 9:520x00 引言某Linux服务器发现异常现象如下图,确定被植入Rootkit,但运维人员使用常规Rootkit检测方法无效,对此情况我们还可以做什么?图1 被植入Rootkit的Linux服务器所有暗链的html文件ls均看不到。使用ls -al 绝对路径,能看到,但无法删除。这些暗链的uid和gid都很奇特 分别为 2511744398:40433612...

weixin_34249678的博客 469

Lumerical官方案例、FDTD时域有限差分法仿真学习(十三)——多模干涉耦合器(MMI)

计算通过 1×2 端口多模干涉 (MMI) 耦合器的宽带传输和光损耗。 使用设备 S 参数在 INTERCONNECT 中创建 MMI 的紧凑模型。 它还展示了如何使用 CML 编译器提取这些参数以生成紧凑模型。 一、概述 了解模拟工作流程和关键结果 低损耗光合路器和分路器是基于 Mach-Zehnder 的光调制器的基本组件,并且是集成电路的关键组成部分。通过在输入/输出波导处使用线性锥形确保输入/输出波导的模式与干涉区域之间的

weixin_45719141的博客 1万+

《AFSim 2.9中文参考手册》

本栏目将对《AFSim 2.9中文参考手册》进行持续更新,欢迎关注交流!对本文或者AFSIM相关内容感兴趣的朋友,可私心联系作者。《AFSim 2.9中文参考手册》内容概览。

henggesim的博客 1万+

Rootkit总结

rootkit Rootkit是一种特殊的恶意软件,它的功能是在安装目标上隐藏自身及指定的文件、进程和网络链接等信息,比较多见到的是Rootkit一般都和木马、后门等其他恶意程序结合使用。 外文名 rootkit  rootkit是什么 在悬念迭起的中外谍战片里,对战双方中的一派势力通常会派遣特工人员潜伏到对手阵营中。这名卧底人员良好的伪装使得对手对此长时间毫无察觉;为了能

bcbobo21cn的专栏 6598

NX工程图避坑指南:唐康林老师视频里没细说的10个实用技巧与隐藏设置

本文深入解析NX工程图中10个易被忽视的实用技巧与隐藏设置,涵盖视图更新、剖面线自定义、标注样式统一等核心问题。特别针对UG/NX8.5/NX10用户,提供从首选项设置到打印优化的完整解决方案,帮助工程师避开常见陷阱,提升制图效率与规范性。

weixin_28683689的博客 576

linux系统RootKit木马查杀

rootkit是一种恶意软件通常和木马等其他恶意程序一起结合使用,而Linux是其重要的攻击对象。 Rootkit木马的原理: 操作系统是由内核(kernel)和外壳(shell)两部分组成的,内核负责一切实际的工作,包括cpu任务调度、内存分配管理、设备管理、文件操作等,外壳是基于内核提供的交互功能而存在的界面,它负责指令传递和解释。由于内核和外壳负责的任务不同,它们的处理环境也不同,因此处理器提供了多个不同的处理环境,把它们称为运行级别(ring),ring让程序指令能访问的计算机资源依...

focus on security 1587

项目风险管理全流程解析

按技术、资源、市场、外部环境等类型对风险进行分类,便于团队快速识别风险,提高风险管理效率,避免风险遗漏。项目结束后,总结实际发生的风险和应对效果,找出风险管理中的经验和教训,为后续项目提供参考。

qq_34062333的博客 1471

一文读懂5G网络整体架构(接入网+承载网+核心网)

接入网重构分级(分工更细、效率更高)、承载网三段化升级(管道更宽、更智能)、核心网服务化云化(管理更灵活、成本更低)最终实现“成本最优、资源灵活、场景适配”,才能支撑自动驾驶、工业互联网、智慧城市、VR/AR等各种新场景,真正走进我们的生活。

鲸落寰宇 430

逆向工程师必备:如何通过GS寄存器定位Windows/Linux内核关键数据结构(附实战案例)

本文深入探讨了x86_64架构中GS寄存器在逆向工程中的关键作用,详细解析了其在Windows和Linux内核中定位关键数据结构的实战技巧。通过Windbg和GDB的调试实例,展示了如何利用GS寄存器分析恶意代码行为、检测线程注入攻击,并构建有效的安全检测规则,为安全研究人员提供了一套高效的内核级分析工具和方法。

android的专栏 75

scratch绘制旋转彩球 2023年9月电子学会图形化编程scratch编程等级考试四级真题和答案解析

​ scratch绘制旋转彩球 2023年9月电子学会图形化编程Scratch等级考试四级真题 一、题目要求 1、准备工作 (1)删除小猫角色,从角色库选择Ball角色; (2)默认空白背景。 ​

青少年编程学习指导 1369

Linux Rootkit躲避内核检测

Rootkit在登堂入室并得手后,还要记得把门锁上。 如果我们想注入一个Rootkit到内核,同时不想被侦测到,那么我们需要做的是精妙的隐藏,并保持低调静悄悄,这个话题我已经谈过了,诸如进程摘链,TCP链接摘链潜伏等等,详情参见: https://blog.youkuaiyun.com/dog250/article/details/105371830 https://blog.youkuaiyun.com/dog250/...

TCP/IP 5357

Labview如何0基础自学快速入门?(纯干货帖)

讲解了如何学习Labview,Labview如何0基础入门,自学Labview的方法。什么都不会如何学好Labview的分享,欢迎关注文章~文章提供《Labview宝典》pdf下载,和《Labview虚拟仪器数据采集与通信控制》pdf下载

关注我,更多技术问题欢迎私聊~ 2万+

VTK实战完整教程介绍

该专栏以VTK提供的Example为基础,讲解VTK中的相关接口和使用方法。订阅该专栏,带你了解所有VTK的功能,以便VTK更好的解决工作中遇到的问题。一起学习起来吧!

qq_40041064的博客 2510

linux下基于内存分析的rootkit检测方法

0x00 引言 某Linux服务器发现异常现象如下图,确定被植入Rootkit,但运维人员使用常规Rootkit检测方法无效,对此情况我们还可以做什么? 图1 被植入Rootkit的Linux服务器 所有暗链的html文件ls均看不到。 使用ls -al 绝对路径,能看到,但无法删除。 这些暗链的uid和gid都很奇特 分别为 2511744398:4043361279 。 对任意...

whatday的专栏 1308

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

如何检测和防御Linux rootkit:awesome-linux-rootkits安全实践教程

- **Lynis**:一款强大的系统安全审计工具,包含rootkit扫描功能,能够检查系统配置、文件权限、内核模块、系统调用等是否存在异常。项目地址:[Lynis](https://github.com/CISOfy/lynis) - **rupurt**:高级Linux rootkit hunter,提供250多种签名、eBPF分析、内存取证和APT检测功能,支持实时监控和全面的威胁情报。项

gitblog_00250的博客 920

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

iTerm2 Python API 颜色模型全解析:iterm2.Color 与 ColorSpace 的完整使用指南

在 iTerm2 的 Python 脚本 API 中,[iterm2.color](https://link.gitcode.com/i/82f86b78698a5fb226aa5d239431ff31) 模块是整个配色体系的数据基石——无论是读取/修改 Profile 的背景色、前景色,还是应用 Color Preset 配色方案,最终都要落地为 `iterm2.Color` 对象。本文以 [c

gitblog_00401的博客 686

linux rootkit手动排查,Linux Rootkit如何避开内核检测的

Rootkit在登堂入室并得手后,还要记得把门锁上。如果我们想注入一个Rootkit到内核,同时不想被侦测到,那么我们需要做的是精妙的隐藏,并保持低调静悄悄,这个话题我已经谈过了,诸如进程摘链,TCP链接摘链潜伏等等,详情参见:https://blog.youkuaiyun.com/dog250/article/details/105371830https://blog.youkuaiyun.com/dog250/art...

weixin_39664560的博客 372

file.exist检测不到隐藏文件_Linux下基于内存分析的Rootkit检测方法

原文地址:http://drops.wooyun.org/tips/47310x00 引言某Linux服务器发现异常现象如下图,确定被植入Rootkit,但运维人员使用常规Rootkit检测方法无效,对此情况我们还可以做什么?图1 被植入Rootkit的Linux服务器所有暗链的html文件ls均看不到。使用ls -al 绝对路径,能看到,但无法删除。这些暗链的uid和gid都很奇特 分别为 25...

weixin_35411487的博客 381
上一篇: Linux安全检查笔记
下一篇: 实现无net.exe和net1.exe添加系统用户
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值