강좌
클라우드/리눅스에 관한 강좌입니다.
보안 분류

chkrootkit으로 루트킷(rootkit) 탐지

작성자 정보

  • 구돌 작성
  • 작성일

컨텐츠 정보

본문

chkrootkit으로 루트킷(rootkit) 탐지

 

만약 시스템이 해킹을 당한 상태라면, 특히 root 권한까지 빼앗긴 상태라면 거의 대부분 이미 백도어(backdoor)가 설치되어 있을 것이다.

 

그런데, 백도어의 종류와 루트킷(rootkit)의 종류는 헤아릴 수 없이 많은 종류가 있는데, 시스템에 백도어가 설치되어 있는지 만약 설치되어 있다면 도대체 어떤 파일이 변조된 것인지 알 수 있는 방법이 있을까? 사실상 수 만개가 넘는 모든 파일을 일일이 원본 파일과 비교해 보는 것은 거의 불가능에 가까울 것이다.

 

다른 문서에서는 이러한 경우 대부분 재설치를 하라고 권유하고 있으나 필자는 다른 생각을 갖고 있다.

 

재설치가 번거로운 것은 둘째 치더라도 당장 시스템에 치명적인 피해가 없는 한 재설치를 한다 하더라도 언제든 같은 방식으로 다시 공격을 당할 수 있으므로 오히려 재설치는 임시방편일 뿐이기 때문이다.

 

그것보다는 어떤 취약성을 통해서 상위 권한을 획득하였고, 어떤 백도어를 설치했는지에 대하여 그 공격내용을 분석함으로써 현 시스템의 취약성을 파악하고 대응하는 것이 더욱 적극적이고 유사한 공격에 대응하는 현명한 방법일 것이다.

 

물론 이 작업은 숙련된 관리자만이 할 수 있는 작업이지만 누구는 처음부터 전문가였던가? 일반 관리자들도 몇 번 하다보면 곧 익숙하게 될 것이다.

 

다른 분들도 다 마찬가지지만 필자 역시 해킹을 당한 이후에야 보안에 조금씩 관심을 갖게 되었기 때문이다.

 

 

이러한 경우 유용하게 사용할 수 있는 대표적인 루트킷 탐지 프로그램으로는 chkrootkit이라는 것이 있다.

 

이 프로그램은 이름에서 뜻하는 바와 같이 알려져 있는 대부분의 루트킷을 탐지하며 각종 주요 시스템 파일의 변조 여부를 감시하는 매우 유용한 툴로서 필자가 시스템의 보안을 점검할 때 가장 먼저 사용하는 프로그램이기도 하다.

 

 

 

db65df2e51e6fbf0db717e7c616c97f2_1655801075_0658.png
 

[그림] chkrootkit 홈페이지

 

백도어(backdoor)

백도어는 뒷문이라는 말 그대로 공격자가 시스템에 침입한 후 차후에 다시 root등 상위 권한으로의 접근을 용이하게 하기 위해 사용되는 도구나 프로그램을 뜻한다.

 

백도어는 쉘이나 특정한 명령어를 실행하는 특정 포트를 bind하거나 로그인시 특정 아이디나 암호를 입력할 때 인증 없이 로그인하거나 로그가 남겨지지 않도록 하는 등의 기능과 종류가 매우 다양하다.

 

 

루트킷(rootkit)

루트킷이란 백도어와 같은 도구나 프로그램들의 모음이라고 생각하면 된다.

 

 

최근에는 이러한 루트킷들이 자동화되고 사용이 용이하게 설정되어 있어 몇 개의 옵션만으로 초보자도 쉽게 공격할 수 있도록 배포되고 있다.

 

 

 

9.1.1 다운로드 및 설치

 

chkrootkit의 홈페이지는 http://www.chkrootkit.org/이다.

 

계속적으로 업그레이드되고 있으므로 이 사이트에서 최신버전의 chkrootkit을 다운로드 한 다음 압축 해제 후 컴파일 설치하면 된다.

 

 

 

[root@server root]# tar zxvfp chkrootkit.tar.gz

[root@server root]# cd chkrootkit-0.xx/

[root@server chkrootkit-0.xx]# make sense

 

컴파일을 하면 몇 가지 실행파일들이 컴파일 되는데, 각각은 다음과 같은 기능을 가지고 있다.

 

다음은 chkrootkit이 제공하는 보안점검 유틸리티들이다.

 

반드시 익혀두도록 한다.

 

 

chkrootkit

 

시스템의 바이너리 변조 여부를 체크하는 메인 쉘 스크립트이다.

 

chkrootkit이 백도어나 루트킷이 설치되었는지 확인하는 방법은 해당 파일의 signature를 분석하거나 (이를테면 ps 파일에 “/dev/ptyp”와 같은 문자열이 포함되어 있는지 조사) 특정 디렉토리에 특정 파일이 있는지 여부를 체크한다.

 

chkrootkit은 아래와 같은 바이너리 파일들의 변조여부를 체크하며, 아래의 체크대상 파일들은 계속 추가되고 있다.

 

 

aliens asp bindshell lkm rexedcs sniffer wted z2 amd basename biff

chfn chsh cron date du dirname echo egrep env find fingerd gpm grep

hdparm su ifconfig inetd inetdconf identd killall ldsopreload login

ls lsof mail mingetty netstat named passwd pidof pop2 pop3 ps

pstree rpcinfo rlogind rshd slogin sendmail sshd syslogd tar tcpd

top telnetd timed traceroute w write ........

 

ifpromisc

 

네트워크 인터페이스가 promiscuous(무차별) 모드인지 여부를 체크한다.

 

인터페이스가 promisc 모드인 경우 스니핑이 가능하기 때문에 반드시 점검해야 한다.

 

 

chklastlog

 

lastlog 파일의 삭제 여부를 체크한다.

 

lastlog 파일은 모든 계정들의 마지막 접근시각과 IP 주소를 저장한 파일로 lastlog를 실행했을 때의 결과에 대한 정보를 저장하고 있다.

 

 

 

chkwtmp

 

wtmp 파일의 삭제여부를 체크한다.

 

wtmp 파일은 last 명령어를 입력하였을 때 보여지는 결과를 저장한 파일로 telnet 또는 ftp접속을 하였을 때의 접속시각과 IP주소 등이 기록되어있는 바이너리 파일이다.

 

 

매달 초에 last를 실행해 보면 몇 줄 없는 결과에 혹시 로그가 지워졌나 해서 깜짝 놀라게 된다.

 

 

왜냐하면 last의 결과는 매달 1일에 로테이션 되어 새롭게 시작하기 때문인데, 만약 전월의 last 결과를 보려면 다음과 같이 실행하면 된다.

 

 

 

 

# last -f /var/log/wtmp.1

 

 

chkproc

 

ps 파일 변조 및 LKM(Loadable Kernel Module) 트로이안 여부를 체크한다.

 

chkproc은 매우 유용하므로 원리와 사용방법을 확실히 알고 있는 것이 좋다.

 

chkproc은 실제 백도어나 루트킷이 작동하고 있어 process에는 존재하지만 공격자가 pspstree, netstat등의 프로세스 모니터링 파일을 변조하여 미리 지정한 특정 process는 보이지 않도록 설정하는 경우에 유용하게 사용 가능하다.

 

이러한 경우 ./chkproc -v와 같이 사용하여 보이지는 않지만 실제 존재하는 “Hidden Process”가 있는지 여부를 확인하면 되는데, 이 원리는 ps를 실행했을 때 보이는 pid 정보와 /proc/ 디렉토리 이하의 pid 정보, /proc/pid/ 정보와 비교하여 같으면 숨김 프로세스가 없는 것이고 다르면 hidden process가 있는 것으로 판단하는 것이다.

 

이는 ps에서 보이는 정보는 위조할 수 있어도 /proc 이하는 위조하기가 어렵기 때문이다.

 

(물론 /proc 이하의 특정 pid도 보이지 않도록 하는 백도어도 있다.)

 

그런데, 짧은 시간에 많은 접속이 있는 busy한 시스템의 경우 프로세스가 빨리 생겨났다가 빨리 사라져 chkproc을 실행했을 때 두 정보를 비교할 때의 시간차 때문에 마치 hidden process인 것처럼 잘못 판단될 수 있으니 주의하여야 한다.

 

실제로 이렇듯 오탐인 경우가 있으므로 chkproc을 실행할 때에는 시간 차이를 두고 2-3회 반복하여 여러 번 실행해 보고 같은 pid를 가진 파일이 지속적으로 검출되면 hidden process라고 판단하면 된다.

 

 

아래는 chkproc을 실행한 결과인데, 첫 부분의 결과는 pid28716process가 숨김 프로세스라고 보고하고 있다.

 

그러나 잠시 후 다시 실행하면 숨김 프로세스가 없는 것으로 나오는데, 이는 해당 pid가 실제 숨김 프로세스가 아니라는 것을 뜻한다.

 

 

[root@server chkrootkit-0.xx]# ./chkproc -v

PID 28716: not in readdir output

PID 28716: not in ps output

You have 1 process hidden for readdir command

You have 1 process hidden for ps command

 

[root@server chkrootkit-0.xx]# ./chkproc -v

[root@server chkrootkit-0.xx]#

 

아래는 실제로 rootkit이 설치된 시스템에서 실행한 예이다.

 

아래의 경우 pid6782번인 프로세스가 hidden process라고 알려주고 있다.

 

 

 

[root@server chkrootkit-0.xx]# ./chkproc -v

PID 6782: not in ps output

You have 1 process hidden for ps command

 

실제로 ps로 확인해 보면 위 pid가 보이지 않는데, 이러한 경우에는 다음과 같이 확인하면 된다.

 

 

 

 

# ls -la /proc/6782

total 0

dr-xr-xr-x 3 root root 0 May 7 13:14 .

dr-xr-xr-x 66 root root 0 Apr 3 21:58 ..

-r--r--r-- 1 root root 0 May 7 13:14 cmdline

lrwxrwxrwx 1 root root 0 May 7 13:14 cwd -> /

-r-------- 1 root root 0 May 7 13:14 environ

lrwxrwxrwx 1 root root 0 May 7 13:14

exe -> /usr/share/locale/sk/.sk12/sk

dr-x------ 2 root root 0 May 7 13:14 fd

-r--r--r-- 1 root root 0 May 7 13:14 maps

-rw------- 1 root root 0 May 7 13:14 mem

-r--r--r-- 1 root root 0 May 7 13:14 mounts

lrwxrwxrwx 1 root root 0 May 7 13:14 root -> /

-r--r--r-- 1 root root 0 May 7 13:14 stat

-r--r--r-- 1 root root 0 May 7 13:14 statm

-r--r--r-- 1 root root 0 May 7 13:14 status

 

위의 결과를 통해 해당 프로세스가 /usr/share/locale/sk/.sk12/sk 파일임을 알 수 있으므로 해당 파일을 삭제하고, 해당 프로세스(6782)kill하면 된다.

 

 

삭제하기 전에 위 디렉토리로 이동하여 확인해 보니 다음과 같은 파일이 있다는 것을 확인하였고, 이를 통해 누군가 스니퍼를 실행하였음을 추측할 수 있다.

 

 

 

-rwxr-xr-x 1 root root 29220 May 6 22:57 sk

-rw--w--w- 1 root root 1891 May 7 12:34 .sniffer

 

strings-static

 

strings를 대체한다.

 

 

 

 

9.1.2 사용 방법

 

chkrootkit 명령어의 실행 형식은 다음과 같다.

 

사용형식 : chkrootkit [options] [test ...]

 

옵션:

-h 사용할 수 있는 옵션을 보여준다.

 

 

-V chkrootkit의 버전정보를 보여준다.

 

 

-l 변조여부를 체크하는 바이너리 파일의 목록을 보여준다.

 

-d debug 모드로 자세한 화면을 보여준다.

 

 

-q quiet 모드로서 변조된 파일 정보만 보여준다.

 

 

-x 전문가 모드로 strings의 자세한 결과를 보여준다.

 

 

-r dir 디렉토리 이하에 대해 체크한다.

 

 

위의 옵션을 이용하여 chkrootkit을 실행해 보자.

 

# ./chkrootkit ps ls

 

이는 psls 파일의 변조여부를 체크하는 것이다.

 

 

# ./chkrootkit -q

 

-qquite의 의미로 "infected"라고 확인되는 실행파일 즉 변조된 파일 목록만 보여준다.

 

 

 

db65df2e51e6fbf0db717e7c616c97f2_1655801097_685.png
 

[그림] chkrootkit 실행 화면

 

아래는 실제 백도어가 설치된 시스템에서 “chkrootkit -q”를 실행하였을 때 보이는 결과이다.

 

 

 

# ./chkrootkit -q

Checking `ifconfig'... INFECTED

Checking `login'... INFECTED

Checking `pstree'... INFECTED

/etc/ld.so.hash

Possible t0rn v8 \(or variation\) rootkit installed

 

/usr/lib/perl5/5.6.1/i386-linux/.packlist

 

Warning: Possible Showtee Rootkit installed

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

Warning: /sbin/init INFECTED

Possible ShKit rootkit installed

You have 1 process hidden for readdir command

You have 16 process hidden for ps command

Warning: Possible LKM Trojan installed

 

몇몇 파일이 변조되었음을 알 수 있으며 어떤 rootkit이 설치되었는지에 대한 정보도 함께 출력해 준다.

 

그러나 실제로 확인해 보면 위와 같은 시스템 파일 뿐만 아니라 다른 파일들도 많이 변조되어있는 경우가 있는데, chkrootkit으로 검색되지 못한 이유는 해당 파일들이 chattr 속성이 걸려 있기 때문인 경우가 많다.

 

실제로 대부분의 공격자에 의해 해킹된 시스템의 백도어 파일등은 chattr 속성을 걸어두고서 root라도 삭제하거나 변경하지 못하도록 설정하는 경우가 많다.

 

따라서 chkrootkit을 실행할 때는 먼저 파일 속성을 초기화한 다음에 하도록 하기 바란다.

 

이는 "lsattr /usr/bin/* /usr/sbin/* /bin/* /sbin/*"과 같이 실행하여 읽기전용 속성 등이 걸려 있는지 확인하면 된다.

 

 

별도로 설정하지 않은 정상적인 경우 모든 파일이 아래와 같이 보이는 것이 정상일 것이다.

 

 

------------- /bin/sh

 

따라서 별도의 설정이 되어 있는 파일만 검색하려면 아래와 같이 확인해 보면 된다.

 

 

아래의 경우 ls, netstat, ps 등의 파일에 각각 sia chattr 속성이 걸려있음을 알 수 있다.

 

 

# lsattr /bin/* | grep -v "\-\-\-\-\-\-\-\-\-\-\-\-\-"

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

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

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

 

이후 아래와 같이 변조된 해당 파일이 참조하는 파일이 있는지를 찾아보도록 하자. 여기에서 -e trace=open 의 의미는 open system call을 추적한다는 의미이다.

 

 

# strace -e trace=open /bin/ls

open("/etc/ld.so.preload", O_RDONLY) = -1 ENOENT (No such file or directory)

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

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

open("/usr/share/locale/locale.alias", O_RDONLY) = 3

open("/usr/lib/locale/en_US/LC_IDENTIFICATION", O_RDONLY) = 3

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

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

open("/etc/mtab", O_RDONLY) = 3

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

 

위의 결과에서 보이는 여러 파일 중 /usr/include/file.h 파일이 의심스러워 해당 파일을 열어보면 아래와 같이 보이는데 이는 변조된 ls 파일이 해당 디렉토리나 파일이 보이지 않도록 설정하는 부분임을 알 수 있다.

 

 

# cat /usr/include/file.h

left-menu6-2.php

xeqt

.xeqt

vssh

pico

sh.conf

libsh

.sh

shp

shsniff

srd0

 

만약 strace를 실행하였을 때 너무 많은 파일을 참조하고 있어 어떤 파일을 점검해야 할지 모른다면 변조가 의심되는 파일과 정상 파일과의 시스템 콜을 각각 비교해 보면 된다.

 

 

그리고 위와 같이 뒤에 /bin/ls를 지정하였을 경우 이후 실제 /bin/ls를 실행하므로 haltreboot등을 지정할 때에는 주의하여야 한다.

 

 

마찬가지로 아래와 같이 실행해 보자.

 

# strace -e trace=open /bin/netstat

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

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

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

 

여기에서 /usr/include/hosts.h 파일이 의심스러워 확인해 보면 아래와 같이 보이는데, 여기에서 앞의 84.208 / 195.26은 해당 IP 대역으로 접속 시 접속 정보가 보이지 않도록 하는 부분이며 6667/64051은 해당 포트와 관련된 정보가 보이지 않도록 하는 부분임을 알 수 있다.

 

 

# cat /usr/include/hosts.h

2 84.208

2 195.26

3 6667

4 6667

3 64501

4 64501

 

실제로 서버의 64501/tcp로 접속해 보니 아래와 같은 ssh 백도어 포트가 뜨는 것을 확인할 수 있다.

 

# telnet 0.0.0.0 64501

Trying 0.0.0.0...

Connected to 0.0.0.0.

Escape character is '^]'.

SSH-1.5-2.0.13

 

위에서 보면 Showtee Rootkit등이 설치되었다는 경고가 출력되었는데, 이는 어떻게 확인할 수 있을까? chkrootkit이 쉘 스크립트이므로 이는 간단히 확인할 수 있다.

 

vipicochkrootkit 파일을 읽어 Showtee 부분을 찾으면 다음과 같은 것을 알 수 있다.

 

 

### Showtee

if [ "${QUIET}" != "t" ];then printn "Searching for Showtee... "; fi

if [ -d ${ROOTDIR}usr/lib/.egcs ] || [ -f ${ROOTDIR}usr/lib/libfl.so ] || \

[ -d ${ROOTDIR}usr/lib/.kinetic ] || [ -d ${ROOTDIR}usr/lib/.wormie ] || \

[ -f ${ROOTDIR}usr/lib/liblog.o ] || [ -f ${ROOTDIR}usr/include/addr.h ] || \

[ -f ${ROOTDIR}usr/include/cron.h ] || [ -f ${ROOTDIR}usr/include/file.h ] || \

[ -f ${ROOTDIR}usr/include/proc.h ] || [ -f ${ROOTDIR}usr/include/syslogs.h ] || \

[ -f ${ROOTDIR}usr/include/chk.h ]; then

echo "Warning: Possible Showtee Rootkit installed"

else

if [ "${QUIET}" != "t" ]; then echo "nothing found"; fi

fi

 

, Showtee rootkit이 통상적으로 사용하는 파일의 존재 여부를 찾는 것이다.

 

그런데, 해당 파일에는 루트킷의 경로 및 파일 목록 등이 정의되어 있어 실제로 해당 루트킷이 어떤 역할을 하고 있는지, 관련 파일들이 어떤 것들이 있는지 등을 쉽게 분석할 수 있다.

 

그러나 역으로 일반적인 경로가 아닌 다른 디렉토리에 다른 이름으로 백도어를 설치한다면 일부는 찾지 못할 수도 있음을 뜻한다.

 

 

 

 

 

9.1.3 실행 결과의 의미

 

chkrootkit을 실행하여 각 파일의 변조여부를 확인한 후 각각의 파일에 대한 변조여부를 알려준다.

 

이때 보여지는 메시지들은 다음과 같다.

 

‘INFECTED’: 해당 파일이 rootkit등에 의해 변조되었음을 뜻한다.

 

 

‘not infected': 파일이 변조되지 않았음을 뜻한다.

 

 

 

‘not tested’: 파일 변조 여부를 체크하지 못했음을 뜻한다.

 

 

‘not found’: 변조여부를 체크하려는 파일을 찾지 못하였음을 뜻한다.

 

 

 

만약 위와 같이 확인하였을 때 파일이 변조되고 루트킷이 설치되었다는 것을 확인한 후에는 네트워크를 차단하여 콘솔에서 확인하는 것이 좋은데, 불가능하다면 먼저 변조된 파일을 다른 파일로 변경한 후 깨끗한 원본 파일로 교체하고, 설치되어 있는 백도어를 찾아 모두 제거하여야 한다.

 

이때 변조된 파일을 strings등으로 분석해 보면 관련된 다른 파일을 찾을 수 있는 근거가 되기도 한다.

 

이외 다른 분석 프로그램을 함께 활용하여 침입자가 어떠한 취약성을 이용하여 해킹을 했고 백도어나 루트킷 등은 어떻게 설치되었는지 해킹당한 시스템을 분석해 보는 것도 좋은 보안 공부법이 될 것이다.

 

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 전체 회원수 59,444 명
  • 전체 게시물 30,916 개
  • 전체 댓글수 11,873 개