|
! g# z1 L( e2 l: J$ R5 G 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
N: h# ?3 |8 F* d" s- t
3 K: R- {5 Y" O( x# ~- H- i
0 ] D, G5 N7 A% z. `
0 v8 g+ x" S+ w" l
: F* \. ~- k, h6 c! X5 ]) b
6 I! `; |) e; \0 R* W
: A, |0 q" b; u; b1 { ; N! k# J0 x/ n1 N
. w$ f0 g3 J/ ?9 U( U 下面就以开发者角度进行解析下这个APP的功能的实现原理。
7 x* R' m4 F2 ?& M
, v- X% n& m! w# Y
5 g2 c: ]1 W0 ?& d# K V6 e# T
1 T5 I6 r$ V1 | 2 J( J* e% \) U9 N [5 S
$ _# D) k7 f* u2 g) k
基础信息
9 Z' N8 N/ G2 O$ b i: y, I% e. z
9 H' I' _9 x- B
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 ' O X" _& |6 j& F
! Y V- z2 N" b1 p4 G' O# G
/ a7 g z9 g8 P* _6 y+ Q
( R$ T9 r0 X0 |7 M
( t8 z+ t" ?1 q7 p
% |" q$ i& W7 t0 H
- Z8 n$ p, o2 n4 w4 I / m, L8 i7 s( l# [# Y
( K) R* \$ n; j% W# J6 b
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
, o$ E9 l, h. C1 V$ ^, J( m4 N 4 Q6 u1 C6 D5 t
7 k; Y Q/ Z& A( c! j' a, u
7 g! w P4 V% l, d
' d, |- x- P+ n: Q4 Q
, `$ J, T4 y+ V
( P% O( Q |( O 2 w" X% f2 C8 D2 w
( k: T9 A8 G- B, y2 i- ?6 \1 e
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
# P$ R$ P; L$ B9 x0 V/ R% a # t- U0 m" b' F8 H; u9 E+ Y L
" L3 }; @# L% f, Q
+ I! H5 T, t2 U' `+ X
& f; i. l3 |0 f/ X8 [' M& ^
: X* ~; S8 @% T( u; N
7 [& h8 Q" T, u' W5 L
; t9 P0 S6 d- e, K
a, N) y% p9 M1 ?( }4 u
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 9 I* ^7 Q7 J" | N# |; p8 S+ X
: _4 f- L3 _: Q1 u0 {& h8 _
" n0 c, b/ a' i. P 0 p8 \( c1 ~+ y$ }' I
% {+ Z' z- x# y# Q
: T. D, M3 Z5 ~
# T0 C. [; V4 X( c 1 F# Q: `3 Y* p
- P/ _$ f M ?; L7 I
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 - a3 m7 u# n0 A
6 n! e) w9 b2 `5 K5 X3 @! b. N+ J6 s* _* V* z6 a. x
, L6 a! w# D$ E7 k& r' U
. O4 K* v( [; y ]
5 h/ z( ]' J. }$ p0 z: u
/ R, i. u0 k6 K) V
) V, {/ ~7 ]4 W* k9 p6 B
. Y, Y2 g# D/ P" s( r3 R# x+ Q
3 G+ N; V" C5 ~' X B2 C# V+ j" {
: a& P$ w8 q! c! ?# L+ q! S
/ @$ m' t f4 T5 u1 v3 ?+ I 签名信息 5 {6 n; m {1 p, B
+ O! l. D" ~0 F0 e' q3 @% L1 S
& [6 ~' D* G; {" G' s. I 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 + ^$ d3 s! a3 g" o% P/ z
" ?2 ?, v) o1 j' b( p# ?7 J( D% C8 s+ s T
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 2 O( g8 T" J( I, h" i
7 X1 N& g6 c+ ~4 @2 D7 U- j
' w- z2 A! Z. W 在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。
* \' l" V, S; w; x0 @( V3 V 2 |9 N5 i- L5 p9 z
/ Q( [% T# h4 k4 @
/ U) ?/ h1 w3 }" L1 j, }
9 [0 {, Y N* }) B+ @* _0 c
4 Y+ k: F ^# E: w( J1 F
* ~) |+ j" R$ _; E- F% i
+ t6 w4 n; m" J+ k' n% d" [6 v V1 N3 g6 e8 `+ B' T) U: @
android签名的数字证书的一般都是采用 X.509的国际标准。 0 B7 Y$ y3 U" X
8 V, Z: w& [+ E3 A, r: J& Y5 p& D$ e1 h/ D' [4 S6 b- X$ J
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 8 X9 G$ n! Q, T: ^8 r: `2 a, Z
! R$ }3 c1 c: w# W9 r
8 `/ W: ~- Y9 t' D4 X* r
下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 0 J, t; }( O# @( C1 \& n8 ~9 ]
4 c, a7 _* O; g( N; k6 w
, l# \1 N' K3 J8 @) P1 b
1 u& @8 W, E% ?; @% ]* J; v% ^ * ~! E+ P; I* x# \/ l
7 e4 a0 k8 |5 a0 Z
3 \/ ]) Q, o. ]) ?4 i 7 `+ y5 F l# i0 p
9 t; v( T% O1 i2 X h0 G$ A+ x P 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
6 F, J; H, q- j" W% n! Q' z* a 7 u% u& M6 C- @& I d4 h" L
' I: ]# D! {: ^# H# w
- @' W+ J' L! r: ]( a
1 f8 \! A& X/ X8 e2 H6 c3 Z" Z8 U E# K% t( l9 G) L4 ]
、 6 ^/ Q5 C; q! Z# q+ b! x
/ {8 S; c7 e3 u, @( d5 O' i$ E0 I
+ {) a( X0 {, X: P
. t( L0 ~4 \$ l% a5 h5 T
- c% N; ^2 l" Q, b5 o- [6 \. w1 G; S9 v4 g, ?3 j V! b2 A
权限信息 7 C, s7 ~! _9 c' J" j
5 ~/ S2 O$ K$ `1 d$ q+ x
9 B$ a% |' H9 e
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
& u* X* g' v( H4 [+ f& q' C8 c $ D0 [; b1 g) p* y$ K
: o" ^' L5 g5 f& V' q
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
4 s- p; P5 p4 W' H( |9 U0 F 6 o( L; O/ k' `* J2 H$ N, J
4 R; r, N2 y5 U6 _7 e3 b
, a+ T" I |2 G3 _: H" R% u* k( C
/ F6 V( E/ w0 K& N" E+ S( P4 k
1 R+ D- C x K& J& ^" S + C5 N. t* Z7 Q6 F3 u
) f3 J8 ?# l3 q. t) ? X$ w1 R: M: @2 M ^" w9 e
下面对这个APP的所有权限进行详解下:
' E" w$ d2 w( E( Y
% G# v& }- C; \5 T' P
9 h3 {- h3 ` B# `5 r* L! h# q android.permission.INTERNET :访问网络连接可能产生GPRS流量
3 ]: D- e. @- ` & e. v V3 P7 B0 C2 X
7 k# A. N" J6 a6 w# @4 `% { android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
) o# I: y9 S R7 ]/ ^' H1 } $ s# ?6 F; Q0 u3 w4 V
9 M6 i* G% M! d& T! R4 D
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 ! ^6 I) `' X/ e& E
5 f( ?' u& ~7 p) ^1 r
/ C F0 y2 Q+ Y* Y5 k% P android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 / J8 j2 m8 V* @( u( `$ u
3 X1 `' `; L* L% i$ x6 M' c
( t6 ?6 Z$ v& x! L* f3 v android.permission.WRITE_SMS:允许应用程序写短信内容
. ^8 D, v* ]' {' {! p/ i% z P2 x! P
4 m# J3 @4 w- M; B( ~
8 P# L* `7 {# q3 P$ D! J android.permission.READ_SMS:允许应用程序读取短信内容 ) w W* ~9 M4 m! K, V( r
/ `! s# X4 x6 ~8 t6 q2 m3 p2 j% [4 F9 V7 Y2 j' l
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 * M* y$ ?: s. R; N' l4 J
% O3 p7 B/ u" Y4 C3 j2 R
" H) x2 u4 A1 B! `, f
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
+ c3 w( _# P% ^8 D2 p) p {$ \
0 V X' b5 f" S% ]5 |- q( {. K+ S; {) }9 |- t' I% h1 q
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 , W' n* h' Z. b, b& v; ^& T; D
6 a0 n N/ X7 e. O: \/ p: I
3 U0 n" r2 q$ L1 [
android.permission.VIBRATE:允许振动 # `0 u9 W; e# Z- @) C+ D7 F- |0 f
+ v# L, e2 t' e, o0 v$ R& Y2 T3 ?; e) r$ O' `% ~8 U( _8 e" j
android.permission.READ_LOGS:允许程序读取系统底层日志
% Z: d6 M! d- g9 c8 P" C z ; c8 J4 F, x% v* o# g2 V3 T
* m- J! @1 d& p: _! ?2 G android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 * x) T8 `+ D% Y4 J. g9 A
! G( v# e( [7 E8 j& B
: ~* o' Z5 d5 B2 S5 B6 n: F) P* S# D 0 [- P# G8 v# M% E% r
) }7 @- j+ u1 k3 N2 m; N1 Q
* p1 u- ]2 V: S6 S! R# A4 R; }
功能信息
/ A* v* h! X B; Q% O8 T / T' Y& R, [+ M }' J$ w) D
' N9 i$ `5 Q* t- a# i- T
' A( n! J7 S' e& l' \, k7 j - t4 z9 @ |$ c2 f( j" F2 m( U8 U
x7 k$ A3 T; |/ K+ I: A- ~2 H
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 $ F3 j) D: X* b$ m
( s; F7 F# a6 ` h0 ?* ~8 b7 b: s
! b! P+ Q' O! B) T y$ o% H) t Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
; |; J# J& g" w1 I, A' ^* s l
$ h/ o1 _* m4 U$ q! f0 m9 m* ] b, c: A9 F* y7 j
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
6 o& }5 _3 E; z* w2 G( F
- j- p% T* l( j1 B
) w6 A5 h' B, Y1 _% @; C 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
& P* k% z5 L2 K, L* S" ~( z 8 l& J& w+ b; R9 Z% x
7 b2 T7 x1 W4 b7 w- i% ^0 i$ a
# r" D' B3 H- j- K) C/ z
% O6 T# Q+ `6 V A/ \
2 R9 _" [9 D% _0 ~% }; O 0 l' U5 }3 H1 J
4 ]3 M; {1 H$ K
" H8 p4 L- x5 L z6 Y) V# S) e 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
4 ]( b% k2 v/ j# u8 g
) \5 [+ W- f3 w! F! v4 `9 {+ |5 M! _; t# I' a+ u
& G% f1 b' \6 k* n& a: s * D/ B- p# J0 h/ X7 F* g9 D* Y5 \3 X
% j6 g2 _# ?; f
0 h5 |* O' F) V1 ]' t
/ i, W% a6 I$ S) @
/ v, N+ r; d( n4 x
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 5 o: k6 W- ]( [6 {7 V* o3 |' A' q" q
H8 `. |* I9 ~) C
( s |) U7 g7 c, S! X
$ u7 M! z) |$ }* b7 y2 p 6 ~- x. z7 } f- m0 F
8 j9 K; s& e8 p; d2 _4 B 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 $ e$ X1 D E. B* K& ?# @
8 A9 Z0 _2 o3 y/ n
% U6 ]+ ^& f5 D* ^9 g ' i, _/ M4 J) j: z3 N m
+ u4 ^4 C J5 O% |& F0 B
% x7 k5 a4 c0 D. _
1 y, z9 e5 `8 F4 z! R% u0 p, p; a5 G # T' P" `; x7 U% a
3 [, f' o s9 A7 j( \% l 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 / r1 l( \! G8 K. n- l+ W
; D$ l! K$ `* o$ R. `/ Q- O8 {
4 J7 E0 B6 Q' v* b6 V LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
" Z' P; ~8 I+ w2 \ |# g
$ f' k6 h7 o: w2 l# a1 A% c5 L0 u- H' c5 y8 T
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 ) I6 @/ q' ~% l. w/ b8 Q
2 u4 n) g6 U# u; B/ E* p& i, C( `7 a, R L+ o
开源的luasocket代码可以参考学习下
6 u X/ Z0 n& B0 [ A; \ N: }0 Z. x- N8 K& F( F9 L& H8 r
6 T( ^% D7 r$ J
https://github.com/lunarmodules/luasocket
2 `5 u9 L/ Q& s9 W) n
# `" S; c2 Z) a5 Z' g8 [# W. h( W& N0 L
https://github.com/fengye/luasocket 0 ^' E: ?+ V: B
. f9 ~7 t+ ~* S9 _5 P/ L5 b
" |# Q {/ i) E- w, C) D& F+ U$ ^
5 Q/ ^$ P2 r+ n
/ _& g) m/ M% c7 t6 L- [2 o Y, e; K; q% {' q
# u0 Y: g4 y) ]$ ^9 u" g' k
8 w: \$ f! Y. i/ L, c. |5 B! G6 m) G
1 R' c' M; ~' B- U
: S7 {7 l( t! h4 D- C$ f
) \* ^8 p, l/ |& N# G/ Z8 M* Z! r- Z
9 G, Z* d% i2 n8 ~$ j " e& f% K0 u0 `& t* Q3 V
& j! z" a3 O* V: l* Q
总结 * i1 _8 x# a: C6 Z% m: o
! k9 U8 y5 \0 ~& ~" w8 j4 G. C$ a$ Z% M6 e$ E
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
( m+ ?+ Y% S- m1 [
8 y/ f9 }. d6 d( ~3 q; r% Y: E* [! f% B3 x. R0 ]
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 ; L* Z- b' G Y8 J X' C
0 T# n+ s V% \
' U; u4 g m6 d6 l 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。
, [) q% P" e- e
2 F) k* u9 @! ^2 b! D
) `4 {& ^0 I7 F; f: h: C& j! _ 结束 : g) G+ {0 q+ M: h t
- Z& d/ w2 p8 h# o% e" o
, f+ l$ m- x5 T
【推荐阅读】 9 |. v! C; z7 E( H3 C3 n+ G% l$ G3 f9 i
& V/ f; ]) c. t, ~7 G/ ]
X( E( v% ~7 ?9 u
对吃鸡APP的分析 5 B3 O l: H' @ X! k
2 R4 d/ D: q& a# @( T( C0 Z
! K$ ~ f2 L1 o$ z3 r' N4 [3 I 你需要了解的APP安全 . t. d u- C4 C9 H6 }, M. ^
2 ^7 c$ B1 k5 _; ^+ ?
b, H; N! [" R& J 你需要了解的APP安全
" s, N( Q E) d& F1 A( M2 P2 U8 S1 H ! c. N4 g. V3 w; Y, I
+ i% a4 x% `/ c, z' |; d
r4 u6 w, }. S t& ^ |