
SLMail 5.1의 전형적인 스택 기반 버퍼 오버플로우로, 초기 메일 서버가 대용량 SMTP 및 POP3 명령을 통해 어떻게 손상될 수 있는지 보여줍니다.
SLMail 5.5의 전형적인 스택 기반 버퍼 오버플로우로, 과도한 크기의 SMTP 및 POP3 명령을 통해 초기 메일 서버가 어떻게 손상될 수 있는지 보여줍니다.
이 저장소는 메모리 손상 익스플로잇을 가르칠 때 사용하는 자료의 일부입니다 (정규 업무 외에도 다양한 사이버 보안 과정에서 강의하며, 차세대 리버스 엔지니어 양성에 기여하고 있습니다).
CVE-2003-0264는 네트워크 프로토콜 상의 기본적인 스택 기반 버퍼 오버플로우를 가르칠 때 소개하는 첫 번째 사례 중 하나입니다. 깔끔하고 문서화가 잘 되어 있으며, 익스플로잇 경로가 직관적입니다. SEH, 에그헌터, 공간 제약이 없습니다. 학생이 페이로드를 보내고 EIP를 덮어쓰고 JMP ESP 가젯으로 점프하여 셸을 획득합니다. 그 명확성 덕분에 출발점으로서 유용합니다.
SLMail 5.5는 레거시 Windows 메일 서버입니다. 취약점은 POP3 서비스, 특히 PASS 명령 처리기에 있으며, 사용자 입력을 길이 검증 없이 고정 크기 스택 버퍼에 직접 복사합니다. 이 사례가 교육적으로 특히 유용한 이유는 복잡한 요소가 거의 없기 때문입니다:
이러한 조합(네트워크 노출, 인증 불필요, 직접적인 EIP 덮어쓰기, 최신 보안 완화 없음)은 CVE-2003-0264를 최신 Windows 버전에서도 실행되는 가장 깔끔한 실제 스택 오버플로우 예시 중 하나로 만듭니다.
SLMail은 SMTP, POP3 및 관리 서비스를 제공하는 Windows 메일 서버입니다. POP3 서비스는 TCP 포트 110에서 수신 대기하며 표준 메일 검색 명령을 처리합니다. 취약점은 연결 클라이언트가 보낸 비밀번호 인수를 처리하는 PASS 명령 처리기에 있습니다.
주요 기술 세부 사항:
SLMail의 POP3 서비스는 PASS 명령을 처리할 때, 제공된 비밀번호 인수를 길이 검사 없이 안전하지 않은 함수를 사용하여 고정 크기 스택 버퍼에 복사합니다. 취약한 로직의 단순화된 버전은 다음과 같습니다:
char password_buffer[256];
strcpy(password_buffer, pass_argument);
PASS 인수로 충분히 긴 문자열을 보내면 버퍼 끝을 넘어 복사가 이루어져 스택이 손상되고 저장된 리턴 주소가 덮어씌워집니다. 함수가 반환되면 CPU는 스택에서 공격자가 제어하는 값을 EIP로 로드하고 그곳으로 점프합니다.
POP3를 통해 과도한 크기의 PASS 인수를 보내면 충돌이 재현됩니다. 유효한 자격 증명이 필요하지 않습니다. Python을 사용한 예:
import socket
HOST = '127.0.0.1'
PORT = 110
payload = b"A" * 3000
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.recv(1024)
s.send(b"USER username\r\n")
s.recv(1024)
s.send(b"PASS " + payload + b"\r\n")
s.close()
디버거에서 실행하면 충돌 시 EIP가 사용자 제어 데이터로 덮어쓰여진 것을 확인할 수 있습니다:
EIP = 41414141
이는 저장된 리턴 주소가 오버플로우로 인해 손상되었음을 확인시켜 줍니다.
이 저장소의 목표는 충돌을 보여주는 것뿐만 아니라, 퍼징부터 작동하는 리버스 셸까지 완전한 익스플로잇 과정을 단계별로 설명하는 것입니다.
메인 README를 깔끔하게 유지하기 위해 상세한 익스플로잇 노트, 스크립트 및 디버거 단계는 이 저장소의 Vulnerability 📂 폴더에 배치했습니다.
거기서 이 CVE를 익스플로잇하는 데 사용된 완전한 워크플로우를 찾을 수 있습니다: