1. 버퍼 오버플로우 공격 (Buffer Overflow, Buffer Overrun Attack)
1) 프로세스 메모리 구조
Text 영역: 프로그램 코드와 상수가 정의, 읽기만 가능한 메모리 영역이고 기계어로 변역된 프로그램 코드가 저장된다.
Data 영역: 전역 변수와 정적 변수가 저장되어 있는 영역이다.
Heap 영역: 동적 메모리 호출에 의해 할당되는 메모리 영역이다.
Stack 영역: 함수 인자 값 함수 내의 지역 변수, 함수의 반환 주소등이 저장되고 상위에서 하위 메모리 주소로 저장된다.
스택 영역에서 메모리 할당은 연속된 주소 상에서 이루어진다.
2) 버퍼 오버플로우 개념 (Buffer Overflow)
버퍼 또는 데이터 저장 영역에 할당된 용량보다더 많은 입력이 위치하면 버퍼를 벗어나 다른 영역에 정보를 변경할 수 있다.
아래와 같은 코드가 있다고 가정할 때 인자 값에 9byte 이상의 값을 넣으면 버퍼 오버플로우가 발생한다.
int main(int grgc, char *argv[]){
char buffer[10];
strcpy(buffer,argv[1]);
printf("%s\n",buffer);
return 0;
}
3) 스택 오버플로우 개념 (Stack overflow)
스택에 정해진 버퍼보다 더 큰 값을 삽입하여 반환주소를 변경함으로써 임의의 공격 코드를 루트 권한으로 실행한다.
SetUID가 설정된 루트 권한 프로그램을 공격 대상으로 한다.
3.1) 스택 오버플로우 절차
버퍼에 저장되는 공격자의 코드로 실행 제어를 이동시키는쉘코드를 사용한다.
① 공격 쉘 코드를 버퍼에 저장한다.
② SetUID가 설정된 파일의 특정 함수의스택 반환주소를 오버플로우시켜서 공격 쉘 코드가 저장되어있는 버퍼의 주소로 덮어 씌운다.
③ 특정 함수의 호출이 완료되면조작된 반환 주소로 쉘 코드 주소가 반환되어 쉘 코드가 실행되고루트 권한을 흭득하게 된다.
4) 힙 오버플로우 (Heap Overflow)
할당된 공간이 함수에 대한포인터를 가지고 있다면 공격자는 이 주소를 변경하여 겹쳐 쓴 버퍼에 있는 쉘코드를 가리키도록 한다.
메모리 위 방향으로 커지고(스택과 반대). 연결 리스트, 동적 데이터 구조의 취약점을 이용한다.
5) 버퍼 오버플로우 공격 대응책
5.1) 컴파일 시간 방어
컴파일할때 검사하여 오버플로우를 방지하거나 발견한다.
새 프로그램 내에서 공격을 저지하도록 프로그램을 강화시킨다.
5.1.1) 고급 수준의 프로그래밍 언어 사용
Java, Python 같은 버퍼 오버플로우를 허용하지 않는 언어를 사용한다.
5.1.2) 안전한 함수 사용
입력 값을 검사하는 함수를 쓴다.
안전한 함수: strncpy(), fgets() 등
안전하지 않은 함수: scanf(), sscanf(), vscanf(), strcpy(), gets() 등
5.1.3) 안전한 라이브러리 사용
Libsafe 라이브러리를 사용한다. (오버플로우 방지 라이브러리)
5.1.4) 스택 보호 메커니즘 (Stack Guard)
추가적인 함수의 진입과 종료 코드 삽입하여 조사하고 함수의 스택 프레임에 대해 손상이 있는지 검사한다.
입력시 canary값을 입력하고 종료시 canary값이 변경 되면 프로그램을 종료시킨다.
매우 효과적이나 기존의 프로그램들을 모두 새롭게 컴파일 해야하고 스택 프레임 구조가 변경된다.
5.1.5) 스택 쉴드 (Stack Shield)
함수 시작 시 복귀 주소를 Global RET이라는 특수 스택에 저장해 두었다가 함수반환시 특수 스택의 값과 비교해다를 경우 오버플로우로 가정해 프로그램을 종료 시킨다.
5.2) 실행 시간 방어
기존 프로그램 내에서 공격을 저지하도록 프로그램을 강화시킨다. (윈도우 업데이트로 배포)
실행 시점으로 실행 가능 주소 공간 보호, 주소 공간 임의화가 있다.
5.2.1) 주소 공간의 임의 추출 (ASLR, Address Space Layout Randomization)
스택 공간을 임의적으로 배치해 공격자가 실행 코드의 주소를 예측할 수 없도록 한다.
5.2.2) NOP sled (No OPeration 썰매)
NOP명령어(0x90)는 빈 공간을 채우기 위한 명령어이며 해당 명령어를 만나면 다음 명령어로 넘어간다.
아무런 기능도 수행하지 않고 단순히 다음 명령으로 진행하도록 컴퓨터에게 지시하는 명령이다.
개발자는 NOP 코드가 존재하는지 검사하여 대응한다.
5.2.3) 실행 가능 주소 공간 보호 (Executeable Address Space Protection)
실행 코드가 프로세스 메모리상의 특정 위치에서만 실행될 수 있게 함으로서 쉘 코드를 실행할 수 없게 한다.
/etc/system
set noexec_user_stack = 1
set noexec_user_stack_log = 1
5.3) 사용자 측면 방어 방법
필수적은 경우를 제외하고 setUID 비트를 제거한다.
프로그램 패치를 수행하거나 최신 버전을 설치한다.
2. 포맷 스트링 공격 (Format String Attack)
1) 포맷 스트링 공격 개념
외부로부터 입력된 값을 검증하지 않고 입출력 함수의 포맷 문자열로 그대로 사용할 경우 발생할 수 있는 취약점이다.
데이터 형태에 대한 불명확한 정의로 발생한다.
취약한 프로세스 공격, 메모리의 내용 읽기 쓰기, 버퍼 오버플로우를 일으킬 수 있다.
//안전하지 않는 코드 예
#include <stdio.h>
int main(int argc, **argv){
printf(grgv[1]);
return 0;
}
2) 포맷 스트링 취약점의 위험 요소
프로그램의 파괴: 프로세스를 죽게 만든다. (DNS Spoofing시 서버 응답하지 않게 설정)
프로세스 메모리 보기: 포맷 함수의 응답을 통해 포맷 스트링이 무엇을 하며, 프로세스 배치가 어떻게 되는지 확인할 수 있다.
임의의 메모리 덮어쓰기: 어떤 프로세스의 명령 통제권을 장악할 수 있다.
취약점 점검 툴은 gdb, ltrace, objdump 등이 존재한다.
3. Race Condition Attack
1) Race Condition Attack 개념
둘 이상의 프로세스나 스레드 공유 자원에서동시에 접근할 경우 접근 순서에 따라 비정상적인 결과가 발생하는 상황을 말한다.
실행되는 프로세스가 임시 파일을 만드는 경우악의적인 프로그램을 통해 그 프로세스 실행 중에 끼어들어 임시파일을 목적 파일로 연결(심볼릭 링크)하여 악의적인 행위를 할 수 있다.
2) 심볼릭 링크와 Race Condition Attack
공격 대상은 소유자가 root이고 SetUID 비트를 가지며 임시파일을 생성하는 파일이다.
생성되는 임시파일 이름은lsof
명령어로 확인할 수 있다.
① 프로그램 실행 전 임시 파일을 심볼릭 링크로 미리 생성한다.
② 임시 파일이 심볼릭 링크 파일로 교체된 후 프로그램 실행절차이다.
3) Race Condition Attack 대응책
임시파일을 생성한 후 임시 파일에접근하기 전에 임시파일에 대한 심볼릭 링크 설정 여부와 권한에 대한 검사 과정을 추가한다.
Umask 값을 022로 설정하고 임시파일이 공격자에 의해 악의적으로 삭제되지 않도록 설정한다.
4. 백도어 (Back Door)
1) 백도어 개념
서비스 기술자가나 유지보수 프로그래머의접근 편의를 위해서 시스템 설계자가 고의로 만들어 놓은 통로이다.
백 오피리스(Back orifice): PC에 내장되어 사용자 몰래 사용자의 정보를 저장, 유출하기위한 백도어 프로그램이다.
Trap Door: 프로그램을 설계할때 특수한 접근 지점을 남겨둔채 컴파일하면 완성된 프로그램에Trap Door가 발생
2) 백도어 탐지와 대응책
현재 프로세스를 확인하여 백도어가 아닌정상 프로세스 목록들을 확인한다. (외워두어야 함)
H-IDS를 사용하여 백도어 사용을 탐지한다.
5. 시스템 자원 고갈 공격 (시스템 서비스 거부 공격)
1) 가용 디스크 자원 고갈 공격
tempfile을 생성 후 tempfile안에 1000byte씩 계속 써서 디스크 메모리를 고갈 시킨다.
#include <stdio.h>
#include <sys/file.h>
void main(){
int fd;
char buf[1000];
fd = creat("/root/tempfile", 0777);
while(1) write(fd,buf,sizeof(buf));
}
2) 가용 메모리 자원 고갈 공격
포인터 변수를 만든 후 포인터 변수에 1000byte씩 동적 할당을 통해 Heap 영역 메모리를 고갈 시킨다.
#include <stdio.h>
void main(){
char *m;
while(1) m = malloc(1000);
}
3) 가용 프로세스 고갈 공격
fork()함수를 통해 프로세스를 무한 복제하여 가용 프로세스를 고갈 시킨다.
#include <unistd.h>
void main(){
while(1)
fork();
return 0;
}
4) 프로세스 죽이기 공격
root 권한을 얻은 상태에서 스크립트를 통해서 프로세스를 죽이는 기법이다.
#!/bin/sh
sync
kill -15 1
6. 리버스 엔지니어링 공격
1) 리버스 엔지니어링 개념
장치나 시스템의 구조를 분석하여 원리를 발견하는 과정을 말한다. (역공학)
2) 리버스 엔지니어링 목표
공격대상 시스템 또는 응용프로그램에 대한 분석을 수행할 수 있다.
분석 후 취약점을 찾을 수 있고 취약점을 통한 공격 코드 작성이 가능하다.
3) 리버스 엔지니어링 대응책
프로그램 코드를소스코드 난독화 또는 바이너리 난독화를 수행한다. (프로그램의 가독성 낮춤)
7. 루트킷 (Rootkit)
시스템에 설치되어 그존재를 최대한 숨기면서공격자가 언제든지 시스템 root권한으로 접근할 수 있도록 백도어, 트로이목마 설치, 원격접근 등을 통해 비밀 통로를 지속적으로 유지시켜주는 프로그램이다.
비밀통로가 생성된 이후 시스템 변형을 통해서 사용자가 루트킷이 존재하는지 확인하기가 매우 어렵다.
키로거 봇넷 및 재전송 메일을 포함하여 거의 모든 소프트웨어를 숨길 수 있다.
은폐형 바이러스
감염된 파일의 길이의 변동 유무를 숨기고 바이러스를 검출 하려고 할때 감염되기 이전의 모습을 보여줘 백신 프로그램이나 사용자를 속인다.
루트킷은 프로그램!
8. 논리 폭탄(logic bomb)
특정 사건이 발생할 때 프로그램이나 일련의 코드를 실행한다.
9. 기타 공격 방법들
조크(Joke): 사용자의 심리적인 동요나 불안을 조장하는 가짜 컴퓨터 바이러스 또는 프로그램이다.
혹스(Hoax): 기관을 사칭하여 통신수단을 통해 거짓 정보를 사용자에게 전송하여 사용자를 속이는 바이러스이다.
'Certification Study > 정보보안기사' 카테고리의 다른 글
[정보보안기사] 23. 무선통신 보안 (출제율: 1.5%) (5) | 2020.02.11 |
---|---|
[정보보안기사] 18. 최신 보안 주제들 (출제율: 1.5%) (0) | 2020.02.10 |
[정보보안기사] 16. 서버 보안 관리 (출제율: 3.6%) (0) | 2020.02.08 |
[정보보안기사] 15. 유닉스/리눅스 서버 보안 (출제율: 4.5%) (0) | 2020.02.08 |
[정보보안기사] 13. 클라이언트 보안 (출제율: 2.3%) (0) | 2020.02.06 |
공부&일상 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요! 질문은 언제나 환영입니다😊