开发知识点-golang
- 介绍
- 红队专题-Golang工具Fscan
- 简介
- 主要功能
- ubuntu 安装
- windows 安装
- 常用命令:
- 项目框架
- 源文件
- common目录
- Plugins目录
- Webscan目录
- 入口点
- 插件扫描类型
- 爆破插件
- common.Scantype
- Webtitle函数
- webpoc扫描
- POC 执行
- CEL-GO 实践
- CEL
- 指纹识别
- 免杀
- 源码特征
- 参考链接
- 红队专题-Golang工具ChYing
- 原chying工具代码分析
- 并发访问控制
- 并发 原子 写入
- 读取
- 通道
- 嵌套映射结构
- 初始化
- 启动代理服务器
- 重启代理服务器
- vite 构建前端页面
- 编译
- 标准库
- bytes
- fmt
- io
- ioioutil
- os
- osexec
- path
- sync
- 第三方包
- gui
- init
- **Go工作目录及包创建**
- 初始化
- **Go环境变量配置**
- 方法1、
- 代码混淆
- 编译混淆
- honnef.co/go/tools/cmd/staticcheck
- WailsJS
- 新建 helloword
- 类型
- 基本类型
- 变量(variable)
- 命名
- 空标识符
- 定义
- 简短模式(short variable declaration)
- 多变量赋值
- 未使用错误
- 常量
- 枚举
- 关键字
- var
- 环境搭建
- win10配置go环境
- ubuntu20.04安装golang
- 介绍
- 下载 Go 压缩包
- 调整环境变量
- 验证 Go 安装过程
libp2p/go-libp2p: libp2p implementation in Go (github.com)
go-libp2p
,它提供了 DHT(IPFS 使用的 Kademlia DHT)和 QUIC 支持。
介绍
Go,通常被称为 golang
一门由 Google 创建的现代化的开源编程语言,
它允许你构建实时并且高效的应用。
很多流行的应用程序,
例如 Kubernetes,Docker,Prometheus 和 Terraform,
都是使用 Go 来编写的。
下载 Go 压缩包
Go 1.14.2
https://golang.google.cn/doc/install
https://golang.org/dl/
以 root 或者其他 sudo 用户身份运行下面的命令,
下载并且解压 Go 二进制文件到/usr/local目录
调整环境变量
通过将 Go 目录添加到$PATH环境变量,
系统将会知道在哪里可以找到 Go 可执行文件。
这个可以通过添加到/etc/profile文件(系统范围内安装)
或者$HOME/.profile文件(当前用户安装):
登录后复制
export PATH=$PATH:/usr/local/go/bin
1.
保存文件,并且重新加载新的PATH 环境变量到当前的 shell 会话:
登录后复制
source ~/.profile
1.
验证 Go 安装过程
通过打印 Go 版本号,验证安装过程。
登录后复制
go version
1.
复制
输出应该像下面这样:
go version go1.14.2 linux/amd6
go.sum
记录项目依赖的确切版本,以确保在不同环境中能够复现相同的构建结果。
go.mod
go.uber.org/fx
用于Go语言的依赖注入(Dependency Injection)库。
帮助开发者从应用程序中删除全局状态,不再使用init()函数或全局变量,而是使用fx管理的单例。此外,fx允许组织内的团队构建松散耦合且良好集成的可共享组件,是Uber公司几乎所有Go服务的支柱。
goimports
go get github.com/spf13/cobra用于创建命令行工具的库(框架),可以创建出类似git或者go一样的工具,进行我们平时熟悉的git clone/pull、go get/install等操作。kubernetes工具中就使用了cobra。上述这些命令行工具的--help/-h既好看又好理解,开始时我也会好奇这些工具是如何实现多级子命令支持的?cobra的目标即是提供快速构建出此类工具的能力(cobra是框架,具体的业务逻辑当然还是要自己写)。例如可以为我们app或系统工具的bin文件添加--config来启动服务、添加--version来查看版本号等等。相比起标准库里的flag包,cobra强大了很多。官网列出了cobra的一大堆优点:1. 易用的subcommand模式(即嵌套命令或子命令)2. 强大的flags支持(参考标准库flagSet)3. 支持global、local、cascading级别的flag设置4. 错误时的智能提示5. 自动生成的、美观的help信息,并默认支持--help和-h打印help信息6. 提供命令自动补全功能(bash, zsh, fish, powershell环境)7. 提供命令man page自动生成功能
golang.org/x/crypto/openpgp/armor
Go 语言的一个扩展库,属于 `golang.org/x/crypto` 项目,专门用于处理 OpenPGP 消息的 ASCII 装甲(Armor)编码和解码。OpenPGP 是一种基于 PGP(Pretty Good Privacy)的加密和签名数据的标准,它广泛应用于电子邮件和文件的加密传输中。ASCII 装甲是一种文本编码方式,它可以将二进制数据编码为只包含 ASCII 字符的文本,这样数据就可以通过电子邮件、文本文件等方式安全地传输,而不会被邮件系统或文件存储系统错误地处理或损坏。
golang.org/x/crypto/openpgp/packet
专门用于处理 OpenPGP 消息中的各个包(packet)的解析和构造。OpenPGP 是一种基于 PGP(Pretty Good Privacy)的加密和签名数据的标准,它定义了如何在电子邮件和其他通信中安全地传输加密、签名和密钥交换数据。在 OpenPGP 消息中,数据被组织成一系列的包(packet),每个包都包含了一定类型的信息,如公钥、私钥、加密数据、签名等。`packet` 包提供了对这些包进行解析和构造的功能。
github.com/sirupsen/logrus
Go 语言的日志库它提供了丰富的日志输出和格式化功能,被广泛应用于 Go 语言项目中,用于记录程序的运行状态、错误信息和调试信息等
github.com/ulikunitz/xz
Go 语言的库,它提供了对 XZ 压缩格式的支持。XZ 是一种高效的压缩格式,它基于 LZMA2 压缩算法,通常比传统的 gzip 或 zip 格式提供更好的压缩率。这个库允许 Go 开发者在他们的项目中读取和写入 XZ 压缩的文件。
golang.zx2c4.com/wireguard/wgctrl/wgtypes
Go 语言中用于处理 WireGuard 配置和状态信息的包的一部分,它位于 WireGuard 的 Go 控制接口(wgctrl)库中。WireGuard 是一种新型的网络协议和工具,旨在提供一种快速、简单、安全的方式来加密网络流量。`wgtypes` 包主要定义了一系列与 WireGuard 配置相关的数据类型和常量,如网络接口配置(如 IP 地址、密钥等)、设备状态等。这些类型通常用于在应用程序和 WireGuard 控制接口之间进行数据交换。
golang.org/x/crypto/acme/autocert
Go 语言的一个库,它实现了自动证书管理环境(ACME)协议的客户端,用于自动获取和管理 Let's Encrypt 或其他支持 ACME 协议的证书颁发机构(CA)的 TLS 证书。这个库特别适用于需要自动续期证书并希望简化证书管理过程的 web 服务器和应用程序。
go mod init hello-worldpackage mainimport "fmt"func main() {fmt.Println("Hello, World!")
}
go复制代码package main import ( "crypto/aes" "crypto/cipher" "crypto/rand" "encoding/base64" "encoding/json" "fmt" "io") // 定义指令结构type Instruction struct { Type string `json:"type"` Action string `json:"action"` Params map[string]interface{} `json:"params"` Signature string `json:"signature"` // 用于身份验证的签名} // 加密函数func encrypt(plaintext, key []byte) (string, error) { block, err := aes.NewCipher(key) if err != nil { return "", err } ciphertext := make([]byte, aes.BlockSize+len(plaintext)-aes.BlockSize%len(plaintext)) iv := ciphertext[:aes.BlockSize] if _, err := io.ReadFull(rand.Reader, iv); err != nil { return "", err } stream := cipher.NewCFBEncrypter(block, iv) stream.XORKeyStream(ciphertext[aes.BlockSize:], plaintext) return base64.StdEncoding.EncodeToString(ciphertext), nil} // 解密函数func decrypt(ciphertext string, key []byte) (string, error) { encodedText, err := base64.StdEncoding.DecodeString(ciphertext) if err != nil { return "", err } block, err := aes.NewCipher(key) if err != nil { return "", err } iv := encodedText[:aes.BlockSize] encodedText = encodedText[aes.BlockSize:] stream := cipher.NewCFBDecrypter(block, iv) stream.XORKeyStream(encodedText, encodedText) return string(encodedText), nil}
- 节点激活机制
每个节点需要监听网络上的指令,验证指令格式和密钥,并在验证通过后激活为master节点。
go复制代码// 示例:节点监听和处理指令func listenForInstructions(listener net.Listener, secretKey []byte) { for { conn, err := listener.Accept() if err != nil { log.Println("Error accepting connection:", err) continue } go handleConnection(conn, secretKey) }} func handleConnection(conn net.Conn, secretKey []byte) { defer conn.Close() buf := make([]byte, 1024) n, err := conn.Read(buf) if err != nil { log.Println("Error reading from connection:", err) return } encryptedInstruction := string(buf[:n]) plaintextInstruction, err := decrypt(encryptedInstruction, secretKey) if err != nil { log.Println("Error decrypting instruction:", err) return } var instruction Instruction err = json.Unmarshal([]byte(plaintextInstruction), &instruction) if err != nil { log.Println("Error parsing instruction:", err) return } // 验证签名(这里省略了具体实现) if !verifySignature(instruction.Signature, instruction) { log.Println("Invalid signature") return } // 激活为master节点(这里可以添加更多的逻辑) activateAsMaster(instruction)} func activateAsMaster(instruction Instruction) { fmt.Println("Activated as master with instruction:", instruction) // 在这里实现master节点的逻辑} // 示例签名验证函数(需要具体实现)func verifySignature(signature string, instruction Instruction) bool { // 实现签名验证逻辑 return true}
- Master节点权限
Master节点应该有一个时间限制,并且在权限过期后自动撤销。可以使用一个goroutine来监控master节点的状态。
go复制代码var masterActive boolvar masterExpireTime time.Timevar masterMutex sync.Mutex func activateAsMasterWithExpiry(instruction Instruction, duration time.Duration) { masterMutex.Lock() defer masterMutex.Unlock() masterActive = true masterExpireTime = time.Now().Add(duration) go monitorMasterStatus() // 在这里实现master节点的逻辑} func monitorMasterStatus() { for { masterMutex.Lock() if !masterActive || time.Now().After(masterExpireTime) { masterActive = false fmt.Println("Master status expired or revoked") masterMutex.Unlock() break } masterMutex.Unlock() time.Sleep(1 * time.Second) }}
go复制代码package main import ( "crypto/hmac" "crypto/sha256" "encoding/hex" "encoding/json" "fmt" "io/ioutil" "log" "net" "net/http" "sync" "time") const ( secretKey = "your-secret-key" // 用于HMAC的秘密密钥 listenAddr = ":8080" // 节点监听的地址) type DHT struct { store map[string]string mu sync.Mutex master bool timer *time.Timer} type Command struct { Type string `json:"type"` Action string `json:"action"` Key string `json:"key"` Value string `json:"value,omitempty"` Signature string `json:"signature"`} func NewDHT() *DHT { return &DHT{ store: make(map[string]string), }} func (dht *DHT) Start() { http.HandleFunc("/command", dht.handleCommand) log.Println("DHT node is listening on", listenAddr) log.Fatal(http.ListenAndServe(listenAddr, nil))} func (dht *DHT) handleCommand(w http.ResponseWriter, r *http.Request) { body, err := ioutil.ReadAll(r.Body) if err != nil { http.Error(w, "Failed to read request body", http.StatusBadRequest) return } defer r.Body.Close() var cmd Command if err := json.Unmarshal(body, &cmd); err != nil { http.Error(w, "Invalid JSON format", http.StatusBadRequest) return } if !dht.verifySignature(cmd) { http.Error(w, "Invalid signature", http.StatusForbidden) return } if cmd.Type == "activate" && cmd.Action == "master" { dht.activateAsMaster() fmt.Fprintln(w, "Activated as master") return } if !dht.master { http.Error(w, "Only master can execute commands", http.StatusForbidden) return } switch cmd.Action { case "put": dht.put(cmd.Key, cmd.Value) case "get": dht.get(w, cmd.Key) case "delete": dht.delete(cmd.Key) default: http.Error(w, "Unknown action", http.StatusBadRequest) }} func (dht *DHT) verifySignature(cmd Command) bool { message := fmt.Sprintf("%s:%s:%s", cmd.Type, cmd.Action, cmd.Key) if cmd.Value != "" { message += ":" + cmd.Value } h := hmac.New(sha256.New, []byte(secretKey)) h.Write([]byte(message)) expectedSignature := hex.EncodeToString(h.Sum(nil)) return hmac.Equal([]byte(expectedSignature), []byte(cmd.Signature))} func (dht *DHT) activateAsMaster() { dht.mu.Lock() defer dht.mu.Unlock() dht.master = true dht.timer = time.AfterFunc(10*time.Second, func() { dht.mu.Lock() defer dht.mu.Unlock() dht.master = false log.Println("Master privileges revoked") }) log.Println("Activated as master for 10 seconds")} func (dht *DHT) put(key, value string) { dht.mu.Lock() defer dht.mu.Unlock() dht.store[key] = value log.Printf("Put key %s with value %s\n", key, value)} func (dht *DHT) get(w http.ResponseWriter, key string) { dht.mu.Lock() defer dht.mu.Unlock() value, exists := dht.store[key] if !exists { http.Error(w, "Key not found", http.StatusNotFound) return } fmt.Fprintln(w, value)} func (dht *DHT) delete(key string) { dht.mu.Lock() defer dht.mu.Unlock() delete(dht.store, key) log.Printf("Deleted key %s\n", key)} func main() { dht := NewDHT() dht.Start()}
go复制代码package main import ( "crypto/hmac" "crypto/sha256" "encoding/hex" "encoding/json" "fmt" "io/ioutil" "log" "net" "net/http" "os" "strconv" "sync" "time" "crypto/tls" "crypto/x509") const ( networkPort = "8080" masterActivationKey = "supersecretkey" // Replace with a real secret key masterDuration = 10 * time.Second // Master node duration) type Instruction struct { Type string `json:"type"` Params interface{} `json:"params,omitempty"` Timestamp int64 `json:"timestamp"` HMAC string `json:"hmac"`} type Node struct { id string isMaster bool masterTimer *time.Timer mu sync.Mutex} func (n *Node) ListenAndServe() { http.HandleFunc("/receive", n.handleReceive) server := &http.Server{ Addr: ":" + networkPort, TLSConfig: &tls.Config{ MinVersion: tls.VersionTLS12, ClientCAs: x509.NewCertPool(), // Load client certificates here ClientAuth: tls.RequireAndVerifyClientCert, }, } // Load server certificates cert, err := tls.LoadX509KeyPair("server.crt", "server.key") if err != nil { log.Fatalf("failed to load server certificates: %v", err) } server.TLSConfig.Certificates = []tls.Certificate{cert} log.Printf("Node %s listening on port %s...", n.id, networkPort) err = server.ListenAndServeTLS("", "") // "" means use the TLSConfig to set certificates if err != nil { log.Fatalf("failed to start server: %v", err) }} func (n *Node) handleReceive(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodPost { http.Error(w, "Invalid request method", http.StatusMethodNotAllowed) return } body, err := ioutil.ReadAll(r.Body) if err != nil { http.Error(w, "Failed to read request body", http.StatusBadRequest) return } defer r.Body.Close() var instr Instruction err = json.Unmarshal(body, &instr) if err != nil { http.Error(w, "Failed to unmarshal instruction", http.StatusBadRequest) return } if !n.verifyInstruction(instr) { http.Error(w, "Invalid instruction signature", http.StatusForbidden) return } if instr.Type == "activate_master" { n.activateAsMaster() w.WriteHeader(http.StatusOK) w.Write([]byte("Node activated as master")) return } if n.isMaster { // Handle master-only operations here n.logOperation(instr) w.WriteHeader(http.StatusOK) w.Write([]byte("Operation performed by master")) return } w.WriteHeader(http.StatusOK) w.Write([]byte("Operation performed by regular node"))} func (n *Node) verifyInstruction(instr Instruction) bool { timestampStr := strconv.FormatInt(instr.Timestamp, 10) data := []byte(fmt.Sprintf("%s%s%s", instr.Type, timestampStr, fmt.Sprintf("%v", instr.Params))) mac := hmac.New(sha256.New, []byte(masterActivationKey)) mac.Write(data) expectedMAC := mac.Sum(nil) return hex.EncodeToString(expectedMAC) == instr.HMAC} func (n *Node) activateAsMaster() { n.mu.Lock() defer n.mu.Unlock() if n.isMaster { return } n.isMaster = true n.masterTimer = time.AfterFunc(masterDuration, n.deactivateAsMaster) log.Printf("Node %s activated as master for %v", n.id, masterDuration)} func (n *Node) deactivateAsMaster() { n.mu.Lock() defer n.mu.Unlock() if !n.isMaster { return } n.isMaster = false log.Printf("Node %s deactivated as master", n.id)} func (n *Node) logOperation(instr Instruction) { // Simple logging to stdout for demonstration log.Printf("Master node %s performed operation: %v", n.id, instr) // In a real-world application, log to a file or centralized logging service} func main() { nodeID := "node1" // For demonstration, use a static ID node := &Node{id: nodeID} // Ensure server certificates and keys are generated and available if _, err := os.Stat("server.crt"); os.IsNotExist(err) { log.Fatalf("server certificate not found: %v", err) } if _, err := os.Stat("server.key"); os.IsNotExist(err) { log.Fatalf("server key not found: %v", err) } node.ListenAndServe()}
“github.com/multiformats/go-multiaddr”
实现了多地址(Multiaddr)的编码、解码和解析功能。多地址是一种网络地址格式,旨在以一种统一和可扩展的方式表示各种网络协议和地址信息。这种格式被广泛应用于点对点(P2P)网络、区块链和其他分布式系统中。
#1. 设置DHT网络
使用现有的DHT库(如go-libp2p-dht)来设置DHT网络。
go复制代码import ( "github.com/libp2p/go-libp2p-dht" // 其他必要的库) func setupDHT() (*dht.Dht, error) { // 初始化DHT网络 // ... return dhtInstance, nil}
TokTok/go-toxcore
为用户提供易于获取的安全和隐私保护的点对点(无服务器)即时通讯工具。它使用 libsodium(基于 NaCl)进行加密和身份验证。
go get github.com/quic-go/quic-go
Go语言编写的开源库,它实现了QUIC(Quick UDP Internet Connections)协议。
QUIC是一种在UDP(用户数据报协议)上运行的传输层网络协议,旨在提供低延迟、多路复用和加密的数据传输。这个库使得开发者能够轻松地在自己的Go项目中集成QUIC协议,从而利用该协议的优势来提升应用的性能和安全性。
Golang使用Quic-Go开源库实现Quic客户端和服务端_golang quic-CSDN博客
func setupQUICServer(listener net.PacketConn, dht *dht.Dht) { config := &quic.Config{ // 配置QUIC参数 } listener.SetReadDeadline(time.Now().Add(10 * time.Second)) for { sess, err := quic.Accept(listener, config, nil) if err != nil { // 处理错误 continue } go handleSession(sess, dht) }}
#3. 处理QUIC会话
在QUIC会话中处理客户端指令。
go复制代码func handleSession(sess quic.Session, dht *dht.Dht) { stream, err := sess.AcceptStream() if err != nil { // 处理错误 return } defer stream.Close() buf := make([]byte, 1024) n, err := stream.Read(buf) if err != nil { // 处理错误 return } // 解析指令 var instruction Instruction err = json.Unmarshal(buf[:n], &instruction) if err != nil { // 处理错误 return } // 验证HMAC签名和TLS证书 if !verifyHMAC(instruction, secretKey) || !verifyTLSCertificate(sess) { // 发送错误响应 return } // 激活为master节点(如果需要) if instruction.Type == "ACTIVATE_MASTER" { activateAsMaster(dht, sessionID) } // 处理其他指令 // ...}
#4. 激活为Master节点
设置定时器以限制master权限的持续时间。
go复制代码var masterTimer *time.Timer func activateAsMaster(dht *dht.Dht, sessionID string) { if masterTimer != nil { return // 已经有一个master节点在运行 } masterTimer = time.NewTimer(masterDuration) go func() { <-masterTimer.C deactivateMaster(sessionID) }() // 执行master节点的操作 // ...} func deactivateMaster(sessionID string) { // 撤销master权限 // ...}
#5. 安全措施和日志记录
确保所有通信都经过加密,并记录所有操作。
go复制代码func verifyHMAC(instruction Instruction, secretKey []byte) bool { // 计算并验证HMAC签名 // ... return true // 或 false} func verifyTLSCertificate(sess quic.Session) bool { // 验证TLS证书 // ... return true // 或 false} func logOperation(operation string, params map[string]interface{}) { // 记录操作日志 // ...}
package main import ( "crypto/hmac" "crypto/sha256" "crypto/tls" "crypto/x509" "encoding/hex" "fmt" "io/ioutil" "log" "net" "net/http" "strings" "time") // LoadTLSConfig loads TLS configuration from certificate and key filesfunc LoadTLSConfig(certFile, keyFile string) (*tls.Config, error) { cert, err := tls.LoadX509KeyPair(certFile, keyFile) if err != nil { return nil, err } caCert, err := ioutil.ReadFile("ca.crt") if err != nil { return nil, err } caCertPool := x509.NewCertPool() caCertPool.AppendCertsFromPEM(caCert) tlsConfig := &tls.Config{ Certificates: []tls.Certificate{cert}, RootCAs: caCertPool, ClientCAs: caCertPool, ClientAuth: tls.RequireAndVerifyClientCert, MinVersion: tls.VersionTLS12, CipherSuites: []uint16{tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384}, } return tlsConfig, nil} // GenerateHMAC generates HMAC using a secret key and a messagefunc GenerateHMAC(secret, message string) string { h := hmac.New(sha256.New, []byte(secret)) h.Write([]byte(message)) return hex.EncodeToString(h.Sum(nil))} // VerifyHMAC verifies HMAC using a secret key, a message, and an HMAC valuefunc VerifyHMAC(secret, message, hmacValue string) bool { expectedHMAC := GenerateHMAC(secret, message) return hmacValue == expectedHMAC}
#2. DHT节点实现
这里我们简单实现一个DHT节点,使用内存存储哈希表。
type DHTNode struct { ID string Store map[string]string Neighbors []string MasterKey string IsMaster bool Server *http.Server TLSConfig *tls.Config} func NewDHTNode(id, certFile, keyFile, masterKey string) (*DHTNode, error) { tlsConfig, err := LoadTLSConfig(certFile, keyFile) if err != nil { return nil, err } node := &DHTNode{ ID: id, Store: make(map[string]string), Neighbors: []string{}, MasterKey: masterKey, IsMaster: false, TLSConfig: tlsConfig, } mux := http.NewServeMux() mux.HandleFunc("/put", node.handlePut) mux.HandleFunc("/get", node.handleGet) mux.HandleFunc("/activateMaster", node.handleActivateMaster) server := &http.Server{ Addr: ":8080", Handler