|
; t" z* {. T/ n" u- @ 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
( g3 p! @8 P) C" O$ _% i
& t+ i- }6 r. g, ^7 U* O1 c- J9 K: z% }& j) v1 Y; G
X4 b) x7 K1 s5 G: `- e
) _% l3 U; E# I% c% ?& v' E# Y$ L8 y" E: z+ s& P8 z" S# U
# q$ A* [. P# Y; w0 k
, R9 f1 L0 R! D' u" S# B/ V# q" F9 z: J& ^, w! s% E
下面就以开发者角度进行解析下这个APP的功能的实现原理。
/ R- }6 i" f& T( E% r0 z ( b* V# i; D. \3 }; D" d
9 B* Y: b' R( V; Z; }" M
) w0 ]" |2 d; a1 ?+ {" N7 K& `
Z7 x8 V: g( x8 A% V
3 Q$ e W% e+ u- G/ U6 F 基础信息
! W U- D1 U1 ]: ? n6 o
! E) _. G5 W/ i6 u8 w/ P! |. n
* Z+ C+ n0 i# q0 R1 h% {) z 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
+ Z9 @9 K: i) n7 P3 P( U
1 ^; R! J. N; E+ t
, ^+ C I1 M/ X, e$ L 0 M, g& j, E' Y, v4 x5 Y
H l1 j C x9 o9 d
. P1 F, o5 M5 R+ h8 f% z& [
$ E5 \4 D4 L" x+ F5 C
- M. c1 a$ G, ]/ e7 `+ Y8 ]) L6 v1 C& c% C3 E0 \* R
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
6 K c& C# R$ K/ Y6 R: z/ ~
; p6 _% u9 c3 b3 J4 [( h/ d
0 E( c1 t% c# b9 F/ C2 B $ }4 ~/ u9 ]2 `; e8 N1 Y. i
# [- i2 d, _9 v1 m/ k. O! X$ R
8 V! G1 d% x- O
4 Z& p. N% y( N& i( T3 r4 H; J
) `5 u% _" E* M8 t, q1 s3 S; G- U
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
2 g* ]; M/ A' M. c" G# `* i 1 R. h9 b. H8 M( S
8 |1 W( G1 V1 R6 S . `/ m* M( ^1 E$ l6 `2 b A
% g3 F3 L) N+ J: i' T5 x
, b5 q1 p/ E5 k* [6 e
8 t8 S+ r8 D$ F S& K! g5 w
$ G4 z# s8 A7 e+ K& k4 M4 H, B/ F2 N n2 }* H
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 8 I0 W2 t0 V4 H
, G3 w3 f" m# s: x
, A' }9 v+ _& x
0 ?: v) Z/ _: A6 p8 e
/ S- F2 h; _) Q# F% f5 t* ? s' u- L" `2 l. c* a
# x- t1 p3 s- N* X: O' J$ P& [( b " J- T" z [$ p8 C
+ v- S1 c' U6 z$ W 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 . [3 h3 w9 t; |
5 r* x/ c3 z7 q& `4 j! B" L' t
. K. ]/ L2 H0 O ! _2 m8 N2 p& {8 F# X$ S& }& b
0 V5 @% N8 E7 W2 E
: N2 l) L1 x( C) X6 v7 ^
0 y: l/ B& ]* m
4 n& y7 O3 u* I5 |7 z) z9 ]' j6 R; L6 W) w2 l
! S6 v- g. @# s; ?1 m- [7 Y# y + H$ I7 I D* s9 {, Z; H- `& ]
5 k% s0 F- z9 V/ q* ^7 r
签名信息 9 Q u- ?0 [: v# \- |
* j5 t% N5 s. H/ O q1 H
: O' F) c7 s# g# M- E) B. H) T 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
" ]1 r* M9 d8 x0 w 6 z1 u4 F) y+ V3 i
+ m/ w1 s5 [2 q# M: Q3 J- t
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 ) p/ ^( R. T4 C+ K$ n
+ \! Z, u/ e" H( l% ?/ |
) n: H4 _4 J8 w' b8 g# u" d# I8 p 在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 6 ]* J4 ]0 @6 k4 ^# i2 c
+ U, y3 z( B5 q' d# d/ w
4 E, a7 }7 m7 F% z& d" i$ V
0 v5 R( R: s. J4 `/ F
/ _, @& L. x1 u% A* _2 \$ N4 ?7 q: f! s+ _* u
6 M: F+ L) V( M+ y* [/ \
`. S# e/ w, r: e( U+ d8 Y4 P, V
4 j; Z: Y' \- p2 A5 ?, U% s F android签名的数字证书的一般都是采用 X.509的国际标准。 ( C. c4 d% D, d
( L4 v0 o8 r0 ~5 T
( G9 |- O& j" h/ i! J
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
% l4 ?6 O# O$ D2 O
- b, [: H) x+ B# D$ }5 @5 j0 a$ F& _; j" J7 [1 G
下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
9 a6 i: i+ b" m H! q8 v
) m F" _5 ~3 B Q( X9 S/ Z/ x* T7 _# |9 w( Q
- O* e/ D$ l6 A1 H/ f5 A
: x4 f, _2 l: \ N% K0 l) r" x! J" W0 P+ m4 ]! y
( U, F3 R* r9 g s8 U$ ~: n* v& M
9 m/ B; U3 b' P8 W* t9 `1 P
! [0 f( q% R9 d- i# t6 U 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 5 w( W1 V. k2 @
: `) L7 B' l6 R" G% ]: t; d
; {5 T8 K; m5 V9 J / b, u: I7 q3 [% o5 b5 y7 M
/ h3 P" Q0 J9 ]$ x5 E1 y. k j0 w+ G( C, K2 u4 G
、
4 n; C, X/ [& w4 z9 Z: x2 G( g % N ^3 a: \1 }6 d5 [3 T5 a
1 Z* d; ]& P: O7 f: V% C: H* b
$ J h3 u/ X5 e; Z/ D- R# s
3 Q* O7 ]' D2 M9 P* h* h Y B3 U+ U: g0 D# n% I
权限信息
. g7 t- [0 v. N; T( l
6 v# M' T2 n' |# S& R0 \/ n# {
7 G& u1 W, l% B. s) T 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
) g% i ^8 E8 A5 Q6 V a+ { 7 w7 n0 Y U( p1 c2 _+ f& |
0 k$ F) i( `2 h( p/ O) f android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 $ `) o8 u# Y- y
+ J! }$ e& D: _, p
1 ^0 |( @$ k. D6 W4 ] A/ S; N' t - o* Z8 m1 D# P# o5 a2 }% U
8 o, z. }* G' R( H1 I2 V
$ u7 w- b9 w. p j- w/ B! s
& F! l( y. Y6 Q% P
7 f: M7 Q0 R( s; j0 b3 e7 a L; D: R
下面对这个APP的所有权限进行详解下: 2 B- I& K2 u; d; [. F& Q8 V3 h
' W ?( y3 b3 I7 W& ~3 E+ e% P+ @0 q8 D* }# P) D
android.permission.INTERNET :访问网络连接可能产生GPRS流量
8 L9 k% ~( n& \ V2 N9 A" d8 G
. b( M! e% v; c4 Y9 n- b5 ` ^) f- U1 c
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
. ?* W$ G0 l. H0 w5 G
' @- U; o6 f j2 U6 G4 {' G2 t1 L9 `
; [$ P- T+ z0 p0 x1 |% t$ n s+ J5 n android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 - `! V8 b8 J$ ~+ y
! D: y6 \5 s* U1 f8 t# I) I# g6 j8 B3 S4 Q5 G3 z1 X
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
( b4 X8 z0 N3 z & l, T* R; v) V0 l0 v$ F0 O
: B4 I- u, X# Y% s9 u! { android.permission.WRITE_SMS:允许应用程序写短信内容 ! V+ N" M$ G4 o
$ t5 M# K: o% T9 T7 ?6 ~0 H: w( o/ R' e) O7 C: y
android.permission.READ_SMS:允许应用程序读取短信内容
, d6 a+ `: S$ _0 W8 x% [5 \
! s( z4 r- t7 }9 r# E9 e
; k- n- m8 V, p1 x! @/ r android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
% ?- I' F: Z. x9 V' w * U/ x; P/ c G9 ^( x
" m2 b3 m5 | ?$ H2 p' v android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
. F) V3 @& p* d . v' w! D$ {7 p! ^3 t4 L* ]* w; J' u
2 G7 E/ j" t/ r7 `% E android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
; G7 \/ v+ k$ K$ A) e) J 3 u# S5 r H+ P( f5 K! L
7 o# f1 b1 \ b) Q1 h9 I android.permission.VIBRATE:允许振动 8 G5 W: Q1 b: v- |3 {) Z6 v
/ f. r& r$ m2 q+ A: l. E T. S0 W, o: t
android.permission.READ_LOGS:允许程序读取系统底层日志
/ j# [# Y X8 o$ Q8 B9 ^+ N
! k ]4 b2 m9 r5 q, f( E
; @: Z1 O8 O1 Y( b5 M6 I' z, A android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 ' X6 v4 w. R/ j0 l7 I* Z! l+ m
; J: T4 \& E( ]. o
t/ Q& f' d H; }' d. M
7 J4 J% F$ |2 u$ o; R1 ] 7 Z+ {% R4 Z/ [( Z* E
0 m1 c/ |4 i1 N P" F5 Q9 k 功能信息
1 Y. t2 L6 A) j3 L2 F$ n
! {$ C" B' s* ]. I) h
9 S+ U( a0 e6 @1 s( ]* g 2 L* x! g0 M6 S" R* G" _
) E% ?+ a$ y) s% ?0 @
, p5 C% y( i* F2 ^+ t6 {. S2 Y0 b 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
8 f- x& ]* G6 V
- h0 Q2 J# _2 o5 Y, {' w n+ K5 t& B" Y
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
, x8 J1 o: h& W * F% W/ `* U7 q7 m) ]# |, R
; b1 G- z6 |( _3 D; O5 M6 {; M
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
9 ]* l8 Y( C/ Z/ E# i. t! p ; w2 `5 g, X* G& N. r4 W/ C9 Q
/ T% R3 k5 {5 _3 e 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 " C/ E- I8 o6 I' {$ @% X
, I2 G5 C# X7 U8 i: J, c2 z- e) u
2 J$ c( _3 Y/ O; {; O" l& W& _6 h( e ' u' v {1 X* F2 n6 b
' f1 B; Q; k6 J8 p2 k, M' ~# x( [4 q5 q {0 K) ~' ^# H9 r0 R0 b! c
$ b0 r7 Y& I1 a: G ]; s# z7 ]* q+ ^/ T- O
) ^# F# n- ?8 |4 m: O 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
' ~$ f; E+ B% J) _* u
& n; D1 a4 l$ p. {% ]/ k5 n1 c- D, r w# z% l6 x( h3 o" A
5 k3 y4 w M# w1 J" g
) W7 C v% u O$ p; L) }5 k" E; ~& }- v, y+ P+ S
C3 G: u; S. X0 l- B + C, b1 u0 c4 O0 N
" B! m; @4 \: D. j0 ~# t! I# J+ ~ l 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 ) d5 P2 I) U3 P2 ?/ l! U
, {/ W3 [/ W( X- M% R9 G2 H
- S1 l: A( I: \
( M5 ?' {, [1 _* j- o . F! y/ @/ E; Y
3 Z' Q& g8 t: `! [6 P 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
# X* j7 K6 G( `( Z. ? 2 U9 I4 A2 `' ^. l
6 y6 s# K% q1 ]9 r( ^
) s% G' F0 B- D, J% b
/ W* Y9 [6 }* S7 m; u- d5 ~1 \. M0 O& u( j
7 _' m$ n% S, i# J, F, N; R" O
9 [- `* f/ P8 n$ Q/ F5 S
, J% F8 Q# m. l) t0 M
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 t6 a6 J+ c% }. P/ M, {
& T: M4 y i/ h& c5 i3 T
- y7 @6 C: |2 l/ B" F: j2 A LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
1 v7 K3 Y' V; \3 `: @# f; e: n: K
( q8 M( C7 E# `% V8 `8 P
6 e4 h8 `, T4 _7 K. `0 s' E+ j 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 ! ? W5 D4 ~0 Z8 J3 D
% h; ^) J7 x; D5 v- F3 F$ K( _+ v6 k: e: {4 U7 o
开源的luasocket代码可以参考学习下
! x6 z6 O; |5 L+ ?+ [) v
8 X6 N/ x) w4 v7 @- ?; I& \: E4 }/ Q f. |
https://github.com/lunarmodules/luasocket 6 w' O1 B/ _ \& l9 k' t
( A' ^+ ] v0 l: D; Q, g5 e2 j6 A1 l0 s
2 @" L; {0 V$ e x. N7 Z- q
https://github.com/fengye/luasocket * v" A9 |0 O8 u- p: H
9 b. Y1 }, }9 N2 |
9 R% b$ D T/ M7 g: c
* T8 B" j/ b8 }! O g0 A% S
1 q( u( x) ~2 Q9 Z9 [5 V
1 N O# e% l( X- t! I b , f: H% \) w D$ ]
' {2 d" `6 |( T! q* c% f( J" _/ i' t3 N6 z8 a. M. ~& d6 ?
% R4 d" G1 w3 O! ^# I
8 N( O. ?# _) }, @7 F/ }/ @- g
" g6 x& r: _) J- D4 r# `- a& m & ?* ?) @/ ]; d. i3 O2 _
+ i2 j a- G$ Z6 ]& I, H' Q$ J7 N6 ^1 t, D) |; @& F: w7 T
总结
" ^6 a/ i) D8 i0 x6 }- G * |4 s. b( B8 u. T' A, s
7 ^$ d' ~3 O9 m, k9 S' r9 d% ~ 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
" q2 r' }% b/ i( r( s, Y
2 M8 J w' R& _6 b8 H) f
2 {& t" _7 F# J3 D 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
( u0 r& x. Z9 \+ ` 1 j- u h. k1 i% z) z, k, o
" G7 y+ Y) w3 W' a4 a
对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 4 m( I) ^2 W& B' j8 ~2 B1 N
2 W- ^8 w: e5 @7 K0 m1 W: q. V4 o! W b3 b9 j
结束 * q1 l4 v9 `& s* b4 x7 `
& }8 F' s% S+ s
$ C. U. H' R+ F6 l* r' \
【推荐阅读】
9 N* d! S9 K8 ?6 C) e! O: h) G
' _2 B# W5 |+ z2 u3 c/ t' |+ G: V7 T* U
对吃鸡APP的分析
' N0 Q* P4 ]' q
, _4 E: @. f% B& r. v' x2 G/ q+ Z. o7 J
你需要了解的APP安全
9 ^/ @, ?% @# P* D% |0 |( O . m) n" }# c4 r" }/ C2 J( y
( a0 Z- E! \% q
你需要了解的APP安全 + X. a8 a+ y5 ?( U9 r
3 B" |3 H D6 X0 _9 A: [
" l4 \' d5 e; v% g: s
* t* ~2 b, ]7 e) I" e+ \
|