爱多多 分析

前言 #

放假了,得去挣点学费,遂进厂,厂里的app,越权漏洞和信息泄露,以及基础的逆向分析

注:以下内容仅供学习和参考,请勿用于违法行为活动

登陆 #

应该是加密了,并且有key,app有壳,xx御安全,我用的frida-dexdump -FU脱几个dex出来

用jadx打开不错,改用GDA,网上有免费版

这里一个一个dex的搜,出现在classes02.dex中

image-20230509091845206

其中key是由你的工号,用异变凯撒变换,工号和密码在so中完成加密

image-20230509092050306

可以先hook看一下传进去的值,在GDA这个工具中可以直接右键函数可以直接hook,还是比较方便的(提前在adb中启动frida)这里打一下码,见谅

所里面非常简单,没有混淆之类,但是把传进去的key又做了一次异变凯撒变换,再进行des cbc加密

看到一个字符串,不免想到是iv,(函数名就是DESencypt)

image-20230509092527547

不过后来我试图重写时发现,加密内容非8整倍用0字节填充,结果不一样(但不影响下文)

用py复写整个登陆,可以上号,我发现返回包中尽然没有任何维持身份的东西(就很奇怪,登陆就是个摆设?)

信息泄露 #

  1. 身份信息泄露

    在访问我的资料,发现从服务器上请求中参数值需要工号(注意,以下信息量爆炸,统统码住)

    注:据我像老员工打听,工号就是按照顺序来的,工号起初设计应是考虑了1000w的人(已离职工号是已使用,不会在重启工号给别人使用,该洞即可遍历所有工号,但是是一个工程量巨大的事情)

    image-20230509093801861

  2. 薪资卡信息

    访问薪资卡,会要求我们输入登陆密码,还有一个摆设本地验证码,获取信息,请求如下

    image-20230509094613960

    同样工号加密了,搜索易得java 层DES加密,key is fga2dfe@

    image-20230509095013721

    拿到key,对返回结果一统解密,泄露银行卡卡号(个人),开户行,姓名,这里就不放图片了,很暴力

  3. 人脸图像

    进入厂区有些时候需要刷脸,也可刷厂牌,用户可以自己在app中采集人脸,(进厂前已收集一张)

    先获取图片路径和图片绑定的uuid(码住)

    image-20230509103521432

    随后向接口getImageByUrl获取图片,我试图尝试任意文件读取漏洞,但是似乎失败了,fuzz读取/etc/passwd和/etc/shadow返回空,其他404

    人脸图片在app中不是每个用户都有(有的自己删除了),影响:都有了你的sfz_id和name、phone,再加个人脸图附魔不过分吧,别人可能干一些非法认证,绑定一些人脸业务

越权 #

额,我也不知道这算不算越权

回到头来分析,好像楼掉了些甚么,看了看验证码,修改忘记密码之类

其中忘记密码是在登陆界面,会先输入你的工号,会想服务器获取工号绑定的手机号,app上是对手机号的中间4位打了"*“号,我一看包,卧槽,这么暴力吗,响应包中就是完整的手机号(又是一个任意信息泄露),

你以为就这,之后向服务器请求发送验证码,发送过来的验证码我发现竟然在请求包中(即验证码在本地随机产生一个6位数)

image-20230509100448703

我马上即想到任意用户密码修改,因为验证码由我们所控制,后来我发现根本没必要

接下来重置密码(只需要填写新密码),发现新大陆(超级暴力)

请求包中的内容pwd和EmpNo(工号)是上文提到的so中的加密方式,key也同理的

image-20230509100811427

那么就出现了,任意用户密码重置,实测我朋友已成功

更加暴力的 #

众所周知,厂里是有储物柜的,有电子锁和自带钥匙的那种

这个厂有部分员工是在使用电子锁,开锁方式(厂牌和手机上的这个app远程开锁)

结合上面我们已经有了任意用户密码重置的漏洞,网络黑客直接侵入现实

  1. 获取储物柜位置

    像服务器发包,只需工号,返回储物柜位置,没有则null

  2. 开柜

    原来没有那么复杂,开柜需要输入密码,密码是本地校验(逆天?),后像服务器发送开柜指令(只需工号),原来是我多想了

    image-20230509102905236

后记 #

这个app现在对我而言基本没什么安全所言了,而这些信息都是在进厂前就被收集了的,但是厂商对待你们的信息那完全就不当回事

如果有看官看出来了是哪个厂,也请莫要声张,厂商大概是不会去修复这些漏洞的,以免造成大规模的信息泄露及物理安全

有出现错别字见谅,因为要睡觉了

以上内容仅供学习和参考,请勿用于违法行为

2024 8 13 晚 #

分析爱多多,发现稍有变化,但不大。数据仍然可取,稍有提高安全意识

现简要记录一下

java DES CBC Pkcs5 #

固定key1 fga2dfe@,iv相同

变化key2 异变凯撒编码,初始offset 10 得到key,iv相同

API #

base info #


curl --request POST \
  --url https://b2e.aservice.foxconn.com/APPService/UserInfoService.asmx/GetEmpBaseInfoV002 \
  --header 'Accept-Encoding: gzip' \
  --header 'Connection: Keep-Alive' \
  --header 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' \
  --header 'User-Agent: Dalvik/2.1.0 (Linux; U; Android 14; 23013RK75C Build/UKQ1.230804.001)' \
  --header 'charset: utf-8' \
  --data 'strKey=MBE?AG@F' \
  --data strModuleName=f74cf1512eada1cdd16a42b2e7bca585 \
  --data strFactory=7300 \
  --data strEmpNo=AkaoqKxxHLI0aDwTOFI9Ag==

部分参数解释:

strKey 上文key2 strModuleName EMPINFO md5 strFactory 随意4位数,已验证,不校验 strEmpNo 上文des使用key2加密

得到部分隐私信息,cardid 被打码了,通过下面两个api可得


strkey 固定 工号

curl --request POST \
  --url https://b2e.aservice.foxconn.com/APPService/EpidemicProtocolService.asmx/GetEmpBaseInfo \
  --header 'Accept-Encoding: gzip' \
  --header 'Connection: Keep-Alive' \
  --header 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' \
  --header 'User-Agent: Dalvik/2.1.0 (Linux; U; Android 14; 23013RK75C Build/UKQ1.230804.001)' \
  --header 'charset: utf-8' \
  --data strKey=qEUNqLLMOwcDuFwwPngLfZiet6zhdWGzLUPPaJIptvM= \
  --data strEmpNo=C7949572

strFac 上文随机4位数,只不过加密,des,key1 strProjectName name des key1(name 来自与上下文得到,已知一个SMT-NPI-DC/DV/DJ,可以用来测试) strEmpNo 工号 des key1

curl --request POST \
  --url https://b2e.aservice.foxconn.com/APPService/NewNDAService.asmx/GetEmpBaseInfoNew \
  --header 'Accept-Encoding: gzip' \
  --header 'Connection: Keep-Alive' \
  --header 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' \
  --header 'User-Agent: Dalvik/2.1.0 (Linux; U; Android 14; 23013RK75C Build/UKQ1.230804.001)' \
  --header 'charset: utf-8' \
  --data 'strFac=+GfFCIBe9qs=
' \
  --data strProjectName=jtJI/32rr2YKxl4Je6jCyDWT0vKA9gF/ \
  --data 'strEmpNo=Rdk1m+3s59mSnkSUUlS+zQ=='

nda 协议 列表 #

des key1

得到的同样des key1 解开,去掉前面的序号啥的,再加密回去,用作上文GetEmpBaseInfoNew 的参数

curl --request POST \
  --url https://b2e.aservice.foxconn.com/APPService/NewNDAService.asmx/GetEmpProjectStatusNew \
  --header 'Accept-Encoding: gzip' \
  --header 'Connection: Keep-Alive' \
  --header 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' \
  --header 'User-Agent: Dalvik/2.1.0 (Linux; U; Android 14; 23013RK75C Build/UKQ1.230804.001)' \
  --header 'charset: utf-8' \
  --data 'factory=+GfFCIBe9qs=
' \
  --data 'strEmpNo=Rdk1m+3s59mSnkSUUlS+zQ==
'

柜子 #

开柜子, emp_no用 key1 token 固定

curl --request POST \
  --url https://b2e.aservice.foxconn.com/APPService/CDLockerService.asmx/OpenLoker \
  --header 'Accept-Encoding: gzip' \
  --header 'Connection: Keep-Alive' \
  --header 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' \
  --header 'User-Agent: Dalvik/2.1.0 (Linux; U; Android 14; 23013RK75C Build/UKQ1.230804.001)' \
  --header 'charset: utf-8' \
  --data emp_no=aEjJuoP3GWoorfnsI6Z47A== \
  --data 'accessToken=vNeYI2_w#tWQotRwQ'

开柜子 api1

参数要的比较多

emp_no key2 accessToken 固定 auhToken 需要密码,通过另一个api给的,本地持久化,可以说是增强的一点了。并且看不出来是什么加密或者编码的token

curl --request POST \
  --url https://b2e.aservice.foxconn.com/APPService/CDLockerService.asmx/OpenLokerV001 \
  --header 'Accept-Encoding: gzip' \
  --header 'Connection: Keep-Alive' \
  --header 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' \
  --header 'User-Agent: Dalvik/2.1.0 (Linux; U; Android 14; 23013RK75C Build/UKQ1.230804.001)' \
  --header 'charset: utf-8' \
  --data strAuth=MBEAGDFH \
  --data 'emp_no=26Sc7u31sW2Qkyz4rCrNCg==
' \
  --data 'accessToken=vNeYI2_w#tWQotRwQ' \
  --data authToken=Vzxurzz281Rb8rNkmrtYpvVsMI8/fROS2pAaZSPUVsL9Bejde9Q3mg==21936136

获取柜子信息 参数上文同理

curl --request POST \
  --url https://b2e.aservice.foxconn.com/APPService/CDLockerService.asmx/GetEmpLokerData \
  --header 'Accept-Encoding: gzip' \
  --header 'Connection: Keep-Alive' \
  --header 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' \
  --header 'User-Agent: Dalvik/2.1.0 (Linux; U; Android 14; 23013RK75C Build/UKQ1.230804.001)' \
  --header 'charset: utf-8' \
  --data 'emp_no=Rdk1m+3s59mSnkSUUlS+zQ==
' \
  --data 'accessToken=vNeYI2_w#tWQotRwQ'