국내 기업 위협하는 코발트 스트라이크 심층 분석
기업 및 기관의 네트워크와 시스템에 대한 보안 취약점을 점검하기 위한 목적으로 사용 가능한 상용 침투 테스트 도구로 잘 알려진 일명 ‘코발트 스트라이크(Cobalt Strike)’는 침투 테스트 단계별로 다양한 기능들을 지원하는 것이 가장 큰 특징이다. 하지만 코발트 스트라이크의 크랙 버전이 공개되어 다수의 공격자들에 의해 악성코드로써 악용되고 있다. 특히 최근에는 국내 기업들을 대상으로 하는 랜섬웨어 공격에서, 공격자들이 내부 시스템 장악을 위한 중간 단계로 코발트 스트라이크를 악용하는 사례가 다수 발견되었다.
2021년 2분기 ASEC 리포트에서는 안랩 시큐리티대응센터(AhnLab Security Emergency response Center, 이하 ASEC)가 추적•분석한 내용을 바탕으로 코발트 스트라이크의 공격 방식 및 단계별 특징을 소개한다. 이와 함께 2021년 2분기까지 발견된 코발트 스트라이크를 이용한 실제 랜섬웨어 공격 사례들에 대해 면밀히 살펴보고자 한다.
코발트 스트라이크는 최초 감염을 위한 다양한 형태의 페이로드 생성부터 계정 정보 탈취, 측면 이동(Lateral Movement)를 거쳐 시스템 장악까지 단계별로 필요한 기능들을 제공한다. 또한 다양한 세부 설정이 가능하며, 한 단계 더 나아가 써드 파티 모듈(Third-Party Module)이라는 확장성까지 제공하고 있다. 따라서 코발트 스트라이크를 이용한 공격을 분석하고 방어하기 위해서는 코발트 스트라이크가 제공하는 다양한 기능뿐만 아니라 탐지를 회피할 수 있는 여러 기법들로 인한 다방면의 가능성까지 모두 고려해야 할 필요가 있다.
코발트 스트라이크 공격 흐름
코발트 스트라이크는 크게 비컨(beacon), 팀 서버(Team Server), 코발트 스트라이크 클라이언트(Cobalt Strike Client) 3가지로 구분할 수 있다. 가장 먼저 감염 PC에서 백도어로 동작하는 실질적인 악성코드를 비컨(beacon)이라고 한다. 비컨은 코발트 스트라이크가 제공하는 명령을 수행할 수 있는 백도어이며, 다양한 형태를 가짐으로써 외부망을 포함하여 내부망에서도 C&C(Command & Control) 서버로부터의 명령을 받아 악성 행위를 수행할 수 있다.
그 다음 요소는 비컨이 통신하는 서버로 팀 서버(Team Server)라고 불리는 실질적인 C&C 서버이다. 마지막으로 코발트 스트라이크 클라이언트(Cobalt Strike Client)가 있는데, 공격자는 코발트 스트라이크 클라이언트를 이용해 팀 서버에 연결한 후 해당 팀 서버를 거쳐서 비컨에 명령을 전달할 수 있다. 코발트 스트라이크 클라이언트는 비컨 제어 외에도 비컨 및 스테이저(stager)라고 불리는 악성 페이로드 생성, 확장 기능 제공과 같은 다양한 기능 및 UI를 제공한다.
[그림 1]은 코발트 스트라이크를 이용한 공격 흐름을 나타낸 것으로 코발트 스트라이크의 구성 요소 및 단계별 공격 동향을 파악할 수 있다.
외부와 연결된 특정 기업 시스템이 비컨에 감염된 경우, 공격자는 권한 상승 및 미미카츠(Mimikatz) 등을 이용한 계정 정보 탈취를 거쳐 기업 시스템 내부의 다른 시스템으로 측면 이동(Lateral Movement)를 진행할 수 있다. 코발트 스트라이크는 이러한 과정을 지원하는 것에 특화된 툴이라고 할 수 있다.
측면 이동은 결국 원격 시스템에 또 다른 비컨을 설치하는 것이며 내부망일 경우에는 SMB 비컨을 설치한다. 즉 외부에 연결된 시스템에서는 HTTP 또는 HTTPS와 같은 비컨을 설치하여 외부 C&C 서버로부터 명령을 받으며, 외부와 연결되어 있지 않은 시스템에 대해서는 SMB 비컨을 이용하여 SMB 프로토콜을 이용하여 통신한다. SMB 비컨은 HTTP 비컨을 거쳐서 C&C 서버로부터 직접적으로 명령을 전달받을 수 있다. 즉 일반적인 백도어 악성코드들과 달리 코발트 스트라이크는 내부에 존재하는 시스템에 대한 직접적인 제어를 제공해 준다.
또한 코발트 스트라이크는 보안 제품 탐지를 회피하기 위한 목적으로 다양한 기법들을 제공한다. 비컨이 실행 중이라는 것은 비컨이 프로세스로서 동작 중인 것을 의미한다. 코발트 스트라이크는 의심 프로세스를 특정할 수 없게 하기 위해 스폰(Spawn)과 같은 다양한 설정을 제공하며, 인자 또한 지정할 수 있기 때문에 현재 시스템에서 프로세스만으로 의심 프로세스를 특정하는 것이 불가능하게 된다. 더 나아가 네트워크 통신과 관련해서도 직접적으로 패킷을 조작할 수 있기 때문에 HTTP 및 HTTPS 비컨의 통신을 패킷 기반으로 탐지하는 것은 어렵다. 결과적으로 비컨은 특정 프로세스의 메모리상에 존재하게 되는데, 메모리에 존재하는 형태와 관련해서도 다양한 설정이 제공되어 메모리 기반의 탐지를 우회할 수 있다.
코발트 스트라이크를 활용한 사이버 공격 킬 체인(Kill Chain)
코발트 스트라이크는 초기 침투, 거점 확보, 권한 상승, 내부 정찰, 측면 이동, 제어 유지의 과정을 거쳐 목적을 달성한다. [그림 2]는 코발트 스트라이크를 활용한 사이버 공격 킬 체인을 나타낸 것이다.
1. 초기 침투(Initial Compromise) 및 거점 확보(Establish Foothold)
코발트 스트라이크에서 백도어 역할을 담당하는 것은 비컨이다. 즉 특정 시스템이 코발트 스트라이크에 감염되었다는 것은 비컨이 설치되어 실행 중이라는 것을 의미한다. 코발트 스트라이크는 비컨을 다양한 형태로 제공하는데, 이 방식에 따라 스테이저(Stager)와 스테이지리스(Stageless) 방식으로 구분할 수 있다.
스테이저는 외부에서 비컨을 다운로드하여 메모리상에서 실행하는 미터프리터이다. 비컨을 직접 포함하지 않기 때문에 크기가 작으며 추가적으로 비컨을 다운로드하는 과정이 필요한 형태이다. 스테이저는 외부에서 비컨을 다운로드할 때 http, https 및 dns 프로토콜을 사용할 수 있다. 또한 측면 이동(Lateral Movement) 과정에서 내부망으로 비컨을 전파할 때는 네임드 파이프(Named Pipe), 즉 SMB 프로토콜을 이용해 비컨을 전달한다. 스테이지리스 방식은 추가로 외부에서 비컨을 다운로드하는 과정이 필요 없는 형태로서, 비컨을 포함하고 있기 때문에 일정 크기 이상을 갖는다.
비컨을 다운로드하여 실행하는 스테이저 방식이나, 특정한 형태로 존재하는 비컨을 로드하여 실행하는 스테이지리스 방식 모두 꼭 실행 파일 형태를 가질 필요는 없기 때문에 코발트 스트라이크는 다양한 종류의 페이로드를 제공한다. 기본적으로 제공하는 빌더는 exe, dll, Service exe 같은 실행 파일 형식뿐만 아니라 hta, vba 매크로, 파워쉘 명령 그리고 로우(Raw)한 형태들도 생성할 수 있다.
비컨도 스테이저와 마찬가지로 http, https, dns 등과 같은 프로토콜을 이용해 C&C 서버와 통신할 수 있다. 측면 이동(Lateral Movement) 과정에서 내부망에 설치되는 비컨은 외부와 연결된 것이 아니기 때문에 SMB 프로토콜을 이용해 통신하는 SMB 비컨이 설치된다.
최초 설치되는 비컨은 그 형태에 따라 다양한 프로세스로 동작할 수 있다. 이는 측면 이동(Lateral Movement) 과정에서 내부 전파 시에도 마찬가지인데, 기본 설정의 코발트 스트라이크인 경우에는 최초 실행되는 프로세스가 명령에 따라 rundll32.exe, powershell.exe, WinRM 방식의 wsmprovhost.exe가 될 수 있다. 하지만 코발트 스트라이크는 이와 같이 의심스러운 프로세스로 비컨이 동작하지 않도록 스폰(Spawn)이라는 기능을 제공한다. 스폰(Spawn) 기능은 마찬가지로 프로파일(profile) 파일에서 설정할 수 있는데, 인젝션할 정상 프로세스의 경로명과 인자를 지정할 수 있다. 만약 감염 환경에서 의심스러운 프로세스 중 하나인 powershell.exe에 비컨이 로드되어 실행된다고 하더라도 스폰(Spawn) 기능을 통해 정상 프로세스에 비컨을 인젝션하여 동작시킬 경우, 보안 제품에서 탐지 대상으로 구체적인 프로세스를 지정하여 탐지할 수 없다는 문제가 발생한다.
코발트 스트라이크는 시스템에 침입 후 공격자 서버와의 연결을 유지하기 위해, 네트워크 패킷 기반의 탐지 시스템을 우회하는 몰리어블 C&C 프로파일(Malleable C&C profile)이라는 기능을 사용할 수 있다. 이 기능은 코발트 스트라이크의 명령 및 제어(Command & Control) 트래픽을 공격자의 의도에 맞게 수정할 수 있는 것으로, 예를 들면 구글(Google), 빙(Bing) 등 정상 서버의 트래픽으로 위장하여 네트워크 보안 시스템을 피해 공격자 서버와 통신을 할 수 있다. 코발트 스트라이크는 이 기술을 사용하기 위해 ‘프로파일(Profile)’이라는 설정 파일을 사용하며, 해당 설정 파일은 코발트 스트라이크의 핵심 요소 중 하나이다.
2. 권한 상승(Privilege Escalation)
초기 침투 및 거점 확보 단계가 완료되면 공격자는 내부 네트워크 측면 이동(Lateral Movement)을 위한 로컬 관리자 계정 혹은 도메인 관리자 계정 정보를 획득하고자 할 것이다. 코발트 스트라이크에서는 이러한 계정 정보 획득을 위해 미미카츠(Mimikatz) 기능을 지원한다. 하지만 미미카츠(Mimikatz)의 계정 정보 탈취 명령을 수행하기 위해서는 관리자 이상의 권한을 필요로 하므로 미미카츠(Mimikatz) 실행 전 권한 상승이 우선되어야 한다. 이를 위해 공격자들은 UAC Bypass나 LPE 취약점들을 사용하는데, 코발트 스트라이크에서 기본적으로 제공하는 기능들도 존재하지만 써드 파티 툴들을 이용하기도 한다.
3. 내부 정찰(Internal Reconnaissance)
피해 시스템에 권한 상승 및 미미카츠(Mimikatz) 실행으로 자격 증명 정보 탈취가 완료되면 공격자는 해당 시스템을 완전히 장악했다고 볼 수 있다. 내부 정찰 단계는 ADFind, 포트(Port) 스캐닝 기능을 사용하여 현재 시스템과 연결된 네트워크상의 모든 PC에 대해 정보를 수집하는 단계이다.
공격자들이 정보 수집을 위해 주로 사용하는 도구인 ADFind는 현재 네트워크상의 액티브 디렉토리(Active Directory) 정보를 수집해주는 커맨드 라인 형태의 도구이다. 예를 들어 FIN6와 같은 APT 공격 그룹에서는 ADFind 도구를 배치 파일 형태로 실행하여 실행의 결과물로써 도메인 컨트롤러 리스트, 서브넷 리스트, 도메인에 존재하는 컴퓨터 정보, 현재 시스템이 속한 액티브 디렉토리(Active Directory) 정보 등을 수집한다.
4. 측면 이동(Lateral Movement)
포트 스캐닝이나 ADFind와 같은 툴을 이용한 내부 정찰 과정과 자격 증명 정보 탈취 과정이 완료되면 내부 전파 과정을 진행할 수 있다. 코발트 스트라이크에서는 직접적인 쉘 명령을 이용할 수도 있겠지만, psexec(psexec64), psexec_psh, winrm(winrm64), ssh(ssh-key)와 같이 기본적으로 제공하는 다양한 명령들을 사용할 수도 있다.
5. 제어 유지(Maintain Persistence) 및 목적 완료(Complete Mission)
위의 과정까지 모두 진행되면 시스템은 이미 공격자에게 장악 당한 이후이기 때문에 코발트 스트라이크의 확장 모듈을 추가하거나 다른 악성 코드를 설치하는 등 아무런 제약 없이 공격자가 원하는 명령을 수행할 수 있다. 이 중 가장 먼저 수행할 명령은 제어 유지(Maintain persistence)이다. 공격자는 보통 감염된 PC가 재부팅되거나 프로세스를 종료하는 등 예상치 못하게 비컨이 종료될 수 있어, 비컨이 다시 실행될 수 있도록 지속성 명령을 수행한다.
출처 : AhnLab