WebShell流量特徵檢測_哥斯拉篇

巴韭特發表於2024-09-05
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運算

在邏輯運算之中,除了 ANDOR,還有一種 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"的流狀態位。

相關文章