|
7 Y0 A; f* S/ T
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
& O) J) D2 [$ m
) ]4 {: l% L0 p* n/ p7 u, R; S, A" d/ m5 C2 E$ \7 G
0 ]1 J0 H/ x; B9 k. | 2 O5 O% v" b) Y$ h! G! p
; P G, ^& s) ]4 g" t
8 s, J) J# P+ L) h5 ~+ `: {/ G; z
2 v7 j5 B2 ~) Y% w' e% G& v3 c2 C: T
9 W+ I$ h% ?/ ~8 I 下面就以开发者角度进行解析下这个APP的功能的实现原理。 4 R6 q: i, ]$ J% \& N5 M
9 a' F" m0 c) c' N2 y
! X/ t; ]5 y9 B) \4 R$ v% f0 v
* u6 \1 f5 f" U7 v. ~
( B( r) X4 Z1 i. K6 s6 ?( p7 V
* U7 K! @ p# u- n' y 基础信息
7 F3 p: W. w& k/ t& g+ a: [8 ] $ C2 s2 ?* ?, y/ K5 P& [" P' k F
a W/ \% g% H/ h; } 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
; ^2 F9 }5 O* t" Q' A3 j% ~
! V, h0 g& T+ K$ ?/ w* V; ~+ W% p) b& L3 ]1 _% P
) S1 Q" k) A% x _) r& h/ t 1 z* ^1 U) ~( S$ m: G) ?# u# O" {7 C. f
$ g, t7 e2 y5 J
7 r5 \ Q4 u; v- P, s) M3 L) I & `! ~; ?; T/ M
2 x/ a, E- F, w0 S9 W6 p 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
+ w0 w' N& h7 r4 f6 M
' a. l c5 w1 _! z* x* K5 p( a4 S+ A$ H: {
/ |& r$ y( Q8 V
+ ^/ O; l! N6 p' Y4 m& G0 Z4 {
9 Z6 t: T! W3 J# I& F' i
9 |/ J/ B, T$ k3 a $ s" c& b& A8 _
* V5 `, @$ C5 ?+ ]/ M
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
: p% Y" n; @& o" Y - N8 b( j' S/ N' Z
$ K6 G. w. S9 D- @4 l9 r' M " Z8 l. ~8 I7 Z) O
5 E8 n1 G/ `& q( Q
0 M, ?( |! S* n! _8 _
1 }0 Y. D/ o( i3 A: f/ P6 x
5 G% S( E& M5 x) t1 J( Y* ~/ ] U
5 J& P3 @/ O( _ 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
+ u: ~& i5 s$ {/ T. X# [, Y 4 I8 ? V$ ]" h
( c1 U3 H! y: t u6 }0 [. _ z" S$ P! G6 N" i
$ x) F- d5 Y+ J/ D
8 P( y3 }$ @. [: V 6 l; c6 V9 q5 @: d8 U
) P% `& W2 n( x/ N/ y5 k! F' w% Z6 H
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
. n6 K% `5 D, r$ L$ Z $ j/ p4 g: o3 r6 M
: n2 c: S3 b5 t" {. `; M' F
! x: @8 L3 Q. h5 O8 ]% j$ I6 @% f
{1 I) @/ a1 @: G
$ n% ~5 `' T; \) x4 T; T
& t/ ]. z7 ~7 D0 o$ C 0 v7 w6 K5 l4 C
, R+ q5 h6 Z) b! z4 v
; [' g* Z2 X1 D( S9 h0 d
- t+ ]( d: t* j( ~% y5 ?, d
) c& U/ p: u \8 F" ?, n% h 签名信息 ; ?$ G& i* K$ E* m9 v
- }6 B1 o7 ^. ]3 H& [: n3 Q4 p3 U
3 t) x0 |# D( T+ y6 I5 ? c9 Z( w
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 6 |+ _2 V! Q) }% z. ^1 z7 a
0 e; e. S+ Z. C1 M( [1 H
( n7 l F7 g" C+ b. D9 e9 K 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 : J7 a) X& R$ R' s( U6 A+ Q/ g2 p
Y" i* ?- \- [1 q, c9 A" r9 [
/ h# v* L+ A' B5 h% N 在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 l1 q6 p# l! p+ F ?
A0 f" q7 n4 s0 N) B5 W
; f4 z1 o2 p# m
' G5 I8 i( y. I8 E
- [; w1 |1 H! r4 `, h# l
) y- Z6 q& p [ ; h" p1 |) s! n2 Y/ @+ X& s
4 t0 T) v0 V& \% o- s* V4 c
# o# i6 S. _) w- `; b7 ?* u
android签名的数字证书的一般都是采用 X.509的国际标准。
! D$ Y K9 t5 n Q- P
% _9 S' l5 h# p
! I" r5 a, x" e. i e( j' X' Z 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 - @8 H: q" u; c2 [3 m( ~( O
& f& a# n% x: U( O5 S1 c: I& h5 V4 a8 d0 ^- _9 q& J
下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
: \/ C* G. E- X- G* _. Q. J# v 0 E3 V1 \ K) c7 `
+ r% U& a4 z$ e: _0 v! ~$ K
: d+ t9 H3 ]! V, u$ t- Z / ~" W* ?% a. ]+ P
3 E/ l4 A. H& I. x. d h/ s2 W7 g
# W0 ]8 e1 G, \/ x3 p
$ z; k* `! U$ g
$ Y$ y1 t5 Y3 H3 H; X8 J3 f 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
9 O# m% C( @4 t! \* {7 s( t2 v3 K
$ u7 J; z- V- ~9 q' E2 o! V( |# C% u; {5 E
. _) U( k! f! X) y+ ]7 J$ K: \
1 {% p4 @. }- Z4 q5 T4 J9 `
! S4 X; O( w% l h! |( J 、 2 ?, v& `' e3 _0 O
) i5 z2 }$ R" A2 ]" Z7 j$ D- Z; ]
$ T" Y2 P- ^. v; O) K
% Z T8 y4 w& A! P4 l* U" ` ! ^9 J; P" V! K9 S
6 _8 Z' Q: X2 ], Q* b; H( J/ S 权限信息
' T: n; C; w. C( C 7 h8 X/ {7 l$ b( n; q: I) M
6 N+ R9 j/ s* t) o( X" [; q 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) % d0 v. i/ O! [( H' R
" l* l# \3 v" M
/ s' W. J' F2 ? android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 & v+ |# b4 {5 x3 S6 E+ L
$ D% C8 y5 ]! c$ Z m$ Y
, D# A K: |1 k: K9 e2 [% w1 `
; F% b4 Z7 V. ^( m: Y; }5 }. q/ K 4 o% V" ]/ m6 |8 t4 p
: K: d; u, s7 X4 E+ x3 m ( s. g* h- ?/ D u% x( a1 B
3 I; J4 v( C- i
% h) k: m; j9 _" c- ^2 H' o
下面对这个APP的所有权限进行详解下: 4 K W4 Y+ y" @# N& w9 u
, a, P$ w1 j6 t" k3 A" V9 j+ [
7 E2 D( J+ R ^- c! X& \ android.permission.INTERNET :访问网络连接可能产生GPRS流量 & P. @ ]. w0 {$ {5 g
6 G1 v3 o' v8 l) \4 w1 H. D1 k% l6 n0 u& ]& M8 ~1 t* ~
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 . ^* u, u1 E1 W8 Y1 i- {" ?
, S2 h, k3 S8 P
$ c' y& z0 `) x' m; T$ d! r3 A2 c android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
; m; o# G) ?% M# l
" k. ]. F0 B) b! d
1 o( \) w2 O% a2 ~ android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
9 F: O$ Q( V. q7 O : D2 G. H: W# V5 X+ g* y e
! h; y p4 V& Z( N. O( x
android.permission.WRITE_SMS:允许应用程序写短信内容 - F0 b! k- M! u5 Y
# l! n6 x- K' I# ?0 K' ?
4 m# J9 J- l. z* D android.permission.READ_SMS:允许应用程序读取短信内容 * ]3 v# o9 v. O* P$ |
& m1 C T g. t- B
0 n7 f8 ?! R" M y android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
9 v) b4 ~" R; D/ U
; i. v0 T9 L8 D6 u- V9 L9 |8 Z w7 m* i" T
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
! C% I' x7 p) B6 X% s, e 6 z+ ]% y7 w$ D; g6 K
- |; R/ v0 Q$ Y' q
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
! e3 I9 q1 G# Q
+ |& d. s9 D8 Q# P* k5 ?6 o' m+ E! {: J
9 K" y2 r3 {$ X h1 l5 J android.permission.VIBRATE:允许振动 4 {8 f; A9 |! ^0 J& i/ d% d }
~9 T! ^- U# f l" c( G
9 f2 r- j& W2 J9 v/ B! {, N android.permission.READ_LOGS:允许程序读取系统底层日志 3 \; {' P; C2 l/ R$ v T$ q
" c( r# }$ ]$ |2 G
; X1 B: B% c# R/ e android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
0 I& x# K, S2 Q+ f 1 V$ b; ~9 ~$ l! G* C
2 ]; x& g8 V+ p8 V+ z
8 z( j+ Y' i7 K7 z7 I- i % @! H7 t7 ?. b& Z v; u
2 U! h: ^, F( |- D' o4 m5 S 功能信息 1 B' a1 y4 u& C& Z% F) Q
! d( a& ^: P: g4 y
, x. b- \: {5 T3 B2 x) d 2 j. d! H- s$ k5 X
1 S0 v7 L" l- ~0 v# w0 M8 X
# S& Q, P1 E# M, M2 R% T 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
$ M4 ?% J; a/ P5 c
s& T6 b8 d& H1 ~+ A$ ~) e4 d. `; i' X9 o' ~9 |
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
1 O M, i3 ]' Y+ K, S* f
7 M) Z' O" d" Q# d
, l- _- r. a4 [$ W* ?( }" B 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 8 y: n6 Q4 ^( V# g' V+ o1 t
+ }) X0 G5 c' a. c2 i
1 a+ z. @& C' b4 M8 \ 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
' B' n, L% {" p2 p/ S2 l4 I0 W 0 k9 d8 l- ~4 y1 _
$ K/ G0 q+ w. \5 I9 z/ t$ v" E! r ' b( w. i. ~% g3 e, N- p
# Z6 S. c) D; E& t) V5 B% {2 O4 P! ?/ f
0 i% B% `: O. }5 z+ l
& G$ P$ j7 p; }* [
# E9 U: Y; m A$ ] 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 & @2 ]0 s; W' \+ P8 R, K
0 a* n) y% G, d
/ v# l+ j% d- n% B* R+ V # X, x7 U5 v, \: h) B8 @9 F
/ o* v( j. u. B- \) B
# l' j* b5 l" [ e% o# x
4 M6 z7 y, O2 E: ]( ^; R2 c . ?+ O/ b6 ~- r1 f" k0 W5 b, r
5 `! T! T) r! p3 b 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
) n) d$ h9 q! e" N0 x* l
7 Z2 Y" N8 K! }- Z* P4 w) H4 h# Z
+ R3 W% V$ F+ n+ E! e; b
: b: F: n G! b3 [6 p& ]5 N. C* ~& v
9 d" b: _1 P, C" _; ^! B" k- ~2 ^9 u# P& Q( J3 Q4 `9 r8 p4 W1 z1 N
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 $ k+ y3 T! l' C1 b' x. R
5 v1 `2 P( ?( Q( R$ I# [( o9 k5 j
- Q- U- |' W4 T
2 r: r! H2 b! I( j6 o9 M 6 D8 G3 K( }# o z3 L1 [% t" a
- Q1 W0 x% C5 o" o
+ l5 u: C( V; a/ B
) d6 n* H/ ?# G7 s: [9 f9 H( T
" I3 Q. S7 q8 d7 s' z 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 7 |" f1 G) u$ O+ K; F _3 p
& D/ D0 J, l |3 M/ I+ v/ P/ Z/ t. o; z% [. p4 q, i$ n2 s$ R
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
& Z0 N* R8 `' h* K }6 } w$ y
, i/ C. h5 x- f5 y; B+ o+ j
7 ^" H, G2 j/ h% q 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
3 ]& m6 X4 H7 S+ w0 o1 \ 1 V7 j# }! e& a1 T# j; d$ v* |
. U0 q/ l5 V- l 开源的luasocket代码可以参考学习下 0 B% h; H* u) X4 y+ b6 s# i7 W( E( b
+ F8 p# V( Z$ A
/ }; A! o' p: T* P) L( t% v https://github.com/lunarmodules/luasocket & i( X3 m" C+ X1 x) t
# j9 ]' F3 y: m9 J1 T% W, O. {- P$ M& @% r$ h' Q' w$ E
https://github.com/fengye/luasocket
+ D- G$ r; h6 X9 I7 y. P7 t) L
& c9 y' D; v3 {( D4 b2 G8 ?- m9 k3 C, w Y5 [! N
6 p" J4 U5 z& g6 }
. q" W- [1 w" {% c( P
+ h# C& w+ h9 ~* q9 x1 R3 u3 N# L
' B& a# G" S3 [( \% |
9 n! d6 |8 C$ U* u/ j d0 |+ ?' ]9 |
- |+ r- }2 m2 {4 r- Y 7 p6 A. e a1 P7 n Y8 {5 v
+ C3 H& o1 o' F! b6 I& }
d8 Y) f! I4 D" H: h
6 C1 f( b! r* s2 B9 S2 W: [, a& Z. H - f: k W* I, G# {
# W4 D1 D. ^2 k+ a 总结 * t1 B- C1 C' K% n+ E
1 J8 |! ~4 m3 n9 Y1 O0 Q3 S7 u; [1 E9 m! h: S# L" k* ^
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 5 b% C; k4 k0 z
: m. \/ i% Z- X C( T6 W T* W
* N& n' }. E4 m0 Q6 j
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 7 ]6 L; ]& ?* q' k! c
% B$ T/ K; |) Y' P# r" h$ E: y
0 o/ x" |# ]7 s; A# @ 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。
. _8 ?$ r p( G! ?( _3 E
1 p) V- J( A! Z
" C- A+ N$ O! r9 J- V" R: A 结束
- J* s5 X: b+ V( u; o2 u 0 u! l9 C" Y' s- S @% f7 F) X+ f4 C
- s5 c+ C) G# J4 l: f) c5 x8 ` 【推荐阅读】 7 ?8 u) k) J5 t" a6 L0 J
# y/ E( E+ I( Q% f0 I4 d
9 |$ B; ~& G/ f# \) d1 L: }; A 对吃鸡APP的分析
# ?$ e4 n! F0 c; E3 v 6 b7 v1 v+ f) a6 _
, ^ [6 O4 n! Q, o
你需要了解的APP安全 Y* @' A' S1 k/ r3 P0 |4 _
$ q, p6 g( ]4 z( s! T9 A
D* R L9 \, q) ? 你需要了解的APP安全
+ @7 b1 c. F- q5 f& N, O/ H" w
6 _& a1 S% x9 {; o, u' ^4 m4 z
4 o( E5 m- I1 U, l6 ` ) ^2 O5 l) s8 G& b! V( }
|