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 : 텍스트 단말기
[그림 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)
악성코드가 남긴 흔적 제거
이 악성코드는 모든 동작을 끝낸 다음 스스로를 삭제하는 기능을 가지고 있진 않지만, /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월호에서도 확인하실 수 있습니다.
아이폰 분실 사용자 겨냥한 맞춤형 피싱 주의보 (15) | 2016.12.15 |
---|---|
단 하나의 이미지로 수 백만대 PC를 해킹하는 법 – 레시피: 픽셀, 광고 및 익스플로잇 키트 (2) | 2016.12.09 |
[악성코드 분석리포트] "히틀러" 랜섬웨어 (0) | 2016.10.07 |
MS 스토어에서 보낸 메일로 위장한 DOC 매크로 공격 발견, 사용자 주의! (2) | 2016.09.20 |
영화 ‘부산행’ 위장한 악성 토렌트 파일 유포… 추석 연휴 불법 자료 다운로드 주의 (1) | 2016.09.12 |
댓글 영역