diff options
author | Luca <deri@ntop.org> | 2021-06-08 10:39:19 +0200 |
---|---|---|
committer | Luca <deri@ntop.org> | 2021-06-08 10:39:19 +0200 |
commit | 2f8d3ac0b06f45e4cf387da68d1b1e924944b07f (patch) | |
tree | 7fb967fc11610497d970f719e51c2f595f7205a1 /wireshark/sharkfest_scripts/tcp_no_data_exchanged.lua | |
parent | 2af7b33de07fac404b2efb6d6b3189664a21d50e (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.lua | 127 |
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 |