wargame/bandit

Bandit16 ~ Bandit21 문제 풀이

seungwon9201 2024. 6. 28. 13:36

Bandit16 → Bandit17

-문제-
다음 단계로 가는 패스워드는 현제 단계의 패스워드를 이용해서 localhost의 31000~32000포트 사이에 전송하면 얻을 수 있다. 먼저 서버가 동작하고 있는 포트를 찾아야 한다. 그리고 그중에서 SSL을 사용하는 서버를 찾아야 한다. 오직 하나의 서버만이 다음 단계로 가는 패스워드를 갖고 있고 다른 서버들은 내가 보낸 메시지를 다시 보낸다.

 

풀이방법 : 31000~32000 포트사이에서 동작중인 SSL 서버를 찾고 패스워드를 보내자.

 

자 우선 bandit16번의 패스워드부터 파악하자.

이 패스워드를 바탕으로 현재 오픈중인 서버에 넣어줄 것이다.

 

이제 오픈중인 서버를 찾아야 하는데 어떻게 찾을 수 있을까?

nmap을 사용하여 현재 동작중인 서버의 포트번호를 찾을 수 있다.

 

nmap이란?

nmap(Network Mapper)는 네트워크 탐색 및 보안 감사에 사용되는 오픈 소스 도구이다. 다양한 옵션을 제공하여 네트워크의 상태를 분석하고, 포트 스캔, 호스트 탐색, 서비스 및 버전 탐지, 운영 체제 감지 등을 수행한다.

 

nmap -p <포트범위> <주소이름> 이것을 이용하여 일정범위 내의 포트주소를 분석하여서 현재 작동 중인 서버를 파악할 수 있다.

nmap -p 31000-32000 localhost를 입력하면 현재 동작중인 서버를 찾을 수 있다.

이제 여기 5개의 서버중에서 오직 하나만이 SSL을 사용하는 서버다.

 

문제에서 나와있듯이 하나의 서버 빼고 다른 서버들은 내가 보낸 메시지를 다시 보낸다고 하였다.

echo와 파이프를 이용하여 yyyy 라는 메시지를 보냈더니 31518포트와 31790포트만 메시지를 다시 보내지 않았고 다른 포트는 내가 보낸 메시지를 그대로 보냈다.

여기서 31518포트와 31790포트 둘 중 하나가 SSL서버라는 것을 알 수 있다. 

이제 패스워드를 하나씩 대입해보자.

 

우선 31515포트로 SSL접속 먼저 해보자.

이렇게 입력을 하고 패스워드까지 입력했더니 KEYUPDATE라는 말이 뜨고 다음으로 넘어가지 않는다.

 

 

KEYUPDATE 메시지는 TLS 1.3에서 세션 키를 업데이트하기 위해 발생한다.

이 메시지는 연결 지속 시간 동안 주기적으로 발생하여서 openssl의 s_client 명령어에서 -ign_eof 옵션을 사용하면 해결된다. 

 

그럼 -ign_eof 옵션을 사용해서 처리해 보자.

똑같이 입력 후 패스워드를 입력했더니

아래 확인

 

이처럼 패스워드를 한번 입력했더니 두 번의 패스워드가 나오게 되었다. 문제에서 말했듯이 하나의 서버고 다른 서버들은 내가 보낸 메시지를 똑같이 보낸다고 했으니 31518포트 서버는 SSL서버가 아니다.

 

그럼 이제는 31790 포트번호에 접속을 해보자.

이렇게 openssl s_client -connect localhost:31790을 입력하고 아래에 패스워드를 입력했더니

맨아래 확인

여기도 똑같은 KEYUPDATE 메시지가 뜬다.. 아까 했던 방법으로 다시 처리해 보자.

똑같이 패스워드를 입력했더니

이번엔 성공적으로 접속이 됐고 RSA PRIVATE KEY를 알려주었다.

 

좋다. 이제 이 PRIVATE KEY를 가지고 Bandit17에 접속을 해보자.

 

우선 이 PRIVATE KEY를 사용하기 위해서 저장을 해야 하는데,

전에 했던 방법이 떠오를 것이다.

/tmp 아래에 새로운 디렉토리를 만들고 그 경로의 키를 지정해서 SSL로 접속할 것이다. 

 

PrivateKey는 위의 사진에서 --begin줄부터 맨 아래 --end 파트까지 모두 저장을 해야 한다.

이렇게 새로운 디렉토리를 만들고  PrivateKey를 만들고 vi editor를 실행시켜서 그 안에 내용을 저장해 줄 것이다.

이제 PrivateKey도 저장이 완료 됐다. privatekey를 갖고 있으니 SSH로 이제 접속을 해보자. 

ssh 명령어로 privatekey의 경로를 지정한 뒤에 bandit17에 접속을 하려 했더니 이처럼 오류가 발생했다.

PrivateKey는 orhters들이 접근할 수 없게 만들어야 한다는 메시지가 뜬다.

그럼 orthers들의 권한을 빼주면 해결이 될 것이다.

권한을 바꾸기 위해서 chomd 명령어를 사용하자.

나는 권한 700을 주어서 user에게만 권한을 주고 나머지의 group과, others의 권한은 빼버렸다.(이 부분은 시스템 프로그래밍에서 배웠다.)

이렇게 bandit17에 성공적으로 접속이 되었다!


Bandit17 → Bandit18

-문제-
다음 단계로 가는 패스워드는 홈 디렉토리에 있는 passwords.old, passwords.new 파일 사이에서 변경된 한 줄이다. <만약 이 문제를 풀고 Bandit18에 접속할 때 Byebye!라는 메시지를 보게 된다면 이것은 Bandit19문제와 관련이 있다.>
풀이방법 : passwords.old와 passwords.new 파일들 사이에서 다른 한 줄을 찾자

두 개의 파일의 차이점을 분석하기 위해서 diff 명령어를 사용하자.

diff [옵션] [파일 1] [파일 2]

이런 식으로 사용해 주면 된다. 

따로 옵션은 지정 안 해도 이 문제를 푸는데 지장이 없다. 

 

이렇게 diff 명령어를 사용하면 42번째 줄에서 서로 다른 줄이 있다는 것을 출력하고, 

내가 지정한 파일의 순서대로 차이가 있는 부분이 출력이 된다.

 

즉, 비밀번호는 처음 출력된 부분이다.

 

bandit18번에 접속을 하려 했더니 접속이 되지 않고 튕긴다.. 이 문제는 bandit19번 문제와 함께 보자.

 


Bandit18 → Bandit19

-문제-
다음 단계로 가는 패스워드는 홈 디렉토리에 readme 파일에 저장되어 있다. 그러나 SSH에 로그인할 때 로그아웃이 되도록 누군가가 .bashrc 를 수정해 둔 상황이다.
풀이방법 : 로그아웃이 되지 않으면서 readme 파일을 읽자.

 

바로 위의 문제에서 패스워드를 사용하여 로그인 시도를 하였을 때 바로 튕기는 현상이 발생했다. 

 

그럼 일단 bandit18에는 접속이 불가능한 상황인데, 여기서 문제는 bandit18 홈 디렉토리에 readme 파일을 읽어야 한다는 것이다.

 

이럴 때 ssh 명령어로 해결가능하다.

ssh [서버] [명령어]

이런 식으로 입력을 하게 되면 다른 서버에 있는 파일을 읽을 수 있게 된다.

 

이렇게 입력을 해보자.

 

 

그랬더니 id_rsa라는 파일이 안전하지 못하다고 열 수 없다고 뜬다.

그 아래를 보니 others들에게 접근이 불가능하게 만들어야 한다고 적혀있다.

그럼 이것도 chmod를 이용해서 파일의 권한을 바꿔주자.

 

권한을 바꿔주기 위해서 /tmp 아래에 내가 만든 디렉토리 안에서 파일의 권한을 바꿔줘야 했었다.

새로운 디렉토리를 만들어서 권한도 바꿔주었다.

이제 다시 실행을 해보자.

이번에 실행을 해보니 경고 메시지는 사라졌지만 여전히 접속이 되지 않는다.

자세히 보니 localhost로 접속하는 것이 막혔다고 출력되어 있다.

 

수많은 방법을 써봐도 putty에서는 접속이 되지 않았다.

그렇다면 서버에 접속할 수 있는 다른 터미널을 사용해 보자.

cmd를 이용하여 접속했더니 이처럼 접속이 되었고 패스워드를 입력하는 창이 나왔다. 

 


 

Bandit19 → Bandit20

-문제-
다음 단계로 가기 위해서 홈 디렉토리 안에 있는 setuid binary를 사용해야 한다. 이것을 인자 없이 실행하여 어떻게 사용되는지 확인해라. setuid binary를 사용한 후에 /etc/bandit_pass에서 패스워드를 찾을 수 있다.
풀이방법 : setuid binary를 사용하여 /etc/bandit_pass에서 패스워드를 가져오자.

 

seuid binary란?

특정 사용자의 권한으로 실행될 수 있도록 설정된 파일이다.

즉 이 파일을 이용해서 다른 권한의 파일을 실행시킬 수 있다는 뜻이다.

 

이 처럼 bandit20-do라는 파일이 다른 유저의 권한으로 실행되고 있다고 나와있다.

친절하게 아래에 예시까지 알려주니 따라 해보자.

입력을 했더니 euid혼자 bandit20을 나타내고 다른 애들은 bandit19를 나타내고 있다.

비교하기 위해서 그냥 id를 입력해 보자.

그냥 id를 입력했더니 bandit19만 뜬다.

 

setuid binary는 다른 권한으로 파일을 실행하는 것이라고 했다.

그렇다면 ./bandit20-do id는 bandit20권한으로 파일을 실행했다는 것을 알 수 있다.

 

즉, 우리는 ./bandit20-do를 이용하여 bandit20권한을 사용할 수 있다는 것을 의미한다.

이것을 이용하여 패스워드를 찾아보자.

문제에서 패스워드는 /etc/bandit_pass/아래에 있다고 했다.

 

이처럼 cat 명령어를 사용해서 bandit20의 패스워드를 얻을 수 있다!

 


Bandit20 → Bandit21

-문제-
홈 디렉토리 안에서 setuid binary가 있는데, 이것은 명령어 인자로써 지정한 포트에 localhost로 연결을 해준다. 그 후에 한 줄의 텍스트를 읽어 오는데 읽어온 데이터를 bandit20 패스워드와 비교한다. 만약 읽은 패스워드가 bandit20패스워드와 동일하다면 bandit21의 패스워드를 얻을 수 있다.
풀이방법 : 패스워드를 setuid binary로 연결한 서버에 보내서 다음 단계로 가는 패스워드를 얻자.

 

우선 setuid binary부터 확인해 보자.

suconnet를 실행해 보니 사용법이 나온다.

./suconnect <포트번호>를 입력하면 localhost에 연결을 해준다고 나와있다.

그럼 특정포트의 서버를 켜고 suconnect를 이용해서 서버에 연결을 하고 패스워드를 보내면 풀 수 있을 것이다!

우선 특정 서버의 포트부터 켜보자.

기존 창

이렇게 9201 포트에 서버를 켜두고 sucoonnect로 연결을 해야 한다.

새로운 putty창을 켜서 bandit20에 접속해 주자. 

새로운 창

이렇게 하면 포트 9201번 서버에 서로 연결이 된 상황이다.

이제 패스워드를 보내자.

이렇게 bandit20의 패스워드를 보내니 패스워드가 일치하다고 하면서 다음 패스워드를 보내줬다.


 

'wargame > bandit' 카테고리의 다른 글

Bandit26 ~ Bandit31 문제 풀이  (0) 2024.07.03
Bandit21 ~ Bandit26 문제 풀이  (1) 2024.07.03
Bandit11 ~ Bandit16 문제 풀이  (0) 2024.06.26
Bandit6 ~ Bandit11 문제 풀이  (0) 2024.06.24
Bandit1 ~ Bandit6 문제 풀이  (0) 2024.06.21