Cobalt Strike는 모의 해킹 침투 테스트를 위한 상용 도구이다. 하지만 2020년 말, GitHub에 Cobalt Strike 4.0 버전의 소스 코드가 유출되면서 실제 공격그룹들 사이에서도 활발히 사용되고 있다. 본 글에서는 Cobalt Strike의 대략적인 동작 구조와 기능에 대해서 살펴볼 것이다.
Cobalt Strike는 Server, Client, Beacon의 3가지 Component로 구성되며, 각 Component의 역할과 기능은 아래와 같다.
Team Server 라고도 불리며, Listener 모듈을 기반으로 Beacon(Cobalt Strike Payload)과의 통신을
수행하는 역할을 한다. [서버 IP] / [인증 패스워드] / [설정 파일] 등을 인자로 받아 구동되며, 공격자는 이러한 Server를 구동 시킨 후 Client를 이용하여 접속하게 된다.
Team Server에 접속하여 기능을 사용하기 위한 직접적인 UI를 제공해주는 역할을 한다. 권한 상승, 윈도우 크리덴셜 추출, 원격 셸, Lateral Movement 등 다양한 기능을 지원한다.
Cobalt Strike Payload의 별칭이며, 타겟 PC에서 실행되어 Server에서 전달받은 명령을 수행한다.
Beacon은 통신 방식에 따라 HTTP, HTTPS, TCP, DNS, SMB 등 여러 종류의 Beacon이 존재하며, Cobalt Strike는 이러한 Beacon 유포를 위해 다양한 유형의 기능을 제공하고 있다. 다음 3장에서는 이러한 기능들에 대해서 살펴볼 것이다.
Cobalt Strike는 Beacon 유포를 위해 대표적으로 HTA, 문서 매크로, 스크립트 생성 기능을 제공한다. 이번 장에서는 이러한 기능들에 대해서 살펴볼 것이다.
Beacon을 유포하기 위한 HTA 파일을 생성해주는 기능이다. HTA 파일은 기본적으로 VBScript로 작성되며, Beacon을 exe파일 형태로 드롭하여 실행시키는 방식과 PowerShell 메모리 상에서 동작시키는 방식이 있다.
HTA 파일 내부 var_shellcode 변수에 exe 코드가 담겨 있으며, 이를 %TEMP%\evil.exe 파일로 드롭하여 실행시키는 방식이다.
HTA 파일 내 PowerShell 스크립트를 통해 C2 서버에서 Beacon을 다운로드 받아 PowerShell 메모리 상에서 동작시키는 방식이다. 대략적인 동작 과정은 아래와 같다.
HTA 파일 내에는 인코딩 된 PowerShell 스크립트가 존재하며, 디코딩 시 [그림 5]의 아래 그림과 같은 스크립트를 확인할 수 있다. 해당 PowerShell 스크립트는 내부 base64 인코딩 된 쉘코드를 디코딩 후 XOR 연산(Key : 35)을 거쳐 PowerShell 메모리 상에서 동작시키는 기능을 수행한다.
[그림 5]의 PowerShell 스크립트에 의해 쉘코드가 동작하면 C2 서버에서 암호화된 Beacon을 다운로드 받아 XOR 연산을 거쳐 메모리 상에서 실행시킨다. 아래는 다운로드 받은 암호화된 Beacon을 XOR 연산을 통해 복호화 하는 루틴이다.
복호화 된 Beacon은 DLL 포맷이며, 최종적으로 PowerShell 메모리 영역에 로드되어 동작한다.
MS Office Word 혹은 Excel 파일에 사용할 문서 매크로를 만들어주는 기능이다.
문서 매크로는 rundll32.exe 프로세스를 생성 후 쉘코드를 삽입하여 실행시키는 방식으로 동작한다. 실행되는 쉘코드는 [그림 6~7]에서 살펴보았던 쉘코드와 기능적으로 동일하며, C2 서버에서 암호화된 DLL Beacon을 다운로드 받아 XOR 연산을 거쳐 메모리 상에서 실행한다.
※ 문서 매크로는 공격자가 커스텀 할 수 있으므로 쉘코드 삽입 대상 프로세스는 바뀔 수 있음
웹을 통한 Beacon 유포를 위해 one-line 스크립트를 생성해주는 기능이다.
해당 기능은 생성할 스크립트 유형에 따라 대표적으로 bitsadmin, exe, powershell 등 3가지 방식을 지원하며, C2서버에 해당 유형에 맞는 파일이 등록된 후 이를 다운로드하는 스크립트를 생성해준다. 3가지 유형은 아래와 같다.
BITS (Background Intelligent Transfer Service)란, 기기 간에 파일 전송을 위한 윈도우의 통신 프로토콜로써, 대표적으로 윈도우 업데이트에서 사용되고 있다. 공격자는 타겟 PC에서 수집한 정보를 C2 서버로 전송하거나 추가 악성코드를 다운로드하기 위해 이러한 BITS를 이용하기도 한다.
bitsadmin은 이러한 BITS를 이용하여 C2서버에서 exe Beacon을 다운로드 후 실행하는 방식이며, 아래 예시와 같은 스크립트를 생성해준다.
C2서버에 등록된 PowerShell 스크립트를 내려 받아 실행시키는 방식이다. 해당 기능을 이용하면 C2서버에 PowerShell 스크립트가 등록되며, 이를 내려 받아 실행하는 PowerShell 스크립트를 생성해준다.
생성되는 PowerShell 스크립트 예시는 [표 2]와 같으며, C2 서버인 http://192.168.108.128:80/a 경로에는 아래와 같은 PowerShell 스크립트가 생성된다.
C2서버에 생성된 PowerShell 스크립트는 내부에 Gzip + Base64 인코딩 된 PowerShell 스크립트를 포함하고 있으며, 이를 디코딩 및 압축 해제하여 확인해보면 [그림 5]의 디코딩 된 스크립트와 같은 기능의 스크립트를 확인할 수 있다. 이후 동작 또한 동일하여 추가 분석은 생략하도록 하겠다.
C2서버에 exe Beacon을 등록 후 이에 대한 다운로드 URL을 생성해주는 방식이다.
이상으로 Beacon 유포 방식에 따른 3가지 유형(HTA, 문서 매크로, 스크립트)에 대해 살펴보았다. 다음 장에서는 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
HTTP Beacon은 HTTP 프로토콜을 사용하여 C2와 통신하며, profile 설정 없이 기본값으로 생성된 Beacon은 아래와 같은 패킷을 확인할 수 있다.
아래 그림과 같이 profile 설정이 가능하다. URL과 Host 등의 Header 정보 변조뿐만 아니라 정상 패킷으로 위장하기 위한 임의의 데이터를 송수신 데이터 사이에 삽입할 수 있으며, 송수신 명령에 대한 인코딩과 암호화를 지원한다.
[그림 12]의 설정을 기반으로 생성한 HTTP Beacon을 실행하면 아래와 같은 패킷을 확인할 수 있다.
IP는 C2 IP이지만, 헤더가 변조되어 정상 사이트의 자바스크립트로 위장하고 있으며, 타겟 PC의 메타데이터(암호화+인코딩)가 쿠키를 통해 전달된다. 수신한 자바스크립트는 악성 행위를 수행하는 스크립트가 아닌, 위장을 위한 스크립트이며, 내부에 실제 C2 서버에서 전달받은 명령(암호화+인코딩)이 존재한다.
※ 인코딩 방식, 메타데이터 전달방식, HTTP Header, 위장을 위한 Fake 데이터 등은 필요에 따라 profile 수정을 통해 커스텀 가능
아래 그림은 HTTP Beacon을 추출하여 CobaltStrikeParser 도구를 이용해 파싱해 본 것이다. Beacon Type, C2 URL, 인코딩 방식 등 Beacon 설정 정보들을 확인할 수 있다.
HTTPS Beacon은 HTTPS 프로토콜을 사용하여 암호화 통신을 하며, 마찬가지로 CobaltStrike Parser 도구를 이용해 파싱하여 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 기능을 사용했을 때 확인되는 패킷이다.
타겟 PC에서 Beacon Loader 파일이 실행되면 아래 그림과 같이 정상 프로그램인 rundll32.exe를 실행 후 TCP Beacon을 인젝션 한다. 이후 rundll32.exe 프로세스는 TCP 특정 포트를 열고 Parent Beacon으로부터 명령을 전달받아 동작한다.
※ 인젝션 대상 프로세스, 포트 번호 등은 profile 설정을 통해 커스텀 가능
TCP Beacon이 인젝션 된 프로세스(rundll32.exe)의 메모리 덤프 파일을 CobaltStrikeParser 도구를 사용하여 파싱한 결과는 아래와 같다.
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 설정을 통해 커스텀 가능
[그림 19]는 SMB 프로토콜 패킷을 캡쳐한 것이다. 빨간색 네모칸의 450fdbf.exe는 타겟 PC의 ADMIN$ 공유로 전송하여 실행된 Beacon Loader이며, mojo.5688.8052.183894939787088877ef는 SMB Beacon과 Parent Beacon 간 통신을 위해 사용될 pipe name이다.
CobaltStrikeParser 도구를 사용하여 SMB Beacon을 파싱한 결과는 아래와 같다.
DNS Beacon은 DNS 패킷의 TXT 레코드, AAAA 레코드 등을 통해 명령을 전달하고, query Message를 통해 결과를 수신한다. 이러한 기법을 DNS Tunneling이라고도하며, 보안장비 우회를 목적으로 데이터를 인코딩/암호화한 뒤 DNS 패킷에 숨기는 것이다.
아래 그림은 DNS Beacon 통신 패킷의 일부이며, 인코딩 된 명령이 TXT 레코드에 삽입되어 전송되는 것을 확인할 수 있다.
CobaltStrikeParser 도구를 사용하여 DNS Beacon을 파싱한 결과는 아래와 같다.
지금까지 실제 공격그룹 사이에서도 널리 사용되는 Cobalt Strike 침투 테스팅 도구에 대해 알아보았다. 이제 본 글에서 알아본 사실을 토대로 네트워크 영역에서 시그니처를 통한 탐지가 가능할 것인지에 대해 알아보도록 하겠다.
기본적으로 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된 쿠키 값을 전송한다는 것인데 이 두가지 정보만으로 시그니처를 잡기에는 오탐의 가능성이 클 것이라 판단된다.
참고로 기본 값으로 설정된 HTTP Beacon의 최초 통신 URL 경로 리스트는 아래 표와 같다.
아래 리스트 중 랜덤으로 하나 선택하여 최초 통신 URL 경로로 사용하는 것이다.
그렇다면 이제 명령 수행 결과를 전송할 때의 패킷을 살펴보겠다. 아래 그림과 같이 특정 URL 경로로 암호화 된 데이터를 전송하는 것을 확인할 수 있다. URL 경로의 형태는 아래와 같다.
/submit.php?id=[타겟 PC 구분을 위한 고유 ID 값]
마찬가지로 해당 패킷에서도 시그니처로 잡을 만한 정보는 확인되지 않았다. 위와 같은 URL 경로 패턴만을 시그니처로 잡기에는 역시 오탐의 가능성이 클 것이다.
결론적으로, 네트워크 시그니처를 통한 탐지는 사실상 힘들 것이라 판단된다.
보안관제센터 MIR Team
한국 기업을 타깃으로 하는 귀신 랜섬웨어 (리눅스 ver) (0) | 2022.08.19 |
---|---|
F5 BIG-IP의 원격코드 실행 취약점을 통해 유포되는 Gh0st RAT (0) | 2022.06.03 |
깃허브 저장소를 통한 악성코드 유포 사례 (0) | 2022.05.24 |
RDP Bruteforce Attack을 통해 유포되는 MedusaLocker (0) | 2022.03.11 |
악성 워드 문서를 통해 유포되는 Hancitor 악성코드 (0) | 2022.03.11 |
댓글 영역