1. level0
putty 를 실행시키고 host를 bandit.labs.overthewire.org로 입력하고, port는 2220으로 설정해줍니다.
username과 password는 둘다 bandit0이고, 이를 입력하면 다음 단계로 넘어갑니다.
2. level0->level1
리눅스 명령어가 몇개 필요한데, 모르는게 많아서 정리하겠습니다.
1) cat: 파일의 내용을 표준 출력으로 내보내어 파일 내용을 알아보거나,
여러 파일을 하나의 파일로 출력하여 연결합니다.
2) ls: 디렉토리와 파일의 정보를 출력합니다.
3) cd: 디렉토리를 이동할때 사용하는 명령어입니다.
solution)
ls ->readme 파일 뜸
cat readme ->readme 파일 안의 비밀번호 찾을 수 있음
password: boJ9jbbUNNfktd78OOpsqOltutMc3MY1
3. level1->level2
solution)
1) ls -> -이라는 파일이 뜹니다. 이를 dashed filename 이라고 하는데, dashed filename앞에
./를 앞에 붙여주면 -를 감춰주는 역할을 한다고 합니다.
2) cat ./-
패스워드: CV1DtqXWVFXTvM2F0k09SHz0YwRINYA9
4. level2->level3
1) ls -> spaces in this filename이라는 파일이 뜹니다.
2) cat+tab-> tab을 누르면 자동완성으로 파일명을 알 수 있습니다
cat spaces\ in\ this\ filename
패스워드: UmHadQclWmgdLOKQ3YNgjWxGoRMb5luK
5. level3->level4
1) ls-> inhere파일 찾음
2) find inhere
inhere안에 inhere/.hidden이라는 파일명을 찾을 수 있다.
3)cat inhere/.hidden
:패스워드가 숨겨져 있다.
패스워드: pIwrPrtPN36QITSp3EQaw936yaFoFgAB
6. level4->level5
1) ls
2)find inhere
파일이 여러개 있다.
3) 처음부터 cat을 차근차근 해보면 -file07에서 암호를 찾을 수 있다.
패스워드:koReBOKuIDDepwhWk7jZC0RTdopnAYKh
7. level5->level6
1) ls
2) find inhere
파일이 아주 많지만, 조건에 맞는 파일(1033byte)인 파일을 찾아야 한다.
여기서 size를 찾는 명령어를 몰라서 검색을 해보았다.
find ./(filename) -size (용량)으로 입력하면 정확히 맞는 파일을 찾을 수 있었다.
b : 블록단위 512kb
c : byte
k : kbyte
w : 2byte 워드
3) 용량에 맞는 파일은 ./inhere/maybehere07/.file02였다.
cat ./inhere/maybehere07/.file02
패스워드:DXjZPULLxYr17uwoI01bNLQbtFemEgo7
8. level6->level 7
1) 조건에 맞는 파일 이름을 찾아야 한다.
find / -user bandit7 -group bandit6 -size 33c
2) 조건에 맞는 파일을 찾을 수 있다.
cat /var/lib/dpkg/info/bandit7.password
패스워드: HKBPTKQnIay4Fw76bEy8PVxKEDQRKTzs
9.level7->level8
data.txt라는 파일 안에서 millionth라는 단어 뒤의 암호를 찾아야 합니다.
1. grep "(문자열)" (파일명) 을 입력하면
millionth라는 단어 뒤에 암호가 숨겨져 있다.
패스워드: cvX2JJa4CFALtqS87jk27qwqGhBM9plV
10. level8->level9
1. cat data.txt
2. sort data.txt | uniq -c
하면 문자열이 줄대로 정렬이 되고, 그 앞에 특정 문자열이 몇번 나왔는지 횟수가 보이게 된다.
sort 와 uniq는 같이 쓰기 좋다. (uniq- 반복되는 문자열은 제거하고 횟수를 보여줌)
패스워드: UsvVyFSfZZWbi6wgC7dAFyFuR6jQQUhR
패스워드: UsvVyFSfZZWbi6wgC7dAFyFuR6jQQUhR
11. level9->level10
==로 시작하는 data.txt 안의 문자열을 찾아야 한다.
strings data.txt
를 입력하면 사용한 문자열만 추출해준다.
패스워드:truKLdjsbJ5g7yyJ2X2R0o3a5HQJFuLk
12. level10->level11
base 64로 인코딩된 내용을 디코딩 해주어야 한다.
1. base64 -d data.txt
패스워드: IFukwKGsFW8MOq3IRFqrxE1hxTNEbUPR
IFukwKGsFW8MOq3IRFqrxE1hxTNEbUPR
13. level 11->level 12
rot 13이라는 암호체계로 암호화된 문자열을 복호화시켜주어야 한다.
rot 13이란 현재 알파벳을 13개 다음의 문자열로 변환시키는 암호체계이다.
이를 decrpyt 하기 위해 cat data.txt | tr 'A-Za-z' 'N-ZA-Mn-za-m'을 입력해주었더니 패스워드를 찾을 수 있었다.
패스워드:5Te8Y4drgCRfCx8ugdwuEX8KFC6k2EUu
14. level 12-> level 13
과정이 갑자기 복잡해져서 당황했던 문제이다.
압축되어져 있는 데이터 파일을 압축을 풀어주는 과정을 계속 반복해야 했었다.
사용되었던 명령어)
1. mkdir : 새로운 디렉토리를 만든다
2. mv : 데이터 파일을 옮긴다.
3. cp : 데이터의 파일을 복사한다.
4. file: 파일의 정보를 보여준다.
5. gzip : gz 확장자의 압축을 풀어준다.
6. tar -xvf : tar 파일의 압축을 풀어준다.
7. bunzip2: bz2 파일의 압축을 풀어준다.
(풀었던 과정)
bandit12@bandit:~$ mkdir /tmp/jiyul
mkdir: cannot create directory ‘/tmp/jiyul’: File exists
bandit12@bandit:~$ mkdir /tmp/jiyul2
bandit12@bandit:~$ cp data.txt/tmp/jiyul2
cp: missing destination file operand after 'data.txt/tmp/jiyul2'
Try 'cp --help' for more information.
bandit12@bandit:~$ cp data.txt /tmp/jiyul2
bandit12@bandit:~$ cd /tmp/jiyul2
bandit12@bandit:/tmp/jiyul2$ xxd -r data.txt>data
bandit12@bandit:/tmp/jiyul2$ file data
data: gzip compressed data, was "data2.bin", last modified: Tue Oct 16 12:00:23 2018, max compression, from Unix
bandit12@bandit:/tmp/jiyul2$ mv data data.gz
bandit12@bandit:/tmp/jiyul2$ gzip -d data.gz
bandit12@bandit:/tmp/jiyul2$ file data
data: bzip2 compressed data, block size = 900k
bandit12@bandit:/tmp/jiyul2$ mv data data.bz2
bandit12@bandit:/tmp/jiyul2$ bunzip2 data.bz2
bandit12@bandit:/tmp/jiyul2$ file data
data: gzip compressed data, was "data4.bin", last modified: Tue Oct 16 12:00:23 2018, max compression, from Unix
bandit12@bandit:/tmp/jiyul2$ mv data data.gz
bandit12@bandit:/tmp/jiyul2$ gzip -d data.gz
bandit12@bandit:/tmp/jiyul2$ file data
data: POSIX tar archive (GNU)
bandit12@bandit:/tmp/jiyul2$ mv data data.tar
bandit12@bandit:/tmp/jiyul2$ tar -xvf data.tar
data5.bin
bandit12@bandit:/tmp/jiyul2$ file data5.bin
data5.bin: POSIX tar archive (GNU)
bandit12@bandit:/tmp/jiyul2$ mv data5.bin data5.tar
bandit12@bandit:/tmp/jiyul2$ tar -xvf data5.tar
data6.bin
bandit12@bandit:/tmp/jiyul2$ file data6.bin
data6.bin: bzip2 compressed data, block size = 900k
bandit12@bandit:/tmp/jiyul2$ mv data6.bin data6.bz2
bandit12@bandit:/tmp/jiyul2$ bunzip2 data6.bz2
bandit12@bandit:/tmp/jiyul2$ file data6
data6: POSIX tar archive (GNU)
bandit12@bandit:/tmp/jiyul2$ mv data6 data6.tar
bandit12@bandit:/tmp/jiyul2$ tar -xvf data6.tar
data8.bin
bandit12@bandit:/tmp/jiyul2$ file data8.bin
data8.bin: gzip compressed data, was "data9.bin", last modified: Tue Oct 16 12:00:23 2018, max compression, from Unix
bandit12@bandit:/tmp/jiyul2$ mv data9.bin data9.gzip
mv: cannot stat 'data9.bin': No such file or directory
bandit12@bandit:/tmp/jiyul2$ mv data9.bin data9.gz
mv: cannot stat 'data9.bin': No such file or directory
bandit12@bandit:/tmp/jiyul2$ mv data8.bin data8.gz
bandit12@bandit:/tmp/jiyul2$ gzip -d data8.gz
bandit12@bandit:/tmp/jiyul2$ file data8
data8: ASCII text
bandit12@bandit:/tmp/jiyul2$ cata data8
-bash: cata: command not found
bandit12@bandit:/tmp/jiyul2$ cat data8
The password is 8ZjyCRiBWFYkneahHwxCv3wb2a1ORpYL
15. level 13->14
숨겨져있는 sshkey 파일을 통해서 바로 bandit14로 넘어갈 수 있다.
1. ssh -i sshkey.private bandit14@localhost
16. level 14->15
위 문제에서 암호가 숨겨져있는 파일을 알려주었다.
1. cat /etc/bandit_pass/bandit14
2. nc localhost 30000
포트 30000번으로 들어가서 위에서 찾은 비밀번호를 입력해준다.
패스워드:BfMYroe26WYalil77FoDi9qh59eK5xNr
17. level 15->16
ssl protocol을 사용하라고 문제에서 명시해주었으니, openssl을 사용해서 연결해야 한다.
그리고 저번에 사용했던 비밀번호를 그대로 30001번 포트에 옮겨주어야 하는 문제이다.
여기서 몇가지 명령어를 알아야 했다.
1) s_client : ssl server에 연결하는 ssl client 프로그램을 실행 시켜준다.
서버의 ssl인증서 정보 등을 살펴 볼 수 있다.
s_client 사용법: openssl s_client -connect host:port [옵션]
-> this implements a generic ssl/tls client which can establish a transparent connection to a remote server speaking ssl/tls. It's intended for testing perposes only and provides only rudimentary interface functionality but internally uses mostly all functionality of the openssl ssl library.
2) echo: 문자열을 넘겨줄 수 있다.
3) -connect host:port -> 접속할 호스트와 실행중인 포트를 지정한다 (ex) localhost:30001)
4) -quiet/ -ign_eof : 입력이 파일 끝에 도달하면 접속이 종료되는데 이를 방지해주는 역할을 한다.
1. echo "이전 비밀번호" | openssl s_client -connect localhost:30001 -quiet
->이를 입력해주면 다음 패스워드가 뜬다.
패스워드: cluFn7wTiGryunymYOu4RcffSxQluehd
패스워드: cluFn7wTiGryunymYOu4RcffSxQluehd
18. level 16->level 17
1. nmap으로 31000부터 32000까지의 포트를 스캔해서 열려있는 포트를 찾아주어야 한다.
nmap localhost -p31000-32000
->열려있는 포트 31790을 찾을 수 있다.
2. 열려있는 포트 31790에 전 단계의 비밀번호를 그대로 입력해주면 sshkey값을 돌려준다.
echo "cluFn7wTiGryunymYOu4RcffSxQluehd" |openssl s_client -connect localhost:31790 -quiet
3. 여기 sshkey값을 다른 디렉토리를 만들어 복사해준다.
echo "cluFn7wTiGryunymYOu4RcffSxQluehd" |openssl s_client -connect localhost:31790 -quiet > /tmp/17.prviate
4. 이 다음 단계에서 바로 tmp/17.private으로 접속해주려 했으나 너무 오픈된 파일이라 권한을 설정해주어야 한다고 한다.
chmod 명령어로 권한을 설정해주었다.
->chmod 600 /tmp/17.private
5. 17.private파일을 이용해 bandit17로 넘어가주었다.
ssh-i /tmp/17.private localhost@bandit17
19. level17->level 18
1. ls
passwords.old passwords.new
파일 두개를 찾을 수 있다. 두 파일에서 다른 점을 찾아야 한다.
2. diff passwords.new passwords.old
여기서 비밀번호는 passwords.new라고 했으므로 passwords.new에서 달라진 내용이 비밀번호가 된다.
패스워드: kfBf3eYk5BPBRzwjqutbbfE887SVc5Yd
20. level 18->level 19
bandit18에 로그인을 하면 바로 로그아웃이 되어버린다.
이는 문제에서 누군가 bashrc의 내용을 로그아웃되게 바꿔놓았다고 명시해놓았는데, 이 때문에 바로 로그인하는 것이 아니라 bandit17에서 우회해서 바로 로그인되도록 해야 겠다고 생각을 했다.
tip! bashrc란 bash shell에서 환경설정을 위해 로드하는 파일 중 하나라고 한다. 사용자가 로그인을 시도하려고 하면 인증 과정을 거친 뒤 login shell을 띄워주게 되는데, 이 과정에서 profile, bashrc, .bashrc, .bash_profile등등의 파일들을 실행하면서 .profile을 로드하게 되고, 이걸 실행하면서 .bashrc가 불리게 된다고 한다.
또 구글링 해본 결과, ssh에 명령어를 줘서 실행할 경우 login shell을 실행하지 않아 bashrc가 실행이 되지 않는다고 한다.
1. readme라는 파일을 읽어야 하므로 bandit17에서
ssh bandit18@localhost cat readme를 실행시켜준다.
2. bandit18의 비밀번호를 입력하면, 다음단계의 비밀번호를 찾을 수 있다.
패스워드: IueksS7Ubh8G3DCwVzrTd8rAVOwq3M5x
21. bandit19->bandit20
bandit20의 권한이 필요하다.
따라서 ls 를 하여 bandit20-do파일을 찾은후, ./bandit20-do cat /etc/bandit_pass/bandit20 을 입력하여
bandit20-do파일의 권한을 빌려서 패스워드가 들어있는 파일을 읽을 수 있다.
패스워드:GbKksEFF4yrVs6il55v6gwY5aVje5f0j
22. bandit20->bandit21
1. nc명령어로 포트를 하나 열어주고, 거기에 전 비밀번호를 넣어준다.
nc -l -p 31555 < /etc/bandit_pass/bandit20 &
2. setuid 파일을 이용해 연결해준다.
./suconnect 31555
자동으로 전의 패스워드가 입력되면서 비교가 되고, 다음 패스워드를 얻을 수 있다.
패스워드: gE269g2h3mw3pwgrj0Ha9Uoqen1c9DGr
23. bandit 21->bandit 22
1. ls /etc/cron.d
2. cat /etc/cron.d/cronjob_bandit22
이를 통해 위 크론탭이 무슨 일을 하는지 볼 수 있다.
3. cat /usr/bin/cronjob_bandit22.sh
4. cat /tmp/t7O6lds9s9S0RqQh9aMcz6ShpAoZkF7fgv
->패스워드가 나온다.
패스워드: Yk7owGAcWjwMVRwrTesJEwB7WVOiILLI
24. bandit 22->bandit 23
1. ls /etc/cron.d
2. cat /etc/cron.d/cronjob_bandit23
이를 통해 위 크론탭이 무슨 일을 하는지 볼 수 있다.
3. cat /usr/bin/cronjob_bandit23.sh
4. echo I am user bandit23 | md5sum | cut -d '' -f 1
5. cat /tmp/8ca319486bfbbc3663ea0fbe81326349
패스워드: jc1udXuA1tiHqjIsL8yaapX5XIAI6i0n
25. bandit 23->bandit 24
꽤 헤멨던 문제이다. 파일이 제거되는 시간제한이 있는것을 간과하고 문제를 풀었더니 패스워드 파일을 읽어낼 수가 없었다.
1. ls /etc/cron.d
2. cat /etc/cron.d/cronjob_bandit24
여기서 이 cron이 무슨 동작을 하는지 볼 수 있었다,
모든 파일이 삭제될때까지 동작하는 파일이라고 짐작하였다.
3. cd /var/spool/bandit24
4. 새로운 스크립트를 만든다.
1) setuid가 존재하는 cronjob_bandit.sh 스크립트가 bandit24의 권한을 가지고 /var/spool/bandit24안의 파일을 실행할 수 있게 한다.
2) 1분 정도 후에 bandit24의 권한이 실행되고, 그 후에 읽을 수 있을 것이다.
-> vi password.sh
#!/bin/sh
cat /etc/bandit_pass/bandit24 > ./showpassword (cat을 통해 내용을 복사할 수 있다)
5. chmod 777 password.sh를 통해 권한을 올려준다.
6. ls-al을 계속 반복하면서 showpassword가 생성되었는지 확인한다.
7. 생성이 되었다면 즉시 cat showpassword를 통해 패스워드를 읽어내야 한다.
password: UoMYTrfrBFHyQXmg6gzctqAwOmw1IohZ
26.bandit 24->bandit 25
bandit 24의 암호+정해져있는 네자리 코드를 포트 30002번에 넣어야 하는 문제였다.
1. cd /tmp/TT
2. vi air.sh
#!/bin/bash
pw="UoMYTrfrBFHyQXmg6gzctqAwOmw1IohZ"
for i in {0..9999}
do
echo "$pw $i" >> /tmp/TT/pwlist
done;
vi 편집기를 이용해서 0~9999사이의 모든 숫자를 돌아가게 하는 스크립트를 하나 짜주었다.
3. nc 127.0.0.1 30002 < ./pwlist
위 포트로 모든 리스트를 집어넣어주면 어느 한 구간에서 correct! 되어 패스워드를 찾을 수 있다.
패스워드: uNG9O58gUE7snukf3bvZ0rxhtnjzSGzG
27. bandit 25->bandit 26
1. cat /etc/passwd
2. cat /usr/bin/showtext
-> more ~/text.txt라는 명령을 확인 할 수 있다.
구글링 결과, more는 vi 편집기를 기반으로 하고, 화면에 내용을 모두 출력시킨 뒤 종료가 되는데, 이를 이용해서 푸티 화면을 아주 작게 만든다면, more가 실행중인 상태에 진입할 수 있는 것이다.
3. ssh-i ./bandit26.sshkey bandit26@localhost
4.
v(vi 편집기에 진입)->:r /etc/bandit_pass/bandit26
의 명령을 삽입하면 패스워드를 알아낼 수 있다.
vi에서는 특정 명령어를 실행할 수도 있고, 쉘을 지정하여 실행시킬 수 있는 기능도 있다고 한다.
패스워드: 5czgV9L3Xx8JPOyRbXh6lQbmIOWvPT6Z
28. bandit 26->bandit 27
1. ls
2. ./bandit27-do cat /etc/bandit_pass/bandit27
권한이 존재하므로 그걸 통해 그냥 패스워드를 읽을 수 있다.
패스워드: 3ba3118a22e93127a4ed485be72ef5ea
29. bandit27->bandit28
1. ls -l
root로 권한설정이 되어있으므로 tmp디렉토리에서 파일을 복제해야 한다.
2. cd /tmp/TT
3. git clone ssh://bandit27-git@localhost/home/bandit27-git/repo
git 파일을 다운받는다.
4. 그러면 다시 비밀번호를 입력하고,
ls -l repo
README 라는 파일이 존재하지만 바로 읽을수는 없어서 다시 디렉토리 이동을 해주어야 했다.
5. cd /repo
6. cat README
패스워드:0ef186ac70e04ea33b4c1853d2526fa2
30. bandit 28->bandit29
1. ls -l
2. cd /tmp/TT28
3. git clone ssh://bandit28-git@localhost/home/bandit28-git/repo
비밀번호를 입력한다.
4. ls -l
5. cd repo/
6. cat README.md
-> 여기까진 전 과정과 같다.
7. 이 git파일에서 비밀번호가 누군가에 의해 수정이 되었으므로 수정되기 전 내역을 찾아야 한다.
git 명령어에서는 그 전에 수정 과정을 상세히 볼수 있는 log -p 명령어가 있었다.
git log -p
8. 누군가 비밀번호를 바꿔놓은 과정을 살펴볼수 있다.
패스워드: bbc96594b4e001778eee9975372716b2
31. bandit29 ->bandit 30
위에서와 6번과정까지 동일하다.
1. 하지만 git파일의 로그를 살펴보아도 패스워드가 바뀐 점을 찾을 수가 없었다.
따라서 이 브랜치에 비밀번호가 없다고 생각하고, 다른 브랜치로 이동해야겠다고 생각했다.
2. git branch -r
로 이동할수 있는 다른 브랜치를 찾아보았다. 총 네개가 나왔는데, 모두 내용을 살펴본 결과 한개의 브랜치에서 뭔가 내용이 있는걸 발견했다.
3. git merge origin/dev
이 git에서 두개의 readme 파일이 있었다.
4. git log -p 를 이용해 readme 파일에서 비밀번호가 바뀐 내역을 확인할 수 있었다.
패스워드: 5b90576bedb2cc04c86a9e924ce42faf
32. bandit30->bandit31
위의 내용과 1,2번까지 동일하다, 그렇지만 어떤 브랜치도 찾을 수가 없었다.
1. 그래서 다시 repo파일을 뜯어보기로 생각했다.
ls -al /tmp/TT30/repo
->.git라는 디렉토리를 찾을 수 있었다.
2. cd .git
3. ls -al
여러 디렉토리들이 나왔다. 하나하나 cat을 해보던 도중 packed-refs에서 secret tag를 찾을 수 있었다.
tag파일이 무엇인지 몰라서 찾아보니 커밋을 참조하기 쉽도록 이름을 붙이는 것이라고 한다. 각종 주석과 설명을 덧붙일 수 있는 내용이라고 한다. 즉 뭔가 새로운 내용이 있을것 같아서 show tag 명령어를 해보기로 했다.
4. git show secret
-> 패스워드를 찾을 수 있다.
패스워드: 47e603bb428404d265f59c42920d81e5
33.bandit 31->bandit 32
역시 git파일을 다운받은 뒤 과정부터 시작하겠다.
1. ls
2. cat README.md
key.txt라는 파일을 만들어서 May I come in?이라는 내용을 적어서 저장소에 push하라는 명령이 담겨있었다.
3. vi key.txt
-> vi 편집기를 이용해 May I come in? 이라고 스크립트를 적어주었다.
4. git add key.txt
add라는 명령어를 통해 master branch에 추가해주려고 했지만, .gitignore 디렉토리의 내용이 막았기 때문에 -f 명령어를 넣어주었다.
5. git commit
찾아보니까 커밋된 파일만 push가 가능하다고 해서 파일을 commit해주었다.
저장소위치가 있는 부분을 주석처리를 떼주면 된다고 한다.
6. git push
->비밀번호를 다시 입력한다
7. 패스워드를 찾을 수 있다.
패스워드 : 56a9bf19c63d650ce78e6ec0354ee45e
34. bandit 32->bandit33
uppercase shell이라는 이름을 보고 뭔가 대문자에 관련된 문제라고 생각했다.
일단 무슨 문자열이든 입력을 해보니 모든 문자열을 대문자로 바꿔버렸다.
전혀 감을 못잡겠어서 쉘에 대한 명령어를 찾아보니 $0을 입력하면 bash shell로 전환이 가능하다고 한다.
바로 ls /etc/bandit_pass를 하니 bandit32 디렉토리를 찾을 수 있었다.
cat /etc/bandit_pass/bandit32-> 패스워드를 읽을 수 있었다.
패스워드: c9c3199ddf4121b10cf581a98d51caee
35. finish!
리눅스에 대해 아는게 많이 없어서 시간이 꽤 많이 걸렸던 것 같다. 밴딧의 힌트와 구글링에 많이 의존했기 때문에 앞으로는 개념에 대해 공부를 병행하면서 과제를 풀 것이다.