brunch

You can make anything
by writing

C.S.Lewis

by Younggi Seo Jun 13. 2018

New 1: Windows RCE testing

시스템 취약점을 통한 공격 루트를 확보하기 앞서 분석에 필요한 툴과 코드

윈도7에서의 애플리케이션 실행 시 SEH 버퍼오버플로 공격 유도 과정


SEH는 Structured Exception Handling의 약자로, 윈도 OS에서 제공하는 구조적 예외 처리 기법이다. SEH 버퍼 오버플로의 일반적인 절차는 스택 기반 버퍼 오버플로와 유사하다. 다만 EIP를 겹쳐 쓰는(overwrite)것이 아니라 SEH를 겹쳐 써서 해킹을 시도하는 것이다. 먼저 퍼징(Fuzzing)*이라는 프로그램의 취약성을 찾아내는 보안 테스트 기법을 통해 어느 정도 길이의 문자열을 입력했을 때 SEH를 겹쳐 쓰는지 찾아낸다. 디버거를 이용해서 'POP POP RET' 명령어(스택 오버플로의 EIP 레지스터 위치)의 주소를 찾아내서 SEH 위치에 해당 주소를 입력한다. Next SEH에 'short jmp' 명령어에 해당하는 16진수 코드를 입력하면 사용자가 입력한 쉘 코드를 실행하는 아드레날린 실행 파일이 완성된다(위의 화면은 그 파일이 실행된 이후의 디버깅 결과).


일반적인 사용자가 인터넷에서 내려받은 멀티미디어 파일을 실행시킬 때 PC에 악성 코드를 심을 수 있는 준비가 된 것이다.



이후 섹션에서 다룰 백도어, 레지스트리, 윈도 버퍼오버플로우 공격을 위한 애플리케이션 관점에서 시스템 동작을 살펴보기 전에 먼저 시스템 해킹 시 자주 사용하는 툴과 그리고 미리 구비해두면 편리한 소스 코드들 나열해보겠다. 요리를 시작하기 전에 요리 도구와 요리 재료로 쓰이는 것들을 준비해서 개념 환기부터 시작한다.


먼저 해킹을 위해 리눅스 단에서 활용도가 높은 명령어부터 살펴보자.

 $ readelf

리눅스 또는 BSD(Berkely Software Distribution, 유닉스의 오픈소소 변종) 같은 계열의 실행파일인 'ELF' 파일의 정보를 표시하는 명령어. 32bit와 64bit 모두 지원함.

$ readelf -h(eader) overflowtest


 $ strings [파일명]

파일 안에 들어있는 내용 중 표시할 수 있는 문자열을 추출해서 표시하는 명령어. 기본값은 4글자 이상 연결된 표시 가능한 문자열(시퀀스) 추출**


 $ grep

일치하는 패턴 혹은 문자열 추출하는 명령어로 strings의 결과를 파이프(|)로 연결하여 추출 가능.

$ strings overflowtest | grep 'strcpy'


 $ unzip / tar / gunzip / xz

압축 해제하는 명령어 종류.


 $ file

파일의 종류를 조사하는 명령어로 아래와 같은 유용한 기능이 있다.

1) 실행파일 여부  2) 32/64bit 여부  3) 어떤 구조로 작동하는지 여부(LSB or MSB)   4) 어떤 OS에서 작동하는지 여부


다음은 어떤 프로그램이 실행하면 그 프로세스를 감시해 특정 동작을 추적할 수 있는 툴인 트레이서(Tracer)의 종류다.

1) Strace : 시스템 콜을 추적

2) Itrace : 리눅스 프로그램이 호출하는 공유 라이브러리 함수 추적 (기본적으로 설치 안되어 있으므로, 우분투인 경우 sudo apt install irpas 명령을 통해 패키지 설치 후에 실행 가능하다.)



그다음은 바이너리(Binary) 분석을 위한 툴이다.


첫 번째, GDB(GNU Debugger)로 리눅스에 기본적으로 내장된 툴이다. CUI(Character User Interface) 기반 디버거이며 BSD 기반 OS에서도 사용하는데 ELF 형식의 실행 파일을 처리할 일이 많은 CTF 대회에서 가장 많이 사용한다.


지금부터 소개하는 바이너리 분석 툴들은 직접 설치해서 다뤄보고 연습해서 익숙해질 정도로 숙달이 되어야 하는 툴 종류들이다.


1) OllyDbg

  윈도 실행파일 PE 형식의 바이너리 분석 툴이며 32/64bit 지원 가능하나 64bit는 아직 불완전함.


2) Immunity Debugger

  파이썬의 API를 제공하고 힙(heap) 분석에 강한 디버거 툴.


3) x64 dbg

  64bit PE 파일 분석.


4) WinDbg

 사용자단(User land) 디버깅 도구이지만 커널단(Kernel land) 디버거로도 사용 가능.



다음은 프로세스 메모리 에디터 종류다.

 Cheat Engine (설치 시 이것만 선택해서 설치해야 다른 것까지 안 깔림.)


그리고 역어셈블(disasemble)이 가능한 툴의 종류들이다. 즉 사용자가 자연어에 가까운 언어이지만 알아볼 수 있는 어셈블리어에서 컴퓨터가 인식할 수 있는 기계어로 번역하는 툴이다.



 1) IDA (Interactive DisAssembler, http://hex-rays.com/products/ida/)

   Hex-Rays 사에서 제작한 고성능의 역 어셈블러 툴로 역공학 시 필수적이다. 하지만 가격이 비싼 단점이 있고 상용 버전(IDA Free)은 윈도만 지원한다. Demo 버전은 모든 OS 지원 가능하나 저장이 안 된다는 단점이 있으니  두 가지 장단점을 다 고려해서 다운로드한다. IDA는 함수명, 변수명의 변경, 코멘트 넣는 것이 중요하기 때문에 저장이 안 되면 기록물로써 가치가 떨어진다.


2) objdump

  CUI 기반 어셈블러이며 리눅스에서는 필수적.



아래는 역컴파일러(Decompiler)로 바이너리인 기계어를 소스 코드로 변환해주는 툴의 종류들이다. 소스로 변환해주는 수준은 대개 원본 소스와는 다른 결과를 보여주므로 참고하는 정도로만 활용한다.


1) Hex-Rays 디컴파일러

 C 언어 같은 사양의 유사 코드 생성 가능하며 x86, x64, ARM32 등의 아키텍처를 지원한다.


2) Retargetable 디컴파일러

 파이썬 형태의 코드로 디컴파일이 가능하며 x86, ARM의 MIPS, PIC, Power PC 지원 가능하다. 무상으로 제공하나 실행파일을 업로드해야 디컴파일 가능하므로 외부의 유출에도 문제없는, 기밀정보나 민감 정보가 포함되지 않은 것만 사용한다.


3) ILSpy

  GUI 기반의 언어로. NET 기반의 CIL(공통 중간 언어)를 C# 소소코드로 변환함(CTF 대회에서는 대부분의 . NET 바이너리 문제에 충분히 사용 가능).


4) dex2 jar / JD(자바 디컴파일러)

VM(Virtual Machine)의 바이너리 코드를 byte code의 .class 파일로 변경하거나 .class 파일을 java 소스로 변환 가능하다. JD-GUI 사용하여 독립적으로 실행하며 위 둘을 조합하면 안드로이드 실행파일 APK 파일에서 자바 소스 코드를 추출할 수 있다.


다음은 바이너리 분석의 기초가 되는 도구의 집합인 radare2(http://www.radare.org/r/)로 분석에 도움이 되는 프로그램들이다.

 1) radiff2 : 바이너리 차분 추출 (IDA Pro에서는 유료임.)

 2) rabin2 : readelf-like 정보 추출

 3) rafind2 : 바이트 패턴 검색 도구

 4) rahash2 : 해시 계산 도구

 5) rarun2 : 프로그램의 실행환경을 지정해서 실행할 수 있는 도구.

 6) rasm2 : 어셈블러 / 디스어셈블러

 7) rax2 : 변수 형태 변환 도구

 8) radare2 : 위의 도구들 종합.

  

위의 툴들은 Library로 구현되어 있어서 도구 개발이 간단하며 r2pipe라는 보조 도구 준비되어있음.***


마지막으로 Binary editor 종류들이다.

 1) iBored

   모든 OS환경에서 사용할 수 있는 GUI 형태임.

 2) B2

   윈도용 GUI임.

 3) ghex

   리눅스용 GUI임(범용적으로 사용함).

 4) 010 editor


 5) Vim +xxd

- 사용 방법(리눅스 vi 에디터의 향상된 버전)
 $ vim -b
 1. -b 옵션으로 binary 파일 로딩시킴
 2. 에디터 단에서 'ESC' 키를 눌러 명령어 모드로 진입.
 3. :%!xxd 입력해서 xxd 명령어 호출
 4. 화면 왼편은 16진수 일부, 오른편은 표시 가능 문자 표시됨.
 5. 에디터 단에서 16진수 일부를 입력함.
 6. :%!xxd -r을 다시 명령어 모드에서 입력해서 편집 내용 반영함.


지금까지 디버깅 및 바이너리 분석 시 필요한 각종 툴의 종류를 살펴봤다. 공격할 때 사용하기 위해 만든 기계어로 작성된 프로그램의 일부인 셸 코드(shellcode)는 다음 편에 게재하겠다. 사실 셸 코드를 직접 만들지 않더라도 'shellcode'라는 검색어로 다양한 셸 코드를 얻을 수 있다(우스이 토시노리, 2016).



아래 도표는 시스템 단의 침투 경로를 그린 시스템 해킹의 기본 개념이다.

시스템 해킹의 기본 개념(조성문 정영훈, 2015)


운영체제는 다양한 시스템 자원을 관리한다. 애플리케이션 관점에서 시스템 동작을 살펴보면 OS(여기서는 윈도)는 애플리케이션이 설치 또는 실행될 때 설정 정보를 '레지스트리'라고 불리는 가상적인 장치에 기록한다. 이 정보는 운영체제가 처음 시작할 때 동작을 결정하는 중요한 정보로 활용한다. 애플리케이션이 동작할 때는 하드디스크로부터 핵심적인 데이터를 메모리로 로딩하고 CPU 동작에 필요한 정보는 다시 CPU 내부에 있는 레지스터에 저장한다. 애플리케이션은 프로세스 형태로 실행되며 프로세스는 내부적으로 '스레드'로 나뉘어 동작한다. 프로세스가 사용하는 데이터는 메모리에 일정 영역을 할당받아 저장되는데, 특성에 따라 스택(Stack), 힙(Heap), 코드(Code) 영역을 분할된다(조성문, 2015).


시스템 해킹은 이렇게 애플리케이션을 실행하는 운영체제의 동작 특성을 이용하는데, 첫 번째 단계는 해킹 프로그램을 시스템 내부에 설치하는 것이다. 일반적인 경로를 통해 해킹 프로그램을 설치하기는 쉽지 않다. 가장 많이 사용하는 방법은 웹(웹쉘)이나 토렌트를 통해서 파일 내려받기를 유도하는 것이다. 한글, 동영상, 음악, 이미지 파일에 해킹 코드를 심는 것은 이후 섹션에서 실습할 SEH 버퍼 오버플로 공격을 보면 쉽게 이해할 수 있다. 애플리케이션의 코드 취약성을 찾아내서 의도하지 않은 메모리 영역을 강제적으로 실행하도록 프로그램을 만들어 배포하면, 백도어나 레지스트리 검색 프로그램을 쉽게 설치할 수 있다(조성문, 2015).


설치된 해킹 코드는 사용자의 동작 정보를 그대로 해커로부터 전송하는 백도어(뒷문)를 통해 잠입하여 동작할 수 있고 레지스트리 주요 정보를 검색하거나 값을 강제로 변경해서 시스템에 문제를 초래할 수도 있다. 심지어 사용자의 금융 정보를 유출하는 수단으로 사용될 수도 있다(조성문, 2015).


이미 알려진 대부분의 공격은 시스템 패치나 백신 프로그램으로 차단되지만, 새로운 유형의 공격을 차단하려면 어느 정도 시간이 필요하다. 시스템 해킹 기술은 계속 진화하고 있으며 백신과 운영체제의 방어 기술도 동시에 발전하고 있다.


하지만, 방패보다는 창이 항상 한 발 앞서 가고 있기 때문에 아직도 다양한 해킹 공격이 인터넷에서 성행하고 있다.





* Fuzzing: 파일 형식, 환경 변수, 메모리, 웹 서비스, 네트워크 프로토콜 등 다양한 대상에 대해 테스트가 가능하다. 오류값, 비정상적인 값 그리고 무작위값을 상황에 맞게 선택해서 입력하면서 결과를 관찰한다. 비정상적인 결과가 나오면 원인을 분석해서 취약성을 찾아가게 된다. 특히, 새로운 섹션들에서 다룰 메모리 퍼징은 프로그램이 입력으로 받아들이는 인자나 파일이 없을 때는 메모리 값을 직접 변경하면서 취약성을 찾아낸다. 메모리 퍼징은 특정 함수에 대해 중단점을 설정해놓고 메모리 값을 반복적으로 변경해 가면서 동작을 관찰하는 것(이미 맛보았다)이다. 다른 기법에 비해서 적용할 수 있는 범위가 협소하지만, 오류에 대한 정밀한 분석이 가능하다는 장단점이 있다(조성문, 2015).


** CTF에서는 FLAG 분석에 도움될만한 문자열 검색을 목적으로 쓰임.


*** radare2는 CTF 바이너리 분석에 매우 도움이 됨(우스이 토시노리, 2016).




참조

1) 우스이 토시노리 외 7인. 양현 역. (2016). CTF 정보보안 콘테스트 챌린저 북: Capture The Flag 문제 풀이로 배우는 해킹 테크닉, 서울: 위키북스.   

2) 조성문, 정영훈 (2014). 파이썬 해킹 입문: 공격의 언어 파이썬을 이용한 해킹 연습, 서울: 프리렉.








매거진의 이전글 새로운 루트 확보에 앞서 기본기
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari