8 H k& H0 ?* J3 x) ~ 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
: ~. @1 S6 z5 L2 P2 l; H9 ?) [
2 E4 f! b$ J8 J- m6 ?% {4 Y& Y/ p5 t+ m6 i1 L; n# P) s0 X8 L6 x
y5 q# w+ A$ e& g
' X2 E' O) F* l% {/ T' _5 Q
8 D. k! _6 g" h, b( _ 8 J7 y a1 A7 X7 S4 O1 u
R; H; o; d1 G: k
& p5 D. h' v2 A. e* l8 S3 }- d 下面就以开发者角度进行解析下这个APP的功能的实现原理。
( a3 }( w, `* {0 z* f- A
6 W4 P0 F/ g; U. o$ u. x% h1 y& }6 r3 L7 J# B9 \- X
) Q. e0 l x* [" e- d1 j. Z9 L/ e0 ]
/ `: y2 {3 T6 R( w* s* z$ o* c
' [3 f3 H* m i0 Z" p' N+ {; }9 s% _ 基础信息
1 K- U: B" N3 |+ V. ?
# b+ r6 u' v7 i; H" Q. S
7 b; w( l h2 B! d 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
, V1 z2 {9 W9 `" Z& F) [+ e 1 o" B" e9 M6 g F
, v0 J4 r$ e* a
& E3 Y6 H' P% v# V0 [0 S- y 5 e$ o8 d' ^1 T% W; v& o) a
- Y1 [: S" _# [; {6 ^. A5 Y8 z% o
6 r$ Q" f+ y4 K( H: v- n 9 u j8 W$ S$ C% p" A) P( ] U0 a# R
4 b# I( M A9 w3 R; j
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 5 w, O1 L: q3 v3 W; S }3 S6 a
+ H# V4 V8 z( `. X$ I8 f
9 c- w) R2 A+ q1 \/ H+ _ * f) k" I3 M" ?/ K ~1 Q! z4 t
8 D$ [% d( w$ [% I
2 X' m" ~ z8 b2 q1 t9 v/ Z0 R
. o* Y% F0 g7 A3 s 4 P f& F0 ], L% e+ y) ]+ E
2 H% Z2 `" L* Y5 H
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 2 ?( a+ `3 e, [; g: G9 z0 H9 B2 L
3 D0 }" J* A: j$ m9 {! P2 c
1 w" p) U' d4 P& j * ]' n5 F! V$ N1 u" Y" m( X, o" i
8 O* {; v0 Z* _& }0 S& e* a
9 S' N7 f: m, ^5 ~( W3 m( |
: q" k o+ U8 D2 X4 B. P5 Q1 b5 \
( a% [6 v" O" {4 t# ?) x7 _2 q
! a3 I& _% w. @& ^1 H( f+ s 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
- T# A5 T. s, M* X* C 8 A, D, o* V! ]; I3 ~
3 |1 n' J! [$ S5 E! q4 v9 |
; d3 u- V' c( E6 R ' j* X ^5 k" }& l' B0 g
/ B5 I( { R; `( W0 u
9 Z; W( {/ c8 L " [2 J# A# _) c9 r+ K0 r2 J" j: B3 E$ U
0 ?' v5 ^/ }: i
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
+ s T$ G1 S) n; `2 s# m
: j3 h( Y) e2 J) k7 i7 u6 P6 ]" C
5 ^! w) }0 |6 U1 G: D5 Q5 \; f% s7 ]
) q4 T7 d8 E! |) J 0 T) K2 s7 z6 q
5 Y' G& v* K* q# t- [
- V' ]/ ]9 o. m& d
N' F* ~" [7 j+ m! X* C( }/ N. C; W8 {6 [% J0 j3 s# _
/ S0 ^5 G7 S2 [ ) y1 F3 _& h8 Z+ \3 I
5 S. e7 Y% _/ T( U m4 E" x9 t2 u 签名信息 0 O! P/ |6 P7 H9 j. A. N) P! ^
* C; [/ E4 Y, g4 @% R% N, [4 ]- p+ V
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 $ z* ]9 B' v# A( ]$ }, m( k
. D3 Z! E( I9 L/ m3 w& _$ X: _: q5 B
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 ( R6 l8 \* @& y5 D! S) g4 _
+ B% R9 \6 w: ^6 ]6 ?* t: X
9 V; Y$ r: W" Y3 r 在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。
% M2 P! [! G7 L/ j2 N # Q( V7 z, e x9 s. r
7 c8 c! i, t9 J' ]* C! b
! }! F; V4 N5 i$ i) g $ p5 w) Z/ N. F, r1 h
: t L. W" J9 z+ e
; H: Y# c, B6 r. M: P 1 i5 B' p- a- x2 ]2 i
8 Z8 q9 o1 C, p1 i, c. F$ |
android签名的数字证书的一般都是采用 X.509的国际标准。
9 j4 l4 q9 i. \' u
/ h7 E( ]# M6 `2 F6 ?) _8 |/ Q4 \! a$ z# i. ?- Q
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
2 ]# P. Q7 B" m- s & j: o2 N! g4 d0 s* g, O6 b
# \# U3 d4 q2 o
下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 ; k9 t! w# A h
- Q. v& o L0 h. K0 z: e5 g* ?7 E8 N6 j) a/ i6 A
. U! E3 ]( k. {. D9 I
' o; N4 d7 i5 Q2 p6 V, ?; ~& c4 V- D$ J4 L5 i2 \. J5 x# r e) W
' s4 g& F0 l [4 F4 g' Z5 m& Z, b
7 X9 M: \; E" S4 I$ j! Q n' a
l3 S4 F8 H) ? 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 ; d" T$ T+ \2 J+ i9 |) Y8 |/ k- s8 D
) ?5 F) k) A, Z( B2 Z9 J7 J' {$ f6 A# E% \2 i
6 M ^& c u J8 ^5 X2 U
- Q% a' N! @5 u! ] j. u+ j
8 H8 o/ [: l" }( @" v% |) y2 E2 j) E
、
! |. U3 y2 x% T, V0 m% J3 o( A
1 h( _# D$ }2 k( o6 Q$ L$ J6 v3 K1 W
a/ c) T8 s% g$ L0 ~. h. s( s
7 I G9 U% _: N g/ ]' Q( a# G! ]% O/ w2 m0 f2 y- s
权限信息
. I& e, _: x: ?" Y2 q3 w% l - L$ h" |- V. p w- u
* b, h5 k; f! J) F; N) C1 Q 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) $ x+ z4 O' [3 {7 I/ j# M5 G! J
& L8 b V, `1 C8 f) |4 |8 u+ }" V* ^
5 e; V* \6 W, O+ { x6 h: I4 L: G# H$ \
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 - V! P& v6 ~& Y6 _3 r3 h o
: t! O% o% V) I9 c- g# J
# a8 W8 ^9 K5 {6 O, i8 U/ e' f / N2 R. {8 F) f/ G8 p
9 a' F3 a6 a( ]# v# P7 E7 j) R J5 \8 ~9 e- \, M! b
0 H+ @7 c$ [$ d
+ p, ]9 R6 H! V H8 p8 s9 k W! w' w2 f0 ?0 Y x
下面对这个APP的所有权限进行详解下:
% w/ @* Q+ _! ?3 m% \6 @
& i% {; w% {+ _& s" k1 S) F7 Y
android.permission.INTERNET :访问网络连接可能产生GPRS流量
; p. \' e" M# D- ^ 6 N' W9 S: v, _$ {
1 Y& z( B% s% D& f
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
7 k) I j$ L4 X$ t9 Z! Y7 h
& e( f. T+ B+ [# R2 U
. X9 Q0 v+ W. q9 U. b android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 4 B1 ^1 m8 \3 k; E- z1 L& R" L
! L/ R6 @) w( t+ D1 p+ n# e: d& s! h
2 t4 f3 ^) W* |/ [3 j" F @* x( d android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
. J4 J% W0 G: c
( d; Z! R. ^- ?$ v9 V' f) d- N4 R8 K- y. U( m5 S- U& y
android.permission.WRITE_SMS:允许应用程序写短信内容 ( l# b4 o/ s: ^0 m, A2 y8 Y( ?
4 [- B) }2 U' Z* B7 w
' \/ W# a+ k3 N+ N
android.permission.READ_SMS:允许应用程序读取短信内容 0 Z) k4 g: x+ `2 Y8 i/ q7 _
0 T8 f# u# x% V6 c4 z+ X( a
" _% H- V& d$ K& d6 F android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
" w. ^8 @- g7 l6 r9 ?, a 1 p+ J8 W. s+ \: p" Q
+ p- c9 \8 R6 [7 X4 A( _' A$ { android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 z4 N3 {0 q( L2 T8 y+ I
4 I( k) g: _7 H6 M S, m6 h+ b8 k7 \( V0 T8 [: j8 r% Z8 H o& S
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 # u* b2 x" D/ D" w- V" q7 U# F7 g
. k2 ~+ P1 E: X
0 g2 R' L& V2 C7 S7 z' o4 V android.permission.VIBRATE:允许振动 7 b8 \% j: e& k$ i. ~
3 s6 c. E/ ^8 E0 I' R
& @1 ]) y3 L( m. l6 k9 | android.permission.READ_LOGS:允许程序读取系统底层日志
: z* u8 b, X, Y" K! r' @$ [
4 P; V* }1 [/ v* U) k& Z& t J% n) L& e
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
& n1 h" |7 P, M" t$ ?+ ?
8 s! h% y# w* C# z6 t7 w
$ j/ I2 J# T8 z. Y. O! e1 E
& ^) A, C, {: z& w* v* ~' B7 }( v
) c3 m8 k) y# u! }* w7 k6 `7 f0 ^, ~6 ^, d' L0 v+ {
功能信息 + Z8 H) L6 k. {% W
1 Q' s. |4 }/ |; s! o; `7 I6 B4 g
& u/ b% [; Z; a* q( d$ e* [( j ; Q" r* W/ L( c& K
. T# Q6 O' Q" t% T; i) z7 R I% x$ q- \. a' N' @
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 : Z" q: z. E& |) Z, }1 M
' o1 I2 k1 H! Y" h7 x: G2 l6 f
+ a: j; U& O5 q2 [' _$ |
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
) C& ]: t+ ~1 O `' _/ d ) O' h8 i: h4 P
( f; K/ H' O! {3 e" e 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 0 z- R' N6 E& K4 r. C" q% i
# v6 K* C# D% t/ |- ?. S7 f; L Y$ Q* Y8 U1 q, [! m
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 3 ]7 I2 {) `) f/ h! D$ x: F" d
1 X4 X( v# d+ y. d4 B! m, s4 z, m2 G
. C* { k- D& |9 F3 {1 {6 V . s* H s* V1 @& S; S" m3 K
, J& e8 z. }3 S% Y3 L) _% T3 v6 A8 Y' l3 m$ j/ x
+ x {/ j. {# k. h ]- r 7 E8 K/ {' F# v* K% E/ _0 c
4 W5 [3 t- u- W3 g 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
; U F0 Z% Q8 V: U 9 U7 \% A1 Z% l+ u
3 I9 z7 I/ X+ h3 k $ J; x+ T# K6 [% N. i* J& ?
% c5 K' ]6 }) o
" g. x* y7 n2 r& C/ ~ o5 k 2 [- S6 k* E; {* b; N6 |- X; ]
# @# u( w$ a4 ?" }7 w; n0 o/ F/ E4 u$ a
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 * H# S" d6 F0 v5 E- D8 h+ b" y
- A; I4 i+ U9 P2 }
) }3 p0 ?, ^1 P& i' X: G$ ]( O 3 Z5 n: e) ?# o w+ ~8 u
3 M; ^9 P: u* d( o
( K. x: Z) X# R& [* e, P 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
6 G9 {. O; F) z9 B7 }
' w! X+ o5 \, z" b
; ^* C2 q3 q3 Z& s) \4 p
8 p; ~$ f+ R- B: [ O' U
) Z1 m; k' T) V: L; t9 X
0 N. N0 L2 \/ x# ^" a' X
/ v; W1 @6 Z# y) q * D& K, h( I1 B; i' Y9 E& |4 ?
6 B$ w. _: V2 O4 a5 L 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 " l/ S9 w8 K4 E; i
# h+ C+ R9 C9 b, [& L* R0 o" a+ E2 y5 x; j0 m8 {( c; B
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
& t9 [1 z5 H7 u9 ]
6 F8 G6 e2 I+ F8 H: `9 L6 p; H/ D/ q7 y% o3 Z+ ^1 m/ `
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
' v; d2 f9 W) y% }0 [5 b 3 F2 r: ~0 b, r% ^, X, p
) A! r5 r1 S( |* l: R 开源的luasocket代码可以参考学习下 ; D- C7 F, S8 A/ E: ~
5 d* X, b( A5 g+ n7 R* @
# a" ^/ g) f; c https://github.com/lunarmodules/luasocket
( v k/ N- z) e8 E8 j ; e5 H6 _9 F+ f) o* l# A* t
) q# |9 L) U6 Z) i ^
https://github.com/fengye/luasocket
# ^0 E/ k2 @# Q3 V 0 ?& K6 w3 a+ f& D! X! G( n. j
F* }! d) D# M% A, P
: b( V- |: P9 @! ^ 7 l/ E5 s- F) \! C3 `8 C
& \; m& Y& \6 x7 C, `
0 q+ _& m7 v4 i* v1 R9 o, N
1 l) m! a6 |, B; M+ `. b) l% s, g* G- G- C v/ W1 p) j9 M# L( \1 f
1 V3 y0 R. V' p/ o4 Z, ~
; u$ H8 e3 z/ l1 P0 h7 d1 w) p
4 l& g$ Z( S" O B
* k5 u9 M1 H S9 o$ y7 Y
- ]; D+ t, ~- {& \& G1 g
8 C$ r/ ~2 D4 I. u9 f0 v 总结
; Y1 ^& U! s' C
5 o# U% n' D) ?5 z. i8 H; i$ e j& u: k3 L7 Q9 N2 {$ E
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
0 Z3 H4 q( J- H + O7 \0 w( k" C0 u
& Z/ a, l) `5 `! b
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 % O' K( \5 J& G3 J+ a7 r
" |+ {6 ~! p; f' \/ E W1 c6 V* J U
( G* B: q3 s3 O0 l4 T/ [
对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。
8 T# g' _, V6 w/ k7 P & K" S5 ~% W% y( t! |! N" Z# h
. N) d1 t5 @3 Q. ` 结束
7 K* F( ?) B* a! |. W
: C9 f0 \, d+ t9 \8 p2 L
+ b0 J) \+ A- M1 g8 q 【推荐阅读】 + w" D' S7 x7 J0 d
- U- ]6 {6 J) l% L* {
2 H$ U# R) H* p% T, m& W6 Z3 m' J& h
对吃鸡APP的分析
4 N) {& R! t" x- q7 k
& V3 F0 t% _+ w! l+ w i2 J: e- y; d( a% ]' x
你需要了解的APP安全 4 F3 ] V3 {" z2 d
8 N- `) T k+ J( N8 F) g u) b
0 }! b* `" }+ ~% S 你需要了解的APP安全 2 p. d) P- v6 b, z2 d: `, e
( K* S+ ]" _7 D6 {7 k( ?; O$ I8 Q( o3 ~3 z0 q
7 i g2 C9 a" j6 J |