프로세스 메모리 구조
1. 프로세스 메모리 구조는 스택, 힙, 데이터, 텍스트 영역으로 구분된다.
- 스택 : 함수 호출 시 생성되는 지역변수, 매개변수가 저장되었다가 함수 종료시 반환되는 영역
- 힙 : 동적 메모리 호출(동적할당)에 의해 호출되는 메모리 영역
- 데이터 : 전역변수, 정적변수가 저장되어 있는 영역
- 텍스트 : 프로그램 코드, 상수가 정의되어있는 영역
쉘코드
- 오버플로우가 발생하는 버퍼에 저장되는 공격자의 코드
- 실행제어를 이동시킴
- 버퍼 오버플로우의 핵심 공격
버퍼 오버플로우 공격
- 프로세스가 정해진 크기의 버퍼 한계를 벗어나 이웃한 메모리 위치에 데이터를 겹쳐쓰려고 시도하는 것
- 할당된 메모리 경계에 대한 검사를 하지 않는 프로그램의 취약점을 이용
스택오버플로우 공격
- 스택 : 후입선출(LIFO) 방식에의해 정보를 관리, TOP이라 불리는 스택 끝부분에서 데이터 삽입과 삭제 일어남, 아랫방향으로 갈수록 커진다.
- 스택 오버플로우 : SetUID가 설정된 루트 권한의 프로그램을 대상으로 스택에 정해진 버퍼보다 큰 공격 코드를 삽입해 반환주소를 변경함
- 스택 오버플로우 공격절차
1. 공격 쉘 코드를 버퍼에 저장
2. root권한으로 실행된 프로그램의 특정함수 스택 반환주소 버퍼 오버플로우 시켜 공격 쉘 코드 저장되어있는 버퍼 주소 로 덮어 씌운다.
3. 특정함수 호출 완료시 쉘 코드 주소 반환으로 쉘 코드 실행되고 루트 권한 획득
힙 오버플로우 공격
- 힙 : 가변적인 양의 데이터를 저장하기 위해 프로그램에 의해 할당되었다가 회수되는 작용 반복, 기억장소는 동적으로 할당받고 회수됨, 메모리 위 방향으로 갈수록 크기 커짐
- 동적 데이터 구조를 위해 사용되는 레코드가 오버플로우에 의해 연속된 메모리가 손상되는 현상
- 스택과 달리 힙은 반환주소가 없지만 할당 공간 함수에 포인터가 포함되어 있다면 공격자는 이 주소를 변경하여 쉘 코드를 가리키도록 할 수 있다.
버퍼오버플로우 공격의 대응책
1. 컴파일 시간 방어
- 프로그램을 컴파일 할 때 검사하여 버퍼 오버플로우를 방지, 발견하는 것
- 검사 후 기존 프로그램을 다시 컴파일 해야 하는 단점이 있음
2. 실행시간 방어
- 컴파일 시간 방어의 재 컴파일의 단점을 극복하기 위한 방법(운영체제 업데이트로 배포가 가능)
컴파일 시간 방어
1. 프로그래밍 언어 선택 - Java, ADA, Python처럼 버퍼 오버플로우를 발생시키지 않는 언어 선택
2. 안전한 코딩 기법
사용자제를 권장하는 함수 |
사용을 권장하는 함수 |
ㆍstrcat(), strcpy(), gets(), scanf(), sscanf(), vscanf(), vsscanf(), sprinf() 등 |
strncpy(), stcncat(), fgets(),fscanf(), vfscanf(), snprintf(), vsnprintf() 등 f,n이 들어가는 함수 |
3. 언어 확장과 안전한 라이브러리 사용
4. 스택 보호 메커니즘
- 함수의 진입과 종료 코드를 조사해 함수 스택 프레임에 대한 손상이 있는지 판단하는 방식
- 프로그램 함수 호출시 ret 앞에 canary값을 주입 후 종료 시 canary 값이 변경되었는지 확인하는 방법
- 적용하기 위해서는 기존의 프로그램들을 모두 새롭게 컴파일 해야함
5. 스택 쉴드
- 함수 시작 시 복귀주소를 특수 스택에 저장해 두었다가 종료 시 저장된 값과 스택의 값을 비교해 다를 경우 오버플로우로 간주
실행시간 방어
- 실행가능 주소 공간 보호 : 실행코드가 특정지역에서만 사용하게 함 → 원천적으로 공격자의 쉘코드를 실행할 수 없게 함
- 주소 공간 임의화 : 스택 버퍼가 위치하는 주소 공간을 메모리 내에서 임의적 배치 → 공격자가 실행코드가 어디있는지 알 수 없게 함
- 주소 공간의 임의 추출(ASLR) : 프로세스 주소 공간에 있는 중요 데이터의 위치 구조를 랜덤 위치로 조작하는 것
- 실행가능 주소 공간의 보호
1. 스택과 힙을 실행불능(Non-Excutable Stack)으로 만듦으로써 기존 프로그램을 위한 여러 가지 버퍼 오버플로우 공격 막음
2. /etc/system파일에 set noexec_user_stack =1, set noexec_user_stack_log=1로 설정
※ rtl : 공격자가 실행불능 공격에 대한 대응책으로 실행불능 스택을 우회하는 방법
- NOP sled : 공격자가 스택 버퍼의 맨 끝 부분에 쉘코드를 위치시키고 버퍼의 앞 부분에 의도적으로 NOP를 채워 넣어 쉘코드 위치를 모르게 하는 것
※ NOP : 아무 기능도 하지 않는 명령어
포맷스트링 공격
- 포맷 스트링 문자를 사용하지 않고 함수를 사용하는 공격으로 ret 값을 변조하여 임의의 코드를 실행함
ex) printf("%s,char) → printf(char)
- 포맷스트링 문자 종류
파라미터 |
특징 |
파라미터 |
특징 |
%d |
정수형 10진수 상수(int) |
%o |
8진수 양의 정수 |
%f |
실수형 상수(float) |
%x |
16진수 양의 정수 |
%lf |
실수형 상수(double) |
%s |
문자열 |
%s |
문자 스트링(char *) |
%n |
이전까지 출력한 바이트 수 지정변수(4바이트) |
%u |
양의 정수 |
%hn |
%n의 절반(2바이트) |
- 포맷스트링 취약점의 위험요소
1. 프로그램 파괴
2. 프로세스 메모리 보기
3. 임의의 메모리 덮어쓰기
- 포맷스티링 공격의 대응책으로 함수 사용시 포맷 스트링을 반드시 지정해 주어야 하며 시스템 패치도 꾸준히 해야 한다.
- 포맷 스트링 취약점 점검 도구
1. gdb
2. ltrace
3. objdump
파일링크의 종류
1. 하드링크
- 원본파일의 복사판
- 하드링크 파일 수정 시 원래 파일도 똑같이 수정이 됨
- 두 파일 중 하나만 삭제하면 파일의 내용은 바뀌지 않고 링크 숫자만 줄어듦
- 두 파일이 각각 동일한 수준의 데이터를 가지기 위해 서로 동기화를 함
- 링크하고자 하는 파일과 하드링크 파일은 동일 파티션에 존재해야 함
2. 심볼릭 링크
- 레이스 컨디션 공격에 쓰임
- 원본파일을 가지고 있는 것이 아닌 원본 파일 데이터를 가리키는 링크 정보만 가짐
- 원본 파일 삭제되더라도 원본 파일의 이름과 위치를 계속 기억하고 바라보고 있음
→ 삭제된 원본 파일 대신 원래 파일 경로의 이름이 동일한 다른 파일이 들어온 경우 심볼릭 링크는 그 파일과 연결 됨
레이스 컨디션 공격
- 둘 이상의 프로세스나 스레드가 공유자원에 동시에 접근할 때 접근 순서에 따라 비정상적인 결과가 발생하는 조건 / 상황
- 실행되는 프로세스가 임시파일을 만든 경우 공격자는 프로세스 실행 중 끼어들어 임시파일을 공격파일로 연결해 악의적 행위 가능
- 또한 root 권한으로 실행 되면 권한 상승을 통해 중요 자원에 접근이 가능하다.
- 레이스 컨디션 공격의 조건
1. Set UID 설정
2. 심볼릭 링크
3. 임시파일 생성 가능
- 레이스 컨디션 공격 대응책
1. 임시 파일에 접근하기 전 임시파일에 대한 심볼릭 링크 설정 여부와 권한 검사 과정 추가
2. 임시파일은 가능한 생성하지 않는다.
3. umask를 최하 022로 설정
4. sticky-bit 사용
백도어
- 시스템의 보안이 제거된 통로
- 서비스 기술자나 유지보수 프로그래머의 접근 편의를 위해 시스템 설계자가 고의적으로 만든 보안 구멍
- 백도어를 통해 업무 편의성이 증가
- 악의적인 백도어 = 백 오르피스 → PC에 내장되어 사용자 몰래 사용자 정보를 저장, 유출
- 리눅스 / 유닉스에서 root 권한으로 http 데몬이 수행중일 경우 보안에 매우 취약하다
- 백도어, 웜 / 바이러스가 자주 사용하는 프로세스
1. Csrss.exe = 윈도우 콘솔을 관장, 스레드 생성 / 삭제
2. Explore.exe = 작업표시줄, 바탕화면 같은 사용자 쉘 지원
3. Lsass.exe = Winlogon 서비스에 필요한 인증 프로세스
4. Mstask.exe = 시스템에 대한 백업이나 업데이트 토큰 생성
5. Smss.exe = 사용자 세션 시작 기능 담당하는 프로세스
6. Spoolsv.exe = 프린터와 팩스 스풀링 기능 담당
7. Svchost.exe = DLL에 의해 실행되는 프로세스의 기본 프로세스
8. Services.exe = 시스템 서비스 시작 / 정지하여 그들 간 상호 작용 기능 수행
9. Taskmgr.exe = window 작업 관리자 자신의 프로세스
10. Winlogon.exe = 사용자 로그인 / 로그오프를 담당하는 프로세스
※ Csrss.exe, Svchost.exe는 공격자들이 가장 애용하는 프로세스이다.
- H-IDS
1. 호스트 기반 IDS를 이용해 백도어를 탐지
2. H-IDS를 이용해 checksum을 이용한 무결성 검사도 가능하다
3. H-IDS의 제공 서비스
1. 열린 포트 확인
2. 무결성 검사
3. 로그검사 수행
- 백도어에 대한 가장 좋은 대응책은 최초의 권한 획득을 허용하지 않는 것이다.
시스템 자원 고갈 공격(DOS)
- 시스템 서비스 거부 공격이라고도 불리는 DOS는 시스템이 보유하고 있는 자원을 모두 선점하거나 모두 고갈하는 방식으로 수행된다.
- 대표적인 방법으로 디스크 채우기, 메모리 고갈, 모든 프로세스 죽이기, 프로세스 무한 생성 등이 있다.
1. 가용 디스크 자원 고갈 공격(디스크 채우기)
#include<unistd.h> #include<sys/file.h> void main(){ int fd; char buf[1000]; fd = creat("/root/termifile" ,0777); while(1){ write(fd,buf,sizeof(buf); // 버프크기만큼 버프에 fd라는 파일을 생성해 디스크 자원 고갈 } } |
2. 가용 메모리 고갈 공격(메모리 고갈) - 디스크 고갈 공격보다 시스템 자원을 더 많이 차지
#include<stdio.h> void main(){ char *m; while(1){ m = malloc(1000); // 동적 할당을 이용해 계속해서 메모리 고갈 시킴 } } |
3. 가용 프로세스 자원
#include<unistd.h> void main(){ while(1){ fork(); // fork = 프로세스 할당 함수 → 무한반복으로 프로세스를 만들어 가용 프로세스를 0으로 만듦 return 0; } } |
4. 프로세스 죽이기 - root 권한으로 스크립트 사용해 사용중인 프로세스를 죽임
#!/bin/sh sync kill -15 1 |
리버스 엔지니어링(역공학)
- 장치 시스템의 구조를 분석하여 원리를 발견하는 과정
- 리버스 엔지니어링 공격으로 공격자는 시스템 또는 응용프로그램에 대한 분석 수행해 취약점을 발견해 공격할 수 있다.
- 리버스 엔지니어링 대응책 → 난독화
1. 소스코드 난독화 - 프로그램 소스코드를 알아보기 힘들게 하여 취약점 발견을 어렵게 함
2. 바이너리 난독화 - 바이너리 역공학을 통한 분석을 어렵게 함
루트킷
- 시스템에 설치되어 그 존재의 흔적을 최대한 숨기면서 공격자가 언제든지 시스템에 관리자 권한으로 접근할 수 있도록 비밀 통로를 지속적으로 유지시켜주는 일련의 프로그램
- 루트킷으로 루트 권한 획득 후 모든 서비스를 제어하는 방법
GNU BASH 취약점
- 취약한 bash는 환경변수의 함수 선언문 뒤에 임의의 명령어를 삽입한 경우 환경변수에 설정된 함수 선언시 선언의 끝을 인지 하지 못하고 삽입한 명령어까지 실행하는 취약점이 있음
- 공격자는 이 취약점을 이용해 쉘코드를 삽입하여 수행
- 2014년 9월 최초발견된 취약점으로 CVE-2014-6271이라는 취약점 번호가 부여됨
- 셸쇼크라고도 함
- 셸쇼크에 가장 영향을 많이 받는 프로그램은 CGI이다.
논리폭탄
- 특정한 사건이 발생할 때 프로그램이나 일련의 코드가 실행되는 것
- 사용자가 특정한 행위를 수행 시 그것의 페이로드 실행을 활성화하는 많은 유형의 트리거를 가질 수 있다.
'보안기사 > 필기' 카테고리의 다른 글
기사 자격증(알기사, TCP/IP) (0) | 2019.01.31 |
---|---|
기사 자격증(알기사, 네트워크 개요) (0) | 2019.01.31 |
기사 자격증(알기사, 서버보안 관리) (0) | 2019.01.29 |
기사 자격증(알기사, 유닉스, 리눅스 서버 보안) (0) | 2019.01.25 |
기사 자격증(알기사, 윈도우 서버 보안) (0) | 2019.01.25 |