在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
. M- X9 c6 M; e2 D
5 T" H! T; V, o6 T
0 H N, w) i, W7 `$ k9 E+ E$ F, Z
下面就以开发者角度进行解析下这个APP的功能的实现原理。 7 L7 `1 M+ F! N5 }2 j6 h F
0 }6 t+ t% N0 g. G: b- \+ p" p - T0 K( C2 S6 W+ ~, o3 Y1 G# K
, k% e5 B1 s0 q% R! v. O8 ` 基础信息 ! M) n" J) E3 _
% t9 d. k5 a9 ?1 q |% Q拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 9 E% p% p* J( N2 Z7 ?: X9 P e+ U
! a3 H3 N) N/ ^. |
3 _: d, X b# J; l' m, j' Y 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 : b: P' ^' ^! T, K3 c
- ]) X( Q1 X2 o: q; Y
& X, k8 \$ C6 Y: t# ?' W% `& n
' f, Y9 d- M9 Y! y* y
! s' }7 B8 W9 r& D0 D; i 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 # w. ?. f6 q+ L9 ?: U/ Q
- ?6 e4 K8 v: U7 a. g
# [' b! t: Z$ A: m1 J4 c
7 q: ^2 j8 p3 u* z: m/ g% K. T
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 $ y3 t) U$ e6 C" t5 x/ b" r/ \
/ |% U4 k, S) C" h8 g4 o
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
& Z* U7 @3 G1 r7 r, M& D
" `' \% O; c- L7 B$ m5 y2 ?/ Q
6 Y. p! C; I# e9 d. {3 Q" Z9 z* B1 @3 \% H: R 6 S& G* t. a1 e4 r
( w1 j l: q: v: h 签名信息
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
: C1 E- x! b$ q b( N K8 w: |( [" ~( a# P; S9 V5 ~ 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 , @. K F2 q3 I" ]
* M2 R. l- z8 T* Z" g( V0 |& z) g/ b+ h4 L 在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。
/ R/ A: U' _8 x
3 a1 K( N5 j/ M4 k6 Z android签名的数字证书的一般都是采用 X.509的国际标准。
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
$ @' e0 @: N& U/ o 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
$ z$ z$ s: b, _: M( H
/ ?! P6 \' o* L1 u: ]- b
$ [/ T8 p4 I* S/ E1 [- e
: m' f g# T0 z0 Q+ d1 ? }3 d; n6 V, B3 @6 A; W/ H 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
# B" z$ t* S& M7 k: f0 L E" N$ H: x* o7 R
、
3 y$ S2 k* O% q! H. s" G" @5 ~8 \1 x3 c% w* h) ^
2 O' ~1 o+ J7 ~( z7 \权限信息
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
1 r0 u3 R1 C% b, N+ ^8 Randroid的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 , Y6 _3 H6 D6 Q0 s3 @; _3 v
! ~0 H0 B0 m% l' u( d6 A) [
% G3 f/ l9 E6 M; }5 m4 H; g M- H, o) U4 ]" D 下面对这个APP的所有权限进行详解下: 2 a* y3 Z" V7 p" T
1 d c- l+ w, q5 D3 _! }# Z: t android.permission.INTERNET :访问网络连接可能产生GPRS流量 ; ]* I. m* `+ N
% ^- x5 L3 G" l2 B: X android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 4 ]$ l8 g- \5 G" K
! a+ X& b, L1 S+ n; N0 b. | android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
* v* K) ~5 N* b f% ~' q. \* N' Handroid.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
/ ^* z4 `3 a. v, nandroid.permission.WRITE_SMS:允许应用程序写短信内容
; k/ G% `7 @6 s- ~4 f' U0 j( I' Y2 ~ android.permission.READ_SMS:允许应用程序读取短信内容 7 }! j, U- Y7 `5 h+ e6 o
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 4 C; E; C3 e' C5 d
8 Y4 M; L# T8 Z6 a( {% j" s8 b: L android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
) r! I% t: [) v- Q9 Q$ iandroid.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
6 ~6 `! s4 x* O( Z U0 Tandroid.permission.VIBRATE:允许振动 ; f( @6 A, S& J9 U' Q! a
. A: a0 P) _- b/ k! o! D/ J1 candroid.permission.READ_LOGS:允许程序读取系统底层日志
% J1 z1 I, r; v8 Y; N5 Yandroid.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 0 ?1 ?) t# r5 Z; t
& f6 }5 E) M3 [% N
0 H0 O2 i0 e6 h1 c% ]9 `; a 功能信息 6 z$ Q) m* M: q1 z
- v- p1 U% h7 Q; y# K$ [
; k1 f. h( {+ a0 \( p7 k0 z" j0 ]; L4 @; s 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 , ^9 J( }1 N' u7 w: `
0 F0 _* n: M( v1 E. |8 G. o5 S6 x Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 , a9 P0 }! f; }* n$ E; w
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
( T3 Z; d4 m3 t+ C
+ J* H2 m6 D, O9 P
/ c: { t2 K( M M* d+ X" L" M0 e$ L
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 , A) m% K g: N& x) J! U3 m
5 i9 e& l* l0 s; t
0 s n j( i0 U/ o6 u! b, U3 @8 i, P# ?
* j' o& R( u$ W( l! {4 Z: q! A* ]$ q+ Q) s" J6 l$ _1 s9 F 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 * a5 ~2 Y2 k% \9 H h
5 z& \7 d& E' H0 s1 S% M
6 i! w. H! }. R# S# B
/ {5 G6 l1 J4 @, q& d, X& X 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
" L H$ ]9 G/ O# h7 ~
; n. }+ {# ?2 U' {
4 M, s4 H2 Q5 F7 M3 s! B$ J m7 X8 q 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 * G: i/ Z$ x/ v4 `9 R5 v
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
2 {) P2 ` I( W: `3 `- r. L这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
7 i& @7 ^: n4 m( \) [9 i9 d 开源的luasocket代码可以参考学习下 / ?0 o% z Z0 K8 r* n a" d
( e0 r, l# _: _https://github.com/lunarmodules/luasocket ) k# T y7 ]% m2 a0 t' z( `. P
https://github.com/fengye/luasocket
$ q% |0 {4 L0 j: y1 |4 F + _: l) U5 d8 |0 d) Q5 [. t
* e; u. d$ C$ a! Z5 J
3 H$ w1 G- j$ } ( Z! o* p4 ? |" e& ^
% y. N# {8 n8 V$ U3 \4 y+ n; K7 j4 l 8 q6 g3 c& N, c( G2 E
总结
0 W- V R$ K/ u纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
Z, F } x2 r5 @; ^6 j6 a感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
9 x. T0 ?" w3 E5 X9 ` 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。
$ B' E* I0 p. y- d( `! {1 d1 l! N' j: b 结束 7 C" h& }, z+ ? x2 {: O- S
. ^" T5 c# G: h 【推荐阅读】 ! x' j6 D. g$ E+ ~3 a. X/ r
- l$ C: X, d( M! b- H# ]* M7 y1 L5 i" D0 n8 c( T 对吃鸡APP的分析
4 ]# Y) r `/ y4 P, x" M! a2 U6 z; f 你需要了解的APP安全 $ h( G* N, n7 p9 k7 j
你需要了解的APP安全 5 l5 n G% l' T% p! P! k4 U
/ G2 c" ? o" W" [* P3 p
| 欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/) | Powered by Discuz! X3.2 |