确定哈希方法 - Busybox Linux

逆向工程 linux 散列函数
2021-06-25 09:02:40

我试图弄清楚运行 Busybox Linux 的基于 ARM 的设备如何在配置文件中为用户存储哈希值。基本上,系统允许您将整个配置备份到文件中。在此文件中,我可以看到默认帐户之一的哈希值 - admin.

如果我将admin密码配置test,我会在输出文件中得到这个哈希值:

3785a9c61b587f2ff0dd7132db844f14

作为一个 32 个字符的哈希,我怀疑它是 MD5。我从测试中知道,如果我将其他内置帐户之一配置为具有相同的密码,则哈希值会有所不同。因此,无论散列算法是什么,它似乎都可能会在散列之前username连接password在一起。

我尝试了很多组合,我想我可能只需要尝试蛮力。眼看我所知usernamepassword,我想我可以做一个自定义字典攻击什么的。

有什么建议 ?

2个回答

我拿了一个小 Perl 程序,这个程序是我前一段时间遇到类似问题时写的,并将其更改为与您的数据相匹配。这应该生成“test:admin”的所有排列,以任何字符作为分隔符,并包括所有缩写(以处理仅从用户名中提取几个字节的情况)。

从 3785a9 开始,我得到了大约 50 个结果,但在 3785a9c6 中没有。因此,这似乎排除了将用户名(的一部分)连接到密码(可能带有分隔符)并计算结果的 MD5 的情况。但当然,他们可能会使用 MD4 或其他产生 16 字节的东西。他们可能首先使用密码对用户进行异或。他们可能会逆向读取 MD5。有很多可能性使找出算法变得更加困难。

如果您可以首先找出哪个二进制文件创建了密码,请尝试对其运行signrch,这可能有助于找到它使用的算法。

如果你想用我的 perl 程序尝试更多的东西,这里是。在 Xeon E5 上的 1 个核心上花费了大约 1 小时。有一些事情可以优化,但我认为花 30 分钟使程序运行速度快 5 分钟没有多大意义。

#!/usr/bin/perl

use Digest::MD5 qw(md5_hex);
use List::Util qw(shuffle);
use strict;
use warnings;

$|=1;

my @admintest=(split("", "admintest"), ":", chr(127));
# my @admintest=(split("", "abc"), ":", chr(127));

my $n=0;

permute("", @admintest);

sub permute {
        my $str=shift;
        my @letters=@_;
        my $str2;

        for (my $i=0; $i<=$#letters; $i++) {
                if ($letters[$i] eq chr(127)) {
                        tryseparatorsonstring($str);
                        return;
                }
                $str2=$str.$letters[$i];
                permute($str2, @letters[0..$i-1], @letters[$i+1..$#letters]);
        }
}
print "\n";

sub tryseparatorsonstring {
        my $str=shift;
        if ($str =~ /:/) {
                for (my $sep=0; $sep<128; $sep++) {
                        my $str2=$str;
                        $str2=~s/:/chr($sep)/ge;
                        trystring($str2, $sep);
                }
        } else {
                trystring($str, "");
        }
}

sub trystring {
        my $str=shift;
        my $sep=shift;
        my $pass=md5_hex($str);
        print "$n\t$str\t$sep\t$pass\n" if $pass =~ /^3785a9/;
        if (++$n%1_000_000==0) {
                printf "%dM\r", $n/1_000_000;
        }
        # print "$str\n";
}

exit 0;

我建议您寻找哈希识别软件。您可以在 Internet 上找到几个免费提供的内容。例如:

我尝试了您的示例,HashTag它似乎是具有多种类型设置的 MD5 算法,但是您提供的签名越多,它就越准确。

$> HashTag.py -sh 3785a9c61b587f2ff0dd7132db844f14

Hash: 3785a9c61b587f2ff0dd7132db844f14

[*] MD5 - Hashcat Mode 0
[*] NTLM - Hashcat Mode 1000
[*] MD4 - Hashcat Mode 900
[*] LM - Hashcat Mode 3000
[*] MD5(HMAC)
[*] MD4(HMAC)
[*] Haval-128(HMAC)
[*] RipeMD-128(HMAC)
[*] Tiger-128(HMAC)
[*] Snefru-128(HMAC)
[*] MD2(HMAC)
[*] MD5(ZipMonster)
[*] MD5(HMAC(Wordpress))
[*] Skein-256(128)
[*] Skein-512(128)
[*] md5($pass.$salt) - Hashcat Mode 10
[*] md5($pass.$salt.$pass)
[*] md5($pass.md5($pass))
[*] md5($salt.$pass) - Hashcat Mode 20
[*] md5($salt.$pass.$salt) - Hashcat Mode 3810
[*] md5($salt.$pass.$username)
[*] md5($salt.'-'.md5($pass))
[*] md5($salt.md5($pass)) - Hashcat Mode 3710
... [cut] ...