0x00 HinataBot 僵尸網絡
今年初,Akamai 的研究人員發現了一個新型惡意僵尸網絡,它以 Realtek SDK、華為路由器和 Hadoop YARN 服務器為目標,將設備引入到 DDoS 群中,有可能進行大規模攻擊。這個新型僵尸網絡是研究人員在自己的 HTTP 和 SSH 蜜罐上發現的,該僵尸網絡利用了 CVE-2014-8361 和 CVE-2017-17215 等漏洞。

Akamai 表示,HinataBot以 Mirai為基礎,是基于 Golang的變體。
該惡意軟件通過對 SSH 端點進行暴力攻擊或使用已知漏洞的感染腳本和 RCE 有效載荷進行分發。感染設備后,惡意軟件會默默地運行,等待來自命令和控制服務器的命令執行。
HinataBot 的舊版本支持 HTTP、UDP、ICMP 和 TCP 洪泛攻擊,但較新的變體只具有前兩種。然而,即使只有兩種攻擊模式,該僵尸網絡也可以潛在地進行非常強大的 DDOS。
來源:參開資料 [1]
0x01 Golang 逆向概覽
隨著 Golang 惡意軟件的增多,Golang 逆向無論分析手法還是工具插件也逐漸成熟。本文并不打算詳細展開,只在這里簡單提及要點,下圖來自 go-parser的 Golang 二進制文件可獲得的關鍵信息:
0x01-00 要點
- 符號
Golang 二進制編譯后的大小一直受到詬病,通過聊勝于無的 strip 可以稍微縮小空間,但符號缺失給逆向造成困難,所以第一步(如果缺少符號)一般是函數符號恢復。
恢復函數符號的關鍵是 pclntab (Program Counter Line Table / 程序計數器行數映射表) 的定位和解析。pclntab 包含了函數表 (Function Table) 和 源碼文件路徑列表 (File Table) 。
通過 Function Table 結構偏移可以恢復其函數符號,遍歷整個 Function Table 可恢復所有的函數名,當然可以直接使用插件恢復,這里不再贅述。
- 調用
Go 語言和 C 不同,不是使用棧指針寄存器和棧基址寄存器確定函數棧的,而是使用 連續棧。在Go的運行時庫中,每個 goroutine 對應一個結構體 G,大致相當于進程控制塊的概念。這個結構體中存了 stackbase 和stackguard,用于確定這個 goroutine 使用的棧空間信息。每個 Go 函數調用的前幾條指令,先比較棧指針寄存器跟 g->stackguard,檢測是否發生棧溢出。如果棧指針寄存器值超越了 stackguard 就需要擴展棧空間。
Go 語言函數中調用的棧空間由上層調用函數來維護,調用參數、返回值都由調用者在棧中預留空間,傳入參數和返回值都是通過棧空間里的內存,所以參數和返回值不好區分。一般來說,如果函數有返回值的話,返回值總是最后面的 arg,即距離棧底較近的位置。
- 調試
絕大部分 Golang 調試資料跟 go-delve和 GDB 的 Go 調試插件有關。但是這兩個工具的使用需要有調試符號甚至 Go 項目的源碼。然而我們要分析的 Go 惡意軟件,絕大部分是沒有調試符號的。而無符號調試歸根結底還是下斷點的問題,這樣只能結合靜態分析,還有通過經驗排除 runtime 內部協程操作的干擾。
- tips
- 字符串分割:go中的字符串并不以‘/0’分割,每次引用都會有參數標識長度。
- GC write barrier 機制:Golang 內部有比較高效的垃圾回收(GC)機制,逆向時會遇到很多runtime.gcWriteBarrier() 函數調用,只要知道是 runtime GC Barrier 相關的常規操作即可。
0x01-01 工具
Go 逆向工程工具包 (go-re.tk) 是一個新的開源工具集,用于 分析 Go 二進制文件。該工具旨在從Go二進制文件中提取盡可能多的元數據,以協助逆向工程和惡意軟件分析。
redress 使用十分簡單,可提取還原編譯信息、Struct、interface 、源碼路徑等信息輔助逆向,在后文分析中也將使用到。
$ redress -h
Usage of redress:
-compiler
Print information
-filepath
Include file path for packages
-interface
Print interfaces
-method
Print type's methods
-pkg
List packages
-src
Print source tree
-std
Include standard library packages
-struct
Print structs
-type
Print all type information
-unknown
Include unknown packages
-vendor
Include vendor package
go-parser 是其作者受 golang_loader_assist和 jeb-golang-analyzer啟發,為 IDAPro 寫了一個更完備的 Go 二進制文件解析工具。其核心功能如下:
- 自動定位 firstmoduledata 的位置并解析;
- 根據 firstmoduledata 中的信息定位到 pclntab (PC Line Table),并從 pclntab 入手解析、恢復函數符號,抽取源碼文件列表;
- 解析 strings 和 string pointers;
- 根據 firstmoduledata 中的信息,解析所有 types 并為 types 各種屬性打上有意義的 comment 或 dref;
- 解析 itab (Interface Table)。

Delve 是一個 Go 語言的第三方調試器,是 GDB 調試器的有效替代品。與GDB相比,它能更高的理解 Go 的運行時,數據結構以及表達式。Delve 目前支持 Linux,OSX 以及 Windows 的 amd64 平臺。
0x02 HinataBot 分析
0x02-00 樣本獲取
樣本獲取途徑可參考文末資料中的鏈接。
由于樣本本身具備破壞性,從公開手段獲取也并不容易。在此次分析中,筆者使用的方式是先找到惡意軟件Hash列表,通過Hash在上述樣本網站中搜索。
在 hybrid-analysis和 tria.ge樣本網站都找到了 Linux X86_64 (sha256: 8a84dc2a9a06b1fae0dd16765509f88f6f54559c36d4353fd040d02d4563f703) 的二進制樣本,前者對下載有所限制,后者可以直接下載,密碼解壓默認為 infected。
經過分析測試,樣本真實有效,請謹慎下載 !!!
0x02-01 樣本分析
- 基本信息
該樣本為 x86-64 ELF 格式,SHA256 與樣本網站提供的也相符合,注意這里顯示是 stripped:
iot@attifyos ~/> file hinata hinata: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, stripped iot@attifyos ~/> sha256sum hinata 8a84dc2a9a06b1fae0dd16765509f88f6f54559c36d4353fd040d02d4563f703 hinata
首先通過 redess 獲取一些基本信息:

查看使用的 packages:

source 文件信息:

gomod 信息:

Struct 信息:

interface 信息:

使用 IDA 7.5 打開,符號沒有識別:

上文提到,該二進制文件是stripped,但是對于golang 二進制文件來說,可以通過 pclntab 恢復,也可以直接使用 go-parser 等插件輔助恢復。當然還有更簡單的方式,就是用 IDA 7.7 以上的版本打開,雖然 F5 的結果明顯是錯的,但是已足夠強大:
- 結構剖析
直接從 main.main () 函數入手,可以看出 hinata 的主體結構并不復雜:

這里只使用了一次 F5,在主函數錯誤還不是很明顯,之后的分析直接通過匯編代碼更加清晰。
程序首先使用 osstat() 作系統檢查,如果發現錯誤或者已經有實例運行即退出,并保留日志。通過系統校驗后就進入 mainstartProcess(),并調用 os_startProcess()開始工作。但是這里只顯示出一條 goroutiue 的分支,通過匯編的圖模式可以清楚看到 main 函數在初始化后執行了循環程序 main_runForever(),主功能在這個函數中。

mainrunforever又調用了 mainrunforever_fun1,最后執行 startAttack:


其主功能調用為:
main.main -> main.runForever -> main.runForever.func1 -> main.startAttack
在 main.startAttack 函數中執行攻擊操作。
- 功能澄清
分析 hinata 這類的 Bot 比較關心的是 C2 連接、命令下發和主要功能。選擇 Golang 語言主要功能實現一般依靠標準庫,簡單方便,單從函數名字符串就能大概知道有哪些功能:
首先是 C2 服務器,該 Bot 會連接 77.73.131.247的 1420 端口,返回系統信息,之后等候命令,該功能在 main.runForever 函數中實現:

連接時會做一些校驗:

連接成功后會打印相關信息,也是從這里定位到 C2 連接的位置
:
命令的格式如下,根據不同類型的攻擊略有不同:
API_CONNECTION_ATTACK: [ATTACK_TYPE] [TARGET] [DURATION] [OPTIONS]

通過逆向 main.startAttack 函數可以看到功能分支:

基本是實現各種類型的 DOS 攻擊。可以看到所有的攻擊函數都有 4 各參數,通過 C2 服務器下發。
這里就以最左邊的 mainudpflood 為例作分析,其他功能大同小異。

函數使用 Golang 的標準函數 netResolveUDPAddr 解析地址和端口,通過 netDialUDP 函數連接 UDP 實現 DOS 攻擊。值得注意的是 mov ebx,num,這里分別是 3 和 5,就是上文 tips 提到的字符串長度標識,需要手動識別設置,IDA 無法自動分割。當然也利用 Golang 自身優勢,使用 work pool 來增加 DOS 效果。http、icmp 等 flood 也都是這個邏輯,這里不再贅述。

- 動態測試
運行需謹慎!!!
新版的 hinata 需要 HINATA_START_NICE 關鍵字啟動,筆者只下載到舊版的樣本,可以直接運行。
可以調試改變代碼邏輯修改 C2 地址,筆者直接將其設為了本地地址。通過監聽 1420 端口發現 Bot 實現回連,并返回了系統信息:

為了和 Bot 交互,需要完善 C2 功能,這里直接使用了 Akamai 的現成腳本:
#!/usr/bin/env python
from pwn import *
import time
l = listen(1420)
l.wait_for_connection()
time.sleep(1)
l.send(b'API_CONNECTION_SIGNAL_OK')
while True:
data = l.recv()
if data:
print(time.time(), data)
if data == b'API_CONNECTION_SIGNAL_CHECK':
continue
else:
print(time.time(), 'no data recv\\'d')
cmdf = open('cmd.txt','r')
cmdt = cmdf.read()
cmdf.close()
if cmdt == "":
cmdt = b'API_CONNECTION_SIGNAL_OK'
print(time.time(), 'SENT:', cmdt)
l.send(cmdt)
# cmd.txt
# API_CONNECTION_ATTACK: 1 127.127.127.127 120 1522222
主要測試了 udp_flood功能:

調試過程不再展開,筆者覺得,對于沒有源碼的 Golang 程序可能使用帶插件的 GDB 比 Delve 更優。
最后給出 hinata 二進制文件的 yara rules,更多 IOC 可查看參考鏈接中 Akamai 相關分析。
rule detect_hinatabot_strings {
Meta:
description = "This rule detects HinataBot binaries."
confidence = "high"
strings:
$s1 = "HINATA_START_NICE"
$s2 = "API_CONNECT_BOT"
$s3 = "Connection to CNC is OK!"
$s4 = "API_CONNECTION_SIGNAL_CHECK"
$s5 = "API_CONNECTION_SIGNAL_OK"
$s6 = "API_CONNECTION_ATTACK"
$s7 = "Hinata already running"
$s8 = "API_CONNECTION_KILL_ALL"
$s9 = "hinata_exists"
$s10 = "hinata_loaded"
$s11 = "HINATA_"
condition:
3 of ($s*)
}
0x03 參考資料
New ‘HinataBot’ botnet could launch massive 3.3 Tbps DDoS attacks
https://github.com/0xjiayu/go_parser
New GoLang-Based HinataBot Exploiting Router and Server Flaws for DDoS Attacks
新的 "HinataBot "僵尸網絡可以發動大規模的 DDoS攻擊 - FreeBuf網絡安全行業門戶
Free Automated Malware Analysis Service - powered by Falcon Sandbox
Uncovering HinataBot: A Deep Dive into a Go-Based Threat | Akamai
Malware sandboxing report by Hatching Triage
CNCERT國家工程研究中心
一顆小胡椒
一顆小胡椒
RacentYY
ManageEngine卓豪
上官雨寶
上官雨寶
安全牛
上官雨寶
安全牛