2013년 5월 18일 토요일

암호화된 쉘코드에서 다운로드 받는 악성 URL 찾는 방법

최근 언론사 및 학교 등등의 웹페이지가 변조되어서 난독화된 악성 스크립트가 삽입된 경우가 많습니다.

해당 스크립트는 취약점에 의해서 쉘코드(ShellCode)를 실행하여 악성 URL에서 파일을 다운로드 및 실행함으로 악성코드를 감염시킵니다.

여기서 사용된 쉘코드는 보통 16진수 유니코드로 작성되었습니다.

자바 스크립트에서는 16진수 유니코드를 "%u" 다음에 16진수가 덧붙이는 방식으로 표현합니다. 이렇게 표현된 쉘코드는 XOR 연산 방식으로 암호화되었습니다. 이점은 악성 코드 대응하는 입장에서 신속히 악성 URL을 확인할 수 없게 합니다.

따라서 이번 글에서는 XOR 연산 방식으로 암호화된 16진수 유니코드 쉘코드에서 악성 URL을 찾는 방법을 소개합니다.

먼저 방법을 소개하고 자바 스크립트로 구현해보겠습니다.

원리는 간단합니다. 쉘코드에는 악성 URL이 하드 코딩되어 있습니다. 말그대로 http://악성url 이런형식으로 쉘코드에 들어있다는 얘기입니다.

따라서 0x00 ~ 0xFF 까지 값과 각 바이너리(2byte)를 XOR 연산해준 값의 전체에서 http 문자열이 존재하는지 찾는 것입니다.
예를 들어, 0xBF로 XOR 연산하였을 때 해당 쉘코드에서 http 문자열이 발견되면, 그 값이 암호화 키값이 되는것입니다.

이제부터 소개된 방법을 자바스크립트로 작성하면서 보여주겠습니다.

1) "%u%" 형식으로 표기된 쉘코드가 있습니다.

2) 해당 쉘코드를 실제로 사용되는 코드로 변경해야합니다.
즉, "%u"를 제거하고 리틀-엔디안 방식으로 표기해야합니다.
예를 들면, "%uE1D9" -> "D9E1" 이렇게 변경되어야 합니다.

3) 리틀-엔디안 방식으로 표기된 쉘코드의 각 바이너리 2Byte를 0x00 ~ 0xFF 값과 XOR 연산한 다음 http 문자열이 존재하는지 찾습니다. 찾으면 악성 URL을 출력해줍니다. 관련 코드는 다음과 같습니다.

decode = function(shellcode, key) // 해당 함수에서 xor 연산한다.
{
s = "";
for (var i=0; i<shellcode.length; i+=2){   // 문자 2자리씩 For 루프가 돈다.
str = code.charAt(i) + code.charAt(i+1);  // 문자 2자리씩 가져와서 str 변수에 담는다.
c = String.fromCharCode(parseInt(shellcode, 16) ^ key); // 문자열 2자리씩 가져와서 유니코드를 일반 문자열로 변환한다.
s += c;     // 변환된 문자열을 s 변수에 담는다.
}
return s;}

findKey = function(code) // 해당 함수에서 XOR 암호화에 사용된 키를 찾는다.
{
for(var key = 0 ; key <= 255 ; key++) // 0x00 ~ 0xFF 값과 XOR 연산을 한다.
{
sh = escape(decode(shellcode, key));
if(isKeyMatch(sh)) // 어떤 키 값에 http 문자열이 존재하는지 찾는다.
{
return key;
}
}
}

isKeyMatch = function(shellcode) { // 해당 함수는 쉘코드에서 http 문자열 존재 여부를 확인한다.
re = /http%3A\/{0,3}[\/0-9.\-A-Za-z]+\+/gm;
url = re.test(shellcode); // 정규표현식을 사용하여 쉘코드에서 http 문자열 존재 여부를 확인한다.
}

urlFilter = function (shellcode, key) { // 해당 함수는 쉘코드에서 http 문자열을 파싱한다.
re = /http%3A\/{0,3}[\/0-9.\-A-Za-z]+\+/gm;
url = escape(decode(key, shellcode));
url = unescape(re.exec(url));
return url;
}

위에 작성된 코드는 다음과 같은 순서로 동작합니다.

urlFilter -> findKey -> decode -> isKeyMatch

실제로 소개된 쉘코드의 악성 URL을 다음과 같이 확인할 수 있었습니다.

그럼 해당 글을 읽어주셔서 감사합니다.


댓글 4개:

  1. 와우~ 나만의 디코딩 쉘코드를 가지고 있다면 말질라와 같은 툴이 필요가 없겠네요

    답글삭제
  2. 네 말질라 쓸때 http쓰기 귀찮아서 만들었어요
    블랙홀url은 특수문자도 들어가서 정규표현식 좀더 수정하면 유용할꺼에요

    답글삭제
  3. 작성자가 댓글을 삭제했습니다.

    답글삭제