OverTheWire_Wargame Bandit

[ level20 -> level21 ]




이번 문제 또한 레벨19와 동일하게 setuid가 걸려있어, bandit21의 권한으로 무언가를 실행 시킬 수 있습니다. 문제를 읽어보면 setuid가 걸려있는 바이너리를 이용하여 네트워크 데몬을 연결하고, level20의 패스워드를 넣으면 level21로 넘어갈 수 있는 패스워드를 던져준다고 합니다.

직접 한번 해보도록 합시다!



홈 디렉토리에 suconnect라는 바이너리가 하나 존재합니다. setuid가 level21 권한으로 걸려있고, 실행 시켜 보니 localhost에 열려있는 다른 포트를 넣어주고, 다른 쪽에서 level20의 패스워드를 넣으라는 문구가 나타났습니다.

그럼 새로운 콘솔을 띄워서 nc로 포트를 열어주면 되겠군요.



nc에 -l 옵션으로 listening 모드로 실행시키고, 포트를 50000으로 잡아주었습니다.

이 쪽이 listening 하는 입장이므로 서버라고 지칭하겠습니다.



자, 다시 다른 터미널로 넘어와서 suconnect 바이너리를 실행시켜줍니다.

우리는 서버 측에서 50000이라는 포트를 열어주었기에 suconnect 바이너리의 인자값에도 50000을 넣어주겠습니다.


다시 서버로 돌아와서, level20의 패스워드를 넣어주니 level21로 통하는 패스워드를 뱉어주었습니다!


OverTheWire_Wargame Bandit

[ level19 -> level20 ]




이번 레벨의 목표는 setuid가 걸려있는 바이너리를 이용하여 /etc/bandit_pass 안에 있는 파일을 읽어 key 값을 찾아내는 것입니다.

한 번 살펴보도록 하죠.



bandit20-do 바이너리를 살펴보니 group 권한에 setuid 비트가 있는 것을 확인 할 수 있었습니다.

그렇다면 bandit20-do 바이너리를 실행 할 때는 bandit20의 계정으로 실행이 된다는 것이죠.

실행을 시켜보니 "./bandit20-do id" 와 같은 형식으로 사용 하라고 하네요.

바로 cat 명령어를 이용하여 bandit20의 key값을 출력 해 주었습니다.


OverTheWire_Wargame Bandit

[ level18 -> level19 ]




이번 문제는 홈디렉토리에 readme라는 파일 안에 key 문자열이 들어있다고 하는데, 누군가 .bashrc 파일을 수정하여 SSH에 로그인 할 때마다 세션이 끊어진다고 합니다.

이 경우에는 일반적인 ssh 로그인으로는 문제를 풀 수 없고, ssh의 기능 중 원격 코드를 실행하는 것이 있는데 이 것을 이용하면 key를 얻어낼 수 있습니다.


ssh user@host "operation"


위와 같은 형식으로 원격 명령을 실행 할 수 있습니다.


직접 로그인을 한 것이 아니기 때문에 .bashrc는 실행되지 않고, key값만 출력 된 것을 확인 할 수 있습니다.


OverTheWire_Wargame Bandit

[ level17 -> level18 ]




이번 문제는 홈 디렉토리에 passwords.old, passwords.new로 2개의 파일이 존재하는데, passwords.new에 새로 추가된 한 줄의 문자열이 다음 레벨로 갈 수 있는 key라고 합니다.

여기서는 diff 명령어를 사용하도록 하죠.



< 의 경우 argv[1]에만 존재하는 문자열, >의 경우 argv[2]에만 존재하는 문자열입니다.

간단하게 key를 구하였으나.... 문제에도 나와 있듯이, level18로 로그인을 할 경우 "byebye !" 라는 문자열이 출력되고 세션이 종료된다고 나와 있습니다.

하지만 저는 이것까지 우회하는 것이 이 문제의 의도인줄 알고.. 4시간동안 삽질하다 다른분들의 write up을 보니 여기가 끝이었네요.


..쮸륵......

OverTheWire_Wargame Bandit

[ level16 -> level17 ]



이번 레벨은 31000~32000 사이에 있는 포트 중 하나에서 다음 레벨로 갈 수 있는 키를 얻을 수 있다고 합니다.

먼저, 이 포트들 사이에서 listening 하고 있는 포트를 찾고, SSL 통신을 하는 지 안하는 지 확인을 합니다. 그리고 추려 낸 SSL 통신 중 오직 1개의 서버만이 다음 레벨로 갈 수 있는 key값을 뱉어준다고 하네요.

그럼 nmap으로 포트스캔을 해 봅시다.


31000, 31046, 31518, 31691, 31790, 31960으로 총 6개의 포트가 listening 하고 있는 것을 알 수 있습니다.



31518, 31790 두 개의 포트에서만 SSL 통신을 하고 있었습니다.

OpenSSL 버전은 1.0.1f이므로, HEARTBLEED 취약점이 발생하는 것을 알 수 있습니다.


openssl s_client -connect localhost:31518 -ign_eof

openssl s_client -connect localhost:31790 -ign_eof


위 두 명령어로 현 레벨의 key값을 보내 주면 31790 포트에서 다음 레벨로 갈 수 있는 RSA_private key값을 얻을 수 있습니다.


이 RSA key값을 putty keygen을 이용하여 SSH_RSA key값으로 변경 해 준 후, bandit17로 연결하면 정상접속 되는 것을 확인 할수 있습니다.

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 된 문자열입니다. 이를 바꿔보도록 하죠.






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

+ Recent posts