Level10을 들어가서 hint를 입력하면 다음과 같이 나옵니다.



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

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

key_t의 값은 7530이다. 이를 이용해 두 사람의 대화를 도청하여 level11의 권한을 얻어라.

 

이번 문제는 공유 메모리를 도청하는 문제로 보입니다.

 

공유 메모리는 여러 프로세스가 같이 쓰는 메모리를 말합니다. 이 기술을 이용하면 프로세스 끼리 통신을 할 수 있으며, 같은 데이터를 공유할 수 있습니다.

같은 메모리 영역을 공유하기 위해서는 공유메모리를 생성한 후 프로세스 자신의 메모리를 사용하듯 사용하면 됩니다.

 



ipcs를 쓰면 현재 사용하고 있는 공유 메모리의 정보가 출력됩니다.

Key: 0x1D6A(7530)

Owner: root

Perms: 666

Bytes: 1028

 

권한이 666으로 되어 있으니 모든 사용자가 볼 수 있겠군요.

C언어로 공유메모리 접근 프로그래밍을 해줍니다.


http://forum.falinux.com/zbxe/index.php?document_srl=423456&mid=C_LIB

코드는 위 링크를 참고하여 작성했습니다.

 

컴파일 한 후 프로그램을 돌리면 level11 암호가 출력됩니다.



Level11의 암호는 what!@#$?이네요.

 

공유메모리를 사용할때는 권한 설정을 잘 해야겠습니다.

Level9 로그인하고 힌트를 확인해 봅니다.



/usr/bin/bof의 코드를 주고 이를 이용해서 level10의 권한을 얻으라고 하네요.

파일 이름도 그렇고 코드 내용을 봤을 때 buffer overflow를 이용하여 문제를 풀으라고 하는것 같네요.

 

Buffer Overflow란 메모리의 크기보다 더 큰 데이터가 들어와서 다른 메모리에까지 영향을 주는 것을 말합니다.

해킹 공격의 기본이 되는 기법이기도 하죠. Buffer Overflow에 대한 추가 내용은https://ko.wikipedia.org/wiki/퍼_버플로를 참고하시기 바랍니다.

 

프로그램을 실행하면 메모리에 우선 할당이 되는데, 다음과 같은 형식으로 할당이 됩니다.

여기서 함수에서 선언한 지역변수는 stack영역에 들어가게 됩니다. 스택은 위에서부터 아래로 자라므로.

buf2[10]가 들어가고 그 아래에 buf[10]가 할당 되게 됩니다.

즉 프로그램에서 입력을 받아 값을 buf에 넣으므로 만약 buf[10]보다 큰 데이터가 들어오면  buf2[10]에도 영향을 주는 것입니다.

 

여기서 알아야 하는것은 메모리에 값이 들어갈때 어떻게 들어가는 지도 알아야 합니다.

지금 buf2[10]buf[10]은 메모리의 스택영역에 다음과 같이 들어가 있습니다.



메모리에 공간을 할당할때 Full Word Boundary에 맞춰 8의 배수로 할당 되므로, Buf[10]Buf2[10]사이에는 빗금친 6칸의 사용하지 않는 공간이 존재합니다.

 

입력이 buf[10]에 되니깐 만약 01234라는 5자리의 데이터를 집어넣으면 다음과 같이 들어갑니다.



즉 할당된 메모리의 오른쪽부터 값이 들어갑니다. 왜냐하면 메모리의 번지가 낮은쪽 부터 채우기 때문입니다. 그림상에서 왼쪽이 높은 주소이고 오른쪽이 낮은 주소입니다.

 

입력값이 hackerschool ftz level9이라면 10자리가 넘고 Buffer Overflow가 발생해 다음과 같이 들어갑니다.



코드를 보면 strncmp(buf2, “go”, 2) ==0 buf2의 앞 두 글자가 “go”면 권한이 상승이 되고 쉘이 열리게 되어 있네요. 즉 메모리에 go가 다음과 같이 들어가도록 해야 합니다.



이렇게 값이 들어가려면 16자리의 글자 뒤에 go를 붙여 주면 될것 같습니다.

0123456789123456go라고 입력해 보겠습니다.


원했던 Good Skill!이 출력되고 level10권한으로 쉘이 실행됨을 볼 수 있습니다.

이제 my-pass로 비밀번호를 확인하면 level10의 비밀번호를 획득 하실 수 있습니다.

Level10의 비밀번호는 interesting to hack!입니다.

 

사실상 이문제는 go8번 이상 출력하기만 하면 풀리는 문제입니다만, 원리를 확실히 짚고 넘어가시는 것이 좋습니다. 메모리에 프로그램이 할당 되는 것과, 변수가 스택에 어떻게 할당 되는지, full word boundary가 무엇인지 등 중요한 개념이 많이 나오니 꼭 숙지하고 넘어가셨으면 합니다.

Level8 접속하여 우선 힌트를 확인합니다.



level9shadow파일이 서버 어딘가에 숨어있다.

그 파일에 대해 아려진 것은 용량이 “2700”이라는 것 뿐이다.

 

이번 문제는 우선 용량이 2700인 파일을 찾아야 겠네요.

근데 여기서 발생하는 문제는 단위가 무엇인지 모른다는 것입니다.

단위가 b일수도 k일수도 c일수도 있습니다.

 

Find명령어의 메뉴얼을 보면 –size옵션에 대한 설명이 나와있습니다.

 

       -size n[bckw]

              File uses n units of space.  The units are  512-byte  blocks  by

              default  or  if ??b?? follows n, bytes if ??c?? follows n, kilobytes

              if ??k?? follows n, or 2-byte words if ??w?? follows  n.   The  size

              does  not  count  indirect  blocks,  but it does count blocks in

              sparse files that are not actually allocated.

 

단위로 사용할수 있는것은 b, c, k, w가 될것 같습니다.


운좋게 두번만에 찾아졌네요.

4가지 항목 중에서 2번째 /etc/rc.d/found.txt.가 가장 의심스러우니 내용을 확인해 보죠.

 


level9shadow내용이네요.

 

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

 

level9계정의 암호가 되는 부분은$1$vkY6sSlG$6RyUXtNMEVGsfY7Xf0wps.입니다.

암호화된 이것을 복호화 해주면 level9의 암호가 나오는 것입니다.

암호는 MD5방식으로 암호화 되어 있으니 이를 복호화 해주면 되겠습니다.

 

MD5에 대한 내용은 위키를 참고해주세요 : https://ko.wikipedia.org/wiki/MD5

 

Shadow암호는 John the Ripper라는 프로그램으로 복호화 가능합니다.

http://www.openwall.com/john/에서 자신의 운영체제와 맞는 것을 설치해 주시면 됩니다.

 

John the Ripper를 설치한 후 run폴더 아래에 passwd.txt파일로 shadow내용을 집어 넣습니다.



그리고 터미널을 실행시킨후 run폴더로 들어가 john passwd.txt를 입력합니다.



위와 같이 복호화가 되면 암호를 보여줍니다. 자세히 보기 위해 john –-show passwd.txt를 입력합니다.




shadow형식에 맞춰 암호부분이 복호화 되어 들어나 있음을 알수 있습니다.

Level9의 암호는 apple이네요.

 

파일 사이즈로 find명령어를 사용하는 것과 shadow파일의 형식에 대한 지식, shadow파일을 복호화 하는 방법을 아는 지를 묻는 문제였습니다.

Level7으로 로그인 한 뒤에 힌트를 한번 확인해 봅니다.



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

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

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

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

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

 

이번에는 힌트가 좀 많네요.

/bin/level7을 실행하니 암호를 요구합니다.

패스워드가 가까운 곳에 있다고 했으니 level6의 암호 come together을 한번 입력해 보았습니다.



come together은 아닌것 같네요.

근데 이상한 문장이 출력 되었습니다.

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

무슨 문장일까요

로컬서버로 구축해서 하시는 경우에는 /bin/wrong.txt파일이 없다는 에러가 뜨는 경우가 있습니다. 이럴 경우에는 해커스쿨 FTZ서버 ftz.hackerschool.org로 접속하셔서 푸는것을 추천드립니다.

 

보니깐 _이루어져 있고 8개씩 나누어져 있습니다.

아마 _0을 의미하는것이고 1을 의미하는게 아닐까합니다.

 

저것을 10으로 변형해주면01101101 01100001 01110100 01100101이 됩니다.

8개씩 4개로 이루어져 있으니 1byte4, 4byte네요.

 

2진수와 10진수의 변환이 힌트였으니 8개로 끊어 10진수로 변환해 보면 109 97 116 101이 됩니다.

 

느낌이 ASCII코드인것 같습니다.

 

ASCII코드란 숫자밖에 모르는 컴퓨터가 문자를 표시하는 방법입니다.

1byte8자리 2진수가 모여 글자 한개를 의미하는 방법입니다.

 



http://ascii.zeemind.com/?hl=ko

 

ASCII테이블을 참고하여 109 97 116 101을 문자로 변경하면 mate라는 4글자 단어가 나옵니다.

 

이를 입력해 보겠습니다.



접근법이 맞았나 보네요.

Level8의 패스워드는 break the world라고 하네요.

 

이번 문제는 2진수와 10진수의 변환 가능과 ASCII의 개념을 알고 있는지를 물어보는 문제였네요.


+ Recent posts