|
* }( y1 A, e0 Q. c# ?
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 : G( a! r0 U% T) g. J! z+ ?
1 U: h. b$ {; h8 Z5 l0 B: v
2 H1 ^. s, a( d
, B7 V7 k, |+ q% H
- k3 a" i# Q* z' f3 j9 q6 |( {5 t/ Q/ y3 N5 x
9 U& H: C( R; [. O: ]8 E6 k
* s1 J* k2 ?) [! O! u2 Q* V3 J# D7 N! x P
下面就以开发者角度进行解析下这个APP的功能的实现原理。
3 }* P. x" ]& a+ p- s9 {7 v+ M # X) r! u& s+ J, f
6 N7 ?1 g; U' W* {
+ l4 v$ t% O! c4 }+ X6 u9 @: u ; r7 F8 I, g- Z
. L3 ?$ ^0 q: s7 a
基础信息 . \0 f$ t& U2 f+ ]6 c5 k& z
: ?3 U! m2 V& ^9 @1 {# z5 i. E
* m- l# b" }( {4 F# \! I8 m 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
4 T, L# o5 _" S' { # |' T/ R) b0 D/ w6 ~# R
$ X' v8 o. S! x& \" k; W # ?' m H% l* m( y/ O& j8 e+ f( f
# x, s# v6 z7 h" A/ m' a Z, ~! a
( a* f7 o* W5 b, |" u5 ~. j 0 `( N8 D5 Q4 q: u- h
* K( T3 V. o1 T. E" l* S1 [; ^1 K
2 n. U( U, e- t' O1 E- q
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 0 L2 u% Y( f$ Q
, U, u# u" V& v4 ?1 e1 ^! c) F
* ]! h' z+ V/ z; R4 h" P7 s
7 K& |6 x( v3 r5 S1 s7 d
; I! o9 q x% Z: i2 Z' E/ ?% [/ q( `# ?
# W( S- R1 j! x1 f$ J8 S 1 n' ]! C6 q6 t. |+ q; M, ]
( c* V6 @; S* O- k* F! ]# J, Y4 G8 I
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 5 Y- z2 {% R% w" Y0 {
$ y' K& ^" S9 n9 q, @
, D" C9 Q' {6 O% B5 l6 B , E1 M5 D* O3 h3 G: C H
" l, M2 @3 ?* g0 N6 w: k9 T" n1 W- Q1 v
# l3 t( h$ F |; p( j) F
9 i, Q. O% _5 |2 o+ m* c: _# W# L
6 {( P1 k8 g0 x, ^ v+ u 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
, b3 p8 X3 W8 d3 J, a " L/ `1 P* Y8 }& X/ _/ q
0 t$ H/ {/ o3 C/ |! x
; v* P" d6 Z# _8 _# A$ m
! O! @0 a7 I; }9 l% [& O5 R( ]) {5 W0 j
) J' c7 ?: a8 Q H; Q h
9 z7 N+ l' l5 E/ q6 B
: C$ `$ L7 E2 J' F! q
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
( H; O+ ~ X+ ?0 H( X, U8 l
& U' G- s. n( J
/ v R( ^4 j# D7 K k" Q" p$ _( w$ B) r6 h7 W
K" z$ h3 l: _+ Z* A
" m$ w$ c0 ?' m# g( Y* W $ \! n* p4 ]; j- I0 e& S6 U8 [8 ^" }
. b: l3 u4 O/ ~1 X
" [: k4 ?% s& j: n$ E6 Z/ L / g3 W# l6 x% O
, j7 Q8 L# H; g1 g% ^0 d: n" }
1 G: _$ b# B& l1 q/ t; E3 S
签名信息 # t* k B4 ]9 `
# ]+ D, F9 i$ T1 ^4 ?; x+ k
- F2 k6 M7 N9 ?
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
7 t% e+ S3 W- @" x : A' i$ e m2 j! C% I2 _
9 A7 p! e4 i* s5 [5 E" A 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 / _6 U# J$ V0 w4 T- K
# b5 ^9 R) ~6 @6 e# G: |+ g5 r$ |& Y6 ], R, A
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。
+ F9 ?* e5 V; r" s- R# `4 Z8 d 7 J* I0 f/ e) l$ p' T: w7 E
( o$ V+ D$ a# R0 a" ?, N
6 y/ g# j/ }4 P/ V6 @! h. z 0 R0 G" H5 F' \7 I# e1 }1 E5 N
8 h1 Q7 W; x; y- H7 c
, a7 u% ?8 R$ [# i, }% _
1 j! p2 h* q1 ]; i/ n. N# k4 z1 B% V2 g! G( [- s I
android签名的数字证书的一般都是采用 X.509的国际标准。 * x0 ]0 z2 D% a( B, R
& v& D7 m- `8 v" c! {0 G. i
$ V. d# ^8 f7 G% x4 J) r 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
$ m# m* ~% M, Y
8 z2 T2 K- f$ e; b d) s7 w9 X
- t, j1 s- D L" G, F3 j 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
& |8 z5 ^* X: N 3 x7 y @. {. |- Z
1 b5 d! z- n. {( o, F8 V
, `5 O9 L3 V$ c1 W8 m- _
6 Q5 k1 s6 A$ J9 a4 A2 W, T7 z
, Y9 t% J! ^3 F: d" R0 ]
9 p1 m6 k0 I% U5 A- |
3 y; S% f' B) _' M; A; T: q5 E+ r9 H* [
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
( d1 w5 N$ q- e/ w$ o: K1 I" |' o
* } R4 e2 P2 L- ^: A# S+ r" Y) O$ y
4 l) Y' Q" i$ ~/ P7 q5 A 5 z) X- P2 s" x" n" ^ T
2 k/ K8 k+ _8 H0 i 、
- g: P+ ~; h0 `
( G ]3 A7 e+ {! _. \& G& ^# u' E* f" _
$ H3 n% ]+ I) S( V- e' @/ R
+ @0 W+ n, t$ y( e
! o6 J4 ~1 F! |4 x" A
权限信息 : Q& W4 B6 M: i
* {+ d* h! A% |/ H0 g. k: A
: C" x' D4 J) @, L! s: K0 C/ N
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) # k! z' `3 u" Y. t
8 I* ~$ Q9 e/ ^6 h% m. ?! }4 w, v$ [/ }' e- P( L3 t
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 + U, E1 _6 y# o- ?) ?: O
! l' o6 o8 X# _& p+ |4 J# z3 G
+ W( D& G$ [+ b+ f
- N9 \3 j% O! E% e9 c
5 M0 N2 P) ~6 @ _! W) \ W m) W, G( Y
3 M j7 x* H+ `; E @
8 n R+ v) N9 ]% V& ]+ H! g/ N3 _3 s4 C/ i: l
下面对这个APP的所有权限进行详解下: - A( p4 p& g9 z( L7 T+ \ s
4 t# C5 R- i0 }6 d3 Y5 P$ C4 H
* v3 T) Y: r k0 T& ^; E
android.permission.INTERNET :访问网络连接可能产生GPRS流量
: J, V; N. b l& w+ g . y. W9 A( m6 A; l' d9 a! A
5 v$ ^8 h, I8 m% `, X, \* J android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
$ l# p2 B* H/ z( M
- u9 d) o( i8 m" p7 n, D9 q0 X: S' E) J2 ?5 W8 H' _2 z( ]
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
3 L: v( F9 K+ W9 e. F 6 h& Z; n) u2 \5 d' @
" a- @. c+ c6 F5 ?( @$ {, l: V android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 ) e, z3 \- Z* t. |' N, K5 O @% U3 C
% K% e4 | p5 M' |% q
8 a$ Y2 N; p2 k2 R! H, _% D
android.permission.WRITE_SMS:允许应用程序写短信内容 / {$ |8 J8 u% \9 z/ ^* ^* R, h
2 q6 A S8 n8 }% T
1 }# d& S8 e3 e" v, P. b android.permission.READ_SMS:允许应用程序读取短信内容
# o* V4 J& K$ J2 u$ I( J) A + C$ |% i3 Y4 s% o- ]
% K% s$ a. N7 l& p: Z" S
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
' m, A- ^3 o3 d/ Q: r ]( I 9 e4 [9 b8 J7 |/ f* Q# _/ p
6 S" K3 G3 Y. a5 z
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 + ~3 y+ t- H+ m6 C* ^% c. P
7 @/ [% q5 W( l3 s) @5 b+ t E& N1 n0 w* g; x6 V5 h0 G1 y) u( v
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 6 T% E) ]- ]- d& t
]6 O( w5 c# c) q
% ?9 z- g. C w5 A1 b d android.permission.VIBRATE:允许振动
$ n$ J5 v& l: u; Y& c( H
$ Q3 ?; F* h0 k6 v9 ?1 V
8 P2 M$ B# R. E android.permission.READ_LOGS:允许程序读取系统底层日志 t4 h) {( J# s; x
, K( H- N( k4 Q4 F8 D7 z" L
- X1 t$ m6 ]' R; K! x% T' { android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 / c& f4 D/ g+ N" `8 y
9 q% Q1 A+ ~" w+ _, H' g0 I
* d7 b, h8 q9 ?, w
" W% ?: ~; l9 ?( P0 ^ d u 7 e) p9 ~ q5 P& y
6 u: `# p% k. e; M$ ^& N5 ] 功能信息 ; E* g& i' N2 h' w
& {) M+ [+ h* N9 D# Q& T2 n# g1 f* Q* B2 k
$ H. _3 `" x0 } P8 |# ` ) F j% t/ r- k6 k+ ^" H0 Y" z# {
" n6 Y" q _9 i/ |
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
. U q2 H1 O! S . F% c; q# `# |
, W s3 V' p3 c+ B; q# @
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 2 C" M! ~+ |0 A& u
+ {& ?# }: O% M; d
& J# G' y* S6 `+ x9 s 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
% n2 C5 ], o6 O( J
% _2 n2 }& I, i/ _& g3 b/ n @+ C" X( g5 Q% N
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
# o! n F* S @4 E* b P9 \+ H3 Y # J. d( G7 b6 k% Q+ P1 F: W+ m
1 v1 @- n. e$ a. V( [0 f , p1 |2 z: j2 J- G" Z1 U
I3 l9 ^; N0 N- j2 c) G& I5 }" S0 m+ \8 {; l' r
X# l! k4 D$ p0 E0 V/ G& R/ M
9 ^* U. O! ~5 q6 u- S. Q6 X- r q2 S
+ k: z3 d) L; I( N+ ^* h( Q9 h7 ~
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 8 a, h4 a$ u! _! C7 \; j
& @. j5 V3 M3 z1 C3 ]8 x8 Y+ o! J
9 k& U o! ^7 |; V# B
' u) S |7 h3 h$ e 3 }0 ^% f Y% K
4 Q& J4 `3 T5 X F, a2 [
" I) s9 S# R+ P6 H5 Y
9 G: T0 v1 v0 v3 X
# `9 \; G4 t& f# j 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 ) T, b& r+ J }6 N- e. R
" o( S5 G6 F$ ^9 q6 K$ K& u' E
- E: o# T0 Z4 I% e: n ! t) E( o* U) }! O# j, b
" l5 m! v5 K4 p8 N! b( k F+ u9 H: y5 H
1 z' w7 S/ j$ }6 g9 p X- I- R
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 ) L9 D7 ?+ P8 @+ O/ k9 L1 u
: m; K0 [0 `9 u; Z6 B, j8 _* r* H* ~ d; s6 B& v4 X {: u# [
! p! O4 ~5 o& }0 u4 g! r
/ C# f# j$ }6 j. [4 a, I" P6 D7 U$ r* m. w# h4 t/ I& X
7 l6 w; d5 h! z1 C5 g( i ) v' c5 E9 ~" h' E. o
0 p# e+ O! J. \$ U 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
0 n) Z( T. O6 b ; k+ M9 n& J s9 Y3 o: s7 F$ f1 ^
2 a# u c( ^9 Z LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
/ a; [: I" F" Q1 |9 y* O4 U% h7 P/ x, V o
: w7 @1 l8 h: R& c. ^9 T3 w) e* E3 L/ {( J2 d
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
0 P7 P: @ u/ ~( T- ?: K1 g
5 D% }5 s7 L! T$ d6 l1 o1 I# M( ^7 V4 e% r% T/ P/ T
开源的luasocket代码可以参考学习下 ( l4 j; j- e q+ r& a& E
. I: \8 }7 ~8 m4 h( @; J W: r& y: F3 R0 A9 T6 T
https://github.com/lunarmodules/luasocket : _3 q1 X$ C! {0 M
8 _" Z7 d6 B: Q0 _" c L2 i
5 ]( P) g, t8 E/ [$ u* K* S* e https://github.com/fengye/luasocket
& D3 e9 b; ]" K 3 V! }, p& o/ ~/ Z( u0 J
! Z+ j- k( h( i Y. |- k* z
$ b& I. q" H$ ]. C: C
7 g* n, y- |3 V7 R8 z+ k: l! p" C# H
% ?" Z- N. O: \- G6 t 8 [# ]( ~% j) ~, P8 l+ G
% W9 Y9 [8 B3 `
/ J" u$ g: Y6 P8 Z! R. P- a X8 b6 H9 n$ f% x
9 U4 t/ ?+ u+ T
2 g( ?! W+ Z4 q0 \4 G- U5 A' @: W 8 W+ k5 v; ?7 p
. ^, _+ W3 Y$ | R
总结 6 m' v0 z4 f9 o% E& o: Y- h# m
! s* N5 v B+ g, w; a. V' t) V
/ }7 s% C+ h; g8 s- \8 ~! n. Q 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 + @9 c5 ]8 A8 o" l0 c' ^& x
5 g1 A6 H9 a* Y( H6 P/ T# v i( u$ w8 ]: [- D
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 " K' K( X6 e3 B! U& r
8 t& n8 f: w6 g/ t
0 ]$ U; H6 K2 k 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 7 O6 {( B# ?* z# o6 i1 M
, L7 S) u& i# c O4 }8 A9 P0 d
8 }+ M- { w- v {( S2 \0 |/ A 结束 ) [+ J% {9 f: q8 s7 x8 R
4 R8 u o- g( E, c. U# q: \8 t# k* }2 k: Y7 s
【推荐阅读】 / A$ E1 I! ]) X+ Z
# [% g; c. O& i7 u2 w' {$ M
/ v8 Q4 \) R7 L' p7 j 对吃鸡APP的分析
2 a3 Y9 }! [' K+ J0 O 9 N! n1 q4 t% D+ m, C8 T- Y9 m& q
4 y4 k$ i) c8 e
你需要了解的APP安全 " T( A A" W, L8 y5 T: `
& Q' w+ L( B9 f* d: B' M
1 b0 O: c& E, i# e
你需要了解的APP安全 : n- D4 e5 v3 `
( d# _/ `( f/ @" a5 X. b) ]
2 t( q& I) N& C2 I ( a7 h9 U# i) k7 t! \8 z( x) W8 E: A
|