본문 바로가기

PORTFOLIO/BAND IT

BAND IT 10>11 ~ 19>20

Bandit 10 > 11

 

주어진 문제에서 비밀번호는 base64 encode data를 포함하고 있다고 했기 때문에 사용될 수 있는 명령어 목록에 있는 base64 명령어의 사용법을 man을 통해 알아보기로 했다. 

-d 옵션을 사용하면 암호를 풀 수 있었다.

 

위에서 알아본 옵션 -d를 사용하여 base64 -d data.txt 명령어를 입력해줬더니 쉽게 비밀번호를 얻을 수 있었다. 

 

그렇다면 base64는 무엇일까? 컴퓨터 분야에서 쓰이는 base64 8비트 이진 데이터(실행 파일이나 zip 파일 등)를 문자 코드에 영향을 받지 않는 공통 ASCII 영역의 문자들로만 이루어진 일련의 문자열로 바꾸는 인코딩 방식을 가리키는 개념이라고 한다. (출처 위키백과)

 

Bandit 11 > 12

본격적인 문제를 풀기 전 “rotate by 13”이라는 부분의 해석이 잘 되지 않았다. 파파고에 의하면 13바퀴의 회전이라고 하는데 대문자와 소문자가 13번 반복되는 건가 싶어 구글링을 해봤다.

 

Rotate by 13 (= ROT 13) : 영어 알파벳을 13 글자씩 밀어서 만드는 암호

예를 들어서 I LOVE YOU를 rot13으로 암호화하면 V가 되는 것이다. 위키백과에 의하면 rot13은 만들어진 지 얼마 안 있어 자동으로 복호화하는 기능을 지원했으며, 유닉스 계열 시스템들은 tr(transliterate의 약자)이라는 표준 유틸리티를 지원하기 때문에 다음과 같은 방법으로 ROT13 암호화 및 복호화를 할 수 있다고 한다.

$ echo “Or fher hb qevax lbhe Binygvar” | tr a-zA-Z n-za-mN-ZA-M 

Be sure to drink your Ovaltine

 

$ man 명령어를 이용하여 처음 보는 명령어들(bzip2, tar, tr )의 사용법을 알아보던 중, 아까 rot13을 구글링 하다 찾았던 tr 명령어의 사용법에 대해서도 자세히 알아볼 수 있었다. 

 

$ cat tr 명령어를 이용하여 data.txt 파일을 번역했더니 비밀번호를 얻을 수 있었다.

 

Bandit 12 > 13

문제에서는 data.txt hexdump 파일이기 때문에 tmp 파일 아래에 디렉터리를 만들어서 문제를 푸는 것이 수월할 것이라 했다. 디렉터리를 만들기 전에 hexdump 파일이 무엇인지에 대해 먼저 알아보기로 했다.

Hexdump file : 파일이나 저장장치에 있는 컴퓨터 데이터의 16진법 보임새. Hex dump에서 각 바이트는 2 숫자의 16진법 수로 표현된다. Hex dumps는 주로 8 또는 16바이트의 행으로 조직되며 가끔은 흰 공간으로 분리된다. 비록 이름은 16 기반 출력을 암시하지만 몇몇 소프트웨어는 8 기반이나 10 기반 출력도 갖는다. 이 프로그램 기능을 갖는 흔한 이름으로, hexdump, od, xxd 등이 있다. (출처 : 위키백과)

 

위의 설명은 장황하지만 한 문장으로 정리하자면 data.txt 파일은 16진법 보임새이기 때문에 우리가 읽을 수 없다는 말 같았다. 사용할 수 있는 명령어 목록에 xxd 명령어도 있었기 때문에 man을 사용하여 xxd 명령어에 대해 알아보기로 했다.

옵션 목록에서 -r을 발견했는데, -r 옵션을 사용하면 hexdump binary(2진수)로 변환시켜 주는 것 같았다. 

다시 문제로 넘어와 tmp 아래에 siyeon이라는 디렉터리를 만들어줬다.

Cp를 이용하여 홈 디렉터리의 data.txt 파일을 복사해와서 문제를 해결하라고 했기 때문에 cp명령어를 통해 파일을 복사하고 복사한 data.txt의 파일 형태에 대해 file을 사용하여 알아봤다. 아스키 텍스트였다. 아까 알아본 xxd -r 명령어를 통해 2진수로 변환해주면 비밀번호를 찾을 수 있을 것 같아 xxd -r을 입력했으나 내용은 cat data.txt의 결과와 똑같았고 읽을 수 없었다.

알아보니 xxd -r data.txt처럼 입력할 경우 2진수로 바뀌기는 하지만, 바뀐 내용이 저장되는 것은 아니라서 새로운 파일로 저장해줘야 했다. 새로운 파일 passwd에 data.txt 2진수 내용을 저장하길 했다.

바로 cat을 통해 열어보려고 했으나 passwd 파일은 gzip 파일이기 때문에 바로 열 수가 없었다. Mv 명령어를 이용하여 passwd의 이름을 passwd.gz로 바꿔준 후 gzip -d를 통해 압축을 해제했다.

압축을 해제한 후, 혹시 몰라서 file 명령어로 gzip압축이 풀린 passwd의 파일 형태를 확인했다. 역시나 처음 보는 bzip2 형태를 띠고 있었고, bzip2의 압축도 풀어줘야 했다.

압축을 풀어줬더니 이번에는 tar 파일이었다. 다시 인내심을 가지고 tar -xvf를 사용하여 압축을 풀어줬다. Data5.bin이라는 파일이 나왔고 file 명령어로 확인해줬더니 이 친구도 tar 파일이었다. Mv를 통해 tar 압축을 풀 수 있는 이름으로 바꿔주고 압축을 풀어주니까 data6.bin 파일이 나왔다. 얘는 다시 bzip2 파일^^… mv 명령어 사용해서 이름 바꾸고 또 압축 풀어줬다. 압축 푸니까 tar 파일이어서 mv 이용해서 data7.tar로 이름 바꿨어요

그 뒤로도 몇 번 압축 풀고 이름 바꾸고를 반복하다 보니까 드디어 ASCII text라는 파일이 나와서 읽어줬다. 드디어 비밀번호를 얻을 수 있었다.

 

Bandit 13 > 14

비밀번호가 들어있는 파일은 bandit14의 권한으로 접속을 해야 알 수 있었다. 처음에 bandit에 접속할 때 band0 권한으로 접속했던 것을 떠올리며 ssh 명령어에 대해 자세히 알아보기로 했다.

옵션 중 -i옵션을 선택하고 ~/./뒤에 ssh아이디@호스트 주소를 입력하면 됐다.

 

입력을 했더니 현재 권한이 bandit 14로 바뀐 것을 확인할 수 있었다.

문제에서 비밀번호가 들어있다는 경로의 파일로 들어가 보자.

비밀번호 얻기 성공!

 

Bandit 14 > 15

Man을 이용하여 새로운 명령어를 알아보던 중 nc 명령어에서 포트를 옮기는 방법을 발견할 수 있었다. Nc [호스트] [포트]를 입력하면 됐는데, 포트를 30000으로 옮기면 비밀번호를 얻을 수 있다는 문제를 보고 nc명령어를 사용해서 localhost 30000에 접속을 시도했다. 아무것도 안 나와서 엔터를 눌렀더니 잘못된 비밀번호라는 말이 떴다. 비밀번호?... 현재 권한은 bandit14니까 전 단계에서 가져왔던 비밀번호를 말하는 건가 싶어서 bandit14 파일로 들어가 비밀번호를 복사한 후 다시 nc명령어를 입력하고 이번에는 엔터 대신 비밀번호를 입력해줬다. 성공적으로 비밀번호를 얻을 수 있었다.

 

Bandit 15 > 16

포트 30001에 ssl encryption을 이용하여 접속해야 한다. 사용할지도 모를 명령어에 처음 보는 openssl 명령어가 있길래 man을 통해서 사용방법을 알아봤다. 

$openssl 명령어의 형태는 openssl command [command opts] [command args] 형태인데 command에 위의 s_client를 넣어주면 SSL/TLS를 사용하는 원격 호스트에 접속하기 위한 클라이언트를 구현할 수 있다. localhost:30001에 접속해야 하기 때문에 -connect 옵션을 사용하여 새로운 포트에 접속해줬다.

뭔가 아주 길게 나온다.

무언가를 입력해야 하는 칸이 나와서 일단 엔터 키를 눌렀다. 올바른 비밀번호를 입력하라는 것으로 봐서 bandit 15의 비밀번호를 입력해봤다.

새로운 비밀번호를 얻었다.

 

Bandit 16 > 17

새로운 명령어 nmap에 대해 알아보기 위해 man을 사용했다.

$nmap은 지정된 범위를 스캔할 수 있는 명령어였고, 16번 문제에서 나는 포트 31000부터 32000 범위를 스캔해야 했기 때문에 nmap과 포트 옵션 -p를 이용하기로 했다.

$nmap 명령어를 이용하여 로컬 호스트를 갖는 범위 내 포트를 스캔했더니 두 개의 포트가 나왔다.

첫 번째 포트 31518 openssl s_client 명령어를 사용해 접속했다. 또 무언가를 입력해야 하는 칸이 나와서 비밀번호를 입력하고 엔터 키를 눌렀으나, 다음 단계로 진행되지 않고 입력한 줄이 한 번 더 출력됐다. 이 포트는 아닌 것 같은 느낌이 들어 31790 포트로 이동했다.

두 번째 포트에 들어갔더니 인증 코드가 출력됐다. 레벨 13에서 이용한 것처럼, tmp폴더 아래에 새로운 폴더를 만들고 인증서를 복사해준 뒤, 다음 레벨 권한을 얻기로 했다.

 

 

 

인증서를 복사한 뒤 ssh -i를 이용하여 17에 접속하려고 했으나 너무 많은 사용자들에게 오픈되어 있다는 알림이 나왔다. 해당 파일의 소유자를 제외하고 나머지 사용자에게는 권한을 주지 않기 위해 chmod를 사용하여 권한을 600으로 바꿔줬다.

하지만, band17의 비밀번호 없이 권한을 얻고자 했던 나에게 17의 비밀번호를 요구했고 레벨 16의 비밀번호를 입력하면 될 거라고 생각했던 나는 약 30분 동안 헤맸다.

처음부터 차근차근 다시 해보던 중에 vim vi 편집기를 이용하여 복사한 인증서를 파일로 만들 경우 위의 사진처럼 빨간색으로 뜨는 경고를 받았다. Vim, vi 편집기를 사용하면 안 될 것 같다는 생각이 들어 다른 편집기를 알아보던 중 nano 편집기를 사용해보기로 했다.

 

 

나노 편집기를 이용해 복사한 인증서를 파일로 만들어 저장하고 ssh -I를 이용하여 ($ssh -I /tmp/siyeon/16 key bandit17@localhost를 입력했음) bandit17의 권한을 얻는 명령어를 적었더니 성공적으로 bandit17로 권한이 옮겨진 것을 확인할 수 있었다. 비밀번호 없이 권한을 얻었기 때문에 bandit17의 비밀번호를 확인하기 위해 전 레벨에서 얻었던 방식으로, etc/bandit_pass 디렉터리에 들어간 후 레벨에 해당하는 비밀번호를 cat을 통해 가져왔다.

 

Bandit 17 > 18

사용할 수 있는 명령어 목록에서 diff라는 명령어를 처음 봤다. $man diff를 통해서 사용방법과 기본 형태를 알아보니까, diff [파일 1] [파일 2]를 입력하면 파일 1과 파일 2 사이에서 달라지는 부분을 찾아주는 명령어였다. 문제에서 passwords.new와 passwords.old 사이에는 한 줄만 다르다고 했기 때문에 diff명령어를 사용해 비교했다. 결과로 비밀번호처럼 보이는 두 줄의 문자열이 나왔는데 passwords.new를 파일 2의 자리에 입력했기 때문에 두 번째 줄의 문자열이 비밀 번호라 생각했고, 다음 레벨에 접속할 때, byebye를 볼 수 있었기 때문에 내 추측은 맞았다.

 

Bandit 18 > 19

Bandit 18에 접속하여 비밀번호를 입력하면 byebye! 문장이 보임과 함께 접속이 거절당했다. 그 이유는 문제에서 설명한 것처럼. bashrc파일이 내 접속을 막고 있었기 때문인데, 나는 이미 비밀번호가 들어있는 파일의 위치와 이름을 알고 있으므로. bashrc파일이 실행되기 전에 비밀번호를 읽는 명령어를 실행하면 될 것 같다는 생각이 들었다.

일반 접속 방법과 똑같았지만 뒤에 cat 명령어를 통해 readme 파일을 접속이 거절당하기 전에 미리 읽어보기로 했다.

저 명령어를 입력하면 바로 비밀번호가 나올 줄 알았으나, 앞서 거절당했던 것처럼 비밀번호를 입력하라는 문장이 나왔고, 다른 방법을 찾아봐야겠다고 생각하며 비밀번호를 입력한 순간, byebye 대신 비밀번호를 얻을 수 있었다.

Bandit 19 > 20

Setuid를 이용하여 해결하는 문제였다. Setuid는 ftz를 할 때도 접한 적이 있어서 대충 무엇인지는 알고 있었지만, 조금 더 확실하게 알고자 구글링을 해보기로 했다.

 

Setuid : SET User ID upon execution의 약자로서, 실행 파일의 소유자 권한으로만 파일을 실행시킬 수 있는 unix계열의 액세스 권한 플래그 (출처 : 위키백과)

$ ls 명령어를 이용하여 bandit19 홈 디렉터리의 속 내용들을 확인해봤다. 문제의 설명과 같이 bandit20-do가 적힌 실행파일이 있었고, setuid 바이너리를 이용하라고 때문에 ls -al 명령어를 통해 접근 권한을 먼저 살펴봤다. 

R는 읽기, W는 쓰기, X는 실행의 의미를 가지고 있음을 알고 있었으나 bandit20-do 파일에는 x 또는 -가 있어야 할 자리에 s 권한이 있었다. 검색을 통해 알아보니 바로 이것(실행 권한의 자리에 s가 있는 것)이 SetUID라고 한다. 시스템의 어떠한 계정이라도 SetUID 파일을 실행하는 동안에는 소유주(root)의 권한을 갖고 종료되면 다시 사용자의 권한으로 돌아오는 것이다. 위의 파일은 SetUID파일로서, 실행 동안에는 band20의 권한을 갖기 때문에 ‘./’를 사용하여 파일을 실행시켜봤다. 다른 소유주로서 명령을 실행시키라는 문장과 함께 예시가 출력됐다. 무슨 명령어를 어떻게 쳐야 할지 몰라서 예시가 제시해준 대로 실행시켜 봤다. Id 정보가 출력되는 것으로 보아 id 자리에 내가 명령할 명령문을 적어주면 될 것 같아서 그 자리에 cat 명령어를 입력했다.

'PORTFOLIO > BAND IT' 카테고리의 다른 글

BAND IT 20>21 ~ 25>26  (0) 2019.05.19
BAND IT 00~ 09>10  (0) 2019.05.19