131 lines
2.4 KiB
Go
131 lines
2.4 KiB
Go
|
|
/*
|
||
|
|
Description: Tool to crack private ssh keys using a dictionary.
|
||
|
|
Auth0r: sml@lacashita.com
|
||
|
|
|
||
|
|
Use it only as educational purpose.
|
||
|
|
*/
|
||
|
|
|
||
|
|
package main
|
||
|
|
|
||
|
|
import (
|
||
|
|
"bufio"
|
||
|
|
"flag"
|
||
|
|
"fmt"
|
||
|
|
"io/ioutil"
|
||
|
|
"os"
|
||
|
|
"sync"
|
||
|
|
|
||
|
|
"golang.org/x/crypto/ssh"
|
||
|
|
)
|
||
|
|
|
||
|
|
func prepareWordlist(jobs chan string, wordlist *string) {
|
||
|
|
file, _ := os.Open(*wordlist)
|
||
|
|
scanner := bufio.NewScanner(file)
|
||
|
|
for scanner.Scan() {
|
||
|
|
jobs <- scanner.Text()
|
||
|
|
}
|
||
|
|
close(jobs)
|
||
|
|
}
|
||
|
|
|
||
|
|
func crackKey(jobs chan string, wg *sync.WaitGroup, b []byte, verbo *bool) ssh.AuthMethod {
|
||
|
|
defer wg.Done()
|
||
|
|
var key ssh.Signer
|
||
|
|
var err error
|
||
|
|
for {
|
||
|
|
pazz, ok := <-jobs
|
||
|
|
if !ok {
|
||
|
|
break
|
||
|
|
} else {
|
||
|
|
key, err = ssh.ParsePrivateKeyWithPassphrase(b, []byte(pazz))
|
||
|
|
if err != nil {
|
||
|
|
if *verbo == true {
|
||
|
|
fmt.Printf("Trying %v\n", pazz)
|
||
|
|
}
|
||
|
|
} else {
|
||
|
|
fmt.Printf("[+] Valid key Found: %v\n", pazz)
|
||
|
|
os.Exit(0)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return ssh.PublicKeys(key)
|
||
|
|
}
|
||
|
|
|
||
|
|
func checkKey(keyfile *string) {
|
||
|
|
var file string
|
||
|
|
file = *keyfile
|
||
|
|
_, err := os.Stat(file)
|
||
|
|
if err != nil {
|
||
|
|
fmt.Println("Key doesnt exist")
|
||
|
|
os.Exit(1)
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
func checkWordlist(keyfile *string) {
|
||
|
|
var file string
|
||
|
|
file = *keyfile
|
||
|
|
_, err := os.Stat(file)
|
||
|
|
if err != nil {
|
||
|
|
fmt.Println("Wordlist doesnt exist")
|
||
|
|
os.Exit(1)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func menu(options int) {
|
||
|
|
if options < 5 {
|
||
|
|
fmt.Println(`
|
||
|
|
Parameters:
|
||
|
|
-w Wordlist with passwords.
|
||
|
|
-k SSH Key to crack.
|
||
|
|
-c Number of concurrent processes.
|
||
|
|
-v Verbose
|
||
|
|
|
||
|
|
Examples of usage:
|
||
|
|
fssh -w rockyou.txt -k id_rsa
|
||
|
|
|
||
|
|
Example with 5 concurrent processes:
|
||
|
|
fssh -w rockyou.txt -k id_rsa -c 5
|
||
|
|
`)
|
||
|
|
os.Exit(1)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func main() {
|
||
|
|
var b []byte
|
||
|
|
var wordlist string
|
||
|
|
var keyfile string
|
||
|
|
var verbo bool
|
||
|
|
var concurrent int
|
||
|
|
var wg sync.WaitGroup
|
||
|
|
jobs := make(chan string)
|
||
|
|
flag.StringVar(&wordlist, "w", "", "Like /usr/share/wordlists/rockyou.txt")
|
||
|
|
flag.StringVar(&keyfile, "k", "", "Like ~/.ssh/id_rsa")
|
||
|
|
flag.IntVar(&concurrent, "c", 3, "Concurrency, by default 3")
|
||
|
|
flag.BoolVar(&verbo, "v", false , "Enable Verbose")
|
||
|
|
flag.Parse()
|
||
|
|
menu(len(os.Args))
|
||
|
|
checkKey(&keyfile)
|
||
|
|
checkWordlist(&wordlist)
|
||
|
|
fmt.Printf(`
|
||
|
|
__ _____ _____ _ _
|
||
|
|
/ _/ ____/ ____| | | |
|
||
|
|
| || (___| (___ | |__| |
|
||
|
|
| _\___ \\___ \| __ |
|
||
|
|
| | ____) |___) | | | |
|
||
|
|
|_||_____/_____/|_| |_|
|
||
|
|
===========================
|
||
|
|
|
||
|
|
[-] Cracking the key.... Wait.
|
||
|
|
|
||
|
|
`)
|
||
|
|
|
||
|
|
b, _ = ioutil.ReadFile(keyfile)
|
||
|
|
go prepareWordlist(jobs, &wordlist)
|
||
|
|
for i := 0; i < concurrent; i++ {
|
||
|
|
go crackKey(jobs, &wg, b, &verbo)
|
||
|
|
wg.Add(1)
|
||
|
|
}
|
||
|
|
wg.Wait()
|
||
|
|
fmt.Printf("[x] Password not found :_(\n")
|
||
|
|
}
|