V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
gitxuzan
V2EX  ›  Go 编程语言

这段代码放到服务器,是什么后果?如果是阿里云会直接报警,封掉服务器?

  •  
  •   gitxuzan · 359 天前 · 3739 次点击
    这是一个创建于 359 天前的主题,其中的信息可能已经有所发展或是发生改变。
    func main() {
    
    	listener, err := net.Listen("tcp", ":9988")
    	if err != nil {
    		log.Fatalln("Unable to bind to port")
    	}
    	log.Println("Listening on 0.0.0.0:9988")
    	for {
    		conn, err := listener.Accept()
    		log.Println("Received connection")
    		if err != nil {
    			log.Fatalln("Unable to accept connection")
    		}
    
    		go handle_pipe(conn)
    	}
    }
    func handle_pipe(conn net.Conn) {
    	cmd := exec.Command("/bin/sh", "-i")
    
    	rp, wp := io.Pipe() 
    	cmd.Stdin = conn    
    	cmd.Stdout = wp    
    	go io.Copy(conn, rp)
    
    	if err := cmd.Run(); err != nil {
    		log.Fatalln(err)
    	}
    }
    
    
    13 条回复    2023-04-05 12:06:11 +08:00
    InDom
        1
    InDom  
       359 天前
    首先要搞清楚的是:

    你是放在你自己买的服务器上?
    还是放在别人买的(并且没有授权给你的)服务器上?

    你只要没放在 阿里云买的(并且没有授权给你)的服务器上, 我猜阿里云不会报警.

    不然我装 vnc 不得把牢底坐穿了?
    gitxuzan
        2
    gitxuzan  
    OP
       359 天前
    @InDom 自己的服务器,以前其他方式搞封过,检测出漏洞,必须联系客服才能解封,自己给自己上传一个漏洞,哈哈
    opengps
        3
    opengps  
       359 天前
    阿里这种大厂带有检测服务,会扫描检测,至少会安全工具被测出高危漏洞提示你
    pusheax
        4
    pusheax  
       359 天前
    阿里云报警,是因为直接把 /bin/sh 绑到某个端口,很像黑客的行为。
    黑客可能通过某些漏洞,比如 Weblogic 反序列化,获得了执行代码的权限。
    那么下一步,他就会想办法提权,拿到系统 shell 的权限,常见的方法就是上面这样。
    再说了,直接把 Shell 开在某个端口上,不加验证,本身就是个高危操作。
    liaotuo
        5
    liaotuo  
       359 天前
    ChatGPT: 这段代码是一个基于 TCP 协议的简单的反向 shell 实现。它监听来自远程主机的连接,在接受连接后,通过创建一个新的 goroutine 来处理该连接,并在该 goroutine 中执行 shell 命令 "/bin/sh"。同时,它还将标准输出传输到 wp 管道中,并通过 io.Copy() 方法将管道中的数据写回到连接中,以便远程客户端可以查看命令执行的结果。这个程序漏洞很大,因为用户可以直接输入危险的命令来控制服务器。
    starli9ht
        6
    starli9ht  
       359 天前
    这段代码是一个基于 TCP 协议的简单的反向 Shell 代码,用于建立一个远程 shell 与目标主机通信的交互式会话。该代码会监听在本地 9988 端口,并等待一个 TCP 连接请求。

    一旦有客户端和服务器建立连接,handle_pipe 函数被调用,传入代表连接的 net.Conn 对象作为参数。该函数将通过管道将连接输入流(conn)传递给 /bin/sh 命令的标准输入( stdin ),并通过管道将 /bin/sh 的标准输出(stdout)传递给连接的输出流。

    一旦连接建立并绑定了输入和输出流,shell 会通过连接向目标主机发送执行命令。命令的输出会通过网络连接返回给客户端。客户端可以在不需要访问远程主机的情况下通过该程序进行交互式的命令行操作。

    由于该代码运行 /bin/sh 命令并将其标准输入和输出附加到 TCP 连接中,因此该程序可以模拟交互式的命令行会话。请注意,该程序需要在高度信任的环境中使用,否则可能会被滥用攻击者破坏或者非法及未经授权访问目标主机。
    codeqihan
        7
    codeqihan  
       359 天前
    GPT-4:这段代码是用 Go 语言编写的,它实现了一个简单的 TCP 服务器,监听 9988 端口。当有新的客户端连接时,服务器会为每个连接创建一个新的 goroutine (轻量级线程),并执行一个系统 Shell 。这样,客户端可以通过 TCP 连接远程执行 Shell 命令。

    这段代码的主要部分解释如下:

    使用 net.Listen("tcp", ":9988") 监听 TCP 端口 9988 。
    如果监听失败,输出错误信息并退出程序。
    成功监听后,打印监听信息。
    使用 for 循环不断接受新的客户端连接。
    当有新的客户端连接时,打印连接信息。
    如果接受连接失败,输出错误信息并退出程序。
    对于每个新的连接,创建一个新的 goroutine 并调用 handle_pipe(conn) 函数处理该连接。
    handle_pipe 函数的主要功能如下:

    使用 exec.Command("/bin/sh", "-i") 创建一个新的 Shell 进程。
    使用 io.Pipe() 创建一个管道,用于连接 Shell 进程的标准输入和标准输出。
    将客户端连接的读写分别连接到 Shell 进程的标准输入和标准输出。
    使用 go io.Copy(conn, rp) 在另一个 goroutine 中将 Shell 进程的输出复制到客户端连接。
    使用 cmd.Run() 启动并等待 Shell 进程执行完毕。
    如果 Shell 进程执行失败,输出错误信息并退出程序。
    总之,这段代码实现了一个允许客户端通过 TCP 连接远程执行 Shell 命令的简单服务器。
    sosilver
        8
    sosilver  
       359 天前 via Android   ❤️ 1
    gpt 回复真多啊
    heaventear
        9
    heaventear  
       359 天前
    看看人家 gpt 修改后的

    package main

    import (
    "bufio"
    "io"
    "log"
    "net"
    "os/exec"
    "strings"
    )

    const password = "your_secure_password"

    func main() {
    listener, err := net.Listen("tcp", ":9988")
    if err != nil {
    log.Fatalln("Unable to bind to port")
    }
    log.Println("Listening on 0.0.0.0:9988")
    for {
    conn, err := listener.Accept()
    log.Println("Received connection")
    if err != nil {
    log.Fatalln("Unable to accept connection")
    }

    go handle_pipe(conn)
    }
    }

    func handle_pipe(conn net.Conn) {
    defer conn.Close()

    conn.Write([]byte("Enter password: "))
    reader := bufio.NewReader(conn)
    input, _ := reader.ReadString('\n')
    input = strings.TrimSpace(input)

    if input != password {
    conn.Write([]byte("Incorrect password.\n"))
    return
    }

    conn.Write([]byte("Access granted.\n"))

    cmd := exec.Command("/bin/sh", "-i")

    rp, wp := io.Pipe()
    cmd.Stdin = conn
    cmd.Stdout = wp
    go io.Copy(conn, rp)

    if err := cmd.Run(); err != nil {
    log.Fatalln(err)
    }
    }
    dnsaq
        10
    dnsaq  
       359 天前 via iPhone
    真够无聊的,吃饱了撑着是吧。
    daimaosix
        11
    daimaosix  
       359 天前   ❤️ 1
    neochen13
        12
    neochen13  
       359 天前   ❤️ 1
    管理员好,楼里连续几个 gpt 回复,不一一点出了……真反感
    @Livid
    Livid
        13
    Livid  
    MOD
       358 天前
    @daimaosix
    @neochen13

    谢谢,那几个账号现在已经被彻底 ban 。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5859 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 02:25 · PVG 10:25 · LAX 19:25 · JFK 22:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.