OverTheWire_Wargame Bandit

[ level15 -> level16 ]




이번 레벨에서는 openssl의 heartbleed 취약점을 이용한 풀이입니다.

openssl로 localhost의 30001 포트로 접속 한 후 B를 입력 했을 때 HEARTBEATING 응답이 올 경우 취약점이 존재합니다.

또한, openssl 버전을 확인했을 때 1.0.1 ~ 1.0.1f까지의 버전을 사용할 경우 취약점이 발생합니다.

아래 그림은 openssl s_client -connect localhost:30001 로 연결을 시도 후, B를 입력하였을 때 나타나는 응답값입니다.



HEARTBEATING 응답값이 나오는 것을 확인 할 수 있으며, 현 환경의 openssl 버전은 1.0.1f입니다.

파일의 끝(EOF)에 도달하여도 프로그램이 중단되는것을 방지하기 위해 -ign_eof 옵션을 걸어주고 openssl 연결을 시도하였습니다.

만약 -ign_eof 옵션을 걸어주지 않고 현 레벨의 key값을 넘겨주게 되면 'B'만 인식하여 HEARTBEATING 응답이 나오게 됩니다.

연결 후 이전 레벨의 key값을 넘겨주면 다음 레벨로 갈 수 있는 key값을 넘겨받을 수 있습니다.



OverTheWire_Wargame Bandit

[ level14 -> level15 ]




이번 레벨은 localhost의 30000포트로 접속하여 현 레벨의 패스워드를 제출하면 다음 레벨로 갈 수 있는 패스워드를 얻을 수 있다고 합니다.


간단하게 nc로 접속하여 패스워드를 입력 해 주면 bandit15의 패스워드를 얻을 수 있습니다.


P.S - bandit14의 패스워드는 이전 레벨에서 알려줬듯이 /etc/bandit_pass/bandit14 에 저장되어 있습니다.


OverTheWire_Wargame Bandit

[ level13 -> level14 ]



다음 문제로 갈 수 있는 패스워드는 /etc/bandit_pass/bandit14 에 저장이 되어 있으나, bandit14 계정으로만 접근이 가능하다고 합니다.

하지만 이번 레벨에서는 다음 레벨로 가는 패스워드 없이 private SSH key를 이용하여 다음 레벨로 올라갈 수 있다고 합니다.

접속 후 ls 명령어를 입력 해 보면 아래와 같이 sshkey.private라는 파일이 존재합니다.



sshkey.private 파일을 읽어보면 RSA private key가 저장되어 있는데, 이 key를 putty에서 SSH-RSA key로 변경 할 수 있습니다.

putty의 keygen 기능을 이용하여 ssh key를 만들어 보도록 하죠.



load로 sshkey.private에 저장되어 있던 rsa_private key를 불러오고, save private key를 눌러주면 새로운 ppk 파일을 만들어줍니다.



이제 새로운 putty 콘솔을 열고, bandit 세션을 적어준 후 [Connection - SSH - Auth]에서 Browse를 클릭하여 방금 전에 생성한 ppk 파일을 넣어 준 후 세션을 열어줍니다.


그리고 Login 계정을 bandit14로 해주면 bandit14로 패스워드 없이 바로 접속이 가능합니다.


OverTheWire_Wargame Bandit

[ level12 -> level13 ]




이번 문제는 data.txt파일이 hexdump로 제공되며, 압축이 연속적으로 걸려있다고 하네요. 이를 /tmp에 새 이름으로 폴더를 만든 후 거기서 문제를 진행하라고 합니다. 그대로 따라해주도록 하죠.



/tmp/fstr3am 아래에 data.txt 파일을 넣어주었습니다.



data.txt 파일의 hexdump입니다. 헤더를 보면 1f8b 0808로 시작하는 것을 알 수 있는데, 이는 gzip의 파일 포맷입니다. hexdump를 바이너리화 시켜주면서 파일명의 뒤에 .gz을 불여주도록 하죠. 이 때 사용하는 툴은 xxd입니다. -d 옵션을 주어 출력해주면 바이너리 파일이 생성됩니다.


생성된 data.txt.gz을 gzip -d 옵션으로 압축 해제를 해주면 다시 data.txt 파일이 나타납니다.

이러한 형식으로 다중 압축이 되어 있는데, 이 문제 같은 경우 3가지의 압축 방법이 적용되어 있습니다.

위에서 설명한 헤더를 가지고 있는 gzip,

그리고 바로 아래 그림에서 볼 수 있는 425a 헤더를 가지고 있는 bzip2,



마지막으로 헤더에 파일명을 가지고 있으며, 아래 섹션에서는 해당 파일 hex값이 나타나는 tar 압축입니다.



이런식으로 하나하나 압축을 풀어 나가다 보면 마지막에는 data8.bin이 남게 되며, 이 파일을 읽어내면 key값을 얻어 낼 수 있습니다.






P.S - xxd로 파일 헤더를 볼 필요 없이, file 명령어를 이용하면 어떤 압축 포맷인지 바로 알 수 있다고 합니다.... 쮸륵..


OverTheWire_Wargame Bandit

[ level11 -> level12 ]



이번 문제도 이전 레벨과 동일하게 data.txt에 패스워드가 들어있다고 합니다. 하지만 소문자와 대문자 알파벳이 13의 간격을 두고 바뀌어 있다고 하네요.

파이썬이나 다른 언어로 13씩 앞/뒤로 당겨 출력하면 key값을 구할 수 있을 것입니다.


위 값이 13의 크기만큼 rotatation 된 문자열입니다. 이를 바꿔보도록 하죠.






이를 출력하면 키값을 구할 수 있습니다.

OverTheWire_Wargame Bandit

[ level10 -> level11 ]


자, 드디어 레벨10입니다. 한참 한 것 같은데 아직 절반도 못 왔네요.. 부지런히 해야겠습니다.

힌트부터 살펴보죠.


이전 레벨과 마찬가지로 data.txt에 패스워드가 들어있으며, base64로 인코딩 된 데이터가 패스워드라고 합니다.

확인해보죠.


위와 같이 base64로 인코딩 된 데이터를 확인 할 수 있는데, 이를 python으로 디코딩 해줍시다.


바로 패스워드를 뱉어줍니다.


OverTheWire_Wargame Bandit

[ level9 -> level10 ]


자, 이제 레벨10으로 가는 마지막 관문이 남았습니다. 힌트를 확인 해 보도록 하죠.



이전 레벨과 동일하게 data.txt 안에 패스워드가 저장되어 있으며, 몇 개의 '='로 시작하는 문자열에 읽을 수 있는 문자열이 약간 있다고 합니다.

확인해봅시다!



grep으로 '==='를 필터링 하여 실행 해 보니 'Binary file (standard input) matches'라는 오류를 뱉으며 제대로 실행이 되지 않습니다.

이 오류는 바이너리 파일을 grep 했을 때 나타나는 오류라고 하는데, 이 때 -a 옵션을 주면 바이너리를 텍스트로 읽어들여 제대로 필터링 할 수 있다고 합니다.



-a 옵션을 걸어주고 grep 해 봅시다.


몇 개의 equals 뒤에 key 값이 나타난 걸 확인 할 수 있습니다.


OverTheWire_Wargame Bandit


[ level8 -> level9 ]




이번 문제는 data.txt 안에 패스워드가 저장되어 있으며, 단 한번 발생한 라인의 텍스트가 패스워드라고 합니다.

결국 이 말은 data.txt 안에는 중복되는 값이 여럿 존재하며, 이를 제거하면 단 하나의 key가 남을 것입니다.


sort와 uniq는 한 번도 사용하지 않았던 명령어라서 구글링을 통해 알아냈습니다. sort는 말 그대로 아스키 순으로 소팅을 해주는 명령어이고, uniq 함수는 중복을 제거해주는 명령어입니다. 그 중에서도 -u 옵션을 넣어주면 중복되는 값을 제거하고 남은 값을 출력해주기 때문에 key값을 바로 도출 해 낼 수 있습니다.

OverTheWire_Wargame Bandit


[ level7 -> level8 ]



이번 문제도 힌트부터 확인하도록 하죠!

이번 레벨의 목표는 data.txt 파일 안에 다음 레벨로 갈 수 있는 패스워드가 저장되어 있다고 합니다.

그러나 'millionth' 라는 단어 옆에 있다고 하네요.

직접 확인해보도록 합시다.


ls -al 명령어로 해당 파일의 크기를 확인 해 보니 4000kb가량 되는 걸 보니... 아마 사전 데이터같은 값들이 저장되어있는 것 같습니다.

이런 다량의 데이터 속에서 원하는 값을 찾아내기 위해서는 grep 명령어를 사용해야하죠. bash에서는 파이프(|)를 사용하여 두 개 이상의 명령어를 동시에 사용 할 수 있습니다.

확실히 말하자면 동시에 실행하는 것은 아니고, 파이프라인 뒤에 있는 명령어를 실행하는데 그 입력값으로 파이프라인 앞에 있는 명령어의 실행 결과를 던져주는거죠.

millionth 뒤에 있는 key값이 바로 우리가 찾고자 하는 키값입니다!

OverTheWire_Wargame Bandit


[ level5 -> level6 ]



자, 이번 문제는 힌트를 한번 참고해서 풀어보도록 하죠.

이번 레벨의 목표는 inhere 디렉토리 안에 1033바이트의 읽을 수 있는 non-exec 파일이 있다고 합니다.

직접 확인해보도록 하죠.


inhere 디렉토리 아래에는 여러개의 디렉토리가 또 존재하고 있으며, 이 디렉토리 아래에는 여러개의 파일이 더 존재합니다. 그러나 우리는 찾고자 하는 파일이 1033바이트인 것을 이미 알고 있기 때문에 find 명령어로 size 옵션을 지정해주어 1033바이트인 파일만 추려냈습니다.

그러면 key값을 바로 확인 할 수 있습니다.

+ Recent posts