我在正在使用的设备上找到了一个二进制文件,称为genrandpass,唯一的用户输入是存储在设备本地的公共密钥(这是一个.bin文件)。它还会收集其他一些信息,可能是从环境中收集的,以产生三个密码(使用strings引用了Box ID)。通过与genrandpass有关的shell脚本查看,它将使用生成的三个密码,并且:

使用第一个密码作为根密码
使用第二个密码称为$epass,第三个密码称为$spass (我只注意名称,以防万一,这对比I聪明的人来说意味着什么。)然后将$epass$spass复制到dropbear横幅文件,并且只要有人连接到dropbear(甚至在登录之前),它们就会显示出来。

这使我认为开发人员打算使用$epass$spass变量生成实际的root密码。包装盒本身上有一些证书和一个私钥(decryption.pem)。不知道这是否是解密代码的正确钥匙,但我想尝试一下,因为我还没有涉及这些盒子的其他一些模型。我只是不确定要尝试正确的命令。有任何想法吗?
genrandpass文件位于https://dl.dropboxusercontent.com/u/23091/genrandpass
生成的最后两个密码的示例:

$ epass:SxTV2Z7TFvU0​​XKP / lYYTDlKAhlRR2jwkDGbWPF68go / oOx6x4Pr5DeyNRlx9oQGF05sHld / vyXXchmxlbzsVzPIwocWIq3OIr3J + ZFJrJYPss9VE7YWrwpyRlGwTVHDvZGIzCKXcaipJd85ldLiWUrNxMl4g + 5kzwVA2a3I8LuiuixRFVmc8ji / W2W5ZeU5FTcbaiNjlpoRHjPFUkvHKJ4nHSfXpZuLDRS53hxcSnb8ZmvTmFP4ITAdyj9Yw + C2pvD + gSEWRB / H + 1cFPQOTi7wr / FY8266QEWqGZw30ZEsMCUNCC0DgiIX + H68QKcU8QFYUJC5 + vui3BtcOfFXKHZl ==
$ SPASS:
RtcTy7fJ11XAQi1P2HiZM4MAxMZMA2NlD6wZL8jNYdrSL5i8qtkGztKDccmGqRWgjiVKI7TcVNcX3PhUSB3UfQCAF6KpBvH7NNezkExdwdM3W2mSnXJvyRLpDSJEgALs0wurUrqIYClZOjTc + xiJzOIUP0Gxb4d2ADOaKXHQ6n6H2Ss / 1smITjrbXJ1K8RentZu26sAy3DW + zRIxtxnktSAGUscdG1oytlOL15aAROSL27NUcPSoA3 + 4o76zggq5TspIBTSmidVRUccEdXPyAzZggR0yqGNrm99uJXHlhw4zCW + GzKJFsJSTwDHZvCoeLERCLuyXFVrgmIISKf6E2V ==


评论

您的二进制文件将libc动态链接到可以预期的fopen,fread,puts之类的函数,还有一个libjsonsigner.so,它具有run_sha256,run_rsa_public_decrypt之类的功能(可以猜测它们的作用)以及get_finder_id_public_key和make_password,这似乎是了解发生了什么至关重要。请同时上传该库。

但是,从名称rsa和public_key来看,我倾向于认为spass和/或epass是使用设备上的公钥加密的root密码的版本,但是您将无法从中获取root密码。没有您没有的私钥。因此,供应商可以从“找到”并且需要重新初始化的设备中获取密码,但是没有其他人可以这样做(除非您可以破解RSA)。

这是您请求的文件:dl.dropboxusercontent.com/u/23091/libjsonsignerintrepid.so和dl.dropboxusercontent.com/u/23091/libjsonsigner.so

#1 楼

您的代码在0x400960处具有一个看起来像主要功能的函数,并且省略了所有初始化(所有内容都初始化为0)和错误检查,如下所示:

char input_file_buffer[256];

int finder_id_size=16;
char finder_id[16];

int temp_256=256;
char finder_public_key[256];

char password[31];

int temp_32=32;
char sha_buffer[256];
char rsa_buffer[256];
char base64_input[256];
char base64_output[345];

FILE *fp=fopen(argv[1], "rb");
fread(input_file_buffer, 256, 1, fp);
fclose(fp);

get_finder_public_key(finder_id, &finder_id_size,
                    finder_public_key, &finder_public_key_size);

make_password(password, 30);

printf("%s\n", password);

memmove(sha_buffer+32, password, 30);
memmove(sha_buffer+63, finder_id, 16);
run_sha256(sha_buffer, 256, rsa_buffer+36, &temp_32);
run_rsa_public_decrypt(sha_buffer, 256, base64_input, &temp_256,
                            input_file_buffer, 256);
    // base64_encode is a loop calling encodeblock, not a function,
    // in the original binary. Encodeblock encodes 3 bytes binary
    // input 4 bytes base64 output.
base64_encode(base64_input, 256, base64_output, 345);
printf("%s\n", base64_output);

rsa_buffer[32]=htonl(1);
run_rsa_ks(rsa_buffer, 256, base64_input, &temp_256);
base64_encode(base64_input, 256, base64_output, 345);
puts(base64_output);


因此,(由于某些功能在共享库中,因此部分是假设)您的代码:


生成随机密码(make_password没有任何输入)
输出随机密码
在该密码和查找程序的ID的组合上运行sha256
在sha输出上运行RSA“解密”,其中公钥来自输入文件( ?)
输出base64编码的RSA数据
在sha输出的不同部分上运行rsa_ks(一个32字节的缓冲区,在256字节缓冲区的中间位置加一个1)。
输出rsa_ks的结果。

在RSA中,您可以使用某人的公钥对消息进行加密,以便某人可以使用其私钥对其进行解密,或者您可以使用priv对其进行加密使用密钥证明您的身份(因为可以使用公共密钥对其进行解密)。因此,我不会过多强调rsa函数称为“解密”的事实。

我假设run_sha函数生成一个随机的32位密钥,并使用该密钥进行加密,并将其保存到我所谓的rsa_buffer。稍后,run_rsa_ks(用于密钥保存的ks)rsa加密该密钥。因此,如果您丢失了设备的root密码,并向供应商寻求帮助,他们


使用私钥解密第二个代码,以获取sha密钥。 >使用私钥解密第一个代码,以获取sha输出
使用sha密钥和sha输出获取包含您的根密码的缓冲区,并且查找程序ID
验证查找程序是否id与您告诉他们的ID相匹配
告诉您root密码。

不幸的是,正如我在评论中已经说过的那样,这意味着除非您可以破解rsa,并且没有任何其他获取私钥的方法,否则您的任务将在此处结束。除非供应商使用非常弱的RSA密钥,否则当他们使用他们的努力来保护根密码时,这不太可能。

更新:我浏览了libjsonsigner中的某些功能.so,并且get_finder_id_public_key和rsa函数使用名为/dev/vixs/xcodedrv的设备,该设备提示视频硬件芯片。还有一个get_certificate函数,它使用的get_device_certx函数使用相同的设备。因此,至少一部分证书内容以及rsa加密似乎是硬件辅助的。这意味着,如果没有对实际硬件进行动态分析,没有好的芯片文档以及很多时间,您就不会走得更远(而且由于RSA的缘故,有时可能会陷入困境)。

评论


哇,这是一个了不起的答案!盒子上有一个文件,文本为“ ----- BEGIN PRIVATE KEY ----”。这可能有帮助吗?但是我的理解是,即使有了该键,除非我们知道如何将其融合在一起,否则可能没有任何帮助。是对的吗?

–贾斯汀
16年5月29日在12:44

该软件似乎不访问除main的argv [1]中的文件以外的任何文件,并且从该文件中,它仅读取了一个似乎不是PEM格式的256字节块,因此该文件可能无关紧要。 。无论如何,很多RSA东西似乎都是硬件辅助的,请参阅上面的更新。 RSA(这是ssl / https中使用的算法)旨在不允许您仅拥有加密密钥就解密,反之亦然,因此,没有,只有一半的密钥对您没有帮助。

–贡特拉姆·布洛姆(Guntram Blohm)
16年5月29日在19:13