- Previous : 공다팩(Gondad EK) 분석 #01
- Previous : 공다팩(Gondad EK) 분석 #02
- Previous : 공다팩(Gondad EK) 분석 #03
1. Introduction
이번 포스팅에서는 난독화 해제 방법론과 각각의 분석팀에서 공다팩 해제 방법을 다룬다.
1.1. 난독화 해제 방법론
- 소스코드 수정을 이용한 난독화 해제
- 도구를 이용한 난독화 해제
- 브라우저의 개발자 도구를 이용한 난독화 해제
- 기타 방법론
1.2. 공다팩 해제 방법
- Kahu Security에서 공다팩 해제하는 방법
- Bolaven에서 공다팩 해제하는 방법
- 필자가 공다팩 해제하는 방법
2. Deobfuscation Method
2.1. Deobfuscating by modifying the source code
소스 코드 수정 방법을 이용한 자바스크립트 난독화 해제 방법은 초기 난독화 해제를 하기 위해 사용되었던 방법론이다. 소프트웨어 테스팅 방법론에서 화이트 박스 테스팅(White Box Testing)부터 시작하여 알고리즘을 분석한 후 변이 테스팅(Mutation Testing)을 이용하여 추가 분석을 진행 할 수 있다. 여기서 진행하는 변이 테스트는 난독화를 해제하기 위해 삽입한 소스 코드를 브라우저로 실행하여 분석가가 난독화 해제 된 소스 코드를 볼 수 있도록 수정하기 위함이다.
브라우저를 사용하는 이유는 자바스크립트를 해석하기 위해서는 자바스크립트 엔진을 거쳐야 하는데, 이 자바스크립트 엔진을 쉽게 이용할 수 있는 프로그램이기 때문이다. 소스 코드를 수정하고, 브라우저로 실행을 하면 자바스크립트 엔진이 난독화 된 소스 코드를 해제하고 레이아웃 엔진에 전달하고, 레이아웃 엔진은 다시 코드를 읽고 실행하여 사용자에게 콘텐츠를 제공하게 된다. 다시 말하면, 자바스크립트 엔진이 난독화된 소스 코드를 읽고 실행하는 과정에서 출력해 주는 코드를 삽입했다면, 분석가는 해제된 난독화를 볼 수 있게 되는 원리이다.
앞서 포스팅 한 공다팩(Gondad EK) 분석 #03 에서 화이트 박스 테스팅을 통한 분석을 진행하여 알고리즘을 파악했으니, 이 블로그에서는 소스 코드 수정 방법을 이용한 자바스크립트 난독화 해제 방법을 통해 공다팩을 해제한다.
2.2. Deobfuscating by tools
난독화 해제를 하기 위한 다양한 도구들이 존재한다. 그 중에 가장 잘 알려진 도구는 말질라(Malzilla)로 2007년부터 제작되었다. 드라이브-바이 다운로드 공격이 2005~2006년 쯤 부터 발생되었으니 도구 제작이 빠른편에 속한다고 볼 수 있다.
말질라의 장점은 단순한 인터페이스에 일부분 자바스크립트 엔진을 구성하여 단순한 형태의 난독화는 실행하여 난독화 해제 된 결과를 보여준다. 그 외에 난독화들을 분석하는데 있어 패턴으로 분류하고 치환하는 형태를 가지고 있어 간단한 난독화를 분석하기에 적합한 도구이다.
단점은 순수한(?) 자바스크립트 구문만 분석할 수 있다. 만약 자바스크립트가 HTML DOM 구조체를 활용하여 난독화가 되어 있다면 분석을 할 수가 없게 된다. 또한 복잡한 형태를 해제할 수 없는 이유로는 말질라가 구현한 자바스크립트 엔진에서 지원하지 않는 자바스크립트 함수들에 대해서는 분석을 진행할 수 없기 때문이다. 말질라는 2008년 이후 부터 업데이트가 중단되었으니, 현재 사용되는 다양한 자바스크립트 내장 함수들을 지원하지 않을 확률이 높다.
말질라가 사용하는 자바스크립트 엔진은 Spider monkey로 넷스케이프 커뮤니케이션의 Brendan Eich가 만든 최초의 자바스크립트 엔진이다. 이 엔진은 모질라 파이어폭스에서 게코(Gecko) 레이아웃 엔진과 함께 사용되었다.
말질라 운영 화면
- 말질라 소개 페이지 : http://malzilla.sourceforge.net/
다른 난독화 해제 도구로는 JSDetox가 있다. 루비 언어로 작성된 오픈소스 도구로 리눅스 플랫폼에서 설치하여 웹 어플리케이션 형태로 운영할 수 있다. JSDetox는 패턴으로 분류하고 분석하는 말질라와 다르게 디버거로써의 기능으로 분류하는 편이 정확하다. 프로그래밍을 하다가 컴파일하고 실행하려 할 때 에러 메시지를 보여주듯 난독화 해제하기 위해 실행하는 과정에서 발생하는 문제들을 알려주고, 그 문제를 수정하여 실행하는 형태로 난독화를 해제한다.
JSDetox의 장점은 큰 규모의 난독화를 해제하기 적합하다. JSDetox의 모든 해제 과정은 구글이 만든 V8 자바스크립트 엔진과 개발자가 별도로 제작한 HTML DOM 에뮬레이터를 사용하기에, 난독화를 실행하고 에러를 처리하여 다시 실행하는 형태로 해제하여 원하는 코드를 볼 수 있게 된다. 또한 또한 지속적인 업데이트를 지원하여 새로운 공격 방법들에 대한 대응도 갖추어 가고 있다.
다만 JSDetox의 단점은 기본적인 자바스크립트 구문에 대한 이해와 에러 구문에 대한 이해가 낮다면 이 도구를 사용한 해제 방법이 까다롭게 느껴질 수 있다.
영상 1. JSDetox를 이용한 공다팩 난독화 해제 영상
- JSDetox를 이용한 CK VIP 해제 과정 : http://hidka.tistory.com/entry/CK-VIP-Deofuscation
- JSDetox 소개 페이지 : http://www.relentless-coding.com/home
그 외에도 Exploit Kit 분석과 수집, 그리고 독특한 자바스크립트 해제 방법을 제공하는 Kahu Security에서 제작한 Revelo가 있으며, 웹 서비스를 중단했지만 로컬에서 환경을 구축하여 사용할 수 있는 jsunpack-n이 있다. 조금 더 설명하면 Revelo는 실제 공격중인 웹 사이트를 대상으로 실시간 분석을 하기에 좋은 도구이기에 테스트 환경을 구축하여 이용하는 것이 좋다.(다만 이 도구를 백신이 악성으로 판단하는 경우가 많다.) jsunpack-n의 경우 간단한 웹 크롤러 기능을 제공하기에 소스 코드 및 파일을 수집하고 저장한 후에 분석을 진행할 수 있다.
2.3. Deobfuscating by developer tools in browsers
브라우저가 제공하는 개발자 도구는 웹 개발자들이 웹 언어로 제작한 소스 코드를 랜더링 하여 자신이 만든 코드를 분석하고 문제를 해결하도록 도와준다. 이 도구는 브라우저에서 F12키를 눌러 개발자 도구를 사용할 수 있다.
자바스크립트 난독화 분석가가 살펴 봐야 할 부분은 자바스크립트 엔진과 실시간 대화(인터프리터) 할 수 있는 자바스크립트 콘솔(Console) 모드와 웹 언어를 중단점(Break Point)를 사용하여 단계별(Step by Step)으로 분석할 수 있는 소스(Source) 모드이다. 이 두 가지 모드를 이용하여 분석을 아주 섬세하게 진행할 수 있다.
구글 크롬의 개발자 도구의 자바스크립트 Console 화면
2.4. 기타 방법론
실제로 다뤄보거나 구현해본 방법들은 아니지만 사용하는 방법들이다.
- 자바스크립트 엔진을 직접 구현
- 자바스크립트 엔진 역할을 하는 모듈을 후킹하여 난독화를 해제 하는 방법
- 자바스크립트 엔진 또는 웹 킷을 포함하여 운영되는 자바스크립트 API 활용
자바스크립트 엔진을 직접 구현하여 프로그래밍을 이용한 난독화 해제를 간단하게 예를 들 수 있는 웹 응용 프로그램이 있다. 이 도구는 드라이브-바이 다운로드 공격의 차단과 다양한 정보를 생산하는 (주)트라이큐브랩 기술연구소에서 제작한 도구로 SpiderMonkey 자바스크립트 엔진을 구현하여 난독화를 해제하는 도구이다.
공개된 버전은 1.0 버전으로 현재는 구글 V8 엔진으로 구현한 2.0을 내부적으로 사용하고 있다. 1.0 버전과 2.0 버전의 차이점은 1.0은 난독부와 해제부를 직접 입력해야 하지만 2.0에서는 공다팩 전체 소스 코드를 그대로 해제하고 내부 소스 코드를 분석하여 취약점을 유발시키는 파일과 악성코드를 수집한다.
http://14.63.218.164:8000/gongda/ 도구
공다팩 해제 도구 이용
3. Deobfuscation of Gondad Pack Code
본격적으로 공다팩을 소스 코드 수정을 이용한 난독화 해제 방법에 따라 해제를 해본다.
3.1. Kahu Security
Kahu Security는 인터넷을 이용한 악성코드 유포에 초점을 두고 활동하는 보안 전문가들로 구성되어 있으며, 다양한 정보들과 새롭고 빠른 소식들 그리고 독특한 형태로 난독화를 해제하기로 유명하다. 공다팩 역시 독특한 방식으로 해제를 한다. 이들이 제시하는 해제 방법을 따라한 내용은 다음과 같다.
공다팩 해제부 코드 중에 난독화된 코드를 연산하여 저장된 변수를 실행하는 eval() 함수를 생성하기 위해 사용되는 코드이다. eval()은 NUIRS0 변수에 저장되어 사용되는데, NUIRS0 변수는 다음과 같이 사용한다.
NUIRS0=dLidfS6('1Qe4dG*]6zY^k8vb]#&,m8$[x_GD3a]Nj5dsn7[F[8cu[S34Rlc]4r;idpDt='[hxyB5](/[^v@0el9a]/g,''));
난독화 해제부 코드 맨 마지막 부분으로 소스 코드 정렬을 했다. eval() 함수가 치환된 NUIRS0을 사용하여 난독화를 해제한 코드가 저장되어 있는 otlkVb6를 실행한다. 실행하는 과정에서 문제가 발생하면 FTWphd5를 parseInt() 함수로 추가 치환을 한 후 iGNrX2를 사용하여 다시 한번 난독화 해제한 코드를 실행한다. 이렇게 난독화 해제한 코드를 실행하는 형태를 가지게 되는 이유는 공격 코드를 실행하는 과정에서 Exception이 발생되면 다시 한번 실행하도록 하여 안정적으로 취약점을 실행시키려는 목적으로 보인다.
갑자기 사용되는 iGNrX2는 난독화 해제하여 실행하는 과정에서 선언되는 변수이다. iGNrX2에는 앞서 해제된 난독화를 실행시키기 위해 사용되는 NUIRS0을 저장하는 과정이 포함되어 있다. 다음 코드는 난독화 해제한 소스 코드이다.
try{
new function(){
NUIRS0(otlkVb6);
}
}catch(e){
try{
new function(){
FTWphd5=parseInt;
iGNrX2(otlkVb6);
}
}catch(e) {
window.location='.';
}
}
난독화를 해제하면 iGNrX2에 NUIRS0를 저장하여 iGNrX2를 eval()함수로 사용한다.
iGNrX2=NUIRS0;
btibSNQ6=FTWphd5(20100418);
while(window.closed){}
document.write("<br>");
var gondady=document.createElement('body');
document.body.appendChild(gondady);
Kahu Security는 iGNrX2에 저장되는 값을 NUIRS0이 아닌 alert으로 강제 소스 코드를 변경한다. 변경할 때 주의할 점은 다음과 같다.
- NUIRS0 변수의 문자열 6 자리 수와 alert 의 5 자리 수를 일치
- 사전에 난독화를 해제하기 위해 연산하는 값을 미리 분석
NUIRS0을 alert으로 변경하면 사용한 자리 수를 맞춰야 한다. 난독화 된 코드에 연산하는 값은 자리마다 정해진 값을 연산해야 제대로 된 난독화 해제 코드를 얻을 수 있기 때문이다. 그래서 스페이스를 이용하여 강제로 자리를 맞추었다.
원본 소스코드
iGNrX2=NUIRS0;btibSNQ6=FTWphd5(20100418);
수정한 소스코드
iGNrX2=alert ;tibSNQ6=FTWphd5(20100418);
난독화 생성 코드 위치를 추측하기에 좋은 팁은 한 문자는 2개의 난독화 된 코드 값을 가지게 된다. iGNrX2= 는 7 개의 문자를 가기에 난독화 코드의 15 번째 부터 우리가 변경한 코드가 들어가는 것을 알 수 있다. 또한 생성한 값은 12 자리의 값을 가지는 것을 알 수 있다. 다시 역으로 난독화 코드를 생성하기 위해 열심히 계산기로 계산하면 다음과 같이 변경할 수 있다.
원본 난독화 코드 : 4BFADA5E7EF3A57E7F8CCE671EF2C24C5BAFF77267E7
수정 난독화 코드 : 4BFADA5E7EF3A55146A0EE400EF2C24C5BAFF77267E7
이제 수정한 난독화 코드를 브라우저를 통해 실행해 보면 결과를 볼 수 있다.
난독화 해제
Kahu Security의 난독화 해제 방법은 매번 달라지는 공다팩 난독화 해제 키 값을 찾아야 하며, 그 키 값에 맞춰 난독화를 생성하기엔 너무 불편하다.
3.2. Team Bolaven
국내 보안관제팀 소모임으로 소개하는 Team Bolaven에서 정기적으로 분석하고 세미나 한 정보를 문서 형태로 제공한다. 이 보안팀에서 제공하는 분석 보고서 중 "[9차 문서] Dadong's JSXX 0 44 VIP분석" 에서 색다른 방법으로 공다팩 해제에 관한 내용을 전달해주고 있다.
Team Bolaven Blog : http://thebolaven.tistory.com/
이들이 제시하는 난독화 해제 방법은 매우 간단하며 누구나 따라할 수 있는 방법이다. 이들이 제시하는 방법은 실행부의 실행 코드에 난독화 해제한 코드가 저장되는 변수를 alert으로 실행시키는 코드를 추가하는 방법을 사용한다.
//{수집부}
faug8="1";delete faug8;try{faug8+="0"+"0"+"0"+"0"+"0"+"0"+"0"+"0"+"0";}catch(e){var gOqA0="1";dLidfS6 = eval}qQhifJ0=unescape;
//{난독부}
//{해제부}
tfFzFYX7 = dLidfS6(dLidfS6);tfFzFYX7(UgoVGYH0);
팀 볼라벤이 삽입하는 소스 코드의 위치는 다음과 같다.
//{수집부}
faug8="1";delete faug8;try{faug8+="0"+"0"+"0"+"0"+"0"+"0"+"0"+"0"+"0";}catch(e){var gOqA0="1";dLidfS6 = eval}qQhifJ0=unescape;
//{난독부}
//{해제부}
tfFzFYX7 = dLidfS6(dLidfS6);tfFzFYX7(UgoVGYH0+"alert(해제된 난독화가 저장되는 변수명);");
공다팩 소스 코드 수정
실행 결과
3.3. 공다팩 해제
공다팩 해제의 형식적인 방법을 사용해보자. 공다팩은 난독부와 해제부를 수정하기 까다롭다는 것은 알고 있을 것이다. 그래서 다음과 같이 해제부 소스 코드를 문자열 값이 아닌 자바스크립트 소스 코드 형태로 죽 나열하였다. 우선 그림 8을 보자.
난독화 해제를 위한 소스코드 변형
먼저, 한 줄로 표현되어 있는 소스 코드를 난독부, 해제부, 실행부를 소스 코드 정렬을 하고, 해제부의 문자열을 복사하여 자바스크립트 소스 코드 형태로 추가 표현하였다.
두 번째로 수정할 부분은 자바스크립트 소스 코드로 표현된 해제부 코드에서 사용되는 escape 문자인 \를 제거하는 작업이다. escape 문자는 문자열(String)으로 표현된 상태에서 실행할 때 일부 문자를 그대로 인식시키기 위해 사용되었으나 실제 실행하기 위한 소스 코드로의 표현에서는 에러를 발생 시키는 요소가 된다.
검색 기능을 이용하여 test를 검색하면 test 문자열을 저장하는 변수를 만날 수 있다. 이 문자를 저장하는 변수를 다시 검색하면 그림 9와 그림 10과 같이 만날 수 있는데 이 부분들의 escape 문자들을 삭제한다.
escape 문자 삭제 1
escape 문자 삭제 2
다음 실행부를 주석 처리하고,
실행부 주석 처리
그림 12와 같이 난독화가 해제되어 저장되는 otlkVb6를 실행하는 부분에 HTML의 <xmp> 태그를 삽입하여 실행하면 결과를 볼 수 있다. alert(otlkVb6) 형태로 사용하여 alert 창으로 해제 된 소스 코드를 볼 수 있지만, alert 보다 xmp 태그를 사용하는 것이 해제된 결과를 깔끔하게 볼 수 있어 선호하는 편이다.
<xmp> 태그는 <xmp>와 </xmp>태그 안의 모든 HTML 태그들을 해석하지 않고 그대로 출력하는 역할을 한다. <xmp> 태그가 인식 할 수 있는 HTML 는 유일하게 </xmp>태그 뿐이다. <xmp> 태그는 <pre> 태그와 비교되는데 <pre> 태그는 <pre>와 </pre> 태그 안의 HTML 태그들을 해석하고 그대로 출력하는 역할을 한다. 해석을 하고, 해석을 하지 않는 것의 차이는 실행 가능성의 차이와 동일시 할 수 있다.
소스 코드 삽입
난독화 해제 결과
'Information Security > Malware' 카테고리의 다른 글
도메인 쉐도잉 (Domain Shadowing) (0) | 2015.03.17 |
---|---|
Sweet Orange exploit kit (0) | 2014.09.02 |
공다팩(Gondad EK) 분석 #03 (3) | 2014.07.11 |
공다팩(Gondad EK) 분석 #02 (0) | 2014.07.04 |
공다팩(Gondad EK) 분석 #01 (0) | 2014.06.27 |