level 1 - 2
목표 : 리눅스에서 대시(-)로만 이루어진 특이한 파일 이름을 다루기.
문제 : "-" 라는 이름의 파일이 홈 디렉토리에 있는데, 그 안에 다음 레벨 비밀번호가 있다.
기본 개념 :
cat = 파일 내용을 화면에 출력해줘! 라는 뜻의 명령어 이다.
ex) hello.txt 파일이 보고 싶다면 cat hello.txt 라고 입력.
왜 cat - 라고 안하냐면?
리눅스에서 - 는 특수한 의미가 있어서 -를 기호로 인식해버리기 때문에 ./("지금 이 폴더 안에 있는" 이라는 뜻) 를 앞에 붙여줘야 한다.
level 2 - 3
목표 : 리눅스에서 공백이 포함된 파일 이름을 다루기.
문제 : "--spaces in this filename--" 이라는 이름의 파일이 홈 디렉토리에 있는데, 그 안데 다음 레벨 비밀번호가 있다.
기본 개념
1. 파일 이름에는 띄어쓰기(공백) 이 있으면 문제가 생긴다. 예를 들어 cat sapces in this filename 을 리눅스는 spaces, in, this, filename 이렇게 4개로 인식한다.
2. 리눅스에서 -- 로 시작하는 건 옵션(설정값)으로 인식한다. ( 예를 들어 cat --help 하면 도움말이 나옴 )
해결 방법
1-1. 따옴표로 감싸기
ex) cat "spaces in this filename"
1-2. 백슬래시 사용( 공백 앞에 \를 붙이면 "이 공백은 파일 이름의 일부야" 라고 알려줄 수 있다.)
ex) cat spaces\ in\ this\ filename
2-1. --를 앞에 붙이기
ex) cat -- 파일이름 에서 앞에 있는 --는 "이 뒤에 오는 건 옵션이 아니라 파일 이름이야!" 를 알려주는 신호이다.
level 3 - 4
목표 : 리눅스에서 숨겨진 파일(Hidden File)을 찾고 다루는 방법을 배우기.
문제 : inhere 라는 폴더 안에 숨김 파일이 있는데, 그 안에 비밀번호가 있다.
기본 개념
1. 숨김파일이란 : 리눅스에서 파일 이름이 .으로 시작하면 숨김파일이다. ex) .숨김파일
2. 숨김파일은 그냥 ls 하면 안보인다.
3. 폴더 이동하는 방법 : cd 폴더이름 = 그 폴더 안으로 들어가기 (cd = Change Directory의 약자)
해결방법
1. 숨김파일은 ls -a를 써야 한다. (-a = all의 약자)
풀이 순서
1. inhere 폴더로 이동
cd inhere
2. 숨김 파일 포함해서 목록 보기
ls -a
3. 숨김 파일 읽기 (.으로 시작하는 파일 이름확인 후)
cat ./.(파일이름)
level 4 - 5
목표 : 여러 개의 파일 중 사람이 읽을 수 있는 텍스트파일이 무엇인지 찾아내기.
문제 : inhere 폴더 안에 여러 파일이 있는데, 그 중에 사람이 읽을 수 있는 파일 딱 하나에 비밀번호가 있다.
기본 개념
1. 파일 개념 ( 파일에는 두 종류가 있다.)
- 텍스트 파일 = 사람이 읽을 수 있는 파일
- 바이너리 파일 = 컴퓨터만 읽을 수 있는 파일
2. file 명령어
file 파일이름 = 이 파일이 어떤 종류인지 알려줘 ( text 파일이면 ASCII text 라고 나온다. )
풀이 순서
1. inhere 폴더로 이동
cd inhere
2. 파일 목록 보기
ls
3. 모든 파일 종류 한번에 확인
file ./-*
* = 모든 파일이라는 뜻
./ = "지금 내가 있는 폴더 안에서" 라는 뜻.
ex) ./-file01 : 지금 이 폴더 안에 있는 -file01파일
ex) ./-* : 지금 이 폴더 안에 있는 모든 파일
4. ASCII text 라고 나오는 파일을 cat 으로 읽기
level 5 - 6
목표 : 엄청나게 많은 디렉터리와 파일들 사이에서, 특정 조건(크기, 속성 등) 을 만족하는 단 하나의 파일을 골라내는 방법 배우기.
문제 : 다음 레벨로 가기 위한 비밀번호는 inhere 디렉터리 하위 어딘가에 있는 파일로 저장되어 있으며, 다음 세 가지 조건을 모두 만족한다.
1. 사람이 읽을 수 있는 형식
2. 정확히 1033바이트의 크기
3. 실행 파일이 아님
기본개념
1. find 명령어 : 조건에 맞는 파일을 찾아주는 명령어
조건 옵션
- size 1033c : 크기가 1033 바이트인 파일
- ! -executable : 실행 불가능한 파일
- -readable : 사람이 읽을 수 있는 파일
./ 의 의미 : find 명령어는 "어디서부터 찾을지" 를 먼저 말해줘야 한다. ( find ./inhere) 에서 ./inhere = 지금 이 폴더 안에 있는 inhere 폴더에서 라는 뜻이다. 사실 이번에는 ./ 가없어도 가능하지만 ./inhere 라고 쓰는게 더 정확하게 위치를 지정하기 때문에 습관적으로 붙이는 것이다.
level 6 - 7
목표 : 서버 전체(/) 를 뒤져서 소유자와 그룹, 그리고 크기 조건까지 만족하는 파일을 찾아내는 방법 배우기.
문제 : 서버 어딘가에 파일이 있는데, 이 조건을 모두 만족하는 파일에 비밀번호가 있다.
- bandit7 유저가 소유한 파일
- bandit6 그룹이 소유한 파일
- 크기가 33바이트
기본개념
1. 유저/그룹 : 리눅스는 파일마다 주인이 있다. 예를 들어 "이 파일은 bandit7 꺼야" 이런 식.
2. / = 서버의 최상위 폴더
3. 2>/dev/null : 찾다보면 "권한 없음" 오류가 많이 뜨는데 그 오류들을 안 보이게 숨겨주는 것이다.
level 7 - 8
목표 : 텍스트 파일 안에서 내가 원하는 특정 데이터만 쏙 골라내는 명령어인 grep 을 다루기.
문제 : data.text 파일 안에 비밀번호가 있는데 "millionth" 라는 단어 옆에 있다.
기본 개념
1. grep 명령어 : 파일 안에서 특정 단어가 있는 줄만 찾아주는 명령어
levle 8 - 9
목표 : 비밀번호는 data.txt 파일 안에 저장되어 있으며, 오직 한 번만 나타나는 유일한 특스트 줄이다.(다른 줄들은 여러 번 반복되어 나타난다.)
문제 : data.txt 파일 안에 여러 줄이 있는데, 딱 한번만 나오는 줄에 비밀번호가 있다.
기본 개념
sort 명령어 : 파일 내용을 알파벳 순서로 정렬, 같은 줄끼리 모아준다.
uniq 명령어 : 중복된 줄을 제거한다., -u옵션 = 딱 한번만 나오는 줄만 보여줘 라는 뜻
|파이프 :
명령어 두 개를 연결해주는 기호.
앞 명령어 결과를 뒤 명령어에게 넘긴다.
ex) sort data.txt | uniq -u = "data.txt를 정렬한 결과를 uniq -u 에 넘겨줘"
level 9 - 10
목표 : 사람이 읽을 수 없는 기계어 데이터가 섞인 파일 속에서, 인간이 읽을 수 있는 텍스트만 뽑아내고 특정 패턴을 찾아내는 방법 배우기.
문제 : data.txt 파일 안에 비밀번호가 있는데, =문자가 여러 개 앞에 붙어있는 줄에 있다.
기본 개념
1. strings 명령어
파일 안에서 사람이 읽을 수 있는 텍스트만 뽑아준다.
level 10 - 11
목표 : 데이터 변환방식인 Base64 인코딩 다루기.
문제 : data.txt 파일 안에 비밀번호가 base64 로 인코딩 되어있다.
기본개념
1. base64 : 데이터를 암호처럼 변환하는 방식이다.
ex) hello - aGVsbG8 이런식으로 바뀐다. 반대로 디코딩을 하면 원래 글자로 돌아온다.
2. base64 -d 명령어 : base64 로 인코딩된 걸 다시 원래대로 되돌려준다.
( -d = decode 의 약자 )
level 11 - 12
목표 : ROT13 암호 해독 배우기. ( 글자를 특정 개수만큼 밀어서 치환하는 원리 )
문제 : data.txt 파일 안에 비밀번호가 있는데, 모든 알파벳이 13칸씩 밀려서 저장되어 있다.
기본개념
1. ROT13 : 알파벳을 13칸씩 밀어서 바꾸는 방식이다.
ex ) a - n (13칸 앞으로)
알파벳이 26개이기 때문에 13칸 두번하면 원래대로 돌아온다.
2. tr 명령어 : 특정 문자를 다른 문자로 바꿔주는 명령어
형식 : tr '[원본 세트]' '[바꿀 세트]'
ex) tr 'A-Za-z' 'N-ZA-Mn-za-m' = ROT13 디코딩
여기서 'A-Za-z' 는 모든 알파벳을 짧게 표현한 것.
level 12 -13
목표 : 16진수 복원부터 싲가해서 여러 겹으로 얽힌 압축 파일들을 하나씩 분석하고 해제하는 법을 배운다.
문제 : data.txt 파일은 hexdump 형식으로 저장된 파일인데, 여러 번 압축된 파일이다. /tmp 폴더 아래에 작업할 폴더를 만들어서 작업해라.
기본 개념
1. hexdump : 파일 내용을 16진수(hex)로 변환해서 보여주는 것.
2. xxd - r : 명령어를 다시 원래 파일로 되돌릴 수 있다.
3.압축파일 : 파일을 작게 줄여서 저장하는 방식. 압축 종류마다 푸는 명령어가 다르다.
gzip(.gz) : gzip -d 파일
bzip(.bz2) : bzip2 -d파일
tar(.tar) : tar xf 파일
풀이
1. 작업할 폴더 만들기( 서버 공지사항에서도 나왔듯이 홈 디렉터리에는 파일 생성 권한이 없다. /tmp 아래에 무작위 폴더를 만들고 거기로 이동해서 파일을 복사한다. )
mktemp -d
2. 16진수를 진짜 바이너리 파일로 복원하기
cp data.txt /tmp/tmp.abcdef/
3. 그 폴더로 이동하기 ( 현재 data.txt는 글자로만 이루어진 16진수 덤프파일이다. 이걸 원래의 압축 파일 현태로 되돌려야 한다. 이때 16진수 역변환 도구인 xxd -r을 사용한다.)
xxd -r data.txt > data
4. hexdump를 원래 파일로 되돌리기
xxd -r data.txt > data
5. 파일 종류 확인
file data
결과 : 이런식으로 반복해서 압축을 풀어 cat 으로 비밀번호를 알아낸다.

level 13 -14
목표 : ssh 개인 키를 활용해 다음 계정으로 직접 서버 내부에서 로그인(ssh) 하는 방법 배우기
문제 : 다음 레벨 비밀번호는 /etc/bandit_pass/bandit14 에 있는데, bandit14 유저만 읽을 수 있다. 이번엔 비밀번호 대신 SSH 개인키를 준다. 그 키로 다음 레벨에 접속하시오.
기본 개념
1. ssh : 비밀번호 대신 열쇠 파일로 로그인 하는 방식. 비밀번호 입력 없이 키 파일만 있으면 접속할 수 있다.
추가 정보
1. 공개키와 개인키의 개념 : 비밀번호 로그인보다 훨씬 안전한 인증 방식.
- 개인 키 : 내가 접속을 시도하는 내 컴퓨터에 보관
- 공개 키 : 내가 접속하려는 원격 서버의 ~/.ssh/authorized_keys 파일 안에 저장
- 우너리 : 서버가 공개키로 메시지를 잠그면, 오직 내 컴퓨터의 개인키로만 그것을 풀 수 있다. 공격자가 중간에 통신을 가로채거나 방해하는 것이 불가.
2. ssh 키 생성 및 전송 방법
(키 생성)
mkdir ~/.ssh
chmod 700 ~/.ssh
ssh-keygen -t rsa -b 4096 # -b 4096 ( 옵션을 주면 암호 해독이 더 어려워진다. )
- 패스프레이즈 : 키를 만들 때 입력하는 2차 비밀번호. 내 컴퓨터를 분실하거나 해킹당했을 때, 공격자가 개인키를 바로 쓰지 못하 게 시간을 벌어주는 역할.
(공개키를 서버로 복사)
방법 1: 자동 도구 사용 (가장 편함)
ssh-copy-id <username>@<host>
방법 2: 수동으로 서버의 authorized_keys 파일 뒤에 붙여넣기
cat id_rsa.pub >> ~/.ssh/authorized_keys
3. 문제해결
( "Permission denied (publickey)" 에러가 날 때 ) : 리눅스 openssh는 보안 기준이 까다로워, 폴더나 파일의 권한이 너무 허술하게 열려 있으면 키를 거부. 아래 명령어로 권한을 좁혀야 한다.
chmod go-w ~/ 홈 디렉터리의 그룹/타인 쓰기 권한 제거
chmod 700 ~/.ssh .ssh 폴더는 나만 접근 가능하게
chmod 600 ~/.ssh/authorized_keys 공개키 목록 파일은 나만 읽고 쓰게
(참고) Bandit 13번에서 개인키 권한을 'chmod 600'으로 묶은 이유도 이 규칙 때문!
( 홈 디렉터리가 암호화(Encrypted)되어 있는 경우 )
해결책 : 암호화되지 않은 외부경로에 authorized_key를 두고, ssh 설정 파일에서 authorizedkeysfile 경로를 그곳으로 수정해 준 뒤 ssh 서비스를 재시작한다.
해결책 : 디버깅 팁
서버 측 디버깅 : sudo /usr/sbin/sshd -d (터미널에 상세 로그를 찍으며 서버 실행)
클라이언트 측 디버깅 : 접속할 때 -v 또는 -vv 옵션을 붙이면 어디서 막히는지 실시간을 보여준다.
ssh -v <username>@<host>
풀이
1. 키 파일 확인
ls - sshkey.private 파일이 있는 걸확인

2. 키 파일 내용 복사
cat sshkey.private

3. exit 후 내 Ubuntu에서 키 파일 만들기
exit
nano sshkey.private
4. 키 파일 권한 설정
chmod 600 sshkey.private
권한을 설정하지 않으면 ssh가 키 파일을 거부한다.
5. 키로 bandit14 접속
ssh -i sshkey.private bandit14@bandit.labs.overthewire.org -p 2220
6. 비밀번호 확인
cat /etc/bandit_pass/bandit14
level 14 - 15
목표 : 서버의 특정 포트로 데이터로 보내고 받아오는 네트워크 통신의 기초를 배우기.
문제 : 현재 레벨의 비밀번호를 localhost의 30000번 포트에 제출하면 다음레벨 비밀번호를 알려준다.
기본 개념
1. 포트 : 컴퓨터에 있는 여러 개의 문. 예르 들어 웹사이트는 80번 문, ssh는 22번 문을 쓴다. 이번엔 30000번 문에 비밀번호를 보내는 것이다.
2. nc 명령어 : 네트워크 연결을 해주는 명령어
nc = 주소 포트번호 = 그 주소의 그 포트에 연결해줘 라는 뜻
풀이
1. 먼저 bandit14 서버에 접속한 상태에서 nc localhost 30000 입력
2. 연결되면 현재 비밀번호를 입력 MU4VWeTyJk8ROof1qqmcBPaLh7lDCPvS
'knights Frontier' 카테고리의 다른 글
| IDS/IPS의 원리와 활용 방법 (0) | 2026.05.29 |
|---|---|
| 리눅스 기반 시스템 탐색 및 분석 - 2 (0) | 2026.05.29 |
| git 배우기 (0) | 2026.05.12 |
| 커리어패스 탐색 (0) | 2026.04.11 |
| 활동 정리하기 (0) | 2026.04.11 |