목록전체 글 (243)
CIDY
커널공부 해보려니 이 문제가 ret2usr기법 활용으로 많이 보이는 것 같아서 풀어보기로 했다. https://github.com/ctf-wiki/ctf-challenges/tree/master/pwn/kernel/QWB2018-core 문제 파일은 여기서 다운로드할 수 있다. 다운로드해서 압축을 풀어보면 이런 파일들이 들어있다. bzImage는 커널 이미지 파일, start.sh는 실행 스크립트, vmlinux는 커널 컴파일 시 생성되는 elf파일로, 심볼이 들어 있다. 여기서 내가 모르는건 core.cpio파일이다. 이 파일은 뭘까? cpio는 아카이브 형태로 파일을 변형하지 않고 압축할 때 쓰인다고 한다. cpio파일을 압축 해제하는 방법을 검색해보니 어째서인지 .cpio.gz파일을 압축 해제하는 ..
ret2usr는 커널 권한의 실행 흐름을 건드릴 수 있을 때, 이를 조작해 유저 영역의 코드를 실행하는 공격 기법이다. SMEP나 SMAP와 같은 보호 기법이 적용되어 있지 않는 한, 커널은 자유롭게 사용자 공간의 메모리에 접근하고 실행할 수 있다. 유저 모드 익스가 거의 system("/bin/sh"); 하는 것으로 끝났다면 커널 익스는 commit_creds(prepare_kernel_cred(NULL)); 로 끝난다. struct task_struct; struct cred; struct cred *(*prepare_kernel_cred)(struct task_struct *daemon) = (void *) 0xffffffff81081716; int (*commit_creds)(struct cred..
커널 주소 노출 2.6.29이하 버전의 커널에서는 /proc/[PID]/stat이나 /proc/[PID]/wchan파일을 통해 커널 주소를 간단히 얻을 수 있었다. (wchan필드는 원래 태스크가 대기 상태에 있을 때 마지막으로 실행한 커널 함수 주소를 출력해서 태스크 대기 사유를 알 수 있도록 한 것인데, kaslr도입 이후 사용자 공간에서도 /proc/..파일을 읽을 수 있으니 문제가 되었다.) 최신 커널 버전에서는 관리자 권한이 있어야 wchan에 접근할 수 있고, 읽어도 커널 주소 대신 함수명 심볼이나 0을 출력하도록 되어 있다. 따라서 위 파일을 읽는 방법은 더이상 사용 가능하지 않다. 대신 dmesg(커널 로그)를 출력하는 방법이 있다. 커널 코드에서 printk라는 함수를 이용하면 커널 로그..
https://orcinus-orca.tistory.com/241 [System_Hacking] Tasks task 리눅스의 태스크는 프로그램 실행 단위를 말한다. 사용자가 어떤 프로그램을 실행하면 태스크가 생성되고, 그 프로그램의 코드가 실행된다. 리눅스에서는 하나의 프로세스와 스레드가 각각 orcinus-orca.tistory.com 앞서 task_struct의 cred필드의 euid를 조작해 권한 상승을 해 보았다. 앞선 실습 방식은 gdb내부에서 set명령어를 통해 간단히 조작해 본 것으로, 실제로는 당연히 쓸 수 없는 방법이었다. 하지만 실제로도 커널 취약점을 이용해 cred메모리를 조작할 수 있다면 다른 유저의 권한을 획득할 수 있다. 이를 위해서는 다음 조건이 가능해야 한다. 1. 커널 메모..
KASLR Kernel ASLR이다. 주소 랜덤화의 커널 version인 것이다. aslr과 마찬가지로 이 보호기법이 적용되면 커널 이미지 분석으로 함수나 가젯 주소를 바로 알 수 없게 된다. _kernel_cmdline="console=ttyS0 mitigations=off nokaslr norandmaps" _kernel_cmdline="console=ttyS0 mitigations=off norandmaps" 현재 대부분의 리눅스 배포판에는 KASLR이 걸려 있다. (이를 비활성화하려면 커널 명령줄에 nokaslr옵션을 걸어야 한다. run.sh파일에서 위와 같이 nokaslr을 넣거나 빼서 설정할 수 있다.) aslr이 라이브러리 매핑을 랜덤하게 하듯이, kaslr이 적용되면 부팅 시 커널 코드와..
gdg디버거로 일반 바이너리는 많이 디버깅 해보았을 것이다. 커널도 이와 유사하지만, 커널에 중단점을 걸고 디버깅하면 중단점에 도달한 순간 운영체제가 정지한다는 차이가 있다. 따라서 디버깅 대상 커널과 디버거를 분리해야 한다. (그래서 QEMU를 이용한다. QEMU에서 게스트 커널을 돌리고, 로컬 gdb에서 remote로 디버깅하는 것이다. QEMU설명 및 설치, 이미지 부팅 등은 아래 글 참고) https://orcinus-orca.tistory.com/239 [System_Hacking] QEMU QEMU QEMU는 리눅스 커널을 구동하는 가상 머신이다. 커널 경험이 거의 없는데 이번 Hacktheon 본선때 멋모르고 커널 문제 잡았다가 현장에서 QEMU설치부터 시작하고 결국 문제는 풀지도 못했었다...
QEMU QEMU는 리눅스 커널을 구동하는 가상 머신이다. 사용자 모드 프로그램, 즉 일반 바이너리를 익스플로잇 할 때는 뭔가 꼬여도 그냥 프로세스를 터트리고 재실행하면 되었다. 하지만 커널 익스플로잇 시 크래쉬가 발생하면 운영체제 전체가 정지되어 버린다. 즉 시스템 자체를 재부팅해야 다시 익스플로잇을 테스트해볼 수 있으므로 매우 번거롭다. 허허 그래서 QEMU가 존재하는 것이다. QEMU는 오픈소스 에뮬레이터로, 이를 이용해 운영체제가 구동되는 가상 환경을 구축할 수 있다. 크래쉬가 발생해도 가상 환경에서 발생하는 것이므로 안전하고, 한 번에 여러 개의 가상 머신을 구동할 수 있으므로 편리하다. 참고로 리눅스 커널 이미지를 일반 바이너리처럼 실행하려고 하면 세폴이 뜬다. 커널 이미지의 베이스 주소가 커..
Kernel 커널은 핵심, 중심부라는 영어 단어로, 운영 체제의 주요 기능을 담당하는 시스템 프로그램이다. 운영체제가 부팅된 순간부터 종료 시 까지 커널은 메모리에 존재하며, 하드웨어 제어, 응용 프로그램 로딩과 같은 여러 중요한 기능들을 수행한다. 이러한 핵심 역할 수행을 위해 커널은 시스템 상에서 절대적인 권한을 가진다. 운영 모드 시스템 상에는 파일, 장치, 프로세스 등 여러 자원이 존재하는데, 커널은 응용 프로그램이 시스템 자원을 요청할 때 권한에 맞춰 접근 제어를 한다. 즉 커널의 코드나 데이터를 조작해 접근 제어를 우회할 수 있다면, 주어진 권한을 넘어 공격할 수 있는 것이다. (ex: 일반 유저는 /etc/passwd와 같은 시스템 파일 수정 권한이 없지만, 커널을 공격해 root권한을 획득..