5 U) I/ w6 [5 o. \" U1 Y 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 ( o4 U: ^7 s3 I/ i9 n+ r8 _
+ u# [3 _1 D( s n4 p+ ~
5 D6 ^8 `9 k- Y- {* d9 o
. Y( C# y/ l4 Q% F% W
# U1 K: H7 L i* F1 ^- T
e& k' o+ A5 W* u1 P
$ c" S) ?7 v/ G3 A ) a3 r; p6 |1 A' M0 _+ P
3 n+ |1 y2 y c/ r9 y) w 下面就以开发者角度进行解析下这个APP的功能的实现原理。 & [% ^4 g6 w: A
5 ?, A E5 p+ R# L
~: x7 U' |6 \' N+ S# I
* {3 c, s Q3 b+ J7 Z# d4 A
+ A$ p* m& B, ?8 W4 D$ j/ O" f$ N9 N, t
基础信息
# @1 F! W; R, o+ _ \* J 3 D7 U/ v2 I% q( d5 s+ ?* @
% \( ^9 E' x$ _4 p! D# R( _
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
" H- Z; k9 S. _+ \8 ~4 k
1 d7 S: S1 x0 m% ~; l5 _9 x2 [1 k2 g& I1 ]0 W! u
6 S7 @0 Y6 n5 ?* Y, p
' p L, R$ [9 B8 i( {9 h1 B3 N" B p
9 L" V' s+ U6 x$ s( o
1 y6 N: s" t- u$ `& a$ p0 J1 A: `0 F/ }- ~/ E' ]) h% T" F
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 0 E7 _, m/ y% `- p6 k
1 E& `; B' l9 x, y6 o) B& u' Q# i1 Z# A0 ~
9 R5 r2 x6 h# s/ g 7 ]2 q5 n; H: `7 A% F' A
& A1 y3 P/ i; p1 P - T' R3 t, `' u Z" B: e( d
! x% d# ]' Z# |0 H& ^! O
/ k/ \# d2 q% T
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 ; z. F5 i+ }# Q) c/ M8 R; z
# e A0 G# a( p% g9 n/ K
/ K7 p3 ]6 W+ J
' Z. c+ N, b& D, u2 n, ]4 u' u) e
! [8 |7 u3 L% T. H7 H1 F
, A& p% z$ w: t `7 ~
4 S" c. l8 a$ ?: }+ ]9 E* J
' t7 [3 O# V$ x7 ]
7 X! f( h5 b; X/ g2 L' \ \( ~ 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
! V% I; _4 S( F+ Q- I' T1 g
- c' w) W; E5 [5 \6 ^0 X- i2 `# E$ n( r
, N& F0 g' j5 {& c/ X 1 q) p& w+ a! O5 N( {2 z
2 l; Z, X$ Y( ?5 O- X6 ^& e5 j
3 W+ j4 E) ~* ?$ k8 s/ S
' ]9 ]9 A. d& u4 Z
9 U" j; _# D) X, j' k4 t9 Q( T9 H 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 & |% I2 U4 J8 H; k
) _/ J) O- t1 Y2 y5 r: R5 q0 |
; H" y5 p+ t# T- e6 V$ Y9 J4 {
8 w3 d& o" q! Q) @3 @3 M( V$ _
7 ~5 ?0 S! E; ~6 U3 m
# k/ D7 z9 z: E* K ) u3 q2 M: m( Z1 X. B
/ c5 T5 i% X P/ L1 L. ?3 V; g
: z3 B5 E" T2 \/ X! [1 }: j+ L3 P1 R0 B
* h6 j3 E% k+ w; e! L. Y2 F
6 U: U- X4 e" f- p. p6 e3 w% _# ?. k1 ~+ @. z& X
签名信息 , q% n, k) v/ t
" b! T `9 N2 n" n
4 K# I# w$ o& V( k3 H 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 3 V/ V$ p& B6 p7 w
) n7 E9 Z4 p- k, n
' _4 q* P p# i9 R2 U 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 7 R( Q6 B7 |. V7 G6 C
( u! S+ E. G, j9 L+ [) s! g; Z, X2 z6 l% Q; c& J- E5 D
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。
9 p% `4 h. [( c6 ? , l! v* J1 Y% P) a/ W* ~
8 t+ q7 E7 H" l, t, N
) K8 ?3 w2 Y# {/ q* i' G- h; M " p3 k. i& `3 o+ r9 _
9 e+ ~: `9 s+ Y 3 f; e. n7 N% l- M9 [% d( B
2 o' o5 F* n* u
# |/ I& N& ?* t0 ~/ M A1 R" g
android签名的数字证书的一般都是采用 X.509的国际标准。 4 r/ P, n1 x- e+ w8 Y
! @) u8 q5 a& {5 a; P; z+ @
' x6 z: e& v2 ~: g$ ~1 |) l' ` 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 ' k( t _3 ]2 L7 j0 A, m
4 Q" o/ I9 y# Q
( ?1 d( Y6 V! U. g( \ 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 0 P. H4 i/ ~' |: s2 e; [
3 o4 ^0 c5 |5 N+ i, s9 l( N+ f, z2 ]. B# C) w* i5 W; R
+ o% T. \$ P/ H$ e
" M o" A0 v( l& b1 o0 U
3 v# l# H1 w: C1 `0 W5 a/ i , a/ U: g; t, i
6 k" _, U+ b7 q- u% B4 t n7 Z- Y* o4 n
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
& w8 j* R" t3 `. a& D& w/ z. p
* _; s9 `( W8 R
; _! s9 w- K: H. z4 s \ 2 k* N$ |7 ^$ A/ W: Q
9 M2 [8 {. d; ]$ y3 O8 G. }; j
0 b Z# H& F: ?% o
、 8 w% Z, w' f) H
5 x9 e8 v2 F* U4 \& u0 H2 Q8 Q! r
1 \& n9 {' h3 X5 W# Y, U9 k6 z
; v) |; x7 e- Z% N$ P! o$ i" O: z! o
; q4 f! g0 J8 }. t' h1 ]% S K6 Y' y5 k3 t8 b# T
权限信息 # {; I: S& f7 X+ `2 l- w
9 X: `' [+ o0 B) A* D" [3 j5 [; n# W1 ?& f
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) + V, U% |# A) G: o @
5 S( e# l# c, o f" X' p0 c
' i" t- y3 Y6 ^ android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
/ J: d( r5 b) ?% z+ D* D& g% {2 f
1 L+ e4 X6 y+ n- x: S# i0 |) P, a) d3 o2 F5 D; @9 G+ Z$ V% ~- g
& M' j3 k0 a$ h8 f0 i# O
& |5 U% ], G. f! m1 G( f" ^
) ^- }& |. }8 P: r6 L; h ) t7 b' K) T- o
& H/ D' _0 f% f9 v9 q; L/ ]# e
1 i/ ]* v$ O& k* w& t% l6 ^
下面对这个APP的所有权限进行详解下:
# K1 v) @4 z: E# O. n, U
, I D. ~) M- C) s2 A& E# N% L
+ ?% c, @0 U* } android.permission.INTERNET :访问网络连接可能产生GPRS流量
! O7 K) I% J) G. j + ]) Z3 Z9 O3 R! ^9 B, y
2 s" F/ e/ l! ~# e android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 7 t# R7 u$ O5 B
, p" T9 r9 q0 ~9 T! t
* f6 o9 r* Z% E; Z6 I5 l android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
# j9 l/ w% m. U/ C% k& Y+ g
x! {* W, _& ~+ k" s; \( V s
- y$ a5 W% ~" f$ @9 J* ~7 n* h android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 + q! s6 x* ~9 t$ x w+ P, q
" B/ |3 ?+ N( k' ^% `; q; P3 p6 \
" q+ d, H8 K' N" o9 t/ A4 P android.permission.WRITE_SMS:允许应用程序写短信内容 " [! Y: v5 z# J' g
9 w9 N, J6 a% H' g1 X' w: d" {- J
' B1 I7 E+ p, ]) U7 c6 X% Z
android.permission.READ_SMS:允许应用程序读取短信内容
4 N8 f" h( ?! C7 S
7 ]& L+ |+ K& w+ V; ^' K5 \, D% R5 O* R" n% q' K
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 9 g: z( D0 p% [; K
# M4 y* ^8 T. d& h: w5 d" R9 S* p2 N: {& c' _6 B/ e
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
, p o6 y2 W$ w2 Y: u6 u + ?) c, z9 I8 s* l* F+ N
& b* S7 O0 }, S; j9 x
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 6 i# Q: h7 H: m- L& y1 M! S! ?
' L0 ?/ C- N) k+ B) Z$ n
0 k) o' N& s2 g" ? android.permission.VIBRATE:允许振动
- ^/ \5 A9 B- {) t o4 {0 {# ^! m& l! `7 K
& t" y$ }; {# u2 [. H
android.permission.READ_LOGS:允许程序读取系统底层日志
) J" Z! i. P' o$ v% Q& W & v0 {: I' X# ^2 ]$ B A X4 w
% Z2 i" l% Y6 A; F8 z* P7 T- h
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 - t0 I- w6 G3 E7 h5 e
7 Z3 i3 Q0 t1 Z9 \# _+ T
- U( ^. X; \* W) X# @: w5 l
& O- a3 Q" p, T( Y! \
! \3 }4 ^7 c% t7 G. T# T
- C$ r# G7 m8 {& r% C# s/ { 功能信息
. b0 q9 o# U. T! }/ S0 g& R+ E 7 I3 S, U( p6 y2 \
" O" c5 E6 i9 p3 o ! Z: v9 h. i6 Z c5 r" F
8 w& r0 E0 X7 y* q7 `- o: S% B* I S' b" q+ y; x
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
! M# b% v( Y4 z6 ^
1 w) C! C! t" \! Y( M+ J( g: P# z/ D7 A x3 Q" D/ d
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
! m0 P4 H8 G! f p* }% p8 k) d3 w& ^
3 m' |" P, ?' j4 k9 N
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 + T1 _1 j3 L+ [/ m% l8 y0 ?
6 s% H- }+ f8 E' k4 [/ |5 O
[' |5 W; P0 r" C8 c9 u
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
6 F& [8 g; y3 ?+ z) L 7 E: W; l! l9 v' D2 `
( e/ M, X7 |( x# F$ D ( f$ ^* u4 A/ p8 H
7 ? G- s' ^" \# y ^- o
' O- M. U! z9 q) ~2 O0 ~% g; p - h9 C6 Q _+ w0 k4 d0 T1 K
% Q! h3 C( b4 b' j, m$ U( _
0 w1 | u+ J1 H$ I0 Q3 Z 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 . `; ]8 i9 u$ L3 d- ^- Y
7 o- J- q* }% a; r. e9 B
7 @- f6 R" j1 x2 f. K( S' M
; Q; h3 A; N% m$ X- @3 ~ % q6 y: q9 v: Q, |7 R; t8 c! B
' c4 u, x1 D4 w* L6 \ / S& l9 f: } ?9 ~
8 K7 O9 ^) N4 S( ^/ M( {4 {9 G8 A- p
- \; F& _/ X% h: |
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
+ L* ?6 Q- p: U2 h7 A' Y, ^
0 L( e4 S1 C+ B+ ~3 a0 H2 j5 _& \+ L4 D6 _
5 @% F2 F7 W' t4 L8 Z " t k6 c2 _. c
* y0 [! H9 g6 ]* |+ p E& M& y 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
5 b& S' p9 Y' n5 r5 x) a " d6 T8 O8 X1 n) x( f$ N7 {
x$ r. Q- E/ n0 U1 \" p
# \+ k7 }1 o+ j0 C+ k
4 ]9 ^0 B5 V" W* V- w- K9 v6 H7 w+ ~+ z i' c: Z {
8 Z) b( O/ U8 b5 G/ l. M, R6 y
; ]0 P4 Z5 ^( g
: V4 p7 R; ^; D/ P 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
4 V) f8 p9 M9 X. h
4 b, @$ g- F' ` U9 G) \
& e2 d6 z: U( O LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 + P- _! M$ a7 `, e
; h# p% C$ Z7 E3 M9 H, K
3 f' e1 g- z Y! D/ L# p 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
9 D. V: j+ g; T2 r/ g9 t2 u 1 p) o, b. Z) s p
# E8 S) f! F+ ]- j 开源的luasocket代码可以参考学习下
' k8 z$ W. T: s0 N" `
3 _) F1 E5 L, s1 ~
/ T! D9 S1 t6 R% S: a https://github.com/lunarmodules/luasocket ; u2 c; X" V: Y/ H7 O
3 |% ^) E) a6 `4 L& m9 A* e( z z* z1 M, o4 V- L6 |5 l, w
https://github.com/fengye/luasocket ! I* I4 `& @7 f
" i" z y1 d( f4 R& r% @
' I+ p* a) {/ u: }- I1 h( g& o
9 ~, m( k7 o2 [" s: z( O , U6 `& v) i* ^
8 V: J7 D# T! [1 S3 z
d+ a# D& D M" r/ S2 r6 j v
1 I) v& ]! _! x# { k" K% X4 L \
4 m6 C/ S' d( a; A9 v9 S% d1 e, ` " E4 y! @+ U4 O0 g
/ ]- ^6 `+ t I8 r4 I+ ^, D1 v3 Q! W
, `! |5 h d! B& H 3 s0 C c k1 R6 d( p
1 n9 J' m( t2 W& F
2 E+ O( l9 e1 }- e1 @ 总结
0 }4 q2 N6 Q3 O+ p8 } ) a; d" v+ p8 \. k
5 H: z& H2 n; `& i5 H
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 0 Q5 C2 t# H3 E6 V- t/ ?) D, e, v! R, M
: e7 \/ e( i: ~8 _5 K4 I
) Y3 ~: t, B$ _( a( v" k9 T 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
6 M' t+ Y) P% Y" V4 d! i ' W4 _5 R0 R8 J4 H$ ^/ Q* {8 y
2 T1 q3 c' o. r& z0 m. e
对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 ! H' E m& b9 |$ ~4 k
% f/ m2 r6 r5 x' N" V8 B) ^7 k Y; W/ m) r/ q
结束 0 [3 k- D: [- Q+ n6 K: V6 R0 s! p
% w/ ?' z6 |& v" E( W/ k1 D% L
' u8 I& w: ?9 `( D3 t/ s 【推荐阅读】 ( U+ E) H! j4 O
7 a" W' u- ~! o/ ^ D
9 c1 l9 n1 ]( J9 c1 T' A3 a 对吃鸡APP的分析
' h% W! M8 c, R- f v0 N& M; q/ A+ D+ T! k* Q
' y, S+ m/ N+ F& @ 你需要了解的APP安全 ; x( ]1 {. ~0 W- u. f' Q
; R# x: }) W" p+ n
& G9 O, L6 D2 E 你需要了解的APP安全 4 y7 x4 l& Z0 f1 G5 Z# m9 J' M0 ]
! |/ \# G% W+ N2 Q- D8 W0 k. [+ u0 { ]
; Q' E# M! F' e& s& l ) ^% V k6 s' v4 U& B( T. J. Z
|