|
8 a3 @1 X5 a8 G1 @
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
: N, i) U( Y# ~, Z8 b, T + S) O( D1 |+ v# u/ e2 ?
, d$ ~$ |! ~6 d7 P) m
s' i# B4 ]& J6 ?2 _( Z $ u: O" e" W) d1 \+ W7 }' i& N
7 ~; Q3 N7 A# r6 Q. B, f
4 {. Z5 x5 P! W# C( o
: V' y/ U. r& n; X5 c% ~- R* _- v, {3 B" a. h
下面就以开发者角度进行解析下这个APP的功能的实现原理。
& y5 I I2 H# B; M# [/ \6 o . R8 |6 i$ y+ t& v0 ?& X
8 a: J5 u! c6 [$ I5 ~8 v + ?* s8 d2 @/ M( F( l% {
8 v& M- d" r5 g& b8 Q8 O; V; f! o; l. O. |
基础信息 ! p& ~& l: y% b+ [' v$ `
, `% J3 B' j) y$ m( n* x+ ?$ ~9 W% e4 t! C1 `( ~, A
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 1 g8 @5 S, C% t4 {. {9 Z+ `" q( m& y
) f; X/ a/ r3 X& C( |+ U
1 ~. A/ I B& ^6 B
$ O- z" |$ Q2 n: Y, D
$ z" D2 k4 y. k+ V% @
' E3 i6 Z: e+ \ h
% P# F1 X' X1 B: @; ?/ d 3 m4 I/ w- u# z w( Q3 t
% L7 G5 O) Z! c$ \ 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 # m5 B% B1 x* z$ w' W
' ?8 G0 f$ ^# ]7 Y7 C4 D
/ E$ X5 T$ I9 J0 J: h. y/ t ; ~7 @+ a; p/ ?+ s1 [ \
, V9 C4 n: e, F, Y+ X2 C
9 L" R4 j7 @% |& Y6 i
7 {7 }# j0 E: n( e0 y$ [
9 V* G4 O* Z9 f3 @" y% J4 ]6 M7 k
* |; q/ \' v% x. [! Z- O h+ p 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 5 }) {( `( U7 y; ?/ [
( a, @* P: u' M4 {, g. A+ h
7 v( c6 B( Q1 `, f) |4 [
9 y+ q: u% q# p
0 r# Y1 D# J r" E" F% z7 b' N. r; W2 O- `
; Y2 D4 |- v& E9 G1 ] 7 A! c5 n D3 \3 H
$ y9 W: a3 o1 e: |
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 6 L8 w. n- ^- J" t! `. }
2 L. a5 [8 \- }- \5 V3 o$ D* Z- Z# i) n
) q2 z3 \/ P, b- {% U( \
7 I0 j D3 K% o/ d, M. m
7 h0 m9 A' q5 X + A; R0 a5 n$ |+ I
8 d, e: S& v/ E6 K* U% N. f: e6 c1 ~9 w+ x8 a* S% D
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
) w2 c- i- ~- r0 X# S+ u/ Y
& m' w5 K. o, n2 }& L) R6 F; N; F8 E0 q, B
# g" U+ i: @ J1 @# h
5 S! ?+ L0 o8 C, H4 I, d6 G' u& z
; T& g( C% W8 _1 b: c# j' _
1 J2 w. a6 D2 @: {$ u + q. y2 b7 d- H$ N: k
( K+ W( C0 ^8 y' e' ]6 t: C 6 P \' r' x8 C' F+ N
/ }% a) h6 w) _+ g1 ?% v
1 b& Z, T- a- g/ B+ @, p
签名信息 6 \5 f0 z2 G) b5 w3 c$ a
3 z1 ?* v! H* F0 O8 C4 X, N8 f& V
( K3 K9 S0 k/ d; e 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 4 R3 }7 C. M, W4 l. E
. [- l3 h: Z2 x2 ^' N! f! Q
8 d" j5 @+ l. r8 i( m
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 # m, t+ e/ g, n$ K1 ~
" }5 C( r: P! o! ]) G4 D* ?1 h& c* a7 t1 q J7 A; O U' L$ u
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 % |* _; `1 M, ?- J0 ?9 v6 r
2 K( t' H3 b0 r
1 O1 \3 A+ Q' p" l
% U9 o) }" l' l I4 ~
/ Y. M: o7 Z: v, i& H( T+ s+ \' ]& `/ T/ W* [" G0 f
6 ^ F ^( ]; P: \: t 6 Y' Q0 A$ A$ j9 T
, ~# O- s# c) `1 M
android签名的数字证书的一般都是采用 X.509的国际标准。
6 R) I( B! l7 e+ o3 i0 A0 a" @& |
! [3 N/ f% ?6 K6 {; n7 `/ T5 M8 N8 h+ t) ~
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 1 D' z, j( E0 C( ?, s7 y
" z: j, J3 B) S& `' Q0 o
- |2 `$ _- v% j; h+ I' |
下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
% }3 \ w+ r. C/ G % M* w! B( J( D! {
) e' ]6 [8 G* q0 Q/ u
) x$ k/ G, \ o% W Y
) e( y8 M* U% k0 r* h" e+ R9 Z; ^) l7 G, h( z
: m3 g6 t% a: A
5 Q) I6 }7 A( t8 r. U8 u- X& j4 J5 C+ F X. [( o. P/ @* }
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 * h6 U4 Y$ _2 M7 R" u g# R) z
/ x( ^* V( a. V$ E5 y1 g2 k9 }0 Q; R3 |. [. t
$ }1 U6 ]! m1 Q% c$ Z. w4 T
( ?6 f5 [1 [: N1 }- I: A/ x, V, p6 o' y% J* D* H. T7 f
、
- U4 Y+ {1 |9 j* o4 z 7 C9 S" o/ m ?( c* u* u0 S
& Q2 N/ J% p" f: A6 {
0 U' e* o$ o6 i& J/ Q3 |/ n - _. g) A# [3 m* Q
# S5 k- ]- ^& k- U& O) L* p9 [ 权限信息
4 E1 R4 Y* [; Z/ c! { ) r8 H- |7 Q5 o! b+ } b0 P2 A
; y- b8 x3 P/ @5 f 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) 2 `- Z3 U' s2 h0 ?! |: N4 {( N
* Q4 E6 D$ B% V8 a$ e$ s
8 x5 P. f5 q4 c$ ?4 O- T& T android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 5 h: J/ ]# W7 ~3 Q! V
# u/ S) H! @5 R! d/ W
' b% C* d' N, W! |! d . g/ Z6 `( f3 u7 i7 A0 ^/ \' O& m$ @; U
# D2 U3 v: W5 P+ L& H6 U, ]: W& y) v. L* z# m" [4 g7 _
+ a$ ?4 M! ]. _1 Z
1 P9 i/ [( H p( E7 n- }% R- C* L- _2 @8 Q# c' X
下面对这个APP的所有权限进行详解下: 9 V7 [" Z$ J6 j+ c* D
& d) ]1 P6 |7 r+ c1 @
{' A, C% ~% C7 n" u9 m
android.permission.INTERNET :访问网络连接可能产生GPRS流量 1 Q" U; W8 H. w, B' }
! v. n r" a) @4 T( c2 r, [) j1 v7 ?1 b g4 u5 T
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 + L8 q- ?- ^* @ ^; Y" O
% c& P. ?: U5 P9 x7 n! P
1 g1 q& Y; I+ n. g android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 : x# \2 J# K! y3 e
. _) I7 i6 [* g5 J* q7 [
& Z$ N& d% z: O android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
8 P* m$ J' _' W& P; p) f1 b ( u S+ |! ]/ L" ^6 c. S& J
( g( W( Y9 y$ _* U- K i% j
android.permission.WRITE_SMS:允许应用程序写短信内容
0 Z5 {; a& W+ i2 S" T$ ?: F B
$ d2 D9 [: `% K+ A% f7 a j8 U# y# g5 }4 i" q0 b( ]: |/ p& A. t
android.permission.READ_SMS:允许应用程序读取短信内容
( x2 @4 Y( x3 D5 Z0 I3 k9 N/ |
4 X2 y5 s+ H/ ]( x; m8 n& o2 _
k+ T* Z+ G" F android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 ; _, I0 d5 D6 I6 s* h& ~1 f; r
0 y( F1 V9 n6 ~! n/ {7 k( {1 J; G
/ {& q- {2 F! @) N5 y, t' F
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 ; w6 V' A& }4 t. f1 K
& A' B' z) |5 z- N. K2 z9 C& ]1 i1 }; Q% \' b& l
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 2 j; i% W3 i, F. l
& b! N+ i# L/ M& F
5 u& N7 C1 w$ r# c+ d
android.permission.VIBRATE:允许振动
4 s% L5 }# _0 O4 b& p2 A! } ) F- }( D/ y8 H1 z" p
" K/ V: t2 F1 }" o1 z, F% X android.permission.READ_LOGS:允许程序读取系统底层日志 $ y+ C# x- s' v6 J" d/ A% U
1 [ T' Y0 @0 b. m& P: j) F# }
& ?% B) g2 f( Y9 e! W8 o* S* W# e3 F
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 : i/ C. G) l" m. D3 Q
4 m+ J5 _0 F8 d4 j2 `% {) Q
9 y; j( W: L# W: K
+ U$ D9 O5 ?: ], T' v; r : [# g6 U; D; v! H6 k9 o9 l. L
8 K* [# i y5 F/ D9 ]# c
功能信息
- _8 Y% @. e( `$ q1 r
+ E6 Q& I" i; ?! }- N1 c) N }9 }1 }
! p9 ~4 o$ j, o, m, b% g8 c
3 Z' q1 t" u5 _& u \
, g$ e9 o8 B1 Q' v2 D, V! y4 g0 d* m, Q: i- K# G. B0 q8 V4 t
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
$ ~3 t$ M2 o( } S7 O4 D+ r * O, ]4 U1 |2 F/ D! y
2 ]* s2 S- Z2 e4 P* q. ]
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
- u. @8 O, ]& @$ e1 J . X3 E7 X" O7 L; O9 H5 g% F
% J* [/ o5 V$ m3 W' V$ ? 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
3 ^- V3 x' y: z% a8 X; g 7 }! a5 `1 O, q+ ]- @9 W
8 o* t4 M" N9 ~3 {/ B) b) k9 c
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
3 ]& j3 ^( }5 N5 P % o: K* s% a8 U0 Q; a) v
) N2 ]0 T5 ]- [# y1 b8 S- Q
6 W1 X& ?4 X8 d3 O
3 M9 l* a6 d# J' d: u9 S, I
. }/ M4 {! f6 I 1 y/ o3 T! o* \
: \7 ]7 N1 p T/ p: B
9 d9 O4 z# `! x' D/ d. H% j
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 ( h) u1 L' C0 s& U; u" b
. U9 G O* T, }1 A- H" z# |. w$ X1 P
4 R8 C& ^$ R9 F( [! e- v% Q
; Q( x3 d% i7 C9 U: D- I
' D. N9 d( \2 V3 c% J
. r3 p& V7 [6 k- {8 K* I5 n8 w
! Y1 \7 Y( k9 c+ z) v2 D: a0 P& W7 S% }8 A. w5 r
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
5 n z& h" o9 z! ]9 v5 ^/ e. U0 j 8 _' }' L6 V5 d) y+ p2 O* a! v
% K, }% s6 c/ t ~
0 _1 z- \4 W3 n4 K8 E ?0 \ d# t $ `( ^8 L5 b) w" g, K2 n' ^" ?
3 ]# x1 i4 T M; _( P) c& C
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
. }0 Y, H6 j" G/ T6 `/ W& I& Z% J
9 G, Y4 m5 F- I$ _, I0 K
+ T2 j8 g" S7 p, J
' L- F4 |' [8 h: L" i 7 E. h$ z$ k! U1 ]4 S
; R+ c. p( q8 g2 t9 U9 @
7 T; ]$ s2 s9 g' H3 T c
/ c, o& c$ `$ |# D1 Q5 X" W* D
! [; r6 Y! Z) S6 s. {
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 + a/ n- \. l; O" E! }
. E9 ^* [7 V# I
4 |& [% f8 @1 h' a0 o LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 5 O9 \9 q8 d. x+ B; H) `
+ [+ S- j8 n$ }
( a8 ]/ B5 Y t7 N, b% L1 Z
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 $ ^2 ~6 }6 c8 p$ U
# ?9 |- b6 { G4 ^) L" `; O' }0 M5 K+ U1 c
开源的luasocket代码可以参考学习下 % d$ S6 M2 \6 S V+ \: a, T* b" {
. \# p1 A2 }/ I$ N9 e" e+ G
1 z3 X1 M3 v# F" [) t https://github.com/lunarmodules/luasocket : K6 O9 J. E5 r! U) W
- d: a9 V5 e0 M" A6 n8 }5 s- F2 c- M' q
https://github.com/fengye/luasocket
; W7 h1 ]( p1 [1 D+ _, y0 [0 |5 y
o' H& ?0 x3 N9 C8 K
( F2 G0 g" U: e5 W' h# v8 O
. v0 D0 s5 |5 Y5 }3 {( @) \
2 H+ y, `9 [: d; ?. Z5 }- X9 `
; r6 `$ E# m: r1 \
4 K# L4 y6 a ]8 V
/ J8 D1 S/ U- |0 v: ^0 O9 j& _$ M2 I
+ W4 P/ G! ]2 B5 F7 {' Q$ E & c; p* v/ H+ f9 ~7 _8 l( |
2 O" s6 z6 d! ^9 w+ n% D! ~- p 8 W) h7 l: z/ f) @
. Z, o4 W/ T; J7 i1 g2 Y U7 b6 i! P L3 N
总结
) r2 y' Z4 _$ ]0 J0 [ ' @' |/ A4 I" v+ J
. L( X, K) M1 x# @; T 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 1 [% i& J4 R3 n' s
; r! _$ b) T2 P9 W
$ O9 L" C4 E3 e& G- L% g3 s2 a 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 , ^$ i Q+ w) w% h: Y; ?& {7 Y
+ x0 ~- e9 n0 U
) Q+ f+ X& S: T' Q8 J0 b; z 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 ) l5 a( @/ X+ U
! A7 z, j' W( T+ F5 M D# X2 d
8 a3 f' D2 ]. ?( F2 C 结束 9 U* Q- y. t7 W2 e9 Q
+ e; W- z( P, C* J+ q
# e, n1 i5 i; U: k2 z+ [* g4 | 【推荐阅读】 , X2 Q6 o1 j6 O: e- ?! m
8 l% _2 B# m3 E
7 a, b! T5 [* W9 r0 t/ c/ u" ] 对吃鸡APP的分析 D6 u. s* s& a
* S/ W# D# @* m& W% w; x. _" J/ A0 @4 T0 T4 }1 G) x7 Q) ^
你需要了解的APP安全 , y7 a: N' e$ p$ K
# \" d* r7 a9 e% Y* K9 h
- j) q3 s6 k t5 N: q 你需要了解的APP安全
! R7 s2 _; i8 }
! j, h& Q5 h& U; O( o
+ I) v1 v, E8 `+ p' a' S) O2 |' k7 K2 h
5 X9 }+ L$ d% Z% g/ I$ `( A; K/ _ |