80後用菜刀,90後用蟻劍,95後用冰蠍和哥斯拉,以phpshell連線為例,本文主要是對這四款經典的webshell管理工具進行流量分析和檢測。
什麼是一句話木馬?
1、定義
顧名思義就是執行惡意指令的木馬,透過技術手段上傳到指定伺服器並可以正常訪問,將我們需要伺服器執行的命令上傳並執行
2、特點
短小精悍,功能強大,隱蔽性非常好
3、
舉例
php一句話木馬用php語言編寫的,執行在php環境中的php檔案,例:<?php @eval($_POST['pass']);?>
4、原理
以最為常見的php一句話木馬為例,"<?php ?>"為php固定規範寫法,"@"在php中含義為後面如果執行錯誤不會報錯,"eval()"函式表示括號裡的語句全做程式碼執行,"$_POST['pass']"表示從頁面中以post方式獲取變數pass的值
四、哥斯拉(Godzilla v3.0)
①全部型別的shell能繞過市面大部分的靜態查殺
②流量加密能繞過過市面絕大部分的流量Waf
③Godzilla自帶的外掛是冰蠍、蟻劍不能比擬的
1、主要功能
它能實現的功能除了傳統的命令執行、檔案管理、資料庫管理之外,根據shell型別的不同還包括了:
(1)MSF聯動
(2)繞過OpenBasedir
(3)ZIP壓縮 ZIP解壓
(4)程式碼執行
(5)繞過 DisableFunctions
(6)Mimikatz
(7)讀取伺服器 FileZilla Navicat Sqlyog Winscp XMangager 的配置資訊以及密碼
(8)虛擬終端 可以用netcat連線
(9)Windows許可權提升 (2012-2019爛土豆)
(10)讀取伺服器 谷歌 IE 火狐 瀏覽器儲存的賬號密碼
(11)Windows許可權提升爛土豆的C#版本 甜土豆
(12)支援 哥斯拉 冰蠍 菜刀 ReGeorg 的記憶體shell 並且支援解除安裝
(13)螢幕截圖
(14)Servlet管理 Servlet解除安裝
(15)記憶體載入Jar 將Jar載入到 SystemClassLoader
2、基礎配置
首先從使用最多的PHP_XOR_BASE64型別的加密shell說起,所用的shell主要配置如下:
①URL:http://172.16.159.129/godzilla_shell.php
②密碼:pass
③金鑰:key
④有效載荷:PhpDynamicPayload
⑤加密器:PHP_XOR_BASE64
⑥哥斯拉的Shell配置包括基本配置和請求配置,其中基本配置主要設定shell地址、密碼、金鑰、加密器等資訊
這裡要注意密碼和金鑰的不同:
①密碼:和蟻劍、菜刀一樣,密碼就是POST請求中的引數名稱,本例中哥斯拉提交的每個請求都是pass=xxxxxxxx這種形式
②金鑰:用於對請求資料進行加密,不過加密過程中並非直接使用金鑰明文,而是計算金鑰的md5值,然後取其前16位用於加密過程
③哥斯拉shell的請求配置主要用於自定義HTTP請求頭,以及在最終的請求資料左右再追加一些擾亂資料,進一步降低流量的特徵
3、PHP_XOR_BASE64加密器
哥斯拉內建了3種Payload以及6種加密器,6種支援指令碼字尾,20個內建外掛,以下主要以PHP_XOR_BASE64為例進行分析。
(1)加密原理
XOR運算
在邏輯運算之中,除了 AND和 OR,還有一種 XOR運算,中文稱為"異或運算"。
它的定義是:兩個值相同時,返回false,否則返回true。也就是說,XOR可以用來判斷兩個值是否不同。
JavaScript
語言的二進位制運算,有一個專門的 XOR 運算子,寫作^。
上面程式碼中,如果兩個二進位制位相同,就返回0,表示false;否則返回1,表示true。
XOR加密
XOR運算有一個很奇妙的特點:如果對一個值連續做兩次 XOR,會返回這個值本身。
①上面程式碼中,原始資訊是message,金鑰是key,第一次 XOR會得到加密文字cipherText。對方拿到以後,再用key做一次XOR 運算,就會還原得到message。
②如果每次的key都是隨機的,那麼產生的CipherText具有所有可能的值,而且是均勻分佈,無法從CipherText看出message的任何特徵。它具有最大的"資訊熵",這被稱為XOR 的"完美保密性"(perfect secrecy)。
③XOR 的這個特點,使得它可以被用於資訊的加密。
(2)客戶端加密模組分析
哥斯拉的原始碼是透過反編譯Godzilla.jar得到的,作者並未做程式碼混淆。
從程式碼中可以分析出,傳送的payload內容先經過XOR加密後,再將密文進行base64編碼,最後進行URL編碼。
XOR加密的金鑰來自使用者提供的金鑰經過MD5的32位摘要後,取前16位的值。
(3)Shell伺服器端程式碼分析
PHP_XOR_BASE64型別的加密shell的伺服器端程式碼如下,其中定義了encode函式,用於加密或解密請求資料。由於是透過按位異或實現的加密,所以encode函式即可用於加密,同時也可用於解密。
整個shell的基本執行流程是:伺服器接收到哥斯拉傳送的第一個請求後,由於此時尚未建立session,所以將POST請求資料解密後(得到的內容為shell操作中所需要用到的相關php函式定義程式碼)存入session中,後續哥斯拉只會提交相關操作對應的函式名稱(如獲取目錄中的檔案列表對應的函式為getFile)和相關引數,這樣哥斯拉的相關操作就不需要傳送大量的請求資料。
(4)資料包分析
這裡從Shell Setting對話方塊中的測試連線操作開始分析,在Shell Setting對話方塊中,一共會產生3個POST資料包,POST請求報文中引數名都是pass(即shell的連線密碼),引數值都是加密資料。
①第一個Request請求資料包
簡單分析了一下payload的內容,包含run、bypass_open_basedir、formatParameter、evalFunc等二十多個功能函式,具備程式碼執行、檔案操作、資料庫操作等諸多功能。
②第一個Response響應資料包
該請求不含有任何Cookie資訊,伺服器響應報文不含任何資料,但是會設定PHPSESSID,後續請求都會自動帶上該Cookie。
③第二個Request請求資料包
第二個請求報文傳送很少資料(實際內容為測試連線命令test),返回少量資料(即ok)
④第二個Response響應資料包
伺服器響應資料解密過程並不複雜,先呼叫findStr函式刪除伺服器響應資料左右附加的混淆字串(對於PHP_XOR_BASE64加密方式來說,前後各附加了16位的混淆字元),然後將得到的資料進行base64解碼,最後再和shell連線金鑰md5值的前16位按位異或,即完成響應資料的解密。
⑤第三個Request請求資料包
執行哥斯拉命令執行程式碼中的getBasicsInfo函式得到的系統基本資訊。
⑥第三個Response響應資料包
4、PHP_EVAL_XOR_BASE64加密器
哥斯拉不同的加密器傳送請求的過程都是一樣的,不同之處在於加密/解密的實現方式不同。
PHP_EVAL_XOR_BASE64加密shell的特點如下:
Ø請求資料加密得到的密文形式:pass=evalContent&key=XXXXXXXX,其中pass是shell密碼,key是shell金鑰
Ø每個請求中的pass=evalContent都是相同的,evalContent是將shells/cryptions/phpXor/template/base64.bin檔案內容經過編碼得到的(先刪除第1行的<?php,再將其中的{pass}替換為shell密碼,將{secretKey}替換為shell金鑰)
Ø每個請求中的key=XXXXXXXX才是實際執行的shell操作,加密方法和PHP_XOR_BASE64加密shell的方式相同
evalContent的加密過程如下:
①提取src/shells/cryptions/phpXor/template/base64.bin檔案內容
②將base64.bin檔案內容進行base64編碼
③將第2步中編碼得到的字串逆序排列
④將第3步中得到的字串進行URL編碼
⑤將第4步中得到的字串拼接到eval(base64_decode(strrev(urldecode('第4步中得到的字串'))));中,即為最終的evalContent
5、PHP_XOR_RAW加密器
PHP_XOR_RAW加密shell的加解過程只是將原始資料與shell金鑰(本例中為key)md5值的前16位按位異或,然後將得到的二進位制位元組碼直接傳送給伺服器;伺服器返回的響應資料也是二進位制位元組碼,左右不再追加任何資料。
6、規則落地
alert http any any -> any any (msg:"哥斯拉/Godzilla PHP Base64 連線成功"; flow:established,from_server; flowbits:txisset,Godzilla_webshell_request_match; http.server; content:"Rising", negate; http.response_body; bsize:36; pcre:"/^([0-9A-F]{16}|[0-9a-f]{16})/"; pcre:"/([0-9A-F]{16}|[0-9a-f]{16})$/"; pcre:"/^[\s\S]{16}(.*)[\s\S]{16}$/"; pcrexform:"^[\s\S]{16}(.*)[\s\S]{16}$"; pcre:"/[\s\S]/"; base64; flowbits:unset,Godzilla_webshell_request_match; )
-
alert http any any -> any any 表示對任何源IP和目的IP之間的HTTP流量生成告警。
-
msg:"哥斯拉/Godzilla PHP Base64 連線成功" 是告警的描述資訊。
-
flow:from server,established 表示只對來自伺服器端的已建立連線的流量進行檢測。
-
flowbits:isset,Godzilla webshell request match 檢查名為"Godzilla webshell request match"的流狀態位是否已被設定。(注意這裡使用了isset而不是txisset)
-
http.server 表示只對HTTP伺服器響應進行檢測。
-
content:!"Rising" 表示檢測HTTP響應正文中不包含字串"Rising"。
-
http.response body 表示對HTTP響應的正文部分進行檢測。
-
bsize:36 指定只檢測響應正文的前36個位元組。
-
pcre:"/^([0-9A-F]{16}|[0-9a-f]{16})/"和pcre:"/([0-9A-F]{16}|[0-9a-f]{16})$/" 使用Perl相容正規表示式(PCRE)檢測響應正文是否以16個十六進位制字元開頭和結尾。
-
pcre:"/^[\s\S]{16}(.*)[\s\S]{16}$/"和pcrexform:"^[\s\S]{16}(.*)[\s\S]{16}$" 使用PCRE檢測響應正文是否符合特定的模式,即以16個任意字元開頭,任意字串為中間部分,再以16個任意字元結尾。
-
pcre:"/[\s\S]/" 匹配響應正文中的單個被方括號包圍的任意字元。
-
isbase64:3 表示對匹配到的內容進行Base64解碼,並檢查解碼後的位元組數是否是3的倍數。
-
flowbits: unset,Godzilla webshell request match 清除名為"Godzilla webshell request match"的流狀態位。