【问题标题】:OSX bash script to brute-force/loop MD5 hash to find Salt if I know the Password?如果我知道密码,OSX bash 脚本会暴力破解/循环 MD5 哈希以查找 Salt?
【发布时间】:2018-07-26 13:51:24
【问题描述】:

我有一个加盐的 MD5 哈希:896501b1d2ed4ec4e2d3a6c69a672152,我的密码是:123321

我在其他网站上使用相同的密码测试并创建了几个用户帐户:123321,在 mySQL 中我看到相同的 MD5 哈希 896501b1d2ed4ec4e2d3a6c69a672152

这确认了即使使用不同的用户名、不同的注册日期等,Salt 也是相同的。

下面我设置了一个简单的(2 字符)Salt Find 测试用例,我知道 Salt+Password 并且脚本会找到 Salt:

Setup Test details:
Salt = 'Ac'
Password = '123321'
Salted password = 'Ac123321'
Hash of Salted pass = 'b60639eef9d7e85eab35e16f6d1ba6d6'

使用下面的代码我可以在上面找到这个盐:

#!/bin/bash

hashtofind=b60639eef9d7e85eab35e16f6d1ba6d6    
password=123321
counter=0

for i in $(seq 48 122); do
    counter=$((counter+1))
    salt=$(printf "\\$(printf %o $i)")
    saltedpass=$(printf "\\$(printf %o $i)$password")
    hashtocheck=$(echo -n "$saltedpass" | md5)
    echo "$counter"
    if [ $hashtocheck = $hashtofind ]; then
        echo "Found HASH!"
        echo "hashtofind: $hashtofind"
        echo "saltedpass: $hashtocheck"
        echo "SALT: $salt"
        echo "password: $password"
        echo "Salt+Password: $saltedpass"
        exit 1
    fi
done

for i in $(seq 48 122); do
    for j in $(seq 48 122); do
        counter=$((counter+1))
        salt=$(printf "\\$(printf %o $i)\\$(printf %o $j)")
        saltedpass=$(printf "\\$(printf %o $i)\\$(printf %o $j)$password")
        hashtocheck=$(echo -n "$saltedpass" | md5)
        echo "$counter"
        if [ $hashtocheck = $hashtofind ]; then
            echo "Found HASH!"
            echo "hashtofind: $hashtofind"
            echo "saltedpass: $hashtocheck"
            echo "SALT: $salt"
            echo "password: $password"
            echo "Salt+Password: $saltedpass"
            exit 1
        fi
    done
done

for i in $(seq 48 122); do
    for j in $(seq 48 122); do
        for k in $(seq 48 122); do
            counter=$((counter+1))
            salt=$(printf "\\$(printf %o $i)\\$(printf %o $j)\\$(printf %o $k)")
            saltedpass=$(printf "\\$(printf %o $i)\\$(printf %o $j)\\$(printf %o $k)$password")
            hashtocheck=$(echo -n "$saltedpass" | md5)
            echo "$counter"
            if [ $hashtocheck = $hashtofind ]; then
                echo "Found HASH!"
                echo "hashtofind: $hashtofind"
                echo "saltedpass: $hashtocheck"
                echo "SALT: $salt"
                echo "password: $password"
                echo "Salt+Password: $saltedpass"
                exit 1
            fi
        done
    done
done

此代码在 10 秒内给出结果:

1398
1399
1400
1401
1402
Found HASH!
hashtofind: b60639eef9d7e85eab35e16f6d1ba6d6
saltedpass: b60639eef9d7e85eab35e16f6d1ba6d6
SALT: Ac
password: 123321
Salt+Password: Ac123321

我最初需要的 Salt 长度超过 2 个字符。

问题:除了运行多终端/shell 控制台之外,还有什么方法可以更快地运行这个过程?

【问题讨论】:

  • 您所有的命令替换,即saltedpass=$(...) 都非常“昂贵”,因为$() 必须启动一个新的shell 来处理那个语句。我认为您可以将所有循环的整个内容转换为一个 awk 脚本,然后为您无法避免的 1 个外部调用调用 md5 | getline resultVar (或类似的)。祝你好运。
  • @shellter 谢谢你,删除$() 使它更快。

标签: bash loops find md5


【解决方案1】:

在那里 [sic] mySQL 我看到了相同的 MD5 哈希

盐不是秘密信息;也就是说,没有比哈希更秘密的了。

如果您有权访问存储散列密码的 MySQL 数据库,则该数据库应该存储盐。它必须;盐对于验证密码至关重要。

在经典的非阴影 Unix 密码文件中,每个人都可以清楚地看到盐和哈希。两者都是同等公开的信息,一起存储在同一个字段中。

如果数据库的任何字段中都没有存储盐,则表明该网站对所有密码都使用了一些固定的盐,这是非常糟糕的。这也与您在不同数据库中看到相同哈希的事实一致。该软件几乎可以肯定使用“静态盐”。

您不必反转盐来证明这一点:根据最佳实践使用随机盐的可能性几乎没有小,但哈希值相同。

无论如何,通过用编译的编程语言编写整个破解程序,具有相当快的散列函数,可以更快地进行搜索。脚本的大部分时间都花在启动进程和解释 shell 语法上。

使用已知 pw/hash 对暴力破解两个字符的盐应该是瞬时的。

(在这个话题上,我们根本不应该使用两个字符的盐,更不用说静态的两个字符的盐了。)

【讨论】:

    【解决方案2】:

    John the ripper 是专为此类任务设计的精密工具。将您的哈希值放在一个假密码文件中:

    → cat input 
    username:b60639eef9d7e85eab35e16f6d1ba6d6
    

    假设使用 2 个 ascii 字符作为种子:

    → john --format=raw-md5 input --mask=?a?a123321 
    Created directory: /home/juergen/.john
    Loaded 1 password hash (Raw-MD5 [MD5 128/128 AVX 12x])
    Warning: poor OpenMP scalability for this hash type, consider --fork=4
    Will run 4 OpenMP threads
    Press 'q' or Ctrl-C to abort, almost any other key for status
    Ac123321         (username)
    1g 0:00:00:00  16.66g/s 150416p/s 150416c/s 150416C/s   123321..~~123321
    Use the "--show" option to display all of the cracked passwords reliably
    Session completed
    

    【讨论】:

    • 我安装了 John 1.8.0,但是命令:./john --format=raw-md5 input.txt --mask=?a?a123321 给了我错误:Unknown option: "--mask=?a?a123321"
    • 您需要安装“Jumbo”版本:github.com/magnumripper/JohnTheRipper
    猜你喜欢
    • 2013-05-21
    • 1970-01-01
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2011-02-11
    • 2018-09-26
    • 2015-11-19
    相关资源
    最近更新 更多