
Async PICO Hub는 Cobalt Strike를 사용자 정의 이벤트 모니터링 및 프로세스 내 비동기 BOF로 확장하기 위한 작업 진행 중인 프레임워크입니다.
Async PICOs는 Cobalt Strike Beacon 프로세스 내부에서 장기 실행되는 이벤트 기반 Beacon Object Files를 실행하기 위한 프레임워크입니다. Crystal Palace PICO를 Beacon 측 실행 모델과 결합하여 비동기 실행, 작업 추적, 정상 종료 및 안전한 비동기 출력을 제공합니다.
Cobalt Strike의 기본 비동기 BOF와 달리 Async PICO는 Beacon의 프로세스에서 실행되며, 이벤트가 발생하면 Beacon을 깨워 출력을 표시할 수 있습니다.
Cobalt Strike 기본 비동기 BOF는 다른 문제를 해결합니다. Async PICO는 Beacon 내부에서 실행되고 결과를 운영자에게 안전하게 즉시 전달할 수 있는 장기 실행 이벤트 기반 작업을 위해 설계되었습니다.
구현 세부 사항 및 설계 근거는 첨부된 블로그 게시물을 참조하십시오:
https://www.nccgroup.com/research/async-picos-and-custom-beacon-wakeups-in-cobalt-strike/
빌드하기 전에 다음 구성 요소가 필요합니다:
이 저장소의 로컬 복사본
빌드된 Crystal Palace 버전
MSVC 및 CMake를 지원하는 Visual Studio
Tradecraft Garden
저장소를 클론합니다
git clone <repo-url>
cd async-pico-hub
Async PICO는 PICO 생성을 위해 Crystal Palace에 의존합니다.
최신 압축 릴리스의 Crystal Palace를 다운로드하고 해당 지침에 따라 빌드합니다. 빌드가 완료되면 Crystal Palace 바이너리를 다음 위치에 배치합니다:
pico-tools/crystal-palace/
예상 레이아웃은 다음과 유사해야 합니다:
pico-tools/
└── crystal-palace/
├── src/
├── lib/
└── ...
최신 Tradecraft Garden 릴리스를 다운로드하여 다음 위치에 배치합니다:
pico-tools/tradecraftgarden
예상 레이아웃은 다음과 유사해야 합니다:
pico-tools/
└── tradecraftgarden/
├── libtcg/
├── simple_pic/
└── ...
Async PICOs를 빌드하려면 libtcg와 simple_pic 예제를 빌드해야 합니다.
이 프로젝트는 CMake를 사용하여 MSVC로 빌드를 단순화합니다.
저장소 루트에서 폴더를 마우스 오른쪽 버튼으로 클릭하고 다음을 선택합니다:
Open with Visual Studio
그러면 CMake 프로젝트가 로드되고 사용 가능한 빌드 구성이 표시됩니다.
다음 빌드 구성을 사용할 수 있습니다:
x64 Debug
디버깅을 위한 PICO 및 BOF의 로컬 실행 파일 버전을 빌드합니다.
로컬에서 동작을 디버깅하거나 Visual Studio에서 코드를 단계별로 실행할 때 이 구성을 사용합니다.
x64 Release
최적화된 PICO 및 BOF의 로컬 실행 파일 버전을 빌드합니다.
Beacon 외부에서 릴리스 동작을 테스트하려면 이 구성을 사용합니다.
x64 Release Objects
배포 아티팩트를 빌드합니다:
Cobalt Strike용 객체를 생성할 때 사용되는 구성입니다.
빌드가 완료되면 생성된 아티팩트는 다음 위치에서 찾을 수 있습니다:
build/x64-ReleaseObject/obj/
이 디렉터리에는 사용 준비가 된 컴파일된 PICO 및 BOF가 포함되어 있습니다.
Async PICOs를 사용하려면 Beacon이 사용자 지정 sleepmask를 사용해야 합니다.
Malleable profile에서 Async PICOs를 사용하기 전에 사용자 지정 sleepmask 지원을 활성화하십시오.
picos-cna/sleepmask.cna스크립트는 비동기 출력 및 Beacon 깨우기 조정을 지원하는 데 사용되는 최소 참조 구현인async-sleepmask를 로드합니다.이 sleepmask는 의도적으로 단순하며 제한 사항 섹션에 설명된 제한이 있습니다. 이는 완성된 프로덕션 준비 구성 요소가 아니라 프레임워크를 시연하고 테스트를 단순화하기 위해 제공됩니다.
스택 조작과 같은 OPSEC 기법이 포함된 사용자 지정 sleepmask가 이미 있는 경우 기존 sleepmask를 Async sleepmask로 수정을 참조하여 기존 구현에 Async PICO 지원을 통합하십시오.
x64 Release Objects 구성으로 프로젝트를 빌드한 후 picos.cna 및 sleepmask.cna Aggressor 스크립트를 Cobalt Strike에 로드합니다:
Script Manager → Load → picos-cna/picos.cna
Script Manager → Load → picos-cna/sleepmask.cna
로드되면 picos 명령을 통해 Async PICOs를 관리할 수 있습니다.
PICO를 시작하려면:
picos start [path to pico] [arguments]
예:
picos start C:\temp\MonitorTGT.pico
또는 인수와 함께:
picos start C:\temp\MonitorTGT.pico DOMAIN\serviceaccount
실행 중인 Async PICOs를 보려면:
picos
현재 실행 중인 작업과 해당 식별자가 표시됩니다.
Async PICO를 중지하려면:
picos stop [pico id]
예:
picos stop 3
PICO는 중지 신호를 수신하고 정리 작업을 수행한 후 정상적으로 종료됩니다.
추가 사용 정보는 Cobalt Strike 내부의 picos 명령에 대한 기본 제공 도움말 메뉴에서 확인할 수 있습니다.
자세한 내용은 docs/writing_custom_async_pico.md를 확인하십시오.
자세한 내용은 docs/modifying_existing_sleepmask.md를 확인하십시오.
공개 구현은 고급 회피 기법 없이 의도적으로 단순하게 유지됩니다. 변경 없이 배포하기보다는 적용할 수 있는 기반으로 설계되었습니다.
Async PICOs는 CreateThread를 사용하여 실행됩니다. 이는 실행 모델을 단순하고 이해하기 쉽게 유지하지만 탐지 표면을 도입합니다. 공개 구현에서 스레드는 모듈 이미지에 의해 지원되지 않는 메모리에서 실행을 시작하므로 스레드 시작 주소를 검사하는 제품이나 휴리스틱에 탐지될 수 있습니다.
사용자는 대체 스레드 생성 또는 실행 전략이 자신의 환경에 더 적합한지 평가해야 합니다.
프레임워크는 비동기 출력을 Beacon에 중계하고 깨우기 이벤트를 조정하기 위해 수정된 sleepmask에 의존합니다. 여기에 포함된 구현은 의도적으로 최소화되었으며 운영 사용 전에 검토해야 합니다.
sleepmask는 단순한 편의 계층이 아니라 실행 모델의 일부입니다. 출력이 큐에 추가되거나, 비워지거나, 신호되는 방식의 변경은 동시성 문제나 Beacon 내부와의 지원되지 않는 상호 작용을 유발하지 않도록 신중하게 평가해야 합니다.
공개 구현에는 사용 전에 이해해야 하는 몇 가지 실질적인 제한 사항이 있습니다.
Crystal Palace는 PICO가 전역 변수를 사용할 수 있게 하지만, 공개 구현은 전역 상태 저장을 위해 단순한 공유 저장소 모델을 사용합니다. 결과적으로 전역 변수는 스레드별로 격리되지 않습니다.
실제로 이는 여러 Async PICOs를 동시에 실행할 때 전역 변수에 의존하는 경우 추가 주의가 필요할 수 있음을 의미합니다.
Async PICOs는 비동기 출력 및 Beacon 깨우기 조정을 위해 수정된 sleepmask에 의존합니다. 따라서 프레임워크는 완전히 자급자족하지 않으며 즉시 사용 가능한 BOF로 취급할 수 없습니다.
이 저장소는 완성된 프로덕션 준비 구성 요소를 제공하기보다는 프레임워크와 구현 접근 방식을 시연하도록 설계되었습니다. 포함된 예제는 개별 사용 사례에 맞게 확장, 수정 및 적용되도록 의도되었습니다.