2020-10-02 11:56:59 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"flag"
|
|
|
|
"fmt"
|
|
|
|
"io"
|
|
|
|
"net"
|
|
|
|
)
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
target := flag.String("target", "", "the server address")
|
|
|
|
payload := flag.String("message", "", "the message to send to the server")
|
2020-11-17 22:34:59 +00:00
|
|
|
protocol := flag.String("protocol", "tcp", "the protocol to use with the server [udp,tcp], default tcp")
|
2020-10-02 11:56:59 +00:00
|
|
|
flag.Parse()
|
|
|
|
|
|
|
|
if *target == "" || *payload == "" {
|
|
|
|
flag.Usage()
|
|
|
|
panic("invalid arguments")
|
|
|
|
}
|
2020-11-17 22:34:59 +00:00
|
|
|
|
|
|
|
switch *protocol {
|
|
|
|
case "tcp":
|
|
|
|
connectTCP(*target, *payload)
|
|
|
|
case "udp":
|
|
|
|
connectUDP(*target, *payload)
|
|
|
|
default:
|
|
|
|
panic("invalid protocol")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func connectTCP(target, payload string) {
|
|
|
|
conn, err := net.Dial("tcp", target)
|
2020-10-02 11:56:59 +00:00
|
|
|
if err != nil {
|
2020-11-17 22:34:59 +00:00
|
|
|
panic(fmt.Sprintf("Failed to open connection to [%s] %v", target, err))
|
2020-10-02 11:56:59 +00:00
|
|
|
}
|
|
|
|
defer conn.Close()
|
|
|
|
|
2020-11-17 22:34:59 +00:00
|
|
|
_, err = conn.Write([]byte(payload))
|
2020-10-02 11:56:59 +00:00
|
|
|
if err != nil {
|
|
|
|
panic("Failed to send payload")
|
|
|
|
}
|
|
|
|
_, err = conn.Write([]byte("\n"))
|
|
|
|
if err != nil {
|
|
|
|
panic("Failed to send payload")
|
|
|
|
}
|
2020-11-17 22:34:59 +00:00
|
|
|
buf := make([]byte, 1024)
|
2020-10-02 11:56:59 +00:00
|
|
|
for {
|
|
|
|
n, err := conn.Read(buf)
|
|
|
|
fmt.Print(string(buf[:n]))
|
|
|
|
if err == io.EOF {
|
|
|
|
break
|
|
|
|
}
|
|
|
|
if err != nil {
|
|
|
|
panic("Failed to read from socket")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-11-17 22:34:59 +00:00
|
|
|
|
|
|
|
// UDP uses a constant source port to trigger conntrack problems
|
|
|
|
func connectUDP(target, payload string) {
|
|
|
|
LocalAddr, err := net.ResolveUDPAddr("udp", ":54321")
|
|
|
|
if err != nil {
|
|
|
|
panic(fmt.Sprintf("Failed to resolve UDP local address on port 54321 %v", err))
|
|
|
|
}
|
|
|
|
RemoteAddr, err := net.ResolveUDPAddr("udp", target)
|
|
|
|
if err != nil {
|
|
|
|
panic(fmt.Sprintf("Failed to resolve UDP remote address [%s] %v", target, err))
|
|
|
|
}
|
|
|
|
conn, err := net.DialUDP("udp", LocalAddr, RemoteAddr)
|
|
|
|
if err != nil {
|
|
|
|
panic(fmt.Sprintf("Failed to open connection to [%s] %v", target, err))
|
|
|
|
}
|
|
|
|
defer conn.Close()
|
|
|
|
|
|
|
|
_, err = conn.Write([]byte(payload))
|
|
|
|
if err != nil {
|
|
|
|
panic("Failed to send payload")
|
|
|
|
}
|
|
|
|
_, err = conn.Write([]byte("\n"))
|
|
|
|
if err != nil {
|
|
|
|
panic("Failed to send payload")
|
|
|
|
}
|
|
|
|
|
|
|
|
buf := make([]byte, 1024)
|
|
|
|
n, err := conn.Read(buf)
|
|
|
|
if err != nil {
|
|
|
|
panic("Failed to read from socket")
|
|
|
|
}
|
|
|
|
fmt.Print(string(buf[:n]))
|
|
|
|
}
|