gobuster 作為一款資訊收集工具,深受安全業界的歡迎。希望通過閱讀優秀工具的源碼,能夠了解其工作的具體細節,為自己日後造輪子也做好準備工作。
入口
得益于 Golang 的跨平台屬性,其編譯過程極其簡單,編譯的結果直接為二進制程式,可以直接使用,這也是越來越多安全工具選擇 Golang 的原因之一。對于每一個 Golang 項目,其根目錄下都有一個
main.go
的檔案,gobuster 也不例外。
func main() {
cmd.Execute()
}
複制
這裡即是作為程式的入口來展開這次代碼之旅。
Execute
其實主要是接受程式中斷的信号做相應的處理操作,裡面的主要涉及的知識點為
context
以及
Signal
,前者主要是為了友善程式的取消、退出,後者則是捕獲系統中斷的信号。
Notify
函數負責将 signal 一直傳送到管道
c
,這個函數可以一直調用。直到調用
sinal.Stop
的時候,
signalChan
中的 sinal 則會被清空。這一段代碼裡面的内容主要是
signal
這一塊的内容,可以參考 Golang 的官方文檔,裡面講的非常的詳細。
func Execute() {
var cancel context.CancelFunc
mainContext, cancel = context.WithCancel(context.Background())
defer cancel()
signalChan := make(chan os.Signal, 1)
signal.Notify(signalChan, os.Interrupt)
defer func() {
signal.Stop(signalChan)
cancel()
}()
go func() {
select {
case <-signalChan:
fmt.Println("\n[!] Keyboard interrupt detected, terminating.")
cancel()
case <-mainContext.Done():
}
}()
if err := rootCmd.Execute(); err != nil {
os.Exit(1)
}
}
複制
cmd
gobuster 中的
cmd
子產品主要為其程式的指令行控制,可将其視作為程式的輸入。通過指令行傳入的各種參數,進而運作相應的指令來執行操作。
cmd
下的幾個檔案也分别對應了 gobuster 的幾個子產品功能,包括以下:
- dir.go
- dns.go
- fuzz.go
- http.go
- s3.go
- vhost.go
cmd
子產品的功能很大程度上是基于 cobra。這個庫主要是作為 Goland 的 CLI 的互動使用,功能非常強大。社群有很多 CLI 工具都有使用這個庫,那麼如果以後考慮開發 CLI 工具的話,必然會考慮到這個庫。在上述的幾個子產品中,都具有兩個非常類似的函數,分别為
init
以及
parse*Options
函數,分别進行指令的注冊工作以及指令行參數的初始化工作。在
root.go
中進行了一些全局配置項的初始化工作。
在指令行參數中,會包含兩項内容,一項為
commad
,另一項則為
flag
,以下示例為例,
server
是
command
,
port
是
flag
。
hugo server --port=1234
複制
關于這些配置項的資料結構分别存放在以下目錄中的
options.go
中:
- gobusterdir
- gobusterdns
- gobusterfuzz
- gobuster
- libgobuster
- gobusters3
- gobustervhost
HTTPOptions
也會作為一些基礎配置項內建到其它的配置項中。
// gobusterdir/options.go
type OptionsDir struct {
libgobuster.HTTPOptions
Extensions string
ExtensionsParsed libgobuster.StringSet
StatusCodes string
StatusCodesParsed libgobuster.IntSet
StatusCodesBlacklist string
StatusCodesBlacklistParsed libgobuster.IntSet
UseSlash bool
HideLength bool
Expanded bool
NoStatus bool
DiscoverBackup bool
ExcludeLength []int
}
複制
總結
本文是 gobuster 的第一次探索,主要是看了下程式的入口以及一些配置項的初始化工作,後續會閱讀每個對應子產品的具體實作細節。