Visualizzazione post con etichetta ping. Mostra tutti i post
Visualizzazione post con etichetta ping. Mostra tutti i post

martedì 6 luglio 2021

OS Fingerprinting: Individuare il sistema operativo attraverso il comando Ping

Ping (Packet internet groper) è un'utility di amministrazione per reti generalmente utilizzata per verificare la presenza e la raggiungibilità di un dispositivo di rete (Host) su una rete IP (Internet Protocol). 

Ping invia un pacchetto ICMP (Internet Control Message Protocol) di tipo Echo Request al sistema target e rimane in attesa di un pacchetto ICMP di tipo Echo Reply di risposta (solitamente la parte del sistema operativo dedicata alla gestione dello stack di rete è programmato per rispondere automaticamente con un pacchetto Echo Reply alla ricezione di un pacchetto Echo Request). In questo modo viene misurato il tempo, in millisecondi, impiegato da uno o  più pacchetti ICMP a raggiungere un dispositivo di rete e a ritornare indietro consentendo di misurare anche le latenze di trasmissione di rete.

Il Time to live (TTL) si riferisce alla quantità di tempo o salti (conosciuti anche con il termine HOPS e che rappresentano, in pratica, il numero di reti attraversate per raggiungere il destinatario) che un pacchetto è impostato per esistere all'interno di una rete prima di essere scartato da un router. I valori di default del TTL differiscono tra i vari sistemi operativi (si veda la tabella) il che consente di effettuare una prima ipotesi sul sistema operativo installato sull'host che si sta analizzando (OS fingerprinting).

Device / OSVersionProtocolTTL
AIX TCP60
AIX UDP30
AIX3.2, 4.1ICMP255
BSDIBSD/OS 3.1 and 4.0ICMP255
CompaTru64 v5.0ICMP64
Cisco ICMP254
DEC PathworksV5TCP and UDP30
Foundry ICMP64
FreeBSD2.1RTCP and UDP64
FreeBSD3.4, 4.0ICMP255
FreeBSD5ICMP64
HP-UX9.0xTCP and UDP30
HP-UX10.01TCP and UDP64
HP-UX10.2ICMP255
HP-UX11ICMP255
HP-UX11TCP64
Irix5.3TCP and UDP60
Irix6.xTCP and UDP60
Irix6.5.3, 6.5.8ICMP255
juniper ICMP64
MPE/IX (HP) ICMP200
Linux2.0.x kernelICMP64
Linux2.2.14 kernelICMP255
Linux2.4 kernelICMP255
LinuxRed Hat 9ICMP and TCP64
MacOS/MacTCP2.0.xTCP and UDP60
MacOS/MacTCPX (10.5.6)ICMP/TCP/UDP64
NetBSD ICMP255
Netgear FVG318 ICMP and UDP64
OpenBSD2.6 & 2.7ICMP255
OpenVMS07.01.2002ICMP255
OS/2TCP/IP 3.0 64
OSF/1V3.2ATCP60
OSF/1V3.2AUDP30
Solaris2.5.1, 2.6, 2.7, 2.8ICMP255
Solaris2.8TCP64
StratusTCP_OSICMP255
StratusTCP_OS (14.2-)TCP and UDP30
StratusTCP_OS (14.3+)TCP and UDP64
StratusSTCPICMP/TCP/UDP60
SunOS4.1.3/4.1.4TCP and UDP60
SunOS5.7ICMP and TCP255
UltrixV4.1/V4.2ATCP60
UltrixV4.1/V4.2AUDP30
UltrixV4.2 – 4.5ICMP255
VMS/Multinet TCP and UDP64
VMS/TCPware TCP60
VMS/TCPware UDP64
VMS/Wollongong1.1.1.1TCP128
VMS/Wollongong1.1.1.1UDP30
VMS/UCX TCP and UDP128
Windowsfor WorkgroupsTCP and UDP32
Windows95TCP and UDP32
Windows98ICMP32
Windows98, 98 SEICMP128
Windows98TCP128
WindowsNT 3.51TCP and UDP32
WindowsNT 4.0TCP and UDP128
WindowsNT 4.0 SP5- 32
WindowsNT 4.0 SP6+ 128
WindowsNT 4 WRKS SP 3, SP 6aICMP128
WindowsNT 4 Server SP4ICMP128
WindowsMEICMP128
Windows2000 proICMP/TCP/UDP128
Windows2000 familyICMP128
WindowsServer 2003 128
WindowsXPICMP/TCP/UDP128
WindowsVistaICMP/TCP/UDP128
Windows7ICMP/TCP/UDP128
WindowsServer 2008ICMP/TCP/UDP128
Windows10ICMP/TCP/UDP128


Per cercare di individuare il sistema operativo installato sull'Host target, basta eseguire un Ping. Supponiamo di voler analizzare un host che si trova sulla nostra stessa rete, il comando da eseguire sarà del tipo
ping 192.168.0.55
al posto dell'indirizzo IP possiamo utilizzare il nome Host.
Time to live 64
FIG 1 - Time to live 64


Come visibile in FIG 1, l'Host target ha risposto al ping con un TTL a 64 che, visionando i valori in tabella, ci fa desumere che siamo davanti ad un sistema *nix/Linux.
Questo è il caso più semplice infatti, trovandoci sulla stessa rete dell'Host target, il TTL non viene decrementato.

Quando l'Host target si trova su un'altra rete bisogna tener conto anche degli HOPS. Ad esempio, supponiamo di voler indagare sul sistema operativo che ospita il sito www.cisco.com.
Eseguiamo il ping verso il sito web
ping www.cisco.com 
Ping www.cisco.com
FIG 2 - Ping www.cisco.com


Il TTL restituito dal ping è 56 (FIG 2). Dato che mi aspetto si tratti di un sistema *nix/linux posso supporre che tra i due host, quello da cui è stato lanciato il comando e quello target, ci siano 8 router. Per verificarlo basta eseguire un traceroute.
In ambiente Windows il comando da eseguire è
tracert www.cisco.com
in ambiente linux il comando è
traceroute -n www.cisco.com
TraceRoute
FIG 3 - TraceRoute

Come visibile da FIG 3 tra i due host ci sono 8 router (il nono è l'indirizzo della macchina target).

I risultati ottenibili con questa tecnica non sono affidabili al 100% anche se si tratta del metodo meno invasivo e che da meno nell'occhio. Innanzitutto, come visibile in tabella, più sistemi operativi hanno lo stesso TTL inoltre i valori di default possono essere modificati. Risultati più attendibili possono essere ottenuti utilizzando tool come p0f, nmap e xprobe.




giovedì 14 marzo 2019

PowerShell: Creare un documento MS Excel contenente i risultati dei ping ad un elenco di postazioni

Potremmo trovarci nella situazione in cui ci viene richiesto di controllare se diverse postazioni siano connesse in rete. Il modo più semplice per eseguire tale controllo consiste nel verificare se le postazioni rispondono al ping. In questo articolo mostrerò come raggiungere tale obiettivo con uno script PowerShell che, dato un elenco di postazioni contenuto in un file di testo, provvede ad eseguire il ping e a memorizzare i risultati all'interno di un documento MS Excel.
Lo script può essere scaricato dal seguente link
DOWNLOAD
Script PowerShell PingHost2Excel
FIG 1 - Script PowerShell PingHost2Excel

La prima istruzione consiste nell'assegnare alla variabile $path il nome del file, comprensivo di percorso, contenente l'elenco delle workstation da verificare. Il contenuto del file sarà simile a quello mostrato in FIG 2: ogni riga contiene il nome della postazione da verificare.
Elenco Workstation da verificare
FIG 2 - Elenco Workstation da verificare

Successivamente con Test-Path verifichiamo se il file è presente, in caso contrario terminiamo lo script visualizzando il messaggio di file non trovato
$path = ".\ElencoWKS.txt"
if (Test-Path $path) 

Se il file contenente l'elenco delle workstation viene trovato procediamo alla creazione di un nuovo documento MS Excel e a posizionarci sul primo foglio di lavoro. 
$objExcel = new-object -comobject excel.application 

$objWorkbook = $objExcel.Workbooks.Add() 
$objWorksheet = $objWorkbook.Worksheets.Item(1)

Con la seguente istruzione facciamo in modo che il documento MS Excel sia visibile a video durante la compilazione.
$objExcel.Visible = $True

La prima riga del foglio di lavoro la utilizziamo come intestazione assegnando un nome a ciascuna colonna in base al contenuto che andremo successivamente ad inserire.
$objWorksheet.Cells.Item(1, 1) = "Nome Host"
$objWorksheet.Cells.Item(1, 2) = "Ping"
$objWorksheet.Cells.Item(1, 3) = "Indirizzo IP"


Nella variabile $wks andiamo a caricare l'elenco delle postazioni da analizzare. La variabile $row viene inizializzata a 2 (nella prima riga del foglio di lavoro abbiamo inserito l'intestazione) e verrà utilizzata per spostarci alla riga successiva man mano che verranno analizzate/inserite le workstation in elenco.
$wks= gc $path
$row=2

La parte più importante dello script è rappresentata dal ciclo foreach-object: per ogni postazione presente in elenco provvede ad inserire, all'interno del file MS Excel, il nome della postazione, l'esito del ping (OK se andato a buon fine o KO nel caso in cui non si riceve risposta) e l'eventuale indirizzo IP della postazione.
$wks| foreach-object{
 $ping=$null
 $workstation = $_
 $ping = Test-Connection $workstation -Count 1 -ea silentlycontinue
 $objWorksheet.Cells.Item($row,1) = $workstation
 
 if($ping){
  $objWorksheet.Cells.Item($row,2) = "OK"
  $objWorksheet.Cells.Item($row,3) = $ping.IPV4Address.IPAddressToString   
 }
 else {
  $objWorksheet.Cells.Item($row,2) = "KO"
  $objWorksheet.Cells.Item($row,3) = "-"
 }
  
 $row++
}


Foglio MS Excel con i risultati della verifica
FIG 3 - Foglio MS Excel con i risultati della verifica




martedì 5 febbraio 2019

PowerShell: Pingare più indirizzi IP

Supponiamo di voler verificare quali dispositivi siano attivi sulla nostra rete locale e che il nostro PC abbia indirizzo del tipo 192.168.1.x con subnet mask 255.255.255.0. Una soluzione semplice per individuare gli indirizzi IP attivi consiste nel pingare tutti gli indirizzi della rete e verificare se qualche dispositivo risponde. Per verificare tutti i 255 indirizzi della rete locale è possibile digitare il seguente comando in PowerShell:

1..255|ForEach-Object -process {ping -n 1 192.168.1.$_}|Select-String "TTL"

PowerShell, ping IP multipli
FIG 1 - PowerShell, ping IP multipli




martedì 2 agosto 2016

PowerShell: Verificare la presenza e raggiungibilità di un host in rete tramite Test-Connection

Chi lavora nel campo IT spesso utilizza l'utility Ping per verificare la presenza e raggiungibilità di un Host all'interno della rete. Il ping consiste nell'invio di un pacchetto ICMP (Internet Control Message Protocol) di tipo echo request e attendere in risposta un pacchetto ICMP di tipo echo reply.

Una funzione analoga in PowerShell può essere eseguita tramite il cmdlet Test-Connection. La sintassi del cmdlet è la seguente:

Test-Connection [-ComputerName] <String[]> [-AsJob] [-Authentication <AuthenticationLevel> {Default | None | Connect | Call | Packet | PacketIntegrity | PacketPrivacy | Unchanged} ] [-BufferSize <Int32> ] [-Count <Int32> ] [-Delay <Int32> ] [-Impersonation <ImpersonationLevel> {Default | Anonymous | Identify | Impersonate | Delegate} ] [-InformationAction <System.Management.Automation.ActionPreference> {SilentlyContinue | Stop | Continue | Inquire | Ignore | Suspend} ] [-InformationVariable <System.String> ] [-ThrottleLimit <Int32> ] [-TimeToLive <Int32> ] [ <CommonParameters>]


Parametri principali


-AsJob
Il parametro esegue il comando in background. Per poter utilizzare tale parametro è necessario eseguire PowerShell come amministratore

-Authentication<AuthenticationLevel>
Specifica il livello di autenticazione della connessione WMI (Test-Connection usa WMI). I valori accettati sono: UnchangedDefaultNoneConnectCallPacketPacketIntegrityPacketPrivacy

-BufferSize
Specifica la dimensione, in byte, del pacchetto inviato. Di default la dimensione è 32 byte.

-ComputerName
Si tratta di un parametro obbligatorio e consente di specificare il nome del computer da pingare o il suo indirizzo IP (in formato IPv4 o IPv6).

-Count
Specifica il numero di pacchetti/richieste da inviare. Di default vengono inviati 4 pacchetti.

-Credential
Specifica le credenziali dell'utente autorizzato ad inviare il ping dal computer specificato da -Source.

-Delay
Specifica l'intervallo, in secondi, tra i ping.

-Quiet
Specificando tale parametro verrà restituivo $true se l'host ha risposto al ping, $false in caso contrario. Tutti gli altri messaggi di risposta vengono soppressi.

-Source
Permette di specificare il nome del computer da cui parte il ping. Se non specificato il ping ha origine dal computer locale. É possibile indicare anche più origini del ping separandole tramite virgola.

-TimeToLive
Il parametro TimeToLive (TTL) permette di specificare il tempo di vita, in secondi, del pacchetto ICMP. Il parametro accetta valori interi compresi tra 1 e 255.



Esempi


Esempio 1
Test-Connection Server01
Test-Connection -ComputerName 192.168.0.1
Questi due comandi eseguono il ping rispettivamente verso il computer con nome Server01 e verso l'indirizzo 192.168.0.1. Nel primo comando il parametro -ComputerName viene omesso e indicato direttamente il nome del computer.
Test-Connection -ComputeName
FIG 1 - Test-Connection -ComputeName

Esempio 2
Test-Conntection -ComputerName Server01, Server02
É possibile passare a Test-Connection più host a cui inviare il pacchetto ICMP separandoli tramite virgola.

Esempio 3
Test-Connection -ComputerName 192.168.0.1 -Quiet
Con il parametro Quiet si riceve in output True o False a seconda se si riceve risposta o meno dal computer remoto. Questa caratteristica ci consente di utilizzarlo per verificare la raggiungibilità di un determinato host prima di tentare una qualsiasi operazione. Ad es. 
if (Test-Connection -ComputerName Server01 -Quiet) {New-PSSession Server01}
Test-Connection, parametro -Quiet
FIG 2 - Test-Connection, parametro -Quiet

Esempio 4
Test-Connection -Source Server02, Server03 -ComputerName Server01 -Credential Dominio\Utente
Questo comando invia ping da diversi mittenti/host ad un singolo computer Server01. Il parametro Credential viene utilizzato per specificare le credenziali di un utente che è abilitato all'invio di ping da Server02 e Server03. Questo comando può essere utile per verificare la latenza delle connessioni da diversi punti.