상세 컨텐츠

본문 제목

Cobalt Strike 동작 구조와 기능 살펴보기

악성코드 분석 리포트

by Hexer 2022. 3. 11. 15:04

본문

 

1. 개요

Cobalt Strike는 모의 해킹 침투 테스트를 위한 상용 도구이다. 하지만 2020년 말, GitHub에 Cobalt Strike 4.0 버전의 소스 코드가 유출되면서 실제 공격그룹들 사이에서도 활발히 사용되고 있다. 본 글에서는 Cobalt Strike의 대략적인 동작 구조와 기능에 대해서 살펴볼 것이다.

 

2. Cobalt Strike 동작 구조

Cobalt Strike는 Server, Client, Beacon의 3가지 Component로 구성되며, 각 Component의 역할과 기능은 아래와 같다.

 

2.1 Server

Team Server 라고도 불리며, Listener 모듈을 기반으로 Beacon(Cobalt Strike Payload)과의 통신을

수행하는 역할을 한다. [서버 IP] / [인증 패스워드] / [설정 파일] 등을 인자로 받아 구동되며, 공격자는 이러한 Server를 구동 시킨 후 Client를 이용하여 접속하게 된다.

[그림 1] Team Server 실행 화면

 

2.2 Client

Team Server에 접속하여 기능을 사용하기 위한 직접적인 UI를 제공해주는 역할을 한다. 권한 상승, 윈도우 크리덴셜 추출, 원격 셸, Lateral Movement 등 다양한 기능을 지원한다.

[그림 2] Client UI

 

2.3 Beacon

Cobalt Strike Payload의 별칭이며, 타겟 PC에서 실행되어 Server에서 전달받은 명령을 수행한다.

Beacon은 통신 방식에 따라 HTTP, HTTPS, TCP, DNS, SMB 등 여러 종류의 Beacon이 존재하며, Cobalt Strike는 이러한 Beacon 유포를 위해 다양한 유형의 기능을 제공하고 있다. 다음 3장에서는 이러한 기능들에 대해서 살펴볼 것이다.



3. Beacon 유포 방식에 따른 기능 분석

Cobalt Strike는 Beacon 유포를 위해 대표적으로 HTA, 문서 매크로, 스크립트 생성 기능을 제공한다. 이번 장에서는 이러한 기능들에 대해서 살펴볼 것이다.

 

3.1 HTA 생성 기능

Beacon을 유포하기 위한 HTA 파일을 생성해주는 기능이다. HTA 파일은 기본적으로 VBScript로 작성되며, Beacon을 exe파일 형태로 드롭하여 실행시키는 방식PowerShell 메모리 상에서 동작시키는 방식이 있다.

[그림 3] HTA 파일 생성 기능

 

1) exe 파일 드롭 방식

HTA 파일 내부 var_shellcode 변수에 exe 코드가 담겨 있으며, 이를 %TEMP%\evil.exe 파일로 드롭하여 실행시키는 방식이다.

[그림 4] HTA 파일 내 VBScript

 

2) PowerShell 메모리 상에서 동작시키는 방식

HTA 파일 내 PowerShell 스크립트를 통해 C2 서버에서 Beacon을 다운로드 받아 PowerShell 메모리 상에서 동작시키는 방식이다. 대략적인 동작 과정은 아래와 같다.

 

HTA 파일 내에는 인코딩 된 PowerShell 스크립트가 존재하며, 디코딩 시 [그림 5]의 아래 그림과 같은 스크립트를 확인할 수 있다. 해당 PowerShell 스크립트는 내부 base64 인코딩 된 쉘코드를 디코딩 후 XOR 연산(Key : 35)을 거쳐 PowerShell 메모리 상에서 동작시키는 기능을 수행한다.

[그림 5] HTA 파일 내 PowerShell 스크립트

 

[그림 5]의 PowerShell 스크립트에 의해 쉘코드가 동작하면 C2 서버에서 암호화된 Beacon을 다운로드 받아 XOR 연산을 거쳐 메모리 상에서 실행시킨다. 아래는 다운로드 받은 암호화된 Beacon을 XOR 연산을 통해 복호화 하는 루틴이다.

 
[그림 6] XOR 연산을 통한 복호화 루틴

 

[그림 7] Beacon 복호화
 

 

복호화 된 Beacon은 DLL 포맷이며, 최종적으로 PowerShell 메모리 영역에 로드되어 동작한다.

 

 

3.2 문서 매크로 생성 기능

MS Office Word 혹은 Excel 파일에 사용할 문서 매크로를 만들어주는 기능이다.

 
[그림 8] 문서 매크로 생성 기능

 

문서 매크로는 rundll32.exe 프로세스를 생성 후 쉘코드를 삽입하여 실행시키는 방식으로 동작한다. 실행되는 쉘코드는 [그림 6~7]에서 살펴보았던 쉘코드와 기능적으로 동일하며, C2 서버에서 암호화된 DLL Beacon을 다운로드 받아 XOR 연산을 거쳐 메모리 상에서 실행한다.

※ 문서 매크로는 공격자가 커스텀 할 수 있으므로 쉘코드 삽입 대상 프로세스는 바뀔 수 있음 

[그림 9] 생성된 문서 매크로

 

3.3 스크립트 생성 기능

 웹을 통한 Beacon 유포를 위해 one-line 스크립트를 생성해주는 기능이다.

[그림 10] 스크립트 생성 기능
 

 

해당 기능은 생성할 스크립트 유형에 따라 대표적으로 bitsadmin, exe, powershell 등 3가지 방식을 지원하며, C2서버에 해당 유형에 맞는 파일이 등록된 후 이를 다운로드하는 스크립트를 생성해준다. 3가지 유형은 아래와 같다.

 

1) bitsadmin

BITS (Background Intelligent Transfer Service)란, 기기 간에 파일 전송을 위한 윈도우의 통신 프로토콜로써, 대표적으로 윈도우 업데이트에서 사용되고 있다. 공격자는 타겟 PC에서 수집한 정보를 C2 서버로 전송하거나 추가 악성코드를 다운로드하기 위해 이러한 BITS를 이용하기도 한다.

bitsadmin은 이러한 BITS를 이용하여 C2서버에서 exe Beacon을 다운로드 후 실행하는 방식이며, 아래 예시와 같은 스크립트를 생성해준다.

[표 1] 스크립트 예시 (bitsadmin)

 

2) powershell

C2서버에 등록된 PowerShell 스크립트를 내려 받아 실행시키는 방식이다. 해당 기능을 이용하면 C2서버에 PowerShell 스크립트가 등록되며, 이를 내려 받아 실행하는 PowerShell 스크립트를 생성해준다. 

[표 2] 스크립트 예시 (powershell)

 

생성되는 PowerShell 스크립트 예시는 [표 2]와 같으며, C2 서버인 http://192.168.108.128:80/a 경로에는 아래와 같은 PowerShell 스크립트가 생성된다.

C2서버에 생성된 PowerShell 스크립트는 내부에 Gzip + Base64 인코딩 된 PowerShell 스크립트를 포함하고 있으며, 이를 디코딩 및 압축 해제하여 확인해보면 [그림 5]의 디코딩 된 스크립트와 같은 기능의 스크립트를 확인할 수 있다. 이후 동작 또한 동일하여 추가 분석은 생략하도록 하겠다.

[그림 11] C2 서버에 생성된 PowerShell 스크립트

 

3) exe

C2서버에 exe Beacon을 등록 후 이에 대한 다운로드 URL을 생성해주는 방식이다.

[표 3] 스크립트 예시 (exe)

이상으로 Beacon 유포 방식에 따른 3가지 유형(HTA, 문서 매크로, 스크립트)에 대해 살펴보았다. 다음 장에서는 Beacon Type에 대해 살펴보도록 하겠다.

 

4. Beacon Type

Cobalt Strike Beacon은 통신 방식에 따라 대표적으로 HTTP Beacon, HTTPS Beacon, TCP Beacon, DNS Beacon, SMB Beacon 등으로 나뉘며, profile을 통해 추가적인 Beacon 커스텀이 가능하다.

이번 장에서는 각 Beacon들의 특징에 대해 살펴보고, CobaltStrike 파싱 도구인 CobaltStrike Parser를 사용해 볼 것이다. 실습에 사용된 PC의 IP 정보는 아래와 같다.

※ Parent Beacon : Lateral Movement를 수행하기 전 거점이 된 PC에 설치된 Beacon

[표 4] 실습 PC IP 정보

 

4.1 HTTP/HTTPS Beacon

HTTP Beacon은 HTTP 프로토콜을 사용하여 C2와 통신하며, profile 설정 없이 기본값으로 생성된 Beacon은 아래와 같은 패킷을 확인할 수 있다.

 

아래 그림과 같이 profile 설정이 가능하다. URL과 Host 등의 Header 정보 변조뿐만 아니라 정상 패킷으로 위장하기 위한 임의의 데이터를 송수신 데이터 사이에 삽입할 수 있으며, 송수신 명령에 대한 인코딩과 암호화를 지원한다.

[그림 12] HTTP Beacon 설정 예시 (profile)

 

[그림 12]의 설정을 기반으로 생성한 HTTP Beacon을 실행하면 아래와 같은 패킷을 확인할 수 있다.

IP는 C2 IP이지만, 헤더가 변조되어 정상 사이트의 자바스크립트로 위장하고 있으며, 타겟 PC의 메타데이터(암호화+인코딩)가 쿠키를 통해 전달된다. 수신한 자바스크립트는 악성 행위를 수행하는 스크립트가 아닌, 위장을 위한 스크립트이며, 내부에 실제 C2 서버에서 전달받은 명령(암호화+인코딩)이 존재한다.


※ 인코딩 방식, 메타데이터 전달방식, HTTP Header, 위장을 위한 Fake 데이터 등은 필요에 따라 profile 수정을 통해 커스텀 가능

[그림 13] HTTP Beacon 패킷

 

아래 그림은 HTTP Beacon을 추출하여 CobaltStrikeParser 도구를 이용해 파싱해 본 것이다. Beacon Type, C2 URL, 인코딩 방식 등 Beacon 설정 정보들을 확인할 수 있다.

[그림 14] HTTP Beacon 파싱 결과

 

HTTPS Beacon은 HTTPS 프로토콜을 사용하여 암호화 통신을 하며, 마찬가지로 CobaltStrike Parser 도구를 이용해 파싱하여 Beacon 설정 정보를 확인할 수 있다.

 

 

4.2 TCP Beacon

TCP Beacon은 SMB Beacon과 더불어 주로 Lateral Movement 시 사용되는 Beacon이며, Parent Beacon이 설치된 거점을 거쳐 타겟 PC에 설치된다. 이후 Parent Beacon과 TCP 프로토콜 통신을 통해 공격자의 명령을 받아 동작한다.

 

먼저, Lateral Movement를 위해 Cobaltstrike에서 지원하는 psexec 기능을 사용해보도록 하겠다.  

psexec는 SMB 프로토콜을 이용하여 타겟 PC의 ADMIN$ 공유를 통해 Beacon Loader 파일을 전송하고 실행해주는 기능이다. 아래 그림은 psexec 기능을 사용했을 때 확인되는 패킷이다.

[그림 15] psexec를 이용한 Beacon Loader 설치 (Lateral Movement)

 

타겟 PC에서 Beacon Loader 파일이 실행되면 아래 그림과 같이 정상 프로그램인 rundll32.exe를 실행 후 TCP Beacon을 인젝션 한다. 이후 rundll32.exe 프로세스는 TCP 특정 포트를 열고 Parent Beacon으로부터 명령을 전달받아 동작한다. 

※ 인젝션 대상 프로세스, 포트 번호 등은 profile 설정을 통해 커스텀 가능

[그림 16] rundll32.exe 프로세스에 인젝션 되어 동작 중인 TCP Beacon

 

TCP Beacon이 인젝션 된 프로세스(rundll32.exe)의 메모리 덤프 파일을 CobaltStrikeParser 도구를 사용하여 파싱한 결과는 아래와 같다. 

[그림 17] TCP Beacon 파싱 결과

 

 

4.3 SMB Beacon

SMB Beacon은 TCP Beacon과 더불어 주로 내부 전파를 위한 Lateral Movement에 사용되는 Beacon이다. 내부 전파 방식은 대표적으로 psexec를 이용한 방식이 있으며, 이는 [4.2 TCP Beacon]에서 설명한 바와 동일하므로 해당 과정에 대한 설명은 생략하도록 하겠다.

 

psexec를 통해 타겟 PC에서 Beacon Loader가 실행되면 rundll32.exe 프로세스를 생성하여 SMB Beacon을 인젝션 한다. 이후 rundll32.exe 프로세스는 SMB 프로토콜을 통해 Parent Beacon으로부터 명령을 전달받아 동작한다.

※ 인젝션 대상 프로세스, pipe name 등은 profile 설정을 통해 커스텀 가능

[그림 18] Beacon Loader에 의해 생성된 rundll32.exe

 

[그림 19]는 SMB 프로토콜 패킷을 캡쳐한 것이다. 빨간색 네모칸의 450fdbf.exe는 타겟 PC의 ADMIN$ 공유로 전송하여 실행된 Beacon Loader이며, mojo.5688.8052.183894939787088877ef는 SMB Beacon과 Parent Beacon 간 통신을 위해 사용될 pipe name이다.

[그림 19] SMB Beacon 패킷

 

CobaltStrikeParser 도구를 사용하여 SMB Beacon을 파싱한 결과는 아래와 같다.

[그림 20] SMB Beacon 파싱 결과

 

4.4 DNS Beacon

DNS Beacon은 DNS 패킷의 TXT 레코드, AAAA 레코드 등을 통해 명령을 전달하고, query Message를 통해 결과를 수신한다. 이러한 기법을 DNS Tunneling이라고도하며, 보안장비 우회를 목적으로 데이터를 인코딩/암호화한 뒤 DNS 패킷에 숨기는 것이다.

아래 그림은 DNS Beacon 통신 패킷의 일부이며, 인코딩 된 명령이 TXT 레코드에 삽입되어 전송되는 것을 확인할 수 있다.

[그림 21] DNS Beacon 패킷 (출처 : https://www.youtube.com/watch?v=zAB5G-QOyx8)

 

 

CobaltStrikeParser 도구를 사용하여 DNS Beacon을 파싱한 결과는 아래와 같다.

[그림 22] DNS Beacon 파싱 결과

 

5. 침해사고분석 관점에서 본 Cobalt Strike

지금까지 실제 공격그룹 사이에서도 널리 사용되는 Cobalt Strike 침투 테스팅 도구에 대해 알아보았다. 이제 본 글에서 알아본 사실을 토대로 네트워크 영역에서 시그니처를 통한 탐지가 가능할 것인지 대해 알아보도록 하겠다.

 

5.1 네트워크 영역에서 시그니처를 통한 탐지가 가능한가

기본적으로 Cobalt Strike는 Beacon 커스텀이 가능하기 때문에 C2 통신 패킷을 얼마든지 조작할 수 있다. URL, Host, 송수신 데이터의 전달 방식과 인코딩 방식 등을 커스텀 할 수 있고, 송수신 데이터 사이에 Fake 데이터를 삽입할 수도 있으므로 정상 패킷과 구분하기 쉽지 않다.

때문에 네트워크 시그니처를 기반으로 탐지를 하고자 한다면 결국 커스텀 되지 않은 Default 설정으로 설정된 Beacon을 대상으로 해야 할 것이다. 그럼 Default 설정으로 생성된 HTTP Beacon의 패킷을 확인해보겠다.

 

아래 그림은 커스텀하지 않은 HTTP Beacon의 최초 통신 패킷이다. 해당 패킷은 타겟 PC의 메타데이터 정보(컴퓨터 이름, 사용자 이름, IP, ID 등)를 쿠키를 통해 C2 서버로 전송하는 패킷이다.  물론 전송되는 메타데이터 정보는 암호화와 Base64 Encoding이 적용된 것이다. 굳이 특징을 잡자면 특정 URL 경로(/g.pixel)로 Base64 Encoding된 쿠키 값을 전송한다는 것인데 이 두가지 정보만으로 시그니처를 잡기에는 오탐의 가능성이 클 것이라 판단된다.

[그림 23] HTTP Beacon의 최초 통신 패킷 (Default 설정)

 

참고로 기본 값으로 설정된 HTTP Beacon의 최초 통신 URL 경로 리스트는 아래 표와 같다.

아래 리스트 중 랜덤으로 하나 선택하여 최초 통신 URL 경로로 사용하는 것이다.

[표 5] HTTP Beacon 최초 통신 URL 경로 리스트 (Default 설정)

 

그렇다면 이제 명령 수행 결과를 전송할 때의 패킷을 살펴보겠다. 아래 그림과 같이 특정 URL 경로로 암호화 된 데이터를 전송하는 것을 확인할 수 있다. URL 경로의 형태는 아래와 같다.

/submit.php?id=[타겟 PC 구분을 위한 고유 ID 값]

마찬가지로 해당 패킷에서도 시그니처로 잡을 만한 정보는 확인되지 않았다. 위와 같은 URL 경로 패턴만을 시그니처로 잡기에는 역시 오탐의 가능성이 클 것이다.

결론적으로, 네트워크 시그니처를 통한 탐지는 사실상 힘들 것이라 판단된다.

[그림 24] HTTP Beacon의 명령 수행 결과 전송 패킷 (Default 설정)

 

 

보안관제센터 MIR Team

관련글 더보기

댓글 영역