|
|4 K1 @; J3 ]: Z
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 " u" C4 @2 K% m
2 p$ T5 }. y; p! C
! m" Y* w: ?1 Q& R8 Z( m& z $ v& d6 _$ m0 n
+ h& c, T. D& i1 m1 x
* r6 d7 o; d. ?* o! i5 g+ }3 N
! N5 @, T) i3 R: R; [6 J* k
* W! Y% O( \/ q$ \
/ N, [' y$ l: a& O 下面就以开发者角度进行解析下这个APP的功能的实现原理。 * K, L" P* R1 p* u
) J) W0 @( p6 g( C
0 X0 O( L4 Z" @$ N n 0 g' \- Z3 F: C- u) D4 Q0 d/ J
7 o$ O, m" ]5 Q4 ~, `8 }- n
5 N* d1 e5 |' ?* @ 基础信息 ( Y: z# j) O; P6 D; ?
( }" s7 S6 x" K
0 k, O* P, o" H1 y1 H: X( ~3 o/ m 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 8 g& Q' Q2 D+ v$ I) h
. g& s7 D; \; x1 ~# a1 ^1 o- U
% X& X4 O9 k4 [/ `8 d( b7 F 3 E& m2 e& m& v, G
9 b7 T9 ]2 }; H# |# x1 f: I) H$ w
7 R6 w5 `7 F7 `! b( l( w- d
1 Q6 e8 @% T8 Q0 z- ~) P$ Q
& l! j& P$ p. d' Y. C9 b6 j7 [% R U% } P
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 : w$ K! C3 P# X% z- D3 C0 N
3 g8 o* c5 K$ b j' Q9 }8 S/ I+ k; k2 _5 v% e
+ ^7 b6 \2 v1 N' D# B
+ w6 H% L) H& H) S( ^% ?. V) x, i# ^
& h# f* f0 K& T0 F1 i# V% Y9 K
/ @$ a) a5 {1 b0 c' W Y% B/ e
' t# ~+ O9 k/ w$ ~ 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 . [; k3 f5 w. |7 x
0 q9 Y$ A3 b+ r4 Q8 L k% L$ o; ^% i) t$ h# {
# w; B" K) i) T9 D6 j6 y n* H# l2 z
7 V" ?" u6 w6 G4 C. n. B2 d. g0 t( u; D
& ?! L4 `1 T4 k0 D" M* t1 M
% c% n& \- `; F' d4 N* m) P8 g( z
" T! B* ]3 ]* i* [. s/ z 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
, L. O4 r. u- C6 _; |
' w3 @- d% N; n+ c e* d6 E8 ]* D5 p* S' i" i
; f7 h# m5 B$ x
9 b4 W0 w! q, e, T E" T) ^4 m, ]. b
! p( I1 O7 p3 W! w' l
* Y' X. S- L' a1 `! i! |8 X# [% M: T
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
; y7 N0 U5 A8 k& g! u
, q( a7 `+ F; t; v) a' {+ B
* L3 h0 `4 e) m 4 F( ?( J$ _ n- T
) ?) [* V; E1 R5 c( O0 |
: O4 Q9 h! Z1 Y5 w ; j5 A' k; R Z, V# ^( t* J6 B
: |& ]5 b9 M3 C8 T" b
4 _$ v* H& h! h$ r. J1 j0 y; b - m3 F( x8 v" V0 B R4 L! _
8 A! P9 \1 ~' o: R* o
( T" f" c- m, _2 R% t- n 签名信息
( W! w- b0 O$ Y) i: K0 ? 5 |+ q% q0 ~* |& s) t; H" v& q) w
- ?5 O" i( G' A0 X% ~+ K, k 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 7 Y8 z2 s; A/ X0 }4 C! c" D
% D* C' S* V0 \1 O7 s3 B
7 l, u' D$ {$ `4 C( M- V- _7 O
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
* M$ \# w* L+ h+ h( t# i8 P
~* j$ P: |9 Q/ r3 ~5 q1 b" G+ n; I# t: c6 U1 U
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。
* j' K8 E3 X6 {: f! ~ & y8 U$ v) W8 |( j
4 x3 M9 K- L7 ?# z4 m. n
. t* ?( R/ h( Z. \
; O o5 h! J4 ?$ V$ [) @8 W/ l& r- ^0 \, X
4 q% f" L! ?: T6 r/ p, e5 [
9 z& }# `& k) }6 ~* h
8 \! D$ |# }$ t, T android签名的数字证书的一般都是采用 X.509的国际标准。 & L e9 b% g( U: a7 L0 R4 _
4 Y" k, ]* h+ C$ Z3 w- p1 h
+ _8 S4 t0 a& e/ K# D2 o
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 ; }7 {: @1 L0 Q f3 v. |& e
2 C2 Y/ @3 N9 Z
6 H) W% } Y6 f) n& x 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 # y I# l; A" h) \9 S
! ~5 v! A& ~6 Z& d
0 p9 s. I: j* d
+ l2 W* [" [, j2 ^& f
+ t+ u. k6 `3 q o, t9 h2 k. V3 i7 l) f4 ^( ]. \
% E& L6 g' M, F' q
2 I7 [+ \$ e6 y) E% H
# r! ~, ^! G6 o D5 ~: b5 b& X$ E/ h4 I 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 $ @8 ] E; @' ~. n3 U6 {) H9 l
; p8 O& u# J4 [3 a) f$ \
2 y. J0 g$ u3 A; X' ^, `% D0 U
3 J( y' U6 ]. b& v H
) o, }8 c: T& C& j( m& O, M+ F% I8 s
、 6 P( h- p$ ? J4 ]7 N3 o
4 n6 ~( e5 o" M3 c& W, ~2 c
7 E: E; k: p" L" o) ~" G' ]6 O% M % @2 F' h7 d; A% u' V7 O! g7 H
. @6 p$ K, n" H
% r9 Q1 }1 y6 ?; {9 N8 O+ B 权限信息 ( s6 h% A6 U" P& U q- _1 b Z+ m# J* N
7 w$ {9 Q( i. H( H z
9 R3 h3 y3 I, ?% U; C8 p- @ 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) 1 E/ u+ q; S; l* X4 s7 u7 `" W
3 O4 y# m- L- P5 l3 R
; S# Z- ]% S# c
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 1 P5 e! o- W; p. |/ R- F4 `
7 V f8 ~# h$ H2 E+ H) V
) B5 G) I4 |- @) X
( n' S9 O8 s4 b( R
r/ c r7 Y( a5 j( n) L4 Z7 ?8 p9 N$ t1 P
8 b+ u' J! ]/ D9 w( U
* S# J, S# K& O6 ?5 _4 S1 e
! A. u$ e% p& ?( l- X& J) O 下面对这个APP的所有权限进行详解下:
# }$ p5 e: l' c; k8 c& n5 z 0 O, I: X$ n. i
" ]+ g5 d5 J0 O
android.permission.INTERNET :访问网络连接可能产生GPRS流量 . ]7 P! L0 a+ ^5 j P
0 b* l9 Z* Z# t$ }
) _" T, w- {5 L2 k9 @
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 + \2 i G+ B' E! S# x
& j7 t% S9 Q+ x6 A% t8 I
+ S' e, @" L4 S- ?) l android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 " D/ N" S* B T+ v
! _; i; e7 o U' M
+ L1 }0 t: A/ R6 s6 f4 [6 ] android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 ) v5 \1 h; ^$ e4 e" v; V
- ~3 n- j6 x8 I) M* k
! x9 h+ {! h3 `! ^ android.permission.WRITE_SMS:允许应用程序写短信内容
) Y. D# z5 C9 |; ~# b+ B : w/ o7 j" y7 p U
6 l1 T2 {& A* E3 Z, ]3 f
android.permission.READ_SMS:允许应用程序读取短信内容 9 E2 [4 |- Z+ b; n' b7 G
' k) j d& z+ @; r* z
$ |1 x( b% w* l$ N android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
; w, A, Z9 M4 l% K
* f9 m8 N3 u& g b2 b: S7 C ?. Q* ?+ @) c# }5 Y
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 4 m5 O* M/ R5 C
9 z6 Y O" C) y0 v
# ?- L( e. h v6 v1 g) Z( Q android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 7 `' ]4 W3 G0 G h- `
; e5 p0 {+ H' J" K
$ m* y+ S7 g+ f android.permission.VIBRATE:允许振动
$ r% H1 K( X w
4 g% v5 E" M. ~' a3 _* I2 u# ?" O! \3 x; D; W- T3 p2 s
android.permission.READ_LOGS:允许程序读取系统底层日志 ( s5 Y h- P( G' t: m1 v
+ G0 c' d/ B: f) P' a9 h2 o/ }) {/ d' |
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
3 T$ v( |7 x! Q1 @+ H , r" _' [* u5 f4 b' r( u+ L
) @- i) l3 P. D- ~0 Q: Y
4 u* q$ } h1 L4 T, T- o2 v
, [6 a/ H8 ?9 H3 Q2 [' _4 `
; B0 }9 B3 y" @* s 功能信息 7 h! h; L/ W4 W4 w8 o5 T# j
4 M0 W: \, }7 o4 B& p
, w# H$ ?, d% ?( ^: j( W4 Y3 i
4 `! Z, C: [ [# P' k6 ?1 V& [
! p* |# q# E% W/ ^
' A% f* U$ ]" Y+ O2 S 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
1 V/ `) I- _2 f1 }/ Y( o) o4 J
# N1 o! A, X* _5 X& [) k1 ^& L# A2 p/ y2 {0 |2 p* {! r
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 3 |' ^+ N5 o: ~+ T; H7 v
8 Y# v6 a2 ]9 i) u* n/ Y
: J0 g$ e0 V2 r4 b$ S 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
# v; B1 d: q9 l8 J, R2 p
; K- k: H; M1 [" g0 M4 n1 L( P8 f8 A2 W$ g1 C3 E4 X
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 / e* o0 V/ g% r) j
3 T7 a0 t: B7 [6 L+ a/ `6 q
9 z9 X: U! ?# A, P8 x $ {+ l, F9 S/ z& c9 H
4 g: t3 i. q+ m. ~
8 `' S5 ^1 J/ I, d% r0 A+ _' M
" Y$ J3 a8 A; e! C- d
. O* D! `. D- t' B: R) i+ K1 d$ Y6 B$ K4 L+ t0 F
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
4 d% ~' F+ v' }+ E$ v: l% E
9 i; G! }8 O; u
4 B4 T+ }% o1 g: G8 M1 u! C
; P3 O! Z* `+ f: m j' f" d# ]
& w( K( g7 N5 S# Z8 D+ y ^4 L3 S" R! e# e, K
4 Q% E+ Z. L- d! y7 t/ o( r
$ @* C* l' ]/ j% y1 [3 j9 u! U" \
4 y, F' j* q9 H1 j4 p. y 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
3 ^- j# T7 w4 r. P* N# U ; ^; B2 v! {* i5 P9 D' d1 G
- f" i& G0 t( K/ P
J0 }6 A/ c$ g. j% H# f
* h2 f; M! k' t+ S$ O% x0 l
8 x* J. r/ c8 C/ b
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 ; l7 n" j+ I) O% @: f
& S M: c9 z2 n/ \
0 t" z6 [5 h" ^
' \6 H0 N' L/ b7 ? $ }4 e: @$ @3 g
# t% C6 H% P- V
' ^ ] H) p! E% E5 P
5 \* W: W( L7 ?& c( F# R
+ F" h4 r2 g5 c- V/ r' m; b 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
$ ]/ J% V3 ]! d1 c5 P c6 t* X 4 j% u* ^2 j; A- P1 A$ S
, c- J5 D; l1 C/ M7 Q; k
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
: @; G8 D4 a9 o" [6 g
+ _* i1 e& S z: r D$ d6 _
, D# U" P* E& B: Q' E" O4 _ 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
: a! y" R! X M9 B a- v8 { ! f' }3 {% f( `/ i1 u
: i% p/ M0 x; P% Z/ I 开源的luasocket代码可以参考学习下
6 B& v& W p. a- d' S
9 b+ ^4 `; y- T% X ]2 S" Y& D) \+ T" O! g' S& k' W6 |( P& G
https://github.com/lunarmodules/luasocket & _0 W9 q: W/ i, o; |
" ` g) c1 B1 Y2 Y" J. m9 n8 l' a8 C
: m, ?0 t8 o: i k/ @3 o/ I
https://github.com/fengye/luasocket
2 `& {5 s' U$ G5 q) q5 V 1 {+ p' \% r$ |7 p) i) W t7 V( G
+ h/ b+ i; N1 J7 {3 Y' U/ O2 q
0 s _1 K! P D4 f- L4 a$ f! |
- `8 _2 W* v) l/ q
$ Y# v2 r' V/ a+ T
|/ }; @9 J2 r9 R0 a7 a/ H' d1 o * @- k5 B+ b# Z N" n6 _7 P5 N
# E" r, ]! P. I8 _: h' ?
. u; S7 v# b* s0 \8 F! o; ]7 V
; {) R& c9 d2 \; L" V0 J) @7 P
' V6 T/ u) @% B2 q1 U- a; o+ A
; L3 Q. {- ]6 E' P, o1 E' N6 ^
- { U4 h" z* X/ c& e4 P0 M' H/ Y) }/ |( F
总结
$ ~$ ^; s3 h0 p- `2 t$ T ; C; d0 @ d W' Y
3 E, n7 }; N: F, M. s 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 " u) y; G5 b# {- j9 T
- W0 c* p! N: C- j" s. n
7 b8 \% _0 G: B9 z1 D 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 4 {% \4 g V* P, D+ a8 s
9 Y" k/ D; O' m( l8 C7 U+ m w4 y* \2 M* i+ y6 K% w2 S4 w9 y9 b
对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 % |- F" R. a7 U5 \( F2 K
' U/ [1 L* l7 H+ i# j5 g+ Y2 g9 _7 X% K& m% F( S
结束 ) o1 {9 R& C8 g5 Z7 m
4 X5 d7 P- J' f3 B* H( m: ]( ^. }% L" i
【推荐阅读】 ) E$ Z0 Z! F C3 U; y
; Y$ S$ f, p) x9 T* H8 [& h* I) S( u) T4 @& h
对吃鸡APP的分析 9 V J6 R4 d* E0 A
- f: a1 Q+ I! y0 X7 ]- T1 n7 J6 x6 L8 N; ?7 t2 n
你需要了解的APP安全
* [" V7 ?( A; V' |$ U* x5 Y
& N: I" @$ R9 L5 a! Y& G, r* v- t: A5 o4 n: _# x. b4 J
你需要了解的APP安全 5 I, _' ^- e0 q# r9 s
5 W: E% N% e) O/ Q( F2 S" X8 u/ \! `8 i+ q. m
5 y# P- {) P, ~/ |( f! u
|