描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787302588245丛书名: 安全技术经典译丛
《Go黑帽子 渗透测试编程之道》探索了Go的“阴暗面”,Go是一种因为简单、高效和可靠而受到黑客推崇的流行编程语言。本书从安全从业者和黑客的角度出发,提供了一系列实用的策略,以帮助你使用Go的功能来测试系统、构建和自动化工具以满足你的需求,并提高你的进攻性安全技能。
我们将从Go的语法和原理的基本概述开始你的学习之旅,探索可用于工具开发的示例,包括HTTP、DNS和SMB等常见网络协议。然后,我们将深入研究渗透测试人员会使用的各种“招数”和会遇到的问题,解决诸如数据窃取、数据包嗅探和漏洞利用开发之类的问题。在深入研究加密技术、攻击Microsoft Windows并实现隐写技术之前,我们将创建动态的、可插入的工具。
学习内容:
如何开发用于你自己安全项目的高性能工具。
如何创建与远程API交互的可用工具。
如何抓取任意HTML数据。
如何使用Go的标准包net/http构建HTTP服务器。
如何编写自己的DNS服务器和代理。
如何使用DNS隧道建立一个C2通道以突破限制性网络。
如何创建漏洞模糊器(fuzzer)以发现应用程序的安全漏洞。
如何使用插件和扩展使产品可以面向未来。
如何构建RC2对称密钥暴力破解工具。 如何在(PNG)图像中植入数据。
准备好扩展你的安全工具库了吗? 那我们出发(Go)吧!
?
第1 章 Go 语言基础1
1.1 设置开发环境 1
1.1.1 下载和安装Go 1
1.1.2 设置GOROOT 以定义二进制文件的位置 2
1.1.3 设置GOPATH 以确定Go工作区的位置 2
1.1.4 选择一个集成开发环境 3
1.1.5 常用的Go 工具命令 6
1.2 理解Go 的语法 9
1.2.1 数据类型10
1.2.2 控制结构13
1.2.3 并发15
1.2.4 错误处理17
1.2.5 处理结构化数据18
1.3 小结19
第2 章 TCP、扫描器和代理 21
2.1 理解TCP 的握手机制21
2.2 通过端口转发绕过防火墙22
2.3 编写一个TCP 扫描器23
2.3.1 测试端口可用性23
2.3.2 执行非并发扫描24
2.3.3 执行并发扫描26
2.4 构造TCP 代理31
2.4.1 使用io.Reader 和io.Writer 32
2.4.2 创建回显服务器 35
2.4.3 通过创建带缓冲的监听器来改进代码 37
2.4.4 代理一个TCP 客户端 39
2.4.5 复现Netcat 命令执行 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 创建一个客户端 58
3.3 与Metasploit 交互 59
3.3.1 配置环境 59
3.3.2 定义目标 61
3.3.3 获取有效令牌 62
3.3.4 定义请求和响应方法 63
3.3.5 创建配置结构体和RPC方法64
3.3.6 执行远程调用65
3.3.7 创建实用程序67
3.4 使用Bing Scraping 解析文档元数据69
3.4.1 配置环境和规划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 包创建一个文本扫描器.114
5.1.7 收集和显示结果.115
5.2 编写DNS 服务器120
5.2.1 实验环境搭建和服务器介绍120
5.2.2 创建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 创建一个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 配置环境 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 创建一个模糊测试器 189
9.1.1 缓冲区溢出模糊测试 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 创建主程序.223
10.1.2 构建一个密码猜测插件226
10.1.3 运行扫描器.228
10.2 基于Lua 构建插件.229
10.2.1 创建head() HTTP 函数230
10.2.2 创建函数get() 231
10.2.3 向Lua VM 注册函数.233
10.2.4 编写函数main().233
10.2.5 创建插件脚本.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 执行工作和解密数据.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 包执行进程注入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 执行恶意DLL.278
12.3.7 使用WaitforSingleObject Windows API 验证注入.279
12.3.8 使用VirtualFreeEx Windows API 进行清理.280
12.3.9 附加练习.281
12.4 可移植的可执行文件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创建一个消息框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 读取图像字节数据.301
13.2.1 读取头数据.302
13.2.2 读取块序列.303
13.3 写入图像字节数据以植入载荷.306
13.3.1 查找块偏移量.306
13.3.2 使用方法ProcessImage()写入字节.306
13.4 使用XOR 编码和解码图像字节数据.311
13.5 小结.316
13.6 附加练习.316
第14 章 构建一个C2 远控木马.319
14.1 入门.319
14.1.1 安装用于定义gRPC API的Protocol Buffers .320
14.1.2 创建项目工作区.320
14.2 定义和构建gRPC API 321
14.3 创建服务器323
14.3.1 实现协议接口.323
14.3.2 编写函数main() .325
14.4 创建客户端植入程序.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
前 言
大约6 年来,我们3 个人领导了北美专用渗透测试咨询。作为首席顾问,我们代表客户执行了项目的相关技术工作,包括网络渗透测试;我们还率先开发出了更好的工具、流程和方法。在某些时候,我们采用Go 作为我们的主要开发语言之一。
Go 提供了很好的语言特性,在性能、安全性和易用性之间取得了平衡。我们在开发工具时将其作为我们的默认语言。终,我们心甘情愿地成为这种语言的倡导者,将其推荐给我们在安全行业的其他同事。这是因为我们觉得Go 这种优秀的语言应该进入更多人的视野。
在本书中,我们将带你从安全从业人员和黑客的角度出发,全面了解Go 编程语言。
与其他黑客类图书不同的是,我们将不仅向你展示如何自动化第三方或商业工具(尽管我们会稍微讨论一下),而且将深入探讨各种具有实用价值的主题,这些主题涉及对于对抗有用的特定问题、协议或策略。此外,还将介绍TCP、HTTP 和DNS 协议,以及与Metasploit和Shodan 交互、搜索文件系统和数据库、从其他语言到Go 的漏洞移植、编写SMB 客户端的核心函数、攻击Windows、交叉编译二进制文件、加密相关的内容、调用C 库、与Windows API 交互等。
本书的适用对象
本书适用于所有想要学习如何使用Go 开发自己的黑客工具的人。在我们的整个职业生涯中,尤其是作为顾问,我们一直提倡将编程作为渗透测试人员和安全从业人员必须具备的基本技能。特别值得一提的是,编码能力可以增强你对软件工作原理及其会遭到怎样的攻击的理解。此外,如果你已经是软件程序员,则将会对他们在保护软件方面面临的挑战有更全面的了解,因而可以更好地利用个人经验来提出破解方法,消除误报并找出隐蔽的漏洞。编写代码通常会迫使你与第三方库以及各种应用程序栈和框架进行
交互。对很多人(包括我们)来说,亲自操作和不断修改才能使个人得到的发展。
为充分利用本书,我们鼓励你复制本书的官方代码库,这样你就拥有了我们将要讨论的所有示例(请通过https://github.com/blackhat-go/bhg/查找和下载)。
本书的不同之处
本书不是一般意义上的Go 编程介绍,而是关于使用Go 开发安全工具的介绍。我们首先是黑客,然后才是程序员。我们中没有一个人曾经是软件工程师。因此,作为黑客,我们更看重功能性而不是优雅性。在很多情况下,我们都选择像黑客一样编写代码,而忽略了软件设计的一些习惯用法或实践。对于顾问来说,时间就是金钱,而开发的代码越简单,用时就越少。因此,在功能性与优雅性之间,我们选择了前者。当你需要快速创建一个问题的解决方案时,样式风格则是次要的。
这必然会激怒Go 纯粹主义者,他们可能会在推特上对我们说,你们没有优雅地处理所有的错误情况,你们的示例可以被优化,或者有更好的构造或方法来产生期望的结果。大多数情况下,我们并不关心教给你的是不是好的、雅的或者百分之百理想的解决方案,当然前提是这样做不会对终结果造成什么影响。尽管我们将简要介绍语言语法,但这样做纯粹是为了构建我们可以奠定的基线基础。事实上,我们这里想要教会你的不是如何用Go 优雅地进行编程,而是如何使用Go 开发黑客工具。
为什么要使用Go 进行黑客攻击
在Go 问世之前,你可能会使用某种动态类型语言(如Python、Ruby 或PHP)。这里你优先考虑的是其易用性,而很少会考虑其性能和安全性。另外,你还可以选择某种静态类型语言(例如C 或C ),这类语言以高性能和安全见长,但易用性不太好。Go 摆脱了其主要祖先C 的许多缺点,使开发更具人性化。同时,它是一种静态类型语言,在编译时会产生语法错误,从而极大地保障了代码在实际运行过程中的安全。与解释型语言相比,它的性能更好,且在设计时考虑了多核计算,让并发编程成为小儿科。
Go 的以上优点并没有让它得到安全从业者的垂青。然而,该语言的许多功能却给黑客和攻击者带来了“福音”。
- 整洁的包管理系统。Go 的包管理解决方案非常优雅,可以直接与Go 的工具集成。通过使用Go 二进制文件,可以轻松地下载、编译和安装包与依赖项,这样第三方库使用起来非常简单,且通常不会发生冲突。
- 交叉编译。Go 好的特性之一是它能够交叉编译可执行文件。只要代码不与原始C 交互,你就可以很轻松地在Linux 或Mac 系统上编写代码,且以Windows友好的、可移植的可执行格式编译代码。
- 丰富的标准库。如果对开发其他语言所花费的时间有所了解,你就能更直观地感受到Go 标准库的丰富程度。许多现代语言缺乏执行一些常见任务所需的标准库,如加密、网络通信、数据库连接和数据编码(JSON、XML、Base64、hex)。
Go 将许多关键函数和库作为语言标准打包的一部分,从而减少了正确设置开发环境或调用函数所需的工作量。
- 并发。与已经存在很长时间的语言不同,Go 发布的时间和初的主流多核技术上市的时间差不多。因此,Go 的并发模式和性能优化专门针对这个模型进行了调整。
为什么你可能不喜欢Go
同时,我们也认识到Go 并不能完美地解决所有问题。以下是该语言的一些缺点。
- 二进制文件大小。当在Go 中编译二进制文件时,二进制文件的大小可能为数兆字节。当然,你可以剥离调试符号并使用打包程序以减小体积,但要想完成这些步骤,你必须有专注力。这可能是一个缺点,特别是对于那些需要将二进制文件附加到电子邮件、托管在共享文件系统上或通过网络传输的安全从业人员而言。
- 冗长。尽管Go 没有C#、Java 甚至C/C 语言那么冗长,但你仍可能会发现,简单的语言构造会迫使你过度使用列表(在Go 中称为切片)、处理、循环或错误处理等内容。Python 的单行代码很容易在Go 中变成3 行代码。
章节内容概览
本书的第1 章概述了Go 的基本语法和原理。接下来,我们开始探索可用于工具开发的示例,包括各种常见的网络协议,例如HTTP、DNS 和SMB。然后,我们深入研究渗透测试人员遇到的各种手段和问题,解决包括数据窃取、数据包嗅探和漏洞利用开发在内的主题。后,我们简短讨论了如何创建动态的、可插入的工具,并且深入研究加密技术以及如何攻击Microsoft Windows 和实现隐写术。
许多情况下,你都有机会扩展我们展示给你的工具以实现特定目的。尽管我们始终提供可靠的示例,但我们的真正目的是为你提供知识和基础,而你则可以此为基础来扩展或重新开发示例以实现你的目标。授之以鱼,不如授之以渔——这就是我们的追求。
在继续阅读本书接下来的内容之前,请务必牢记这一点:我们(作者和出版商)创作的内容仅供合法使用。我们不会为你选择实施的邪恶或非法行为承担任何责任。这里的所有内容仅用于教育目的;未经授权,请勿对系统或应用程序进行任何形式的渗透测试。
以下是对每一章内容的概述。
第1 章:Go 语言基础
该章介绍Go 编程语言的基础知识,以帮助你理解本书中的概念。这包括对Go 的基本语法和习惯用法的简要介绍。除此之外,我们还将讨论Go 生态系统,包括支持工具、IDE、依赖管理等。对编程语言不熟悉的读者可以在学习了Go 的一些基本知识后,更好地理解、实现和扩展后续章节中的示例。
第2 章:TCP、扫描器和代理
该章介绍Go 的基本概念、并发基础和模式、输入/输出(I/O)以及如何通过实际TCP应用程序使用接口。我们将首先引导你创建一个简单的TCP 端口扫描器,它使用解析的命令行选项扫描列表中的端口。这能让你直观地感受到Go 代码相较其他语言的简单性,并且有助于你理解基本类型、用户输入和错误处理。接下来,我们将讨论如何通过引入并发功能来提高此端口扫描器的效率和速度。然后,我们将通过构建一个TCP 代理(一个端口转发器)引入I/O 的相关知识:从基本示例开始,通过改进代码创建一种更可靠的解决方案。后,我们将在Go 中重新创建Netcat 的“安全巨洞”功能,教你如何在操作stdin 和stdout 以及通过TCP 重定向它们时运行操作系统命令。
第3 章:HTTP 客户端以及与工具的远程交互
HTTP 客户端是与现代Web 服务器架构交互的关键组件。该章将向你展示如何创建执行各种常见Web 交互所需的HTTP 客户端。你将使用多种格式与Shodan 和Metasploit进行交互。此外,我们还将演示如何使用搜索引擎,以及使用它们来获取和解析文档元数据,以便提取对组织分析活动有用的信息。
第4 章:HTTP 服务器、路由和中间件
该章介绍创建HTTP 服务器所需的概念和约定。我们将讨论常见的路由、中间件和模板样式,利用这些知识创建凭证收割服务器和键盘记录器。后,我们将演示如何通过构建反向HTTP 代理来复用C2 连接。
第5 章:DNS 利用
该章将介绍DNS 的基本概念。首先,将执行客户端操作,包括如何查找特定的域记录。然后将向你展示如何编写一个自定义的DNS 服务器和DNS 代理,这两个都对C2操作很有用。
第6 章:与SMB 和NTLM 交互
我们将探索SMB 和NTLM 协议并以此为基础讨论在Go 中的协议实现。我们将使用SMB 协议的部分实现讨论数据的编组和解组、自定义字段标签的使用等。此外,我们还将讨论并演示如何使用SMB 协议的部分实现检索SMB 签名策略以及进行密码猜测攻击。
第7 章:滥用数据库和文件系统
掠夺数据是对抗测试的一个关键方面。数据存在于众多资源(包括数据库和文件系统)中。该章介绍了在各种常见的SQL 和NoSQL 平台上进行连接和与数据库交互的基本方法。你将学习连接到SQL 数据库和运行查询的基本知识。我们将向你展示如何在数据库和表中搜索敏感信息,这是在后渗透阶段使用的一种常见技术。我们还将演示如何遍历文件系统和检查文件中的敏感信息。
第8 章:原始数据包处理
我们将向你展示如何使用基于libpcap 的gopacket 库来嗅探和处理网络数据包。你将学习如何识别可用的网络设备、如何使用数据包过滤器以及如何处理这些数据包。然后我们将开发一个端口扫描程序,它可以通过各种保护机制(包括syn-flood 和syn-cookies)可靠地进行扫描,但这些机制会导致正常的端口扫描出现过多的误报。
第9 章:编写和移植利用代码
该章几乎只关注漏洞利用。首先创建一个模糊器来发现不同类型的漏洞。该章的后半部分将讨论如何从其他语言移植现有的漏洞利用到Go 中。要讨论的内容包括如何移植Java 反序列化利用和脏牛(Dirty COW)提权利用。我们将在该章结束时讨论如何创建和转换shellcode 以便用在Go 程序中。
第10 章:Go 插件和可扩展工具
我们将介绍两种不同的创建可扩展工具的方法。Go 1.8 版中引入的种方法是使用Go 的本地插件机制。我们将讨论这种方法的用例并讨论另外一种利用Lua 创建可扩展工具的方法。我们将演示一些实例,以阐释如何选择合适的方法来执行一个常见的安全任务。
第11 章:针对密码学的攻击和实现
该章将介绍有关如何使用Go 进行对称和非对称加密的基本知识,使得你能够通过标准Go 包来使用和理解加密技术。Go 是少数几种不使用第三方库进行加密而是在语言中使用本地实现的语言之一。这使得代码易于导航、修改和理解。
我们将通过检查常见用例和创建工具来探索标准库。该章将向你展示如何执行散列、消息验证和加密。后,我们将演示如何对RC2 加密密文进行暴力破解。
第12 章:Windows 系统交互与分析
在有关攻击Windows 的讨论中,我们将演示与Windows 本地API 交互的方法,探索syscall 包以执行进程注入,并且学习如何构建可移植可执行(Portable Executable,PE)二进制解析器。该章后将讨论如何通过Go 的C 互操作机制调用本地C 库。
第13 章:使用隐写术隐藏数据
隐写术是将信息或文件隐藏在另一个文件中。该章介绍隐写术的一种变体:在PNG图像文件的内容中隐藏任意数据。这些技术对于过滤信息、创建混淆的C2 消息以及绕过检测或预防性的控制非常有用。
第14 章:构建一个C2 远控木马
后一章将讨论Go 语言中C2 植入程序和服务器的实际实现。我们将利用前面章节所学的知识来构建C2 通道。C2 客户机/服务器实现由于其定制性质,将规避基于签名的安全控制,并且试图绕过启发式和基于网络的出口控制。
评论
还没有评论。