* o2 u) |; _8 n3 I
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
( e5 {3 v* ?6 K1 a6 W 3 D( O i! y6 M/ Y2 m5 t0 X1 j
8 h% ]: h* j# }( ?$ n; G9 K
' p, e! z4 `9 P2 L
* ]1 O& c B& O" F8 I1 ]4 |
" d& s! U: T d8 g0 t$ L! a8 S 3 u# e4 k ]0 Y. d# W
" E- V- Z' k6 e% V
- j1 C5 D4 U+ e; l. l1 e( ^/ G 下面就以开发者角度进行解析下这个APP的功能的实现原理。
$ ?: ]2 u _7 p* ?' j ; y7 |, Y/ |$ k! m
) t' ~1 y" z; L+ Q; w; b ) N8 X; M! `5 ]( i
. d, H4 c! w& m: R1 s; `* N6 [8 @! U& @( i. i
基础信息 # Q+ K' b' d7 _. y' [% B$ ^
0 l ^: t3 o) Y
$ s+ f- V9 \! Y! ^ 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
! C/ e- z5 ~! e- J+ B) G E+ Z" R1 e
% ^) P9 Q: V# ]+ h* B, d) f$ L
$ K1 q: }: C% }# T' ]$ G
# C& \* y$ T) }! o+ c % w8 `3 B @ z! E
( x: m1 I4 K# C7 e# R; g [ o; q4 @; W0 z2 E$ ?. V+ J
, ?% `4 K" G; a1 v& C* H# t& g' S* `
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
1 z: v( \: e, Z; `! u' f 0 K P6 N' D6 L, }- n% Z. ]7 Y! U
2 v. t. t3 n4 V% ?
$ L- [! V C. u7 `7 H" Q* H0 F
% \2 N* a; M' o# U; `+ q( w; L/ O1 E
2 J( N4 J9 u3 T6 @* Y7 C) R
- [6 s, o, f8 `" G/ e% L
+ S! i/ y* I* c. ~/ L2 l 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 # J g1 O% ^: A$ z% x4 S
( S; h, O/ C/ X$ f& w7 S; I0 q c+ r/ r1 e
: a9 v+ M" W2 c
# _; v" v$ p2 Q
3 S3 n# D6 ]% y; C# A4 ?- D5 h
: q9 m9 I: w, c+ u
- W$ `5 G5 K# u" U! }3 y
! h* S7 N' M4 z- m5 \ 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
: }) \' d6 D# a/ I6 V2 C # x* j T$ D+ Q1 ~! G* @1 T
: d/ p0 P. W' d* Y
8 A4 M P9 G% _" l. z) _( w7 [
1 ]$ R; h, E' ^6 d# @
" I9 K8 S* H Y! _0 ~) R) |
9 S% e/ i- V1 l
3 d4 Q$ ~) d: ^( ~) `) p' s: N
- \4 Y8 _" J1 m+ ? 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 ' e7 @$ B: z7 \ ]' y; `) U7 ~
: R4 M% q& K6 F5 m
3 A: x3 W0 r& [ 0 I; \% Q X' S" T; H; I
+ A: H( u2 l* P. B/ }6 ^9 T; Q; [+ `
. N: g2 C) t0 M% A" @2 B , T0 y) R1 C8 K( X% y; Y5 [7 ~( h
& q0 Q7 ]1 O x6 P7 F$ Y ; U3 U% l, b+ F# v
, ~6 X( S% N6 \3 m6 m0 }) j) Q
5 l$ [, f3 B4 ?- i$ {& C& R 签名信息
2 g: `5 `, f) t! k s- i; q% L# z ! v: f3 s: k# x$ T) T* Q* v
2 a U/ `; n+ t- P/ R, Y
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
; u: ~" ~; e, p' W# }" d
+ u8 p+ k8 c$ z6 j1 p9 n; m. e! f! S0 x( G
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
5 `, W( K. v7 c$ J, l3 q4 q 9 e# ^8 {0 u" Y' |4 p- \* ^1 l, [
8 M- }: C8 P+ W" P 在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 ; [' E/ ?8 F+ s3 P
/ \8 f9 i8 O' }6 A9 Z& H& X9 ~9 U( u5 H4 i7 M" n
- i1 U* ~( h4 N& c$ f9 O- j, `
. @% B! I: B1 i1 T0 V
& A% u1 a4 u1 T u* L
" ^; o' v0 C( U6 L$ _ T- l
* l) [ g- U' ~" f6 G/ U# `
$ Q& h% a" ~+ J4 V% ~ g android签名的数字证书的一般都是采用 X.509的国际标准。
! g' o) O# Y- h/ G" a( e2 e # h- ~9 E- k( Z0 |% E
. s% c% ~# n7 i$ z' F1 z* J
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
; w6 n: F5 Q6 D" c" A. o 3 X. c% D2 |" W" m& Z: v
9 j$ T0 J% C% ?6 q! g% J 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
* G t/ M& A) Q' I0 Z8 S" F
) v7 H$ Y5 |3 K4 q8 S
! J$ ^7 A2 J9 B5 b2 ]
( \, [) Q4 {' O 2 ?; N# L8 W" R: v/ L1 \
& Z7 W2 |2 w' J0 U' b3 c9 w1 R9 v
, ]3 e% W! K! {6 [9 L: q2 b 0 t! p1 _' s. r, B* E J
/ r9 u' k5 {* `9 C3 H$ N 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
+ _* t0 I* J" Q* E1 v+ I; Y
/ m; u7 L1 f6 m' X8 c" U
. V4 I+ A- K+ [/ V# f ) M$ J" G8 k! c9 M& Q
, h6 D# O1 g! ]0 |( `
V* \" s+ {4 U; y: t# [ 、 7 x: M/ b. ~5 A9 P
1 Z* T9 Q& \' a6 J0 C2 d$ g9 {: x/ R3 L# {7 D' \/ X
& I. w/ ?( x) Y- Z1 u 3 D x8 [2 T! j$ |& e
* M% X# F6 k( u* o 权限信息 $ Q9 V4 Q/ u: Q7 d' |9 K# @
! d$ T$ {3 F6 w
- P( {" M" I- A 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
) @9 i' K8 w7 Z7 {( k$ S( K
; b$ {& s: k" V6 p' t
. l, d$ q) x7 i C2 { android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
, ], J+ k, K/ R7 Y8 t" n ; G" e6 @4 x( V: O9 a a; u
: c4 [. X' T( o
6 ~; A" ]2 ~3 c" w
8 f3 n s7 W, b, H# L8 F
- i1 @7 q7 E$ Q. Q7 _" I0 D7 g& Q 2 q1 q+ a/ B U, O
4 g. O5 T6 ~3 y: S) r+ T; o9 ]
& {- A0 n, A/ I! ? 下面对这个APP的所有权限进行详解下:
1 _6 A2 g6 S- W Z8 I0 a" v
) |- Y2 ~# y6 s1 ?- B6 m `' w8 k2 b5 e" f3 a
android.permission.INTERNET :访问网络连接可能产生GPRS流量
5 t4 L9 E& r/ S, n5 m1 H
4 Z6 H* Q9 t' x" C- I- w' t8 b, }+ a
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 , f$ T% S& J! U5 d9 N( j' | P
7 c1 r7 U3 w% k: z9 ]. S
" @/ e+ s" x: z' Z
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 1 F$ q, f L: B5 E- L2 H) x0 v
/ Q4 [, g) b% P, c: K- O p% }4 v" m6 F0 k2 J" I) ?1 R
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 3 e$ x) k% R/ _& N
# t! v/ x& k+ K, w' [) d
5 E# ]; s1 Z2 S7 {8 b* l
android.permission.WRITE_SMS:允许应用程序写短信内容 $ i! x- K& b% C7 L* |" a9 [4 v
0 a q2 Q5 y3 Z( X$ B
$ [; O4 j( r- e% t& p' _- q
android.permission.READ_SMS:允许应用程序读取短信内容
, B3 s& V! V6 i' e& |5 c
! E+ |+ F2 h: B: }, E# J, U- N0 }- A) T d8 q' }! a, e+ o3 Y4 T
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 # M7 k/ z g" A3 ^
3 z6 v! G+ E0 M" L7 ?
, t f7 X s9 J" m, A' T( a& D/ a android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
* u7 C- l0 D8 ^' R+ V+ _! G
% N" R9 e2 x4 w. S5 l4 ]7 A* @1 w
! w3 X2 N5 j: {' ]* E% z2 a android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
# Z" G3 v4 ^9 {" U1 k 3 o. E9 K5 E8 M1 x
2 \. O+ X3 H' A/ H, J* H0 k
android.permission.VIBRATE:允许振动 d& } O8 S, f6 s% i# s" d
, \& m: z; C! ?; H! Q+ t; Y: d; x) C9 S& S& h8 m7 l& h
android.permission.READ_LOGS:允许程序读取系统底层日志 7 W8 l# ^1 u" E* ~. ^6 m
1 Y- W9 U0 }! H {
* j6 h5 T( T8 y1 G android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
' c8 H1 Y; Q) q, P* ]* X 1 @3 S: `' G# T. V9 x D
& R$ d- u$ r* Y0 @. d7 k - V0 z |$ m8 p( L1 A* ~( S
( t/ d( @8 i c' a- y. ~+ Z
8 {8 u- ]8 P: `, D& P5 i
功能信息
% ]4 _7 r3 l/ Y: o- s8 R4 f6 Y. g$ p 0 O# Q0 _4 n" W- q: v* Q- }4 X
' w5 {7 b; b0 y/ A) ]! [- W y # ~' o1 ?7 O# x! w
9 ?% S) f& e* f' K4 b
% w( P$ U& V* K- a 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 ! h) y/ C' {: k( a
2 L9 q" J& S1 v- P T
5 A2 t+ f4 c& D2 G Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
% s4 O3 _. W, `. ^7 j) |
x6 p+ H6 J* \% P6 C- i: p$ h
% U5 P- S5 {* H: }: v( Q, `8 i8 } 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
2 O2 |+ H7 S" T) l, d& L# q
. p, V0 q- p5 t6 U- _ D2 N" F& G. |7 D2 X$ {# F( Z8 @4 p/ o0 w
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
6 w6 s$ K/ m! W: N$ I 7 O. X: m D. l: Z$ x+ S/ [
2 K% s9 ~# b% s# G5 }! O
# i l- x6 h$ E% d: t 3 k1 Y! V4 _1 _/ _& C" l
9 X5 T' W( C" d5 P) o! [
# O- Q9 K- }) n) o0 [; }8 T; v
! @: o& {0 _3 c# Q0 |
2 E$ [6 y4 g! C# R3 J( n- n 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 ) Z: c0 A& I9 }0 ?+ D6 [. V
?3 ]0 {8 [8 ?" v5 e( T1 `
: J5 `' I( o; s* k/ ?
+ e' o: Y4 L4 D% D3 m
/ B2 D; ^+ s/ a) a- P; Z# D: A
* P( ]. o- ]4 p+ x
* U) y- X( }+ {1 K ( T7 p2 R% q6 Q( w- M
, S5 X1 q! D4 R2 E; x4 g 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 ' E0 b7 i% E9 g
7 _! i/ v- A5 j
8 O* B: `3 Z0 s$ n a! u( T 3 J: L, ]+ O4 p2 e& F6 {
/ v f, p& M- t, }3 c! t! g
5 o- A: M1 f4 v" m+ d 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
( i1 u" Q+ I4 R r, o- a ; |. }* D n( }( @# P
2 T7 q+ o* M' g* L# w* q4 {- R
$ U6 V" h- ^& w& t, ? & Q; J. d- _/ v5 F7 e
6 r# l8 ]7 Z" C' x3 a ' E$ G( D3 S, H- X+ u
( B+ i7 Y9 s' A" q% j
- [6 F9 m! s+ C. {
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
8 w" c/ B- R2 \ 2 F0 ^: c0 r7 G; o: \/ n
# h1 K# I% I5 W" ?( v: K
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
: Z% x$ ]8 i# h3 _& n! ?! n g' m; | 2 [$ \/ v& R/ S: F" y
. |1 \6 b! E2 j% X: t& D6 g6 L 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
% h: F1 N8 g; y" x# e9 C 4 `; u# d7 R. Z2 I `/ `% {
8 ]# ]. a7 V1 u6 ?; f" a/ i 开源的luasocket代码可以参考学习下 l5 n+ y+ m2 O/ J2 M( l h
/ F, D) u- q* ?" {2 | O
; \" g3 }3 ]* _6 q https://github.com/lunarmodules/luasocket
) j) g# A& L6 V- Z/ H8 T
( D: @8 w4 k" k7 U
( U$ x7 Q8 t( v- [& r; G8 r https://github.com/fengye/luasocket 8 H" k% {% `0 y" H% i
2 f* _$ S h+ c3 J, d- F1 |) o4 I3 Y7 t) X% L8 i( T/ R2 s
" m! V% f: H6 e) P6 S! o! p ; R; i; l) {2 R5 N) j( B: ~, |1 }' s
: x+ N: f* `5 _. R( O2 ^
* n: T, j* o& X* m
, b* }) c# x) L1 o9 u3 d4 t7 G/ e
( G0 h+ {% D+ F' |( p4 _; q$ [$ c
3 S, ?: [( {! y& c9 B2 G
& T$ G% i k+ q& g$ K6 V, ]1 G
# c& U( O5 V8 L$ P: s+ w' I5 I
6 @8 \3 I" u+ M4 q
+ J7 }0 M' J [2 o) n0 t4 m8 E0 X6 P; [- E
总结
) S5 k% h, y. H* Y! M: V( c, O 1 Z- F- o( E7 P+ w: I7 H
! g X R$ y+ O- y
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
+ Z( W* Z+ A- s + d) N$ A! C4 g
# F* j; J, Z7 }& X
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 , d& Y6 b- Q7 n1 ]
2 B6 O' v/ q- ?4 G n4 D* ]
: O8 U8 b) [# v' f( w 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 ; b) X8 ^6 O% @
% _, z0 q; g) _4 U( g6 n
' v! D' a! r' n d" s! I
结束 l G" E; z; R4 e0 X5 P! X3 [
" i+ F* ]: \6 g8 l \ Z+ a; `/ B: X4 u! S; T; U% Q% v
【推荐阅读】 , P$ ^4 z* K3 w2 q7 U
. O# P- _* z! o0 j/ x/ F; C
" w0 t7 M: A4 F) p. H/ J+ h 对吃鸡APP的分析 : I' ]/ `$ ]' e
' Y: L$ \4 r6 ?6 D- ~6 F) l
# l) t7 v C; q1 Z# n9 f 你需要了解的APP安全
. N9 Y/ O: h( U3 ?+ { " [! \) }" @, R# z2 `/ |/ T
$ ~! S% z Y# |; ^
你需要了解的APP安全 - A1 ~ m& A, y- d9 s9 v
# L2 h! R) l7 p3 S3 V2 z/ `* @) k0 E/ }; t; Z* R8 \
7 `3 r& I0 h4 ~2 Y# b \ |