|
9 y# D$ A! a1 y% ?+ t
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 . Q* H7 F; y' m6 }0 O; @ y" Q5 P
0 D7 d, P' P Q+ S: y' L- F
/ W9 I q1 J( }- [9 }6 q1 p! g: _# P
+ b. B4 j& E# T 3 d7 P A$ [2 I9 S
$ K- J2 k, ]* h3 c% H8 H
$ _% @5 [6 c& \3 s2 d. b
+ K4 {8 j/ j1 f& X' J% i5 [$ I$ q7 w6 J! J
下面就以开发者角度进行解析下这个APP的功能的实现原理。
* K: m$ @; g7 P+ U! }: z3 |/ w
. }9 K6 {. x' v! j1 K% D" o" y: k. u; E* i" C) e% C
3 k( l$ b8 c3 Y. E
: O% j$ t5 H! o0 b6 K: R
/ A6 L8 A' ]3 t 基础信息
9 B/ h' h: h% V" e O 7 z9 p, [% f) _ y: Q
) y; k7 g4 y6 T/ I1 L, D8 K& r4 f
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
. E8 [2 h% M* M& M" z3 ?0 t0 R 6 J6 q8 x$ F" g% X8 ^- e/ s
( Z! F5 w9 g5 e$ T" \ 6 \; L3 Z. o" ~3 X1 b: M
r5 ?) K ^0 M& G% B
# W" U0 e& O5 w5 R; ]' M
. h9 @2 m$ M6 h! s6 D( r5 K8 f 9 ]( b1 j- m( i' W3 F
6 x r; z9 F4 O! \ 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 $ T$ ^( y6 w) S( k
8 c1 a/ g3 _6 n4 R6 Q- H Q9 i
) O3 n$ D3 Q; n% ^ L. Y1 ~
* \4 e' f5 {1 I; ^9 \0 ^- i
" Z7 c& {' ^+ R. x7 M. z; M8 \- C! q/ U' S( i9 V& Z7 u
" g. }" Z/ i+ b! R* L* F
4 g! j" X1 X6 y+ D2 s) ^5 O' ]
! [9 g* M! S( E$ d5 b# c' u 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
6 z7 `! s7 ?7 q0 q
. B7 A* a3 |" \2 o; E
5 V! L# _- a: h- S) H9 _: N / |% m# } f/ d7 ]# q
) ]& D$ ?* Q9 W- _- C9 \
; e* }/ [" j' z9 {: q0 v' [2 c 0 e" E: S0 @) d$ s( l& D
3 K: [7 F! q; L* i
# u8 Q# c+ B8 C
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 " S% @* y+ i) \/ |( N" \: H
: E$ r1 r9 @ b4 J5 c0 ~1 p6 [1 N" C8 t6 j8 s7 E& \
8 h ^$ r y7 J
0 ?4 x( K( P# y5 A. n1 e" n
* o: W0 e2 I$ s6 z8 J7 v
" ]6 O* b2 f' v: L7 s5 u 9 t2 v$ a, _8 l- [
6 W" _! U3 L$ h
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 5 E G$ N2 k& @
- v9 f- x# h' m; h
# }: ^% d2 a/ ]& `- u0 f4 @ 3 C+ G$ Z6 c" l5 U' ~
/ t' p3 {4 j4 L' A
8 k9 ]4 A" A# _( E! `
$ @6 e; @; B5 y5 a; ] ) }1 Q, Y8 ]5 U
8 [/ m, s( `: I7 p3 g
( p: X. k/ y8 v5 U- s* i
- I4 m3 x# m7 w$ ]# }2 y3 y1 r; k5 Z8 C7 z2 b* w0 r9 Y
签名信息
( p1 l K; a- G
! k( M" \; p; P5 y- [
' E& f6 a$ @6 N3 j) N. H 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 ' M! I! t$ [/ j
/ k9 c, C$ O& v3 ^- m" q( `5 s8 K' z8 h, t: q$ z# s
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 ! n+ x: Q9 u: q# {( j/ d8 H( V( l) M- t
5 x" c4 p* l; @$ z4 x O5 j- i) W3 Q' s
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 ! M$ r6 s6 C) m; U
9 B0 T& A0 q. f2 I# b- e+ W; Q- W$ _, r' a
1 f. ?+ x, m8 v) I' b! R. k
+ t4 k8 r$ K# x+ A
* c1 Q5 {+ g; L$ ~1 o; S
9 `) f* p8 T7 d, S+ ` ( Q7 O, V, I B) U
- d- s: m6 [! @% o( s
android签名的数字证书的一般都是采用 X.509的国际标准。 2 f$ I" G+ i" E! J8 u
- _$ U- O0 b) k* R; ~
% x7 q u2 O+ P3 i) ]0 s7 x3 x 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 ) R! V5 M' C4 N4 {$ f
/ `/ A. q4 K' D- F; S) T6 u' B
; q- k* q; P# i9 }" V! ]* A 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 I; T3 y" O- _( Q
) J7 V Y" y: \! s3 v
k- _# g; t- L5 A
* g) u' G2 a0 F0 V* t' W
V k; g/ G) O" _# E0 h @% u7 i* r5 w# s' r$ [* e$ S! j
, \; s J3 o `1 L) M3 _ h; i, Z2 u. {7 a: F- q k8 r- M
" g# a5 h" }, c6 ^" Q! t
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 8 M# C0 \8 e; [& i. v; D7 X' g
7 u5 c1 Q* b1 t' r; G" N& l3 b
: O8 \! u. d: h/ R) x! m" Q
2 i2 q! u9 H; b* h/ k
/ T+ L1 ~5 Y) K1 @' m4 x+ Y& }4 O9 v9 ~
、 1 Q$ X8 G* v8 B% P+ Y) N
2 o; S- @ a& p! z, L( _' }7 K& T) W- s- i
, l' U4 l3 Z1 E% Z
$ ]9 f3 f! O/ K3 b6 J; U
% c' x2 C9 C L 权限信息 / M. K' S& I4 } U5 N
4 f+ t% u8 i8 X& N* t$ [; ] C) [. d' H) n4 A
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
# R' L. u) v% j; p) M % [- _7 M3 H1 M
; ]6 h V% a! j, I android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 4 c! C% d2 |7 ]
9 m @2 f+ \6 u/ @" K6 Z- k
. d4 x j! v* N4 x2 v; `! \ ) i7 I# {, Y% W! R/ ^
% z3 ~8 z9 O4 d3 z% L3 b
; D/ q7 A3 ~, G9 X$ \. y
$ ?0 S) c; s" X$ d" `
3 h% f+ S/ h7 M1 z' K) r" M" B( e% C" x
下面对这个APP的所有权限进行详解下:
2 v; C' W0 L# R! ?$ T
' R% M1 f- \7 ?3 t! j! M1 a( O5 g9 ], i
android.permission.INTERNET :访问网络连接可能产生GPRS流量 3 S5 i6 S. |7 J1 b- Q
' ?3 t7 @ n; r: q; l2 ^) F4 U+ a! ]0 w" P" U$ R' E
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 7 Z* O/ [4 k, g) V
3 q a" R% E( s/ R" b
% Q8 _& V0 o) V+ t8 U android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
$ _6 K! R) O! a: D 0 `) o+ S7 _5 [ b# e: l
: r( \9 F# j {- ~
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
6 L" w' @8 ?; v6 o- t 1 Q) q! N: t" {) ~' t9 r, j T7 v
7 B0 ~6 ^- J/ k( \ android.permission.WRITE_SMS:允许应用程序写短信内容 5 a/ G* H4 Z, O) t6 D+ `# e9 D
5 ? l1 Q c5 z, A$ V6 G7 @7 d! V' ^/ g5 z! W
android.permission.READ_SMS:允许应用程序读取短信内容 . _/ C( Y. E" b
7 F; U3 y: \! J! w0 ?
+ V# p0 m! X9 a! U( K3 B2 C! w1 T android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 , F) o: Y6 W ]# n \
# B% T6 V; o* B3 L$ C3 _
0 ?0 q, f/ D$ ~% N* r) O android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
. {9 g2 Z7 {8 V* m0 i. T% { : F, O& h6 X$ {5 q A' W, `( D
6 P, d" t/ U, E1 l9 F/ k
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 ) e. Q4 L! o! U6 h$ o" q( r
+ {$ V4 I( K7 l4 ] N) E/ x( a' z, H7 K- ` y0 @6 t& e5 K3 V
android.permission.VIBRATE:允许振动
, u9 K! Z1 _; X) p; k
/ V4 i# m" s0 @
5 S$ i8 S) @5 ^& [3 G android.permission.READ_LOGS:允许程序读取系统底层日志
) N. a% H7 F6 V m- w$ t
+ j; t( ^" X' Y# w) U2 D1 n
: g& Y! k3 i3 A; e% x6 ? \+ s) p android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
( E! j9 g" B# J- V# a C 7 G- J' x/ _' D( y) Q" C4 e& W# x
; D* n3 G# C6 ?: X; ?& M
: w! e% f( m5 e/ u+ T( N5 u; n
, K0 Q9 S+ R* L+ {7 L) N) i& X, z+ X
功能信息 ; o* {8 x3 i* T
: o1 u$ ~# C' b, {0 Z* e1 E
6 C' p2 N7 T" I0 Y
1 i5 M- a* P! |' {: d7 a8 s/ q : v# _6 {5 l3 B
+ r& p: w: t4 y+ I4 w l$ { 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
+ Z& c; E" Z. ^/ J2 G9 r( c
* F. B, R0 P; |5 Q( Y: X
" Y8 ~" m2 C3 p/ C. O2 L Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 9 r- T, ?+ A6 ?; R2 h! @% O
& l! ^; |: m( |. ^+ ^8 s9 g/ Q C( {) v
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
+ |5 i7 b! V- G' H: r 0 @0 ?1 O6 |- G: E. S8 t
6 A0 L/ W' `8 c
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
4 z2 v0 j2 M$ ^) L, I
D$ B3 D/ k$ \0 o! _" S7 F
0 d& B b7 G+ Y% _0 a% |' \- a ; k% j+ Y7 X* `8 V# M
3 Q9 Z4 i: D9 @; ~/ s6 j
( y" ~0 Y, S1 f7 O' `$ Q7 X 0 R! M* \6 }/ Y* x
5 ~# `5 _6 \+ P2 ~( h3 n' N& G1 m+ y4 n& {
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
2 z. U6 D, s0 }% h* L5 a ! [ [2 J" v3 m' F9 y( _. Q
! p/ q( B4 ~1 o! W. P
( C$ m9 L" {. o9 ]' l, n$ X
- K: ~" L/ ?6 W | m; ^4 T8 x
. u$ I, C, G6 h, \/ u* ~ 5 P$ k# w7 E G% x
$ h: Z6 U" i8 w8 _$ S1 i1 }8 ~8 m# Q
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
7 H, w- D, S: K# h! d8 z l# S9 n
# f) W' _7 l, [ ?- d
+ z7 b! P6 C1 N9 H/ ^ + s/ c( T1 j# g6 X9 E9 @' N
! L5 Y$ ~; u2 V/ J# b5 b
6 u0 G( }/ X6 B* A4 I
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 ; Q+ Q) d0 a3 l! d; i3 Y
@! Q0 e+ _0 l. W
1 ~. f* w# H; ]6 j
+ z* L q4 M S
0 {% Q8 D) [& M1 J
; b! P, G1 O' |3 Q* e" b3 ]
: P( O, O; `5 q( s" Z/ Q3 d4 r* F ( p" d! H8 R m
! k2 x0 x- C# f( x
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 ) c a- h/ @3 S* S$ M; o$ ^/ G
; G( n& r0 Q1 a( z7 r/ ?. z
" U K, p- k- n0 W/ Q: i4 ?7 ^
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
, m5 F$ V& }' D- h4 y: i
0 A7 r3 B7 V) N$ O& W7 H7 M9 c6 d8 B# E9 I ~2 O4 l7 E
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
- v! d3 q& `6 O* U# ]3 O ) L3 h1 W, c5 A
, U$ c$ {1 h9 c2 \ 开源的luasocket代码可以参考学习下
: Y$ U3 x9 ?. c& l: n
; a/ ^, }& G* u5 S) Q! ]
- s8 l1 p; z1 R9 K; `: q% G1 q https://github.com/lunarmodules/luasocket & J2 h& g% t+ Y# D$ F# b: {
4 a+ [1 S5 U3 s' `1 M
" n8 O- b+ m, t7 u9 C, v* {6 `/ p https://github.com/fengye/luasocket
% J3 H3 b! [% j. v6 y0 N0 w, r 7 | U) `4 x% X! F
( ^& ~& Z/ r5 [' q# I* J+ o- t
5 i. `5 ]* b: z, n& @) g- b. v
( Q1 {" e) m( t7 E8 E: m8 q% G) y3 [0 S& u2 i0 A% t
9 C- L w1 i& M) [2 v+ T6 O8 B $ B ^: R& R+ c, o2 C
- A0 w9 D+ ~' n7 `
/ f2 ~' @% k' Z6 w0 k0 Y$ \, B
/ h$ ~. M9 x; s0 X( k3 a' P
( n2 }1 E4 c o1 W6 w4 A" l, j
5 A# Q- \. `3 C, P3 D
! V, I$ i6 V0 X' w) T: C
& _) z7 U' G) a$ o: z% W 总结
- g6 P7 C/ G( ?, O4 | + ^) ^7 e( s- S- }8 m- D3 P
+ d* Q. `! R3 }# G- } 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
& A5 f1 e$ z, i7 n* P! F( J + \7 [! ]: p5 P
& D! W& |7 n7 |2 U! p" S8 W 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
% f! l; d) E6 c% B8 R
8 M4 y8 y8 n+ }) X: R5 v& i# h0 w5 P0 ~
对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 5 B3 F- w( U# y
`9 |# n& D* j3 _( _/ W% V, k4 G( s; c" y
结束 ! x: B9 }& n6 ^- ^4 _/ t
7 k+ D& C: W6 b7 t2 F9 g2 q. j c' k- Y" o1 ?3 L2 G( b& t4 M# n4 x
【推荐阅读】 ! e! {! D2 O0 w; `/ W4 b) P* |: e
# s1 h" d: c- Q, N+ _8 B8 K1 i4 d: D5 s+ H
对吃鸡APP的分析
; E5 B6 `# V& o8 r
8 I- ?" J, E/ |2 G- F; r
. n) s/ r( G2 C 你需要了解的APP安全 - M" V; F2 J. I f' g
z: h/ z% T6 P7 M9 }# l, P4 t! @% ?; [( Z5 b+ b; d' t/ N( ^
你需要了解的APP安全
2 z- ^ T* i% l: i/ } 5 h" z4 G3 A+ q M$ P
! s3 K+ V( @) @# {7 w
W; S& v7 l/ ]8 M1 {+ o
|