arbitrary-write-to-rce은(는) 무엇을 하나요?
임의 쓰기(Arbitrary Write)를 RCE(원격 코드 실행)로 전환하는 플레이북입니다. 힙 익스플로잇, 포맷 스트링, 또는 OOB(Out-of-Bounds) 쓰기를 통해 임의 쓰기 원시(Primitive)를 확보한 상태에서, 이를 GOT(Global Offset Table), 훅(Hooks), _IO_FILE vtable, exit_funcs, TLS_dtor_list, modprobe_path, .fini_array, 또는 C++ vtable을 공략하여 코드 실행으로 변환해야 할 때 사용합니다.
지원 환경
- 아키텍처: x86-64, ARM64 (aarch64) 지원.
- 보호 기법: 각 기법은 다양한 GCC 버전 및 보호 설정(ASLR, PIE, RELRO, Stack Canary, FORTIFY, SELinux)을 고려합니다.
- glibc 버전: 다양한 glibc 버전 (예: 2.31, 2.35, 2.39)에서 작동하도록 설계되었습니다. 최신 우분투 24.04 (glibc 2.39) 환경에 특히 중점을 둡니다.
플레이북 개요
-
타겟 선택: 다음 타겟 구조체 중 하나를 선택합니다.
__free_hook,__malloc_hook(glibc < 2.34)_IO_FILEvtableexit_funcs(__exit_funcs)TLS_dtor_listmodprobe_path.fini_array- C++ vtable
- GOT 엔트리
-
방법 적용: 각 타겟에 대해 구체적인 덮어쓰기 전략을 따릅니다.
- __free_hook 덮어쓰기:
system또는 원 셸(one-gadget) 주소로 덮어씁니다. (glibc 2.34부터 제거됨) - _IO_FILE vtable 변조: 파일 스트림 구조체를 조작하여
_IO_OVERFLOW나_IO_FINISH와 같은 vtable 함수 포인터를 가리킵니다. - exit_funcs 변조:
__exit_funcs리스트에 등록된 함수 포인터를 덮어씁니다. (ASLR 우회 가능) - TLS_dtor_list 변조: TLS(Thread-Local Storage) 영역의
dtor_list를 조작합니다. - modprobe_path 변조:
modprobe_path를 악성 스크립트 경로로 덮어쓰고, 알 수 없는 바이너리 실행을 트리거합니다. - .fini_array 변조:
.fini_array섹션의 종료 핸들러를 덮어씁니다. - C++ vtable 변조: 가상 함수 테이블 포인터를 조작하여 공격자가 제어하는 함수를 실행합니다.
- GOT 덮어쓰기: 외부 라이브러리 함수의 GOT 엔트리를 덮어씁니다. (Partial RELRO 필요)
- __free_hook 덮어쓰기:
-
우회 기법: PIE, Full RELRO, ASLR, Stack Canary, FORTIFY, SELinux 등 보호 기법을 우회하기 위한 전략을 포함합니다.
사용 예
# 예시: __free_hook 덮어쓰기 (glibc <= 2.33)
payload = p64(libc.symbols['__free_hook'])
payload += p64(libc.symbols['system'])
write(overwrite_addr, payload) # 임의 쓰기 함수
# 예시: _IO_FILE vtable 변조 (glibc >= 2.24)
io_file = FileStructure()
io_file._flags = 0
io_file._IO_write_ptr = 1
io_file._IO_write_end = 0
# ... 추가 필드 설정
payload = bytes(io_file)
write(io_address, payload)
주의사항
- 모든 기법이 모든 glibc 버전, 모든 보호 설정 조합에서 동작하는 것은 아닙니다. 실험 환경에서 먼저 테스트하십시오.
- 최신 glibc (2.34+)에서는
__free_hook,__malloc_hook이 제거되었습니다._IO_FILEvtable 변조 또는exit_funcs변조를 고려하십시오. - 일부 기법은 SELinux 또는 AppArmor의 영향을 받을 수 있습니다.
참고 자료
- How2heap - 다양한 힙 익스플로잇 기법 저장소
- HITCON CTF 2018 - baby_tcache - _IO_FILE vtable 변조 예제
- House of Force 관련 문서
- pwntools - CTF/익스플로잇 도구 모음