学习编写安全工具 with Golang之回显服务器篇
学习编写安全工具 with Golang之回显服务器篇
前言
有时候在渗透或者安全测试当中,我们需要监听某个端口,来获得服务器执行后回显的数据,一般都是用的ncat来进行的,我们这里也是实现一个go版ncat(简单型)
<!--more-->
有关Conn
如果使用过JAVA编写简单的客户端和服务器通信的代码,在JAVA里我们一般使用buffer
流去读写,在Go里也是一样的,我们可以使用buffer
进行读写操作(使用io标准库里面提供的也可以)。
bufio.NewReader
也好,还是bufio.NewWriter
也好,都需要我们传入
io
里的Reader
和Writer
,而我们使用net.Dial
时会返回Conn
和err
,
那么Conn
对象具体是什么呢?看看文档:
Conn
实际上是一个接口,里面包含了io.Read
和io.Write
,而io
包中这两个接口,实际上包装了基本的Read
和write
方法,因此我们对于一个TCP连接只需要传入一个Conn
接口即可。
回显服务函数
我们可以简单的写一个函数,来创建我们的回显服务:
func echo(conn net.Conn){
defer conn.Close()
//先将关闭连接压入栈底
for { //死循环保证能够多次读写
reader := bufio.NewReader(conn)
//不仅是创建Reader,也是刷新Reader
data,err := reader.ReadString('\n')
//以\n作为输入字符串的终止符
if err != nil {
log.Fatalln("Read data Failed")
}
log.Printf("Read data: %s", data)
//将所读字符串打印出来
writer := bufio.NewWriter(conn)
var write_data string
fmt.Scanln(&write_data)
// 等待用户输入
_, err = writer.WriteString(write_data)
//写入输入的字符串进缓存
if err != nil {
log.Fatalln("Write data Failed")
}
writer.Flush()
//从缓存中写入底层io
}
}
主函数处
func main(){
Ear,err := net.Listen("tcp",":8045")
//确定监听端口
if err != nil {
log.Fatalln("The Port could be listened")
}
log.Println("正在监听 0.0.0.0:8045")
for{
conn,err := Ear.Accept()
//一旦受到连接请求,接受
if err != nil {
log.Fatalln("连接中断")
}
log.Println("已收到连接")
go echo(conn)
//将回显服务挂载
}
}
整体代码:
package main
import (
"bufio"
"fmt"
"log"
"net"
)
func echo(conn net.Conn){
defer conn.Close()
for {
reader := bufio.NewReader(conn)
data,err := reader.ReadString('\n')
if err != nil {
log.Fatalln("Read data Failed")
}
log.Printf("Read data: %s", data)
writer := bufio.NewWriter(conn)
var write_data string
fmt.Scanln(&write_data)
_, err = writer.WriteString(write_data)
if err != nil {
log.Fatalln("Write data Failed")
}
writer.Flush()
}
}
func main(){
Ear,err := net.Listen("tcp",":8045")
if err != nil {
log.Fatalln("The Port could be listened")
}
log.Println("正在监听 0.0.0.0:8045")
for{
conn,err := Ear.Accept()
if err != nil {
log.Fatalln("连接中断")
}
log.Println("已收到连接")
go echo(conn)
}
}
最终实现效果:
然后剩下的一步就是将该代码转换成一个模块,将连接方式和地址用输入替代即可