通过上述的流程,咱们就能够简略了解示例程序了
func main() {
// 在所有接口上绑定 TCP 端口 20080,启动监听服务
listener, err := net.Listen("tcp", ":20080")
// 判断监听服务是否启动,否则抛出异样
if err != nil {log.Fatalln("Unable to Bind to port")
}
// 打印语句,胜利监听
log.Println("Listening on localhost:20080")
// 有限循环,期待客户端进行连贯
for {
// 期待连贯,创立与返回 net.Conn
conn, err := listener.Accpet()
log.Println("Reveived connection")
if err != nil {log.Fatalln("Unable to accept connection")
}
// 解决连贯,应用 goroutine 实现并发
go handle(conn)
}
}
代理 TCP 客户端
func handle(src net.Conn) {dst, err := net.Dial("tcp", "targethost:80")
if err != nil {log.Fatalln("Unable to connect to host")
}
defer dst.Close()
go func() {
// 将源的输入复制到指标
// io.Copy(dst Writer, src Reader)
// 将 Reader 读取到的数据复制到 Writer
if _, err := io.Copy(dst, src); err != nil {log.Fatalln(err)
}
}()
// 将指标的输入复制回源
if _, err := io.Copy(src, dst); err != nil{log.Fatalln(err)
}
}
复现 Netcat 命令执行
Netcat,命令行网络工具,用来在两台机器之间建设 TCP/UDP 连贯,相比 Telnet 更灵便且能够编写脚本
“ 平安巨洞 ”
nc -lp port -e /bin/bash
// 命令在 port 端口创立一个监听器,任何可能通过 Telnet 连贯的近程客户端都能够执行任意 bash 命令
// Netcat 容许在程序编译期间依据须要增加此性能
Go:os/exec 包
能够运行操作系统命令
定义了一种名为 Cmd 的类型,蕴含运行命令以及操作 stdin(Reader)和 stdout(Writer)所需的办法和属性
创立实例
// Command(name string, arg...string)
cmd := exec.Command("/bin/sh", "-i")
Reader 和 Writer 赋给 Cmd
cmd.Stdin = conn
cmd.Stdout = conn
应用 cmd.Run 运行命令
if err := cmd.Run(); err != nil {// 解决异样}
io.Pipe()
该函数是 Go 的同步内存管道,可用于连贯 Reader 和 Writer
func Pipe() (*PipeReader, *PipeWriter)
应用 PipeReader 和 PipeWriter 能够防止显示刷新 writer 并同步连贯 stdout 和 TCP 连贯