ID : level9

password : apple

 

1) 역시나 hint 내용을 읽어보니 소스 코드가 나왔다.

2) 역시나 setuid 가 걸려있는 파일도 해당 파일이다.

그럼 

/usr/bin/bof

파일에 대한 내용을 확인해보자 

 

3) it can be overflow : 

라는 문구가 나왔다. 그 전에, 해당 소스 코드를 분석하도록 하자

 

1. 입력받은 문자열의 40 만 받아 온다.

2. 여기서 10 크기만큼만 buf[버퍼] 에 내용이 담긴다

3. buf2[버퍼2] 의 처음 2글자가 "go" 라면, 사용자와 그룹권한을 level10 으로 바꾸고, 프롬프트와 쉘을 출력하게 한다

 

 

코드를 해석해보니 어떻게 풀면 되겠는지 느낌이 왔다.

BOF - 버퍼오버플로우 공격이다.

 

buf 는 10글자만 받아 들이지만, 이를 초과할경우 흘러 넘쳐

자연스레 buf2에 들어가게 될것이고, 처음 두 글자가 go 가 되면 말그대로 권한이 뚫리게 되는 문제이다.

 

해당 코드가 공개되어 있으니 해당 코드를 복사하여 새로운 파일을 만들어 보자 

4) 관리자 권한으로 파일 생성이 막혀있다.

그럼 임시파일을 저장하는 cd tmp 로 이동하여 파일을 생성해 보자

 

5) 프로그램 코드 작성을 완료 했으면 Ctrl + d 를 동시에 입력하여 저장한후 컴파일을 한다.

 

6) 프로그램 컴파일이 완료 되었다. 

버퍼 오버플로 공격을 이행하기 위하여, 해당 코드를 어셈블리어를 확인하기위해

gdb 명령어를 사용하여 어셈블리어로 변환해 보자

 

7) gdb 프로그램명 

을 입력한후 , disas main 을 추가 입력하여 

main 함수에 대한 내용을 살펴보도록 하자.

 

8) 빨간색 박스를 보면 buf , buf2 의 변수가 할당되는 것을 볼수있고, 

이러한 변수가 저장되는 주소인

0x0804844e  - Buf

0x08048464 - buf2

임을 알수 있다. 16진수의 표현이기 때문에 이를 변환하여 그 차이를 계산하면

16이 된다.

중간에 표시된 파란 박스는 예측하건데 dummy가 들어가는 공간으로 추측할수 있을것이다.

즉, 쓰레기값이 들어가는 공간이므로 무시하고 buf2 와 buf1 의 차이인 16자리를 채우고, 

buf2 가 시작되는 주소부터 go 를 입력되게 하면 

level10의 권한을 얻을수 있을것이다.

 

9) 16자리를 아무 문자나 채우고 go 를 입력하니

Good Skill! 이라는 문구와 함께

level10의 권한을 획득 하게 되었다.

 

비밀번호를 알아내기 위해 my-pass 를 입력하면

 

10) level10의 비밀번호가 출력되었다

"interesting to hack!"

 

BOF 공격에 대한 문제이므로 

달고나문서의 버퍼 오버플로우 공격 문서를 참조하면 이해가 쉽게 될것이다.

 

ID : level8

password : break the world

 

1) 이번에는 setuid 가 걸린 파일이 아닌, 

find / -user level9 

으로 찾아보자

2) 결과가 나오지 않는다, 결국 파일 크기를 보고 찾아서 결정을 해야한다는 소리이다.

 

 

find 의 -size 옵션

특정 용량을 찾기 위한 옵션이다.

 

3) 이에 따라 find / -size 2700c 2>/dev/null 

을 입력해본 결과.. 여러 파일이 뜨는데

딱봐도 정답인거같은 found.txt. 가 보인다

 

해당 파일의 내용을 보도록 하자

 

4) 해당 파일의 내용을 보니

반복되는 문자가 끝없이 나온다.

 

마치 암호문 같은데 어떤 암호문인지 인지 할수가 없다.

 

하지만 문자열을 자세히 보면

: (콜론) 으로 한문자 한문자 구분되어 있는걸 볼수 있다.

 

트레이너에서 배웠던 passwd 파일과 동일한 구조이다.

문제에서 shadow 파일이라고 알려 주었으니 shadow 파일의 구조에 대해 알아보도록 하자

 

[/etc/shadow]
root:$~$~$~ : 16431 : 0 : 99999 : 7 :  :  :
|-1--|----2------|----3----|-4-|----5–---|-6-|7|8|

1.Login Name : 사용자 계정각 항목별 구분은 :(콜론) 으로 구분되어있으며 콜론과 콜론 사이 각 필드에는 다음과 같은 구조로 구성되어 있습니다.
2.Encrypted : 패스워드를 암호화시킨 값
3.Last Changed : 1970년부터 1월 1일부터 패스워드가 수정된 날짜의 일수를 계산
4.Minimum : 패스워드가 변경되기 전 최소사용기간(일수)
5.Maximum : 패스워드 변경 전 최대사용기간(일수)
6.Warn : 패스워드 사용 만기일 전에 경고 메시지를 제공하는 일수
7.Inactive : 로그인 접속차단 일 수
8.Expire : 로그인 사용을 금지하는 일 수 (월/일/연도)
9.Reserved : 사용되지 않음

 

[출처] shadow파일 구조|작성자 killberos

 

 

위와 같은 구조로 되어 있으며 그렇다면 우리가 필요한 부분은 pass 워드를 암호화 시킨 값이기 때문에

 

$1$vkY6sSlG$6RyUXtNMEVGsfY7Xf0wps.

 

이부분을 해석 해야 한다는 뜻이 된다.

 

이를 해석하기 위해서는 크랙 툴을 별도로 설치해야 한다.

https://www.openwall.com/john/ 

 

John the Ripper password cracker

John the Ripper password cracker John the Ripper is a fast password cracker, currently available for many flavors of Unix, macOS, Windows, DOS, BeOS, and OpenVMS. Historically, its primary purpose is to detect weak Unix passwords. These days, besides many

www.openwall.com

사이트에 접속하여 툴을 다운로드 받도록 하자.

 

* 컴퓨터가 문제인지 버전이 문제인지 개인 노트북에서는 존더 리퍼가 실행되지 않는다.

이 툴은 허술한 비밀번호를 해석해주는 툴이라고 한다..

 

검색결과

 

존더리퍼 프로그램에 해당 shadow 파일을 끌어다 놓으면 level9에 대한 비밀번호가 출력된다고 한다.

 

" apple "  

 

10단계까지 하고 존더리퍼가 안돌아가는 이유를 찾아봐야겠다.

 

ID : level7

password : come together

 

1) hint 내용을 읽어본다.

의미심장한 내용이 나오지만 

find 명령어로 level8 권한의 setuid 를 찾아보도록.

 

2) 해당 파일이 setuid 가 걸린 파일이다.

실행해 보도록 한다.

 

3) 실행하니 비밀번호를 입력하라는 문구가 나왔고, 

엔터를 누르니 해당 메세지가 나왔다.

 

* 인터넷 검색 결과 서버 설치시의 문제라고 하여, 

/bin/ 디렉토리에 wrong.txt. 파일을 만들고, 

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

 

(루트권한 으로 접속ID : root / password : hackerschool) 위 문자를 복사하여 넣는다.

 

 

 

4) 이후, 같은 방법으로 사용하니 다음과 같은 문자가 출력되었다.

 4가지 힌트중, 2진수를 10진수로 바꿀수 있는가? 

라고 적혀있는것을 보고 분석을 해봤다.

 

- 는 1로, _ 는 0으로 분석하니

 

1101101 1100001 1110100 1100101

이라는 숫자가 나왔다. 10진수로 분석해 보면

109 97 116 101 

이라는 숫자가 나온다.

 

이것을 입력해 보았더니

 

5) 정답은 아닌것 같다.

힌트를다시 보자

1. 정답은 가까운곳에 ==> 비밀번호를 틀리게 작성하면 힌트를 줌

2. 상상력을 총 동원하라 ==> - 를 1로, _를 0으로

3. 2진수를 10진수로 ==> 분석 완료

4. 계산기 설정을 공학용 계산기로 바꿔라 

 

4번의 힌트가 무슨뜻인가 하고 공학용 계산기로  계산해 봤다.

 

6) 진수 변환기 계산기를 통해 확인해 보았다.

2진수를 입력하니 10진수, 16진수, 8진수, ASCII 코드가 나왔다.

16진수와 8진수와 같이 숫자로 입력하는것은 아닐꺼라고 생각했다.

 

순서대로 ASCII 코드를 보니

mate 

라는 문자가 성립됬다.

 

7) mate 를 입력하니  level8의 비밀번호를 알수 있었다.

" break the world "

ID : level6

password : what the hell

 

1) 로그인 하자마자 바로 이런 창이 떳다.

진짜 말그대로

what the hell

 

2) 아무 키를 입력하니 다음과 같은 창이 떳다. 

하나하나 살펴보도록 하자

 

3) 먼저 1번을 선택하여 하이텔 이라는 곳에 접속을 해 보았다.

trying IP주소 .. 가 나오더니

이내 종료가 되었다.

...

 

2번 3번을 모두 시도했지만 동일한 방법으로 종료 되었다.

그럼 해당 서비스를 강제로 종료하면 되지 않을까?

리눅스에서 서비스를 종료하는 방법은

 

ctrl + c 

를 누르면 된다 시도해보자.

 

4) 사용할수 없다고 한다.

그럼 어떻게 풀어야 할까.

 

해당 서비스 이전 힌트 단계에서 사용 해 보도록 해봣다

 

5) ?...

바로 프롬프트와 쉘이 나왔다.

ls 를 통해 확인해보니

 

6) 파일 목록이 출력되며 

hint 내용을 보니 같은 내용이 실행되었다.

 

7) 목록중 password 파일이 있길래. 실행해 보았다.

비밀번호를 바로 알려준다

 

" come together "

ID : level5

password : what is your name?

 

1) id 명령어를 통해 자신의 정보 확인

 

2) cat hint 를 입력해 문제 정보 체크

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

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

 

3) find / -perm -4000 -user level6

를 입력해보니 역시나 문제에서 알려준 디렉토리의 파일이 level6의 권한을 가지고 있다.

 

임시파일을 생성하는것으로 보아, 해당 임시파일이 실행될때 my-pass 를 입력하면 비밀번호가 출력될 것이다.

일단 해당 디렉토리로 이동해보자

 

4) 역시나 setuid 가 걸려있으며, 권한은 level6에 있다.

 

5) 임시파일이 생성되는 곳에 가서 확인을 해 보았다.

임시파일은 실행되는 동안 생성되어 실행이 끝나면 자동으로 삭제가 된다.

그렇다면 실행되는 동안 생성된 파일의 내용을 다른 txt 파일에 옮기면 비밀번호를 알수있지 않을까?

 

6) 생각보다 간단한 문제인것 같다.

한번에 여러 명령어를 실행하기 위해

/usr/bin/ 디렉토리에서

 

level5 ; ls -al level5.tmp

 

를 실행해 해당 파일의 정보를 보았다.

해당 파일의 내용을 읽을순 있지만 실행은 하지 못한다.

 

이곳에 

cp 또는 mv 명령어를 통하여 해당 파일이 생성될때 옮겨버리면 되지 않을까 싶었다.

 

7) 접근 권한이 제한되어 있다.

따라서 해당 파일을 옮기거나 복사하지는 못한다.

 

하지만 해당 파일은 읽는것에 대한 권한이 풀려있다.

즉, 해당 내용을 읽을수 있다는 것이기 떄문에 단순하게 cat 명령어를 통해 확인할수 있을것 같았다.

 

8) 성공,

level5 가 실행되는 동안, 해당 임시파일의 내용을 출력하도록 하니

다음 레벨의 비밀번호가 출력되었다

 

" what the hell "

 

+ Recent posts