본문 바로가기

엔지니어/Linux

backdoor 탐지

728x90
반응형

Red : 강조

Blue : 명령어 & 메뉴이동

Green : 주석

Pink : 변수

Purple : 예시

Orange : 출력&편집&소스

 

* Incident

 

리눅스서버 해킹 사고 분석 및 대응 절차

 

1. 해킹 의심 상황 포착

2. 외부에서 nmap 명령어로 포트 스캔

3. chrootkit, rootkit hunter등으로 명령어 변조와 rootkit 존재여부 확인

4. 해커가 시스템의 권한을 어느정도까지 확보했는지 확인

5. 변조된 파일 복구

6. 시스템 상황 파악 및 백도어 제거

7. 어떤 취약성을 이용하여 권한을 획득하였는지 확인 후 취약성 패치 및 대책 수립

 

 

* Resolution

1. 해킹 의심 상황 포착

보통 해커들은 변조된 실행파일들이 다시 바뀌지 않게 해당 명령어에 속성을 걸어 놓는다.

ls 파일의 용량이 동일한 설치패키지 OS가 설치된 서버의 파일과 용량차이가 있었고 sia 속성이 걸려 있었다.

s : 파일이 지워질 때 일단 블록들이 모두 0이 된 다음 디스크에 기록한다.

i : 파일의 수정을 방지한다. 오직 수퍼 유저만이 다시 이 속성을 변경할 수 있다.

a : 파일을 추가 모드로만 열 수 있다.

# ls -l /bin/ls

-rwxr-xr-x   1 122      114         39696 Mar 21  2012 ls

# lsattr /bin/ls

s---ia------- /bin/ls

 

 

1-2. rpm 패키지 검증

coreutils 패키지 검증을 하여 ls, dir, md5sum 파일들의 파일크기 변경, MD5 체크섬 변경, 파일 사용자/소유자 변경, 파일 그룹이 변경 된 것을 확인하였다.

# rpm -qf /bin/ls

coreutils-5.97-34.el5_8.1

# rpm -qV coreutils-5.97-34.el5_8.1

.M......    /bin/dd

.M......    /bin/df

S.5..UG.    /bin/ls

.M......    /bin/nice

.M....G.    /bin/su

.M......    /bin/uname

S.5..UG.    /usr/bin/dir

.M......    /usr/bin/groups

.M......    /usr/bin/hostid

.M......    /usr/bin/install

S.5..UG.    /usr/bin/md5sum

.M......    /usr/bin/stat

.M......    /usr/bin/users

.M......    /usr/bin/who

.M......    /usr/bin/whoami

.M......    /usr/bin/yes

 

 

1-3. 시스템 콜 확인

 ls 명령어에 대한 open 시스템 콜을 출력하여 확인한 결과 의심되는 /usr/include/file.h 파일을 발견하였다.

file.h 파일안에 등록되어 있는 내용은 ls 명령어 수행 시 예외처리(보이지 않게끔) 되도록 한 것으로 보인다.

# strace -e trace=open ls

open("/etc/ld.so.cache", O_RDONLY)      = 3

open("/lib/libc.so.6", O_RDONLY)        = 3

open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE) = 3

open("/usr/include/file.h", O_RDONLY)   = 3

open(".", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY) = 3

 

# cat /usr/include/file.h

sh.conf

libsh

.sh

system

shsb

libsh.so

shp

shsniff

srd0

 

 

netstat 명령어에 대한 open 시스템 콜을 출력하여 확인한 결과 의심되는 /usr/include/hosts.h 파일을 발견하였다.

마찬가지로 hosts.h 파일안에 등록되어 있는 내용은 ls 명령어 수행 시 예외처리 되도록 한 것으로 보인다.

# strace -e trace=open netstat -nlp

[ Process PID=11131 runs in 32 bit mode. ]

open("/etc/ld.so.cache", O_RDONLY)      = 3

open("/lib/libc.so.6", O_RDONLY)        = 3

open("/usr/include/hosts.h", O_RDONLY)  = 3

open("/proc", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY) = 3

open("/proc/1/fd", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY) = 4

open("/proc/2/fd", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY) = 4

open("/proc/3/fd", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY) = 4

open("/proc/4/fd", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY) = 4

open("/proc/5/fd", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY) = 4

...

open("/proc/32342/fd", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY) = 4

open("/proc/32342/cmdline", O_RDONLY)   = 5

open("/proc/32535/fd", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY) = 4

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name

open("/proc/net/tcp", O_RDONLY)         = 3

tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      1541/mysqld

tcp        0      0 0.0.0.0:21              0.0.0.0:*               LISTEN      1571/pure-ftpd (SER

tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1470/sshd

tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1549/sendmail: acce

tcp        0      0 0.0.0.0:3003            0.0.0.0:*               LISTEN      12432/php

tcp        0      0 0.0.0.0:3005            0.0.0.0:*               LISTEN      1675/php

open("/proc/net/udp", O_RDONLY)         = 3

udp        0      0 0.0.0.0:68              0.0.0.0:*                           1280/dhclient

open("/proc/net/raw", O_RDONLY)         = 3

raw        0      0 0.0.0.0:1               0.0.0.0:*               7           30849/ttymon

raw        0      0 0.0.0.0:6               0.0.0.0:*               7           7283/portsentry

raw        0      0 0.0.0.0:17              0.0.0.0:*               7           7285/portsentry

Active UNIX domain sockets (only servers)

Proto RefCnt Flags       Type       State         I-Node PID/Program name    Path

open("/proc/net/unix", O_RDONLY)        = 3

unix  2      [ ACC ]     STREAM     LISTENING     3029   1051/iscsid         @ISCSIADM_ABSTRACT_NAMESPACE

unix  2      [ ACC ]     STREAM     LISTENING     4135   1541/mysqld         /data/mysql/mysql.sock

unix  2      [ ACC ]     STREAM     LISTENING     4246   1592/xfs            /tmp/.font-unix/fs7100

unix  2      [ ACC ]     STREAM     LISTENING     3007   1043/iscsiuio       @ISCSID_UIP_ABSTRACT_NAMESPACE

unix  2      [ ACC ]     STREAM     LISTENING     3406   1340/dbus-daemon    /var/run/dbus/system_bus_socket

unix  2      [ ACC ]     STREAM     LISTENING     3443   1353/hald           @/var/run/hald/dbus-OUK6BJz6fO

unix  2      [ ACC ]     STREAM     LISTENING     3444   1353/hald           @/var/run/hald/dbus-f7rpjUejYH

open("/proc/net/ipx", O_RDONLY)         = -1 ENOENT (No such file or directory)

 

# cat /usr/include/hosts.h

2 212.110

2 195.26

2 194.143

2 62.220

3 2002

4 2002

3 6667

4 6667

3 81

4 81

 

 

ps 명령어에 대한 open 시스템 콜을 출력하여 확인한 결과 의심되는 /usr/include/proc.h, /usr/include/hosts.h 파일을 발견하였다.

# strace -e trace=open ps aux

[ Process PID=11857 runs in 32 bit mode. ]

open("/etc/ld.so.cache", O_RDONLY)      = 3

open("/lib/libproc.so.2.0.6", O_RDONLY) = 3

open("/lib/libc.so.6", O_RDONLY)        = 3

open("/proc/uptime", O_RDONLY)          = 3

open("/proc/stat", O_RDONLY)            = 4

open("/usr/include/proc.h", O_RDONLY)   = 5

open("/usr/include/hosts.h", O_RDONLY)  = 5

open("/proc/11857/stat", O_RDONLY)      = 5

open("/proc/11857/statm", O_RDONLY)     = 5

open("/proc/11857/status", O_RDONLY)    = 5

open("/proc/meminfo", O_RDONLY)         = 5

open("/boot/System.map-2.6.18-371.8.1.el5xen", O_RDONLY) = 6

open("/proc", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY) = 6

open("/proc/1/stat", O_RDONLY)          = 7

open("/proc/1/statm", O_RDONLY)         = 7

open("/proc/1/status", O_RDONLY)        = 7

open("/etc/nsswitch.conf", O_RDONLY)    = 7

open("/etc/ld.so.cache", O_RDONLY)      = 7

open("/lib/libnss_files.so.2", O_RDONLY) = 7

open("/etc/passwd", O_RDONLY)           = 7

open("/etc/group", O_RDONLY)            = 7

open("/proc/1/cmdline", O_RDONLY)       = 7

open("/proc/1/environ", O_RDONLY)       = 7

USER       PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND

--- SIGFPE (Floating point exception) @ 0 (0) ---

 

Signal 8 caught by ps (procps version 2.0.6).

Please send bug reports to <procps-bugs@redhat.com>

 

# cat /usr/include/proc.h

3 burim

3 mirkforce

3 synscan

3 ttyload

3 shsniff

3 ttymon

3 shsb

3 shp

3 hide

4 ttyload

 

 

2. 외부에서 nmap 명령어로 포트 스캔

보통 해커들은 바이너리 명령어를 변조시켜 시스템 상황을 숨긴다. pstree나 netstat 명령어로도 특별한 이상점을 찾을 수 없다.

일단 해킹된 서버에서는 정확한 정보를 얻을 수 없으니 외부에서 nmap 명령어를 통해 백도어 포트가 열려 있지 않는지 확인해 본다.

# nmap -sT -p 1-65535 [서버아이피주소]

 

 

3. chrootkit, rootkit hunter등으로 명령어 변조와 rootkit 존재여부 확인

chkrootkit 프로그램으로 루트킷 탐지 결과 ifconfig 파일 및 pstree 파일이 감염되었고

위에서 발견된 /usr/include/file.h, /usr/include/proc.h 파일도 다시 검출되었다.

# ./chkrootkit -q

Checking `ifconfig'... INFECTED

Checking `pstree'... INFECTED

 

Signal 8 caught by ps (procps version 2.0.6).

Please send bug reports to <procps-bugs@redhat.com>

Possible t0rn v8 \(or variation\) rootkit installed

 

/usr/lib/.libgcrypt.so.11.hmac /usr/lib/gtk-2.0/immodules/.relocation-tag /lib/.libssl.so.0.9.8e.hmac /lib/.libcrypto.so.0.9.8e.hmac /lib/.libcrypto.so.6.hmac /lib/.libssl.so.6.hmac

 

Warning: Possible Showtee Rootkit installed

 /usr/include/file.h /usr/include/proc.h

 

Signal 8 caught by ps (procps version 2.0.6).

Please send bug reports to <procps-bugs@redhat.com>

OooPS!

chkproc: Warning: Possible LKM Trojan installed

eth0: PF_PACKET(/sbin/dhclient)

 

 

rkhunter 프로그램으로 루트킷 탐지 결과 SHV4, SHV5 Rootkit 파일이 검출되었다.

# /usr/local/bin/rkhunter --update>/dev/null; /usr/local/bin/rkhunter -c --skip-keypress --report-warnings-only

 

Warning: SHV4 Rootkit                             [ Warning ]

         File '/lib/lidps1.so' found

Warning: SHV5 Rootkit                             [ Warning ]

         File '/etc/sh.conf' found

         File '/dev/srd0' found

         Directory '/usr/lib/libsh' found

 

 

※ 변조가 심한 시스템에서는 chrootkit이나 rootkit hunter가 제대로 설치되지 않거나 작동이 되지 않을 수 있다.

 

4. 변조된 파일 복구

ls 파일 및 dir, md5sum등 변조된 파일들이 파일보호속성이 걸려있기 때문에 해제하고 coreutils 패키지를 재설치 한다.

 

# ls -l /bin/ls

s---ia------- /bin/ls

# chattr -sia /bin/ls

# lsattr /usr/bin/dir

s---ia------- /usr/bin/dir

# chattr -sia /usr/bin/dir

# lsattr /usr/bin/md5sum

s---ia------- /usr/bin/md5sum

# chattr -sia /usr/bin/md5sum

# rpm -Uvh --force coreutils-5.97-34.el5_8.1.x86_64.rpm

 

# lsattr /usr/bin/pstree

s----a------- /usr/bin/pstree

# chattr -sa /usr/bin/pstree

# yum install psmisc

 

# lsattr /bin/netstat

s---ia------- /bin/netstat

# chattr -sia /bin/netstat

# lsattr /sbin/ifconfig

s---ia------- /sbin/ifconfig

# chattr -sia /sbin/ifconfig

# wget ftp://ftp.isu.edu.tw/pub/Linux/CentOS/5.10/updates/x86_64/RPMS/net-tools-1.60-83.el5_10.x86_64.rpm

# rpm -Uvh --force net-tools-1.60-83.el5_10.x86_64.rpm

 

# lsattr /usr/bin/find

s---ia------- /usr/bin/find

# chattr -sia /usr/bin/find

# yum install findutils

 

# lsattr /bin/ps

s---ia------- /bin/ps

# chattr -sia /bin/ps

# lsattr /usr/bin/top

s---ia------- /usr/bin/top

# chattr -sia /usr/bin/top

# yum install procps

 

# lsattr /usr/sbin/lsof

s---ia------- /usr/sbin/lsof

# chattr -sia /usr/sbin/lsof

# yum install lsof

 

 

5. 시스템 상황 파악 및 백도어 제거

위에서 발견한 file.h, hosts.h, proc.h 파일들을 참고하면 좋다.

# netstat -nalp | grep 81

tcp        0      0 0.0.0.0:81                  0.0.0.0:*                   LISTEN      30847/ttyload

tcp        0      0 172.27.87.80:22             222.112.183.165:59854       ESTABLISHED 18156/sshd

tcp        0      0 ::ffff:172.27.87.80:80      ::ffff:192.99.32.116:57581  TIME_WAIT   -

unix  2      [ ]         DGRAM                    1075119573 18156/sshd

 

# lsof -p 30847

COMMAND   PID USER   FD   TYPE    DEVICE    SIZE      NODE NAME

4       30847 root  cwd    DIR     253,0    4096         2 /

4       30847 root  rtd    DIR     253,0    4096         2 /

4       30847 root  txt    REG     253,0  652620   3440758 /tmp/sh-AXOIWQSA4D4 (deleted)

4       30847 root  mem    REG     253,0  130860   2950313 /lib/ld-2.5.so

4       30847 root  mem    REG     253,0 1710436   2949136 /lib/libc-2.5.so

4       30847 root  mem    REG     253,0   45432   2949169 /lib/libcrypt-2.5.so

4       30847 root  mem    REG     253,0  109740   2950305 /lib/libnsl-2.5.so

4       30847 root  mem    REG     253,0   13492   2949175 /lib/libutil-2.5.so

4       30847 root    0u   CHR       1,3              1120 /dev/null

4       30847 root    1u   CHR       1,3              1120 /dev/null

4       30847 root    2u   CHR       1,3              1120 /dev/null

4       30847 root    3w  FIFO       0,6         884041369 pipe

4       30847 root    4u  IPv4 884042070               TCP *:hosts2-ns (LISTEN)

 

# ls -l /lib/libsh.so

total 804

-rwxr-xr-x 1 root root 801528 Aug 10 19:56 bash

-rw-rw-r-- 1 root  114    476 Aug 10 19:56 shdcf

-rwx------ 1  122  114    525 Apr 17  2003 shhk

-rwx------ 1  122  114    329 Apr 17  2003 shhk.pub

-rwx------ 1  122  114    512 Aug 21 05:57 shrs

 

# ls -l /sbin/ttymon

-rwxrwxr-x 1 122 114 93476 Mar 21  2012 /sbin/ttymon

 

# ls -l /sbin/ttyload

-rwxr-xr-x 1 122 114 212747 Mar 21  2012 /sbin/ttyload

 

# killall -9 ttymon

# killall -9 ttyload

# kill -9 30847

# chattr -sia /lib/libsh.so

# chattr -sia /usr/lib/libsh

# chattr -sia /usr/lib/libsh/*

# chattr -sia /etc/sh.conf

# chattr -sia /sbin/ttymon

# chattr -sia /sbin/ttyload

# rm -rf /lib/libsh.so

# rm -rf /usr/lib/libsh

# rm -rf /etc/sh.conf

# rm -rf /sbin/ttyload

# rm -rf /sbin/ttymon 

 


반응형

'엔지니어 > Linux' 카테고리의 다른 글

iptables-FORWARD chain 작동안할때  (0) 2016.11.18
Pinpoint 서버 & Agent 설치  (0) 2016.11.18
REDIS  (0) 2016.11.18
16TB 이상 파일시스템 만들기  (0) 2016.09.30
keepalive와 timewait의 상관관계  (0) 2016.07.06