|
4 V0 D7 ]# ~, }2 M# q/ p 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 ) ]- G8 B: e) Q4 |; U1 [
8 v* S1 R4 k, K2 J
# X3 H- V7 b! p0 J& v3 m$ y0 S1 S 1 ?8 q7 u$ R& h9 a
1 w* A, }2 ?. \
. w5 i$ b$ ~7 M' A
6 l$ p$ _9 r* o0 A$ v, C) h. O
1 r$ s' }1 A' Y% N" k% X4 t) ?4 w! k8 z; o
下面就以开发者角度进行解析下这个APP的功能的实现原理。
- w4 S. z; l' R4 ~) B$ \. T 8 t4 l) \' S- f4 e/ Q1 g
4 h' G$ b' |% G) C! w+ _' _6 ?
- g5 P# {4 @; \ - K. Y- V7 X# X# w. D0 w
4 c$ `! C. p& k# H
基础信息
4 r5 _2 C& _ C% D: y $ X9 U( O- ?6 O# N9 ?) u
9 ]/ S: A3 k% ]9 l6 {' c 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
1 l# |$ G, @& K5 L. [1 B+ O" ?- o- S : @- f7 M+ F1 d }' V
; \7 V3 |& l! I+ o d7 g6 T 0 a# u: g! j$ h8 U6 b
7 g/ C1 ?7 b' `( i7 r1 a6 x* S' V
* Y l, E6 L' R1 b8 R5 V' R4 j ( H' v1 j% U2 C* }2 u5 a
4 `5 y U/ S( N/ x' @0 e
7 A/ }6 \* |" x
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
( T' K, ^3 y5 |; `, X& i# X ) t$ [# W5 F" g- T4 n. d
+ C3 r8 z# L& W- [
7 s$ a) O( k* B; j/ X 9 U& D" `' I. a5 ^8 E3 [
& A4 C& a5 b- a& I3 v3 x
9 T& y% R G0 |7 y : v0 V( u* q: a! F# F F' O
$ C3 U1 Y3 k" z: Y* x, @ 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 % b2 ?; k6 @. U
' k% T- k; [/ W! C
& e/ V& X7 K% D
4 g) u M" k9 A- W* s9 \+ t
3 }* Z ^2 w5 u' p" z, Q2 X. @: z A# K0 E
& `; v% p# R6 ]% ~ Z( K& W3 L3 ]' r
4 Y6 u! W% n3 L1 S" z. e7 j9 B
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
0 Z* i" k: c5 C" a2 `+ @2 w
# Q o! i0 e: G! ]" n# O' F: ]1 `; N7 }' T$ V& I1 E7 i( Q
" L, T. m" i& o p6 Y
8 K& ^7 g4 M* S* K# S% c8 z
$ B/ _8 o: J5 f5 S: g/ H B
: @: M% a7 v/ G
2 L6 I5 w4 s# z3 N$ b" y1 Q1 n
# }! _8 T' o9 O: p 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 L' V' _1 F7 T; ]% G
; B3 d- i @) a7 l6 D/ v: n0 l- H Z9 s( r" }1 B
- |0 {& X/ V/ W5 s 8 u( T; v& C5 S3 \& `: x( a
1 S6 g8 X! E! c3 B
; R; \5 x, y: g0 ?% _6 d& z% r5 e 4 m& `0 A: y* F# c
5 y* M# M2 l+ g. m
' L, J+ R- N1 O " d; }) q1 Z' {8 G4 u% n' z
* K+ x2 ^! Z7 X/ P1 I4 U; P 签名信息 9 L7 p9 p' e g' K
8 l+ v/ @/ ]( ~) ?1 }* F8 w7 W3 p. ~
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
7 U( J9 m; N. l9 H) U 7 L- e" V2 \7 N
+ o# g. v! X1 b* m 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 7 e& J; \. F$ |2 v
* y+ a4 l% Z: z
% S+ i( j. A6 J" o! ]. u' U' Y 在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 ( J' s% U2 [* m! f" T. m
1 q2 G+ N4 o% k1 _+ U+ O- c6 I
+ ~3 E+ ?: K2 I& q5 Z" u+ j
/ W6 i7 k7 ^; x# D. v( A 8 q$ r; d$ r# T# e& |9 e6 d9 c7 D
- p( _( m, r, l6 `/ I
( ]- G0 [- c1 M; T2 E8 H) B 7 [& b0 M3 u+ z4 D% M
1 D" N# a2 m2 F7 y8 _* |. u
android签名的数字证书的一般都是采用 X.509的国际标准。
% ?( f# }6 S# k: _
$ A$ X# T& Z8 A
8 X$ \! k* u6 } 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
$ j0 a: F; d! o- B& [ " f, R, u# ^, j* {
7 S" W0 v! ^' `# ]+ @ 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 - P+ R. [- Q3 V; k* t( r0 I
$ [$ U# `# e* S0 ]) i# ] Y/ l+ }" R7 v# O6 a( N
; U' Q6 v* x, D, c A
. e% ]6 b: Y9 q, N3 f" n. q, U9 E9 F7 L9 T5 H
' Z6 b4 b9 l- ~! E; N , B( u% l# A& }& l
1 x C/ W+ N/ j- o/ {
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 / A; s/ e' _+ B9 }+ j, M, {
$ N- R: l! K7 @! U+ W1 `& G9 ^7 l$ }/ K, A/ M# R3 h3 h+ P3 w
& b7 L: Y8 w5 r( H % ]7 [5 o3 m |* q# Y
) S3 J1 \( L1 I
、
2 P$ n( s$ N( h7 o# F6 V
& K7 q' N% y6 I7 I" V. O0 r9 ~/ C" o& @6 [ X5 g0 k
9 Z; m1 @2 W. D, @: M. E: a
: W: R/ i8 y3 I9 [# r
- l- z9 F* _5 ^3 }
权限信息 ' ?* | F# k" t1 l2 c( r- H
$ J( Q9 ~& `9 \4 |# h- k
0 y [" _' d8 w, V1 Z 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
0 a0 Z7 Q0 h6 U4 q9 |* @0 `
, H! F9 B; F9 I/ K$ ]! R& \8 v$ m! S
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
; s3 }! o* |& G" f% W: |, y8 | 4 E& Z- X$ N% L" ^" x
, T- h0 G+ X9 ]
8 D {+ D- ~' Q" R5 I" m; v7 q( k ( D- i, o4 q" j" {. ~
& {* Q& }# K8 s2 ~2 R8 o% T
1 u8 C3 n" c5 ?" J, F
% ~; x! w! B0 y
, h# p; Y: P2 ^8 S" q% Z1 n4 m; u, _ 下面对这个APP的所有权限进行详解下: 4 _# o" u2 `' Q+ b! o
0 _, V; z2 Z5 a. L$ ~3 h9 o6 C9 d
6 Q( o* t$ z: K) | F2 y, q
android.permission.INTERNET :访问网络连接可能产生GPRS流量
3 s7 I1 c0 T& @+ G: }% P: D
' I. \1 Y |% [ Z R: Q% }" z( R# d7 q- ], j% }5 M
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
4 W& g. v8 l! p: T' W C: o7 U 6 C+ M, n6 O$ ~% d' B
0 L$ w: p1 b( B# q* A android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
6 H" L. s7 B' f6 z; f/ V- E * V$ z8 z8 C0 {+ k
( u& u" u% I. K8 G# j# e# l
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 , ?: K6 u4 ?: O; I
1 t8 g) G( B1 D, O' @8 {2 V5 j7 N" |$ n( M6 ]
android.permission.WRITE_SMS:允许应用程序写短信内容 ' Z) W5 \1 ]/ |9 \% Q
- X d/ u1 G) m7 t4 e7 h f. \) H# ^
. @% b! i# a6 H: p+ o# z5 t' G android.permission.READ_SMS:允许应用程序读取短信内容
% y2 o: ^ C! ]
6 w, g& P) H. Z u' X. o3 q& _( {4 F$ R* [3 j6 Q- n* s9 e. a
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 ( s( R2 o6 ?& f. H) B! [2 t
I" W; o. U% V2 a
2 X! V# Z7 V# h
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
7 x3 O* f/ K1 F6 U+ [ ; F8 [6 U( N9 E q) C) v
! k: C+ x% A. M& N6 @: c
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
/ b% D @! V$ w0 t ! _8 a" G1 ?$ q. R" w
, ]7 Q* V5 u0 U. X android.permission.VIBRATE:允许振动 9 @( o( Z0 X- P+ W
& Y" c, h1 z' F5 ?! D$ Y/ Q0 w! O- G+ W& ?
android.permission.READ_LOGS:允许程序读取系统底层日志 : r7 Y- n `1 Q" U$ O. n0 [( @
q: e4 o5 ]5 n5 [$ N( a$ h& Y7 x" Y! N, y+ F) u
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 o$ y5 m: F! d( M; O* X
) w2 w; m2 m7 @7 ~# [1 p* b! W- h+ Q! H9 L
2 ~- q9 S3 h% X" | v K6 [9 @4 {
1 X: `0 Q2 K5 R0 o) Z
% Q2 ~5 r5 q) Z6 h; A: t 功能信息
" |7 ? C) j0 y, Q 4 N' l- K% v# |3 s! y+ c
4 J! w8 I8 o' Q" b
# q6 V+ q7 b( f; u" j7 t5 O
* G" Z9 ~/ K( q8 ?2 R
( P+ f" ^. _% H( @ 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
' N5 U1 D7 p! F ' U* |, c3 {7 A# n- U
' @" F$ j; R) o9 n2 F6 ?' r5 c
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
, y- \6 p3 p, D& [ ~" H- v
3 i& Y" m+ f# b& ?) g2 Q0 _
9 U) ?" Y# o1 D& d- T 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
* c# k+ \' ?* Q9 k5 } * q1 ~% @! X- b6 {/ ~; G. i
5 w/ s5 ~. f+ Z8 [2 ] 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 7 I' }5 i- T/ k0 j$ ~
1 l. b: r* x* M
- e! a. L4 [+ ~$ \6 g. N3 L3 c# I' x
0 g; c: D* _1 C- i& o* Q; |! j/ ~ 2 T3 n7 R: W: }+ L% }6 |6 J) L4 @
4 d7 |# a1 |( I# K5 z1 a0 L* |
, N7 y4 d- i4 o! F! I $ i: G# V5 N% z* x0 a6 U: k
+ X ~0 f2 Q+ Q+ f# a( [) E3 a+ o
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 * V: v6 ~' R( g% X
7 ~+ m' J/ o; u$ E0 W
; o4 e X8 S! x9 j( u: |4 l
h& _% C6 z" ?/ {- x4 ]# W
+ m3 O7 X2 q4 b4 B$ V1 [4 Z9 J8 q% y9 T4 M# X1 \, s9 ]6 r
5 s7 p: P J6 ~: C* `. ^+ K2 `
$ \ t/ f3 I" [' P. G5 t& `
3 \0 h& L* J! }1 U6 r 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 ! |; H# _0 N( ]1 I
. l+ M' g8 I0 K0 Y* b) b9 B, ]
]; {/ |( \- k p) s3 h * J5 b0 [) F; }1 z8 X+ {$ Q6 T
: y2 y* p0 E3 R) @3 S4 N
- D* a# Z& x7 B2 n6 i
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
( Z( K2 I! q2 E# X7 p
7 d0 B; C' l4 i7 E ^2 s- Y- `, K5 K8 L! t
O& k6 y* d* o, l& `' E- L! F$ r" l. d * J! Y( Y- |8 v5 ^. A8 W" C! J
6 p! q/ g+ t" s+ q
# ^8 M" j$ |% ?: r' C1 h
6 ?$ F; Z- x9 [; D U0 |9 i) h2 y0 P" H$ K/ w/ K, d
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
' N3 c. ^ [; P* v
1 e9 F8 y# i+ t! e8 |& b5 ^
$ K2 Q/ I# T' y; y- w/ E' P LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 2 J ]. E; n: @& H
0 C, w7 u9 Q/ q" G+ m# e4 {
6 L0 v4 m4 ?- a9 J, a* A4 y 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
9 p( _5 w1 [5 [$ l 8 t. K, L0 u- U% z4 }
* ?$ H) C4 `6 E; i% @/ S, s
开源的luasocket代码可以参考学习下
, V3 s" i$ N, y W, @ - ^" X- @) t, h' x# r6 ~) M3 E
4 G5 r7 k9 U$ H3 I* q) {) B https://github.com/lunarmodules/luasocket
0 o) @% @0 L. z& R$ B3 E4 H; n
' _, s# B) {7 _* s* L/ L% {' `9 W5 Z2 b1 A
https://github.com/fengye/luasocket
* p) q+ Q2 ?8 k
?$ R4 C g7 {* j! H1 y8 u; s! `) ]) ? i P) z3 S3 [8 V+ Z
7 G q# H" O3 }0 h, n2 j; q- [. J% m
! M; _/ }" O! ~9 @4 _( [0 B3 H. h1 f6 q( i" N( E% q$ P
3 R5 F/ _- U* X" T 1 U" C* Q* u7 S# Q! x! T0 H
4 B1 |2 @/ t/ w
* g) N$ a& [2 U. e& \2 T 0 h, U4 a. V0 n* p* F
! s/ `/ Q# X, C% {/ u$ f6 J" t
: G r* o; `) L7 O
) b$ ~# q+ {2 R6 j
. ?2 d4 d1 h) b5 }( Y 总结 2 n4 }; w a- B. W+ |
7 e6 x# \. k- p" n
+ S0 T3 l0 K6 ^: m. x, r 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
+ C7 g" S6 X3 P2 e# F6 P9 H 8 p* b6 o0 K9 _8 h' D% D
2 C- n `* \% D3 W 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 / @( A0 _! K- I9 f$ b( n
7 s u7 N. p r2 V/ i6 R+ g' t" ]! W9 r) y* y+ Z8 i& b
对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 6 z2 ?9 z/ | I9 d
u4 Y1 y6 }% _6 ~/ Y2 S. ?
( p$ }; t" L" j }! | 结束
6 M- d' g9 |" ?1 K7 J8 \
- U W1 L; n4 f
. l2 D* l8 E( U1 o: j 【推荐阅读】 - t" W- O; }2 J! {% w% V
4 G# r7 m$ V, z* _7 g" S; e) i8 f$ {" k3 g0 i ]
对吃鸡APP的分析
: K) `" g" f5 c9 F/ F 8 X# h! t; g2 L+ W& b$ S2 ?
- o& J/ a Q3 _. e+ u) l8 H
你需要了解的APP安全
: H4 Y: j& l' `
: {2 E/ U7 w. R' q% D1 `- T# b; T% i: [' ^1 _6 _5 u+ [
你需要了解的APP安全
6 R! y/ Z8 ^8 Q* j+ ]) M% N 8 b% l9 W2 W% V& t
2 G; s6 G4 f- ?8 w+ _% b
5 I1 b- C* j! R* m8 E! J* a |