0. 개요

1. 분석

.... 1.1 기본적인 내용

.... 1.2 바로가기 파일

.... 1.3 악성 스크립트

........ 1.3.1 기본

........ 1.3.2 디코딩

........ 1.3.3 간단한 분석

........ 1.3.4 자세한 분석

2. 치료

.... 2.1 원본 파일 복구

.... 2.2 악성코드 확인 및 종료

.... 2.3 완전히 삭제

3. 결론





0. 개요

  프린트를 목적으로 학교의 공용 컴퓨터를 사용하다가 일명 "USB 바이러스"라고 불리는 악성코드에 여러 번 감염되었다. 어느날 시간이 남기도 하고 스크립트 악성코드 분석도 공부할 필요가 있다는 생각에 VBS부터 공부한 후 이 악성코드를 분석해 보기로 했다.


  조사해서 찾아보았는데 2개를 확인하였고 하나는 감염된 컴퓨터가 있어서 직접 조사할 수 있었으며 다른 하나는 백신 프로그램의 로그를 통해 확인하였다. 인터넷을 찾아보니 굉장히 오래된 악성코드로 보이며 변경된 사항이 있는지는 모르겠지만 기본적인 행위는 비슷해 보인다. 


  당연히 어지간한 안티바이러스 프로그램에서도 탐지가 되긴 하지만 겸사겸사 공부도 할 겸 그리고 불안한 것도 있고 해서 분석해 보기로 했다. 또한 이렇게 오래된 것임에도 불구하고 라이선스 문제 때문인지 안티바이러스 프로그램이 설치되지 않은 여러 공용 컴퓨터들에서 아직까지 살아남아 있는 것을 보면 보안에 무관심한 사람들이 정말 많구나라는 생각도 든다.





1. 분석

1.1 기본적인 내용

  먼저 기본적인 내용부터 살펴보겠다. 이 악성코드는 이미 감염된 컴퓨터에 USB를 꽂을 시 악의적인 행위를 수행한다. 루프문을 돌다가 USB가 꽂아지면 먼저 원본 파일들에 "시스템 파일" 및 "숨김" 속성을 추가하여 일반적인 경우에 보이지 않게 한다. 대신 해당하는 모든 파일들에 상응하는 바로가기 파일들을 각각 생성한다. 그리고 악성 스크립트 파일을 USB에 복사한 후 똑같이 "시스템 파일" 및 "숨김" 속성을 추가한다.


  이후 다른 컴퓨터에서 바로가기 파일이 실행 되면 원본 파일과 동시에 악성 스크립트 파일을 실행시킨다. 악성 스크립트는 이 컴퓨터를 감염시키는데 주된 행위는 백도어와 다른 USB 감염이다. 또한 오토런에도 등록되어 컴퓨터 부팅 시마다 실행된다.


  참고로 안티바이러스 프로그램을 설치하지 않은 경우에는 위와 같이 위험한 상황이 되지만 상당히 오래된 악성코드이기 때문에 기본적으로 백신은 잘 탐지한다. 그래서 USB를 꽂자마자 바로가기 파일들과 VBE 파일이 삭제되는 것을 볼 수 있다. 하지만 문제는 원본 파일들은 계속 숨김 속성을 가지고 있기 때문에 USB를 보면 파일은 하나도 없는데 용량만 차지하는 것을 볼 수 있다. 이 경우에는 해당 폴더에서 이 속성들을 제거해 주어야 한다.



1.2 바로가기 파일

  바로가기 파일을 사용하는 이유는 피해자들이 이것을 USB가 감염되기 전과 같이 원본 파일인로 여기게 하는 것이다. 그래서 아무런 생각 없이 이 바로가기 파일을 실행하게 된다. 앞에서도 설명했듯이 바로가기 파일들은 두 가지 목적이 있다. 하나는 악성 스크립트를 실행시킴으로써 악성코드 트리거의 역할을 하는 것이고 다른 하나는 피해자들이 눈치채지 못하게 원본 파일도 실행시킴으로써 이것이 악성코드에 감염된 것인지를 눈치채지 못하게 하는 것이다.

 

  바로가기 파일 즉 .lnk 파일은 마우스 오른쪽 클릭을 통해 속성을 누른 후 "대상" 탭을 보면 알겠지만 사실 명령어로 이루어졌다고 보면 된다. 일반적인 경우 원본 파일의 경로만 적어져 있지만 이곳에 cmd.exe 즉 명령 프롬프트를 통해 실행 가능한 명령어를 넣은 경우 그 명령어가 실행된다. 이 명령어는 다음과 같은 형태로 되어있다.


C:\windows\system32\cmd.exe /c start MerciJacquieMichel.vbe&start [원본 파일] &exit


  참고로 MerciJacquieMichel.vbe는 여기서 분석하는 분석 대상인 악성 스크립트 파일이다. 이 것을 보면 알겠지만 악성 스크립트와 원본 파일이 동시에 실행되는 것을 볼 수 있다.



1.3 악성 스크립트

1.3.1 기본

  이제 악성 스크립트 파일에 대해서 알아보자. 개인적으로 감염된 컴퓨터들을 조사하다가 ymrimwqtym.vbe라는 것도 발견했다. 이것은 V3의 로그를 통해서 확인했기 때문에 원본 파일을 확보하지 못했고 그래서 분석을 못했다. 하지만 하는 행위를 봤을때 바로가기 파일들을 생성하는 것과 숨기는 것 등 일반적인 행위는 같아 보이므로 이름만 바뀐 것인지 아니면 둘 중 하나가 업그레이드 버전인지 모르겠지만 어쨌든 큰 차이는 없을 것 같다.


  인터넷에서 이름들을 검색해보니 ymrimwqtym.vbe라는 이름을 가진 바이러스는 2014년 말에도 활동한 걸로 보이며 MerciJacquieMichel.vbe는 더 최근인 것으로 보이므로 전자의 바이러스를 업그레이드한 것인지 이름만 바뀐 것인지는 잘 모르겠지만 비슷한 행위를 하는 것은 확실한 것 같다.


  이제 실질적인 분석을 하기로 한다. 먼저 vbe 확장자는 Encoding된 즉 암호화된 VBS(Visual Basic Script)다. VBS는 과거 Visual Basic을 기반으로 만든 스크립트 언어인데 당연히 문법적으로 많이 닮았고 이 외에도 VBA도 비슷한 개념이다. 만약 엑셀을 공부하면서 마이크로소프트 오피스의 VBA(Visual Basic for Application)를 배웠다면 관련 언어에 대해서 문법적으로는 어느 정도 익숙해 졌다고 보면 된다. VB를 이용해 엑셀 등에서 사용할 수 있게 만든 것이 VBA라면 VBS는 원래 자바스크립트와 비슷한 목적으로 만들어졌다가 이후 윈도우에서 컴퓨터를 관리하는 용도로 사용되고 있다. 물론 악성코드에서도 많이 사용되었고 요즘은 악성코드에서든 관리 용도에서든 많이 사용되는 편은 아닌것 같다.


  과거 MS에서는 screnc.exe라는 툴로 vbs를 vbe로 인코딩하는 기능을 제공해 왔다. 하지만 비스타부터는 이 프로그램이 기본 제공이 아니다. 참고로 이 파일을 직접 다운로드해서 사용할 수 있으며 윈도우 7까지는 사용 가능하다고 한다. 물론 인코딩과 디코딩 스크립트를 이용해서 직접 사용할 수도 있다. 다음 링크에서 [ https://gallery.technet.microsoft.com/Encode-and-Decode-a-VB-a480d74c ] 인코딩 및 디코딩 기능이 담긴 vbs 스크립트 파일들을 다운로드 받을 수 있다. 사실 인코딩 관련 내용보다는 난독화와 관련된 내용이 더 중요할 것으로 보인다.



1.3.2 디코딩

  악성코드를 분석하다 보니 이것은 확장자만 VBE지 실제 내용은 VBS였다. 대신 여러 난독화 기법을 이용해 암호화된 것으로 보이게 만든 것이다. 물론 스크립트의 특성 상 일일이 보다 보면 그리고 진행하다 보면 쉽게 원본 코드를 획득할 수 있다. 


  조금 더 자세히 설명하자면 처음 형태는 주석과 수 많은 개행 문자들, 그리고 암호화된 데이터가 존재하지만 동시에 복호화 코드 및 실행 코드도 존재하므로 wscript.echo를 통해 쉽게 받아낼 수 있다. 이 말은 Execute나 ExecuteGlobal 대신 wscript.echo 명령어를 사용하면 실행 되신 결과를 보여주는 메커니즘을 이용한 것이다. 그리고 각 명령어들에서 사용되는 난독화 부분도 마찬가지로 wscript.echo로 출력시키면 결론적으로는 완성된 내용이 나오기 때문에 쉽게 분석할 수 있다. 


  참고로 간단한 난독화 부분이야 한 문장 짜리일 것이고 간단하게 옮겨적으면 되지만 코드 전체는 매우 큰 편이고 명령 프롬프트에 다 안들어올 수 있다. 이럴 경우에는 간단하게 명령 프롬프트에서 다음과 같이 사용하면 된다. cscript.exe는 현재 가상환경이 윈도우 XP여서인지 wscript.exe를 이용한 실행이 되지 않아서 사용했다.


> cscript.exe aa.vbs > bb.txt


  문제는 이렇게 복호화한 내용도 또 다시 암호화되어 있다는 것이다. 앞의 예제와 같이 인코딩된 데이터와 디코딩 함수가 존재하며 난독화된 부분도 존재한다. 난독화된 부분을 조금 보면 이 스크립트 파일을 실행하는 프로세스가 wscript.exe인지를 확인하는 부분이 나온다. 어쨌든 이것을 복호화시키면 또 다른 형태가 나온다. 이것도 마찬가지의 형태이다. 마지막으로 이것을 복호화시키면 드디어 원하는 코드를 얻을 수 있다. 문제는 이 코드도 대부분은 아니지만 조금씩 난독화된 부분이 있는데 이것도 wscript.echo를 이용해 출력하다 보면 쉽게 처리할 수 있다. 어쨌든 스크립트이므로 우리는 쉽게 소스 코드를 획득하게 되었다.



1.3.3 간단한 분석

  이제 디코딩 부분은 건너왔고 실제 수행하는 행위를 알아보겠다. 이것은 전형적인 Backdoor로서 설치된 이후 특정 URL 및 포트를 가지고 C&C 서버와 통신한다. URL을 검사해보니 약 1년 전에 확인된 것으로 보아 적어도 이 버전(MerciJacquieMichel.vbe)은 그 때 즈음에 전파된 것으로 보인다. ymrimwqtym.vbe의 경우에는 검색해보니 적어도 2014년 11월 경에는 탐지된 것으로 보인다.


  어쨌든 서버에서 보내는 명령들에 따라 수행되는 루틴들을 분석해보면 Uninstall부터 시작해서 생각도 못했던 악성코드의 업데이트 그리고 감염된 컴퓨터에 대한 정보(예를들면 운영체제의 버전, 설치된 백신 프로그램 이름 등)를 보내는 등의 기능이 존재한다. 이 외에도 특정 디렉토리 내에 존재하는 파일들 목록이라던가 실행 중인 프로세스들 목록 등도 있고 아예 명령 프롬프트를 이용한 명령어도 실행시킬 수 있다. 가장 눈에 띄는 것은 특정 파일을 다운로드하고 실행시키는 기능이다.  



1.3.4 자세한 분석

  먼저 변수들을 초기화하고 초기화 함수를 실행한다. 이 함수는 다음 레지스트리에 값을 쓴다. 

HKEY_LOCAL_MACHINE\software\[악성코드 이름]\


  값은 "true - [날짜]" 또는 "false - [날짜]"인데 해당 레지스트리 값이 이미 존재하면 true, 존재하지 않는다면 false이다. 이것을 담당하는 변수 이름이 usbspreading인 것으로 보아 USB를 통해 감염된 초기 컴퓨터의 경우 이 값이 존재하지 않기 때문에 true가 될 것이고 다시 실행되었다면 이 값이 이미 존재하므로 이후부터는 false가 될 것이다.


  이후 오토런 레지스트리들에 해당 스크립트를 등록한다.


HKEY_CURRENT_USER\software\microsoft\windows\currentversion\run\[악성코드 이름]

HKEY_LOCAL_MACHINE\software\microsoft\windows\currentversion\run\[악성코드 이름]


  값은 다음과 같다.


wscript.exe //B "\[악성코드 이름]"


  그리고 시작 프로그램 폴더와 Temp 폴더에 현재 스크립트를 복사한다. 막 감염된 경우라면 현재 스크립트는 USB에서 실행된 그 스크립트가 될 것이다.


C:\Users\[사용자 이름]\AppData\Local\Temp\[악성코드 이름]

C:\Users\[사용자 이름]\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\[악성코드 이름]


  이제 초기화의 마지막 단계로서 현재 Temp 폴더에 존재하는 악성코드가 실행 중인지 판단하여 아니라면 그것을 실행하고 종료한다. 초창기에는 USB에서 실행 중일 것이고 이제 컴퓨터 내의 악성 스크립트를 실행시키는 것이다.


  이후 부터는 루프문이다. 이 루프문에서는 설치 함수가 실행되며 POST로 서버의 URL에 현재 컴퓨터의 여러 정보들을 보내며 동시에 명령을 받는다. 참고로 포트 번호는 3030 - 3040의 값을 갖는다. 먼저 설치 함수부터 살펴보겠다.


  설치 함수에서는 앞의 오토런 레지스트리를 등록하고 Temp 및 시작 프로그램 디렉터리에 스크립트 파일을 복사하는 행위를 수행한다. 이후 우리에게 익숙한 루틴이 등장한다. 이동식 드라이브가 현재 삽입되어 있고 거기에 여분의 공간이 있는지를 확인한 후 현재 스크립트 즉 Temp 폴더에 존재하는 스크립트를 USB에 복사하고 속성을 준다. 이 속성은 앞에서도 설명한 "시스템 파일" 및 "숨김" 속성이다. 이후 원본 파일들도 속성을 추가하며 각각 해당하는 바로가기 파일을 만든다. 이 외에도 각 확장자에 맞는 아이콘도 설정해 준다.


  이제 POST를 통해 서버에서 받은 명령어를 실행할 수 있는데 각각 간단한 설명을 넣겠다. "execute"는 인자로 받은 VBS 명령어를 실행하며 "cmd-shell"은 CMD 명령을 받아 실행한다. 원래 이 루프문은 주기가 디폴트로 5초인데 "sleep" 명령을 통해 이 주기를 변경할 수 있다. 그리고 "enum-driver", "enum-faf"와 "enum-process"로 각각 드라이버 목록, 인자로 받은 폴더의 파일들 또는 실행 중인 프로세스들의 목록을 보여준다. 또는 "delete" 및 "exit-process"로 파일 및 프로세스를 삭제 및 종료시킬 수 있다. 이 외에도 "uninstall"로 악성코드를 삭제할 수도 있으며 "update"로 새로운 악성 스크립트를 다운로드 받아 실행시킬 수도 있다. "recv"는 피해자 컴퓨터의 파일을 서버로 업로드하며 "send", "site-send"는 파일을 다운로드 받아 피해자의 컴퓨터에서 실행시킨다.


  아마도 이 악성 스크립트는 공격자가 원하는 실질적인 내용 보다는 악성코드 전파 및 백도어 그리고 실제 악성코드에 대한 다운로더로서의 기능을 가진 것으로 보인다. 당연하게도 이 스크립트를 보면 키로깅이라던지 랜섬웨어, DDoS 등 일반적인 악성코드가 하는 기능은 포함되지 않기 때문이다. 이 이상은 단지 이 악성 스크립트 파일만을 통해서는 알 수 없다.





2. 치료

2.1 원본 파일 복구

  간단하게 설명하자면 원본 파일들은 "숨김" 및 "시스템 파일" 속성이 추가된다. 그래서 볼 수가 없는데 만약 보고싶다면 윈도우 10 기준으로 "폴더 옵션"에서 "보호된 운영 체제 파일 숨기기(권장)"을 해제하고, "숨길 파일, 폴더 및 드라이브 표시"을 체크하면 볼 수 있다. 하지만 이 파일들은 계속 이 속성을 가지고 있기 때문에 이 속성을 해제할 필요가 있다. 그래야 원래의 원본 파일로 돌아올 것이기 때문이다.


  먼저 명령 프롬프트를 실행한다. 그리고 USB 드라이브로 이동하는데, 드라이브의 이름에 따라서 다음 명령어를 수행한다. 본인의 경우 F 드라이브였기 때문에 다음 명령어를 실행한다. 참고로 >는 명령어가 아니라 프롬프트이므로 > 이후의 명령어를 입력하면 된다.


> F:


  왼쪽 프롬프트를 보면 F 드라이브로 이동된 것을 볼 수 있다. 이제 다음 명령어를 통해 현재 폴더와 모든 하위 폴더에 존재하는 파일 및 폴더의 "읽기 전용 속성", "시스템 파일 속성", "숨김 속성"을 제거한다.


> attrib -r -s -h /d /s


  이로써 우리는 간단하게 USB를 원상복구할 수 있다. 즉 악성코드 "MerciJacquieMichel.vbe"와 여러 바로가기 파일들을 삭제하고, 원본 파일들의 속성을 복구시키면 완전히 원래 상태로 복귀된다.



2.2 악성코드 확인 및 종료

  위의 복구 과정을 매번 하기도 귀찮으므로 현재 악성코드가 실행 중인지 검사하며 실행 중인 경우 종료시키는 방법을 설명하겠다. 간단히 말해서 윈도우의 스크립트 파일들은 wscript.exe라는 프로그램을 통해서 실행되며 이 악성 스크립트도 마찬가지이다. 그래서 우리는 Ctrl + Alt + Del 키의 조합을 통해서 프로세스들을 확인하다가 "wscript.exe"라는 이름을 가진 프로세스가 실행 중이라면 종료시키면 된다.


  물론 컴퓨터 관리자가 vbs 스크립트로 컴퓨터를 관리하는 경우라면 함부로 종료시키면 안되겠지만 본인이 사용하는 공용 컴퓨터에서는 이 악성코드가 감염될 때만 저 프로그램이 사용되는 것으로 봐서 그냥 종료시키면 될 것으로 보인다.



2.3 완전히 삭제

  문제는 이 바이러스는 컴퓨터를 부팅할 때마다 자동으로 실행이되게 되어있다. 하지만 우리는 레지스트리를 건들기 귀찮기 때문에 파일이 존재하는 곳으로 가서 삭제만 해주면 된다. 


  시작 프로그램 디렉터리와 Temp 디렉터리로 이동합니다. 위치는 대략 다음과 같다.


C:\Users\[사용자 이름]\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\[악성코드 이름]

C:\Users\[사용자 이름]\AppData\Local\Temp\[악성코드 이름]


  위의 두 경로로 가보면 MerciJacquieMichel.vbe나 ymrimwqtym.vbe라는 이름을 발견할 수 있다. 이렇게 두 경로에 위치한 악성코드를 삭제하면 레지스트리에 오토런으로 등록되어 있다고 하더라도 파일이 존재하지 않으므로 실행되지 않는다.


  물론 레지스트리도 삭제하는 것이 좋기 때문에 아래에 정리하도록 한다. 실행 창 또는 윈도우 10의 경우에는 시작 메뉴를 클릭하고 regedit을 입력하면 해당 프로그램을 볼 수 있다. 이것을 실행하면 이름과 같이 레지스트리(Registry)를 수정(Edit)할 수 있다. 감염된 경우 차례대로 순서를 따라가 보면 다음의 항목들을 찾을 수 있을 것이다.


HKEY_CURRENT_USER\software\microsoft\windows\currentversion\run\[악성코드 이름]

HKEY_LOCAL_MACHINE\software\microsoft\windows\currentversion\run\[악성코드 이름]

HKEY_LOCAL_MACHINE\software\[악성코드 이름]\





3. 결론

  결론은 항상 안티바이러스 즉 백신 프로그램을 설치하는 것이 중요하다는 것이다. 모든 공격 특히 마음먹고 하는 공격은 쉽게 막기 힘들 수도 있지만 일반적인 그리고 오래된 악성코드는 쉽게 막아준다. 항상 보안에 신경쓰는 마인드와 기본적인 보안 프로그램을 설치하는 것만으로도 사이버 환경에서의 피해를 대부분 막을 수 있다.



Posted by SanseoLab



0. 개요

  cmd.exe는 유닉스 계열에서 셸과 비슷한 특징을 갖는다. 셸 스크립트로 리눅스를 관리하듯이 이것을 이용해 윈도우를 관리하기 위해서는 batch 파일 즉 .bat 파일을 이용해 스크립팅을 할 것이다. 하지만 문법을 보면 알겠지만 이것은 초창기 때 부터 한계를 가지고 있었다. 물론 최근에는 파워셸의 등장으로 무엇보다도 강력한 스크립팅이 가능해졌다.


  저 둘 사이에서는 무엇이 사용되었을까를 생각해 보자. WSH (Windows Script Host)는 윈도우에서 스크립팅 기능을 제공해 준다. 이것은 COM (Component Object Model) 인터페이스들의 집합을 expose함으로써 Object Model을 구현한다. 관련 내용을 보기 전에 기본적인 개념을 위하여 다음 링크를 먼저 참고하자. [ http://sanseolab.tistory.com/49 ] WSH는 GUI 모드에서 사용될 때는 wscript.exe를 통해서, CLI 모드에서는 cscript.exe를 통해서 실행된다.


  실제 사용되는 것들을 통해 설명해 보겠다. 앞에서도 설명했듯이 batch의 한계로 인해 윈도우 관리자들은 VBS(Visual Basic Script)를 사용해 왔다. vbs는 VB (Visual Basic) 문법을 이용한 스크립트 언어이다. 우리는 vb 문법과 COM 오브젝트를 사용하는 vbs를 통해서 스크립팅이 가능해 진다. WSH에서 vbs 말고도 무엇이 사용 가능할까.


  윈도우는 JavaScript와 비슷한 JScript를 지원한다. 웹 개발에 대해서는 거의 모르지만 JavaScript는 웹 브라우저에서 사용되며 일반적으로 HTML 내부에 구현되어 있다. 물론 스크립트 파일로서 존재할 수도 있으며 그럴 때에는 .js 확장자를 가진다. 마이크로소프트가 제공하는 JScript는 JavaScript와 거의 같은 것으로 생각된다. 악성코드 분석을 공부하는 입장에서 중요한 부분을 보자면 이 파일도 .js 확장자를 갖는다는 점이다. 확장자도 같고 기능도 거의 같으며 일반적으로 웹에서 사용되는데 굳이 여기에 정리를 하는 이유를 설명하겠다. WSH는 vbs 말고도 js 즉 JScript도 실행할 수 있다.


  이 외에도 Windows Script File 즉 .wsf 파일도 있다. 이것은 약간 특이한데 스크립트 언어는 아니고 확장자 즉 파일 포맷이다. 이 파일 내부에서 vbs와 js를 같이 포함할 수 있다. 즉 각각의 스크립트 언어를 하나로 통합하는데 사용된다. 이 외에도 per이나 python도 포함할 수 있다고 한다.


  지금까지는 WSH에서 사용 가능한 스크립트 및 파일을 알아보았다. 이제 악성코드 분석가의 입장에서 정리해 보려고 한다. 윈도우에는 디폴트로 스크립트 파일을 실행할 수 있는 프로그램 즉 wscript.exe와 cscript.exe가 존재한다. 그렇기 때문에 악성코드 개발자의 입장에서는 바이너리 형태의 악성코드 외에도 스크립트 파일로도 악의적인 행위를 수행할 수 있다.


  vbs는 문법이 vb라는 것이 중요한 점이 아니라 WSH에서 제공해주는 오브젝트를 사용할 수 있다는 것이 중요하다. JScript 또한 마찬가지이다. 이것도 문법은 JavaScript와 비슷하다. 하지만 악성코드에서는 웹에서 사용되는 내용은 의미가 없다. 대신 이 문법을 사용해서 WSH가 제공해주는 오브젝트를 사용할 수 있다는 점이 중요하다. .wsf 파일은 이러한 스크립트 언어를 포함하며 WSH에서 실행시킬 수 있는 파일 포맷이기 때문에 악성코드에서 자주 사용된다. 정확한 정보인지는 모르겠지만 batch 파일과 파워셸을 제외한 스크립트 형태로 존재하는 악성코드의 경우 .vba 또는 .wsf 파일 포맷이 사용되며 .js로는 잘 존재하지 않는다고 한다.


  물론 이러한 스크립트 언어들은 바이너리가 아니기 때문에 난독화가 필요하다. 마이크로소프트에서는 vbs 파일의 경우 난독화를 지원하며 난독화된 파일은 .vbe라는 확장자를 갖는다. JScript 또한 마찬가지인데 .jse라는 확장자를 갖는다. 참고로 JavaScript는 .js 확장자 외에 인코딩된 형태의 파일 포맷은 지원되지 않는다.


  정리해 보자면 윈도우에서 제공하는 WSH로 인해서 스크립트가 실행 가능하다. 이에 따라 악성 스크립트는 VBS를 이용해 만들어진 .vbs(인코딩된 경우에는 .vbe), JScript를 이용한 .js(인코딩된 경우에는 .jse), 그리고 이 두 가지 언어가 사용될 수 있는 .wsf 파일 포맷으로 존재한다.


  다음으로는 .hta 파일을 알아보자. 이것은 HTML Application 파일이다. 기본적으로 hta파일은 html과 같은데 이것은 html 파일을 만든 후 확장자를 .hta로 변경하여도 상관 없다는 의미이다. 차이점은 html은 기본적으로 웹 브라우저를 이용해 실행되며 hta 파일은 mshta.exe라는 개별 프로그램이 이것을 실행시켜 준다는 점이다. 악의적인 스크립트를 포함하는 html은 웹 브라우저로 실행시켜도 브라우저의 자체적인 보안 기능 하에 실행되어 수행하는 능력에 한계가 있다. 하지만 mshta.exe는 아무런 보안 기능을 제공하지 않기 때문에 악의적인 내용의 스크립트가 hta 파일에 포함되어 있는 경우 자유롭게 실행될 수 있다. 일반적으로 이 hta 파일 내부에 스크립트로 악성코드를 다운로드하고 실행시키는 루틴을 작성하는 방식으로 사용된다. html 형태이기 때문에 <script></script>에 js 뿐만 아니라 당연히 vbs도 포함할 수 있다.


  참고로 mshta는 보안상으로 문제가 있는데, 악성 hta(내부에 악성 vbs나 js를 포함하는)을 만들고 일반 파일에 붙인 후 해당 파일의 확장자를 hta로 바꾸면 붙여넣은 악성 스크립트가 실행된다. 즉 다음 명령처럼 jpg 파일에 악성 hta 파일을 붙여넣으면 생성된 파일의 끝 부분을 확인하지 않는 이상 정상 jpg 파일로 생각될 수 있다. (아예 jpg 파일로 유포하고 이후 hta로 바꾸어 실행시키는 악성 행위도 존재한다)


> copy /b normal.jpg+mal.hta malware.hta


  그리고 chm 파일도 있다. 이것은 Compiled HTML이다. 여러 개의 html 파일과 그림을 압축하여 하나의 파일로 합친 압축된 html 파일로서 일반적으로 소프트웨어 설치 시 도움말 파일을 생각하면 익숙할 것이다. 내부에 당연히 html이 존재할 것이고 파일 실행 시에 html이 읽어진다. html의 OBJECT 태그를 이용해 ActiveX 컨트롤을 생성한 후 HHClick() 메소드를 이용한다. 참고로 .chm은 더블 클릭으로 파일 실행 시 hh.exe라는 개별 프로그램이 실행시켜 준다.


  마지막으로 batch 파일은 건너뛰기로 하고 파워셸이 있는데 이것은 다른 문서에서 [ http://sanseolab.tistory.com/29 ] 자세히 다룬다.



1. Visual Basic

  여기서는 Visual Basic과 관련된 전체 개념을 정리하며 악성코드에서 사용되는 형태를 간단한 예제와 함께 정리한다. Visual Basic은 과거에 사용되어 왔던 언어이다. VB 6.0까지 존재하다가 이제는 더 이상 지원이 되지 않으며 대신 VB .net의 형태로 새롭게 만들어졌다. 언어로서의 VB .net 및 VB 6.0은 여기서 다루지 않는다. 대신 아직까지도 존재하는 여러 형태들에 대해서 알아보려고 한다.


  먼저 가장 익숙한 것은 VBA일 것이다. Visual Basic for Application으로서 엑셀 등의 마이크로소프트 오피스에서 사용되는 간단한 형태의 매크로 언어이다. 이것은 매크로 악성코드라는 이름으로 알려져 있는데 문서 파일을 통해 전파되며 문서를 열 때 실행되어 감염시킨다.


  다른 형태로는 VBS가 있다. 이것은 자바스크립트와 같은 개념으로 여기면 될 것이다. 즉 웹 브라우저에서 사용 가능한 언어이다. 이것은 원래 HTML에서 사용되기 위한 것이었지만 WSH를 통해 자체적으로도 실행될 수 있다.


  어쨌든 VB 및 VBA, VBS는 문법적으로는 많은 부분이 비슷한 것을 알 수 있다. 여기서는 다른 용도보다는 악성코드에서의 모습을 다루기로 하겠다. 난독화나 vbe 같이 암호화된 형태는 나중에 다루도록 한다.



1.1 VBS 기본 문법

  사실 이 부분은 그냥 간단히 정리한 것이므로 굳이 여기에 쓸 필요는 없지만 쓸 곳이 여기밖에 없어서 우선 이곳에 적어놓기로 한다.


- 주석 : 첫 부분에 '가 사용된다. 끝은 없고 라인으로 구분하는 듯 하다.


- function과 sub의 차이 : 참고로 시작은 function AAA () 같이 시작하고 끝은 end function 이렇게 사용한다. 이것은 sub BBB () 그리고 end sub 같이 sub도 같다. sub은 그냥 실행되는 것이지만 function은 반환 값이 존재한다. sub도 인자를 받는다는 것이 특징이다. 그리고 function은 반환하는 방법이 특이한데 정말 간단하게 "함수명 = 반환값" 식으로 한다. 아예 함수 이름에 반환값을 넣는 것이다.


- 지역 변수 및 전역 변수 : sub과 function이 존재하므로 지역 변수와 전역 변수의 차이가 있을 것이다. sub이나 function 밖에서 선언하면 전역 변수이며 내부에서 선언하면 지역 변수이다.


- 제어문 : 조건문은 "if .. then / else / end if"이다. "if .. then / elseif .. then / end if"도 있다. then은 if나 elseif인 경우에 뒤에 붙는다. 반복문은 "for .. to .. / next"이다. "for each .. in .. / next"도 있다. 그리고 "while .. / wend"도 있다. end if와 next는 끝맺음을 의미한다.



1.2 자주 사용되는 Object 및 기본 예제

  Object의 경우 WScript.Shell (WScript Object), Shell.Application (Shell Object), Scripting.FileSystemObject, msxml2.xmlhttp 등이 사용되는 것 같다. WScript.Shell의 경우 specialfolders, expandenvironmentstrings, run, createshortcut, regread, regdelete, regwrite, exec, scriptname, sleep 등이 있으며 Scripting.FileSystemObject의 경우 folderexists, opentextfile, drives, fileexists, copyfile, getfile, getfolder, deletefile, deletefolder 그리고 msxml2.xmlhttp의 경우에는 open, setrequestheader, send, responsetext 등이 자주 사용된다.

  참고로 이 외에도 Object는 아니지만 주로 난독화에 사용되는 기본 함수들을 보자면 Replace, Chr, ChrW 등과 숫자들에서는 Int, Rnd도 사용되는 것으로 보인다. 


  다음은 각각 WScript Object 및 Shell Object를 이용한 예제이다.

---- wscript.vbs -------------------------------------------------------------

dim shellObj

set shellObj = CreateObject("WScript.Shell")

shellObj.run "notepad.exe"

--------------------------------------------------------------------------


---- shell.vbs ---------------------------------------------------------------

dim shellObj

set shellObj = CreateObject("Shell.Application")

shellObj.ShellExecute "notepad.exe"

--------------------------------------------------------------------------



2. JScript

  JScript의 경우에는 따로 정리할 것이 없다. 이것 또한 Object를 이용하여 시스템을 제어하는 방식이 중요할 뿐이고 문법은 크게 의미가 없기 때문이다. 간단히 정리해서 기본 JS 인터프리터가 지원해주지 않는 기능은 ActiveX 오브젝트 즉 ActiveXObject() 또는 COM 오브젝트 즉 Wscriipt.CreateObject() 같은 외부 객체를 이용한다.


  JScript의 경우도 난독화와 암호화된 형태인 .jse는 다음에 정리하도록 한다. 다음의 예제도 위와 같이 Object를 이용한 내용만 존재하기 때문에 크게 의미는 없지만 테스트 용으로 간단히 적어본다.


---- wscript.js --------------------------------------------------------------

var shellObj = new ActiveXObject("WScript.Shell");

var runProgram = "notepad.exe";

var retVal = shellObj.run(runProgram);

--------------------------------------------------------------------------


---- wscript.js --------------------------------------------------------------

var shellObj = new ActiveXObject("Shell.Application");

var runProgram = "notepad.exe";

shellObj.ShellExecute(runProgram);

--------------------------------------------------------------------------



3. WSF

---- aaa.wsf ----------------------------------------------------------------

<package>

<job id="Test">

<script>

var shellObj = new ActiveXObject("Shell.Application");

var runProgram = "notepad.exe";

shellObj.ShellExecute(runProgram);

</script>

</job>

</package>

--------------------------------------------------------------------------



4. wsh

---- bbb.wsh ---------------------------------------------------------------

[ScriptFile]

Path=C:\Users\aaa\Desktop\aaa.wsf

[Options]

Timeout=0

DisplayLogo=1

BatchMode=0

--------------------------------------------------------------------------

  직접 실행시킬 수는 없지만 다른 스크립트를 실행시켜줄 수는 있다.



5. etc

  정확한 이유는 파악하지 못했지만 IE(Internet Explorer)에서는 JavaScript와 VBScript 모두 Shell.Application 객체를 이용한 ShellExecute() 사용이 불가능하다. 디버깅 해보면 권한이 없다고 나온다. 대신 JavaScript와 VBScript 모두 Wscript.Shell을 이용한 Run은 가능하다. 물론 활성화를 직접 해주어야 하지만 ShellExecute() 함수는 아예 불가능하다는 것이 특징이다. 그러므로 직접 JavaScript나 VBScript 형태로 두던지 아니면 hta 확장자로 만들어서 mshta.exe로 실행시키면 된다.



Posted by SanseoLab


0. 개요

  여기서는 가상 머신이나 에뮬레이터 같이 바이너리를 실행할 수 있는 메커니즘을 이용한 악성코드 분석 자동화에 대해서 정리하려고 한다. 이 개념들이 비슷한 면이 있으면서도 차이점 또한 크므로 어떻게 정리해야 할지 모르겠다. 그래서 가장 큰 분류를 자동화로 잡고 정리하기로 한다. 어떤 종류의 자료들은 그 특징에 따라 오픈 소스 및 문서화가 잘 되어 있지만 다른 어떤 종류의 자료들은 취업하지 않는 이상 아무런 자료를 찾을 수 없어보인다. 가장 먼저 개념을 설명할 것이고 이후 큰 분류부터 시작하겠다.





1. 개념

  샌드박스, 에뮬레이터, 가상 머신 이것들은 서로 대응하는 개념이 아니어서인지 굉장히 다양한 의미로 사용되는 것 같다. 사실 이렇게 정리하는 입장에서도 확신을 가질 수가 없으며 다른 사람들도 마찬가지인 것 같다. 하지만 어떻게 해서든 정리를 해보려고 한다.


  먼저 가장 넓은 개념이라고 할 수 있는 샌드박스부터 보겠다. 요즘 악성코드라던지 취약점을 이용한 APT 공격 등은 갈수록 복잡해지고 있으며 과거처럼 정적인 분석만으로는 충분치 않다. 하지만 동적 분석이라는게 사람이 하는 일인데 수 많은 바이너리들을 직접 분석하는데에는 한계가 있을 것이다. 샌드박스라는 것은 간단히 말해서 제한된 환경을 제공해 주는데 보안에서는 이 샌드박스에서 악성코드를 직접 실행시키는 방식으로 분석하는데 사용된다. 물론 실행되는 악성코드를 모니터링하는 도구들이 내부에서든 외부에서든 담겨 있어야 할 것이다.


  앞에서는 간단하게 악성코드 실행 시 처럼 실제 환경에 영향을 받지 않는 독립적인 환경을 제공한다고만 말했다. 실제로는 다양한 의미로 더 많이 사용되는 것 같지만 먼저 자세한 설명을 한 후에 언급하도록 하겠다. 


  샌드박스를 구현하는 방식을 알아보기 전에 에뮬레이터와 가상화에 대해서 설명하겠다. 에뮬레이터란 CPU 등의 하드웨어를 순수하게 소프트웨어로 구현한 방식이다. 예를들어 고전 게임들의 경우 x86 CPU에서 실행되던 것들이 아니다. 그래서 이러한 게임을 실행하기 위한 에뮬레이터가 존재하는데 이를 실행하기 위해서는 그 게임기에 맞는 가상의 CPU를 구현한 후 여기에 해당 게임을 실행시키는 방식이 사용된다. 이렇게 전혀 다른 CPU라고 하더라도 소프트웨어로 구현할 수 있기 때문에 별다른 제약이 없다. 하지만 모든 것을 소프트웨어로 구현한다면 성능적으로 많이 떨어진다. 만약 CPU 등 하드웨어를 직접 사용할 수 있다면 성능 상으로 많은 이점이 있을 것이다. 물론 CPU가 이러한 기능을 제공해야 하며 하드웨어를 직접 사용하기 때문에 같은 아키텍쳐를 가진 CPU에만 해당하는 방식일 것이다. 어쨌든 이러한 방식을 전가상화, 반가상화 등으로도 나뉘는 가상화 방식이다.


  사실 에뮬레이터든 가상화 방식이든 실제 하드웨어가 아니라 하드웨어를 흉내내어 지원하는 방식은 큰 의미로 가상 머신이라고 불린다. 물론 좁은 의미에서는 VMware, VirtualBox 같은 것들을 가상 머신이라고 부른다.


  물론 이러한 분류 외에 다른 분류도 존재한다. 말 그대로 가상 머신을 통해 운영 체제를 설치할 수 있는 환경을 제공하는 것 뿐만 아니라 단순히 하나의 프로세스만을 실행시키는 것도 있다. 즉 와인 처럼 리눅스에서 윈도우의 바이너리를 실행시킬 수 있게 해주는 도구가 그러한 예이다.


  이제 여기서 설명할 보안적인 의미에서 이것을 알아보겠다. 여기서도 앞 처럼 샌드박스를 두 종류로 나누어서 설명한다. 하나는 가상화이고 다른 하나는 에뮬레이션이다.


  에뮬레이션은 두 가지로 나뉠 수 있는데 하나는 시스템 호출 에뮬레이션(OS 에뮬레이션)이고 다른 하나는 시스템 에뮬레이션이다. 시스템 호출 에뮬레이션은 운영 체제 환경을 에뮬레이션하고 시스템 호출을 후킹해서 운영 체제에 넘기지 않고 직접 값을 반환해주는 방식이다. 시스템 에뮬레이션은 CPU나 메모리 같은 하드웨어를 가상으로 구현하고 운영체제를 설치한 후에 이것을 통해 실행시킨다. 에뮬레이터 우회 관련 문서들을 보면 안티바이러스에서 사용되는 x86 및 스크립트 용도의 에뮬레이터는 시스템 호출 에뮬레이터로 보인다.


  가상화 방식은 일반적으로 VMware 같은 가상 머신을 이용하는 방식일 것이다. 참고로 에뮬레이터와 달리 이 방식은 실제 OS에서 실행시키기 때문에 악성코드 즉 애플리케이션의 정보만을 모으는 방법은 쉽지 않을 것이다. 주로 사용되는 방식은 시스템 호출 관련 정보를 모으는 것인데 시스템 호출을 기록하는 방식은 두 가지가 있다. 하나는 현재 운영 체제에서 도구를 이용하는 방식으로서 후킹 엔진 인젝션이 그 예일 것이다. 하지만 이것은 많은 정보를 얻을 수 있더라도 악성코드가 탐지할 수 있다고 한다. 다른 하나는 하이퍼바이저를 감시하는 것이다. 가상 머신이므로 시스템 호출 시 권한 때문에 하이퍼바이저에게 통지가 가기 때문이다. 사실 이 부분은 처음 들은 데다가 실제로 사용되는 방식인지는 잘 모르겠다.





2. 실제 예시

  안티바이러스 벤더들을 비롯한 보안 업체들은 수 많은 악성코드들을 수집하고 분석해야 한다. 하지만 요즘 날마다 쏟아지는 바이너리가 한 두개가 아닐 것이므로 모든 샘플들을 사람이 일일이 분석하기는 힘들 것이다. 그렇기 때문에 어느 정도의 자동화가 필요한데 이를 위해서 회사 내에서 수집한 악성코드들을 자동으로 분석하기 위한 시스템이 존재할 것이다. 이러한 시스템은 각각의 회사 자체적으로 구축할 것이기 때문에 공개된 자료는 거의 없는 것으로 보인다. 대신 Cuckoo 샌드박스 등이 오픈 소스로 존재하여 이것을 통해 개인도 어느 정도의 자동 악성코드 분석 시스템을 구축할 수 있는 환경을 제공한다. 아마 보안 업체들도 이와 크게 다르지는 않을 것이다.


  분석에는 기본적으로 정적 분석 및 동적 분석이 필요할텐데 정적 분석이야 쉽게 처리할 수 있겠지만 분석할 바이너리들이 한 두가지가 아닐 것이므로 정적 분석을 위한 솔루션이 구축되어야 할 것이며 동적 분석은 더더욱 필요할 것이다. 다시 말해서 가상 머신 등을 기본으로 하여 앞에서도 언급했듯이 API 호출 등의 로그를 기록하기 위한 후킹 엔진 인젝션 외에도 패킷 로그를 기록하기 위한 프로그램 등 여러 보안 프로그램들이 필요할 것으로 보인다. 어쨌든 Cuckoo 샌드박스, Joe 샌드박스 등 많은 샌드박스가 있으며 이러한 샌드박스들은 보통 가상 머신을 이용하며 여러 가상 머신들을 지원한다. 꼭 이렇게 가상 머신 등 다른 제품들을 사용하는 형태가 아니더라도 회사에서 자체적으로 필요한 부분들을 구축할 것이다. 이러한 시스템은 악성코드를 분석하는데 큰 제약 조건이 없을 것으로 보인다.


  참고로 어떤 샌드박스에서는 굳이 가상 머신 환경이 아니라 실제 머신 환경을 이용하여 분석할 수 있는 기능도 존재한다고 한다. 이것은 많은 악성코드들이 가상 머신만의 특징을 이용하여 바이너리가 실행되는 환경이 가상 머신인지 탐지하고 우회하는 루틴을 가지고 있기 때문인 것으로 보인다.


  최근에는 APT로 인해서 안티 APT 솔루션들도 많이 존재한다. 이러한 제품들의 경우 APT에 대해 일반 안티바이러스 보다는 더 나은 성능을 보여주어야 한다. 그렇기 때문에 수집한 바이너리를 솔루션의 가상 머신을 이용하여 동적 행위 기반 분석을 수행할 수 있는 기능이 제공된다. 물론 APT이기 때문에 문서 파일이나 이메일 등 여러 많은 기능들이 추가되어 있겠지만 여기서는 가상 머신을 이용한 행위 기반 분석이 사용된다는 것에 중점을 두려고 한다. 참고로 FireEye의 경우에는 샌드박스를 자체적으로 제작하였다고 하는데 여러 가상 머신들을 이용하는 다른 샌드박스 제품들과 비교하는 것을 보면 에뮬레이터 보다는 가상 머신에 더 가까운 바이너리 실행 메커니즘을 구현한 것으로 보인다.


  마지막으로 안티바이러스가 있다. 성능 외에도 자원을 적게 점유하는 것 또한 중요한 안티바이러스에서 실시간 검사를 수행하는데 가상 머신까지 설치해서 동적 행위 기반 분석을 수행하기는 힘들 것이다. 앞의 자동 악성코드 분석 시스템이나 안티 APT 솔루션의 경우 개별 솔루션으로 존재하지만 안티바이러스는 사용자의 컴퓨터에서 실행되기 때문이다. 다른 문서[ http://sanseolab.tistory.com/35 ]에서도 정리했지만 HIPS 방식을 사용하지 않는 안티바이러스에서 동적 행위 기반 분석 기능을 제공할 수 있는 것은 에뮬레이터가 최선으로 보인다. 물론 에뮬레이터도 아주 간단한 형태부터 시작해서 종류가 많겠지만 아무리 성능이 좋다고 하더라도 가성 머신에서 직접 바이너리를 실행시키는 것 보다는 한계가 많을 수 밖에 없을 것이다.





4. 결론

  사실 가상 머신 우회를 정리하려던 중 제대로된 정리를 원해서 계속 찾아가다 지금까지 오게 되었다. 앞에서도 말했듯이 제대로된 자료가 거의 존재하지 않기 때문에 지금까지 정리한 내용이 맞는지도 잘 모르겠다. 원래 보안 제품들이 그런 면이 있지만 이쪽은 정말 부족한 것 같다. 물론 가상 머신 우회나 안티 에뮬레이션 같은 구체적인 자료들은 많이 존재하기 때문에 우선 이렇게만 정리한 후에 구체적인 내용들을 정리하고자 한다.





5. 참고 자료

i. Full System Emulation: Achieving Successful Automated Dynamic Analysis of Evasive Malware - Christopher Kruegel. Lastline, Inc.

Posted by SanseoLab

블로그 이미지
Malware Analyst
SanseoLab

태그목록

공지사항

Yesterday
Today
Total

달력

 « |  » 2024.5
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

최근에 올라온 글

최근에 달린 댓글

글 보관함