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

블로그 이미지
Malware Analyst
SanseoLab

태그목록

공지사항

Yesterday
Today
Total

달력

 « |  » 2024.4
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

최근에 올라온 글

최근에 달린 댓글

글 보관함