|
) y- s, S0 h$ U( I+ X+ I
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
2 r; q7 K" P" B) \8 d, W 6 n$ Z+ r( t/ V* e
4 h7 t1 G2 q' C
5 V3 }( ]- j" r' x6 ^6 D! ? 2 U* c s3 `4 d3 s$ A5 R
. y5 D; |$ _& J- ~2 U+ w. N & ?% g& s# q$ q
7 [5 V9 [& \/ d' a
! ?4 `' u( i7 }$ Q" D' C0 G* f 下面就以开发者角度进行解析下这个APP的功能的实现原理。
& c/ x, \: m8 s+ q3 Y5 G2 y0 U) u
! ?/ A7 E% D, Q% g. R, O: U/ L/ ~" Z- Q! z7 |0 Z, W) u/ u( [# e
' s+ `# W0 d' e" \4 h
. c1 C+ B8 z. M1 S4 A
) E( r7 n$ V! S. M5 W1 w3 w( ] 基础信息
* G) C4 ]( V( d8 J# M
" a+ j* |9 ]# n* \9 c& O6 D+ j
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 . }8 w9 {. B# Q( P v) E$ n
; j8 Z( `1 \2 P& E7 V( Z6 V
! c" X: ~8 @4 T: J- ]0 {
7 t1 R. G) X# v: e8 \& Y " P. F( e3 H4 G8 O3 Z# Y" B- e- g
8 E3 y* k7 n* B+ n a# j
0 ^2 W2 X3 i/ M$ g) ^3 O, N! F. } * p6 ~+ H4 U: m- R6 O$ X+ s$ d- {
% ^/ Y& K- Z* [. `0 y2 G P 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
" Z4 e( N8 ^( d. |% h! v 1 b8 ]/ k: Q9 T+ r# ^
# B2 W9 S; h( L% U0 {' X) z; @3 c ' I3 c3 V6 ~+ }! f" m, B/ b5 G
3 u& U1 n' `- j/ n* l
! x. g) G9 s/ d6 t0 a' P( ~
; V/ \4 o* k. m9 J7 ] - w; j; E0 {, j# t& o
/ ]. P9 z7 }/ E! G% A' P 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 " F& M |" U) N- n
$ e6 S/ H# n( r/ s2 ], V8 q6 q0 k4 U! K8 [8 ~; }- @% x
) Q) ?# a5 E2 F% d. C. j 5 Y3 w5 [: J+ S: D0 q- z7 `' c
* p( U" s, F0 E6 U$ B+ |9 W$ ~ # r# x* \* g# K: L
" K" v1 R6 H, E" V! W! G. y o r- r: x- Q. |0 I) B3 `- U, V9 H
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 / Y9 Y4 b, \# ?6 Z& ^
& z" F+ G, N3 G
! v$ C o3 ^. F! P
8 A4 k) ?# @# u: l. _( h8 h; C
* r) M4 ]3 C7 {6 i+ r" D" w1 C8 ?' _5 C! \. `$ q/ Z
: K# G. n% l5 @& _. G, v
* @) {2 l1 }7 }) [+ [0 l3 `. X* Z0 M
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
# m. J0 o( Q" P9 g* j7 M
. o5 H" `( e5 b. [" k2 d* n/ I
1 j) s; F, F6 L9 ^7 C
. z3 s& i& G% S# X9 K# \) T0 y; K
- {0 c; G% M F" U
3 R- D+ D9 Y- j+ B7 G9 { / q) |* h5 ?1 }0 f! D5 T* t* `) \2 j
, g5 f* q7 M* H6 P A0 w2 Y) I
5 r( q% C( A) h# ~& K
$ {3 S/ N0 W8 V8 A: {
8 r% ?1 Z, N+ B9 ~) t
5 _; W/ c- _% M" `3 R3 J 签名信息 R1 R, j1 F: W* N" k l$ z- `1 l
7 e" D. k+ K7 F: b' \$ d! W
9 x% w% i1 a: T9 T ~" G 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
# R" w3 j; u) X; h1 y, A5 ~ 3 J u$ x. D2 P+ M4 ?6 b' \, b
# [( g& `& r" c5 N6 Y; C& k: _+ Z 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
2 U5 i9 a+ c( k) k9 e5 |: m8 s
- O; f3 U7 I. Y* ~ u# E1 d3 M/ z l- ?- u" x. @7 ?) J/ x1 Y% q
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。
, F1 C# H2 `& K0 f: b " @8 t5 h9 V$ B6 `/ v& n& {
! q+ I6 L( |+ S7 Y* H' C' { S+ Q" e8 f2 O
3 r j# p0 a( q2 y5 U
3 y: A3 R I6 T4 u" c* z( }* E l7 {7 l+ C( u- l
" d( O$ ~2 N6 w3 u3 ~
; P8 r, G1 d3 w
& J( T# h& t& ^% o
android签名的数字证书的一般都是采用 X.509的国际标准。 9 f- d, J! y# p, o3 d3 e" J
! n( A" |1 O+ X5 i9 {! v3 k6 I. h# s- }4 }$ X7 \
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
3 p( R# E4 e2 S i6 L" e, X( b- y $ \9 D( g; a! U" a
4 S/ @, x. o* p& V2 Y 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 * Q' @7 X. D7 O6 u1 L) \; V( g3 D
" A8 m# h" O, U6 b
/ k1 V3 [3 X, j
6 m# `+ Q5 q# T+ G- M* N
7 k& n' g% S2 S+ T; i+ r& O$ `- S' }3 }) s0 ~' a! K
0 d" y- {1 _0 W' Z
) ~6 N/ y ?! M# L J, W
3 c, ^9 Z, ], C5 J B- R
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
' g/ L; m& X0 @' {/ i & X0 S" o, c% i6 t/ y( I
7 _. T4 S7 A0 \5 H( O& i, Y5 y3 G 6 V* X5 v/ x2 G8 ]; J9 ^& {" H- j
9 `' f* J: }% `
7 R8 \: ^6 T& _5 |3 N2 p! M1 ^; p9 N h 、 : w2 d+ R% }% T8 S) d1 k) o
& ?4 m! p+ m; t6 m' ~! ]
t9 w9 C5 G% S/ m
" }- P- m. k$ v( ?$ H
3 ~ M/ Q5 k5 `
, w" @8 s% |1 {6 W3 k' @ 权限信息
% D1 ]- W' }1 @ 1 j. l3 e% G& B, c p+ q* }/ U
4 S3 i5 e2 `: B4 s5 a' V- n. o 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) , n, X3 G9 ~7 [9 R1 p8 Q0 S
0 s: z% `# N0 r- @- r& N5 G* g* ^1 S* ], g+ O6 e! _7 o
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
+ z( _( h# K( \! n$ t 5 A& w/ I! W9 U
' r5 ?! w7 ` X
# t/ j F3 y" O& ]$ C
# A% i5 I* q* ~% Z& s0 g% h. d U9 U& }0 W& y
+ r, l5 ~% I' f* ~- B" F3 e
6 e# y$ o. J0 |( o! a: [$ h" `: p
下面对这个APP的所有权限进行详解下:
5 A* C9 j6 v2 Q0 A
; q# O$ }/ Y D/ p' N7 _ r9 ]- o! K
android.permission.INTERNET :访问网络连接可能产生GPRS流量 3 P) u; {8 r8 |2 Z i b
2 Y7 X9 W6 p0 C
4 Q- Y3 x$ U/ j p a7 _1 E, Y
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
2 d+ m& }, }+ U0 m0 _$ ^ [2 e6 T6 H; K7 b6 Z
. Q! ]: _9 w1 x; T' i! G) V
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 + M% w! c/ }/ W0 L3 j& D# |
# j3 `5 V8 y$ B! n! t$ W1 s4 U; l' A- `0 P4 _; i6 @3 D8 p' m
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 9 d# l" J+ [/ A' x8 D0 r
/ [4 }: H: O1 \9 A. ~3 [5 U. [. X- R @- a
android.permission.WRITE_SMS:允许应用程序写短信内容 - B$ `+ ]) V7 N- S0 H
( V4 `! N" J' D0 t2 m
$ b/ o t4 }' h" E) \ android.permission.READ_SMS:允许应用程序读取短信内容
" t) J3 L' B7 f# ~
& {6 h0 |/ R# @. X# P o; I; h% i1 t+ O
4 e L# c( _. t" B) J B( z android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
/ W; _7 Q/ ] _! c
2 l9 E: d4 x1 @: Z5 Z* Y: y5 o2 M
" I% S) d# H9 p2 G% b! J$ _ android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
+ `4 G/ ^% w# F4 K) I
* Y0 X8 |( i( R. F1 H" X0 z8 F& e- k0 m% Z# r9 V$ n# r' r
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
9 @! R' I+ R1 Y ! W& x8 @% H5 k. X
8 `# e5 z' P8 B
android.permission.VIBRATE:允许振动
! u, t7 [' s- I0 m/ I& |. b
( t/ F& X1 E5 v% N9 V0 t* M% M! t
android.permission.READ_LOGS:允许程序读取系统底层日志 8 }, p5 l5 }% }$ n0 j) j A
0 [" `0 _4 c: Z0 ]' i
# Y$ T4 B5 m( q. n android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 $ r# U9 y, r: S* e2 B! @7 _ x
r R" R' @6 V8 u3 R/ M
v, C3 R3 ~7 h1 Y9 j( v- s1 {
6 W# I& l* ?. l0 q+ Z% | ' O& n5 C6 ?) K& P, Q9 R6 r/ k8 n
Y: f8 `1 g% G( U. Z- P
功能信息
5 x; \9 l; r) G) H$ S) o& M
' I0 t3 ?8 W, m
7 |+ y" }+ n9 n% S! T; _- X: Q, g 5 u h7 [! D% X9 F! c8 |$ Q
1 b% E/ W h$ T* L0 f& i" s
! L& S w3 m5 |
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
! L: G. b! ?4 e+ i 9 C/ i* S" ]2 ~! @9 t- f
* B. k# w: n2 G' F$ I6 t% z' X o3 M! k
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
# n% e9 j* ]( r" j6 ~
9 @: A+ x7 M9 X) b- |$ }* Z* \7 M( f: M, | e* k$ R5 |
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 7 x4 L; x! h3 V* ?8 i& G
. Q! X6 J4 u( Q7 c- E
1 i9 y2 K% b' y: K' i
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
5 O0 n9 H6 y1 X9 }( P" e% [ 5 x, W; b+ U# H- u
" e# N9 ?* @* l9 n" C; |
Q3 L+ T% m3 b% u" Y+ K
3 ]' e9 q8 k3 b1 L
4 o6 Z& Q$ O( g# o
0 n3 k- Y6 Z+ ?/ W# A + m' ` L: Q+ a2 \- Q" R# h! D
* |# P9 b9 m& D1 v0 b3 s4 X3 c
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 " ], {0 G; q$ t1 [) ]5 t$ m
+ V, u' j, G% H& P
/ @) l# u0 i7 l8 { ' F+ ^1 a- V; x; S# p
_) j. k' s |
) q: L+ H) W4 @5 C4 P7 a: u# m " g/ u: [8 J/ F# j" u7 G6 P
0 M j. K S4 ?0 B W1 L! u: _7 e
4 i, Y; O t' m
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 * l7 K; m4 K3 h4 j
- t3 z8 S" k6 [2 |2 g# |
2 e2 n* s! ~4 \
& K+ _3 o9 }. N0 W+ I |
3 j2 @ r6 s# D) ^4 N6 z8 x9 `4 T4 j& A D
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 ) `8 R- Z5 }1 V+ b" ^+ a
& d/ t( ^- C' k' k1 U
4 p( I9 a a, k9 b ; _8 X; c, i: `3 i+ E$ d' A
3 C( A2 r7 V+ a# }$ A
8 P# d8 ?) I; R
3 A: i4 `% B; r, \6 t " y/ ?0 r, v/ R) @/ B( i
. h- y& [ Q J8 a; L X 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 5 ^- g7 B; ]2 w- f) L
+ @+ W& c: V3 H! O2 J& z$ r5 I( B# o5 _2 s
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
9 h, s* d* `6 p! B2 M* t 7 }7 {9 l$ D3 E0 C* ~: m. G
1 T8 G" f$ y) p3 T; p( w: M( n
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 8 [2 U/ a( h7 {3 u$ C1 W
0 n% `7 g7 B8 p( K8 R
3 E' G' f3 ~, \3 i 开源的luasocket代码可以参考学习下
. F( y" o6 i9 s
8 f+ K e3 L' ~! L, E3 x
" W C, s2 E! Q https://github.com/lunarmodules/luasocket 7 s/ h0 c) v8 I
1 b. Q+ f' N, Z5 f+ y9 ]9 _8 v
2 [ S( u1 b6 M! d+ P https://github.com/fengye/luasocket
: P/ f& e8 M7 m' L ' r/ ]9 _; u* }; X
( B- ~% h! J* `2 R% t
/ l, V- N' ~% `1 S5 F
; [& L6 a5 f( y9 T! w7 b; K; \; x
" b N0 z/ @5 \: i% d
% ~! R/ |/ r# S! f- x3 R
9 |+ I0 c$ h# b 1 ^* o& v5 s0 Z
' w5 O- |2 K1 `; D+ c$ y$ N. B
- [# i* }! X d" D0 j
/ D) W7 u9 l; F, R. P9 e- o, q
$ z6 b: [- ?1 @/ G4 \, G1 Y \& ^* D3 E
总结 & ^1 e; j3 i4 N% z0 R; W
0 L7 d" K5 t9 [- f: k, n" Y+ Q/ e
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
8 ^7 Q- v' y6 }) L" }: T: } , [) I5 \) _( _
& h6 \% C9 F, b1 U" ?5 P
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
9 e4 O5 ^/ P# _/ P7 ~9 c- a" K ; i( `% e: l" ?3 F0 F4 C8 s( x
2 q2 Y0 z, Z( i* ^' l 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。
% A: y" ?: w. _& P- B+ r% y
4 }& P$ `$ x- D% }
( a, ^! \3 `3 s1 q7 w* N 结束 & g! G' Q) p; B* b: S9 S# B9 ?
+ ~) A4 H g* O4 Q! U
6 n6 D3 v* ^* j5 n* ^
【推荐阅读】
4 Q+ d% V* V& i) {) C+ u. `) [0 m% Z
: t& S+ V: x8 L' }! _5 N3 ^
; Z" [6 P9 C) v) t9 u 对吃鸡APP的分析 4 ^+ B7 T3 N* C
# v: q6 h. `& |
: L$ T0 i% a0 k" R( E# a0 E$ Z 你需要了解的APP安全
) f# v: }; P- Y- Z/ u' v) J; X- D# ] 5 g0 z6 D' c i9 n0 \8 S1 u D
% s4 ]' j% f) w" j 你需要了解的APP安全 - F5 C2 ~3 j7 o$ c3 C& s* j' _7 r
9 k6 Y8 h6 l' K5 ^* `* y D, a6 R1 ~5 E d8 n5 m
, } I5 m$ p9 p |