프론티어_리눅스 기반 시스템 탐색 및 데이터 분석 (Bandit 0–24)
OverTheWire Bandit Level 0~24 풀이 모음
Level 0 Level 1→2 Level 2→3 Level 3→4 Level 4→5 Level 5→6 Level 6→7 Level 7→8 Level 8→9 Level 9→10 Level 10→11 Level 11→12 Level 12→13 Level 13→14 Level 14→15 Level 15→16 Level 16→17 Level 17→18 Level 18→19 Level 19→20 Level 20→21 Level 21→22 Level 22→23 Level 23→24 Level 24→25
solved
Level 0
해당 문제에서 쓴 리눅스 명령어: ls : 디렉토리의 내용을 출력한다. -l : 상세 내용을 출력 -a : 숨긴 파일도 출력 cat : 파일을 읽어서 쉘에 출력할 때 사용한다

ls 검색 후, cat readme하면 바로 다음 문제가 나옴..!

solved
Level 1 → 2

-
<-- 이거 하려고 뭐 cd 이런거 다 쳐보다가 약간 노가다로 이런거 저런거 다 해보다가 약간 운이 좋게?.. 풀게 됨...
-
이걸로 파일을 실제로 만드는 것은 안 좋다고 했고, < 이거나 ./ <- 이런걸로 실제로 열수 있다고 한다.
이유: cat - 으로 시작하게 되면 옵션값으로 들어가는 경우가 생긴다. 그래서 실제로 ./를 명시하면서 지금 있는 디렉토리인 것을 명시해줘야한다.

solved
Level 2 → 3

이거는 그냥 spaces일 때 " " <-- 이거를 사용한다고 알고 있어서 빠르게 풀었다.
보통 ls 후, 중간 중간 띄어쓰기가 있는 파일 제목과 같은 경우에는 " "로 묶어줘야 하나의 파일 제목이라고 명시를 해줄 수 있다.
그게 아니면 spaces, in, this filename을 각자 따로 따로 cat을 하게 된다.

solved
Level 3 → 4

이것도.,..그냥 -al <-- 이런거 치면 숨긴 파일 + 상세 파일 정보명이 뜬다고 알고 있어서 항상 ls만 안치고 ls -al 까지 치는 습관이 있어서 그렇게 했더니 풀린 문제.
level 0에 간략하게 적어놨는데, 리눅스 명령어에서는
<명령어> <옵션> 을 붙일 수 있다. ls와 같은 경우에는 -a, -l 등 여러 가지 옵션을 활용해서 기존 명령어보다 더 다양한 상황에서 활용할 수 있다.

solved
Level 4 → 5

지금은 무식하게 풀었다.
지금 cat ./-file07에 있는 부분이 검은색으로 정답을 칠해놔서 안 보이지만, 하나씩 다 찍어보면서 이게 우리가 읽을 수 있는 값인지 아닌지를 체크했다.
다른 정답들도 비교해봤을 때는 file이라는 명령어를 활용해서 이 친구의 file의 타입을 알 수 있다. 보통 그렇게 많이 푼 것 같다.

solved
Level 5 → 6

이거는 무식하게 못 풀듯???

find 함수를 쓰라는 것 같은데..
https://coding-factory.tistory.com/804
여기에 있는 거를 참고..했다.
find . -size 1033c.
풀어서 써보면, 현재 dir에 있는 파일 중에 size가 1033 bytes 를 찾아줘라. 이런 뜻이다. 다른 3개의 조건들이 있었지만 가장 간단한 조건 같아서 1033c를 적용하였다.
find [옵션] [경로] [표현식] [옵션] -P : 심볼릭 링크 따라가지 않음. 자체 정보 사용 -L : 심볼릭 링크에 연결된 파일 정보 사용 [표현식] -name : 지정된 문자열 패턴에 해당하는 파일 검색 -empty : 빈 dir, 크기 0 파일 검색. -path : 지정된 문자열 패터에 해당하는 경로에서 검색. -size : 파일 크기를 사용하여 파일 검색

solved
Level 6 → 7

https://server-talk.tistory.com/20
이거는 이거 찾아봤음..

뒤에 오류 아무것도 안 뜨는 거를 찾아서 cat을 해봤더니 풀렸음..
find / -user bandit7 -group bandit6 -size 33c
하나 씩 풀어서 설명해보자면
루트 디렉토리 아래에서 user, 소유자는 bandit7인 파일 중에 -group bandit6 : 파일 그룹이 bandit6인 것만 찾아라.
근데 또 그 중에서도 -size 33c : 파일 크기가 정확히 33바이트 인 것만 찾아라.
딱 문제에 있는 조건을 다 find 안에 녹이면서 구현한 것 이다.

solved
Level 7 → 8

진짜 문제 제대로 안 읽고 풀다가 uniq, sort 등 이상한거 다 하고 다시 돌아와서 grep으로 써서 풀었다.....
https://coding-factory.tistory.com/802
이 번에는 해당 grep으로 배웠다. 해당 정답이 가려져있긴 한데,
문제에서 millinoth으로 시작하는~ 이라고 했길래 리눅스 grep 명령어를 사용하면
딱 그런 문자열로 시작하는 해당 줄만 뽑아올 수 있다.
grep [옵션][패턴][파일명]
여기서 사용한거는 grep millionth으로 실제millionth로 시작하는 줄을 다 가져오는 것 이다.
solved
Level 8 → 9
이것도 내가 예전에 풀은 기억이 있어서..
uniq는 중복되는 값들을 지워주는 건데, 하기에 앞서 sort를 시켜줘야한다.
라고 생각해서

그냥 이렇게 마구잡이로 명령어 썻는데.. -c를 붙여서 몇 번이 나왔는지에 대해서도 뽑아줘야되었으며
그리고 uniq로 하면 중복되는 값들을 지워주는게 아니라 약간 압축???그런거 하는 느낌

추가적으로 설명하면
먼저 data.txt를 sort 시키면 중첩되는 문자열들끼리 정렬을 할 수 있게된다.
그 후 uniq -c를 활용하면 그런 중첩된 문자열 & 줄들으 각각 갯수로 표현되며 중복된 값들은 한 번만 표시된다. 그 중 한 문자열에 대해서만 딱 한 줄이 존재한다고 했으니 -c 옵션을 활용하여 갯수를 확인해주면 풀리는 문제이다.
solved
Level 9 → 10

뻘짓 중.. 근데 이게 사람이 읽을 수 있는 문자열이 아닌 것 같은 느낌? ( 문제에서도..)
그래서 그냥 cat 때리고 ====<-- 이거 있는 것을 찾아봤음

히히 그냥 무지성으로 풀어버리기... 그래도 이걸 어떻게 푸는지는 알아야할 것 같은 느낌?

찾아보니까 strings라고 그냥 파일 안에 포함된 문자열을 뽑아낼 수 있는 기능을 함.! 그래서 그걸 이용해서 grep을 사용하면 끝이다
strings는 바이너리 파일에서 텍스트를 추출할 때 쓰는데, 이 명령어를 활용하면 바이너리 파일 안에 있는 읽을 수 있는 ASCII를 출력해준다.
그래서 strings data.txt로 출력을 해주고 grep으로 해당 문자열을 가져온다.
strings [옵션] [파일]
[옵션] -f : 파일 이름을 같이 출력 -n : 문자열의 최소 길이를 정함
solved
Level 10 → 11
https://happylie.tistory.com/8
참고 자료!!

이건 해당 참고 자료를 보면 쉬움. 그냥 base64 디코딩만 하면 됨!! ( 문제만 잘 읽는 다면..)
여담으로 암호화가 필요할 때 base64로 암호화할게요! 라고 하는건 아래와 같은 사진이랑 똑같다. Base64는 암호화가 아니라 인코딩, 디코딩 개념이다.
인코딩: 데이터를 숨기는 것이 목적이 아니라, 바이너리 데이터나 특수 문자를 텍스트 형태로 전달하려고 바꾸는 것.

base64 [옵션][파일명]
[옵션] -d : base64 디코드 -i : 알파벳 아닌 문자 무시 -w : 줄 바꿈
solved
Level 11 → 12

문제를 이렇게 풀어도 되긴 하지만!!!
https://zidarn87.tistory.com/137
tr 명령어를 통해서..

13 옮기는 거를 일일히 노트에 써가면서 어떻게 옮길지 찾아봤다
tr 'A-Za-z' 'N-ZA-Mn-za-m'은
A B C D ... M N O ... Z a b c ... m n o ... z↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓N O P Q ... Z A B ... M n o p ... z a b ... m
이렇게 rot13을 직접 해주는걸 명시해줌으로써 문제가 풀리는 것!!
solved
Level 12 → 13
옛날에 bandit을 하다가 딱 이 12번 문제를 풀다가 접었다. 그 때 당시에는 이해가 안가서 어떻게 푸는지.
https://zidarn87.tistory.com/177

일단 xxd를 하려고 했더니 뭐 할 수가 없다.. 이유는 우리에게 권한이 없기 때문에.,
그래서 문제에 나와있듯이 tmp로 간다!!!!

그 후에 xxd -r 옵션을 활용하게 되는데 그 이유는? \
=> xxd -r은 헥스덤프 형태의 바이너리 파일을 다시 되돌리기 위해서!
하지만 그렇게 해도, real.txt는 아직 이상한 값으로 채워져 있다.

그래서 file이라는 함수를 활용해서 이 친구가 지금 어떤 파일 특성? 파일 종류를 가지고 있는지 확인해보면 gzip이라고 되어있다. 그럼 이걸 풀어주면 됨

근데 문제는 그냥 풀려고 하면 오류나니까.. real.gz으로 이름을 바꿔주고 해야한다. 그리고 다시 cat 해봤더니 또 이상한 값이 떠서, 다시 bzip으로 파일명 바꾸고~~ 풀어줘야할 듯.

또 mv로 파일명 바꾸고~ bzip2 -d 로 풀어주고~ cat 했는데~ 또 이상한 값~ 또 file~ 또 gzip? 한 번 다시!

이번에는 data5.bin ~~ 이러길래 제대로 값이 나왔나? 싶었지만, tar archive. tar로 묶여져 있는 친구인 것 같다. 그래서 다시!

그 후 해당 과정을 무한 반복해서 얻은 password값. 중간에 ^C는 , 갑자기 렉걸려서 아무 입력도 안되길래 너무 무서워서 가만히 있다가 혹시나 ^C를 하면 풀리나? 싶었는데 그냥 저러고 한 1분 동안 멈춰있다가 튕기는 줄 알았다.. 그래도 다행
명령어 모음
xxd [옵션] [파일명]
[옵션] -r : hexdump를 원래 바이너리 파일로 복원
gzip [옵션] [파일명]
[옵션] -d : gzip 압축 해제
bzip2 [옵션] [파일명]
[옵션] -d : bzip2 압축 해제
tar [옵션] [파일명] [옵션] -x : tar 파일 풀기 -v : 진행 과정 출력 -f : 사용할 tar 파일 지정
solved
Level 13 → 14

처음에 뻘짓하면서 아니 이렇게 하는거 아닌가?? 왜 안되지???하면서 문제를 다시 읽어보니까 저장하고 하라는 ...

그래서 실행하려고 하니까 chmod가 안 먹힌다. 찾아보니까 ./mnt는 윈도우에서 관할하는 파일이고, ~ <- 홈 디렉으로 가서 wsl 내부 리눅스 파일로 가야지만 chmod가 먹힌다는 것을 알게됨..

그래서 실제로 ~ 여기로 옳기고 저렇게 ssh 를 치면 14로 이동!!
< -i 를 이용하면 나의 개인키로 접속을 수행할 수 있게 된다. .>
ssh [옵션] [계정]@[ip] [옵션] -p ( ) : ( )의 값으로 포트 지정 -i ( ) : ( )을 사용해서 ssh key 사용을 통한 접속.
solved
Level 14 → 15
그냥 telnet을 써서 localhost에 있는 ip를 딴 후, 접속하라는 것 같아서 위에 있는 링크를 보면서 telnet 명령어를 쳤더니

out of range..
그래서 같이 있는 명령어를 하나씩 검색했다.
그래서 nc 명령어를 활용하면, 실제로 tcp/ip 통신을 통한 데이터 전송이 가능하다고 해서. 어 이거다 ! 싶었다.

그래서 잊고 있던 bandit 14의 비밀번호를 cat으로 알아내고, nc 명령어를 통해서 해당 명령어를 보내면! 15의 정답을 얻을 수 있게 된다.
telent은 원격 호스트의 특정 포트에 접속 후 텍스트 기반 통신
nc는 특정 포트에 데이터를 보내고 받는 입출력 도구.
여기서 내가 telnet으로 문제를 풀 수 있었지만 0을 하나 더 붙여서 nc로 문제를 풀었던 것.
solved
Level 15 → 16

openssl 명령어가 추가되어있길래, 먼저 이거를 찾아보았더니 SSL/TLS와 관련된 일을 하는 명령어..

그래서 간단하게 gpt에게 뭐하는 명령어냐고 물어보았다.

그래서 SSL/TLS를 이용해서 암호화를 실제로 하라는건가?? 아니면 그냥 SSL/TLS의 기능이 있는 걸로 접속을 보라는건가?? 싶어서 일단 저렇게 해서 접속을 시도하니까 접속은..가능하네??

그래서 정답을 넣으니까 해-결
openssl s_clinet를 사용하면 자동적으로 ssl/tls 암호화가 되면서 통신이 되나보다. GPT에게 끝나고 물어보니까 오타 수정까지
kSkvUpMQ7lBYyCM4GBPvCvT1BfWRy0Dx

일단 SSL/TLS을 간단 설명 하면 클라이언트 <-> 서버 사이의 통신을 암호화해주는 보안 계층이다.
TCP 연결을 하면 보통 평문이지만 TLS/SSL을 활용하여 암호화 통신을 진행하려고 하는 것.
openssl s_client -connect localhost:30001 그래서 해당 명령어를 통해서 TLS을 자동으로 암호화되어 통신.
solved
Level 16 → 17
https://halinstudy.tistory.com/46
일단 포트 스캔?? 그러면 nmap이지 않나? 싶어서 nmap을 검색해봄,.

그랬더니 이런 포트들이 나왔다. 음...근데 이걸로 뭐하지?
그래서 SSL/TLS를 스캔해주는건 없나 싶어서 찾아봤더니 있는 것 같아서 돌렸음??!

그래서 2개가 나오길래.. 음? 하나라고 했는데?
그래서 2개 다 해봤는데, 31790에서 아래와 같은 응답이 출력되었다. 엇 이거는 14인가 13에서 썻던 개인키??..

후.. 성공!!
정리해보면
-
nmap으로 전체 포트 스캔
-
해당 포트 중에서 SSL/TLS 통신을 사용하는 포트를 찾음
-
그래서 해당 포트에 openssl s_clinet 활용하여 통신.
-
통신 후 답(Private Key)가 나오면 저장 후에 ssh -i를 활용하여 다음 단계로.
solved
Level 17 → 18
https://blog.naver.com/ncloud24/221255978037
diff 명령어가 추가되었길래 찾아보고, 문제에서는 한 줄의 명령어만이 바뀌었다고 하니까 diff가 해결책일 것 같다!!

diff -d를 이용하면, 무슨 코드가 상세하게 바뀌었는지 확인할 수 있다!!!!
x2gLTTjFwMOhQ8oWNbMN362QKxfRqGlO
그래서 아래에 있는 diff 명령어를 파악 후 사용하면 쉽게 풀리는 문제이다.
diff [옵션][파일1][파일2] diff3 [옵션][파일1][파일2][파일3] [옵션] -c : 두 파일간의 차이점 출력 -d : 두 파일간의 차이점을 상세하게 출력 -r : 두 디렉토리간의 차이점 출력 -u : 두 파일의 변경되는 부분과 변경되는 부분의 근처의 내용도 출력.
solved
Level 18 → 19
https://unix.stackexchange.com/questions/610894/added-exit-0-to-bashrc-and-cannot-login-to-server
음.. 감이 안 잡혀서 이것 저것 해보면서 ssh에서 bashrc를 뭐 바로 수정할 수 있나? 그런거를 보고 있는데 일단 mv랑 rm -rf는 실패.
ssh bandit18@bandit.labs.overthewire.org -p 2220 cat .bashrc 를 쳐보니까 exit 0<-- 해당 코드가 실행되는 것은 확인했다.
- rm 못함. 2. mv도 실패. 3. cat은 가능.
그럼 ls는??

Readme가 있는 것을 확인.

cat readme 하니까 바로 나옴!!!!
cGWpMaKXVwDUNgPAVJbWYuGHVn9zl3j8
근데 이게 왜 실행되는거지? Fith GPT....

원래 ssh 자체가, host 뒤에 command를 붙여서 활용할 수 있다는 것..
그러면 막을 수 있는거는?.. FoceCommand를 활용해서 config 파일을 수정을 통해 막을 수 있다구 하네용

solved
Level 19 → 20
이게 제대로 된 풀이인지는 모르겠으나

일단 ls도 해보고, chmod도 해보고 cat도 해봤다.
근데 문제에서 뭔가 이거 실행해서 해보셈!! 뭔가 이런 느낌이라서

어.. 이걸로 실행했더니 되네??

그래서 실제 실행을 통해서 값을 알아넴.
그러면 왜 그런데? setuid가 뭐길래?
setuid는 set user id의 약자로 한 파일이나 디랙토리를 사용할때는 그 파일의 소유자 권한으로 실행이 되는것을 말한다.

저렇게 X 표시가 되어있으면, 추가적인 권한이 있지 않아도 소유자의 권한인 rws 권한을 활용할 수 있따는 것. 그래서 내가 bandit20-do에 관한 권한이 있지 않아도 일단 소유자의 권한으로 실행을 할 수 있다는 것!!
자 정리해보면
-
ls -al을 활용해서 파일 소유자로 실행할 수 있는 setuid, 그룹명으로 실행할 수 있는 setgid등을 확인한다.
-
setuid가 세팅된 파일이 있으면 bandit19가 실행해도 해당 파일이 실행되면서 내부 명령을 실행하면 bandit20 으로 실행 됨.
solved
Level 20 → 21

그전이랑 비슷한 문제인데 ssh, openssl을 활용한 문제인 것 같다.

위에 있는 캡처본을 가져온 이유는 해당 오류가 생겨서 왜 오류가 있지? 싶어서 찾아봤다. 음.. 그렇게 해서

해당 문제를 보게 되면 자체 네트워크 데몬에 연결해보라. 그러면 내가 서버랑 클라이언트를 둘 다 띄워야하는건가?? 싶어서

nc -lp를 활용해서
-l : 리스닝을 통해 nc를 서버로 동작시키고 연결을 대기
-p: 연결을 위해 사용할 포트 번호를 지정.
아무 포트( 지금 열리지 않은 포트)를 열어서 접속 시킨 후, 20단계를 위해서 사용한 키를 활용하면 저렇게 응답이 나오는 것을 확인할 수 있다.
solved
Level 21 → 22

약간 무지성으로 푼 것 같긴 한데, 이것 저것 파일들을 보다가
crowntab 자체가

아래 사진처럼 매분 /usr/bin/cronjob_bandit22.sh &> /dev/null 을 실행하는 것 이다.

그래서 /usr/bin/cronjob_nadit22.sh을 실제로 cat을 해봤더니, /etc/bandit_pass/bandit22에 대한 cat 응답 값을 /tmp/t~에 저장하고 있는 것을 확인. 그래서 해당 파일을 cat 했더니 실제로 답이 나왔다!!!!
정리하자면
-
cron이 주기적으로 실행하는 스크립트를 확인해야함.
-
그래서 /etc/cron.d 파일을 확인
-
cron이 주기적으로 실행하는 스크립트에 /usr/bin/cronjob_bandit22.sh과 같은 파일의 연관성 확인.
-
그러면 실제로 /usr/bin/cronjob_bandit22.sh 해당 파일을 cat.
-
/usr/bin/cronjob_bandit22.sh 파일에서 나온 것은 cat /etc/bandit_pass/bandit22 > /tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv 부분.
-
그러면 pasword를 해당 tmp에 저장한다는 거니까 해당 파일을 cat.
-
짜잔~답!
solved
Level 22 → 23

와 처음에는 해당 쉘 스크립트의 위만 보고 echo "I am user bandit22"를 해쉬값으로 바꾼 저 값이 정답일 줄 알았는데, 뒤에 있는 값들을 더 보니까 해당 해쉬값을 이용해서 /tmp/ ( ) 이 괄호 안에 값을 넣는 거였음..

!! 정답!!
위와 흐름이 비슷하긴 한데, md5sum을 활용하여 해쉬값을 내가 직접 추론하는 과정이다.
-
myname은 직접 whoami를 확인해서 bandit22이라는 것을 확인.
-
mytarget에 값이 들어가는데, 그 값은 I am user bandit22를 해쉬처리 하고, 한 줄에서 공백 기준으로 맨 앞 단어만 뽑아오는 처리.
-
해당 해쉬값에 다가 다음 단계의 명령어를 집어넣었음.
solved
Level 23 → 24

일단 이거 해석 해보면..
/var/spool/bandit24/foo로 이동하고, *는 일반 파일/디렉토리 이름을 의미하고, .*는 숨김 파일까지 포함하려고 넣은 거라 모든 파파일들에 대해서 확인하는 것. 그리고 owner가 bandit23이면 실행하는 것?...??

실제로 vim을 통해서 뭔가 저장하면, 권한에 관한 오류는 뜨지 않는다. 그러면 내가 뭘.. 해야하는거지?

보통 이것처럼, /etc/bandit_pass에 bandit의 비밀번호가 있는 것을 알 수 있음.
그래서 .sh 파일에 cat /etc/bandit_pass/bandit23 > /tmp/test.txt로 하면, 저 .sh 커맨드가 알아서 해당 .sh를 실행해줌!

짜란
solved
Level 24 → 25

그냥 전사 공격하는 쉘을 만들고, 해당 쉘을 통해서 실제 공격을 하는 것.. 그래서 코드로 저렇게 정답셋을 만들고 이제 공격 시작!!!

히히 성공

이렇게 응답 시작햇음!!
정리를 하자면
-
Bandit 24 → 25는 현재 비밀번호 + 4자리 PIN code를 localhost:30002에 보내야 하는 문제다.
-
그래서 4자리 PIN code를 1~9999까지 내가 다..하기에는 너무 그러니까 첫 번째 사진과 같이 PIN 번호 셋을 만들어줌
-
cat을 활용해서 wjdeka(정답).txt의 출력값을 nc localhost 30002로 보내면서 문제 해결!
후.. 이제 다 끝났ㅏ..