|
5 z% z: Q( C+ g8 R5 Y: a 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
! y$ R! t4 _9 ]% {& Q
! H. _; E0 w3 r2 f4 q% z* k
0 H: y" O5 k/ s! z8 b
- a: R. S1 G7 A$ F , x- w. z7 ~" C+ i
3 H- r5 ]6 }- a+ e9 s p: D; |! b( ]
4 _: {" N6 t# n" [! v4 m% N
0 c- Q6 i+ l. @. N+ y
. a2 K; I5 D7 x! S 下面就以开发者角度进行解析下这个APP的功能的实现原理。 ) m# S3 s3 z3 q, t- k0 R9 R
" `+ q+ w+ Q1 E3 _9 w2 L
& `2 w8 @% j/ f; N( j: X+ |0 N4 P
, N0 D- I: o# ^( j4 S1 ] : I- Q2 Q G( P$ o/ b8 @
$ w% H" J& C9 e
基础信息 8 v1 p% ~+ t! E6 u( X4 g. H
- M$ ~; K7 G3 z( l7 U
v. r7 T" }. v- c 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 / T( i3 F6 t# G
. Q9 ^% q+ r& w/ c5 K& L, _/ N- d) b8 Y% I- M/ H
4 u( I$ l' Z: V& b) b' d
9 E! H/ C3 Q1 ?) b; b; t
$ J1 L. J1 D0 F/ y, I" R. c: ~
! ^) G* z/ A+ @
0 `! T7 \" s: j9 [2 S; o" C/ u# [" }0 Z3 A$ |9 W. ~3 t* H
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
# v6 ~- u6 H4 z* c+ a
2 ?+ f+ d# B9 b% _1 g5 q+ C6 L* C2 j' O# _& H) {2 w0 F) J
?. T$ f& F* r5 I& M% M 7 P! y# s I- h- r: e8 X" I
1 x& ]8 [* P0 S. N! Q0 }
; f, N. T, F: w1 W$ T 5 T/ u& J1 ^. H, g6 ]
1 M6 L2 S1 Z' i4 B" U3 K1 v# V
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 / H i8 @) x }# I% P
6 R- i4 h+ w& V) l! j. ], k* i7 J
, [ q3 z. q% ?% y4 [* g
" d# D; \2 _. F1 k0 z% B0 Z5 {0 b 4 s; i5 u/ J* Q' ~9 Y7 Z/ o
! j- M4 j: w1 n/ n 1 d' g* X, b+ Q% u
0 f/ w$ I* l& M' p3 s3 H
3 Y, Q+ @; F' Z$ v# o
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
1 Z6 E5 }( o4 z! N
6 W2 X3 U4 z/ \' e) M$ m" A* m8 ~1 h. i' {! P& X
8 C& \6 a7 V, K7 Y; ^0 | ) [6 j4 t3 V/ R: f5 q9 \+ Z, k
9 [: g! G) a! L- }- Z
^$ z/ e3 z' g& d7 `5 g% i 4 k) w. z# }' Z5 V& v1 b( l
7 G+ {* s$ m: t9 x7 Q& y! G( F
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 $ i" D0 K A9 `! x, D/ b
; e# X8 q/ k& c' [4 y- a6 a
7 d4 A: Q+ Q: d+ t. U - O: A1 ]8 U3 O% P; e0 y6 m
, d; w p* _: n; D o5 ~ L. o2 H& w& b3 J+ r) ?+ P0 g
5 m. K) C, ]8 Y. u# q: y3 P
$ D0 F: c# H7 H) K9 |& t
, M" ~6 ?1 O* M+ H % v" ]+ p. U9 t2 N p- X$ \% O' e, t
% B: _# Z+ ]4 M; v0 R' x( d) A% t
6 K% k- N+ f, N% A! E' p. w
签名信息
$ {/ [4 ?/ A( r
8 \- A7 x( Y9 U# w# i/ Z9 I
" _( B5 P$ @$ k( @ 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
! |& S6 @( @. p/ D " ]/ {- j5 c6 \0 t$ ^& }
2 m5 ?9 W, J/ i7 Y 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 ( h; R) Z& B3 j3 s: o% n% h
# {9 L1 ?) g. D
- R, p" m: {4 X& A" J
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 ; L% X/ [6 t8 V4 k
J. E7 }: V2 j l! r) `! m1 ^6 N6 R0 p9 N* Z0 A' J' h
/ k, u. Z- T1 Y+ A
; w8 w4 H/ G0 l; b% C
6 C* ~- Z* L$ B `
" {4 l5 b0 ^4 ]! u : w; n1 |5 D. @% j" L: D3 k! J
4 B% E# D" r0 u$ F android签名的数字证书的一般都是采用 X.509的国际标准。 ' C1 C" }4 D# D% k" i
A6 f7 b) a+ q/ S+ S
; r" q9 s8 S3 F* [5 L" R
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 z* E* J4 Q& a* K- S1 m! s P# w3 ^
1 F& d' C2 r6 P5 R N L
' {; k! b+ u, N% {6 P7 S: x 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 ' U! \8 k! k/ L$ r O6 V. n1 U2 \
- o. X: f- R1 x$ L- |2 D* ^! u* _/ W* U; d4 D' l9 r
. w: a9 @+ {) W
" g5 j6 m3 A. c5 \) I) `
" g' t8 d! N7 U% v. F1 [& C: b
1 m( U) Y. L0 G( C* G. e 6 I( s. j' o# G% k
- g F) F7 h! L% D g$ t, Q" r+ H 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
7 S6 p* J8 a8 u2 D$ t6 z3 B
8 h" m. H1 n3 `+ v Z4 Q
' H( K. Z, W, E) m3 m' e$ }1 c Q$ [ / c6 k$ x9 k" |3 M9 Z
. s0 T/ f# h$ e. p+ x, m7 C
" G: Y% Q6 [+ |) p" e7 x) f
、 * O( z$ z4 t' E- k( D
$ C5 h! y1 z% f# X
7 |" T7 \# m# n/ i+ u) m5 v! D$ R % Z) G5 {. y( J; Q* E4 V# W* N
4 \2 n# r* Z* S* r, \1 C1 P" p4 R i) F q3 }' Y* U
权限信息 ' t, s3 e: u; J9 W# Z6 \
0 X2 X$ {! a7 U1 N5 I1 u; F5 q
: b& h/ z: a U% t7 n1 i, U5 b 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
0 _) @5 O' ~. l2 O
) v# o8 Y6 d6 N3 m: u, T7 D& j% E( \
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 8 f. z8 ~# q5 U) x2 q. ~8 D
0 n1 F9 m5 H | {
; W' K4 g5 w) C- E' k9 f# G6 ?# ]
; n, M5 j8 r4 \- F
$ d1 u, X# n# ^0 S/ j- U# q) w
" ^( ` q% T4 R& ]* m9 Q# d
0 Q& h9 }: H- T% n A3 n- h
9 e* L# S* {- K3 q 下面对这个APP的所有权限进行详解下: 9 m/ Y1 Q( u' l5 Z
% {: V, G! P5 @0 ~- Q7 e g) F7 c$ W6 A* _
; ]3 G3 T" Y8 q7 Z! ~. R
android.permission.INTERNET :访问网络连接可能产生GPRS流量
2 _' N* P5 Z) g6 i 0 |& O- k) [% p: M1 x9 s" }( D
4 e& d% M: U7 e+ c. G. i& o android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 6 r4 G% v o3 X0 n: e/ @0 [
. j- H3 z. E/ b
& Z, d* j3 s% m
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
, r8 R, J3 |+ o, u7 }& f c2 |" b" H
; _3 i% J) b( W7 L
" u( _1 b! L8 h* P1 d android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
4 l5 C6 j$ [8 K9 \" C3 b. X8 Z
$ V0 c8 _' h3 W# v1 z% P9 |/ O; _% c" Q! Q1 T _
android.permission.WRITE_SMS:允许应用程序写短信内容
k& M8 R! p& s. d
) z/ {( r+ _5 J$ R9 M
# ? v6 m+ i; d' t0 l% _$ b android.permission.READ_SMS:允许应用程序读取短信内容 ! [/ ]% d) T- @; @$ c
, `, \* P+ h; Q" {1 t
6 c. ?2 l: {6 B5 e' o' j android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 3 @% `# e; ^& ^8 N/ K& m7 J' t
& T1 {- t8 P! n s
0 N9 V5 p1 ^! `- H& f android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
5 d5 M2 [( W. q, H7 q7 g) I8 P
- a* n7 a# k5 @' X5 U
# o* [5 W5 f' A' u1 _! s4 W( Q android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 $ D. f8 Q* M$ N- @) j/ t
3 U) _3 u T7 J& z9 [$ H& w4 P" @( X' H
android.permission.VIBRATE:允许振动
* p- Z( L7 Y# [3 U8 q % l# P2 i, c" E0 j3 z5 @
) i2 y( Y6 ]! o6 \: V2 Q6 o" Y
android.permission.READ_LOGS:允许程序读取系统底层日志 ! [, E8 v" _1 f+ q
" P- h$ z5 i7 K7 {, z; b
- k( K6 K* w, \% f6 U C1 y/ |$ { android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
; h l% S0 i( x+ P9 s, u; h
( w6 Q. I& C- v; m- S y
( H4 c) z* f+ p' }3 r( C 2 K% x8 F) Y3 `" c9 J8 b
0 _2 a- I4 ~3 Y; G$ ^2 @$ X& ], Y) g4 E) n' z
功能信息
1 T# \' T4 A9 ]% Z1 |; G b
" P8 r9 t7 m) I$ v L
6 j- b6 U1 c* }3 [; M0 g* ]8 Y# b* M" u % O+ E7 [" g" J
% f- C# S* M; ?7 l, G# w$ Z1 D1 ?- R# x+ M( ~
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 - K6 l7 `5 g" m: t2 n$ \
6 t- o* j3 k( T' f1 j; t) Z. T; E3 I- x, P! D p
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
0 ~. c. ~! ]/ i1 M7 y$ @
: ]# r/ G5 ~9 a0 w7 z0 @# N: H% c. t0 E9 ~6 t1 N
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
' E& V1 `. O7 G/ W. b( } / B+ e. m: P) n% P
1 X# M7 d6 a. P' l 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
2 @ r' H% [* G
; l: C# K* E I0 `- S2 W3 G! A% e- ]4 ]7 x) p0 A% ~$ d
* ^$ c7 ]2 e- V, Y: r- f! W
1 I; {4 K# b( k( a4 V0 @
% g$ Y9 `% H/ V+ }
f; t$ V Q) ` l
1 W, |5 j( \, p& r# \2 r0 q" n, X9 G# t! U8 ^8 Z3 Q5 z' l6 ?! W
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 9 @, k* b8 F9 x D c$ E) y$ K
6 S6 F$ r) H8 J) }' S" c0 g" D2 L. y; r0 I& b7 w) j6 j
0 R( K8 D+ S# k
2 Q' {% e9 n- D/ W
, O# z6 @" F/ H; ^/ E+ I7 c; D ^4 ^ - J+ d2 y/ d" Q' x3 Q2 w9 U
. @" w+ j1 `' r/ `# L* K/ W7 o
' I/ p( i1 i6 Q, b 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 & V+ I# b8 ^) X9 D3 V- U$ w1 \( U" X+ G
2 {7 @9 k1 {+ Y% I' \
" y' B& d+ P, z3 V' [3 y2 ]2 c
- m$ P8 m& [, J; p9 X" c. ~4 H; @ / i. i1 H- v* l: ?$ [
5 F0 i1 o* Y3 u, n3 x
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
5 ]0 ~% i" G" s+ v
$ Q. B; q3 m3 x6 I; ?; S7 m- |7 U( I' Z6 \. D
- M9 b t# q! x K. E
" x# t* P2 J4 e$ j! b5 _
p* }/ t* [# V( n
! U$ _' H0 G" a * n2 ^( R% f/ P" `
% h5 d. P4 m- G7 f 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 % s# o C/ D) f1 e7 K: h# s
$ `" c) A2 R7 T5 c- m( @: ~& p, f( W6 ^$ J1 o7 x! C
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
. [9 D9 u0 ]. T 1 d( ]/ R# x* o; ?
) S& W. n- i: {1 X$ K 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 e+ G) S" m# |- t4 i( k% i
- o: L } v, Q( P, a
) }( e ?' G8 s9 [ 开源的luasocket代码可以参考学习下
! M N2 W" l$ c: a
% P9 K4 X2 g3 v. O$ d( m. y- z. t/ r/ J+ v0 I8 H
https://github.com/lunarmodules/luasocket 6 R% z# h; d1 Y; ]
3 l7 ?6 W L/ ^! ^: |
, v' q: Y1 n0 N# r0 }7 J) G/ _ https://github.com/fengye/luasocket
, r z2 n( K0 X' l
5 d: ^% z3 E8 s R1 |4 Z- h2 q- x4 [ E/ k" Q
" H, n0 z' C6 t9 @
4 J( i- ?: X+ S/ N# E. w6 |- H
2 R: b9 B/ h7 j; U% W8 H X
; q: q# ]. t: v7 v v; e 1 f: H* @! \* c8 A P. o
" X( Q* V% E. a$ c3 u; o
2 `/ t" q8 J% {" V, e% e9 q+ [
* J0 f0 K p8 W3 ~% G/ [
* M8 I3 c! b/ m5 b7 R * r: n/ F+ Z7 ]/ I0 Z5 i5 l- N
& n- u/ n' H4 Z/ R, {
" w* T0 b- A% R0 s0 i; S 总结
, s/ B/ T$ l' f4 X' s 1 u, R9 d7 s& A% u& H4 Y% z
; b" S& ~) ]" o2 `: b+ d1 A' h! v 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 8 t* T! p" J" v' v; U; D/ D
9 t7 p) h" p& l6 N+ R
! i$ R) q2 |( C. {. j+ s9 h
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
+ O7 @; C7 D0 W3 u ) k" w& S2 w4 m7 M( N; l
4 l( ?% e- W1 I6 i E6 \+ \; U8 b# { 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 0 J9 p& P5 C& _) @; Y$ l
% M C5 k t7 A
: S3 [, b3 I! g4 `! [4 s' k
结束
' N3 h8 j, R6 }
+ ^. [1 R. ^( f8 r9 m* ]/ R9 A) }: w7 C q9 |; [, l, V
【推荐阅读】
0 ?5 i# b: \. P' k* f- i: w " S" G! x5 p: g+ i
9 l# o1 o8 m* f2 G8 W! z6 c# [
对吃鸡APP的分析 0 G3 o6 w# P- W) M
0 s6 s& B& @0 U: R4 M+ G4 |
" K! _9 n% L1 J M/ s% n' H 你需要了解的APP安全
; }9 e8 w3 g$ g3 g9 L 3 p# z! q" a3 z6 Z) f( q
; n. Z7 _' Q2 @6 c4 _& j 你需要了解的APP安全 2 N$ z- A- R5 _
1 r# i, E* v7 k+ Y- u9 l P4 O
7 A h. {& u& H* ^6 W9 o # ^; V1 R6 Y8 r8 A! B, a( [
|