[身份验证绕过]CVE-2018-10933 (漏洞复现)

预备知识:

  SSH认证流程:

  SSH的登录过程会分为5个阶段进行,首先是版本号协商阶段,服务器端监听22端口,客户端与服务端建立TCP连接,并且进行SSH版本协商,如果协商成功就进入密钥和算法协商阶段,否则就断开TCP连接。

  在密钥算法协商阶段,服务器首先将自己的公钥和会话ID发送给客户端,客户端将ID及会话密钥Key进行异或操作,用公钥将异或后的结果加密,发送给服务端。

  服务端进行反向操作,利用自己的密钥和客户端的公钥解密,得到Key值,接下来的传输都是以密钥的形式进行加解密。

  在口令或密钥认证阶段,首先是客户端利用自己的私钥和Key进行加密,然后传输到服务器端,服务器端利用自己的私钥和Key进行解密,判断解密后的口令,

  如果口令错误,发送失败报文和认证列表,客户端收到后重新选择认证,如果认证成功则进入交互界面,如果认证失败则一直循环,直到达到服务器端认证的次数上限,服务器端主动关闭本次TCP连接。

  libssh版本0.6及更高版本在服务端代码中具有身份验证绕过漏洞。

实验环境:

  libssh0.7.5

  Ubuntu 192.168.100.160/24

  python3 

  docker & docker-compose

漏洞复现:

  创建source目录,复制libssh到source

  

 

  解压并进入目录
  tar xvJf libssh-0.7.5.tar.xz

  cd libssh-0.7.5

  看到解压出来的文件

  

 

  编译并安装

  mkdir build && cd build

  cmake -DCMAKE_install_prefix=/usr -DCMAKE_BUILD_TYPE=Debug ..

  make

  

 

 

   

 

 

  修改src目录下的auth.c源文件。

  找到ssh_userauth_password函数并将SSH2_MSG_USERAUTH_REQUEST替换为SSH2_MSG_USERAUTH_SUCCESS

  vim ../src/auth.c

 

 

  修改后 ./examples/samplessh就会成为验证该漏洞的PoC。

  找到SSH_AUTH_STATE_NONE和SSH_PENDING_CALL_AUTH_OFFER_PUBKEY

  替换为SSH_AUTH_STATE_SUCCESS和SSH_PENDING_CALL_CONNECT

   

 

 

  修改两处登录状态源代码,./examples/samplessh就会成为验证该漏洞的PoC。

  保存退出输入make再次编译

  

  输入 ssh-keygen创建私钥和公钥

  ssh-keygen生成过程中会询问多个配置信息,全部点击回车,使用默认设置即可。

  

  启动服务并测试

 

  examples/ssh_server_fork -p 7777 127.0.0.1 -v -k /root/.ssh/id_rsa

  同时启动新终端窗口,使用SSH客户端连接服务端:

  进入build目录 输入代码 ./examples/samplessh -p 7777 root@127.0.0.1 ,连接成功

  

 

 

   在服务器输出的调试信息中可以找到包类型的分派处理程序(ssh_packet_process)

  

 

  根据服务端输出的调试信息,筛掉无用的日志信息,找到ssh_pack_process,

  分析可以看出该漏洞的利用点就是发送SSH2_MSG_USERAUTH_SUCCESS请求,从而进入ssh_packet_userauth_success函数。

  cd 进入 libssh-0.7.5/examples/

  在ssh_server_fork.c文件找到ssh_server_callbacks_struct函数,发现服务端设Demo中进行了设置 

  

 

 

  在ssh_server_fork.c文件中找到auth_password函数

  

  认证成功后的路径:

  ssh_message_auth_reply_success ->ssh_auth_reply_success:

  从源代码可以看出,在正常情况下,在SSH登录成功后,libssh给Session设置了认证成功的状态。

  结束服务端和客户端程序

  退出到source目录,并删除刚才解压的目录

  rm -rf libssh-0.7.5

  通过程序发送SSH2_MSG_USERAUTH_SUCCESS消息,触发漏洞

  创建docker-compose.yml 输入如下代码

  

  docker-compose up -d 启动环境

 

  创建python文件libssh_poc.py并输入代码

  

 

  输入命令利用poc

  python3 libssh_poc.py

  

  成功执行id命令

posted @ 2021-01-20 16:25  一只萌萌的鱼  阅读(1484)  评论(0编辑  收藏  举报