2. Hellopacket

As a basic example to get up to speed with Haka this section will help you to learn how to create basic rules, access data from the packets and display logging information and security alerts.

2.1. Setting up my first Haka script

Haka configuration is done with script file. Haka scripts are mainly Lua files. To put a first step into Haka we are going to write a small script aiming to log every ip packet passing through Haka.

Let’s get started by opening your first script with your favorite editor:

Exercise

$ editor hellopacket.lua

2.1.1. Modules

Each Haka script must tells Haka which modules it will need. In Haka, dissectors are modules. As our goal is to log every ip packet we will need ip module.

local ipv4 = require('protocol/ipv4')

Lua allow modules to be set in a local variable. Every Haka module use this feature to avoid contaminating the global state. Haka provides only one keyword on the global state: haka. This is the starting point of every functionality provided by Haka.

2.1.2. Rules

Haka is event based. It will trigger event to let you verify some property and react if needed. You can declare these checks and reactions with Haka rules.

If we sum up, Haka rules are made of:

  • an event to hook to
  • a Lua function to check and react

We can declare our first rule by adding the following lines in our hellopacket.lua script:

haka.rule{
    hook = ipv4.events.receive_packet,
    eval = function (pkt)
        -- Do some check on pkt and react if necessary
    end
}

Each dissector will trigger its own events. The event you hook to determines the arguments passed to the eval function. You can find a full list of the available events and their arguments in the documentation.

See also

Ipv4 where you will find the event list of ipv4 dissector.

2.1.3. Logs

Finally, Haka provides some log and alert facilities. As you might already have guess, you can find it under haka keyword. Now we can finish our first Haka script by adding the following line in the eval function inside the rule:

haka.log("Hello", "packet from %s to %s", pkt.src, pkt.dst)

Additionally you can throw an alert with haka.alert. For example the following code will throw an alert of low severity:

haka.alert{
    description = "A simple alert",
    severity = "low"
}

Note

The alerts are targeted to network administrators, they contain security information that could be reported in some kind of monitoring tool. You can check the alert description in the reference guide.

Exercise

Write your first haka rule using logging and alert facilities.

2.1.4. Running the script

Now that your first script is finished you might want to see it in action. You can simply use hakapcap to test it on a provided pcap file (hellopacket.pcap):

$ hakapcap hellopacket.lua hellopacket.pcap

2.1.5. Full script

For ease of simplicity you can download the full script here hellopacket.lua.

2.2. Optional: Interactive rule

Now you should have all the prerequisite to have some fun with Haka. But soon you will complain that it can be quite boring to go back and forth between your script and the documentation.

In order to ease the development steps of your script Haka provides a magic eval function named interactive_rule. If you use it, Haka will stop and you will see a prompt which allow to enter Lua commands.

Here is an example of an interactive rule:

local ipv4 = require('protocol/ipv4')

haka.rule{
    hook = ipv4.events.receive_packet,
    eval = haka.interactive_rule("my_interactive_rule_on_ip")
}

It is strongly recommended to use interactive rules on pcap. If you try to use it on real traffic and if you are not fast enough you will encounter lots of retransmit packets.

info  core: load module 'packet/pcap.ho', Pcap Module
info  core: load module 'alert/file.ho', File alert
info  core: setting packet mode to pass-through

info  core: loading rule file 'sample.lua'
info  core: initializing thread 0
info  dissector: register new dissector 'raw'
info  pcap:      opening file '/usr/share/haka/sample/smtp_dissector/smtp.pcap'
info  dissector: register new dissector 'ipv4'
info  core:       1 rule(s) on event 'ipv4:receive_packet'
info  core:       1 rule(s) registered

info  core:      starting single threaded processing

interactive rule:
inputs = table {
  1 : userdata ipv4 {
    checksum : 58353
    dst : userdata addr 192.168.20.1
    flags : userdata ipv4_flags
    frag_offset : 0
    hdr_len : 20
    id : 47214
    len : 60
    name : "ipv4"
    payload : userdata vbuffer
    proto : 6
    raw : userdata packet
    src : userdata addr 192.168.10.10
    tos : 0
    ttl : 63
    version : 4
  }
}

Hit ^D to end the interactive session
my_interactive_rule_on_ip>

Once you have your prompt you can simply use the inputs variable to see what kind of arguments is passed to your evaluation function.

my_interactive_rule_on_ip> inputs[1].ttl
  #1    64
my_interactive_rule_on_ip>

Note

You can use tab to auto-complete your commands