CVE-2020-22253后门漏洞分析
CVE-2020-22253后门漏洞分析
愿风载尘 看雪学苑 2023-08-23 18:03
多款 Xiongmai 产品存在安全漏洞,该漏洞源于开放9530端口。未经身份验证的攻击者可与受害设备进行任意 Telnet 连接。以下产品和版本受到影响:AHB7008T-MH-V2、AHB7804R-ELS、AHB7804R-MH-V2、AHB7808R-MS-V2、AHB7808R-MS、AHB7808T-MS-V2、AHB7804R-LMS、HI3518E_50H10L_S39。
整个身份验证过程可能类似于某种 HMAC 质询-响应身份验证,只不过它使用对称密码而不是哈希。对于长度超过 8 字节的密钥,这种特殊的对称密码类似于 3DES-EDE2 的某些变体,对于较短的密钥则类似于简单 DES。
1.客户端打开与设备的 TCP 端口 9530 的连接,并发送OpenTelnet:OpenOnce
前缀有指示总消息长度的字节的字符串。对于以前版本的后门,此步骤是最后一步。如果执行此步骤后没有响应,则可能 telnetd 已经启动。
2.服务器(设备)用字符串应答randNum:XXXXXXXX
,其中XXXXXXXX
是 8 位随机十进制数。
3.客户端使用其预共享密钥并将加密密钥构造为接收到的随机数和 PSK 的串联。
4.客户端使用加密密钥加密随机数并在 string 之后发送randNum:
。整个消息前面带有指示消息总长度的字节。
5.服务器从文件加载相同的预共享密钥,或者如果文件丢失则/mnt/custom/TelnetOEMPasswd
使用默认密钥。2wj9fsa2
6.服务器对随机数进行加密并验证结果与客户端的字符串是否相同。成功后,服务器发送字符串verify:OK
或verify:ERROR
其他内容。
7.客户端加密 stringTelnet:OpenOnce
,在其前面添加总长度字节、CMD:
字符串并发送到服务器。
8.服务器提取并解密收到的命令。如果解密结果等于字符串,Telnet:OpenOnce
则响应Open:OK
,启用调试端口 9527 并启动 telnet 守护进程。
设备:XMJP IPC 摄像头 型号:XM510
使用binwalk进行解压
进行字符串搜索
找到关键文件
在 usr/bin 目录下找到 dvrvox这个可执行程序,查看文件信息:
IDA分析
Shift+F12搜索字符串OpenTelnet:OpenOnce,定位到关键代码。
程序执行流程中,在经过判断后可以执行system(“telnetd”)命令,从而开启漏洞信息中所说的9530端口,所以利用漏洞需经过程序判断流程执行这个命令。
首先程序使用socket套接字的recv函数接受数据。
接着进行第一个判断strncmp(&s[1], “OpenTelnet:OpenOnce”, 0x13u)判断开头是否为 OpenTelnet:OpenOnce。
通过第一个判断,程序首先执行get_random_bytime((char *)ranNum),根据时间戳生成八位随机数字字符串。
get_random_bytime函数
第二个判断recv_buffer中的内容是否为randNum开头的字符串。
get_key 函数的作用是返回一个 key 字符串,判断 /mnt/custom/TelnetOEMPasswd 文件是否存在,存在的话返回文件的内容(也就是密钥),不存在就返回 2wj9fsa2 字符串。
接下来是主要的encrypt加密函数,传入的参数分别为之前生成的8位随机数字以及他的长度,还有通过sprintf将key和ranNum拼接后的concatenateStr字符串及其长度。concatenateStr也就是需要加密的字符串,而key相当于程序中的 PSK 预共享密钥,也就是后门密钥。
跟进到encrypt函数中,逻辑较为复杂,可参考
https://github.com/tothi/pyDes/blob/7a26fe09dc5b57b175c6439fbbf496414598a7a2/pyDes.py#L108
对于长度超过 8 字节的密钥,这种特殊的对称密码类似于 3DES-EDE2 的某些变体,对于较短的密钥则类似于简单 DES。
3DES部分代码:
1.triple_des类继承自_baseDes,其中_baseDes是 DES 加密算法的基类,triple_des通过调用_baseDes的方法来实现加密/解密过程。
2.构造函数init初始化triple_des类的对象。构造函数接收以下参数:
key: 加密密钥,可以是 16 或 24 字节长的字节数组。如果是 16 字节长,将使用 DES-EDE2 模式,如果是 24 字节长,将使用 DES-EDE3 模式。
mode: 加密模式,可以是ECB(电子密码本模式)或CBC(密码块链接模式),默认为ECB。
IV: 初始化向量(只在 CBC 模式下需要),必须是 8 字节长的字节数组。
pad: 填充字符(可选参数),用于加密数据时对不足 8 字节的数据进行填充。
padmode: 填充模式(可选参数),可以是PAD_NORMAL或PAD_PKCS5,默认为PAD_NORMAL。
hs: 是否进行硬件加速(可选参数),默认为False,表示不使用硬件加速。
3.setKey方法用于设置加密密钥。根据传入的key的长度,判断使用 DES-EDE2 还是 DES-EDE3 模式。然后创建三个des类的实例,分别用于处理三个部分的加密解密。
4.setMode、setPadding、setPadMode和setIV方法用于设置加密模式、填充字符、填充模式和初始化向量,并将设置传递给三个des实例。
5.encrypt方法用于对输入的数据进行加密。它接收以下参数:
data: 要加密的数据,必须是长度为 8 的倍数的字节数组。
pad: 可选参数,用于加密数据时对不足 8 字节的数据进行填充,必须是长度为 1 的字节数组。
padmode: 可选参数,用于指定填充模式,可以是PAD_NORMAL或PAD_PKCS5。方法首先将数据进行填充,然后根据加密模式进行加密,最后返回加密后的数据。
6.decrypt方法用于对输入的数据进行解密。它接收以下参数:
data: 要解密的数据,必须是长度为 8 的倍数的字节数组。
pad: 可选参数,用于解密数据时对最后 8 字节的填充字符进行移除,必须是长度为 1 的字节数组。
padmode: 可选参数,用于指定填充模式,可以是PAD_NORMAL或PAD_PKCS5。方法首先根据加密模式进行解密,然后根据填充模式对解密数据进行处理,最后返回解密后的数据。
7.注意:这里的des类指的是之前提到的单独的 DES 加密算法类,而不是 Triple DES 的类。Triple DES 类在内部使用了三个单独的 DES 加密实例来完成加密和
解密过程。
参考此代码写出具体的加密算法,将加密结果拼接在randNum:字符串后面
之后经判断输出verify:OK
最后再次判断接收到的字符串开头是否为CMD,这里的 dencrypt对应上面的加密算法,判断解密后的字符串是否为“Telnet:OpenOnce” ,也就是只需将这个字符串经过相同的加密算法即可,从而执行 system(“telnetd”) 函数,开启后门。
一旦 telnet 守护进程激活,可以用以下登录名/密码对之一:
这些密码可以从固件中恢复,也可以通过/etc/passwd
文件中的哈希值进行暴力破解。
最常见的 PSK 是默认值之一:2wj9fsa2
会话示例:
参考文章
https://github.com/tothi/pwn-hisilicon-dvr#summary
https://www.4hou.com/posts/mGYE
https://github.com/tothi/pyDes/blob/master/pyDes.py
看雪ID:愿风载尘
https://bbs.kanxue.com/user-home-937578.htm
*本文为看雪论坛优秀文章,由 愿风载尘 原创,转载请注明来自看雪社区
#往期推荐
3、安卓加固脱壳分享
球分享
球点赞
球在看