渗透技巧

一个半自动化的命令注入Fuzz工具-OCIFT

一个半自动化的命令注入Fuzz工具-OCIFT
一个半自动化的命令注入Fuzz工具-OCIFT 1. OCIFT是什么 一个半自动化命令注入漏洞Fuzz工具(One Semi-automation command injection vulnerability Fuzz tool)简写为:OCIFT 2. OCIFT有什么用 这是一种半自动化的黑盒测试工具,它可以帮助渗透测试人员或代码审计人员在愉快的上网的同时,深度挖掘目标应用系统存在的命令注入漏洞。 3. OCIFT有什么特点 Payload基于Commix生成方式修改而来(需要持续完善). 基于浏览器代理的半自动化Fuzz. 多线程Fuzz速度快,不影响正常浏览器访问使用. 支持设置白名单限制Fuzz范围. 支持设置黑名单避免带来不必要的麻烦. 支持DNSLog辅助验证 4. OCIFT实现思路 基于Tornado的实现一个代理服务器,解析GET/POST请求提取Fuzz点,带入payload进行Fuzz测试。 文件结构说明 ➜ cifuzz git:(master) ✗ tree . |____run.py 主程序入口 |____dnslog.py DNSLog SDK |____fuzz.conf 配置文件 |____fuzz.py Fuzz线程 |____make_payload.py Payload生成器 |____readme.md 说明文档 5. 配置文件说明 配置各个参数,以逗号分隔 [initconfig] 黑名单HOST-为了避免带来不必要的麻烦 black_hosts =.gov,localhost,127.0.0.1,google,gstatic,cnzz.com,doubleclick,police,mil.cn,gov.cn,gov.com 静态文件黑名单-这些不做Fuzz url_ext_black =.ico,.flv,.css,.jpg,.png,.jpeg,.gif,.pdf,.ss3,.txt,.rar,.zip,.avi,.mp4,.swf,.wmi,.exe,.mpeg 白名单HOST-为了限制Fuzz的范围, 默认为空-表示对除黑名单范围外的所有地址进行Fuzz. white_site =qunar 请求超时-限制每次Fuzz请求超时时间 timeout =10 我的DnsLog地址 my_cloudeye =ano1qu2j.xfkxfk.com 判断是够注入命令执行成功的关键字 checkkeys =110586256,/bin/bash,nameserver,IPv4,Windows IP 用于测试命令注入的基本命令 base_command =cat /etc/resolv.conf,echo 110586256,cat /etc/passwd,ipconfig,ping CommandInj.{my_cloudeye},echo 110586256<nul Fuzz线程数 fuzz_count =20 fuzz的payload类型, 默认False-表示使用自定义的规则 commix_payload_type = False DnsLog登录会话ID,我用的xfkxfk牛的dnslog.xfkxfk.com dnslog_sessionid =q6wva2e3skg79vkdegra2bygft0d1 Your Domain custom_domain =a2fta2j 记录成功结果的Log文件 Logfile =rce_success_results.txt 6.如何使用 1.安装模块 pip install tornado pip install requests 2.根据自己需要完成文件fuzz.conf的配置 3.启用主程序 python run.py 8089 如下图: 4.设置浏览器代理 然后会自动开始Fuzz 7.总结 基本实现了想要的半自动化Fuzz功能 payload还需要不断优化 Github地址:OCIFT地址 欢迎大佬提出改进意见,多谢咯!!... 继续阅读 »
渗透技巧

利用scapy 造了一个Passive DNS Collector 工具—pdns_sniff

利用scapy 造了一个Passive DNS Collector 工具—pdns_sniff
利用scapy 造了一个Passive DNS Collector 工具——pdns_sniff pdns_sniff是什么? 简单理解为一个记录你发起过的DNS请求的东西,利用了Passive DNS 思路,被动的记录发起过的DNS请求。 pdns_sniff有什么用? 利用这样的工具可以帮助我在愉快的上网的同时,轻松搜集到测试目标的各种子域名。 pdns_sniff原理是什么? 利用了python里的强大的scapy套件,运用它抓取,解析出DNS请求包从而得到各种域名。使用了mysql进行数据存储,利用了gevent协程进行并发进行数据包的分析和写入数据库(PS:刚学gevent,拿来用用。) 效果图 效果图一:数据库中记录1 效果图二:数据库中记录2 效果图三:工具输出记录 效果图四:使用方法 需要安装的三方库 gevent scapy MySQLdb 需要修改的数据库配置 大概在第29行 conn = mysql.connect(user='root', passwd='yourpassword', host='127.0.0.1', db='dnslogsDB') pdns_sniff的相关代码 pdns_sniff代码... 继续阅读 »
Python编程

一个Fuzzing服务器端模板注入漏洞的半自动化工具

一个Fuzzing服务器端模板注入漏洞的半自动化工具
    0x01. 背景            乌云还在的时候,猪猪侠爆一个XX银行的OGNL表达式注入漏洞,拿到了第一滴血。然后,唐朝实验室爆了个Spring-Boot的SPEL注入漏洞,虽然不是第一滴血,但是让我有了一个想法。因为看到过曾经黑帽大会有国外研究者写的一个很好的Paper:名字:us-15-Kettle-Server-Side-Template-Injection-RCE-For-The-Modern-Web-App-wp.pdf  里面提到了服务器端模板注入导致的远程命令执行类型漏洞产生。    0x02. 萌芽            我对远程命令执行漏洞的理解就是以各种方式直接或间接的导致远程服务器执行成功了你想要让它执行的系统命令的一类漏洞,英文叫:Remote Command Execute Vulnerability(简称RCE漏洞),这是一种很简单暴力的漏洞,一种一言不合就可以rm -rf /或者 format /fs C: 的致命漏洞。哪么都有些什么类型的命令执行漏洞,可以看看exploit-db上关于RCE漏洞的exp有哪些。点击查看     下面是我简单的归了一下类别,RCE漏洞包括但不限于下面提到的。应用程序开发框架里的RCE            这里的框架包括但不仅限于:Struts2框架/xwork框架,ThinkPhp框架,Spring框架 ,IOSurface编程框架类中间件平台/服务应用平台的RCE            这里的代表就举例之前火的JAVA反序列化漏洞影响下的:WebLogic/Jboss/WebSphere/Jenkins、还有比如IIS,nginx,apache因文件名解析,路径解析问题导致的命令执行类,还有Elasticsearch,Redis,Zabbix ,mongodb等各种为业务应用,为数据存储提供服务的软件的命令执行类。应用程序里的RCE            应用程序编写中调用系统API接口,调用系统命令执行函数,程序中系统命令执行相关方法的不恰当使用等导致的一类。第三方应用里的RCE            最喜闻乐见的就是各种CMS被曝SQL注入,命令执行漏洞,代码执行漏洞,这类CMS共同特点就是支持第三方插件,支持用户对原cms程序框架结构进行改造。当然还有之前火了的ImageImagick图形处理库的RCE,和 fffmep导致的RCE等等。等等等          穷尽脑汁就想到了上面这些,有遗漏的典型分类还望大牛多多留言不吝赐教。          然后我好奇的上乌云搜了搜公开的漏洞里(PS: 打开虚拟机搜了搜)关键字:命令执行 的案例。                           公开的有2373个案例,119页,我翻了很多页案例,其中以刷Struts2的S2-xxx的最多。命令执行漏洞案例里我看到了下面几类:OGNL表达式|程序代码注入导致的RCE           1. Struts2的S2-xxx系列,2. 参数里注入或直接传值OGNL表达式,3. 变量名里或参数里注入编程语言基本语法代码系统命令注入|模板代码注入导致的RCE:            1. 变量名里或参数里注入系统命令,2. 变量名里或参数里注入框架模板代码,配置或业务设计不当导致的RCE           1. RMI对外匿名开放或服务未授权导致 2. 文件解析执行绕过 3. 缓存模板,日志记录,请求信息等被带入奇葩业务执行的 3. 业务应用接口,系统接口等权限不当导致的等等。。。            我的重点放在了参数中被带入了系统命令,程序代码,OGNL表达式,模板代码之类导致的RCE漏洞发生的情况。这类情况,有个共同点,大都是通过HTTP/HTTPS请求出现。之前,顺着之前流行的sqlmapapi的思路,我想是否可以同样实现一个, 你上着网就把漏洞给挖出来了呢?萌生了这个想法,于是就有了这么个小脚本。    0x03. 实现.             基于sqlmapapi的实现思路,同样用到了代理正常流量,提取Fuzzing点,带入测试payload进行Fuzzing测试。             实现环境:                   1、Python 2.7.8 ,Win8.1 x64             第三方模块(版本):                   2、requests (2.9.1)、tornado (4.3)            先用Tornado实现代理正常上网,定义SSTIF_Fuzz类用于进行测试,SSTIF_Fuzz类里面定义了下面的函数:             1、_init_payloads_:  初始化各种测试payload的函数,里面现在已经具备了一些测试payload,包括通用的,PHP基础代码,JAVA语法的,OGNL表达式,EL表达式,SPEL表达式,Groovy测试payload,鸟哥爆的CA technologies存在远程命令执行漏洞poc.(暂时就这么多,会不断补充,除非证明此思路此脚本不可行。)             2、HttpHelper :发出带有payload的构造好的请求,根据规则(响应数据包括字符串:10516*61501的结果:646744516,或者在自己配置的cloudeye里面手工确认)判定是否存在RCE漏洞。             3、Fuzzing_GET :分析GET请求中的变量-值(key-value)组合,目前是对每一个value进行测试,未实现对key即变量名进行测试。             4、Fuzzing_HEADER:未实现,因为在乌云的案例中,发现有在Referer中,注入命令导致的RCE的案例,所以未来会考虑对这里的参数进行测试。             5、FileHelper:将测试可能存在RCE漏洞的记录在rce_success_result.txt文件里,格式例如:+==++==++==++==++==++==++==++==++==++==++==++==++==++==++==++==++==++==++==++==++==++==+ +=+URL: http://202.111.222.333/index.jsp?id=1111&page=222&count=123 +=+method: GET +=+param: id +=+payload: java.lang.Runtime.getRuntime().exec('cat</etc/passwd;$BASH') +==++==++==++==++==++==++==++==++==++==++==++==++==++==++==++==++==++==++==++==++==++==+            记录上面的一条,就可以比较清晰的看出要表达的意思了。     0x04. 使用.                1、安装第三方模块pip install requests pip install tornado                2、修改SSTIF_Fuzz类中配置文件:大概在第49行: self.my_cloudeye = "xxxx.dnslog.info" 这里配置为你的dnslog的域名地址。                3、然后找到一个没有使用的端口,命令:python ssitf.py 8081  启用代理监听8081端口                4、和设置burpsuite一样,浏览器设置通过8081代理端口上网,然后后面就像使用Sqli半自动化工具那样安心上你的网吧。           注意:                 ProxyHandler类中定义了黑名单请求后缀,域名黑名单,这是为了避免带来麻烦的,可以自己添加:大概在246-250行代码处:url_ext_black = ['ico','flv','css','jpg','png','jpeg','gif','pdf','ss3','txt','rar','zip','avi','mp4','swf','wmi','exe','mpeg'] domain_black = ['gov.cn','gov.com','mil.cn','police.cn','127.0.0.1','localhost','doubleclick','cnzz.com','baidu.com','40017.cn','google-analytics.com','googlesyndication','gstatic.com','bing.com','google.com','sina.com','weibo.com']   0x05. 总结.              这个脚本做了什么:                    1、从乌云上,从国外的研究者paper上拔下来了一些payload,作为fuzzing的依据。                    2、实现了代理,从正常上网流量中提取GET和POST请求中的提取有效的参数作为Fuzzing测试点。                    3、实现了个初级版本。              反思不足:                    1、payload是固定死的,这是一大弊端。                    2、无法支持HTTPS流量的处理,这是技术盲点。                    3、Fuzzing太慢,目前是单线程的。                    4、Fuzzing情况考虑不全,应该是思路和认知盲点。                    5、没有考虑狗,软硬防护产品的拦截绕过问题。             最后,看了很多案例,RCE其实就是插入那些东西进去,带入那些东西进去就可以简单初步判断是否存在该漏洞了,我感觉这是一种不错的思路,只是要实现自己的自动化挖掘漏洞神器还是长路漫漫~Github地址: SSTIF文章的:http://blog.portswigger.net/2015/08/server-side-template-injection.html 老外的:https://github.com/epinna/tplmap  (这差距啊。。。。)... 继续阅读 »
Python编程

python脚本要好好写-PEP8 Python 编码规范

python脚本要好好写-PEP8 Python 编码规范
0x01.背景       过去学习和需要的时候一直都是在Windows下写的py脚本或小Tools,几乎没在Linux下编写和测试过.一直认为在DOS命令窗口下python>> 写一下满足需要,复杂一点的就打开Pycharm或pydev+Eclipse编写脚本就能完事,没必要打开虚拟机去Linux环境下编写脚本.      虽然windows下写的脚本有时候出各种问题,每次都要百度查找解决一个又一个问题,但是还是妥协于懒得打开虚拟机一开虚拟机电脑用着就卡住了.       喜欢BB2的分享精神,之前很尴尬的事是拿着上面写Poc怎么跑都要出错,老是说baseframe有问题,在Pip上各种翻都没法弄.我很喜欢python也很想写POC一边练习python脚本编写一边去了解和分析漏洞存在的原因.能搞懂一个漏洞并写出漏洞Poc感觉肯定很巴适!0x02.迷雾揭开      今晚无意看到个帖子:千万不要把Python脚本的第一行写成“#! /usr/bin/python”      提到唯一的正确写法:  #! /usr/bin/env python     这是Linux下最佳实践. 利用env找到当前用户环境里找到python解释器不用考虑python解释器在何位置吧. 这样写的py脚本.      chmod 添加x权限后,’./xxx.py’ 就可以直接执行了. Windows下也可以使用#!    加Python解释器绝对路径 然后.直接执行. 但是Windows下安装Python的时候python解释器路径被加在了环境变量里的,所以可以直接使用的.执行脚本. 这行代码让我想到了BB2上写的POC了,BB2上写的就是这么规范,于是多看了两下,于是看到开发文档里说到了baseframe框架.这才发现BB2上写的POC用的baseframe是自定义的啊,曾经那么多次苦恼终于揭开了. 马上下载了BB2的框架。在Linux下测试了他人写的POC可行的了. 以后可以写自己的Poc提到BB2和利用别人的POC做检测了. 开始慢慢转移到Linux下编写脚本了,放弃windows!0x03. Python编程PEP8规范        找到豆瓣一篇详细说到了Python编程中的PEP8规范,这里记录一下以备需要时来翻一翻。        PEP8 Python 编码规范代码编排        1 缩进。4个空格的缩进(编辑器都可以完成此功能),不使用Tap,更不能混合使用Tap和空格。        2 每行最大长度79,换行可以使用反斜杠,最好使用圆括号。换行点要在操作符的后边敲回车。        3 类和top-level函数定义之间空两行;类中的方法定义之间空一行;函数内逻辑无关段落之间空一行;其他地方尽量不要再空行。          二 文档编排        1 模块内容的顺序:模块说明和docstring—import—globals&constants—其他定义。其中import部分,又按标准、三方和自己编写顺序依次排放,之间空一行。        2 不要在一句import中多个库,比如import os, sys不推荐。        3 如果采用from XX import XX引用库,可以省略‘module.’,都是可能出现命名冲突,这时就要采用import XX。          空格的使用        总体原则,避免不必要的空格。        1 各种右括号前不要加空格。        2 逗号、冒号、分号前不要加空格。        3 函数的左括号前不要加空格。如Func(1)。        4 序列的左括号前不要加空格。如list[2]。        5 操作符左右各加一个空格,不要为了对齐增加空格。        6 函数默认参数使用的赋值符左右省略空格。        7 不要将多句语句写在同一行,尽管使用‘;’允许。        8 if/for/while语句中,即使执行语句只有一句,也必须另起一行。           注释        总体原则,错误的注释不如没有注释。所以当一段代码发生变化时,第一件事就是要修改注释!        注释必须使用英文,最好是完整的句子,首字母大写,句后要有结束符,结束符后跟两个空格,开始下一句。如果是短语,可以省略结束符。        1 块注释,在一段代码前增加的注释。在‘#’后加一空格。段落之间以只有‘#’的行间隔。比如:        # Description : Module config.        #        # Input : None        #        # Output : None        2 行注释,在一句代码后加注释。比如:x = x + 1 # Increment x        但是这种方式尽量少使用。        3 避免无谓的注释。          文档描述        1 为所有的共有模块、函数、类、方法写docstrings;非共有的没有必要,但是可以写注释(在def的下一行)。        2 如果docstring要换行,参考如下例子,详见PEP 257        “””Return a foobang                Optional plotz says to frobnicate the bizbaz first.                “””          命名规范        总体原则,新编代码必须按下面命名风格进行,现有库的编码尽量保持风格。        1 尽量单独使用小写字母‘l’,大写字母‘O’等容易混淆的字母。        2 模块命名尽量短小,使用全部小写的方式,可以使用下划线。        3 包命名尽量短小,使用全部小写的方式,不可以使用下划线。        4 类的命名使用CapWords的方式,模块内部使用的类采用_CapWords的方式。        5 异常命名使用CapWords+Error后缀的方式。        6 全局变量尽量只在模块内有效,类似C语言中的static。实现方法有两种,一是__all__机制;二是前缀一个下划线。        7 函数命名使用全部小写的方式,可以使用下划线。        8 常量命名使用全部大写的方式,可以使用下划线。        9 类的属性(方法和变量)命名使用全部小写的方式,可以使用下划线。        9 类的属性有3种作用域public、non-public和subclass API,可以理解成C++中的public、private、protected,non-public属性前,前缀一条下划线。        11 类的属性若与关键字名字冲突,后缀一下划线,尽量不要使用缩略等其他方式。        12 为避免与子类属性命名冲突,在类的一些属性前,前缀两条下划线。比如:类Foo中声明__a,访问时,只能通过Foo._Foo__a,避免歧义。如果子类也叫Foo,那就无能为力了。        13 类的方法第一个参数必须是self,而静态方法第一个参数必须是cls。         编码建议        1 编码中考虑到其他python实现的效率等问题,比如运算符‘+’在CPython(Python)中效率很高,都是Jython中却非常低,所以应该采用.join()的方式。        2 尽可能使用‘is’‘is not’取代‘==’,比如if x is not None 要优于if x。        3 使用基于类的异常,每个模块或包都有自己的异常类,此异常类继承自Exception。        4 异常中不要使用裸露的except,except后跟具体的exceptions。        5 异常中try的代码尽可能少。比如:        try:         value = collection[key]         except KeyError:         return key_not_found(key)         else:         return handle_value(value)        要优于         broad!         return handle_value(collection[key])         except Ktry:         # TooeyError:         # Will also catch KeyError raised by handle_value()         return key_not_found(key)        6 使用startswith() and endswith()代替切片进行序列前缀或后缀的检查。比如:        Yes: if foo.startswith(‘bar’):优于        No: if foo[:3] == ‘bar’:        7 使用isinstance()比较对象的类型。比如        Yes: if isinstance(obj, int): 优于        No: if type(obj) is type(1):        8 判断序列空或不空,有如下规则        Yes: if not seq:         if seq:        优于        No: if len(seq)         if not len(seq)        9 字符串不要以空格收尾。        10 二进制数据判断使用 if boolvalue的方式。... 继续阅读 »
Python编程

python里的fork函数

python里的fork函数
        0x01.什么是fork()函数            fork()是计算机程序设计中的分叉函数.            返回值: 若成功调用一次则返回两个值,子进程返回0,父进程返回子进程标记;否则,出错返回-1.            示例:    >>> import os     >>> print os.fork()     4150     0            终端下查看:    root@greenboy:~/Desktop/SPSE/Lesson-2# pidof python         4150 4148     root@greenboy:~/Desktop/SPSE/Lesson-2# ps all | grep python     0 0 4148 3363 20 0 11296 4468 poll_s S+ pts/3 0:00 python     1 0 4150 4148 20 0 11428 3256 poll_s S+ pts/3 0:00 python            可以看出pid为4150是新创建出来的pid为4148的子进程.返回值 4150一个是子进程PID,0是标识创建成功了.        0x02.fork()函数有什么意思            用下面的代码来实践下:root@greenboy:~/Desktop/SPSE/Lesson-2# cat pro.py #! /usr/bin/env python from time import sleep import os def child_process(): print "I am child process and my PID is : %d"%os.getpid() print "The Child is exiting!" ida = 1 while True: print "child excute "+repr(ida)+" times" sleep(2) ida = ida + 1 def parent_process(): print "I am the parent process with PID:%d"%os.getpid() childpid = os.fork() if childpid ==0: child_process() else: print "We are inside the parent process" print "Our child has the PID:%d"%childpid idb = 1 while True: print "parent excute "+repr(idb)+" times…" sleep(2) idb = idb + 1 parent_process()        执行效果:                    杀掉子进程:root@greenboy:~/Desktop/SPSE/Lesson-2# kill pid 4346 bash: kill: pid: arguments must be process or job IDs root@greenboy:~/Desktop/SPSE/Lesson-2#            现在只有父进程在执行了:                                重新来一次,杀死父进程:            效果:                            查看PID                            子进程被托付给PID为1的进程了,通过查看找到PID为1的是守护进程:                            它是最上级的进程了,他的PPID为0了.这样该子进程就会在后台一直默默的执行着,做后门是不是很棒了??反弹shell的python版要去好好学习下!        Linux中fork学习:        linux中的fork函数... 继续阅读 »