myfakessh/main.go
2025-01-23 00:32:23 +08:00

72 lines
1.5 KiB
Go

package main
import (
"crypto/ed25519"
"crypto/rand"
"errors"
"log"
"net"
"os"
"time"
"golang.org/x/crypto/ssh"
)
var (
errBadPassword = errors.New("permission denied")
serverVersions = []string{
"SSH-2.0-OpenSSH_9.2p1 Debian-2+deb12u4", // My Server Truely
"SSH-2.0-OpenSSH_6.0p1 Debian-4+deb7u2", // cowrie default
"SSH-2.0-OpenSSH_9.9", // Manjaro
}
)
func main() {
if len(os.Args) > 1 {
dbPath = os.Args[1] + "/sqlite.db"
}
initDB()
defer db.Close()
serverConfig := &ssh.ServerConfig{
MaxAuthTries: 3,
PasswordCallback: passwordCallback,
ServerVersion: serverVersions[0],
}
_, privateKey, _ := ed25519.GenerateKey(rand.Reader)
signer, _ := ssh.NewSignerFromSigner(privateKey)
serverConfig.AddHostKey(signer)
listener, err := net.Listen("tcp", ":22")
if err != nil {
log.Fatal("Failed to listen:", err)
return
}
defer listener.Close()
for {
conn, err := listener.Accept()
if err != nil {
log.Fatal("Failed to accept:", err)
break
}
go handleConn(conn, serverConfig)
}
}
func passwordCallback(conn ssh.ConnMetadata, password []byte) (*ssh.Permissions, error) {
log.Println(conn.RemoteAddr(), string(conn.ClientVersion()), conn.User(), string(password))
logLogin(conn, password)
time.Sleep(100 * time.Millisecond)
return nil, errBadPassword
}
func handleConn(conn net.Conn, serverConfig *ssh.ServerConfig) {
defer conn.Close()
log.Println(conn.RemoteAddr())
logConnect(conn)
ssh.NewServerConn(conn, serverConfig)
}