agencies

해킹 기초 지식 본문

Ⅲ. 정보보안

해킹 기초 지식

agencies 2024. 2. 11. 16:28

해킹 기술

 

시스템 해킹은 커널을 중심으로 이루어진다.

커널이 관리하는 메모리 레지스터 등의 영역을 침입해서 데이터를 빼내거나 루트 권한을 획득한다.

 

애플리케이션 해킹은 사용자가 실행하는 프로그램을 중심으로 해킹이 이루어진다.

애플리케이션에 악성 코드가 담긴 DLL을 주입하거나 디버깅을 통해 키보드 입력을 가로챌 수 있다.

 

웹 해킹은 인터넷 브라우저와 웹 서버의 구조적 취약점을 이용한다.

현재 가장 많이 활용되고 있는 해킹 분야다.

 

네트워크 해킹은 인터넷을 기반으로 이루어진다. 가장 강력한 DoS 공격부터 네트워크 패킷을 엿보는 스푸핑 등이 여기에 속한다.

 

 

메시지 후킹

메시지 후킹은 user32.dll의 SetWindowsHookExA() 매서드를 이용한다.

윈도우는 키보드 마우스 등에서부터 들어오는 메시지를 훅 체인(hook chain)을 통해 처리한다.

훅 체인은 메시지를 처리하는 일련의 함수 포인터를 모아놓은 리스트이다.

훅 체인 상에 강제적으로 프로그래머가 원하는 처리 프로세스에 대한 포인터를 등록하면 메시지가 들어올 때 원하는 작업을 할 수 있다. 대표적인 해킹 기법인 키 로거(key logger)가 이 방식을 이용한다.

키보드 입력 메시지를 중간에 가로채 해커에게 전송하는 것이다.

 

 

API 후킹

API 후킹은 운영체제에서 제공하는 디버깅 프로세스를 이용한다. 먼저 디버거를 이용해서 애플리케이션 특정 명령어에 중단점(breakpoint)을 설정하고 특정 메서드를 수행하도록 등록한다.

애플리케이션은 작업을 수행하다가 중단점을 만나면 등록된 메서드를 실행한다. 이 메서드를 콜백 메서드라고 하는데 여기에 해킹 코드를 심어 놓으면 해커가 원하는 동작을 수행할 수 있다.

예를 들면 메모장(notepad) 프로세스의 writefile()메서드에 중단점을 설정했다면 저장 메뉴를 클릭하는 시점에 콜백 메서드가 호출된다. 여기에 특정 문자를 해커가 원하는 문자로 바꾸는 코드를 삽입하면 사용자가 의도하지 않은 문자가 파일에 저장된다.

 

 

DLL 인젝션

DLL 인젝션은 동적으로 사용할 수 있는 라이브러리인 DLL을 애플리케이션에 삽입하는 기술이다.

모두 3가지 방법이 있는데
1. 레지스트리를 사용하는 것이다. 먼저 레지스트리의 특정 위치에 원하는 DLL 이름을 입력해 놓는다. user32.dll을 호출하는 애플리케이션의 경우 해당 위치에 입력된 DLL을 메모리에 로딩한다.
2. 후킹 함수를 사용하는 것이다. 즉 특정 이벤트가 발생했을 때 DLL을 로딩하는 후킹 함수로 등록하는 것이다.

3. 실행 중인 애플리케이션에 원격 스레드를 생성해서 DLL을 삽입하는 것이다.

 

 

코드 인젝션

스레드를 활용한 DLL 인젝션 기법과 유사하다.

차이점은 여기서는 DLL 대신 직접 실행 가능한 셸 코드(shell code)를 삽입한다는 것이다.

코드 인젝션의 장점은 DLL을 미리 시스템 특정 위치에 저장할 필요가 없고 속도가 빠르며 노출이 쉽지 않다는 점이다.

하지만 셸 코드의 특성상 복잡한 해킹 코드를 삽입할 수 없다는 단점 또한 존재한다.


 

웹 해킹 개요

컴퓨터 시스템은 본질적으로 해킹에 취약하다. 컴퓨터가 처음 만들어졌을때는 보안보다는 기능성에 초점을 두었다.

단일 시스템으로 몇십 년 동안 운영되다가 인터넷이 발달하면서 시스템이 사용자 다수에게 노출되게 되었다.

이때부터 해커가 시스템을 인지하고 공격하기 시작한 것이다. 컴퓨터가 제공하는 다양한 기능은 사용자에게 편의성을 제공하는 반면에 해커에게는 공격을 위한 수단을 제공한다.

 

웹은 기본적으로 인터넷 브라우저 웹 서버 데이터베이스 이렇게 3개의 요소로 구성된다.

각 구성 요소별로 역할이 명확히 분리되어 있다. 인터넷 브라우저는 사용자의 입력을 처리하고 웹 서버로부터 받은 데이터를 가공해 화면을 구성한다. 

웹 서버는 HTTP 요청을 분석해 정해진 기능을 수행한다. 데이터 처리가 필요한 경우 데이터베이스를 연결해 관련 작업을 수행한다. 데이터베이스는 데이터를 안전하게 관리하면서 자료 입력과 조회 기능을 지원한다.

 

해커는 웹이 지원하는 기능을 악용한다. 파일 업로드 기능을 이용해서 웹 셸 파일과 악성 코드를 업로드한다.

업로드한 파일의 위치를 알아내 웹 셸 파일을 실행하면 해커는 웹 서버를 장악할 수 있다.

사용자 입력 기능을 이용하면 SQL 인젝션 공격을 할 수 있다.

비정상적인 SQL 쿼리문을 입력해 얻을 수 있는 웹 서버의 오류 메시지를 분석하면서 공격한다.

파일 내려받기 기능을 이용해 악성 코드를 인터넷상의 불특정 다수 PC에 배포할 수도 있다.

브라우저에서 실행되는 HTML과 스크립트 코드는 XSS 공격과 CSS 공격 수단으로 악용된다.

 

거의 모든 기업에서 방화벽 IPS IDS와 같은 다양한 보안 장비를 도입해 해킹을 차단하고 있다.

하지만 웹 서비스를 지원하기 위해 몇 개의 포트는 어쩔 수 없이 인터넷에 노출해야만 한다. 

이를 보완하기 위해 웹 방화벽과 같은 장비가 등장하고 있지만 웹은 해커들에게 가장 매력적인 공격 대상이 되고 있다.

 

 

 

XSS

게시판 게시물에 악성 코드를 포함하는 스크립트를 심어놓고 게시물을 읽은 사용자 PC에서 개인정보를 추출하는 해킹 기법이다. 악성 코드는 대부분 스크립트 코드이며 쿠키를 읽어서 특정 URL로 전송하는 기능을 수행한다.

게시물을 읽은 사용자는 자기도 모르는 사이 개인정보가 유출된다. 현재는 브라우저 보안 강화와 웹 방화벽과 같은 장비 발달 덕분에 공격 빈도가 많이 줄어들고 있다.

 

 

CSRF
게시판에 악성 코드를 삽입하고 사용자가 해당 게시물을 읽었을 때 공격이 수행된다는 점에서 XSS와 유사하다. 차이점은 XSS는 사용자 PC에서 개인정보를 유출하지만 CSRF는 사용자 PC를 통해 웹 서버를 공격한다는 점이다. 해킹 유형은 웹 서버에 대한 무력화 시도일 수도 있고 정보 유출을 위한 공격일 수도 있다.

 

 

웹 셸

웹 셸(web shell)은 웹에서 제공하는 파일 업로드 기능을 악용한다. 먼저 서버를 원격에서 조정할 수 있는 파일을 웹 서버를 통해 업로드한다. 해커는 업로드한 파일 위치를 파악하고 접근 가능한 URL을 찾아낸다.

해커는 이 URL을 통해 웹 셸 파일을 실행해서 운영체제를 통제할 수 있는 강력한 권한을 획득할 수 있다.

웹 셸은 최근 웹 해킹에서 SQL 인젝션과 더불어 가장 강력한 기법으로 활용되고 있다.

 

 

레지스트리 공격
윈도우에서 사용하는 레지스트리는 일종의 데이터베이스이다.

윈도우는 하드웨어 정보 소프트웨어 정보 사용자 정보 그리고 동작 제어에 필요한 다양한 정보들을 키(key) 값(value) 형태로 레지스트리에 저장하고 있다. 윈도우는 레지스트리 제어를 위해 CRUD에 관련된 모든 기능을 인터페이스를 통해 지원한다. 시스템에 침투한 해커는 인터페이스를 통해 레지스트리를 조작할 수 있으며, 사용자 비밀번호 초기화 방화벽 설정 변경 DLL 인젝션과 같은 다양한 공격을 시도할 수 있다.

레지스트리에는 사용자의 인터넷 사용 정보가 보관되어 있는데 이것을 통해 사용자의 생활 방식 추출도 가능하다.

 

 

경합 조건 공격
경합 조건(race condition)은 두 프로세스가 하나의 자원을 사용하기 위해 서로 경쟁하는 상황이다 예를 들어 파일 쓰기 작업을 할 때는 먼저 파일 핸들(file handle)이라는 자원을 얻어야 한다. 여러 프로세스가 파일 쓰기 작업을 진행한다면 바로 파일 핸들을 먼저 얻으려고 서로 경쟁할 것이다. 경합 조건 공격은 바로 이러한 상황에서 발생할 수 있는 보안 결함을 이용한다.

가장 많이 사용되는 방법은 사용자 계정 정보를 저장한 /etc/passwd 파일에 대한 심볼릭 링크(symbolic link)를 이용하는 것이다. 먼저 Root 권한으로 사용자 입력을 받아 임시 파일을 생성하고 로직을 처리하는 프로세스를 찾아야 한다.

해커는 이 프로세스에 사용자 추가를 의미하는 값을 반복적으로 입력한다. 다른 한편으로는 /etc/passwd 파일에 대한 심볼릭 링크(임시 파일과 같은 이름)을 반복적으로 생성하는 프로그램을 실행시킨다.

 

두 프로세스가 파일 핸들을 먼저 얻으려고 경쟁하는 상황에서 프로세스가 심볼릭 링크에 사용자 입력을 저장하는 상황이 발생한다. 

 

 

 

형식 문자열 공격

형식 문자열(format string)은 printf 문에서 출력 문자열의 형식을 지정하는 방식이다.

예를 들어 문자열을 출력하는 구문에서는 %s가 문자열을 의미하는 형식 문자열에 해당한다.

형식 문자열에 출력하는 인자가 뒤에 정상적으로 따라온다면 별다른 문제가 없지만 그렇지 않을 때에는 스택에 있는 값을 꺼내 출력하게 된다. 이런 원리를 이용하면 해커는 %s %d %x 등 다양한 형식 문자열을 입력 값으로 사용해 스택을 조작할 수 있다. 특히 %n과 같은 형식 문자열은 printf()에 의해서 출력된 바이트 수를 정수형 포인터에 저장하는 기능을 가지고 있다. 따라서 해커가 실행을 원하는 셸 코드의 반환 주소(return address)를 스택에 입력할 수 있는 수단을 제공한다.

 


 

OSI 7계층

OSI 7계층 모형은 모든 네트워크 통신에서 생기는 문제를 완화하기 위해 국제 표준화 기구 ISO에서 개발한 모델이다.

모든 네트워크 장비들이 OSI 7계층을 따라 역할을 정확히 구분하여 제조되지는 않는다. 하지만 OSI 7계층은 학술 연구나 네트워크 동작에 대한 이해를 위해 꼭 필요한 개념을 제공한다.

1계층부터 7계층까지 계층별로 역할이 구분되어 있고 상위 계층에서 하위 계층으로 내려올 때 헤더(header)와 테일(tail)이 붙여진다. 하위 계층에서 상위 계층으로 올라갈 때는 반대로 테일과 헤더가 차례로 제거된다.

헤더와 테일에는 계층별로 필요한 메타 정보들이 각각 들어가게 된다. 이 정보들이 합쳐져서 프로토콜이 구성된다.

 

 

응용계층

컴퓨터를 조작하는 사람이나 정보를 전송하는 프로그램 등에 서비스를 제공한다.

 

표현계층

애플리케이션 계층에서 온 데이터를 네트워크에 전송할 수 있는 형태로 변경하거나 세션 계층에서 올라온 데이터를 사용자가 이해할 수 있는 형태로 변경한다.

(JPEG, MEPG 등)

 

세션계층

데이터를 보내고 받는 두 프로세스 사이에 가상의 통신 경로를 확보한다.

 

전송계층

신뢰성 있는 단대단 데이터 전송을 보장하고 패킷 처리를 어느 프로그램이 담당해야 하는지 결정하는 포트 번호를 지정한다. 오류제어 흐름제어 중복 검사 기능을 제공한다 (예: TCP, FTP 등)

 

네트워크계층

두 시스템이 통신하기 위한 최적의 경로를 선택한다. 라우터가 동작하는 계층으로 오류 제어 흐름 제어 기능을 제공한다.

대표적으로 IP 주소를 통해 인식할 수 있다. (예: IP, IGMP, ICMP, x.25)

 

데이터연결계층

두 시스템 간의 물리적인 통신을 위한 통신 경로를 확립하고 오류 제어와 흐름 제어 기능을 제공한다. 대표적으로 MAC 주소를 통해 인식할 수 있다. (예: ethernet, hdlc, adccp, 브리지, 스위치)

 

물리계층

전송 매체를 통한 비트 단위의 데이터 전송을 위한 전기적 물리적인 세부 사항을 정의한다.

전압 전선 등의 구체적인 스펙을 결정한다. (예:허브, 리피터)

 

OSI 7계층 모형은 네트워크 통신 기능을 계층별로 나눔으로써 계층별 기능 변경에 따른 영향을 최소화할 수 있다. 그리고 계층별 장비를 별도로 개발할 수 있어 기술 발전 속도를 가속화할 수 있는 기반을 제공한다.

 

 

 

라우팅

인터넷을 쉽게 이해하는 하나의 방법은 수천만 대의 컴퓨터가 수십만 대의 라우터에 의해 연결 되어 있다고 생각하는 것이다. 라우팅은 어떤 라우터를 거쳐 가면 가장 빨리 목적지에 도달할지 결정하는 것이다. 각각의 라우터는 이웃 라우터와 정보를 교환하면서 최적의 라우팅 정보를 유지하고 있다. 라우팅 경로를 설정하고 정보를 유지하기 위해 사용되는 것이 바로 라우팅 프로토콜이다.

 

사용자 PC에서 웹 서비스를 호출하면 가장 먼저 DNS를 이용해서 IP를 찾는다. 이제 목적지에 어떤 길로 가면 좋을지 결정해야 한다. 출발지는 내가 연결된 로컬 라우터이다. 로컬 라우터는 자신이 가진 라우팅 테이블을 뒤져서 해당 목적지 라우터가 어디에 있는지 알아낸다. 만일 정보를 찾지 못하면 이웃 라우터에 물어본다. 이렇게 반복적으로 물어보면서 최적의 경로를 찾아 목적지로 패킷을 보내게 된다.

 

'Ⅲ. 정보보안' 카테고리의 다른 글

파이썬 프로그래밍 열린 포트 확인  (0) 2024.02.12
2013년 OWASP Top 10  (0) 2024.02.12
HTML 속성  (0) 2024.02.11
HTML 이미지 맵으로 포스트 만들기  (0) 2024.02.11
HTML 인코딩 표(특수기호)  (0) 2024.02.11