CVE-2018-10933 身份验证绕过漏洞验证

0x00 事件背景

2018-10-16 libssh发布更新公告旨在解决CVE-2018-10933的问题

libssh版本0.6及更高版本在服务端代码中具有身份验证绕过漏洞。 通过向服务端提供SSH2_MSG_USERAUTH_SUCCESS消息来代替服务端期望启动身份验证的 SSH2_MSG_USERAUTH_REQUEST消息,攻击者可以在没有任何凭据的情况下成功进行身份验证。 进而可以进行一些恶意操作。

0x01 漏洞原理

此处参考了360的文章

原文地址https://cert.360.cn/report/detail?id=a407dddd655dba34405688b1498c3aa1

在libssh的example中已经存在一些server端的例子,测试环境则采用这些例子进行说明

这个漏洞能用,但目前就分析而言发现,无法很好的泛用,所以建议及时进行更新以免遭受影响

在libssh中以session的方式对会话进行处理,无论是server的建立还是client的连接。

均以

session = ssh_new();

因为这个漏洞是直接获得AUTH所以服务端的配置和客户端的连接认证方式等完全不用在意进行session建立

简单的client连接示例的部分代码,以体现逻辑为主。

首先是设置一些参数,然后利用session进行连接

然后进行knownhost认证处理,这步就是平时在进行ssh连接的时候进行提醒的是否要保存信息

if (ssh_options_set(session, SSH_OPTIONS_HOST ,host) < 0)
    return -1;if(ssh_connect(session)){
    fprintf(stderr,"Connection failed : %s\n",ssh_get_error(session));
    return -1;
}state=verify_knownhost(session);if (state != 0)
    return -1;
auth=authenticate_console(session);if(auth != SSH_AUTH_SUCCESS){
    return -1;
}

authenticate_console(session)

的流程为先发送一个ssh_userauth_none再根据选择的AUTH方式,尝试GSSAPI、PublicKey、 Password的方式authenticate_console(session)

这里采用的patch掉client中发送密码认证的时候的数据包

将第二行的SSH2_MSG_USERAUTH_REQUEST -> SSH2_MSG_USERAUTH_SUCCESS

rc = ssh_buffer_pack(session->out_buffer, "bsssbs",
            SSH2_MSG_USERAUTH_SUCCESS,
            username ? username : session->opts.username,
            "ssh-connection",
            "password",
            0, /* false */
            password
    );


这时候的session就已经可以获得相应的权限了。通过官方的Tutorial的执行命令的例子调 用ssh_channel_request_exec进行命令执行并且需要在ssh_userauth_get_response之前直接返回,因为这一步会再次向服务端进行通 信,但此时受影响版本的server已经Authentication successful

 

0x02 CVE-2018-10933复现

首先搭建libssh的sshd服务器端 可以用这个demo

https://www.libssh.org/files/0.7/libssh-0.7.4.tar.xz

然后启动 这里我监听的是本地的123端口 如果不能保证服务器安全的话最好在测试的时候都尽量监听本地的端口 不要去监听0.0.0.0

然后下载测试用的poc

GitHub地址如下

https://github.com/blacknbunny/libSSH-Authentication-Bypass

然后使用pip安装依赖的包

安装指令是pip install -r requirements.txt

然后就开始执行poc吧

这个poc的用法是python libsshauthbypass.py --host 目标ip -p 目标端口 -c 指令

 

 

0x03修复方案

libssh官网已经放出了补丁了https://www.libssh.org/security/