|
- d% w' D. `9 {. u 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
" b& y8 t+ Q' X0 H* L3 @, X0 D6 l + ]6 ^( H. `2 x0 l3 U
4 K2 v- @6 X$ {: s: z
, N3 v$ n; B& g' r: U( N: r
! U2 U& f6 _1 g" M' {
3 b$ h+ U% L( y0 E" z' w; z5 Z $ H+ h& n" g8 `8 C3 R
- H3 H* L* i+ L& M1 b5 {" w/ n0 B: y
下面就以开发者角度进行解析下这个APP的功能的实现原理。 . V1 y& o# b7 k: {) t% S C
4 P# f5 b- C) v w2 `# \2 l5 i
; g# N; f1 m: a* {
# R7 D7 j( |5 y& _) i y
' i" g. }% p# X. g 基础信息
, ?! a7 B) v( R0 B1 u m
0 X& p! p, ?0 O& W; u6 Y
5 N4 D8 q+ K2 z* e% ?4 o7 z 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 3 f+ g% @4 T, x! D; N; F! H& d
- o3 w. G/ e5 p: n4 T
$ K4 _/ A1 M7 {" [2 w7 r. n
. F8 q6 R% n" k
/ z4 A1 O- D3 e$ f, h7 g
5 |8 u2 ~# U. P! }6 J2 T1 }. l0 r 9 Y" i5 e7 n& a1 M* @7 Q
; J6 \; m( [7 K7 }. b+ o
0 H, ?2 r* `- V 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
4 `+ `* y- G0 \& X& F4 m
5 J$ M; Q( w2 H* ?) g1 N7 D4 x/ Q x$ |2 Z# k5 r
( O5 B5 ~; |/ S6 J
+ V7 \2 r7 C8 r2 y+ j+ J" ]' n8 ~* E
0 I4 F! z4 a7 |2 f6 {1 `0 i
0 _. {4 t P; G" c8 s
" a. s* ~) t0 y( t5 r
* Q5 s- M* _: P! h- t0 { 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 3 ~/ s% o0 Q, ~# I1 }- {; U9 p Z. \1 Y
7 t& {2 j8 U. s
) d# k# z# R1 [5 c
0 R, k& f0 \6 \. T% B0 c
" k! Y4 R! {. o
. n' n( B' ?: w% Z+ ]
3 r6 T' W! Z: Z! k # Y0 K" G% Y% {$ s) q( q. Y, H& R) k
( |4 ^6 i. C( H3 w4 ^, b1 b 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
. `5 ]( Z7 G. P h , U8 _0 O( M, d3 P+ D4 M e
J D* m6 l5 K+ Y/ T% c% r 5 Q l' n0 }; z. ?& G: A
9 w* j' C; y6 m0 x" m& t( Y1 o- F; g9 L) [, ^; V4 u) |
. x) q# o9 s6 H7 c5 w6 l8 u
( q% V4 Z7 `2 n; d2 {- B3 ^9 P
7 C6 ?; U0 @8 v% ^ 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
+ j3 W. m4 d; s* U # |) ]/ O' I5 s0 D% V7 E
+ a; }) i) F# W2 B* { * A# O ~4 R4 ~2 R
* Y5 D$ L+ i4 W8 ^+ N$ s) x3 P. [5 Q: P# ?: n, C$ |
) t7 F/ p4 ~ ^/ | j" R A& h( L# h7 p" S" E6 w9 {
+ \- ~, f- T/ ?. E1 }9 A6 E
3 e7 r% b' m2 F" t
2 w1 C3 C( l) E. p9 \3 I
! p/ ~* I$ t5 _ 签名信息 # p \1 c6 C; w6 H, y- J
4 v( v$ C" u7 s% X4 m3 u
: y+ `0 f3 [( c5 B+ ]4 D- H 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
6 g* V9 R8 ^7 S8 U; F* i . L/ Z9 M3 e6 `& o u% e9 x' }
! G, \! x" q7 H8 a# Z* C7 f 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 ' r; E5 l; s/ R4 @
& X% a3 Y, Z" u* g4 I
. A: h0 s% S4 _- A) r3 a b
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。
- V+ z$ N; l7 j2 A$ [ % t% }3 M- Y( h( o( U) T* O$ S5 k
0 }( r: F7 `. Q
2 x0 d/ v* z8 Y' E9 D! G
$ R+ Z2 e0 E# g& b) A" J+ j; _8 {
5 E, z) \) n4 K7 `7 r3 h # u, t2 k0 ^) R" I
5 D! J5 `( P( h& I
4 M; P) Z1 q0 p `0 j7 A android签名的数字证书的一般都是采用 X.509的国际标准。 7 c8 w% s' m" K6 V5 C/ }
$ p4 ]6 V% i y. [" D9 m/ d* K1 h4 Q3 C& P
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
8 ~+ o N: p! W2 [9 o3 q( q 4 N$ C! Q2 M& T7 n. T" ~/ J
( k2 K P0 ]' U) q) ~' W$ X$ [ 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
3 @. y: x- v* `0 e: ^4 ]
( W9 y* |; m3 a, Y5 p1 m7 e& y4 A1 b; c1 C3 d j
7 [9 C- d0 j: p) z" z7 G- h# E7 i
1 h$ Q" x9 K. g8 M: {
; u, p& h3 s7 O; K! ` m
% L) _ C$ d' V+ }7 m" q
6 \; Q2 Y1 R: Z2 s" g$ Z! ^1 Q, e! w4 f- d7 q( _! o' i1 h
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 w$ t; e$ Y4 W8 `
' {0 e$ n5 A: i' V+ u
8 y* Q) U* G3 E4 p, y- O
1 `# F \# E. Z1 H5 D+ e
7 _# ^8 g m' D& d/ c+ @5 e1 f% h! k+ I+ H
、 + |: E& C' d6 N
8 S' N+ T5 i& p& n
2 N5 S- f2 V$ m" t& i1 W+ T
- K9 G8 E* E5 S) K! B. V
: _5 `/ {; h3 o1 G) M. [* T# }9 F
d) \; C' Y4 R; f; n 权限信息
6 e8 W' `6 a8 P7 ?' x3 f; p: r! ] # a1 [& u' F$ j$ M* y. E
8 N# R2 `0 C* S. X5 l( M; M( T
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) 7 e4 @7 M9 y t+ ]7 _* W- f1 j
; K. I" L1 Y$ I/ k4 n
: O# v# R5 t: R8 @* z3 N android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
& N5 j* L1 g5 i6 N( O 1 Q, v O; m4 |: ? s0 W0 m% b7 P$ _
4 n! n0 i/ j; c# p o' ^ h4 Z* o7 h' N1 T
. z7 \% a+ S8 |0 y
( {1 [6 q* l5 C6 u" u2 ]1 F
% M# f; G; O) g) |5 D4 f
5 E' C L* E1 ^( Y& K: O' R$ z0 A) _: m
下面对这个APP的所有权限进行详解下: $ Y2 [8 W, b' @1 T, Z
$ F) y0 Q" J7 R
5 b7 b; u" H2 ]' h+ I+ u1 q
android.permission.INTERNET :访问网络连接可能产生GPRS流量 6 ^8 U* i- D1 ?, T' K* s
, Q- U% g: z* c5 [5 x3 d6 w
/ h& Z. M( H+ y7 w; R' ~ android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 ! Z3 f9 |/ q q& U! ]8 V
( L! n$ V* v( L9 o4 X; F, G9 Y3 i. Z. \9 l! O4 \9 a
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 5 ^) x) F+ p4 a1 q. i
. V1 U4 }' W& m/ {* \4 R
`) W/ h$ c# O+ ~6 e$ H* X! w
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
8 e/ c( K) k& E4 Y0 F " W# f9 B( Q9 t4 R- v4 Q
8 P1 F9 K; ^! V% X; s! W; Z android.permission.WRITE_SMS:允许应用程序写短信内容 6 i' u3 u% q, A) f8 Y( X
$ X: ]! Q2 G7 a/ c
* k. ?; S* o2 Y% ~3 H$ v& w- |" u android.permission.READ_SMS:允许应用程序读取短信内容
! X |. x( M' t" |! i3 w* ]! I. \
v& X% U2 u' D" e( G
0 P: }- J, W0 {+ [3 f android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 , A E/ ^. G6 x" m6 `9 A% i8 @
8 p/ _6 {2 n: r& m- }) n. F$ J1 {! T, I$ J7 J* R, U& _
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 g) V2 F, e1 o) s
. O+ `; ^1 \+ r9 i4 _8 X6 ?
; {: a( L3 f. f& l7 u$ E/ B8 X android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 m9 W* Z ~* F& Z! ]$ |7 c
\( F) ^+ U2 Y$ }4 |. M
k" C3 G1 j/ ? android.permission.VIBRATE:允许振动 + t' {, Q) z* p4 W% L9 o+ ~
0 I9 Y3 ^. t" z# T
/ a) Q; K" |- S8 N4 m z android.permission.READ_LOGS:允许程序读取系统底层日志 ( f1 K+ M3 j3 G) X
- ` `' L- [( F. a4 x* H, I9 S
3 t, g- \% ~! U6 p" J' P# p: R android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
% ~: I2 I' b$ }+ \2 R
: n' \- x9 O5 H( `! B; u
0 V, ?( [! V4 G& k N1 _ 5 B I7 g8 v; ?) U2 K+ s r
J7 J4 v% g* v+ j
. h7 }5 p, V( o. W/ d3 [. L" S
功能信息 ; m! V. O3 i" [* s% q/ t
4 {. F( e2 P: G! K D) ^
/ v" A9 Z' E- F8 F* ? 9 _* L7 R* R7 T2 q
5 W ^$ R% O I. r+ `
+ W( x6 ]# `9 ^" @* n# N 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
& }' k6 Q5 i2 s# V4 Y. v( z ; \: x0 D" l5 G9 V8 `
7 a/ z: I1 T5 V$ l! Q" I1 H
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 . d! H; K1 X( ]% ~ j* }
- k; U/ K1 m9 {
4 }) E/ E4 f4 U8 b; R7 i) h 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
/ F+ o6 r9 P0 G: l8 m! O 7 G- s: D+ r* {
7 N' D! `3 N/ ?0 S, S 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
4 S6 C9 `) o. R4 L' o2 X& Y& ^ * h% O& ?8 w% T+ h9 l- {8 X
9 `8 w3 i9 u) q- _9 y2 R
& u k3 i, ]; E; {9 b! T/ H
9 ?$ p/ g& c; Z6 `3 e, B' D& V9 P) T" Y" M2 g/ y
1 Y2 H6 y0 D+ j' D9 I
/ e* U# `) c4 D# c! I% t
% Q9 l/ R* y( H7 N. W: C
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
) L0 j8 W" I+ B
. f& m& G2 R8 f9 Q6 \) u* p# Y# e
6 \3 B4 W3 E# \$ y* f7 e 2 d: j! H3 B$ G( l: H
5 h; f: ^- A, ^6 ^: l5 g
! B7 O6 C* c' D9 Y4 a2 p6 w6 j! w
$ z. |% j6 x1 T" b1 `. p: P . T+ X$ }( W1 P8 p- G! H, y$ O1 z
B$ _) ]7 ~, S' |. N/ e q
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
$ Q/ i& f3 J# X8 n' V # {/ r1 O. T* L0 v# R6 a
" c0 C, v+ V) w0 o7 f7 C
; _2 Y+ `; L7 w# d 6 V7 w& ^" p$ E* ^) s7 S
# }; b. G2 o3 @ 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
4 U! E7 `" F$ \6 x0 v
$ ]- G+ I6 G9 d F) u+ s
8 F/ U/ h& y% }6 `- P$ f, q3 x2 N
) w8 Z0 l( }4 z6 ?' H1 g4 P
+ h7 Y& D0 N( U- \* P
7 P: a& n% W4 b+ i7 } 8 y6 X! {9 \7 W* A2 T' G$ d
$ Y2 B2 i' L! L/ l3 @- f4 P* b% @
9 {% x# P( \* P: N: \ ]1 G/ q
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 , k( H- _ K/ m/ n* Z, M2 _
4 s9 r' X0 y& r8 G# S3 x t7 C1 L2 A
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
6 G2 `. X# z( ^" I
# |, i5 I5 g- I7 ` r Y+ L1 W% U1 V+ ?+ [. h' r" s
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 ; J0 ?4 n+ V5 a
% q8 c5 @) U- k
7 l! r. @0 o0 [: R& B! s4 n 开源的luasocket代码可以参考学习下
9 B; Z% B! C* \( \- m ! u/ y4 i# A5 `, I- z
* E' s& n4 m4 z# {" O
https://github.com/lunarmodules/luasocket
/ r" F: L3 X8 a5 z
9 T' ?4 W" R8 F6 _; h2 ?8 F, E
- H1 t8 A4 }- u https://github.com/fengye/luasocket
7 n2 Z2 b# q! ~4 c
% [( W% Y5 q) q
0 q% b4 M( }* f* y6 H/ {- ~1 j! B, Z
* b5 ~/ Y; @5 ?# E$ A9 L1 v& Y 3 w. K5 ^8 g; t$ ?
/ v) P# ~$ s0 \! U7 x* N " x \5 c9 x% O3 ]) I* q& g# j
' S9 m2 C B0 V) ~5 o4 ^
4 X5 f8 }3 _' `+ b6 p
. g' g3 a& i3 q5 l3 z
1 Z( h6 [' v" n2 m I8 p" K# n7 L/ h/ e" X" r. e
, C* j8 M: {# @
2 A5 O6 X* M% Y! O. x
+ m7 H5 G) f; y) L' D) E. ^ 总结 ) Q! S/ I2 `+ x; w: _
1 a$ S5 n: _% l+ i3 x# N f% l8 ], ]1 [* p4 Z! c9 F2 I
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
( F7 o" @% E( ~5 X: v4 g' ~ * |4 s- _3 e6 n ]1 Z8 f' E
/ ]6 y/ A h" E; o8 w# W
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
* z, g7 p) D, f ) C" c* c P+ z& _2 }. h8 y& ~
' x# g5 m# u1 {0 k 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。
, u- ~! P; t* h) c' L
2 ?- t5 J$ o7 H6 F/ L! S' h, t5 M2 R- _
结束
9 ~9 s* ` F! A, ^; A" T
% g' h: `/ y- Z- i7 F% ~, f. F
% @) `, Z0 C/ l, d8 u( u7 F6 d$ N. x 【推荐阅读】 ) F# h4 I/ b+ q# o
& h& m- }- A4 u3 r- }9 r1 F4 b3 H! L) f- `- R% {- D1 S
对吃鸡APP的分析 " H+ Z+ j5 v% S* U
8 ^* B, [+ Q6 ?. I, W7 `+ ]* J0 x) ]
你需要了解的APP安全
2 U1 f, q: S/ P& {" a4 X 5 ?2 U1 |+ ]( N0 w. R
. A- |& S; Y$ u* S1 F7 X" M 你需要了解的APP安全
' o$ ]; ^2 \. h- X3 { + t# z5 @2 T. {+ k# y* w
2 g- W/ t n( o
- `# i4 o6 K' c, E) ]; w |