【Android编程】android平台的MITM瑞士军刀_cSploit源码解析及中间人攻击复现
/文章作者:Kali_MG1937
作者博客ID:ALDYS4
QQ:3496925334
未经允许,禁止转载/
何为MITM欺骗,顾名思义,中间人攻击的含义即为在局域网中充当数据包交换中间人的角色
这样就可以自由拦截和查看,甚至修改用户的请求
我画了一张图来简要解释这一过程
说到android平台上的MITM欺骗工具,第一反应就是cSploit这个神器
在我第一次当脚本小子的时候就是用的这款工具
这款工具可以说是局域网瑞士军刀,其优秀程度不亚于Zanti,Netspoof等其他MITM工具
它甚至可以根据metasploit的攻击模块拟定攻击方案,可以说是非常方便了
因为这款工具是开源且完全免费的,所以就拿它作为这篇博客的主题
本文中我不仅仅去解析它的源码,还要移植并兼容它的项目,让项目可以为我所用
首先查看Github的README文件
功能很多,不愧是瑞士军刀
0x1源码解析
0x01核心代码更新逻辑解析
这一部分比较枯燥,仅仅是一些关于核心代码的更新逻辑
但是又与我最后对代码进行移植和使用息息相关,希望看官们能够耐心看完
首先查看MainActivity类
可以看到onCreate方法内只进行了一些布局的初始化
但是其中的f成员,也就是MainFragent这个类非常重要
注意:在第一次启动csploit时,程序将检查核心代码是否安装,若没有安装,将会从指定地址下载 core.tar.xz
并且解压至程序的根目录,而MainFragent就存在着与之关联密切的代码
接下来查看MainFragent类的代码
onViewCreated方法内除了进行一系列的布局初始化,还调用了init和startAllServices这两个重要方法
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方法只是初始化了一些变量,并不重要,不详细讲
回到MainFagent的init方法
关键的部分来了,这一部分将决定这个项目能否正常运行!
程序向下走,最终会进入一个分支,其中调用了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的getHttpsRedirector和getProxy方法并且调用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
【Android编程】android平台的MITM瑞士军刀_cSploit源码解析及中间人攻击复现的更多相关文章
- Android 进阶15:HandlerThread 使用场景及源码解析
眼睛困得要死,但今天的计划不完成又怎么能睡呢?明日复明日,明日何其多啊! 读完本文你将了解: HandlerThread 简介 HandlerThread 源码 HandlerThread 的使用场景 ...
- [BOT]自己动手实现android 饼状图,PieGraphView,附源码解析
本文要介绍的是一个参照手机支付宝app里面记账本功能里的"饼状图"实现的控件.通常app中可能的数据展示控件有柱状图,折线图,饼状图等,如果需要一个包含多种View控件的库,那么 ...
- Android事件总线(二)EventBus3.0源码解析
1.构造函数 当我们要调用EventBus的功能时,比如注册或者发送事件,总会调用EventBus.getDefault()来获取EventBus实例: public static EventBus ...
- 【Java并发编程】21、线程池ThreadPoolExecutor源码解析
一.前言 JUC这部分还有线程池这一块没有分析,需要抓紧时间分析,下面开始ThreadPoolExecutor,其是线程池的基础,分析完了这个类会简化之后的分析,线程池可以解决两个不同问题:由于减少了 ...
- 《Android NFC 开发实战详解 》简介+源码+样章+勘误ING
<Android NFC 开发实战详解>简介+源码+样章+勘误ING SkySeraph Mar. 14th 2014 Email:skyseraph00@163.com 更多精彩请直接 ...
- Android开发之Theme、Style探索及源码浅析
1 背景 前段时间群里有伙伴问到了关于Android开发中Theme与Style的问题,当然,这类东西在网上随便一搜一大把模板,所以关于怎么用的问题我想这里也就不做太多的说明了,我们这里把重点放在理解 ...
- Android 开源项目源码解析(第二期)
Android 开源项目源码解析(第二期) 阅读目录 android-Ultra-Pull-To-Refresh 源码解析 DynamicLoadApk 源码解析 NineOldAnimations ...
- Git8.3k星,十万字Android主流开源框架源码解析,必须盘
为什么读源码 很多人一定和我一样的感受:源码在工作中有用吗?用处大吗?很长一段时间内我也有这样的疑问,认为哪些有事没事扯源码的人就是在装,只是为了提高他们的逼格而已. 那为什么我还要读源码呢?一刚开始 ...
- 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新
本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...
随机推荐
- PHP使用引用实现无限极分类
PHP实现无限极分类 引用 <?php /** * 无限极分类实现 * @param $list array 需要处理的数组 * @param $pk string 主id * @param $ ...
- 【TensorFlow】使用Object Detection API 训练自己的数据集报错
错误1: 训练正常开始后,能正常看到日志输出,但中途报错 ResourceExhaustedError (see above for traceback): OOM when allocating ...
- git中一些常见问题的解决
1. 解决: 先pull,执行git pull origin 分支名称:然后再执行 git push origin 分支名称 2.git报remote HTTP Basic Access denied ...
- Python 基础教程 —— Pandas 库常用方法实例说明
目录 1. 常用方法 pandas.Series 2. pandas.DataFrame ([data],[index]) 根据行建立数据 3. pandas.DataFrame ({dic}) ...
- 引言:CTF新世界
1. CTF的昨天和今天 CTF(Capture The Flag)中文一般译作夺旗赛,在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式.CTF起源于1996年DEFCON全球黑客 ...
- Java7中Switch为什么只支持byte、short、char、int、String
Java 7中,switch的参数可以是String类型了,这对我们来说是一个很方便的改进.到目前为止switch支持这样几种数据类型:byte short int char String .但是,作 ...
- Jmeter(四十四) - 从入门到精通高级篇 - Jmeter远程启动(本地运行+远程运行)(详解教程)
1.简介 这篇文章其实很简单,就是为下一篇文章做一个铺垫,所以宏哥给小伙伴或童鞋们提前热身一下. 2.什么是远程运行? 远程执行,就是脚本放在本地,执行却在另一台电脑上执行,当然,可以是远程多台电脑一 ...
- 安装SpecCPU2006 on Linux of CentOS6.3, gcc4.4.7
安装SpecCPU2006 on Linux of CentOS6.3, gcc4.4.7 由于在tools/bin目录中只有ia64-linux,所以在直接运行./install.sh脚本时,系统会 ...
- 2.5if语句
判断(if)语句 目标 开发中的应用场景 if 语句体验 if 语句进阶 综合应用 01. 开发中的应用场景 生活中的判断几乎是无所不在的,我们每天都在做各种各样的选择,如果这样?如果那样?-- 程序 ...
- CoSky 高性能 服务注册/发现 & 配置中心
CoSky 基于 Redis 的服务治理平台(服务注册/发现 & 配置中心) Consul + Sky = CoSky CoSky 是一个轻量级.低成本的服务注册.服务发现. 配置服务 SDK ...