
ProfileHound - 도메인 머신에 저장된 사용자 프로필을 수집하는 BloodHound OpenGraph 수집기입니다. 도메인 머신에서 활성 사용자 프로필을 식별하여 비밀 탈취에 대한 정보에 기반한 결정을 내릴 수 있습니다.
____ _____ __ __ __ __
/ __ \_________ / __(_) /__ / / / /___ __ ______ ____/ /
/ /_/ / ___/ __ \/ /_/ / / _ \/ /_/ / __ \/ / / / __ \/ __ /
/ ____/ / / /_/ / __/ / / __/ __ / /_/ / /_/ / / / / /_/ /
/_/ /_/ \____/_/ /_/_/\___/_/ /_/\____/\__,_/_/ /_/\__,_/
ProfileHound는 권한 상승 후(post-escalation) 도구로, 머신에서 도메인 사용자 프로필을 찾아 레드팀 목표를 달성하는 데 도움을 줍니다. BloodHound OpenGraph 형식을 사용하여 HasUserProfile이라는 새 엣지를 구축하며, 이 엣지는 컴퓨터에 사용자 프로필이 존재하는지 확인합니다. 이 엣지를 통해 운영자는 비밀을 약탈하기 위해 어떤 컴퓨터를 대상으로 할지 정보에 기반한 결정을 내릴 수 있습니다.
이 도구는 사용자 프로필을 열거하기 위해 대상 컴퓨터의 C$ 공유에 대한 관리자 액세스가 필요합니다.
Remi Gascou (@podalirius) 님의 ShareHound 및 bhopengraph 도구에 큰 감사를 드립니다. 이 데이터를 수집하는 도구를 오랫동안 만들고 싶었는데, 이 라이브러리들을 사용하여 기반 작업 대신 구축에 집중할 수 있었습니다.
[!WARNING] ProfileHound는 개발 초기 단계에 있으며 아직 모든 수집 모드가 구현되지 않았습니다. 프로덕션 환경에서 사용 시 주의하십시오. 이 도구 사용에 따른 위험은 사용자가 부담합니다.
Active Directory에서 포스트 익스플로잇 목표는 사내 데이터에서 SaaS 애플리케이션과 클라우드로 이동했습니다. 오프섹(offsec)에서 가치를 입증하려면 이러한 서비스에 대한 액세스가 어떻게 손상될 수 있는지 보여줘야 합니다. 대부분의 경우 이러한 서비스는 HR, 재무 등 특정 그룹이나 사용자만 사용합니다. 일부 시나리오에서는 특정 SaaS 애플리케이션에 특정 머신에서만 액세스할 수 있습니다.
BloodHound의 HasSession 엣지는 훌륭하지만, 사용자가 머신에 로그인한 경우에만 유용합니다. 데이터 수집 시점에 사용자가 머신에 로그인하지 않은 경우, 추가 익스플로잇을 용이하게 할 비밀이 포함된 컴퓨터를 찾기 어려울 수 있습니다. 사용자 프로필에는 DPAPI, 캐시된 자격 증명, SSH 키, 클라우드 키 등 상당량의 중요한 정보가 포함될 수 있습니다. 이러한 정보는 활성 사용자 세션이 없어도 액세스할 수 있습니다.

ProfileHound는 BloodHound의 OpenGraph 형식을 사용하여 HasUserProfile이라는 새 그래프 엣지를 구축하며, 이 엣지는 도메인 머신에 사용자 프로필이 존재하는지 확인합니다. 이는 운영자가 고가치 사용자나 그룹의 프로필이 있는 컴퓨터에 집중할 수 있도록 도와줍니다.
HasUserProfile 엣지에는 프로필 생성일 및 최종 수정일 속성이 포함됩니다. 이 정보를 통해 다음을 판단할 수 있습니다.

pipx를 사용하여 ProfileHound 설치 (의존성 지옥을 피하려는 경우):
pipx install profilehound
최신 버전을 사용하려면 소스에서 설치할 수 있습니다:
pipx install git+https://github.com/m4lwhere/profilehound.git
컨테이너화된 접근 방식을 사용하려면 다음 명령어로 이미지를 빌드하고 도구를 실행하십시오:
docker build -t profilehound .
docker run --rm profilehound --help
docker run --rm -v ${PWD}:/profilehound profilehound --auth-user alice --auth-password whiteRabbit --auth-domain sccm.lab --dns 192.168.57.10 --auth-dc-ip 192.168.57.10
예를 들어, 도메인 관리자 계정 sccm.lab\alice와 비밀번호 whiteRabbit을 사용하여 실행하려면:
$ profilehound --auth-user alice --auth-password whiteRabbit --auth-domain sccm.lab --target 192.168.57.0/27
____ _____ __ __ __ __
/ __ \_________ / __(_) /__ / / / /___ __ ______ ____/ /
/ /_/ / ___/ __ \/ /_/ / / _ \/ /_/ / __ \/ / / / __ \/ __ /
/ ____/ / / /_/ / __/ / / __/ __ / /_/ / /_/ / / / / /_/ /
/_/ /_/ \____/_/ /_/_/\___/_/ /_/\____/\__,_/_/ /_/\__,_/ v0.1.1
@m4lwhere
BloodHound CE OpenGraph collector for user profiles stored on domain machines.
[12/30/25 11:58:05] INFO Loaded 32 targets
[12/30/25 11:58:08] INFO Successful authentication on 192.168.57.10 (192.168.57.10) as sccm.lab\alice
INFO Successfully connected to share \\192.168.57.10\C$ as sccm.lab\alice
INFO Enumerating profiles in \\192.168.57.10\C$\Users\...
INFO vagrant: S-1-5-21-3016982856-3796307652-1246469985-1000 created:2025-11-07 modified:2025-11-07
INFO Found 1 domain profile(s) for 192.168.57.10
INFO Successful authentication on 192.168.57.11 (192.168.57.11) as sccm.lab\alice
[12/30/25 11:58:09] INFO Successfully connected to share \\192.168.57.11\C$ as sccm.lab\alice
INFO Enumerating profiles in \\192.168.57.11\C$\Users\...
INFO administrator: S-1-5-21-3016982856-3796307652-1246469985-500 created:2025-11-07 modified:2025-11-07
INFO alice: S-1-5-21-3016982856-3796307652-1246469985-1112 created:2025-12-28 modified:2025-11-07
INFO eve: S-1-5-21-3016982856-3796307652-1246469985-1116 created:2025-12-27 modified:2025-11-07
INFO Found 3 domain profile(s) for 192.168.57.11
INFO Successful authentication on 192.168.57.12 (192.168.57.12) as sccm.lab\alice
INFO Successfully connected to share \\192.168.57.12\C$ as sccm.lab\alice
INFO Enumerating profiles in \\192.168.57.12\C$\Users\...
INFO alice: S-1-5-21-3016982856-3796307652-1246469985-1112 created:2025-12-28 modified:2025-12-28
INFO franck: S-1-5-21-3016982856-3796307652-1246469985-1117 created:2025-12-27 modified:2025-11-07
INFO sccm-sql: S-1-5-21-3016982856-3796307652-1246469985-1121 created:2025-11-07 modified:2025-11-07
INFO Found 3 domain profile(s) for 192.168.57.12
INFO Successful authentication on 192.168.57.13 (192.168.57.13) as sccm.lab\alice
INFO Successfully connected to share \\192.168.57.13\C$ as sccm.lab\alice
INFO Enumerating profiles in \\192.168.57.13\C$\Users\...
INFO alice: S-1-5-21-3016982856-3796307652-1246469985-1112 created:2025-12-26 modified:2025-12-28
INFO sccm-account-da: S-1-5-21-3016982856-3796307652-1246469985-1119 created:2025-12-26 modified:2025-11-07
INFO Found 2 domain profile(s) for 192.168.57.13
[12/30/25 11:59:27] INFO Found 4 machines with profiles
INFO Exported OpenGraph intel to profilehound_20251230-115805.json
이렇게 하면 현재 디렉토리에 profilehound_20251230-115805.json 파일이 생성됩니다. 이 파일을 BloodHound UI로 드래그 앤 드롭하여 BHCE에 직접 가져올 수 있습니다. 자동으로 파싱되어 SID를 통해 노드를 연결합니다. 새 엣지 HasUserProfile이 생성되어 사용자와 프로필 간의 관계를 보여줍니다.
ProfileHound는 완료되면 콘솔에 작은 통계 요약을 추가로 출력합니다:
╭───────────────────────── General Summary ──────────────────────────────╮
│ ProfileHound Statistics │
│ Total Targets with Profiles 4 │
│ Total Unique Profiles (Users) 7 │
│ Average Profiles per Target 2.25 │
╰────────────────────────────────────────────────────────────────────────╯
Top Connected Users
┏━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ User ┃ Machine Count ┃
┡━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ alice │ 3 │
│ vagrant │ 1 │
│ administrator │ 1 │
│ eve │ 1 │
│ franck │ 1 │
└───────────────┴───────────────┘
Top Populated Machines
┏━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Machine ┃ Profile Count ┃
┡━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ 192.168.57.11 │ 3 │
│ 192.168.57.12 │ 3 │
│ 192.168.57.13 │ 2 │
│ 192.168.57.10 │ 1 │
└───────────────┴───────────────┘
Oldest User Profiles
┏━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ User ┃ Machine ┃ Created ┃ Last Modified ┃
┡━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ vagrant │ DC.sccm.lab │ 2025-11-07 │ 2025-11-07 │
│ sccm-sql │ MSSQL.sccm.lab │ 2025-11-07 │ 2025-11-07 │
│ administrator │ MECM.sccm.lab │ 2025-11-07 │ 2025-11-07 │
│ sccm-account-da │ CLIENT.sccm.lab │ 2025-12-26 │ 2025-11-07 │
│ alice │ CLIENT.sccm.lab │ 2025-12-26 │ 2025-12-28 │
└─────────────────┴─────────────────┴────────────┴───────────────┘
Longest Lived Profiles (Created -> Modified)
┏━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ User ┃ Machine ┃ Age (Days) ┃ Created ┃ Last Modified ┃
┡━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ alice │ CLIENT.sccm.lab │ 1.8 │ 2025-12-26 │ 2025-12-28 │
│ alice │ MSSQL.sccm.lab │ 0.0 │ 2025-12-28 │ 2025-12-28 │
│ sccm-sql │ MSSQL.sccm.lab │ 0.0 │ 2025-11-07 │ 2025-11-07 │
│ administrator │ MECM.sccm.lab │ 0.0 │ 2025-11-07 │ 2025-11-07 │
│ vagrant │ DC.sccm.lab │ 0.0 │ 2025-11-07 │ 2025-11-07 │
└───────────────┴─────────────────┴────────────┴────────────┴───────────────┘
Top 5 Machines to Focus On (Hubs)
┏━━━━━━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Machine ┃ Score ┃ Reason ┃
┡━━━━━━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ MECM.sccm.lab │ 4.5 │ Has 3 profiles, potential lateral movement hub │
│ MSSQL.sccm.lab │ 4.5 │ Has 3 profiles, potential lateral movement hub │
│ CLIENT.sccm.lab │ 3.5 │ Has 2 profiles, potential lateral movement hub │
│ DC.sccm.lab │ 1.0 │ Has 1 profiles, potential lateral movement hub │
└─────────────────┴───────┴────────────────────────────────────────────────┘
ProfileHound는 C$ 공유를 사용하여 \\<target>\C$\Users\에서 도메인 머신의 사용자 프로필을 열거합니다. 사용자의 NTUSER.DAT 파일을 읽어 파일 메타데이터에서 SID를 검색하여 도메인 계정인지 로컬 계정인지 확인합니다. 예를 들어, \\<target>\C$\Users\의 모든 사용자 디렉토리를 수집한 다음 각 디렉토리를 반복하여 \\<target>\C$\Users\<username>\NTUSER.DAT에서 NTUSER.DAT 파일을 찾습니다. NTUSER.DAT 파일이 잘 알려진 SID(well-known SID)에 소유된 경우, DPAPI 디렉토리(예: \\<target>\C$\Users\<username>\AppData\Roaming\Microsoft\Protect\<SID>)를 읽어 사용자의 SID를 찾으려고 시도합니다.
C$ 공유에 접근하므로 대상 머신에 인증하려면 관리자 계정이 필요합니다. ProfileHound는 제공된 자격 증명을 사용하여 대상 머신에 인증합니다. 도메인 계정을 사용하는 경우 --auth-domain 옵션으로 도메인을 지정할 수 있습니다. 로컬 계정을 사용하는 경우 --smb-local-auth 옵션을 사용하십시오.
기본적으로 ProfileHound는 계정 잠금 위험을 줄이기 위해 SMB 도메인 인증 실패 시 중지됩니다. 일부 엔드포인트가 도메인 인증을 거부할 것으로 예상되고 나머지 대상 스캔을 계속하려면 --smb-ignore-failed-domain-auth를 사용하십시오.
프로필이 이미 발견된 후 SMB 데이터 수집 중 ProfileHound가 중지되면, 종료 전에 부분적인 OpenGraph 결과를 내보내려고 시도합니다.
NTUSER.DAT 파일의 생성 시간과 최종 수정 시간이 수집되며, 이를 사용하여 프로필이 활성 상태인지 확인할 수 있습니다. 이 상관관계는 엣지 속성에 대한 cypher 쿼리 내에서 처리됩니다. 아래에 예시가 있습니다.
흥미로운 점은 NTUSER.DAT 파일의 최종 수정 시간이 생성 시간보다 이전인 경우, 프로필이 생성되었지만 실질적으로 사용되지 않았을 가능성이 높다는 것입니다. 이 조건은 새 사용자 프로필이 생성될 때 NTUSER.DAT 파일이 C:\Users\Default 프로필에서 복사되어 생성 시간이 더 나중임에도 동일한 수정 시간을 유지하기 때문에 발생합니다. 따라서 특정 프로필에 비밀이 포함되지 않을 것이라고 상당히 확신할 수 있습니다.
ProfileHound는 @podalirius_ 의 ShareHound를 라이브러리로 사용하여 대상을 열거합니다. --target 또는 --target-file 옵션이 제공되지 않으면 ProfileHound는 LDAP에 연결하여 도메인의 모든 머신 FQDN을 자동으로 수집합니다.
이 데이터에서 많은 강력한 결론을 도출할 수 있으며, 주의를 집중해야 할 위치를 알려줍니다. 이 모든 쿼리는 ProfileHound_Cypher_Queries.zip 파일을 BloodHound UI의 저장된 쿼리 페이지에서 가져오기 버튼을 사용하여 드래그 앤 드롭하면 BloodHound로 가져올 수 있습니다. 다음은 몇 가지 예시입니다:
이는 그래프에서 모든 사용자 프로필을 찾는 간단한 쿼리입니다.
MATCH p=(u:User)-[:HasUserProfile]->(c:Computer)
RETURN p
이는 도메인 "Administrators" 그룹의 구성원인 모든 사용자 프로필을 찾습니다.
MATCH p=(g:Group)<-[:MemberOf*1..]-(u:User)-[:HasUserProfile]->(c:Computer)
WHERE toLower(g.samaccountname) = "administrators"
RETURN p
이는 지난 3일 이내에 수정된 모든 사용자 프로필을 찾습니다. 이는 사용자 프로필이 사용자의 기본 머신일 가능성이 높고 좋은 전리품이 있을 수 있는 위치를 파악하는 데 도움이 됩니다.
WITH 3 as active_days
MATCH p = (u:User)-[e:HasUserProfile]-(c:Computer)
WHERE e.profileModified > (datetime().epochseconds - (active_days * 86400))
RETURN p
이는 특정 그룹의 구성원에 대해 지난 3일 이내에 사용된 특정 사용자 프로필을 찾는 매우 강력한 쿼리입니다.
WITH 3 as active_days, "administrators" as group_name
MATCH p = (g:Group)<-[:MemberOf*1..]-(u:User)-[e:HasUserProfile]-(c:Computer)
WHERE e.profileModified > (datetime().epochseconds - (active_days * 86400)) AND toLower(g.samaccountname) = group_name
RETURN p
이는 NTUSER.DAT 파일의 수정 시간이 생성 시간보다 이전인 모든 사용자 프로필을 제거합니다. 이는 프로필이 생성되었지만 실질적으로 사용되지 않았음을 나타냅니다. 이 조건은 새 사용자 프로필이 생성될 때 NTUSER.DAT 파일이 C:\Users\Default 프로필에서 복사되어 생성 시간이 더 나중임에도 동일한 수정 시간을 유지하기 때문에 발생합니다.
match p = (u:User)-[e:HasUserProfile]-(c:Computer)
where e.profileCreated < e.profileModified
return p
이 작업은 Remi Gascou (@podalirius) 님의 ShareHound 및 bhopengraph 라이브러리가 없었다면 불가능했을 것입니다.
이 도구의 초점은 특정 사용자에 대한 비밀이 포함될 가능성이 가장 높은 머신을 결정하는 것입니다. 향후 개선 사항은 다음과 같습니다:
get_lastlogon 함수를 사용하여 머신에서 HasUserProfile 엣지를 생성합니다.get_puser 함수를 사용하여 도메인 사용자를 특정 머신의 주요 장치 소유자로 연결합니다..data.owners[owner.DeviceOwner.onPremisesSecurityIdentifier]에서 AZDeviceOwner 객체로 수집되는 것으로 보입니다.NTUSER.DAT 파일에서 최근 프로그램, 문서 및 브라우저 활동을 마이닝합니다.