힌트를 확인해보도록 하자

The password for the next level can be retrieved

by submitting the password of the current level to port 30000 on localhost.

포트번호는 30000이고 localhost에 기존의 패스워드를 입력하면 나온다고 한다.

그럼 저번 문제처럼 ssh로 접속을하면 되지 않을까 생각해서 접속을 해보았다.

ssh bandit15@localhost -p 30000

 

보안상의 문제로 ssh는 접속이 안되는거 같다. 

그러면 nc나 telnet 명령어를 사용해서 접속을 해봐야 할 거 같다. 

nc localhost 30000

 

접속을 하고 기존의 패스워드였던 bandit14의 패스워드를 입력하면 다음 레벨로 올라가는 패스워드를 얻을 수 있다.

ssh 접속 대신에 nc나 telnet을 이용할 수 있는가에 대한 문제인거 같은데 telnet으로도 풀 수 있는지 한번 시도를 해보았다.

telnet localhost 30000

 

동일하게 풀리는 것을 확인 할 수 있었다.

힌트를 확인해보도록 하자

The password for the next level can be retrieved

by submitting the password of the current level to port 30000 on localhost.

포트번호는 30000이고 localhost에 기존의 패스워드를 입력하면 나온다고 한다.

그럼 저번 문제처럼 ssh로 접속을하면 되지 않을까 생각해서 접속을 해보았다.

ssh bandit15@localhost -p 30000

 

보안상의 문제로 ssh는 접속이 안되는거 같다. 

그러면 nc나 telnet 명령어를 사용해서 접속을 해봐야 할 거 같다. 

nc localhost 30000

 

접속을 하고 기존의 패스워드였던 bandit14의 패스워드를 입력하면 다음 레벨로 올라가는 패스워드를 얻을 수 있다.

ssh 접속 대신에 nc나 telnet을 이용할 수 있는가에 대한 문제인거 같은데 telnet으로도 풀 수 있는지 한번 시도를 해보았다.

telnet localhost 30000

 

동일하게 풀리는 것을 확인 할 수 있었다.

힌트를 확인해 보자 

The password for the next level is stored in /etc/bandit_pass/bandit14 and can only be read by user bandit14.

For this level, you don’t get the next password, but you get a private SSH key that can be used to log into the next level. Note: localhost is a hostname that refers to the machine you are working on

대충 해석해보면 현재레벨에서는 접근이 불가하니 ssh로 접속하여 해당 디렉토리( /etc/bandit_pass/bandit14  경로로 이동한 후 패스워드를 획득하라는 내용이다. 일단 로그인을 한번 해보았다.

 

뭔가 엄청나게 많은 문자가 보이는데 찾아봐야 할 것들이 RSA Private key와 sshkey.private인데  확인을 해보기로 했다.

 

SSH : 텔넷(Telnet)과 용도는 같지만, 보안이 강화원격 접속 서비스이다.

- SSH를 이용하여 원격 접속하면 서버와 클라이언트 사이에 데이터를 전송할 때 암호화를 하게 된다.

- RSA 등 암호화 기법을 사용하며, 압축 기술 또한 제공하고 있다.

- 리눅스에서는 openssh를 통해 SSH를 이용할 수 있다.

- 포트 번호는 22번이다.

 

RSA 공개키 암호

현재 SSL/TLS에 가장 많이 사용되는 공개키 암호화 알고리즘이다.

전세계 대부분의 인터넷 뱅킹(대한민국 포함)이 이 RSA-2048 암호화를 사용한다.

 

- 공개키는 누구나 아는 키이므로, A가 B에게 보낼 때 B의 공개키로 암호화하여 전송

- 이 때, B의 공개키로 암호화했기에 B의 비밀키로 복호화 가능
- 해커가 탈취해도 정보를 알 수 없음 (대칭키의 키값 교환 문제 해결)
- 해커가 파일 탈취하여 B의 공개키로 이상한 파일을 암호화하여 보낼 위험성 존재

 

그럼 우리가 알 수 있는 것은 개인키를 알고 있으니까 개인키를 이용해서 로그인을 하면 되지 않을까 생각해 볼 수 있다.

힌트에서는 localhost로 로그인을 하라고 했으니까 한번 ssh를 이용해서 로그인을 해보면 될거같다. 

ssh 옵션중에는 -i라는 옵션이있는데 이것은 원격에서 네트워크 상의 컴퓨터에 접속할 수 있다.

ssh 는 강력한 보안을 제공하기에 안전하지 못한, 개방된 네트워크에서도 안전하게 통신할 수 있다.

한번 접속을 해보았다 (지금은 그냥 22포트로 접속을하면 에러가 나오기 때문에 2220으로 접속을 해야한다.)

ssh -i sshkey.private bandit14@localhost -p 2220

 

yes를 입력하면 정상적으로 로그인이 된다.

로그인을 한 뒤에 힌트에서 말한 패스워드가 저장되어있는 디렉토리로 이동을 해보았다,

 

여기서 bandit14를 실행하면 되는데 먼저 열 수 있는 권한이 있는지 확인해보았다.

 

읽을 수 있는 권한이 있으니까 확인 후에 읽어보면 될 거 같다.

 

패스워드를 알 수 있었다. 

공개키 암호와 ssh 프로토콜을 잘 알아야 풀 수 있는 문제 같다.

힌트틀 확인해보면 

 

The password for the next level is stored in the file data.txt,

which is a hexdump of a file that has been repeatedly compressed.

For this level it may be useful to create a directory under /tmp in which you can work using mkdir.

For example: mkdir /tmp/myname123.

Then copy the datafile using cp, and rename it using mv (read the manpages!)

 

data.txt 파일안에 패스워드가 있기는 한데 Hex로 덤프가 되어있고, 여러번의 압축이되었다고 한다.

그리고 새로 디렉터리를 만든 다음 해당 디렉터리에 복사해서 문제를 푸는 것이 유용하다고 한다.

그럼 힌트의 취지의 맟춰서 문제를 풀어보았다.

 

일단 들어가면 data.txt가 보인다.

 

그리고 실행해보면 힌트에서 말 했듯이 hex로 덤프가 되어있다.

 

힌트의 의도대로 여기서 디렉터리를 새로 만든다음,  data.txt 파일을 복사를 해보았다.

mkdir /tmp/test_bandit12
cp data.txt /tmp/test_bandit12

 

그리고 hex로 덤프된 파일을 바이너리로 바꾸기 위해서 xxd 명령어를 사용하였다.

xxd -r data.txt data

 

data 파일이 만들어졌고,  분명히 힌트에서는 여러번의 압축이 진행되었다고 했다. 

그래서 압축의 여부를 확인하기 위해서 file 명령어로 해당 파일의 형식과 정보를 알아보았다.

 

gzip으로 압축이 되어있는 것을 볼 수 있다

gzip은 확장자가 .gz로 압축 되어있는 것을 합축 해제 할 수 있기 때문에 확장자를 data -> data.gz로 변경해야 된다.

mv data data.gz

 

확장자가 변경되었으니 압축을 풀어보도록 하겠다. (gzip은 압축해제를 할때  gunzip을 사용한다.)

gunzip -d data.gz

 

다시 압축이 해제 되었는데, 그럼 이대로 실행해도 되는지 아니면 여러번 압축이 되었는지 확인을 해 보았다.

 

이번엔 bzip2로 압축이 되었다. 그럼 해당 압축파일에 맟춰서 확장자를 또 변경해줘야 할 것이다. 

bzip2는 확장자가 .bz2인 압축파일을 해제 할 수 있다.

mv data data.dz2
bzip -d data.bz2

 

다시 해제가 되었는데 파일 형식을 다시 확인해 보았다.

 

이번엔 gzip으로 압축이 되어있었기에 전과 같이 확장자를 바꿔준 다음 해제 해주었다.

 

해제를 해보니 이번에는 tar로 압축이 된 파일이라서 tar로 확장자를 변경 후 해제를 하면 될 거 같다.

mv data data.tar
tar -xvf data.tar

 

압축을 해제 해보니 새로운 파일이 생성되었는데 data5.bin이라는 파일이 생성되었다. 

그럼 bin이라는 확장자는 무엇일까 찾아봐야 하는데 일단 file 명령어로 특징을 확인해보았다.

file data5.bin

 

전과 같이 tar로 압축이 되어있는 것을 확인했으니 전과 같이 tar로 압축된 파일을 해제 하면 될 것이다.

 

똑같이 새로운 파일이 생성되었는데, 전과 같이 계속 진행을 해보았다.

 

계속 진행하다보면 더이상 tar 압축이 풀리지가 않는데 파일을 확인 해 보았다.

file data.tar

 

이번에는 gzip으로 압축이 되어있다. 그래서 gunzip을 통해 압축을 해제 해 주었다.

mv data.tar data.gz
gunzip -d data.gz

 

압축해제를 진행해보니 이제는 압축이 되어있지 않고 text파일로 저장이 되어있는 것 같다. 

그래서 한번 cat으로 실행을 해 보았다.

 

압축풀기와 확장자 변경을 하는 방법에 대해서 숙지하는지 물어보는 문제인거 같다.

사실 지금 생각해보면 그냥 생 노가다였다. 

힌트가 무엇인지 보면 

 

The password for the next level is stored in the file data.txt, where all lowercase (a-z) and uppercase (A-Z) letters have been rotated by 13 positions

 

이말은 data.txt안의 있는 파일의 내용을 13자리 대소문자를 포함하여 뒤로 보낸다면 패스워드가 나온다는 말이다. 

그리고 힌트의 자세한 내용을 보면 아래와 같은 관련된 내용이 나온다.

 

https://en.wikipedia.org/wiki/ROT13

 

ROT13 - Wikipedia

From Wikipedia, the free encyclopedia Simple encryption method ROT13 ("rotate by 13 places", sometimes hyphenated ROT-13) is a simple letter substitution cipher that replaces a letter with the 13th letter after it in the latin alphabet. ROT13 is a special

en.wikipedia.org

 

ROT13 이란?

ROT13 라틴 알파벳 에서 문자를 그 뒤의 13번째 문자로 바꾸는 간단한 문자 암호 라고한다. 

어떻게보면 3자리 뒤의 문자로 치환되는 카이사르 암호와 비슷해보인다. 

그럼 문자열을 13자리 뒤로 보내기만 하면될 것이다.

 

이 부분 같은 경우 tr 명령어를 통해서 치환을 해주면 될 것 같다. 

cat data.txt | tr 'A-Za-z' 'N-ZA-Mn-za-m'

 

A는 ROT13을 사용하면 N이되기 때문에 대소문자를 포함하여 A~Z와 a~z를 치환을 해야 하기에 N부터Z까지 먼저 범위를

설정해주고, Z가 13자리 뒤로가면 M이 될 것이라서  A부터 M까지 범위를 설정했다.  

 

tr 명령어를 이용하여 문자를 치환하는 것이 문제의 관건 이었던 것 같다.

힌트를 확인해보면 

 

The password for the next level is stored in the file data.txt, which contains base64 encoded data

data.txt파일 안에 패스워드 정보가 저장이 되어있으나 base 64로 암호화가 되어있다.

그럼 이걸 복호화를 한 다음 실행하면 패스워드를 얻을 수 있을 거 같다. 

 

base 64로 인코딩이 되어있는것을 확인했으니 이걸 복호화를 하면 될거 같다.

base64 --decode data.txt

 

 

아주 쉽게 문제를 풀 수 있었다.

제일 먼저 힌트를 확인해보면 

The password for the next level is stored in the file data.txt in one of the few human-readable strings, preceded by several ‘=’ characters.

 

data.txt 파일에 저장되어있으며, 사람이 읽을 수 있는 파일이고 몇개의 '=' 문자가 있다고 한다. 

힌트를 확인했으니 접속을 해서 확인을 해본다.

 

이번에는 쉽게 읽을 수 없게 되어있는데 아스키코드가 아닌 코드들도 같이 섞여있는거 같다. 

그래서 cat을 사용하지 못하니 strings를 대신 사용하여 찾아내면 되지 않을까 한다.

그리고 힌트가 몇개의 = 문자열이 포함되어있다고 한다. 

그렇다면 data.txt 파일안의 몇개의 = 문자를 찾아서 확인해보면 될 것 같다. 

힌트 중에 또하나 유심히 볼 것은 사람이 읽을 수 있는 내용이라고 했으니 확인하면 볼 수 있을 것이다.

strings data.txt | grep '===='

 

 

= 문자가 포함된 것들만 출력을 해주는데 여기서 패스워드를 확인 할 수 있었다.

힌트를 확인해보자 

 

The password for the next level is stored in the file data.txt and is the only line of text that occurs only once

data.txt 1번만 실행되는 행이라고 한다. 

 

일단 접속을 해보자 

 

접속을 해서 확인을 해본 결과 여러가지 문자열이 막 나오는 것을 확인 할 수있다. 

하지만 힌트에서는 한번만 실행되는 문자열이라고 설명을 했으니 그럼 한번만 실행되는 행을 찾으면 될 것이다.

그래서 여기서는 sort와 uniq라는 명령어를 사용해 볼 수 있다. 

sort data.txt | uniq -u

 

sort 명령어로 정렬을 시켜준 다음 uniq -u로 중복되지 않은 행만 출력하게 해주면 된다. 

 

패스워드를 확인할 수 있었다. 

아니면 다른 방법도 있다. ( 조금 지저분 하지만)

sort data.txt | uniq -c

 

uniq 명령어에 옵션을 c 를 해주면  몇번 중복되었는지 갯수를 출력해준다.

 

 

이렇게도 확인 할 수 있으며 물론 둘다 패스워드 값은 동일한 결과를 볼 수 있다.

힌트를 확인해보자 

The password for the next level is stored in the file data.txt next to the word millionth

data.txt 안에 있는 millionth라는 문자열 옆에있는 문자가 패스워드라고 한다.

 

확인해보자 

 

data.txt가 있긴한데 이렇게 간단하게 풀 수있는 문제는 아닌거 같다. 

일단 data.txt의 내용을 확인해봐야 할 거 같다. 

cat data.txt

 

 

뭔가 굉장히 많은 문자들이 들어있는데 여기서 millionth 라는 문자열의 옆에 패스워드가 있다고 했으니, 

해당 파일내부에서 million이라는 문자열을 검색하면 되겠다.

grep -r millionth data.txt

 

이번 문제는 생각보다 간단했던 거 같다, 

grep 명령어를 알고 있고 사용할 줄 아는가에 대한 문제였던것 같다.

힌트를 확인해 보았다.

The password for the next level is stored somewhere on the server and has all of the following properties:

owned by user bandit7 // 유저이름이 bandit7

owned by group bandit6 // 그룹이름이 bandit 6

33 bytes in size // 파일크기가 33바이트

 

저번처럼 3가지의 조건들이 있는데 힌트대로 한번 찾아보기로 했다.

그렇다면 서버의 어딘가에 파일이 있다는 이야기인데 정확하게 어딘가에 있는지는 모른다.

하지만 서버의 어딘가에 있기때문에 최상위 디렉토리 안에 있을것이며 힌트를 참고해 검색을 하면 될것이다.

find / -user bandit7 -group bandit6 -size 33c

 

 

검색을 해봤지만 다른파일들 및 디렉터리들과 함께 Permission denied가 나오는데 권한이 없다는 뜻이다.

하지만  힌트에서는 어딘가 저장이되어있다고 했으니 접근하여 알아내면 된다는 뜻이다..

문제를 분석해보면 리눅스에서는 파일 디스크립터라는것이 있다 .

다른것들도 있지만, 대표적으로 이렇게 쓰인다.

 

stdin(표준입력) : 0

stdout(표준출력) : 1

stderr(표준에러) : 2

 

여기서 나오는 Permission denied는 표준에러이므로 해당 에러들을 다른곳으로 보낸다면?

/dev/null을 사용해서 오류를 null 공간에 리다이렉션을 해볼 수 있다.

/dev/null은 Null 공간으로 대부분 리눅스에서 오류를 보내면 오류를 출력하지 않을 것이다.

find / -user bandit7 -group bandit6	-size 33c 2>/dev/null

 

 

생각했던 방법대로 권한이 필요해서 접근을 하지 못했던 다른 디렉토리와 파일들 때문에 나왔던 오류들은 더 이상

나오지 않고 힌트를 참고해서 검색했던 파일의 경로가 보인다. 

해당 경로로 이동하여 파일의 유형을 확인 해보았다.

cd /var/lib/dpkg/info
file bandit7.password

 

아스키 코드로 만들어진 텍스트 파일이다. 

cat로 실행해보면 패스워드가 나온다.

 

해결!

+ Recent posts