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의 개념을 알고 있는지를 물어보는 문제였네요.


FTZ level6에 로그인하면 이전의 문제와 달리 힌트가 자동으로 등장합니다.



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

아직은 무슨 소린지 모르겠네요.

이 화면에서 아무키나 누르면 다음 화면으로 진행됩니다.


텔넷 접속 서비스 1.하이텔  2.나우누리  3.천리안

2000년대 초반에 존재하던 서비스들이 보이네요.

하이텔을 선택하기 위해 1을 입력 하였습니다.


접속이 거절 되었습니다. 하이텔이나 나우누리로 접속해도 결과는 마찬가지 였습니다.

우선 hint를 한번 짚고 넘어가야겠습니다.

bbs란 예전에 PC 통신 할때 텔넷으로 접속하던 게시판이라 생각하시면 됩니다. 하이텔 나우누리 천리안이 가장 유명했던 bbs들이었죠.

 

위의 사진을 보고 메뉴를 선택하면 나오는 다음 문구는 telnet을 시도할때 나오는 문구입니다.

메뉴를 선택하면 조건에 맞는 ip값이 전달되고 텔넷 명령어가 시작 되는거죠.

1번 메뉴를 눌렀을 때 telnet 203.245.15.76이라는 리눅스 명령어가 실행이 되고 이는 코드상에서 system(“telnet 203.245.15.76”)이런 식으로 구성 되어 있을 겁니다.

 

직접 ip를 집어 넣는 것이면 명령어 구분자 ‘ ; ‘를 이용해서 명령어를 입력할 수 있을 듯 하나 메뉴를 선택 하면 미리 셋팅 되어 있는 명령어가 실행되니 이 방법으론 접근이 쉽지 않을듯 합니다.

 

우리의 목표를 잠시 생각해 보면, level7권한으로 my-pass명령어를 사용해 level7의 명령어를 획득하는게 목표입니다. 근데 로그인하면 자동으로 실행되는 저 프로그램 때문에 아무런 명령어를 입력하지 못하는 상황이네요.

일단 저 프로그램을 종료 시켜서 쉘을 띄우는것이 우선이라 생각됩니다.

 

리눅스에서 실행 프로세스를 죽이는 방법인 Ctrl+C를 눌러봅니다.



ctrl+c는 쓸 수 없다고 하네요.

 

이것 때문에 삽질을 5시간 정도 한것 같네요. Ctrl+d도 해보고 ctrl+z도 해보고 다른 프로세스 인터럽트 방법도 찾아보고하지만 정답은 정말 간단했습니다.

 

저 창이 뜨기 전에 하면 되요.



이처럼 hint가 나왔을때 ctrl+c를 눌러 프로그램을 종료하면 됩니다.

 

그럼 명령어를 입력할수 있는 쉘이 뜹니다.

목록이 뭐있는지 확인하고, 매우 의심스러운 파일의 내용을 확인해보면,



level7의 비밀번호 come together이 나옵니다.

 

굉장히 허탈하고 쉬운 문제였네요.

 

리눅스에서 프로세스를 종료하는 ctrl+c를 알고 있는지에 대한 문제였습니다.

Level4에서 구한 암호를 입력하고 들어가서 우선 파일목록을 한번 봐줍니다.



hint가 보이네요. 당연히 읽어줍시다.



/usr/bin/level5 프로그램은 /tmp 디렉토리에 level5.tmp라는 이름의 임시파일을 생성한다.

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

 

우선 /usr/bin/level5를 확인해 봅시다.



level6 setuid가 설정 되어 있네요. 느낌상 저걸 실행하면 my-pass명령어를 통해 level6의 비밀번호를 알 수 있고, 그것이 /tmp/level5.tmp에 저장될 것 같습니다.

/usr/bin/level5를 실행하고 /tmp/level5.tmp에 암호가 있나 확인해봅니다.



/usr/bin/level5를 실행하고 /tmp폴더를 확인해봤는데 level5.tmp는 보이지 않습니다.

아마 /usr/bin/level5프로그램이 종료될 때 임시파일을 지우는 듯 합니다.

 

level5.tmp에 들어있는 내용을 읽는게 이번 level의 문제 요지입니다.

여기서 필요한 공격기법이 레이스 컨디션입니다.

setuid와 임시파일을 듣고 레이스 컨디션을 생각하시면 됩니다.

 

레이스 컨디션을 간단하게 얘기하면 일종의 바꿔치기라 할 수 있습니다. 다른 권한으로 실행되는 프로그램 중간에 끼어들어 자신이 원하는 작업을 하는 기술입니다. 타이밍이 가장 중요하기 때문에 보통 될때까지 실행합니다.

 

레이스 컨디션 공격의 기본적인 아이디어는 다른 권한의 프로그램에 의해 생성되고 사용되는 임시 파일에 대한 것입니다.

 

레이스 컨디션 공격에 앞서 파일 링크라는 개념이 필요한데, 이는 다른 블로그에 잘 정리되어 있으니 여기선 설명하지 않겠습니다.

구글에 리눅스 링크라고만 검색해도 많이 나옵니다.

 

레이스 컨디션 공격을 할때 값을 저장할 임의 파일을 하나 생성을 합니다. 그리고 그 임의 파일의 심볼릭 링크를 생성하여 주는데 이때 이름을 프로그램에서 생성하는 임시파일로 만듭니다. 즉 심볼릭 링크의 이름이 /tmp/level5.tmp가 되는 것이죠.

이렇게 되면 프로그램은 권한 상승이 된 상태에서 링크파일에 데이터를 덮어 씌우고, 그 값이 임의 파일에 저장되게 됩니다.

 

그러나 프로세스 연산과정의 순서로 인하여 권한 상승이 끝난뒤 접근하여 값이 변경 되지 않을 수도 있기 때문에 반복하여 될때까지 하는게 일반적입니다.

 

따라서 프로그램으로 작성하였습니다.

/usr/bin/level5를 반복적으로 실행할 func프로그램입니다.



반복적으로 /tmp/level5.tmp라는 이름의 심볼릭 링크를 생성해주는 link프로그램입니다.



값은 /home/level5/tmp/passwd파일에 저장될 것입니다.

이제 연결을 하나 더 여시고 한쪽에서는 func프로그램을 실행해주고, 다른 한쪽에서는 link프로그램을 실행하여 줍니다.

 

프로그램을 몇초정도 실행하고 ^z로 둘다 멈춘후에 /home/level5/tmp/passwd파일의 내용을 확인하면 level6의 암호가 들어가 있는것을 볼 수 있습니다.


level6의 암호는 what the hell이네요.

레이스 컨디션 공격을 막기 위해서는 먼저 프로그램 로직 중에 임시 파일을 생성한 후, 임시 파일에 접근하기 전에 임시 파일에 대한 심볼릭 링크 설정 여부와 권한에 대한 검사과정을 추가해 주면 됩니다. 

 

+ Recent posts