NetBIOS (ang. Network Basic Input/Output System) – interfejs programistyczny i protokół sieciowy opracowany w 1983 roku przez firmę Sytek na zlecenie IBM[1]. Zapewnia podstawowy interfejs łączenia aplikacji z innymi aplikacjami w innych komputerach znajdujących się w tej samej sieci lokalnej oraz umożliwia współdzielenie danych. NetBIOS działa w 5. warstwie (sesji) modelu OSI[2]. W sieciach TCP/IP działa jako NetBIOS over TCP/IP (NetBT)[1]. Jego częścią jest usługa nazw NetBIOS (ang. NetBIOS Name Service, w skrócie NBT-NS albo NBNS), dzięki której komputery w sieci lokalnej ustalają nawzajem swoje adresy IP na podstawie nazw, rozgłaszając zapytania do wszystkich maszyn w swoim segmencie sieci[1][3]. Systemy Windows sięgają po nią, gdy nazwy nie uda się ustalić przez DNS ani przez LLMNR[4].
NetBIOS definiuje dwa elementy: interfejs na poziomie sesji, czyli standardowe API, przez które aplikacje przekazują oprogramowaniu sieciowemu polecenia wejścia-wyjścia, oraz protokół zarządzania sesjami i transportu danych. Program korzystający z tego API działa z każdym oprogramowaniem protokołu, które obsługuje interfejs NetBIOS, np. z NetBEUI albo z NetBIOS over TCP/IP (NetBT). Działanie NetBT opisują dokumenty RFC 1001 i RFC 1002[1].
NetBT udostępnia trzy usługi, z których każda korzysta z osobnego portu[1][5]:
Usługa datagramów przesyła dane bezpołączeniowo, bez zachowania kolejności i bez gwarancji dostarczenia. Datagram może trafić do konkretnej nazwy albo zostać rozgłoszony (broadcast) do grupy nazw. Usługa sesji działa połączeniowo, zachowuje kolejność przesyłanych komunikatów i gwarantuje ich dostarczenie. Korzysta z połączeń TCP, które nawiązuje, podtrzymuje i zamyka[1].
Każdy zasób NetBIOS w sieci ma 16-bajtową nazwę NetBIOS, unikatową albo grupową. W systemach Windows usługi tworzą swoje nazwy z nazwy komputera, uzupełnionej spacjami do 15 znaków, a szesnasty znak określa rodzaj usługi. Usługa udostępniania plików i drukarek używa na przykład znaku o kodzie 0x20[6].
Uruchamiany komputer rejestruje swoje nazwy, rozgłaszając w sieci żądanie rejestracji albo kierując je do serwera nazw NetBIOS, takiego jak WINS. Jeżeli nazwa jest już zajęta, inny komputer albo serwer nazw odpowiada odmową. Gdy aplikacja chce połączyć się z innym komputerem, NetBT ustala jego adres IP, rozgłaszając zapytanie o nazwę w sieci lokalnej albo wysyłając je do serwera nazw[1]. Sposób rozwiązywania nazw zależy od typu węzła NetBIOS określonego w RFC 1001[6]:
Komputery z systemem Windows 2000 działały domyślnie jako B-node, a po skonfigurowaniu serwera WINS jako H-node[6].
Rozgłaszanie zapytań ma dwie wady. W dużych sieciach zwiększa obciążenie, a ponieważ routery zwykle nie przekazują rozgłoszeń, pozwala rozwiązywać wyłącznie nazwy komputerów w tej samej sieci lokalnej[6]. NetBT działa przy tym tylko w sieciach IPv4. W systemach Windows Vista i Windows Server 2008 Microsoft wprowadził obsługujący także IPv6 protokół LLMNR, który pełni podobną funkcję w sieci lokalnej. Rozwiązując nazwę jednoetykietową, Windows Vista odpytuje najpierw DNS, potem LLMNR, a jeżeli i to zawiedzie, a NetBT jest włączony, rozgłasza do trzech zapytań NetBIOS[4].
Ponieważ zapytania NBT-NS trafiają do wszystkich komputerów w segmencie sieci, każdy z nich, w tym komputer napastnika, może na nie odpowiedzieć. Wykorzystuje to zatruwanie NBT-NS, sklasyfikowane w MITRE ATT&CK razem z zatruwaniem LLMNR jako podtechnika T1557.001. Napastnik odpowiada na zapytania wysyłane na port 137 UDP, podając się za poszukiwany komputer. Jeżeli ofiara łączy się z zasobem wymagającym uwierzytelnienia, przesyła mu nazwę użytkownika i skrót Net-NTLMv2 (zwany też NTLMv2), który można potem łamać offline albo przekazać dalej w ataku typu relay[7]. Przedrostka Net- używa się, aby odróżnić ten skrót, powstający przy uwierzytelnianiu w sieci, od przechowywanego lokalnie skrótu NTLM, z którym bywa mylony[7]. Do takich ataków służą m.in. narzędzia NBNSpoof, Metasploit i Responder. Jako przeciwdziałanie MITRE wskazuje wyłączenie NetBIOS, LLMNR i mDNS tam, gdzie nie są potrzebne, blokowanie ich ruchu oraz podpisywanie pakietów SMB, które zatrzymuje ataki typu relay[3].
Amerykańska CISA opisuje wyłączenie NetBIOS jako osobne przeciwdziałanie o identyfikatorze CM0052. Zaleca wyłączenie NetBIOS over TCP/IP na wszystkich urządzeniach w sieci, a jeśli nie jest to możliwe, ograniczenie ruchu NetBIOS do określonych adresów IP i blokowanie go na styku z internetem. Usługę wyłącza się w ustawieniach karty sieciowej. Zasady grupy tego nie umożliwiają, dlatego na wielu komputerach naraz robi się to skryptem PowerShell[5]. W sieciach z serwerem DHCP firmy Microsoft NetBIOS over TCP/IP można też wyłączyć centralnie opcją 001 (Microsoft Disable Netbios Option) o wartości 0x2, o ile komputery klienckie pobierają ustawienie NetBIOS z serwera DHCP[8].