8 P: I' H! W) P9 T 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
; U) Q1 Y- e: i( P
1 c( l5 [& W5 }# v7 h
2 \# m) ^% m) L6 `- p0 \% B4 s + D' J# V% |0 `' B4 q
- ?( P* U$ l4 n! H2 U$ ~8 `: J
% M9 n p5 v7 Z I* B _ _3 j; ]9 S v: L
0 A# _- V& k3 v; j& x
# L6 f3 D2 |/ H8 n- e 下面就以开发者角度进行解析下这个APP的功能的实现原理。
. W3 W1 u" c1 S0 C% T ?
5 P3 i% l* ?' E5 X( L; G( S& \, @: E6 M
$ Z# y9 r3 g4 Q" T! Q & n% p5 C) |# `) _. y
) V& C2 ^ A. w) Q, b) }$ i( S6 A7 u# p
基础信息
; k1 Z, a; _( J$ A% l
( \& M2 q; h6 D; R% z
0 R1 j- ?; n. K, B 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 ( y" W* V' B5 N& z
& I c3 u0 Z( C5 {+ V4 d! \
l5 y# G1 U! Q4 w K* R . m2 T/ [5 n6 ^7 r
# C5 [0 I; E/ P; J" Z
1 ^4 |8 C/ Q0 K/ X# r
& B- p ^8 B. }& @5 ^
; Y1 m* d9 N5 h3 t# s, G! o" n5 V7 V" C
' X2 l) z( E5 F0 g. W( _7 Z 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 + B- ]: D( q0 X; F; b
& |6 E% U1 M6 G8 d3 I0 L- p& C% ?/ S8 i) T& e8 X$ b H
4 y* {1 `8 ~& ^' J( t
6 D4 B3 q" R3 f
* [$ n. }- W f
6 {1 d. a9 g1 G/ K+ \ Z( C , S0 A# L2 `7 q* A* u2 D8 c
/ w& S* h+ Q1 U9 y; N 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
7 j$ H! ` b& p7 [. t0 s
8 u1 Q6 t! O5 `: R2 v7 j$ @, n) D6 X) o
7 y& U) L7 P9 D1 S7 ^7 p& V% f
! g1 X* a& z0 u& p( J) P
4 |. L0 _$ \3 ~; t* E C3 h
' n6 h# [- b- d: Q " j, ~! }" z& Z) a4 j! z1 Q
' v8 k4 ^1 P- o
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
& w% S" |6 r) h 6 K, A' ]6 i0 l
; U) Q, B9 O( e/ o( I
( d- T# M8 z# f8 Q
) Q; f" v+ b3 o) G' n
5 J, |; B' m/ `& O* P! K, c
) w1 H9 s6 s( d2 W$ r ) [" k5 E7 a, `& A
5 H, z, q9 }7 [, _5 i1 q
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
& |$ ^+ w" y4 l I9 h k$ D ( R: x9 k' E, W; q- W: v
- `8 z$ R6 j# y; H& b' q5 p# V
- s3 {, g6 H5 L2 n M 1 ~0 P9 N+ ]+ `* b3 B4 L
( \& v' l) |3 k8 y1 o0 @
2 S! W4 j. Q5 }* ~6 S' L3 u! G
0 P. ~4 F+ G/ r7 H2 l- l& q# q( e( i6 k* j8 V
8 T8 B& W0 l$ b+ z( I& @ ! j% }4 z" g/ i @4 W1 |
: v8 \" G5 `% Y: R& l
签名信息 # R7 H/ J. {- _& N, Z$ z, W/ |
* j9 @( n9 j& [+ m, a
8 e: ~/ b1 I4 U* s! k2 w; U 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
) z- m& ?0 ?. W# S: q8 u+ @
' y% F* s/ O/ R9 b; L& o3 q b4 q7 u+ _1 j% G
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 " R3 L! ~ n3 Y' D3 s& K# a. b
, r# ^. m) f- r( Q- v1 S8 K7 I1 d
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。
4 b$ W3 b5 E. d! w2 a , l8 m! i5 r# H7 x2 @: b
% ]/ p, L: L6 F k- Y
4 [, d2 P7 [7 J8 B/ I
) ~5 P$ \9 n' n' q1 \
# T4 f( [' _/ T, h7 S 2 A) {# s+ A1 P3 n! b
, K- ]2 D$ }, R* \; g6 u4 w. e. T
- s6 K0 e* B/ n5 z# ^2 L
android签名的数字证书的一般都是采用 X.509的国际标准。 * h2 f( G. j; C" w
) X% O0 B8 ]7 Y% T x" |: \# K8 m
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 9 T$ @/ O# T3 \
( O/ y* ^3 t7 c$ H" @3 N. ?
% a& T: _+ z5 X. o+ y, N$ W 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
9 P* h) Q4 ~* u0 Z9 r
9 M; Y# K, V/ \! {4 R- ?4 ^6 n% J m3 `
1 y" \0 [! N" u3 [8 U 4 e, ]- s4 J7 B/ y2 d5 ?* o1 J
1 k- u+ A' @+ y# r- x6 _& `9 O' W6 x1 d& k( @
( p& P6 x' _' o * D) G1 Y: O$ s* q- |) s" y1 Z& Y7 l
' q( h) \* J( H3 A5 j, | 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 7 I$ z3 J3 a6 o- G ]6 t% C5 Q) ^8 ^
7 y4 r1 @+ c ]7 T* f5 z9 e
' l4 X/ J8 _$ a e$ M# Y : o m8 i* o. S: x4 R, j8 k
$ z1 ^) l" C5 l" ^
, s7 t+ Z2 N8 X& B8 k- y/ F 、 % ^' W0 |3 x6 k8 F* O l+ d$ q- R
7 w, }7 M- \) g4 }: K
. B3 A6 ~: ^1 u; W( ]" W' v# F; R+ C
6 L8 a+ g' ]# C5 m, e
, z- v, b) ]' [ I$ i7 e/ \
a l( J3 k9 y5 R 权限信息
7 s! w6 c4 U4 y5 V+ }
; ~2 _+ t! Y' ^9 h
0 J0 n- L& G7 ^. b3 N+ g, ^ 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) % G& _3 z- S5 v' z
7 d0 M; z! r T$ u) e+ ^
2 }! C Q7 j' S' Y5 m8 Z. z
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 / _* Y) ^3 v9 t6 }. \) Y
' R* i; w4 G% C+ S
- [& y4 r" W% S7 W. n* A8 I7 G
3 u0 i6 m6 o. Q% }9 W! B$ O
, D% ^' F/ @* J- l7 z( D0 S: [% g& x: ?) l1 O" `# z* }
+ V9 k4 v6 |& k2 X; O/ i. L
6 E2 g9 X! ]# [% |
, M- E8 H- T# k& P8 E# a( o
下面对这个APP的所有权限进行详解下:
5 V! V9 y& D2 N 4 D# S: C( O3 w/ I- R
$ u4 B7 a* ^+ q0 h ] android.permission.INTERNET :访问网络连接可能产生GPRS流量 8 U ~9 ~! j/ }! D: v
- _3 l/ E! U+ V* a2 l1 M
. _1 I7 L" D6 T; g, m. t android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
/ g$ @$ A" q1 n7 | t. h
" e0 f5 ~& F ?$ [, P/ I- R1 z+ \& }' s+ l9 C! A- V5 i) ~
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 ! A" P# z, |) C4 J
l, U" R1 i/ l. [+ Z' o
' H: i" P9 ?9 v% s# s& x; D
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
- W2 Y5 Y$ Y! b6 b7 U
5 O' h) u+ ~# Z
) }. m1 V6 R9 ^! \4 m" M android.permission.WRITE_SMS:允许应用程序写短信内容
& t" W) v+ M) ^5 B% f! U4 H d
p% k; A) q& W! @) i8 V) F, `* g0 O$ F
, J( c/ u5 Q& b android.permission.READ_SMS:允许应用程序读取短信内容
; G# ^# J. V% `1 x6 Z2 g1 ] " F. y: b# j" u# z" I0 u
- b: d9 B/ E( Z4 w8 k/ `9 [ android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
# a! J3 a: i! {) j# h 1 }4 g1 n$ ~0 i& x$ w# ?2 r" n: Q: u0 S
; `* G& n2 b* ^/ ] android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
& H {8 A$ l2 d5 }& V5 M8 o 7 C8 Z+ x/ D. I
8 P: t/ }: ]8 g android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
- @4 h1 @3 A4 n$ ^! v
3 f4 o' r( s& D4 w/ w! p! M& t: q, W3 Z9 T% p6 J
android.permission.VIBRATE:允许振动
, ^0 ]; F" Y/ C: t9 e3 L
9 X$ p1 q; w6 L, M3 l6 J' N; i6 {1 |) J- c1 T# M5 I& m
android.permission.READ_LOGS:允许程序读取系统底层日志 " F7 e& Z9 X: F
4 m0 p- C# y$ [& m# D2 A
! M4 x0 N# l9 s
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 : h/ w) M5 G, {* k+ E& }
" a# ]; ?7 a4 @0 ]2 ^) e4 O
7 g. W' c7 |9 \" {7 x+ [ ; h1 N+ \5 y4 y Z- a
. S$ H* L$ n5 Q% `2 w0 e
9 V0 F9 B( H) L7 _ 功能信息 ! v0 T! o' L. h: S6 A1 S. o- ]5 a
/ `9 \: e- P \& U# \/ b9 a9 p) {2 C3 A/ B# h9 c7 Z
! [, P! L3 K6 x# B
) ^8 z0 a8 V* d. f/ \" e
2 o9 t* C! \; y5 `9 @. x 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 * Y6 j' Y9 M8 u9 A/ A
% R" g( ]& |7 x, f
3 D6 Y5 N) S. ?8 O
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 / U1 L3 {, a7 z. a9 S+ e
$ Q; H% d9 l+ u, U
- u: Y# I4 c* W" O! U 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
$ V/ K3 T& J. V0 o
6 S/ V* a0 I9 O2 ?
X7 u' N# e" C0 R( F 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 0 n! Q: o- u3 W9 d: V, R. E
& U6 s* x$ f9 s. h# j) g) `
" M6 h4 q1 c+ m n, i 3 v7 f+ n- d% O/ R+ U6 E& L/ l
, S) a: ?. S. C, k' ]* k
9 @6 i/ \) Z- ]
; i& f, @- D& v) E/ @+ w7 ~0 g 7 Z$ b" _! |3 |- F9 j) m
4 U$ q' W7 W) U
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 3 c- G5 m0 c3 _1 A* n# t- d9 [
+ c6 E% I H5 p' i$ x' ^7 v ] @* S4 C% Y) I
1 O- y# [( n- O0 D
8 h- d/ c0 A. H& t! A' m
. x9 i2 w. b/ J! B4 z6 N - M( }5 g" @5 c; w2 F
4 s; o& X: b- X* T9 `) x: w
$ R2 X0 l/ W1 _ 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
) D7 N* N, `+ y% c) A3 F) |
4 |4 i; S# C" k( C" K7 v8 Y& Y+ \7 b; F1 u3 ?$ f# p: m
) w: k, u' h' C9 \ }4 r9 {* V8 E
5 [/ J# }3 R- [9 K: g2 |4 K6 H% z
: z; U3 F3 D0 V( Z
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
9 Q0 l8 y4 {; c" U0 B
( ~3 p& ^6 m$ u& `$ c }* a4 ^" b( ?5 C( t4 B% w
$ }; z% h5 n9 t8 Z! {& ^% q( L ' X1 M. R3 [) b, V
) m1 O$ F0 ~* x4 M9 G% |8 F m ( f" x0 @! {9 z1 D
& a ?/ S) k) ]6 ]) M
$ f: D6 }; n+ [ 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 $ C' Z6 }; f1 \1 Q8 G9 E
7 }: s+ Z2 I$ H1 g' |
. i: R5 B. V1 T/ M9 S LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
* D4 g+ d4 B/ _# [5 z2 b2 f) X , W( I6 M r6 B' ]
3 i6 ^2 H7 O8 f8 x2 `$ N 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
" _ K9 u9 }2 S, H ( f- c( Z2 ?6 W! d2 R
7 c* U- L9 d% f) i 开源的luasocket代码可以参考学习下
2 p6 s7 _3 e' b3 L: O& P
& U2 U7 U* R, s7 D! _
) ]' d, `8 T& r, a" N https://github.com/lunarmodules/luasocket
X. Q) V2 `& c" [$ \0 c
" ?* a+ y9 U E! A! D) h; o L0 b; g
https://github.com/fengye/luasocket
1 G# y) E$ l* S4 M/ Q# V7 q ' I; N; Y( E/ _" i9 w) O
6 t/ u' x; o( m
3 K! F$ V; S G1 J. q! `, W k6 u . x, M: i$ T' l8 ]4 h
7 S3 B' f' _! ?$ R
* _8 }& T$ p! L( x! u : N2 {$ k/ h& O+ N( d2 {( u1 t
& b) r$ t8 {% X4 S) o4 U5 e % r* B% D- G5 _ Y7 g8 m
9 X( M( |. o; l7 i
" \ ? R/ h5 q$ x: K6 u$ ` : ^. B3 z; s7 Y; ]7 t6 @3 P2 z$ l# V
; |+ C8 `6 k: I3 K: U
" \* H" [+ i( e5 @! L3 V' g1 c 总结 ( ^. E" w0 H Y X% Y9 Z6 w6 @5 ?
! N; i& R0 T: j4 H. y# R" T
/ |: Z$ h1 h4 G# n3 k! ? 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 0 L3 N6 ? V% O- w; g
^ P Y7 L) t( S, I9 C6 W0 C$ s: d
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
K- }2 J, }, M4 `0 r2 R+ H
- @1 `; [/ P: V- h$ ?: n7 ]
: E+ l' a! V$ ?: t! B/ Q6 F 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 ; z& E9 [ w; n" L7 l* Y( N
# ]6 C" Y/ [( v+ X# }; u
5 ?6 F2 D( E+ q* C9 g
结束
& B& S* i7 m1 d! `( ] 1 D- Q! T5 ]3 g# j
0 |0 @$ T" D% [: y5 W
【推荐阅读】 ( T* p$ |5 O" h& f! `* H7 n! q
2 Y. F- f5 B s9 g' G1 a8 h# a* c! p G4 t0 l1 S
对吃鸡APP的分析 ; t& F4 _0 Y( O; y4 g
; d! c3 ?2 F/ g$ W
# P# t2 p$ g* l
你需要了解的APP安全 ! X9 E" J' H/ N; h# u/ c/ G
% K8 E) j; y6 d$ R6 M5 e+ c
/ J: I" `$ y$ ] 你需要了解的APP安全 . ^. W E8 V8 G9 X
, f% ^! _' x/ h! ^% a
+ D* R+ e* J) {3 y
& [% L. e! H( k& U5 l) D |