Cobalt Strike
코발트 스트라이크는 레드팀 침투 테스트를 위해 설계된 상용 C2 프레임워크로 많은 기능을 지원합니다. C2 프레임워크를 사용하는 목적을 먼저 간결하게 설명하면, 공격자는 C2 서버 뒤에서 은닉할 수 있습니다. 피해자 입장에선 원격 명령을 내리는 주체인 C2에 대해 추적하더라도, 공격자는 이미 작전이 끝난 후 해당 C2를 버리면 되며, 클라이언트(공격자 로컬)에서 원격 명령을 내리기에 은닉성이 있습니다.
실제로 공격 및 정찰에 널리 사용되는 오픈소스 도구들을 비콘에 직접 설치하기엔 탐지 가능성이 높고, 수 많은 비콘에 모든 도구를 그때마다 드롭하여 사용하는 것은 많은 어려움이 있습니다. 하지만 코발트 스트라이크를 사용하면 공격자는 자신의 로컬에 있는 도구들을 .NET 어셈블리를 사용해 디스크에 드롭하지 않고 비콘의 메모리 내에서 직접 실행시키기 때문에 탐지 회피와 편의성 목적에서 큰 장점이 있습니다. 이러한 매커니즘은 코발트 스트라이크에만 국한되는 것이 아닌, 다른 C2 프레임워크도(Sliver, Havoc 등) 동일합니다.
Client
Teamserver에 접속하여 원격으로 명령을 내리는 공격자 로컬
Teamserver
비콘과 통신하며 Client에서 전달하는 명령을 원격에서 수행 후, 결과를 반환
Beacon
Teamserver에서 하달된 명령을 수행하여 결과를 반환
Connect
먼저 팀 서버와 클라이언트 간의 연결 수립을 위해 팀 서버에서 팀 서버를 실행 후 클라이언트에서 연결합니다.
# C2 서버에서teamserver 실행
sudo ./teamserver <C2 IP Address> <Password> c2-profiles/normal/webbug.profile
이후 클라이언트에서는 Cobalt Strike Client를 실행하여 C2 주소와 패스워드를 입력 후 접속합니다.
Listener
리스너는 클라이언트가 하달한 명령을 팀 서버가 받고, 비콘에서의 명령 실행 결과를 다시 송신하기 위해 필요한 명령 제어 접점으로, HTTP, SMB, DNS 등 다양한 방법으로 연결을 구성합니다. 리스너에는 Egress Listener과 P2P Listener 두가지 종류가 있습니다.
Egress Listener
Egress 리스너는 비콘이 팀 서버와 직접적으로 통신할 수 있도록 하는 리스너입니다. 인터넷 연결이 가능한 비콘에서 HTTP 혹은 DNS와 같은 트래픽을 발생시켜 팀 서버로 응답하는 원리입니다. HTTP 리스너는 비콘이 GET/POST 방식을 통해 팀 서버로 요청함에 따라 명령 결과를 전달합니다. 반면 DNS의 경우 팀 서버의 서브 도메인에 대해 네임 서버에 질의함에 따라 명령 결과를 전달합니다. 예를 들어 pentest.wiki 도메인을 팀 서버가 사용할 때, mail.pentest.wiki는 도메인의 네임 서버에 질의하는데, 질의를 하는 과정에서 TXT 레코드를 통해 명령 결과를 전달합니다.
P2P Listener
P2P 리스너는 비콘이 팀 서버와 직접적으로 통신할 수 없는 상황에서 사용하는 리스너입니다. 만약 부모 리스너가 팀 서버와 통신이 가능한 Egress 리스너인 상태에서 자식 비콘은 부모 비콘에게 트래픽을 전달하고, 부모 비콘은 해당 트래픽을 팀 서버에 전달함에 따라 결과를 반환합니다. P2P 리스너로 사용되는 유형은 SMB와 TCP입니다.
Payload
비콘을 생성하기 위해 피해자 PC에서 실행 시 팀 서버로 연결하는 페이로드 기능이 있습니다. 페이로드는 다양한 종류의 페이로드가 있으며, Windows Executable(Stageless) Variants
를 사용하면 Windows x86과 x64에서 사용 가능한 모든 종류의 페이로드를 생성합니다.
Command Method
클라이언트에서 비콘에 명령을 하달할 때 명령줄에 입력하는 방식에서는 크게 3가지 정도가 있습니다.
Execute-Assembly
과거 파워쉘에 대한 탐지 기능의 향상으로 인해 레드팀 및 APT 그룹이 C#으로 이동하는 추세를 인지하고 Cobalt Strike 3.11 버전부터 execute-assembly
기능이 도입되었습니다. 이 기능은 .NET 어셈블리를 사용하여 비콘에 직접 여러 도구들을 설치하지 않더라도, 클라이언트에 있는 프로그램에 대한 실행을 비콘에서 실행할 수 있는 기능입니다.
PowerShell
비콘 호스트에 있는 파워쉘을 실행한 뒤 커맨드를 입력하여 명령을 실행하는 방법으로 파워쉘을 직접 호출하기 때문에 로그가 남으며 EDR 등에서 탐지될 수 있습니다.
Beacon
비콘의 내장 기능을 이용하여 명령하는 방법으로 파워쉘을 호출하여 하는 방법보다는 명령어가 다양하지 않습니다. 하지만 비콘 내장 명령의 경우 Win32 API(FindFirstFileW 등)를 사용하기 때문에 AV/EDR 탐지 회피에 유리합니다.
Tools
코발트 스트라이크는 비콘에서 사용 가능한 간단한 도구부터 권한 상승, 측면 이동 등 다양한 곳에서 편의성을 가진 도구들을 제공합니다.
# 스크린샷 (기록은 View > Screenshots 에서 확인 가능)
printscreen : PrintScr 방식으로 단일 스크린샷
screenshot : 단일 스크린샷
screenwatch : 주기적으로 데스크탑 스크린샷
# 키로거 (기록은 View > Keystokes 에서 확인 가능)
keylogger : 사용자의 키 입력을 캡처
# 클립보드 탈취
clipboard : 사용자의 현재 클립보드 중 텍스트만 탈취
# 유저 세션 목록 열거
net logons : 현재 머신에 로그인 한 사용자들의 목록 열거
# 권한 상승
elevate uac-schtasks tcp-local : UAC 우회 기법을 통한 권한 상승
Lateral Movement
코발트 스트라이크에서는 측면 이동을 위한 방법을 2가지 정도 제공합니다.
jump
remote-exec
Jump
jump의 사용 문법은 jump [방법] [대상] [리스너]
입니다. 비콘에서 jump 입력 시 어떤 방법을 사용할 것인지 콘솔에 출력됩니다.이 명령을 실행하면 측면이동 하려는 비콘에서 페이로드를 생성하고, P2P 리스너를 사용하는 경우 자동으로 연결까지 수립합니다.
beacon> jump
Beacon Remote Exploits
======================
Exploit Arch Description
------- ---- -----------
psexec x86 Use a service to run a Service EXE artifact
psexec64 x64 Use a service to run a Service EXE artifact
psexec_psh x86 Use a service to run a PowerShell one-liner
winrm x86 Run a PowerShell script via WinRM
winrm64 x64 Run a PowerShell script via WinRM
remote-exec
remote-exec의 문법은 remote-exec [방법] [대상]
입니다. jump와 마찬가지로 비콘에 명령어 입력 시 어떤 방법을 사용할 수 있는지 콘솔에 출력됩니다. 이 방법은 jump와는 다르게 새로운 비콘을 생성하는게 아니라 현재 비콘에서 원격으로 명령 수행만 진행합니다. 즉 원격 명령을 수행할 때마다 명령어를 전체 입력해야 합니다.
beacon> remote-exec
Beacon Remote Execute Methods
=============================
Methods Description
------- -----------
psexec Remote execute via Service Control Manager
winrm Remote execute via WinRM (PowerShell)
wmi Remote execute via WMI
출력 결과를 통해서 알 수 있듯이 이 명령은 SMB, winRM, WMI 프로토콜을 통해 원격 명령을 실행하는 것이기 때문에 대상에 이러한 프로토콜이 하나라도 실행 중이지 않다면 명령을 수행할 수 없습니다. 이러한 방식들은 Pass the Ticket, Token Impersonation을 이용한 사용자 가장 이후에도 가능합니다.
References
Last updated
Was this helpful?