[Threat Analysis] 3·20 APT 공격 관련 부팅 장애 타입별 상세 분석
HDD 파괴 등 피해 결과는 유사, 이용된 악성코드는 각기 달라
| 2013년 3월 20일 오후 2시경, 주요 방송사들의 사내 PC들이 동시에 다운되더니 재부팅이 되지 않는 사태가 벌어졌다. 같은 시각, 일부 금융 기관에서도 직원들의 PC에서 파일이 삭제되는 현상이 나타나는 등 전산 장애가 발생했다.
분석 결과, 악성코드에 의해 부팅 관련 영역인 MBR(Master Boot Record)이 파괴된 것이었다. 그러나 하드디스크 파괴 및 부팅 장애를 유발한 악성코드의 종류와 구조, 동작 방식은 피해 기업별로 각기 달랐다. 타깃에 따라 치밀한 준비를 한 공격임을 짐작케 하는 대목이다. |
주요 방송사 및 금융 기관을 대상으로 발생한 3·20 APT 공격은 하드디스크 파괴 및 시스템 부팅 장애에 따른 전산망 마비라는 초유의 사태를 야기했다. 안랩은 사건 발생 즉시, 자사 시큐리티대응센터(AhnLab Security Emergency response Center, 이하 ASEC)를 중심으로 즉각적인 대응 체제에 돌입, 전산망 마비의 원인인 악성코드의 실체 파악에 나섰다.
ASEC 분석 결과, 3·20 APT 공격과 관련된 부팅 장애는 악성코드의 종류 및 구조 등을 기준으로 크게 4가지 타입으로 구분이 가능하다. 다음은 부팅 장애 타입별 악성코드를 상세하게 분석한 내용이다.
3·20 APT 공격의 부팅 장애 타입별 악성코드 구조도
[그림 1] 타입별 악성코드 구조도
A 타입: AgentBase.exe
A 타입에서 부팅 장애와 관련해 이용된 악성코드는 AgentBase.exe 파일로, 다음과 같은 동작을 수행한다.
1. 파일매핑 오브젝트로 동기화하여 하나의 프로세스만 실행되도록 한다.
‘JO840112-CRAS8468-11150923-PCI8273V’라는 이름의 파일매핑 오브젝트(FileMapping Object)의 존재 여부를 확인하여 단 한 개의 프로세스만 실행되도록 한다.
[그림 2] 파일매핑 오브젝트를 이용한 동기화
2. 특정 파일 존재 여부에 따라 하드디스크 파괴 여부를 결정한다.
분석 과정에서 %SystemDirectory%\TEMP\~v3.log’라는 이름의 파일 존재 여부를 확인하는 코드가 확인되었으나 해당 파일은 수집되지 않았다. 이 파일은 실제 제품에서 사용하는 파일과는 무관하다.
3. 보안 소프트웨어 Anti-Virus의 프로그램 프로세스를 강제 종료한다.
WinExeC API로 아래와 같은 Taskkill 명령을 호출하여 보안 소프트웨어 프로그램의 프로세스를 종료시킨다.
Taskkill /F /IM pasvc.exe
Taskkill /F /IM clisvc.exe
4. 윈도우 버전에 따라 각각 아래와 같은 하드디스크 파괴 스레드(Thread)를 구동한다.
■ 메이저 버전 5인 경우(Windows XP, Windows 2003 Server 등)
- 물리 디스크의 MBR(Master Boot Record)과 VBR(Volume Boot Record) 등을 쓰레기 데이터로 덮어쓴다.
- 최대 10개까지 물리 디스크(₩₩PHYSICALDRIVE0 ~ ₩₩PHYSICALDRIVE9)를 열어 각 물리 디스크의 MBR과 VBR을 ‘PRINCPES’이라는 문자열을 반복하여 덮어쓴다. 확장 파티션을 사용하고 있는 시스템의 경우, 각 파티션의 VBR까지 파괴한다([그림 3], [그림 4], [그림 5], [그림 6]).
- 쓰레기 데이터를 덮어써서 논리 드라이브를 파괴한다.
B:\부터 Z:\ 까지 모든 논리 드라이브 중에서 드라이브 타입이 DRIVE_REMOVABLE 또는 DRIVE_FIXED인 드라이브의 데이터에 ‘PRINCIPES’라는 문자열을 반복하여 덮어씀으로써 논리 드라이브를 파괴한다. 이 쓰레기 데이터는 약 5.3MB 간격으로 100KB씩 덮어쓰며, 각 논리 드라이브마다 스레드를 생성하여 파괴한다.

[그림 3] 물리 디스크 관련 명령
[그림 4] 디스크를 덮어쓰기 위한 문자열 PRINCPES 조합
[그림 5] PRINCPES 문자열로 덮어쓴 MBR 영역
[그림 6] PRINCPES 문자열로 덮어쓴 VBR 영역
■ 메이저 버전 6인 경우(Windows 7, Windows VISTA 등)
- 물리 디스크 파괴
위의 메이저 버전 5의 경우와 동일한 증상이 발생한다.
- 모든 논리 드라이브의 파일 내용을 삭제
모든 논리 드라이브의 파일 내용을 'PRINCPES’ 문자열로 반복하여 덮어써서 원본 파일 내용을 제거한 다음, 모든 파일을 DeleteFile API로 삭제하고 모든 디렉토리를 RemoveDirectoryA API로 삭제한다. D:\부터 차례대로 드라이브의 파일 시스템을 제거한 뒤, 마지막으로 C:\에서 파일 시스템을 제거한다. 그러나 C:\의 %SystemDirectory%, %ProgramData%, %ProgramFiles% 등 세 경로의 파일은 제거하지 않는다.
5. 논리 드라이브 파괴 후 시스템을 재부팅한다.
논리 드라이브 파괴를 시작한 뒤 5분이 지나면 ‘Shutdown –r –t 0’ 커맨드 라인(Command Line)을 실행하여 시스템을 재부팅한다. 그러나 앞서 하드디스크가 파괴된 상태이므로 시스템은 재부팅 되지 않는다.

[그림 7] 즉시 시스템을 재부팅하기 위해 Shutdown –r –t 0 실행
B 타입: ApcRunCmd.exe, AgentBase.exe, ~pr1.tmp
B 타입에서 부팅 장애를 유발한 악성코드는 드롭퍼인 ApcRunCmd.exe 파일과 윈도우 시스템의 하드디스크를 파괴하는 AgentBase.exe 파일, Unix 계열의 OS에서 파일 시스템을 파괴하는 ~pr1.tmp 파일 등으로 구성되어 있다. 앞서 설명한 AgentBase.exe 파일을 제외한 B 타입의 주요 파일을 살펴본다.
ApcRunCmd.exe
1. 드롭퍼인 ApcRunCmd.exe 파일은 %Temp% 폴더에 다음의 파일을 생성한다.
● AgentBase.exe: MBR을 파괴하는 파일
● alg.exe: UPX로 패킹된 형태로, SSH 명령을 사용하기 위한 PuTTY plink 프로그램
● conime.exe: UPX로 패킹된 형태로, SCP 연결을 위한 PuTTY pscp 프로그램
● ~pr1.tmp: UNIX 계열 시스템의 디스크를 파괴하는 스크립트
2. AgentBase.exe를 실행한다.
%Temp% 폴더에 ~TEMP\~v3.log 파일이 존재하지 않으면, %Temp% 폴더에 생성한 AgentBase.exe 파일을 실행하여 MBR 및 디스크를 파괴한다.
[그림 8] ~TEMP₩~v3.log 파일 존재 여부 확인
3. 원격관리 툴의 환경설정 파일 정보를 획득하여 원격접속을 실행한다.
(1) 원격접속 관리 툴 mRemote 존재 여부 확인
① 운영체제 버전에 따라 각각 다음 경로에서 환경설정 파일의 존재 여부를 확인한다.
■ 메이저 버전 5인 경우(Windows XP, Windows 2003 Server 등)
C:\Documents and settings\Administrator\Local Settings\Application Data\Felix_Deimel\mRemote\confCons.xml
■ 메이저 버전 6인 경우(Windows 7, Windows VISTA 등)
C:\Users\AppData\Local\Felix_Deimel\mRemote\confCons.xml
② 환경설정 파일이 존재할 경우 다음과 같은 문자열에 해당하는 내용을 추출한다.
③ 스레드를 생성한 후, 획득한 문자열을 조합한 다음의 명령을 실행한다.
–batch 옵션에서 SCP(Secure Copy)의 Putty 버전인 pscp를 이용해 대화형 프롬프트가 나타나지 않도록 한다. 이 상태에서 루트 계정으로 아래와 같이 ~pr1.tmp를 호스트의 /tmp/cups에 복사한다. ~pr1.tmp는 유닉스/리눅스 시스템의 디스크 파괴와 관련된 파일로, 상세한 내용은 별도로 설명한다.
[그림 9] 스레드 생성 후 명령 실행
Putty의 커맨드(Command) 버전인 plink를 –batch 옵션을 통해 대화형 프롬프트가 나타나지 않도록 한 후 루트 계정으로 호스트의 /tmp/cups에 실행권한을 주고, /tmp/cups를 실행한다.
공격자는 커맨드에서 SSH와 SCP를 이용하기 위해 드롭퍼에 plink와 pscp를 포함시킨 것으로 보인다.
(2) 원격접속 관리 툴 SecureCRT 존재 여부 확인
① 운영체제 버전에 따라 각각 다음 경로에서 환경설정 파일의 존재 여부를 확인한다.
■ 메이저 버전 5인 경우(Windows XP, Windows 2003 Server 등)
C:\Documents and settings\Administrator\Application Data\VanDyke\Config\Sessions\*.ini
■ 메이저 버전 6인 경우(Windows 7, Windows VISTA 등)
C:\Users\AppData\Roaming\VanDyke\Config\Sessions\*.ini
② 환경설정 파일이 존재할 경우 다음과 같은 문자열에 해당하는 내용을 추출한다.
③ 스레드를 생성한 후, 획득한 문자열을 조합한 다음의 명령을 실행한다.
~pr1.tmp
~pr1.tmp 파일은 Unix 계열 OS의 파일 시스템을 파괴하기 위한 BASH Shell 파일로, AIX Unix, HP Unix, Solaris, Linux 등의 시스템 대상으로 다음과 같은 공격을 수행한다.
● AIX Unix: DD 명령어를 이용해 디스크의 10MB 마다 NULL로 덮어쓴다.
● HP Unix: DD 명령어를 이용해 디스크의 8MB 마다 NULL로 덮어쓴다.
● Solaris: rm 명령어를 이용해 /kernel, /usr/adm, /etc, /home, /(Root) 폴더를 차례로 삭제한 후, DD 명령어를 이용해 디스크의 80MB 마다 NULL로 덮어쓴다.
● Linux: rm 명령어를 이용해 /kernel, /usr, /etc, /home 폴더를 차례로 삭제한다.
C 타입: kv _d[1].tmp, OthDown.exe, vmsinit.ini, mb_join[1].gif
C 타입의 부팅 장애 유발 악성코드는 드롭퍼인 kv _d[1].tmp 파일과 하드디스크 파괴를 수행하는 OthDown.exe 파일, 하드디스크 파괴 변종인 mb_join[1].gif 파일, 환경설정을 위한 vmsinit.ini 파일 등으로 구성되어 있다.
kv _d[1].tmp
1. 보안 소프트웨어를 강제 종료한다.
아래의 명령을 실행하여 사용자 몰래 보안 소프트웨어 프로그램의 프로세스를 종료시킨다.
2. 보안 소프트웨어 관련 파일을 삭제한다.
C 타입의 피해 기업이 이용 중인 보안 소프트웨어와 관련된 아래의 파일들을 삭제한다.
3. 아래와 같이 레지스트리를 설정한다.
4. 파일을 생성한다.
드롭퍼 내부에 압축 파일 형태로 존재하는 OthDown.exe와 vmsinit.ini를 아래의 경로에 생성한다.
● OthDown.exe: MBR을 파괴하는 파일
%ProgramFiles%\Hxxxx\SiteServer\vismsupdate\vms1014.zip
● vmsinit.ini: 환경설정 파일
%ProgramFiles%\Hxxxx\SiteServer\vismsupdate\update.zip
OthDown.exe
OthDown.exe는 시스템의 하드디스크를 파괴하는 파일로, A 타입의 AgentBase.exe와 동일한 기능을 수행하는 반면, [표 1]과 같은 차이를 보인다.
[표 1] A 타입와 C 타입의 하드디스크 파괴 파일 비교
vmsinit.ini
vmsinit.ini는 환경설정 파일로, 아래와 같이 vms1014.zip 파일을 다운받아 OthDown.exe를 생성한다.
mb_join[1].gif
mb_join[1].gif는 하드디스크 파괴 샘플의 또 다른 변종 파일로, 앞서 설명한 AgentBase.exe와 달리 [그림 10]과 같이 PRINCPES 문자열에 ‘I’ 대신 ‘!’ 문자를 사용하고 있다.
[표 2] 하드디스크 파괴 변종 파일의 차이점

[그림 10] 문자열 변형 PR!NCPES
D 타입: Update.exe, schsvcsc.dll, schsvcsc.exe
D 타입에서 사용된 악성코드는 드롭퍼인 Update.exe, 하드디스크 파괴와 관련된 schsvcsc.dll, 그 외 schsvcsc.exe 등으로 구성되어 있다.
[그림 11]은 D 타입의 특징적인 파일 흐름을 설명한 것이다. Update.exe가 System32 폴더에 schsvcsc.exe와 schsvcsc.dll 등 두 개의 파일을 생성하고 schsvcsc.exe를 실행하면, schsvcsc.exe는 Lsass.exe 프로세스에 schsvcsc.dll을 삽입(injection)한다. 삽입된 schsvcsc.dll은 힙(Heap)을 할당 받은 후, 자체에 인코딩되어 있는 코드를 디코딩하여 힙에 생성해 스레드로 구동한다. 이때 구동되는 스레드가 하드디스크를 파괴한다.
[그림 11] D 타입의 파일 상세 흐름도
Update.exe
1. schsvcsc.exe가 자동 실행되도록 한다.
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon 경로의 레지스트리에 셸(Shell) 값을 explorer.exe, schsvcsc.exe로 등록함으로써 schsvcsc.exe를 자동 실행한다.

[그림 12] 레지스트리 셸(Shell) 값
2. schsvcsc.exe와 schsvcsc.dll을 생성한다.
Windows System32 폴더에 schsvcsc.exe와 schsvcsc.dll이라는 이름의 파일을 생성한다. 이때, 이들 두 파일의 파일 생성 시간 정보를 Kernel32.dll의 시간 정보와 동일하게 설정한다.
3. 생성한 schsvcsc.exe를 실행한다.
앞서 생성한 schsvcsc.exe 파일을 실행한다.
4. 드롭퍼인 Update.exe는 악성코드가 동작할 수 있는 환경을 마련한 후 스스로를 삭제한다. ‘%Cmd.exe% del /q update.exe’ 명령으로 ShellExecuteA 함수를 호출해 자기 자신을 삭제하며, 이때 Cmd.exe의 경로는 ComSpec 환경 변수를 통해 확보한다.
schsvcsc.exe
1. SeDebugPrivilege 권한을 조정한다.
schsvcsc.exe는 DLL 인젝션을 하기 위해 SeDebugPrivilege 권한을 조정한다.
2. Lsass.exe에 schsvcsc.dll 모듈을 인젝션한다.
Lsass.exe 프로세스를 찾아 schsvcsc.dll 모듈을 인젝션한다. 인젝션 방법은 메모리를 할당하여 schsvcsc.dll이라는 문자열을 쓰고, 이 문자열을 인자로 하여 LoadLibraryW API를 시작 주소로 설정해 CreateRemoteThread를 호출하는 방식을 이용했다.ㅏ
schsvcsc.dll
1. 자체에 인코딩되어 있는 하드디스크 파괴 코드를 디코딩한다.
인코딩(XOR 0x55) 되어 있는 하드디스크 파괴 코드를 디코딩하여 코드 사이즈만큼 할당 받은 메모리에 코드를 쓴다. 이 코드는 RVA 0xAC50부터 0x1171까지 위치한다.
2. 특정 날짜와 시간이 지나면 실행된다.
GetLocalTime API를 이용하여 현재 시간을 확인한 후, 특정 날짜와 시각이 지나면 무조건 실행된다.
3. 하드디스크 파괴 모듈이 스레드로 동작한다.
3월 20일 15시 1분이 되면 디코딩 된 하드디스크 파괴 모듈이 스레드로 동작한다. 하드디스크 파괴 기능이라는 점에서 schsvcsc.dll은 앞서 설명한 mb_join[1].gif 파일과 유사하지만, [표 3]과 같은 차이를 보인다.
[표 3] C 타입와 D 타입의 하드디스크 파괴 파일 비교
3·20 APT 공격으로 MBR 파괴, 부팅 장애 등의 피해 결과가 나타난 가운데, 피해 기업별로 악성코드의 구조 및 종류, 동작 방식 등에 차이가 확인됐다. 각 기업 내부의 인프라에 맞춰 각기 다른 시스템과 악성 파일을 이용했다는 것으로 해석할 수 있다. 이 점이 금번 3·20 APT 공격의 가장 큰 특징이다
한편 안랩은 침해사고가 발생한 3월 20일 저녁 6시 40분부터 해당 악성코드의 진단 및 치료가 가능한 전용백신을 제공하고, V3 제품군에 최신 업데이트 엔진을 적용했다. 그러나 3월 24일 불특정 다수, 즉 일반인까지 대상으로 한 변종이 발견되었으며, 추가 공격이 우려되는 만큼 백신을 최신 업데이트 상태로 유지하는 등 정보 자산 보호를 위해 주의가 요구된다.@
- AhnLabASEC 대응팀