
macnoise v1.0.0
확장 가능한 MacOS 시스템 텔레메트리 생성기.
MacNoise
MacNoise는 실제 macOS 텔레메트리를 생성합니다: 네트워크 연결, 파일 쓰기, 프로세스 생성, plist 변경, TCC 프로브 등이 포함됩니다. EDR, SIEM 또는 방화벽 스택이 실행 중인 머신을 대상으로 지정하면 실제로 무엇이 발생하는지 확인할 수 있습니다. 벤더 데이터시트에서 발생한다고 주장하는 것이 아니라 실제로 발생하는 것을 볼 수 있습니다.
동기와 설계에 대한 배경은 릴리스 블로그 게시물을 참조하세요.
빠른 시작
# Build (add build-amd64 / build-arm64 to cross-compile for Darwin, or release for both)
make build
# List available modules
./macnoise list
# Run a single module
./macnoise run net_connect --param target=127.0.0.1 --param port=8080
# Preview without executing
./macnoise run svc_launch_agent --dry-run
# Run all network modules
./macnoise run --category network
# Run a scenario
./macnoise scenario configs/scenarios/edr_validation.yaml
# Emit structured JSONL output
./macnoise scenario configs/scenarios/file_flow.yaml --format jsonl --output /tmp/events.jsonl
텔레메트리 카테고리
| 카테고리 | 설명 |
|---|---|
network | TCP 연결, HTTP, 리스너, 리버스 셸, DNS, TLS |
process | 정확한 실행, 시그널 전달, dylib 주입, Gatekeeper 우회, osascript |
file | 범위가 제한된 탐색, 리터럴 읽기/복사, 생성, 수정, 아카이빙, 은닉, 디코이 암호화 |
tcc | 정확한 전체 디스크 접근, 연락처, 손쉬운 사용, 화면 기록 요구사항을 포함한 TCC 권한 프로브 |
credential | 네이티브 자격 증명 저장소 접근 |
volume | 디스크 이미지 생성 및 마운트된 볼륨 수명 주기 |
service | Launchd 열거, LaunchAgent/Daemon 지속성, cron, 셸 프로필, 로그인 항목 |
plist | Plist 생성 및 수정 |
evasion | 로그 삭제, 타임스톰핑, 기록 제거, 위장 |
모든 모듈, 매개변수, 출력, 이벤트 유형, 권한, ATT&CK 매핑은 생성된 모듈 카탈로그를 참조하십시오.
명령
macnoise run <module> [--param key=val ...] Run a specific module
macnoise run --category <cat> Run all modules in a category
macnoise run --all Run all modules
macnoise list [--category <cat>] List modules
macnoise info <module> Show module details, params, MITRE
macnoise scenario <file.yaml> [--input key=val] [--report report.json]
Run a YAML scenario
macnoise categories List categories with counts
macnoise version Print version
전역 플래그
| 플래그 | 기본값 | 설명 |
|---|---|---|
--format | human | 출력 형식: human 또는 jsonl |
--output | (없음) | 출력을 파일에 기록(stdout에 추가로) |
--verbose | false | 정리 오류를 포함한 상세 출력 |
--dry-run | false | 실행 없이 작업 미리보기 |
--no-cleanup | false | 모듈 아티팩트를 그대로 둠(아래 참조) |
--timeout | 30 | 모듈별 타임아웃(초) |
--audit-log | (없음) | OCSF 1.7.0 감사 레코드를 JSONL 파일에 기록 |
--config | (없음) | YAML 구성 파일에서 기본값 로드 |
--run-id | 생성됨 | 이 실행의 상관 관계 식별자 설정 |
시나리오 데이터 흐름
시나리오 파일은 version: 1을 사용합니다. 입력과 모듈 출력은 타입이 지정되며,
이후 단계에서는 문자열 보간 대신 명시적 매핑으로 이를 참조합니다:
version: 1
name: Archive one generated artifact
on_error: stop
inputs:
content:
type: string
required: true
steps:
# Custom modules declare these outputs through OutputSpecs.
- id: create
module: custom_create
params:
content:
input: content
- id: archive
module: custom_archive
params:
source:
output: create.path
outputs:
archive:
output: archive.path
모듈이 선언한 출력만 참조할 수 있습니다. 로컬 시나리오는 include 단계로 재사용할 수 있으며, include는 상대 경로이고 루트 시나리오 디렉터리 위로 이동할 수 없으며, 순환 검사를 거치고, 최대 8단계로 제한됩니다. MacNoise는 실행 전에 전체 그래프를 검증하고, 실행에 하나의 전용 작업 공간을 부여하며, 호출된 모듈을 역순으로 정리합니다. 입력을 제공하려면 --input content=value를, 버전이 지정된 실행 보고서에는 --report report.json을 사용하십시오.
아티팩트를 그대로 남겨두기
기본적으로 모든 모듈은 완료 시 스스로를 되돌립니다. 이는 보통 원하는 동작이지만, 그 결과 탐지는 설치 이벤트만 보게 됩니다. 여러분의 스택이 지속성 자체를 탐지하는지 검증하려면 - ~/Library/LaunchAgents에 있는 LaunchAgent, cron 항목, 수정된 셸 프로필 등 - 스캔이 실행될 때 해당 아티팩트가 여전히 존재해야 합니다:
./macnoise run svc_launch_agent --no-cleanup
정리를 건너뛰는 각 모듈은 자신의 이름을 출력하는 한 줄을 인쇄하며, 감사 로그에는 ok 대신 cleanup_result: skipped가 기록되므로, 지속성을 남긴 실행이 정리된 실행으로 오인되는 일은 결코 없습니다. 특정 모듈이 무엇을 생성하는지 확인하려면 macnoise info <module>을 사용하십시오.
이러한 항목을 제거하는 것은 사용자 본인의 책임입니다. 플래그 없이 동일한 모듈을 다시 실행하면 해당 실행이 생성한 것만 정리되며, 이전 --no-cleanup 실행이 남긴 것은 정리되지 않습니다.
감사 로깅
MacNoise는 두 개의 별도 스트림을 기록합니다. 텔레메트리 이벤트 - EDR/SIEM이 실제로 보는 것 - 는 stdout 또는 --output으로 전송됩니다. 두 번째의 선택적 스트림은 MacNoise 자체가 수행한 작업, 즉 어떤 모듈이 실행되었는지, 사전 요구사항/정리 결과, 그리고 MITRE 매핑을 OCSF 1.7.0 JSONL 형식으로 기록합니다.
./macnoise scenario configs/scenarios/amos_atomic_stealer.yaml --audit-log /tmp/audit.jsonl
모든 텔레메트리 이벤트는 하나의 권위 있는 outcome과 하나의 타입이 지정된 subject를 가집니다(스키마 2.0). outcome은 MacNoise가 시도한 동작에 무슨 일이 일어났는지를 나타내고, subject는 관련된 파일, 프로세스, 네트워크 엔드포인트, 서비스 또는 리소스를 식별합니다:
outcome | 의미 | 사람용 표식 |
|---|---|---|
executed | 동작이 실행되었고 모듈이 주장하는 대로 수행됨 | [+] |
denied | 동작이 실행되었으나 환경이 이를 거부함 | [-] |
indeterminate | 동작이 실행되었으나 아무것도 결론지을 수 없음 | [?] |
error | MacNoise 자체가 동작을 수행하지 못함 | [!] |
거부된 TCC 프로브나 죽은 C2로 향하는 비컨은 바로 이 도구가 생성하기 위해 존재하는 텔레메트리이므로, MacNoise 자체가 실패했음을 뜻하는 error와는 구별됩니다. 감사 로그는 동일한 값을 unmapped.outcome에 기록합니다. 민감하다고 선언된 매개변수는 관리형 감사 레코드와 명령줄 아이덴티티에서 [REDACTED]로 대체됩니다.
감사 로그는 추가 모드로 열리므로, 여러 실행의 레코드가 일괄 분석을 위해 하나의 파일에 쌓입니다. 모듈을 추가하면서 새 이벤트 유형이 OCSF로 어떻게 분류되는지 알고 싶다면 CONTRIBUTING.md를 참고하세요.
모듈 레퍼런스
생성된 모듈 카탈로그는 이름, 매개변수, 출력, 이벤트 유형, 권한 및 ATT&CK 매핑에 대한 권위 있는 레퍼런스입니다. 카테고리 노트는 플랫폼 동작과 운영 경계를 설명합니다:
| 카테고리 | README |
|---|---|
network | modules/network/README.md |
process | modules/process/README.md |
file | modules/file/README.md |
tcc | modules/tcc/README.md |
credential | modules/credential/README.md |
volume | modules/volume/README.md |
service | modules/service/README.md |
plist | modules/plist/README.md |
evasion | modules/evasion/README.md |
시나리오
시나리오는 모듈을 순서가 있는 시퀀스로 연결합니다 - 탐지 체계에 대해 다단계 침해 패턴을 재현하는 단일 YAML 파일입니다.
| 파일 | 설명 |
|---|---|
network_only.yaml | TCP, 리스너, DNS, HTTP 비컨, HTTP 유출 작업을 조합 |
edr_validation.yaml | 포괄적인 EDR 탐지 커버리지 |
full_sweep.yaml | 모든 카테고리 |
lazarus_group.yaml | Lazarus Group: dylib 인젝션, 서비스 탐색, 리버스 셸, LaunchAgent 지속성 |
amos_atomic_stealer.yaml | AMOS / Atomic Stealer: MaaS 인포스틸러, Gatekeeper 우회, 키체인 덤프, ZIP 유출, 백도어 지속성 |
clickfix.yaml | ClickFix: Terminal에 붙여넣는 난독화된 원라이너, base64 디코드, 2단계 페치, LaunchAgent 지속성 |
ransomware.yaml | 랜섬웨어 영향: 평문 미끼 파일 배치, 암호화, 그다음 랜섬 노트 드롭 |
discovery.yaml | argv 기반 시스템, 계정, 네트워크, 보안 소프트웨어 탐색 레시피를 조합 |
process_chain.yaml | 명시적 인자 벡터로 구성된 3개 프로세스 셸 체인 |
file_flow.yaml | 생성, 수정, 범위 제한 탐색, 읽기, 복사, 아카이브로 이어지는 연결된 흐름 |
mounted_execution.yaml | 관찰된 디스크 이미지 마운트 지점에서 페이로드를 생성하고 실행 |