5 q- R& ?/ @/ q$ W 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
- s' E C+ W; R9 T% n
" ?% M! \1 t# { Q$ q' H5 G& G9 }2 ~, e; { `9 Q) ~0 z
0 m& R$ J! r' {4 K: w 5 @8 y6 o- w F
. X7 M5 q( h, W
9 `- f2 @, Y9 w # V5 }; S8 d! g) H
' d' J% a3 Y8 ~2 \% I
下面就以开发者角度进行解析下这个APP的功能的实现原理。
* f: A7 w# c7 X/ m! d7 i+ ~
' j% V# n4 J& t0 M( H( {: }6 N" J5 g+ l* X% h+ p
) u0 u K, F6 M Q- V4 s. v) E# ? " o$ q0 j, y/ \5 t S9 n
1 s9 o) K/ G: c+ U
基础信息
, Y3 K" E5 S( U9 r1 l% w1 Z" B* C
8 c' E1 c( @" H& p( B5 P. t/ M
" h$ s5 Y; f7 ^ 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 6 d6 W- A0 e+ r, l1 B
: C) h5 P% F% R+ K4 ?
6 w2 c; o7 Z8 I3 M( v " ?9 w& k4 X" R( E2 g" e) z! @4 t
9 J9 s' R3 P, G z' a1 P
4 G, V" j3 u$ y' c% }! Y7 Y
+ F+ ~- x7 j# e$ K0 E
' Q; O/ @2 n* H# ?9 q* s/ q! f) M$ z4 D, _: B
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 * v: X4 \" s- }1 l, U
1 m0 t! S& D* @& F
5 J1 S! S* i2 o8 [5 ]1 s
( f) _* d6 O8 h4 A- S
9 ] K' X0 T! p0 Q. [* z9 {: x5 {& b6 P8 {% g
+ } c: s$ m+ K, b
m& w9 X& \0 Y( }; G0 n) {
5 r+ v" }3 I, y) H/ w( G
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 t( \9 h( {$ P
U {2 q; w. C( v* s; s* J& P& ]% S! q
4 X q& e5 H7 W; u" ?- C+ t8 g0 z: H
# f2 b7 a A& U' k; e: z- ~
4 |% w7 \$ T# S8 @5 Y! `& E9 S& e. c5 I4 }$ E+ c; D. I, B( A' C+ H7 G
9 S3 ~& ^. X1 S8 @% O% f
( L' {' a9 w4 C% c- N! y" u
8 G4 y4 p$ f/ i9 l$ S4 L
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 # O( y& h1 \! w2 A, A/ p- W
: Z- X# [- u4 m; [
% q3 x$ C) U" d1 b G! S$ ?
' j4 R6 j: S3 C1 E
# S7 ^! s- \5 b9 K/ r
4 H; w7 B, f2 E* t ! T. [" y) M- [/ z: h, q* k$ l! j
. q& e4 u& Z' D& e/ N
& p# P4 B) s1 g% J
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 ! w. |6 o* }# b. c2 U
9 e1 R, E6 a. }
( O8 U* z2 H2 Q1 k% Q
' |$ O, D* q* z6 P3 _2 t
1 x9 l/ w/ w& ^
; z( I# s3 v. M9 p& o
# B; c1 G0 G* o
& \" \8 c# J* F3 |" A/ t* _; g9 ^& ?9 F# }
8 K+ n Q# Q/ x7 D8 {& N9 l( s
0 q. o+ P5 t5 i) ~# P. g7 v0 X, z! x( G0 C
签名信息 r Q8 k; }& h$ R5 }
, O# u! M8 H9 W6 j" Q
$ F2 n& r- U/ D7 j( s 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
+ z3 L, W# Y& H2 y3 `
8 B' Q+ V- |1 Q. l+ b) D6 S( u+ Q4 s* {* r
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
( x+ o4 {2 ?) r& C+ N- X 3 T' y4 a# z& L, v; y: @/ n7 E
' L/ w3 _ |5 P& g
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 ( P6 X$ H, ]+ A* H8 K+ K1 Z
9 z+ d+ M% P9 i+ b3 E& ~# ^" s9 j* b3 T2 G/ ^3 i
' v' u. z0 j. D! T' i2 l' B
4 Z4 W4 u/ v/ v$ o9 ]+ c& T" e* e( J/ A8 R- j; Y$ D5 V/ y. i: [
2 k8 A& _% O; |
8 [7 M3 I$ M0 [& j' _% o/ U A/ a( ?% f* d' b; w$ ~; D" i
android签名的数字证书的一般都是采用 X.509的国际标准。 & L% _/ y$ ~4 R/ H/ z0 @4 k" B
7 I$ A0 p: b! v# o: e4 `8 ?
$ y4 l! e+ H9 ]6 p! L7 U! g 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
: W1 H/ `5 f: E O# K ! F$ K0 F0 s) ~+ t
, F' h2 C* o" ]6 S 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 ; C% D d/ y, e0 N* U* }: f% h
( G% s* y$ X( U* s1 X, z5 U2 H z( g( `! G: r+ ?! T. @! X' f
7 r- |! F6 i( G% y( R
1 @/ d! D9 y7 ^* } T, V/ D: L: ~. n& t" H B1 N: F3 T
2 B [. \5 U! O) Q0 o1 P) Y8 E+ Y 0 K7 s/ T& R, ~; q3 u+ i, ^
I, |9 g; w8 ~* S. x0 z# Y( I" M$ y
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
6 K* k* \4 f4 } ' m g) a* U7 F8 Y
+ a! V: ^: g' [ 0 {7 R2 O4 |& a4 h( U4 j7 d8 O, P6 A
, j4 Q2 u7 @+ V1 R
u: [# G( x# U) ]2 D k' R 、
. l# M0 p4 t8 t* N4 g; r7 D 8 l% p( l5 X' z3 b- L# [
5 X5 O. C. h, C ) p0 p7 ]' J o. N3 n
' U$ u( K Z8 ?+ G
% v; ~. {* V3 V' O2 G 权限信息
% n+ D1 V; \3 v8 s
1 D, c, y6 s* c9 {0 K" k5 ?1 J9 |$ W' o8 c
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
8 Z/ M2 u1 T j8 X8 p8 K
* [& e( I: t6 n/ s. v9 H: d, v" b5 N6 M; o, h
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
6 v0 S- V `8 U, x
7 W6 k5 e' ]: D' q' c1 I
g, W5 w$ `6 m2 ?7 R3 r! N 8 a _; J; a5 A) `: k( q2 Y
5 @1 R# ]1 b& S& e4 R
# m. H+ h( ~9 ]* Q
' |- F; J3 k- s. w/ X
3 R6 U! |! T# h8 ~# D' H( {
) l) k* o( Z# p5 A% O I$ c) ? 下面对这个APP的所有权限进行详解下: m# s4 l& ~" p/ Q8 Q* k: v# A
* I" U1 G7 _1 _* s3 \$ q* Q
! n% C) U: p$ N3 M5 A( S! c _' P
android.permission.INTERNET :访问网络连接可能产生GPRS流量 ) D! W" [8 [7 A$ H/ y
2 x% d" W) L b
. b% P9 J9 K1 D( s* V
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
- F0 k- u+ l `. H 2 i8 B l# t1 ^1 ]8 G. \1 Q
0 J! G9 _8 G5 D- {4 F8 }6 l
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 % i% I( Y7 ?# w* h8 w" ?7 o
4 G) l& R' n5 A5 \- R* g. _& P8 f; {( A! s
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
( @8 x3 f1 j& D* ~! U" r3 ?
/ Z* l4 `+ q3 z$ y6 Q% q0 J. I _/ A, }
android.permission.WRITE_SMS:允许应用程序写短信内容 ( m/ Q' M" I- y
! a8 m( W4 R/ \; n
4 S/ W2 f! W5 K: b android.permission.READ_SMS:允许应用程序读取短信内容 , `# c" B4 Q4 ~# C/ k
* S Y) m4 Y; k+ v; x1 i: t: j. B
: S- o+ N2 j& h* c android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
( p1 k) m5 h7 Y/ W0 f& E* o ; w9 h u/ }7 z3 f" k1 k6 @
|4 L' V3 y: |0 I/ Z4 a( d, u% J
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 . O7 S" Y* L' A0 n Y
: e' p6 H3 `% }* y' O
, ^# a5 W2 x% w' x- I! K6 h
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
' ]( w0 m8 @& L* c9 r% h% N - M0 D8 `# b+ f, z
3 B8 _- P/ X3 \. c' n$ j android.permission.VIBRATE:允许振动 ) ~1 d+ H6 C0 B+ s
/ l! I1 T8 ~& I, Z, F
% `4 o* E9 S# a android.permission.READ_LOGS:允许程序读取系统底层日志
) Q/ P3 ~/ u: k
8 U; L8 `) H6 i5 A/ w s5 t2 N. X/ s/ D/ L9 K4 C
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
6 S( P# `( r3 A# _6 z
! v1 E b1 J. G2 R' C: N# y/ U; p+ D* A/ J. d
# H" e X4 j8 E( D
+ \8 M+ K1 a+ }) u% r
5 I; b1 V# L, B; N. N, C
功能信息
6 t, j! L s: Z5 X- R
, L& y0 t& M8 Y* |7 [5 y" ]$ B, ?" ~5 T8 g2 @- N h( V. M5 a
6 R. k, T7 |$ w }( W/ W' Q: ` 0 G0 Y* A m$ [' u, M* R. F
( r5 D1 y9 c2 S }" y/ y7 ~9 p
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
9 y2 A) W8 ?1 s% ~% }
- s" P0 |: [( G7 ~8 m# e( i) K4 L6 ]1 E: s! P0 P
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
' L0 r4 J& E9 M' e9 f2 N) v . F3 F& E8 @- t: ^* c
* {5 ]: c" e0 {( @% n- O9 f, B 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
: v3 C) k- u* c3 w+ o
# b; @2 O, o" W9 I5 ^" e# _
- ~: Q# k4 ?& ]& P, O/ d 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
0 U0 P$ [* D6 [7 c, X6 L
g& W) m8 y9 O
4 y8 N, ?/ I8 ]3 \' r
U) T8 X5 C5 }0 K
" R, j9 n" h% D; G
7 x* |6 K9 C3 R. o# T- r% x; q 6 g, X1 Y+ |0 u
( O {/ L' a) a d+ L, J
2 c; {5 l' I" E+ L/ o$ ` 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 5 d6 E- z# V5 G; ^
2 K( W! T4 T6 f0 D7 B. j( v" K# o
9 V4 i7 a/ a& k# C& t
' P) {6 ^7 }; I$ p$ k
) A9 N& Q6 i# G# A) b
, G7 `3 F1 D* s' {
5 w! e& a) p0 r. [ k$ L& P9 a 0 N) O) D. Y+ @+ h* g6 Z! _
, L ?! P# E( F3 f& _
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
) N% f; a9 P$ T% p& H+ S( Y
+ B' e# {$ [, v$ B) l5 @7 K0 A- p( d7 c, H |! S/ i4 e o' F
* s2 |2 C( n' Y
" {) N0 a2 I7 P, U* K
) [( p& |8 j9 f# S# d! ] 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
1 `. m+ l+ x/ R* u- x6 `+ H 9 w O6 q) z T& `. R9 p
5 B) L* q& U0 _* K3 L0 N
# {( L. K) V E; M5 i" N/ |, q
! n8 `& Y; R7 L: k
4 ~( ]" m0 N5 E- D6 m1 Q / E' f* |, I/ O! z4 c
8 H; h4 g4 ]# z$ c$ |! F7 {0 s( m3 Z, \5 x7 g9 M1 Y# B
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 , N2 ?, l/ u& g; o7 f- Q
: l C4 q/ d) r" m8 v) q+ b) H; w( p. E1 Q- Z9 U8 R
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 ( c9 j. E6 q% c% V0 m
2 k, f! K( F) V% i& a' p9 [, |3 v5 C0 U% M2 V
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 0 @6 {0 d& r' r# Y
5 P! \, z* K8 h
4 G. ^3 w% c. s" i1 F" f; y 开源的luasocket代码可以参考学习下 - S7 i2 Y$ i; r8 @8 n
: D8 u! F1 ?. S
5 W' V- { A; P
https://github.com/lunarmodules/luasocket 3 n; _" D* z# ?/ l) e
! p/ v2 j1 Y6 o: }6 ?- P% O8 }2 v! [# z: R
https://github.com/fengye/luasocket 5 D& E9 @/ h/ O- _/ `. c6 Y( k
5 \. U0 D: d' F) l( B+ U2 z, b
& d ]. m0 [6 d8 Y1 |! P3 Z
; w+ \0 B: q4 g0 A- J+ X
( Z6 F# G8 P7 `7 u) d7 U$ v
! i& S( x' g2 K9 h: i( x, z) D
( M1 ~# A' p8 j3 E' o1 I& M
5 u7 W- b4 C6 A) B' v
" K' v0 o: E7 S( |6 d! Y 8 I( j7 e" i2 ]% X9 o5 D. i) L
: F0 i5 q8 {# J% @' l( _; T
' f: H, U1 j$ }- [ , y$ Z& y9 N* _5 m9 w e6 W z
! h) D+ V* o1 d( N7 b
总结
+ m6 c/ O, t$ e1 z & z" w/ F" b1 }2 E( G8 O1 ^
! m5 T. s% H9 U( G" n+ y5 |+ y 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 8 \4 a% ?5 e5 W
& n$ F) }+ ?8 s3 |; D
$ V$ i7 z2 R1 P9 o% m; z% r
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
; i# p+ e: O/ n. J3 a9 l- ^
3 L0 A- y& `* ]7 |; _* A" z
! |$ v6 {+ e0 d 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 9 {0 Z& s0 D: J' F F. j( m7 S8 ^! p# g
) j# z. d) z- n' ~4 g1 P
; Y+ Q! z9 L; d$ a7 ^5 F
结束 ) l+ K0 w9 \2 E
$ u3 O/ L8 _) ~4 \7 j8 b& |7 l
3 k$ R U, k' ~
【推荐阅读】 ( `3 V e2 C4 c, K- {$ K, j( o
# b( x% V: y8 @, e) M! j
( z8 A* Q/ p; @' r$ ]) D 对吃鸡APP的分析 1 D( N$ _; f- U5 S3 D
3 ^( N' z$ W2 Y0 r
9 R) u w5 |4 F, W 你需要了解的APP安全
# ^) Y/ q+ k( M+ \& F : L1 v& ?6 s& W' l' e
% ^5 t1 c8 g. O! k u 你需要了解的APP安全
, e3 e! ~3 D6 W
- l+ W$ X; g* } @. H- u# K6 X
M0 l ~$ F2 C5 c6 \ 1 o. L4 B# M7 D S; _; q1 }( D/ Q0 h
|