42 lines
1.3 KiB
Go
42 lines
1.3 KiB
Go
package services
|
|
|
|
import (
|
|
"bufio"
|
|
"fmt"
|
|
"net"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
func NewGenericEchoHandler(log LoggerFunc) Handler {
|
|
return func(c net.Conn) {
|
|
defer c.Close()
|
|
remote := c.RemoteAddr().String()
|
|
c.SetDeadline(time.Now().Add(10 * time.Second))
|
|
_, _ = c.Write([]byte("220 Welcome to service\r\n"))
|
|
r := bufio.NewReader(c)
|
|
var b strings.Builder
|
|
for i := 0; i < 10; i++ {
|
|
line, err := r.ReadString('\n')
|
|
if err != nil { break }
|
|
b.WriteString(line)
|
|
_, _ = c.Write([]byte("ACK\r\n"))
|
|
}
|
|
log(Record{Timestamp: Now(), RemoteAddr: remoteIP(remote), RemotePort: remotePort(remote), Service: "generic", Details: map[string]string{"lines": strconv.Itoa(strings.Count(b.String(), "\n"))}, RawPayload: b.String()})
|
|
}
|
|
}
|
|
|
|
func NewGenericBannerHandler(banner string, log LoggerFunc) Handler {
|
|
return func(c net.Conn) {
|
|
defer c.Close()
|
|
remote := c.RemoteAddr().String()
|
|
_, _ = c.Write([]byte(fmt.Sprintf("%s\r\n", banner)))
|
|
c.SetDeadline(time.Now().Add(10 * time.Second))
|
|
buf := make([]byte, 4096)
|
|
n, _ := c.Read(buf)
|
|
payload := strings.TrimSpace(string(buf[:n]))
|
|
log(Record{Timestamp: Now(), RemoteAddr: remoteIP(remote), RemotePort: remotePort(remote), Service: banner, Details: map[string]string{"read_bytes": strconv.Itoa(n)}, RawPayload: payload})
|
|
}
|
|
}
|