|
# y6 | V( q9 u9 z3 } 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 0 p' }7 T4 S5 Q1 z4 H, }1 n
5 X; ?* O+ P, B8 M; j
6 {/ B" w2 [" W) V9 ^ O- s7 J- q
0 w$ _: Q6 x6 Q$ V. m1 _1 ~$ W- D9 R X+ @/ g5 m, y" T
1 ]7 k% d0 z) ~) k7 p8 \ ) a1 v+ c0 X2 S- \- H( w. M
3 N* _% ^5 w- M
1 a4 h4 ]6 _$ Y6 s7 Y+ X0 {* }% k 下面就以开发者角度进行解析下这个APP的功能的实现原理。 5 S/ p0 q/ h4 B v" I: {9 a u
% `( H5 J' v" D2 S: y
1 O5 M+ ]$ P$ H {- ]
( O/ r0 I1 q9 S( |, u + A' y( v- B9 e" j+ z4 a* e1 V; x
6 ~% ]& A$ `0 k% ]/ @ 基础信息
' \8 t) x" O* @ 0 n, [/ d0 P+ w$ ]0 o" o! ?
8 c7 c( h( z" e0 q% E) b 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 2 k, Z2 L2 h9 h
0 ]) t% W2 p" B+ N5 g: ~* k3 F9 k8 p3 m$ H( a! [# W0 W
5 h Z1 L( I2 `0 t6 K. e, w$ x8 X4 u ( g0 ?5 R! i" U
* D6 Q, s: ]8 I Q7 [
( j; M( S6 Q1 o8 p& ^
2 u& m" B4 m* Z+ Y7 J q+ s
$ J. p4 A( |5 n6 {5 U 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
8 ~/ D* [% z) r: I9 x* H% a
?+ x8 U/ b- z5 F. M* `
& @, a, u- Z2 J' j
" y* J1 q; o6 R 5 G& W" ?, }6 |- Y
9 S3 d) V9 J; `) v C
/ n3 }% b$ t% W/ ?: T" }" t
# P+ _6 B3 G' Z! l) g7 q/ D. w- u. A6 F2 _
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
* y; ^( c$ A8 h3 Y* s7 b$ Q ! n/ V9 F( E/ F7 r% l
0 ?9 x1 N* f4 f" e
& ~! g+ w8 G; r2 x1 P1 `
, u) R' X! }2 j. j
+ B6 k( ~+ A! K3 r L. V3 K w4 V1 U, ]; ^0 k
9 G9 c8 u1 ^- g7 \) J. e) _8 |4 b" H# L6 q$ n/ I! Q
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 - [, H- U. K `1 U# m
) x2 F5 ?) J- e3 L( b' ^
8 c5 Z' h! |8 A- D! q' |8 s6 I0 {4 y * S, Z- E/ F+ D% A. V& E
" o/ F3 C" n3 S2 s
; S* N' I; e8 q f / O+ R4 F) M: B5 R7 y
5 H) Y' [5 I4 b9 U! y1 T
- i% j4 s( Q1 v o6 U' @. _' N! a
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 # ]8 q- ]2 a* s' Y' U
: Z: m( {8 ^5 y0 ^: A' x3 Z; `
7 F! k z7 Z2 O( V' D$ \ - l& L7 H; ]& s1 S% r
+ e! ]0 B7 w5 Y6 G
9 e+ W+ T f; t : U% F2 w$ D) K8 Z: ]% e
8 Z; ]) s4 {; Z; h
% g: [, F5 H* X' E1 h: j , q& I5 F- x" F$ t8 B
0 {$ K5 h/ Z7 K
6 q& _' Y( N, _1 V# j/ a 签名信息 1 }6 J" J; I; \' [' }' ^* J
; u4 H q/ o5 ]7 e( `* q
( L: ? }7 A% v 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
9 W( E! v. o f4 X% O . D% B$ K* l7 u$ T1 `! X8 J7 q
- z; V6 `- e+ R6 r) w
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 1 X& C# Y+ s9 q
; m* V0 D8 M2 |: \/ `- j( f
5 s/ M6 }5 ^8 Q 在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 . N9 A& V4 I. J3 k
/ {" K1 b5 f4 @" {8 }* B; l L
2 L4 @" q4 ~5 b8 h1 z* h 6 G4 T# Z0 A$ T0 M G8 @; j1 q
4 Q! k0 c! X7 r; j! X* S+ O
5 c0 r" o) s# C) ~7 W3 s
3 K7 W2 i1 R* M$ ~
( t% f' A1 V4 v2 @% D5 v( y9 p6 ]& B$ F: p; a! K
android签名的数字证书的一般都是采用 X.509的国际标准。 ! q+ t, |8 k# d6 y( @* z
$ Z3 c' v6 x+ m
$ T* p& D" U0 ?$ @; j- \" o 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 1 ?. R3 X3 }$ \8 g
! m2 f: G7 s8 Z% U: Q% O
0 S% J$ o, U3 A* f" |$ i8 J. X 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
4 l0 J- K1 A) i" r* `. |, A 8 t* T9 t/ u) n
* l$ l; w6 y$ l' l
3 t3 g% V1 h: {' T + N: r' {# q7 z5 r5 y+ l5 E! _/ V
M* \8 S$ v- _6 s; a" I* ]0 l7 M
$ P% ?; R9 C# Q1 f: b/ s0 Q% M8 U 7 J n8 W. P6 N$ x- L
- |6 _' S _- S. o& }& \
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
, _: E+ T0 g2 |; H8 c7 R1 ~: }/ i
( o {8 X7 N% I# k; s
; ~) O6 f+ O( Z* c4 _5 H) G y. C % _( D* U, Y: [: U& W7 M' T
7 Z$ }! i! t9 U% m4 k& t* {1 [" b$ R: d% w2 }5 k
、
0 G* y' o" v [3 ^5 K 4 c5 ~% s/ D+ K; h% L5 y$ {
% `4 \4 n. b/ ?; U. t7 R 0 M! p6 z% T# X( f# e- M
" S ] b$ m/ p, S. l' r
, a* J; ]$ U$ z6 _
权限信息
, r' r R: o2 j. k ' m2 {0 {" f2 i8 ~% f
$ S* `. N7 W% ~. k
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) ' o$ b6 C3 C& k' |% E
1 t/ ?2 l; t6 F' U7 L( ~5 ^" ~- P7 w3 ?& u: F3 ]: G
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
* b# H/ ~" N4 `+ T8 P: t
% u- w2 [ d" X6 B4 R
1 V& X; R' `+ ~7 {4 s) i8 l8 _! i
' g7 h: q3 u& j4 I
, _0 q% a# @+ {) T5 k: N1 j6 B
9 B2 C' |$ q/ z5 l$ d" [
7 C4 S* s/ i4 ] H3 V, I $ Y& F! Y; t5 M" N
& p7 T& t4 R* S3 g% _3 B/ y$ a4 l; e' G
下面对这个APP的所有权限进行详解下: 1 L6 P" \0 [: H: k. G
# e& i6 C* H; n2 m2 |. w& {/ }. N7 y( z, M$ G% L4 Y: o1 S: X3 W! i
android.permission.INTERNET :访问网络连接可能产生GPRS流量
1 n+ w- Z! V+ j3 h/ \9 a0 r$ G H) r2 t
0 k- D! e" ?: p' V+ P9 R0 r& {( C1 S @5 z
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 ' }. ^: B8 n9 X2 J3 _5 K
; v& c3 e9 k }* {0 |. @; U
6 Y$ O+ n* F& s android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 $ n7 {' W$ E% X1 g3 j+ _( @6 j
. I1 F& b+ L8 a4 @( ^: s3 U+ L
" S- }9 R+ a! R$ X# n$ m android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 - _9 J9 ~. l+ E# e! H
: {4 ?# O# j/ R- ~9 e4 U3 D7 p! j# y+ p: |, o) v
android.permission.WRITE_SMS:允许应用程序写短信内容 ; P9 u$ w; S) o. u4 ]# Q/ K
1 y( @' V. D% K3 v$ g4 a
0 t3 F: J0 O% R: ? android.permission.READ_SMS:允许应用程序读取短信内容
) o/ I3 f9 t$ o% C4 P
1 t8 X, }$ b5 W" G8 Q3 E6 f" x( Q" y5 F3 b
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 ' G: ` o- E; _: h( X
! y3 K8 t, Q4 Y: J# ]7 q6 ?' s0 e3 j! |4 k# p1 J2 L2 U0 v
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
' r( T" u2 ~1 u
; z1 W6 ~" l0 ^9 t) k8 e) H% s! X
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 / Z; j7 A( B( g; g" P- q
: S0 B8 j4 L3 X1 x' c! p
" o5 \$ o6 Y5 @/ Y l) |- \4 R
android.permission.VIBRATE:允许振动 2 y% t( O$ X1 e- P) l6 t# ]4 Q
2 G9 r& e5 ~! @. D9 N- A9 `
9 M6 p/ o+ _$ ~' ~2 e. A android.permission.READ_LOGS:允许程序读取系统底层日志
5 g' m. H) P3 b) @ % J( M& Z! u; S
1 B- m: B* \8 ?3 `9 B; K
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 ( X+ o* N! J; g- K# }5 U8 }, r/ _
, B& r' }2 d1 w: Z1 w
+ G1 C: ~) G% y r3 P
8 B5 F2 t/ a* M$ z+ b$ H3 W
. j) [9 y, i5 B* z
# u. X0 F% t5 ?- Q4 Q% A 功能信息 8 J9 E+ Q3 f0 P& X$ d8 F9 G& J
5 f) ]3 ^; v5 O8 Q. Q
8 M2 @* z/ o$ B
2 U: k6 Y; e) O$ b$ J: T! o # V9 p+ R) C: s) s4 W
# W& c/ Q: p. v: s: j. ^ 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 - r3 u o4 E( C
5 m- a* _9 j6 o% R0 J: K$ F/ I- P
. v. {) Z' l9 y- s Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 : D+ J) x2 O( s7 \
5 v- a9 ^# Y. a3 ~4 f
( B6 m7 o# s! w# t 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 * S1 f7 u$ v# G) ~
- [5 z, z, W% M0 ]* }8 _; b, p
3 Y. c: A0 s1 i8 I) @+ Y6 e: ^
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 , P% Q2 q$ d* h% T( x+ a4 d7 g
% z! o* D% c! r9 ^8 ~
% P f: ]1 X) v$ i5 |/ T# _( K / k; S5 o8 ]. t3 o$ s
# V2 N2 z9 P) h# W/ m" R8 M
2 ^2 a) b8 v/ w' G . ?( m6 d2 ^, x6 _" |: F
* P. o7 S- U! @ N9 B
3 ^2 O1 x" b J' c0 `( l
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 3 }1 y) t$ p* t% h# A/ o: c
5 D& e0 c A) n" @# }, w9 ]
/ A4 T8 M# _7 U% M# n* Q
! q# q" s* Y1 [3 n$ b
! E {& g5 u$ y- n6 `. e+ s
) b8 m0 m) E7 p! C/ C' x4 V 4 ]+ G" l6 {) D/ ? o) o5 G$ L- L C
7 f9 R* y! h' H: _6 L
, X7 {( c2 a \& G 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
! b- r0 Y F. r
' S! j9 F! q8 J& y; m9 l8 s" h. s+ @- R
" T4 M- ^$ t! ]0 m% i, x9 C% N
) _% y5 y# s) `# Y3 P" n9 ]; u. G% _
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 y# v' _9 V9 c" n+ c) L1 K
2 C# k# _4 O* I: Q: N3 W/ Z
1 d5 _0 P+ c: K
8 Z( N. d- [8 h/ L5 T" b
! j/ w. U8 C0 W. T& `7 {- o% R1 ]# ?6 l
0 }# G3 Z; G6 ?; K$ C+ W
# [- f- q' I' A; m* _5 E
0 J" Y+ {( I/ _: w7 d! O 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 2 j& k" a1 O; R" |4 R2 A
$ ?8 t' h$ c2 [# h f1 h2 L( n
- E+ \0 B. C+ b3 }2 j2 m
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 ; o( v4 K1 q6 j; m+ ~8 `+ C
7 r& K4 q: Z4 i7 i( Y9 G' O( Z( l0 q7 G
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
& s0 `0 ^: P) m: w0 B$ P
1 J4 X1 j4 R% }# N8 z6 Z* A+ [+ F' C4 _% Z! Z1 I7 H
开源的luasocket代码可以参考学习下 : Y& \7 O6 C% ^ D! Y+ I/ \
% W; }# K; h' J& Y9 |* R6 v2 N( k" G2 `1 m8 v, q
https://github.com/lunarmodules/luasocket p; p+ _9 I0 H9 a0 y- J
6 {* r( V P( S" f6 W# ^8 y: d" f) d8 \8 Z. |6 C. V$ Q# s
https://github.com/fengye/luasocket 7 Q) |4 u6 b$ N( V3 E
: Q4 ^6 J; a! F
: Q0 C. u2 y" Z0 m4 O" l
8 _, N& d' k3 K5 k* ^; Q, R( o
: t) _$ w6 R0 `! r7 L2 B, i: e5 \( C/ y' Z$ K, S
2 M; D3 @- |3 h; u5 b- H' P1 [/ ? 3 y/ x" w" r; V u0 {: r7 r) ?5 R
. O; v' `1 V- s$ r2 j- s$ } . z2 `; O/ {6 X
4 j2 u' S. N% ]# e& L4 R
o6 P/ T* n1 M2 [: r1 A% e& V; v% T
* Z6 {5 E" m# R# e9 b9 a+ R 9 _: g3 \ ~3 \
4 {* \, c ]3 X& M# D
总结
# I9 X2 `8 u9 l0 H7 x/ Z f
8 z! ^1 a: f6 C% C# k
5 i' R) S Q! b3 P 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
. `5 G; ] N# Q2 O" S( r# k 3 ^, O3 x P% g1 ]3 Y- U
6 I7 V ]4 R+ b* O: C* e
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 + k. N( {, b, V- l# m) y, c# u
1 ]; i7 u' K A7 _$ t2 n* [
- Z) B( @" C" K9 t' @8 y g 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。
" ~" w+ T: h" F
" S0 I" Y8 O3 y* y
; w4 @/ ~; W2 |0 F 结束
+ ]6 r( C6 b- d" i
) o& i6 o0 M5 n. W* s* y- x# p7 x3 m0 Q
【推荐阅读】
, j9 H% V2 R8 R, P
: @# |9 L' Y% G( R6 X; m/ |8 | [6 P& o p+ e6 k! @3 D
对吃鸡APP的分析 0 B9 J$ t& d# l4 V5 T6 t
8 U' y P, T! o1 \7 ?7 c8 ]4 N# l" u9 l* @
你需要了解的APP安全
) ~: G0 Y* e2 u: ]% ^/ b9 [. C' A
& K: c. [( L5 t6 u& U2 u: M1 C B% @/ w% t, i5 P6 A; X& F3 X. V
你需要了解的APP安全
) i: |$ Q6 E" O i5 K' h
2 }2 q* }: e) ]- T! I1 O# r9 q5 T; H" ]- U
8 |8 Y0 x' m& @3 Q2 E2 F! B( [+ H
|