駭客寫Haka-第一部分
http://thisissecurity.net/2015/11/23/hackers-do-the-haka-part-1/
Haka是一種開源的以網路安全為導向的語言,可以用於編寫安全規則和協議剝離器。在這一部分中,我們的重點是編寫安全規則。
0x00 什麼是Haka
Haka是一種開源的以網路安全為導向的語言,可以在捕捉到的活動流量上指定和應用安全策略。Haka基於Lua。這是一種簡單、輕量(~200 kB)且快速的(有一個可用的JiT編譯器)指令碼語言。
Haka的使用範圍有兩種。首先,Haka能允許指定安全規則來過濾掉不想要的流並報告惡意活動。Haka提供了一個簡單的API用於操作高階資料包和流。使用者可以投放資料包,或建立新的資料包,並注入資料包。Haka還支援修改執行中的資料包。這是Haka的主要功能之一,因為使用者可以看到所有的複雜任務,比如調整資料包的大小,設定正確的序列號。這些都是現場完成的,根本不需要代理。
其次,Haka還附帶有一種語法,允許協議規範及其底層的狀態機。Haka支援兩種型別的協議:基於二進位制的協議(如,dns)和基於文字的協議(如,http)。這種規範包括了基於資料包的協議(如ip)以及基於流的協議(如http)。
Haka內嵌到了一個模組化框架中,其中包括幾個資料包捕捉模組(pcap, nfqueue),能允許終端使用者在實時捕捉到的流量上應用自己的安全策略,或者是在一個資料包跟蹤檔案上重現這個安全策略。這個框架還提供了記錄(syslog)和報警模組(syslog,elasticsearch)。報警遵循了一種類似IDMED的格式。最後,這個框架還具有附屬模組,比如模式匹配引擎和一個指令反彙編模組。這些模組允許編寫精密的安全規則來檢測經過混淆的木馬。因為Haka是按照模組方式設計的,所以使用者可以透過額外的模組來擴充套件其功能。
0x01 Haka工具套件
Haka提供了一個包含有4個工具的套件:
haka.這是工具集中的主程式。這是一個守護程式,用於監控後臺中的資料包。Haka會根據指定的安全策略檔案來分析和過濾這些資料包。例如,下面的配置樣本會要求Haka使用nfqueue模組從介面eth0中捕捉資料包,並使用策略檔案myrules.lua過濾這些資料包。這個指令碼通常會載入使用者定義或內建的協議剝離器,並定義一系列的安全規則。另外,使用者可以選擇報警和報告模組並設定一些特定的模組選項:
[general] # Select the haka configuration file to use configuration = "myrules.lua" # Optionally select the number of thread to use # By default, all system thread will be used #thread = 4 [packet] # Select the capture model, nfqueue or pcap module = "packet/nfqueue" # Select the interfaces to listen to #interfaces = "any" interfaces = "eth0" # Select packet dumping for nfqueue #dump = yes #dump_input = "/tmp/input.pcap" #dump_output = "/tmp/output.pcap" [log] # Select the log module module = "log/syslog" # Set the default logging level #level = "info,packet=debug" [alert] # Select the alert module module = "alert/syslog" #module = "alert/file" #module = "alert/elasticsearch" # Disable alert on standard output #alert_on_stdout = no
hakactl. 這個工具允許控制一個執行的Haka守護程式。使用者可以實時分析捕捉到的資料包,檢查日誌或簡單地關停/重啟守護程式。
hakapcap. 這個工具允許使用pcap模組在資料包捕捉跟蹤上離線重現一個策略檔案。例如,這樣對執行網路分析非常有用。
hakabana.這個工具允許使用Kibana 和 Elasticsearch實時地視覺化和監控網路流量。Hakabana由一系列的自定義安全規則組成,這些規則會把流量資訊透過Haka推送到一個elastisserach伺服器,並讓這些流量能透過Kibana控制皮膚獲取到。另外一個控制板也可以視覺化Haka警報。
0x02 編寫安全規則
Haka提供了一種簡單的方式來編寫安全規則,從而過濾,修改,建立,注入資料包和流。當檢測到一個惡意流後,使用者可以報告一個警報或放棄這個流。使用者可以定義更多複雜的方案來應對某次攻擊所造成的影響。例如,使用者可以報警http請求,強制舊版瀏覽器更新或偽造特定的資料包來欺騙埠掃描工具。
0x03 資料包過濾
下面的這個規則是一個基礎的資料包過濾規則,能夠攔截所有到某個網路地址的連線。
local ipv4 = require("protocol/ipv4")
local tcp = require("protocol/tcp_connection")
local net = ipv4.network("192.168.101.0/24")
haka.rule{
hook = tcp.events.new_connection,
eval = function (flow, pkt)
haka.log("tcp connection %s:%i -> %s:%i",
flow.srcip, flow.srcport,
flow.dstip, flow.dstport)
if net:contains(flow.dstip) then
haka.alert{
severity = "low",
description = "connection refused",
start_time = pkt.ip.raw.timestamp
}
flow:drop()
end
end
}
第一行會載入需要的協議剝離器,也就是ipv4和tcp連線剝離器。前者是處理ipv4資料包。後者是一個狀態性的tcp剝離器,這個剝離器會維持一個連線表並管理tcp流。下一行,定義了必須要攔截的網路地址。
這種安全規則是透過haka.rule關鍵字定義的。一個安全規則由一個hook和一個評估函式eval組成。這個hook是一個會觸發安全規則評估的事件。在這個例子中,在每次嘗試建立一個tcp連線時,這個安全規則就會被評估。傳遞到評估函式的引數會根據事件來確定。以new_connection事件為例,eval會獲取兩個引數:flow和pkt。第一個引數中會有關於連線的詳細資訊,另一個引數一個包含有所有tcp(以及下層)資料包欄位的表。
在安全規則的核心中,我們首先記錄(haka.log)了一些關於當前連線的資訊。然後,我們檢查了源地址是否屬於先前定義的非授權IP地址範圍。如果測試成功,我們就會發出警報(haka.alert)並放棄連線。注意,我們只在警報中報告了少量的一些細節。使用者可以新增更多資訊,比如來源和目標服務。
我們使用hakapcap工具在一個pcap追蹤檔案filter.pcap上,測試了我們的規則filter.lua:
$ hakapcap filter.lua filter.pcap
從這裡往下就是Haka的輸出,Haka轉儲了一些關於已載入剝離器和已註冊規則的資訊。這個輸出顯示Haka成功攔截了目標地址192.168.101.62的連線:
在上面的例子中,我們已經定義了一個單獨的規則來攔截連線。使用者可以用關鍵字haka.group寫一個類似於防火牆一樣的完整規則集。以這個配置為例,如果沒有任何安全規則能認證流量,使用者可以選擇一種預設行為(如攔截所有的連線)。
0x04 資料包注入
在Haka中,使用者可以建立新的資料包並注入這些資料包。下面的這個規則會製作一個RST資料包,用於欺騙Xmas nmap掃描。最終,nmap會認為目標端上的所有埠都是關閉的。
raw = require("protocol/raw")
ipv4 = require("protocol/ipv4")
tcp = require("protocol/tcp")
haka.rule {
hook = tcp.events.receive_packet,
eval = function(pkt)
local flags = pkt.flags
-- test for xmas nmap scans
if flags.fin and flags.psh and flags.urg then
-- raw packet
local rstpkt = raw.create()
-- ip packet
rstpkt = ipv4.create(rstpkt)
rstpkt.ttl = pkt.ip.ttl
rstpkt.dst = pkt.ip.src
rstpkt.src = pkt.ip.dst
-- tcp packet
rstpkt = tcp.create(rstpkt)
rstpkt.srcport = pkt.dstport
rstpkt.dstport = pkt.srcport
rstpkt.flags.rst = true
rstpkt.flags.ack = true
rstpkt.ack_seq = pkt.seq + 1
-- inject forged packet and
-- drop malicious scanning packet
rstpkt:send()
pkt:drop()
end
end
}
0x05 資料包警報
資料包修改是Haka中最高階的功能之一。Haka會在流和資料包層級上自動處理所有的內部修改:重新設定資料包大小和分段,重置序列號等。下面的例子證明了訪問和修改協議欄位有多麼容易。這個規則會修改一些http協議的標頭。更準確的說, user-agent標頭會被修改(如果沒有設定,新增至標頭列表),並移除accept-encoding標頭。
local http = require("protocol/http")
http.install_tcp_rule(80)
haka.rule{
hook = http.events.request,
eval = function (flow, request)
request.headers["User-Agent"] = "HAKA User Agent"
request.headers["Accept-Encoding"] = nil
end
}
blurring-the-web和inject_ponies是非常有意思的指令碼,會透過修改http響應流量來分別模糊和汙染(注入垃圾)被請求的web頁面:
0x06 流過濾
在講解流過濾前,我們首先要說明的是Haka如何在內部管理資料包和流。在Haka中,所有的資料包和流都會用虛擬緩衝區(見下圖)來表示。虛擬緩衝區是一種非相鄰記憶體塊的統一檢視。這些虛擬緩衝區能允許簡單和有效的修改記憶體資料。虛擬緩衝區使用分雜湊表來表示非相鄰資料塊,避免分配和複製不必要的記憶體塊。Haka提供了迭代器來導航透過這些記憶體塊。這些迭代器可以透過攔截讓停用一些函式,然後,比如當流上有更多可用的資料時,透明地恢復這些函式的執行。
下面的規則會收集http流,並在stdout上轉儲這些流。這個規則等同於Wireshark的follow tcp stream”功能。
local ipv4 = require('protocol/ipv4')
local tcp_connection = require('protocol/tcp_connection')
haka.rule{
hook = tcp_connection.events.receive_data,
options = {
streamed = true
},
eval = function (flow, iter, dir)
local data = flow.ccdata or {}
flow.ccdata = data
while iter:wait() do
data[#data+1] = iter:sub('available'):asstring()
end
haka.log("%s -> %s:\n", flow.srcip, flow.dstip)
io.write(table.concat(data))
end
}
0x07 互動式資料包過濾
這是我最喜歡的Haka功能。這個功能允許檢查每個資料包的流量包。下面的規則會提示每個HTTP POST請求。
local http = require("protocol/http")
http.install_tcp_rule(80)
haka.rule {
hook = http.events.request_data,
eval = function (http, data)
haka.interactive_rule("interactive mode")(http, data)
end
}
haka.rule {
hook = http.events.request,
eval = function (http, request)
http:enable_data_modification()
end
}
這個shell能夠提供到完整Haka API的訪問,以便處理資料包內容:讀寫和修改資料包欄位,刪除資料包,記錄可疑的事件,警告等。Lua控制板支援自動補齊,因此,是深入Haka API的一個好的開始。
在下面的資料中,Haka會破解第一個POST請求。HTTP資料可以透過可用的輸入來獲取。在這個例子中,我們在執行中修改了使用者憑據。
注意,最好在pcap檔案上使用互動規則,因為修改會造成額外的延遲。
0x08 高階流過濾
Haka還有一個模式匹配引擎和一些反彙編模組。這兩個模組都是基於流的模組,能讓我們檢測到分散在多個資料包中的惡意有效載荷。下面的規則使用了一個常規表達來檢測nop sled。我們啟用了流選項,也就是說,匹配函式會攔截和等待可用的資料來進行匹配。如果檢測到nop sled,我們就會發出警告,並轉儲shellcode指令。注意,模式匹配函式會更新迭代器的位置,之後會指向shellcode。
local tcp = require("protocol/tcp_connection")
local rem = require("regexp/pcre")
local re = rem.re:compile("%x90{100,}")
local asm = require("misc/asm")
local dasm = asm.new_disassembler("x86", "32")
haka.rule{
hook = tcp.events.receive_data,
options = {
streamed = true,
},
eval = function (flow, iter, direction)
if re:match(iter, false) then
-- raise an alert
haka.alert{
description = "nop sled detected",
}
-- dump instructions following nop sled
dasm:dump_instructions(iter)
end
end
}
我們在著名的網路分析挑戰上重播了這條規則,並得到了下面的輸出。關於網路流量反彙編為指令的詳細資訊都可以在這裡獲得。
未完待續…
0x09 連結
- Haka 網站. haka-security.org
- Haka 原始碼. https://github.com/haka-security/haka
- Haka twitter. @hakasecurity
相關文章
- 黑吃黑——駭客組織透過駭客工具攻擊其他駭客2022-11-27
- 紅客、駭客、駭客有什麼區別?駭客守則注意事項!2022-09-09
- 駭客動態播報|果然,駭客也用上了ChatGPT……2023-02-27ChatGPT
- 谷歌駭客語法2018-08-07谷歌
- LastPass 遭駭客攻擊2022-09-29AST
- 安全快報 | 哥斯大黎加政府部分網路系統遭駭客攻擊2022-06-23
- 企業協作平臺Slack資料洩露,駭客竊取其部分私有程式碼庫2023-01-07
- 以色列國防巨頭美國分公司遭駭客攻擊,部分員工資料洩露2022-09-30
- WireShark駭客發現之旅--開篇2020-08-19
- 知名駭客組織Anonymous(匿名者)2022-11-27
- 蘋果曝嚴重漏洞衝上熱搜第一,駭客或可完全接管裝置2022-08-22蘋果
- 美國空軍舉辦駭客大賽,讓駭客黑掉它的在軌道衛星2022-11-28
- 世界駭客大賽Pwn2Own:駭客攻破微軟、特斯拉、macOS,奪取百萬美元獎金2023-03-24微軟Mac
- 西班牙19歲天才駭客被逮捕,該駭客自稱能訪問九成西班牙公民資訊2023-04-07
- 2023年最流行的道德駭客工具2023-04-02
- 揭秘最為知名的駭客工具之一: Netcat!適用安全測試、滲透測試、駭客攻擊!2024-09-18
- 駭客玩具入門——1、前言與裝機2023-11-29
- 駭客玩具入門——8、其他攻擊手段2023-12-01
- 駭客玩具入門——6、網路嗅探2023-12-01
- Wireshark駭客發現之旅(4)——暴力破解2020-08-19
- WireShark駭客發現之旅(7)—勒索郵件2020-08-19
- HTTPS可以預防駭客篡改內容嗎?2020-07-24HTTP
- 俄羅斯駭客:“我要打十個!”2022-05-19
- CISA警告駭客利用ZK Java框架RCE漏洞2023-03-01Java框架
- 駭客偷你的密碼幹什麼?2022-11-27密碼
- 生物駭客創造開源胰島素2022-11-27
- 成為“駭客”前,必學的“系統命令”2018-11-30
- 駭客玩具入門——4、漏洞掃描與Metasploit2023-11-30
- 駭客能篡改WiFi密碼,源於存在漏洞2019-08-05WiFi密碼
- 網站被駭客攻擊瞭如何解決2020-03-18網站
- WireShark駭客發現之旅(5)—掃描探測2020-08-19
- 自學成為駭客的五本好書2024-10-09
- 最新研究報告:約3成駭客為女性2023-03-07
- 8種常見的駭客攻擊技術2023-02-21
- WireShark駭客發現之旅(6)—“Lpk.dll劫持+ 飛客蠕蟲”病毒2020-08-19
- 義大利電子郵件服務商遭駭客入侵,60萬使用者資料及部分原始碼洩露2020-04-10原始碼
- drools中then部分的寫法2022-05-25
- 牛客2020跨年場 部分題解2021-01-01