后门技术和Linux LKM Rootkit详解

2010-01-15 10:32 chinaitlab chinaitlab 字号:T | T

在这篇文章里, 我们将看到各种不同的后门技术,特别是 Linux的可装载内核模块(LKM)。 我们将会发现LKM后门比传统的后门程序更加复杂,更加强大,更不易于被发现。知道这些之后,我们可以制造我们 自己的基于LKM的Rootkit程序, 主要体现在TCP/IP层, 因为我们相信这是在系统管理员面前最好的隐藏后门的地方。

AD:2014WOT全球软件技术峰会北京站 课程视频发布

简介: 在这篇文章里, 我们将看到各种不同的后门技术,特别是 Linux的可装载内核模块(LKM)。 我们将会发现LKM后门比传统的后门程序更加复杂,更加强大,更不易于被发现。知道这些之后,我们可以制造我们 自己的基于LKM的Rootkit程序, 主要体现在TCP/IP层, 因为我们相信这是在系统管理员面前最好的隐藏后门的地方。

序言

在一些黑客组织中, Rootkit (或者backdoor) 是一个非常感兴趣的话题。 各种不同的Rootkit被开发并发布在internet 上。在这些Rootkit之中, LKM尤其被人关注, 因为它是利用现代操作系统的模块技术。作为内核的一部分运行,这种Rootkit将会越来越比传 统技术更加强大更加不易被发觉。一旦被安装运行到目标机器上, 系统就会完全被控制在hacker手中了。甚至系统管理员根本找不到安全隐患的痕迹, 因 为他们不能再信任它们的操作系统了。

本文章以及我们开发的一些强大的LKM程序都是基于Linux Kernel 2.2.x版本的。我们的目的是尽可能多的隐藏足迹。

在接下来的一部分, 我们将介绍一下已经存在的后门技术, 然后和LKM技术相比较, 最后讨论我么的LKM程序的设计与实现。

后门程序的目的就是甚至系统管理员企图弥补系统漏洞的时候也可以给hacker系统的访问权限。后门程序使本地用户取得root权限可以这样做: 设置uid程序, 系统木马程序, cron后门。

1. 设置uid程序。 黑客在一些文件系统理放一些设置uid脚本程序。无论何时它们只要执行这个程序它们就会成为root。

2. 系统木马程序。黑客替换一些系统程序, 如"login"程序。因此, 只要满足一定的条件,那些程序就会给黑客最高权限。

3. Cron 后门。黑客在cron增加或修改一些任务, 在某个特定的时间程序运行,他们就可以获得最高权限。

后门程序给远程用户以最高访问权限可以这样做: ".rhost" 文件, ssh认证密钥, bind shell, 木马服务程序。

1. ".rhosts" 文件。一旦 "+ +"被加入某个用户的.rhosts文件里, 任何人在任何地方都可以用这个账号来登陆进来而不需要密码。

2. ssh 认证密钥。黑客把他自己的公共密钥放到目标机器的ssh配置文件"authorized_keys"里, 他可以用该账号来访问机器而不需要密码。

3. Bind shell。黑客绑定一个shell到一个特定的tcp端口。任何人telnet这个端口都可以获得交互的shell。更多精巧的这种方式的后门可以基于udp,或者未连接的tcp, 甚至icmp协议。

4. Trojaned服务程序。任何打开的服务都可以成为木马来为远程用户提供访问权限。例如, 利用inetd服务在一个特定的端口来创建一个bind shell,或者通过ssh守护进程提供访问途径。

在入侵者植入和运行后门程序之后, 他会找一些方法和系统管理员开一些善意的玩笑。这主要涉及到两个方面问题: 如何来隐藏他的文件且如何来隐藏他的进程。

为了隐藏文件, 入侵者需要做如下事情: 替换一些系统常用命令如"ls", "du", "fsck"。在底层方面, 他们通过把硬盘里的一些区域标记为坏块并把它的文件放在那里。或者如果他足够疯狂,他会把一些文件放入引导块里。

为了隐藏进程, 他可以替换 "ps"程序, 或者通过修改argv[]来使程序看起来象一个合法的服务程序。有趣的是把一个程序改成中断驱动的话,它就不会出现在进程表里了。

LKM - 还有比这个更臭屁的么?

我们已经看到过一些常规的技术。现在的问题是: 系统管理员可以找出它们么?实际上, 一个好的系统管理员可以很轻易的找出它们中的%99。 问题是入侵 者必须修改或者创建一些重要文件。 如果系统管理员保存一份"tripwire"数据库, 通过这些可以确定安全隐患的存在。通过浏览文件系统可以去掉 suid程序, ".rhosts" 文件, 等。

相反, 利用LKM我们可有效的突破这些限制。首先,我们在重要的系统目录里不必修改或创建任何文件。我们可以把LKM程序放在/tmp或/var /tmp目录下, 一般系统管理员是不会监视这些目录的。 其次, 我们可以隐藏我们想要的任何东西, 象文件, 进程, 和网络连接。 因为要得到这些 信息, 用户必须依赖系统调用。

因此我们可以修改内核结构, 我们可以用我们自己的函数来替换原系统调用。最后,我们甚至可以攻击或修改TCP/IP协议栈并且去愚弄系统内核!以下部分,我们将介绍如何利用这些机制以及实现方法。

我们的LKM程序主要是基于Linux Kernel 2.2.x及TCP/IP上的实现, 因为一个优秀的后门程序一定会给远程用户访问该系统的权限。在目标机器上打开一个端口,运行一个服务是非常容易暴露的。我们需要尽可能的隐藏自己。

第一个想法是我们在目标机器上不运行任何进程来等待连接,我们在TCP/IP协议栈里来创建一个函数来替代它。 无论何时一个特殊的udp或tcp包被接 受,内核将会检查这个包来确定是否是指定的特殊包。假如是的话, 内核将派生一个进程来执行命令。我们可以使用任何内核可以支持的协议包。

现在我们来实现它。在内核里, 每个协议在*inet_protocol_base 和*inet_protos[MAX_INET_PROTOS] hash注册自己。 当系统初始化时, 所有支持的协议会再 inet_protocol_base注册。他们被加到inet_protos的哈希表里。不管什么时候一个IP包达到时, 内核将检查这个哈希表,找相 应的处理函数和系统调用。我们就在这个点上进行hack。我们将用我们的处理函数来替换原始的协议的处理函数。因此,我们可以截获数据包并且分析它。假如 它是我们需要的, 我们将执行我们的命令。 假如不是,仅仅只需要调用原来的函数。

我们同时处理TCP和UDP的原因是假如那里有一些防火墙的话,UDP可能不能穿过。因此,我们只需要发一个源地址被伪造的数据包到目的机子。此外,对于TCP的数据包,它也不需要使用SYN位。事实上,现在我们的客户程序使用的是ACK的包。

第二个想法更使人感兴趣。 如果一台目标的机子上有个WEB的服务并且安了一个只允许WEB通信的防火墙,那么我们如何来穿过它呢? 我们能否得到一个交互的shell呢?答案是肯定的。方法如下:

____________ _________________________

| 攻击者   | | web server         |

|       | | 80 <=======> 53333 |

|__________| |_______________________|

|                         |

|                         |

|____________________________________|

1025 ==> 80 or 1025 <== 80

假设我们在web服务器上已经绑定了一个bind shell后门并且监听53333端口(可以利用第一个方法来完成) 现在我们需要把攻击者到web服务器上的流量从80端口重定向到53333端口, 从53333端口到攻击者的流量必须被改成80端口。

实现部分。改变接收的包是很容易的, 我们可以借用第一个LKM的思路- 无论何时我们都检查到来的tcp包如果必要我们修改它的目的端口。为了改变发出 的包, 这就有点困难了。 因为TCP/IP协议栈的实现涉及到Linux内核的一些底层的静态函数。它不太容易被置换(但是是可能的, 细节参见附 录)。 我们利用的是大部分发布时就被编译进内核中的防火墙。每个到来的包,转发的包, 或发出的包必须通过防火墙。并且防火墙函数是可以被动态地加载到 内核里的!我们利用系统导出函数register_firewall() 在系统防火墙规则之前插入我们自己的规则。假如我们发现一些来自于53333端 口的包, 我们可以自动改变它到80。

关于此实现的另外的细节是无论何时我们改变数据包, 我们必须去重新计算校验和。 更有趣的事情是我们可以在web服务器和其他一些机器上监听网络流量, 我们可以看到他们的不同之处。 在其他机器上的sniffer看起来象普通的web流量, 但是在web服务器上的sniffer是一些无用的流量纪录。 具体细节参见附录。

现在我们谈一下如何来截获系统调用。为了隐藏入侵者的足迹, 文件, 进程,网络连接必须隐藏起来。 因为这些信息都是可以从特殊的系统调用里面获得的, 我们可以接获一些感兴趣的系统调用。

1. 隐藏文件。象这些命令如"ls", "du" 使用sys_getdents() 来获得目录信息。 所以LKM程序必须过滤这些输出来达到隐藏文件的目的。

2. 隐藏进程。在Linux的实现中,进程的信息被映射到/proc文件系统去了。我们的工作仍旧是捕获sys_getdents()调用在进程链表中标记为不可见。通常的手法是设置任务的信号标志位为一些未用的信号量,比如31就是一个例子。

3. 隐藏网络连接。 和隐藏进程相似, 在这个例子中我们是这去隐藏一些包括/proc/net/tcp和/proc/net/udp的文件。所以我们改变sys_read()。 无论何时读包含匹配字符串的这两个文件的时候, 系统调用将不会声明在使用它。

4. 重定向可执行文件。 有时候, 入侵者可能会需要替换系统的二进制文件, 象"login", 但不想改变原文件。他可以截获sys_execve()。因此, 无论何时系统尝试去执行"login"程序的时候, 它都会被重定向到入侵者给定的其他程序。

5. 隐藏sniffer。这儿我们指隐藏网络接口的杂拨模式。在这里我们要替换的是sys_ioctl()。

6. 和LKM通信。 黑客已经很好的安装了他的LKM。现在他需要告诉内核来隐藏其他文件。他该怎么做呢?我们知道从用户态切换到和心态通常是通过系统调用来进行的, 所以我们必须修改一些系统调用。

例如, 我们将截获sys_settimeofday()。当一个指定的参数被传递, 我们的系统调用将会为我们做一些适当的事情。

7. 隐藏LKM本身。一个优秀的LKM程序必须很好地隐藏它自己。系统里的LKM是用单向链表连接起来的, 为了隐藏LKM本身我们必须把它从链表中移走以至于lsmod这样的命令不能把它显示出来。

8. 隐藏符号表。通常的LKM中的函数将会被导出以至于其他模块可以使用它。因为我们是入侵者, 所以隐藏这些符号是必须的。幸运的是, 有一个宏可以供我们使用:"EXPORT_NO_SYMBOLS"。 把这个宏放在LKM的最后可以防止任何符号的输出。

经验和结论

做个LKM程序是一个非常有趣而又非常危险的事情。有趣的是你可以在系统内核中作你想做的事情。 但这也是非常危险的, 它可以使你的服务陷入混乱, 破 坏你的数据, 并且可以在你的系统里做任何怪异的事情。 我们的经验有: 在安装了LKM程序几天后我们的网络层不工作了, 只工作五分钟就要重起一 次; 无论何时发送数据包, 象这些应用程序 telnet, netscape, pine都将会产生core dump; 在安装LKM程序后立马重 起。所以, 就象标题所说的那样,后果自负!

值得一提的是写一个LKM程序你可以更好地了解到系统是如何工作的。例如, /proc文件系统有很好的特性。因为LKM程序工作在内核空间, 调试 LKM程序就变得比一般程序要困难。 使用"printk"函数可以解决一些问题。但这不是最好的解决方法。通过注册在/proc文件系统里的我们的文件 和目录的数据结构, 我们可以访问到任何时间的内核空间的信息。我们甚至可以通过写这个文件来修改内存, 尽管一般不建议这样做。

从经验来看, 很明显的LKM程序可以在Linux上安装,一旦系统被攻破并且被安装了LKM的Rootkit程序, 这就变的很难被发现了。因为甚至操 作系统都不能信任了。如果机器不允许关机,唯一的发现入侵者的方法是通过分析在网络其他机器上的sniffer结果。 或者, 利用其他的操作系统来监测 硬盘。所有这两个方法都很难去做, 因为你不知道你要找什么。 所以,所以最好的安全措施就是防止被攻击者入侵系统。

时间: 2024-10-08 20:58:35

后门技术和Linux LKM Rootkit详解的相关文章

linux lkm rootkit常用技巧

简介 搜集一下linux lkm rootkit中常用的一些技巧 1.劫持系统调用 遍历地址空间 根据系统调用中的一些导出函数,比如sys_close的地址来寻找 unsigned long ** get_sys_call_table(void) { unsigned long **entry = (unsigned long **)PAGE_OFFSET; for (;(unsigned long)entry < ULONG_MAX; entry += 1) { if (entry[__NR_

linux设备号详解

原文:http://blog.csdn.net/zjjyliuweijie/article/details/7001383 linux 中的设备有2种类型:字符设备(无缓冲且只能顺序存取).块设备(有缓冲且可以随机存取).每个字符设备和块设备都必须有主.次设备号,主设备号相同的设 备是同类设备(使用同一个驱动程序).这些设备中,有些设备是对实际存在的物理硬件的抽象,而有些设备则是内核自身提供的功能(不依赖于特定的物理硬件,又称为"虚拟设备").每个设备在 /dev 目录下都有一个对应的

Linux串口编程详解

串口本身,标准和硬件 ? 串口是计算机上的串行通讯的物理接口.计算机历史上,串口曾经被广泛用于连接计算机和终端设备和各种外部设备.虽然以太网接口和USB接口也是以一个串行流进行数据传送的,但是串口连接通常特指那些与RS-232标准兼容的硬件或者调制解调器的接口.虽然现在在很多个人计算机上,原来用以连接外部设备的串口已经广泛的被USB和Firewire替代:而原来用以连接网络的串口则被以太网替代,还有用以连接终端的串口设备则已经被MDA或者VGA取而代之.但是,一方面因为串口本身造价便宜技术成熟,

Linux集群详解

Linux集群详解 集群或者说是群集:其目的是为了实现将多台计算机组合以来完成特定的任务,比如天气预报,大型网络游戏,这些都需要很大的运算量,单台计算机实现成本太高,而且不显示.那么就需要通过集群的方式,将废弃的或者正在使用的计算机联合起来,结合整体的力量来解决这些问题 集群类型: 1.  负载均衡集群 load blancing ,简称LB 2.  高可用性集群 high availibility,简称 HA 3.  高性能集群 high performance,简称 HP 作用: 1.  负

Linux阵列 RAID详解

主要内容:(笔记总结--会不定时补充.修改,如有错误,欢迎指正探讨)    一. RAID详解   二. mdadm工具介绍   三. 创建一个RAID的基本过程   四. 磁盘阵列的管理   五. RAID优化 RAID详解:   描述:RAID: (Redundant Array of indenpensive Disk) 独立磁盘冗余阵列: 磁盘阵列是把多个磁盘组成一个阵列,当作单一磁盘使用,它将数据以分段(striping)的方式储存在不同的磁盘中,存取数据时,阵列中的相关磁盘一起 动作

Linux SVN 命令详解(zz)

Linux下常用SVN命令 2012-04-02 11:46:00 标签:服务器 目录 Linux checkout linux系统 1.将文件checkout到本地目录 svn checkout path(path是服务器上的目录) 例如:svn checkout svn://192.168.1.1/pro/domain  --username qinxiaohui 简写:svn co 2.往版本库中添加新的文件 svn add file 例如:svn add test.php(添加test.

Linux文件权限详解 文件和目录权限概述

Linux文件权限详解 文件和目录权限概述 在linux中的每一个文件或目录都包含有访问权限,这些访问权限决定了谁能访问和如何访问这些文件和目录. 通过设定权限可以从以下三种访问方式限制访问权限:只允许用户自己访问:允许一个预先指定的用户组中的用户访问:允许系统中的任何用户访问.同时,用户能够控制一个给定的文件或目录的访问程度.一个文件活目录可能有读.写及执行权限.当创建一个文件时,系统会自动地赋予文件所有者读和写的权限,这样可以允许所有者能够显示文件内容和修改文件.文件所有者可以将这些权限改变

Monitorix监控Linux主机图文详解

Monitorix监控Linux主机图文详解 Monitorix简介 Monitorix 是一款自由开源的轻巧型系统监视工具.使用 Monitorix你可以随时掌控 CPU 负载及温度.内存占用.活动进程.磁盘使用及温度.网络设备流量.网络服务等全方位的系统信息.Monitorix 需要 Apache Web 服务器来显示这些系统信息图表.所以它特别适合在 Linux 服务器上面使用. 下面是我安装的步骤 1.安装的环境和需要的rpm包 我是在CentOS 6.4下面安装的CentOS 5可以使

LINUX 信号概念详解

LINUX 信号概念详解 我们运行如下命令,可看到Linux支持的信号列表: # kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD 18) SIGCONT 19) SIGSTOP