aboutsummaryrefslogtreecommitdiff
path: root/wireshark/sharkfest_scripts/tcp_no_data_exchanged.lua
diff options
context:
space:
mode:
authorLuca <deri@ntop.org>2021-06-08 10:39:19 +0200
committerLuca <deri@ntop.org>2021-06-08 10:39:19 +0200
commit2f8d3ac0b06f45e4cf387da68d1b1e924944b07f (patch)
tree7fb967fc11610497d970f719e51c2f595f7205a1 /wireshark/sharkfest_scripts/tcp_no_data_exchanged.lua
parent2af7b33de07fac404b2efb6d6b3189664a21d50e (diff)
Companion scripts written for the Sharkfest conference
Diffstat (limited to 'wireshark/sharkfest_scripts/tcp_no_data_exchanged.lua')
-rw-r--r--wireshark/sharkfest_scripts/tcp_no_data_exchanged.lua127
1 files changed, 127 insertions, 0 deletions
diff --git a/wireshark/sharkfest_scripts/tcp_no_data_exchanged.lua b/wireshark/sharkfest_scripts/tcp_no_data_exchanged.lua
new file mode 100644
index 000000000..7d9ac9839
--- /dev/null
+++ b/wireshark/sharkfest_scripts/tcp_no_data_exchanged.lua
@@ -0,0 +1,127 @@
+
+--
+-- Sharkfest 2021
+--
+-- This is going to be an example of a lua script that can be written for cybersecurity reasons.
+-- TCP No Data Exchanged:
+-- The TCP No Data Exchanged is a really important script to check if flows are suspicious
+-- Because usually, a typic TCP traffic, have some payload and it is not 0. Instead, in some attacks,
+-- for example the TCP SYN Scan or SYN Flood, there is a lot of TCP traffic with no data.
+
+local f_tcp_traffic = Field.new("tcp")
+local f_tcp_payload = Field.new("tcp.len")
+local f_ip_src = Field.new("ip.src")
+local f_ip_dst = Field.new("ip.dst")
+local f_port_src = Field.new("tcp.srcport")
+local f_port_dst = Field.new("tcp.dstport")
+local f_conn_fin = Field.new("tcp.flags.fin")
+
+--############################################
+
+local function getstring(finfo)
+ local ok, val = pcall(tostring, finfo)
+ if not ok then val = "(unknown)" end
+ return val
+end
+
+--############################################
+
+local function processResponse(tcp_table, src, src_port, dst, dst_port, payload)
+ local key = src .. ":" .. src_port .. "->" .. dst .. ":" .. dst_port
+
+ -- Create the table entry if needed
+ if not tcp_table[key] then
+ local key2 = dst .. ":" .. dst_port .. "->" .. src .. ":" .. src_port
+ if not tcp_table[key2] then
+ tcp_table[key] = {
+ payload = 0,
+ fin = false
+ }
+ else
+ key = key2
+ end
+ end
+
+ -- Increase the stats
+ tcp_table[key]["payload"] = tcp_table[key]["payload"] + getstring(payload.value)
+
+ if getstring(f_conn_fin().value) == true then
+ tcp_table[key]["fin"] = true
+ end
+
+ return tcp_table
+end
+
+--############################################
+
+local function processPackets(pinfo,tvb, tcp_table)
+ -- Call the function that extracts the field
+ local tcp_traffic = f_tcp_traffic()
+ local tcp_payload = f_tcp_payload()
+
+ --Check if there is an HTTP request or reply
+ if tcp_traffic then
+ local src = getstring(f_ip_src().value)
+ local dst = getstring(f_ip_dst().value)
+ local src_port = getstring(f_port_src().value)
+ local dst_port = getstring(f_port_dst().value)
+
+ tcp_table = processResponse(tcp_table, src, src_port, dst, dst_port, tcp_payload)
+ end
+
+ return tcp_table
+end
+
+--############################################
+
+local function tcpPayload()
+ -- Declare the window we will use
+ local tw = TextWindow.new("TCP No Data Exchanged")
+
+ local tcp_table = {}
+
+ local tap = Listener.new();
+
+ local function removeListener()
+ -- This way we remove the listener that otherwise will remain running indefinitely
+ tap:remove();
+ end
+
+ -- We tell the window to call the remove() function when closed
+ tw:set_atclose(removeListener)
+
+ -- This function will be called once for each packet
+ function tap.packet(pinfo,tvb)
+ tcp_table = processPackets(pinfo,tvb, tcp_table)
+ end
+
+ -- This function will be called once every few seconds to update our window
+ function tap.draw(t)
+ tw:clear()
+
+ for flow in pairs(tcp_table) do
+ local payload = tcp_table[flow]["payload"]
+ local fin = tcp_table[flow]["fin"]
+ local danger = ""
+
+ if tonumber(payload) == 0 then
+ danger = "-- DANGER: NO DATA EXCHANGED FOR THIS FLOW --\n"
+ end
+
+ tw:append(danger .. flow .. ":\n\tPayload: " .. payload .. "\n\tFlow Ended: " .. tostring(fin) .. "\n\n");
+ end
+ end
+
+ -- This function will be called whenever a reset is needed
+ -- e.g. when reloading the capture file
+ function tap.reset()
+ tw:clear()
+ tcp_table = {}
+ end
+
+ -- Ensure that all existing packets are processed.
+ retap_packets()
+end
+
+-- Register the menu Entry
+register_menu("Sharkfest/TCP No Data Exchanged", tcpPayload, MENU_TOOLS_UNSORTED) \ No newline at end of file