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


[ level6 -> level7 ]


자, 벌써 6레벨까지 도달했습니다. 힌트부터 확인하도록 하죠.



이번 레벨의 목표는 서버 어딘가에 저장되어있는 다음 단계로의 패스워드를 찾으라는 것입니다.

bandit7의 유저권한, bandit6의 그룹권한, 그리고 33byte의 크기를 가지고 있다는 것을 알려주고 있네요.

이전 레벨과 동일하게 find 명령어로 한방에 찾아주도록 합시다.



짜잔.

+ Recent posts