; ^- x. Y. i3 p E
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 x- s5 ?; Y5 v2 P7 a& u
. w5 ^1 \5 z2 E; U7 [* X" ^6 V- C
+ V7 h% H# d; l, U {- c
- G+ K. E1 i* v9 J8 ?4 z' n) K * p& u# g" V ^8 Y& @$ v: ]
# z( G! }+ ~. j, Y3 Z
- ~+ q1 h' {/ D- j" e / I: D f; a5 h" i+ V3 Z' N" E
2 m4 U8 Q; a' Q
下面就以开发者角度进行解析下这个APP的功能的实现原理。
- M, l; l2 G- H0 G8 G* p6 i/ E+ S $ }/ h; G. F1 x! x+ B- E) B
: a" Z z/ t, M" x 8 P$ n/ t1 G4 @) R' _
5 f4 ]! f) z0 ^6 ~! z5 }- j# ~; U9 a
基础信息 - J! l# Z( m/ f4 `- a& |# B+ Q5 U! ^
) h( P9 }) K( H
f$ \, K( E( F. ]; G: Q
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
: [$ B% ]8 w8 q; B% `8 [$ P5 Y4 K
" W+ T2 u% k0 S! I3 v
% I. e% @$ g- p9 @8 w3 T $ e# z- N) L7 b; f& S) G
$ F; W& E4 R, b
, `- K9 t0 G9 }' w+ K, L6 r ! Y6 |: C6 I2 r- L- j- v, Q% W
9 t3 C7 n/ c+ o) E" a2 f# {
, J Z8 Q, m+ F- V 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 , r$ O9 z( u* w& A: P( j
n: ?* K. J; I( t, U; ?/ [
1 C# d0 I% _8 A2 y. G3 ~ , W' J, H3 R. m5 |$ k
7 V5 U0 q" d s: F. ]9 V, \
0 r* [% C4 q E" i - I9 v) \! A2 G0 _
/ p+ z' T! D% Z9 ~( ?: L% ]9 ?, n$ r$ M3 D/ i& w
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
6 I; l7 f1 ]: K- Q1 b- v 9 d1 q' h) u' I
" S' l* r+ ?8 z+ Q7 n2 y- q
. _; C" k) l$ ] R% n. S2 Y
& S3 u5 t& t- S: z6 l
& c: \- R# U5 b% l3 h4 E* V( s: y
# _1 u& u$ g1 w+ D
" d5 P- q4 A. H ^* a2 c3 K( x& K7 n& q( Y
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 & c S# {! x( F- Q$ A
9 c. _7 B+ O7 [% h" l" \! y1 D# U
4 o8 Q1 t" ^! J" T5 U ( N8 [! i6 S% F9 U) z9 H5 U+ C8 h
; f2 l# C( X$ w: _4 _# O: ^: o; m% Z/ X. T
z' E, J: f7 J7 I9 [
8 y; p7 t2 I, R; N* a7 D
# X& ]' C9 U; `$ @( v 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 $ ~( C; M' D$ X# n$ Z
+ \( g8 X+ ~7 {' ~0 a$ t1 W
) X, g0 j3 h/ K
8 n6 T4 T9 ?, P6 b) z
. h7 j% j& [# P- [5 j3 H
' Q6 a, X" Y5 r9 _/ A/ v" e' \ |( P
( ~, U) m0 t: `2 q' [' c! G 4 }$ p6 B; m: J. G$ X
' J" E" v: Q$ F) k
" I% w& N; l$ m2 ?- A N i# l
( ^4 [* [( i0 n& N; s! w1 j2 z
+ L; n( Y, q5 | 签名信息
* v' T* {3 S) Z) y- ~) C
% p8 V1 m/ O5 @8 D5 H1 l( a- S0 x
% z: ?* f8 s/ X. l' n5 S 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
3 J6 O4 C. ?! M9 f
+ P, @& ~/ G& R( s: C4 f, W4 m" s4 C1 M( G3 n; F
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 # v4 f% T4 d- |
, |; [* q4 @: S6 O
* K T/ _# i% M# f6 T 在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 ~, U! V4 T- l" I* ]! v
8 X3 p, C* I0 @. B
: V5 Z. [( J1 q
) a' ]1 ?2 D1 n2 j6 O% ?' P
0 ^$ [2 \ D$ y, |5 |) B
2 g1 W# q* ^1 `& @ 7 V% | Q4 C+ f% C; G
6 s# B9 Y. n" @4 E
* U' W, {# @/ q. b7 k- |+ H
android签名的数字证书的一般都是采用 X.509的国际标准。
/ P: u0 b$ @8 g& P/ J. V; T7 I! ]6 H
5 [( a2 ^" Q7 x- H9 J
- N! A9 W a5 g+ L- C0 R% q 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
/ \; {$ Q+ v# h- T" Q+ u# v
2 x N, N" I% u3 u, S
( B) _. `; @" i. [3 o. p 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
t C0 m' s9 W k8 D6 h* K7 T - k8 ?' f. t* J7 u
( y- n5 A* Z( {; t ]! y5 C
, l9 l) n$ `+ i/ M& l E- L3 J& l 3 a! d0 B+ @) k7 j; i6 T+ V q
* @/ M h9 Q- M; x + T) @0 Z) d5 G8 t7 C% P3 M
1 w% s% ]* O. U6 @8 n6 |: S# h; X1 d* J1 y
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
4 r8 q, t/ y% m& g# g F2 |
& w6 H$ g8 n9 T! f& }( G4 y8 L$ B9 [; b7 t8 D/ j' `, f2 y* M- W
! r. S- G" d4 a; I
2 v5 d% ~! _& Q7 r' d$ |
6 x! m% G3 u' l2 j
、 & `0 c2 b; ?6 a# ^8 a) ?0 l
& d( _6 t& z7 x( L2 T$ @) m$ y( ]; z8 _$ e: i
% g! r- {; v& S2 w2 Y( A+ D4 r( @* E
/ r* N3 U1 S4 }* R6 i. M* M2 u$ z& M1 y8 N7 z
权限信息 ; [/ K2 H& b5 k/ q
/ B. U+ J! `+ D% l; V8 @
4 }" T2 f; i# ~( t9 E. }% b9 {
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) ! X. [! y- Z; R$ J# ~
# u: P" Y3 H7 ?- o% J I5 R0 @+ i% [" f
7 N9 w c/ D, Q! F* K
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
# ~* G) f6 }, G0 q! b9 }4 N c( A/ Y6 B* b5 k+ S0 N( O
8 |* S0 ?- N2 Q4 r& q0 \- E6 k6 T% H
; w i1 e( U8 D7 l ; t& ?/ a, f. H/ Y" p
% G1 n6 O% _/ ?
# W. S, ?5 b' G, b& w
% z; |# Y' f9 K4 _% \$ F( u% q, I/ @
下面对这个APP的所有权限进行详解下:
' I2 N, S+ J( f4 a
/ V" B9 _9 G, x; ~1 ?3 m6 y9 a- \: ~& X7 w( x2 [" A, o' `
android.permission.INTERNET :访问网络连接可能产生GPRS流量 2 G& ]& Y0 e/ c1 j; Y) ~ X; {
+ n! x% Y. D# N0 M9 \
1 @1 f) ^% s+ c5 |& u" b" Z+ @5 |5 k android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
& \3 v6 z; C2 {7 M% u/ e# | 0 ?4 x" M7 M, \" q8 p) l
$ l, Z+ C/ S8 T android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
+ _4 R0 X8 U( a7 b- p ! n8 k' u3 m4 ^4 m, L8 h
: b" h: C# O4 A# V3 t8 d
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
" l3 M! B1 @: U
8 g, l, d6 |1 B9 c) Q4 L- B$ j8 z- h, k! i7 |
android.permission.WRITE_SMS:允许应用程序写短信内容 * R I; E, _" _6 h" N' N. I( r
. S! A [5 s+ @# {5 J
( W' i, e$ N" D; |$ Q3 ?' O: B android.permission.READ_SMS:允许应用程序读取短信内容 ) J( a8 y1 O: C2 n. H- V& a" v
. s7 C; d# N# k- I% A/ z8 l1 Y
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
' H0 W/ ~3 T; e
& G1 m$ ]) m7 C1 J
. K1 }& K2 E8 w! `8 z8 m# G" O2 j9 Q) s android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
/ H+ c+ k# P1 ?" c" N% n0 E
2 J2 T- ^! u" V! e& _: U
% l7 E+ K2 W8 }5 x2 g, S- K) d android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 ) R: t& V: R" G
3 Y3 g- k s, @% _! F4 s" ^( |, n D
' X2 d6 _$ g' t! q android.permission.VIBRATE:允许振动
m; s4 U8 q4 f
: v! Q( g6 ?: V0 }- ~! ~. t! P: w7 k, p2 ^6 m
android.permission.READ_LOGS:允许程序读取系统底层日志 3 m- [% ^# j, E2 z8 d6 p Y
' T( r! ]& `: E0 g0 I; R
) }& b% a) N5 b. z+ H android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 ( m+ N- y1 W& l# m4 ]. M
, g7 ]# h6 S+ g) U c9 o3 H/ x/ N! f8 |
2 Z ^6 y+ t0 M! y
- m0 @7 t7 ^9 r' \: S
8 K' H* g1 O5 L; o& G$ E 功能信息
) w1 C7 e! h6 p% U+ f# j$ _: l( r
3 b( @2 m& J6 Q. c; ^+ `1 A" a& `+ }$ X# v
" r1 s. C7 }5 a( t- `- J7 N
# r9 b4 _5 _! ]6 M
8 r% D) ]$ ^9 r
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
. q( |1 [5 t: T; d+ t+ F% n * c2 H1 R' U l) t) S
+ K4 r8 c2 k I! ]) t Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 , D4 z. N6 }) T& E$ W( R' J
$ f0 Y( W1 V1 z4 p! K/ e
( l- Y7 ~/ B' ]/ X+ X& z
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
4 k9 e9 M. s# Z. \: H
% F; l. b& j/ G. ~- x: ?
9 R- s6 b8 H' L# U8 f 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 ; U" j; N4 q$ n {7 g( X5 l7 f
/ |$ e* m. m8 H! K3 V* G( c% a
7 z/ [% u4 m2 b1 h% K( K
: ~5 q0 i/ \ s0 O# T
; k7 `) T( x: [! i! V, X9 i$ [) v0 D1 }& f4 |" Q4 J
* R4 N& |% ~8 B4 N" b
4 Q5 u9 e) R. P5 x3 b. ?0 F4 U1 z( D% F B) J* q# v
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
$ L& S, \' a2 N! B# `! y
& V8 ^$ Q Q! s! f& ]
8 A& Q- B5 Z* ~" w, o! ]6 s8 S ' S# e2 [4 Z4 A0 g6 i& j" b# F4 U, o
" y6 p! w' J8 Q3 R- O# X: M
" u7 Q% Y8 e2 q& p& h1 _& C
; @7 E8 N( j1 b$ l, P/ `7 ^7 f
i3 ~; H7 c D3 Z. O- d6 b; E6 D, p, U+ v6 t( D
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 8 B4 }" |/ _& ^+ X# p7 M ?
1 N6 B3 i1 e" c" L: A/ @: i( t: W: `5 \! w; ~$ H' q
0 L1 L( m! j+ y( a& N% d7 x
" N3 L2 u( U( g+ w& C; E0 L1 J5 h: T. V( P2 i9 l) c
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 ( a# o A, W& W
" ]: W, q# D6 n% U! R
) {# a: i, ]! o! H/ Y8 u; V" { z . Z% Z. [) c1 z; \
1 P/ e7 ~' ?' K" U1 \# Y t
; D8 b% C! Y1 @- s. H6 O1 o7 Y
/ b% V3 |4 F$ W6 T, Y
1 L9 r/ U' `( t9 G. Y
1 X$ j' j% X; \# l# `
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
- @- a' i0 h( h$ ]- X- q, T * G+ H, D' a* C/ a
* U) a+ x' c$ y+ m2 I3 I
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 * b# u0 @( d9 U2 O6 N' `( x
, r7 y1 ?, c. H' N, _2 F+ u5 C
# P2 e0 v7 W% Q' b' C7 r
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 # w y5 J+ q9 n* g: }
. h* R0 X% j, {9 r' S/ F$ M- z
0 m) N& q2 |5 \8 @5 m 开源的luasocket代码可以参考学习下
/ a9 y* m, j. L5 r) z3 a* L5 |, x 3 b2 M, N, B9 @
' M8 @( [0 j: e2 H; @ https://github.com/lunarmodules/luasocket
2 g4 e2 `+ V: G 2 z* t' K7 w0 ~+ i5 H* E
+ _: f) p8 _0 Y3 b
https://github.com/fengye/luasocket / D: _% ~. k3 I
+ x [4 S; u E% L
# w; G# r8 X$ [" Y1 I
/ C7 j9 Z- r0 I! i$ r, r0 }$ z+ P/ a
1 Z+ |$ P* K0 p' v" b9 ]
/ X, y0 q* W8 I 9 b% ]7 [* m- m! `4 ^
# u! v T1 H9 i* l p8 c
( q; e8 o' S0 n) U0 j. a5 c
' ~4 I1 K% y1 a9 }+ _- p/ y; U, q
5 ?2 R5 v; B, |1 z0 t7 ^; c: L# v/ N
) m4 `8 v' T/ Y
: N) ^( O1 M0 @- |2 P! E 3 Z+ y7 O8 l r2 V2 b0 x$ m
* f+ l+ Y. K, s" E 总结
( Y6 G2 J& W5 `# ?1 W! t* C! ]# d( f$ h
: J$ H; x+ ^; g6 I( ~; D" X9 _
% P/ C5 H1 U6 i! ^ l5 a+ c+ a, E0 O+ x 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
3 M' C% W5 P+ }8 T& A2 }) t ! N% ^+ ]2 o( E4 c( w' s
8 e' l+ v* R2 V t) U
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 / ?0 {6 E8 f# H% |4 i7 \7 T
; d, l$ U3 @1 v1 x
/ H, `8 f3 e5 l, X1 z1 E0 {1 E 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。
7 f# C* k7 I% K" X2 ]
& m( u# v2 x6 f( y, j" a1 w1 H4 m" r- |" j+ i6 `, a) ~6 p
结束 ) O0 A/ C, w! ?1 H) _
* k2 l' d1 N/ @4 T2 C) z; j6 R9 E
5 u5 r# \' p' P" d
【推荐阅读】
" A3 T- b5 X1 @. l5 }. U2 W: D + X' w+ t1 h- `! @4 f# ?* }# m! ?
4 M% `4 N9 h* K9 c* {9 k 对吃鸡APP的分析
; _" c# ~ L% ]' ?, R . ?9 B A$ a* e3 |- L9 `
3 Q/ U9 C7 j7 q; X9 g1 ` 你需要了解的APP安全 - W& K& m1 p: ^- @( @' ^& p' H" T
6 w0 h. i4 G" f6 O( F
* z- H; W) C, o" f' v# f 你需要了解的APP安全
( i: C7 \8 I5 G - u1 o7 P3 ~& _
" B1 y7 h/ C3 a2 q+ }" d
8 n% j/ Y- B$ |/ D; |" \
|