Cisco IOS and IOS XE Software SSH Version 2 RSA-Based User Authentication Bypass Vulnerability CVE-2015-6280分析

CVE-2015-6280分析

Cisco IOS and IOS XE Software SSH Version 2 RSA-Based User Authentication Bypass Vulnerability

漏洞链接:�0�2CVE-2015-6280

从CISCO固件c880data-universalk9-mz.SPA.154-3.M2.bin中提取C880DATA.BIN文件,并把e_machine标记为0x14(PowerPC指令)。

我们从官方公告可以知道,想要成功利用这个漏洞,必须知道一个使用了RSA-base 私钥认证的SSHv2的正确用户名和Publickey,否则是不能利用成功。

为了更好的分析这个漏洞,我们先来看看SSHv2的验证过程:

SSHv2验证阶段 客户端 服务器端
密钥交换部分
用户认证部分 SSH2_MSG_SERVICE_REQUEST
用户认证部分 SSH2_MSG_SERVICE_ACCEPT
用户认证部分 SSH2_MSG_USERAUTH_REQUEST none
用户认证部分 SSH2_MSG_USERAUTH_FAILURE
用户认证部分 SSH2_MSG_USERAUTH_REQUEST publickey, have_sig=false
用户认证部分 SSH2_MSG_USERAUTH_PK_OK
用户认证部分 �0�2SSH2_MSG_USERAUTH_REQUEST�0�2 publickey, have_sig=true
SSH2_MSG_USERAUTH_SUCCESS
通道通讯部分

根据公告描述,攻击者必须有正确的用户名以及正确的公钥,可以推测问题出现在第二次(也就是最后一次签名部分)SSH2_MSG_USERAUTH_REQUEST。

接下来,我们去找来OpenSSH源代码和固件一起进行对比分析,这会让我们事半功倍。

 

1

 

我们跳过密钥交换部分(ssh_kex2),直接从验证部分开始分析(ssh_userauth2)。根据最后验证成功的条件,我们进行逆向推理,更容易找到问题,因此从SSH2_MSG_USERAUTH_SUCCESS这个成功封包开始逆向分析。我们从固件中看到如下代码:

 

2

 

 

我们可以看到这个地方就是验证通过后,最后的服务器数据封包。我们往上面回溯。

3

 

 

关键函数在do_pubkey函数, 只要这个函数返回1就可以验证通过。

 

4

 

这段代码对应openssh源代码的send_pubkey_test阶段:

 

 

5

 

在公告中,官方已经明确指出需要正确的用户名和对应的publickey。也就是_pubkey_verify这个函数必须通过。紧接着的部分就是响应服务器的SSH2_MSG_USERAUTH_PK_OK封包(客户端处理参考input_userauth_pk_ok函数),也就是带有签名的SSH2_MSG_USERAUTH_REQUEST,即sign_and_send_pubkey函数

 

6

 

7

 

看这两处的代码,service比较失败,会断开连接,并返回retcode=3; 但当method比较失败的时候,并没有改变retcode的值,也就是前面_publickey_verify的返回结果1,而且,服务器也不主动断开连接。问题就是出在这儿,我们继续看_Exit_with_Cleanup出的代码:

 

8

 

这儿我们就可以看到我们如果method方法不同,我们仍然可以返回1。

 

9

 

 

分析到这儿,就发现和我们最开始分析的对应起来了。我们就知道我们该如何构造我们的PoC代码了。
最后看一下利用成功后的调试信息:

10

发表评论

电子邮件地址不会被公开。 必填项已用*标注