% q! i: `( c. H7 _0 J, W
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
: z# d" u2 g1 N) B! ?0 k8 r
; Z8 Z* t$ F D8 v7 ~7 [* G6 ?. y( `5 w8 q# f
# x0 ?' I( ]1 [* A
& d4 V. e r3 z9 Y
3 l$ |+ q* R9 F1 K8 N( \+ b
; [. f% r# F+ q$ \ $ R! o; ^2 T" @: \% U
* b- X. G) ^; _1 z$ X
下面就以开发者角度进行解析下这个APP的功能的实现原理。 # G k( d/ c$ q5 s9 S; D
# ^4 x, g" D0 p$ e. M1 r! [" V
3 B; W6 o5 `% _4 m - ^" h. |, a8 N3 }. Q
- {& W7 Y: C( c* X8 X2 C. F5 ]4 |3 @& R( {; Z2 e6 Q; L* d
基础信息
4 \1 b) Z1 C. i$ U) t0 G7 J) R: A $ s( z5 U/ i/ E+ g0 I' \3 a
: a3 J9 {6 b7 u2 r+ ~5 Z+ f
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
- S0 y/ Y1 ^3 v% w6 @1 }
' q, `: @, p4 i- q+ P) I
" Z7 N) k2 w; E' _" r# H, e6 G- U- ]
( g; K* J% u( { . H6 z: _7 B* {* M9 \
" Q, f, r+ E5 U! y " f; A1 F. {* `. _
" f5 x: L; ^9 j( r% F7 `% ]
6 K2 t' z J& l. _9 u' w 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 5 F$ _4 l2 z' O5 B2 e! r8 I5 r
7 S$ L1 h2 x6 r
2 Z3 a% I2 w5 A * S# _( E8 A/ K! J/ \5 k
2 [; e2 s* \" D P: M
' j2 _* y( M+ r" G" }- j ) Z' P3 H/ Q& {8 r
- g1 T0 K6 Q0 M. h
- H9 |8 L( _" F4 n. ~ J 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 # T# A6 h! U" j0 r/ k. T( J4 T
/ ?7 Q' F1 w! f' G, \/ ~9 ]
0 z. i( u4 J: Q( {3 I
: y. j3 Z0 m# ~. F: `" q( c! Q 5 B9 p1 `5 \5 l. u
6 l' r( k$ Z# H: {
+ x- A7 q3 l+ J " }% I, i/ S* ]* U
. y2 \( B( J' o/ B; V, b; Z' B
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 " q5 e5 C, d5 ?3 a1 G. v
9 O8 S3 ^/ F3 a3 f" j/ h4 F/ c+ L: X6 Z% \4 D- H# Z1 u
7 o% R, D! k- d9 X" w/ Y6 c; K
9 x% @# u; d1 N7 P; ?
1 O8 B. a) _; H) n
/ t3 g) {5 }# J- s3 ?, g2 L
2 J* J5 X! L9 U. Z( a& O8 x( h5 }
; w$ X6 \5 H' I 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 5 }. S5 Q+ a: w* K. D9 @
' L& h* s- Y% Q, `
# D* J" O. ~/ W+ t7 t1 C# H
$ \- r9 X @7 s4 ] i) g5 U) A : F4 Y0 {7 ]. |2 R
: g( C3 M! K6 {/ d# d* g# g
+ Q2 S; ?4 m. v# q u
( u* D5 i. v/ S- C2 o/ L: d
' w F+ E2 ^' Y
; [( p p9 G6 Y( f0 V: S6 s/ n) m
$ }* o9 N: n' {) ~, X& K* [. I& @' W3 O' L! ~- R6 G3 r5 L
签名信息
3 q4 }0 w7 j( }! L 6 F( I8 j: Q- N' [) r
$ j# {6 F% ^8 j% k 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
9 S5 e4 L4 Z( B5 ^3 r/ d & H5 C! e9 h. H; K! \
( h( \& B2 _6 ~# R2 W; ]# I* U 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 5 [. m: X! p5 L4 j) A4 D- D V5 t
& P4 w4 U6 T7 G/ P: b# g9 n: o' b. Q
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 7 O1 ^2 o, t) g2 i L8 g
5 B# l: k6 W# o* V+ a% J, u4 p" v- I7 }# o2 U8 h+ D
( Y% u# b7 j6 [6 {" d
; z& O0 e8 W( A/ A+ Y
0 d( c5 f8 S" N+ v& ? 1 | h" X8 w* h# w2 c: F# p
( p+ o9 y2 h( w/ G9 y8 c c& o: M) { Z" ?( N
android签名的数字证书的一般都是采用 X.509的国际标准。
/ v8 ?: H* c# l5 r7 @* J r9 P
4 A0 D+ x. R; s; i v. @6 F- V, d5 r: s. }, u
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 9 D& d5 ?+ l+ c- e4 K: {
w' U% k2 p; ]' H) P( d8 W: k
- o" n g, c) I( J 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
9 v, z2 c+ o* n! ^ C3 c7 K( {0 w
% B6 Z& W5 [" A x5 Z# ^
; g" z6 h7 {8 [# h8 U4 v. h2 l : O3 U/ y3 s% i# c: D! r
m" j2 T* J: j/ L& L5 \$ V
( [/ T; g; |/ p! Y- E& a* X; I0 [
1 W3 g1 q ~# l+ ?2 [
+ E4 L/ W6 g6 Y9 f/ i O/ x) p3 s9 V+ O4 m5 {' v- [. u' W
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 % W3 G l* A8 q
' O i: v8 T) g% s) R: y( r& U* u4 Q O1 C7 o, A$ Y. i. |+ u* K+ ~
+ q U2 o3 }# g0 e2 H
3 v' ^: d6 W k/ M- k% z
- q6 D4 a. U8 Q2 O! t+ @/ P# d9 X
、 7 e0 _$ ~1 ~: J( V# N' _" r# Q
" ? j& R% t9 P! v; F& n
! h( |3 J( d6 Y3 g+ j7 E' d % F. R* {3 a/ ]: i; {- i, k
2 `3 P2 J* }# \% |& e. Y- m/ ?" k0 E
权限信息
0 T: G7 p/ K' ?, [$ U D 0 I: V6 I+ s& A% k8 q6 P
* F1 D1 B* z& g; ^, U
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
- L. h7 `" U4 ]2 D8 l' H) P
4 l ?: l( Y& Q% w$ ~
& }& L- V- R* K) a- m/ k android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 9 R* x3 w n1 E) l$ R6 C9 B: P
7 \6 Q$ z g+ L, H- n8 f. x a( w! }8 b4 o0 x
5 |* M7 k- U2 D/ s$ n8 R$ _
- v. J8 v% P7 P2 k+ R7 p3 C- M3 S4 z% G
7 k# {" o- n L8 \. T. A' U8 R
' v9 A) l& ]. }, B5 n6 ~8 x5 G* C: `9 a6 R& l' X
下面对这个APP的所有权限进行详解下:
! w9 G1 D+ O5 _7 g 1 Y7 u, e( n3 j
! {/ ]# H$ P' G& _5 r android.permission.INTERNET :访问网络连接可能产生GPRS流量
1 Q4 a6 [3 Q" K/ Y * N3 V6 d8 L( W% ?. h1 f( }
: V* i1 }$ D$ t
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
& f v6 I( T! s/ F5 V6 w * a0 J+ ^5 A& w6 `$ R4 N0 W+ u
# N" S% W; m% q# Z4 M5 H& {; P/ Z android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
; P% o. v9 u" U5 W4 S 9 O' }% w& u6 l6 ]8 L. S$ W
$ r% l; j( w/ _; ]
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
* O' o7 C$ R5 k5 w% `; ?
5 i$ k8 X/ ~5 U t% d7 Q& R8 Y2 e2 ]/ w0 p8 w
android.permission.WRITE_SMS:允许应用程序写短信内容 8 u* K9 a; h3 P" O8 ]
6 @. o6 {' W2 S/ X
( L/ `2 G4 q. n U7 @: [
android.permission.READ_SMS:允许应用程序读取短信内容 4 ? c& ^/ ^( y, [( t% H }
. f. n" n1 r7 X; H* S+ }! i
- E e" C! V9 k4 s. ] android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
, J4 a% o) \ B# L, s H+ L
$ {+ u# t0 t9 R$ l1 N d# s# Y' B; e4 N9 {, H' p" Q
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 0 b+ a! X* N& ?- x5 U4 ?# O
W; g3 @8 l, ^- K) Q$ k! N- N# O% [- U' Q# F
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 3 t$ P0 g6 h7 p4 ]
( I# c$ ^' P; K1 O+ Z
' @4 N: |# _7 B: P android.permission.VIBRATE:允许振动
' ?6 D* o) q# W: {( `; Q5 \+ S 3 \( J! }6 w" y3 Z2 V5 D
* t! h Z3 s1 X& Q& b/ ? android.permission.READ_LOGS:允许程序读取系统底层日志
* y7 _% B. P3 E/ U) Y7 h( W$ F 0 x: K6 X) f+ I$ m4 ~/ F2 K
9 r5 t( J) h, M0 a. Z' J+ e android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
* f3 _+ }! G- J+ Y" s
% U5 Y3 l0 q0 |: r
; c3 d: a5 U9 u4 N# P( E) M " V+ E8 `6 I4 R+ s
4 [# v& |* W3 U5 F* u, E7 D2 d# b
功能信息
) ]0 r. U2 H. I
% I1 K! U8 s6 N$ x1 T
2 R! e" ]: k1 B9 @& ~) h9 C* o. m
: M( z8 |7 U; M* f% Z+ F 8 ?8 z' V% w+ `
]2 m/ `' m2 S( |. ?
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 ! p8 c4 }3 n m6 O; e# k2 U* l0 ^
7 A& B8 ~, `" K6 ^8 Q
- j+ E0 v+ V+ O! D" Y Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
, U# e: M( z3 L, d- w: ^! C
2 a( G0 Z/ ?. ?0 O( F; N5 @" E9 A7 S7 V, G( \; K+ Z4 ^
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 5 M6 Q6 S+ j0 l6 B3 {" @
( p4 E) @4 f g0 H
3 G" F5 ]6 }7 w 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
; O# n6 @8 ~8 i
& U! C8 R s% ]
* r5 C$ V8 U) O* P1 ~# h% G' d
6 t. H2 A$ s- k% C
0 u# I* A8 I4 q/ j, N3 L8 f& J6 z- q4 a6 `; w
) Q5 o" S7 I( ?9 u
1 u) @3 A% V6 ~, O' I+ i1 I
+ D# Y8 ?/ u" v2 P+ K' s/ s 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
+ a& ?. m" V( m2 e0 J
% l5 m1 @$ @' F; @5 Y3 \* B% q1 a) E) {2 Y$ H1 Y$ h. _
* Q8 s; W$ `) L: h4 ]
0 E) G3 Y& G. q2 o& D5 h
5 p5 a9 Y# J, |0 ] 5 _. N+ J8 k6 |! u* Z8 R# C
7 O P. }2 i: M3 _
7 R0 u! J" q7 ]0 Z' w4 v- S
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 7 @$ [+ x w5 M" a
7 J! P# N9 H8 r# U
! M" h* k; \: R A* L5 Z8 U
" E% Q' k" \9 y8 O% n* V+ ]
# X( f& {& A; V+ |) L* @
1 x. g2 r9 `1 @) @7 F6 l 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
+ M* l0 G U8 p
9 e% Y: X1 e6 F/ ^0 V1 _9 G# G2 y2 p- k! j6 V/ V. Z
, f. g5 }# R8 e+ p) }
) M8 E, L8 c* V0 f, D7 P/ h3 p
: z* v; E) }! W/ L. e( {
4 D1 K5 j6 n* R( S* W
* S1 h8 Z& d, W; ?5 c* \# I" o, K4 W
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
0 J5 A1 U5 f) f+ C5 Q( G9 {9 L* u
+ L& x9 J- t( X: C7 |/ F1 Z5 l) R$ K; ^! D! Y
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
) Q$ w) C! e. v# D# h
7 j# `4 q* m7 k# m1 j& q, N, P. u2 S b) A
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 8 C& |. Q! g! F3 y. h
5 d9 T! n6 B: \ @
5 S: X. c& f# }" b4 U% q5 O
开源的luasocket代码可以参考学习下 ~3 t) C9 s1 J8 _% l ]
7 L' l7 \8 D6 C+ b: a
1 G: O( \" m \7 t" L& r0 ^ https://github.com/lunarmodules/luasocket
, M, k2 \9 q3 }; t ) E* L& q) R" @
8 s( [7 U9 _& T- D8 }
https://github.com/fengye/luasocket " o v: q% b& T3 C5 J7 k
7 {8 c5 u& T( ^3 p' t! x
3 x1 K3 \: _2 X
' k/ F* k8 v! ]. Y+ r
N$ X n1 K' e0 e
' v1 C# e: Y) ^# a 6 r) p7 q0 z8 c! s1 z
P ?! c, W0 ] W' E: j9 \4 \2 [, k `' c2 `$ R8 v
% w" F; U. V. ?
; f1 k0 R) Q& z; G, x/ z2 f0 {7 ^+ `) `
, G. A1 Z% i. R3 Y& u' E / t# a, c* d( _% w& v' Z
8 G6 [2 g6 e* y' K% z+ g& ~
总结 : ^# L( d$ {/ y5 }
2 K# y5 }' e0 |, k" t
- G: _' }4 J: b, H3 U
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 1 H2 U( R' H& `" Y: ]" n
+ ^5 E8 x6 |) K6 b6 P; G! N' E
" |) Y8 r" T" @. H D 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
+ \1 H" d x, ^ 0 V, @) E* M' E1 j2 x i" E% |+ N9 j
+ Y. [. w! I' O5 j2 H' s5 C 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。
9 Q) P* I0 j6 j- y/ f2 O : N( ~/ c7 ~3 A" R" |- y( k
3 G3 W q# J! s7 K7 l
结束
, i7 l5 U6 @" a1 T" P ] ) D+ ?9 v$ ~" L& P( e2 o/ C
# A: @1 h" t5 [
【推荐阅读】
- y8 T1 @ q+ R. F( A 9 [- G' X4 B7 C7 x( v* o( }
3 h& E a5 x3 w' i7 C5 a 对吃鸡APP的分析
" m7 m/ C! h8 H7 i 3 r8 d3 n1 k$ [; n$ q! l1 {; e5 v8 j
! o) X, O; D& x0 B- e3 ^+ a
你需要了解的APP安全 5 ~7 |2 h6 Z2 ~; s3 r6 }
# ~7 l2 n7 ]0 M& O9 V/ J& P. N( b
0 r" r( {, E. }: O5 A+ y 你需要了解的APP安全
`$ j/ E* c2 i, z% _- A4 A7 K
n) X& _0 f5 Z3 v+ w4 x3 P
3 m* H- v3 r/ [* @4 F ( ^ z% J+ x b) e8 s2 w: D h- H
|