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 |