
CobaltStrike Beacons에서 관리되지 않는 Windows 실행 파일 실행
Inline-Execute-PE는 CobaltStrike용 Beacon Object File(BOF) 모음과 Aggressor 스크립트로 구성된 제품군입니다. 이를 통해 운영자는 관리되지 않는 Windows 실행 파일을 Beacon 메모리에 로드하고 실행하여 출력을 검색하고 Beacon 콘솔에 표시할 수 있습니다.
이를 통해 운영자는 Mimikatz, Dsquery, Sysinternals 도구 등 많은 타사 도구를 디스크에 저장하거나, Donut과 같은 도구를 사용하여 위치 독립 코드로 변환하거나, 새 프로세스를 생성하여 실행할 필요 없이 사용할 수 있습니다.
이러한 실행 파일은 Beacon 메모리에 매핑되어 네트워크를 통해 전송하거나 새 메모리를 할당하거나 매번 새 conhost.exe 프로세스를 생성할 필요 없이 반복 실행할 수 있습니다.
Beacon에 로드된 실행 파일은 CobaltStrike 팀 서버에 연결된 모든 CobaltStrike 클라이언트에서 접근 및 실행할 수 있습니다.
Inline-Execute-PE는 x64 Beacon과 Mingw 또는 Visual Studio로 컴파일된 x64 Windows C 또는 C++ 실행 파일을 대상으로 설계되었습니다. 이 프로젝트는 x86 실행 파일이나 다른 언어로 작성되거나 다른 컴파일러로 컴파일된 x64 실행 파일을 지원하지 않습니다.

저장소를 복제하고 선택적으로 make를 실행하여 BOF를 다시 컴파일합니다.
CobaltStrike 클라이언트에 Inline-Execute-PE.cna를 로드합니다. CobaltStrike가 실행 중인 디렉터리가 사용자가 쓰기 가능한지 확인하십시오. Inline-Execute-PE는 해당 디렉터리에 petable.txt 파일을 생성하여 Inline-Execute-PE가 작동하는 데 필요한 데이터의 가용성을 보장합니다.
Inline-Execute-PE는 BOF를 실행하는 3개의 대상 노출 명령과 프로젝트 데이터 구조를 조작하는 3개의 내부 명령으로 구성됩니다.
대상 노출:
내부 데이터 구조:
peload는 Inline-Execute-PE의 시작점입니다. 이 명령은 PE를 Beacon 메모리에 로드하는 데 사용됩니다. 다음 주요 작업을 수행합니다.
perun은 Inline-Execute-PE의 두 번째 단계입니다. 다음 주요 작업을 수행합니다.
peunload는 운영자가 PE 사용을 완료했거나 다른 PE를 로드하려는 경우 Beacon 메모리에서 PE를 제거하기 위해 호출됩니다. 다음 주요 작업을 수행합니다.
petable은 현재 Beacon에 로드된 모든 PE에 대한 정보를 표시하는 데 사용됩니다.
각 CobaltStrike 클라이언트는 자체 petable을 가지고 있습니다. Inline-Execute-PE는 모든 연결된 CobaltStrike 클라이언트 간의 데이터 동기화를 보장하기 위해 많은 노력을 기울입니다. 자세한 내용은 "설계 고려 사항 및 해설"을 참조하십시오.

peconfig는 Inline-Execute-PE 작동 방식과 관련된 옵션을 구성하는 데 사용됩니다. 현재 변경할 수 있는 두 가지 옵션은 다음과 같습니다.
pebroadcast는 클라이언트의 petable 내용을 다른 모든 연결된 CobaltStrike 클라이언트에 수동으로 브로드캐스트하는 데 사용할 수 있습니다.
다른 모든 CobaltStrike 클라이언트는 브로드캐스트된 데이터로 petable을 업데이트합니다. 이 기능은 실제로 필요하지 않을 수 있지만, 혹시 모를 경우를 위해 존재합니다.
peload를 사용하여 PE를 Beacon 메모리에 로드합니다.

또는 대상 머신에 있는 PE를 새 프로세스를 생성하지 않고 사용하려면 경로와 --local 스위치를 제공합니다.

perun을 호출하고 로드된 PE에 인수를 전달합니다.

인수에서 큰따옴표는 백슬래시를 사용하여 이스케이프해야 합니다.

언로드 중에 DLL 해제 시 문제를 일으키는 PE를 확인한 경우 peconfig를 사용하여 unloadlibraries를 false로 설정합니다.

PE 사용이 완료되면 peunload를 호출하여 Beacon에서 정리합니다.

이제 다른 PE를 Beacon에 로드할 수 있습니다.

PE에 전달하는 명령줄 인수에 주의해야 합니다. 일부 PE는 잘못된 인수가 제공되면 바로 충돌하는 반면, 다른 PE는 무한히 실행되어 프로세스가 계속 실행 중임에도 Beacon이 콜백하지 못하게 할 수 있습니다.
이는 Mimikatz.exe에서 인수 목록 끝에 'exit'을 지정하지 않을 때 확인할 수 있습니다.

...

Inline-Execute-PE는 지정된 시간 초과 값에 도달하면 실행 중인 PE의 스레드를 종료합니다. 이를 통해 Beacon이 정상 통신을 재개할 수 있습니다(perun BOF가 실행을 완료할 때까지 Beacon은 콜백하지 않습니다). 이 Beacon에서 일반 CobaltStrike 명령과 다른 BOF는 여전히 사용할 수 있지만, Inline-Execute-PE는 비활성화됩니다. 이러한 방식으로 실행 중인 PE가 종료되면 Beacon 프로세스에서 stdout 및 stderr가 손상되는 것으로 보이며, 이후 로드된 PE가 제대로 작동하지 않습니다.
PE는 여전히 (그리고 반드시) Beacon 메모리에서 언로드되어야 하지만, petable을 보면 이 Beacon에 더 이상 추가 PE를 로드할 수 없음을 나타낼 수 있습니다.

Inline-Execute-PE로 실행하려는 PE를 테스트하고 perun에 명령줄 인수를 제공할 때 주의를 기울이는 것이 중요합니다. 일부 PE는 다른 PE보다 더 관대합니다.
다음은 테스트 및 개발 중에 사용자가 Beacon에 로드하려는 특정 PE에 대해 관찰된 사항을 특별한 순서 없이 나열한 것입니다.
Inline-Execute-PE와 관련된 IOC는 다음에 국한되지 않습니다.
개발 중에 EDR에 대한 완전한 테스트를 수행하지 않았습니다. 부분적으로는 게으름과 부분적으로는 테스트 환경의 부재 때문입니다. 그러나 최신 패치가 적용된 Windows Defender(제 경험상 상당히 좋은 AV 제품)에 대해서는 테스트되었습니다.
Mimikatz.exe는 아마도 Inline-Execute-PE와 함께 사용하기에 가장 의심스럽고 잘 알려진 PE일 것입니다. Windows Defender가 Inline-Execute-PE를 사용하여 실행 중인 Mimikatz를 탐지하는 능력은 Beacon이 실행 중인 프로세스에 따라 달라진다는 것을 발견했습니다.