亚马逊AWS IoT使用MQTTS(在TLS上的MQTT)来提供物联网设备与云平台直接的通信功能。出于安全考虑,建议给每个设备配备了证书来认证,同时,设备也要安装亚马逊的根证书;这样,在使用8883端口建立TLS连接时,客户端SDK既对AWS进行验证,同时AWS IoT也对设备的证书进行验证。由此,便对中间人攻击带来了较高的要求,下面记录一下这几天的爬坑经理。

0.方案

整体方案类似于这个:https://wiki.dequis.org/notes/facebook/

用Host-Only模式的virtual box虚拟机当受害者,用iptables使其可以上网,并在虚拟网卡vboxnet0上搭建mitmproxy来嗅探。

VBox虚拟机(安装SDK)  ====> VBoxnet0网络接口(搭建mitmproxy)======>eth0(公网访问AWS)

用到的工具:

Kali Linux

Virtual Box

mitmproxy

wireshark

dnsmasq

iptables

openssl

1.注册AWS IoT

注册AWS比较麻烦,还需要可支付美元的信用卡,不过因为担心被扣费刷爆,我随便baidu了一个填上。但是,由于扣费1USD不成功,导致下一步验证码总是过不去,所以填真实的信用卡比较靠谱。(奇怪的是,我静置1天后莫名其妙通过了;期间AWS发邮件说因为虚假信息要封号,我靠三寸不烂之舌通过了验证。)之后就是根据AWS的说明下载并试用SDK,特别值得一提的是,他提供了一个向导,直接注册设备生成证书和对应平台SDK,非常方便,我选用了生成的Linux Python SDK来实验。

2. Kali下安装virtual box

请参考网上其他教程。特别说明,一定要apt-get update ,apt-get upgrade ,apt-get dist-upgrade 升级到最新,并且reboot,到最新的内核版本安装,否则各种Linux headers和内核版本对应不上产生的问题。

3. virtual box采用host-only模式

https://www.virtualbox.org/manual/ch06.html#network_hostonly

使用host-only联网可参考:https://unix.stackexchange.com/questions/383791/virtualbox-host-only-with-internet

注意,virtual box修改网络模式的时候要关掉虚拟机!(在windows上用惯了VMare注意一下)

开始打算直接使用NAT,然后在host主机上(宿主机)搭建中间人代理mitmproxy,然而不知为何一直抓不到包,并且不像VMare可以看到虚拟网络接口,故使用host-only配合iptables

4.设置iptables使用mitmproxy中间人代理

https://media.readthedocs.org/pdf/mitmproxy/latest/mitmproxy.pdf

iptables教程:http://www.cnblogs.com/haven/archive/2012/09/27/2705859.html

(常用-t指定表,-S显示设置的规则,-F对该表的规则进行删除)

开启ipv4转发  sysctl -w net.ipv4.ip_forward=1

我设置的规则:(eth0外网连接,vboxnet0是host上的虚拟接口)

首先两个网络接口可以互相转发

iptables -A FORWARD -i eth0 -o vboxnet0 -j ACCEPT
iptables -A FORWARD -i vboxnet0 -o eth0 -j ACCEPT

设置中间人代理以及NAT:

iptables -t nat -A PREROUTING -i vboxnet0 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080
iptables -t nat -A PREROUTING -i vboxnet0 -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 8080
iptables -t nat -A PREROUTING -i vboxnet0 -p tcp -m tcp --dport 8883 -j REDIRECT --to-ports 8080        //8883端口是mqtts
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE  //在eth0设置nat改变原地址

注意,这里将mitmproxy搭建在vboxnet0,开始我选择搭建在eth0,但是不知为何一直抓不到包。

5. 设置SSL证书

http://docs.mitmproxy.org/en/stable/certinstall.html#the-mitmproxy-certificate-authority

首先让客户端SDK信任mitmproxy的证书,但是,AWS提供的证书和mitmproxy提供的证书在格式上不同,不能仅仅替换证书文件,还需要转换,在执行脚本时-r参数替换为mitmproxy的证书文件。

openssl x509 -in mitmproxy-ca-cert.pem -inform PEM -out foo.crt   //更改证书格式

python aws-iot-device-sdk-python/samples/basicPubSub/basicPubSub.py -e axxxxxx9x.iot.us-east-2.amazonaws.com -r foo.crt -c 0000.cert.pem -k 0000.private.key

客户端设备的证书也要经过转换才能提供给mitmproxy,不然服务器会断开连接。

格式转换参考:https://stackoverflow.com/questions/28712088/unable-to-load-certificate-6300error0906d06cpem-routinespem-read-biono-star

使用客户端证书:http://docs.mitmproxy.org/en/stable/certinstall.html#using-a-client-side-certificate  (文档有个坑,这里其实不能单纯指定文件夹,最好指定证书文件,官网文档没及时更新)

填坑:https://github.com/mitmproxy/mitmproxy/pull/494/commits/ff6bfba4a6a1c440018c4873d9edeb64da0f8e7f  (这里说明了客户端证书怎么用,若指定文件夹要求文件名和访问域名一致)

openssl rsa -in 0000.private.key -out unprotected.0000.private.key

cat unprotected.0000.private.key 0000.cert.pem > mitm_0000.cert.pem

特别注意,这里不明原因客户端SDK和mitmproxy都会检测到域名不匹配(安全问题?),需要特别处理。SDK我选择注释掉了出错的那一行/usr/local/lib/python2.7/dist-packages/AWSIoTPythonSDK/core/protocol/paho/client.py的800行左右的self._tls_match_hostname();mitmproxy使用--insecure参数,届时会显示警告,但是不会断开连接。

192.168.56.2:52369: Certificate Verification Error for 52.15.111.27:8883: hostname 'no-hostname' doesn't match either of u'*.iot.us-east-2.amazonaws.com', u'iot.us-east-2.amazonaws.com'

192.168.56.2:52369: Ignoring server verification error, continuing with connection。

6。wireshark解密ssl

http://docs.mitmproxy.org/en/stable/dev/sslkeylogfile.html

设置环境变量让mitmproxy记录下ssl的密钥

SSLKEYLOGFILE=~/IoT/keylog

7.最后

1)运行代理:

mitmdump -T --insecure --client-certs ~/IoT/connect_device_package/mitm_0000.cert.pem --host --raw-tcp -w 11111

-v可以显示详细信息。

一定要设置--raw-tcp,否则代理会因为mqtt不是标准的http协议而出错

2)打开wireshark并设置过滤条件为ssl && tcp.port==8883

3)运行sdk脚本:

python aws-iot-device-sdk-python/samples/basicPubSub/basicPubSub.py -e axxxxxx9x.iot.us-east-2.amazonaws.com -r foo.crt -c 0000.cert.pem -k 0000.private.key

4)将密钥导入wireshark即可解密出mqtts消息:

编辑——首选想——protocals——ssl—— (Pre)-Master-Secret log filename,选择记录下的密钥。

By Ascii0x03,欢迎转载,请注明出处,谢谢。

http://www.cnblogs.com/ascii0x03/p/7798072.html

2017-11-07

使用mitmproxy嗅探双向认证ssl链接——嗅探AWS IoT SDK的mqtts的更多相关文章

  1. 基于SSL协议的双向认证 - SSL协议 [1]

    1  概要说明 在互联网通信方式中,目前用的最广泛的是HTTPS配合SSL和数字证书来保证传输和认证安全了. 2  详细介绍 2.1    HTTPS HTTPS全称:Hypertext Transf ...

  2. HTTPS 中双向认证SSL 协议的具体过程

    HTTPS 中双向认证SSL 协议的具体过程: 这里总结为详细的步骤: ① 浏览器发送一个连接请求给安全服务器.② 服务器将自己的证书,以及同证书相关的信息发送给客户浏览器.③ 客户浏览器检查服务器送 ...

  3. 双向认证SSL原理

    http://m.blog.chinaunix.net/uid-540802-id-3170984.html 文中首先解释了加密解密的一些基础知识和概念,然后通过一个加密通信过程的例子说明了加密算法的 ...

  4. ssl双向认证和单向认证原理

    有朋友在搞一个项目,周末有聊到一些安全性的东西,很自然会想起https,但https究竟如何实施,其原理又是什么? 基于ssl,一般的应用都是单向认证,如果应用场景要求对客户来源做验证也可以实现成双向 ...

  5. SSL单向认证和双向认证原理

    注:本文为个人学习摘录,原文地址:http://edison0663.iteye.com/blog/996526 为了便于更好的认识和理解 SSL 协议,这里着重介绍 SSL 协议的握手协议.SSL ...

  6. apache用户认证,ssl双向认证配置

    安装环境: OS:contos 6.4 httpd:httpd-2.2.15-59.el6.centos.i686.rpm openssl:openssl-1.0.1e-57.el6.i686.rpm ...

  7. SSL双向认证和SSL单向认证的流程和区别

    refs: SSL双向认证和SSL单向认证的区别https://www.jianshu.com/p/fb5fe0165ef2 图解 https 单向认证和双向认证!https://cloud.tenc ...

  8. SSL单向认证和双向认证说明

    SSL单向认证和双向认证说明 一.SSL双向认证具体过程 浏览器发送一个连接请求给安全服务器. 服务器将自己的证书,以及同证书相关的信息发送给客户浏览器. 客户浏览器检查服务器送过来的证书是否是由自己 ...

  9. SSL的单向认证和双向认证

    原文地址:http://alvinhu.com/blog/2013/06/20/one-way-and-two-way-ssl-authentication/?utm_source=tuicool&a ...

随机推荐

  1. BCB中AnsiString类方法小结

    AnsiString类是BCB中最常见类之一,了解它对以后深入学习BCB大有帮助. 介绍AnsiString类之前,先要介绍一些背景知识.VCL(Visual Component Library 可视 ...

  2. Mysql的排他锁和共享锁

    今天看代码看到有select name from user where id = 1 for update,有点懵逼,完全没有见过,只能说自己见识少了,那就只能学习一下.先做一下基本知识了解(大部分都 ...

  3. ch1-vuejs基础入门(hw v-bind v-if v-for v-on v-model 应用组件简介 小案例)

    1 hello world 引入vue.min.js 代码: ----2.0+版本 <div id="test"> {{str}} </div> <s ...

  4. 【转】wireshark基本用法及过虑规则

    Wireshark 基本语法,基本使用方法,及包过虑规则: 1.过滤IP,如来源IP或者目标IP等于某个IP   例子: ip.src eq 192.168.1.107 or ip.dst eq 19 ...

  5. SQL server学习(五)——T-SQL编程之存储过程

    周五了,祝大家周末愉快. 之前一直在写SQL server的分享,今天再来个T-SQL编程中的存储过程. 存储过程 存储过程(procedure)类似于C语言中的函数,用来执行管理任务或应用复杂的业务 ...

  6. java使用spark/spark-sql处理schema数据(spark1.6)

    1.spark是什么? Spark是基于内存计算的大数据并行计算框架. 1.1 Spark基于内存计算 相比于MapReduce基于IO计算,提高了在大数据环境下数据处理的实时性. 1.2 高容错性和 ...

  7. dotweb框架之旅 [二] - 常用对象-App(dotweb)

    dotweb属于一个Web框架,希望通过框架行为,帮助开发人员快速构建Web应用,提升开发效率,减少不必要的代码臃肿. dotweb包含以下几个常用对象: App(dotweb) App容器,为Web ...

  8. YYHS-手机信号

    题目描述 输入 输出 样例输入 11 10000 query 5 construct 5 500 100 query 500 query 1000 construct 10 90 5 query 44 ...

  9. python爬虫之获取验证码登陆

    #--coding:utf-8#author:wuhao##这里我演示的就是本人所在学校的教务系统#import urllib.requestimport urllib.parseimport rei ...

  10. nodejs项目管理之supervisor||pm2||forever

    supervisor 是开发环境用. forever 管理多个站点,每个站访问量不大,不需要监控. pm2 网站访问量比较大,需要完整的监控界面. supervisor 特点: 代码修改,实时重启 安 ...