|
9 Y9 o6 ]7 p3 [) ?) ` 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 , p% m$ T# O# L9 Z, R9 o I- b
7 J7 y# W" B7 T2 w- L. P( @% Z/ a$ A
6 o0 `+ L+ M& }7 c5 C+ \
, ]6 S& j9 Q6 e1 e% M( N0 Q8 n
0 C: G- b# @) I. C
7 W* y5 N0 }# t- v" t. Y
9 s# L# S$ @/ L e4 y8 I1 Z) s
; p3 H# D& q- Z7 n/ ?3 j" }( S4 M+ x" v4 k+ A' r, x& |4 o9 X
下面就以开发者角度进行解析下这个APP的功能的实现原理。
5 E% n+ ?) B6 g# z/ H' I' ]
+ z5 I& |* {, s; w
) n; p9 c! L6 |' O# C
: }- B) ?( U C# ~8 q" b . \ ~ u% C/ i$ R; C6 @ \5 V
, a q3 l) [$ _, @/ Z) }; ^
基础信息
, {3 g' E& t7 P: k' y$ G - ^$ V# ~7 o3 ?
1 e ^/ K6 E, X9 u5 s H6 N3 W 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 % Y4 x; Z( W( Z9 v
1 D, y) t( m3 M9 n6 F- K2 B$ q
/ a# B' r: A4 S }7 a0 o7 C$ m
5 A( x' \7 h3 ~7 u3 @3 D+ F- U! _3 r
8 Q2 U7 G; e- [: {/ c9 b- r" L
- y% _! t: E& g) t + B# S7 i+ c! o! q
4 c$ @. a* `* F# P k 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
' l$ A! a+ i' M2 ~ c! q % U3 [7 Q8 A1 o6 S8 a# a4 K
' z' y- ?$ o* F) N
$ ]" J. ]4 \" {+ }
7 f! @ B/ D! C2 s
. e9 R! v8 c4 v# f- y, T, A 0 w" z/ m5 K" L' }7 X2 j
6 z& B: J7 g7 c
7 q+ `/ b9 u* }; X 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
/ F( t3 a A: B, }7 ~1 p. s' o
6 a6 G" k: x. p2 S4 Q# @) `3 g; Q2 ^, n: D- F
8 L) P% |+ v3 N! K V$ Y
# l, O" d; j- r0 N9 W$ b8 |- b8 |8 n9 O# ~; S) U7 I- K" R1 x
6 a1 ^3 \% O& H5 B- E3 P6 I
}* ]+ k( g* c% B( t" r
( e# |. d7 ~+ ^' C8 j+ ` 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
. b4 g. U! y7 j! H- x
# t9 ?8 t# R/ V- n0 D4 \/ W
3 K( k# y+ d; ], Q" E3 z ( m5 O L' V2 Q/ y- x6 Y8 w' D
1 [4 @2 s8 t7 D1 q" l; [# n+ y! D
+ M+ d- l2 k2 P2 P* {% q
( I9 y$ c3 ?; j c; T+ X7 w4 B% \
$ }+ T4 X: f# u/ q x. `4 f% r) X7 _' q. m: K) S3 C9 H7 L
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 8 f3 R4 M9 K. q$ g4 r1 ?, f
9 j, r0 \5 a2 X3 C* y/ w* F) K" C) `
0 \% ?2 @4 u1 F/ y
: b7 |, T9 K) M
; K' T" s7 a& }- `0 S! X+ N9 C8 F
7 n& { ?+ \# b( H 1 J5 x0 B# C9 C4 O% ~
& o1 y' ~5 D) v* k8 y& Y
! g' @% f6 h$ D/ `# ?0 s ~0 I, G" P1 v8 @2 O
* F9 A& x1 V0 h: n; d; l+ ? 签名信息
. h* w/ ^! i" a# |4 Y" J
. q- R# O' C4 y9 P0 [% B% j5 u' ?+ P2 b2 \. e0 q
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
2 w- v. ] I" c1 l5 n: B
: P! A# B c, j9 y- L( G+ i
1 Q7 ?' l, E9 V9 J4 }. R 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 . g3 O' D# N# @% i
; L W* ~6 y( E( D8 T5 H w8 B4 L% D8 v8 y# @
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。
# O8 y4 m4 B7 S. g6 M
7 }3 _9 c6 i# ^% a+ J7 {$ L& i
! N% U4 M/ W k4 ]. X
8 d3 K% [$ r# e5 k0 c! z0 a2 B ) k& q& p6 O3 `! l
2 k5 x S% K. n5 Q H 9 r* K, E5 n% v9 Q
! O9 _1 B5 j! k! J. x) \
: a7 @2 ^- A# {8 R) p android签名的数字证书的一般都是采用 X.509的国际标准。 # b S1 x) K3 `6 G/ E) o
/ k W8 U8 W" W# H" Z
7 { @3 t( |' }- Q7 |( c1 U 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 " d+ G7 I+ J" B
4 |7 P$ b5 T: v- G' X/ s5 p8 O4 W) e* X2 ^, i. z
下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 4 `* C% K% b/ }5 h
0 F. J. i& ]) j* L( j( [+ T, A/ s* Q+ Y4 z
) U% L8 Z& F( y. @0 {
+ V* q3 w! h- y( S+ M
& b+ c) O! L" S5 H T & B6 x( Z6 D) E7 v
, `; K2 B9 b) a9 H: `- I9 W
" H# ~$ c( N$ x+ j8 Q) P 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 - P8 S' i# a% v0 W( p1 P! X
( |8 a' u. f$ H
4 k1 z: ]+ |) F- H, f# j3 m 8 D. ]9 B7 V4 |1 V- B0 c& `- i
$ p7 N2 Y1 q! J' h" M0 K: B
1 C/ q3 b! L& [ 、 2 L& `3 [: P' B- |
9 R2 C" n+ ~! e; X1 |2 |" Q* ?$ s2 L
% z, F2 c9 b, `8 } 6 H; i/ @" q: B/ D6 Y( b4 A+ |; J
7 q' \( E- T( p
' g& e" t ?' q4 E! b. I 权限信息
' q, K P! u, i* G% U ! |) k9 n6 ?, m
' T2 S( L6 t, T, [: O 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) ) X! a* \- T( P( o
$ D4 S7 H6 }% R) S$ S9 }% o
; S* O" Z/ Q: { android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 ' m- k' W+ N! a! d+ I
, s1 A$ V: V% z1 K9 ]6 F! O
. r& [) [! o$ n5 n7 n! q' U; s9 U * C: ~/ u) X3 e( a
7 u6 c2 S/ J2 \! K7 m0 C% [
" z1 V" z6 R5 e2 \$ ^
0 q, a$ Z* b- \# _: d7 `; R. ?, s
( g, ~% ^- u+ m$ G5 O
! X- p3 f" l2 s+ T 下面对这个APP的所有权限进行详解下:
' Y. z' L6 b" p$ v2 {9 t4 Y4 T ) L7 {; k: w9 P8 d$ y
' x% S7 A6 A0 A3 G) K android.permission.INTERNET :访问网络连接可能产生GPRS流量
' m4 k1 u# E2 Q; @9 Q; L( R$ ~/ n
& t' W9 l( |8 `# ^$ V! d
3 v( I% ~% Y7 z9 G0 q' ^ android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
' e: a" Q& l j 1 S0 ^3 y# @- U7 b1 x' z
- F( W3 |& w6 `' B3 X. s4 j Y
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
+ [4 V- o( N* e " [' n1 o' D, \, e5 ]
# c+ t4 p2 ^1 ~7 U' v& @
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 & R- N$ P, { F2 _
' s. R' l4 R# D$ W
% V4 {' ~2 @& }" F, W7 b. U5 [/ o/ v
android.permission.WRITE_SMS:允许应用程序写短信内容
/ {+ r+ Q' G6 a: V3 t5 T' f 7 h$ d2 B1 E l: u$ z4 L
" g: y) c( ^" u android.permission.READ_SMS:允许应用程序读取短信内容 $ _8 o# V: @$ d! V' o/ F
3 e4 c4 M1 C# s
0 i: h) m5 g/ u7 o8 \& | android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
5 L) d z' j% a! f$ z( X3 H , r9 q2 U5 _2 v3 G' q) h
' l$ I' S E v" W- d1 i
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 - a- p! x5 U6 ?9 G, a4 |/ g3 f# h- k
# B# { D( g- n$ b, G/ {8 W- ^& V' }- D1 u
, M; P: l5 M: u3 V. C1 [
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
; n- H" }" G' ?# B& Z7 I 4 J0 b7 Z# X8 B! q. k' W
$ R9 P5 j" O- ? android.permission.VIBRATE:允许振动 / G7 O! h% s' o9 t9 W* a
8 G# x! D- b: \0 F
; |+ Q* e" t; z& Q5 h% ?! b; T android.permission.READ_LOGS:允许程序读取系统底层日志 9 V! ]- v7 E& O# [, r- r6 P U
6 t* K9 R7 X: o0 ?. Y
0 M3 E6 Q) V9 e
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
4 ^. z# {( i3 N( q1 ]: ~
0 f# K+ E- @+ t1 |7 U. O# J r0 v. n
) W* E" y5 i/ T
2 u+ n8 h; c2 k, N" @% J8 b+ \& R3 B8 t+ ?5 Z' }+ p9 R+ ~: Z
功能信息
0 J$ K+ a2 B8 X8 U5 t+ t( W& L# c
8 I( D, s2 s# S& ^( ?- }: |/ D) L, M+ J& T4 O9 a
: q; r" G3 ~ _8 J* y5 o( ? 5 @% q+ {! [4 {& y& [* M$ ^" L: a7 j
: i% w* b/ i3 R 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 % Z0 |! H$ E% L5 Y4 X( o
# X s- s2 P- c5 P* G. j4 r. E% v
/ P" n P+ @. R4 L
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
8 V p4 w& j# o% ^% j3 X
7 Q7 L$ P3 y6 z, _- n
! c& `. \; K7 B" F$ P6 Y# ? 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 ) u# F+ T5 J) v$ y+ t F
( r- K. D) ^, l) @% s' }
: n& L' u- ^2 r# M6 } 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 , b6 f* g9 B+ T. u& t, R+ Z
- }- O' J. Y2 k& G. T( G6 C
/ _7 J- [6 d; X5 Q2 b
4 l" h% @/ x2 S; }2 O" y & w2 F4 U8 P) H
9 z! a5 ^0 ?9 r5 ^0 S
& l. J' G D2 D. r* K" b : D2 g; h7 V- D3 I9 o
5 p, S3 y. Q7 C r8 x 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 ) Y6 A: J8 i N: u
4 _1 ~9 ~4 ? H" M4 V. c3 S4 N
2 q. c6 P# L! \6 } \
* K" a" O. d9 I' [/ O 1 [" J, }# ?, P( y
: J2 v+ k/ c. m3 @; F: x
3 i1 J5 J3 J. P
1 F3 f# c6 V* y
9 M6 _$ t7 R& ?( y) O5 m8 ^ 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 . n) Z0 g c: C+ S, P1 W" ~9 E
) F; i/ e1 h! }
# d% h% z) Q Q1 I
5 c* \3 X# {! V" ~7 E/ r5 z3 g
' Z4 `. R6 G/ W9 U' |
; X& s1 d* j7 [- O 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
+ ], m6 G% e7 o9 d
/ U' E! G! ^% O# D- X3 R) T
' y( V4 Z1 c' S6 ~/ z: I, [9 H
, |6 V, T* g1 `! X b# n' |/ b1 W1 H
6 V& ~' Z$ h- I8 }- r3 M. L
# ?6 f; C# O- X- ^/ K, o# r
8 j/ ^$ w" V" d9 d3 h; y; B
. s3 B; ], U$ a8 G& G1 }- b 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 9 B0 v4 A% B; }. Y: j
/ f4 e8 p) }; o- q- Y+ v; E- g, q! W. C' {; U O8 j5 _
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
, k" C0 s" @: L, _$ G 6 e: g D) y6 s3 X% P0 ]
# }2 b5 S/ n X0 G; B. `! }5 @, H5 f 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 2 U6 S8 o4 T; [0 p5 ~' e" ?
% H3 Q4 ]6 G0 N( f5 J1 f: }
0 G$ ^0 u+ ?! ^* ]3 E 开源的luasocket代码可以参考学习下 ) T8 ~5 o8 m6 p# N3 I
5 M+ f# Q0 g( } w; W/ ^3 @9 v. @; B) N
https://github.com/lunarmodules/luasocket ! m. f9 T# J! j7 i7 E
1 v8 {( v" t0 g/ C l. v
- v3 _0 u0 E( U3 x) h$ x @ https://github.com/fengye/luasocket
* {4 b: h% F% f: E+ Y) n A
+ a1 M: w0 h# G5 Z& ?5 @4 g7 I& ]7 F" d b$ P! V" j2 R
, z, ?8 c6 `: x# _2 a3 }3 [( b) F 1 n9 [% g( R$ i( M% k+ v
- K9 `4 A# m2 }7 M* G" C- ^ B
7 r7 C2 \/ T ~/ J$ Z6 F
* t/ o2 C4 \: U# {6 [2 B
' {2 Q h. z' n( O
% @9 p5 X+ t- U) h ; M# ?2 U# u3 r7 v
}% d' O4 x8 L# R" M7 F: H
1 t9 H1 t$ N# L6 g; J3 y' O, c
9 J3 I) U( z( J- D! D- |
( O, j& ~9 q3 S s 总结 " Y# }. o" a, R7 @ {% D1 u% ~ n
# G6 C- ~% i7 F9 V9 |; W, B- Q# A: w# ?2 \
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
# ?1 G( P, Z, k. Y1 @# J " W ^* W& o8 f$ g! k4 d1 U. [
4 H: D8 Y: F2 a7 h2 ?- ~
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
: i- o! L- F/ n* _' U! k 6 g7 d8 H2 h9 p8 t7 D0 @* d
. ~* N' R! J! Q' Z& s! ]! y 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 ) f8 Y+ N- M+ H. r
Z2 `, _9 Q! k
" H( q- r1 W' n* o/ Q1 t' @3 e, x 结束 $ K& v/ ~% |; U v! H$ K
+ u5 M) ]. m6 @: p/ x" m+ d
1 c, f- `. w8 B) ]! A: m 【推荐阅读】 6 c3 T: q2 e3 b5 ~. b# f
; {& `/ ]1 V d* q! w' H. m
" @& B; W* O# w( K4 T Z 对吃鸡APP的分析 ) r! h6 U+ e; D# d4 U8 w. Z. |
9 u" p, b$ f& u: g! W! M7 u
8 c( |. L% [. i+ u5 B0 u 你需要了解的APP安全
, A- L+ k4 q" F7 J! Z
' F8 P3 G' ^, O) l
) h4 v3 N6 g; @. K# F0 Y 你需要了解的APP安全
s1 i1 L9 O6 ^: D & v) f& q7 I/ G; t# L: p/ G
, |/ {; f# v# d9 T
! b' m6 e# I8 Q1 Q4 B9 S |