1. 判断运行参数
    2. passfile linux 密码文件,dictionary 密码文件
    3. 打开linux密码文件,读取密码字典
    4. 使用bufio.NewScanner 去循环读取 linux文件,
      1. 判断是是否包含 :
      2. 以:分割
      3. 取0,1,为user、password
      4. 进入循环进行破解(以一个linux密码,对应字典所有)
      5. 调用testpass函数破解
        1. testpass传入 加密的密码,明文密码
        2. github.com/amoghe/go-crypt 主要使用这个库,用于加密为linux密码那种类型把,类似md5 碰撞
    • 为什么要用bufio 去操作文件
    • github.com/amoghe/go-crypt 怎么使用 ```go package main

    import ( “bufio” “flag” “fmt” “io/ioutil”

    1. "os"
    2. "log"
    3. "strings"
    4. 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()

    1. // вывод справки
    2. if passfile == "" || dictionary == "" {
    3. println("Please " + os.Args[0] + " -h")
    4. os.Exit(0)
    5. }
    6. // открываем shadow
    7. passFile, err := os.Open(passfile)
    8. if err != nil {
    9. log.Fatalln(err)
    10. }
    11. defer passFile.Close()
    12. // парольный словарь
    13. dictFile, err := ioutil.ReadFile(dictionary)
    14. if err != nil {
    15. log.Fatalln(err)
    16. }
    17. passDict := strings.Split(string(dictFile), "\n")
    18. // построчно
    19. scanner := bufio.NewScanner(passFile)
    20. for scanner.Scan() {
    21. j := scanner.Text()
    22. // строки с логин/пароль
    23. if strings.Contains(j, ":") {
    24. shadowText := strings.Split(j, ":")
    25. user, cryptPass := shadowText[0], shadowText[1]
    26. fmt.Printf("[*] Cracking Password For: %v\n", user)
    27. for i := 0; i < len(passDict)-1; i++ {
    28. if testPass(cryptPass, passDict[i]) != "" {
    29. println(testPass(cryptPass, passDict[i]))
    30. break
    31. }
    32. }
    33. }
    34. }

    }

    func testPass(cryptPass string, passWord string) string { saltSearch := strings.LastIndex(cryptPass, “$”) salt := cryptPass[0:saltSearch]

    1. cryptWord, err := crypt.Crypt(passWord, salt)
    2. if err != nil {
    3. log.Fatalf("Ошибка SHA: %v", err)
    4. }
    5. // если найден !
    6. if cryptWord == cryptPass {
    7. return "[+] Found PASSWORD: " + passWord
    8. }
    9. return ""

    }

    ```