wargame/bandit

Bandit11 ~ Bandit16 문제 풀이

seungwon9201 2024. 6. 26. 15:45

Bandit11 → Bandit12

-문제-
다음 단계로 가는 패스워드는 data.txt파일 안에 저장되어 있고, 그 안에 저장된 내용들은 소문자와 대문자 알파벳 모두 13번 회전되어 있다.

 

풀이방법 : 13번 회전되었다는 의미를 파악할것.

 

알파벳이 13번 회전되었다는 것은 ROT13 암호화 방식이다.

 

ROT13은 rotate by 13 places의 줄임말로 단순한 암호화 기법이고, 알파벳 문자들을 13자리씩 회전시키는 방법이다. 

 

예를 들어, 'A'는 13자리 뒤의 문자 'N'으로 변환되고 소문자도 마찬가지로, 'a'는 'n'으로 변환된다. 

 

여기서 우리는 치환을 생각할 수 있다.

 

치환을 하기 위한 명령어 tr를 사용하면 쉽게 풀릴 것이다.

A-Z를 N-M으로 바꾸고 a-z를 n-m으로 치환시키자.

 

A-Za-z는 변경할 알파벳인 대문자 A-Z와 소문자 a-z를 의미하고 N-ZA-Mn-za-m은 A를 N으로 바꾸고 Z를 M으로 바꾼다는 뜻이다. 여기서 ZA와 za는 순환을 표현하기 위해 사용된 문자 집합의 일부이다.

이러한 명령어를 입력하면 원하는 비밀번호를 찾을 수 있다.

 

 

 

 


Bandit12 → Bandit13

-문제-
다음 단계로 가는 패스워드는 data.txt 파일 안에 있다. 이 파일은 hexdump방식(파일의 내용을 16진수로 나타낸 것)으로 반복적으로 압축되어있다. 이러한 문제를 풀기 위해서 /tmp아래에서 작업하는 것이 효율적이다. mkdir로 디렉토리를 만들고 cp로 파일을 옮기고 mv로 이름을 바꿔라.
풀이방법 : data.txt 파일을 반복적으로 압축해제 하자.

 

우선 문제에서 나와있듯이 /tmp아래에 새로운 디렉토리를 먼저 만들고 cp로 파일을 복사하자.

이제 data.txt파일을 확인해 보자.

문제에서 말한 대로 data.txt파일은 hexdump형식으로 이루어져 있다.

이 파일을 바이너리 형식으로 바꿔야 한다.

어떻게 바꾸지?

xxd 명령어를 사용하자.

xxd 명령어는 파일의 hexdump를 생성하거나 이를 기반으로 원래 파일을 복구하는 데 사용된다. 

이처럼 xxd명령어와 -r옵션으로 hexdump파일을 바이너리 형식으로 바꾸자.

 

이제 이 파일에 대한 정보를 확인해 보자.

 

yyyyss파일은 gzip으로 압축되어 있다는 내용이 나온다.

그럼 이제 yyyyss파일을 gzip으로 압축해제 시키자.

그전에 yyyyss파일을 gz형식으로 바꿔주고 압축을 풀어야 한다.

이 처럼 풀면 또 다음 정보가 나오게 된다.

이번에는 bzip2으로 압축되어 있다는 내용이 나온다.

압축을 풀었더니 또다시 gzip으로 압축이 되어있다..

한 번 더 압축을 풀었더니 이번엔 tar방식으로 압축이 되어 있다.

이번엔 tar 방식의 압축을 풀어보자.

tar방식의 압축은 -d옵션이 아닌 -xvf방식으로 압축을 풀어줘야 한다.

다 풀어주면 data5.bin파일이 하나 나온다. 이 파일을 확인해 보자.

이번에도 data5.bin파일이 tar방식으로 이루어져 있다.

다시 압축을 풀어보자.

이번엔 data6.bin파일이 나온다.

data6.bin파일은 bzip으로 압축되었으니 위에서 했던 방식 그대로 써서 풀어주자...

그랬더니 또다시 tar방식의 파일이 나왔다.

tar방식을 압축해제 했더니 또 다른 파일 data8.bin이 나왔다.

gzip으로 압축되었다고 뜨니 위에서 했던 내용을 다시 반복해서 풀어보자.

드디어 끝이 보인다... data8은 ASCII 타입이라 읽을 수 있을 거 같다.

data8의 내용을 읽었더니 패스워드가 나왔다!!

 


Bandit13 → Bandit14

 

-문제-
다음 단계로 가는 패스워드는 /etc/bandit_pass/bandit14안에 저장되어 있고 오직 user bandit14만이 읽을 수 있다. 이번 단계에서는 비밀번호를 얻는 방식이 아닌 private SSH key를 가지고 다음 단계로 넘어가야 하고 hostname은 localhost이다.
풀이방법 : SSH 명령어를 이용하여 bandit14에 들어가자.

 

ssh -i [key의 경로] [사용자이름@호스트주소]를 이용해서 bandit14에 접속이 가능하다.

sshkey.private가 내가 갖고 있는 private sshkey이다.

이것을 이용하여 위에 그림처럼 bandit14에 접속하면 된다.

 

 

이처럼 ssh을 이용하여 bandit14에 접속할 수 있고 여기서 문제에서 나온 경로를 들어가면

이렇게 비밀번호를 얻을 수 있다.


Bandit14 → Bandit15

-문제-
다음 단계로 가는 패스워드는 현재 레벨의 패스워드를 localhost 30000번 포트로 제출한다면  얻을 수 있다.
풀이방법 : bandit14의 패스워드를 localhost 30000번 포트로 보내자.

이 문제는 바로 위인 bandit13→bandit14 문제와 연관되는 문제이다.

 위의 문제에서 풀었듯이 /etc/bandit_pass안에 있는 bandit14번 패스워드를 확인하자.

여기 있는 패스워드를 복사해 두자. 그리고 localhost 30000번 포트로 들어가서 보내야 한다.

 

ssh 명령어로 30000번 포트에 접속하려 했으나 닫혀 있었고

telnet 명령어를 사용했더니 이 처럼 접속이 되면서 패스워드를 얻었다!

 

이미 패스워드는 얻었지만 nc 명령어로도 접속을 해보자

nc명령어를 사용했더니 이것 또한 접속이 되었다. 

 

그렇다면 왜? ssh는 안되지만 nc와 telnet은 접속이 가능한 것일까??

SSH는 보안 셸 프로토콜로, 데이터 전송 중에 암호화를 수행하기 때문이다. 따라서 SSH를 사용하여 호스트에 연결할 때, 보안이 확보되어 있어야 한다. 이러한 이유로 private key를 가지고 있던 bandit13  → bandit14 문제는 접속이 가능했던 것이고 지금처럼 private key가 없이 호스트이름과 포트번호만으로 접속하는 문제는 접속이 불가능한 것이다. 

아래는 telnet과 nc에 대한 설명이다.

  1. Telnet:
    • Telnet은 원격 접속을 위한 프로토콜이지만, 데이터를 평문으로 전송한다. 즉, 사용자 이름과 비밀번호를 포함한 모든 데이터가 네트워크를 통해 암호화되지 않고 전송된다.  따라서 Telnet은 보안 요구사항을 충족하지 못하고, 현재 많은 환경에서 사용을 권장하지 않고 있다.
  2. nc (netcat):
    • nc는 단순한 네트워크 유틸리티로, TCP 또는 UDP 연결을 생성하여 데이터를 전송하는 데 사용된다. nc를 사용하여 호스트에 연결할 때, 데이터는 암호화되지 않고 전송되며 보안 기능이 없다. 따라서 nc를 사용하여 데이터를 전송할 때는 데이터 보안에 대한 추가적인 고려가 필요하다.

 

 


Bandit15 → Bandit16

-문제-
다음 단계로 가는 패스워드는 현재 레벨의 패스워드를 이용하여 SSL 암호화된 방식으로 로컬호스트 30001번 포트에 보내면 얻을 수 있다.
풀이방법 : SSL 방식으로 localhost 30001번 포트에 접근해서 패스워드를 얻자.

 

이 문제 역시 Banit14 → Bandit15 문제와 연관되는 문제이다.

우선 Bandit15의 패스워드를 알아야 한다.

 

어떻게 얻었더라?

위의 문제에서 localhost 30000번으로 접속해서 bandit14번의 비밀번호를 전송하면 패스워드를 얻을 수 있었다.

우선 bandit14번의 패스워드부터 찾자.

이렇게 bandit14의 패스워드를 찾을 수 있다.

이제 이 패스워드를 가지고 localhost 30000번 포트로 접속해서 패스워드를 보내면 bandit15의 비밀번호를 얻을 수 있다.

 

자, 이제 bandit15의 패스워드도 얻었다. 

이제 이 비밀번호를 가지고 SSL 암호호된 방식으로 접속해서 패스워드를 보내기만 한다면 끝이다!

 

어떻게 접속할까?

openssl의 s_client를 사용하여 localhost의 30001 포트로 SSL/TLS 연결을 시도할 수 있다.

이 명령어를 실행하면, 30001 포트에서 SSL/TLS 핸드셰이크가 이루어지고 서버의 인증서 정보 등이 나타난다.

아래 내용은 생략..

이 처럼 openssl 명령어를 사용하여 접속하면 여러 정보 등이 나타난다.

위의 내용도 생략..

read R BLOCK 아래에 banit15번의 패스워드를 가지고 입력을 하면 다음 단계로 가는 패스워드를 얻을 수 있다.