- 判断运行参数
- passfile linux 密码文件,dictionary 密码文件
- 打开linux密码文件,读取密码字典
- 使用bufio.NewScanner 去循环读取 linux文件,
- 判断是是否包含 :
- 以:分割
- 取0,1,为user、password
- 进入循环进行破解(以一个linux密码,对应字典所有)
- 调用testpass函数破解
- testpass传入 加密的密码,明文密码
- github.com/amoghe/go-crypt 主要使用这个库,用于加密为linux密码那种类型把,类似md5 碰撞
- 为什么要用bufio 去操作文件
- github.com/amoghe/go-crypt 怎么使用 ```go package main
import ( “bufio” “flag” “fmt” “io/ioutil”
"os"
"log"
"strings"
crypt "github.com/amoghe/go-crypt"
)
var ( passfile string dictionary string )
func init() { flag.StringVar(&passfile, “f”, “”, “Open shadow”) flag.StringVar(&dictionary, “d”, “”, “Open pass dictionary”) }
func main() { // разбор флагов flag.Parse()
// вывод справки
if passfile == "" || dictionary == "" {
println("Please " + os.Args[0] + " -h")
os.Exit(0)
}
// открываем shadow
passFile, err := os.Open(passfile)
if err != nil {
log.Fatalln(err)
}
defer passFile.Close()
// парольный словарь
dictFile, err := ioutil.ReadFile(dictionary)
if err != nil {
log.Fatalln(err)
}
passDict := strings.Split(string(dictFile), "\n")
// построчно
scanner := bufio.NewScanner(passFile)
for scanner.Scan() {
j := scanner.Text()
// строки с логин/пароль
if strings.Contains(j, ":") {
shadowText := strings.Split(j, ":")
user, cryptPass := shadowText[0], shadowText[1]
fmt.Printf("[*] Cracking Password For: %v\n", user)
for i := 0; i < len(passDict)-1; i++ {
if testPass(cryptPass, passDict[i]) != "" {
println(testPass(cryptPass, passDict[i]))
break
}
}
}
}
}
func testPass(cryptPass string, passWord string) string { saltSearch := strings.LastIndex(cryptPass, “$”) salt := cryptPass[0:saltSearch]
cryptWord, err := crypt.Crypt(passWord, salt)
if err != nil {
log.Fatalf("Ошибка SHA: %v", err)
}
// если найден !
if cryptWord == cryptPass {
return "[+] Found PASSWORD: " + passWord
}
return ""
}
```