第1 章 Go 語言基礎1
1.1 設置開發(fā)環(huán)境 1
1.1.1 下載和安裝Go 1
1.1.2 設置GOROOT 以定義二進制文件的位置 2
1.1.3 設置GOPATH 以確定Go工作區(qū)的位置 2
1.1.4 選擇一個集成開發(fā)環(huán)境 3
1.1.5 常用的Go 工具命令 6
1.2 理解Go 的語法 9
1.2.1 數據類型10
1.2.2 控制結構13
1.2.3 并發(fā)15
1.2.4 錯誤處理17
1.2.5 處理結構化數據18
1.3 小結19
第2 章 TCP、掃描器和代理 21
2.1 理解TCP 的握手機制21
2.2 通過端口轉發(fā)繞過防火墻22
2.3 編寫一個TCP 掃描器23
2.3.1 測試端口可用性23
2.3.2 執(zhí)行非并發(fā)掃描24
2.3.3 執(zhí)行并發(fā)掃描26
2.4 構造TCP 代理31
2.4.1 使用io.Reader 和io.Writer 32
2.4.2 創(chuàng)建回顯服務器 35
2.4.3 通過創(chuàng)建帶緩沖的監(jiān)聽器來改進代碼 37
2.4.4 代理一個TCP 客戶端 39
2.4.5 復現Netcat 命令執(zhí)行 41
2.5 小結 44
第3 章 HTTP 客戶端以及與工具的遠程交互 45
3.1 Go 的HTTP 基礎知識 45
3.1.1 調用HTTP API 46
3.1.2 生成一個請求 47
3.1.3 使用結構化響應解析 48
3.2 構建與Shodan 交互的HTTP
客戶端 51
3.2.1 回顧構建API 客戶端的步驟 51
3.2.2 設計項目結構 52
3.2.3 清理API 調用 52
3.2.4 查詢Shodan 訂閱情況 53
3.2.5 創(chuàng)建一個客戶端 58
3.3 與Metasploit 交互 59
3.3.1 配置環(huán)境 59
3.3.2 定義目標 61
3.3.3 獲取有效令牌 62
3.3.4 定義請求和響應方法 63
3.3.5 創(chuàng)建配置結構體和RPC方法64
3.3.6 執(zhí)行遠程調用65
3.3.7 創(chuàng)建實用程序67
3.4 使用Bing Scraping 解析文檔元數據69
3.4.1 配置環(huán)境和規(guī)劃69
3.4.2 定義元數據包71
3.4.3 把數據映射到結構體72
3.4.4 使用Bing 搜索和接收文件.73
3.5 小結77
第4 章 HTTP 服務器、路由和中間件79
4.1 HTTP 服務器基礎79
4.1.1 構建一個簡單的服務器80
4.1.2 構建一個簡單的路由器81
4.1.3 構建簡單的中間件82
4.1.4 使用gorilla/mux 包進行路由84
4.1.5 使用negroni 包構建中間件.85
4.1.6 使用negroni 包添加身份驗證88
4.1.7 使用模板生成HTML 響應.90
4.2 憑證收割92
4.3 使用WebSocket API 實現按鍵記錄.96
4.4 多路命令與控制100
4.5 小結.104
第5 章 DNS 利用 105
5.1 編寫DNS 客戶端105
5.1.1 檢索A 記錄106
5.1.2 使用Msg 結構體處理應答.107
5.1.3 枚舉子域.109
5.1.4 查詢A 記錄和CNAME記錄110
5.1.5 工人函數113
5.1.6 使用bufio 包創(chuàng)建一個文本掃描器.114
5.1.7 收集和顯示結果.115
5.2 編寫DNS 服務器120
5.2.1 實驗環(huán)境搭建和服務器介紹120
5.2.2 創(chuàng)建DNS 服務器和代理123
5.3 小結.132
第6 章 與SMB 和NTLM 交互.133
6.1 SMB 包133
6.2 理解SMB .134
6.2.1 理解SMB 安全令牌135
6.2.2 創(chuàng)建一個SMB 會話135
6.2.3 使用結構域的混合編碼.136
6.2.4 了解元數據和引用字段.139
6.2.5 理解SMB 實現.140
6.3 使用SMB 包猜測密碼147
6.4 通過pass-the-hash 技術重用密碼.149
6.5 恢復NTLM 密碼.151
6.5.1 計算散列值151
6.5.2 恢復NTLM 散列值152
6.6 小結.153
第7 章 濫用數據庫和文件系統.155
7.1 使用Docker 設置數據庫156
7.1.1 安裝MongoDB 數據庫并寫入數據.156
7.1.2 安裝PostgreSQL 和MySQL數據庫并寫入數據.158
7.1.3 安裝Microsoft SQL Server數據庫并寫入數據.159
7.2 在Go 中連接和查詢數據庫 160
7.2.1 查詢MongoDB 數據庫 160
7.2.2 查詢SQL 數據庫 162
7.3 構建數據庫礦工 163
7.3.1 實現一個MongoDB數據庫礦工 166
7.3.2 實現一個MySQL數據庫礦工 169
7.4 掠奪文件系統 172
7.5 小結 174
第8 章 原始數據包處理 175
8.1 配置環(huán)境 175
8.2 使用pcap 子包識別設備 176
8.3 實時捕獲和結果過濾 177
8.4 嗅探和顯示明文用戶憑證 180
8.5 通過SYN 泛洪保護進行端口掃描 182
8.5.1 檢查TCP 標志位 183
8.5.2 構建BPF 過濾器 183
8.5.3 編寫端口掃描器 184
8.6 小結 187
第9 章 編寫和移植利用代碼 189
9.1 創(chuàng)建一個模糊測試器 189
9.1.1 緩沖區(qū)溢出模糊測試 190
9.1.2 SQL 注入模糊測試 193
9.2 將漏洞利用移植到Go 198
9.2.1 從Python 移植漏洞利用 199
9.2.2 從C 移植漏洞利用 202
9.3 在Go 中構建shellcode 215
9.3.1 C 轉換 216
9.3.2 十六進制轉換 216
9.3.3 num 轉換 217
9.3.4 raw 轉換 217
9.3.5 Base64 編碼 218
9.3.6 一個關于匯編的注意事項.219
9.4 小結.219
第10 章 Go 插件和可擴展工具221
10.1 使用Go 的原生插件系統222
10.1.1 創(chuàng)建主程序.223
10.1.2 構建一個密碼猜測插件226
10.1.3 運行掃描器.228
10.2 基于Lua 構建插件.229
10.2.1 創(chuàng)建head() HTTP 函數230
10.2.2 創(chuàng)建函數get() 231
10.2.3 向Lua VM 注冊函數.233
10.2.4 編寫函數main().233
10.2.5 創(chuàng)建插件腳本.234
10.2.6 測試Lua 插件.235
10.3 小結236
第11 章 針對密碼學的攻擊和實現.237
11.1 回顧基本密碼學概念.237
11.2 理解標準的Crypto 庫.238
11.3 探索散列.239
11.3.1 破解MD5 和SHA-512散列值.239
11.3.2 實現bcrypt241
11.4 驗證消息.243
11.5 加密數據.245
11.5.1 對稱密鑰加密.245
11.5.2 非對稱加密.248
11.6 暴力破解RC2.255
11.6.1 準備工作.256
11.6.2 生產工作.258
11.6.3 執(zhí)行工作和解密數據.260
11.6.4 編寫函數main() .261
11.6.5 運行程序.263
11.7 小結.264
第12 章 Windows 系統交互與分析 265
12.1 Windows API 的函數OpenProcess()265
12.2 unsafe.Pointer 和uintptr類型268
12.3 使用syscall 包執(zhí)行進程注入270
12.3.1 定義Windows DLL并給變量賦值272
12.3.2 使用OpenProcess Windows API 獲取進程令牌.273
12.3.3 使用VirtualAllocEx Windows API 操作內存.276
12.3.4 使用WriteProcessMemory Windows API 寫入內存.276
12.3.5 使用GetProcessAddress Windows API 查找LoadLibraryA .277
12.3.6 使用CreateRemoteThread Windows API 執(zhí)行惡意DLL.278
12.3.7 使用WaitforSingleObject Windows API 驗證注入.279
12.3.8 使用VirtualFreeEx Windows API 進行清理.280
12.3.9 附加練習.281
12.4 可移植的可執(zhí)行文件281
12.4.1 理解PE 文件格式282
12.4.2 編寫一個PE 解析器282
12.4.3 附加練習.293
12.5 在Go 中使用C293
12.5.1 安裝C Windows 工具鏈293
12.5.2 使用C 和Windows API創(chuàng)建一個消息框294
12.5.3 在C 程序中嵌入Go代碼.295
12.6 小結.297
第13 章 使用隱寫術隱藏數據.299
13.1 探索PNG 格式.299
13.1.1 文件頭.300
13.1.2 塊序列.300
13.2 讀取圖像字節(jié)數據.301
13.2.1 讀取頭數據.302
13.2.2 讀取塊序列.303
13.3 寫入圖像字節(jié)數據以植入載荷.306
13.3.1 查找塊偏移量.306
13.3.2 使用方法ProcessImage()寫入字節(jié).306
13.4 使用XOR 編碼和解碼圖像字節(jié)數據.311
13.5 小結.316
13.6 附加練習.316
第14 章 構建一個C2 遠控木馬.319
14.1 入門.319
14.1.1 安裝用于定義gRPC API的Protocol Buffers .320
14.1.2 創(chuàng)建項目工作區(qū).320
14.2 定義和構建gRPC API 321
14.3 創(chuàng)建服務器323
14.3.1 實現協議接口.323
14.3.2 編寫函數main() .325
14.4 創(chuàng)建客戶端植入程序.327
14.5 構建管理組件.329
14.6 運行RAT330
14.7 改進RAT330
14.7.1 加密通信.331
14.7.2 處理連接中斷.331
14.7.3 注冊植入程序 331
14.7.4 添加數據庫持久 332
14.7.5 支持多個植入程序 332
14.7.6 添加植入程序功能 332
14.7.7 鏈接操作系統命令 333
14.7.8 增強植入程序的真實性并實踐良好的運營安全333
14.7.9 添加ASCII Art .333
14.8 小結334