|
, i- i3 a6 p) v4 [
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
4 ?& |2 M2 S; u6 W/ _ O! k
9 L& t w6 u5 o$ G' y
8 l0 S8 }9 ~0 Q8 t4 v
. b% p3 h/ P; Z
% E! P! s0 a. `1 k9 o! ?5 @
) E$ G# a6 s5 i( p * R' j" n5 x5 |% }: ^! g+ O
) z0 d. Q& J" X$ m- I0 c2 [) {% V. `/ q1 p# w
下面就以开发者角度进行解析下这个APP的功能的实现原理。 + v# F# d; Q% v8 n6 L Y! Z
# K q; T% k% C' ^
1 S+ t% p8 x' U9 t9 W5 v6 D# Y
+ T. v# A& S' |" y
8 V \. o8 q* j) G
0 R6 P# h# `! M _, g' { 基础信息
( ]8 H8 u! d. ^' M+ V( J/ b. E ' h4 U# H" Z4 O4 d# l; F
: V: w, P% `4 M% _7 m) m, l
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 / S$ _; e$ n6 F. z2 }, k6 z
* p4 D4 f3 e) ^0 h$ U* e5 `$ [
1 i; D* q# R- A+ {/ d1 A# O
" S; y. f$ M2 B0 e/ m7 R
7 X: g8 x5 \( I% P5 b# r
5 T& ^9 X2 T* \6 ]3 {( f! K
/ Z. F- O; b* O% Y" J: ]
: y7 b4 X: }- ]9 a; c: T2 w
* X; [! U8 x: I" m c' | 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
0 @% P6 \- a0 J& a, f ; i" C: p" c. g. w
& S7 m6 r/ x5 i! x: n( q
* J/ t# ]7 f. c5 w! @/ q A. I" V
' ]- l' Y. t6 u* o* L& ?
5 t2 B* x& Z% h; `( M# a + L4 d ~' m( N) b: n/ b" W Y
' [; h1 i; M* d- W! s4 N N+ b# {: H/ }7 k
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
& e, p# u+ @& M) g0 I% V
- N# n1 H5 N3 ^3 w
5 \7 @* v, w' k# `' d6 [5 Z' H! J 9 Q J+ h8 O! o, V
4 ]- e- }. g4 M& K0 s& |4 v
! L# z# n$ f+ P9 V j7 e" T" u$ C) I
1 r& |$ V4 x) h& l' t6 x3 F2 s
/ |+ A0 g9 i0 U) T3 h7 d6 G( J1 h& M2 [! @* t- r! K( w3 t5 |
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 ( A. y% P# h" v5 M- \* B5 N/ k4 [! [8 i
: o' M* t8 ^6 m8 S F
! S6 |* l$ H+ X( F, b8 D: [
! i; D' j& i T! g
& n, ?4 u8 y% H/ T6 p
( i- |! W! J" R" g. H
5 T: s9 y. O. B
* F1 c K1 Y6 J
. V- V* _! R( k
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
5 k6 ^) P+ T* I0 M
& A7 x9 d1 L5 n$ g
" \$ K- {7 V6 D$ a4 O5 V7 P
5 ~7 i- Z& h. }: z0 O3 T # H& F, i# k, P* f2 O4 s: ?
3 y& [4 f" |" Z) n" e % U& N5 m' V3 j( q
/ t; P$ V' F2 P9 L
# ?# f' E, I$ ?8 `$ ~3 M2 N 2 }5 @! W! _% x0 g
( R( t" T/ z2 _" w
: v: H' t3 V. M( X 签名信息 m+ A3 P8 u3 v$ g$ ]
u9 B% d. _5 Z
" Z, ~$ S5 e {5 b6 @
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
3 }4 s: T( Y A7 x4 L! O3 r' G. x6 o9 @
& g2 A( g0 D6 O2 v1 r7 U! O
, u3 |7 e% m7 M6 m0 [3 x. e' W 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
& f4 @+ T7 r& G! V5 X% K% Y 3 o2 v, g& f' S; W9 q
7 a" H3 Z7 c0 D. I# C) ` 在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 6 q7 g( Z: c8 Y5 p% a
1 P: T( |) T, E/ e8 \" f0 H' Z- z) @$ U/ ~! _7 o5 c, ^+ Z# E
7 t/ o B1 F! ~* Q
- |1 R, i0 S( F+ E9 w
! i4 u* t- w7 v2 q( r( }0 V4 {/ S
; J% a) U8 t# c; J' F m
2 K; `8 `' l1 U) V b' }( ^4 e0 c! e; s: i r; K% x( [8 n# S
android签名的数字证书的一般都是采用 X.509的国际标准。 5 D( G1 X0 Z4 u, C
& j! N$ `7 U4 _, Y8 E! ]" F! k
& E/ t2 f& \; s; z. ~ 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
( L) h& ~. j+ p# @, w% M& w$ h" x 1 ^0 L6 y$ k3 l( s' A6 f8 n- o& P
+ }, l O$ K% J# H) g7 j! t( j5 L7 k3 r
下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
1 z9 C) i' R8 T) ]/ u/ ? 6 N" g% j1 k6 \. E+ ]
3 g) i2 Y) X+ K7 n
' ]8 A+ V6 r5 a0 e! F
7 m( N+ G6 v3 v3 v
% _( M* ^- J* I- L$ ?+ Q) u% C ) |$ M2 _ L: I( I. s; @
( n# b" z; S5 A6 }5 j6 C3 t! j: Y N) J( G/ w7 G; `/ D
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 * S; @+ Q: N) y, E
2 Q# d8 o1 H2 [0 }3 j, M' m, t2 D
; K C1 G: o6 s1 F- R/ Q: V, y
7 p1 [) J: j$ t' A @2 V: ?* t / q$ k5 p( m n
7 y9 n' o. V& ^% t8 g* E5 [( }1 v
、 6 c$ l- F' e# h7 z3 {7 J
* E5 ]# _" } {+ N1 \% F
" d$ u2 f5 B7 i2 M8 b( s; K / P' E# T L# X, z0 ~) L! u9 s
0 W/ o# f# @1 [) A: |( M# n
t8 [1 W0 a2 H, E 权限信息 - z, O- Y4 U" `7 V* ?1 g$ i
/ t+ p" i4 P& Z- Z( D
9 X* ] `6 }% m F2 I. M/ [ ^% D* t 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) / }1 o. D6 v" ?5 Y; O+ _! l% Z$ B- v
- m8 m& {7 ]( E2 b1 o7 ~
* C8 W1 L* \( W, E/ T8 O R Q
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 $ k" G5 X+ w' n( J
+ o: p, Q0 g% H& |# E, o# A. ?! {
5 r( P, C: x7 f( L1 _0 `
1 h3 Z# G `! b6 }4 Y5 _" c" A0 @2 _ 8 s. n$ b0 \% G3 s0 U! ?& q& M$ U
) g, r( `8 V$ A; X
1 h2 p F4 B1 s# U0 D
; @$ U/ h3 m( s) n) h& l
5 w, E2 Z b; T. v( s% L 下面对这个APP的所有权限进行详解下: , b z5 [& P( G& W O
4 h4 l& ~7 v* T) W
8 Q. J9 n2 C n# H6 h android.permission.INTERNET :访问网络连接可能产生GPRS流量 4 f0 l" Y$ n2 g% U4 }- N
" k8 J* f+ B: M v) }& G# q6 R/ [8 N. T
$ Y9 k. p9 E G8 S2 t5 P# \' @* G
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 ( b" J! f/ S$ |: U2 S* d5 X$ x
& w4 [1 ?: O! L5 |
" K% F" A; v& @% X% l7 _ android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 9 f9 _( h; }4 s) u0 e
0 R* @7 Q3 v" L; @8 |( X6 g
8 n" i% _- F5 Z* i5 U android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 8 W+ F' L* C, F% R% d
9 g8 y9 ]8 P' p/ P. c& F3 N
7 |& a6 j8 E7 s
android.permission.WRITE_SMS:允许应用程序写短信内容 1 A- z. e z2 |
. P0 O) c$ j- d3 _4 v F
& H* e6 i- h: Q. I/ j android.permission.READ_SMS:允许应用程序读取短信内容 9 V$ ~/ ~. {* J% u' s1 e8 Y
* e" i; Q' K' b0 ?
+ M$ I4 z' p* R0 a2 ^# A; U, H- J1 G
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 + F' G7 ~9 z( t8 T
1 e- N7 N3 z+ Q2 _1 U
& R# i9 o1 a7 S$ X% V
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
! S2 H+ P# d5 g9 ^; I, ~! }
/ W; r% H# y Y! H4 v3 a) z9 Y
0 d6 w+ Y) ]) X9 s! p0 P5 g6 ~ android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 5 y/ c- W) X( I; w5 a3 Y
- T2 M, Q! J$ l
1 O) g( |! C [" E7 v" ] android.permission.VIBRATE:允许振动 ) m# D% O& G8 z! P D+ o
; d. @( e" Z. q/ X- x4 @% ]1 l
$ c5 V# k; { O: i android.permission.READ_LOGS:允许程序读取系统底层日志
/ Z+ U2 T! k j, A- P 0 X" a* h+ R5 i8 k5 ]0 N l
, \% s- T j- Y$ N3 C: K, P9 h
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 7 x, C& D8 ^9 l) n* C2 @
) u2 T# p& u1 i: J* u4 u% F& e7 P9 E6 j/ `
4 W# H" ~2 l& G8 p8 W
6 W( X' C) I I+ [$ |9 `1 c
4 T; c% G! }4 i3 } 功能信息
3 _# X) y& q; y m, i5 i
8 f8 G# @) p3 W, ?% a4 d9 {; P: v
' W% |2 n' A4 g( ^4 x
( d [9 K: K6 ]& A
4 a& b7 E ^# e s5 ]' \ 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 7 }# ?+ {5 k+ [5 T: f. `
4 S$ ~ y$ t: Z+ h& w* K
5 f1 g, s5 A# j
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 / C) m, B% f G6 @: g0 s" f4 B+ l
3 D5 i, v- E0 f( {+ [5 }! Y
8 a2 D3 m) r" Y) c9 I6 o* ~3 u7 N7 l 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
- c# l& W. d- h4 }& z- p
, d# h1 A/ A X
1 U$ m7 D& F* y 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 9 k m( ]+ g6 ~
) Y$ l3 R* I$ Z
4 ~8 o! F; |+ L, Q$ h9 v a
$ @5 j- {' L; O& Z! v5 T0 |2 a 2 c* k" s4 y5 ?
9 X+ @1 f1 E) c7 {6 @' ? 1 m) |4 m7 y4 c: @
. r% b0 z; x, |) r/ o g9 q0 i: T# i
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 2 X* ^1 D3 _( a, [1 r
- X8 v9 a" p" i9 p8 \
* V. E3 r. e- N2 J4 M
; r6 S0 F5 l6 O
! \. E9 e+ N7 V0 M& H( N0 u
+ G v# W4 E' C& @
7 X w. F9 O. m: @" p, \% E% G5 e & r4 ^$ @4 T' e
3 w1 F0 U6 \& \ _ 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 8 w2 m, p- { U+ R& R
6 f3 H7 ^/ w C
3 Q) d8 Q# x! G0 P
2 b5 t7 y8 @3 U. k; Z, y6 M' i
, F' k- n( D, n1 B/ I5 R
+ T* ^# o! g) _$ o- m [ 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 4 D! x/ M* O9 |7 _2 p
0 R8 p, v5 I" Y, C9 f8 } O
% V8 D9 o7 V& }2 J: O% e ! ]) u6 A) C1 C$ h R! v1 S; r
- K0 q8 I$ V6 c R
2 _6 n2 d( M3 `7 s8 z A
/ V5 ?5 k" Z0 F- w$ L6 {
* x+ }/ a! {! ]) E+ z# I2 U* b2 t& ~) A7 ]/ b
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 8 D4 k4 q1 x8 q
% E- z8 I1 ~/ k2 k4 W5 t* {
: n' Y2 P" ]" t8 ?4 S: f3 I LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 ( y1 N) q' J- d7 ]% \( K
$ Q. ]- Q% f. Y: e* [: T6 e
3 H, T# N6 w, Q 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 7 v5 v2 Q0 D8 z. I8 ?" F
# i% h' L* {; ]# N9 Q% U* b
: D) C5 w- |5 ^. [( t$ m; s2 d 开源的luasocket代码可以参考学习下 ) M5 w+ w; \+ Y4 H( {. B1 ?( I
$ v$ F4 B( A+ p6 p) X8 ?
4 |4 |' M! S/ X& X8 u' X8 {
https://github.com/lunarmodules/luasocket 0 T" k( m6 w, `3 \
1 I6 G! o9 f- P$ F1 A
" a. c+ B' K9 c8 T2 H* U: g https://github.com/fengye/luasocket : j7 x7 N. w2 k) S6 }2 n* V
, |8 M1 K5 M" \4 v5 f
1 b& Q* x3 }( z* O ! Q0 t: t0 J- T: u
+ i+ H- g3 g; O0 n0 t( N) ]3 R/ z) }- T$ `( b7 }
5 y# p! ]4 c5 u; P q
7 d' A: N+ ~. N/ s- ]$ _3 _6 L; F, G2 J
8 P( F1 C* H- n! g$ W( A
0 Y7 D: I% W' W/ @) _. h9 Y9 W2 P0 E% j: C; r6 [* W# }
! T+ U a0 H, v, Y
0 c% L* M: q3 F7 M/ h0 b2 n1 q2 u# J
总结
4 N. s) b2 E8 B8 ^ s) u
. N; J" {% ^6 s5 J. [* v0 i- U9 e+ Y5 {/ A- D
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
4 m% t) P1 x% N7 Y" Y
( K5 T* [! a2 D9 A+ k# S- I/ N; F3 D# x7 h$ ]( g! Q( J
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 2 w! I& m9 r. o9 o' ?
! ^8 L% U; P! n8 I G' w* V
; f9 P; _+ u; N. \- ~) w 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 ) I5 s" \. J& s1 W
& R; ]7 j+ M0 L; l- c" f' S
& O6 I* L) F# ^- Z 结束
2 y' V X9 X. H9 O$ t; C/ N, ]
! A' p, }$ T; L V3 s/ O. g" G8 a5 Y) d& `9 Z
【推荐阅读】 4 _; k) w6 R/ m9 ]1 g+ F# S' b
7 b0 P# G) ^. g/ x" S I
! I) b9 {0 a* a9 r 对吃鸡APP的分析
( K+ X! z, c- g' {. d; a
" d' ?8 G0 ?* u6 G& U. j8 r# l0 C
2 X [" d, N* ?# d/ m; S 你需要了解的APP安全
7 s* V: l; |+ Q# S3 @- L0 R- r) }$ A + z' Y! S3 j- n; F8 V( I
9 C N1 e- |! k4 A# y2 m& S9 I6 p Q
你需要了解的APP安全
1 }2 a& \. G3 Y9 s3 \& H `9 `8 p. y* q0 ^6 g
) L8 ~4 ~9 f1 _ ! [: g! m$ X5 Q k/ ~# A
|