
1. 문제 정보
- 문제 번호 : old -31
- 문제 점수 : 15점
2. 문제 분석
문제에 들어가면 아래 코드가 뜬다 php로 랜덤으로 10000과 10100사이에 포트를 fsokopen으로 server파라미터로 들어온 주소로 소켓을 연다.
$port = rand(10000,10100);
$socket = fsockopen($_GET['server'],$port,$errno,$errstr,3) or die("error : {$errstr}");
Warning: fsockopen(): unable to connect to 211.107.176.16:10055 (Connection timed out) in /var/www/html/challenge/web-16/index.php on line 23
error : Connection timed out

포트를 열어서 연결해보자
3. 풀이
소켓을 열고 웹사이트를 리로딩하면 flag가 나온다.
import socket
import select
sockets = []
start_port = 10000
end_port = 10100
print(f"[*] {start_port} ~ {end_port} 포트 전체 리스닝 시작...")
# 1. 포트 101개 열기
for port in range(start_port, end_port + 1):
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('0.0.0.0', port))
s.listen(1)
sockets.append(s)
except Exception as e:
pass # 에러 무시
print("[*] 준비 완료. 웹페이지를 새로고침 하세요!")
# 2. 접속 대기
readable, _, _ = select.select(sockets, [], [])
ready_socket = readable[0]
client_conn, client_addr = ready_socket.accept()
print(f"\n[!] 연결 성공! (포트: {ready_socket.getsockname()[1]})")
# -----------------------------------------------------
# [추가된 부분] 데이터를 받아서 확인해보기
# -----------------------------------------------------
try:
# 1024바이트만큼 데이터를 기다려봄 (타임아웃 설정 가능)
client_conn.settimeout(2)
data = client_conn.recv(1024)
if data:
print(f"[+] 받은 데이터: {data.decode('utf-8', errors='ignore')}")
else:
print("[-] 연결은 됐지만, 서버가 보낸 데이터는 없습니다.")
except socket.timeout:
print("[-] 데이터 수신 대기 시간 초과 (서버가 아무 말도 안 함)")
# 3. 정리
client_conn.close()
for s in sockets:
s.close()

4. 요약
- 서버가 지정된 범위(10000~10100) 내의 랜덤 포트로 접속을 시도하므로, 내 PC에서 해당 범위의 포트를 모두 열어 대기했다.
- 파이썬의 socket과 select 모듈을 이용해 리스닝상태로 만들어 서버의 연결 요청을 수락한다.
- 연결이 되면 FLAG가 온다.
'워게임 > webhacking.kr' 카테고리의 다른 글
| [webhacking.kr] old-25 문제 (0) | 2026.01.26 |
|---|---|
| [webhacking.kr] old-27 문제 (0) | 2026.01.26 |
| [webhacking.kr] old-39 문제 (0) | 2026.01.23 |
| [webhacking.kr] old-38문제 (0) | 2026.01.23 |
| [webhacking.kr] old-18문제 (0) | 2026.01.22 |