5 t1 C) \' k: D0 v9 R, ^
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
( k- z( F7 H" z% |$ @ , e4 q2 v* @3 R9 h
3 ~+ F! t% b7 J* R O4 a" T
4 B; u. i4 @' F2 Y% x6 p+ z- l7 _3 [ ( B4 n( N5 I# @- @' I
1 z; x& i2 T$ B+ l
- d9 U1 s& v6 {- j# P! y 9 t R% c2 M7 \; G9 i1 P
7 Z2 U" u2 y: j) O+ {6 k/ G/ e' \ 下面就以开发者角度进行解析下这个APP的功能的实现原理。
" }+ I, J# x' Z# V8 S- T ) n, u% q/ W5 [4 T+ m
& U" [& a3 a/ R4 A9 m
1 H- ]" G4 }9 {; ^% [
E5 |% f: `8 K5 ^+ m, V2 f% K$ a+ W+ h5 H$ o/ _
基础信息
5 L4 E3 Y, F& k* a' ~1 B- O# u1 z" ?
" r/ t: H/ s* Q. ^# F2 T: u p" u3 C. k5 t8 Y# S
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
( e k" S) B# V; K u4 G d! X d, C& R$ c
* \3 T# V3 B0 E5 D- g # Q- }0 [- a" a$ o8 N; ^
% ]8 Q9 ^+ w+ |' j" r0 f0 h V4 m6 X
5 {3 D# w0 x4 C! i % p/ s$ E7 e: _
* l0 [3 W2 R& Z( N 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
! P6 ^4 H/ f% K0 \% \ 3 f! ~ y* c5 n& e3 C
0 y8 L0 u! m8 c4 F7 T4 S; q, \ 7 v. G. _4 U; c% S3 s, W6 G: V
* u6 e. t* J) o! e1 Z3 b
( g% |7 T8 Q7 z+ [* K! f! y
* D& R( B3 w+ l7 D2 M6 a2 m% } / Q" P: [7 p0 V5 P: ^9 r
@8 l( f% m3 T# i) T9 m
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
# s' F% K" M9 P0 r- a* Z 3 b6 k/ j& O" i* J/ @" K
8 D4 Z; Q8 L+ j3 W1 G: G. |4 ^
' Z9 q+ U) i( `0 v: O9 s P- w
) r( K- W8 D' C- |; a! b9 d, P( @
6 K2 j3 C* D& j9 ~5 ]! i8 x
6 ~5 E: Y9 b+ S; t8 ]; C
! n: K/ p! Q+ N4 ^9 H: o 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 - w, O4 L: F$ Z* ?0 D' H, |
6 w% T# F/ T1 ^
: U6 A# p( z8 Y3 g0 ^1 Y/ O * @. _- ?* D+ ~
4 S$ I) G7 W: O7 r- k3 i7 m6 c, s1 C }
1 ^5 R9 o! g- l- @8 O" _7 N0 O 0 P% _! t, d8 w) q/ ]+ t" |% i0 t
! U) e* o. U& Z* k5 ?" f1 W/ x
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
2 s: ^% T$ U$ T/ B' N6 `. H; M $ D! q7 o4 A" G# C7 N! O7 m" I- B2 Y
- K/ ^$ f, L6 a; q
0 x& `4 b3 k% V9 ?4 R
$ ~! g3 c9 s0 }4 H- ^5 o/ ^
, e& Z4 M: ^( ?: d. P" s
& n1 e2 r5 h' V$ p- `
" H6 _% e7 [& E1 T: P5 [$ E$ k0 o; c' x) y
/ y g ~4 E; G; C4 @9 G 3 Y" b, |) h, {0 m' J7 k
8 a! F6 i: ?9 S2 l$ U
签名信息
. j; U6 Z8 T& v! S, S* Y / }" ^) k5 a& {- M* J2 w+ T0 z
% J. h# D" }; S+ t6 W- S
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 + F# G5 c( _' o$ y4 f' D
, g- u4 Q6 R+ n- A8 Z9 m
* }, J/ f! n F- {4 m 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
1 d2 I2 k# t7 }; [# i$ m. z
5 J" Y+ j/ ^* O$ [ s/ m5 p$ ?- F( w9 l3 s, E }8 O2 l% g
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 J2 Z; k+ W5 n' p' J$ l" C
! U( u- |. Z3 d8 C
' T) F, N$ D& w. K8 @3 v
$ A+ w2 V) S' Q/ r
& }" q; O2 G5 F! {6 s
, c2 Z% F- h& t+ `0 f: L: R
, P& `# s7 ^, D
. W" u$ l* [# Q. W- Q: D/ d4 M. `# q6 R) f
android签名的数字证书的一般都是采用 X.509的国际标准。
, X: p/ l+ S' }) m# x) e0 q% b 7 v* W- w( {) l& Y0 |$ p
# _) x% i$ }4 A. J1 o/ x7 ]! J" T9 o 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
/ v2 v+ q6 `. O! Y' I
+ Y, Y& w1 G/ _
, Y _% D# B& j; q0 L 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 4 g9 Q/ a9 Y1 S* ^
1 {: { X: g- D* B5 @
0 n, |+ o# W0 n$ E/ K
3 [1 T: K% L. x! u- `* f
7 N3 m1 I# p1 h4 G) U% p' b/ l0 n+ y E( @
[! I8 x* L$ _6 g ]
& [5 A$ G" A5 P, G: s$ m" ]% {, ]: j' j8 P' }$ j0 A: m
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
2 w; x, H5 j5 f, r3 V9 l3 s. } / W! R+ h" C- H
" u `7 i d3 D7 O+ p1 R' Z/ ]
! j& h- g8 x7 w7 k" M + h b1 N8 p' A8 l$ U7 r
8 y& w& `2 K7 ?2 ]( F 、
/ x# w' @ N+ r$ S: I ' e8 x9 z. S* p0 X# Q% J
. _: E" I9 Z3 n1 r& \ O
# i3 I% M( S' l 0 G$ q" w3 f. k
) f& A% Y g" P0 R6 z/ T
权限信息
2 ^$ {. B6 w# i6 U/ M7 J4 e
5 ]) E* w5 j* X1 E( i! ` G' g' g S
$ [5 F: X- ]& J9 f2 K- G; o 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
9 R7 I9 R& l7 @: U, h
1 n9 w1 P* U6 T7 m: }0 `3 _/ O3 o8 Z: b' Z
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
+ J) J0 S/ g7 c# F. G2 S8 ?
5 \* d l4 v+ @1 a3 r$ S) X9 a4 @- E5 s; e7 x
9 w7 R$ |, l* o- A9 _+ [* }/ i5 R
+ s: `( y% B5 ?8 l* v
8 B) m# {6 e2 F2 R4 |2 q; }( H
/ C" Q+ K+ s U0 d9 f: ~ ) V1 s% `8 Y: {0 a% H# C
: O& J- L8 a5 s& ?) _ 下面对这个APP的所有权限进行详解下:
& } A" Y+ z8 J6 U4 @7 ^6 J" _5 _
6 D7 u, N' `8 \' x9 C
5 S5 o) x" G) \ s* z android.permission.INTERNET :访问网络连接可能产生GPRS流量
" d; K; r- t, }; ^
7 M# R) M; O; F2 S% K$ y& p0 D2 i4 c; N& ~5 C# _* q9 d4 o" Q! d+ s
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
( c( u* Z; e/ m' V
1 q. Z5 P1 P1 l+ f+ {0 K" I# @5 {; I' I0 b# r1 `2 A
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 3 D8 x2 M- U% @' c+ u2 m; c
3 v4 O: @7 w6 h. i2 Z
! `( ?7 l! [0 `+ b8 U
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 5 l" [: x! q7 N7 q) U
& n9 h% g/ d8 G+ x$ p: ?; [1 E; p+ p7 y' ~ l$ p/ l
android.permission.WRITE_SMS:允许应用程序写短信内容
: R; J0 M Q4 {! C" g. E$ B
+ l5 S& A3 s/ t( y0 q D$ G! L- l4 ~; ^1 [1 k* c4 h Q9 ^
android.permission.READ_SMS:允许应用程序读取短信内容
8 \/ `& d. |6 G& m6 K
3 ^; q) J4 C+ j# s, a, w! N( {# I! A5 B+ I+ @
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
- b/ |$ M6 n' \9 e
1 d7 b# ~( k$ u% g3 V* i
/ z/ O5 j, h, {8 z, Y: A. Q$ O android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 1 i& Y' U3 ?2 v
Y9 P/ X* g/ v2 i1 @9 V/ R! K
/ l, T& H/ g8 X( ]. Y- j* R9 d! y android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 2 Z9 u5 }# R0 S* `
' x, h, g1 P- o. z7 p0 \+ S+ B' d( H7 F9 S
android.permission.VIBRATE:允许振动 3 B4 f% x6 [0 x) K N: A6 E
' T' V, [/ n& h& I% J2 B4 Y
2 K U0 Z! U. F( g) h; U/ M
android.permission.READ_LOGS:允许程序读取系统底层日志 3 H+ W# H* p* _4 F
- W' z" E4 g ^: |% r$ H6 Q- F
; i! |. T8 _" @9 c
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
- L6 o7 A! c6 q: k' f4 U
7 g6 \3 V6 u5 f
* b1 I& C% i7 ~( A6 A, N5 n& ~2 C
+ `7 |8 v" S& w5 n! S3 F# C% b8 U , T/ g- k8 D0 B: L. u7 e2 m
% s o% X+ L0 Z3 A2 c+ k 功能信息
3 [" W4 z1 c; J* ~7 F q; w 3 x! I0 } I0 [
& X/ w/ A9 j$ \+ P, I0 P
3 V# ~4 L |. @" G * t7 z8 o* v, i: X
- ~) g" e8 b: f2 F* K: z' Z 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 % g) F: @; t; p
( |/ j3 b# C; T1 X
0 X' M8 V; g+ }0 p, t% R$ L5 P Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
" e: r' u; w5 E* z% ] 3 z) N( Q* n; _/ |3 U6 O5 Z" K7 B
' |7 u9 s" Z7 X( ~) F
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
7 g9 x4 P, L5 Q% [; T, D : W( M# |$ n" |. l( n3 H
% L- H Y& p& D8 w* y, g. Z 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
5 G# m: e$ Q7 _" n7 H ; ` r: i+ R- N
% _( c' ]8 r. Q5 w+ x t
/ R' g2 X) M- ^3 c
0 t4 }: E( v: M q$ k
& k" N' l. ]7 k! N, v2 y) ?
2 o b1 q' ~( P2 ^* @3 Z$ {
; q1 {& Z' B* D# _. D; _6 \
! `/ q }0 t# o3 D8 o
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 : ]4 u5 Q; l$ r
; W# \% ?/ t& \( F8 x0 f" @% q7 h2 l! w% z) c
3 A( ~) x' J, Y* S2 H
' p o+ [$ W8 Z% ^0 v5 k. N
( H8 C7 p# B/ F) i
2 M6 E& {9 G# }' \* Z, e3 w ( w8 ?/ r; V1 {, P6 ?
7 M2 v1 U5 V) ?2 C' O, S9 b
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 ) P7 E6 V* ?" i' o+ F! {
8 V& D$ z5 q7 p$ \; @: j2 P
( T- b% L. t- `7 J 8 G/ E% w+ ^* `0 C2 J+ y
8 T" E7 W b9 P7 W
& i" X; T8 u) v" M 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
" x+ G; Z' q* R$ s M7 W: J$ Q+ L- L; F& h
- |/ J! b9 W6 t" N! E2 ~( [6 G
$ p% R* `8 o! v% U5 T" h; b
$ Y) i2 f9 t( O6 R* [% e9 B/ V* {# i" z& E
p8 m, ] H% M0 g+ S
. U2 k9 m0 C$ B
2 G7 N) [# T/ i, d) O 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 3 P a% P% T( v9 b
3 d) r, a* {0 t; i
& ~1 d6 t0 P0 @% l5 p5 g LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
( b5 E! p& { w" P2 r
4 F0 Z3 k$ ?* ~: Y3 X& a5 ~) V4 o8 e5 j; t8 ?
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
) T( z! Y% B4 U9 h; S6 }! ?# j2 n
# X- ^! U( W9 F, l; `" }& f- k9 T: M) R5 i* y: ~" r/ t% {
开源的luasocket代码可以参考学习下
8 [. k3 L3 D; z/ D8 D2 V! M- [6 T$ D) S 7 |" |! Y$ ~9 P8 t
7 }8 M2 b+ k1 ], @$ {, N5 [- g
https://github.com/lunarmodules/luasocket
; a; J. G' j* J8 w
3 u7 V6 J; K$ g* h. A7 D
3 ^( p2 O2 ?8 w8 K- w https://github.com/fengye/luasocket & z2 T; v, q+ u: U g
0 P, \5 ?, k2 J+ [) _! v
- k$ z+ ~1 \; [9 c
_& u( L. p$ q, d- Q1 Q
" y* h$ W0 h# e5 t1 D( S" W6 `& o% M
+ ?% q4 k* @2 a! j0 u! I& | }$ L
6 V% G* s0 Z* g
1 p Y3 @5 t5 k) c) e+ k3 }
8 W, V+ H& B' S' n9 `- s$ f' R 9 t5 T' ^/ {4 {0 a; a0 ~
; Z8 v! f5 ?! b
" K% z; V. {/ J, j $ c) z ^( R3 V8 W
/ M5 @2 H% K% v. h* B 总结
( D" ^2 l5 k1 y* k% n3 F. p/ P ( r I- \' K1 d# |1 o n
5 Z1 R! K: _5 A0 t2 ?; y4 m
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 8 k- ?0 k: d# h) k5 {
* ^# L9 m7 e/ r8 y- }
: B, B5 M6 C- C1 c, M 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
( e6 [6 s; z) A2 O* d' X
( M3 Q% P* |% V
" P6 k3 k) U+ s+ y( {0 j 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。
, |1 m/ e% w: n+ U 5 }& _" j( a) Q% g& C
1 c$ C* t. K, E$ A7 K, S 结束
# @* n3 b- G% \& Z+ Q2 U4 U+ L / g7 _7 H8 S$ n+ q7 l# N: F. c& v
& M' G) S* c3 L$ b 【推荐阅读】
' H, J& m. D5 I% r. Y9 w" f8 l/ M- R6 e
' s$ y2 c0 u7 m; R; ?' z# S$ I& e+ ?& l- D! G
对吃鸡APP的分析 8 Q9 L& D+ V2 _ N8 F2 G6 l
& |, o. l/ }' v. l! f' X
! ^$ Z$ u9 i) N8 L _! W 你需要了解的APP安全 9 {/ p# K# X3 J* ~: w$ Y( W& a
' b& X W3 k+ z
0 x) Y% Z; P# `0 y 你需要了解的APP安全
! V% A$ R- W* @* v. ^ 9 k) A1 J/ g4 V& p+ a8 F+ @
2 ?2 B9 } M# v1 a- A" n9 @; \8 o * a. H. u7 M+ X& o. ~# T
|