Web EK에서 주로 사용하는 자바 난독화 기법

난독화/난독화 강좌 2014. 3. 3. 18:53

Web EK 에서 가장많이 이용되는 취약점은 Java 일 것이다. 악성코드 유포에 이용되는 jar 파일을 분석해보면 자바스크립트 처럼 난독화되어 있다. 하지만 대부분은 자바스트립트 그 것에 비해 단순하게 난독화되어 있다

오늘은 blackhole EK 등에서 Java 취약점 부분에 이용되는 재미있는 난독화 기법을 알아보겠다.

 

아래그림은 2014년 1월 경에 수집한 악성코드 샘플이다. 

상황은 위/변조된 사이트에 접속 후 악성코드 유포 Landing 페이지로 이동되었으며, 악성 Jar 파일을 다운로드한다. 해당 PC는 취약점이 존재하야 이후 악성코드까지 다운로드된 화면이다. 

 (fiddler2를 이용하여 저장해 놓으면 분석시 유용하게 사용할 수 있다)  

[그림 1] 악성코드 유포 샘플

 

분석을 위해 landing 페이지와 jar 파일을 저장한다. fiddler2 - save - response - Response Body .. 로 저장하면 원하는 파일만 쉽게 저장할 수 있다

[그림 2] 악성파일 저장

 

[그림 3]은 lading 페이지의 자바 부분이다. PlugingDectector로 버전 체크 후 asfwe 함수에서 자바의 버전에 따라 applet이 동작한다. JNLP취약점을 이용하기 위한 부분인데 첫 번째 부분으로 난독화 기법을 알아보겟다 (난독화 기법은 모두 동일하다)

[그림 3] Landing Page (java 부분)

 

첫번째 부분만 보면 [그림 4]와 같다. 여기서 파라미터 값 중 ldcrlio 값을 보면 이상한 문자열로 되어있다. 언듯보아서는 해석할 수 없다. 하지만 이부분이 악성파일 다운로드 URL로 변한다.

이부분이 URL로 변화는 과정을 알아보는 것이 이번블로깅에 포인트 이다.   

[그림 4] applet

 

Jar 파일을 Decompiler로 열어보면 상당히 많은 class를 가지고 있다. 첫번째 class는 HTML의 파라미터를 받아오는 역활을하고, 마지막 class는 악성코드를 다운로드/실행 및 레지스트리에 등록하는 역활을 한다. 그리고 나머지 부분은 마지막 난독화된 페이지가 동작할 수 있도록 복호화하는 역활을 하게 된다.

우리의 목적은 ldcrlio 값을 복호화하는 것이므로 해당 부분만 보도록 하겠다. 아래그림에서 2번 부분이 우리가 복호화하고자 부분의 Key 값이 있는 부분이다.

[그림 5] jar 파일

 

위 그림의 3번 부분 중에서 key 값이 있는 부분만 정리해보면 아래의 그림과 같다. 이부분 역시 난독화 되어있으며, ddr_uuidjadisl class에 있는 vb~~dgra 함수를 통하여 복호화된다

[그림 6] Key 값 확인

vb~~dgra 함수는 [그림 7] 처럼 replace메소드를 이용하여 특정 문자열을 지우는 역활을 한다. paramInt = 1 일때 와 paramInt = 2 일때는 모두 복호화 하면 길이가 동일한 두 문자열을 얻을 수 있다.   

[그림 7] Key 값 복호화

 

이문자열들은 [그림 4]의 ldcrlio 값을 URL로 복호화 해주는 Key 이다.

ldcrlio 값은 두 문자열을 이용하여 단일치환암호 방식으로 난독화 된 데이터 인것 이다.

볼라벤툴의 단일치환암호 디코더를 이용하여 복호화해보면 최종 목적지 URL을 확인할 수 있다. ( 암호 문자열은 광게바라 블로그로 변경하였다. )

 

[그림 8] 단일 치환 암호 복호화

 

[그림 9]은 암호화된 문자열이 복호화되는 과정을 설명한 그림이다. (단일치환암호 방식)

 

[그림 9] 단일 치환 암호 복호화 원리

 

이번블로깅의 목적인 ldcrlio 값을 URL로 변경하였다.

끄 읕~ ~~~

이아니라 자바스크립 난독화를 공부하는 블로그이니 자바스크립트를 이용하여 단일치환암호를 풀어보겟다.

 

[그림 9] 는 단일 치환함호를 푸는 자바스크립트 코드다. 생각보다 쉽고 간결하게 만든것 같다.

a 부분에 난독화된 데이터를 넣고 b와 c에 키값 1, 2를 넣으면 문자열로 찍힌다.

[그림 9] 단일 치환 암호 복호화 스크립트 소스

 

* 자바스크립트 소스 

<script>

  a = "AhhjyHH0QE779npfEiE8hcthois8uoaHrx";
  aa = a.split("");
  b = "lxwLGr43qDEvuYp59AcU0ba7ojzithnfQOsC8NXRM6TeISV-_%.&/:#?=dWgmKFHyBk2ZPJ1";

  c = "0123456789abcdefghijklmnopqrstuvwxyz.ABCDEFGHIJKLMNOPQRSTUVWXYZ/:_-?&=%#";
  cc = c.split("");

  for (i=0;i<a.length;i++)
  {
     j = b.indexOf(aa[i]);
     document.write(cc[j]);
  }
</script> 

설정

트랙백

댓글