-->

Intelligenza Artificiale

A un certo punto non fu più la biologia a dominare il destino dell'uomo, ma il prodotto del suo cervello: la cultura.
Cosicché: "Le uniche leggi della materia sono quelle che la nostra mente deve architettare e le uniche leggi della mente sono architettate per essa dalla materia".
JAMES CLERK MAXWELL

Codice per anomalie


Esempio di codice Python per rilevare traffico e verificare le sue anomalie

Catturare Traffico Anomalo

Cattura del traffico con PyShark

Nel primo esempio di codice, abbiamo catturato il traffico con PyShark utilizzando `capture.sniff(timeout=capture_duration)`.
Questi pacchetti catturati contengono molte informazioni che dobbiamo estrarre, come durata della connessione, byte inviati e ricevuti, protocolli, ecc.

Estrazione dei dati dai pacchetti

Dobbiamo elaborare i pacchetti catturati da PyShark per ottenere un dataset strutturato.
PyShark ci permette di accedere a campi specifici di ogni pacchetto, come il protocollo, il numero di byte inviati e ricevuti, il tempo di invio, ecc.
Ecco un esempio di codice aggiornato per estrarre le caratteristiche rilevanti dal traffico catturato con **PyShark**: Estrazione dei dati da pacchetti PyShark
 
import pyshark
import pandas as pd
from sklearn.ensemble import IsolationForest
from sklearn.preprocessing import LabelEncoder

# Passo 1: Cattura il traffico con PyShark (simulazione di traffico in tempo reale)
tshark_path = '/usr/local/bin/tshark'  # Modifica con il percorso corretto su macOS
pyshark.tshark.tshark_path = tshark_path

# Cattura il traffico per 60 secondi
capture_duration = 60  # 60 secondi di cattura
interface_name = 'en0'  # Interfaccia di rete (modifica con la tua interfaccia)

capture = pyshark.LiveCapture(interface=interface_name)
capture.sniff(timeout=capture_duration)

# Passo 2: Estrazione dei dati rilevanti dai pacchetti catturati
packets_data = []

for packet in capture:
    try:
        # Estrai le informazioni principali dai pacchetti
        protocol = packet.transport_layer  # Livello di trasporto (TCP/UDP)
        src_bytes = int(packet.length)  # Lunghezza del pacchetto in byte
        dst_bytes = int(packet.ip.len) if hasattr(packet, 'ip') else 0  # Byte di destinazione (livello IP)
        duration = float(packet.sniff_timestamp)  # Timestamp del pacchetto

        # Memorizza i dati in un dizionario
        packet_info = {
            'protocol': protocol,
            'src_bytes': src_bytes,
            'dst_bytes': dst_bytes,
            'duration': duration,
        }
        packets_data.append(packet_info)

    except AttributeError:
        # Salta i pacchetti che non hanno i campi richiesti
        continue

# Converti i dati in un DataFrame
df_captured = pd.DataFrame(packets_data)

# Pulizia e preprocessamento
# Sostituiamo i valori nulli (alcuni pacchetti potrebbero non avere tutti i campi)
df_captured.fillna(0, inplace=True)

# Convertiamo il protocollo in numerico (TCP=0, UDP=1, ICMP=2)
df_captured['protocol'] = df_captured['protocol'].map({'TCP': 0, 'UDP': 1, 'ICMP': 2}).fillna(3)

# Passo 3: Carica il dataset NSL-KDD per l'addestramento
url = "https://raw.githubusercontent.com/defcom17/NSL_KDD/master/KDDTrain+.txt"
column_names = [
    'duration', 'protocol_type', 'service', 'flag', 'src_bytes', 'dst_bytes',
    'land', 'wrong_fragment', 'urgent', 'hot', 'num_failed_logins', 'logged_in',
    'num_compromised', 'root_shell', 'su_attempted', 'num_root', 'num_file_creations',
    'num_shells', 'num_access_files', 'num_outbound_cmds', 'is_host_login',
    'is_guest_login', 'count', 'srv_count', 'serror_rate', 'srv_serror_rate',
    'rerror_rate', 'srv_rerror_rate', 'same_srv_rate', 'diff_srv_rate',
    'srv_diff_host_rate', 'dst_host_count', 'dst_host_srv_count', 'dst_host_same_srv_rate',
    'dst_host_diff_srv_rate', 'dst_host_same_src_port_rate', 'dst_host_srv_diff_host_rate',
    'dst_host_serror_rate', 'dst_host_srv_serror_rate', 'dst_host_rerror_rate',
    'dst_host_srv_rerror_rate', 'label'
]

nsl_kdd = pd.read_csv(url, names=column_names)
categorical_columns = ['protocol_type', 'service', 'flag']
encoder = LabelEncoder()

for col in categorical_columns:
    nsl_kdd[col] = encoder.fit_transform(nsl_kdd[col])

X_train = nsl_kdd.drop(columns=['label'])
y_train = nsl_kdd['label'].apply(lambda x: 0 if x == 'normal' else 1)

# Passo 4: Addestramento del modello
model = IsolationForest(contamination=0.1, random_state=42)
model.fit(X_train)

# Passo 5: Previsione sulle anomalie con il traffico catturato
df_captured['anomaly'] = model.predict(df_captured)

# Valori -1 indicano anomalie, 1 indica traffico normale
print(df_captured)
 
 

Descrizione del Codice

  • Cattura del traffico con PyShark: Il traffico viene catturato utilizzando PyShark sulla tua interfaccia di rete per 60 secondi. Vengono catturati vari campi dei pacchetti, come il protocollo (`TCP`, `UDP`), i byte inviati e ricevuti, e il timestamp (per calcolare la durata).
  • Estrazione dei dati rilevanti: I dati del traffico catturato vengono estratti dai pacchetti PyShark e organizzati in un DataFrame. Alcuni pacchetti potrebbero non avere tutti i campi necessari, quindi vengono gestiti con try-except per evitare errori.
  • Preprocessamento: I protocolli sono mappati a valori numerici (ad es. TCP=0, UDP=1). Vengono gestiti i valori mancanti e normalizzati i dati per l'uso con il modello di machine learning.
  • Addestramento del modello: Il modello **Isolation Forest** viene addestrato utilizzando il dataset **NSL-KDD**. Il modello viene addestrato a distinguere tra traffico normale e anomalie.
  • Previsione sulle anomalie: Il modello addestrato viene poi applicato al traffico catturato. I pacchetti vengono etichettati come anomalie (`-1`) o normali (`1`).

Output

Il DataFrame `df_captured` mostrerà il traffico catturato con una colonna aggiuntiva `anomaly`, in cui i pacchetti anomali vengono segnalati con `-1` e quelli normali con `1`.

   protocol  src_bytes  dst_bytes  duration  anomaly
0         0        100        500     1.23         1
1         1        150        520     1.45         1
2         0        200        550     1.67         1
3         1       3000       3000     1.89        -1  # Pacchetto anomalo

Conclusione

In questo esempio, abbiamo catturato il traffico di rete utilizzando PyShark, estratto i dati rilevanti dai pacchetti, e poi utilizzato un modello di machine learning addestrato su un dataset reale (**NSL-KDD**) per rilevare potenziali anomalie.
Questo approccio può essere esteso per monitorare il traffico di rete in tempo reale e identificare comportamenti sospetti o attacchi informatici.