# N0 h( E' n7 k" Z9 M$ O 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
0 V3 k6 @! V2 \' h& _5 w
* U. q: j. i( D8 A, |+ @
/ j- V( ~8 z1 P& }' d
7 k. k" n3 S3 J) j4 t! F下面就以开发者角度进行解析下这个APP的功能的实现原理。 ( q* ^) Z$ ]% Q5 S) F5 H
. d5 o, j9 P' P6 r- W) M: J9 ?0 U- m/ F) _ y
基础信息 7 L5 a% Y: a5 w! l# b5 b, \
( F3 p# ^: j4 p' F 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 6 h% K7 [ s) M3 B$ p
2 z; |9 a- x# c, [' ]2 j7 w! l
" d7 V( M* }- m2 y, M3 N
5 q; {7 m. z; e7 A9 D & p" y' _7 O/ g4 ?0 ]
' S/ ] u; ~3 l+ C6 Z& J: J; E 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 % I, z/ j5 V V# w: f# l! O1 G
7 a' `. o& a! m' a6 U6 w6 E7 t# x7 C& ^: e2 O
, E/ S' c; V7 H5 F
2 T+ s. O) E: U2 }1 p / T4 V6 u5 v7 ?# l) J
6 ]! P4 \9 h' P) ~7 a/ c2 D4 X6 a$ `& Z& K$ V0 V2 v 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 5 @' n0 M" V% {6 r3 T: g
8 H7 M0 _8 y* [
7 o! g* F. U$ O) {+ L3 c# x 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
& C# v1 ~3 M/ q2 a! S
1 F; c/ v. {7 \
9 O; E' z& [& k+ [4 y. {2 B3 T 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
0 q6 Q; A; t# A! ^
/ o) n9 B3 Z* ~$ I- N ' Z% E0 C7 d0 ^
! U* |: C, a: ~* E. n3 T2 I& e e! q$ u* D! A9 D# Y& {, G/ w 3 |3 X! s v0 l! { B7 [
9 W7 w4 o2 O" R) P4 o 签名信息 ! f \+ P; Y, M5 O4 b7 D4 f( H
7 Y5 p# b$ R( j N 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 % ^: @8 a& ` U) n8 @ e6 u: D: V s+ }
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
& j' |' V0 G3 u, |& m3 x" S: v" y3 L1 \' m1 C' n! e' k0 g 在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 * t& _ ?8 X4 E( L; A" k
9 X3 L6 m Y7 ^8 s# T- u
0 k, J3 I2 H$ ?1 i; J K$ K) c( b
android签名的数字证书的一般都是采用 X.509的国际标准。
8 }/ ^9 Y1 {# d* R+ D9 K 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 - l. y& z5 J: b: I9 s! u3 N @
1 M7 c$ [% E' vD3 g. K$ d. a2 x 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
! |! d. S4 H8 d: q! s5 s+ J' A- S7 A' E6 U. Y( ^. N
/ C" e1 o, u) T; E# o5 W
* ]+ X* W0 Y$ _/ V& {: L# f0 l6 o n同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 3 W l, B, r: Y1 \* f/ c
5 n f! c/ g+ ?6 Z2 y' [4 @- N5 {* q s) @( h
% ~* U5 a/ `; ^, R7 n- H" K 、 5 B5 H+ \% J9 o8 |3 @# a6 V. G
! @7 J( _: ? `" P5 S* C1 n. m3 G! y/ h3 ~6 O
权限信息 ; M! f) U4 _1 H, b# V* r! Z, W7 V+ O
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) / Z; b" m2 m+ z/ g* S1 b1 M+ F2 N. Q
8 L* ?% J! T* a, N4 U$ e: uandroid的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
; o" B. m& E" b
. p% y; C9 Q2 o5 Q+ w, b
; h0 y+ u. f" U) `# b! ]: M " H+ A9 z+ }( N2 F9 {6 G
3 n' e3 `; N' U. H; i+ \& u7 d/ l+ b0 N/ s7 @ 下面对这个APP的所有权限进行详解下: 5 G. e8 T' ]4 O0 i
( w4 c& R# N6 J( T: S) sandroid.permission.INTERNET :访问网络连接可能产生GPRS流量 9 C% R2 t7 R4 t7 ~3 Z
+ r' h N ]6 `: Y( \ R" J6 m6 Y android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 " S) g% P1 ~8 e$ a- e
E% S7 D* S0 U! x* G. I android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 ' f" N2 z5 v1 G6 A
. H. d; ?1 U7 c: X2 Z$ e6 Z) O3 X" g. p android.permission.WRITE_SMS:允许应用程序写短信内容 , }& |0 k( o. D0 j# j
; r: q1 V) c& }4 s$ J1 {+ d! `3 Z1 Z4 O, X. _" x3 A# B android.permission.READ_SMS:允许应用程序读取短信内容
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
G) c1 j5 ?* Y0 \ android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
$ D4 k1 Q' C, _* ]+ a3 t; v' U android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 % D* i) ]2 c9 Z
7 \. s! A( ~8 C3 Q- O6 Z3 q android.permission.VIBRATE:允许振动 , X6 }5 y% y' u: J1 n* h
9 B/ r) h9 z- g! F* v3 ^) |( r android.permission.READ_LOGS:允许程序读取系统底层日志 0 y" T2 o' H7 g" z; P ?* y
* ~2 E1 |3 s: O) f- R; [+ L8 Xandroid.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
7 T. Y/ s! I3 L# {8 d2 Q/ V- s* b! W7 W5 C
?' @8 q4 h7 v3 ^' G1 g9 O: _+ e& m7 z. Y. a 功能信息
+ m& Y. q O! X: }& x8 X # b* _! {8 @% R0 h9 g% X9 }% t' r
7 r* D/ m( f0 h, E+ F这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
! ^: Y b6 p/ J) ^3 Y$ q7 U5 t- \+ x: {4 D# V6 q Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 9 p/ l* ~- f' o
# }! K1 v1 _- q: y+ u- U 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
3 l9 ?" n# u2 T3 |' d+ y% X$ t3 S9 }+ r
# ]7 `' J4 W _3 \" P/ C
% C4 e0 J# K' v( m- B/ Q3 }" Q 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 - ^; O4 v2 b( S+ Y$ g7 |8 E: K3 {) g
# J, ^) U( M. T3 E: L: b; p2 m8 {- i1 }
( g* U4 m1 E1 z7 f) z: P- m
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
: r5 N: \( `$ s
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
4 o' q$ E' l) h
* x, c: R- U$ Y: ^! [- g. x
% f6 q! G% U' ^0 R 7 X2 [" c4 x/ S+ s
; \+ A, z$ j2 E1 {* u. q1 s7 r 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
) ]* Q- I( R9 F! T, E2 A. H3 Y LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 - |8 O1 K0 c4 Y5 Z
7 T. M/ b5 V% Q4 t4 t- Z r# g( y, J$ F7 {3 e0 ]- x5 ` 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 O2 ?* ~+ b! T
+ d& A1 e; q7 ~; x+ E; h' D6 g. c; W9 H6 j$ U+ T 开源的luasocket代码可以参考学习下
$ h( X g f: Y( [5 B7 v0 y9 p2 i! j0 Z" U* h7 `& ^% q/ n https://github.com/lunarmodules/luasocket " O$ x* Q) s! Z; Q" d
" { W' y: H: U4 c2 @: S' o8 o9 D* r https://github.com/fengye/luasocket
& Q; H# E+ p; w4 ^( W; ]( n7 H* n * A, A' N: _1 r( B, P
& ]# v) H0 \0 E Z0 T
1 Q: t$ x' ]' F) g9 N$ }, L6 H7 N
- O7 A9 k8 {* ~7 y5 H8 ]6 @0 w
1 S h6 w. T e' k $ s, I N: H# L# ]
' H- a5 Z! G1 X" @5 y k+ g; A& _, f! Q6 ^8 T3 [, |. c) ~9 s5 Y 总结 , } F6 I7 _7 _( B2 i+ h
% C& q" `/ @3 S' M0 L1 a5 U, z纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 $ H5 g/ r5 K' g5 R" C/ i6 a: ]6 k
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
- L& h3 G0 g( M0 x+ T: c% Y! W8 a# E; O; v; f 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 # n0 V9 ~" j: ^4 v+ c
7 Y" {9 P) p6 [6 K 结束
! u9 X4 a; K- ~4 {* o% A【推荐阅读】 8 `' Y* Q4 S) \& ]6 l- U; a- Q0 T3 _
n* |' T; m* F( T2 K* |% T- z% e0 H Y8 V7 U, ~8 X 你需要了解的APP安全
" ]6 W" J& r4 v/ j8 k; q
| 欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/) | Powered by Discuz! X3.2 |