|
# t8 P$ y0 u! B6 j
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
, h8 `& ]9 i, X 4 K4 d* F5 i! w& |
% M$ X2 ] W- q F! `
1 i- s! a: f9 g; S. r3 |' O, a6 Z# m
' r5 h& {0 {' X+ `- Y) a
$ r7 J0 A' K& z7 k: t2 J. v) _' m. h 5 y) |' B- p( ] _" q
" r) {+ R8 W! M! k
8 h' r: H- m8 G3 [% q( g 下面就以开发者角度进行解析下这个APP的功能的实现原理。 & a& s8 Q: s5 b" u) A: \3 C- ^
5 k5 R! k! ]. E4 Z$ u
X0 A+ t) o$ x) _ `. B7 Y8 } 9 L- ]' p* {3 |6 P- y5 o
0 @7 H$ |0 i. I5 h6 [- \! s9 c
: O: a4 j6 u2 n1 P0 p) p) {% O 基础信息 . _# i3 D r4 Y! d! a$ s% _
! ]. S; Q1 b! |" I, `+ l0 K* b+ W& @
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 . V3 L2 E7 ~. p- n+ _" O
# G* `0 R. P/ K+ ?7 Y4 \& a4 ?) Z8 [" l. I5 J5 m
8 ^ L$ x* c: h6 n2 w! D5 y
/ H" }2 d$ ~8 c' I, a g& L; r. y
# D- l/ ^: t6 v. n9 s% A
* d3 g2 {5 C/ F* [% ]
" W8 O5 U! X4 u2 c- F$ k4 [ 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
' ^0 z+ [/ H3 e# R" u
" x5 D7 w/ @; Z1 j. ]
1 ], d( s0 t4 [# _' G* f7 ^/ \
1 ~; O+ }+ }. G* | Z, [6 E 7 o& E1 X8 U, T& B
1 K% h+ c% u8 }' F
4 G0 x" g) C/ Z1 X: N; f. ]! B % h8 s9 d5 |) L2 R/ O$ m4 W2 O
2 Z* J. z0 E5 i5 @( e+ r1 z: T; n
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
: Z- J6 v7 @2 z0 o / {; W* c; { {9 y4 k3 G
. _7 W; k) m# ]3 W7 T' t, l& x
( O+ `7 O, q" n* ]( }
M, e/ D c* f9 P' {! t3 W
& e5 L4 K" T a' ^& G, n) ^ + v$ ]: d( l5 o
3 P/ |- h2 ?4 r" N9 F" N, o
: U4 I w& q" E7 h
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
! K. r& t: {8 k. Y/ k# j5 `4 s5 | & M; s+ ^! ]" I3 A! @8 |( P
. J G3 `: L& F( N& @* y) J% w% h5 C: S4 r
( k9 H- ]6 [4 K ! ~' Y8 I% c% |7 l7 J" H
( x) j( c2 l+ E; j0 H
3 z5 d6 f: P: ?7 {4 \+ [+ w : c2 a# A# H: x4 k1 U5 [" j7 V/ b
6 E) M/ ?; B. r$ |# j* k. Z1 y 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 ! Y7 J$ y2 g( G7 M
! e. I- S$ K* G9 f0 P7 o- I& r
7 P9 D+ H, v5 j0 b4 a* \; O
$ \! P' \ D0 X% t& n ( K: Q( m7 g5 ]: t) q
2 A& t7 C9 n1 k& X
, J7 U9 a" m6 V# Y 7 M2 o1 ?7 c" Y* p' j
4 w- x4 ~2 S2 F" ] @2 |
J, g- {4 w) e5 ?
/ D/ R4 b; } b: p: y7 W
6 K% l& k' U9 _5 P 签名信息
q) D* J. W" m" o4 G
+ \% _$ ]4 q% j! }% G. x+ u" @( U) m8 T6 X
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
: I% ^7 X* c. I9 r; S3 @2 g' p( ] , F8 T0 ?; F; x; P! |
# a2 V$ M' S/ S3 x8 J
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 6 [0 T3 G. x5 {; G0 X |
" S; w2 ]% E- @6 U2 J( ?0 w
- v7 U# n: X( ?, `0 } 在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 0 @$ {# `9 A B% I9 l
: q0 q9 Y7 Q9 K* ?" a o! L( z; c5 B w$ E7 F0 J
1 e# ^& Z2 g9 S+ d7 `- \
+ `+ H3 W: D3 ]. }! {5 z: d5 Q3 }5 R: \1 R4 S, j) ~, Q& G
Y: H* B8 f7 n2 G* n
/ o7 ]7 o3 t, ~$ k) D4 Y+ e/ G! V
+ C# j: [+ k( r" X$ B6 d
android签名的数字证书的一般都是采用 X.509的国际标准。 ! v# _. N. U2 W# o- ~& c
; Z$ r' m) Y2 C* V U# w. w
) M- W8 P! v/ k) T) X% ?& l
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
+ J7 S" H/ e1 d5 I) @ 2 A# t' M/ q# P# b5 {8 d
. l# H9 _4 x; s6 m* J
下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
' |+ ?/ [6 V1 c# s% j 9 w4 Z" g! {( c! u
) {! L9 k" L8 c- y6 o7 w' H+ Y
" g" J1 y% i4 V2 Y* i) r4 ~
, L2 b7 C4 B: Y$ ?. j8 a' j. q, w* z; V- U I. Z) r
0 n# Y1 C6 A9 j* m6 O
' R$ Q: n/ B: b: k7 s- O# x! I4 ^: q& r* `. B/ G' y! j+ _
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 0 I3 d* M6 P7 ^" x
; q5 H7 W$ u& h6 e6 U- `4 j& m4 D
0 K- I5 r7 g" ?- o) m! q
4 ?# P; ~8 J- i8 ^$ M 7 d" S8 ]+ N, \& D# g* P+ E
% t* g4 W' ^. u
、 , k. W7 n" I) M D, M5 N
: x% f6 k! I0 o' P$ i
9 x# P) t- g; @' [ ' u C: r' D; e% H, Y5 g+ R
) P a% |4 C+ |5 g1 J5 A# ]' \" B6 G+ f; _/ e
权限信息 1 X8 [2 T( j( C3 e) S) l0 l
$ f+ o( I2 [. T Q+ ~0 h. p
0 c: Q1 `4 h4 w3 x& }& _ 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
6 j: i/ q3 B) |0 ]' E 1 b" H/ ]7 S2 b6 R2 c, m1 L! C
0 r, p/ e8 v7 B5 E' x( x5 m2 Y
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 $ L8 |* V+ e) r
" G/ C; G7 e; ^& k0 m! ?
$ ^* w% A! g0 x J- Y: V2 k) ~% i) v; [% W
# ?- Q/ q" J, q: G0 ?3 N. j
. p% O% M Y2 P " ]/ u7 V5 W# A9 ~: R5 z
7 c- @- }6 z, [% g* X8 ?& [& @# ^/ J$ q1 R0 g8 {4 \0 T! G5 s
下面对这个APP的所有权限进行详解下: : l' i: w* P% j
g, r! G$ E, H: u9 T* @
. Z2 N3 a! P4 b
android.permission.INTERNET :访问网络连接可能产生GPRS流量 ' s! T$ \5 R0 o/ `5 w
' O) g2 k( z; S& ]# e# }" w1 T; G; a" U! L0 M
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
' w4 x n v- z. }1 X
* l* S1 c, p8 e$ T- L, u) P7 y- y' Z$ V& h; m
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
2 a7 V* T0 w, T) Z! b$ L
. g. u! Y6 p* f! C4 o- U" p: F& k. `- O
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 % y) Z/ X# `) n+ n
3 ^+ o z! z7 z
( I$ \7 e$ b1 |7 W5 H2 Q3 C android.permission.WRITE_SMS:允许应用程序写短信内容
/ S, e% w6 m7 g( G. h. L1 T ( C2 C4 Y) L2 V. Q& m) O
7 v! c4 v7 m, t1 { android.permission.READ_SMS:允许应用程序读取短信内容
; Z& k1 q- w7 G" Y6 L
) f* g" k" ~6 K( w, c! ^$ X( V' C4 n* I0 O2 l; s1 y7 M
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
l4 H; p% _( m7 D7 T, z2 { 2 x2 z, h3 m% q8 g8 G( f/ T: I
' ]4 Y$ R- B8 i/ h1 J" r android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
/ N# ?- I' w$ b' W3 ?9 e
# W- G1 p C* h" i7 M( ~0 c) ?* o0 G5 @% k# J$ }0 X3 Z4 t9 U* P
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 * Q- L( c* ^6 v) j$ v# |. ]4 a; F! Q
6 }) N6 S8 Q, j2 ]! ~
# H2 c$ m. E# j' G. I" @! b- J
android.permission.VIBRATE:允许振动
9 p1 g7 ^% b* `3 H5 U1 \' B 9 p8 k: o2 i! `/ n" f
2 e* X. u1 F% |" R' ^& B% f
android.permission.READ_LOGS:允许程序读取系统底层日志
1 B7 c, ^$ p+ |% f, j
. \& A7 u7 U% I0 \ ]
% s; z& v1 |& s7 V5 A android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
( W- Y$ t- B, X+ z6 F
& B5 s* [. T# n" P4 R5 @- _; C
4 L0 P6 D+ T7 T/ f 6 _+ Y% P2 g& V' p) m3 z* P) D6 }
2 A: P4 F4 s0 {* ^: w
' C" b' b2 z# a" A3 ` 功能信息 " s6 z/ { c$ K( x; ?
' O! E; k( m! t' A
& x& K6 M4 N: e: E. x8 x
- D" \( e e) I; y2 u
! P% ~: M1 j5 p; h/ @: l& o
+ v( V0 G* r: }" ]4 P( S 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
0 Q) W) {+ n V1 x 4 t& c( b( l9 e
9 M$ w' z/ E9 q7 l5 D
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
) r1 \' q" ]: Z8 m# y3 V( P% K # L# H' q1 z8 t- L( ^
' P" c) [) }, B: d& i; a% w 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 + g0 }5 R1 |' r% ?& {% K; t% r1 u
7 ^5 H! w5 @( V% Y- i, ?3 V
( v* @# F! u2 i 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 , A. O: X' m/ g
, @$ a. J) @! W/ O3 v1 e
- i. ]5 Z3 W0 P; O
$ u& P0 Z% W) T5 G. z( e
' w8 m# [6 ~$ x' t# _% I
8 m+ Y* j) ^: H% p" o5 E# v : V# x9 S# ^) ?; s) o6 i# R# F+ W
; x4 }6 O% Q% q: v$ M1 ?' V6 F
2 M' Z3 W! z ~, H 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 8 ]( W8 L" S( c1 g/ @
$ y6 W# Y' [" ], A! M% z) K6 ^/ I# G4 ]8 D1 \4 m
& F5 M, F6 w M5 U% g+ p
& F* K6 U; U3 ^. ~1 p
2 ? l7 [ u1 o
5 Q, h& E( p- p [! F
5 k, P$ H2 ~/ r. M! i! K9 `5 K+ k/ Z0 r" J) l- D1 O
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
; c3 ` m @( j# t7 Z8 N: n* B
, z, ^8 w0 j4 u$ W$ f! z" |# l
- [7 T2 F6 D- m) {- k
" b/ N0 m( l( u5 e4 Y 1 v$ B# b# R' D2 P* F4 b2 I/ b
( ~2 P M" ~9 v* o3 a6 P/ Q 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
. d6 ?* {" \) Z# W$ I+ K2 S% e) W" n
3 c! T: T# i1 r$ m6 ^3 ?7 b* |9 P5 O G9 Y7 F
" J6 E! a" b0 w5 E6 y1 L! k% ~
; e; K8 w- S4 I5 i0 g H% D/ L5 D* Q. a2 D* P" Y
/ Y& }5 I7 Y4 z* |" }$ a& W
3 K2 y! t8 h9 Q8 o! b
$ L- w; U, Q- t7 G 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
4 a( `' i1 X3 Z9 A5 C9 S6 i4 h" C . c6 p. @" t( w
4 b2 ]0 H9 T0 K3 K; @3 r+ s LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
3 M+ a2 E2 s; I& m4 | s8 H, i
9 @" o! P2 L: [% ^- d( g8 P
9 v$ R) b* j+ j/ V 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 6 z! \& U9 {# j( \+ b# `, v8 I
# y7 n* e8 ?$ |: \$ `# N K4 c6 a& o- F1 R) G
开源的luasocket代码可以参考学习下
0 X' s4 j' b9 l) \9 D% F
( |, [3 a) U( }* m' s! @4 ~& h4 @% q2 o$ Z" `0 L
https://github.com/lunarmodules/luasocket
3 K! B1 s' p3 q6 f2 D8 i, }! j+ X U* U . y, g& a! ~0 ^# v' E5 W. o' O6 w$ z) B
! C: Q$ X+ a: Q5 e3 H
https://github.com/fengye/luasocket % C5 [8 q* B8 _
2 t) ~, z4 u& w9 p5 x; y- S P; j% Q- [, t4 C+ Q2 s( a. o
! @8 g; }6 O. N8 O
}: d6 c: g9 Y& B
/ S7 {* x2 C; D7 c0 d R" o 5 L! ?. p- ?: r$ q
# H/ K3 ~7 ~ P
0 I9 q$ d) n* j* Y1 S" v 2 P; |% T9 W& E1 H
B% Y* ^" g+ Z$ T/ L' e' A! u. e) ^+ I* ~5 g' I
3 x2 {1 [7 |6 Y$ Z
1 s, j* S! i! j1 g' o8 w% o2 R* E8 z; C7 g& J5 h# K A
总结
3 X" a! a- p; L5 h s
3 _( b/ G0 z" h4 A$ t b6 S Z. I. G+ E0 Y. }/ u9 F' z0 d
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 6 Y1 _2 @! ^( q+ J* i/ l
d6 L1 W2 G( {2 W) Q
5 ?2 [- m2 p* [& }- N* S* ^
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 / ^1 }5 {3 ~/ ^/ ]4 t
( v: \$ r/ }8 [0 _2 n6 M
! Q& L* }( J* }, h 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 ; z9 ^9 T# m2 ~1 ], p. a/ w& K) {8 y
i0 I' m% ~2 C' b( R" G
' Q5 x* D2 v/ k( j' {8 @ 结束
0 p6 |" R" h' J; Y 3 R: K) @( Q0 U( `. \
5 @3 U( _; ]- g' e. [/ } 【推荐阅读】
6 T! K" Q* }9 [5 X3 N9 r
! e4 k0 g& Y" X# ]0 r$ B3 m6 ~ g# j0 Z/ P C
对吃鸡APP的分析
0 ?% H5 p1 W K1 o9 d; H5 r ) ~& Z1 u: e" r5 Y
- J$ A" i9 x1 ?( M q; i
你需要了解的APP安全 ) ^* B6 r1 B @# r. G* O
/ A. n1 R( A8 u4 R' u C
4 P) |2 D- W4 ]$ ^* M 你需要了解的APP安全 1 ]+ g# v) j+ [$ @4 F; B
1 i# q: t, O/ K; M2 s( l3 ^
" B6 P" k! g5 a4 p" v V8 {
8 R8 f* k* j- w' Y
|