[wargame] overthewire bandit Full
리눅스 워게임 중 하나인 overthewire의 bandit
overthewire의 워 게임은
- Bandit
- Leviathan or Natas or Krypton
- Narnia
- Behemoth
- Utumno
- Maze
- Vortex
- Manpage
- Drifter
- FormulaOne
이 있고 그 중 이 페이지에서는 bandit을 다룰 것이다.
bandit 모음집
2024-02-01에 시작해서 2024-08-31에 완성하였으며 bandit16-34까지 비밀번호는 최신일 수 있으나 나머지는 다를 수 있음
Over The Wire : Bandit 목차
</br>
[wargame] overthewire bandit : 전체 과정
[wargame] overthewire bandit : 시작 (0 -> 0)
[wargame] overthewire bandit : 파일 읽기 (0 -> 1)
[wargame] overthewire bandit : 파일 읽기 (1 -> 2)
[wargame] overthewire bandit : 파일 읽기 (2 -> 3)
[wargame] overthewire bandit : 파일 읽기 (3 -> 4)
[wargame] overthewire bandit : 파일 읽기 (4 -> 5)
[wargame] overthewire bandit : 파일 읽기 (5 -> 6)
[wargame] overthewire bandit : 파일 읽기 (6 -> 7)
[wargame] overthewire bandit : 특정 글자 찾기 (7 -> 8)
[wargame] overthewire bandit : 특정 글자 찾기 (8 -> 9)
[wargame] overthewire bandit : 특정 글자 찾기 (9 -> 10)
[wargame] overthewire bandit : 데이터 변환 (10 -> 11)
[wargame] overthewire bandit : 데이터 변환 (11 -> 12)
[wargame] overthewire bandit : 데이터 변환 (12 -> 13)
[wargame] overthewire bandit : 네트워크 연결 (13 -> 14)
[wargame] overthewire bandit : 네트워크 연결 (14 -> 15)
[wargame] overthewire bandit : 네트워크 연결 (15 -> 16)
[wargame] overthewire bandit : 네트워크 연결 (16 -> 17)
[wargame] overthewire bandit : 네트워크 연결 (17 -> 18)
[wargame] overthewire bandit : 네트워크 연결 (18 -> 19)
[wargame] overthewire bandit : setuid (19 -> 20)
[wargame] overthewire bandit : setuid (20 -> 21)
[wargame] overthewire bandit : cron (21 -> 22)
[wargame] overthewire bandit : cron (22 -> 23)
[wargame] overthewire bandit : cron (23 -> 24)
[wargame] overthewire bandit : 쉘 스크립트 (24 -> 25)
[wargame] overthewire bandit : 쉘 안에 쉘 (25 -> 26)
[wargame] overthewire bandit : setuid (26 -> 27)
[wargame] overthewire bandit : git (27 -> 28)
[wargame] overthewire bandit : git (28 -> 29)
[wargame] overthewire bandit : git (29 -> 30)
[wargame] overthewire bandit : git (30 -> 31)
[wargame] overthewire bandit : git (31 -> 32)
Bandit Information (bandit 소개)
음… 한글로 번역해서 만들어봤는데 아무래도 가독성이 좋지 않으니 영어를 직접 해석하며 읽어보길 바란다. 컴퓨터와 영어는 땔 수 없는 관계인만큼 이렇게 틈틈이 공부하면 좋지 않을까?
bandit 접속
bandit을 접속하기 위해서는 ssh로 접속해야하며 shell로도 접속이 가능하지만 보통 putty나 termius를 사용하는 편이다. 나도 최근까지는 putty를 사용하고 있었지만 termius의 ui가 훨씬 더 보기 좋아 termius로 옮겼다. 아 참고로 나는 “Dracula” 테마를 사용하고 있다.
처음 프로그램을 키게 되면 이런 화면이 보일 텐데 Group과 Hosts는 내가 몇가지 이미 만들어놔서 그런 것이니 이 화면에서 NEW HOST를 누르면 된다.
위에서 부터 설명하자면
- Address : 우리가 접속할 IP 혹은 Hostname
- Label : (아직 이게 무엇인지 이해하지 못해 나는 flag저장용으로 쓰는 중이다.)
- Parent Group : 하나의 Group을 만들어 SSH Port를 저장해 놓았다가 사용할 수 있게 할 수 있다.
- Tags : 테그를 지정해 줄 수 있다.
- SSH on <> port : 접속할 Adress의 접속할 수 있는 port이다.
- Username : 접속할 username
- Password : 접속할 user의 password
일단 bandit을 하는 동안 사용할 것들은 이정도라고 생각한다. 고로 우리가 적어야 할 것들은
이정도 되시겠다
Host: bandit.labs.overthewire.org
Port: 2220
Bandit Level 0
목표
이 레벨의 목표는 SSH를 사용하여 게임에 로그인하는 것입니다. 연결해야 하는 호스트는 포트 2220의 bandit.labs.overthewire.org 입니다. 사용자 이름은 bandit0이고 비밀번호는 bandit0입니다. 로그인이 완료되면 Level 1 페이지로 이동하여 Level 1을 이기는 방법을 알아보세요.
풀이
접속했다면 Level 0는 해결이다! 그럼 여기서 무엇을 찾아야할지 Level 0 -> Level 1 페이지로 가서 확인해보자!
Bandit Level 0 -> Level 1
목표
다음 레벨의 비밀번호는 home 디렉토리에 위치한 readme 라는 파일에 저장됩니다. 이 비밀번호를 사용하여 SSH로 bandit1에 로그인합니다. 레벨의 비밀번호를 찾을 때마다 SSH(2220 포트)를 사용하여 해당 레벨에 로그인하고 게임을 계속 진행합니다.
풀이
현재 본인이 어떤 디렉토리에 있는지 확인하기 위해
pwd
명령어를 써주자.그 후
ls
명령어를 이용하여 어떤 파일들이 있는지 확인해보자.아마
readme
파일이 존재할 것이다.존재하지 않는다면 현재 디렉토리가 home이 아닐테니
pwd
명령어를 사용하여 확인해보자.readme
파일은 명령어로 읽어보기 위해서는cat
명령어를 사용한다.여기서 잠시 명령어들의 유래를 이야기해보자 아무래도 나는 이러는 편이 기억하는데 도움이 되었다.
pwd
명령어는print working directory
현재 일하고 있는 디렉토리 라는 의미이다.ls
명령어는list directory contents
디렉토리안에 있는 디렉토리 및 파일 리스트를 출력한다.cat
명령어는concatenate
는연결하다
라는 뜻을 가지고 있는데 본래의 기능은 여러 파일의 내용을 하나로 합쳐주는 역할을 하지만 이번에 사용한 것처럼 파일의 내용을 단순 출력하여 확인하거나,>
이나>>
같은 기호와 함께 사용하여 파일을 생성하고, 저장하는 용도로도 사용될 수 있다고 한다.
여기 아래 보이는 NH2SXQwcBdpmTEzi3bvBHMM9H66vVXjL
이 바로 다음 게임의 비밀번호가 된다!
Bandit Level 1 -> Level 2
user_id : bandit1
password : NH2SXQwcBdpmTEzi3bvBHMM9H66vVXjL (언제든 바뀔 수 있다.)
목표
다음 레벨의 비밀번호는 home 디렉토리의 -
라는 이름을 가진 파일에 있다.
찾아보면 좋을 것들 :
- 구글에
- 이름을 가진 파일
이라고 검색해보세요 - (Advanced Bash-scripting Guide - Chapter 3 - Special Characters)[http://tldp.org/LDP/abs/html/special-chars.html]
풀이
pwd
명령어로 현재 위치를 보니 home 디렉토리이다.ls
명령어로 리스트를 확인해보니-
라는 파일이 있다.cat -
로 열어봐도 아무것도 나오지 않는다. 이럴 때에는ctrl+c
혹은^c
로 빠져나올 수 있다.-
라는 문자가 리눅스에서 예약된 즉 약속된 특수문자라file
,cat
에서 인자로 넘겨받지 못한다. 고로 현재 경로에 있는 파일을 뜻하는./
를 사용하기로 하자.file ./-
명령어를 통해 어떤 형식의 파일인지 읽어보자. ASCII(아스키코드) text 파일이라고 한다.cat ./-
명령어로 파일 내용을 출력해보자.
찾았다! rRGizSaX8Mk1RTb1CNQoXTcYZWU6lgzi
Bandit Level 2 -> Level 3
user_id : bandit2
password : rRGizSaX8Mk1RTb1CNQoXTcYZWU6lgzi
목표
다음 레벨의 비밀번호는 home 디렉토리
의 spaces in this filename
에 담겨있습니다.
풀이
home 디렉토리
에서ls
명령어를 쳐보면 목표에서 알려주듯spaces in this filename
이라는 파일이 있다.띄어쓰기가 되어있는 파일을 읽을 때에는
''
로 파일을 감싸주면 된다.
비밀번호는 aBZ0W5EmUfAf7kHTQeOwd8bauFJ2lAiG
이다!
Bandit Level 3 -> Level 4
user_id : bandit3
password : aBZ0W5EmUfAf7kHTQeOwd8bauFJ2lAiG
목표
다음 레벨로 가는 비밀번호는 inhere 딕셔너리 안에 숨겨진 파일 안에 있습니다.
풀이
home 디렉토리
의inhere 딕셔너리
로 들어가 보았을 때ls
명령어를 사용해 보면 아무 파일도 보이지 않는다.목표에서 말했듯
inhere 딕셔너리
에 숨겨진 파일이라고 하니ls -al
명령어를 사용하여 모든 파일 보기를 하자.ls
명령어의 옵션 중 하나인ls -a
는 모든 파일을 보는 옵션이고ls -l
명령어는 파일이 만들어진 시간을 볼 수 있게 해주는 옵션이다. 그리고 그 둘을 합친 옵션이ls -al
이다. 이번 문제를 해결하기 위해서ls -a
만 해줘도 된다.
숨겨져 있는 비밀번호는 2EW7BBsr6aMMoJ2HjW067dm8EgX26xNe이다
.
Bandit Level 4 -> Level 5
user_id : bandit4
password : 2EW7BBsr6aMMoJ2HjW067dm8EgX26xNe
목표
다음 레벨로 가는 비밀번호는 inhere 딕셔너리
의 “인간이 읽을 수 있는” 파일로 저장되어있습니다.
Tip: 터미널이 더러워졌다면, reset
명령어를 사용하세요!
(저는 reset
보다는 clear
를 사용하는 편이랍니다!)
reset
명령어는 말 그대로 모두 원래대로 되돌리는 기능이고clear
명령어는 터미널의 화면을 깨끗이 지우는 차이가 있다.
풀이
home 디렉토리
안에inhere 디렉토리
가 있고 그 안에는-file\*
파일들이 10개가 있다.- 물론 이 파일들을 직접 열어보며 읽을 수 있나 없나 확인 할 수도 있겠지만
file
명령어를 이용해서 찾아보기로 하자 - file ./* 명령어에서 ./* 부분은 파일 안에 있는 모든 파일의 정보를 볼 수 있게해준다.
- 찾아보니 ./-file06번 파일이 “ASCII text” 로 되어있다고 한다.
cat
명령어로 비밀번호를 찾았다!lrIWWI6bB37kxfiCQZqUdOIYfr6eEeqR
Bandit Level 5 -> Level 6
user_id : bandit5
password : lrIWWI6bB37kxfiCQZqUdOIYfr6eEeqR
목표
다음 레벨로 가는 비밀번호는 inhere 디렉토리의 다음 조건을 충족하는 사항을 가지고 있다.
- 사람이 읽을 수 있다.
- 1033 byte의 크기를 가지고 있다.
- 실행파일이 아니다
해결법
- inhere 딕셔너리에서
ls
명령어를 쳐보자.
1
2
3
4
5
6
7
bandit5@bandit:~/inhere$ ls -a
. maybehere04 maybehere10 maybehere16
.. maybehere05 maybehere11 maybehere17
maybehere00 maybehere06 maybehere12 maybehere18
maybehere01 maybehere07 maybehere13 maybehere19
maybehere02 maybehere08 maybehere14
maybehere03 maybehere09 maybehere15
어우 하나하나 찾기에는 역시 조건을 준 이유가 있었다.
- 그렇다면 이번에는 ‘find’ 명령어를 사용하기로 하자
- “find . -size 1033c” 명령어를 이용하여 1033 byte의 크기를 가진 파일을 찾아낼 수 있다.
1
2
bandit5@bandit:~/inhere$ find . -size 1033c
./maybehere07/.file2
cat
명령어를 이용하여./maybehere07/.file2
파일을 읽어보면 비밀번호를 찾을 수 있다!
찾았다! : P4L4vucdmLnm8I7Vl7jG1ApGSfjYKqJU
Bandit Level 6 -> Level 7
user_id : bandit6
password : P4L4vucdmLnm8I7Vl7jG1ApGSfjYKqJU
목표
다음 레벨로 가는 비밀번호는 다음 조건을 충족시키며 서버의 어딘가에 있다.
- bandit7 유저가 가지고 있다.
- bandit6 그룹에 있다.
33 byte의 크기를 가지고 있다.
- user == bandit7
- group == bandit6
- size == 33 byte
음… 지금까지랑은 다르게 서버의 어딘가에 있다고 한다.
해결법
힌트에서 준 대로 find 명령어를 이용하여 비밀번호를 찾아가보자.
1
bandit6@bandit:~$ find / -user bandit7 -group bandit6 -size 33c
결과를 보기 전 잠시 옵션들에 관해 알아보자.
/
는 서버에서 최상위 경로를 의미한다. 시스템 전부를 토대로 찾겠다는 의미이다.-user
는 파일의 소유자(user)를 찾는다.-group
은 파일이 속한 그룹을 찾습니다.-size
는 Level 5-6에서 사용했던 것처럼 파일의 사이즈를 찾습니다. 그 중c
는bytes
를 의미합니다.
어..음.. 결과가 너무 많이 나왔다. 그것도 그중 “Permission denied” 즉 접근 권한 없음 에러가 매우 많이 나왔다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
find: ‘/etc/ssl/private’: Permission denied
find: ‘/etc/polkit-1/localauthority’: Permission denied
find: ‘/etc/sudoers.d’: Permission denied
find: ‘/etc/multipath’: Permission denied
find: ‘/root’: Permission denied
find: ‘/var/lib/update-notifier/package-data-downloads/partial’: Permission denied
find: ‘/var/lib/amazon’: Permission denied
/var/lib/dpkg/info/bandit7.password
find: ‘/var/log’: Permission denied
find: ‘/var/cache/private’: Permission denied
--중략--
find: ‘/run/systemd/propagate’: Permission denied
find: ‘/run/systemd/unit-root’: Permission denied
find: ‘/run/systemd/inaccessible/dir’: Permission denied
find: ‘/run/lock/lvm’: Permission denied
이 긴 결과를 읽다보면 중간에 /var/lib/dpkg/info/bandit7.password
라는 파일에 접근이 가능하다는 결과를 볼 수 있다.
하지만 우리는 좀 더 명령어를 이용하여 깔끔하고 빠른 방법으로 찾아보도록 하자.
위 문제를 해결하기 위해 우리는 File Descriptor
라는 것에 대해 잠시 알아보자.
파일 디스크립터(File Descriptor)란 리눅스 혹은 유닉스 계열의 시스템 프로세스가 파일을 다룰 때 사용하는 개념으로 파일에 접근할 때 할당되는 값이다. 그 값들의 뜻은 다음과 같다.
- 0 : 표준 입력 ,
Standard Input
- 1 : 표준 출력 ,
Standard Output
- 2 : 표준 에러 ,
Standard Error
이제 우리는 오류 즉 Permission denied
가 어떤 값을 가지게 되는지 알았고(2
), 그럼 이 오류가 출력되지 않게 하려면 어떻게 할 지에 관해 생각해보자.
I/O Redirection
직역하자면 Input/Output의 재방향화이다. 입력과 출력의 방향을 바꿔 모니터 출력이 아닌 파일에 저장하거나 파일을 출력하는 뱡향을 바꾸는 식으로 사용할 수 있다. 나중에 이것에 관해 좀 더 깊게 다뤄봐야 할 듯 하지만 일단 간단히 적어보자면.
- A > B : A의 결과를 B로
보낸(저장)
다. - A » B : A의 결과를 B의 데이터에
추가
한다. - A < B : B의 데이터를 A에
입력
한다.
그렇다면 우리는 File Descriptor
를 통해 2
번인 것을 알았고, Redirection
을 통해 그 출력을 다른 어딘가로 보낼 수 있다는 것을 알았다.
그렇다면 이번엔 리눅스의 블랙홀
이라고 불리는 곳으로 오류들을 보내버리면! 우리가 원하는 값들을 얻을 수 있을 것이다.
/dev/null
: 리눅스의 블랙홀 이라고도 불리는 이곳은 경로에 나와 있듯null
값을 가져 아무것도 남지 않는 공간이다.
2 > /dev/null
: 표준에러를/dev/null
로!
그럼 이제야말로 정말 비밀번호를 찾아내보자.
1
2
3
4
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
비밀번호 : z7WtoNQU2XfjmMtWA8u5rN4vzqu4v99S
사실 난 리눅스에 관한 지식, 명령어에 관한 지식 없이 시작하였기에 여기저기 수많은 블로그들을 참고하여 작성하고 있는 중이다. 아마 이미 이러한 지식을 알고있는 사람이라면 여기까지 매우 쉽게 도달했을 것이라 생각한다! 차근차근 나아가자! :D
Bandit Level 7 -> Level 8
user_id : bandit7
password : z7WtoNQU2XfjmMtWA8u5rN4vzqu4v99S
목표
다음 레벨로 가는 비밀번호는 data.txt
라는 파일 안에 millionth
라는 단어 옆에 있다.
해결법
일단 어떤 식으로 파일이 이루어져 있나 보기 위해 파일을 읽어봤다.
1
2
3
4
5
6
7
8
9
10
11
bandit7@bandit:~$ cat data.txt
--중략--
summation u50rQF4SGWx3gtytGjZL9oaF5Pqcf3yi
Israelites d5RJ2L7p0yKa9RpCr7dU9dhuKq46dFVC
volatility's wqQvrK0UVKfx2BtyFogXhTyGI0V4BOS5
Albany's GopEzFC069enA4p224dn1i0Ire3HP9jx
indecisively tOcTUgSwpbShx5J5x6xmmIQKIlG1GTJz
choosey 3u6Ir3tT1Vq7q17aWIvdT14IxT0f1y5X
velveteen's 46soI2oXIiX1HuXtDXeRLlFrctbGJTYO
어우.. 좀.. 너무 많다 이걸 하나하나 읽어가면서 찾을 수도 있고 혹은 notepad에 옮긴 뒤 ctrl+F로 찾을 수도 있지만 우리는 명령어를 사용하기로 하자.
그 중 우리는 grep
이라는 명령어를 사용할 것이다.
grep [옵션] [표현식] [파일명] : 이렇게 파일 속 특정 문자열(혹은 표현식)을 찾습니다.
1
2
bandit7@bandit:~$ grep millionth data.txt
millionth TESKZC0XvTetK0S9xNwm25STk5iWrBvP
찾았다!
혹은 cat
명령어와 grep
명령어를 섞어 만들 수도 있다.
cat data.txt | grep millionth
이런식으로!
1
2
bandit7@bandit:~$ cat data.txt | grep millionth
millionth TESKZC0XvTetK0S9xNwm25STk5iWrBvP
같은 결과가 나온다.
비밀번호는 TESKZC0XvTetK0S9xNwm25STk5iWrBvP
이다.
Bandit Level 8 -> Level 9
user_id : bandit8
password : TESKZC0XvTetK0S9xNwm25STk5iWrBvP
목표
다음 레벨로 가는 비밀번호는 data.txt
에 있고 딱 한 줄만 나타난다
고 한다.
중복되는 것을 제거하거나 딱 한번만 나오는 것을 찾으면 될 것 같다.
해결법
이번에는 uniq
라는 명령어를 이용해보자.
uniq
**uniq**
명령어는 연속적으로 반복되는 행을 한 행으로 줄여주는 명령어이다. 특히나 uniq
명령어는 sort
명령어와 대부분 같이 쓰이게 되는데, sort 명령어는 정렬을 해주기 때문에 한 행이 몇번 반복되는지 한눈에 알 수 있게 해주기 떄문이다. 그리고 그 두 명령어를 같이 쓰려변 저번에 cat
명령어와 grep
명령어를 같이 쓸 때 사용한 |
(파이프)를 써야한다.
uniq [옵션] [파일 이름]
옵션을 사용하지 않으면
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
bandit8@bandit:~$ cat data.txt | sort | uniq
18DyjwhN856SsMx8bNrFSvr6rJxNQKhE
1iyGemEgn3qUOOFcAJyGPHOiewqZyp1y
2CQ5DQRdtoe9Ft8YpMHqCwQcN1Bk9lCI
365RauAVsFlxktPMpoLtIf1uxijU1TfV
4K2MoVHd1gXfoOdDjvlaRxFNZwmi4A4C
52p0CnGhAvm4m3fPKqz9mTxVDeVYCvnG
5Y76FifuxKStZi4CVovF2uPhgLrZnLzG
7A4l2BI3lPJgNdWAmyXAGlfB8uvCQLX0
8cxarYi5VoKRj3lzo2baLOJaMgUtzoRH
97Qwmy18JE8aGIud1stpTsOrOtUMHeGI
9d8exmGtSsGcU1gz6HmqTfSxmnmI4FBo
A16BW831T94qcsYcGDSkgzYhxnX2xUdK
aAd8RbcAAGVRifo0gE2x1nPIGH2fjgZi
--중략--
이런식으로 문자열 단위로 정렬되어 보이게 된다. 하지만 우리는 한번만 나오는 문자열이 필요하기에 옵션을 추가해줘 비밀번호를 찾아낼 것이다.
uniq 옵션들 - options
내가 자주 쓰게 될 것들만 일단 적어본다.
-c
연속적으로 반복된 수 만큼 행 앞에 표시된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
bandit8@bandit:~$ cat data.txt | sort | uniq -c
10 18DyjwhN856SsMx8bNrFSvr6rJxNQKhE
10 1iyGemEgn3qUOOFcAJyGPHOiewqZyp1y
10 2CQ5DQRdtoe9Ft8YpMHqCwQcN1Bk9lCI
10 365RauAVsFlxktPMpoLtIf1uxijU1TfV
10 4K2MoVHd1gXfoOdDjvlaRxFNZwmi4A4C
10 52p0CnGhAvm4m3fPKqz9mTxVDeVYCvnG
10 5Y76FifuxKStZi4CVovF2uPhgLrZnLzG
10 7A4l2BI3lPJgNdWAmyXAGlfB8uvCQLX0
10 8cxarYi5VoKRj3lzo2baLOJaMgUtzoRH
10 97Qwmy18JE8aGIud1stpTsOrOtUMHeGI
10 9d8exmGtSsGcU1gz6HmqTfSxmnmI4FBo
--중략--
이렇게 숫자로 표기된 곳에서 혼자 1로 표시된 문자열을 찾을 수도 있고 다음 옵션을 이용하여 찾을 수도 있다.
-u
연속적으로 반복되지 않는 행만 출력한다.
1
2
3
4
bandit8@bandit:~$ cat data.txt | sort | uniq -u
EN632PlfYiZbn3PhVK3XOGSlNInNE00t
오호 이 녀석이 우리가 찾던 비밀번호다!
비밀번호 : EN632PlfYiZbn3PhVK3XOGSlNInNE00t
Bandit Level 9 -> Level 10
user_id : bandit9
password : EN632PlfYiZbn3PhVK3XOGSlNInNE00t
목표
다음 레벨로 가는 비밀번호는 data.txt
파일 안에 human-readable
즉 사람이 읽을 수 있는 문자열로 몇개의 =
문자 뒤에 나온다.
해결법
한번 grep
명령어로 =
문자열을 찾아볼까요?
이런 사람이 읽을 수 있는 텍스트(text)파일이 아니라 바이너리(binary: 데이터의 저장과 처리를 목적으로 0과 1의 이진 형태로 인코딩된 파일)이다보니 grep 명령어를 사용할 수 없다고 한다.
grep
명령어의 옵션 중에는 -a
옵션이 있는데 이 옵션이 바로 바이너리를 텍스트 파일처럼 처리해주는 옵션이라고 합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
bandit9@bandit:~$ cat data.txt | grep -a "=="
"x����$�WI��G���gq��B�ș�q6�p�|r9����K�|��[�l������#0jb�7u��uf`e�Y�o� ?>�?���F��){�x%�1�c3 ��l�XQz�U0��
�O-@����E�8�jr��i��$�]�:[������x]T========== theG)"�)<�!G��{��X8�?��5�&���O:�@N��s~�i\6�Xz ����==��S�igy����>�m���P�I�ݰ���C+x�[ڋ�e22�a�
�{��\nF���<��D� �M�f*I�`�@oݗn�ײ�p�n��Y�����x�n�����ۓ�4j\9̷�n:�J�Va���K��+ ���f��Z9�)��Q�Ѻ?��r��.���O[��6�^FS�========== passwordk^�ټ����1>���jg�S�>�����5~�I�-�"��G|�����6L�"�� �T�'����j�T=������2_�q+T6(�p
'
�T����T�p#fz:�LJ�r*;�o#�E�hϻ��/]��&x��:!�Oη��[%ug�Z��hݹkj��D����ZH���Ed����ZE������4K�?�p������z�iw?������J������^`t d�;T��ڪ`��M�T�/�j�M�Ł��$����O�Msh��������8��========== is�w
.�Ze�x��J���i��_qhlbw���X�yϪ�.�-3������7�T����� Ke@�&,]D���%�v�
:��g����yV�M]��Vf��̤��i�L�u#�&ZR�7٬.׳?L6>�D�GC�:jЂ��}��=��T�k�@I]j5�}0Ļ�_�zW5E��f3c�ᦩ�a��Ozݏ������:�Dr%[+��*2lk���X�齲g/$�%��g�Z"g��x�
A�tL[�#��Ƴ���wv..ک!�5��nH�mwQ!2��Fu�cp��B�;ݍ�UH�NEz+�w�'�w$F��6�L�l��ܤ
�(���k�}�N l�E����*�9�<u2����_0�Y���4�`�w�j:6�ek�{OXr���/��?d�mH�m�3�EM`�om�x��۽�>���Ihe�X��N�tz�xb�(X�1��oPZ�ɱ�ݿQ��{�%�xV��۵G�{TbJ;=l��J�Q�/��,��??r)SՒ98UU��jߗc-�?4���6�[�$�J��S��ۿv��P��u$��4+�2ʾ�$�oI�[=lI���a6�ȁ
×/%Â���w�����l��eu-)E��f�n���%����Ƙ�p��~��L�]wPP�J��O1#�{"@Ip�I�2��Di�����T�m�Gf�rSa
���LN�|�r1�7�6��8������<D�_o��kV�Jx�#���[�����딭��E�����O.x�s�薲�Ҋ����I��t�.�RF�L�V¡G�D�5c
%�0d������^b�C�EX��I��,S߫��)o��8/�-��ďRj$�e0G�rx70yJ{��|Ƞ��ÒX 5��a���C�2����{�5���8+�dm)��Z�R��
|�q���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��)"t jh�y��========== G7w8LIi6J3kTb8A7j9LgrywtEUlyyp6s
음 딱 보아하니 맨 아래 있는 G7w8LIi6J3kTb8A7j9LgrywtEUlyyp6s
가 비밀번호 인듯 하지만 우리는 이것보다 더 깔끔한 결과를 찾아보도록 하죠.
위 문제를 해결하기 위한 방법은 우리가 보통 파일을 읽을 때에는 cat
명령어를 사용하였지만 이번에는
strings : 파일의 문자열을 출력
strings
명령어를 사용해 보도록 하겠습니다. 이렇게 함으로써 문제의 힌트였던 human-readable
텍스트만 출력되게 될 것이다.
이제야 모든 조건을 사용하면서 비밀번호를 찾아냈다!
the password is G7w8LIi6J3kTb8A7j9LgrywtEUlyyp6s
비밀번호 : G7w8LIi6J3kTb8A7j9LgrywtEUlyyp6s
Bandit Level 10 -> Level 11
user_id : bandit10
password : G7w8LIi6J3kTb8A7j9LgrywtEUlyyp6s
목표
비밀번호는 data.txt
파일에 base64
형태로 인코딩되어있다.
해결법
base64
: 바이너리 데이터를 문자 코드에 영향을 받지 않는 공통 ASCII 문자표로 표현하기 위해 만들어진 인코딩이다. ASCII 문자 하나가 64진법의 숫자 하나를 의미하기 때문에 Base64라는 이름을 가졌다고 한다.
인코딩의 반대말은? 디코딩!
base64
명령어를 사용하여 디코딩해 봅시다.
비밀번호 : 6zPeziLdR2RKNdNYFNb6nVCKzphlXHBM
Bandit Level 11 -> Level 12
user_id : bandit11
password : 6zPeziLdR2RKNdNYFNb6nVCKzphlXHBM
목표
비밀번호는 data.txt
파일에 대소문자가 13자리씩 회전되어있다고 한다.
- 카이사르 암호
ROT13 : 문자를 알파벳 뒤에 13 번째 문자로 대채하는 대체 암호.
해결법
1
2
3
4
bandit11@bandit:~$ ls
data.txt
bandit11@bandit:~$ cat data.txt
Gur cnffjbeq vf WIAOOSFzMjXXBC0KoSKBbJ8puQm5lIEi
여기 나온 결과를 카이사르 암호 풀이 사이트를 이용해서 풀어도 된다. 하지만 이번에는 tr
명령어를 사용해 보기로 한다.
tr(translate) 명령어
특정 문자를 치환하거나 삭제할 수 있다.
tr [option] [문자열1] [문자열2]
형태로 사용할 수 있다.
- 소문자 -> 대문자 :
tr a-z A-Z
,tr '[:lower:]' '[:upper:]'
, `tr ‘[a-z]’ ‘[A-Z]’등의 형태로 사용할 수 있다.
우리는 ROT13
된 문자열이 필요하다. 또한 대,소문자 모두 이동해야 하기에 범위 지정을 할 때에 대소문자 모두 기입해야 한다.
1
2
bandit11@bandit:~$ cat data.txt | tr 'A-Za-z' 'N-ZA-Mn-za-m'
The password is JVNBBFSmZwKKOP0XbFXOoW8chDz5yVRv
비밀번호 : JVNBBFSmZwKKOP0XbFXOoW8chDz5yVRv
Bandit Level 12 -> Level 13
user_id : bandit12
password : JVNBBFSmZwKKOP0XbFXOoW8chDz5yVRv
목표
다음 레벨로 가는 비밀번호는 여러번 압축된 hexdump
파일인 data.txt
에 있다. 이번 레벨을 위해서는 mkdir
을 이용해서 /tmp
디렉토리 아래 파일을 만들어서 문제를 푸는 것이 좋다. 예를들어: mkdir /tmp/myname123
. cp
명령어를 사용해서 datafile을 옮기고 mv
명령어를 사용해서 이름을 다시 지어라.(manpage를 읽어봐!)
해결법
모르는 명령어가 몇개 더 추가되었군요. 한번 정리해 봅시다.
mkdir (make directory)
디렉토리(폴더)를 생성할 때 사용하는 명령어입니다.
mkdir [옵션] [생성할 디렉토리]
예를 들어 호롱고양이의 폴더
를 만든다고 해봅시다.
mkdir lampcat_folder
이렇게 명령어를 이용하면 현 위치를 Default(기본)으로 하여 지금 위치에 폴더를 만들게 됩니다.
그렇다면 이번에는 /home/ 위치에 폴더를 생성한다고 해봅니다.
mkdir /home/lampcat_folder
이런식으로 폴더를 생성할 수 있다.
options (옵션)
- -m : 디렉토리를 생성할 때 권한을 설정합니다. (아직 이해가..)
- -p : 상위 경로도 함께 생성합니다. (위 예시에서 만약
/home
경로가 없다면 추가적으로 생성하게 됩니다) - -v : 디렉토리를 생성하고 생성된 디렉토리에 대한 메시지를 출력합니다.
cp (copy)
리눅스 혹은 유닉스 환경에서 파일 혹은 디렉토리를 복사할 때 사용합니다.
1
cp [옵션] [복사 대상 디렉터리or파일] [복사될 디렉터리or파일]
options (옵션)
- -r : 하위 디렉토리까지 모두 복사
- -i : 복사될 파일의 이름이 이미 존재한다면
- -v : cp 명령어를 수행하면서 복사 진행 상태를 출력한다.
- -f : 복사 파일이 이미 그 위치에 있다면 파일을 지우고, 강제로 복사한다.
- -p : 파일 혹은 디렉토리를 복사할 때 복사 대상의 소유자(계정), 그룹, 권한등의 정보까지 복사한다.
마지막 옵션 -p
를 사용하게 되면 권한까지 복사하게 되므로 원래 permission denied
되던 문제를 해결하기 위해 우리가 mkdir로 폴더를 옮겨 작업하던 것이 의미 없게 된다!
mv (move)
mv [옵션] [원본 파일] [변경하려고 하는 대상, 대상의 위치]
원래는 디렉토리를 이동시킬 때 사용하는 명령어이다.
options (옵션)
- -b : 이동시킬 파일이 이미 존재하면 백업 파일을 만든다.
- -i : 이동시킬 파일이 이미 존재하면 덮어쓰기 여부를 묻는다.
- -f : 이동시킬 파일이 이미 존재하면 강제로 덮어쓰기 한다.
- -n : 이동시킬 파일이 이미 존재하면 덮어쓰기 하지 않는다.
- -r : 하위 디렉토리까지 모두 이동한다.
- -v : 이동 진행상황을 출력한다.
그런데 우리는 이것을 이용하여 대상의 확장자를 변경하는 작업을 할 것이다.
이것만 있으면 될 줄 알았는데 압축을 해결하기 위해 추가적인 명령어가 필요했다.
xxd
파일 혹은 표준 입력으로부터 hexdump
를 만들거나 복원해 주는 명령어로, 바이너리 형식에서 hexdump
를 만들 수 있다.
Hex dump?
hex dump는 램 또는 파일이나 저장장치에 있는 컴퓨터 데이터의 십육진법적인 보임새이다. 데이터의 hex dump를 보는 것은 주로 디버깅이나 리버스 엔지니어링의 한 부분이다. hex dump에서, 각 바이트는 2 숫자의 16진법 수로 표현된다.
라고 위키백과에서 말했다. 글로만 봐서는 무슨 말인지 이해가 안가 직접 cat
명령어로 열어보기로 했다.
어우.. 이게 그 hex dump라는 것인 듯 하다. 나중에 Hex dump
에 관해 좀 더 찾아봐야겠다.
그럼 이제 다시 xxd로 돌아와서 (일단은 쉬운 것만 적어놓겠다.)
- -i : C언어에서 사용가능한 형식으로 출력
- -E : 오른쪽 문자열을 ASCII에서 *EBCDIC로 변경
- -r : 16진수 데이터를 바이너리 데이터로 변환
- -u : hex 를 소문자 대신 대문자로 출력
bzip2
gzip
보다 높은 압축률을 갖는 압축방식을 사용한다.
- bzip2 압축 해제
1
bzip2 -d data.bz2
- bzip2 압축
1
bzip2 data.tar
- bzip2 압축 파일 정보 출력
1
bzip2 data.bz2
- bzip2 압축 파일 내용 출력
1
bzcat data.bz2
gzip
gzip
은 60~70%의 압축률을 갖습니다. .gz
, .tar
, .bz2
에 관한 내용은 좀 더 찾아봐야겠다.
- gzip 압축 해제
1
gzip -d data.gz
- gzip 압축
1
gzip data.tar
- gzip 압축 파일 정보 출력
1
gzip -l data.gz
- gzip 압축 파일 내용 출력
1
zcat data.gz
tar (Tape Archive)
여러 파일을 하나의 파일로 묶어주는 명령어이다.
압축을 해주는 명령어인 gzip
, bzip2
와 다르게 tar
명령어는 단순히 파일을 하나로 묶는 명령어이다. 하지만 여러 옵션을 추가하여 압축까지 가능하게 해준다.
- -c (create) : 파일을 하나로 합친다.
- -v (verbose) :
tar
의 과정을 보여준다. - -f (file) : 압축파일의 이름은 지정해준다.
- -x (extract) : 압축을 해제한다.
- -z (gzip) :
gzip
형태로 압축한다. (.gz) - -j (bzip2) :
bzip2
형태로 압축한다. (.bz2) - -t (list) : 파일의 리스트를 확인할 수 있다.
그럼 이제 정말로 비밀번호를 찾아보자.
아까 했던대로 data.txt
파일을 열어보자 hex dump파일이 나온다.
그리고 그 파일을 xxd
명령어를 풀어보면?
아.. permission denied 접근 권한 없음 오류가 나온다. 그리고 우리는 사실 이 오류를 예상했었다. 바로? 목표에서!
mkdir
명령어와 cp
명령어를 이용해서 디렉토리를 만들고 파일을 복사해서 문제를 풀어보라고 한다. cp
명령어를 사용 할 때에 -p
명령어가 권한까지 복사하는 것을 보아 그냥 cp
명령어를 사용하였을 때에 권한이 복사되지 않기에 변경할 수 있는 것으로 보인다.
mkdir
명령어를 사용해서 lampcat
이라는 디렉토리를 만들면?
아까 테스트 해 본다고 디렉토리를 만들었었더니 아직 서버에 남아있는 듯 하다. 그럼 다른 이름으로 시도해 보면 된다.
이번에는 디렉토리를 만드는데 성공했다. cp
명령어로 만들어둔 디렉토리에 data.txt를 복사한 뒤 xxd
명령어로 바이너리 데이터로 되돌려보자.
보아하니 data
라는 파일이 복원된 파일이다. file 명령어로 data
의 상태를 읽어보니 gzip
의 형태로 압축되어있다고 한다.
1
2
bandit12@bandit:/tmp/oillampcat$ file data
data: 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
그렇기에 우리는 data
파일을 mv
명령어를 사용하여 .gz
형태의 확장자로 바꿔준 뒤 압축을 해제할 것이다.
그리고 돌고돌아 다시 data
파일을 마주하였다. 그리고 이번에는 bzip의 형태로 되어있다고 한다. 그럼 또 풀어야겠지?
mv
명령어로 bz2확장자로 변경하고, bzip2
명령어로 압축 해제하면 또또 data
파일은 만나게 된다.
그렇게 한번 더 gzip
형태를 풀게되면, 이번에는 tar
형식으로 압축되어있다고 한다.
tar
로 압축된 data
파일은 이번에는 tar
명령어의 -x (압축해제)
, -v(압축 과정 출력)
, -f(압축파일 이름 지정)
옵션을 이용해 풀어주었다.
이번에는 웬일로 확장자를 붙인 채로 data5.bin
이라는 이름을 갖고 압축이 해제되었다.
이제 이 data5.bin 파일을 읽어보면? 또다시 tar
압축이 되어있다고 한다.
다시 한번 풀어주고 이제는 반복일 뿐이다.
같은 이름이지만 file
명령어로 읽어봤을 때에 압축된 방법이 다른 data8.bin
파일이다.
드디어 비밀번호를 찾을 수 있었다. 확장자는 .bin
이지만 file
명령어로 읽어보면 ASCCI
텍스트로 이루어져 있다는 것을 알 수 있다.
비밀번호 : wbWdlBxEir4CaE8LaPhauuOo6pwRmrDw
Bandit Level 13 -> Level 14
user_id : bandit13
password : wbWdlBxEir4CaE8LaPhauuOo6pwRmrDw
목표
비밀번호는 /etc/bandit_pass/bandit14
에 있고 이 파일은 bandit14
유저만 열어볼 수 있다. 이번 레벨에서는 다음 레벨로 가는 비밀번호는 찾을 수 없지만, 다음 로그인 할 때 필요한 SSH key
는 가지고 있다. Note : localhost는 당신이 현재 작업하고 있는 PC
입니다.
해결법
이게 무슨 말인고 하니, ‘우리는 ssh
즉 네트워크 상의 다른 컴퓨터에 로그인, 혹은 원격 제어를 할 수 있게 해주는 프로토콜의 비밀번호를 이미 알고있다.’ 라고 합니다. 일단 그럼 SSH
가 무엇인지 부터 한번 이야기를 해볼까한다.
SSH
SSH
란?
Secure Shell Protocol
즉 네트우크 프로토콜 중 하나로 컴퓨터와 컴퓨터가 같은 Public Network를 통해 통신할 때 보안을 통한 통신(제어, 전송)을 하기 위해 사용하는 프로토콜입니다.
SSH 클라이언트
란?
SSH 클라이언트
란 안전한 원격 프로토콜인 SSH를 이용하여 원격 서버에 접속 할 수 있게 해주는 소프트웨어로 대표적으로는 Putty
, xshell
이 있습니다. 제가 이 포스트에 사용하고 있는 Termius
도 또한 SSH 클라이언트
이다.
SSH 서버
란?
Unix 계열의 운영체제(Mac, Linux)를 원격제어하기 위해서 SSH 서버
가 설치되어있어야 하는데 Mac
에는 기본적으로 깔려있으나 Linux
에는 별도로 설치해 주어야한다.
SSH Key
란?
SSH Key
란 서버에서 클라이언트가 접속할 때 비밀번호 대신 Key
를 제출하여 접속할 수 있습니다. SSH Key
에는 Private Key
(비공개 키), Public Key
(공개 키)가 있는데 Private Key
는 Client
가 Public Key
는 Server
가 가지고 있게 된다. SSH 서버
에 접근을 시도하면 두 키가 일치하는지를 확인하여 접속할 수 있게 해준다.
ssh
명령어 사용법
기본적인 접속 명령어
1
ssh [옵션] [접속할 계정]@[접속할 ip]
옵션
-p 옵션 : 포트 지정
1
ssh -p [포트 번호] [접속할 계정]@[접속할 ip]
-i 옵션 : ssh key를 이용해서 접속
1
ssh -i [ssh 키 파일 위치] [접속할 계정]@[접속할 ip]
-c 옵션 : 데이터 압축 (네트워크 사용량 줄이기)
1
ssh -C [접속할 계정]@[접속할 ip]
-v 옵션 : 전체 로그 출력
1
ssh -v [접속할 계정]@[접속할 ip]
그럼 이제 비밀번호(?)를 찾으러 가보자.
—–아래 내용이랑 전체 내용을 기록할 때 내가 기억을 못하고 새로 작성한 듯 하다—–
Shell (쉘)?
쉘이란 운영체제 커널과 사용자 간의 소통을 담당해 주는 텍스트 기반의 명령어 해석기이다. 쉘은 마치 커널을 조개껍질처럼 감싸고 있다고 하여 shell(껍데기)라는 이름이 붙었다.
쉘은 UI, 즉 유저 인터페이스(User Interface) 사용자로부터 입력을 받아들이는 방식에 따라 두가지로 나뉜다고 한다.
- GUI (Graphic User Interface) : Gnome, KDE, (윈도우 사용자들이 보는 화면도 포함!) 등
- CLI (Command Line Interface) : csh, bash, cmd 등
SSH (Secure Shell) - 보안 셸 프로토콜?
SSH는 네트워크 상의 다른 컴퓨터의 셸을 사용할 수 있게 해주는 프로토콜을 의미한다. SSH를 이용하여 보호되지 않은 네트워크를 통해 컴퓨터에 명령을 안전하게 전송할 수 있게 해준다. 계속 서버에 앉아있을 수는 없는 노릇이니 원격으로 SSH를 통해 서버에 접속해 관리할 수 있게 한다.
SSH가 동작할 때에는 SSH서버라는 이름을 가진 데몬(daemon)이 항상 작동하면서 접속을 기다리고 있다가 클라이언트가 접속을 시도하면 SSH 서버와 클라이언트간의 보안 연결이 된다. 그 보안을 위해 다음과 같은 보안 방식을 가진다.
- key는
private key
와public key
의 한 쌍으로 이루어져있고 이 둘을 비대칭 키라고 부른다.Private key
는 클라이언트(Client)에서 안전하게 보관되어야하는 key이고Public key
는 서버(Server)에 공유되는 key를 의미한다.
클라이언트가 ssh명령어를 통해 서버에 접속을 시도하게 되면 서버는 클라이언트가 Private key
를 가졌는지 확인을 하여 연결 여부를 결정하게 되는 것이다.
자 그럼 다시 접속을 해보도록 하자.
우리가 읽을 수 있는 파일 중에는 sshkey.private
라는 파일이 존재한다.
file
명령어를 사용해 보았을 때 해당 파일은 PEM RSA private key라고 한다.
무슨 파일일까 해서 cat
명령어를 사용하여 읽어보니 역시 사람이 읽을 파일은 아닌 것 같다.
그럼 이 파일을 이용해서 무엇을 하라는 것일까?
SSH key로 Linux 접속하기, SSH 공개키 인증을 사용하여 접속하기
이곳 저곳을 찾아보니 ssh 명령어 옵션 중 -i
라는 옵션을 이용하여 private key 파일을 선택하여 접속할 수 있다고 한다.
ssh -i [Private Key FIle] [UserName]@[HostName] [포트]
형식을 이용하여 사용할 수 있다. 자 그럼 이제 접속을 해보도록 하자.
1
ssh -i sshkey.private bandit14@localhost -p 2220
어라 안바뀌었나? 싶지만
1
2
3
!!! You are trying to log into this SSH server with a password on port 2220 from localhost.
!!! Connecting from localhost is blocked to conserve resources.
!! Please log out and log in again.
1
2
3
!!! 로컬 호스트에서 포트 2220의 암호를 사용하여 이 SSH 서버에 로그인하려고 합니다.
!!! 리소스를 절약하기 위해 로컬 호스트에서 연결이 차단되었습니다.
!!! 로그아웃 후 다시 로그인해 주시기 바랍니다.
라며 경고를 보내지만
일단은 접속에 성공한 모습이다. 그럼 이제 이 상태에서 비밀번호를 찾으러 가보자.
수 많은 파일들이 보이지만 이 중 우리가 볼 것은 bandit14의 비밀번호이다. 그리고 다른 폴더를 열어보려 하여도
다른 사용자가 만든 파일은 접근할 수 없어 permission denied
만 뜰 뿐이다.
비밀번호 : MU4VWeTyJk8ROof1qqmcBPaLh7lDCPvS
Bandit Level 14 -> Level 15
user_id : bandit14
password : fGrHPx402xGC7U7rXKDaxiWFTOiF0ENq
목표
다음 레벨의 암호는 로컬 호스트
의 포트 30000
에 현재 레벨의 암호
를 제출하여 검색할(얻을) 수 있다.
해결법
와 이번에는 전보다 더 많은 Helpful Reading Material
이 있으니 읽어보는 것도 좋을 듯 하다.
일단은 언제나처럼 어떤 파일들이 있을지 살펴보도록 하자.
일..단은 아무래도 파일이 전부 숨겨져있나보다.
물론 ls -a
명령어를 이용하여 숨겨진 파일들도 볼 수 있고 그중에는 .ssh
라는 처음보는 파일도 있기에 한번 읽어보기로 하자
저번과 같이 이번에도 딱히 도움이 될 것 같은 느낌은 아니다.
문제에서 말하길 localhost
의 30000 포트
로 가보라고 했으니 ssh
, telnet
, nc
명령어 들을 이용해서 접속을 해보도록 하자.
Telnet : 로컬 네트워크 내에서 직접 연결된 것 처럼 외부컴퓨터에서 로그인 하여 사용할 수 있도록 하는 프로토콜.
nc (netcat) : TCP 또는 UDP를 사용하여 네트워크 연결을 읽거나 기록하는 컴퓨터 네트워킹 유틸리티이다. (네트워크 해킹과 보안 책에서 메일 서버를 해킹하는 실습에 사용했던 도구)
1
2
3
telnet [port] [hostname]
nc [port] [hostname]
이지만 요즘에는 대부분 ssh로 교체되고 있는 중이라고 한다.
자세한 내용은
telnet, netcat 블로그를 참고하면 좋을 듯 하다. 매우 잘 정리가 되어있다.
그럼 첫번째로 계속 해오던 ssh를 이용하여 접속을 시도해보자
오류 메시지를 발견하고 바로 검색을 해보았다.
kex_exchange_identification: Connection closed by remote host
아하 접속은 하였으나 아무일도 하지않아 종료되며 출력된 오류 메시지라고 한다. 그럼 이제 다음 방법을 사용해보자.
telnet
을 이용하여 접속해보자.
접속 후 문제에서 주어진 것 처럼 bandit14의 비밀번호를 입력하자 bandit15로 가는 비밀번호를 출력해주었다!
비밀번호 : jN2kgmIXJ6fShzhT2avhotn4Zcka6tnt
nc (netcat)
을 이용해보자.
netcat
에서도 동일한 비밀번호를 출력해 주었다.
비밀번호 : 8xCjnmgoKbGLhHFAZlGE5Tmu4M2tKJQo
Bandit Level 15 -> Level 16
user_id : bandit15
password : jN2kgmIXJ6fShzhT2avhotn4Zcka6tnt
목표
다음 단계로 가기 위해서 localhost 포트 30001에 현재 레벨의 password를 SSL 암호화를 이용해라
유용한 노트 : ign_eof를 이용해서 “HEARTBEATING”과 “Read R BLOCK?”을 얻고 메뉴 페이지에서 “CONNECTED COMMANDS” 섹션을 읽으십시오. ‘R’과 ‘Q’ 옆에 있는 ‘B’명령어도 이 명령어 버전에서 작동합니다…
해결법
음… 솔직히 유용한 노트에서 무엇을 말하는 건지 전혀 감도 잡히지 않는다
일단 문제에 써있는 것들을 하나씩 알아보자
SSL(Secure Sockets Layer)?
보안 소켓 계층
암호화 기반 인터넷 보안 프로토콜이다.
찾다보니 CloudFare SSL에 아주 자세히 나와있어 첨부한다
간단하게 말하면 두 컴퓨터 사이에 전송되는 데이터를 암호화 하여 인터넷 연결을 보호하는 표준 프로토콜로 현재는 SSL -> TLS로 쓰이고 있다
openssl?
ssl을 이용하기 위해 우리가 사용할 명령어는 openssl
이다
help
명령어로 무엇을 추가할 수 있을지 알아보자
보아하니
- Standard commands
- Message Digest commands
- Cipher commands
중 하나를 사용해야 한다
여기에 나와있는 수 많은 명령어 중 우리는 bandit에서 Commands you may need to solve this level
에 나온 s_client
를 이용하도록 하자
s_client
1
openssl s_client -[option] [host:port]
처음 보는 명령어이니 다시 help
를 이용해 옵션을 살펴보자
이번에는 아까보다 훨씬 더 많은 옵션들이 존재한다
- General options
- Network options
- Identity options
- Session options
- Input/Output options
- Debug options
- Protocol and version options
- Random state options
- TLS/SSL options
- Validation options
- Extended certificate options
- Provider options
그리고 Parameter로는
- host:port
형식을 쓴다고 한다
우리는 연결을 해야하기 떄문에 Network options
에 있는 connect
옵션을 사용하도록 하자
다시 한번 매우 긴 글이 우리를 반겨주지만 드디어 내가 이해하지 못했던 힌트의 read R BLOCK
를 발견 할 수 있었다
여기에 현재 레벨의 비밀번호를 입력해주게 되면?
Correct!라며 bandit 16으로 가는 비밀번호를 알려준다
비밀번호 : kSkvUpMQ7lBYyCM4GBPvCvT1BfWRy0Dx
글이 길다고 무서워하지 말고 차근차근 읽어보자!
Bandit Level 17 -> Level 18
user_id : bandit17
password : EReVavePLFHtFlFsjn3hyzMlvSuSAcRD
목표
홈 디렉토리에는 passwords.old와 passwords.new 두 개의 파일이 있습니다. 다음 단계의 암호는 passwords.new에 있으며 passwords.old와 passwords.new 사이에서 변경된 유일한 줄입니다
참고: 이 레벨을 해결하고 bandit18에 로그인하려고 할 때 ‘Bye bye!’를 보게 될 것인데, 이것은 다음 레벨인 bandit19와 관련이 있습니다
해결법
정말로 파일은 .new와 .old가 존재하고 둘 다 읽을 수 있는 파일로 되어있네요
cat명령어를 통해 읽어보니
어우 사진에 보이는 것 보다 더 길군요
일단 bandit에서 힌트를 주길 cat
,grep
,ls
,diff
를 쓰라고 했으며 왠지모르게 diff
라는 명령어가 이번 문제의 키일 것 같은 느낌이 드네요
diff : 두 파일을 비교하고 차이점 추출
-q
: 파일이 다른 경우 Files passwords.new and passwords.old differ
이런 식으로 간단하게 다르다, 라고만 알려준다
-r
: 디렉토리 비교를 위해 사용
-u
: 유니파일 형식으로 파일의 차이를 출력
예를들어 다음과 같다
-c
: 파일의 차이를 문장 형태로 보여준다
‘39에서 45번째 줄 중 이 부분이 틀렸어요!’ 하고 알려준다
-i
: 대/소문자를 무시하고 비교
-w
: 공백 문자 무시
-B
: 빈줄 무시
-y
: 이중 컬럼 출력 모드
이런 식으로 github commit 내용처럼 비교하여 출력함
-l
: 변경된 줄의 개수만 출력
우리는 굳이 옵션을 넣어줄 필요는 없어 보인다
위 부분이 new파일이고 아래 부분이 old파일 부분이다
그렇다면 바뀐 비밀번호는? 위에 부분인 것이다
비밀번호 : x2gLTTjFwMOhQ8oWNbMN362QKxfRqGlO
그런데 여기서 잠깐 다음 문제로 넘어가게 되면 연결을 시도했을 때 termius를 사용하는 사람이라면 바로 종료가 되어 session log를 확인해 보았을 때
Byebye!
라며 바로 나를 내보내 버린다
처음 문제에서 말했듯 이것은 bandit19번과 관련이 있으며 우리는 잘 해결한 것이 맞다!
Bandit Level 18 -> Level 19
user_id : bandit18
password : x2gLTTjFwMOhQ8oWNbMN362QKxfRqGlO
목표
다음 레벨의 암호는 홈 디렉토리의 readme 파일에 저장됩니다. 불행히도 SSH로 로그인할 때 누군가가 .bashrc를 로그아웃하도록 수정했습니다.
그래서 자꾸 로그아웃 당했던 거구만
일단 readme파일에 비밀번호가 있다고 하니 들어갈 수만 있다면 오케이다
해결법
일단
bashrc
가 무엇인가?
bash + Run Command 의 줄인말
./bashrc
는?
bashrc 설정하기에 자세히 설명되어있으며 간단히 말하면 bash
에 미리 입력하고 싶은 내용을 작성해두어 쉘을 열면 자동으로 실행되는 것을 뜻한다
그렇다면 [Ubuntu] terminal에 pfetch 실행하기 이것도 bashrc에 명령어를 미리 입력해 두어 실행할 수도 있겠네!
그런데 이번 문제에서는 누군가 .bashrc
파일을 변경해두어 ssh를 이용해 쉘을 연결하면 기본 쉘인 bash
가 실행되면서 Byebye
를 출력하고 우리를 쫒아낸 것이다
그렇다면 접속을 하기 위한 쉘인 ssh에 관해 조금 더 생각을 해보자
원래 우리는 ssh를 연결할 때 (termius말고)
1
ssh [옵션] [사용자명]@[호스트 주소]
을 통해 연결했었다 하지만 만약 접속 전에 명령어를 넘겨줄 수 있다면?
1
ssh [옵션] [사용자명]@[호스트 주소] [명령어]
원래는 이런 형태로도 사용이 가능했던 것이다!
이번에는 터미널을 통해 연결해보자 (termius)
터미널을 열고
bash
쉘이 아닌 sh
가장 기본 쉘을 통해 접속에 성공했다
또한 처음에 비밀번호를 입력했을 때 따로 출력이 뜨지 않는다고 뭐지? 생각할 수도 있다
따로 password incorrect와 같은 오류가 뜨지 않았다면 접속에 성공한 것이니 하던대로 파일을 읽으면 된다!
비밀번호 : cGWpMaKXVwDUNgPAVJbWYuGHVn9zl3j8
Bandit Level 19 -> Level 20
user_id : bandit19
password : cGWpMaKXVwDUNgPAVJbWYuGHVn9zl3j8
목표
다음 레벨에 액세스하려면 홈 디렉토리에서 setuid 바이너리를 사용해야 합니다. 사용 방법을 알아보려면 인수 없이 실행하십시오. 이 레벨의 암호는 setuid 바이너리를 사용한 후 일반적인 자리(/etc/bandit_pass)에서 찾을 수 있습니다.
1. 홈 디렉토리에서 setuid binary를 이용해라
binary가 뭘까?
2진수 숫자로된 데이터 파일을 의미한다
그럼 여기서 말하는 setuid binary는 setuid가 설정된 데이터 파일을 의미한다
setuid가 뭘까?
SetUID는 유닉스 환경에서 일시적으로 접근 권한이 없는 파일에 접근을 허용하는 특수 권한을 부여할 수 있게 된다
자세한 설명은 SetUID를 이용한 권한상승의 위험성 이곳을 참고하면 좋을 것이다
혹시 모르니 바로 한번 /etc/bandit_pass/bandit20
를 읽어보자
역시 권한이 없다
해결법
권한
진작에 한번 공부를 했어야 했는데
리눅스 권한 설정, 리눅스 파일 & 디렉토리 권한을 먼저 보고 오면 좋다
1
-rwsr-x--- 1 bandit20 bandit19 14880 Jul 17 15:57 bandit20-do
위와 같은 권한이 있다고 해보자
-
(file type)
-
: 파일이다
rws (User)
r
: 읽기 권한 있음
w
: 쓰기 권한 있음
s
: setUID 설정이 되어있어 사용자 권한이 있어야 실행할 수 있음
r-x (Group)
r
: 읽기 권한 있음
-
: 쓰기 권한 없음
x
: 실행 권한 있음
— (Other)
아무 권한 없음
bandit20 (User)
파일을 만든 소유주
bandit19 (Group)
파일을 만든 소유주가 속한 그룹
14880 (File size)
파일 크기 byte로 되어있음
Jul 17 15:57 (마지막 변경 날짜)
bandit20-do (파일 이름)
파일을 확인해 보면 권한이 rws
로 s
가 바로 setuid 설정이 되어있는 것이다
보통은 rwx로 권한이 설정되어있어서 실행 권한을 나타낸다고 한다
일단 한번 실행해보자
다른 user권한으로 실행하라고 한다
예시에 ./bandit20-do id
라고 하니 그대로 실행시켜보자
오 우리가 권한에 관해 이야기 할 때 봤듯 setUID
가 설정되어있어 bandit20
의 권한으로 실행이 된다
더 쉽게 알 수 있는 방법은 실행시켰을 때 uid
는 bandit19
로 뜨지만 옆에 euid
가 bandit20
으로 뜨고 있는 것을 볼 수 있다
이 euid
는 파일을 실행했을 때 실제 사용하는 uid
를 의미한다
비밀번호를 가져오자
문제에서 /etc/bandit_pass/bandit20
에 비밀번호가 있다고 하니 읽어보도록 하자
비밀번호 : 0qXahG8ZjOVMN9Ghs7iOWsCfZyXOUbYO
와 솔직히 계속 bandit을 통해 리눅스 지식을 접하거나 bash스크립트를 짤 때 자꾸 사람들이 chmod
니 권한 상승이니 하는 말들이 많았고 사실 그 때는 그냥 필요하면 따라하기만 했었는데 이렇게 중요한 것이라고는 생각을 못했었다
나중에 따로 아예 리눅스에 관한 책 혹은 글을 읽어봐야겠다
Bandit Level 20 -> Level 21
user_id : bandit20
password : 0qXahG8ZjOVMN9Ghs7iOWsCfZyXOUbYO
이제 드디어 앞자리가 2로 바뀌었다
목표
홈 디렉토리에는 명령줄 인수로 지정한 포트의 로컬 호스트에 연결하는 setuid
바이너리가 있습니다. 그런 다음 연결에서 텍스트 한 줄을 읽어 이전 레벨(bandit20)
의 비밀번호와 비교합니다. 비밀번호가 정확하면 다음 레벨(bandit21)
의 비밀번호를 전송합니다.
참고: 네트워크 데몬에 연결하여 네트워크 데몬이 생각하는 대로 작동하는지 확인해 보십시오
그러니까 setuid binary
가 설정되어있고 네트워크 연결한 뒤 거기에 맞는 비밀번호를 입력하면 다음 레벨의 비밀번호를 준다
그런데 참고 부분이 있는 것을 보아하니 또 지금까지 해오던 것과는 다른 느낌인가보다
해결법
이번에도 setuid
설정이 된 파일이 보인다
일단 실행시켜보면
이 프로그램은 TCP를 사용하여 로컬 호스트의 지정된 포트에 연결합니다. 만약 다른 쪽에서 올바른 암호를 받으면 다음 암호는 다시 전송됩니다.
음… 그니까 내가 bandit20으로 두개의 터미널로 연결해서 서로 통신을 하게 해야한다는 의미인 거겠지?
termius에서는 터미널 나누기를 사용할 수 있다
이제 한쪽에서는 로컬에 포트 7777(원하는 대로)
로 통신을 열어보자
아래 화면과 같이 로컬호스트에 연결되었다고 뜨면 이제 bandit20
의 비밀번호를 넘겨주면 된다
그러면 순식간에 비밀번호를 발송해준다!
비밀번호 : EeoULMCra2q0dSkYj561DX7s1CpBuOBt
그저 막연한 호기심으로 한번 파일을 읽어봤다
음.. 그만 알아보도록 하자
Bandit Level 21 -> Level 22
user_id : bandit21
password : EeoULMCra2q0dSkYj561DX7s1CpBuOBt
목표
시간 기반 작업 스케줄러인 cron
에서 일정한 간격으로 프로그램이 자동으로 실행되고 있습니다. /etc/cron.d/
에서 구성을 확인하고 어떤 명령어가 실행되고 있는지 확인하십시오.
해결법
오오 이미 cron
은 우분투 소리 안나옴 문제에서 한번 찾아본 적이 있기에 생각보다 쉽게 할 수 있지 않을까 싶다
cron
에 관해 간단하게 설명하자면 일정 시간, 혹은 컴퓨터가 꺼지고 켜질 때에 자동으로 명령어 프로그램이 실행되게 만드는 프로그램이다
cron
의 실행될 파일들이 있는 /etc/cron.d
폴더에 들어가 확인할 수 있다
아마 우리는 bandit21
문제를 풀고 있으니 cronjob_bandit22
가 우리가 찾던 것이 아닐까 싶다
오잉 읽어보니 1분마다 /usr/bin/cronjob_bandit22.sh
가 실행되고 있다
그렇다면 바로 찾아가 주도록 하자
tmp
디렉토리에 /tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv
라는 파일을 만들고 bandit22의 비밀번호를 cat을 통해 /tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv
파일에 저장을 하고 있다
이번엔 /tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv
을 읽어보도록 하자
비밀번호가 저장되어있다!
비밀번호 : tRae0UfB9v0UzbCdn9cY0gQnds9GF58Q
Bandit Level 22 -> Level 23
user_id : bandit22
password : tRae0UfB9v0UzbCdn9cY0gQnds9GF58Q
목표
시간 기반 작업 스케줄러인 cron에서 일정한 간격으로 프로그램이 자동으로 실행되고 있습니다. /etc/cron.d/에서 구성을 확인하고 어떤 명령어가 실행되고 있는지 확인하십시오.
참고: 다른 사람이 작성한 셸 스크립트를 보는 것은 매우 유용한 기술입니다. 이 수준의 스크립트는 의도적으로 읽기 쉽게 만들어졌습니다. 만약 그것이 무엇을 하는지 이해하는 데 문제가 있다면, 그것이 출력하는 디버그 정보를 보기 위해 실행해 보세요.
어… 저번이랑 거의 다른 것은 없고 참고가 추가되었다
해결법
저번처럼 들어가서 cron
에 연결된 파일을 후딱 읽어보면 이번에는 /usr/bin/cronjob_bandit23.sh
파일로 연결되어있다고 한다
매우 간단한 스크립트가 있다
1
2
3
4
5
6
7
8
#!/bin/bash
myname=$(whoami)
mytarget=$(echo I am user $myname | md5sum | cut -d ' ' -f 1)
echo "Copying passwordfile /etc/bandit_pass/$myname to /tmp/$mytarget"
cat /etc/bandit_pass/$myname > /tmp/$mytarget
myname=$(whoami)
whoami
명령어를 통해 유저 id를 넣는다
mytarget=$(echo I am user $myname md5sum cut -d ‘ ‘ -f 1)
I am user bandit23
을 md5
해시 변환 하고 ‘‘을 구분하여 첫번째 부분만 mytarget
변수에 넣는다
cat /etc/bandit_pass/$myname > /tmp/$mytarget
tmp/$mytarget
에 bandit23
의 비밀번호가 저장되게 된다
우리는 현재 whoami
를 하였을 때 bandit22
가 나오고 우리가 찾고 싶은 것은 bandit23
의 비밀번호이기에 찾기위해 그 부분을 직접 입력해주자
위에서 파일이 /tmp/$mytarget
에 저장되어있다고 하였고 우리는 $mytarget
이 8ca319486bfbbc3663ea0fbe81326349
라는 것을 알아냈다
읽어보면 bandit23
의 비밀번호를 알아낼 수 있다
비밀번호 : 0Zf11ioIjMVN551jX3CmStKLYqjk54Ga
Bandit Level 23 -> Level 24
user_id : bandit23
password : 0Zf11ioIjMVN551jX3CmStKLYqjk54Ga
목표
시간 기반 작업 스케줄러인 cron
에서 일정한 간격으로 프로그램이 자동으로 실행되고 있습니다. /etc/cron.d/
에서 구성을 확인하고 어떤 명령어가 실행되고 있는지 확인하십시오.
참고: 이 레벨은 여러분 자신의 첫 번째 쉘 스크립트를 만들어야 합니다. 이것은 매우 큰 단계이며 이 레벨을 통과할 때 자신을 자랑스러워 해야 합니다!
참고 2: 쉘 스크립트는 한번 실행되면 제거되므로 복사본을 보관하세요…
해결법
와 이번에는 직접 쉘 스크립트를 만들어야 한다고 한다!
보아하니 이번에는 /usr/bin/cronjob_bandit24.sh
을 확인해 봐야 하는 것 같은데 어쨰서 쉘 스크립트를 만들어야 한다고 하는걸까?
/var/spool/bandit24/foo
로 이동- 해당 경로의 모든 스크립트를 실행 후 삭제
- 파일이
.
이거나..
이 아닐 경우 실행 - 파일 소유자가
bandit23
이면 60초 동안 실행되고-s 9
즉9(SIGKILL)
을 보내서 명령어를 강제종료한다. 그 후 삭제된다
저번과 다른 점이라면 아무래도
1
cat /etc/bandit_pass/$myname > /tmp/$mytarget
비밀번호를 가져오는 이 부분이 빠졌기에 그 부분을 가져오고 /var/spool/bandit24/
의 위치한 스크립트는 계속 삭제될 것이기에 따로 스크립트를 만들어 주고 옮기면 될 것 같다
1
2
#!/bin/bash
cat /etc/bandit_pass/bandit24 > /tmp/lampcat23/bandit24_password
스크립트를 만든 뒤 옮기려 하였는데 /var/spool/bandit24/
가 없네?
아 잘못했구나 경로가 /var/spool/$myname/foo
이니까 우리는 /var/spool/bandit24/foo
가 될 것이다
다시 해보면?
비밀번호 : gb8KRRCsshuZXI0tUuR6ypOFjiZbf3G8
Bandit Level 24 -> Level 25
user_id : bandit24
password : gb8KRRCsshuZXI0tUuR6ypOFjiZbf3G8
목표
데몬은 포트 30002
에서 듣고 있으며, bandit24의 암호
와 비밀 숫자 4자리 핀코
드가 주어지면 bandit25
의 암호를 알려줍니다. 10000 가지 조합
을 모두 거치는 것 외에는 핀코드를 검색할 수 있는 방법이 없습니다. 매번 새 연결을 만들 필요가 없습니다
- 30002번 포트는 열려있다
- bandit24의 암호 + 비밀 숫자 4자리 를 보내면 bandit25의 암호를 돌려준다
- 비밀 숫자는 10000가지 조합중 하나이다
- 한번 연결하면 굳이 새 연결을 만들 필요가 없다
해결법
간단한 brute force공격 문제이다
스크립트를 만들고 무차별 대입을 해보자
일단 혹시해서 nmap
을 통해 포트 스캐닝을 해보니 30002번 포트가 열려있는 것이 확실해 졌다
스크립트 생성을 위해 하던대로 내 작업장을 만들었다
btureforce
를 위한 비밀번호 조합 생성 스크립트는 다음과 같다
1
2
3
4
5
6
7
#!/bin/bash
pwd24=gb8KRRCsshuZXI0tUuR6ypOFjiZbf3G8
for i in {0000..9999}
do
echo $pwd24 $i >> pwdlist.txt
done
리스트를 만들고 나면 이제 접속을 시도해 보자
ERROR
혹시 나처럼 결과가 반복문이 실행되지 않는 분들을 위해 하나 말하자면
실행할 때 sh
로 실행하는 것이 아니라
이렇게 ./
로 실행해 보아라
물론 실행하기 전에 권한도 줘야하고
스크립트 실행하는 방법에 따른 차이점이 글을 읽고 나면 어느정도 이해가 간다
bash쉘
이 아니라 sh 기본 쉘
로 실행되다 보니 반복문의 { }
부분을 이해하지 못한 것 같다
다시 접속
그럼 이제 만들어진 리스트를 가지고 접속을 시도해보자
순식간에 결과가 나왔다
역시 한번 틀려봐야 지식이 늘어난다
비밀번호 : iCi86ttT4KSNe1armKiwbQNmB3YJP3q4
Bandit Level 25 -> Level 26
user_id : bandit25
password : iCi86ttT4KSNe1armKiwbQNmB3YJP3q4
목표
bandit25
에서 bandit26
에 로그인하는 것은 꽤 쉬울 것입니다… 사용자 bandit26
의 쉘은 /bin/bash가 아니라 다른 것입니다. 그것이 무엇인지, 어떻게 작동하는지, 그리고 그것을 탈출하는 방법을 알아보세요.
참고: Windows 사용자이고 일반적으로 Powershell을 사용하여 밴디트에 ssh를 적용하는 경우: Powershell은 이 수준의 의도된 솔루션에 문제가 발생하는 것으로 알려져 있습니다. 대신 명령 프롬프트를 사용해야 합니다.
나는 termius 쓸 거라서 참고사항은 패스
해결법
일단 파일을 읽어보니 바로 bandit26.sshkey
가 보인다
그리고 bandit25@bandit:~$ ssh -i bandit26.sshkey bandit26@localhost -p 2220
를 통해 접속시도를 하게 되면
바로 쫒겨난다 목표에서 말하듯 쉘이 /bin/bash
가 아닌 다른 것이기에 생긴 문제인 것 같다
/etc/passwd
폴더에서 계정들이 사용하는 쉘을 볼 수 있다
확인해 보면
bandit26:x:11026:11026:bandit level 26:/home/bandit26:/usr/bin/showtext
(1):(2):(3):(4):(5):(6):(7)
로 나눠 보았을 때
:
: 구분자
(1)
: 사용자 계정
(2)
: 사용자 암호가 들어갈 자리, x는 /etc/shadow 파일에 암호가 저장되어있음
(3)
: 사용자의 ID, root는 0
(4)
: Group id, root그룹은 0
(5)
: 기타 정보, 보통 사용자의 이름
(6)
: 홈 디렉토리 정보
(7)
: 사용자가 기본으로 사용하는 shell 정보
여기서 우리는 bandit26
이 /usr/bin/showtext
라는 쉘? 을 사용하고 있다는 것을 알 수 있다
/usr/bin/showtext
파일을 읽어보면
export TERM=linux
TERM
이라는 환경변수에 linux를 저장
exec more ~/text.txt
/home bandit26/text.txt
에 more
라는 명령어를 실행한다
처음보는 명령어이기에 Linux 기본 명령어 more을 읽으면 좋다
일단 창을 줄이는 것과 관련된 명령어라는 것은 이해를 했다
termius에서는 안되는 걸로
putty
에서는 성공했다
이 상태에서 v를 누르니 vi 편집기가 실행되었다
:set shell=/bin/bash
명령어를 입력하여 bash쉘
로 기본쉘을 설정하고
:sh
명령어를 입력해 익숙한 bash쉘
로 들어올 수 있었다
비밀번호가 출력되었다!
비밀번호 : s0773xxkk0MXfdqOfPRVr9L3jJBUOgCZ
이 다음 문제인 bandit26
도 termius를 통해 접속하게 되면 다음과 같이 보인다만
분명 아무것도 눌리지 않을 것이다..
그렇다.. 26번 문제도 아직 25번 문제에서 이어진 문제였던 것이다
여기서 부터는 다음번에
Bandit Level 26 -> Level 27
user_id : bandit26
password : s0773xxkk0MXfdqOfPRVr9L3jJBUOgCZ
목표
…? shell을 얻고 bandit27의 비밀번호를 가져라! 라는데?
해결법
다시 보니 반가운 -do
파일이 보입니다
그리고 text.txt
파일도 보이네요?
일단 text.txt
는 Ascii Art
를 띄워주는 거였군요
역시 euid
가 bandit27
로 뜨네요
그리고 잡았다 요놈
비밀번호 : upsNCc7vzaRDx6oZC6GiR6ERwe1MowGB
Bandit Level 27 -> Level 28
user_id : bandit27
password : upsNCc7vzaRDx6oZC6GiR6ERwe1MowGB
목표
포트 2220의 ssh://bandit27-git@localhost/home/bandit27-git/repo
에 git 저장소
가 있습니다. 사용자 bandit27-git
의 암호는 사용자 bandit27
의 암호와 동일합니다.
리포지토리를 복제하고 다음 단계의 암호를 찾습니다.
해결법
git 사용에 관한 내용이네요
이건 이미 팀 프로젝트를 할 때 조금 써봤었죠
작업 폴더를 만들고 git clone
을 해줍시다
ssh://bandit27-git@localhost:2220/home/bandit27-git/repo
포트 설정을 해준 것은 2220번 포트로 가져올 수 있다고 했으니 이렇게 해야 한답니다
비밀번호는 bandit27과 같다고 했었죠?
자 다운이 다 되었습니다
안에 들어있는 파일을 열어 비밀번호를 찾아낼 수 있었네요
비밀번호 : Yz9IpL0sBcCeuG7m9uQFt8ZNpS4HZRcN
Bandit Level 28 -> Level 29
user_id : bandit28
password : Yz9IpL0sBcCeuG7m9uQFt8ZNpS4HZRcN
목표
포트 2220을 통해 ssh://bandit28-git@localhost/home/bandit28-git/repo
에 git 저장소
가 있습니다. 사용자 bandit28-git의 암호는 사용자 bandit28의 암호와 동일합니다.
리포지토리를 복제하고 다음 단계의 암호를 찾습니다.
어? 문제가 같다?
해결법
ssh://bandit28-git@localhost:2220/home/bandit28-git/repo
전 처럼 git clone
을 해오면 된다
그리고 README
파일 내용이 변했다
그런데 이게 무슨 말인지 알 수가 없다
힌트는 아닌 것 같고
그렇다면 혹시 누군가 파일 정보를 바꾼거라면?
git clone
을 해왔으니 당연히 .git
파일이 존재한다
오 바로 fix info leak
이라는 문구를 찾았다
아마 이게 비밀번호를 숨긴 부분이지 않을까 한다
그럼 고치기 전으로 넘어가주자
비밀번호 발견~
비밀번호 : 4pT1t5DENaYuqnqvadYs1oE4QLCdjmJ7
이러니 git
을 사용할 때 중요한 정보들은 .gitignore
을 사용하여 git에 올라가지 않도록 하자
까딱하면 api 비용을 엄청나게 내야할 수도 있다
Bandit Level 29 -> Level 30
user_id : bandit29
password : 4pT1t5DENaYuqnqvadYs1oE4QLCdjmJ7
목표
음 그래 그럴거 같았어
해결법
ssh://bandit29-git@localhost:2220/home/bandit29-git/repo
기본세팅
README
가 말하길 no passwords in production!
이라신다
여긴 비밀번호 없음!
로그도 딱히 뭔가 문제될 것이 없어보인다
그렇다면 브랜치는?
오케이 여러 갈래의 브랜치가 있는 것을 확인했다
가장 위에있는 origin/dev
로 가보자
찾았다
비밀번호 : qp30ex3VLz5MDG1n91YowTv4Q8l7CDZL
그런데 저 code는 뭐가 있을까?
gif를 ascii코드로 출력해주는 파이썬 파일인걸까?
비었다?
특별할 거 없는 1byte짜리 파일이였다
기대했는데…
Bandit Level 30 -> Level 31
user_id : bandit30
password : qp30ex3VLz5MDG1n91YowTv4Q8l7CDZL
벌써 앞자리가 3이라니 고지가 멀지 않았다
목표
오케이 이번에도 git문제군
해결법
ssh://bandit30-git@localhost:2220/home/bandit30-git/repo
어..? 아 잘못 썼다
이번에는 성공했다
허 이번에는 비었다며 웃는다
그리고 딱히 다른 변경사항도 없다
그리고 브랜치도 HEAD
와 master
뿐이다
git tag라는 것은 써본 적이 없어서 몰랐는데 이 친구가 이번 문제의 핵심이였다
찾았다
비밀번호 : fb5S2xb7bRyFmAvQYQGEqsbhVyJqhnDy
Bandit Level 31 -> Level 32
user_id : bandit31
password : qp30ex3VLz5MDG1n91YowTv4Q8l7CDZL
목표
해결법
ssh://bandit31-git@localhost:2220/home/bandit31-git/repo
기본
이번에는 원격 레포지토리에 파일을 push
하라고 한다
May I come in?을 내용으로 제목을 key.txt로 master브렌치에 push하란다
보낼 파일을 만들고
push해보면 지금 .gitignore 파일에 *.txt파일을 넣지 못하게 되어있고 강제로 넣고자 한다면 -f
옵션을 사용하라고 한다
강제로 넣고 commit
을 날린 뒤 push
를 하면
원격에서 push
하는 것을 막아놨기에 push
는 안되었지만 비밀번호를 얻어내었다
비밀번호 : 3O9RfhqyAlVBEZpVb6LYStshZoqoSx5K
Bandit Level 32 -> Level 33
user_id : bandit32
password : 3O9RfhqyAlVBEZpVb6LYStshZoqoSx5K
목표
git 관련 문제가 끝난 뒤에, 또 다른 탈출을 할 시간입니다. 행운을 빌어요!
아니 선생님 문제는요?
해결법
이번에는 시작부터 bash
쉘이 아닌 UPPERCASE SHELL
이라고 한다
일명 대문자 쉘
이게 무슨..
정말로 일단 소문자는 입력이 안된다
말 그대로 대문자만 받는 쉘인가보다
$0
은 현재 쉘을 반환하는 환경변수인데 실행하면 쉘안에 쉘이 생긴다
환경변수는 또 받네?
bash
쉘로 실행을 시키니 놀랍게도 제 계정이 bandit33
으로 바뀌어있습니다??
지금은 32번 문젠데?
이렇게 비밀번호를 바로 찾아낼 수 있었답니다
비밀번호 : tQdtbs5D5i2vJwkO8mEyYEyTL8izoeJ0
Bandit Level 33 -> Level 34
user_id : bandit33
password : tQdtbs5D5i2vJwkO8mEyYEyTL8izoeJ0
목표
아직 문제가 없음
해결법
비밀번호 : 공백
FIN
이렇게 나의 첫 워게임인 Over The Wire
의 Bandit
을 끝내게 되었다
초반에는 오히려 내가 리눅스에 관해 알고있는 것 없이 무작정 달려들었다 보니 글 쓰는 것이 매우 느려지고 왜인지 모르게 손이 잘 안가는 포스트 였다
하지만 bandit14번 까지 끝내고 나서 [Shell Sciprt]로 구현한 로그 생성 및 로그에서 에러 잡기 스크립트라던가 [shell script] 포트 스캐닝과 같은 여러 스크립트를 짜면서 리눅스에 관해 어느정도 이해를 하게 되었고 한참이 지난 지금에 와서야 6개월 만에 bandit34를 끝내게 되었다
정말 내가 해낼 수 있을까 하면서 계속 미루던 것을 끝내니 너무 속이 편해진다
이제는 다른 워게임이나 공부를 하기 전에 먼저 Udemy에서 신청한 강의를 들어야겠다
아 참 블로그를 작성하다가 생긴 요령인데
이런 사이트에서 문제를 캡쳐해 올 때 오른쪽 위의 Donate
와 Help
같은 찍었을 때 없앴으면 좋겠는 부분이 있으면
F12로 관리자 모드에 들어가서 Delete Elements
로 삭제해 버리면 된다
정말로 끝