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/