개요
컴퓨터 시스템은 하드웨어, 운영체제, 프로세스로 이루어져 있다. 각각의 구성요소는 인터페이스를 통해 서로 정보를 주고받으면서 유기적으로 동작한다. 컴퓨터 시스템은 다양한 기능을 제공하기 위해 복잡한 구조를 가지고 있으며, 이런 특징은 자연스럽게 내부에 취약점을 가지게 된다. 시스템이 진화하면서 많은 취약점들이 보완됐지만, 해커들은 새로운 공격 루트를 계속 개발하고 있다. 시스템 해킹은 이러한 구조적⦁기능적 취약점을 이용해 정보를 추출하고, 의도하지 않은 기능을 유발하는 해킹 기술이다. 시스템 해킹을 이해하기 위해서는 먼저 컴퓨터 아키텍처와 운영체제에 대한 이해가 선행돼야 한다.
Rootkit
Rootkit은 루트권한 획득 기능, 시스템 제어를 위한 백도어 기능, 백신 프로그램에 발각되지 않기 위한 위장 기능을 가지고 있는 해킹 프로그램이다. Rootkit은 유저모드, 커널모드, 부팅모드 3가지 종류가 존재한다. 유저모드는 어플리케이션 수준에서 동작한다. 상대적으로 검출이 쉬우며, 시스템에 대한 영향도가 낮다. 커널모드는 커널에 별도의 코드를 추가하거나, 기존 코드를 대체하는 방식으로 동작한다. 개발이 어려운 단점이 있지만, 시스템에 치명적인 영향을 미칠 수 있다. 부팅모드는 MBR(Master Boot Record), VBR(Volume Boot Record), Boot Sector에 영향을 미친다. 파일시스템 전체를 암호화 한다든가, 시스템을 부팅 불가능 상태로 만들 수 있는 강력한 기능을 가지고 있다.
Backdoor
Backdoor는 사용자 PC를 원격에서 제어할 수 있는 프로그램을 말한다. 해커는 Backdoor 클라이언트 기능을 하는 악성 코드를 인터넷 게시판, 이메일, 토렌트 등을 통해 배포한다. 사용자가 무의식중에 악성 코드를 PC에 다운로드하면, Backdoor 클라이언트가 설치된다. 해커는 Backdoor 서버를 가동해 클라이언트의 접속을 기다린다. Backdoor 클라이언트는 설치와 동시에 서버에 접속하고, 이때부터 해커는 사용자 PC를 원격에서 제어할 수 있게 된다.
Registry Attack
Windows에서 사용하고 있는 레지스트리는 일종의 데이터베이스다. Windows는 하드웨어 정보, 소프트웨어 정보, 사용자 정보 그리고 동작 제어에 필요한 다양한 정보들을 [Key, Value] 형태로 레지스트리에 저장하고 있다. Windows는 레지스트리 제어를 위해 CRUD(Create Read Update Delete)에 관련된 모든 기능을 인터페이스를 통해 지원한다. 시스템에 침투한 해커는 인터페이스를 통해 레지스트리를 조작할 수 있으며, 사용자 비밀번호 초기화, 방화벽 설정 변경, DLL Injection과 같은 다양한 공격을 시도할 수 있다. 레지스트리에는 사용자의 인터넷 사용 정보가 보관되어 있는데, 이것을 통해 사용자의 생활 패턴 추출도 가능하다.
Buffer Overflow
Buffer Overflow 공격은 프로세스에 비정상적인 데이터를 입력을 통해서 메모리에 해커가 의도하는 데이터를 저장하고 실행될 수 있도록 만드는 공격이다. 프로세스가 사용하는 메모리 영역인 Stack, Heap 그리고 Register에는 프로세스 처리 흐름에 알맞은 데이터가 들어가 있다. 이 데이터를 변경하게 되면 프로세스의 처리 순가가 바뀌거나 동작을 멈추게 된다. 해커는 입력 값을 변경해 가면서 어떤 데이터가 오류를 발생시키는지, 입력 값의 어느 부분에 Shell Code를 심으면 실행할 수 있는지 관찰하면서 공격 코드를 완성해 간다.
Buffer Overflow 공격 코드는 독립적으로 동작하는 프로그램이 아니라, 동영상/음악/문서파일과 같이 프로그램으로 실행되는 일종의 파일이다. 예를 들어 동영상 플레이어에 대한 Buffer Overflow 공격을 시도한다고 가정하면, 해커는 먼저 오류 코드를 심은 동영상을 인터넷에 배포한다. 오류 동영상을 다운로드 받은 사용자가 플레이어를 통해서 파일을 여는 순간 내부에 심어진 Shell Code가 메모리를 비정상 상태로 만들면서 실행되게 된다.
Race Condition Attack
Race Condition은 두 프로세스가 하나의 자원을 사용하기 위해 서로 경쟁하는 상황이다. 예를 들어, 파일 쓰기 작업을 할 때는 먼저 File Handle이라는 자원을 얻어야 한다. 여러 프로세스가 파일 쓰기 작업을 진행한다면 바로 File Handle을 먼저 얻기 위해 서로 경쟁할 것이다. Race Condition Attack은 바로 이러한 상황에서 발생할 수 있는 보안 결함을 이용한다.
가장 많이 사용되는 방법은 사용자 계정 정보를 저장하고 있는 [/etc/passwd] 파일에 대한 Symbolic Link를 이용하는 것이다. 먼저 [root] 권한으로 사용자 입력을 받아 Temp File을 임시로 생성하고, 로직을 처리하는 프로세스를 찾아야 한다. 해커는 이 프로세스에 사용자 추가를 의미하는 값[hacker::0:0:root:/root:/bin/ksh]을 반복적으로 입력한다. 다른 한편으로는 [/etc/passwd] 파일에 대한 Symbolic Link(Temp File과 동일한 이름)를 반복적으로 생성하는 프로그램을 실행시킨다. 두 프로세스가 File Handle을 먼저 얻으려고 경쟁하는 상황에서 프로세스가 Symbolic Link에 사용자 입력을 저장하는 상황이 발생한다. 이 때 [etc/passwd] 파일에 [hacker::0:0:root:/root:/bin/ksh]이 입력되고, hacker 계정은 root권한을 얻게 된다.
Format String Attack
Format String은 printf문에서 출력 문자열의 형식을 지정하는 방식이다. 예를 들어 String을 출력하는 printf(“print String: %s”,strName) 구문에서는 %s가 문자열을 의미하는 Format String에 해당한다. Format String에 출력하는 인자(strName)가 뒤에 정상적으로 따라 온다면, 별다른 문제가 없지만 그렇지 않을 경우에는 Stack 상에 있는 값을 꺼내 출력하게 된다. 이런 원리는 이용하면, 해커는 %s %d %x 등 다양한 Format String을 입력 값으로 사용해 Stack을 조작할 수 있다. 특히 %n과 같은 Format String은 printf에 의해서 출력된 바이트 수를 정수형 포인터에 저장하는 기능을 가지고 있다. 해커가 실행을 원하는 Shell Code의 Return Address를 Stack에 입력할 수 있는 수단을 제공한다.
파이썬 해킹 입문 저자의 동의 하에 컨텐츠를 게시합니다.
'파이썬 해킹 입문 > 해킹기술' 카테고리의 다른 글
6. 기타 해킹 기술 (0) | 2019.12.14 |
---|---|
4. 네트워크 해킹 기술 (0) | 2019.12.14 |
3. 웹 해킹 기술 (0) | 2019.12.14 |
2. 어플리케이션 해킹 기술 (0) | 2019.12.14 |
1. 해킹이란 (0) | 2019.12.14 |