天天看點

gobuster源碼閱讀--入口篇

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 的第一次探索,主要是看了下程式的入口以及一些配置項的初始化工作,後續會閱讀每個對應子產品的具體實作細節。