Covenant는 최신이자 가장 훌륭한 명령 및 제어(Command and Control, C2) 포스트 익스플로잇(post-exploitation) 프레임워크 중 하나입니다. 이 글에서는 Covenant를 설정하는 과정과, 손상된 호스트에서 페이로드(payload)를 실행하는 데 Covenant를 사용하는 방법을 안내합니다.
참고: 이 글은 2019년 9월 중순 기준 Covenant의 기능을 보여줍니다.
1. Covenant 설치
먼저, Covenant 데이터베이스와 애플리케이션 에이전트를 제어하는 관리 애플리케이션 역할을 모두 수행할 호스트 머신에 Covenant를 설치해야 합니다. 이 애플리케이션 에이전트는 다음과 같이 알려져 있습니다: grunts.
사전 준비 사항
이 블로그 글에서는 Windows 10 워크스테이션에 Covenant를 설치했지만, .NET Core를 지원하는 최신 Windows Server 운영체제나 Linux 배포판이라면 무엇이든 문제없이 사용할 수 있습니다.
다음 애플리케이션은 Covenant를 호스팅하는 컴퓨터에 설치해야 합니다:
설치 과정
Covenant의 최신 크로스플랫폼 아키텍처를 고려할 때, 구식 설치 프로그램 실행 파일을 제공하지 않습니다. 대신 프로젝트 git 저장소를 클론한 다음 아래 명령을 사용해 애플리케이션을 빌드하고 실행해야 합니다:
git clone --recurse-submodules https://github.com/cobbr/Covenant
cd Covenant/Covenant
dotnet build
dotnet run
또는 Covenant를 Docker 컨테이너에서 실행할 수도 있습니다.
2. 계정을 생성합니다.
Covenant 서비스를 실행하고 나면, 기본 웹 포트인 7443을 통해 Covenant 애플리케이션 인터페이스에 접속할 수 있습니다. 사용자 계정을 설정하라는 메시지가 표시됩니다:
등록 절차를 완료하면 사용자 관리(User Management) 페이지로 리디렉션됩니다:
왼쪽에 있는 메뉴를 통해 Covenant의 다양한 기능으로 이동할 수 있습니다.
3. 리스너를 구성합니다.
리스너를 사용하면 그런트가 Covenant 애플리케이션과 통신할 수 있습니다. 기본으로 구성된 리스너는 없으므로 하나를 구성해야 합니다. Listeners 를 왼쪽 메뉴에서 클릭하여 Listener 페이지를 여세요:
그런 다음 Create 버튼을 클릭하여 HTTP 리스너 생성 페이지를 여세요:
다음에 제공된 값 중 몇 가지를 업데이트해야 합니다:
- Name — 기본적으로 Covenant는 간단한 “GUID” 유형 이름을 제공합니다. 더 알아보기 쉬운 이름으로 자유롭게 변경해도 됩니다.
- BindAddress 및 ConnectAddress — 두 설정 모두 grunts가 도달할 수 있는 주소를 지정하는지 확인하세요.
- UseSSL — SLL을 사용하려면 SSL 인증서 파일과 비밀번호를 지정해야 합니다.
구성이 완료되면 Create 버튼을 클릭하여 리스너를 생성하고 활성화하세요.
4. 런처를 생성합니다.
다음으로 런처를 생성해야 합니다. 런처는 원격 호스트를 grunts로 전환하고 Covenant 애플리케이션에 연결하는 데 사용됩니다. 일반적으로 원격 호스트에서 실행되는 페이로드 패키지 형태로 제공됩니다. 각 런처는 리스너와 한 쌍으로 연결됩니다.
사용자 관리(User Management) 페이지의 왼쪽 메뉴에서 Launchers를 클릭하세요. 그러면 다양한 유형의 런처(launcher) 목록이 표시됩니다. 사용자 지정 바이너리를 생성하는 데 사용되는 Binary launcher는 사용하기 가장 쉬운 런처 중 하나이므로, 첫 번째 런처로 Binary 를 선택해 봅시다.
구성 페이지가 열립니다:
다음 구성 옵션을 지정하세요:
- Listener — 새 런처가 사용할 리스너(listener)를 지정하세요. 앞서 생성한 HTTP 리스너를 사용해 봅시다:
- Template — 기본 제공 템플릿 GruntHTTP을 사용해 봅시다:
- 지연 및 지터 — 이 설정은 그런트가 Covenant와 통신하는 빈도를 제어합니다. 기본값을 그대로 두어도 됩니다.
- 연결 시도 횟수 및 종료 날짜 — 이 설정은 그런트가 Covenant와 통신을 시도하는 것을 언제 중단할지 제어합니다. 이번에도 기본값을 그대로 두어도 됩니다.
구성이 완료되면 Generate 버튼을 클릭하여 새 런처를 만들고 구성 페이지로 돌아가세요.
5. 런처를 실행하여 grunt를 생성합니다.
다음으로 런처 페이로드를 저장해야 합니다. Download 를 클릭한 다음 Save File 를 클릭하세요.
다음으로 저장한 파일을 원하는 호스트에 복사한 후 실행합니다.
방금 등록한 grunt가 Covenant의 대시보드에 다음과 같이 표시됩니다:
6. grunt에 작업을 할당합니다.
사용자 관리 페이지의 왼쪽 메뉴에서 Grunts 를 클릭한 다음, 방금 등록한 grunt를 엽니다. Info 탭에서는 연결 상태와 기능에 대한 자세한 내용을 확인할 수 있습니다:
grunt에 작업을 할당하려면 Task 탭을 클릭해야 합니다.
예제 1: 스크린샷을 찍습니다.
먼저, 그룬트가 현재 사용자의 데스크톱을 스크린샷하도록 하려는 상황이라고 가정해 봅시다. 작업 드롭다운에서 Screenshot을 선택한 다음, 아래의 Task 버튼을 클릭하면 그룬트에서 이 동작을 즉시 실행합니다:
페이지를 새로 고쳐 업데이트된 작업 상태를 확인하세요. 작업이 완료되었음을 표시하고, 이 경우에는 단순히 스크린샷인 출력 결과를 제공합니다. 작업의 출력은 작업 유형에 따라 달라진다는 점에 유의하세요.
예제 2: Mimikatz를 실행합니다.
grunt이 또 다른 작업을 수행하게 해 보겠습니다. Mimikatz를 실행합니다.
그런트의 상세 페이지에서 Tasks 탭으로 다시 이동해야 합니다. 그런 다음 작업 드롭다운에서 Mimikatz 을 선택하겠습니다.
많은 작업에는 사용자 지정 가능한 입력 매개변수 세트가 있습니다. Mimikatz 작업에는 우리가 실행하고자 하는 Mimikatz 명령이 무엇인지 지정할 수 있는 “Command” 입력 매개변수가 있습니다. 편리하게도 이 값은 메모리에 저장된 암호를 찾아내는 sekurlsa::logonPasswords 명령으로 미리 채워져 있습니다. 이 작업을 우리의 grunt에 할당하고 어떤 일이 일어나는지 확인해 봅시다.
우연히도 이 grunt 호스트에 Domain Admin 계정이 로그인되어 있었습니다. 그래서 작업 출력에서 Domain Admin의 비밀번호가 평문으로 표시되는 것을 확인할 수 있습니다!
Covenant를 사용해 Mimikatz를 실행하면 공격자가 탐지를 회피하는 데 도움이 됩니다. Covenant는 작업을 grunt 호스트에 직접 저장하지 않기 때문입니다. 대신, 작업을 지시하는 시점에 클라이언트 연결을 통해 작업 페이로드를 동적으로 컴파일하고 배포합니다. 또한 새 grunt를 만들거나 grunt에 새 작업을 할당할 때마다 관련 코드를 다시 컴파일하고 ConfuserEx로 난독화하므로, 눈에 띄기 쉬운 정적 페이로드를 피할 수 있습니다. 실제로 제가 여기서 수행한 절차를 제 머신에서 실행했을 때는 Windows Defender가 활성화되어 있고 최신 상태였지만, grunt의 Mimikatz 작업은 문제 없이 실행되었습니다.
작업 기록과 출력 내용을 검토합니다.
Covenant는 실행한 작업의 명확한 기록을 제공합니다. 사용자 관리 페이지 왼쪽 메뉴에서 Taskings을 클릭하세요:
앞서 실행한 스크린샷 작업과 mimikatz 작업을 모두 확인할 수 있습니다. 어떤 행이든 클릭하면 작업의 매개변수와 전체 출력 내용을 볼 수 있습니다.
많은 작업은 출력의 일부 요소도 Data 페이지에 저장한다는 점에 유의하세요. 다양한 탭을 클릭하여 자격 증명, 지표, 다운로드된 아티팩트, 스크린샷을 확인할 수 있습니다. 예를 들어, 다음은 Mimikatz 작업으로 발견한 자격 증명입니다:
그리고 이것은 다른 작업에서 캡처한 스크린샷입니다:
예시 3: 파일을 다운로드합니다.
이제 grunt에서 작업을 한 번 더 실행하여 파일을 다운로드한 다음, 이를 Downloads 탭에서 확인해 봅시다.
grunt 호스트에 다음 이름의 파일이 있다는 것을 발견했다고 가정해 봅시다: MySecretDocument.txt. Download 작업을 사용해서 이 파일의 사본을 직접 가져와 봅시다!
이 작업을 실행하면 파일의 사본을 가져와 즉시 Downloads 탭에서 사용할 수 있게 됩니다:
이 작업은 그 자체로는 간단하지만, grunt 실행기를 실행한 사용자의 권한을 사용해 이 작업을 실행하거나 다른 작업을 통해 획득한 자격 증명을 사용할 수 있다는 점에서 흥미로운 활용 사례가 몇 가지 있습니다.
결론
Covenant는 이미 다양한 작업을 제공하고 있으며, 오픈소스 커뮤니티의 참여 덕분에 목록은 매일 성장하고 있습니다. 이 프로젝트는 앞으로 매우 흥미로운 미래를 가질 가능성이 크며, 꼭 한 번 살펴볼 만한 가치가 있습니다!
공유하기
더 알아보기
저자 소개
Joe Dibley
보안 연구원
Netwrix의 보안 연구원이며 Netwrix Security Research Team의 일원입니다. Joe는 Active Directory, Windows 및 다양한 엔터프라이즈 소프트웨어 플랫폼과 기술 분야의 전문가로, 새로운 보안 위험, 복잡한 공격 기법, 그리고 이에 대한 대응(완화)과 탐지 방법을 연구합니다.