FTZ level12 풀이
FTZ level12 풀이
level12의 홈디렉터리 내용이다. 이번 문제도 역시 attackme 프로그램을 이용하는 문제인것 같다.
attacme 프로그램에 level13의 권한으로 setuid가 걸려있다.
hint파일을 열어보자
역시나 hint 파일에는 c 언어 소스코드가 있었다.
해석해보자!
소스코드 해석을 참조하면 실행시 사용자 입력을 받지 않고 프로그램 실행중에 gets() 함수를 통해 사용자 입력을 받는다.
어떤 식으로 이문제를 해결할 것인지 생각해 보자.
1 : str[256]의 시작점에서 main() ret 까지의 거리를 구한다
2 : 환경변수에 쉘 코드를 등록하고 주소를 확인한다.
3 : ret 위치의 데이터를 쉘 코드 주소로 변조시킬 페이로드를 작성한다.
4 : 페이로드를 이용해 셸 획득
먼저 str[256]의 시작점에서 main() ret 까지의 거리를 구해보자
디버깅을 위해 attackme 파일을 tmp 디렉토리로 복사하자
0x080484a1 <main+49>: lea eax,[ebp-264]
: 이 부분을 통해 str 버퍼에서 ebp 까지의 거리가 264 라는 것을 알 수 있다.
그리고 ret은 ebp로부터 4Byte 아래에 위치 하므로 268이다
str[256] 시작점에서 부터 main() ret 까지의 거리 : 268
이제 쉘코드의 주소를 알아보자
<shell code>
\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80
이번 문제에서는 쉘 코드를 환경변수에 등록하고 이 환경변수의 메모리 주소를 ret의 값으로 변조하여 쉘을 실행시킬것이다. 그러기 위해서 쉘 코드를 환경 변수에 등록하는 방법을 알아보자.
우선 환경변수는 OS가 필요한 정보를 메모리에 등록해 놓고 필요할때 마다 참조하는 영역을 의미한다. 일반 사용자 역시 환경변수에 등록해서 사용이 가능.
환경변수에 등록된 데이터는 고정적인 메모리주소를 가지고 있게 된다. 그래서 우리가 필요한 쉘코드를 환경 변수에 등록하고 이 환경 변수의 메모리 주소를 알아 올 수 있다면 우리는 ret의 값을 환경변수에 등록한 쉘코드로 변조가 가능하게 되는 것이다.
export [환경 변수명]=[사용자 입력]
이런 식으로 원하는 동작을 사용자 임의로 등록 할 수 있다. 이때 우리는 사용자 입력에 쉘코드를 넣을 것이다.
유의할 점은 쉘코드 내용이 실제로 경로를 포함하고 있어서 환경변수를 등록 할 때 경로임을 표시해주는 "$"를 앞에 붙여줘야 한다.
그리고 쉘 코드를 (python -c 'print "쉘코드"') 와 함께 전달해야 메모리에서 끌어와 구동시킬 수 있다.
최종적으로 export shellcode=$(python -c 'print "\x90"*20+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"') 이런식으로 환경변수에 쉘코드를 등록하면 된다.
이제 환경변수에 등록된 쉘코드의 주소를 알아보기 위해 간단한 c언어 코드를 만들고 실행시켜보자
해당 코드는 getenv 함수를 사용해 위에서 등록한 shellcode 환경변수 값을 불러온다.
컴파일후 실행시키면 쉘 코드의 주소가 나온다
쉘코드의 주소 =0xbffffef6
이제 페이로드를 작성해보자
페이로드는 (python -c 'print "\x90"*[str ~ ret거리]"+[쉘코드의 주소]';cat) | ./attackme 이런식으로 작성할 것이다.
최종적인 페이로드 : (python -c 'print "\x90"*268 + "\xf6\xfe\xff\xbf"';cat) | ./attackme
페이로드를 실행시키니 성공적으로 쉘을 획득했다. 그리고 my-pass 명령어를 이용해 level13의 패스워드를 출력
level12 clear ~
'System Hacking > FTZ' 카테고리의 다른 글
FTZ level14 풀이 (0) | 2017.07.04 |
---|---|
FTZ level13 풀이 (0) | 2017.07.04 |
FTZ level11 풀이 (0) | 2017.07.04 |
FTZ level10 풀이 (0) | 2017.06.30 |
FTZ level9 풀이 (0) | 2017.06.30 |
FTZ level11 풀이
FTZ level11 풀이
level 11의 홈디렉터리 내용이다. level12 권한으로 setuid가 걸린 attackme 라는 파일이 눈에 띈다.
hint 파일을 출력해보자
hint 파일을 cat으로 열어보면 c 소스코드가 출력된다. 해석해보도록 하자
strcpy 함수는 NULL 문자 전까지의 문자열을 복사하는 함수이다. strcpy 함수에는 취약점이 존재하는데 바로 문자열의 길이를 검사
하지 않기 때문에 버퍼의 크기보다 더 큰 문자열이 들어갈 경우 오버 플로우가 발생한다는 것이다.
그리고 입력 받는 문자의 크기가 str 배열의 크기인 256을 넘었을때에 관련된 처리가 없다.
이것은 곧 입력 문자열을 조절해서 RET 값 변조가 가능하다는 것을 의미한다.
attackme 프로그램에 level12의 권한으로 setuid가 설정되어 있다. 이 프로그램이 실행되는 동안에 my-pass 나 /bin/bash 같은
명령어를 실행시킨다면 level12의 패스워드를 획득 할 수 있을것이다. /binbash 를 메모리 상에서 실행시키기 위해서는
shell code를 사용해야 한다.
shell code는 /bin/bash, /bin/sh 와 같은 셸을 실행시켜주는 코드이다. 이코드는 보통 c 언어로 이루어져있고 이것을 기계어로 변환시켜 최종적으로 결과물을 16진수의 코드로 만든것이다.
<Shell Code>
\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80
우리는 공격을 시도하기 전에 공격에 사용할 argv[1]의 주소와 str 버퍼에서 ret 시작점 까지의 거리를 알아야한다.
그러기 위해서는 attackme 프로그램을 디버깅 해야한다. /tmp 디렉터리로 복사 하자.
우선 argv[1]의 주소를 알아보자
gdb 명령어로 디버깅을 시작했다. 그리고 b *main 명령어로 프로그램 시작과 동시에 브레이크 포인트를 잡아줬다.
r `python -c 'print "A" *256'` 로 argv[1]에 A를 채워주자.
0x41 hex값이 보이는데 이것은 A의 ascii 코드 값이다.
argv[1]의 시작주소 = bffffb2c + 9 = bffffb36
버퍼에서 RET까지의 거리는 EBP - str[256]의 주소 + 4(ebp에서 ret까지의 거리) 이런식으로 구하면된다.
그러기 위해 우선 EBP의 값을 알아보도록 하자
main+1 부분이 ESP의 값을 EBP에 복사하는 부분이다. 쉽게 말해 현재 함수의 EBP가 결정되는 부분.
main+3 부분에 브레이크 포인트를 걸어서 EBP의 값을 확인해보도록 하자
b *main+3 명령어로 브레이크 포인트를 잡은 뒤, r 'python -c 'print "A"*256'` 명령어로 프로그램 시작과 동시에 python을 통해 A를 256번 입력해서 실행한다. 그리고 info reg 명령어로 EBP의 값을 확인하면된다.
EBP = 0xbffff9e8
이제 str[256] 의 버퍼 시작 주소를 알아보자.
strcpy(main+48부분) 함수가 실행완료된 시점(main+53)에 브레이크 포인트를 추가했다. (str에 값이 들어가는 지점이기 때문)
c 로 main+3에서 새로운 브레이크 포인트인 main+53까지 실행시켰다
/90x $esp 명령을 사용하면 esp가 지금 가르키고 있는 위치의 메모리부터 90Byte 까지의 메모리를 확인 할 수 있다.
A의 ascii 코드값인 0x41이 시작되는 부분인 0xbffff8e0 이 str[256]의 주소
str[256]의 주소 = 0xbffff8e0
이제 버퍼에서 ret 까지의 거리를 계산해보도록 하자
0xbffff9e8 - 0xbffff8e0 + 4 = 108 +4 = 0x10c(16진수) = 268(10진수)
str 버퍼에서 ret 까지의 거리 = 268 Byte
이제 본격적으로 페이로드를 작성해보자 .
./attackme `python -c 'print "[쉘코드]"+"A"*[숫자]+"[argv[1]주소]"'`
우선 숫자부분에 들어갈 수를 계산해보자.
268(str버퍼에서 ret까지의 거리) - 41(쉘코드 길이)
숫자=227
그리고 나머지 부분을 채워 넣으면 페이로드가 완성된다.
./attackme `python -c 'print "\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"+"A"*227+"\x36\xfb\xff\xbf"'`
위 페이로드를 실행하니 쉘이 실행되었고 my-pass 명령어를 통해 level12의 패스워드를 출력시켰다.
level11 clear ~
'System Hacking > FTZ' 카테고리의 다른 글
FTZ level13 풀이 (0) | 2017.07.04 |
---|---|
FTZ level12 풀이 (1) | 2017.07.04 |
FTZ level10 풀이 (0) | 2017.06.30 |
FTZ level9 풀이 (0) | 2017.06.30 |
FTZ level8 풀이 (0) | 2017.06.30 |
FTZ level10 풀이
FTZ level10 풀이
level10 홈 디렉터리의 파일내용이다. 이번에는 program 이라는 폴더가 추가된 것을 확인 할 수 있다.
우선 hint를 확인해보자
힌트를 보면 공유 메모리를 사용해 만든 프로그램을 도청하는 것이 이번 문제의 목표인 것 같다.
TIP. 공유 메모리
- 공유 메모리는 여러 프로세스에서 동시에 접근할 수 있는 메모리이다. 문제내용에 나와있는 key_t 라는 값은 공유 메모리를 구별하는 식 별 번호이다.
level10 홈디렉토리에 존재하는 program 디렉터리로 이동하려고 시도 해보았더니 권한이 없어 거부당했다.
아마 저 디렉토리에 공유 메모리를 사용해 만든 프로그램이 존재하는 것 같다.
공유 메모리를 위해 사용하는 대표적인 함수로는 shmget(공유 메모리를 요청하는 함수), shmat(공유 메모리를 사용가능하게 만듬) 정도가 있다. 이 두 함수를 이용하여 key_t 값이 7530인 공유 메모리를 도청하는 코드를 작성하고 실행시켜보면 어떻게 될까?
key_t가 7530인 공유 메모리에 접근해 해당 공유 메모리를 사용하여 도청하는 코드이다. 컴파일 시킨 후 실행시켜보도록 하자
코드를 실행하면 공유메모리의 내용을 도청하여 위와 같이 구타가 level11의 패스워드를 출력 시켜준다.
level 10 clear ~
'System Hacking > FTZ' 카테고리의 다른 글
FTZ level12 풀이 (1) | 2017.07.04 |
---|---|
FTZ level11 풀이 (0) | 2017.07.04 |
FTZ level9 풀이 (0) | 2017.06.30 |
FTZ level8 풀이 (0) | 2017.06.30 |
FTZ level7 풀이 (0) | 2017.06.30 |
FTZ level9 풀이
FTZ level9 풀이
level9의 홈디렉토리의 파일내용은 이렇다.
hint의 파일내용을 확인해보자
hint 파일내용에는 c언어 소스코드가 있다.
소스코드를 해석해보자.
소스코드를 보면 buf2 배열의 값에 go 문자열이 있으면 level10의 권한으로 /bin/bash 셸이 실행된다. 하지만 buf2 변수는 우리가 임의로 값을 입력할 수 없다. 그렇다면 어떻게 buf2 변수에 go문자열을 넣을수 있을까?
현재 이 소스코드에는 문제점이 있다. 바로 buf 변수의 크기는 10바이트로 할당했는데 fgets로 buf 변수에 입력받는 값은 40바이트 이다. 이렇게 되면 buf에 10바이트 이상의 값이 입력되면 buf 변수의 버퍼영역이 buf2 변수의 버퍼영역을 침범하게 되어 버퍼 오버 플로우 취약점이 발생한다.
조금 더 쉽게 이해하기 위해 hint 파일의 소스코드를 복사해 컴파일 한후 gdb를 통해 어샘블리어 코드로 접근해보자.
level9gdb 라는 이름으로 컴파일했다.
어샘블리어로 확인해보면 [ebp-40] 에 문자열을 입력받는다. 그리고 [ebp-24] 에서 문자열을 비교한다.
쉽게말해 [ebp-40]은 buf 변수의 위치이며, [ebp-24]는 buf2 변수의 위치가 될 것이다.
그래서 buf와 buf2 사이의 거리는 16바이트이며, 원래 변수에 할당된 10바이트 만큼의 거리 차이가 있어야 하는데 dummy라는 쓰레기 값이 6바이트 만큼 존재해 16바이트 만큼 차이나게 되는 것이다.
buf의 변수에 값을 16바이트 만큼 넣은후 그뒤에 go를 넣게되면 buf의 주소와 쓰레기값을 지나 buf2의 주소를 덮어 씌워 셸이 실행될 것이다.
buf[10] + dummy[6] + buf2[10]
XXXXXXXXXX XXXXXX go
파이썬으로 X를 16번 입력하고 마지막에 go 문자를 연결한뒤 |(파이프)를 이용해 /usr/bin/bof 파일을 cat으로 출력시켰다.
그랬더니 /bin/bash 셸이 실행되었고 my-pass 명령으로 level10의 패스워드가 출력됬다.
level9 clear ~
'System Hacking > FTZ' 카테고리의 다른 글
FTZ level11 풀이 (0) | 2017.07.04 |
---|---|
FTZ level10 풀이 (0) | 2017.06.30 |
FTZ level8 풀이 (0) | 2017.06.30 |
FTZ level7 풀이 (0) | 2017.06.30 |
FTZ level6 풀이 (0) | 2017.06.30 |
FTZ level8 풀이
FTZ level8 풀이
level8의 홈디렉토리 내용이다.
힌트파일을 열어보자.
힌트를 참조해보면 level9 의 shadow 파일이 숨겨져 있으며 용량이 2700이라는 것이다.
그렇다면 find 명령어의 -size 옵션으로 용량이 2700인 level9 소유의 파일을 찾으면 될것같다.
#TIP.find 명령어의 -size 옵션
- size 옵션을 사용시에는 용량의 단위를 같이 적어줘야한다.
[단위]
b : [512byte(블록)]
c : [byte]
k : [kbyte]
w : [2byte]
/etc/rc.d/found.txt 파일이 아무래도 문제관련 파일인것 같다. /etc/rc.d 디렉토리로 이동해 확인해보자
found.txt 파일을 출력해보자
found.txt 파일을 출력해본결과 힌트대로 level9의 shadow 파일의 내용이 출력되었다.
TIP./etc/password 파일과 /etc/shadow 파일
- 모든 리눅스 시스템은 단방향 암호화가 된 패스워드를 포함하여 사용자 계정 정보를 보관하는 파일이 /etc/password 이다.
하지만 이 파일은 수정은 불가능 하지만 읽기는 가능하며, 이로인해 크래킹툴을 돌리면 손쉽게 패스워드를 흭득할 수 있다.
이러한 단점을 해결하기 위해 shadow 패스워드가 사용되기 시작했는데, 이 경우 /etc/passwd 파일에 있는 패스워드 부분을
/etc/shaodw 에 별도로 보관하고 이를 root만이 읽을 수 있는 퍼미션으로 설정해두어 보안성이 향상되었다.
#출처: http://blog.naver.com/PostView.nhn?blogId=koromoon&logNo=220611830118
shadow 파일의 구조는 위와 같다.
아무래도 이번문제는 /etc/passwd의 level9 패스워드 부분을 암호화 하여 저장한 shadow 파일의 내용을 크래킹 하는 것이 목표인것 같다.
shadow 파일 크래킹툴을 구글링한 결과 John the Ripper 라는 툴을 찾았다.
John the Ripper 툴 링크 : http://www.openwall.com/john/
윈도우 10 환경에서 john the Ripper 툴을 사용하여 level9의 shadow 파일의 내용을 크래킹 시도를 해볼것이다.
pass.txt 파일을 만들고 내용으로는 level9의 shadow 파일 내용을 적어주었다.
john the ripper 툴을 사용하여 level9의 shadow 파일 내용을 크래킹했더니 패스워드가 출력되었다!
level8 clear!
'System Hacking > FTZ' 카테고리의 다른 글
FTZ level10 풀이 (0) | 2017.06.30 |
---|---|
FTZ level9 풀이 (0) | 2017.06.30 |
FTZ level7 풀이 (0) | 2017.06.30 |
FTZ level6 풀이 (0) | 2017.06.30 |
FTZ level5 풀이 (1) | 2017.06.30 |
FTZ level7 풀이
FTZ level7 풀이
level7 홈디렉터리의 내용이다. hint 파일을 열어보자
/bin/level7 파일을 실행하면 패스워드 입력을 요청한다.. 그리고 밑에 있는 4가지의 힌트들 ..
패스워드는 가까운데 있으며 상상력을 총동원하고 2진수를 10진수로 바꾸는 방법을 알아야 하며 공학용 계산기가 필요한 문제라는 것인가?
우선 /bin 디렉토리로 이동해 level7 파일을 확인하자
level8의 소유로 setuid가 걸려있다.
힌트 파일에 있던 내용대로 level7 파일을 실행시키니 password를 입력받는다.
패스워드에 임의의 문자를 넣었더니 패스워드가 틀렸다는 구문과 함께 모스부호? 같은 것이 같이 출력됬다.
처음 힌트 파일에 있던 내용중 2진수를 10진수로 변환시킬수 있냐는 질문을 참조해보면 위에있는 특수문자들은 2진수를 기호화 하여 나타낸것을 의미하는 것 같다. 기호화 시킨 2진수를 알아보기 쉽게 변환해보자
1101101 1100001 1110100 1100101
이런 2진수가 나왔다. 그렇다면 위에 나온 2진수를 공학용 계산기를 이용해 10진수로 변환해보자
공학용 계산기를 사용한 결과 ( 109, 97, 116 ,101 ) 의 10진수가 출력됬다.
하지만 출력된 10진수를 password에 입력해도 패스워드가 틀렸다고 출력된다.
그렇다면 이 10진수를 아스키코드표를 참조하여 문자로 매칭한뒤 그문자를 입력해보면 어떨까?
109 = m
97 = a
116 = t
101 = e
mate 라는 단어가 완성됬다. 이제 password에 입력시켜보자.
mate 라는 단어가 이문제의 패스워드였고 level8의 패스워드가 출력됬다.
level7 clear!
'System Hacking > FTZ' 카테고리의 다른 글
FTZ level9 풀이 (0) | 2017.06.30 |
---|---|
FTZ level8 풀이 (0) | 2017.06.30 |
FTZ level6 풀이 (0) | 2017.06.30 |
FTZ level5 풀이 (1) | 2017.06.30 |
FTZ level4 풀이 (0) | 2017.06.30 |
FTZ level6 풀이
FTZ level6 풀이
level6 문제는 기존과는 다르게 접속 하자마자 힌트가 출력됬다.
힌트를 참조하면 인포샵과 bbs의 텔넷 접속 메뉴에서 많이 사용된 해킹 기법에 대해 알아볼 필요가 있을 것 같다.
그후 아무키나 입력하니 위와 같은 화면이 출력되었다.
하이텔.. 나우누리.. 천리안.. 2000년대 초반에 존재하던 서비스들이다 ㄷㄷ
여러 시도를 해보았는데 일단 서비스들은 동작이 되지않는다.. 당연한건가?
이 프로그램이 어떤식으로 동작하는지 고민해보았는데 아마 1번을 입력하면 system("telnet 하이텔 IP") 이런 방식으로 동작이 되는것 같다.
그래서 ;(세미콜론) 을 이용해 my-pass 명령어 실행을 시도하려 했지만 생각대로 되지않았다.
고민하다가 level6 문제에 접속하자마자 출력되는 힌트 화면에서 bbs 접속 서비스 프로그램이 시작되기 전에 종료시켜보면 어떨까 라는 생각이 떠올랐다.
리눅스에서 프로그램 종료는 ctrl + c 를 입력하면 된다.
생각한대로 level6 계정으로 접근한뒤 출력되는 힌트 다음에 자동으로 실행되는 프로그램을 강제 종료 시키니까 level6 계정으로 접근이 가능했다.
그리고 level6 홈 디렉토리에서 ls로 디렉터리 내용을 출력시키니 password 라는 파일이 나왔다. 이것을 cat으로 열어보니 level7의 패스워드가 출력됬다.
level6 clear!
'System Hacking > FTZ' 카테고리의 다른 글
FTZ level8 풀이 (0) | 2017.06.30 |
---|---|
FTZ level7 풀이 (0) | 2017.06.30 |
FTZ level5 풀이 (1) | 2017.06.30 |
FTZ level4 풀이 (0) | 2017.06.30 |
FTZ level3 풀이 (0) | 2017.06.30 |
FTZ level5 풀이
FTZ level5 풀이
level5 홈디렉터리의 내용 확인, hint 파일과 폴더 2개 확인
hint를 확인해보자
/usr/bin/level5 프로그램에 의해 /tmp 디렉토리에 level5.tmp 라는 임시 파일이 생성되며, 그것을 이용하여 level6의 권한을 흭득하는것이 이번 level의 목표인것 같다.
/usr/bin/level5 파일을 확인해보니 level6의 권한으로 setuid가 걸려있다는 것을 확인했다.
level5를 실행시켰다. 이제 /tmp 디렉토리로 이동해 level5.tmp 라는 임시파일이 생성됬는지 확인해보자.
아무리 실행시켜도 /tmp 디렉토리에 level5.tmp 라는 임시 파일은 생성되지 않았다.
그렇다면 생각해볼점은 /usr/bin/level5 프로그램 실행시 /tmp 디렉토리에 level5.tmp 임시 파일이 생성되지만 프로그램이 종료되기 직전 과정에서 삭제된다는 점이다. level5.tmp가 생성되고 삭제되기전에 이 파일의 내용을 가로챌수있는 방법을 생각해보자.
구글링 시도중 심볼릭 링크(symbolic link)를 이용하여 파일의 내용을 가로채는 방법을 확인할 수 있었다.
#TIP.symbolic link?
- 심볼릭 링크란 어떤 파일을 가르키는 파일로 windows의 바로가기와 비슷한 개념이라고 생각하면 된다.
/tmp 폴더에 test 라는 파일을 만들고, /tmp/test 파일에 level5.tmp의 심볼릭 링크를 걸어주게 되면 /usr/bin/level5 가 실행되고 지워지기 전에 level5.tmp의 내용이 고스란히 test 파일에 들어갈것이다. 그렇게 되면 level5.tmp 파일이 지워져도 우리는 test 파일의 내용을 확인해 level5.tmp 파일 내용 확인이 가능할 것 이다.
touch 명령어로 크기가 0바이트인 test 파일 생성!
심볼릭 링크를 걸어주는 명령어인 ln을 이용하여 test파일에 level5.tmp 파일의 심볼릭 링크를 걸어주고 ls 명령어로 확인
심볼릭 링크를 이용한 파일 가로채기 준비가 끝났으니 이제 /usr/bin/level5 프로그램을 실행시키면 어떻게 되는지 확인해봅시다.
level5.tmp 파일은 삭제되고 없었지만 test 파일의 용량이 0 바이트에서 31바이트로 증가했다. 이것은 test파일에 level5.tmp의 내용이 쓰여졌다는 것을 의미한다. test파일의 내용을 확인해보자
cat 명령어로 test 파일을 확인해보니 level6의 패스워드가 들어있었다.
level5 clear~
'System Hacking > FTZ' 카테고리의 다른 글
FTZ level7 풀이 (0) | 2017.06.30 |
---|---|
FTZ level6 풀이 (0) | 2017.06.30 |
FTZ level4 풀이 (0) | 2017.06.30 |
FTZ level3 풀이 (0) | 2017.06.30 |
FTZ level2 풀이 (0) | 2017.06.30 |
FTZ level4 풀이
FTZ level4 풀이
level4의 홈디렉터리 내용이다. 여전히 hint 파일과 폴더 2가지가 존재한다.
hint 파일을 확인해보자.
hint 파일에는 /etc/xinetd.d/ 디렉터리에 백도어가 심어져있다는 내용이 들어있었다.
TIP.BACKDOOR?
- 백도어는 시스템에 존재하게 되면 공격자가 일반 보안 엑세스 컨트롤을 우회하고 시스템에 엑세스 할 수 있는 악성 코드의 유형.
실제로 /etc/xinetd.d/ 디렉터리의 파일중에 친절하게 이름부터 backdoor 이라는 파일이 존재했다.
권한은 -r--r--r-- 읽기 권한만 주어져 있으며 level4 유저가 파일소유주로 되어있다.
cat으로 backdoor 파일의 내용을 확인해보자
backdoor 파일의 내용을 확인해니 리눅스의 사용자 정보 확인 명령어인 finger의 데몬 설정정보가 나왔다.
우선 finger 데몬 설정의 각각 내용들이 어떤것을 의미하는지 해석해보자.
여기서 생각해볼점은 finger 서비스를 실행하게 되면 level5의 권한으로 서비스가 실행된다. 이러한 점을 통해 level5의 셸을 흭득할수 있을 것 같다.
finger 서비스를 실행하면 xinetd에 의해 실행될 데몬파일이 /home/level4/tmp/backdoor/ 디렉터리에 위치한다고 나와있다.
해당 디렉터리로 이동해 파일목록을 출력해봤는데 아무런 파일도 존재하지 않았다. 이상태에서 finger 서비스를 구동하게되면 xinetd에 의해 실행될 파일이 없기때문에 에러가 출력될 것이다.
그렇다면 finger 서비스 구동시 xinetd에 의해 실행될 데몬의 파일을 backdoor 역할을 하도록 임의로 만들어 주게 되면 어떨까?
system 함수를 사용해 backdoor 실행시 level5의 권한으로 실행되므로 my-pass 명령어를 통해 level5의 패스워드를 출력하는 역할을 하는 backdoor.c 파일을 임의로 만들었다.
backdoor 파일을 gcc 명령어로 컴파일 해주자.
컴파일 완료
finger 서비스 구동시 xinetd가 실행할 파일 backdoor를 만들었으니 finger 서비스를 실행시켜보자.
finger 서비스를 구동하자 level5의 권한으로 my-pass 명령이 실행되어 level5의 패스워드가 출력됬다.
level4 clear ~
'System Hacking > FTZ' 카테고리의 다른 글
FTZ level6 풀이 (0) | 2017.06.30 |
---|---|
FTZ level5 풀이 (1) | 2017.06.30 |
FTZ level3 풀이 (0) | 2017.06.30 |
FTZ level2 풀이 (0) | 2017.06.30 |
FTZ level1 풀이 (0) | 2017.06.30 |
FTZ level3 풀이
FTZ level3 풀이
level3의 홈디렉토리 내용을 확인했다. 역시나 hint와 폴더 2개가 존재
hint 파일을 cat으로 확인해보자.
hint 파일을 cat으로 열어보니 c언어로 이루어진 소스코드가 출력되었다.
그리고 동시에 여러 명령어를 사용하려면? 이라는 문구와 문자열 형태로 명령어를 전달하려면? 이라는 문구도 힌트로 주어졌다.
우선 c언어 소스코드를 해석해보자.
힌트의 소스코드는 이정도의 내용을 나타낸다.
우선 힌트의 소스코드로 컴파일된 문제 파일을 찾기위해 find 명령어를 수행시켜보자.
/bin/autodig 라는 파일을 찾아냈다.
autodig 파일은 setuid가 걸려있고 level4의 소유주로 되어있다.
autodig 파일을 실행시켜보자
소스코드 해석을 참조해보면 우리가 autodig를 실행할때 인자값을 전달하지 않았기 떄문에 몇가지 출력문이 출력되고 코드가 종료된다.
그러면 어떤 인자값을 넣어 autodig를 실행시켜야 할지 생각해보자.
우리는 hint 파일에 소스코드 이외에 힌트 2가지를 받았다. 이 힌트를 해석해보자.
- 동시에 여러 명령어를 사용하려면? 리눅스에서는 ;(세미콜론) 을 사용하면 명령어를 동시에 사용할 수 있다.
- 문자열 형태로 명령어를 전달하려면? 문자열 형태로 전달하려는 값을 " " (큰따옴표) 로 묶으면 문자열 형태로 전달이 가능하다.
그렇다면 level4의 권한으로 setuid걸려있는 autodig 파일을 실행하면서 bash 쉘과 my-pass 명령어를 ;(세미콜론) 으로 연결해 동시에
실행시켜주면서 "bash;my-pass" 이런식으로 문자열 형태로 전달하면 어떻게 될까?
bash 쉘이 level4의 권한으로 실행됨과 동시에 my-pass 명령어가 수행되어 level4의 password가 나왔다.
level3 clear ~
'System Hacking > FTZ' 카테고리의 다른 글
FTZ level6 풀이 (0) | 2017.06.30 |
---|---|
FTZ level5 풀이 (1) | 2017.06.30 |
FTZ level4 풀이 (0) | 2017.06.30 |
FTZ level2 풀이 (0) | 2017.06.30 |
FTZ level1 풀이 (0) | 2017.06.30 |