【Android编程】android平台的MITM瑞士军刀_cSploit源码解析及中间人攻击复现
阅读原文时间:2023年07月09日阅读:1

/_文章作者:Kali_MG1937

作者博客ID:ALDYS4

QQ:3496925334

未经允许,禁止转载_/

何为MITM欺骗,顾名思义,中间人攻击的含义即为在局域网中充当数据包交换中间人的角色

这样就可以自由拦截和查看,甚至修改用户的请求

我画了一张图来简要解释这一过程

说到android平台上的MITM欺骗工具,第一反应就是cSploit这个神器

在我第一次当脚本小子的时候就是用的这款工具

这款工具可以说是局域网瑞士军刀,其优秀程度不亚于Zanti,Netspoof等其他MITM工具

它甚至可以根据metasploit的攻击模块拟定攻击方案,可以说是非常方便了

因为这款工具是开源且完全免费的,所以就拿它作为这篇博客的主题

本文中我不仅仅去解析它的源码,还要移植并兼容它的项目,让项目可以为我所用

首先查看Github的README文件

功能很多,不愧是瑞士军刀

0x1源码解析

**这一部分比较枯燥,仅仅是一些关于核心代码的更新逻辑

但是又与我最后对代码进行移植和使用息息相关,希望看官们能够耐心看完**

首先查看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方法解压至软件根目录

至此,核心代码的更新以及解压就完成了

熬过了枯燥的部分,最激动人心的部分来了!

这一部分将讲述核心代码如何运行!核心代码中包含了多少工具,以及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已经被污染,返回的请求也被注入了代码

浏览器查看任意页面

首页head标签内也被写入了FUCKNET的字样并且显示在左上角

至此,中间人攻击复现成功

项目链接: https://pan.baidu.com/s/10wDRQc50e57OMX-DH3BV5Q

提取码: 2ws5