• 1. Stay - Post
  • 2. Circles - Post
  • 3. Hollywood's_Bleeding - Post
  • 4. A_Thousand_Bad_Times - Post

学习编写安全工具 with Golang之回显服务器篇

学习编写安全工具 with Golang之回显服务器篇

前言

有时候在渗透或者安全测试当中,我们需要监听某个端口,来获得服务器执行后回显的数据,一般都是用的ncat来进行的,我们这里也是实现一个go版ncat(简单型)

有关Conn

如果使用过JAVA编写简单的客户端和服务器通信的代码,在JAVA里我们一般使用buffer流去读写,在Go里也是一样的,我们可以使用buffer进行读写操作(使用io标准库里面提供的也可以)

bufio.NewReader也好,还是bufio.NewWriter也好,都需要我们传入

io里的ReaderWriter,而我们使用net.Dial时会返回Connerr,

那么Conn对象具体是什么呢?看看文档

Conn实际上是一个接口,里面包含了io.Readio.Write,而io包中这两个接口,实际上包装了基本的Readwrite方法,因此我们对于一个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)
    }
}

最终实现效果:

然后剩下的一步就是将该代码转换成一个模块,将连接方式和地址用输入替代即可


除非注明,ebounce文章均为原创,转载请以链接形式标明本文地址

本文地址:http://ebounce.cn/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/57.html

新评论

captcha
请输入验证码