|
1 J+ p. i0 g4 n) i 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
* O% t" i' l; x5 E
+ v; s; s7 O4 S I
! l) y$ C2 m1 U( W7 z ! _ K, N% \9 y' Z3 T6 M H
5 D! I. O2 S; b2 D
5 R, u4 x8 y/ _3 h0 ^, O* f. V) g, ], P 6 H" ~1 {5 w3 `# v; A7 ]
+ e( h5 p( O4 V; N; {# k2 x1 E v1 D) u! z& z3 g4 m' x( d
下面就以开发者角度进行解析下这个APP的功能的实现原理。 ' b! q& T7 R+ c* `: X4 K& @/ P+ ~9 Z7 x
& ?2 J" D9 o) w2 b# ^1 W
+ j6 N5 b/ a. n2 B , \+ i7 U& _! h: Z( i* z: `
7 a4 |4 u. l, f6 P
2 Y/ U& }3 I9 i M2 T* [0 a 基础信息 4 C9 b' F: t2 ~$ \- f
+ U G# q# l( u3 s9 c; I$ G: A* M
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 2 A3 N# ~4 j2 p! @7 y/ e, G
+ |5 O: d3 T: h) w% x2 z
1 F r' X' ^% x: D
+ Q. T% m- s+ }; k 3 |" J ^- E" U3 T( m
: c# v# P W2 a( Q8 S: r2 F
; _! A6 @& W; m& W* r: Z! [
' c" k2 Y2 S. Z. u' f! q, y3 ~1 N
* C. R; P$ r* h 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
7 o8 [0 L+ L0 A; R. Y ; d- H, ]2 K3 d4 G2 X$ [2 K9 q ?
4 \9 Q: a! j* f
! a$ `$ _6 l0 K3 q u( X! S; e
$ Y9 p E. X6 R: U# n; e) z+ u: A! K# u
- X$ T; P3 ^/ s. O
2 ?- @. E( A1 T. i: [6 l2 x- D6 b3 v2 g) W+ z8 ]! ^7 [
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
8 m; H1 E h1 G s( R% E1 Q$ u$ @3 O & Q! G) y" P. {
2 O# g( ]9 X k3 m6 _( b t ; H# h6 {, x/ p |0 w+ z) R# Z
. I- j. B" F/ M3 D, O5 a3 Q# L7 s+ t7 }
/ f& S5 a1 O' l3 [1 p+ M
; @0 J9 ?. u) s7 O6 J1 D1 H2 @+ q4 ]7 [7 E2 e
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 / R# a( E2 S$ A, V; ~' r
; C0 m/ d* g# N
+ Q6 M" P1 M3 l! L" r |
% t9 W2 ~: i# {- j& y( r9 T1 X+ { ( W- v" Z+ z: C$ h, v Q
) D$ C, c7 F7 k2 Q
z/ u0 H1 B$ x) \ d! r- z8 ` 0 F6 F7 K* k$ O3 x6 S, w
7 t2 R8 O8 {7 H# h( |" ?+ t 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
" Q4 P& \4 E$ S- ]9 o3 G
0 ~+ C- A2 {, u B
5 i6 f! I$ e! n) m% c& ~2 i; W2 Y 4 w/ j; L0 f0 l* l( }. n
8 B9 _; b2 o1 c: @2 V0 \3 L
8 `6 h4 P! m; V" s3 w* t- f 3 M! x/ ~3 g8 j% ^1 z% g/ W
; C) P$ T( { x! x/ e3 }0 `) j9 b& y N, K/ }
: ?$ d& G# G m( \! @9 ] , k% `" |/ v9 z
) k$ [2 \8 F' f: C3 G3 i. p! B% o
签名信息
+ ]4 H7 j" A# r D/ f+ O' c
M0 R3 b) R$ S- |) \1 i
" `" `: R3 b2 Z: ]' ] 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 9 ]7 w5 q) E% W5 Z
& p" v4 h- H! D/ \) L* `
& k$ W" d& t: w9 B% h# A- x+ O8 }3 w
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 + g6 o$ W+ Q' u# a* k0 |, S) K, k
1 `) \$ h0 X! S V0 M$ z
3 n5 K. o. O) X" @; V" g" m 在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 ) _1 H3 V# Y0 C- d( o
* J- ^. S/ L6 C* E- w: o. ~2 R' S" ], T2 J$ a( m
$ K% M8 S+ Y( J. {. h' }
I0 F+ q: ~1 }# U& g( Z3 p `) _ l5 M' n9 E
: }5 G. `( f2 M
; F* E5 W2 z. J/ t5 ]: B
9 U9 n a' z2 [3 [7 d; Y1 l android签名的数字证书的一般都是采用 X.509的国际标准。 3 C" h' u4 v9 U; T
, U h/ `1 L# v; ]0 H. k5 [
8 }- l( I6 D: [7 V' s* T4 ?2 ]
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 8 `! z8 I2 G3 D# d
4 @+ E! r2 w7 J7 E: R- R& k' I4 Y6 j8 A: ]/ ?* U
下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 $ d: [* x3 T2 H; w
- K0 j/ a; i! I$ `6 B4 s
8 r6 }6 p% m8 |/ { 9 d x! @* R" } d
3 ~3 E1 W% S: b9 t* a, U9 S+ M$ z7 w
3 L7 U& A. m' @ ( G% N9 y0 F c6 g+ e3 {# X
2 B5 C5 w1 ~) d3 O2 z9 u& l" c
% D1 @6 u- s6 B 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
% R* X& [ Q j( P9 J% `) g) x
* e& M) k/ O/ y0 o+ J7 k8 e) ?* \# B. O/ k& N0 x& D) D: M
1 ?' C& l) v6 P/ @ Y! N
# o/ ?( h. ^" v* Y3 B* \; [9 ^, x& H9 ~9 b/ I
、 . c4 W4 \) k- `5 L
' h9 C4 B B; l+ X7 z
3 t9 ]# S8 T% C9 T
% G6 {* A. Y8 N) l/ ^
( _8 n% s9 [% c. d8 Y4 }5 p- ~* K* X1 |( T' O5 N3 d
权限信息
9 @& m. q/ a9 z" E$ }" g4 F% O F& \
' z+ b: ~! o! C- U0 w" x9 ]. i9 R% |4 `0 b& y7 k# P
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
; i" S5 h; p8 w ( @% Y# M3 l9 w# ~* G5 }, S( ]0 s
) C) W) {+ N$ b android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 ' d/ d; R% T1 e1 M: m# B: B" q
% m, w! |, C- T+ [& k( `) M
' w+ Q6 ] l5 e. {% D+ n/ a
% h9 Q" }0 [2 t4 U P8 k0 r$ o 9 M- T: x0 g+ G8 d& S* x9 B
7 I2 T% K1 r. p% M' \' x) U
+ Y, z9 l0 c) D$ O1 n5 M/ u $ N6 }" J, ^7 J* w/ I6 C! _
, s* t: y* W% C* G2 m0 L) P 下面对这个APP的所有权限进行详解下:
% t- g4 q) }7 |- f* p, O+ c ! `' x! f- C1 ?
" U: q! [8 I' U" w# g
android.permission.INTERNET :访问网络连接可能产生GPRS流量
+ T8 e. v' E4 {) m; v i ' M( G% p, D% ^2 | j6 A b; D' h
+ Z+ Z* k8 g+ _5 F2 N android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
2 `. A5 ^" o9 x! }8 o+ M- G 1 r9 a6 g' Y1 }+ u8 @, _
, Q# W$ o+ f: D( ]$ p
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 / d4 Z9 t4 K/ u. a) W5 \' q
6 c/ I- f+ b- a7 f" `3 b: z
: c4 w& I( @; f% R8 c4 b: g4 r
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 . [6 \( A# R* P% }' y$ F: D
$ G; C6 S: P' K3 D" d; ~1 v+ d" J2 l u, }3 w n5 _
android.permission.WRITE_SMS:允许应用程序写短信内容
/ y$ p! t( W W9 v$ v% z
8 b- P: Q" V1 u& l
) `" [: n; t) g$ d* |0 Y# f android.permission.READ_SMS:允许应用程序读取短信内容
; Q5 t1 ]# A0 |& S5 E
$ f/ y f) k+ \- K1 ]( z. ]+ F1 c* s% U- I& |9 X
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 ; n4 A( n3 q( K; @
3 ~, C1 `8 N4 e+ }/ {; o( ~
$ y+ M/ Y* V% `$ l android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
G, f5 q) a0 V* W( Z8 r ) |) i9 [& A5 s1 C, C
& ]8 k/ P0 u+ l android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
% c/ l/ M" v/ J; w # n) N' y! g3 A$ P% X0 @* D
7 m, l6 M6 K$ W( ?5 _5 b) \0 }
android.permission.VIBRATE:允许振动 0 Q: }. R% F( u) r' t. y! z! z" d1 M
8 X# {- H% j% J& @) Z' g) D8 _ Q6 m8 \, X4 @1 O! e: ]1 i4 N
android.permission.READ_LOGS:允许程序读取系统底层日志 , }& I* w& ?, q ~5 O
6 H+ E R+ g& o' B8 ^8 K [" E3 k
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
# I I% J3 }' D, z $ ~+ l. R, \7 R$ O* O
4 x8 p# C5 l) p! R6 _3 {. Q, ? + X. ~) o& [1 F$ Z- y$ e
. Z& ]( H( J. K! F% }
; H; |( a7 b' g
功能信息 ) ^9 E) u$ T; I2 a) T/ i2 N5 F2 b
& x. G' ~8 i- P& @% g U' }$ [7 K
5 Z( r: b' K+ F
6 Z* ~5 W- h7 H6 j1 q7 c
% a" {: Z; I; F. {* h
0 k+ `3 s6 \ x6 S0 N: [ 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
' _0 z! p4 j1 ^: Z; b2 h9 I4 q 3 F1 H; Z7 {+ z3 M T& b6 e
- p7 o: T. N% O2 ~
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 3 v- E; J/ f+ W4 g5 ]7 k. M
' H+ R0 M/ N4 G( H% k: d
r# g p) _2 S; {: I% @% }' i( E9 m* A 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 $ \0 ]) L# Z7 I. s8 _* ~
7 x. n: x% t2 ]. q* N
# P0 u9 d8 H& p% O
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
4 H2 I' D' j2 f) k+ G9 X6 K' W
" c$ V$ I8 U( Y9 h, b$ y# B( E4 N6 {' s3 Z" T4 D5 X$ \4 Z+ E
8 T `: A' |- z1 E' Q - c3 K ?# ^0 `$ A# L. y# n3 ^# H
# U2 w' N5 k# ~ p- z , R3 N5 T, U4 C
8 m; ~: b* N2 w
9 H A; d+ J9 ^ 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
( ?% y+ s3 \6 A7 `6 q 9 M# q0 Y* Q- N: g
( m8 Y% w: Y3 w
! M! s _; J$ N& e6 l ! j! ?# d, [9 b" d' e: Z/ a
- P: d- M$ R- ~1 n/ d
9 Q& {- H4 N: G* h2 ] U
' r% I) _# p- M4 ~' h* B! k5 ~5 R, ]/ |6 |; e4 A( X
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 % N6 F2 t- |- L2 O3 _
: a3 X2 y) J5 ?0 m# ~8 y* t5 ^5 G' a5 O- V, j; P( Q8 {
8 f2 I4 ^0 \% L" k
$ }! V6 i8 `7 Y( E% W: ?3 M
( R2 R. X& u) {6 m! ^- v1 d 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
' l+ W0 t# a: t! T/ A3 O1 T
# u- s/ @; y' ~, ~7 _+ n8 q# L$ I
' X$ g; w) }7 _" q% U" d6 S: y& y: v H) s
% T+ s* t e* c! o( d0 a ) Q& Z+ }1 C8 m. t" v# Z8 O% q2 r
4 ^& @' Q7 s+ |2 |
; u) ^; u8 h1 U% F3 I2 ?" O/ L, }+ V
, y' ~% e) [5 q/ v' v& U4 k: f
! r& a+ A- n" g8 S& ?; E' ^ 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 1 e8 a$ j8 }6 I# ? {7 @- L& w* Y4 ^
& | H% C7 j8 k# n1 _9 P
. ?9 b6 b& b# g' ?( U4 Z LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
2 t# H$ e; |2 O: f S& r
/ S* l) M2 F8 C7 [+ C" x7 e- u1 X; g( ]/ J- w3 q- P* R
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 7 ], n( B1 E9 m* r
$ [# o5 k5 u; ?, G% N m1 C
9 q1 c$ W# W* \; v 开源的luasocket代码可以参考学习下 & s1 o% P6 X+ c/ D) R
1 C8 i9 p4 J4 i8 @) K+ ~
6 S; ^2 j9 ]0 ^& d- s
https://github.com/lunarmodules/luasocket
7 B& D$ Z1 l' {4 i, L" O ' J4 E+ @9 t( [6 Y- r3 |
$ Q! k& l( A7 S( M
https://github.com/fengye/luasocket
- ]" f) |! D Y9 l+ l% c
6 W' l2 y S+ @$ h8 V( r" s
2 T/ M6 ^+ ~1 O O6 b
* g. z1 a- \: K+ K' Z2 {
1 z+ V) [- E5 o, F) o& R5 O& y& L9 n
. q2 V' N" V/ J0 \ l2 ~" D
8 }# Y- S, h7 l3 O
# H2 r4 R+ |3 S. ^/ L; k$ D* s- R6 I/ B0 d7 ^4 X
) D5 W H" ^5 d
1 ~) K3 A4 F, Z' @7 ~
7 w& x. g# K% ]8 f1 k2 b ; T) h/ X. Y. X1 v/ ]/ p
9 f: X5 c2 f. d& [6 e3 R$ l
* d1 Y; k' j) o ]/ n& B# o! ~
总结 8 V% `' n/ b/ g% Z
( W( z! n% S; y1 i
9 q* Z9 G' t1 z! a* A
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 ; m# Z* F( u: G1 H$ C( J
) A2 C1 G! _, s
t3 w2 |3 f0 J0 z 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 * W5 M2 |9 A4 K8 z, C6 W
' Z3 E& t4 u$ L8 A6 d1 d
; l5 B, a# _6 U6 ` 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 , w. z' W5 n3 g8 O
* l3 D+ y1 L4 S& }( h7 G& V
/ x) X4 [7 Z9 @7 r; q# S 结束
& b* ]; L6 W2 Q. V& s$ D V8 g0 |, _) E/ y
- Y3 j/ y+ Z5 V
【推荐阅读】
6 d: h+ L* a2 _7 h* d. F
! E! ]8 r7 H: M% ^ I; t, _! @$ L: ~5 v1 r. f- I& a! ~! v
对吃鸡APP的分析
, f% V7 e& m# l$ y( A 8 Z5 i4 s4 L+ R3 G
6 P$ j) T1 R7 @' D7 C0 p& I+ A
你需要了解的APP安全 " ^( l. E. v& G8 H. }5 D
0 T W, F0 v ?' K6 N% D
1 n1 k0 A4 x% M0 g0 ~! U6 U& b
你需要了解的APP安全 ) U$ j6 ~- l) {- s" v6 C
* t9 n: l3 y* _ ?. i5 c6 H/ B1 S- q U; ]# y* ~
- Q4 o! k$ L2 b9 x" ] |