mirror of https://github.com/OISF/suricata
doc/userguide: add lua packetlib docs
parent
7226a0b2e7
commit
38318438d1
@ -0,0 +1,177 @@
|
||||
Packet
|
||||
------
|
||||
|
||||
Packets are exposed to Lua scripts with ``suricata.packet``
|
||||
library. For example::
|
||||
|
||||
local packet = require("suricata.packet")
|
||||
|
||||
Initialization
|
||||
~~~~~~~~~~~~~~
|
||||
|
||||
``get``
|
||||
^^^^^^^
|
||||
|
||||
Init the packet for use in the script. The packet is the current packet the engine is processing.
|
||||
|
||||
::
|
||||
|
||||
p = packet.get()
|
||||
|
||||
|
||||
Time
|
||||
~~~~
|
||||
|
||||
``timestamp``
|
||||
^^^^^^^^^^^^^
|
||||
|
||||
Get packet timestamp as 2 numbers: seconds & microseconds elapsed since
|
||||
1970-01-01 00:00:00 UTC.
|
||||
|
||||
::
|
||||
|
||||
p = packet.get()
|
||||
local sec, usec = p:timestamp()
|
||||
|
||||
|
||||
``timestring_legacy``
|
||||
^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Get packet timestamp as a string in the format: `11/24/2009-18:57:25.179869`.
|
||||
This is the format used by `fast.log`, `http.log` and other legacy outputs.
|
||||
|
||||
::
|
||||
|
||||
p = packet.get()
|
||||
print p:timestring_legacy()
|
||||
|
||||
|
||||
``timestring_iso8601``
|
||||
^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Get packet timestamp as a string in the format: `2015-10-06T15:16:43.137833+0000`.
|
||||
This is the format used by `eve`.
|
||||
|
||||
::
|
||||
|
||||
p = packet.get()
|
||||
print p:timestring_iso8601()
|
||||
|
||||
|
||||
Ports and Addresses
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
``tuple``
|
||||
^^^^^^^^^
|
||||
|
||||
Using the `tuple` method the IP version (4 or 6), src IP and dest IP (as string), IP protocol (int) and ports (ints) are retrieved.
|
||||
|
||||
The protocol value comes from the IP header, see further https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml
|
||||
|
||||
::
|
||||
|
||||
p = packet.get()
|
||||
ipver, srcip, dstip, proto, sp, dp = p:tuple()
|
||||
|
||||
|
||||
If the protocol is ICMPv4 or ICMPv6, so when `proto == 1` or `proto == 58`, then the final two results are `icmp type` and `icmp code`.
|
||||
|
||||
::
|
||||
|
||||
p = packet.get()
|
||||
ipver, srcip, dstip, proto, itype, icode = p:tuple()
|
||||
if ipver == 6 and proto == 1 then
|
||||
-- weird, ICMPv4 on IPv6
|
||||
return 1
|
||||
end
|
||||
|
||||
|
||||
``sp``
|
||||
^^^^^^
|
||||
|
||||
Get the packets TCP, UDP or SCTP source port as an int. Returns `nil` for other protocols.
|
||||
|
||||
::
|
||||
|
||||
p = packet.get()
|
||||
source_port = p:sp()
|
||||
if source_port == 31337 then
|
||||
return 1
|
||||
end
|
||||
|
||||
|
||||
``dp``
|
||||
^^^^^^
|
||||
|
||||
Get the packets TCP, UDP or SCTP destination port as an int. Returns `nil` for other protocols.
|
||||
|
||||
::
|
||||
|
||||
p = packet.get()
|
||||
dest_port = p:dp()
|
||||
-- not port 443
|
||||
if dest_port ~= 443 then
|
||||
return 1
|
||||
end
|
||||
|
||||
|
||||
Data
|
||||
~~~~
|
||||
|
||||
``payload``
|
||||
^^^^^^^^^^^
|
||||
|
||||
Packet payload.
|
||||
|
||||
::
|
||||
|
||||
payload = p:payload()
|
||||
|
||||
|
||||
``packet``
|
||||
^^^^^^^^^^
|
||||
|
||||
Entire packet, including headers for protocols like TCP, Ethernet, VLAN, etc.
|
||||
|
||||
::
|
||||
|
||||
raw_packet = p:packet()
|
||||
|
||||
|
||||
Misc
|
||||
~~~~
|
||||
|
||||
``pcap_cnt``
|
||||
^^^^^^^^^^^^
|
||||
|
||||
The packet number when reading from a pcap file.
|
||||
|
||||
::
|
||||
|
||||
p = packet.get()
|
||||
print p:pcap_cnt()
|
||||
|
||||
|
||||
Example
|
||||
~~~~~~~
|
||||
|
||||
Example `match` function that takes a packet, inspect the payload line by line and checks if it finds the HTTP request line.
|
||||
If it is found, issue a notice log with packet details.
|
||||
|
||||
::
|
||||
|
||||
function match (args)
|
||||
p = packet.get()
|
||||
payload = p:payload()
|
||||
ts = p:timestring()
|
||||
|
||||
for line in payload:gmatch("([^\r\n]*)[\r\n]+") do
|
||||
if line == "GET /index.html HTTP/1.0" then
|
||||
ipver, srcip, dstip, proto, sp, dp = p:tuple()
|
||||
SCLogNotice(string.format("%s %s->%s %d->%d (pcap_cnt:%d) match! %s", ts, srcip, dstip, sp, dp, p:pcap_cnt(), line));
|
||||
return 1
|
||||
end
|
||||
end
|
||||
|
||||
return 0
|
||||
end
|
Loading…
Reference in New Issue