목차 열기

티스토리 뷰

728x90
반응형

OverTheWire Bandit 공략

OverTheWire Bandit은 리눅스 완전 초보를 대상으로 하는 워게임이다. 리눅스를 사용하는데 있어 가장 필요한 기본 사항에 대해 배울 수 있다.

기본적인 진행은 https://overthewire.org/wargames/bandit 문서를 참조한다.

  • 문서 하단의 Commands you may need to solve this level 명령어 목록 링크를 통해, 명령어를 학습할 수 있다.
  • 단계(Level)는 로그인할 Username의 숫자로 구분된다. Level 5일 경우, Uername을 bandit5로 접속한다.
  • Putty, SSH 접속 등 기본적인 사항은 해당 글에서 다루지 않는다.
  • 해당 포스팅은 학습 기록용임을 염두에 두고 참고 정도만 한다.

Level 0

Host : bandit.labs.overthewire.org
Port : 2220
Username : bandit0
Password : bandit0

로그인이 잘 되었다면, bandit0 계정에서 로그인한 상태에서 다음 단계(0->1)로 진행한다.

Level 0 -> 1

home 디렉토리에 위치한 readme 파일에 비밀번호가 있다.
ls만으로도 readme 파일이 있다는 것을 확인할 수 있다.
cat은 concatenate의 약자로, 파일을 읽을 수 있다.

bandit0@bandit:~$ ls
readme
bandit0@bandit:~$ cat readme
NH2SXQwcBdpmTEzi3bvBHMM9H66vVXjL

긴 비밀번호를 선택한 뒤에, Enter를 누르거나 우클릭 메뉴로 복사할 수 있다. 붙여넣기는 우클릭이다.

명령어 ls

ls는 파일 정보에 관한 목록을 출력한다.
-a로 숨겨진 파일까지 표시할 수 있다. (파일명 앞에 .로 파일을 숨김)
-l로 목록 형식으로 출력할 수 있다.

Level 1 -> 2

bandit1 유저와, 이전 단계에서 얻은 비밀번호로 로그인한다.
- 파일에 비밀번호가 있다.
cat -로 입력시 파일이 읽어지지 않는데, -는 명령어 옵션에 사용되는 기호이기 때문이다.

다음의 두 가지 방법은 동일한 결과를 보여준다.

  1. cat > -
    • <은 Input Redirection으로, 사용자가 입력한 문자열이 아니라 파일로 입력한다는 뜻이다.
  2. cat ./- 현재 디렉토리를 나타내는 ./를 통해 현재 디렉토리의 - 파일을 읽을 수 있다.
    • ./ 현재의 디렉토리
    • / 최상위 디렉토리인 절대경로를 뜻한다.
    • ../ 현재의 상위 디렉토리
bandit1@bandit:~$ cat < -
rRGizSaX8Mk1RTb1CNQoXTcYZWU6lgzi
bandit1@bandit:~$ cat ./-
rRGizSaX8Mk1RTb1CNQoXTcYZWU6lgzi

Level 2 -> 3

파일명이 spaces in this filename이다.
cat spaces in this filename로 입력하게 된다면 spaces, in, this, filename 총 4개의 파일을 출력하려고 시도할 것이다.
따라서 다음의 두 가지 방법을 통해, 폴더명의 스페이스가 폴더명의 일부임을 명시할 필요가 있다.

  1. cat "spaces in this filename" 큰따옴표(") 혹은 작은따옴표(') 사용
  2. cat spaces\ in\ this\ filename 역슬래시() 사용
bandit2@bandit:~$ cat "spaces in this filename"
aBZ0W5EmUfAf7kHTQeOwd8bauFJ2lAiG
bandit2@bandit:~$ cat spaces\ in\ this\ filename
aBZ0W5EmUfAf7kHTQeOwd8bauFJ2lAiG

Level 3 -> 4

숨겨진 파일 .hidden은 inhere 디렉토리 내에 있다.
cd 명령어는 change directory의 약자로, 현재 경로를 바꿀 수 있다.
ls -al로 숨겨진 파일을 포함한 경로의 목록을 출력한다.

bandit3@bandit:~$ ls
inhere
bandit3@bandit:~$ cd inhere
bandit3@bandit:~/inhere$ ls -al
total 12
drwxr-xr-x 2 root    root    4096 Oct  5 06:19 .
drwxr-xr-x 3 root    root    4096 Oct  5 06:19 ..
-rw-r----- 1 bandit4 bandit3   33 Oct  5 06:19 .hidden
bandit3@bandit:~/inhere$ cat .hidden
2EW7BBsr6aMMoJ2HjW067dm8EgX26xNe

Level 4 -> 5

사람만 읽을 수 있는 파일이 inhere 디렉토리 내에 있다.
cat으로 하나하나 읽을 수도 있겠지만, 다른 명령어로 파일을 읽을 수 있다.
모든 파일을 뜻하는 *를 사용하여, 파일을 한개씩 확인할 수 있다.

  1. more 파일 내용을 화면 단위로 출력한다.

    • Enter로 한 줄씩 읽는다.
    • Space로 한 화면씩 읽는다.
  2. head 파일 내용을 행 단위로 출력한다.

    • 기본적으로 옵션을 입력하지 않으면, 10행까지의 내용을 출력한다.
bandit4@bandit:~/inhere$ more ./*

(...일부 생략...)

::::::::::::::
./-file06
::::::::::::::
G=1▒▒▒▒▒▒B׃▒"
             ▒▒▒W▒▒9ؽ5
::::::::::::::
./-file07
::::::::::::::
lrIWWI6bB37kxfiCQZqUdOIYfr6eEeqR
::::::::::::::
./-file08
::::::::::::::
▒▒▒K▒~▒+▒▒9"T▒▒▒Z$▒▒▒"▒r▒
▒

(...일부 생략...)
bandit4@bandit:~/inhere$ head ./*

(...일부 생략...)

==> ./-file07 <==
lrIWWI6bB37kxfiCQZqUdOIYfr6eEeqR

==> ./-file08 <==
▒▒▒K▒~▒+▒▒9"T▒▒▒Z$▒▒▒"▒r▒
▒

(...일부 생략...)

Level 5 -> 6

inhere 디렉토리 내의 어떤 폴더 안 파일에 비밀번호가 있다.
find 명령어를 통해 1033 byter인 파일을 찾을 수 있다.

bandit5@bandit:~/inhere$ find -size 1033c
./maybehere07/.file2
bandit5@bandit:~/inhere$ cat ./maybehere07/.file2
P4L4vucdmLnm8I7Vl7jG1ApGSfjYKqJU

명령어 find

-user 이름 해당 유저 소유의 파일을 찾는다.
-group 이름 해당 그룹 소유의 파일을 찾는다.
-perm 권한 해당 권한을 가진 파일을 찾는다.
- -perm 644 : rw-r--r--권한인 파일
- -perm +644 : 6 4 4 중 한 가지라도 만족하는 파일
- -perm -644 : 해당 권한 이상인 파일
-size 크기
단위는 숫자 뒤에 붙여서 사용한다.
바이트 c, 킬로바이트 k, 기가바이트 G 등을 붙인다.
- -size +1033c : 1033 바이트 이상의 파일
- -size -1033c : 1033 바이트 이하의 파일

Level 6 -> 7

find 명령어에서 경로를 입력하지 않으면, 현재 디렉토리를 기준으로 검색하기 때문에 검색되지 않는다.
서버 어딘가에 있는 비밀번호는 최상위 디렉토리 / 를 통해 검색한다.
... Permission denied로 알아보기 힘들다면, 명령어 끝에 2>/dev/null를 추가하여 거부된 파일에 대한 내용을 출력하지 않을 수 있다.

bandit6@bandit:~$ find -user bandit7 -group bandit6 -size 33c

bandit6@bandit:~$ find / -user bandit7 -group bandit6 -size 33c

(...일부 생략...)
find: ‘/run/user/11011’: Permission denied
find: ‘/run/user/11016’: Permission denied
(...일부 생략...)

bandit6@bandit:~$ find / -user bandit7 -group bandit6 -size 33c 2>/dev/null
/var/lib/dpkg/info/bandit7.password
bandit6@bandit:~$ cat /var/lib/dpkg/info/bandit7.password
z7WtoNQU2XfjmMtWA8u5rN4vzqu4v99S

Level 7 -> 8

data.txt 파일의 millionth 단어 다음에 비밀번호가 있다.

  1. vim data.txt 다음, /millionth로 찾기
  2. grep millionth data.txt 파일 내용 중 일부 찾기
bandit7@bandit:~$ grep millionth data.txt
millionth       TESKZC0XvTetK0S9xNwm25STk5iWrBvP

Level 8 -> 9

data.txt 파일에서 유일하게 중복되지 않는 값을 찾아야 한다. |는 파이프로, 왼쪽의 출력을 오른쪽의 입력으로 보내주는 연결 통로 역할을 한다고 한다. 즉, cat으로 읽은 내용을 sort 명령어로 보내 오름차순 정렬하고, uniq 명령어로 보내주는 것이다.

sort로 파일의 내용을 정렬한다. uniq -c 명령어를 통해, 중복 횟수를 계산할 수 있다.

bandit8@bandit:~$ cat data.txt
(...일부 생략...)
vwy1ljezuLueU0DgNTKf4ODgnSKmspJA
jL32h6jpv6GGSCRoDBAyECslrqkJQkm7
eNdwlpf6iBeQ3o11iHefoHd9GYKDTIfQ
tbwqIearQexlJbmkwluaaa7ZoPXLSuXe
uw9mhc4SblNVn8TcIR202ar0ejoUv1bX
WcJIGAlq3VP6b0d7uGzMEjv8awnJst1n
P8jd7Kr8GXVKTLhe1Y7cVYAARwh4lN4A
(...일부 생략...)

bandit8@bandit:~$ cat data.txt | sort
(...일부 생략...)
vwy1ljezuLueU0DgNTKf4ODgnSKmspJA
vwy1ljezuLueU0DgNTKf4ODgnSKmspJA
vwy1ljezuLueU0DgNTKf4ODgnSKmspJA
tbwqIearQexlJbmkwluaaa7ZoPXLSuXe
tbwqIearQexlJbmkwluaaa7ZoPXLSuXe
tbwqIearQexlJbmkwluaaa7ZoPXLSuXe
tbwqIearQexlJbmkwluaaa7ZoPXLSuXe
(...일부 생략...)

bandit8@bandit:~$ cat data.txt | sort | uniq -c
(...일부 생략...)
     10 drJxnp5fJxeVRYlCldsIEtrEEwBdyRIL
     10 eJZcdtHKg9jLpvpK9v31Fj1opqlA1A9k
      1 EN632PlfYiZbn3PhVK3XOGSlNInNE00t
     10 eNdwlpf6iBeQ3o11iHefoHd9GYKDTIfQ
     10 euIPhAiMI8n0DxPCbaAhJ9RTBO3fX4UE
(...일부 생략...)

Level 9 -> 10

  1. cat 명령어를 통해 파일을 읽으면, 읽을 수 없는 바이너리 파일임을 확인할 수 있다. 따라서 strings 명령어로 사람이 읽게끔 표시할 수 있다.

  2. grep 명령어와 정규식을 사용하여 파일을 검색해볼 수 있지만, Binary file data.txt matches라는 메시지와 작동하지 않는 것을 확인할 수 있다. 문자열로 인코딩된 파일이 아니기 때문인데, -a or --text 옵션을 통해 텍스트 파일로 읽어들일 수 있다.

방법 1
bandit9@bandit:~$ strings data.txt | grep ==*
(...일부 생략...)
========== passwordk^
Y=xW
t%=q
========== is

WX=DA
{TbJ;=l
[=lI
========== G7w8LIi6J3kTb8A7j9LgrywtEUlyyp6s
>8=6
=r=_
(...일부 생략...)



방법 2
bandit9@bandit:~$ grep ===* -a data.txt
(...일부 생략...)
|▒▒▒▒E▒C▒▒[▒qX2R^{X▒▒▒҉▒WH       fU▒▒B▒|▒▒▒▒▒▒▒j▒▒n▒c▒▒▒▒`▒▒yq▒▒ ▒▒▒▒▒▒▒▒▒▒E▒0▒Mhr▒Xw▒<Ͱ▒[       ▒N▒iޑ2KYl▒A▒▒▒)▒#pJ_▒)▒]▒PJoZP▒EW▒▒-"▒ְ▒▒D▒▒Yq5▒ ▒G^xu▒,-ҏ▒▒▒i▒o}2▒▒j▒▒Ֆ▒▒▒[:ˇ52▒▒)"     jh▒y▒========== G7w8LIi6J3kTb8A7j9LgrywtEUlyyp6s
(...일부 생략...)

Level 10 -> 11

data.txt는 base64 형식으로 인코딩되어 있다고 한다.
base64 명령어로 파일을 읽을 수 있다. -d or --decode로 파일을 디코드할 수 있다.

bandit10@bandit:~$ cat data.txt | base64 -d
The password is 6zPeziLdR2RKNdNYFNb6nVCKzphlXHBM

Level 11 -> 12

모든 대문자와 소문자는 문자열에서 13씩 이동한하였다고 한다. 카이사르 암호라고, 문자열을 특정한 수만큼 이동한 암호법을 ROT13이라고 한다. tr 명령어를 다음과 같이 사용하여 암호를 알아낼 수 있다.

bandit11@bandit:~$ cat data.txt
Gur cnffjbeq vf WIAOOSFzMjXXBC0KoSKBbJ8puQm5lIEi
bandit11@bandit:~$ cat data.txt | tr "A-Za-z" "N-ZA-Mn-za-m"
The password is JVNBBFSmZwKKOP0XbFXOoW8chDz5yVRv

Level 12 -> 13

data.txt 파일은 반복 압축을 통해 얻은 파일을 헥사코드로 바꾼 코드라고 한다.
/tmp/test 디렉토리에서 시도하는 것을 추천한다고 한다.
xxd -r 헥사덤프 파일을 바이너리 파일로 만든다.
mv 파일이름 새로운이름 파일이름을 변경한다.
file 파일의 종류를 확인할 수 있다.
gzip -d 파일이름 .gz 파일을 압축 해제한다.
zbip2 -d 파일이름 .bz2 파일을 압축 해제한다.
tar xvf 파일이름 하나로 합쳐진 파일을 각 파일로 나눈다.

bandit12@bandit:~$ ls
data.txt
bandit12@bandit:~$ mkdir /tmp/test33
bandit12@bandit:~$ cp data.txt /tmp/test33
bandit12@bandit:~$ cd /tmp/test33
bandit12@bandit:/tmp/test33$ xxd -r data.txt > text3.txt
bandit12@bandit:/tmp/test33$ file text3.txt
text3.txt: gzip compressed data, was "data2.bin", last modified: Thu Oct  5 06:19:20 2023, max compression, from Unix, original size modulo 2^32 573
bandit12@bandit:/tmp/test33$ mv text3.txt data3.bin.gz
bandit12@bandit:/tmp/test33$ gzip -d data3.bin.gz
bandit12@bandit:/tmp/test33$ ls
data3.bin  data.txt
bandit12@bandit:/tmp/test33$ mv data3.bin data3.bin.bz2
bandit12@bandit:/tmp/test33$ bzip2 -d data3.bin.bz2
bandit12@bandit:/tmp/test33$ ls
data3.bin  data.txt
bandit12@bandit:/tmp/test33$ file data3.bin
data3.bin: gzip compressed data, was "data4.bin", last modified: Thu Oct  5 06:19:20 2023, max compression, from Unix, original size modulo 2^32 20480
bandit12@bandit:/tmp/test33$ mv data3.bin data3.bin.gz
bandit12@bandit:/tmp/test33$ gzip -d data3.bin.gz
bandit12@bandit:/tmp/test33$ file data3.bin
data3.bin: POSIX tar archive (GNU)
bandit12@bandit:/tmp/test33$ mv data3.bin data3.bin.tar
bandit12@bandit:/tmp/test33$ tar xvf data3.bin.tar
data5.bin
bandit12@bandit:/tmp/test33$ file data5.bin
data5.bin: POSIX tar archive (GNU)
bandit12@bandit:/tmp/test33$ mv data5.bin data5.bin.tar
bandit12@bandit:/tmp/test33$ tar xvf data5.bin.tar
data6.bin
bandit12@bandit:/tmp/test33$ file data6.bin
data6.bin: bzip2 compressed data, block size = 900k
bandit12@bandit:/tmp/test33$ mv data6.bin data6.bin.bz2
bandit12@bandit:/tmp/test33$ bzip2 -d data6.bin.bz2
bandit12@bandit:/tmp/test33$ ls
data3.bin.tar  data5.bin.tar  data6.bin  data.txt
bandit12@bandit:/tmp/test33$ file data6.bin
data6.bin: POSIX tar archive (GNU)
bandit12@bandit:/tmp/test33$ tar xvf data6.bin
data8.bin
bandit12@bandit:/tmp/test33$ file data8.bin
data8.bin: gzip compressed data, was "data9.bin", last modified: Thu Oct  5 06:19:20 2023, max compression, from Unix, original size modulo 2^32 49
bandit12@bandit:/tmp/test33$ mv data8.bin data8.bin.gz
bandit12@bandit:/tmp/test33$ gzip -d data8.bin.gz
bandit12@bandit:/tmp/test33$ ls
data3.bin.tar  data5.bin.tar  data6.bin  data8.bin  data.txt
bandit12@bandit:/tmp/test33$ file data8.bin
data8.bin: ASCII text
bandit12@bandit:/tmp/test33$ cat data8.bin
The password is wbWdlBxEir4CaE8LaPhauuOo6pwRmrDw

지겹도록 압축파일이 나온다...

Level 13 -> 14

참고

[https://155734.tistory.com/m/51]

728x90
반응형
댓글
글 보관함
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Total
Today
Yesterday