Exploit-db를 이용한 cve-2016-1960,cve-2017-5375 분석

2020. 5. 6. 18:191-DAY 분석

<미완성>

 

 

 

 

오늘은 친구가 추천해준 사이트인 exploit-db라는 사이트에 들어가서 firefox 취약점을 실행해보기로 했다.

위의 Search 창에다가 firefox를 치면 여러 종류의 취약점들이 나오게 되는데 우리는 체크 표시가되있는

Firefox 44.0.2-ASM.JS JIT-Spray Remote Code Execution을 해볼것이다.

 

들어가면 코드들이 좌라랅 하고 나와있다. 이 코드들은 아마도 Firefox 44.0.2버전에서 실행되는 exploit code일것이다. 

 

가장먼저 들어가면 보이는 것들은 주석들로 생성된 설명글이다! 이 설명글을 잘만 해석한다면

취약점을 파고들때 어떤 기법으로 파고드는지 분석할 수 있을것이다. 

 

역쉬  FULL ASLR AND DEP BYPASS USING ASM.JS JIT SPRAY (CVE-2017-5375) 이 구문에서 우리는 

ASM.JS, JIT SPRAY, ASLR 및 DEP 우회 방법이라는 핵심 Keyword를 얻었다.  

 

또한 코드 작성자는  Firefox 44.0.2 32 비트-Windows 10 1709을 사용했으며 

exploit 에 성공하면 cale.exe가 실행되어야 한다. 즉 이 코드를 Firefox로 열면 계산기가 열려야 한다는 것이다.

 

그 아래의 Notes 내용에는 cve-2016-2819와 매우 유사하지만 다르고 44.0.2에서는 실행되지만

46.0.1에서는 실행되지 않는다. 왜냐하면 이미 46.0.1버전에서는 이미 수정했기 때문이라 되있다.

 

자 이제 코드를 분석하기 이전에 우리가 얻은 Keyword인 ASM.JS, JIT SPRAY, ASLR 및 DEP 우회 방법을

하나하나씩 알아본 후에!! 코드를 보며 분석을 시작해보도록 하겠다. 필자도 지금 글을 적으면서 공부중이라

정확한 내용이 없고 주관적인 의견이 포함되어 있으므로 너무 맹목적으로 이글을 믿으면 상당히 곤란하다 :)

 

ASM.JS

ASM.JS는 Firefox 팀에서 발한 자바스크립트의 subset(부분집합)이다. 주로 C나 C++같은 언어의 컴파일러 타겟으로 사용되며 보다 쉽게 최적하 되도록 하는것을 목표로 정의되었다. 이 기술은 새로운 언어가 아니고 기존 모든 브라우저에서 실행 가능하다. ASM.JS 를 지원하지 않는 JavaScript 엔진도 ASM.JS코드를 실행시킬 수 있다. 변수 타입을 엄격하게 체크하는 문법을 정의하며 그 결과로 JIT(실행시간 컴파일)과 AOT(실행 전 컴파일)이 가능해진다.

 뭔가 이 이상의 자료를 더 찾아보고 싶었지만 자료찾는게 너무 안나오는 느낌이다...

 

JIT-SPRAY 는 JIT과 SPRAY가 다른것같아서 둘다 쳐보았는데 JIT은 나오지만 SPRAY는 안나와 분명 같이 합친 단어라 생각하고 JIT-SPARY를 검색하였다.(킹리적 갓심)

일단 CVE-2017-5375 의 내용이 JIT 코드 할당은 ASLR 및 DEP 보호를 우회하여 잠재적인 메모리 손상공격을 유발할 수 있다. 만약 공격자가 다음 명령에 실행될 명령어를 가로챈다면 JIT-SPRAY 쉘코드로 점프하기만 하면 되서 UAF와 같은 메모리 손상 버그를 쉽게 이용할 수 있다. (여기서 UAF"use after free"는 말그대로 사용하고 해제할때 일어날 수 있는 취약점인데 메모리 영역을 자유롭게 한 후 재사용하게 될 경우를 뜻한다. 나중에 자세히 따로 알아보아서 글로 올려보도록 하겠다.) 이러한 JIT-SPRAY는 JavaScript와 같은 고급 프로그래밍 언어 안의 상수에다가 머신 코드를 숨길 수 있고 이것은 DEP를 무시한다. 또한 공격자는 JIT 컴파일러를 사용하여 예측 가능한 많은 실행코드 영역으로 상수를 내보낼 수 있는데 이는 ASLR을 우회할 수 있게된다. 

 

ASLR(Address Space Layout Rabdimization)은 메모리에 취약점을 파고들때 메모리상의 공격을 막기위해 프로세스의

가상 주소공간에 힙, 스택, 라이브러리 등이 실행할때마다 데이터의 주소가 바뀌는 메모리 보호 기법이라고 할 수 있다.

주소는 완전히 랜덤은 아니며 순서와 패턴은 어느정도 유지된다. 즉 Return Address에 만약 0xaaaaaa11을 넣었는데 

ASLR이 적용된 프로그램이면 exploit 실행시 쉘코드가 0xaaaaaa11에 있는것이 아니라 0xaaaaab75 이런 곳에 있는것이다. 이것은 프로그램을 실행하면 계속 주소가 바뀌게 됨으로 exploit을 하는데 지장이 생긴다.

 

이러한 ASLR의 우회 방법은 BruteForce, Non ASLR Module, Info Leak 등이 있다.

BrureForce 방법은 한마디로 고정된 주소값이 나올때 까지 대입하는것인데 메모리가 완전히 랜덤화 되는것은

아니므로 규칙을 파악하여 여러번 시도하여 리턴 주소를 덮어쓰기도함. 

하지만 공격으로 인해 crash가 발생하여 종료되면 사용 불가!

 

None ASLR Module은 ASLR을 격파하는데 가장 쉽고 많이쓰는 방법인데, 한 프로그램 안에서도 ASLR이 안걸린

모듈을 찾아 공략한다. 

따라서 Immunity Debugger의 모나를 이용하여 파일에 ASLR이 적용되지 않은 DLL을 확인할 수 있다.

ASLR이 적용되어 있지 않은 모듈이 단 하나라도 존재하면 DEP를 비롯한 방어 기법들이 무력화될 가능성이 높다.

 

Info Leak은 스택의 메모리를 읽어보는 버그를 이용해 랜던화된 메모리 주소를 읽어서 사용하는 것으로 말 그대로

정보를 유출한다는 뜻이다. 이 기법은 "공격에 필요한 정보 획득 --> ROP 체인 구성 " 이러한 형식으로 되있다.

 

DEP(Data Execution Prevention)은 메모리영역에서 코드가 실행되는 것을 막는 메모리 보호 기법으로 예를들면

Bof 공격을 한다면 공격자가 입력한 쉘코드가 실행되어야 하는데 이러한 공격을 방어하기 위해 메모리영역 상에

로드된 쉘코드가 실행되지 않도록 하는것이 DEP이다. 또한 DEP는 메모리를 부적절하게 사용하는 프로그램을

감지하면 해당 프로그램을 닫고 사용자에게 알려준다. 

 

즉  메모리영역을 공격자가 Overflow해서 공격하더라도 실행이 안되어 공격을 방어할 수 있는것이다.

DEP를 우회하기 위해서는 BOF 공격은 RTL로 우회가능하지만 위에 ASLR까지 적용되어 있다면 ROP를 사용하여

우회할 수 있다.

 

먼저 RTL(Return To Libray)기법이란 말 그대로 라이브러리로 돌아가라는 의미이다.  

BOF 나 FSB는 Eggshell이나 직접 만든 쉘코드를 이용하여 root 권한을 취득했는데

RTL은 쉘 코드 없이 쉘을 실행할 수 있다. 따라서 NX bit를 우회할때 쓰게되는데

<NX bit 란 공격자가 메모리영역에서 공격코드를 실행하지 못하게 한다. DEP라고 보면됨>

그 방법은 표준 라이브러리에 있는 system() 함수에 "/bin/bash/"를 넣으면 된다.

 

자세한 내용은 다음에 RTL 예제를 직접 실습하면서 정리해놓겠다.

 

ROP는 한마디로 DEP, ASLR이 동시에 적용된 메모리보호 기법을 우회하기 위한 것으로

현재 우리가 보고있는 exploit의 핵심 개념이 될 것이다.(사실 아직 분석안해봄)

 

ROP(Return Oriented Programming)은 주로 프로그램을 조종할 수 있는 취약점을 발견했지만 메모리 영역에서

실행할 수 있는 확실한 방법이 없을때 시도해야 하는것으로 ROP기법은 2가지 stage로 나뉜다

 

Stage 1 은 실행하고 싶은 함수의 주소를 계산하는 과정

Stage 0 은 계산된 주소를 직접 사용하여 공격에 적용하는 과정

 

ex) Stage  1에서 ASLR이 걸려있다면? Libc Base Address를 구하고 호출할 함수들의 Offset 을 이용, 주소를 구함

     Stage 0 에서 구한 내용을 토대로 Exploit 진행

이거 역시 자세하게 ROP하나의 주제로 포스팅을 진행해보겠다.

 

#코드 해석

 

 

이 버전의 파이어폭스 취약점은 ROP 기법으로 EXPLOIT 한것을 알 수 있다.

'1-DAY 분석' 카테고리의 다른 글

CVE-2017-15048 Buffer-Overflow  (0) 2020.05.18
cve-2016-0189 exploit 시도..  (4) 2020.05.06