
블루 팀을 위한 자동 BloodHound 그래프 업데이트 도구입니다. SIEM의 실시간 세션, 그룹 및 CVE 데이터를 통해 AD 공격 경로를 강화하여 지속적인 모니터링 및 경고를 가능하게 합니다.

BloodHound CE 7.0 릴리스부터 기본 데이터베이스가 Postgres로 전환되었습니다. 이 버전의 FalconHound는 여전히 Neo4j를 기본 데이터베이스로 사용합니다. 최신 BloodHound 버전과 함께 FalconHound를 계속 사용하려면 bloodhound.config.json 파일에 다음 줄을 추가하세요.```json "graph_driver": "neo4j",
BloodHound 팀은 최소 1년 동안 Neo4j를 계속 지원할 예정입니다. 이 기간 내에 대규모 API 개선이 있거나 FalconHound에 PGSQL 지원이 구현되기를 바랍니다.
---
FalconHound은 블루 팀 멀티 툴입니다. BloodHound의 기능을 보다 자동화된 방식으로 활용하고 강화할 수 있도록 설계되었습니다. SIEM 또는 기타 로그 집계 도구와 함께 사용하도록 설계되었습니다.
BloodHound의 까다로운 측면 중 하나는 특정 시점의 스냅샷이라는 점입니다. FalconHound에는 환경 그래프를 최신 상태로 유지하는 데 사용할 수 있는 기능이 포함되어 있습니다. 이를 통해 현재 환경을 실시간으로 확인할 수 있습니다. 이는 지속적으로 변화하는 환경에 특히 유용합니다.
BloodHound에서 수집하기 가장 어려운 관계 중 하나는 로컬 그룹 구성원 및 세션 정보입니다. 블루 팀원으로서 우리는 이 정보를 로그에서 쉽게 확인할 수 있습니다. FalconHound는 이 정보를 수집하여 그래프에 추가하고 BloodHound에서 사용할 수 있도록 하는 데 사용할 수 있습니다.
이는 FalconHound를 사용할 수 있는 한 가지 예시에 불과합니다. 로그나 보안 도구에 있는 모든 정보를 수집하여 BloodHound 그래프에 추가하는 데 사용할 수 있습니다.
또한 그래프를 사용하여 경보를 트리거하거나 강화 목록을 생성할 수 있습니다.
예를 들어, 사용자가 특정 그룹에 추가되면 FalconHound를 사용하여 그래프 데이터베이스에서 민감하거나 높은 권한의 그룹에 대한 최단 경로를 쿼리할 수 있습니다. 경로가 있으면 이를 SIEM에 기록하거나 경보를 트리거하는 데 사용할 수 있습니다.
FalconHound를 사용할 수 있는 다른 예시:
- 로그온 및 로그오프 이벤트를 기반으로 그래프에서 세션 추가, 제거 또는 타임아웃 처리.
- Sentinel 또는 MDE에서 인시던트가 발생한 경우 그래프에서 사용자 및 컴퓨터를 손상된 것으로 표시.
- CVE 정보와 공개 익스플로잇 사용 가능 여부를 그래프에 추가.
- 모든 종류의 Azure 활동.
- 사용자가 그룹에 추가되거나 새 역할을 가질 때 민감한 그룹에 대한 최단 경로 재계산.
- 새 사용자, 그룹 및 컴퓨터를 그래프에 추가.
- Sentinel 및 Splunk용 강화 목록 생성(예: Kerberoastable 사용자 또는 특정 엔터티 소유권을 가진 사용자).
가능성은 무궁무진합니다. 이슈 트래커에 더 많은 아이디어를 추가하거나 PR을 제출해 주세요.
개발 배경과 일부 사용 사례 예시를 자세히 설명하는 블로그 게시물은 [여기](https://medium.com/falconforce/falconhound-attack-path-management-for-blue-teams-42adedc9cae5?source=friends_link&sk=9f64b6b3028c5a2a6087d63b4fd2c82f)에서 확인할 수 있습니다.
색인:
- [지원되는 데이터 소스 및 대상](#supported-data-sources-and-targets)
- [설치](#installation)
- [사용법](#usage)
- [작업](#actions)
- [그래프 확장](#extensions-to-the-graph)
- [자격 증명 관리](#credential-management)
- [배포](#deployment)
- [라이선스](#license)
## 지원되는 데이터 소스 및 대상
FalconHound는 BloodHound와 함께 사용하도록 설계되었습니다. BloodHound를 대체하는 것이 아닙니다. BloodHound와 지원하는 모든 기타 데이터 플랫폼의 기능을 자동화된 방식으로 활용하도록 설계되었습니다.
현재 FalconHound는 다음 데이터 소스 및/또는 대상을 지원합니다:
- Azure Sentinel
- Azure Sentinel Watchlists
- Splunk
- Microsoft Defender for Endpoint
- Neo4j
- MS Graph API (초기 단계)
- CSV 파일
- Azure Data Explorer (ADX) - 베타
- LogScale
- BloodHound CE 및 BHE (초기 단계)
- MarkDown 파일
- Elastic (초기 단계)
향후 추가 데이터 소스 및 대상이 계획되어 있습니다.
현재 FalconHound는 BloodHound용 Neo4j 데이터베이스만 지원합니다. BH CE 및 BHE의 API 지원은 활발히 개발 중입니다.
---
## 설치
FalconHound는 Go로 작성되었으므로 설치가 필요 없습니다. 릴리스 섹션에서 바이너리를 다운로드하여 실행하기만 하면 됩니다.
Windows, Linux 및 MacOS용 컴파일된 바이너리가 제공됩니다. [릴리스](https://github.com/FalconForceTeam/FalconHound/releases) 섹션에서 찾을 수 있습니다.
실행하기 전에 구성 파일을 생성해야 합니다. 루트 폴더에서 예시 구성 파일을 찾을 수 있습니다. 모든 자격 증명을 생성하는 방법에 대한 지침은 [여기](https://github.com/falconforceteam/falconhound/blob/HEAD/docs/required_permissions.md)에서 확인할 수 있습니다.
FalconHound를 실행하는 권장 방법은 예약된 작업 또는 cron 작업으로 실행하는 것입니다. 이렇게 하면 정기적으로 실행하여 그래프, 경보 및 강화 목록을 최신 상태로 유지할 수 있습니다.
### 요구 사항
- BloodHound, 또는 현재로서는 최소한 Neo4j 데이터베이스
- SIEM 또는 기타 로그 집계 도구. 현재 Azure Sentinel 및 Splunk가 지원됩니다.
- [필요한 권한](https://github.com/falconforceteam/falconhound/blob/HEAD/docs/required_permissions.md)이 있는 각 엔드포인트에 대한 자격 증명
### 구성
FalconHound는 YAML 파일을 사용하여 구성됩니다. 루트 폴더에서 예시 구성 파일을 찾을 수 있습니다.
구성 파일의 각 섹션은 아래에 설명되어 있습니다.
---
## 사용법
#### 기본 실행
FalconHound를 실행하려면 바이너리를 실행하고 `-go` 매개변수를 추가하여 actions 폴더의 모든 쿼리를 실행하십시오.```bash
./falconhound -go
활성화된 모든 액션을 나열하려면 -actionlist 매개변수를 사용하세요. 이는 actions 폴더에 있는 설정 파일에서 활성화된 모든 액션을 나열합니다. -go 매개변수와 함께 사용해야 합니다.```bash
./falconhound -actionlist -go
### 선택한 액션 세트로 실행하기
선택한 액션 세트를 실행하려면 `-ids` 매개변수와 함께 하나 또는 쉼표로 구분된 여러 액션 ID를 사용하세요. 이렇게 하면 매개변수에 지정된 액션들이 실행되며, 테스트, 문제 해결 또는 특정하고 더 빈번한 업데이트가 필요할 때 매우 유용합니다. 이는 `-go` 매개변수와 함께 사용해야 합니다.```bash
./falconhound -ids action1,action2,action3 -go
기본적으로 FalconHound는 현재 디렉토리에서 설정 파일을 찾습니다. -config 플래그를 사용하여 설정 파일을 지정할 수도 있습니다. 이를 통해 서로 다른 환경에 대해 서로 다른 설정으로 FalconHound의 여러 인스턴스를 실행할 수 있습니다.```bash
./falconhound -go -config /path/to/config.yml
#### 다른 actions 폴더로 실행하기
기본적으로 FalconHound는 현재 디렉터리에서 actions 폴더를 찾습니다. `-actions-dir` 플래그를 사용하여 다른 폴더를 지정할 수도 있습니다. 이렇게 하면 테스트 및 문제 해결이 더 쉬워질 뿐만 아니라, 여러 FalconHound 인스턴스를 서로 다른 구성, 다른 환경, 또는 다른 시간 간격으로 실행할 수 있습니다.```bash
./falconhound -go -actions-dir /path/to/actions
기본적으로 FalconHound는 config.yml(또는 사용자 정의 로드된 파일)의 자격 증명을 사용합니다. -keyvault 플래그를 설정하면 FalconHound는 config에서 keyvault를 가져와 해당 위치에서 모든 비밀을 검색합니다. keyvault에 항목이 누락된 경우 config 파일로 대체됩니다. 관리 ID를 사용하여 azure keyvault에서 비밀을 가져오려면 authtype 변수를 msi로 정의하십시오.```bash
./falconhound -go -keyvault
## 액션
액션은 FalconHound의 핵심입니다. FalconHound가 실행할 쿼리입니다. 소스 및 대상의 기본 언어로 작성되며 actions 폴더에 저장됩니다. 각 액션은 별도의 파일이며, 정보의 소스인 쿼리 대상 디렉터리에 저장됩니다. 파일 이름이 액션의 이름으로 사용됩니다.
### 액션 폴더 구조
액션 폴더는 쿼리 소스별로 하위 디렉터리로 나뉩니다. 모든 폴더는 재귀적으로 처리되며 모든 YAML 파일은 알파벳 순서로 실행됩니다.
Neo4j 액션은 **마지막에** 처리되어야 합니다. 그 출력이 다른 데이터 소스가 먼저 그래프 데이터베이스를 업데이트하여 최신 결과를 얻는 데 의존하기 때문입니다.
### 액션 파일
모든 파일은 YAML 파일입니다. YAML 파일에는 쿼리, 일부 메타데이터 및 쿼리 정보의 대상이 포함됩니다.
루트 폴더에 템플릿 파일이 있습니다. 이를 사용하여 자신만의 액션을 만들 수 있습니다. 자세한 예제는 actions 폴더의 액션을 참조하십시오.
대부분의 항목은 상당히 명확하겠지만, 액션에 대해 주목해야 할 몇 가지 중요한 사항이 있습니다:
#### 활성화
이름에서 알 수 있듯이 액션을 활성화하거나 비활성화하는 데 사용됩니다. false로 설정되면 액션이 실행되지 않습니다.```yaml
Enabled: true
디버그 모드를 활성화하거나 비활성화하는 데 사용됩니다. true로 설정하면 작업이 디버그 모드로 실행됩니다. 쿼리 결과가 콘솔에 출력됩니다. 테스트 및 문제 해결에 유용하지만 프로덕션 환경에서는 사용하지 않는 것이 좋습니다. 결과 수에 따라 작업 처리 속도가 느려질 수 있습니다.```yaml Debug: false
#### Query
`Query` 필드는 소스에 대해 실행될 쿼리입니다. `SourcePlatform`에 따라 KQL 쿼리, SPL 쿼리 또는 Cypher 쿼리가 될 수 있습니다.
중요: 가능한 한 쿼리를 정확하게 유지하고 필요한 필드만 반환하도록 하세요. 이렇게 하면 결과 처리 속도와 효율성이 향상됩니다.
또한 Cypher 쿼리를 실행할 때는 결과로 JSON 객체를 RETURN해야 합니다. 그렇지 않으면 처리가 실패합니다.
예를 들어, 다음은 Azure Subscriptions의 Name, Count, Role 및 Owners를 반환합니다:```cypher
MATCH p = (n)-[r:AZOwns|AZUserAccessAdministrator]->(g:AZSubscription)
RETURN {Name:g.name , Count:COUNT(g.name), Role:type(r), Owners:COLLECT(n.name)}
각 대상에는 구성할 수 있는 여러 옵션이 있습니다. 대상에 따라 일부는 다른 대상보다 더 많은 구성이 필요할 수 있습니다.
모든 대상에는 Name 및 Enabled 필드가 있습니다. Name 필드는 대상을 식별하는 데 사용됩니다. Enabled 필드는 대상을 활성화 또는 비활성화하는 데 사용됩니다. 이것이 false로 설정되면 대상이 무시됩니다.
CSV는 {{date}} 변수를 지원하며, 현재 날짜로 대체됩니다. 형식은 YYYY-MM-DD입니다. 이를 사용하여 일일 보고서를 생성할 수 있습니다.
이는 폴더나 파일 이름(예: path/to/filename-{{date}}.csv) 또는 폴더 이름 자체에 사용될 수 있습니다.```yaml
#### Markdown
Markdown은 {{date}} 변수를 지원하며, 이 변수는 `YYYY-MM-DD` 형식의 현재 날짜로 대체됩니다. 이는 일일 보고서를 작성하는 데 사용할 수 있습니다.
이는 폴더나 파일 이름(예: `path/to/filename-{{date}}.md`) 또는 폴더 이름 자체에 사용할 수 있습니다.```yaml
- Name: Markdown
Enabled: true
Path: path/to/filename.md
예시 출력:```markdown
Description: Get a list of Domain Admins. Date: 2024-02-19
| Name | ObjectID |
|---|---|
| [email protected] | S-1-5-21-1122334455-112233445-1112223334-11223344 |
#### Neo4j
Neo4j 대상은 쿼리 결과를 Neo4j 데이터베이스에 기록합니다. 이 출력은 줄 단위로 이루어지므로 추가 구성이 필요합니다. 모든 종류의 데이터를 모든 방향으로 전송할 수 있기 때문에 FalconHound는 데이터를 어떻게 처리해야 하는지 이해해야 합니다. 이는 Cypher 쿼리의 첫 번째 줄에 대체 변수를 사용하여 수행됩니다. 이 변수들은 매개변수로 Neo4j에 전달되며 쿼리에서 사용할 수 있습니다.
`ReplacementFields` 필드는 아래에 구성되어 있습니다.```yaml
- Name: Neo4j
Enabled: true
Query: |
MATCH (x:Computer {name:$Computer}) MATCH (y:User {objectid:$TargetUserSid}) MERGE (x)-[r:HasSession]->(y) SET r.since=$Timestamp SET r.source='falconhound'
Parameters:
Computer: Computer
TargetUserSid: TargetUserSid
Timestamp: Timestamp
매개변수 섹션에는 쿼리 결과의 값으로 대체될 매개변수 집합이 정의되어 있습니다. 이들은 $parameter_name 구문을 사용하여 Neo4j 매개변수로 참조할 수 있습니다.
Sentinel 대상은 쿼리 결과를 Sentinel 테이블에 기록합니다. 테이블이 존재하지 않는 경우 생성됩니다. 테이블은 구성 파일에 지정된 작업 영역에 생성됩니다. 쿼리의 데이터는 EventData 필드에 추가됩니다. EventID는 작업 ID이고 Description은 작업 이름이 됩니다.
이것이 쿼리 출력도 제어해야 하는 이유이며, 그렇지 않으면 대상을 넘치게 할 수 있습니다.```yaml
#### Sentinel Watchlists
Sentinel Watchlists 대상은 쿼리 결과를 Sentinel 워치리스트에 기록합니다. 워치리스트가 존재하지 않으면 새로 생성됩니다. 워치리스트는 설정 파일에 지정된 작업 영역에 생성됩니다. 쿼리에서 반환된 모든 열이 워치리스트에 추가됩니다.```yaml
- Name: Watchlist
Enabled: true
WatchlistName: FH_MDE_Exploitable_Machines
DisplayName: MDE Exploitable Machines
SearchKey: DeviceName
Overwrite: true
WatchlistName 필드는 워치리스트의 이름입니다. DisplayName 필드는 워치리스트의 표시 이름입니다.
SearchKey 필드는 검색 키로 사용될 열입니다.
Overwrite 필드는 워치리스트를 덮어쓸지 아니면 추가할지 결정하는 데 사용됩니다. 이 값이 false로 설정되면 쿼리 결과가 워치리스트에 추가됩니다. true로 설정되면 워치리스트가 삭제되고 쿼리 결과로 다시 생성됩니다.
Sentinel과 마찬가지로 Splunk는 쿼리 결과를 Splunk 인덱스에 기록합니다. 인덱스는 생성되어 HEC 엔드포인트에 연결되어야 합니다. 쿼리의 데이터는 EventData 필드에 추가됩니다. EventID는 작업 ID가 되고 Description은 작업 이름이 됩니다.```yaml
#### Azure Data Explorer
Sentinel과 마찬가지로, Splunk는 쿼리 결과를 ADX 테이블에 씁니다. 쿼리의 데이터는 EventData 필드에 추가됩니다. EventID는 작업 ID가 되고, Description은 작업 이름이 됩니다.```yaml
- Name: ADX
Enabled: true
Table: "name"
ADX에서 테이블을 생성하려면 다음 명령을 사용할 수 있습니다:```kql .create table FalconHound (Name: string, Description: string, EventID: string, BHQuery: string, EventData: dynamic, Timestamp: datetime)
### 그래프 확장
#### 관계: HadSession
세션이 종료되면 그래프에서 제거해야 했지만, 이는 정보의 낭비처럼 느껴졌습니다. 따라서 세션을 제거하는 대신, 컴퓨터와 사용자 간의 관계로 추가됩니다. 이 관계는 `HadSession`이라고 불리며, 다음과 같은 속성을 갖습니다:```json
{
"till": "2021-08-31T14:00:00Z",
"source": "falconhound",
"reason": "logoff",
}
This allows for additional path discoveries where we can investigate whether the user ever logged on to a certain system, even if the session has ended.
FalconHound will add the following properties to nodes in the graph:
Computer: - 'exploitable': true/false - 'exploits': list of CVEs - 'exposed': true/false - 'ports': list of ports accessible from the internet - 'alertids': list of alert ids
The currently supported ways of providing FalconHound with credentials are:
The config file holds all details required by each platform. All items in the config file are case-sensitive. Best practise is to separate the apps on a per service level but you can use 1 AppID/AppSecret for all Azure based actions.
The required permissions for your AppID/AppSecret are listed here.
A more secure way of storing the credentials would be to use an Azure KeyVault. Be aware that there is a small cost aspect to using Keyvaults. Access to KeyVaults currently supports authentication based on a Managed System Identity or AppID/AppSecret which needs to be configured in the config.yml file.
The recommended way to set this up is to assign a Managed System Identity to the VM that FalconHound is running on and assign it the Key Vault Secrets User role to this Keyvault. This will allow FalconHound to authenticate to the Keyvault without the need for any additional configuration.
Alternatively you can use a ServicePrincipal that only has the Key Vault Secrets User role to this Keyvault. This role only allows access to the secrets, not even list them. Do NOT reuse the ServicePrincipal which has access to Sentinel and/or MDE, since this almost completely negates the use of a Keyvault.
The items to configure in the Keyvault are listed below. Please note Keyvault secrets are not case-sensitive.``` SentinelAppSecret SentinelAppID SentinelTenantID SentinelTargetTable SentinelResourceGroup SentinelSharedKey SentinelSubscriptionID SentinelWorkspaceID SentinelWorkspaceName MDETenantID MDEAppID MDEAppSecret Neo4jUri Neo4jUsername Neo4jPassword GraphTenantID GraphAppID GraphAppSecret AdxTenantID AdxAppID AdxAppSecret AdxClusterURL AdxDatabase SplunkUrl SplunkApiToken SplunkIndex SplunkApiPort SplunkHecToken SplunkHecPort BHUrl BHTokenID BHTokenKey LogScaleUrl LogScaleToken LogScaleRepository LimaCharlieAPIUrl LimaCharlieOrgId LimaCharlieIngestKey ElasticCloudID ElasticApiKey
구성이 완료되면 FalconHound를 시작할 때 `-keyvault` 매개변수를 추가할 수 있습니다.
#### 혼합 모드/폴백
명령줄에 `-keyvault` 매개변수가 설정되면 이 매개변수가 모든 필요한 비밀의 기본 소스가 됩니다. FalconHound가 항목을 검색하지 못하면 `config.yml`의 해당 항목으로 폴백됩니다. 둘 다 실패하고 해당 소스 또는 대상에 대해 활성화된 작업이 있는 경우 경고를 발생시키고 해당 작업을 건너뜁니다.
## 배포
FalconHound는 예약된 작업 또는 cron 작업으로 실행되도록 설계되었습니다. 이를 통해 정기적으로 실행하여 그래프, 알림 및 보강을 최신 상태로 유지할 수 있습니다. 활성화한 작업의 양, 처리하는 데이터의 양, 그래프에 쓰는 데이터의 양에 따라 시간이 다소 걸릴 수 있습니다.
모든 로그 기반 쿼리는 15분마다 실행되도록 설계되었습니다. 처리가 너무 오래 걸리면 이를 약간 조정해야 할 수도 있습니다. 이 경우 특정 작업을 비활성화하는 것이 좋습니다.
또한 예를 들어 세션 작업과 중복이 있을 수 있습니다. 세션이 많은 경우 Sentinel에 대한 세션 작업을 비활성화하고 MDE의 작업에 의존하는 것이 좋습니다. 이는 MDE와 Sentinel이 연결되어 있고 대부분의 머신이 MDE에 온보딩되었다고 가정합니다.
### Sharphound / Azurehound
FalconHound는 BloodHound와 함께 사용하도록 설계되었지만 Sharphound 및 Azurehound를 대체하는 것은 아닙니다. 수집을 보완하고 주기적인 수집의 특정 시점 문제를 제거하도록 설계되었습니다. 모든 유사한 데이터를 로그에서 사용할 수 있는 것은 아니므로 Sharphound와 Azurehound는 여전히 데이터를 수집하는 데 필요합니다.
Sharphound와 Azurehound는 정기적으로(예: 하루/한 주 또는 한 달에 한 번) 실행하고 FalconHound는 15분마다 실행하는 것이 좋습니다.
## 라이선스
이 프로젝트는 BSD3 라이선스에 따라 라이선스가 부여됩니다. 자세한 내용은 [LICENSE](https://github.com/falconforceteam/falconhound/blob/HEAD/LICENSE) 파일을 참조하세요.
이는 이 소프트웨어를 상업 제품을 포함하여 무료로 사용할 수 있지만, 출처를 표시해야 함을 의미합니다.
이 소프트웨어로 인해 발생하는 손해에 대해 당사는 책임을 지지 않습니다.