|
2 D# c6 n2 q6 {% W0 S7 q8 `
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 + n: W( \' l9 D+ p
" T% y! s# E( {' d p8 ]7 v, `2 y$ Z! d. ]
9 t7 k# u! y" ^ - Y/ R4 k, T; ~1 [& m
! C. c6 c+ n7 { / ~: P: k0 B1 b1 ?
5 G: u# o6 d, f" Z
+ c5 B: a2 f+ ?9 j( C; j 下面就以开发者角度进行解析下这个APP的功能的实现原理。
; k' z; p- Z8 z4 n2 U
" O' L5 x& ?$ p
/ v0 t2 R$ [; `" K + z" I- l ^9 N4 X0 p
8 w' S, Q/ w" y) X! n
0 q$ X0 S3 X5 I8 ^9 W8 j P) [# Q 基础信息 / Y! b6 g3 W9 u0 w$ q' M; \
' W- \# G* S! D9 P3 O0 h4 h/ y" W2 }
# D& ^' N) e, ` C G1 b4 d 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 " _9 b# u; \+ M5 h# D; V6 h
5 E' c ]+ j5 ^) K( m; F! r1 N: a
% G X+ h/ l' u: W/ `( l2 k( m ( n/ H5 a% i7 J+ a
- m& a% y, q$ Q6 g2 n7 f, [
. r* r4 e. }3 H0 E" {
( Y& B' S" n' g# y/ f$ F
) a! K* T: k8 Y8 L
* z* |6 B7 S4 q# s6 s 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
2 S/ t9 d* G! ^2 Y
* [. g2 k9 K9 u- n: k) n+ N0 _, V
' I5 M/ Z: y! }6 b3 L$ E ! D3 A) \; F" n! f2 D
8 G; ?5 e/ Q3 }+ q8 c: h, z# X; V0 j O2 [
: c6 l6 _+ v: H2 _ p 0 K# G; o N( e& r+ C/ p( P/ ~! z
# q# A5 D' u) g" O g5 n: D
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 F- v4 k, X' w! _% u, k
+ Y/ o7 p. b# d3 c- P- d& Z+ T
$ u* M7 B$ }2 i0 x6 N
' V* `- J( o* e" A8 S
. k' U2 A# Y* m- t) o0 ~) U( P( ]
1 C3 C$ }! V% L1 G, q7 ^ - _3 a J! M+ G% d7 \( `8 y. Y
# a1 D; m: B/ K
1 Q: N& v9 m: y6 x0 b, t 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
1 v* y, i" H* J0 L 6 U, ]+ ?1 X! ]8 t9 ^: g
: Z/ K: b( f/ J' o" G3 ^- j
6 E3 b9 O4 l# }0 }( H
- r6 z, x/ v$ Y( x3 J% w( J
' r- O8 ?5 C3 r- u8 r$ z/ \ + v1 ?7 W# X. b {/ _* m2 r9 a M
( v4 ?1 H& U7 s; n* H8 b. J
; D) b8 W0 y: S
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
, }! L) e5 m, D5 ` ) r" z8 Q; H; ?3 ?7 F4 O
# _# _8 C# f2 C: C. D
' _( m* F0 s/ i$ H9 [
9 Q, g" P; j( e! t2 T. u& [. }' R
5 F3 U% ?( G" w; W 2 i1 `/ d- n1 Y" f6 \
% y* K) G, K# E8 c9 Y
) Y% u- p. p8 L5 D7 u/ A
& q' n& U8 E# p" v/ V: W& l
6 M# R. d' G* s3 w; ]: q! I, [4 R& b# }
签名信息
# {! A6 S) h7 g; F: p7 u, X' v ) w1 y% Z+ F! J2 a( m( X, D% v, S
/ t R1 [ L: e7 @" W' U
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
8 W6 }+ Q4 Q0 |$ J# ]& {: U5 u' L \
9 `" A" K2 h+ g( P4 [* N# G
[' U; l+ ^6 C. K" X 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 9 u/ @& Z) X( u1 m
2 x& _$ `: y! l" F8 S m+ c
) ]2 R. x5 H; h4 y# s8 g! h 在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。
9 ~8 F5 s% r- V, ~; u
2 s/ e6 R2 O/ p3 B5 ~& L/ n+ i
% F& ?3 C) a" u S & i5 ]: ~6 r/ Y2 {
( O# d+ Q9 B R% H2 h3 d9 b
$ h' q8 t; o$ x# I' \6 Q9 }/ c7 ? % R! z" l3 ^- Z2 @; } f
( d7 J, T+ y3 d/ |* V
/ }) e+ m, D0 t" _- g$ Z8 m
android签名的数字证书的一般都是采用 X.509的国际标准。 " W- T2 f; Y3 Q$ i
" _) h; O2 p( K- x Z
9 h: e s$ n/ x! E2 ? 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 ! q k- P) {# m/ C. B
' {8 z. D1 f6 V2 ~! |
0 P- `4 T- J: L1 B. o 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 2 @# w! p8 x7 x+ s8 a, d! S' c
, K2 r5 G! [3 v; X; y2 R
8 ^; [; t) Q! ]3 `) P $ F: m$ M8 ?0 J# k2 B- E( u
9 k( g0 ]; k7 D& T# I. i
( p. g' I" D' s2 U7 M
b' Q1 M% {, }$ ]: b ~
0 {- K9 f R# ]; b: L; p3 G- J$ U ?# X: e- o* K
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
1 H L$ ?/ T# f4 s6 t- Z0 ?# U- @9 D
$ X, H2 c4 R" w
( k6 m: U0 F1 F* m4 F8 `
- ?4 I# B$ J5 u+ h$ A8 Z 4 j" n4 ?9 G. k4 d
8 U) S5 W+ c3 ~* ? 、
( w6 u+ A! ?, c4 W ' [2 ]# q1 \0 B2 p q/ c
: F1 J1 }$ W, g0 ~9 D
& T6 N$ v+ _/ p0 |) j) o; p1 Y* ~
$ q' k; G# A2 G# u* D4 x# ^
: \1 P5 a- l& A" D W: m7 P 权限信息 : Z e$ s4 g% t* u) a% n
* w+ q4 x% C8 h) k* K7 I. C; G. F2 a) ]! n) b1 J
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) ; D7 ?1 z8 J3 h/ x1 T) \
: a) S; { C) }% o$ y$ u( F- c/ I0 x) C8 H) U
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 |. F+ t* ]: r3 J# D4 W
% |. u; ]# N$ V; d
, a- z/ z: P8 b5 ` 7 D7 m2 o, j, n" w4 D
3 T! M8 {/ b7 K& A5 k
2 ]7 p2 p" f# }" f$ _/ K- q: O+ q5 k
8 m: i( j$ q5 {# ~
# q* n) o5 o9 g0 g7 j- ~+ O
+ j7 B; x) |. \4 Q9 c2 q. o 下面对这个APP的所有权限进行详解下:
. z5 f. {3 h/ J' l3 p
, a b) Y2 S. R9 N- r6 o, y0 Q1 Q
Y5 e) Z4 O! w0 k. M/ `2 k android.permission.INTERNET :访问网络连接可能产生GPRS流量
0 }0 P6 i5 [) E/ o ' u4 F$ w. e- b% I& o8 K
9 S0 X- q$ v/ k% o, x0 t" a6 Y
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
' Q+ \! ]8 p8 y" L* U! `
; f8 f+ O; g3 B6 N$ Z" b- g6 p+ {3 O; W: V2 G) V
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
+ z9 t2 [# d& T- R3 y ) t$ T5 f" q4 G; r1 G% s( l- @, x
6 M0 c |' [1 x" e) _# W3 T+ o H android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 2 W9 r# ?% J" K- ^# f( R
. C9 R' e1 h2 S% B% k
; u! I9 q3 M& g" y3 a! y. }5 r, z( I android.permission.WRITE_SMS:允许应用程序写短信内容 : A! k; M, [: u3 M/ u) p( U" E
, A% p) t5 h% p
8 S/ {6 j! s8 s$ S) J4 c android.permission.READ_SMS:允许应用程序读取短信内容 * C" t. g; I) E6 A
" Y. a: q* ?; n0 k. h% p! |
+ Y9 }% L1 h K5 K, S, s android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 8 A0 G9 r& s4 h7 \, A0 k
9 S1 q0 i! P. n
3 L' O) S1 t# t7 e5 p* G% V
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
7 _: y$ Z+ j3 n5 \! @ ) a/ C( E) H5 U( O0 m( O
: h1 K& [' |1 s7 `9 ]2 K android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
: N$ ]0 t: F5 P. l6 Q2 e
) f7 V4 s7 c+ X) [& X7 T
; I- h4 I5 r: H z1 H- ^ android.permission.VIBRATE:允许振动 ) f. m+ p( ^5 W5 F) r6 ]
/ l; C: y3 k$ R1 S9 `6 n
. {! X" ]" f& x2 O) z+ \9 o% t
android.permission.READ_LOGS:允许程序读取系统底层日志 5 E4 n9 j/ z/ K( \8 b+ u( n/ h
8 Y; A" ^! C* }% |
) t6 z2 l9 R6 u0 m; _# m1 I android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 / W8 z4 q7 t$ o
( R& n3 S5 G/ X+ W* e3 [$ D* g
3 `5 s( k" q3 n0 A$ t2 O
+ X8 `9 v' S! z
' |' E* X1 {5 ]; Q( x, m
4 \" k c& f9 a6 M9 v8 A1 F, J 功能信息 2 J9 f* x8 M4 Z4 F- J
( L- q9 B+ o) s$ A9 ]; f! m' c7 _* @1 ~5 @
6 Z: a4 N3 J/ z * m3 u' b- V# K7 c" N' x% z5 z- | F1 Y/ \
6 ^; b& F$ c& I7 b( q5 d' i
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
" d& o% G! D( `3 Y
4 G; G* i% J! D! x7 _$ R% ~) Z) O6 }& T) q9 j- q! s7 A
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 " L$ n! o$ q* u) D& [# a3 t9 o
9 r5 v( F4 b* H; H) N! P0 O+ o- U& w! P$ V" N l" O1 L# i& x3 U* c
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
7 } F6 } V* _4 ]+ N# i6 g6 u
% \. M! j y) b) t3 A4 P' `4 w/ t( ?& |
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
* N1 v! J$ n$ n5 p# Y
- o3 o, a+ E8 w+ N
* G. M1 T! o8 e" V* l * R% d9 Z+ w! J- v" x# T3 U
, p' \4 O" s7 A
4 a7 R0 p$ l+ s" ]9 q. E
. }8 n0 P8 x: k
- F( i2 P K7 K! Y9 e) X \
) ^2 v7 B: @) `; U! n 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 2 O: u. R: h) _, [
4 }( k$ b. c* i
0 E. Q2 M6 a) e" F5 e0 N ' K1 L4 f" U( h' P6 B" t4 U
8 d1 G2 a" b# y- o
5 r2 d* Q/ e9 k- ]! X2 E6 h7 L Y
+ r# ?- z. d! K) @& n6 }
- e2 l- ?' P) p' w6 N
: J* ~' f1 p Y! o$ b9 ]4 l4 |
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
( V" D8 N( h% W5 h* f5 _$ s - Q, T3 r' r: m
8 ^6 ~) l* y, s* ]8 a- L
) M, ?# \1 _$ z$ c4 x) `
8 R, b# U, H. J9 }% e: c) z8 p/ r; R j& m9 B$ N
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
- m2 f0 @( I$ r) c1 c / b# P4 E! f7 J! R4 h/ T
. S; ] g: M* T9 j; X 2 I1 a! U6 @. ~4 D; s% m
( \ Y8 S6 V" g8 w$ J# s+ W: N+ N; y: A& E
$ J0 \ r" F7 i 4 H" k% p' M; _- h8 U8 ^" Q S5 x
: a4 C( e# P# C- n
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 $ e' J! c: c/ C
' ^: N' N7 Y0 {8 Y2 x1 N& n
2 _8 a; @- A1 \* _3 g" Y6 t$ `
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
- G) m6 F) M7 O5 \) G9 Q' D, f
3 D5 u% s9 V! T3 a5 t# e& ~4 I
/ j" H2 M1 m7 H. | 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
# f8 o5 O3 H0 }; V$ B, {3 O* V 0 _% d( U4 C6 @' b
7 p+ @& b- f# A' Q9 S* `
开源的luasocket代码可以参考学习下
* h- V0 u( ^5 k& K7 @! J
& J4 O3 f8 J8 M$ q. }4 @) D9 a* S3 c6 m& x4 h6 \
https://github.com/lunarmodules/luasocket 8 G. v3 [/ `7 x7 U
6 X, V ~6 x7 p# K, \. V' i* \
* i8 W9 W! h; s0 H+ {3 L https://github.com/fengye/luasocket & I8 Y# C% C4 P. u9 Y4 E
# x* @% y7 ~# {3 W3 M1 p6 Y% Q' U
/ n9 S. P. S' a4 F% ?& Y# i/ v
0 {% d4 |' p0 D f C # g6 h2 G' ?# D" P/ B* f
. v1 B# K& v% n
& N; e0 E! ?; F7 C7 ^" g! ~' z
A. ^2 A, `; V$ R( g" [! ^5 g- L$ }
5 [% g9 w& R' C; k3 D3 k a, u4 S* w" {9 i, J
) w3 d5 J v5 J4 P% S / I) { d3 Z% Q$ T$ N- B2 s @' y6 \9 c
: T- v8 n; O/ P5 \$ V
: _0 i5 I- l1 }3 s b" F& Y6 ?1 v
总结 , h% Y l! m- X; |
: C6 j; S/ Y, D3 t0 {* q0 B3 J
; I O2 x$ m. H5 x
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 # Q# D9 g Z2 A3 r& M
9 D; ~9 u$ Z: }+ M" a5 o
& M# B* ]- B, _6 m 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
% p: s( c; n. T- g) J# o; o : L* u, g5 k- m# j5 e
' }" ]) Z! A; H. Z) X
对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 5 }- \: O* i- i/ O3 r$ M
5 X4 f, O7 r: l$ G c
9 C a- A& |% I! M. @3 k 结束 B: k6 A. F: U5 p, P4 `0 m; M9 ]4 B! U
3 Z; Q* W6 h* _( k4 `) A# u, ]- R2 F7 a4 l4 ^( o4 E
【推荐阅读】
# M% ^* I- W2 O4 f A
# Q. a$ m- W' a |9 j
1 J$ P) C2 e! M2 d& e* y& B+ T 对吃鸡APP的分析 / G" F) a K4 } R! ~5 A2 |
7 o; @' s1 Z+ P- a& J
* s! p4 `! v" `8 o0 ]& t; b, S 你需要了解的APP安全
l' r' L" K" o o5 Q' x8 k" |
" D) e4 y' A' O: y* G
8 ]4 o5 _5 I; R' t% [/ v% K 你需要了解的APP安全 9 p5 y: w: h3 |8 Y# j `
& {) g- u# F( ^$ N) q
( _& ~% G% f( i+ E7 b
/ E6 f( Q7 c1 J' E |