ARM设备武器化指南·破·Kali.Nethunter.2020a.上手实操

Kali Nethunter

前文中介绍了Nethunter Rootless的使用方法,和可以在任意手机上安装和使用Kali Linux的特性。官方博客中说,Nethunter Rootless可以最多只有85%的威力,带root、三方recoveryKali定制内核的完整版Nethunter才能发挥100%的威力,接下来就来康康,100%威力是啥样的。

本文实验过程涉及的所有附件均位于Github主页中:https://github.com/asukaf1ght/ArmDevicesWeaponized

安装流程详解

首先安装起来就会非常复杂,而且也不是所有手机都能装,只有官网支持的设备才能装。这里使用Nexus 6p(angler)进行举例,主要流程分四步:

  1. 刷入官方原版镜像:这里我们重新刷入,避免原来rootless系统的影响;
  2. 三方recovery:肯定是twrp
  3. root:选择经典的SuperSU
  4. 刷入Kali Nethunter

第一步这里不再赘述,与前文操作流程是一致的。

刷机结束后,从附件里找到SR5-SuperSU-v2.82-SR5-20171001224502.zip,上传到手机上。

# adb push SR5-SuperSU-v2.82-SR5-20171001224502.zip /sdcard/
SR5-SuperSU-v2.82-SR5-20171001224502.zip: 1 file pushed, 0 skipped. 14.4 MB/s (6882992 bytes in 0.4

用附件的种子nethunter-2020.2-pre3-angler-oreo-kalifs-full.zip.torrent,下载n6pNethunter,下载完算下校验码,再上传到手机上去。

# adb push nethunter-2020.2-pre3-angler-oreo-kalifs-full.zip /sdcard/
nethunter-2020.2-pre3-angler-oreo-kalifs-full.zip: 1 fi...hed, 0 skipped. 16.7 MB/s (1317485081 bytes in 75.189s)

手机重启进入bootloader

# adb reboot bootloader

在附件里找到twrp-3.3.1-0-angler.img,用fastboot刷入进去;

# fastboot flash recovery twrp-3.3.1-0-angler.img 
target reported max download size of 494927872 bytes
sending 'recovery' (16844 KB)...
OKAY [  2.019s]
writing 'recovery'...
OKAY [  0.246s]
finished. total time: 2.265s

刷完之后按音量向下键,选择Recovery mode,按电源键进入。

进入Recovery之后,选择InstallSR5-SuperSU-v2.82-SR5-20171001224502.zip开始刷机。

刷完之后选择RebootDo Not Install重启进入系统(可能会重启数次)。

进入系统之后发现已经有了root

# adb shell
angler:/ $ su  
angler:/ # whoami
root

再次进入recovery,把nethunter-2020.2-pre3-angler-oreo-kalifs-full.zip.torrent刷进去,中间解压Kali rootfs的地方,会至多25分钟。

刷机结束后进入系统首次也要先点击Nethunter的应用,申请的所有权限都给,左侧导航进入Kali Chroot Manager,点击START KALI CHROOT,只要初始化这一次,后续无论如何重启都会出现如图所示的Everything is fine and Chroot has been started!

至此详细刷机流程结束。

解锁完整linxu操作系统

这回使用ssh不用再通过termux了,直接Nethunter应用中选择Kali Services,勾选RunOnChrootStart,并打开右侧开关:

我们把SSHAPACHE2一起安排上了,那么远控和网页服务器就一起都有了,可以作为内网的cc服务器,下发一些木马或热补丁之类。

终于拥有完整版的apthtop了。

通过手机的type-c接口,连接:

  • 一个有线网口接有线网络
  • 一个USB
  • 一个无线网卡

# lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 005: ID 0951:1643 Kingston Technology DataTraveler G3
Bus 001 Device 004: ID 0bda:8153 Realtek Semiconductor Corp. RTL8153 Gigabit Ethernet Adapter
Bus 001 Device 003: ID 0bda:8176 Realtek Semiconductor Corp. RTL8188CUS 802.11n WLAN Adapter
Bus 001 Device 002: ID 0bda:5411 Realtek Semiconductor Corp. 4-Port USB 2.0 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

可见全部识别出来了,并且在有线网络上获得了192.168.0.7IP地址。

存储的U盘也没有问题:

扫描个无线网:

基本上拥有了比较完整的Linux功能。

WIFI连内网,CC走流量逃逸

一般情况下,手机开启流量,npc肯定是通过流量连接cc的这一点毋庸置疑。

通过手机流量卡直接将数据传出去可以绕过内网网关,实现流量逃逸。

如果手机同时开启WIFI连接内网之后,npc必定是通过WIFI网络连接cc服务器的,这样就容易被内网网关检测到。不管做的多么隐蔽,总归要从企业网关出去。

如果可以让npc单独走手机卡流量,其余还是跟正常手机一样,该去bilibili看宅舞,还是正常追剧、炒股、聊QQ还是与正常流量无异,实现最大程度的伪装,这样的设想能否实现呢?

其实是可以的,只需要在wlan0的路由表中,单独加一条指定ccIP的定向静态路由即可。

注意,这个加一条路由不是简单的一条命令加到系统里就行,得先了解下现代安卓手机的路由系统的内部架构。

Android5.0之后,考虑要对多网络的支持,安卓采用了多路由表,在同一时间下,Android系统可以允许多网络类型连接,而且并不是简单的网络共存,而是每个网络有一套自己的DNS,网关,路由表。比如eth0wlan0,手机流量卡会分别有自己独立的一套。

这样应用层在建立Socket连接的时候,可以自由选择使用哪套网络来完成实际的请求。这里还涉及到另一个新的概念不同网络的标识netid,应用层可通过绑定指定的netid来设置该应用走指定的网络,此处感兴趣可以去网上搜索,可以搜到很多与netid相关的代码。

Android 5.0之前,在同一时间下,Android系统只能允许一种网络类型连接。之后在多网络的情况下,系统是如何选择的呢?这就需要引入一个关键名词——策略路由,详细资料大家可以在网上搜索。最终我们在策略路由的基础上,更改路由表wlan0,添加单条静态路由。

理论知识有了之后,接下来就是动手实践。

首先来的得到我的一些环境的地址:

手机流量卡出口地址:112.192.13.128
小区出口地址:223.166.231.xxx
手机流量卡的内部IP是:10.53.237.30
手机WIFI的内部IP是:192.168.5.28

看看手机中都有哪些默认路由:

# ip route show table 0 |grep default
default dev dummy0  table dummy0  proto static  scope link 
default via 192.168.5.1 dev wlan0  table wlan0  proto static 
default via 10.53.237.29 dev rmnet_data0  table rmnet_data0  proto static 
unreachable default dev lo  proto kernel  metric 4294967295  error -101
unreachable default dev lo  proto kernel  metric 4294967295  error -101
unreachable default dev lo  proto kernel  metric 4294967295  error -101
default dev dummy0  table dummy0  proto static  metric 1024 
unreachable default dev lo  proto kernel  metric 4294967295  error -101
default via fe80::d545:7c38:5509:f2a0 dev wlan0  table wlan0  proto ra  metric 1024  expires 657sec
unreachable default dev lo  proto kernel  metric 4294967295  error -101
unreachable default dev lo  proto kernel  metric 4294967295  error -101

可以得到手机流量卡的路由器,也就是下一跳为10.53.237.29,正是通过该地址,去跳向cc

向路由表wlan0中增加指向VPS(cc)的单条静态路由:

# ip route add table wlan0 118.126.XX.XXX via 10.53.237.29 dev rmnet_data0

添加完成后路由表wlan0是酱紫的:

# ip route show table wlan0
default via 192.168.5.1 dev wlan0  proto static
118.126.XX.XXX via 10.53.237.29 dev rmnet_data0
192.168.5.0/24 dev wlan0  proto static  scope link

也就是对于路由表wlan0来说,通向VPScc)时,是走10.53.237.29IP作为下一跳的,通过rmnet_data0网卡设备。

最后来检查下效果如何,手机播放VPS上的视频康康,确实是通过手机流量卡去访问该mp4的,实验成功!

最后来试下npc,看看客户端ip显示的是多少:

可以看到还是手机流量卡的地址,手机其实是连着wifi的,可以看到curl ip.sb得到的还是小区出口IP

而且使用增加单条静态路由的方式,是不会影响手机作为代理进行内网扫描所需的路由表wlan0的。

接下来就可以把手机配发给“卧底”,让他去连内网了,不管是无线网罗还是有线网络,都可以轻松应对。

 

勒索、远控、APT

前文在介绍渗透测试流程时,讲到实施人员可以尝试利用WIFIUSB连接,将移动安全小组提供的移动端RAT植入到目标移动终端中,这里稍微具体一些、展开讲下。

新手在学习MetaSploit时,也会照着书中的案例依葫芦画瓢:

  1. 生成一个恶意apk
  2. apk签名
  3. 让目标来安装

这样就可以收到目标回传的信息,实施更多的控制。

当然现实世界的进攻会非常复杂和依赖于各种环境和条件的限制,不过不得不承认,进攻的本质确实是这三条,分别对应:

  1. 完成恶意应用的具体功能模块
  2. 通过各种免杀技术使App可以存活并运行
  3. 各显神通诱骗目标下载、安装和使用

功能:远控、上传、勒索、加密

哪些功能恶意应用必备的呢?

最起码联络cc,通过服务端下发指令并执行要有吧:

获取并上传用户短信:

通过Accessibility Service直接操作模拟点击手机界面:

上传用的定位、串号、手机状态等信息:

上述这些只是冰山一角,如果配合root可以做到对其他应用如手机浏览器进行注入,启动用户手机指定App,删除指定应用,更新恶意插件等恶意行为。

当然现在的手机想要root是非常困难了,但并不妨碍很多高级APT团伙使用0day1day来开发Exploit进行远程root,这就需要更为昂贵的投入和深厚的技术功底了。这也是为何现在的APT频频有国家队作为背后支撑的原因。

当然在社会上被广泛使用的还是比较低级的加密、锁机、或者上传视频进行勒索。

当然不要小看这些低级技术的危害,比如我们的时间管理大师——罗志祥就曾经在这上面栽过跟头:早期罗志祥与网友裸聊画面曝光 曾上节目哭诉辩解

不排除甲方老板也好这一口,对吧。比如有些人表面上在白天他是演员,其实到了晚上他是运动员。社工很多时候是真的比0day1day好用。

在内网把各种资料都搜集到了之后,如何不走网关不动声色地上传到cc呢?这就用到前文讲的手机卡流量逃逸了。

传统免杀技术:混淆、加密、VMP

这部分其实跟App加固是重合的,因为原理是一模一样的。

前者的目标是保护App不被逆向破解者给分析,后者是为了掩盖特征,逃过杀软或者行为管理软件的识别。

你用msf生成一个payload,啥也不干就发到对方机器上,那就等于去送人头,不杀你杀谁呢?或者攻击团队煞费苦心开发了好几个月的木马,啥也不防就发过去,其实就是给防守团队送源码去的。

总得混淆、加密甚至上个VMP保护下吧,虽然还是会被病毒分析人员分析,并且肯定会被扒个底朝天,但是恶心他一下也好啊。

这部分技术非常多,这里主要也就是给个索引,大家有兴趣可以自行深入分析。

  1. 混淆:
  2. 反反编译器:
    • 花指令
    • 重打包对抗:对抗jd-gui、dex2jar、baksmali、shakaapktool、androguard
  3. 反调试:
  4. 加固

内存免杀技术:重打包、VAHotfix

直接送个apk给对方,让对方安装,还是难度颇大。

有简单的方式就是拿市面上的大厂App解包之后,安插进自己的代码,重打包,然后可以:

  • 创造机会让对方下载,比如公司规定安装某银行的手机客户端,邮件里还附上了apk,对方大概率会下载安装;
  • 或者有机会接触对方手机的话,直接就把他原来的微信卸载了,装上自己重打包的微信;你的代码就跑在微信里,所有的权限都继承自微信,那其实他在攻击者眼中就没有秘密了。

其实重打包做免杀的技术已经广泛应用在山寨App的黑色产业链之中了,他们的盈利方式是通过往热门应用“插包”、“重打包”的方式,植入广告劫持模块进行刷量作弊,当正常用户被诱导安装使用了这些真假难辨的山寨应用后,即可实现对广告主的,以为自己在正常使用App,其实是在疯狂点击广告,实现对正规广告主的”薅羊毛”行为。

想要将远控、或上传等代码隐藏好,实现不落地加载的话,可以将核心逻辑不要直接重打包进包里,而是做个hotfix,等App执行一段时间之后,再通过下发补丁包,让已安装的客户端来执行远控代码。

得益于安卓平台的开放性,热修复在安卓平台几乎无所不能,可以修复资源文件、修复代码(类、方法等),甚至连so库都可以修复,常用的框架有阿里系的AndFixHotfix,腾讯系的TinkerQFix,还有美团的等等。

这些本应用于动态修复bug、免重安装修复bug的热修复框架,到了红队手中也是摇身一变,就好比张小泉的菜刀,切菜好用,摇身一变就是“中国菜刀”。

最后再介绍一种动态掩盖特征的方法,那就是用VA来“加固”,VA等多开工具将安卓系统与VA内的应用隔离,使得应用的静态特征被动态掩盖,目前己有广泛的恶意应用使用VA对自身重打包,重打包后的应用包名、软件名与原应用不同,从而逃过静态查杀。

等到VA运行时,可以解密恶意应用Apk,通过反射等技术欺骗安卓系统来运行未安装在系统中的Apk,到这一步就跟正常的App无异了,这方面也有一篇详细的文章:《VirtualApp技术黑产利用研究报告》

VA的本质就跟Windows平台上的壳技术差不多,先于恶意应用前运行,瞒过杀软之后,再将恶意应用释放出来运行。

加载器:社工、水坑、钓鱼、引流

payload功能实现了,做了加密和混淆加固了,核心逻辑做了热补丁动态下发(可以到内网的小美手机那里下,前面不是开启了APACHE SERVER么?),如果目标还是不安装,那一切还是等于零。

其实前面已经说了几种方法,比如伪装成集团IT部分要求大家统一安装,这也是最常见的社会工程学手段,俗称钓鱼或者水坑,大家经常收到这种员工薪酬.xls员工通讯录2020版.doc等文件,打开即会释放宏木马,攻陷PC,如果此时企业App的开发者把开发手机也连在电脑上,也会给处于开发者模式的手机安装恶意软件。

也可以直接攻陷集团MDM服务器,直接分发木马,见这篇:Hackers breach company’s MDM server to spread Android malware,或者直接想办法拿到对方的手机,这也是直接出击的社工了,“美人计”甚至“美男计”也属于社工的一部分。兵者、诡道也。

社工的成功率是非常高的,所以大家也会经常受到各种诱导点击链接短信,菠菜、色流等一大堆。不要小看人类最原始的本能欲望,色流在黑产中的应用范围之广超出想象,前面说的时间管理大师都会中招。

说不定油腻中年老板就喜欢这些妹妹呢?这些照骗确实让人把持不住。

 

总结:只是开始

ARM设备武器化指南攻击篇中,介绍了Kali Nethunter包括Rootless版本和完整版的安装、使用和简单上手实践,还有一般木马、远控的免杀思路和方法。

其实Kali Nethunter的强大之处不仅在于攻击,在防守方面也照样“屡立奇功”,比如得益于其定制版内核解锁arm64架构的Linux软件包安装,可以作为App沙箱和蜜罐,捕获木马并进行内核层面的“降维”攻击分析。详细分析流程和思路敬请期待防守篇。

(完)