Android平台的MITM瑞士军刀 cSploit源码解析及中间人攻击复现

本文写于2018~2019年间,属于黑历史,于2021年由CSDN迁移博客至此.

何为MITM欺骗,顾名思义,中间人攻击的含义即为在局域网中充当数据包交换中间人的角色
这样就可以自由拦截和查看,甚至修改用户的请求
我画了一张图来简要解释这一过程
在这里插入图片描述

说到android平台上的MITM欺骗工具,第一反应就是cSploit这个神器
在我第一次当脚本小子的时候就是用的这款工具
这款工具可以说是局域网瑞士军刀,其优秀程度不亚于Zanti,Netspoof等其他MITM工具
它甚至可以根据metasploit的攻击模块拟定攻击方案,可以说是非常方便了
因为这款工具是开源且完全免费的,所以就拿它作为这篇博客的主题
本文中我不仅仅去解析它的源码,还要移植并兼容它的项目,让项目可以为我所用

首先查看Github的README文件
在这里插入图片描述
功能很多,不愧是瑞士军刀

0x1源码解析

0x01核心代码更新逻辑解析

这一部分比较枯燥,仅仅是一些关于核心代码的更新逻辑
但是又与我最后对代码进行移植和使用息息相关,希望看官们能够耐心看完

首先查看MainActivity
在这里插入图片描述
可以看到onCreate方法内只进行了一些布局的初始化
但是其中的f成员,也就是MainFragent这个类非常重要
注意:在第一次启动csploit时,程序将检查核心代码是否安装,若没有安装,将会从指定地址下载 core.tar.xz
并且解压至程序的根目录,而MainFragent就存在着与之关联密切的代码

接下来查看MainFragent类的代码
在这里插入图片描述
onViewCreated方法内除了进行一系列的布局初始化,还调用了initstartAllServices这两个重要方法
init这个方法放到后面再说,先讲startAllServices这个方法
在这里插入图片描述
又调用了三个方法,跟进startUpdateChecker这个方法
在这里插入图片描述
可以看到此方法中的第二个判断语句
它向org.csploit.android.core.System(以下简称System类)的getBoolean方法内传入了字符串 PREF_CHECK_UPDATES
而程序最终会进入判断
进入判断后程序向UpdateChecker类传入了一个Activity实体,并且调用了start方法
跟进该类
在这里插入图片描述
可以看到UpdateChecker继承Thread
找到run方法
在这里插入图片描述
可以看到最后几行判断,其中getCoreUpdate方法会赋予update成员一个实体,并且和带有UPDATE_AVAILABLE消息的广播一起被发送出去
其中getCoreUpdate方法就是给Update赋予带参数的CoreUpdate实体
在这里插入图片描述
回到MainFragent
在这里插入图片描述
其中的onReceive方法收了广播,并且调用了onUpdateAvailable方法,并且传入了刚刚接收的Update实体
跟进
在这里插入图片描述
最终调用了Intent向UpdateService发送了update实体
跟进,其中UpdateService继承了IntentService,所以找到onHandleIntent方法
在这里插入图片描述
其中调用了setupNotification方法初始化了一些实体
并且利用haveLocalFile方法判断core.tar.xz压缩包是否存在
若不存在,调用downloadFile方法下载文件
下载地址:core.tar.xz
下载完成后调用extract方法解压至软件根目录
至此,核心代码的更新以及解压就完成了

0x02核心代码运行逻辑解析

熬过了枯燥的部分,最激动人心的部分来了!
这一部分将讲述核心代码如何运行!核心代码中包含了多少工具,以及csploit如何巧妙运用这些工具来使其成为最强MITM工具的。
相信我,core.tar.xz中包含的工具绝对能让你吃惊,你会惊叹它不愧为MITM瑞士军刀!

首先查看AndroidMainfest.xml中的application属性
在这里插入图片描述
跟进CSploitApplication类

在这里插入图片描述
该类中,程序会向System类的init方法传入一个Content实体
其中System的init方法只是初始化了一些变量,并不重要,不详细讲
回到MainFagentinit方法
在这里插入图片描述
关键的部分来了,这一部分将决定这个项目能否正常运行!
程序向下走,最终会进入一个分支,其中调用了System的initCore方法
在这里插入图片描述
该方法中有一些是一些关于数据库连接的方法,这些方法不去详细介绍
重要的是reloadTools方法
它重置了ToolBox类中的核心代码将运用到的工具!
比如arpspoof,ettercap等嗅探工具,以及数据包过滤工具iptables和拦截工具tcpdump等等,甚至metasploit工具和模块!
对于ToolBox这个类先不详细介绍,到后面会讲

以上内容是对核心代码的初始化工作,接下来将分析csploit是如何巧妙运行这些工具
准备被秀到头皮发麻吧!
csploit首先会进行网络扫描,发现网络中的主机
这里跳过繁琐的扫描过程,直奔主题,假设你已经选定了一个目标,并且想污染目标的所有网页
向其注入恶意代码,那么要如何实现?

请看程序下面的操作
在这里插入图片描述
该方法实体化了SpoofSession类,调用了start方法
并且传入了一个OnSessionReadyListener类,程序在重写其onSessionReady方法后调用了System的getProxy方法,并传入了一个ProxyFilter类,此类名直接翻译过来的话就是代理过滤器
程序将重写该过滤器类中的onDataReceived方法,该方法中带有两个参数:headers,data
顾名思义,header变量即为拦截到的服务器发送给受害者的请求头,data即为服务器返回的实体内容
这个方法中的操作是替换了data中的head标签,并向其中注入了任意代码
这一系列步骤仅仅被一两句简洁的代码包装起来,一瞬间完成攻击过程,实在是让人称奇!

那么先跟进SpoofSession类的start方法
在这里插入图片描述
继续跟进
在这里插入图片描述
可以看到,进行了一系列判断后程序最终会执行至下面两个操作
新建两个Thread实例,分别传入System的getHttpsRedirectorgetProxy方法并且调用start方法
跟进
在这里插入图片描述
可以看到两个方法分别实体化了Proxy和HTTPSRedirector类,并且传入了HTTP_PROXY_PORT和HTTPS_REDIR_PORT变量
两个变量分别是8080和8082
由于两个方法的实现大同小异,所以这里挑选更容易解释的Proxy类进行解析

Proxy类继承了Runnable,所以直接查看run方法
在这里插入图片描述
其中创建了一个ServerSocket套接字,用于监听8080端口
并且将套接字传入ProxyThread类中
跟进
在这里插入图片描述
前面的代码省略,直接进入到关键代码
程序将根据传入的数据解析出欲请求的服务器,并且在本机代替这个数据包向指定服务器发送请求,并且取得返回内容
将服务器返回的请求头赋予headers,内容赋予data
代码重写了onDatReceived方法,并且传入相应的处理过的headers和data
上面这些与Proxy有关的代码,显而易见,其作用是在本机搭建一个代理服务器,并且在代理服务器中处理接受到的请求和内容
也就是说,只要代理服务器搭建完成,对局域网稍作处理,受害者就会向本机代理服务器发送请求,这样本机就可以对受害者发送的请求进行拦截和修改
这就解释了刚刚的代码可以轻易修改和拦截请求和内容的原因

Proxy类,也就是代理服务器的内容解析完成,接下来进行到更为关键的部分
回到SpoofSession类的start方法
解析该方法剩下的部分
在这里插入图片描述
首先是setForwarding方法
在这里插入图片描述
该方法向 /proc/sys/net/ipv4/ip_forward 内写入数字1
以此开启本机ip转发的功能,这步是必要的!

回到start方法,接下来调用了System的getTools方法,该方法就是实体化了ToolBox类
并且调用了IPTables类的portRedirect方法,传入了一系列参数
注意:ToolBox类是管理org.csploit.android.tools下的工具类的
在这里插入图片描述
跟进IPtables类的portRedirect方法
在这里插入图片描述
其中调用iptables工具的各种命令,将对应端口重定向至代理服务器端口,以至于受害者向本机发送的请求能够顺利进入代理服务器

还有一部分调用arpspoof污染arp表的方法先不讲
这里做一下简要介绍,arpspoof是负责污染局域网特定目标arp表的
它会不断发送精心构造的arp包,让目标误以为本机是路由器,从而让受害者向本机,而不是向真正的路由器发送请求
在文章后面我移植代码的时候会讲到如何利用csploit的核心代码调用arpspoof这个工具

现在先梳理清楚csploit的运行逻辑:
[在本地建立代理服务器] ---> [利用iptables重定向所有向本机的请求至本机代理服务器] --> [利用arpspoof进行欺骗,让受害者误以为本机是路由器,并且向本机发送网络请求](这一部分文章暂时没讲) --> [处理受害者的网络请求]

0x2项目移植以及攻击复现

这一部分将介绍代码移植以及核心代码中arpspoof的运用
将代码移植进其它项目必然会引起报错,而我已经完全修复了大部分因为布局而引起的数百个错误
这部分不讲,修复过的代码将会在文章末尾给出网盘链接

将修复的代码移植进新建立的项目
首先要明白项目是如何运行arpspoof这个elf文件的
关键在Client
在这里插入图片描述
其中加载了两个lib库,这两个lib库的代码就是运行core.tar.xz中工具的关键
并且调用了一些native层的方法,也就是调用核心代码的方法
但本文只对java代码进行介绍,所以这部分不讲(而且我也不会cpp)

为了使arpspoof运行更加方便,我对ArpSpoof这个类添加了一个spoof方法
在这里插入图片描述很容易理解吧,就是执行arpspoof -i 网卡名称 -t 目标 网关

根据之前的核心代码更新逻辑,我直接下载core.tar.xz,并存入项目的assets文件夹中
程序运行时再释放出来,接下来直接构造一个Intent请求,调用UpdateServices方法,不过将UpdateServices的方法进行了修改
让其只进行解压,不进行更新检查
在这里插入图片描述
接着调用iptables重定向请求,并调用刚刚添加的spoof方法
接着重写onDataReceived方法对受害者的请求内容修改
中间人攻击一条龙

编译后运行

由linux机扮演受害者,欺骗linux机
先在未被攻击的机子上查看arp表
在这里插入图片描述
在linux机上查看arp表,并利用curl命令请求任意链接
在这里插入图片描述
可以看到linux的arp表的路由mac已经被污染,返回的请求也被注入了代码
浏览器查看任意页面
BAIDU
首页head标签内也被写入了FUCKNET的字样并且显示在左上角
至此,中间人攻击复现成功

项目链接: https://pan.baidu.com/s/10wDRQc50e57OMX-DH3BV5Q
提取码: 2ws5

posted on 2021-06-13 08:29  MG_Aldys4  阅读(1327)  评论(0编辑  收藏  举报

导航