Step 96. Bandit 0~5 — 워게임 풀이 사이클
Level 2 — 보안 입문과 공격 스킬 기초 | 난이도 ★★☆☆☆ | 예상 소요 시간 2.5시간
전제: Level 1을 마쳤다. SSH로 원격 서버에 접속해 본 적이 있고,
ls·cat·cd정도의 리눅스 기본 명령을 안다.
- 준비물: SSH 클라이언트(윈도우 PowerShell이면 내장
ssh로 충분합니다), 인터넷 연결, 비밀번호를 기록할 메모장이나 개인 위키. - ⚠️ 이 챕터의 실습은 내 랩·합법 플랫폼 전용입니다. 허가 없는 시스템에 적용하면 범죄입니다.
- 합법 연습장 안내: 오늘의 무대인 OverTheWire Bandit(
bandit.labs.overthewire.org)은 운영자가 공식적으로 "공격 연습용"으로 개방한 합법 학습 플랫폼입니다. 이 서버와 내 컴퓨터의 연습 폴더 외에는 오늘의 기술을 쓰지 않습니다.
Level 2의 시작입니다. 지금까지가 도구를 배우는 시간이었다면, 이제부터는 도구로 문제를 깨는 시간입니다. 그 첫 무대가 워게임 — 공격 기술을 연습하라고 일부러 취약하게 만들어 둔 서버입니다. Bandit은 각 레벨의 비밀번호가 다음 레벨의 열쇠가 되는 사다리 구조로, 리눅스 명령어를 한 계단씩 올라가며 익히게 설계되어 있습니다.
하지만 오늘의 진짜 목표는 비밀번호 여섯 개가 아닙니다. 처음 보는 서버에서도 흔들리지 않게 해 주는 풀이 사이클 — 읽기, 탐색, 검증, 기록의 네 박자를 몸에 새기는 것입니다. 쉬운 레벨에서 이 절차를 의식적으로 반복하면, 어려운 레벨에서는 절차가 몸을 대신 움직입니다.
1. 학습 목표
이 챕터를 끝내면 다음을 할 수 있습니다:
- SSH로 원격 서버에 접속하고 포트를 지정할 수 있다
- 워게임 풀이 사이클(읽기 → 탐색 → 검증 → 기록)을 순서대로 적용한다
ls -a로 숨김 파일을 찾고,-·공백이 들어간 파일명을 안전하게 읽는다file로 파일의 정체를 내용 기준으로 판정하고,find -size로 조건 검색을 한다- 레벨별 풀이를 정해진 형식의 write-up으로 기록한다
2. 배경 지식 — 오늘의 도구와 개념
오늘의 도구 한눈에 보기
| 구분 | 내용 |
|---|---|
| 언어·환경 | 리눅스 셸(Bandit 서버는 bash) + SSH 클라이언트 |
| 오늘의 명령 | ssh, ls -a, cat, file, find -size, pwd |
| 필요한 개념 | 숨김 파일, 셸이 특별 취급하는 문자, 매직 넘버, 은폐에 의한 보안의 한계 |
| 오늘의 산출물 | Bandit 0→6 비밀번호 체인 + 레벨별 write-up 문서 |
2-1. Bandit의 구조 — 비밀번호 사다리
Bandit의 규칙은 단순합니다. bandit0으로 접속해 어딘가 숨겨진 다음 레벨의 비밀번호를 찾습니다. 그 비밀번호로 bandit1에 접속하고, 다시 bandit2의 비밀번호를 찾는 식입니다. 각 레벨의 공식 페이지에는 "이번에 필요할 수 있는 명령"이 힌트로 적혀 있습니다.
접속 형식은 언제나 같습니다.
ssh bandit0@bandit.labs.overthewire.org -p 2220
-p 2220은 포트 지정입니다. 기본 포트(22)가 아닌 서버에 붙을 때 반드시 필요한 옵션이니 형식째로 외워 두세요.
2-2. 풀이 사이클 — 네 박자
오늘 정착시킬 절차입니다.
① 읽기 — 레벨 페이지의 힌트와 서버 안의 안내 파일을 먼저 읽는다
② 탐색 — ls -a, pwd, file로 주변을 훑는다
③ 검증 — 찾은 것이 진짜 답인지 확인한다 (읽히는가? 형식이 맞는가?)
④ 기록 — 명령·근거·결과를 즉시 위키에 적는다
초보는 ①을 건너뛰고 명령부터 칩니다. 그러면 시도가 난사가 됩니다. 힌트에 "human-readable"이라고 적혀 있으면 file 문제이고, "hidden"이라고 적혀 있으면 ls -a 문제입니다. 힌트를 먼저 읽는 것만으로 시도의 절반이 줄어듭니다.
2-3. 숨김 파일 — .의 의미
리눅스에서 이름이 .으로 시작하는 파일은 ls의 기본 목록에 나타나지 않습니다. 본래 용도는 보안이 아니라 정리입니다 — 설정 파일이 폴더를 어지럽히지 않게 하려는 배려였습니다.
그래서 "숨겼으니 안 보이겠지"는 성립하지 않습니다. ls -a 한 번이면 전부 드러납니다. 보안에서는 이런 착각을 은폐에 의한 보안(security by obscurity)의 오류라고 부릅니다. 숨기는 것은 보안이 아니라는 뜻입니다. Bandit 초반이 숨김 파일 문제로 시작하는 이유이고, 실제 침해 서버에서도 공격자의 흔적은 . 시작 파일에서 단골로 발견됩니다.
2-4. 셸이 특별 취급하는 문자
파일명이 -이면 cat은 파일이 아니라 표준 입력으로 해석합니다. 파일명에 공백이 있으면 cat spaces in this filename은 파일 네 개를 읽으려는 명령으로 해석됩니다. 파일명이 명령의 문법과 충돌하는 것입니다.
해법은 두 가지뿐입니다. 경로를 붙여서("옵션이 아니라 파일이다") 알려 주거나(./-), 따옴표로 감싸 하나로 묶거나("spaces in this filename"). 이 원리는 *, ?, $ 같은 다른 특수 문자에도 그대로 적용됩니다.
3. 따라 하기
3-1. Level 0 — 접속이 곧 문제
Level 0의 과제는 "SSH로 접속하라"가 전부입니다.
입력
ssh bandit0@bandit.labs.overthewire.org -p 2220
비밀번호를 물으면 bandit0을 입력합니다. 접속 성공 시 화면 (출력 예시 — 서버 접속은 여러분이 직접):
bandit0@bandit:~$
읽는 법: 프롬프트의 bandit0@bandit은 "사용자 bandit0으로 서버 bandit에 들어왔다"는 뜻입니다. 여기서 사이클 ① 읽기 — 홈 폴더에 놓인 readme를 읽으면 Level 1의 비밀번호가 적혀 있습니다 (cat readme).
왜: 원격 서버의 문을 여는 절차는 앞으로 모든 침투·분석 작업의 첫 장면입니다. 주소, 사용자, 포트, 비밀번호 네 조각이 모이면 문이 열립니다.
3-2. Level 1 → 2 — -라는 이름의 파일
이번 홈 폴더에는 이름이 - 하나뿐인 파일이 있습니다.
입력 (서버 안에서, 출력 예시)
ls
cat -
cat -를 치면 아무 일도 안 일어나는 것처럼 보입니다 — 셀이 -를 "표준 입력"으로 해석해 여러분의 타이핑을 기다리는 중입니다. Ctrl+C로 빠져나오세요.
정답 명령
cat ./-
읽는 법: ./를 붙이면 "현재 폴더의 -라는 파일"이라는 경로가 되어 옵션 해석을 피해 갑니다. 이 한 글자의 차이가 Level 1의 전부입니다.
3-3. Level 2 → 3 — 공백이 들어간 파일명
이번 파일명은 spaces in this filename입니다.
입력 (서버 안에서, 출력 예시)
cat "spaces in this filename"
또는 탭 자동완성(cat sp까지 치고 Tab)이 알아서 \ 이스케이프를 넣어 줍니다. 둘 다 정답입니다.
읽는 법: 따옴표는 "이 안은 하나의 덩어리"라는 선언입니다. 셸은 공백을 구분자로 쓰기 때문에, 공백을 품은 이름은 반드시 묶어 줘야 합니다.
3-4. Level 3 → 4 — 숨김 파일
inhere 폴더 안에 숨김 파일이 있습니다.
입력 (서버 안에서, 출력 예시)
cd inhere
ls
ls -a
읽는 법: ls는 텅 비어 보이지만, ls -a가 진짜 목록을 보여 줍니다. .과 ..은 모든 폴더에 있는 "자기 자신·상위 폴더" 특수 항목이니 넘기고, 그 아래의 점 시작 파일이 목표입니다.
왜: 탐색의 첫 명령은 항상 ls가 아니라 ls -a라고 외워 두세요. 숨겨진 것을 보는 것이 기본값이어야 합니다.
3-5. Level 4 → 5 — file로 정체 판정
inhere 안에 -file00부터 -file09까지 열 개의 파일이 있고, 그중 하나만 "사람이 읽을 수 있는" 파일입니다.
입력 (서버 안에서, 출력 예시)
cd inhere
file ./-*
출력 예시
./-file00: data
./-file01: data
...
./-file07: ASCII text
...
읽는 법: file은 파일 이름이 아니라 내용의 첫 바이트들(매직 넘버)로 정체를 판정합니다. ASCII text라고 판정된 것이 답입니다. ./-*에서 *는 "이어지는 아무 글자"라는 와일드카드라, 열 개 전부를 한 번에 판정했습니다.
이 실험은 내 컴퓨터에서도 그대로 재현됩니다 (2026-09-09 WSL 실측, Ubuntu 24.04):
mkdir file-lab && cd file-lab
echo 'readable file' > file-a
printf '\x00\x01\x02' > file-b
file ./*
./file-a: ASCII text
./file-b: data
3-6. Level 5 → 6 — find 조건 검색의 맛보기
목표는 inhere 어딘가에 있는, "1033바이트이고 실행 파일이 아닌" 파일입니다.
입력 (서버 안에서, 출력 예시)
find . -type f -size 1033c ! -executable
읽는 법: 조건은 겹칠수록 좁아집니다(AND). -size 1033c의 c는 "바이트" 단위 표시로, 빼면 512바이트 묶음 단위로 해석되어 결과가 달라집니다. !는 "~이 아닌"이라는 부정입니다.
내 컴퓨터에서 똑같이 재현한 결과입니다 (2026-09-09 WSL 실측):
dd if=/dev/zero of=target bs=1 count=1033 2>/dev/null
find . -type f -size 1033c
./target
같은 명령이 서버에서도 내 컴퓨터에서도 동작합니다 — 이 기술들이 게임 전용이 아니라 범용 도구라는 증거입니다. dd는 정확한 크기의 파일을 만드는 명령으로, bs=1 count=1033은 "1바이트짜리 블록을 1033개"라는 뜻입니다.
3-7. 숨김 파일 심화 — 만들고 숨기고 찾기
서버가 아닌 내 컴퓨터(리눅스/WSL)에서 은폐의 한계를 직접 확인합니다.
입력 (2026-09-09 WSL 실측)
mkdir hide-lab && cd hide-lab
echo 'secret memo' > .secret
echo 'normal file' > normal.txt
ls
ls -a
출력 (2026-09-09 실측)
--- ls ---
normal.txt
--- ls -a ---
.
..
.secret
normal.txt
여기서 한 걸음 더 — 점 세 개짜리 폴더를 만들어 보세요. mkdir ... 후 ls -a (2026-09-09 실측):
.
..
...
.secret
normal.txt
읽는 법: ...는 .과 .. 사이에 섞이면 훑는 눈을 통과합니다. 실제 악성코드가 쓰는 고전 수법이고, 수비자는 바로 이 모양을 찾아냅니다.
왜: 은폐 기법을 "만드는 쪽"으로 한 번 체험하면 찾는 쪽의 눈이 달라집니다. 오늘 이후 여러분의 ls -a는 한 번 더 자세히 보게 될 것입니다.
3-8. write-up 작성 — 첫 공식 풀이 기록
사이클의 마지막 박자, 기록입니다. 메모장이나 위키에 bandit-0to5.md를 만들고 레벨마다 이 형식으로 채웁니다.
# Bandit Level N → N+1
- **힌트**: (공식 페이지에 적힌 것 한 줄)
- **탐색에서 본 것**: (ls 결과 중 눈에 띈 것)
- **명령**: (실제로 친 것)
- **근거**: (왜 이 명령인가)
- **새로 배운 것**: (없으면 "없음 — 절차 복습"이라고 적기)
"근거" 칸이 핵심입니다. 명령을 친 이유를 적는 순간 암기는 이해로 바뀝니다. 비밀번호 자체는 공개 저장소에 올리지 않는 것이 워게임 예의입니다 — 명령과 사고 과정만 기록하세요.
4. 미션과 연습문제
미션 — Bandit 0→6 사다리 완성과 사이클 증명
bandit0으로 접속해 Level 6의 비밀번호까지 이어진 체인을 완성합니다- 각 레벨에서 읽기 → 탐색 → 검증 → 기록 네 박자를 메모에 한 줄씩 남깁니다
- 내 컴퓨터(또는 WSL)에
숨김 파일 1개 + 공백 파일명 1개 + 크기 1033바이트 파일 1개를 만들고,ls -a·file·find -size 1033c로 전부 다시 찾아냅니다 - 3-8 형식의 write-up 문서를 완성합니다
연습문제
문제 1. cat -가 파일을 읽지 못하는 이유와, 해결책 두 가지(./-와 따옴표)가 각각 어떤 원리로 동작하는지 설명해 보세요.
문제 2. ls -a 결과에 항상 나오는 .과 ..은 무엇이며, 왜 숨김 파일로 세면 안 되나요?
문제 3. file 명령은 파일의 무엇을 보고 정체를 판정하나요? photo.jpg라는 이름의 실행 파일을 file에 넣으면 어떻게 판정될까요?
문제 4. find . -size 1033c에서 c를 빼면 결과가 왜 달라지나요?
5. 모범 답안과 완료 기준
미션 모범 답안
체인의 뼈대 (서버 안 명령은 출력 예시, 핵심 명령만):
ssh bandit0@bandit.labs.overthewire.org -p 2220 # 비밀번호 bandit0
cat readme # L0→1
cat ./- # L1→2
cat "spaces in this filename" # L2→3
cd inhere && ls -a && cat ./.hidden # L3→4 (숨김 파일명은 실제 확인)
file ./-* && cat ./-file07 # L4→5 (번호는 판정 결과에 따라)
find . -type f -size 1033c ! -executable # L5→6
로컬 재현 부분은 3-5~3-7의 실측 명령 그대로입니다. 검증하는 법: ① 각 단계의 비밀번호가 32자 안팎의 영숫자 문자열인가. ② 그 비밀번호로 다음 레벨 접속이 실제로 되는가 — 이것이 "검증" 박자의 실체입니다. ③ write-up의 "근거" 칸이 전 레벨 채워져 있는가.
연습문제 해답
문제 1 해답. 셸에서 -는 관례적으로 표준 입력(stdin)을 뜻하기 때문에 cat -는 파일이 아니라 키보드 입력을 기다립니다. ./-는 경로를 붙여 "파일"임을 명시하는 방법이고, cat "./-"처럼 따옴표는 문자열을 하나의 인자로 묶는 방법입니다. 둘 다 "셸의 특별 해석을 피하는" 같은 목적의 다른 수단입니다.
문제 2 해답. .은 현재 폴더, ..은 상위 폴더를 가리키는 특수 항목으로 모든 폴더에 존재합니다. 파일이 아니라 길잡이 링크이므로 숨김 파일 개수에 포함하면 안 됩니다. 관심 대상은 그 아래에 나열되는 실제 점 시작 파일들입니다.
문제 3 해답. 내용의 첫 바이트들(매직 넘버)과 문자 구성을 봅니다. 이름은 보지 않습니다. 따라서 photo.jpg라는 이름의 실행 파일은 ELF ... executable로 판정됩니다 — 이름이 아니라 내용이 정체를 말합니다 (3-5절에서 \x00\x01\x02 세 바이트를 넣은 파일이 data로 판정된 2026-09-09 실측 참조).
문제 4 해답. c가 없으면 크기 단위가 512바이트 묶음이 되어 "1033블록(약 52만 바이트)"짜리 파일을 찾기 때문입니다. 1033바이트 파일은 조건에 맞지 않아 결과가 빈 손으로 나옵니다 (2026-09-09 WSL 실측: c를 뺀 검색은 아무것도 찾지 못함).
완료 기준 체크리스트
- [ ]
ssh 사용자@주소 -p 포트형식으로 접속할 수 있다 - [ ] 풀이 사이클 네 박자(읽기→탐색→검증→기록)를 순서대로 말할 수 있다
- [ ]
ls -a로 숨김 파일을 찾고./..의 의미를 설명할 수 있다 - [ ]
-·공백 파일명을 경로 붙이기·따옴표로 읽을 수 있다 - [ ]
file이 이름이 아니라 내용으로 판정함을 설명할 수 있다 - [ ]
find -size 1033c에서c의 의미를 안다 - [ ] 미션: Bandit 0→6 체인과 write-up을 완성했다
6. 흔한 실수와 해결
벽 1. ssh 접속이 바로 끊기거나 포트 오류가 난다
증상 (실측 계열 메시지):
ssh: connect to host bandit.labs.overthewire.org port 22: Connection refused
원인: -p 2220을 빠뜨려 기본 포트 22로 갔습니다. Bandit은 2220번에서 받습니다.
해결: ssh bandit0@bandit.labs.overthewire.org -p 2220 — 사용자·주소·포트 세 조각을 눈으로 대조하세요. 회사·학교 네트워크에서 아웃바운드 2220이 막혀 있으면 다른 네트워크에서 시도해야 합니다.
벽 2. cat -를 쳤더니 아무 반응이 없다
증상: 커서만 깜빡이고 프롬프트가 안 돌아옵니다.
원인: -가 표준 입력으로 해석되어 여러분의 타이핑을 기다리는 중입니다.
해결: Ctrl+C로 빠져나와 cat ./-로 다시 치세요. 반응 없음이 곧 힌트입니다 — "지금 셸이 이걸 파일로 안 보고 있구나."
벽 3. 공백 파일명을 읽으면 "그런 파일 없음"이 연달아 뜬다
증상 (출력 예시):
cat: spaces: No such file or directory
cat: in: No such file or directory
원인: 따옴표 없이 쳐서 이름이 공백에서 잘렸습니다. 셸은 네 개의 파일을 찾은 것입니다.
해결: cat "spaces in this filename"처럼 통째로 감싸거나, cat sp 후 Tab 자동완성을 쓰세요.
벽 4. find 결과가 텅 비었다
증상: 분명 있을 텐데 아무것도 안 나옵니다.
원인: 조건이 하나라도 틀리면 AND라 전체가 빈 손입니다. -size 1033c의 c 누락이 최다 원인입니다.
해결: 조건을 하나씩 떼어 보며 어느 조건이 0개를 만드는지 좁히세요. find 디버깅의 정석은 "조건 빼기"입니다.
벽 5. 어제 찾은 비밀번호를 어디 적었는지 모르겠다
증상: 레벨 체인이 끊겨 처음부터 다시 풀어야 합니다.
원인: 기록 습관의 부재 — 사이클의 ④가 빠진 것입니다.
해결: 다시 풀되 이번엔 찾는 즉시 적습니다. 서버 안에서 방금 친 명령은 history | tail -10으로 건질 수 있습니다. 체인이 끊기는 사고는 한 번으로 족합니다.
7. 정리
오늘의 개념
| 개념 | 한 줄 설명 |
|---|---|
| 워게임 | 공격 연습용으로 일부러 취약하게 만든 합법 서버 |
| 풀이 사이클 | 읽기 → 탐색 → 검증 → 기록의 네 박자 |
| 숨김 파일 | .으로 시작해 ls 기본 목록에서 빠지는 파일 |
| 은폐에 의한 보안 | "숨겼으니 안전"이라는 착각 — 보안이 아님 |
| 매직 넘버 | 파일 앞의 표식 바이트 — file이 보는 정체 증거 |
| 특수 문자 회피 | 경로 붙이기(./-)와 따옴표 묶기 |
오늘의 명령어
| 명령 | 하는 일 |
|---|---|
ssh 사용자@주소 -p 포트 |
원격 서버 접속 (포트 지정) |
ls -a |
숨김 포함 전체 목록 |
cat ./- |
-라는 이름의 파일 읽기 |
cat "a b" |
공백 들어간 파일명 읽기 |
file ./-* |
내용 기준으로 정체 판정 |
find . -size 1033c |
크기 조건으로 검색 (c=바이트) |
명령어보다 중요한 감각
낯선 서버에 처음 들어갔을 때의 30초를 정해 두세요. pwd로 위치를 확인하고, ls -a로 전체를 훑고, 안내 파일부터 읽습니다. 이 30초의 리듬은 워게임이든 실무 서버든 같습니다. 그리고 찾는 즉시 적는 습관 — 기록이 없는 발견은 없었던 발견입니다. 마지막으로 기억할 문장 하나: "숨겨진 것은 없고, 안 본 것만 있다." 오늘의 ls -a가 그 눈의 시작입니다.
전부 체크되면 Step 96 완료입니다. 사이드바의 체크박스를 눌러 진도를 저장하세요.