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结果。 或者, 利用其他的操作系统来监测 硬盘。所有这两个方法都很难去做, 因为你不知道你要找什么。 所以,所以最好的安全措施就是防止被攻击者入侵系统。

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

  1. linux lkm rootkit常用技巧

    简介 搜集一下linux lkm rootkit中常用的一些技巧 1.劫持系统调用 遍历地址空间 根据系统调用中的一些导出函数,比如sys_close的地址来寻找 unsigned long ** g ...

  2. Linux 内存机制详解宝典

    Linux 内存机制详解宝典 在linux的内存分配机制中,优先使用物理内存,当物理内存还有空闲时(还够用),不会释放其占用内存,就算占用内存的程序已经被关闭了,该程序所占用的内存用来做缓存使用,对于 ...

  3. Linux串口编程详解(转)

    串口本身,标准和硬件 † 串口是计算机上的串行通讯的物理接口.计算机历史上,串口曾经被广泛用于连接计算机和终端设备和各种外部设备.虽然以太网接口和USB接口也是以一个串行流进行数据传送的,但是串口连接 ...

  4. linux awk命令详解

    linux awk命令详解 简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分 ...

  5. Linux启动过程详解(inittab、rc.sysinit、rcX.d、rc.local)

    启动第一步--加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它.这是因为BIOS中包含了CPU的相关信息.设备启动顺序信息.硬 ...

  6. Linux启动过程详解

    Linux启动过程详解 附上两张图,加深记忆 图1: 图2: 第一张图比较简洁明了,下面对第一张图的步骤进行详解: 加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的 ...

  7. Linux /dev目录详解和Linux系统各个目录的作用

    Linux /dev目录详解(转http://blog.csdn.net/maopig/article/details/7195048) 在linux下,/dev目录是很重要的,各种设备都在下面.下面 ...

  8. linux cat 命令详解

    linux cat 命令详解 http://linux.chinaunix.net/techdoc/system/2007/11/16/972467.shtml adb shell su //这个不一 ...

  9. 【初级】linux rm 命令详解及使用方法实战

    rm:删除命令 前言: windows中的删除命令大家都不陌生,linux中的删除命令和windows中有一个共同特点,那就是危险,前两篇linux mkdir 命令详解及使用方法实战[初级]中我们就 ...

随机推荐

  1. thusc2018酱油记

    day-1 打点行囊,从学校出发去火车站 day0 在火车上一觉醒来便快到了北京,直接前往了宾馆安置 下午报道,一脸向往地第一次走入清华园,感觉十分的梦幻,心里一直喃喃:"希望以后也能经常在 ...

  2. NOI2014魔法森林题解报告

    题目描述 为了得到书法大家的真传,小 E 同学下定决心去拜访住在魔法森林中的隐 士.魔法森林可以被看成一个包含 n 个节点 m 条边的无向图,节点标号为 1,2,3,-,n,边标号为 1,2,3,-, ...

  3. 被动式pocscan扫描神器搭建

    1.搭建环境: 操作系统为:ubuntu16.04 x64位系统,内核版本3.0.10以上 2.安装docker镜像 root@backlion-virtual-machine:/# apt-get ...

  4. 把lighttpd配置为系统服务

    每次启动切换到 /usr/local/lighttpd/sbin 执行 ./lighttpd -f /usr/local/lighttpd/lighttpd.conf 比较麻烦, 而且不方便重新启动! ...

  5. 解题:ZJOI 2006 书架

    题面 学习了如何在维护序列的平衡树上查找某个数:按初始的顺序定个权值,然后每次找那个权值的DFS序即可.具体实现就是不停往上跳,然后是父亲的右儿子就加上父亲的左儿子,剩下的就是继续熟悉无旋树堆 #in ...

  6. 使用log4net将日志文件输出为csv格式

    我们在编写程序时,会在程序运行过程中记录一些日志.log4net作为一款经久耐用的日志组件,值得我们信赖.在中小型公司中,往往没有专业的日志服务器来处理应用程序产生的日志,而格式化不好的日志文件又为上 ...

  7. Centos 7.3 下 的QT 输入中文

    我的QT 目录在 /opt/Qt/Tools/QtCreator,进入到 /bin 目录,然后运行 ./qtcreator.sh  就可以运行 在qtcreator.sh 中加入 export QT_ ...

  8. Codeforces 894.D Ralph And His Tour in Binary Country

    D. Ralph And His Tour in Binary Country time limit per test 2.5 seconds memory limit per test 512 me ...

  9. 洛谷P2617 Dynamic Rankings (主席树)

    洛谷P2617 Dynamic Rankings 题目描述 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a ...

  10. 大自然的搬运工:Ubuntu环境下gedit的一些个简单配置

    gedit是Ubuntu默认的文本编辑器,个人觉得还是不错的,用它来编程写一些小的demo也很方便,原谅我比较菜,vim用起来感觉打字速度真的很慢呀. 下面对gedit做一些简单配置,方便编程. 一. ...