' h9 G" y- E' w( b3 t3 C 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 7 A/ @: v3 w8 V8 N4 t+ q% \
4 n0 X- I* [, i2 u- `; h( |4 D. |+ `
; y3 @' E6 w3 f d2 A2 `2 w; p- L8 a7 |/ {/ A
1 M m3 T8 @* @' O
& w+ p) ]+ ?- d
( y' `1 _2 J6 @% w+ U$ B. J
+ P2 X5 B& \9 y
1 O5 r+ T% ?+ F( S9 H4 q 下面就以开发者角度进行解析下这个APP的功能的实现原理。
t, ]9 h& y1 X- L, x" q
0 P9 N/ I" }1 q" r( V; \) E" F
" B4 q+ L- e7 W* g# i; B
& ^3 S8 J8 _1 }6 `, A' O1 B' u
3 j( U" J+ `+ D7 R$ n4 V. ?0 E9 c* F/ T% C* ]* l/ ^" k6 B
基础信息
, a1 z A# L5 }: f Y0 m" t" c6 F$ o2 p! x
2 J% U+ O& Y9 |, H9 ?: e$ @ 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
! `$ b4 l! m6 K5 Y9 K
9 }. b) M. B' v2 F" L5 k" {' F2 R
2 j$ z7 i& Q' ~8 s* U& J, H7 o9 M
' l M$ u" C0 @
; Y5 p% G% r2 f, }* K9 j , w& E* \ Z! I5 z4 [
; D. R' |! Q" p
) b& m- {2 n+ {, m% Y" S9 V0 G 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
' b3 m* i3 v$ ?# k
+ S" [$ m ]! S, N; u4 H8 w Z a i) B( x- h3 h# V, P3 f
& k0 n$ e% H, p* p) _
4 G8 S3 u. z. w( j# Q- m% T& Z& n$ c: Y9 A2 B! N) i2 C8 v, D w2 R
, G. A1 r! Y/ V7 H* J
5 O/ u' l' i% i6 q; I+ g( @) I' A% X
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
3 d; h: |# C+ p7 Q% V 5 z4 j# s- K. Y4 x" P8 H( e: s0 H. u
+ V: T3 q% M& N
* z5 F6 _& r8 ]7 Z( V c7 n9 f & [. O* b2 z* u% a2 C4 Z* f y( ^
, N# U0 R! @, D7 E
/ v0 d: g+ f+ {3 ]* n 2 a$ t! C/ [# g& F0 [+ x* [' U: g
2 J0 d+ H( O) |! } 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 ' X9 Y: V' d6 \( C. C- q: m
# X9 Y& X! N+ l9 ]7 O* K& E& a; F. _
+ Y! r+ b8 H M# h! B3 {/ h( |& S
7 {# G* ?& V, S) e0 _
7 j7 q6 M$ h$ n7 T + `6 A; ?1 ]0 D
9 l" m, S1 X; i" ]! x1 }2 k( E
5 b% ]" q; N. \9 W# l 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 " ?& v& e# z9 K5 D
8 x0 F$ J$ r# D6 \; L: L% A
8 w6 k1 v) j* z; }& K
5 R' O" G2 T8 |' Q+ s# \: }
/ z$ d, t& c6 h7 }
5 [ C0 }3 Z% T# P% U8 M8 D. n/ A
/ ~! k1 o+ C' w0 v1 T : A8 J+ ?. A0 ]5 `& L; x
( k% {+ u/ u% Y
/ R+ E4 e2 n% ]9 x
6 X; ?/ ]3 J# h; @! i7 D3 E
* X& u ~5 p' y2 i. u" q" Z8 }0 V
签名信息
( p2 g' u8 E; d* ?7 c
9 g9 V4 e7 T6 W l' o- q; J: V, r
4 ^6 t. E8 ?. h4 R6 N! M! c0 v 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 4 H3 G2 M7 j! p- c) V
+ [; @0 f; e) s0 Q' ^
: q: m# [) _/ o 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
# S7 h0 B$ N9 J, B! X
) j g4 y/ J# V6 \
0 {1 i4 M* g) S! A2 R% _$ a 在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 & Z- n, _ P% ?) a) s9 q# Q
8 b$ e6 T% f) n5 ?% l8 S
% q* n( V# w9 h1 ]1 J8 G" u
Q6 f3 H/ }2 P, z7 w) T
5 a* h0 i) B- L/ ]' h j# _
; `, x8 k, q3 \+ \; w$ W4 i
2 Z! t, I: r) o, e5 m' y ) \4 C8 E3 p2 ~. A( V
5 [* @ r" p- P+ [1 q android签名的数字证书的一般都是采用 X.509的国际标准。 : g* C, e- r% G D9 x1 P
. @8 T! h4 z* h& U
7 K: I9 ^9 J& J' n0 b2 {: [$ c' O 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 4 l! r* G( ~0 j: A8 P& ]& `
5 ?4 J7 x) v& |2 i# C
* a# d$ C! E) k. l- h 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 7 T* S. X# v7 ]# f* O, {0 P
% | |8 r" V, g6 Y/ a" K7 H1 x6 D# l4 U% S; ]( [
9 o$ B- X3 |3 ?6 @8 }7 x
7 B2 H% U2 D" S! o4 ]
) }4 c0 |" |! J l" {7 d
8 N7 J& l# d. ^$ [' X% O' Z2 d
7 m* b7 V8 |3 o9 f; ?( p7 s+ t/ U
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
$ u6 k5 j. C4 I% j( ?: S$ E; F
9 k+ l( R5 ^. P8 Y2 c7 d$ v5 ?& ^5 T9 ]
0 Z& {+ ?# @* `" p; I, b ' U" a5 K1 C! w: r; L9 ~2 K
0 P8 b3 y2 D) W3 z# C+ p% m
、 ; {6 H6 S) \# N9 A3 ~; M
8 l, D2 _( @. K, ]9 V! {
- C1 h7 s5 z0 |7 u8 n9 b2 L
2 I0 I" [" J' x
( b/ A' C$ D2 X3 C: E* s5 A. x9 D' c( i. P# U
权限信息
' c; `; q( v8 |9 I, A 4 i- V! U; l8 h8 U
& I" \2 t- \ R9 A7 E6 O- C
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
r" t8 {: v. T+ M" ~( X$ T# T2 O
2 p9 z/ ?+ Z2 B5 P. v) [6 S: R. D6 W& M* l; i, d8 P0 r6 _8 [" n& s
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
$ [" T6 O5 w s! M 7 Z1 I7 k" w- j. v
- [/ B6 D& P1 C0 K, a2 M! C9 P
; m9 o! m: e" [. c( l9 v- F5 m8 H {2 d) `( Y) H5 D" s( F- y
* |3 i* T! w# e; I6 E# |4 |/ i
- q. Z1 _( l2 J( M' F, ]- H$ ^5 f
# x0 I( J- m2 a& @
/ d) h" @1 z' g& P# a, c 下面对这个APP的所有权限进行详解下:
9 C p# L# G* i- g, l
7 V# K9 F- x& H/ A6 b1 o( Q4 X) o% R/ X) E* H
android.permission.INTERNET :访问网络连接可能产生GPRS流量 ) N5 n* ~( R. g
/ v3 a; m; c) G' J# w- L* A% b
' p9 }! o8 @- k8 k* t
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 ; F2 c7 M0 m+ L9 b8 d
: b5 P( m% g# I' d# A$ |+ r
% U. u! \# g) ^- y4 r9 ^ android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
. M% t7 s% n/ W3 n* p
) h I6 k& ~4 N& l" O. V' O/ {7 X: I" t+ W
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
+ U: [% S, l; |4 s8 y
6 }! `$ @! i0 p7 R: y. ^. C( I
4 j2 ^9 K; m" X; g* W: b android.permission.WRITE_SMS:允许应用程序写短信内容
& s& o! N4 c( M' K $ q& e+ a+ ~& T' ^- o0 |
4 e* J# h) u7 w" u+ a% ^5 P- s+ E
android.permission.READ_SMS:允许应用程序读取短信内容 : t1 Q+ g* g j# a2 w
: N" g! O" ~% M4 x% n7 E4 m+ W4 X s# ? q, Q: N( r9 Z3 t
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 : m( B% r) Z y/ q" R7 ^' W
( Q& P9 D1 M2 _+ j
% v- G) J- s. N9 o2 ~. _) h6 G android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
8 C# `3 S4 ]. U3 }/ h3 l5 } 1 [/ l: }4 p ?* b
" `2 I* O! @3 }- U- i android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
$ N1 D4 U, J3 _& }; D . H; C7 ?( ~) S! n
7 S+ c, }" `! g* d+ p4 D android.permission.VIBRATE:允许振动 4 N, c& X( R( S; b7 @ ~
4 O2 \6 o. e( p! m! ]: {% M9 P# q$ {5 k7 [; i. h8 P
android.permission.READ_LOGS:允许程序读取系统底层日志
: A8 I8 z7 C$ p6 P( g3 U0 ] 0 e9 K: `" H- E
/ @5 d# T- Z( L: h' W4 e
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
8 R7 \4 E4 T- c- F2 | [ - g: M8 G; U6 }$ s( i0 F
. Y/ E& T/ [6 j; b ^
! v" n: Y' U9 F0 l3 T
: w ~7 J& h! y) ]0 |! `0 g. k
& s; X* P# l R
功能信息
; o6 W0 F, C1 O8 E4 e
. Y0 P4 X* z* Q9 W7 F3 w1 C& A5 o1 ~9 A+ M% j4 o1 e4 `( [2 T- o
5 E: ]' A2 V) F0 T w& |; @* n
! ^* l3 l% h. z9 m1 e+ [; O8 N. \% E) C% H
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 6 y" X, z5 h, v7 O+ o
3 o' D0 j" l& @
7 @* g6 g1 m- C8 o Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 * m5 i9 Y' n+ {$ J% f0 C
9 ^) q( \4 ^1 ^# m4 i/ w
' H- H; P' z8 D' t1 t 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
" ]5 b, z l2 N; z 0 S9 g. F( u+ Q8 A3 y+ Z% S
8 K1 O6 m8 k! n+ r) G 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
3 [: u! L0 u4 c8 o+ e# B3 G4 c3 I5 v 8 e p; B! a4 e4 p& z+ \8 |
; }, Y8 j& W- A
' p) i0 @0 {$ o" J: r, W
& A" X' u$ c6 e' C( Z* x
7 L2 f8 d4 F9 }5 b
: R9 Z- R- l) Y, t. z8 q
1 M0 H0 S# Y- U1 e" I+ n
/ U8 e$ t+ y o1 V/ Z 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
: |4 M" U$ N$ z, ?
: {/ o1 }7 B! W v+ \& E/ Y G3 i/ e- R! e( a4 e3 s8 t- R& G$ M
. q9 q! ^) x/ Q' L! r7 i8 L
' i/ N) W) w; S$ G
- f' G7 n' B/ a. ?
! k. g' S# ]8 H @0 b# `
1 U" j' X8 N/ b7 A8 D
- u$ Z2 f0 m% `4 Q/ Z 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
8 p: Q6 u& R' H1 X+ d- G
6 X- O+ P0 H* h. F9 o. j2 N1 T- C3 X$ ~5 | h
% ?! u# k# j3 ^) |( @ z. h) n
* ~2 e1 S3 u& p2 [) W- `+ f
, ~! w+ _' Y( y; k8 v 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 5 ]1 R2 T1 `: A8 y
9 r4 l$ L- z8 r1 f2 c! I+ H _
4 g7 O2 \ }" j( T% { k
( _9 i5 c p I
. H/ ?; _% s; n( U: B6 i9 I- l9 h" x( [; q
# M' N. R5 q7 s0 F
9 P2 D' \5 |1 Q: z$ @7 k8 q' s
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
! @; z- ^: S3 t3 w8 t y & O- V1 p- h# c7 O8 D8 X% }& P
; h8 ^1 L. K; d% Y! X
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
" J) y* _5 D8 m" F* i, g' S( _" l
( v2 S0 a$ z3 e% i, K4 z/ y6 n* K' z2 v. h- W
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
8 k' C) y# w" p+ h
* @. \( ~: `9 U- n3 m% D1 I
6 C6 ?5 ^9 b7 Z3 ^/ d3 l# V% A 开源的luasocket代码可以参考学习下 5 g4 x/ j' u% A5 x; n
) w& }$ x, H" Z1 Y/ C
, |! n) b T! l/ O7 g https://github.com/lunarmodules/luasocket
: k% i9 ^1 \- N
1 Y7 s1 \0 {5 v, U" A: }
" s0 w4 m+ s) u, ?2 [ https://github.com/fengye/luasocket 5 p- x) H4 A0 t6 U0 D
% h$ F4 |7 z) `3 s* ]1 |4 B/ A. p, \* P6 i0 K+ C4 F* i6 L
( @, p& V# R# P( P ' x: k# q" ~% f0 l. { y. E3 {
$ ~! [: K" O6 O( S( p - @6 t/ P/ P [; P" H! V
! R5 e! `. X2 n, ?8 m+ V8 J' y p" x8 K b/ _7 F7 n
; T" P% n& R( |
/ d+ ` e) n5 v2 @
+ v' K, g) _6 k) h+ q6 k. J ) b" `5 G z% O( M/ Y
, `2 N5 Y5 D; s' }9 `/ e9 W: g1 I- o; h' D, X' D+ g0 \9 j' ]
总结 : S1 G$ i* V( K1 x- I
, C- e" J1 F, O9 N2 U' q
" |! ?6 }+ G& [7 J1 x7 C/ P N! ^: ~ 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
3 h$ l3 c1 r+ _+ d% M: s. H$ Z9 e% P
: M2 D- u! E3 a
# d3 b0 q; {. |. H: K) u/ p4 T 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 ) E3 c5 @ t' b' U, J# p. t
' j6 x1 ^# H) S: \7 D# t D+ p: y5 p* m4 Y5 {" @
对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 ! K/ ] t% _5 j
f- O: W- G/ S% a
+ E. E' M0 b, s 结束 ! {5 g- U$ t; K" d+ R" _- A) _6 L0 \
" f2 D3 m6 n3 U: a# R
d" n& s |4 l+ c C# }+ v
【推荐阅读】
$ f F+ t: u+ q, D
1 D- d/ g0 B( \# K/ m1 l
U( e3 C0 A# T6 d) R, A3 W0 b 对吃鸡APP的分析
3 y( a! S7 ]" x3 C
- ~7 j/ H+ Q- z% S! v9 f+ R0 I, R" X0 }" B+ b# q6 z% h
你需要了解的APP安全 4 }$ ^+ J: z6 Q/ ~
9 h% A% {( o2 _3 [2 I7 h. ]/ g1 `" ?0 l4 a
你需要了解的APP安全
" u* ?0 D l8 B; i/ r- {
7 j! K7 i4 [3 m w4 D" b2 h# p& d' G L' i) r
9 K. J, K0 `" T& b
|