
이 프로젝트는 sleep과 python 언어 사이의 '브리지'입니다. 표준 GUI 클라이언트 없이 python을 통해 Cobalt Strike 팀서버를 제어할 수 있게 해줍니다. 참고: 이 프로젝트는 매우 베타 단계에 있습니다. 목표는 테스트를 위한 플레이그라운드를 제공하는 것이며, 공식적으로 지원되는 기능이 절대 아닙니다. 아마도 이는 향후 핵심 제품에 추가될 수 있는 무언가일 수 있습니다.
이 프로젝트는 sleep 언어와 python 언어 사이의 '브리지'입니다. 표준 GUI 클라이언트 없이 Python을 통해 Cobalt Strike 팀서버를 제어할 수 있게 해줍니다.
참고: 이 프로젝트는 매우 베타 단계에 있습니다. 목표는 테스트를 위한 플레이그라운드를 제공하는 것이며, 결코 공식 지원 기능이 아닙니다. 아마도 향후 핵심 제품에 추가될 수 있는 기능일 것입니다.
이 프로젝트는 @BinaryFaultline과 @Mcgigglez16이 https://github.com/emcghee/PayloadAutomation 프로젝트에서 수행한 작업에서 영감을 받았습니다. 두 분께 특별히 감사드립니다!!
이 브리지의 핵심은 Cobalt Strike의 헤드리스 클라이언트를 Python으로 구현한 것입니다. 이는 엔진으로 agscript가 제공하는 Aggressor Script Console을 사용하여 달성됩니다. Agscript는 Cobalt Strike(https://www.cobaltstrike.com/aggressor-script/index.html)와의 헤드리스 상호작용을 허용합니다. '브리지'는 sleepy.py의 Python 헬퍼 함수를 사용하여 agscript 콘솔이 기대하는 필요한 sleep 명령을 생성하는 방식으로 작동합니다. sleep 함수를 작성하는 대신 striker.py는 sleep을 추상화하고 Python을 사용할 수 있게 하는 헬퍼 함수를 제공합니다.
PayloadAutomation 프로젝트에서 영감을 받았기 때문에 동일한 코드가 많이 포함된 채 시작되었지만, agscript 래퍼 역할을 하는 데 필요한 구성 요소만 사용하도록 간소화하고 싶었습니다.
| 항목 | 설명 |
|---|---|
| sleep_python_bridge | Cobalt Strike와 인터페이스하기 위해 python을 허용하는 라이브러리 |
| output/html | html 데이터 뷰어 경로 |
| output/html/data | 데이터 뷰어에서 사용하는 json 데이터 경로 |
| output/payloads | 저장된 페이로드 경로(페이로드 생성기에 사용됨) |
| payload_scripts | payloadgenerator.py에 의해 로드될 외부 스크립트 경로 |
| beaconlogtracker.py | 비콘 로그를 표시하기 위해 HTML 데이터그리드를 사용하는 비콘 로그 추적기 구현 |
| payloadgenerator.py | 각 리스너에 대한 페이로드를 생성하는 비콘 페이로드 생성기 구현 |
| beacongrapher.py | 비콘을 HTML javascript 방향 그래프로 표시하는 비콘 그래프 추적기 구현 |
이 프로젝트의 예제가 가장 이해하기 쉬운 방법일 수 있지만, example.py 스크립트를 확인하세요.
#!/usr/local/bin/python3
## Import the bridge
from sleep_python_bridge.striker import CSConnector
from argparse import ArgumentParser
from pprint import pp, pprint
###################
## Argparse
def parseArguments():
parser = ArgumentParser()
parser.add_argument('host', help='The teamserver host.')
parser.add_argument('port', help='The teamserver port.')
parser.add_argument('username', help='The desired username.')
parser.add_argument('password', help='The teamserver password.')
parser.add_argument('path', help="Directory to CobaltStrike")
args = parser.parse_args()
return args
## Let's go
def main(args):
cs_host = args.host
cs_port = args.port
cs_user = args.username
cs_pass = args.password
cs_directory = args.path
## Connect to server
print(f"[*] Connecting to teamserver: {cs_host}")
with CSConnector(
cs_host=cs_host,
cs_port=cs_port,
cs_user=cs_user,
cs_pass=cs_pass,
cs_directory=cs_directory) as cs:
# Perform some actions
#
# Get beacon metadata - i.e., x beacons() from the script console
beacons = cs.get_beacons()
print("BEACONS")
pprint(beacons)
# Get list of listners - i.e., x listeners_stageless() from the script console
listeners = cs.get_listeners_stageless()
print("LISTENERS")
pprint(listeners)
if __name__ == "__main__":
args = parseArguments()
main(args)
스크립트 호출
python3 example.py 127.0.0.1 50050 example password /path/to/cobaltstrike

비콘 로그는 팀서버에서 런타임 중에 또는 팀서버에 저장된 비콘 로그 파일을 통해 확인할 수 있습니다. 데이터는 항상 존재하지만 원하는 방식으로 표시되지 않을 수 있습니다. 이는 HTML 데이터 그리드를 사용하여 비콘 로그를 빠르게 볼 수 있는 로그 추적기 예제입니다.
beaconlogtracker.py는 팀서버에 연결하여 실행 중인 비콘 로그를 30초마다 추출하고, <code>beaconlogs.json`에 저장한 다음, 검색 및 정렬 가능한 HTML 데이터 그리드로 표시하는 스크립트입니다.
비콘 로그는 항상 logs 디렉터리에 저장되지만, 이는 대체 뷰어로 메모리 내 로그를 추적하는 또 다른 방법입니다. 팀서버가 재시작되면 메모리 내 로그는 손실되며, 팀서버의 logs 디렉터리에 저장된 로그를 참조해야 합니다. 이 스크립트는 메모리 내 로그를 beaconlogs.json 파일에 동기화된 상태로 유지합니다. 이렇게 하면 Cobalt Strike가 재시작되더라도 logs 디렉터리를 뒤질 필요 없이 모든 데이터를 빠르고 쉽게 시각화할 수 있습니다.
스크립트를 시작하려면 팀서버에 연결하여 30초마다 로그를 동기화하세요.
사용법:
python3 beaconlogtracker.py 127.0.0.1 50050 logtracker password /path/to/cobaltstrike
이렇게 하면 beaconlogs.json이 저장된 비콘 로그와 실행 중인 비콘 로그에 동기화된 상태로 유지됩니다. 30초마다 동기화합니다.
output/html 디렉터리에서 웹 서버를 시작하세요.
python3 -m http.server 8000
http://localhost:8000/beaconlogs.html에 연결하세요.

레드 팀 운영자들이 자주 요청하는 기능 중 하나는 Cobalt Strike GUI 없이 프로그래밍 방식으로 페이로드를 생성하는 것입니다. 참조 프로젝트는 페이로드 생성기로 이 작업을 수행했습니다. 훌륭했지만, 독특한 과제가 하나 있습니다. Aggressor는 페이로드가 빌드되는 방식에 영향을 줄 수 있는 여러 훅을 제공합니다. 이러한 훅은 다양한 키트(예: artifact kit, sleep mask kit, UDRL kit)에서 사용됩니다. 일반적으로 GUI를 통해 aggressor 스크립트를 로드하여 사용합니다. 이 프로젝트는 외부 스크립트 로드를 허용하도록 확장되었습니다. 이것이 없으면 이러한 페이로드 훅을 사용하기 어려울 것입니다. 이 코드는 페이로드를 외부 함수에 전달하여 사용자 지정 난독화를 추가하거나, 고객 로더에 포함하거나, 다른 수정 작업을 수행하도록 쉽게 확장할 수 있습니다.
페이로드 생성기 스크립트는 팀서버에 연결하고 추가 스크립트를 로드한 다음 페이로드를 생성합니다.
python3 payloadgenerator.py 127.0.0.1 50050 payloads password /path/to/cobaltstrike 실행이 예제에서는 artifact 키트와 sleep mask 키트가 활성화된 Arsenal 키트를 추가하는 단계를 설명합니다.
cp -r /path/to/arsenal_kit/dist/* /path/to/sleep_python_bridge/payload_scriptspython3 payloadgenerator.py 127.0.0.1 50050 payloads password /path/to/cobaltstrike 실행일반적으로 GUI를 사용할 때 외부 스크립트는 println aggressor 함수를 사용하여 피드백이나 디버깅에 유용한 정보를 Script Console로 출력할 수 있습니다. payloadgenerator.py를 사용하면 println 출력이 손실되며 사용 가능한 유일한 옵션은 elog 함수입니다. elog를 사용할 때는 Event Log에서 정보를 보기 위해 GUI가 필요합니다.
'외부 키트 사용' 예제에 이어서 /path/to/sleep_python_bridge/payload_scripts/arsenal_kit.cna 파일을 업데이트하고 두 곳의 println을 elog로 변경하세요. 이 변경으로 모든 arsenal 키트 로깅이 이제 GUI Event Log에서 확인할 수 있습니다.
외부 스크립트 로드는 페이로드 훅(예: artifact, sleep mask, udrl 키트)을 포함하는 페이로드 수정 스크립트를 제외하고는 항상 필요한 것은 아닙니다. Cobalt Strike GUI에서 스크립트를 로드하면 페이로드는 GUI의 스크립트를 따르지만 agscript 클라이언트에서는 따르지 않습니다(서로 다른 클라이언트입니다). 스크립트와 지원 파일을 payload_scripts 디렉터리에 추가해야 합니다.
payloadgenerator.py는 payload_scripts 디렉터리의 최상위에 있는 모든 .cna 스크립트를 자동으로 로드합니다. 하위 디렉터리에 있는 .cna 스크립트는 로드되지 않습니다.
Arsenal 키트가 포함된 예제 디렉터리 구조.
$ ls -1R ./payload_scripts
./payload_scripts:
arsenal_kit.cna
artifact
sleepmask
./payload_scripts/artifact:
artifact32big.dll
artifact32big.exe
artifact32.dll
artifact32.exe
artifact32svcbig.exe
artifact32svc.exe
artifact64big.exe
artifact64big.x64.dll
artifact64.exe
artifact64svcbig.exe
artifact64svc.exe
artifact64.x64.dll
artifact.cna
./payload_scripts/sleepmask:
sleepmask.cna
sleepmask_pivot.x64.o
sleepmask_pivot.x86.o
sleepmask.x64.o
sleepmask.x86.o
@mgeeky가 제공한 최근 업데이트 덕분에 payloadgenerator.py 스크립트는 이제 4.8에서 추가된 새로운 artifact_payload 함수 매개변수를 지원하는 추가 인자를 지원합니다. 이 인자를 사용하면 생성되는 페이로드를 더 잘 제어할 수 있습니다.
$ python3 payloadgenerator.py --help
------------------------
Beacon Payload Generator
------------------------
usage: payloadgenerator.py [-h] [-o path] [-l name] [-a arch] [-t types] [-e exit] [-c method] host port username password path