문제
There is a setuid binary in the homedirectory that does the following: it makes a connection to localhost on the port you specify as a commandline argument. It then reads a line of text from the connection and compares it to the password in the previous level (bandit20). If the password is correct, it will transmit the password for the next level (bandit21).
## 문제 요구사항
프로그램을 실행할 때 명령줄 인자(Command-line argument) 로 포트를 하나 전달하면,
그 포트 번호를 이용해 localhost(자기 자신) 에 TCP 연결을 시도한다.
연결이 이루어지면, 프로그램은 그 연결로부터 한 줄의 문자 입력을 받아 온다.
받아온 문자열을 이전 단계(bandit20)의 비밀번호와 비교한다.
입력한 비밀번호가 정확히 일치하면, 프로그램은 다음 단계(bandit21)의 비밀번호를 같은 연결을 통해 전송한다.
## 내가 사용한 명령어
A: ssh bandit20@bandit.labs.overthewire.org -p 2220
A: ls -l
A: nc -l 3000
B: ssh bandit20@bandit.labs.overthewire.org -p 2220
B: ./suconnect 3000
A: bandit20 password 입력
A: bandit21 password 출력
## 왜 이 명령어를 골랐는가
suconnect의 권한을 검색해보면 -rwsr-x--- 유저 실행권한이 setuid가 설정되어 있음을 알 수 있다.
nc -l 3000 ← 터미널 A에서 서버 대기
./suconnect 4444 ← 터미널 B에서 bandit21 권한으로 실행됨
nc 서버 화면에는 변화 없지만, 백그라운드에서는 연결이 성립됨.
## suconnect program 의사로직
connect_to_server(port);
string input = read_line_from_connection();
if (strcmp(input, bandit20_password) == 0) {
send(bandit21_password);
}
터미널 A

터미널 B

1. nc(netcat)란 무엇인가?
nc 또는 netcat은 가장 단순하고 강력한 네트워크 유틸리티다.
주요 기능:
- TCP/UDP 연결 생성
- 임의의 포트에서 서버로 대기(listen)
- 연결된 두 지점 사이에 데이터 그대로 전달
- 파일 전송
- 포트 스캐닝
“네트워크 환경에서 표준 입력(stdin)과 표준 출력(stdout)을 그대로 TCP 연결에 연결해주는 도구”
“TCP 소켓을 열고, 표준 입출력과 연결하는 도구”
- 서버처럼 대기할 수도 있고(-l)
- 다른 서버에 연결할 수도 있고
- 파일 입출력과도 연결할 수 있다
- 문자열 하나만 보내고 종료시키는 것도 가능하다
2. 서버 모드: nc -l
서버처럼 대기(listen) 할 때 사용한다.
기본 형태:
nc -l <port>
의미:
해당 포트에서 TCP 서버를 열고, 누군가 접속할 때까지 대기하는 모드.
예:
nc -l 4444
이제 4444 포트에서 클라이언트 접속을 기다린다.
대기 중에는 커서가 그냥 멈춘 것처럼 보이지만, 누가 연결하면 입력과 출력이 터미널에 나타난다.
3. 클라이언트 모드: 서버에 접속하기
nc <host> <port>
예:
nc localhost 4444
이 명령은: localhost의 4444 포트로 TCP 연결을 만든다.
서버가 대기를 시작한 상태라면 즉시 연결된다.
4. 서버/클라이언트 간의 데이터 흐름
두 터미널 예제로 설명하면 가장 이해가 잘 된다.
Terminal A (서버):
nc -l 4444
Terminal B (클라이언트):
nc localhost 4444
연결되면:
- A에서 타이핑한 내용 → B에 그대로 출력된다.
- B에서 타이핑한 내용 → A에 그대로 출력된다.
이유: nc는 키보드 입력을 TCP에 그대로 흘리고 TCP로 받은 데이터도 그대로 출력하는 도구이기 때문.
5. 왜 Bandit 문제에서 nc를 썼는가?
Bandit20 → 21 문제에서 중요한 점:
- suconnect가 TCP 클라이언트이다.
- 네가 직접 TCP 서버를 열어줘야 한다.
- 가장 쉬운 TCP 서버 도구가 바로 nc.
즉, nc를 사용하면 다음이 가능하다:
- 리스너 열기:
- nc -l 3000
- suconnect가 그 포트로 접속: ./suconnect 3000
- 너는 nc 쪽에서 bandit20 비밀번호를 입력
- suconnect는 검증 후 bandit21 비밀번호를 TCP로 돌려 전송
- nc가 그 내용을 터미널에 그대로 출력
6. nc 명령어 자주 쓰이는 옵션
| -l | 서버 모드(대기 모드) |
| -p | 리스닝 포트 명시 (일부 버전 필요) |
| -v | verbose(자세한 정보 출력) |
| -n | DNS 조회 없이 숫자 IP만 사용 |
| -u | UDP 모드 |
| -z | 포트 스캔 모드 (데이터 전송 없음) |
예제:
nc -v -l -p 4444
'Security > OverTheWire' 카테고리의 다른 글
| Bandit Level 22 → Level 23 (0) | 2025.12.01 |
|---|---|
| Bandit Level 21 → Level 22 (cron) (0) | 2025.12.01 |
| Bandit Level 19 → Level 20 (setuid) (0) | 2025.12.01 |
| Bandit Level 18 → Level 19 (쉘 스크립트 우회) (0) | 2025.12.01 |
| Bandit Level 17 → Level 18 (diff) (0) | 2025.12.01 |