' k; {5 ?+ `: {9 B0 _
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
4 X4 ^) [" P% p- S6 w1 f* h
8 f6 X2 p% \: ?# p
2 d/ x; J& @1 y& G; f. t. G 2 ~) [$ Q0 h0 O+ A! z( a& u% Z8 G
1 T+ E5 C/ Z; _" h) M' m7 K, S
r6 p$ C# \2 l, H
8 r6 W# v7 D6 T. H. }3 p 4 @9 @; s/ G3 J
# F; x: L6 E4 `: P- h2 i- k% T 下面就以开发者角度进行解析下这个APP的功能的实现原理。 , x0 F# i: i, X; j1 l2 C* w; K
3 Q5 t, @$ x. ^' h. T$ ?0 s* Y5 d1 w; A8 B
) G, ?+ _/ w& L2 V! T0 R! C8 Q5 ?
8 a+ D0 p! G: A! c
: j0 Y s1 H3 p& v- d 基础信息
4 h6 P6 z( D8 p8 Y. u3 d" Y8 L / `" D! n t( {5 e
. n [( Y0 \& w) B0 w( p% x/ z 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 , |% V( J; k2 {5 {6 ^1 b& ]( @
* j& m+ P: d% x# X. e2 W$ n
0 p5 f# n3 b. @# s, t) d; h/ N- Y
% T E. w- @0 b n4 N; X
5 U% i: ~' y+ [/ s1 l( n ?4 \; K' A! Q0 w% q6 W& F- R: ]8 a
, v$ i @# n' A/ g9 V$ n
4 Z, g2 R% e8 l6 H$ z
( P! b4 k) r* X+ _" h
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
% I) _9 o$ x( p6 ?: u; z6 x6 ?8 Q
3 U% Z: B8 A7 A# { }% T
. f; p3 A" {2 Q' v # X; h2 b. }4 k3 Y4 w* N
. z. X$ ?4 M b
- G' O7 t% e' m1 J - V0 _: l0 n3 r. P2 d! z: d
6 Q) q' q$ S+ m" d! n: O+ E% ]7 M, z* p8 |( e
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
9 \8 J& }/ M [6 k% Y. a7 @, O- s + p1 c. F$ f- N
& H" R) S' b( Z) Y
0 t1 B7 G! K5 F9 T u% W9 [ ( R$ d3 P& i/ T- W* Y
) @- P/ L5 W* i; I- a
# V& ~; o6 K- E, D# Y
8 }3 O/ s( }5 L1 {9 v3 d' k* z5 P1 Z
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 ( V; e4 Q: P5 N% s' u9 Y, V
7 R& ~5 p5 X; f0 q- s0 _ A' N! _0 y6 ~1 C' a6 x5 G
; V, h! f! l7 A: v- [- X0 L% y- s% @ , ]5 p/ v* X2 F G
0 n D# X, T( L( g3 e2 U
* W# X7 L! r' q 3 _/ d4 |. ?1 M6 G( a# ~0 x* b
, a) S7 I5 ^" e2 s7 l 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 ( o5 H. p1 w( P
0 S! U2 `2 P1 x [8 y8 l% c" B! c% R* o! B1 k( ~8 ]6 S6 I7 `
4 k, j# q: q' \( i% x! g4 ^8 s
- V- ]# F8 x( u1 ~" _* l. }
5 R# z8 \9 N; Q1 q6 N8 B6 e/ X, P
Y- w6 D# G. B4 q+ A1 m, } 6 b3 w$ a* d8 e' H
5 W' H! v& S' C( u. u
) U) ?; D! l5 l" P) l% _& v
; @! Y1 s" e; a2 j9 ^% _- j4 U
3 y8 j- [5 h2 H0 L% g; ^. ?/ q( r 签名信息
. ~1 z G, Y- H1 E) J O4 e . ?* N1 J; @+ N: C6 {+ U7 }) `
! Y6 W1 C, R6 x ^# n, T9 S/ Q
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
1 b/ I* S/ V. ^- b" ? + J! |# A7 n6 J1 t- c4 P3 A
7 G# m* f" N& u1 S# X
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
( k' D1 d- r, w5 j5 f- h# V
. K B% C h J% K2 E. }5 i& J5 p/ L% M5 f. [, q/ X2 E9 E+ V- Y
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。
% O+ I' a6 W+ w# q# Z/ o; @; y+ B 3 y3 Z( y( J) Z( i9 }
c1 i7 I0 o0 }( x2 u$ r 3 s9 ]( W. Y9 h; ^0 j5 ^6 K6 Q
. j7 S: W( J) k3 G/ r$ K/ m7 X( h5 u" D0 v3 t. Y
{) d- {% g7 w: j
3 R% F2 y4 P$ _6 H
]) T& R7 F" v3 k+ S/ k: r- S
android签名的数字证书的一般都是采用 X.509的国际标准。
& d4 ~6 l5 ]: B) T
0 ]7 q4 m" m2 a3 Z7 G: B6 H: W* k4 V8 A" b) e% {, Y) m
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 8 e9 V& N6 v5 C$ o! l/ w
4 j! i5 ^. Z: k$ ]* O$ u$ `$ F0 C0 N
' h- v" j+ {8 Q$ ]$ O8 ^3 u# Q4 d3 Z 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 H t7 C" _+ @ i# ^
: V' G; |& m8 r$ `# O+ ?+ g; r% M
- a0 }* ?. U; A3 o- S! l ! s8 h+ M/ l9 ^* q$ G
0 w9 r6 s0 K3 w
7 y: f: \: W" p( ] . S. S1 H: ]# O$ R- X0 n3 w
* s3 G/ C2 g; X4 v
9 z9 |- \5 @: C# ]% B) B 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 & ^ j1 W. l) Z, Y' e
" `. p% C& y4 }9 m8 n% t% \1 M x, Q
& Y- Y# ^8 f# v, N# t, n
* A# c' {* K+ T3 @
( A9 K! ?& r$ Y0 }# [$ J0 _" E: K6 A
、
) D* M* W' ^" z- T+ T; L" g& f ; I6 S1 s# n: o/ ?3 d
# i& m& P" k5 p& q' f1 m) Y
1 i) t& ~3 B" S1 M! h; [2 w
X7 c& u- ~/ F6 Y( S" l
) j+ q* ^0 u, B1 V5 e 权限信息
! b9 z; G* U8 |. ~, j! Q% x+ Y6 v # P% [) c* Q( D, y& {
[9 x3 {- a) b0 D8 o+ n' L* M
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
. E: N1 q1 C6 c( Q4 {( T' K 1 F* m2 v+ h# Z' ?/ S0 G" R0 o
( `' C7 h4 k" i# \8 S8 H$ `# j
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
2 t/ ^: j" r! i! G" Z7 m+ O' y 8 W2 Y' R& N/ I& `8 R
( |# Y/ l* a. O) G+ ^ A" b4 y } + O9 a( v, }+ \
' k9 q7 A% T/ D4 `- ]5 R4 L# g. }
0 h+ p5 r1 Q2 @6 Y* l+ s y
/ }0 M8 e$ a1 C! _
2 u$ A9 _# d2 m& J" d3 x/ s. |8 T( o$ d$ |; U$ B6 x
下面对这个APP的所有权限进行详解下: , d. {$ C. G, I3 b2 W1 g7 I+ W
+ _& T+ X. g) J5 c* ~& }( O9 X3 k k3 k" B; i* V
android.permission.INTERNET :访问网络连接可能产生GPRS流量
* U& w: U8 ] ~: U" B' J
8 z6 H& g# d8 Z3 ]1 J' w
* y1 h4 ^3 q' e$ Q android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 : k, p$ L; a9 e; F3 R" y
/ Y+ O2 d! h! D1 K" x
! C, {( R, {: W0 _
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
3 b' G, v; S$ `" k6 W
3 U/ q6 q: ]* `
5 ~4 }' B6 M: j- N5 q! y) t android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 $ ?+ ]# G, \3 _$ G6 A
: u% W. R' B' M
$ U K; i6 O C3 q6 K android.permission.WRITE_SMS:允许应用程序写短信内容
8 R* h' ]0 I2 O H
) X& R. I. X, Y+ b9 B
9 n# }; I7 @/ q. [ k- ^ android.permission.READ_SMS:允许应用程序读取短信内容 + ?' q7 u7 M3 {. ^4 m
. P D$ ?. T/ ^* p* g* }4 [) @$ V' J2 z2 ]+ F! V" e) V
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
2 F; o) C) x2 p1 r
9 V Z3 o$ K! U6 W6 s" W
3 }5 [' ], a6 v5 C android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
* r+ t; _) @% c R3 w$ M , T; p6 P0 a- R; ~9 C, ^6 }
, A: C% ^6 J$ h. X3 m android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
* q' d3 O6 N1 ]) Z5 P( V
F$ w( s6 n, @; Z
/ d% D! @) x# g( b9 z1 \. J android.permission.VIBRATE:允许振动
( R; G) ]1 d7 ] & S1 m( } h3 h- c( I) Z, ^- ]
( s7 o% E: g( o5 ~ android.permission.READ_LOGS:允许程序读取系统底层日志 * p8 t. D {0 Q) J+ O6 G. A
" K1 h! A4 ]- F$ j8 ^; U% m# l* u7 h$ k I2 Z2 Q: Y
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
; d: w2 X: }; M/ d' T
1 Q0 g+ G# X1 D/ T/ D) H& ~
' B1 C: v/ N( R/ _! S# F( h
6 f" \7 z# h" r0 P( d ! S- A: r: ^8 ]3 _( n9 |
9 {4 D g i( A. U: C. E0 Y
功能信息 % F7 |5 Z& h0 Z4 W8 S
2 m$ i7 y1 v& [& W/ L+ {
1 O) l. t) F$ \* D+ |- ^) @ \. f; m
, b3 [6 {$ H6 L* S6 U2 ]
0 C9 T5 D4 @' i+ o) l# O9 e2 u6 X }! e: g% T4 U$ ~
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 4 ~" h' X* R! [6 W* j
Y1 B2 Z0 v$ z! M9 C+ J# x2 S
* g" W4 l- N/ a1 |$ y
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 8 h6 }; C( c! ~( K$ N& p( S8 Z
7 y( T& [: C# a* o3 X
$ X# @* c# R& D, Y/ _' j9 @8 v
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
. @; b0 J: \+ `% y) {2 W
- |3 w7 P# F8 R7 O9 G: v
* x0 D0 O- |3 A) A I. X% Y 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 8 V( k$ i9 L( S6 U- O
t, b; H# @; C" s& l9 i
. Z( V- V/ M8 w$ T3 Q & W, l, y. l, y ~' l
. r% i4 M0 n4 E9 Y) X& m; M$ I* h) F. k
( G- n& t8 _% d5 p3 t / i3 o# @: ]. s; f$ P
9 l' f( B' v5 L3 [ 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
/ K8 E2 R& _+ i! m + R/ [5 J L6 j/ L' ]7 ?
1 T0 ^. k' h- ^4 E) V0 Y
! I. p$ F7 H5 P# T1 W! u: i
5 ^$ x; f8 g2 I* S
- R ]6 F/ k3 F2 H* {" \
7 J. S# ]3 u, S
4 @& z) E6 B* q- y% U8 _) F" x4 m' w& V
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 $ O: G. ~( a \6 v3 c: x Q6 k w
% y( X: T* o) K# u% F, I8 O1 [5 R
$ c" J/ B% |9 }- s
+ F! h. S& @( m $ u8 X. r5 p3 g3 P4 t6 j2 C
3 K9 p' f. H9 ], ^" U& x6 h" I" c
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
% A6 J# l1 t* W% P i
1 k6 @: D% A. M1 p! R* ?( k6 F0 D( Z4 n
! t6 A; A N6 `1 \/ ?
& Y d% g' w( j) k" J- C3 H6 ?/ y1 {
4 g, U8 z! F L9 l5 i! `- r- Z* k
/ _; x/ z7 L3 q' S+ F+ U# \5 J6 |) b0 Z, m7 D3 M+ k
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
' j( y9 ^4 M, b9 O7 a, P : }# V n, v+ O4 t3 f
9 I8 m* N' {: X* A
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
1 ?# D$ W6 i* u- }% `( r + n% q9 [% q, g$ e$ _& \
- u. j, L1 u* W$ ?2 W 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 $ E! \+ d5 f8 o3 s( b( V
* c% [0 k' U2 g/ _* L
, _% y) T8 T$ ~& v
开源的luasocket代码可以参考学习下
R$ e) x$ F/ H7 e
6 X; E+ r: E! o, {
$ q( h/ C# a$ H8 u6 i/ B https://github.com/lunarmodules/luasocket
, q- f" h# e1 Y4 P - {* S5 s. T( R7 T3 r
( Y5 q" k2 j$ y( M r5 f& \! ]
https://github.com/fengye/luasocket
' b! ^" o7 K4 Q" T% e& N
$ c- o7 ~! h# {( i. D/ i% b. Z4 k4 u8 M9 R: x2 U
. R& e, T4 x+ V1 V% I# P
2 I# C" L# H! \2 h' X9 C+ z* K* K" i4 ]7 c# r3 c8 G+ F
! s' I, `& c( _
: d) A+ Z0 C% ?5 p/ y# e7 {" v6 ]% [
5 X7 c3 \7 M5 p% g3 v( ? . v8 h' r1 H. r* L3 W, v4 ?: G
8 q$ E8 E' W% f8 }" }
R9 ?4 L: M- Y% R. r, A$ s ! U/ j, Q) J) ?7 W. `
4 f( R* |- ^1 X i! U5 E
总结 0 o" i. }/ |& J% { f4 a/ a" L2 A
) e" k# y! D0 a! `; G& c
. i+ s8 n# X/ U& Y, E! Y8 }' y 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
/ g$ T7 n9 u) M! m 5 N, {- {, J1 q. K4 S( P
! F' W: Z, T0 A7 `8 I# j, Z
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 # O) \0 U! a) z; |
* n K) {& Z7 s& Z
3 s8 L* {! r6 r, \3 j( u9 D; f. _- m 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。
% [- @5 t" w$ C) q' X 8 s) y7 H. x' |3 r' w! E0 \& I
, g% f- S+ G2 N; R5 { 结束 + v* b: H5 R" S" h
, V) X" Y y+ v
; \3 r E- U* A1 c0 L X7 H+ b" ]% j 【推荐阅读】 4 ? |0 f2 p! b. o3 \; o
0 d" Q) q( T+ u! I L2 q8 R
, v5 x( h' f5 _5 F9 P/ N 对吃鸡APP的分析
6 h7 T5 [0 p# l ?7 O8 S ' Y6 J W! I$ i u4 I& H
. z9 ^# M1 b6 M4 s, V5 { 你需要了解的APP安全
1 z; p2 i& ] i1 ]6 p/ H. q7 P
- w/ `0 q/ i$ [" |
) V7 Y5 @" A, E" v' f 你需要了解的APP安全 " i0 Z: D6 l7 f4 [6 Z- r1 t
% u; n1 v0 ]0 `8 L3 z, t
- E: g4 d: `% p) Z) I7 p8 h5 b7 E0 u
; x9 k* c/ i- g' i |