Zeek-based Network Traffic Data Processing

In this part of the tutorial, we will transform network traffic capture into a graph and store it in the graph database Dgraph. To do this, we will use the Granef toolkit, which simplifies the whole data transformation process. We will then look at analyzing these graph data using the "Okay-boomer" exercise from https://www.malware-traffic-analysis.net/2019/11/12/index.html.

Please check the Requirements section with all essential information and ensure that you have everything prepared.

Initial steps

To facilitate all the data transformation steps, we use the Granef toolkit, which automates the transformation and handles communication with containers environment. You can check its arguments using the following command.

linux:$ granef -h
usage: granef [-h] [-c CONFIGURATION_FILE]
              (-p | -n | -r {images,network,operations,all} | -o {extraction,transformation,indexing,handling,analysis} | -a)
              [-t {run,stop,start,remove}] [-i INPUT_FILE_OR_DIRECTORY_PATH] [-s CASE_NAME]
              [-l {debug,info,warning,error,critical}]

optional arguments:
  -h, --help            show this help message and exit
  -c CONFIGURATION_FILE, --configuration CONFIGURATION_FILE
                        Configuration file
  -p, --pull            Pull all images
  -n, --network         Create network
  -r {images,network,operations,all}, --remove {images,network,operations,all}
                        Remove specified objects
  -o {extraction,transformation,indexing,handling,analysis}, --operation {extraction,transformation,indexing,handling,analysis}
                        Select operation
  -a, --all             Setup containers environment and perform all operations
  -t {run,stop,start,remove}, --task {run,stop,start,remove}
                        Select operation task
  -i INPUT_FILE_OR_DIRECTORY_PATH, --input INPUT_FILE_OR_DIRECTORY_PATH
                        Input file or directory path
  -s CASE_NAME, --source CASE_NAME
                        Case name stored as a source to each node
  -l {debug,info,warning,error,critical}, --log {debug,info,warning,error,critical}
                        Log level 

The first thing you need to do is pull all the container images (requires approximately 1.9 GB disk space).

linux:$ granef -p
2023-06-20 12:40:45 granef [INFO]: Container image pull: extraction-zeek
2023-06-20 12:40:54 granef [INFO]: Container image pull: transformation-zeek-dgraph
2023-06-20 12:40:56 granef [INFO]: Container image pull: dgraph-handler
2023-06-20 12:41:03 granef [INFO]: Container image pull: analysis-api
2023-06-20 12:41:04 granef [INFO]: Container image pull: analysis-web
2023-06-20 12:41:16 granef [INFO]: All container images pulled successfully               

Next, we need to create a virtual network. After that, the initial preparation is complete.

linux:$ granef -n
2023-06-20 12:42:36 granef [INFO]: Creating network: granef-network
2023-06-20 12:42:36 granef [INFO]: Network granef-network created successfully

Data extraction

The first step of the transformation is extracting information from the capture. This tutorial uses the Zeek Network Security Monitor to parse the packet capture and extract relevant information. Granef uses Zeek as a default option to extract the data.

In the Granef toolkit, the Zeek is part of the extraction module, which can be executed using the following command.

linux:$ granef -i tutorial-data/tutorial.pcap -o extraction -t run
2023-06-20 12:43:25 granef [INFO]: Starting extraction operation parts
2023-06-20 12:43:25 granef [INFO]: Running container 'granef-extraction' from image: registry.gitlab.ics.muni.cz:443/granef/extraction-zeek:latest
2023-06-20 12:43:32 granef [INFO]: All extraction operation parts has been started

The result of the extraction operation is individual Zeek logs placed in the same folder as the original capture.

linux:$ ls tutorial-data/
exercise.pcap  granef-extraction
linux:$ ls tutorial-data/granef-extraction/zeek/
capture_loss.log  dpd.log       known_hosts.log     ntlm.log           pe.log           software.log  x509.log
conn.log          files.log     known_services.log  ntp.log            reporter.log     ssl.log
dce_rpc.log       http.log      loaded_scripts.log  ocsp.log           smb_files.log    stats.log
dns.log           kerberos.log  notice.log          packet_filter.log  smb_mapping.log  weird.log
linux:$ head -n 2 tutorial-data/granef-extraction/zeek/conn.log
{"ts":"2019-11-11T22:20:03.578876Z","uid":"C2KIKuCsugXQc6G71","id.orig_h":"10.11.11.145","id.orig_p":35962,"id.resp_h":"8.8.8.8","id.resp_p":53,"proto":"udp","service":"dns","duration":0.01794600486755371,"orig_bytes":30,"resp_bytes":62,"conn_state":"SF","local_orig":true,"local_resp":false,"missed_bytes":0,"history":"Dd","orig_pkts":1,"orig_ip_bytes":58,"resp_pkts":1,"resp_ip_bytes":90}
{"ts":"2019-11-11T22:20:07.717444Z","uid":"Co5Sdd1YADYjYjB1jl","id.orig_h":"10.11.11.179","id.orig_p":65101,"id.resp_h":"10.11.11.11","id.resp_p":53,"proto":"udp","service":"dns","duration":0.981281042098999,"orig_bytes":64,"resp_bytes":367,"conn_state":"SF","local_orig":true,"local_resp":true,"missed_bytes":0,"history":"Dd","orig_pkts":2,"orig_ip_bytes":120,"resp_pkts":1,"resp_ip_bytes":395}

Data transformation

The second step is the transformation of Zeek logs into the format suitable for a graph database according to the defined schema. Granef toolkit uses the scalable graph database Dgraph, which allows us to store and subsequently query large amounts of data. This database uses RDF triplets as input, so the toolkit contains a custom script that transforms Zeek logs into this format.

The data is transformed according to the schema, which description can be found on the Granef toolkit website (don't forget to take a look at the interactive diagram): https://granef.csirt.muni.cz/#database.

Use the following command to transform the Zeek logs (please check the module documentation to see which log files are currently supported).

linux:$ granef -i tutorial-data/tutorial.pcap -o transformation -t run
2023-06-20 12:43:46 granef [INFO]: Starting transformation operation parts
2023-06-20 12:43:46 granef [WARNING]: Using input name from the configuration file: granef-extraction/
2023-06-20 12:43:46 granef [INFO]: Running container 'granef-transformation' from image: registry.gitlab.ics.muni.cz:443/granef/transformation-zeek-dgraph:latest
2023-06-20 12:43:48 granef-transformation [WARNING]: Schema for capture_loss.log is not defined
2023-06-20 12:43:48 granef-transformation [WARNING]: Schema for dce_rpc.log is not defined
2023-06-20 12:43:48 granef-transformation [WARNING]: Schema for dpd.log is not defined
2023-06-20 12:43:48 granef-transformation [WARNING]: Schema for known_hosts.log is not defined
2023-06-20 12:43:48 granef-transformation [WARNING]: Schema for known_services.log is not defined
2023-06-20 12:43:48 granef-transformation [WARNING]: Schema for loaded_scripts.log is not defined
2023-06-20 12:43:48 granef-transformation [WARNING]: Schema for ntlm.log is not defined
2023-06-20 12:43:48 granef-transformation [WARNING]: Schema for ocsp.log is not defined
2023-06-20 12:43:48 granef-transformation [WARNING]: Schema for packet_filter.log is not defined
2023-06-20 12:43:48 granef-transformation [WARNING]: Schema for pe.log is not defined
2023-06-20 12:43:48 granef-transformation [WARNING]: Schema for stats.log is not defined
2023-06-20 12:43:48 granef-transformation [WARNING]: Schema for telemetry.log is not defined
2023-06-20 12:43:48 granef-transformation [WARNING]: Schema for weird.log is not defined
2023-06-20 12:43:48 granef-transformation [WARNING]: Mutations for capture_loss.log are not defined
2023-06-20 12:43:48 granef-transformation [WARNING]: Mutations for dce_rpc.log are not defined
2023-06-20 12:43:48 granef-transformation [WARNING]: Mutations for dpd.log are not defined
2023-06-20 12:43:48 granef-transformation [WARNING]: Mutations for known_hosts.log are not defined
2023-06-20 12:43:48 granef-transformation [WARNING]: Mutations for known_services.log are not defined
2023-06-20 12:43:48 granef-transformation [WARNING]: Mutations for loaded_scripts.log are not defined
2023-06-20 12:43:48 granef-transformation [WARNING]: Mutations for ocsp.log are not defined
2023-06-20 12:43:48 granef-transformation [WARNING]: Mutations for ntlm.log are not defined
2023-06-20 12:43:48 granef-transformation [WARNING]: Mutations for pe.log are not defined
2023-06-20 12:43:48 granef-transformation [WARNING]: Mutations for packet_filter.log are not defined
2023-06-20 12:43:48 granef-transformation [WARNING]: Mutations for stats.log are not defined
2023-06-20 12:43:48 granef-transformation [WARNING]: Mutations for weird.log are not defined
2023-06-20 12:43:48 granef-transformation [WARNING]: Mutations for telemetry.log are not defined
2023-06-20 12:43:48 granef [INFO]: All transformation operation parts has been started

The transformation operation results are a schema file (which contains the description of the data model) and an RDF file with all the data.

linux:$ ls tutorial-data/
exercise.pcap  granef-extraction  granef-transformation
linux:$ ls tutorial-data/granef-transformation/zeek/
zeek-dgraph.rdf  zeek-dgraph.schema
linux:$ head -n 2 tutorial-data/granef-transformation/zeek/zeek-dgraph.rdf
_:C2KIKuCsugXQc6G71 <source> "granef-case_id" .
_:C2KIKuCsugXQc6G71 <connection.uid> "C2KIKuCsugXQc6G71" .
linux:$ head -n 2 tutorial-data/granef-transformation/zeek/zeek-dgraph.schema
connection.conn_state: string @index(exact) .
connection.duration: float @index(float) .

Data indexing

The last step of data transformation is indexing by the graph database. The Granef toolkit uses the indexing operation for this purpose (it calls the Dgraph Bulk Loader). Use the following command to index the data.

linux:$ granef -i tutorial-data/tutorial.pcap -o indexing -t run
2023-06-20 12:44:12 granef [INFO]: Starting indexing operation parts
2023-06-20 12:44:12 granef [WARNING]: Using input name from the configuration file: granef-transformation/
2023-06-20 12:44:12 granef [INFO]: Running container 'granef-indexing' from image: registry.gitlab.ics.muni.cz:443/granef/dgraph-handler:latest
2023-06-20 12:44:22 granef [INFO]: All indexing operation parts has been started

The result is internal Dgraph database files containing all the data necessary for a database start.

linux:$ ls tutorial-data/
exercise.pcap  granef-extraction  granef-indexing  granef-transformation
linux:$ ls tutorial-data/granef-indexing/0/p/
000001.sst   000014.sst  000028.sst  000042.sst  000056.sst  000070.sst  000084.sst  000098.sst  000112.sst  000126.sst
000001.vlog  000015.sst  000029.sst  000043.sst  000057.sst  000071.sst  000085.sst  000099.sst  000113.sst  000127.sst
000002.sst   000016.sst  000030.sst  000044.sst  000058.sst  000072.sst  000086.sst  000100.sst  000114.sst  000128.sst
000003.sst   000017.sst  000031.sst  000045.sst  000059.sst  000073.sst  000087.sst  000101.sst  000115.sst  000129.sst
000004.sst   000018.sst  000032.sst  000046.sst  000060.sst  000074.sst  000088.sst  000102.sst  000116.sst  000130.sst
000005.sst   000019.sst  000033.sst  000047.sst  000061.sst  000075.sst  000089.sst  000103.sst  000117.sst  000131.sst
000006.sst   000020.sst  000034.sst  000048.sst  000062.sst  000076.sst  000090.sst  000104.sst  000118.sst  000132.sst
000007.sst   000021.sst  000035.sst  000049.sst  000063.sst  000077.sst  000091.sst  000105.sst  000119.sst  000133.sst
000008.sst   000022.sst  000036.sst  000050.sst  000064.sst  000078.sst  000092.sst  000106.sst  000120.sst  000134.sst
000009.sst   000023.sst  000037.sst  000051.sst  000065.sst  000079.sst  000093.sst  000107.sst  000121.sst  DISCARD
000010.sst   000024.sst  000038.sst  000052.sst  000066.sst  000080.sst  000094.sst  000108.sst  000122.sst  KEYREGISTRY
000011.sst   000025.sst  000039.sst  000053.sst  000067.sst  000081.sst  000095.sst  000109.sst  000123.sst  MANIFEST
000012.sst   000026.sst  000040.sst  000054.sst  000068.sst  000082.sst  000096.sst  000110.sst  000124.sst  group_id
000013.sst   000027.sst  000041.sst  000055.sst  000069.sst  000083.sst  000097.sst  000111.sst  000125.sst

Data handling and analysis

Once the data is ready, the database and analysis environment can be launched. We can use the standard analysis environment provided by Dgraph. However, this is focused more on development and is not tailored to our use case. Thus, the Granef toolkit provides a graphical web interface where the network traffic data can be queried and interactively analyzed.

To start the graph database Dgraph, use the following command.

linux:$ granef -i tutorial-data/tutorial.pcap -o handling -t run
2023-06-20 12:44:42 granef [INFO]: Starting handling operation parts
2023-06-20 12:44:42 granef [WARNING]: Using input name from the configuration file: Null
2023-06-20 12:44:42 granef [INFO]: Running container 'granef-handling-zero' from image: registry.gitlab.ics.muni.cz:443/granef/dgraph-handler:latest
2023-06-20 12:44:43 granef [WARNING]: Using input name from the configuration file: granef-indexing/
2023-06-20 12:44:43 granef [INFO]: Running container 'granef-handling-alpha' from image: registry.gitlab.ics.muni.cz:443/granef/dgraph-handler:latest
2023-06-20 12:44:43 granef [INFO]: All handling operation parts has been started

This command started the graph database and made it available on localhost ports (http://127.0.0.1:8080). You can open the Dgraph graphical environment and see the available data. Visit page https://play.dgraph.io/ and insert the localhost address as a Dgraph Server.

Play Dgraph

To start the Granef toolkit graphical web interface, run the following command.

linux:$ granef -i tutorial-data/tutorial.pcap -o analysis -t run
2023-06-20 12:45:08 granef [INFO]: Starting analysis operation parts
2023-06-20 12:45:08 granef [WARNING]: Using input name from the configuration file: Null
2023-06-20 12:45:08 granef [INFO]: Running container 'granef-analysis-api' from image: registry.gitlab.ics.muni.cz:443/granef/analysis-api:latest
2023-06-20 12:45:08 granef [WARNING]: Using input name from the configuration file: Null
2023-06-20 12:45:08 granef [INFO]: Running container 'granef-analysis-web' from image: registry.gitlab.ics.muni.cz:443/granef/analysis-web-v2:latest
2023-06-20 12:45:09 granef [INFO]: All analysis operation parts has been started

Now, we can access the Granef interface in your browser at http://127.0.0.1:8000, create a new visualization environment, and start analyzing the processed network traffic data.

granef web

Both operations are running as a service and thus need to be terminated once the analysis is complete.

Summary and clean up

All the data transformation steps can be fully automated with the Granef toolkit using the -a argument.

linux:$ granef -i tutorial-data/tutorial.pcap -a
2023-06-20 13:47:00 granef [INFO]: Container environment initialization
2023-06-20 13:47:00 granef [INFO]: Container image pull: extraction-zeek
2023-06-20 13:47:08 granef [INFO]: Container image pull: transformation-zeek-dgraph
2023-06-20 13:47:11 granef [INFO]: Container image pull: dgraph-handler
2023-06-20 13:47:18 granef [INFO]: Container image pull: analysis-api
2023-06-20 13:47:20 granef [INFO]: Container image pull: analysis-web
2023-06-20 13:47:28 granef [INFO]: All container images pulled successfully
2023-06-20 13:47:28 granef [INFO]: Creating network: granef-network
2023-06-20 13:47:28 granef [INFO]: Network granef-network created successfully
2023-06-20 13:47:28 granef [INFO]: Workflow starting
2023-06-20 13:47:28 granef [INFO]: Starting extraction operation parts
2023-06-20 13:47:28 granef [INFO]: Running container 'granef-extraction' from image: registry.gitlab.ics.muni.cz:443/granef/extraction-zeek:latest
2023-06-20 13:47:40 granef [INFO]: All extraction operation parts has been started
2023-06-20 13:47:40 granef [INFO]: Starting transformation operation parts
2023-06-20 13:47:40 granef [WARNING]: Using input name from the configuration file: granef-extraction/
2023-06-20 13:47:40 granef [INFO]: Running container 'granef-transformation' from image: registry.gitlab.ics.muni.cz:443/granef/transformation-zeek-dgraph:latest
2023-06-20 13:47:42 granef-transformation [WARNING]: Schema for capture_loss.log is not defined
2023-06-20 13:47:42 granef-transformation [WARNING]: Schema for dce_rpc.log is not defined
2023-06-20 13:47:42 granef-transformation [WARNING]: Schema for dpd.log is not defined
2023-06-20 13:47:42 granef-transformation [WARNING]: Schema for known_hosts.log is not defined
2023-06-20 13:47:42 granef-transformation [WARNING]: Schema for known_services.log is not defined
2023-06-20 13:47:42 granef-transformation [WARNING]: Schema for loaded_scripts.log is not defined
2023-06-20 13:47:42 granef-transformation [WARNING]: Schema for ntlm.log is not defined
2023-06-20 13:47:42 granef-transformation [WARNING]: Schema for ocsp.log is not defined
2023-06-20 13:47:42 granef-transformation [WARNING]: Schema for packet_filter.log is not defined
2023-06-20 13:47:42 granef-transformation [WARNING]: Schema for pe.log is not defined
2023-06-20 13:47:42 granef-transformation [WARNING]: Schema for stats.log is not defined
2023-06-20 13:47:42 granef-transformation [WARNING]: Schema for telemetry.log is not defined
2023-06-20 13:47:42 granef-transformation [WARNING]: Schema for weird.log is not defined
2023-06-20 13:47:42 granef-transformation [WARNING]: Mutations for capture_loss.log are not defined
2023-06-20 13:47:42 granef-transformation [WARNING]: Mutations for dce_rpc.log are not defined
2023-06-20 13:47:42 granef-transformation [WARNING]: Mutations for dpd.log are not defined
2023-06-20 13:47:42 granef-transformation [WARNING]: Mutations for known_hosts.log are not defined
2023-06-20 13:47:42 granef-transformation [WARNING]: Mutations for known_services.log are not defined
2023-06-20 13:47:42 granef-transformation [WARNING]: Mutations for loaded_scripts.log are not defined
2023-06-20 13:47:42 granef-transformation [WARNING]: Mutations for ntlm.log are not defined
2023-06-20 13:47:42 granef-transformation [WARNING]: Mutations for ocsp.log are not defined
2023-06-20 13:47:42 granef-transformation [WARNING]: Mutations for packet_filter.log are not defined
2023-06-20 13:47:42 granef-transformation [WARNING]: Mutations for pe.log are not defined
2023-06-20 13:47:42 granef-transformation [WARNING]: Mutations for stats.log are not defined
2023-06-20 13:47:42 granef-transformation [WARNING]: Mutations for weird.log are not defined
2023-06-20 13:47:42 granef-transformation [WARNING]: Mutations for telemetry.log are not defined
2023-06-20 13:47:42 granef [INFO]: All transformation operation parts has been started
2023-06-20 13:47:42 granef [INFO]: Starting indexing operation parts
2023-06-20 13:47:42 granef [WARNING]: Using input name from the configuration file: granef-transformation/
2023-06-20 13:47:42 granef [INFO]: Running container 'granef-indexing' from image: registry.gitlab.ics.muni.cz:443/granef/dgraph-handler:latest
2023-06-20 13:47:52 granef [INFO]: All indexing operation parts has been started
2023-06-20 13:47:52 granef [INFO]: Starting handling operation parts
2023-06-20 13:47:52 granef [WARNING]: Using input name from the configuration file: Null
2023-06-20 13:47:52 granef [INFO]: Running container 'granef-handling-zero' from image: registry.gitlab.ics.muni.cz:443/granef/dgraph-handler:latest
2023-06-20 13:47:53 granef [WARNING]: Using input name from the configuration file: granef-indexing/
2023-06-20 13:47:53 granef [INFO]: Running container 'granef-handling-alpha' from image: registry.gitlab.ics.muni.cz:443/granef/dgraph-handler:latest
2023-06-20 13:47:54 granef [INFO]: All handling operation parts has been started
2023-06-20 13:47:54 granef [INFO]: Starting analysis operation parts
2023-06-20 13:47:54 granef [WARNING]: Using input name from the configuration file: Null
2023-06-20 13:47:54 granef [INFO]: Running container 'granef-analysis-api' from image: registry.gitlab.ics.muni.cz:443/granef/analysis-api:latest
2023-06-20 13:47:54 granef [WARNING]: Using input name from the configuration file: Null
2023-06-20 13:47:54 granef [INFO]: Running container 'granef-analysis-web' from image: registry.gitlab.ics.muni.cz:443/granef/analysis-web-v2:latest
2023-06-20 13:47:55 granef [INFO]: All analysis operation parts has been started

After the analysis is finished, you need to disable the handling and analysis operations. This can be done using the following command.

linux:$ granef -r operations
2023-06-20 13:48:22 granef [INFO]: Removing extraction operation parts
2023-06-20 13:48:22 granef [INFO]: Removing container: granef-extraction
2023-06-20 13:48:22 granef [WARNING]: Container granef-extraction not found
2023-06-20 13:48:22 granef [INFO]: All extraction operation parts has been removed
2023-06-20 13:48:22 granef [INFO]: Removing transformation operation parts
2023-06-20 13:48:22 granef [INFO]: Removing container: granef-transformation
2023-06-20 13:48:22 granef [WARNING]: Container granef-transformation not found
2023-06-20 13:48:22 granef [INFO]: All transformation operation parts has been removed
2023-06-20 13:48:22 granef [INFO]: Removing indexing operation parts
2023-06-20 13:48:22 granef [INFO]: Removing container: granef-indexing
2023-06-20 13:48:22 granef [WARNING]: Container granef-indexing not found
2023-06-20 13:48:22 granef [INFO]: All indexing operation parts has been removed
2023-06-20 13:48:22 granef [INFO]: Removing handling operation parts
2023-06-20 13:48:22 granef [INFO]: Removing container: granef-handling-zero
2023-06-20 13:48:22 granef [INFO]: Removing container: granef-handling-alpha
2023-06-20 13:48:23 granef [INFO]: All handling operation parts has been removed
2023-06-20 13:48:23 granef [INFO]: Removing analysis operation parts
2023-06-20 13:48:23 granef [INFO]: Removing container: granef-analysis-api
2023-06-20 13:48:23 granef [INFO]: Removing container: granef-analysis-web
2023-06-20 13:48:24 granef [INFO]: All analysis operation parts has been removed

If you want to remove everything, including container environment settings and downloaded images, use the following command.

linux:$ granef -r all
2023-06-20 13:49:48 granef [INFO]: Removing extraction operation parts
2023-06-20 13:49:48 granef [INFO]: Removing container: granef-extraction
2023-06-20 13:49:48 granef [WARNING]: Container granef-extraction not found
2023-06-20 13:49:48 granef [INFO]: All extraction operation parts has been removed
2023-06-20 13:49:48 granef [INFO]: Removing transformation operation parts
2023-06-20 13:49:48 granef [INFO]: Removing container: granef-transformation
2023-06-20 13:49:48 granef [WARNING]: Container granef-transformation not found
2023-06-20 13:49:48 granef [INFO]: All transformation operation parts has been removed
2023-06-20 13:49:48 granef [INFO]: Removing indexing operation parts
2023-06-20 13:49:48 granef [INFO]: Removing container: granef-indexing
2023-06-20 13:49:48 granef [WARNING]: Container granef-indexing not found
2023-06-20 13:49:48 granef [INFO]: All indexing operation parts has been removed
2023-06-20 13:49:48 granef [INFO]: Removing handling operation parts
2023-06-20 13:49:48 granef [INFO]: Removing container: granef-handling-zero
2023-06-20 13:49:49 granef [INFO]: Removing container: granef-handling-alpha
2023-06-20 13:49:49 granef [INFO]: All handling operation parts has been removed
2023-06-20 13:49:49 granef [INFO]: Removing analysis operation parts
2023-06-20 13:49:49 granef [INFO]: Removing container: granef-analysis-api
2023-06-20 13:49:50 granef [INFO]: Removing container: granef-analysis-web
2023-06-20 13:49:50 granef [INFO]: All analysis operation parts has been removed
2023-06-20 13:49:50 granef [INFO]: Container image remove: extraction-zeek
2023-06-20 13:49:51 granef [INFO]: Container image remove: transformation-zeek-dgraph
2023-06-20 13:49:51 granef [INFO]: Container image remove: dgraph-handler
2023-06-20 13:49:51 granef [INFO]: Container image remove: analysis-api
2023-06-20 13:49:51 granef [INFO]: Container image remove: analysis-web
2023-06-20 13:49:52 granef [INFO]: All container images have been removed
2023-06-20 13:49:52 granef [INFO]: Removing network: granef-network
2023-06-20 13:49:52 granef [INFO]: Network granef-network has been removed

For more information on using the Granef toolkit, please visit the official website: https://granef.csirt.muni.cz/#usage.