Main reference : https://github.com/pr0cf5/kernel-exploit-practice

Contents

  1. Loadable Kernel Module (LKM)에 대한 간단한 설명
  2. 커널 문제를 위한 환경 세팅
  3. 커널 디버깅 방법

Loadable Kernel Module

소개

Loadable Kernel Module (LKM)은 주로 커널의 기능을 추가하는데 사용된다. 예를 들어, 장치 드라이버를 추가하거나, 새로운 파일 시스템을 추가하는 등의 기능을 수행할 수 있다. Loadable의 특성으로 쉽게 추가하거나 제거할 수 있게 디자인되어 있기에 백도어를 설치하는 등의 악의적인 목적으로 사용될 수도 있기에 다른 사람이나 기관이 배포한 LKM을 설치할 때에는 주의를 요한다. 경우에 따라서는 모듈이 설치되었음을 속이는 루트킷이 설치될 때도 있다.

명령어

LKM을 관리하는데 사용되는 리눅스 명령어들을 살펴보자.

https://itgameworld.tistory.com/59

insmod, rmmod : 커널 모듈 추가/삭제
lsmod : 추가된 커널 모듈 리스트 확인
depmod : 의존성을 고려하며 modules.dep 파일 갱신. modprobe 명령어를 사용하기 전에 사용된다.
modprobe : modules.dep를 참조하여 모듈들을 추가한다.

이 외에도 커널 익스플로잇을 할 때 유용한 명령어들이 있다.

cat /proc/modules, cat /sys/modules : lsmod와 거의 비슷하지만 kaslr이 없을 경우 모듈의 주소를 확인할 수 있다.

cat /proc/kallsyms | grep "<symbol>" : kaslr이 없을 경우 해당 심볼의 주소를 확인할 수 있다.

빌드 방법

buildroot 세팅

LKM을 빌드하는 데엔 여러 방법이 있다. 이 포스트에서는 buildroot를 사용하여 빌드하는 방법을 소개한다.

가상환경에서 빌드하지 않고 기존 OS에 포함되어 있는 커널 코드를 사용한다면 buildroot를 굳이 사용하지 않아도 된다. 하지만 busybox 세팅이나 root file system 등을 편하게 만들어 사용하려면 buildroot가 매우 유용하다.

buildroot를 받아서 압축을 풀고 적절히 설정한 뒤 빌드해주면 bzImage와 root file system이 생성된다. busybox 세팅을 바꾸어 루트권한을 획득할 수 있도록 바꾸고, 아키텍쳐 설정과 파일시스템 설정을 적절히 바꾸어주면 된다. 자세한 내용은 pr0cf5님 깃허브를 참고하면 된다. (https://github.com/pr0cf5/kernel-exploit-practice/tree/master/building-kernel-module)

빌드를 완료하게 되면 아래와 같이 output 폴더 안에 bzImagerootfs.cpio가 생성되게 된다. 해당 파일들은 다음 스테이지에서 사용된다.

가상환경 세팅

커널 모듈을 쉽게 올려보고 테스트해보기 위해서는 가상환경을 하나 준비해야 한다. QEMU를 통해 진행할 것인데, 필요한 준비물은 앞 단계에서 만든 kernel image와 (bzImage) 초기 파일시스템이다. (rootfs.cpio)

예시부터 보고 넘어가면 이해가 쉽기 때문에 예시부터 보자.

https://github.com/pr0cf5/kernel-exploit-practice/tree/master/building-kernel-module
qemu-system-x86_64 -initrd initramfs.cpio -kernel bzImage -append 'console=ttyS0 root=/dev/ram oops=panic panic=1' -monitor /dev/null -m 64M --nographic -smp cores=1,threads=1 -cpu kvm64,+smep

QEMU x86_64 softmmu 버전인 qemu-system-x86_64를 통해 부팅한다. 위 명령어를 보면 initrd 옵션에 initramfs.cpio*를 넣고 있고, *kernel 옵션에 bzImage를 넣고 있음을 확인할 수 있다. 이에 추가로 VM에서 사용할 CPU 코어수나 CPU 종류, kaslr과 smep와 같은 security mitigation 등을 설정할 수 있다.

파일시스템 세팅

'보안 > Pwn' 카테고리의 다른 글

개인적으로 생각하는 시스템 보안 테크트리  (0) 2021.01.23
공부용 갓갓 레퍼런스들  (0) 2021.01.23

계속해서 업데이트 됩니다.

 

1. andrea.corbellini.name/2015/05/23/elliptic-curve-cryptography-finite-fields-and-discrete-logarithms/

* 주의: 이 글의 내용은 100% 개인적인 견해입니다. 또한, 대회, 즉 CTF 기준으로 적어놓았으며 시간이 지남에 따라 여기에 적어놓은 내용이 맞지 않을 수도 있습니다. 마지막으로, 빼먹은 내용이 많으니 참고 바랍니다. (생각나는대로 적음)

소개

테크트리라고 한다면 매우 웃긴 얘기지만 혹시나 이 글을 보는 몇몇 사람들에게는 도움이 될 것 같아 적어놓는다. 여기에 적은 내용들은 전부 개인적인 생각이며, 절대로 공식적인 것이 아님을 당부드리고 시작한다. 난이도나 공부의 순서를 대회 기준으로 적어놓은 것이며 리얼월드, 즉 현실 기준으로 적은 것이 아님도 알려드리고 시작한다.

순서

1. 사전 지식들

 

당연한 이야기지만 보안을 시작하기 위해서는 일부 사전 지식이 필요하다. 물론, 이 글은 완전한 초보자를 대상으로 적은 글이기에 최소한의 필요 지식들만 적어두었다. (컴퓨터과학 또는 공학에 대한 지식이 아예 없는 대상으로 적었다) 사전 지식이라고는 하나 이 또한 순서대로 공부하면 좋다.

 

1-a. Linux 기초 (전부 파악할 필요는 없고 명령어 몇개 끄적일 정도로만)

1-b. Python (의외로 C를 먼저 시작할 필요가 없다. 모든 문법을 익힐 필요는 없다. 다만, 완전 기초라도 어느 정도의 코드를 작성할 수 있어야 한다. 클래스나 람다 함수와 같은 개념은 필요 없으니 적당히 익히면 된다)

1-c. C 기초 (C++가 아니다. C를 정말 체계적으로 공부해서 C에 어떤 문법이 있고 까지 익힐 필요는 없다. 다른 사람들이 작성한 코드들을 읽을 수 있을 레벨까지만 익히면 된다)

1-d. 어셈블리 기초 (x86, x86_64만 일단 공부하면 된다. 모든 명령어를 익힐 필요는 없지만 레지스터가 어떻고, calling convention이 뭐고 등 어느정도 숙련된 레벨까지 공부해야 한다. 많은 사람들이 여기서 접는다)

1-e. 정적 분석 툴 사용법 (IDA, Ghidra, Binary Ninja, ... 등 많은 툴 중에서 하나만 대충 익히면 된다. 정말 대충 익히면 된다)

1-f. GDB 사용법 (항상 그렇지만 모든 명령어를 익힐 필요는 없다. 기초만 다져놓고 나머지를 공부하면서 익숙해지면 된다)

1-g. 네트워크, file descriptor, socket (간단한 클라이언트-서버 모델만 작성할 수 있으면 된다)

1-h. Pwntools (간단한 스크립트만 작성할 수 있으면 된다. Python이 사용된다)

1-k. 가상 머신, Docker (환경 구축)

 

일단은 위와 같이 적었지만 나중에 가서 필요하면 더 체계적으로 익혀야 한다. 위에 적어놓은 것은 야매 방법이다.

 

2. 시작 - 스택에서 놀자

 

이제 스택에서 일어나는 일들에 대해 공부한다. 개념들만 일단 나열해놓겠지만 해당 개념들에 대해 문제를 하나씩은 풀어볼 것을 추천한다.

 

2-a. Stack Buffer Overflow (ASLR을 꺼야 한다.  -> 1. 로컬 변수 조작 / 2. 리턴 주소 조작 / 3. 쉘코드 넣어놓고 쉘코드로 점프하기)

2-b. Fake EBP (공부할 필요는 없지만 공부하면 calling convention 등에 좀 더 익숙해질 수 있다)

2-c. 보호 기법들 (ASLR, NX (DEP), PIE)

2-d. Memory Leak (주소나 필요한 데이터를 따는 방법에 대해 다룬다. 메모리 할당했다가 풀어주지 않아서 메모리를 계속해서 잡아먹는 현상을 지칭하지 않는다)

2-e. Procedure Linkage Table, Global Offset Table (줄여서 PLT, GOT)

2-f. Return to libc, Return Oriented Programming (줄여서 RTL, ROP)

2-g. Format String Bug (줄여서 FSB)

2-h. Stack Pivoting

 

아래는 고급 테크닉들을 다룬다. 굳이 공부할 필요가 있을까 싶다.

 

2-i. GDB Scripting (분석을 위해 필요할 수 있다)

2-j. SROP, FSOP

2-k. Return to dl_resolve

2-l. Hard shellcoding (Sandbox가 걸려있는 경우 등에서 쉘코딩 하기)

2-m. Exit function list

2-n. One gadget (Magic gadget)

2-o. stdout overwrite (stdout이나 stderr 구조 덮어써서 메모리 릭을 내는 방법)

2-p. Race condition

 

3. 힙 트릭들

 

솔직히 권장 사항으로 두고 싶지만 요즘은 기본이 된 기술들이다. 거의 필수화되었기 때문에 공부하는게 좋다. 난이도가 급격하게 올라가니 주의가 필요하다.

공부하는게 좋지만 불필요하다고 느껴지는 것들은 건너뛰면 된다.

 

3-a. Use After Free (UAF)

3-b. C++ Reversing (C++ 문법에 대한 어느정도 지식이 필요하다)

3-c. Fake vtable

3-d. Double free bug (줄여서 DFB)

3-e. Dynamic allocator basics (Dynamic allocator에 대한 기초적인 지식들을 배운다. 청크, fragmentation 등)

3-f. GLIBC 2.23 heap (Bins, arena, ...)

3-g. House 시리즈 (GLIBC 2.23 이전 우선, 전부다 공부할 필요는 없다)

  권장 리스트 (난이도 순) : House of Spirit, Fastbin dup, Overlapping chunks, House of Force, Unsorted bin attack, Unsafe Unlink, House of Lore (2.23에서는 안 되는데 개념은 알아둘 필요가 있음), Poison Null Byte

  비권장 리스트 (굳이?) : House of einherjar, House of Orange, Small bin attack, Large bin attack

3-h. GLIBC >2.23 heap (Tcache, 바뀐 mitigation, ...)

  권장 리스트 (난이도 순) : Tcache dup, Tcache Poisoning, 나머지는 필요한대로

 

4. 고인물의 영역

 

정말 많은 것들이 나오기 시작한다. 생각나는 것들만 리스트로 남겨놓는다.

 

4-a. Kernel (요즘 필수화되고 있음)

4-b. VM Pwn (거의 필수화 됨)

4-c. Go, Rust (심심하면 나옴)

4-d. Windows Pwn

4-e. Browser (V8, JavascriptCore, Safari, ...)

4-f. VM Escape (VM Pwn이랑은 다름. 여기서는 VirtualBox, QEMU 등이 나옴)

4-g. Web Pwn (웹이랑 섞여 나오는 혼종)

4-h. Hardware 취약점 (가끔 뜰 경우 나온다. 대표 - Spectre)

 

'보안 > Pwn' 카테고리의 다른 글

Kernel 1 - 환경 세팅 (작성중)  (0) 2021.05.04
공부용 갓갓 레퍼런스들  (0) 2021.01.23

* 계속 추가됩니다.

 

정말 최소화한 리스트. 해당 링크들만 있으면 공부할 때 쉽게 시작할 수 있습니다.

 

<Heap>

GLIBC 2.23까지 좋은 자료들 - www.lazenca.net/display/TEC/02.Heap+Exploitation

일반적인 자료들 (좋은 자료는 아니지만 이런 공격이 있다 정도 참고 가능합니다) - github.com/shellphish/how2heap

 

<V8>

*CTF 2019 oob-v8 - faraz.faith/2019-12-13-starctf-oob-v8-indepth/ (Write-up 이지만 문제도 정말 간단하고 write-up 내용도 정말 쉽게 이해할 수 있습니다)

 

<Kernel>

kernel-exploit-practice - github.com/pr0cf5/kernel-exploit-practice

 

'보안 > Pwn' 카테고리의 다른 글

Kernel 1 - 환경 세팅 (작성중)  (0) 2021.05.04
개인적으로 생각하는 시스템 보안 테크트리  (0) 2021.01.23

+ Recent posts