|
! i4 U/ `9 n$ i( X. I5 m 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 2 K0 U$ w+ P$ ?% T2 a! r4 }0 {
8 k2 f2 y0 u2 ^7 [4 T4 Y$ ]0 f3 U, i5 x) \5 @$ }% e9 E7 S
. m# n- V. \& X) o
& U$ {2 X. Y) Q9 k8 Z/ K
# Y3 a5 u8 t$ a/ S, r7 _7 o, Q 8 Y+ F9 V' e( T# F7 z1 i
0 w9 D; q7 ]/ \) G4 L! ~0 Z
: q( J5 y" q& m( F 下面就以开发者角度进行解析下这个APP的功能的实现原理。
) `" q2 z; K* B' u
( L$ S. n- i7 h& _
) D4 j/ D1 w4 S6 Q$ q. \ 8 x' n2 K' t( A6 X) A
) n. ~+ U9 y l) A" k" |# h/ v# {/ {
' C4 O6 {: i! b$ H 基础信息
* ~5 R# z* X3 y0 F9 b
# z7 L: H6 s+ w2 a, t9 ~
0 c2 w7 q8 V' H$ q% v0 y 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
& S# @% M4 W6 V I9 M$ }& u+ J
2 F. U! x) Q' s8 W! p
; i' w; `; K9 D9 ~; ]9 q
0 I$ I/ V* s( p2 M. j% k* v
2 A `" `* {: P0 r1 Y; f7 ~6 v) h' B. m1 u$ N% |
0 H, u% v) E8 x* ~
9 q0 x$ {! `" L3 I W
$ [& a8 ~1 q1 b6 w, S# } 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 . K- Q' e- A4 F( U. p
2 D. `1 p7 }3 S% n0 H B
1 _5 E: x1 q7 K2 y) n
; D9 k- D% }+ F
# J+ s8 q6 Z4 t# p3 e5 ?9 k% I
6 c! n9 B4 X, y& W5 B
) B' S9 d% r. A9 M0 u
% g1 n8 k( I0 Q* m) o2 w z7 K7 ?4 J W2 D/ w
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
) c+ @3 t) {/ ^" `* ~) a- ? * J& Z8 F( u, g7 b" H2 a
0 u% u# E0 Q9 q8 H8 ^ ; [% s/ x/ Z+ f" P8 O
- J3 H. E6 k% f* ?' g3 _+ Z
6 g& e0 I" h$ ^
2 K2 y; I, z9 w$ X. k6 Y3 D! N ! v. Z! ~# G- P/ M6 v& b2 m
8 d( ~1 g0 [4 S5 M+ t
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 7 j3 L7 K# ^* P0 f$ Q' X
6 I! R1 ^% a% J3 m# I# B# r4 n6 M( o6 _1 g5 b1 t1 W$ ]
1 ~ u" Q/ m) [# c( {$ K4 u5 ~' _
2 q" S6 j/ E$ L# @' h; o
9 T+ Q z3 Q# C2 M4 E . y2 h* {; p/ v: z. [. A& j
) r- ] K, t2 U0 c q/ a/ Q. u( D8 A3 L% |
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
) L+ x) [4 |( N1 @$ H! n / M* r8 q; G) x# q$ M8 b. p5 h
, r* @) Q6 t7 r4 \. I# Q/ }
5 E% J* k, X9 l) M/ r 0 [! f: b# H0 o" D2 }8 `
- R* J3 O: N; @) [8 n {' d 4 k" K: |, S+ m1 j
3 y- x6 @3 ^4 n
* \3 o2 _! }3 L7 X2 U5 k; \& Y0 x4 Z5 M
! v4 C0 c8 {9 y6 L
! K0 _4 D7 D- M9 N3 k" m2 N1 y* |
签名信息 ( z! W$ p. k5 G
! X. S9 l! W/ r0 V) j" f! `8 i" L& ~: z D
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 3 r: C5 l0 n3 y' E) H: A2 K
1 N, [- a& v$ y& r7 q4 ]7 _
5 r+ }5 i5 J, d6 ^3 P; ]/ ~& w
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 . c$ B9 D5 _1 Q1 n5 b& a/ H
& H- g" t" p( N3 R. W5 z) u Z* `% ^" Q
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 7 u' {) `2 a% d& w% I ^
' ?2 J' {: ]7 q
7 l6 |; U% P" V' P
" m0 J6 c8 P7 @) |( u 9 E' ?, N+ p8 V: E* H% t ?
8 w; R( a9 x/ Q0 ?! g7 X
. X) h2 ?0 B% G9 J5 o7 l& z # C% E+ K1 `' c$ t3 c2 n
* k& d4 q5 o( Y) [) `
android签名的数字证书的一般都是采用 X.509的国际标准。
( O1 J% r, F, e }/ }# t
5 s1 i$ q# X$ m+ W0 f# Q: m* }. d: x3 H
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
) H# u+ u2 y, n2 O # r( V7 X( v& l8 e1 c/ |$ J" f
t5 T/ o! t, Q2 U3 v5 @ 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 6 b6 N+ o. }' ]
4 F( t0 E: n8 `1 X" [7 W; C
3 d9 Z: H0 M p: H; X' A& u5 u
; a3 e: b- e+ q7 \' j; D) {6 P4 k
2 Y. U6 T; d# i4 [9 r1 A2 T* Z2 z
# p, G: G) b, D+ A$ o' g! l& c
6 C& g8 h) v. a+ G7 d$ u$ q' X
2 |+ P6 ~7 r- X 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
: ?! i$ X7 s6 p" s
7 C; [. z2 G* S$ G$ N
/ v% ?5 b ?- s/ m
6 ^# o# y- C$ l2 q9 n
4 b6 U3 _% v U5 W( F: `( L% v! n$ v4 B4 L2 U+ S
、 ( ]: Z. b$ u# S6 n* ]2 \
% e- i% r* E0 Q' w9 g) Q/ S
9 `; ~2 W& K$ ? " T m! _5 m, [- r
' `9 ^9 W1 _) z- P3 Z) j8 C4 S0 l; |
8 n6 ^1 ?* o+ \6 X# W+ \ 权限信息
% J! n: Y3 K. {% X! x- S
4 }, J' s* ?( f/ m
! p# _6 T5 b$ \7 N7 j! D5 |( w0 w2 X! [ 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
6 m2 u7 A N" o, y+ C0 L( v 8 `9 z8 M( C% E9 V- s$ o
% U9 R5 ?4 V# \9 ` d6 w4 c android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
' F3 w7 B Z# U5 {5 K 7 I p1 R7 @' n
, q8 D G& v4 H" J. b3 L) ^
2 }! p( n! @) v |8 D% U ; `. z3 }. R. l9 m+ R+ a! C
4 x' n; h3 d3 M3 p
$ \% m7 r2 x# M: x : j+ B3 ~2 n, r* b
8 l6 E9 m- i" y) |1 h 下面对这个APP的所有权限进行详解下: 4 b0 S1 L- O4 D, B
0 n9 ^3 ^0 O$ M( t
3 B$ B- b& h9 J* W' z5 B( i3 O android.permission.INTERNET :访问网络连接可能产生GPRS流量
" {" H& F3 O/ q : A4 |, w4 H; k* ?4 L8 w l) m( ] o
2 U8 C$ ^' j. U# U3 r
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
) S; m# G W4 ~( i5 L
% b% P2 o$ T$ C, B8 [/ ]3 m) q
6 @+ W" j' i5 B; K5 w4 A3 d android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
F( r% T9 _2 p7 q" `9 |4 D
5 x$ }6 l, {5 }6 K- }3 W/ F( ~: t9 L/ d& f! O7 p; Y
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
6 L9 l' ? t6 v" c+ A8 V5 r
6 c+ j1 q' A; N9 U& g7 F& Z% c9 E0 J
android.permission.WRITE_SMS:允许应用程序写短信内容
S" s/ h! r3 E+ |
" I* I) B8 I# C6 A, Q$ L5 v
( ~+ i3 F' w' y. [! Z android.permission.READ_SMS:允许应用程序读取短信内容
* S. u/ z6 I9 |( j. ^- w" n % T4 @: t( Y% s0 _6 M& Q8 G- N
) z4 S) Y0 {# h1 m, n
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 & P! x, F# _- J; b8 s- f
8 I2 ^2 N1 P3 u6 ?8 \/ V4 [9 l, V* ~
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 0 m& A P$ R. S/ F+ R+ l
$ L5 z' U( Y [+ ~5 f7 e) U& e# o" @9 ~6 {& D3 E I7 ?
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
! E) g5 G3 Y& O J 4 a3 d* e2 C+ L9 o% d" Q
1 P9 Z0 w3 |7 F* l& _$ z9 Z android.permission.VIBRATE:允许振动 + j M+ f& q& A7 f$ B
3 ?: Q( g# R" h8 j" w
9 g3 I9 E# p) C; ?3 H
android.permission.READ_LOGS:允许程序读取系统底层日志 }" @ Z& ?# w! g; z
3 L4 Y6 P5 Y0 l( w
* y9 h; @! O2 G, B
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
' h$ J5 i1 j7 c8 b7 o! `5 r L * b' q9 C7 Y: J( j H" f4 V6 {8 _6 G
; o; X/ [ g& v! \9 }# Y$ C/ k+ K
+ h- `# b+ u) o' y
/ [9 S; p" u8 [: D, ? k m9 g( z5 U/ S& p8 i* a& w4 @, [
功能信息 + e; @! W& z6 X- k. g8 z* B
# o! z ?4 i" p2 ~
9 K8 Y. [% j* ^$ a' C& D 1 v+ V% x& h/ D3 T) m: ] c" e
4 i4 H+ i8 V9 E& Y8 [0 ^( p7 `
3 q# A- K0 R! w6 C% B. \
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 ; ~/ w: Z! w/ E! Y! s
8 E; [2 G/ P7 C7 E5 T) I( {0 ?
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 ( Q! R; o$ g/ S9 G" T6 T1 u
1 E7 U; q+ ]* E V% \
6 J( i. x4 X" w; X, H
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
! p# k$ j% I# ~2 t 9 G+ \9 {' N2 [0 x( ^1 u( I/ p/ P
% l+ W( y* k" S2 D2 a1 Q
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
6 [/ }5 t8 a5 e' m
2 j/ A! Y+ N) G) ?; P, G; v/ c$ m4 r% u0 a2 [; x1 W. F: v
+ w9 }5 a5 h+ K6 W
* Y4 K% P, Z# j5 [
) r% z& K: e7 \; v P0 J0 b
1 _! O* x3 L& E" o( f8 ?
# ^2 c1 ^3 B& J( L6 }# @" i ? N- A _4 r
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
/ Z6 V% u* ?7 ~$ h+ k3 W3 l ; G1 ]% a% |* u
& G7 J8 C3 [6 D# F1 g! C0 t . A, d) V; S u1 B x; f
6 E* y" g n8 X' y0 T2 M1 n u6 K0 n- X7 C, P
- A+ O: Z ?, A% W) q/ j
, n& Q, y' v! ?0 n3 {9 j6 ^
5 B1 m: E9 U$ l+ } 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
5 R9 @& i ~; N1 N# f 3 w: W# M/ Q3 h
5 \$ p" p; f6 o+ l3 @2 ]8 g ' K: c Y0 a! \3 S* t: c
6 L n' |4 T. }8 _4 M$ c) U, k s1 a9 t; V" i
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
: \2 d# Z8 Q1 B% a% X/ g3 L6 ~6 _ * p& s, `2 N2 T1 I
7 e4 ?. T5 E; ]4 n/ |/ u! }' z% y
2 }. [, M" |( O* v1 z0 E3 n. j
B1 V: C, K2 S z
. C7 Z1 P7 M( W
7 `; s& ]: A9 H' J/ N! p 6 A9 G1 g* a5 q
( U) @- r0 G6 M; B/ ? 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
6 _; V* p; M- l+ P+ Z) r5 I/ r $ l1 S9 j1 n& N
) a8 C- j" V/ D' U
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 # i3 [8 ?# m+ B8 b7 w" V% v# o
% w1 F0 X( a4 E- \: k$ I& _( c+ T5 ?
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
/ m O. k! {4 o; p- F$ A 8 f" R, K6 |: v
: m9 |( B- C% i6 O
开源的luasocket代码可以参考学习下 ) d5 y7 u- R/ H8 ~' e, D8 E# x
8 {9 w' l- y7 O
3 H3 J* f' _. x+ `, x9 G https://github.com/lunarmodules/luasocket % [1 M& O% n% C; F
* a f5 O; P' @7 D( m/ Z
" v! U+ a9 j# v0 D' A( e* { https://github.com/fengye/luasocket
3 v7 g* u5 ~% q; n% s H7 U
! G1 n4 ] P) M2 R2 s% o! s9 i/ E3 s' O
3 ^: z1 \4 n# u( R6 ]# {; V
: a% B8 N+ ?5 R( y/ |/ ?# O
/ _1 y* }: Z: {" i
% u: H! e1 m A+ Z, e( I
- z$ ~7 T; M* ]! t) J" J. J9 W+ r% ?7 s# _) f
- i6 ~+ [' c% ]* G
( p6 c' u5 T$ A5 S$ R3 v3 R' Z/ W5 ~ H; R( T% s. J
$ A; t6 M6 a9 C b4 o
1 g% e! L9 u0 u X% a5 ~# X
6 F' m* T7 {/ w 总结
5 W4 Z; v- w. Z- I6 \% \% ~ 0 W' s( A* Q) g7 d! `! |
+ F1 B8 S8 O1 X9 O& M9 Y
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
* u _3 z# G' s, C2 ?
& w. R9 o5 N# d, l# w$ O" O. x
( N2 Z& J; m$ E' |! _* J' o8 k8 j! A$ V 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 : ^0 D$ j( b. H; U0 T
( G7 I- R3 s# j; J
5 E2 u. \! f5 l7 x+ i# W/ J 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。
# G% {7 q; S2 e ) n: m% \6 v( G+ P
* s8 L" q( h% f5 R }1 l3 y 结束 $ H0 `' ^3 r _! i5 J
6 F& M) C9 n2 c3 D$ o8 e+ h+ P3 {
. z0 ], I' l& A7 d5 f x 【推荐阅读】 ' R/ x7 Q2 F9 ?4 Z( [4 K
( x$ S9 Y9 X4 d! [7 \8 }, @% q9 A f3 g& [! t, L
对吃鸡APP的分析
. E) j0 Y% \* u* y
7 }9 ^$ t# s7 r+ O- D" H) N, m( G- M4 k7 L* V3 v
你需要了解的APP安全
) e" L) O: ~( C( s0 h" y% B 5 i; e3 s! C0 L9 x
r4 }8 Q5 s3 X$ R6 @% t1 R
你需要了解的APP安全
/ w; d# b( A9 c3 M9 m ) J0 a4 A- |1 o& D. M. p1 {, v
/ J# \9 ?9 z! p; x+ W7 K( z. G
3 m/ f9 j& R" ~ g5 n
|