티스토리 뷰
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 -
로 입력시 파일이 읽어지지 않는데, -
는 명령어 옵션에 사용되는 기호이기 때문이다.
다음의 두 가지 방법은 동일한 결과를 보여준다.
cat > -
<
은 Input Redirection으로, 사용자가 입력한 문자열이 아니라파일로 입력
한다는 뜻이다.
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개의 파일을 출력하려고 시도할 것이다.
따라서 다음의 두 가지 방법을 통해, 폴더명의 스페이스가 폴더명의 일부임을 명시할 필요가 있다.
cat "spaces in this filename"
큰따옴표(") 혹은 작은따옴표(') 사용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으로 하나하나 읽을 수도 있겠지만, 다른 명령어로 파일을 읽을 수 있다.
모든 파일을 뜻하는 *
를 사용하여, 파일을 한개씩 확인할 수 있다.
more
파일 내용을 화면 단위로 출력한다.- Enter로 한 줄씩 읽는다.
- Space로 한 화면씩 읽는다.
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
단어 다음에 비밀번호가 있다.
vim data.txt
다음,/millionth
로 찾기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
cat 명령어를 통해 파일을 읽으면, 읽을 수 없는 바이너리 파일임을 확인할 수 있다. 따라서 strings 명령어로 사람이 읽게끔 표시할 수 있다.
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
참고
'Server > Linux' 카테고리의 다른 글
[Ubuntu] 하드디스크 추가하고 자동으로 마운트하기 (0) | 2021.02.13 |
---|---|
Linux / INDEX (0) | 2021.01.30 |
[Linux] Let's encrypt로 HTTPS 구성하기! (0) | 2021.01.30 |
[Linux] Freenom 도메인을 업데이트(DDNS) 해보자 (0) | 2021.01.30 |
[Linux] Duck DNS로 IP 없이 접속하기! (0) | 2021.01.30 |
[Ubuntu] nginx로 리버스 프록시 구성하기 (0) | 2021.01.24 |
[Linux] 서버 전체 백업하기 / 복원하기 (0) | 2021.01.24 |