예전부터 하루 날 잡아서 풀어봐야지 하던 bandit을 저녁부터 새벽까지 쭉 풀어봤다.
간단한 리눅스 설정이랑 명령어들 사용하는 워게임이라고 보면 된다.
level 33까지 있고, 내용이 어렵지는 않아 그냥 쭉 정리만 했다.
level 0
1
ssh bandit0@bandit.labs.overthewire.org -p 2220
id, pw 둘 다 bandit0이고, ssh 접속하면 된다.
level 0 -> level 1
들어가면 저런 pw가 있다.
이 값으로 bandit 1로 로그인이 잘 된다.
level 1 -> level 2
파일 이름을 특문으로 해서 바로 안되게 한 것 같은데 현재 폴더를 다 읽는 트릭으로 우회가 된다.
level 2 -> level 3
파일 이름이 공백이 들어가서 이렇게 생겼다.
cat ./* 면 다 해결이 되지만 원하는 대로 해줬다.
level 3 -> level 4
디렉토리가 하나 있고, 들어가니 숨겨진 파일이 있어서 읽어줬다.
level 4 -> level 5
사람이 읽을 수 있는 파일이 비번이라고 한다.
ASCII text는 file07이므로 이걸 가져온다.
level 5 -> level 6
The password for the next level is stored in a file somewhere under the inhere directory and has all of the following properties:
- human-readable
- 1033 bytes in size
- not executable
이게 조건이고, 들어가보면 파일이 꽤나 많다.
1
2
3
find . -type f -size 1033c ! - executable 를 통해서 보면
./maybehere07/.file2
라고 하고, 읽어주면 된다.
level 6 -> level 7
- owned by user bandit7
- owned by group bandit6
- 33 bytes in size
이게 조건이다.
1
find / -user bandit7 -group bandit6 -size 33c
로 쭉 보다보면
1
bandit6@bandit:~$ cat /var/lib/dpkg/info/bandit7.password
에 있는 값을 찾을 수 있다.
level 7 -> level 8
millionth 단어 옆에 있다고 하니까
1
2
bandit7@bandit:~$ cat data.txt | grep millionth
millionth VR1ljMayciFxbnUokuQmJFw6QC9VKtub
level 8 -> level 9
data.txt에서 한번만 나온 단어를 찾으란다.
1
2
bandit8@bandit:~$ sort data.txt | uniq -u
EjmOSvuAu7sGAHqHVcBDPirRe9T03kxl
정렬을 해준 다음에 uniq로 중복되지 않은 줄만 출력한다.
level 9 -> level 10
data.txt에서 사람이 읽을 수 있는 몇개의 줄이 있고, 앞에 ==== 이 있다고 한다.
1
2
3
strings data.txt를 하면
========== B0s2khmbT9u0geKuOoVGW3JZKhndE3BG
가 있다.
level 10 -> level 11
base64 인코딩되어있다고 한다.
1
2
3
4
5
bandit10@bandit:~$ cat data.txt
VGhlIHBhc3N3b3JkIGlzIGR0UjE3M2ZaS2IwUlJzREZTR3NnMlJXbnBOVmozcVJyCg==
bandit10@bandit:~$ base64 -d data.txt
The password is pYfOY6HwUsDj5rL9UvyhU7MCmv8vN5Ro
bandit10@bandit:~$
level 11 -> level 12
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
ROT13으로 밀어서 암호화되어있으니 돌려주면 된다.
1
2
3
cat data.txt | tr 'a-zA-Z' 'n-za-mN-ZA-M'
The password is GROozWPO8QyN0mGrjUkID0WCYkZiQxrN
이런 방법이 있다고 하네요.
level 12 -> level 13
txt파일이 주어지는데 이것이 압축 파일이라고 한다.
그리고 지금 경로는 쓰기 권한이 없기 때문에 tmp 파일로 옮기고 시작한다.
cp를 통해서 올려주고 나머지는 순서대로 압축을 풀고 풀고 풀면 된다.
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
bandit12@bandit:/tmp/kk$ ls
kk.txt
bandit12@bandit:/tmp/kk$ xxd -r kk.txt > a.bin
bandit12@bandit:/tmp/kk$ file a.bin
a.bin: gzip compressed data, was "data2.bin",
last modified: Tue Oct 14 09:26:06 2025, max compression, from Unix, original size modulo 2^32 564
bandit12@bandit:/tmp/kk$ mv a.bin a.gz
bandit12@bandit:/tmp/kk$ ls
a.gz kk.txt
bandit12@bandit:/tmp/kk$ gzip a.gz
gzip: a.gz already has .gz suffix -- unchanged
bandit12@bandit:/tmp/kk$ ls
a.gz kk.txt
bandit12@bandit:/tmp/kk$ gzip -r a.gz
bandit12@bandit:/tmp/kk$ ls
a.gz kk.txt
bandit12@bandit:/tmp/kk$ gzip -d data.gz
gzip: data.gz: No such file or directory
bandit12@bandit:/tmp/kk$ gzip -d a.gz
bandit12@bandit:/tmp/kk$ file a
a: bzip2 compressed data, block size = 900k
bandit12@bandit:/tmp/kk$ mv a a.bz2
bandit12@bandit:/tmp/kk$ bzip2 -d a.bz2
bandit12@bandit:/tmp/kk$ file a
a: gzip compressed data, was "data4.bin", last modified: Tue Oct 14 09:26:06 2025, max compression, from Unix, original size modulo 2^32 20480
bandit12@bandit:/tmp/kk$ mv a a.gz
bandit12@bandit:/tmp/kk$ gzip -d a.gz
bandit12@bandit:/tmp/kk$ file a
a: POSIX tar archive (GNU)
bandit12@bandit:/tmp/tt$ mv a a.tar
bandit12@bandit:/tmp/tt$ tar -xf a.tar
bandit12@bandit:/tmp/kk$ ls
a.tar data5.bin kk.txt sol.txt
bandit12@bandit:/tmp/kk$ file data.5bin
data.5bin: cannot open `data.5bin' (No such file or directory)
bandit12@bandit:/tmp/kk$ file data5.bin
data5.bin: POSIX tar archive (GNU)
bandit12@bandit:/tmp/kk$ mv data5.bin data5.tar
bandit12@bandit:/tmp/kk$ tar -xf data5.tar
bandit12@bandit:/tmp/kk$ ls
a.tar data5.tar data6.bin kk.txt sol.txt
bandit12@bandit:/tmp/kk$ file data6.bin
data6.bin: bzip2 compressed data, block size = 900k
bandit12@bandit:/tmp/kk$ mv data6.bin b.bz
bandit12@bandit:/tmp/kk$ bzip2 -d b.bz
bandit12@bandit:/tmp/kk$ ls
a.tar b data5.tar kk.txt sol.txt
bandit12@bandit:/tmp/kk$ file b
b: POSIX tar archive (GNU)
bandit12@bandit:/tmp/kk$ mv b b.tar
bandit12@bandit:/tmp/kk$ tar -xf b.tar
bandit12@bandit:/tmp/kk$ ls
a.tar b.tar data5.tar data8.bin kk.txt sol.txt
bandit12@bandit:/tmp/kk$ file data8.bin
data8.bin: gzip compressed data, was "data9.bin", last modified: Tue Oct 14 09:26:06 2025, max compression, from Unix, original size modulo 2^32 49
bandit12@bandit:/tmp/kk$ mv data8.bin c.gz
bandit12@bandit:/tmp/kk$ gzip -d c.gz
bandit12@bandit:/tmp/kk$ file c
c: ASCII text
bandit12@bandit:/tmp/kk$ cat c
The password is qQYQiHOBPR8zR61qxYqX45quvihF2uzk
압축 풀기 노가다를 하다보면 나온다.
level 13 -> level 14
이번엔 ssh연결 할 때 private key로 하는 것이다.
이게 mac 의 정책인지는 모르겠는데 ssh에서 ssh를 또 들어가는 것이 안되나보다.
sshkey가 주어져있기에 복사한 다음 밖으로 나와서 이렇게 하면 연결이 된다.
개인키니까 권한은 600을 줘야한다.
1
ssh -i key.txt bandit14@bandit.labs.overthewire.org -p 2220
비번의 경로는 /etc/bandit_pass/bandit14
1
bandit14@bandit:~$ cat /etc/bandit_pass/bandit14
level 14 -> level 15
1
2
3
4
bandit14@bandit:~$ nc localhost 30000
aaWecNkG4FhxJQxz07uiwzVP6bJiYS65
Correct!
pbLYuZtTg4MgaqfJx8jbA9gKKGqM68A7
지금 비번을 30000 포트로 넘기면 된다고 한다.
level 15 -> level 16
이번엔 포트 30001인데 tls나 ssl을 적용하라고 한다.
1
openssl s_client -connect localhost:30001
이렇게 연결을 한 다음 비번을 보내자.
1
2
3
pbLYuZtTg4MgaqfJx8jbA9gKKGqM68A7
Correct!
kS0Hf0u5HiXFwKMKFqXvPdOTNGGa0X8V
level 16 -> level 17
31000-32000 에서 ssl로 열려있는 포트를 찾고 거기로 인증을 받으라고 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
bandit16@bandit:~$ nmap localhost -p 31000-32000
Starting Nmap 7.94SVN ( https://nmap.org ) at 2026-03-05 06:07 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00011s latency).
Not shown: 996 closed tcp ports (conn-refused)
PORT STATE SERVICE
31046/tcp open unknown
31518/tcp open unknown
31691/tcp open unknown
31790/tcp open unknown
31960/tcp open unknown
Nmap done: 1 IP address (1 host up) scanned in 0.05 seconds
우선 이렇게 열려있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
bandit16@bandit:~$ nmap -sV localhost -p 31000-32000
Starting Nmap 7.94SVN ( https://nmap.org ) at 2026-03-05 06:14 UTC
Stats: 0:00:20 elapsed; 0 hosts completed (1 up), 1 undergoing Service Scan
Service scan Timing: About 0.00% done
Stats: 0:00:31 elapsed; 0 hosts completed (1 up), 1 undergoing Service Scan
Service scan Timing: About 0.00% done
Stats: 0:00:35 elapsed; 0 hosts completed (1 up), 1 undergoing Service Scan
Service scan Timing: About 0.00% done
Stats: 0:01:20 elapsed; 0 hosts completed (1 up), 1 undergoing Service Scan
Service scan Timing: About 80.00% done; ETC: 06:16 (0:00:20 remaining)
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00018s latency).
Not shown: 996 closed tcp ports (conn-refused)
PORT STATE SERVICE VERSION
31046/tcp open echo
31518/tcp open ssl/echo
31691/tcp open echo
31790/tcp open ssl/unknown
31960/tcp open echo
더 자세히 알아보면 나머지는 echo인데 31790은 아니다.
openssl로 똑같이 31790에 접근해서 보내는데 왠지 KEYUPDATE가 뜬다.
찾아보니 k가 입력되면 KEYUPDATE라는 내부 기능이 실행된다는데..
1
openssl s_client -connect localhost:31790 -ign_eof
옵션을 붙인 후 하면 개인키를 잘 준다.
내용이 길어져서 17->18 부터는 다음 글에서 계속