
Douglas-042 HEADQUARTERS 수집기를 위한 중앙 콘솔. 플릿을 스캔하고, 호스트 간 결과를 상호 연관시키며, IOC 피드와 SIEM 전달을 한 곳에서 관리합니다.
Windows 및 Linux 호스트 플릿을 감시하여 침해 징후를 찾아내고, 실제로 중요한 것을 판단하여 조치합니다 — 하나의 콘솔에서, 호스트당 하나의 명령으로.
헌트는 스캔이 아닙니다. Douglas는 분석가가 직접 수집할 아티팩트 — 프로세스, 서비스, 예약된 작업, 자동 실행, 연결, 계정, 드라이버, 이벤트 로그, cron, systemd, 셸 기록, 웹 루트 — 를 수집하고, 이에 대해 201개의 내장 탐지와 사용자 정의 Sigma, YARA 및 커스텀 규칙을 실행합니다.
그런 다음 대부분의 도구가 사용자에게 남겨두는 부분을 처리합니다: 어떤 발견 사항에 아직 결정이 필요한지, 60개의 외부 주소 중 어떤 것을 먼저 봐야 하는지를 알려주고, RDP 세션을 열지 않고도 조치를 취할 수 있게 합니다.
deploy one command ──▶ hunt ──▶ findings appear live
│
┌──────────────────────┼──────────────────────┐
▼ ▼ ▼
IOC feed match reputation score response actions
"this is a known C2" "92/100, 340 reports" isolate · kill · collect
헌팅이 가장 필요한 환경은 종종 EDR이 없는 곳입니다: 서버 수십 대, 에이전트 예산 없음, 그리고 3일 전에 시작된 사고. 선택지는 보통 아무도 승인하지 않은 상용 플랫폼과 누군가 수동으로 실행하는 PowerShell 스크립트 폴더 사이입니다.
Douglas는 그 사이에 위치합니다. 조사 중인 호스트에 아무것도 설치되지 않습니다 — 수집기는 한 번 실행되고 종료됩니다 — 그리고 모든 결과는 다음에 사고를 이어받는 사람에게 넘길 수 있는 하나의 콘솔에 모입니다.
발견 사항은 생성하기 쉽고 읽기에는 비용이 많이 듭니다. 이 화면은 세 번째 검토에서도 누군가 여전히 읽고 있을 만큼 대기열을 짧게 유지하기 위해 존재합니다.
세 가지 결과가 있으며, 그 차이는 6개월 후에 중요해집니다:
| 결정 | 수행 내용 |
|---|---|
| Confirmed | 실제. 위험 점수에 남고, 호스트는 빨간색으로 유지됩니다. |
| False positive | 해당 호스트에 대해서만 점수에서 제외됩니다. |
| Suppression | 향후 모든 스캔에서 동일한 발견 사항을 숨기는 상시 규칙입니다. |
아무것도 삭제되지 않습니다. 억제를 철회하면 그것이 숨겼던 모든 것이 돌아옵니다. Noisiest rules가 하단에 있는 이유는 그것을 튜닝하는 것이 발견 사항을 하나씩 처리하는 것보다 대기열을 더 빨리 비우기 때문입니다.
201개의 탐지 모두 15개 카테고리로 그룹화되어 있습니다 — 하나씩 또는 전체 패밀리를 한 번에 전환할 수 있습니다. 규칙을 클릭하면 무엇을 검사하는지, 어떻게 정상적으로 발동하는지, 다음에 무엇을 해야 하는지 읽을 수 있습니다.
화면이 명확히 설명하는 구분은, 잘못 이해하기 흔하기 때문입니다:
규칙을 끄는 것은 억제하는 것과 다릅니다. 끄기는 수집기가 검사를 실행하지 않는다는 뜻입니다 — 아무것도 생성되지 않고 검토할 것도 없습니다. 억제는 발견 사항을 기록하고 이유와 함께 누군가 내린 결정으로 표시합니다.
수용한 노이즈 패밀리에는 끄기를 사용하십시오. 특정 호스트의 특정 패턴에는 억제를 사용하십시오.
Fired 아래의 대시는 보통 건강한 답입니다: DGL-014는 로그가 지워진 것처럼 보일 때만 발동합니다. 목록은 도구가 검사하는 것이지, 무엇이 잘못되었는지가 아닙니다.
양식은 첫 번째 규칙에는 더 빠르고 스무 번째 규칙에는 더 느립니다. 그래서 규칙은 텍스트로도 작성할 수 있습니다 — 11개 아티팩트 테이블과 13개 연산자에 대해 입력하는 동안 검사됩니다.
아래 상자는 두 가지 역할을 합니다. 규칙이 잘못되었을 때는 규칙이 아니라 줄을 지목합니다:
line 7: Condition 1: 'is_maybe' is not an operator.
올바를 때는 규칙이 실제로 무엇과 일치할지를 알려줍니다 — 검증은 통과하지만 작성자가 의도한 것과 다른 것과 일치하는 규칙이 잡아야 할 실패이기 때문입니다:
Valid — ACME-001 Reads Services and matches when Signed is false and PathName does not contain 'Program Files' and PathName does not contain 'System32'
JSON, YAML 또는 CSV로 가져오기 및 내보내기. 왕복이 보장됩니다 — 자체 내보내기는 세 가지 형식 모두에서 자체 검증기를 통과합니다.
| 질문 | 시점 | 결과 | |
|---|---|---|---|
| IOC feed | 이 C2 목록의 무언가가 내 호스트에 있는가? | 헌트 중 | DGL-IOC — 점수가 아닌 확인된 일치 |
15개 피드 소스가 바로 사용할 수 있게 제공됩니다 — Feodo, ThreatFox, URLhaus, TweetFeed, USOM, SSL Blacklist, Emerging Threats, OpenPhish, MISP — 그리고 인디케이터 형태의 데이터를 반환하는 모든 URL을 읽는 Custom feed가 있습니다.
4개 평판 제공자: AbuseIPDB, VirusTotal, ThreatFox (무료 티어) 및 GreyNoise (유료, 기본적으로 꺼짐). 판정은 절대 하나의 숫자로 혼합되지 않습니다 — AbuseIPDB는 불만을 세고, VirusTotal은 엔진을 세고, ThreatFox는 인프라를 알며, 이들의 평균은 그 누구도 방어하지 않을 수치입니다. 배지는 가장 나쁜 판정을 그것을 제공한 제공자와 함께 표시합니다.
무료 티어는 보호됩니다: 결과는 12시간 캐시되고, 실행당 40개 주소, 그리고 제공자가 멈추기 전에 멈추는 일일 카운터. 사설 주소는 절대 전송되지 않습니다.
세 그룹으로 나뉜 11개 작업 — look, act, contain. 5개의 읽기 전용 작업은 호스트를 변경하는 6개와 다르게 표시되며, 모든 변경 작업은 서면 이유를 요구합니다.
격리는 의도적으로 콘솔에 연결 가능한 상태를 유지합니다: 자체
에이전트로부터 차단된 호스트는 원격으로 해제할 수 없으며, 누군가 걸어가야
하기 때문입니다. 침입을 격리하기보다 기계를 망가뜨릴 대상 —
lsass.exe, systemd, pid 1, Administrator, /bin/bash — 은 경고가
아니라 거부됩니다. 이것이 사용되는 순간이 아무도 경고를 읽지 않는
순간이기 때문입니다.
출력은 터미널 덤프가 아닌 구조화된 카드로 돌아오며, 행은 실행 가능합니다: 프로세스 목록에는 행마다 Kill 버튼이, 주소에는 Reputation이 있습니다.
| Windows | Linux | |
|---|---|---|
| Sigma | Event Log + Sysmon | auditd execve + auth/cron/syslog |
| YARA | file content | file content |
로그 소스를 읽을 수 없는 Linux Sigma 규칙은 로드되어 결코 발동하지 않도록 방치되는 대신 이유와 함께 업로드 시 거부됩니다 — 실행될 수 없었던 규칙의 빈 결과는 깨끗한 호스트와 정확히 똑같이 보이기 때문입니다.
Linux 에이전트는 auditd가 설치되어 있고, 실행 중이며, 규칙이 로드되어
있는지 확인한 다음, 무엇이 빠졌고 그 비용이 무엇인지 알려줍니다:
Detection capabilities on this host
auditd : NOT RUNNING
Nothing records what executes on this host, so execution
rules cannot fire and a clean result only means the sweep
could not look. Install it:
apt install auditd && systemctl enable --now auditd
세 그룹의 11개 대상:
채팅 및 페이징 대상은 레코드가 아닌 문장을 렌더링하고, 한 메시지에 들어가는 발견 사항 수를 제한합니다: 백 줄이 붙여넣어지는 채널은 사람들이 음소거하는 채널입니다.
git clone https://github.com/YOURNAME/douglas-042.git
cd douglas-042
pip install -r requirements.txt
uvicorn app.main:app --host 0.0.0.0 --port 8000
또는 Docker로:
docker compose up -d
http://your-server:8000 을 여십시오.
기본 로그인
Username:
adminPassword:douglas콘솔은 첫 로그인 시 비밀번호 변경을 강제합니다 — 패키지에 내장된 기본값은 눈에 띄지 않고 살아남아서는 안 됩니다. 직접 선택하고 싶다면 첫 시작 전에
.env에DOUGLAS_CONSOLE_PASSWORD를 설정하십시오.
.env는 데이터베이스가 비어 있을 때만 읽힙니다. 첫 시작 후에는python3 -m app.manage passwd admin으로 재설정하십시오.
시작 시 다음 단계를 위한 등록 토큰을 받습니다:
Created the initial admin account: admin
The default password is still in use. Change it at first sign-in.
Enrollment token ready: dgl-enroll-xBAk8...
Douglas-042 console 1.0 ready
Deploy → 플랫폼 선택 → 명령 하나 복사.
Windows — 관리자 권한 PowerShell:
iex (irm 'http://console:8000/api/v1/reports/deploy/script?token=YOUR_TOKEN')
Linux — root로:
curl -sSL 'http://console:8000/api/v1/reports/deploy/script?token=YOUR_TOKEN&platform=linux' | sudo bash
터미널에 6단계가 스트리밍됩니다: 다운로드, 등록, 수집기 가져오기, 서비스 설치, 활성 상태 확인, 첫 체크인. 등록이 실패하면 아무것도 설치되지 않으며, 그렇게 알려줍니다.
┌──────────────────────────────────────────────────────────┐
│ Console — FastAPI + SQLite, one process, no queue │
│ triage · findings · graph · rules · response · reports │
└───────────────▲──────────────────────────────────────────┘
│ agents poll: heartbeat 20s, actions 5s
┌───────────────┴──────────────────────────────────────────┐
│ Agent (PowerShell / shell) │
│ └── Collector — runs, reports, exits │
│ 201 built-in rules + Sigma + YARA + your rules │
└──────────────────────────────────────────────────────────┘
Dashboard · Cases · Fleet · Hunts · Response · Findings · Triage · Frequency · Graph · MITRE matrix · Timeline · Diff · Built-in rules · My rules · Sigma · YARA · IOC feeds · Threat intel · Integrations · Schedules · Users · Deploy · Logs & events
Collection integrity · Autoruns and startup · Processes and network · Services and tasks · Persistence mechanisms · Security posture · Drivers and kernel · Execution evidence · Authentication and accounts · Remote access · Sysmon, Kerberos and AD · Files, webshells and exfiltration · User activity and trust · Rootkit and memory · Indicator matches
Both: local accounts and groups · running processes with signatures and hashes · TCP connections and external endpoints · services · recently written files · in-memory code · web roots and webshell patterns
Windows: event logs · scheduled tasks · autoruns · registry persistence · WMI subscriptions · drivers · SMB shares · Prefetch · certificate stores
Linux: cron · systemd units · shell startup files · LD_PRELOAD · setuid binaries · authorized_keys and sshd config · shell history · auth logs · kernel taint · WordPress
Console: Python 3.11+, six dependencies (FastAPI, uvicorn, SQLAlchemy, pydantic, python-multipart, PyYAML). Runs on a 1 GB VM.
Windows hosts: PowerShell 5.1+, administrator. Nothing else.
Linux hosts: bash and curl. python3 enables live progress and
file-content rules; auditd enables execution detections. The console tells
you which are missing on which host.
0600 권한으로 생성됩니다 — 패키지에 포함된 고정
키는 다운로드한 모든 사람이 공유하게 됩니다.📄 Technical Report (PDF) — 아키텍처, 모든 콘솔 화면, 37개 수집기 모듈 전체, 탐지 모델, 대응 작업 및 보안 모델을 다루는 14페이지.
Licensed under the MIT License. See LICENSE.
| Enrichment |
| 이 호스트가 60개 주소와 통신했다 — 어느 것을 먼저? |
| 헌트 후 |
| 92/100, 340 reports, known Cobalt Strike C2 |
| # | 화면 | 이렇게 하십시오 | 얻는 것 |
|---|
| 1 | IOC feeds | Feodo Tracker 추가, Refresh 누르기 | C2 탐지 — 작성할 규칙 없음 |
| 2 | Threat intel | 무료 AbuseIPDB 키 붙여넣기, Test 누르기 | 그래프의 트리아지 순서 |
| 3 | Fleet | 호스트 선택, Launch hunt | 발견 사항, 실시간 |
| 4 | Logs & events | 모듈 오류 확인 | 스윕이 실제로 볼 수 있었는지 여부 |
| 5 | Triage | 대기열 처리, 가장 시끄러운 규칙 튜닝 | 누군가 여전히 읽는 목록 |
| 6 | My rules | 6개 예제 로드, 하나 열기 | 직접 작성하는 방법 |
| 7 | Integrations | Slack webhook, 하한 HIGH | 지켜보지 않고도 알게 됨 |