
Easy File Sharing Web Server 7.2에서 인증된 HTTP POST 매개변수가 예외 처리기 체인을 손상시킬 수 있음을 보여주는 SEH 기반 버퍼 오버플로우
Easy File Sharing Web Server 7.2에서 SEH 기반 버퍼 오버플로우를 보여줍니다. 인증된 HTTP POST 매개변수가 예외 처리기 체인을 손상시킬 수 있음을 시연합니다.
이 저장소는 메모리 손상 익스플로잇을 가르칠 때 사용하는 자료의 일부입니다 (본업 외에도 다양한 사이버 보안 과정에서 강의하며 차세대 리버스 엔지니어를 양성하는 데 기여하고 있습니다).
CVE-2018-18912는 기본적인 EIP 덮어쓰기에서 SEH 기반 익스플로잇으로 넘어가는 전환점으로 사용하는 사례입니다. 학생들이 직접 반환 주소 덮어쓰기를 이해한 다음, 스택이 너무 손상되어 반환되기 전에 예외가 발생할 때 어떤 일이 일어나는지, 그리고 그 예외 처리기 체인이 어떻게 공격 표면이 되는지 이해하는 것이 다음 단계입니다. 이 CVE는 그 전환을 깔끔하게 보여줍니다: 오버플로우가 SEH 체인에 도달할 만큼 깊고, 익스플로잇 경로는 모든 익스플로잇 개발자가 이해해야 하는 고전적인 POP POP RETN 기법을 따릅니다. DEP 우회(ROP 사용)는 더 나아가고자 하는 학생을 위한 확장 과제로 남겨둡니다 — 동일한 오버플로우, 다른 가젯 전략, 훨씬 어려운 문제입니다.
이 취약점은 간단한 파일 공유를 위해 널리 사용된 가벼운 Windows 웹 서버 애플리케이션인 Easy File Sharing Web Server 7.2에 영향을 미칩니다. 이 소프트웨어는 현대적인 보안 완화 조치를 고려하지 않고 작성되었습니다. 교육적 관점에서 이 사례가 특히 흥미로운 점은 관련된 여러 요소들의 조합 때문입니다:
이러한 조합은 CVE-2018-18912를 기본을 넘어선 익스플로잇 개발 기법을 가르치는 훌륭한 사례로 만듭니다.
Easy File Sharing Web Server 7.2는 사용자가 HTTP를 통해 파일을 공유할 수 있게 해주는 Windows 애플리케이션입니다. 파일 탐색, 사용자 인증, 내장 포럼 시스템 등의 기능을 포함합니다.
포럼 기능은 새 주제를 생성하기 위해 POST 요청을 받습니다. 이 엔드포인트에서 처리하는 양식 필드 중 하나는 author 매개변수입니다. 내부적으로 애플리케이션은 이 사용자 제어 값을 길이를 검증하지 않고 고정 크기 스택 버퍼로 복사합니다.
이 취약점은 2018년에 발견되어 보고되었습니다. 원본 PoC는 곧바로 게시되어 크래시뿐만 아니라 번들된 ImageLoad.dll 모듈의 ROP 가젯을 포함한 작동하는 익스플로잇 체인도 시연했습니다.
주요 기술 세부 사항:
Easy File Sharing Web Server는 사용자가 새 포럼 주제를 생성할 때 /forum.ghp로 향하는 HTTP POST 요청을 처리합니다. 허용되는 매개변수 중 하나는 author이며, 이 값은 길이 검사 없이 로컬 스택 버퍼로 복사됩니다.
바이너리를 리버스할 때 이 양식 필드의 핸들러가 고정 크기 버퍼와 안전하지 않은 복사 작업을 사용함을 관찰할 수 있습니다. 취약한 로직의 단순화된 버전은 다음과 같습니다:
char author_buffer[64];
strcpy(author_buffer, user_input);
대상 버퍼가 고정 크기이고 입력 길이가 검증되지 않으므로, author 필드에 충분히 긴 문자열을 보내면 복사가 버퍼 끝을 넘어 쓰게 됩니다.
더 많은 데이터가 기록됨에 따라 스택 레이아웃이 손상됩니다. 단순한 반환 주소 덮어쓰기와 달리 오버플로우는 스택에 저장된 구조적 예외 처리기(SEH) 체인에 도달합니다. 손상된 스택의 결과로 예외가 발생하면 OS는 SEH 체인을 탐색하여 공격자가 제어하는 핸들러 주소로 제어를 전달합니다.
따라서 익스플로잇 흐름은 SEH 덮어쓰기 기법을 따릅니다:
이로 인해 이 취약점은 기본적인 EIP 덮어쓰기보다 익스플로잇하기 더 복잡하지만, 실제 세계 시나리오를 더 잘 대표합니다.
크래시는 유효한 자격 증명으로 인증한 후 POST 요청의 author 매개변수에 긴 문자열을 /forum.ghp로 전송하여 재현할 수 있습니다. Python 예시:
import socket
HOST = '127.0.0.1'
PORT = 80
payload = b"A" * 500
request = (
b"POST /forum.ghp?forumid=1 HTTP/1.1\r\n"
b"Host: 127.0.0.1\r\n"
b"Content-Type: application/x-www-form-urlencoded\r\n"
b"Cookie: UserID=test; PassWD=test; SESSIONID=1234\r\n"
b"Connection: close\r\n"
b"\r\n"
b"author=" + payload + b"&passwd=test&title=test&content=test&Submit=Submit\r\n"
)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.send(request)
s.close()
디버거에서 실행하면 크래시 시 SEH 체인이 손상되고 액세스 위반이 발생하여 사용자 제어 데이터가 예외 처리기 포인터를 덮어썼음을 확인할 수 있습니다.
이 저장소의 목표는 크래시를 시연하는 것뿐만 아니라 실제 SEH 기반 익스플로잇을 개발할 때 사용하는 방법론을 따라 단계별로 전체 익스플로잇 과정을 안내하는 것입니다.
주요 README를 깔끔하게 유지하기 위해 상세한 익스플로잇 노트, 스크립트, 디버거 단계는 이 저장소의 Vulnerability 📂 폴더에 배치하였습니다.
거기에서 이 CVE를 익스플로잇하는 데 사용된 전체 워크플로우를 찾을 수 있습니다. 여기에는 다음이 포함됩니다: