我正在用Golang做一个UDP shell(我在互联网上找到了它),但需要注意的是,它首先会提示您输入密码。
已经完成了密码比较(通过简单的比较),但是我想做的是,一旦用户输入密码,外壳就会打开,并且在关闭连接之前不再要求输入密码。
所以我的想法是要求输入密码,如果密码正确,则要通过另一个端口(反向外壳)连接回主机,则会发生连接,但不允许我在外壳上书写。
这是我的代码:
package main
import (
"bufio"
"strings"
"fmt"
"io"
"log"
"net"
"os/exec"
"syscall"
"time"
)
func main() {
udp_bind()
}
func udp_bind() {
message := make([]byte, 2048)
addr := net.UDPAddr{
Port: 6666,
IP: net.ParseIP("127.0.0.1"),
}
ser, err := net.ListenUDP("udp", &addr)
if err != nil {
fmt.Printf("Some error %v\n", err)
return
}
for {
rlen, remoteaddr, err := ser.ReadFromUDP(message)
if err != nil {
fmt.Printf("Some error %v", err)
continue
}
data := strings.TrimSpace(string(message[:rlen]))
fmt.Printf("received: %s from %s\n", data, remoteaddr)
if data == "pwd" {
go sendResponse(ser, remoteaddr, "From server: correct password ")
go udp_reverse(remoteaddr)
} else {
go sendResponse(ser, remoteaddr, "From server: wrong password ")
}
}
}
func udp_reverse(host *net.UDPAddr) {
obj := host.IP.String() + ":5555"
remoteAddr, err := net.ResolveUDPAddr("udp", obj)
conn, err := net.DialUDP("udp", nil, remoteAddr)
if err != nil {
log.Fatal(err)
}
log.Printf("Established connection to %s \n", remoteAddr)
log.Printf("Remote UDP address : %s \n", conn.RemoteAddr().String())
log.Printf("Local UDP client address : %s \n", conn.LocalAddr().String())
defer conn.Close()
// receive message from server
buffer := make([]byte, 1024)
n, addr, err := conn.ReadFromUDP(buffer)
fmt.Println("UDP Server : ", addr)
fmt.Println("Received from UDP server : ", string(buffer[:n]))
}
我正在使用go run main.go
运行服务器,使用ncat -4u -w1 localhost 6666
从客户端连接netcat,并使用ncat localhost -vvul 5555
从客户端设置侦听器。
这个想法是客户端通过netcat
连接到服务器到端口6666,输入密码,如果密码正确,则服务器连接到客户端到端口5555(以前在客户端打开),并且客户端可以从那里将数据写入服务器。如果客户端关闭连接,则反向连接会停止,而端口6666会不断侦听服务器。
但是我进行了绑定连接,服务器正在侦听,我输入了密码,服务器响应说它是正确的,并且它在端口5555上打开了反向连接,但是我无法在{{1 }}我设置的监听器。