Step 96. Bandit 0~5 — 워게임 풀이 사이클

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 1033cc는 "바이트" 단위 표시로, 빼면 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 사다리 완성과 사이클 증명

  1. bandit0으로 접속해 Level 6의 비밀번호까지 이어진 체인을 완성합니다
  2. 각 레벨에서 읽기 → 탐색 → 검증 → 기록 네 박자를 메모에 한 줄씩 남깁니다
  3. 내 컴퓨터(또는 WSL)에 숨김 파일 1개 + 공백 파일명 1개 + 크기 1033바이트 파일 1개를 만들고, ls -a·file·find -size 1033c로 전부 다시 찾아냅니다
  4. 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 1033cc 누락이 최다 원인입니다.
해결: 조건을 하나씩 떼어 보며 어느 조건이 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 완료입니다. 사이드바의 체크박스를 눌러 진도를 저장하세요.