상세 컨텐츠

본문 제목

[악성코드 분석리포트] Trojan.Agent.Ripper

악성코드 분석 리포트

by 알약(Alyac) 2016. 11. 9. 15:01

본문

Trojan.Agent.Ripper


지난 2016년 7월, 대만 특정 지역의 대만제일은행 20여개 지점 내 41개 ATM기기가 해커의 공격을 받아 8327만 대만 달러의 피해가 발생했습니다. 현재 해당 사건은 해결이 된 상태로, 범인 검거 및 피해금액 환수를 대부분 마쳤습니다. 공격의 대상이 된 ATM기기는 XFS구조를 기반으로 한 기기로 관리가 상대적으로 미흡한 낙후된 기기였음이 드러났습니다.


XFS(eXtensions for Financial Services)는 90년대 초반 CD/ATM에 Microsoft windows 운영체제가 도입된 이후 금융기관, Microsoft, CD/ATM 제조사들에 의해 표준으로 개발 및 지정되었습니다. 따라서 일반적인 Windows 운영체제에서 사용되는 시스템이 아닌, 결제 시스템과 전자 금융 전송 서비스를 주 목적으로 하는 기기에서 사용되는 시스템입니다.


[그림 1] XFS 시스템 구조


그림 1과 같이 윈도우 어플리케이션으로 XFS API(WFS류 함수)를 사용하여 XFS Manager에 접근하게 되며, XFS Manager는 XFS SPI(WFP류 함수)를 사용하여 각 CD/ATM벤더의 Service Provider를 제어하게 됩니다. 이에 따라 Service Provider는 CD/ATM기기를 작동시킵니다.


Ripper 악성코드가 XFS를 이용하여 수행한 공격의 흐름도는 아래와 같습니다.


[그림 2] Ripper 흐름도


악성파일 분석


악성코드의 주요 동작


해당 악성코드는 주요 동작을 수행하기에 앞서 WM_XFS_STOP 메시지를 시스템에 전파합니다. 이는 이미 윈도우 메시지 프로시저 기반으로 실행중인 악성코드가 있다면 종료시키기 위함입니다.


[그림 3] WM_XFS_STOP이라는 메시지를 따로 정의한 뒤 브로드캐스트 하는 모습


[그림 4] WM_XFS_STOP이 전달됐을 때 종료되는 코드 (윈도우 메시지 프로시저 코드의 일부)


본 악성코드는 한 개의 악성 바이너리 파일 안에 악성코드의 설치, 제거, 시작 및 중지 등의 기능을 모두 포함하고 있습니다. 커맨드라인에 전달하는 인자에 따라서 각각 다른 동작을 수행하게 되며, 그 내용은 다음과 같습니다.


커맨드라인 형식 : [악성 실행파일] [주요 동작] [하위 동작]


주요 동작

하위 동작 

내용

 /autorun

 

10분동안 Sleep상태로 들어가서 작동을 일시 중지한다.

 /uninstall

 

HKML\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

위 두 경로에 NCRPRS, DBackup, FWLoadPm 레지스트리 값을 삭제한다.

/stop

 

[NCRPRS.exe] [DBackup.exe] [FwLoadPm.exe] 프로세스가 존재하는지 확인하고 존재할 경우 악성코드 파일 이름을 존재하는 해당 벤더의 실행 파일 이름으로 변경하고 레지스트리의 Run에 등록시킨다.

/cleanup 

 

현재 실행중인 악성코드들을 모두 종료시킨다. 동작 중인 악성코드는 윈도우 메시지 프로시저를 기반으로 작동하는데, 메시지 프로시저에는 WM_XFS_STOP이라는 악성코드가 미리 정의해 둔 메시지를 받으면 종료되게끔 구현되어 있다.

service 

install

악성코드에서 생성한 로그 파일 및 기타 흔적을 모두 삭제한다.

remove 

DBackup Service라는 이름으로 서비스를 생성한다.

start 

악성코드가 생성한 DBackup Service를 삭제한다.

stop 

악성코드가 생성한 DBackup Service를 중지한다.


악성코드의 설치


/install 인자가 커맨드라인에 전달되면 악성코드의 설치가 수행됩니다. install 인자가 전달되면서 악성코드가 실행되면 아래와 같이 ATM 프로그램이 구동 중인 지를 먼저 파악합니다. 여러 프로그램을 타깃으로 하는 것으로 보아, 이 악성코드는 3가지 종류의 ATM 프로그램을 염두에 두고 만들어진 것으로 보입니다.


[그림 5] 여러 벤더의 ATM프로그램의 실행 여부를 검색하는 모습


현재 구동중인 프로그램 판별을 완료한 후에는, 그 종류에 따라 레지스트리 시작 항목에 적절한 눈속임을 위한 가짜 이름으로 등록을 수행합니다. 아래는 그에 해당하는 코드의 일부입니다. 아래의 코드가 실행되고 나면 ATM 기기가 재시작 될 때마다 악성코드도 실행됩니다.


[그림 6] 레지스트리 시작 항목에 값을 설정하는 코드


ATM의 Cash Dispense Module(CDM)에 접근


ATM기기는 여러 가지 구성 요소로 나뉘어져 있습니다. 크게 다음과 같이 구분될 수 있습니다.


- CAM : 카메라

- CDM : 현금 자동 지급기

- CHK : 수표 판독기

- DEP : 저장소

- IDC : ID 카드 판독기

- PIN : PIN 패드

- PTR : 프린터

- SIU : 센서

- TTU : 텍스트 단말기


본 악성코드 제작자는 위 구성요소들 중 현금 인출과 직접적으로 관련된 CDM 기능을 노렸습니다. 아래는 CDM으로부터 각종 정보를 얻어오는 코드의 일부입니다.


[그림 7] 레지스트리 시작 항목에 값을 설정하는 코드


위 코드를 살펴보면 Category별로 다른 동작을 수행하고 있음을 확인할 수 있는데, 각각이 어떤 동작을 수행하는지 간단히 살펴보면 다음과 같습니다.


동작

설명

WFS_INF_CDM_STATUS

현재 CDM의 상태 정보를 얻어올 수 있다. 동작 중인지 여부, Dispenser 내부에 현금이 충분한지 등을 의미한다.

WFS_INF_CDM_CAPABILITIES

한번에 뽑을 수 있는 현금 최대 양, 입출금 셔터 제어 등의 정보를 얻어올 수 있다.

WFS_INF_CDM_CASH_UNIT_INFO

이용 가능한 화폐 단위가 어떤 것들이 있는지 얻어올 수 있다. 우리나라 화폐 단위로 예를 들면 1천원권, 5천원권, 1만원권 등을 의미한다.


공격자는 위 3가지 커맨드를 이용해 CDM정보를 얻어온 다음, 이를 기반으로 현금 출금 작업을 수행합니다. 아래는 얻어온 정보를 기반으로 현금 출금을 수행하는 코드의 일부를 나타낸 것입니다.


[그림 8] 현금 출금 기능을 포함하는 상위 코드의 일부


위 코드에서 문자열을 살펴보면 “Dispensing %d items from cash unit #%d” 라고 되어 있는 것을 확인할 수 있습니다.


이는 “화폐 몇 원권 몇 장을 출금한다”는 의미입니다. 코드 아래쪽에는 ExecuteDispensing 함수가 존재하는데, 해당 함수 내부에서는 아래와 같이 WFSExecute를 실행하면서 돈을 출금하는 명령을 전달함을 확인할 수 있습니다. (WFS_CMD_CDM_DISPENSE)


[그림 9] 현금 출금 기능을 수행하는 직접적인 코드


악성코드가 남긴 흔적 제거


이 악성코드는 모든 동작을 끝낸 다음 스스로를 삭제하는 기능을 가지고 있진 않지만, /cleanup 인자가 전달되면 자기 자신을 포함해서 악성코드가 동작하면서 생성한 로그 및 흔적들을 모두 삭제하는 기능을 가지고 있습니다. 아래 그림은 그에 대한 코드의 일부분입니다.


[그림 10] Cleanup 동작을 수행하는 코드의 일부


taskkill을 이용하여 ATM관련 프로세스들을 모두 종료시킵니다. 그 후, Sysinternals의 Secure Delete 툴을 임시 폴더에 sd.exe라는 이름으로 드랍하여 추가적인 명령들을 실행시킵니다. 그림10은 악성코드가 Cleanup작업을 수행할 때 내부적으로 수행하는 명령을 나타낸 것입니다.


taskkill /IM aptra* /T /F

taskkill /IM ncr* /T /F

taskkill /IM java.exe /T /F

taskkill /IM wrapper.exe /T /F

taskkill /IM aiw.exe /T /F

taskkill /IM *came* /T /F

taskkill /IM snmp.exe /T /F

taskkill /IM *gbr* /T /F

taskkill /IM ul*.exe /T /F


sd.exe -accepteula -p 8 -a -q -s d:\\*

sd.exe -accepteula -p 8 -a -q -s e:\\*

sd.exe -accepteula -p 8 -a -q -s f:\\*

sd.exe -accepteula -p 8 -a -q -s g:\\*

sd.exe -accepteula -p 8 -a -q -s h:\\*

sd.exe -accepteula -p 8 -a -q -s c:\\*.log

sd.exe -accepteula -p 8 -a -q -s c:\\*.jrn

sd.exe -accepteula -p 8 -a -q -s c:\\*.trc

sd.exe -accepteula -p 8 -a -q -s c:\\*.xml

sd.exe -accepteula -p 8 -a -q -s c:\\*.zip

sd.exe -accepteula -p 8 -a -q -s c:\\*.bak

sd.exe -accepteula -p 8 -a -q -s c:\\*.err

sd.exe -accepteula -p 8 -a -q -s c:\\*.idb

sd.exe -accepteula -p 8 -a -q -s c:\\*.idx

sd.exe -accepteula -p 8 -a -q -s c:\\*.dat

sd.exe -accepteula -p 8 -a -q -s c:\\*.gsb

sd.exe -accepteula -p 8 -a -q -s c:\\*.txc

sd.exe -accepteula -p 8 -a -q -s c:\\*



결론


이 악성코드는 매우 치밀하게 제작된 것으로 보입니다. 코드를 살펴본 결과, XFS함수의 기능과 구조체 및 전달 인자 등을 명확하게 파악하고 작성된 것을 알 수 있었습니다. 공격자는 특정 금융권을 노리고 해당 금융권에서는 어떠한 ATM 프로그램을 사용하는지, 노후화는 되었는지 여부를 모두 사전 조사하여 악성코드를 제작한 것으로 추정됩니다.


이 악성코드는 ATM을 감염에 성공하더라도 사용자 정보를 직접적으로 노리지 않습니다. XFS 라이브러리를 이용하여 ATM의 행위를 직접 제어해서 돈을 인출할 수 있으므로 사용자의 정보를 노릴 필요가 없기 때문일 것입니다. 일부 ATM프로그램들이 XFS라는 공통 라이브러리를 이용해서 구현되어 있는 점은 공격자 입장에서는 동시에 여러 대상을 노릴 수 있기 때문에 취약점이 될 수 있습니다.


ATM은 제한적 용도의 환경이기 때문에 화이트리스트를 기반으로 한 실행환경을 갖춰지면 대부분의 악성 프로그램의 실행을 차단할 수 있습니다. 또한 사람이 직접 ATM기기에 접근하여 물리적인 방법으로 ATM을 손괴하여 악성 프로그램을 설치하는 등의 공격을 시도할 수도 있기 때문에, 사이버 보안뿐 만이 아니라 물리적 보안도 신경 써야 할 부분입니다.


※ 관련 내용은 알약 보안동향보고서 10월호에서도 확인하실 수 있습니다. 

관련글 더보기

댓글 영역