“想要解决一个问题,最根本方法的就是了解这一切是如何工作的,而不是玄学。”

                                  ——ASCII0X03

最近学习发现现在很多现成的安卓SSL中间人工具和教程都只针对HTTPS流量,比如注册为安卓VPN的Packetcapture,以及设置http代理来抓包的Fiddler。他们对于分析http流量都很好,但是遇到局域网通信或者非HTTPS流量如MQTT,就无能为力了。因此,特利用双网卡和mitmproxy神器(叫做神器是有原因的,这应该是做中间人最好的工具了,可满足各种需求)搭建了一个支持SSL上的MQTT协议的中间人环境,基本框架如下图。

注意,此方案选用俩网卡自己当网关是基于如下考虑:手机设置代理的方法不是所有app的所有流量都会使用,ARP欺骗不稳定,并且有的设备自己做AP热点根本就不转发任何其他流量。当然,还是需要Xpose或者重打包来绕过App上的SSL pinning。鄙人认为最好的方法还是在安卓端写一个类似于Packetcapture的VPN软件配合Xpose Hook并支持各种端口的协议(不太好的一个参考:https://blog.csdn.net/XXOOYC/article/details/78223242),奈何太菜不懂安卓,哪位达人有兴趣可以git 来一发。

一、基础知识

1.mitmdump基础

参考:https://docs.mitmproxy.org/stable/concepts-modes/#transparent-proxy

由于我们不想只监听HTTP流量,因此需要使用mitmproxy的“透明”(Transparent Proxy)模式,即从网络层转发至代理,监听IP层以上的所有流量。基本原理如下图所示,在router层面(使用iptables)将数据包重定向到mitmproxy,然后中间人代理会嗅探并自动转发。注意:代理会将源IP地址修改为本机NAT不应该在代理之前做,因为会让代理无法判断真正的目的地址,第三张图是错误的示例

2.iptables基础

参考系列教程:http://www.zsythink.net/archives/1199

尤其是其中的这张图,画的非常好,这里转载过来备用,侵删。

3.安卓校验SSL实现

安卓如何实现https可以参考:https://www.v2ex.com/t/309553

绕过安卓App的SSl可参考:https://blog.netspi.com/four-ways-bypass-android-ssl-verification-certificate-pinning/

对于安卓上的SSL pinning,不一定要使用Frida,也可以使用Xpose的Just trust me模块来Hook SSLContext.init函数,给一个空的TrustManager,但是,校验的顺序是先校验证书,再校验域名,即setHostnameVerifier。通常这个函数是不用我们处理的,因为mitmproxy已经自动的生成对方服务器的hostname来构建中间人证书,但是个别情况下我们还是需要找到并且Hook掉这个App自己的HostnameVerifier类,比如App连接设备的WiFi并且校验SSL证书是不是和WiFi的名字相同。

4. 绕过IOS的SSL pinning

非常好的一篇参考:https://blog.netspi.com/four-ways-to-bypass-ios-ssl-verification-and-certificate-pinning/

其中推荐了一个搞IOS和MAC OS的人的工具SSL Kill Switch(暂时还没试,但是似乎非常靠谱):https://github.com/nabla-c0d3/ssl-kill-switch2

ps:通过阅读这些国外的帖子,虽然不同平台有不同平台专门的搞法,但是感觉搞安全分析务必要学习一下Frida了,这是一个更通用的动态hook工具,以后应该会用得到。

二、方案说明

基本的中间人搭建参考:https://medium.com/@viveks3th/turning-your-raspberry-pi-into-a-rogue-wifi-router-for-hacking-46d4941bbca9

iptables规则如下(eth0是外网):

sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT

sudo iptables -t nat -A PREROUTING -i wlan0 -p tcp --dport  -j REDIRECT --to-port
sudo iptables -t nat -A PREROUTING -i wlan0 -p tcp --dport -j REDIRECT --to-port

其中-m是指定扩展模块“state”,只允许相关的包从外网转发到内网;但是物联网设备和app通信往往包含相互发现等过程,因此可以根据需要转发其他类型的流量,如本次需要转发特殊的UDP流量。

我的方案

1.wlan1接入具有外网的热点或者按需接入设备建立的配网热点。记录下需要和App通信的ip地址,以方便转发udp流量。

2. wlan0建立热点,并让手机接入。可参考https://blog.csdn.net/gsls200808/article/details/39370597

主要有这么几步:

(1)安装配置hostapd

注意,在运行前需要让系统自带的网络管理器取消对wifi的管理:nmcli nm wifi off(或者尝试nmcli radio wifi off)。但是,有时候会出现lsusb能看到无线网卡,ifconfig看不到的情况,有可能是驱动出了问题(但是lsmod没看出问题),我的解决方案是打开系统自动管理nmcli radio wifi on,然后重启电脑重新插网卡就恢复正常了。求高人解惑,避免重启。

(2)安装配置DHCP服务器

(3)设置iptables转发

#########################################################################
# File Name: setup_wifi_ap.sh
# Author: ascii0x03
# mail:
# Created Time: 2018年01月22日 星期一 15时28分50秒
#########################################################################
#!/bin/bash
#
/etc/init.d/hostapd stop
service isc-dhcp-server stop
/etc/init.d/isc-dhcp-server stop
ifconfig wlan0 down vim /etc/hostapd/hostapd.conf
vim /etc/dhcp/dhcpd.conf
#设置网卡wlan的IP和子网,要跟dhcpd.conf网关一致
ifconfig wlan0 192.168.201.1 netmask 255.255.255.0 up
sleep
rfkill unblock wifi
sleep
hostapd -B /etc/hostapd/hostapd.conf
#initctl reload-configuration
service isc-dhcp-server start
#/etc/init.d/isc-dhcp-server start #iptables转发上网
sudo sysctl -w net.ipv4.ip_forward=
sudo iptables -F
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -L

3.设置转发规则,例如将App的UDP等数据通过DNAT转发至设备,设备也DNAT至App,因为IoT经常使用这些UDP广播来进行设备发现。(看情况而定)

4.设置转发规则,将想要监听的tcp端口转发至mitmproxy。(看情况)

5.在wlan1设置NAT规则进行转发(在出口位置肯定在mitmproxy之后)

 #########################################################################
# File Name: mitm_config.sh
# Author: ascii0x03
# mail:
# Created Time: 2017年12月06日 星期三 16时24分37秒
#########################################################################
#!/bin/bash
#首先,建立好AP为wlan0,并且开启dhcp服务器分配ip,之后运行如下脚本即可。
sysctl -w net.ipv4.ip_forward=
sysctl -w net.ipv6.conf.all.forwarding=
sysctl -w net.ipv4.conf.all.send_redirects= iptables -F
iptables -t nat -F
iptables -A FORWARD -i wlan1 -o wlan0 -j ACCEPT
iptables -A FORWARD -i wlan0 -o wlan1 -j ACCEPT #UDP for discovering device in wlan
iptables -t nat -A PREROUTING -i wlan0 -p udp -m udp --dport -j DNAT --to-destination 192.168.1.101
iptables -t nat -A PREROUTING -i wlan1 -p udp -m udp --sport -j DNAT --to-destination 192.168.201.156 iptables -t nat -A PREROUTING -i wlan0 -p tcp -m tcp --dport -j REDIRECT --to-ports
iptables -t nat -A PREROUTING -i wlan0 -p tcp -m tcp --dport -j REDIRECT --to-ports
#MQTTS
iptables -t nat -A PREROUTING -i wlan0 -p tcp -m tcp --dport -j REDIRECT --to-ports #all
#iptables -t nat -A PREROUTING -i wlan0 -p tcp -j REDIRECT --to-ports iptables -t nat -A POSTROUTING -o wlan1 -j MASQUERADE iptables -S
iptables -t nat -S
#存放ssl密钥的位置
export MITMPROXY_SSLKEYLOGFILE=~/IoT/keylog #mitmdump -T -v --cert *=~/iRobot/irobot_cert.pem --insecure -tcp -w
mitmdump -T -v --insecure --raw-tcp -w

三、重要补充

0. 需要一个在Linux下支持AP模式的网卡和驱动

这里推荐TP-Link的TL-WN722N。lsusb可以看到识别出来的型号。需要添加个源到/etc/apt/sources.list:deb http://httpredir.debian.org/debian/ jessie main contrib non-free,然后再安装: apt-get update && apt-get install firmware-athreos

参考:https://wiki.debian.org/ath9k_htc

1.连接未加密WiFi

iw dev wlan1 connect Roomba-3147C60040239620

2.连接加密WiFi

wpa_supplicant -i wlan1 -c ./wifi.conf

wifi.config的内容参考如下

network={
ssid="NIPC"
psk=""
#psk=e68b3b7ddb0aba50c582753dfbe33cc372b080eb0d11fcaa6b096ec466f82343
}

3.连接后请求获得IP地址

dhclient wlan1

4.断开WiFI连接

iw dev wlan1 disconnect

5.开启建立的热点:

hostapd -B /etc/hostapd/hostapd.conf

6. 关闭热点:直接kill掉hostapd进程

7. 查看网卡的无线状态和ip状态(注意ifconfig看不到无线网卡但是iwconfig可以看到,ifconfig wlan0 up开启后就好了)

iwconfig

ifconfig

双网卡+mitmproxy+iptables搭建SSL中间人(支持非HTTPS协议)的更多相关文章

  1. Windows如何搭建SSL通信(非Web)

    自己研究了会儿,把结论发出来给有需要的人 第一步:准备环境 首先需要一台服务器(这不是废话吗),我这边用的windows2003, 还需要一台客户端,我用的是windwos2008 第二步:服务器环境 ...

  2. 为服务器设置SSL证书,配置Https协议

    注意 服务器要打开443端口 1.申请证书,这里推荐腾讯云或者阿里云的,有免费的证书,要求不高的盆友可以试一试 2.打开php.ini扩展. extension=php_openssl.dll 3.打 ...

  3. centos7 搭建双网卡bond1(主备模式)实例

    前景须知: 在redhat6 中网卡叫bond,在redhat7及centos7中改名team,此处只记录centos7中双网卡主备搭建过程. 应用情景:实现网络的高可用,防止一条网线或交换机故障影响 ...

  4. 双网卡Iptables端口转发

    当前场景如下 跳板机A是双网卡,有一个内网IP和一个公网IP 内网IP: 10.0.10.30 外网IP:  58.68.255.123 内网机器:10.0.30.88,可以和10.0.10.30通讯 ...

  5. VirtualBox双网卡搭建Linux虚拟实验环境

    VirtualBox中有如下几种网络连接方式: NAT(NAT到宿主机IP地址) NAT Network (NAT到宿主机所在的网段,即使用相同的网关和掩码) Bridged Adapter Inte ...

  6. 烂泥:openvpn双网卡客户端与内网机器通信

    本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb. 前段时间写了一篇有关openvpn搭建与内网机器通信的文章,那篇文章是基于服务器单网卡 ...

  7. 一个基于nodejs,支持http/https的中间人(MITM)代理,便于渗透测试和开发调试。

    源码地址:https://github.com/wuchangming/node-mitmproxy node-mitmproxy node-mitmproxy是一个基于nodejs,支持http/h ...

  8. Linux双网卡NAT共享上网

    linux双网卡NAT共享上网 术语字汇 私有IP地址(路由不可达地址)是一个被用于本地局域网的IP地址(在互联网中不可见). 公用IP地址(路由可达地址)是一个在互联网中可见的IP地址. IP伪装是 ...

  9. Centos7 / RHEL 7 双网卡绑定

    http://www.cnblogs.com/hukey/p/6224969.html 1. 简要    双网卡绑定技术在centos7中使用了teaming技术,而在rhel6/centos7中使用 ...

随机推荐

  1. MinerBean.java 数据库表 miner bean

    MinerBean.java 数据库表 miner bean package com.iteye.injavawetrust.miner; import java.util.Date; /** * 数 ...

  2. 【Unity Shaders】Diffuse Shading——漫反射光照改善技巧

    本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...

  3. nginx 安装php

    1. 安装PHP 5.5.0 下载   1 2 cd /usr/local/src/ wget http://www.php.net/get/php-5.5.0.tar.bz2/from/jp1.ph ...

  4. Universal-Image-Loader完全解析--从源代码分析Universal-Image-Loader中的线程池

    一般来讲一个网络访问就需要App创建一个线程来执行,但是这也导致了当网络访问比较多的情况下,线程的数目可能积聚增多,虽然Android系统理论上说可以创建无数个线程,但是某一时间段,线程数的急剧增加可 ...

  5. java缓存系统

    第一版 package cache; import java.util.HashMap; import java.util.Map; public class Cache1 { private Map ...

  6. RecyclerView+Cardview学习探索

    1.概述 在support-V7包中引入了很多新的M 控件,其中RccyclerView也是其中一员,它的名字来源于它的工作方式:当一个Item被隐藏起来时候并没有被销毁,当建立新的item时候,组件 ...

  7. 22_Android中的本地音乐播放器和网络音乐播放器的编写,本地视频播放器和网络视频播放器,照相机案例,偷拍案例实现

    1 编写以下案例: 当点击了"播放"之后,在手机上的/mnt/sdcard2/natural.mp3就会播放. 2 编写布局文件activity_main.xml <Line ...

  8. cocos2d-x项目与vs2013编译

    cocos2d-x项目与vs2013编译 2014-12-17 cheungmine 因为C++11引入了众多开源软件的特性,导致cocos2d-x r3.3项目无法用 vs2010编译. 所以安装了 ...

  9. Dijkstra算法 c语言实现

    Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法能得出最短路径的最优 ...

  10. SharePoint 2010 之soap:Server服务器无法处理请求

    算是一个下马威?!刚刚部署上的SharePoint2010环境,感觉很欣喜,开始操作,结果装上Designer2010,打开页面,居然报错 错误内容:soap:Server服务器无法处理请求. --- ...