취약점

  • 사용자에게 허용된 권한 이상의 동작이나 정보 열람을 가능하게 하는 소프트웨어의 설계상의 허점이나 결함
  • 소프트웨어, 하드웨어, 절차 및 관리 등 넓은 의미를 예기하지만 중점은 기술적 소프트웨어 결함 을 통한 취약점 발생 여부이다.

Exploit

취약점이 발견되면 해당 취약점을 공격하여 원하는 코드를 실행하거나 툭정 목적을 달성하는 공격 코드 또한 공개 된다. 이런 취약점 공격 코드를 Exploit이라 부르며 이러한 공격 코드를 이용한 공격 행위 일체를 포함하기도 한다.

Exploit 공개 범위

  • 유로 Exploit
  • 무료 Exploit
  • 악의적인 Exploit (공개 X)

Offensive Security’s Exploit Database Archive

취약점 발견 및 패치

발견되는 취약점인 경우 대부분이 연구 목적으로 공개가 되어 지면서 동시에 해당 취약한 제품을 다루는 기업들은 그에 맞춰 패치가 이뤄진다. 하지만 취약점을 악의적으로 사용할 경우 공개를 하지 않고 서 군사적 일부 해킹 그룹에서 사용하여 사이버 공격으로 이용이 가능하며 또한 공개를 하기 전에 취약점을 사용하여 악의적인 행위를 한 후 공개를 하는 경우가 있는데 이러한 경우를 제로데이 공격이라 한다. 취약점에 대한 패치를 하기 전에 해당 버전에 맞게 취약점 공격을 수행하는 것을 말한다.

취약점 분류

Memory Corruption 취약점

  • 버그로 인한 메모리 오염
  • 예상되지 않은 메모리 값 변경, 참조 등에서 발생
  • 원인 : 대부분 안전하지 않은 함수의 사용, 잘못된 함수 사용 등 프로그래밍 실수로 인해 발생
  • 대표 : BufferOverflow 취약점

Stack Buffer Overflow

메모리 경계를 검사하지 않은 함수 사용으로 인해 스택을 덮어 쓰게 되어 발생 된다.

char buf[20];
strcpy(buf, argv[1]);  // 임계값 검사를 하지 않는다.

취약 함수

strcpy, gets, scanf, strcat, getwd, sprintf

즉, 문자열 길이를 검사하는 함수를 사용하여 해당 취약점에 대한 기본적인 방어가 가능하겠다. 길이를 검사하는 함수를 사용해도 발생하는 경우가 있다.

char buf[20];
len = strlen(argv[1]);
strncpy(buf, argv[1], len); // 문자열 길이가 20을 넘을시 BOF 발생

메모리 복사, 문자열 복사함수는 반드시 정확한 검증을 거친 후에 수행하도록 한다.

Heap Buffer Overflow

스택 버퍼 오버플러우와 비슷하나, 힙 영역에서 발생하는 점이 다르다. 또한 메모리 구조가 다르기 때문에 취약점 공격 기법도 다르다.

int *buf = (int *)malloc(20);
strcpy(buf, argv[1]);  // 경계값 검사하지 않는다.

Integer Overflow

정해진 자료형보다 큰 수를 저장할 때 발생하는 오버플로우 문제로, 조건문 등에서 정해진 분기문이 아닌 다른 분기문을 실행하도록 하여 취약점을 발생시킬 수 있다.

unsigned char maxlen = 0;
char len = 0;
char buf[30] = {0, };

len = strlen(argv[1]); // 128 바이트 이상 입력시 음수로 인식된다.
if (len > 30) {
	printf("Error!! MAX Size:30\n");
} else {
	printf("Vuln!!");
	strcpy(buf, argv[1]);
}
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -> Error!! MAX Size:30
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA..128byte 이상 -> Vuln!!

signed char 128이상의 수를 음수로 인식하기 때문에 조건 범위를 벗어 난다.

Format String Bug

포맷스트링을 지정해 주지 않고 사용할 때 발생하는 취약점 %n, %hn 등의 일부 포맷스트링을 이용하여 메모리 값을 변조하게 된다.

strcpy(buf, argv[1]);
printf(buf)   // FSB

User-After-Free

최근들어 많이 발생하는 취약점이고 특히 브라우저에서 많이 발생된다. free된 포인터를 사용할 때 발생한다. 자바스크립트, 파일 로딩 등으로 힙 메모리를 조작할 수 있는 상황에서 공격이 가능하다.

free(object);
object->method();   // free 되어진 포인터 사용

Double Free

free 된 메모리를 다시 free 할 때 발생한다. 대부분 프로그래밍 실수로 인해 발생한다. Integer Overflow 등의 취약점으로 인햐 발생하기 도 한다.

int *ptr;
{
	free(ptr);
}

free(ptr);  // Double Free 취약점 발생

Null Pointer Dereperence

메모리 값이 지정되지 않은 초기화되지 않은 포인터 (Null Pointer)에 값을 넣으려 할때 발생한다.

char *ptr = null;
...
*ptr = '1234'

Exploit 분류

  • Exploit은 취약점을 공격하는 코드이다. 이러한 공격코드들으 몇 가지 기준에 따라 분류되며, 크게 원격에서 공격이 가능한 Remote Exploit과 로컬상에서 공격이 가능한 Local Exploit으로 분류된다.

Local Exploit

로컬 PC 혹은 서버 내에서 발생하는 Exploit이다. 일반적으로 권한상승 혹은 코드 실행을 위해서 사용된다.

  • 인자값을 그대로 넣어서 사용하는 경우
  • 특정 파일을 통해 입력값을 전달하게 되므로 로컬상의 권한을 이미 가지고 있는 경우

압축 프로그램, 음악 플레이어, 문서 편집 프로그램 등 수 많은 프로그램들이 검색 되는 것을 확인할 수 있겠다. 사용자에게 입력값을 받는 모든 프로그램은 취약점이 존재할 수 있다.

Remote Exploit

원격에서 이뤄지는 공격이다. 원격에서 패킷을 보내 공격하므로 특정 포트를 열고 서비스를 제고하는 서버 프로그램이 타겟이다. 포트가 열려있는 것만으로 원격에서 공격을 당할 수 있기 때문에 대부분의 원격 공격은 취약하다.

Remote Exploit은 원격에서 직접 공격이 가능하므로 주로 서버에 접근 권한을 얻기 위한 1차 공격으로 많이 사용되며 Remote Exploit을 통해 서버의 일반 사용자 권한을 획득한 뒤, Local Exploit을 통해 추가 권한 상승을 시도하는 것이 일반적인 침투 원리이다.

참조 사이트

Offensive Security’s Exploit Database Archive

Packet Storm