해킹/FTZ 1~10 - 10

  1. FTZ_level10 2016.01.12
  2. FTZ_level9 2016.01.12
  3. FTZ_level8 2016.01.11
  4. FTZ_level7 2016.01.11
  5. FTZ_level6 2016.01.11
  6. FTZ_level5 2016.01.11
  7. FTZ_level4 2016.01.11
  8. FTZ_level3 2016.01.11

FTZ_level10

해킹/FTZ 1~10 2016. 1. 12. 20:11


힌트를 열어보니 공유메모리 기반 IPC를 도청하는 프로그램을 작성하라는 내용이다.

프로그래밍 자체는 관련함수를 조금 찾아보면 그렇게 어렵지 않게 작성할 수 있다.

공유메모리에 관한 좋은 설명이 있는 주소를 첨부한다.

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


조만간 내용을 더 공부하고 정리해서 블로그에 다시 올릴 예정이다.

아무튼 위 내용을 기반으로 프로그램을 작성해보면.



이런 프로그램을 만들수 있다. key_t값을 힌트에서 알려준 7530으로 맞춰주면 된다.

해당 프로그램을 컴파일 후 실행시켜보면




경고메세지는 살짝 뜨지만 공유메모리에 접근하는데 성공했다.

끝-

'해킹 > FTZ 1~10' 카테고리의 다른 글

FTZ_level9  (0) 2016.01.12
FTZ_level8  (0) 2016.01.11
FTZ_level7  (0) 2016.01.11
FTZ_level6  (0) 2016.01.11
FTZ_level5  (0) 2016.01.11
Tags
Social

FTZ_level9

해킹/FTZ 1~10 2016. 1. 12. 02:38


여태까지와 마찬가지로 힌트를 읽으면서 시작.

아주아주 전형적인 bof문제의 형식이고 아주아주 쉬운 수준이다.


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

음... 이후 부분을 어떻게 넘어갈지 참 고민을 많이 했다.

혹시 간단한 디버깅도 해본적 없는 처음 공부하는 사람이 ftz를 공부하며 이글을 접하지도 않을까 하는 고민이다.

내 블로그는 구글 검색해도 안나오는 허접한 블로그이긴 하지만...

혹시나 미래에는 내 지인중 누구라도 초심자가 이 글을 보면서 공부할 수도 있지 않을까라는 생각을 했었다.

그러나 한편으로는 아무도 안보는 블로그의 있을지 없을지 모르는 초심자를 위해 처음부터 다 설명하는게 오바라는 생각도 들었다.

사실 나는 뒷부분도 이미 공부가 되어있는 상태라 대강 프로그램이 어떻게 돌아가는지 알고있는 상황이고

이 블로그는 누구에게 설명하기 위해서 작성한다기 보다는 내 공부한 내용을 정리하기 위해 작성하는 것이기 때문이다.

고민한 결과 운영체제에서 프로그램의 작동 원리 전반을 다 다루기에는 하나의 포스팅에 부담이 너무 크므로... 

프로그램이 스텍을 어떻게 활용하는지 + 디버깅을 위한 32비트 레지스터들의 전반적인 역할을 위주로 어느정도 모르는 사람도 이해할 수 있게끔 써보자는 결론에 도달했다.


그래서 그런 쓰잘데기없는 기우의 결과로 쓰잘데기없는 설명을 붙이자면

프로그램을 실행해서 메모리에 올라가 있을때는 프로세스라고 부른다. 이 프로세스들은 


이 유명한 그림과 같은 구조를 가진다.

text 영역에는 프로그램의 코드, 즉 기계어로 된 명령어들이 들어간다.

data영역에는 전역변수가 들어간다.

그렇다면 bof파일에서 buf나 buf2와 같은 변수들은 어디로 들어가냐하면 바로 stack의 영역으로 들어가게 된다.

이 문제에서는 필요하지 않지만 추가로 설명하자면 char* buf와 같이 포인터를 선언하고 malloc으로 buf에 동적인 영역을 할당하게 되면 힙영역에 문자열이 들어갈 공간을 할당하게 되고 그것을 가르키는 4바이트 주소가 buf라는 변수에 들어가게 되는 것이다.

아무튼 스텍으로 돌아와서 이 스텍이라는 놈은 그림처럼 높은주소에서 낮은주소로 자라난다. 거꾸로 자란다고 표현한다 보통.

보통 디버깅을 할때 하나의 함수를 어셈블리어로 쭉 풀어보면.. 함수의 프롤로그라고 해서 push ebp/ mov ebp, esp를 한다음 꼭 sub esp, 0x~~ 이런식으로 esp에서 어느정도를 빼주는데 이게 바로 스텍의 공간을 확보하는 행위이다.


설명을 위해 아주 간단한 이런 프로그램을 작성하고 디버거를 이용해 디스어셈블 해보았다.

맨 위의 두줄이 함수의 프롤로그 부분이고 그다음 esp에서 0x8만큼을 빼는것이 보인다.

main+16과 main+23을 보니 ebp-4 부분에는 10인 0xa가, ebp-5에는 c의 아스키코드인 0x63이 들어간 것이 보인다.

즉 변수 a, b가 각각 ebp-4, ebp-5에 들어갔다는 것이다. 이부분까지 함수의 스텍 변화를 한번 그려봤는데..




이렇게 되는것이다. 여기서 프롤로그 이후 움직이지 않는 저 ebp를 베이스포인터라고 하고 스텍이 pop, push되면서 따라다니는 저 esp레지스터를 스텍 포인터라고 한다. 더 자세한 다른 레지스터들이나 프로그램 원리에 대한 공부는 읽는사람 자신에게 맡긴다. 구글은 위대하다.

아무튼 이 길고 장황하고 재미없는 설명에서 중요한 점은 스텍에서 변수들의 위치는 ebp를 기준으로 얼마만큼을 뺀 지점이고, 실제로 사용할때도 ebp-5, ebp-4 이런식으로 주로 사용한다는 것이다.


한가지 더 사소한 디버깅 팁은 call 명령어를 기준으로 보는 것이다. 하나의 call 명령어로부터 다음 call 명령어까지는 주로 push, mov등의 명령어로 스텍에 뭔가를 집어넣는 작업이 들어가는데 이렇게 스텍에 들어가는 것들이 바로 다음에 call할 함수에서 사용할 인자라는 것이다.


진짜 정말정말 귀찮으므로 여기까지만 하고 직접 이 bof라는 파일을 디버깅하는 것을 보면 어느정도 이해에 도움이 될 것이다.

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



소스를 그대로 긁어서 /tmp 밑에 새로운 bof파일을 컴파일 한 후 gdb로 디버깅을 해보자.



위와같이 먼저 bof.c를 vi로 만들어준후 gcc로 컴파일해주고 gdb에서 bof를 연다.



그다음 내편한대로 인텔 문법으로 설정해준 뒤 main을 디스어셈블 해보았다.

세번째 줄에 보면 sub esp, 0x28을 해주는 것이 보이는데 스텍을 사용할만큼 할당해주는 것이다 0x28 즉 40바이트정도의 스텍이 할당되었다.

대충 call 명령어를 위주로 살펴보면 fgets 함수를 call하기 전에 eax로 ebp-40의 주소가 들어가고 eax를 push 해주는 것을 알 수 있다.

fgets에 인자를 넘겨주는 일련의 과정인데 위 소스에서 fgets에 인자로 buf가 들어가는 것을 확인했으니 ebp-40부분이 buf변수에게 할당된 부분인 것을 유추할 수 있다. (그전에 push된 0x28과 ds:0x8049698은 각각 숫자 40과 stdin의 주소다. fgets(buf, 40, stdin);이었으므로 뒤의 인자가 먼저 push된다는 것을 알수있다.)

마찬가지로 비슷한 과정을 거쳐서 strncmp로 넘어가는 ebp-24라는 부분이 buf2에 할당된 부분이라는 것 역시 유추할 수 있겠다.


그러면 buf는 ebp-40에 할당되었고 buf2는 ebp-24에 할당되었으므로 두 변수 사이에 16만큼 차이가 있는것을 알 수 있다.

스텍구조를 그림으로 그려보면





대충 이렇게 될것이다. 

위와같은 스텍 구조에서 바운더리가 10byte짜리 buf 공간에 fgets가 40바이트나 입력을 받아버리니 오버플로우가 가능해진다.

buf2에 go를 넣는것이 목적이므로 16바이트를 아무 글자나 채워준뒤 뒤에 두개의 바이트를 go로 넣어주면 된다.

사실 aaaaaaaaaaaaaaaago하면 되지만 간지나게 파이썬 파이프를 사용해주자.




파이프를 이용하면 꼭 쉘이 좀 이상하게 뜨지만 my-pass가 정상적으로 작동하는 것을 확인했다.

끝-

'해킹 > FTZ 1~10' 카테고리의 다른 글

FTZ_level10  (0) 2016.01.12
FTZ_level8  (0) 2016.01.11
FTZ_level7  (0) 2016.01.11
FTZ_level6  (0) 2016.01.11
FTZ_level5  (0) 2016.01.11
Tags
Social

FTZ_level8

해킹/FTZ 1~10 2016. 1. 11. 23:38


음 힌트를 보니 쉐도우파일을 얻어서 존더리퍼로 크랙하면 되겠다.

shadow파일은 사용자의 비밀번호를 해쉬화해서 저장해놓은 파일이고, 안전하지 않은 해시함수를 사용하면 크랙당할 수 있다.

우선은 크기가 2700인 파일을 찾아보자





음 생각보다 많이 나왔다

2700다음 c를 붙이는 이유는 바이트라고 알려주기 위해서다.

크기 뒤에 붙여주는 단위는 아래와 같다:

b : 블록단위 512kb

c : byte

k : kbyte

w : 2byte 워드

디폴트 값 b


여러가지가 나왔지만 쉐도우파일이라고 했으니 확장자가 gz나 gif인 것을 제외하고 txt파일인 중간의 것을 읽으면 되겠다.




내용은 대충 이렇다. 쉐도우파일은 해시값과 다른 정보들을 :로 구분하는데 지금 이 파일에는 똑같은 비밀번호가 여러번 반복되고 있는것으로 보인다.

:으로 구분되는 저 데이터들의 의미는 앞에서부터 사용자:패스워드 해시값:마지막으로 변경한 날로부터의 시간: 패스워드 변경가능 기간: 등등~~~

이다. 전부 외울필요는 없을듯 검색하면 다 나온다.



아무튼 이 해시값을 가지고 비밀번호를 알아내야 하는데 해시 크랙툴은 유명한 존더리퍼가 있다.

ftz 레드햇 리눅스가 하도 이상해가지고 존더리퍼 압축해제도 잘 안되고 해서 그냥 윈도우용 존더리퍼를 다운받은 뒤 해당 파일을 가져와서 cmd에서 크랙했다.




정상적으로 level9의 비밀번호가 출력된다.



ps.윈도우로 쉐도우파일을 옮겨서 크랙할때 긁어서 메모장에 붙여넣는 형식으로 많이 하는데 이때 존더리퍼가 전혀 크랙을 못하는 경우가 있다. 이경우에는 메모장을 저장할때 인코딩을 utf-8로 해주면 해결된다!




'해킹 > FTZ 1~10' 카테고리의 다른 글

FTZ_level10  (0) 2016.01.12
FTZ_level9  (0) 2016.01.12
FTZ_level7  (0) 2016.01.11
FTZ_level6  (0) 2016.01.11
FTZ_level5  (0) 2016.01.11
Tags
Social

FTZ_level7

해킹/FTZ 1~10 2016. 1. 11. 22:30


마찬가지로 힌트로 시작한다. 뭔가 퍼즐스러운 문제일 것 같다.

우선 실행해보라니 실행해본다.



엄...뭘까 이게 cat을 사용한데서 뭔가 허점이 있나 했으나... /bin/wrong.txt를 못읽은것 뿐인것 같다.




gdb로 분석해보려고 했으나 권한이 없다... 난관에 봉착했다.


FTZ level7에서 막혔다는 사실에 자존심히 상하며 다른 블로그를 찾아봤다.

......결론은 내 FTZ로컬 파일에 문제가 있었다 /bin/wrong.txt파일이 원래 존재해서 힌트를 줘야하는데 그게 없으니 풀수가 없는거였다..참나

root로 로그인해서 인터넷에 나와있는대로 wrong.txt를 만들어준 후 다시 실행시켰다.





어 그래 저게 나올지 알고있었다. 내가 적어놨으니까-_-;; 뭐아무튼 정상적으로 실행시켰다고 가정하고 문제를 풀어보면..


우선 가독성을 위해 메모장을 열어서 옮겨적었다. 이진수 얘기가 힌트에 있었으니 아마 저게 2진수일것이다.

에.. high를 1, low를 0으로 보고 숫자로 바꿔주면 1101101 1100001 1110100 1100101이다 하나씩 계산기를 프로그래머용으로 열어서 10진수로 고쳐주면

109 97 116 101이다. 이거를 뭐 띄어쓰기 포함인지 아니면 붙여서 쓰라는건지 모르겠지만 일단 넣어봤다.





안된다..ㅡㅡ 안돼... 애매한 문제에 대한 깊은 빡침을 느끼다가.... 숫자의 크기를 보고 대충 ascii코드에 대입해봤다.

숫자들을 ascii에 대입하면...mate 단어가 그럴듯한걸 봐서 확실하다.



풀렸다. 감상은... 이게뭐야ㅡㅡ

끝-

'해킹 > FTZ 1~10' 카테고리의 다른 글

FTZ_level9  (0) 2016.01.12
FTZ_level8  (0) 2016.01.11
FTZ_level6  (0) 2016.01.11
FTZ_level5  (0) 2016.01.11
FTZ_level4  (0) 2016.01.11
Tags
Social

FTZ_level6

해킹/FTZ 1~10 2016. 1. 11. 22:06


level6으로 로그인하니 다짜고짜 힌트를 던진다.... 이게 뭐지 인포샵이나 bbs나 처음 들어본다.





음 뭔가 선택하라길래 일단 1번을 선택하고 무슨일이 일어나는지 보고있는데... 아무 반응이 없다.

그냥 진짜 하이텔에 연결하는 모양이다.....

일단 쉘을 보기 위해서 숫자를 선택하지 않고 ctrl+c를 눌러보니




허허허... ctrl+c를 막아놨다... 뭐지.. 하면서 몇번 접속해보다가.. 우연히 앞의 힌트화면에서 ctrl+c를 눌러봤다.




어라? 빠져나온것은 물론이고 password가 떡하니 놓여있다... 참... ctrl+c를 하는 문제였던 것이다.


뭐 대강은 알고있지만 참고를 위해 적어놓자면

ctrl+z : 백그라운드로 작업전환
ctrl+d : 정상종료

ctrl+c : 강제종료

라고한다. 리눅스상에서 쓰이는 단축키다. 알아두면 다 어딘가 쓸데가 있겠지.




ps.이번에 다시 문제를 풀때는 이렇게 풀지를 않았다. level5를 풀고 그자리에서 바로 su로 들어갔더니 바로 쉘이 떠서 ctrl+c를 누를 필요도 없었다. 여러모로 허점이 많은 문제인듯.

'해킹 > FTZ 1~10' 카테고리의 다른 글

FTZ_level8  (0) 2016.01.11
FTZ_level7  (0) 2016.01.11
FTZ_level5  (0) 2016.01.11
FTZ_level4  (0) 2016.01.11
FTZ_level3  (0) 2016.01.11
Tags
Social

FTZ_level5

해킹/FTZ 1~10 2016. 1. 11. 19:03


버릇처럼 cat hint를 하면서 시작.

레이스컨디션과 관련된 문제로 보인다.

usr/bin/level5라는 파일이 실행되면서 임시파일을 생성해서 사용하는데 물론 임시파일이니 level5프로그램이 종료되면 사라질 것이다.

이게 사라지기전에 가로채서 내용을 읽으면 될것이다.


라고 생각하고 반복문을 돌려서 잠깐동안 생성된 level5.tmp파일을 읽어보려고 했으나... 안타깝게도 나중에 디버깅을 해본 결과 level5.tmp파일에는 level5가 읽을 수 있는 권한이 없다.


자 그럼 생각할 수 있는 방법은 이게 삭제되는걸 막거나 삭제되기 전에 어딘가 옮겨놓는 방법인데...


1.먼저 가장 쉬운 방법은 level5.tmp라는 파일을 먼저 만들어 놓고 level6에게 그것에 대한 쓰기권한을 주는 것이다.

level6이 level5.tmp가 있는지 먼저 체크하지 않는 취약한 프로그램이라는 가정 하에, 그렇게되면 level6은 level5가 미리 만들어놓은 level5.tmp라는 파일을 쓰기모드로 열게 되고 거기다가 비밀번호를 적어넣을 수 있다. 하지만 그리고 나서 level5.tmp를 삭제하려고 할 때 해당파일의 소유자가 level5이니 삭제할 수가 없다. 그래서 파일이 남아있게 되고 그걸 읽으면 되는 문제인것.


2.만약 /usr/bin/level5가 root권한으로 실행되는 프로그램이라고 가정하면

level5.tmp파일을 level5권한으로 만든다고 해도 root의 권한으로 삭제할 수 있다. 이 경우에는 심볼릭 링크를 사용하면 되는데

예를들어 level5_oxqo라는 파일을 만들고 /tmp폴더 밑에 level5.tmp라는 심볼릭 링크를 만들어 level5_oxqo를 가리키게 하는 것이다.

그러면 프로그램은 level5.tmp를 열어서 패스워드를 쓴 후 지우지만 그 내용은 level5_oxqo에 적히게 되고 level5.tmp를 삭제한다고 해도 level5_oxqo라는 파일에 내용이 남아있게 되는 것이다.


뭐 여기서는 level6의 권한으로 프로그램이 돌아가므로 굳이 2번의 방식을 택할 필요가 없다.



이런식으로 level5.tmp라는 빈 파일을 만들어놓고 프로그램을 돌리면 지워지지 않은 임시파일을 읽을 수 있다.

끝-


'해킹 > FTZ 1~10' 카테고리의 다른 글

FTZ_level7  (0) 2016.01.11
FTZ_level6  (0) 2016.01.11
FTZ_level4  (0) 2016.01.11
FTZ_level3  (0) 2016.01.11
FTZ_level2  (0) 2016.01.11
Tags
Social

FTZ_level4

해킹/FTZ 1~10 2016. 1. 11. 16:55


level4의 힌트를 열어보니 백도어가 있단다. 들어가서 확인해보자.




음 확실히 backdoor가 있다. 실행시켜봤다.




실행이 되지 않아서 권한을 확인해보니 읽기권한밖에 없었다. 읽어보니 finger라는 서비스의 정의같은 내용이다.

xinetd는 슈퍼데몬으로서 서비스를 전달받아서 다시 실행시키는 역할을 한다. 즉 finger라는 서비스를 이 서버에 요청하면 xinetd는 해당 폴더 안에서 finger라는 서비스를 찾아서 실행시켜줄텐데 여기선 정상적인 finger라는 서비스 대신에 backdoor로 서비스가 대체된 것으로 보인다.

그래서 이 서비스를 요청하면 xinetd는 자신이 backdoor파일 안의 정보에 의해 server라고 명시되어 있는 /home/level4/tmp/backdoor라는 프로그램을 실행시켜줄 것이다. 어떤 프로그램인지 실행시켜보자.




그런 파일은 없단다. 하지만 level4/tmp 에 존재하는 파일이니 내가 직접 작성할 수 있을 것이다.

cd /home/level4/tmp로 해당 폴더에 들어가서

vi backdoor.c로 c파일을 아래와같이 작성했다.


my-pass를 쉘에 입력해주는 간단한 프로그램이다.



gcc -o backdoor backdoor.c 명령어로 컴파일을 해준 뒤 xinetd에 finger 서비스를 요청했다.

@localhost는 원래 ip가 들어갈 자리인데 지금 접속해있는 ftz서버 자신에게 보내는 것이니 @localhost 혹은 @127.0.0.1로 해주면 되겠다.

이번에는 어쩌다보니 패스워드도 같이 캡쳐에 들어갔지만... 뭐 검색하면 다 나오는걸 뭐..

끝-



'해킹 > FTZ 1~10' 카테고리의 다른 글

FTZ_level6  (0) 2016.01.11
FTZ_level5  (0) 2016.01.11
FTZ_level3  (0) 2016.01.11
FTZ_level2  (0) 2016.01.11
FTZ_level1  (0) 2016.01.11
Tags
Social

FTZ_level3

해킹/FTZ 1~10 2016. 1. 11. 16:21


level3의 힌트다.

autodig이라는 파일의 소스코드인데 dig이라는 명령어가 뭐 메일 비슷한거였나... 아무튼 별로 중요하지 않다.

argv[1]이 중간에 들어가고 그렇게 파싱한 문자열을 그대로 system 함수로 보내기때문에.. ;로 끊어주고 명령어 입력하면 된다.

하지만 ;를 하면 지금 열려있는 level3의 bash에서도 명령어의 끝으로 인식하기 때문에 그 뒷쪽은 argv로 들어가지 않는다.

그래서 "를 사용해서 묶어줘서 전체가 다 argv[1]으로 들어가도록 만들어 줘야한다.




autodig이라는 파일을 찾은다음 ";bash;"를 입력. 성공적으로 level4의 쉘을 띄웠다.

마찬가지로 my-pass에서 나오는 패스워드 출력화면은 생략.

끝-

'해킹 > FTZ 1~10' 카테고리의 다른 글

FTZ_level6  (0) 2016.01.11
FTZ_level5  (0) 2016.01.11
FTZ_level4  (0) 2016.01.11
FTZ_level2  (0) 2016.01.11
FTZ_level1  (0) 2016.01.11
Tags
Social