개편된 문제


<?php
  include "../../config.php";
  if($_GET['view-source'] == 1) view_source();
?><html>
<head>
<title>Challenge 4</title>
<style type="text/css">
body { background:black; color:white; font-size:9pt; }
table { color:white; font-size:10pt; }
</style>
</head>
<body><br><br>
<center>
<?php
  sleep(1); // anti brute force
  if((isset($_SESSION['chall4'])) && ($_POST['key'] == $_SESSION['chall4'])) solve(4);
  $hash = rand(10000000,99999999)."salt_for_you";
  $_SESSION['chall4'] = $hash;
  for($i=0;$i<500;$i++) $hash = sha1($hash);
?><br>
<form method=post>
<table border=0 align=center cellpadding=10>
<tr><td colspan=3 style=background:silver;color:green;><b><?=$hash?></b></td></tr>
<tr align=center><td>Password</td><td><input name=key type=text size=30></td><td><input type=submit></td></tr>
</table>
</form>
<a href=?view-source=1>[view-source]</a>
</center>
</body>
</html>


1. rand(10000000,99999999)로 나온 값과 "salt_for_you"라는 값을 받아 $hash에 저장합니다.

2. 이후 $hash 값을 sha1 해쉬값으로 500회 반복하여 만듭니다.

3. 세션의 chall4의 값과 만들어진 hash 값이 같으면 문제가 풀립니다.


위의 순서는 코드와는 조금 상이하나, 전체적인 흐름은 맞을 겁니다.


원래는 Rainbow Table을 만들어서 해당하는 값을 찾아내는 Dictionary Bruteforce 공격을 수행하는 것이 정석이지만.

저는 multiprocessing을 이용하여 해당 세션이 만료되기 전에 계산을 하는 python 소스로 공격을 수행하였습니다.


사진에서 나오는 해쉬값을 받아서 계속해서 비교하는 소스입니다.


단, 해당 소스를 실행하기 위해서는 Memory 오류가 날 수 있으니 반드시 Python3 64bit로 실행해주시기 바랍니다.

또한 메모리에 대략 8GB 정도 올라가기 때문에 가능하면 16GB 이상에서 돌릴 것을 당부드립니다. ㅎㅎ

#!/bin/python3
import hashlib
from   multiprocessing import Pool

def sha1_500(string):
    answer = "Your_Hash_Value"
    b  = string
    for i in range(500):
        string = hashlib.sha1(string.encode()).hexdigest()
    if answer == string:
        return b
    else:
        return 'a'


def main():
    answer = "Your_Hash_Value"
    ps_cnt = 8*1
    count  = 0
    pool   = Pool(processes=ps_cnt)

    data   = pool.map(sha1_500, [str(s)+"salt_for_you" for s in range(10000000,99999999)])
    data.sort()

    print("[+] Find Result : ", data[-1])
    print("[+] Find Result : ", data[0] )


if __name__ == "__main__": 
    main()    


위의 소스로는 시간이 꽤 걸릴 것입니다.

만약 rainbow table을 미리 생성하는 소스를 작성하여 실행한 후, 이를 통해 데이터를 쭉 비교하는 것과 비슷한 시간이 걸릴 것으로 예상됩니다.




 

 개편되기 전 문제


[그림 01] level4 시작화면


[그림 01]에서 나타난 위의 문자열을 Decrypt 해야할 것만 같습니다.


맨 뒤에 == 이 있고, 영어 대/소문자, 숫자로 된 문자열을 보아하니 BASE64가 틀림이 없습니다.

BASE64로 디코드해보면, c4033bff94b567a190e33faa551f411caef444f2(40바이트)로 디코딩 됩니다.

40바이트의 해시가 어떤 게 있는가 함을 보니 SHA1이 있습니다.

SHA1으로 c4033bff94b567a190e33faa551f411caef444f2를 디코드 해보면, a94a8fe5ccb19ba61c4c0873d391e987982fbbd3(40바이트)로 디코드 됩니다.

이것도 40바이트로 나오는 걸 보니 SHA1으로 다시 한 번 디코드 해야 할 것 같습니다.

a94a8fe5ccb19ba61c4c0873d391e987982fbbd3를 SHA1으로 디코드하면, test라는 값을 얻을 수 있습니다.


<<해쉬가 이루어지는 과정>>

01. YzQwMzNiZmY5NGI1NjdhMTkwZTMzZmFhNTUxZjQxMWNhZWY0NDRmMg==

02. c4033bff94b567a190e33faa551f411caef444f2

03. a94a8fe5ccb19ba61c4c0873d391e987982fbbd3

04. test



답 : test


처음 SHA1으로 디코딩 했을 때 답이 안 나오는 걸 보니 이게 SHA1이 아닌가 했지만, 다시 40바이트로 나오는 걸 보고 재 디코드 해보았습니다.

하마터면 삽질을 할 뻔 했습니다. 시간을 효율적으로!!

'WARGAMES > webhacking.kr - old' 카테고리의 다른 글

Webhacking.kr_No.15(50) - old  (0) 2016.06.28
Webhacking.kr_No.14(100) - old  (0) 2016.06.28
Webhacking.kr_No.12(250) - old  (0) 2016.06.28
Webhacking.kr_No.10(250) - old  (0) 2016.06.28
Webhacking.kr_No.06(100) - old  (0) 2016.06.28
Webhacking.kr_No.05(300) - old  (0) 2016.06.26
Webhacking.kr_No.03(350) - old  (0) 2016.06.16
Webhacking.kr_No.01(200) - old  (0) 2016.06.16

[그림 01] level3 시작화면


level3의 시작은 [그림 01]과 같습니다.

index.php에서는 이와 같은 퍼즐을 보여줍니다.

퍼즐의 의미를 먼저 파악하는 것이 우선일 것 같습니다.

의미는 다음과 같습니다.

가로 세로, 각 숫자만큼의 네모(색칠된 네모)가 있어야 합니다.

퍼즐을 풀게 되면 [그림 02]와 같은 모습이 됩니다.


[그림 02] 퍼즐이 해결된 모습


[그림 02]와 같이 만든 이후 gogo를 클릭하면 다음 화면으로 넘어갈 수 있습니다.

[그림 03] SQL 인젝션을 요구하는 듯한 입력창


네, 그렇습니다. 저 빈 칸으로 되어 있는 부분이 굉장히 눈에 들어옵니다.

마치 SQL 인젝션을 해달라고 도발하는 듯한 빈 칸입니다. 건방집니다. 파헤칩시다.

[그림 04] 아무 값이나 넣었을 때의 모습


일단 111이라는 아무런 값이나 넣어보니 다음과 같은 name, answer, ip가 나옵니다.

이 때 우리가 111을 넣었을 때 어떻게 서버로 전달이 되는지 파악해보는 것이 필수입니다.


[그림 05] 서버로 전송되는 쿼리에 대해


GET 형태로는 http://webhacking.kr/challange/web/web-03/index.php?_1=1&_2=0 뭐시기 뭐시기 .... _25=1&_answer=1010100000011100101011111을 넘기고 있는 것을 볼 수 있고,

POST로는 뒤의 answer=1010100000011100101011111가 넘겨지는 것을 볼 수 있습니다.

DB에서 Select를 할 때 어떻게 되는지는 모르지만 가설을 세워봅시다.


만약

SELECT 뭐시기

FROM 뭐시기

WHERE id=' 입력값 ' and answer=1010100000011100101011111

라면 WHERE의 조건문을 TRUE로 만들어줘야 할 것입니다.


[그림 06] 필터링 되는 값


아마 [그림 06]에는 다 표현하지 못했지만, 따옴표, 역슬래쉬 등이 필터링 되는 것을 확인할 수 있다.

따옴표가 필터링이 된다는 것은 name : 으로 된 부분에서는 SQL 인젝션이 막혀있다는 것입니다.

그렇다면 다른 곳에서 WHERE의 TRUE를 만들어야 할 것입니다.


POST로 넘어가는 answer에서 그 해답을 찾아보도록 합시다.


조건문 가설 : WHERE id=' 입력값 ' and answer=1010100000011100101011111

WHERE를 TRUE로 만들기 위해서는 WHERE (뭐시기 뭐시기) or (TRUE)를 해버리면

WHERE ((뭐시기 뭐시기) or (TRUE))가 되어 결론, TRUE가 됩니다.

WHERE id=' 입력값 ' and answer=1010100000011100101011111 or 1 을 하면 TRUE가 되지 않을까 합니다.


answer에 들어가는 값은 int값이므로 따옴표가 없습니다.


POST의 answer 값에 or를 이용하여 쿼리를 날리면 'no hack'을 반환합니다.

int라는 가정으로 || 로 or를 대신하여 값을 보냅니다.


하지만 answer=1010100000011100101011111 || 1를 해도 아무런 변화도 없습니다.

id 값이 NULL이면 처음 창으로 돌아가게 됩니다.

따라서 '&id=아무런 값'도 함께 POST로 넘겨주면 해답이 나오게 됩니다.


[그림 07] 해답











'WARGAMES > webhacking.kr - old' 카테고리의 다른 글

Webhacking.kr_No.15(50) - old  (0) 2016.06.28
Webhacking.kr_No.14(100) - old  (0) 2016.06.28
Webhacking.kr_No.12(250) - old  (0) 2016.06.28
Webhacking.kr_No.10(250) - old  (0) 2016.06.28
Webhacking.kr_No.06(100) - old  (0) 2016.06.28
Webhacking.kr_No.05(300) - old  (0) 2016.06.26
Webhacking.kr_No.04(150) - old  (0) 2016.06.22
Webhacking.kr_No.01(200) - old  (0) 2016.06.16

[그림 01] level1 시작화면


level1의 시작은 [그림 01]과 같습니다.

index.phps는 index.php라는 php파일의 소스를 볼 수 있는 설정입니다..

원래는 php소스를 client가 볼 수 없도록 설정해야 하지만, php의 낮은 버전에서는 phps를 지원하는 경우가 있습니다.

이는 구버전의 php의 취약점이지요.


index.php라고 되어 있는 부분을 index.phps라고 바꿔주거나 index.phps를 클릭하면 [그림 02]와 같은 화면으로 넘어가게 됩니다.

[그림 02] index.phps


00. if(!$_COOKIE[user_lv]){SetCookie("user_lv", "1"); echo("<meta ...")}

 처음 쿠키를 설정할 때, user_lv에는 1이라는 숫자를 입력

01. $password="????";

 password라는 변수에 "????"라는 문자열 입력

02. if(eregi("[^0-9,.]",$_COOKIE[user_lv])) $_COOKIE[user_lv]=1;

 eregi() 함수는 검색대상 문자열(string)에서 정규표현식으로 나타낸 패턴과 일치하면 True, 일치하지 않으면 False를 반환

 eregi() 함수는 대소문자 구분이 없음

 ereg() 함수는 대소문자 구분이 있음

 만약 쿠키 값 중, 'user_lv' 이라는 변수가 0~9 그리고 .(온점)일 경우, user_lv이란 변수에 1이라는 숫자를 입력

03. if($_COOKIE[user_lv]>=6) $_COOKIE[user_lv]=1;

 만약 쿠키 값 중 'user_lv'이 숫자 6보다 크면 1로 다시 초기화

04. if($_COOKIE[user_lv]>5 @solve();

 만약 쿠키 값 중 'user_lv'이 숫자 5보다 크면 solve()라는 함수를 실행

05.echo("<br>level : $_COOKIE[user_lv]");

 [그림 01]의 level : 1이라는 곳의 숫자 1을 user_lv에 입력된 숫자로 바꿈


위의 내용을 해석하면, 쿠키 값 중 user_lv을 6보다 작고, 5보다 크게 만들어서 solve()라는 함수를 실행해보는 것이 해답일 것으로 생각됩니다.

이제 cookie값을 확인하는 법을 알아봅시다.

cookie값을 확인하는 방법은 cooxie라는 툴을 설치하여 cookie를 확인하거나 javascript를 사용하여 확인하는 방법입니다.


 명령어 : javascript:alert(document.cookie)


위의 명령어를 주소창에 입력하면 [그림 03]과 같이 나옵니다.


[그림 03] javascript 명령어를 통한 cookie 값 확인


[그림 03]을 보면 user_lv=1과 같은 것을 확인할 수 있습니다.

앞서 [그림 02]에서와 같이 user_lv을 통한 solve()함수를 실행하는 것으로 짐작할 수 있습니다.

조건은 6 > user_lv > 5입니다. 그렇다면 아래의 [그림 04]와 같이 user_lv의 쿠키 값을 변경해볼 수 있겠지요.

[그림 04] 쿠키 값, user_lv에 5.1이라는 값을 삽입


[그림 04]의 명령어를 통해 user_lv에 5.1을 저장하면 쿠키 값이 1에서 5.1(6보다 작고 5보다 큰 것)을 입력하면 solve()를 실행할 수 있게 됩니다.


다시 index.php로 들어가면 해결됩니다!







'WARGAMES > webhacking.kr - old' 카테고리의 다른 글

Webhacking.kr_No.15(50) - old  (0) 2016.06.28
Webhacking.kr_No.14(100) - old  (0) 2016.06.28
Webhacking.kr_No.12(250) - old  (0) 2016.06.28
Webhacking.kr_No.10(250) - old  (0) 2016.06.28
Webhacking.kr_No.06(100) - old  (0) 2016.06.28
Webhacking.kr_No.05(300) - old  (0) 2016.06.26
Webhacking.kr_No.04(150) - old  (0) 2016.06.22
Webhacking.kr_No.03(350) - old  (0) 2016.06.16

jump

'WARGAMES > FTZ' 카테고리의 다른 글

level12_FTZ_RTL기법  (0) 2016.08.07
level11_FTZ_RTL기법  (0) 2016.07.21
level10_FTZ  (0) 2016.07.21
level09_FTZ  (0) 2016.07.21
level07_FTZ  (0) 2016.01.07
level06_FTZ  (0) 2016.01.07
level05_FTZ  (0) 2015.11.27
level04_FTZ  (0) 2015.11.26

jump

'WARGAMES > FTZ' 카테고리의 다른 글

level11_FTZ_RTL기법  (0) 2016.07.21
level10_FTZ  (0) 2016.07.21
level09_FTZ  (0) 2016.07.21
level08_FTZ  (0) 2016.01.07
level06_FTZ  (0) 2016.01.07
level05_FTZ  (0) 2015.11.27
level04_FTZ  (0) 2015.11.26
level03_FTZ  (0) 2015.11.20

level6의 ID와 PW는 아래와 같습니다.

 

ID : level6

PW : what the hell

 

level6은 로그인을 하게 되면 [그림 1]과 같은 형태로 나오게 된다.

[그림 1] level06의 로그인 직후 모습


[그림 1]에서는 level6을 로그인하게되면 나오는 힌트 메시지이다. bbs의 텔넷 접속 메뉴에서 많이 사용되던 해킹 방법이라고 한다.

[그림 2] 로그인 창의 Enter 입력


Enter를 입력하면 [그림 2]와 같은 Enter를 입력하게 되면 나오게 되는 창이다. 그리고 1, 2, 3과 같은 선택지를 묻는 창이 뜬다. 

[그림 3] Ctrl+C를 입력한 모습


[그림 3]은 Ctrl+C를 입력한 모습이다. Ctrl+C는 운영체제에서의 signal이다. 운영체제가 하는 가장 중요한 일 중 컴퓨터와 인간이 서로 원활히 소통할 수 있게끔 도와주는 일이다. 이를 위해 운영체제에서는 signal이라는 것을 이용하게 된다.


시그널은 64개가 있고, 종류는 [그림 4]와 같다.

[그림 4] 시그널 종류


여기서 Ctrl+C는 시그널 2번의 SIGINT이다.


SIGINT는 프로세스를 종료시킨다는 의미를 가지는 시그널이다. 

이에 대한 자세한 설명은 아래의 링크를 참조하기 바란다.


<<시그널에 대한 설명>>


이제 이 SIGINT인 Ctrl+C를 입력하게 되면 [그림 5]와 같은 상태로 넘어가게 된다.

[그림 5] Ctrl+C를 입력한 후의 화면


hint 파일을 읽어보면 [그림 3]과 같은 힌트 메시지가 나오게 된다.

해당 문제는 로그온 시 나오게 되는 프로세스를 종료시키는 것이 해답이다.

[그림 6] password 파일


'WARGAMES > FTZ' 카테고리의 다른 글

level10_FTZ  (0) 2016.07.21
level09_FTZ  (0) 2016.07.21
level08_FTZ  (0) 2016.01.07
level07_FTZ  (0) 2016.01.07
level05_FTZ  (0) 2015.11.27
level04_FTZ  (0) 2015.11.26
level03_FTZ  (0) 2015.11.20
level02_FTZ  (0) 2015.11.15

level5의 ID와 PW는 아래와 같습니다.

 

ID : level5

PW : what is your name?

 

level5의 hint 파일을 읽으면 [그림 1]과 같이 나오게 됩니다.

[그림 1] level5의 hint 파일


/usr/bin/level5 프로그램을 실행시키면 /tmp 디렉토리에 level5.tmp라는 이름의 임시파일을 생성한다고 합니다.

그러면 /usr/bin/level5 프로그램을 실행시켜 임시파일이 생성되는지 확인해보도록 합시다.

[그림 2] 프로그램 실행 후 /tmp 디렉토리


프로그램을 실행시켜도 /tmp 디렉토리에는 level5.tmp라는 이름을 가진 프로그램은 존재하지 않았습니다.

level5라는 프로그램이 실행될 때 임시적으로 level5.tmp 라는 프로그램을 생성했다가 다시 삭제하는 것으로 판단됩니다.

여기서 사용할 기법은 '레이스 컨디션'이라는 해킹 기법을 사용할 것입니다.

먼저 레이스 컨디션에 대해 간단히 알아보겠습니다.


[그림 3]은 일반적인 실행파일의 실행 구조의 예시를 보여줍니다.

[그림 3] 일반적인 파일 입출력 프로그램의 예시


일반적인 파일 입출력 프로그램이 File_Name1.bin과 File_Name2.bin을 읽고 쓰기를 하는 행위를 할 때의 모습입니다.

실행 파일은 두 파일의 이름을 가리켜 읽기/수정 행위를 하게 됩니다. 두 파일에는 실행파일에서 수행하는 행위가 담겨 있을 것입니다.


[그림 4]는 레이스 컨디션 기법으로 파일의 내용을 Hacker's File에 실행 파일에서 일어나는 입력 값을 받아오는 방법입니다.

레이스 컨디션 기법의 순서는 다음과 같습니다.


1. 임시로 생성되는 파일(혹은 사용되는 파일)의 이름과 동일한 심볼릭 링크 파일을 생성합니다.

2. 심볼릭 링크 파일은 해커가 읽고 쓸 파일을 가리키도록 합니다.

3. 실행 파일을 실행합니다.

4. 이제 원래 File_Name1.bin에 입력되어야 할 내용이 Hacker's File에 입력되는 것을 확인할 수 있습니다.


[그림 4] 레이스 컨디션 기법을 이용한 입력 값 탈취


이제 어떤 행위가 일어나는지 알기 위해 레이스 컨디션 기법을 적용시켜봅시다.


[그림 5] 해커의 파일과 심볼릭 링크 파일 생성


cat > /tmp/hackerfile.bin 명령어를 입력하여 입출력에 사용될 파일을 생성합니다.

무슨 행위가 일어날지 모르기 때문에 파일에는 아무런 내용도 입력하지 않도록 합시다.

ln -s /tmp/hackerfile.bin /tmp/level5.tmp 명령어를 입력하여 hackerfile.bin파일을 가리키는 level5.tmp라는 이름의 심볼릭 링크 파일을 생성하도록 합니다.

위의 설명은 [그림 5]와 같은 결과를 볼 수 있게 됩니다.

[그림 5] /usr/bin/level5를 실행한 후의 hackerfile.bin의 변화


/usr/bin/level5를 실행하면 hackerfile.bin에 입출력의 어떤 변화가 있는지 살펴봅시다.

hackerfile.bin에는 next password : what the hell이라고 쓰여 있습니다.

이 실행파일은 임시파일을 생성하여 그 파일에 다음 레벨에 대한 비밀번호를 입력하는 것 같습니다.

'WARGAMES > FTZ' 카테고리의 다른 글

level09_FTZ  (0) 2016.07.21
level08_FTZ  (0) 2016.01.07
level07_FTZ  (0) 2016.01.07
level06_FTZ  (0) 2016.01.07
level04_FTZ  (0) 2015.11.26
level03_FTZ  (0) 2015.11.20
level02_FTZ  (0) 2015.11.15
level01_FTZ  (0) 2015.11.15

level4의 ID와 PW는 아래와 같습니다.

 

ID : level4

PW : suck my brain

 

level4의 hint 파일을 읽으면 [그림 1]과 같이 나오게 됩니다.

[그림 1] level4의 hint 파일


"누군가 /etc/xinetd.d/에 백도어를 심어놓았다."로 보아 /etc/xinetd.d에 들어가보는 것이 좋겠다는 생각이 먼저 듭니다.

/etc/xinetd.d에 들어가면 [그림 2]와 같이 파일들의 리스트들이 보입니다.

[그림 2] /etc/xinetd.d의 디렉토리


위 그림에서 볼 때 backdoor라는 파일이 아주 눈에 띄는 것을 볼 수 있습니다.

cat 명령어를 통해 backdoor를 살펴보도록 합시다.

[그림 3] backdoor 파일의 내용


파일의 내용에는 service finger를 이용하여 다음과 같은 작업을 수행하는 것으로 보입니다.


service finger{} 안에 있는 내용에 대해 잠시 알아봅시다.


구분 

 내용

 disable

 사용 불가능에 대한 상태

 flags

 소켓이 작동될 때 사용하는 정보

 socket_type

 사용하는  TCP/IP 소켓, stream(TCP), dgram(UDP), raw, seqpacket이 올 수 있음

 wait

 yes or no로 설정 할 수 있음

yes

 xinetd가 요청된 한 데몬(daemon)이 끝날 때까지 다른 요청을 받지 않음

 single-thread service

no

 각 요청에 대해 데몬(daemon)이 작동함
 multi-thread service

 user

 데몬(daemon)의 UID를 설정, xinetd의 UID가 0이 아니면 의미가 없음

 server

 실행될 데몬(daemon), 반드시 지정되어야 함 

 log_on_failure

 로그인 실패 시 로그에 원하는 정보를 기록( log_on_failure = HOST은 HOST를 기록 )

log_on_failure += USERID

 로그인 실패에 대한 로그 정보를  추가해주며 쌓을 정보는 USERID를 넣어줌 

 log_on_success

 로그인 성공 시 로그에 아래와 같은 정보를 로그로 기록함

 PID

 프로세스ID

 HOST

 해당 호스트의 이름

 DURATION

 접속 유지시간

 EXIT

 접속 종료시간


[그림 3]의 설명은 다음과 같이 말할 수 있습니다.


- 사용 불가능이 아님

- 소켓이 동작할 때 사용하는 정보는 REUSE임

- 소켓 타입은 stream 형식

- 각 요청에 대해 데몬이 동작하는 multi-thread service임

- user ID는 level5로, 데몬의 UID는 level5임

- 실행될 데몬의 경로와 파일은 /home/level4/tmp/backdoor

- 로그온 실패시 USERID를 로그에 기록함


여기서 눈여겨 봐야 할 곳은 server에 나타나 있는 경로입니다.

이 backdoor 파일의 설명을 간단히 하면, 위와 같은 경로에 있는 backdoor 파일을 level5유저의 권한으로 실행시키는 서비스라고 할 수 있습니다. 

그렇다면 우리가 찾아봐야 하는 경로는 /home/level4/tmp입니다.

로컬로 설치했을 경우에는 /tmp에는 아무것도 없을 것입니다.

여기에 우리가 원하는 exe프로그램을 backdoor의 이름으로 만들어 level5의 권한으로 실행시킬 수 있을 것입니다.

먼저 system("id"); 를 사용해봅시다.

[그림 3] finger 서비스를 이용하여 backdoor 서비스를 실행


system("id"); 의 명령어를 수행하는 프로그램을 backdoor로 만들었을 때의 결과는 [그림 3]과 같습니다.

finger @localhost는 xnetd.d 디렉토리 내의 서비스를 실행시키는 것을 의미합니다.

이 때 backdoor라는 서비스 또한 실행되고, server가 가리키는 /home/level4/tmp/backdoor라는 파일이 실행되게 됩니다.

backdoor에 사용된 명령어는 id와 같기 때문에 level5의 권한으로 실행시킨 id 명령어는 level5의 id를 보여주게 됩니다.

[그림 4] system("my-pass")를 사용


이제 system("my-pass")를 입력하여 비밀번호를 알아내도록 합시다.

system("bash"), system("/bin/bash") 등은 사용되지 않아서....


'WARGAMES > FTZ' 카테고리의 다른 글

level08_FTZ  (0) 2016.01.07
level07_FTZ  (0) 2016.01.07
level06_FTZ  (0) 2016.01.07
level05_FTZ  (0) 2015.11.27
level03_FTZ  (0) 2015.11.20
level02_FTZ  (0) 2015.11.15
level01_FTZ  (0) 2015.11.15
FTZ - hackerschool Local Setting  (0) 2015.08.04

level3의 ID와 PW는 아래와 같습니다.

 

ID : level3

PW : can you fly?

 

level3의 hint 파일을 읽으면 [그림 1]과 같이 나오게 됩니다.

[그림 1] level03 hint 파일 캡처


[그림 1]에서는 어딘가에 작성되어 있는 autodig라는 파일의 코드입니다.

이 소스를 이용하여 level4의 권한을 얻어야 합니다.

more hints로는 동시에 여러 명령어를 사용하기 위한 방법문자열 형태로 명령어를 전달하는 방법이 있습니다.

먼저 level03에서 사용할 autodig 파일을 검색해봅시다.

명령어는 다음과 같은 형태로 find를 작성할 수 있습니다.


find / -name autodig 2>/dev/null 



[그림 2]와 같이 autodig 파일은 /bin 디렉토리 내에 있다는 것을 알 수 있습니다.


[그림 2] autodig 위치


autodig라는 파일을 찾았으면 먼저 그 파일을 어떻게 이용할 수 있는지 탐색해볼 필요가 있습니다.

가장 먼저 권한과 사용자가 어떻게 되어 있는지 살펴봅시다.

ls -l /bin/autodig 명령어를 작성하여 파일의 권한을 보니 [그림 3]과 같이 나타났습니다.


[그림 3] autodig 파일의 권한


파일은 level4의 소유자로 되어있으며, user 권한에는 setuid가 설정되어 있는 s가 보입니다.

level4 권한으로 실행할 수 있는 이 파일을 이용하여 우리가 원하는 명령어를 사용할 수 있도록 방법을 궁리해봅시다.

이에 대한 답은 more hint에서 힌트를 얻을 수 있습니다.


more hint 내용

 명령어를 한 번에 여러 개를 실행할 수 있는 방법 

 명령어를 문자열 형태로 입력하는 방법


<명령어를 한 번에 여러 개를 실행>

    기존의 명령어를 실행한 후, 해커가 원하는 명령어도 실행할 수 있도록 한다는 의미입니다.


<명령어를 문자열 형태로 입력>

    여러 개의 명령어를 하나로 한 녀석을 하나의 argv에 집어넣기 위한 꼼수입니다.


[그림 3][그림 4]는 위 설명에 대한 예시를 보여줍니다.

[그림 3] 여러 명령어를 한 번에 실행


명령어가 한 번에 실행될 수 있는 방법은 여러가지가 있습니다.

그중 우리가 사용할 옵션은 세미콜론(;)입니다.


[그림 4] 명령어를 문자열로 입력


문자열로 한 번에 주기 위해서는 따옴표(')로 묶어줄 수 있습니다.

즉, 127.0.0.1이라는 문자열과 vi라는 문자열을 한 번에 argv[1]에 입력값으로 집어넣을 수 있다는 것을 의미합니다.

127.0.0.1이라는 값이 autodig에 사용되고 이후 level4의 setuid 권한을 통해 vi가 실행됩니다.

level02에서 했던 방법대로 bash 명령어를 사용하면 level4의 권한을 얻게 됩니다.

'WARGAMES > FTZ' 카테고리의 다른 글

level08_FTZ  (0) 2016.01.07
level07_FTZ  (0) 2016.01.07
level06_FTZ  (0) 2016.01.07
level05_FTZ  (0) 2015.11.27
level04_FTZ  (0) 2015.11.26
level02_FTZ  (0) 2015.11.15
level01_FTZ  (0) 2015.11.15
FTZ - hackerschool Local Setting  (0) 2015.08.04

+ Recent posts