
NFStream: un framework flessibile per l'analisi dei dati di rete.

[NFStream][repo] è un framework Python multipiattaforma che fornisce strutture dati veloci, flessibili ed espressive progettate per rendere il lavoro con dati di rete online o offline facile e intuitivo. Il suo obiettivo è diventare il fondamentale blocco costitutivo di alto livello di Python per l'analisi pratica di dati di flusso di rete nel mondo reale. Inoltre, ha l'obiettivo più ampio di diventare un framework unificante per l'analisi dei dati di rete per i ricercatori, fornendo riproducibilità dei dati tra gli esperimenti.
| Notebook live |
|
| Sito del progetto |
|
| Canale di discussione |
|
| Ultima versione |
|
| Versioni supportate |
|
| Licenza del progetto |
|
| Integrazione continua |
Gli installer binari per l'ultima versione rilasciata sono disponibili su Pypi.```bash pip install nfstream
> **Note per Windows**: NFStream non include driver di cattura su Windows (restrizioni di licenza). È necessario
> installare i [driver Npcap][npcap] prima di installare NFStream.
> Se Wireshark è già installato su Windows, allora i driver Npcap sono già installati e non è necessario eseguire
> alcuna azione aggiuntiva.
## Come usarlo?
### Identificazione di applicazioni crittografate ed estrazione dei metadati
Gestisci un grande file pcap e vuoi aggregarlo in flussi di rete etichettati? **NFStream** rende questo percorso più semplice in poche righe:```python
from nfstream import NFStreamer
# We display all streamer parameters with their default values.
# See documentation for detailed information about each parameter.
# https://www.nfstream.org/docs/api#nfstreamer
my_streamer = NFStreamer(source="facebook.pcap", # or live network interface
decode_tunnels=True,
bpf_filter=None,
promiscuous_mode=True,
snapshot_length=1536,
idle_timeout=120,
active_timeout=1800,
accounting_mode=0,
udps=None,
n_dissections=20,
statistical_analysis=False,
splt_analysis=0,
n_meters=0,
max_nflows=0,
performance_report=0,
system_visibility_mode=0,
system_visibility_poll_ms=100)
for flow in my_streamer:
print(flow) # print it.
Ogni URL scoperto viene testato sistematicamente utilizzando tre approcci complementari progettati per massimizzare l'accuratezza del rilevamento eliminando i falsi positivi:
Verifica della Richiesta di Baseline
Test di Iniezione Completi
Analisi Avanzata della Risposta
Molteplici metodi di rilevamento lavorano insieme per eliminare i falsi positivi e confermare le vulnerabilità genuine, garantendo che solo i risultati verificati vengano segnalati.
Genera un report Markdown dettagliato (report_<target-host>_<timestamp>.md) che fornisce una panoramica completa dei test:
Il progetto sessionProbe è in fase di sviluppo attivo. Ci impegniamo per un miglioramento continuo e aggiorneremo regolarmente lo strumento con:```python
NFlow(id=0, expiration_id=0, src_ip='192.168.43.18', src_mac='30:52:cb:6c:9c:1b', src_oui='30:52:cb', src_port=52066, dst_ip='66.220.156.68', dst_mac='98:0c:82:d3:3c:7c', dst_oui='98:0c:82', dst_port=443, protocol=6, ip_version=4, vlan_id=0, tunnel_id=0, bidirectional_first_seen_ms=1472393122365, bidirectional_last_seen_ms=1472393123665, bidirectional_duration_ms=1300, bidirectional_packets=19, bidirectional_bytes=5745, src2dst_first_seen_ms=1472393122365, src2dst_last_seen_ms=1472393123408, src2dst_duration_ms=1043, src2dst_packets=9, src2dst_bytes=1345, dst2src_first_seen_ms=1472393122668, dst2src_last_seen_ms=1472393123665, dst2src_duration_ms=997, dst2src_packets=10, dst2src_bytes=4400, application_name='TLS.Facebook', application_category_name='SocialNetwork', application_is_guessed=0, application_confidence=4, requested_server_name='facebook.com', client_fingerprint='t12d1310h2_27a29bd8d6e6_85173d161f9a', server_fingerprint='2d1eb5817ece335c24904f516ad5da12', user_agent='', content_type='')
### Visibilità del sistema
NFStream sonda il kernel del sistema monitorato per ottenere informazioni sui socket Internet aperti e raccoglie dati di verità di base garantiti (nome del processo, PID, ecc.) a livello applicativo.```python
from nfstream import NFStreamer
my_streamer = NFStreamer(source="Intel(R) Wi-Fi 6 AX200 160MHz", # Live capture mode.
# Disable L7 dissection for readability purpose only.
n_dissections=0,
system_visibility_poll_ms=100,
system_visibility_mode=1)
for flow in my_streamer:
print(flow) # print it.
# See documentation for each feature detailed description.
# https://www.nfstream.org/docs/api#nflow
NFlow(id=0,
expiration_id=0,
src_ip='192.168.43.18',
src_mac='30:52:cb:6c:9c:1b',
src_oui='30:52:cb',
src_port=59339,
dst_ip='184.73.244.37',
dst_mac='98:0c:82:d3:3c:7c',
dst_oui='98:0c:82',
dst_port=443,
protocol=6,
ip_version=4,
vlan_id=0,
tunnel_id=0,
bidirectional_first_seen_ms=1638966705265,
bidirectional_last_seen_ms=1638966706999,
bidirectional_duration_ms=1734,
bidirectional_packets=98,
bidirectional_bytes=424464,
src2dst_first_seen_ms=1638966705265,
src2dst_last_seen_ms=1638966706999,
src2dst_duration_ms=1734,
src2dst_packets=22,
src2dst_bytes=2478,
dst2src_first_seen_ms=1638966705345,
dst2src_last_seen_ms=1638966706999,
dst2src_duration_ms=1654,
dst2src_packets=76,
dst2src_bytes=421986,
# The process that generated this reported flow.
system_process_pid=14596,
system_process_name='FortniteClient-Win64-Shipping.exe')
```
### Estrazione delle caratteristiche statistiche del flusso post-mortem
NFStream esegue l'estrazione di 48 caratteristiche statistiche del flusso post-mortem, che include un'analisi dettagliata dei flag TCP, minimo, medio, massimo e deviazione standard sia della dimensione dei pacchetti che del tempo di inter-arrivo in ciascuna direzione.```python
from nfstream import NFStreamer
my_streamer = NFStreamer(source="facebook.pcap",
# Disable L7 dissection for readability purpose.
n_dissections=0,
statistical_analysis=True)
for flow in my_streamer:
print(flow)
```
<!-- Nessun contenuto fornito -->```python
# See documentation for each feature detailed description.
# https://www.nfstream.org/docs/api#nflow
NFlow(id=0,
expiration_id=0,
src_ip='192.168.43.18',
src_mac='30:52:cb:6c:9c:1b',
src_oui='30:52:cb',
src_port=52066,
dst_ip='66.220.156.68',
dst_mac='98:0c:82:d3:3c:7c',
dst_oui='98:0c:82',
dst_port=443,
protocol=6,
ip_version=4,
vlan_id=0,
tunnel_id=0,
bidirectional_first_seen_ms=1472393122365,
bidirectional_last_seen_ms=1472393123665,
bidirectional_duration_ms=1300,
bidirectional_packets=19,
bidirectional_bytes=5745,
src2dst_first_seen_ms=1472393122365,
src2dst_last_seen_ms=1472393123408,
src2dst_duration_ms=1043,
src2dst_packets=9,
src2dst_bytes=1345,
dst2src_first_seen_ms=1472393122668,
dst2src_last_seen_ms=1472393123665,
dst2src_duration_ms=997,
dst2src_packets=10,
dst2src_bytes=4400,
bidirectional_min_ps=66,
bidirectional_mean_ps=302.36842105263156,
bidirectional_stddev_ps=425.53315715259754,
bidirectional_max_ps=1454,
src2dst_min_ps=66,
src2dst_mean_ps=149.44444444444446,
src2dst_stddev_ps=132.20354676701294,
src2dst_max_ps=449,
dst2src_min_ps=66,
dst2src_mean_ps=440.0,
dst2src_stddev_ps=549.7164925870628,
dst2src_max_ps=1454,
bidirectional_min_piat_ms=0,
bidirectional_mean_piat_ms=72.22222222222223,
bidirectional_stddev_piat_ms=137.34994188549086,
bidirectional_max_piat_ms=398,
src2dst_min_piat_ms=0,
src2dst_mean_piat_ms=130.375,
src2dst_stddev_piat_ms=179.72036811192467,
src2dst_max_piat_ms=415,
dst2src_min_piat_ms=0,
dst2src_mean_piat_ms=110.77777777777777,
dst2src_stddev_piat_ms=169.51458475436397,
dst2src_max_piat_ms=409,
bidirectional_syn_packets=2,
bidirectional_cwr_packets=0,
bidirectional_ece_packets=0,
bidirectional_urg_packets=0,
bidirectional_ack_packets=18,
bidirectional_psh_packets=9,
bidirectional_rst_packets=0,
bidirectional_fin_packets=0,
src2dst_syn_packets=1,
src2dst_cwr_packets=0,
src2dst_ece_packets=0,
src2dst_urg_packets=0,
src2dst_ack_packets=8,
src2dst_psh_packets=4,
src2dst_rst_packets=0,
src2dst_fin_packets=0,
dst2src_syn_packets=1,
dst2src_cwr_packets=0,
dst2src_ece_packets=0,
dst2src_urg_packets=0,
dst2src_ack_packets=10,
dst2src_psh_packets=5,
dst2src_rst_packets=0,
dst2src_fin_packets=0)
```
### Estrazione precoce delle caratteristiche statistiche dei flussi
NFStream esegue un'estrazione precoce (fino a 255 pacchetti) delle caratteristiche statistiche dei flussi (indicata come analisi SPLT in letteratura). Si riassume come una sequenza delle direzioni, delle dimensioni e dei tempi di inter-arrivo di questi pacchetti.```python
from nfstream import NFStreamer
my_streamer = NFStreamer(source="facebook.pcap",
# We disable l7 dissection for readability purpose.
n_dissections=0,
splt_analysis=10)
for flow in my_streamer:
print(flow)
```
Genera una lista finale di IOC di email e domini che possono essere utilizzati per il blocco o il rilevamento. L'output è un file JSON contenente tutti gli IOC con metadati.```python
# See documentation for each feature detailed description.
# https://www.nfstream.org/docs/api#nflow
NFlow(id=0,
expiration_id=0,
src_ip='192.168.43.18',
src_mac='30:52:cb:6c:9c:1b',
src_oui='30:52:cb',
src_port=52066,
dst_ip='66.220.156.68',
dst_mac='98:0c:82:d3:3c:7c',
dst_oui='98:0c:82',
dst_port=443,
protocol=6,
ip_version=4,
vlan_id=0,
tunnel_id=0,
bidirectional_first_seen_ms=1472393122365,
bidirectional_last_seen_ms=1472393123665,
bidirectional_duration_ms=1300,
bidirectional_packets=19,
bidirectional_bytes=5745,
src2dst_first_seen_ms=1472393122365,
src2dst_last_seen_ms=1472393123408,
src2dst_duration_ms=1043,
src2dst_packets=9,
src2dst_bytes=1345,
dst2src_first_seen_ms=1472393122668,
dst2src_last_seen_ms=1472393123665,
dst2src_duration_ms=997,
dst2src_packets=10,
dst2src_bytes=4400,
# The sequence of 10 first packet direction, size and inter arrival time.
splt_direction=[0, 1, 0, 0, 1, 1, 0, 1, 0, 1],
splt_ps=[74, 74, 66, 262, 66, 1454, 66, 1454, 66, 463],
splt_piat_ms=[0, 303, 0, 0, 313, 0, 0, 0, 0, 1])
```
### Interfaccia di esportazione Pandas
NFStream supporta nativamente Pandas come interfaccia di esportazione.```python
# See documentation for more details.
# https://www.nfstream.org/docs/api#pandas-dataframe-conversion
from nfstream import NFStreamer
my_dataframe = NFStreamer(source='teams.pcap').to_pandas()[["src_ip",
"src_port",
"dst_ip",
"dst_port",
"protocol",
"bidirectional_packets",
"bidirectional_bytes",
"application_name"]]
my_dataframe.head(5)
```

### Interfaccia di esportazione CSV
NFStream supporta nativamente il formato file CSV come interfaccia di esportazione.```python
# See documentation for more details.
# https://www.nfstream.org/docs/api#csv-file-conversion
flows_count = NFStreamer(source='facebook.pcap').to_csv(path=None,
columns_to_anonymize=(),
flows_per_file=0,
rotate_files=0)
```
### Estendere NFStream
Non hai trovato una funzionalità di flusso specifica? aggiungi un plugin a **NFStream** in poche righe:```python
from nfstream import NFPlugin
class MyCustomPktSizeFeature(NFPlugin):
def on_init(self, packet, flow):
# flow creation with the first packet
if packet.raw_size == self.custom_size:
flow.udps.packet_with_custom_size = 1
else:
flow.udps.packet_with_custom_size = 0
def on_update(self, packet, flow):
# flow update with each packet belonging to the flow
if packet.raw_size == self.custom_size:
flow.udps.packet_with_custom_size += 1
extended_streamer = NFStreamer(source='facebook.pcap',
udps=MyCustomPktSizeFeature(custom_size=555))
for flow in extended_streamer:
# see your dynamically created metric in generated flows
print(flow.udps.packet_with_custom_size)
```
### Addestramento e distribuzione di modelli di Machine Learning
Il seguente esempio semplicistico dimostra come addestrare e distribuire un approccio di machine learning per
la categorizzazione del flusso di traffico.
Vogliamo eseguire una classificazione dei flussi della categoria Social Network basata su bidirectional_packets e bidirectional_bytes
come caratteristiche di input. Per brevità, decidiamo di fare previsioni solo nella fase di scadenza del flusso.
#### Addestramento del modello```python
from nfstream import NFPlugin, NFStreamer
import numpy
from sklearn.ensemble import RandomForestClassifier
df = NFStreamer(source="training_traffic.pcap").to_pandas()
X = df[["bidirectional_packets", "bidirectional_bytes"]]
y = df["application_category_name"].apply(lambda x: 1 if 'SocialNetwork' in x else 0)
model = RandomForestClassifier()
model.fit(X, y)
```
#### ML powered streamer sul traffico live```python
class ModelPrediction(NFPlugin):
def on_init(self, packet, flow):
flow.udps.model_prediction = 0
def on_expire(self, flow):
# You can do the same in on_update entrypoint and force expiration with custom id.
to_predict = numpy.array([flow.bidirectional_packets,
flow.bidirectional_bytes]).reshape((1,-1))
flow.udps.model_prediction = self.my_model.predict(to_predict)
ml_streamer = NFStreamer(source="eth0", udps=ModelPrediction(my_model=model))
for flow in ml_streamer:
print(flow.udps.model_prediction)
```
Ulteriori esempi e dettagli sui NFPlugin sono forniti nella [**documentazione**][documentation] ufficiale. Puoi anche testare NFStream senza installazione utilizzando il nostro [**notebook demo live**][demo].
## Costruzione dai sorgenti ![l] ![m] ![w]
Per costruire **NFStream** dai sorgenti, leggi la [**guida all'installazione**][install] fornita nella documentazione ufficiale.
## Contribuire
Leggi [**Contribuire**][contribute] per dettagli sul nostro codice di condotta e il processo per inviare richieste pull.
## Etica
**NFStream** è destinato alla ricerca e alla forensica dei dati di rete. Ricercatori e data scientist di rete possono utilizzare questo framework per creare dataset affidabili e addestrare e valutare modelli di machine learning applicati alla rete. Come per qualsiasi strumento di monitoraggio dei pacchetti, **NFStream** potrebbe essere usato in modo improprio. **Non eseguirlo su alcuna rete di cui non sei proprietario o amministratore**.
## Crediti
### Citazione
L'[**articolo su NFStream**][doi] è pubblicato su [**Computer Networks (COMNET)**][comnet]. Se usi NFStream in una pubblicazione scientifica, apprezzeremmo citazioni al seguente articolo:``` latex
@article{AOUINI2022108719,
title = {NFStream: A flexible network data analysis framework},
author = {Aouini, Zied and Pekar, Adrian},
doi = {10.1016/j.comnet.2021.108719},
issn = {1389-1286},
journal = {Computer Networks},
pages = {108719},
year = {2022},
publisher = {Elsevier},
volume = {204},
url = {https://www.sciencedirect.com/science/article/pii/S1389128621005739}
}
```
### Autori
Le seguenti persone hanno contribuito a NFStream:
* [**Zied Aouini**](mailto:[email protected]): Creatore e sviluppatore principale.
* [**Adrian Pekar**](mailto:[email protected]): Co-creatore e sviluppatore principale.
* [**Romain Picard**](mailto:[email protected]): Implementazione dei plugin MDNS e DHCP.
* [**Radion Bikmukhamedov**](mailto:[email protected]): Lavoro iniziale sull'analisi SPLT NFPlugin.
* [**Jorge Casajús-Setién**](mailto:[email protected]): Implementazione del plugin per la firma JA4.
### Organizzazioni sostenitrici
Le seguenti organizzazioni hanno supportato NFStream:
* [**SoftAtHome**](https://www.softathome.com/): Sostenitore dello sviluppo di NFStream.
* [**Università Tecnica di Košice**](https://www.tuke.sk/): Hardware e infrastruttura per la generazione e l'archiviazione dei dataset.
* [**ntop**](https://www.ntop.org/): Supporto tecnico per l'integrazione di [**nDPI**][ndpi].
* [**The Nmap Project**](https://nmap.org): Supporto tecnico per l'integrazione di [**Npcap**][npcap] (installer OEM NPCAP su Windows CI).
* [**Google OSS Fuzz**](https://google.github.io/oss-fuzz/): Supporto continuo per test fuzzing del progetto NFStream.
[![sah]](https://www.softathome.com/) [![tuke]](https://www.tuke.sk/) [![ntop]](https://www.ntop.org/) [![nmap]](https://nmap.org/) [![google]](https://google.github.io/oss-fuzz/)
## Pubblicazioni che usano NFStream
Più di [**100 articoli di ricerca**](https://scholar.google.com/scholar?hl=en&as_sdt=2005&sciodt=0,5&cites=14084093141225707606&scipsc=) hanno già utilizzato NFStream come parte dei loro flussi di elaborazione.
## Licenza
Questo progetto è concesso in licenza LGPLv3 - consulta il file [**Licenza**][license] per i dettagli
[license]: https://raw.githubusercontent.com/nfstream/nfstream/master/LICENSE
[contribute]: https://nfstream.org/docs/community
[documentation]: https://nfstream.org/
[ndpi]: https://github.com/ntop/nDPI
[npcap]: https://npcap.org
[nfplugin]: https://nfstream.org/docs/api#nfplugin
[reliable]: http://people.ac.upc.edu/pbarlet/papers/ground-truth.pam2014.pdf
[repo]: https://nfstream.org/
[demo]: https://mybinder.org/v2/gh/nfstream/nfstream/master?filepath=demo_notebook.ipynb
[pypy]: https://www.pypy.org/
[cffi]: https://cffi.readthedocs.io/en/latest/goals.html
[sah]:https://raw.githubusercontent.com/nfstream/nfstream/master/assets/sah_logo.png?raw=true
[tuke]:https://raw.githubusercontent.com/nfstream/nfstream/master/assets/tuke_logo.png?raw=true
[ntop]:https://raw.githubusercontent.com/nfstream/nfstream/master/assets/ntop_logo.png?raw=true
[nmap]:https://raw.githubusercontent.com/nfstream/nfstream/master/assets/nmap_logo.png?raw=true
[google]:https://raw.githubusercontent.com/nfstream/nfstream/master/assets/google_logo.png?raw=true
[l]:https://github.com/ryanoasis/nerd-fonts/wiki/screenshots/v1.0.x/linux-pass-sm.png
[m]:https://github.com/ryanoasis/nerd-fonts/wiki/screenshots/v1.0.x/mac-pass-sm.png
[w]:https://github.com/ryanoasis/nerd-fonts/wiki/screenshots/v1.0.x/windows-pass-sm.png
[install]: https://www.nfstream.org/docs/#building-nfstream-from-sources
[doi]: https://doi.org/10.1016/j.comnet.2021.108719
[comnet]: https://www.sciencedirect.com/journal/computer-networks/vol/204/suppl/C
[packet]: https://manned.org/packet.7
|
|
| Qualità del codice |
|