
FreeBSD ICMP 버퍼 오버플로우, freebsd 버퍼 오버플로우 PoC
기본적으로 사용되는 셸코드는 FreeBSD/x86-64 - execve - 28 bytes from Gitsnik 입니다. 시작하려면 이를 변경하고 자신만의 셸코드를 넣으세요.
ping 유틸리티는 호스트 또는 게이트웨이로부터 ICMP ECHO_RESPONSE를 요청하는 데 사용되며, ICMP 프로토콜의 필수 ECHO_REQUEST 데이터그램을 통해 IPv4 호스트 또는 IPv4-mcast-group과 같은 IPv4 대상을 대상으로 호출됩니다. ECHO_REQUEST 데이터그램은 IP 및 ICMP 헤더와 그 뒤를 잇는 "struct timeval", 그리고 패킷을 채우기 위한 가변 바이트 수의 "pad" 바이트로 구성됩니다.
FreeBSD 프로젝트의 보안 권고에 따르면, ping 유틸리티는 네트워크에서 원시 IP 패킷을 가져와 pr_pack() 함수 내에서 응답을 처리합니다. 응답 처리 과정에서 ping은 IP 헤더, ICMP 헤더, 그리고 존재할 경우 ICMP 오류를 유발한 패킷을 나타내는 "quoted packet"을 재구성합니다. quoted packet에는 IP 헤더와 ICMP 헤더도 포함됩니다.
pr_pack() 함수는 수신된 IP 및 ICMP 헤더를 추가 처리를 위해 스택 버퍼에 복사합니다. 그러나 응답 또는 quoted packet에서 IP 헤더 다음에 IP 옵션 헤더가 올 가능성을 고려하지 않습니다. IP 옵션이 존재하는 경우, pr_pack()은 대상 버퍼를 최대 40바이트까지 오버플로우시킵니다.
ping 유틸리티는 사용자 공간에서 실행되며, ping 명령을 호출하면 /sbin/ping에 위치한 바이너리가 실행됩니다. 이 유틸리티의 소스 코드는 FreeBSD 소스에서 공개적으로 제공됩니다. 취약한 함수인 pr_pack()은 ICMP 패킷 응답 정보를 "64 bytes from 1.3.3.7: icmp_seq=1 ttl=55 time=13.7 ms."와 같은 문자열 형식으로 stdout에 출력합니다.

ICMP 패킷은 요청과 응답 모두 위 다이어그램에 나와 있는 것처럼 선택적 Options 필드가 있는 IP 헤더로 구성됩니다. 악의적인 공격에서는 이러한 IP Options가 활성화되고 널(null)이 아닌 바이트로 채워집니다.
ICMP 패킷이 변조되었거나 목적지 호스트로 가는 도중 의도적으로 조작되었고, 원래의 에코 요청에 IP Options가 활성화되어 있는 경우, pr_pack() 함수는 IP Options의 존재를 수용할 충분한 스택 공간을 할당하지 못하여 스택 오버플로우가 발생합니다.
이러한 오류 상황에서 대상 호스트의 응답에는 ICMP 오류를 일으킨 특정 패킷을 식별하는 "quoted packet"이 데이터 섹션에 포함될 수도 있습니다. pr_pack() 함수는 quoted packet에 ICMP 헤더가 포함된 경우 스택을 오버플로우시킵니다.