background/linux kernel

    Supervisor Mode Execution Prevention(SMEP)/Supervisor Mode Access Prevention(SMAP)

    Supervisor Mode Execution Prevention(SMEP)/Supervisor Mode Access Prevention(SMAP)

    커널은 절대 사용자 공간 메모리(userspace memory)를 실행하거나 접근해서는 안된다.이러한 규칙은 하드웨어 기반으로 제한(x86의 SMEP/SMAP, ARM의 PXN/PAN)을 지원하거나 에뮬레이션(ARM의 메모리 도메인)을 통해 시행할 수 있다.이러한 방식으로 사용자 공간 메모리를 차단하면 실행 및 데이터 구문 분석이 사용자 공간 메모리로 전달 될 수 없으므로, 공격이 커널 메모리에서만 작동하도록 만든다. SMEP (Supervisor Mode Execution Prevention)사용자 모드에 있는 실행 코드를 Ring-0 권한으로의 실행을 제한하고 충돌을 일으킨다. 따라서 사용자 모드 페이로드 실행에 의존하는 EoP 익스플로잇을 실행하지 못하게 된다.이를 통해 Intel OS Guard는..

    [Linux Kernel Exploit] ROP (with ret2usr)

    ROP를 활용해서 ret2usr를 하는 방법에 대해 알아보려고 한다. 익스플로잇 순서는 다음과 같다. (ret2usr과 동일)prepare_kernel_cred(0); 수행 ("root"의 자격 증명 준비)prepare_kernel_cred() 함수의 리턴 값("root"의 자격 증명)을 commit_creds() 함수에 전달system("/bin/sh"); 예제로는 [QWB CTF 2018] core 문제를 보기로 했다. https://github.com/ctf-wiki/ctf-challenges/blob/master/pwn/kernel/QWB2018-core/rop.c trap frame을 만들고 ret2usr기법을 활용하는 것은 동일하다. 다만, LPE를 함수로 하는 것이 아니라 가젯으로 하기 때문..

    Kernel Address Display Restriction (KADR)

    Kernel Address Display Restriction (KADR)

    커널 익스플로잇에는 필요한 가젯, 커널 함수들의 주소 등의 정보가 필요하다. 커널에서는 KADR에 의해 커널 영역의 주소를 민감한 정보로 처리하고 있으며 일반 로컬 사용자에게 보이지 않는다. 즉, /boot/vmlinuz*, /boot/System.map*, /sys/kernel/debug/, /proc/slabinfo와 같은 것들은 루트만 읽을 수 있다. Ubuntu 11.04부터 "/proc/sys/kernel/kptr_rr_rrestrict"는 알려진 커널 주소 출력을 차단하기 위해 "1"로 설정되어 있다. 다음과 같이 일반 유저로 "/proc/kallsyms" 파일을 읽으면 심볼의 주소가 0으로 덮여져서 출력되는 것을 확인할 수 있다. 반면, 루트 권한으로 해당 파일을 읽을 경우 각 심볼들의 주소..

    [Linux Kernel Exploit] ret2usr

    [QWB CTF 2018] core 문제에서 ret2usr 기법이 사용되었는데 ret2usr에 대해 알아보도록 하자. https://ssongkit.tistory.com/767 [QWB CTF 2018] core (with write-up) 롸업과 함께하는 첫 리눅스 커널 문제 환경 세팅 문제 파일은 여기서 받을 수 있다. https://github.com/ctf-wiki/ctf-challenges/tree/master/pwn/kernel/QWB2018-core ctf-challenges/pwn/kernel/QWB2018-core at master · ctf-wiki/ctf-c ssongkit.tistory.com LPE 먼저 커널에서 권한 상승(LPE)을 하기 위해선 commit_creds(prepar..

    Kernel Address Space Layout Randomization (KASLR)

    Kernel Address Space Layout Randomization (KASLR)

    KASLR(Kernel Address Space Layout Randomization)은 ASLR의 커널 버전으로 커널의 기본 주소 값을 무작위로 만들어 커널 공격을 어렵게 만드는 기능이다. 실습은 우분투 16.04에서 진행했다. KASLR을 비활성화 하려면 "/etc/default/grub" 파일의 "GRUB_CMDLINE_LINUX_DEFAULT"에 "nokaslr"을 추가한다. sudo update-grub으로 설정을 반영한다. 이후 reboot로 적용시켜줘야 한다. 이제 reboot해도 계속 주소가 같게 나오는 것을 확인할 수 있다. 반대로 KASLR을 활성화 하려면 "/etc/default/grub" 파일의 "GRUB_CMDLINE_LINUX_DEFAULT"에서 "nokaslr"을 "kaslr"..