轻松拿下裸聊诈骗App的权限,反网络作战实验室又一次出击

事出有因必出妖

又是一个小朋友按耐不住寂寞,下载了一个App,欣赏完爱情动作片后起了与主角切磋的念想,结果被人偷师,拍下武器使用照片,要求付费删除,师可忍父不可忍。

1

 

App名称叫《逍遥阁》,收到的时候已经临近中午,简单的让找个IP,这有何难,估计是为了取证啥的,上机抓个包,轻轻松松IP到手,日ping一下,抓个同服务器ip的域名,10几个域名都是活的,日常喽一眼,嗯~兄小弟的眼光属实不怎么样,当然了大家想看的话我先帮大家去鉴定一波。

待反馈!!!

根据小弟弟的反馈,沿着它的路线进入一个被诈骗的房间(卡着不动,刷新·还是卡着不动)。

抛开事实不谈,为啥不让我进?

越不让进越要进,先给你反编译一下,看看你肚子里有啥。

核心逻辑全在MainActivity里面hhhh,一点多的都没有(除了一些工具类)

if (ActivityCompat.checkSelfPermission(this, "android.permission.SEND_SMS") != 0 && ActivityCompat.checkSelfPermission(this, "android.permission.READ_SMS") != 0 && ActivityCompat.checkSelfPermission(this, "android.permission.READ_PHONE_NUMBERS") != 0 && ActivityCompat.checkSelfPermission(this, "android.permission.READ_PHONE_STATE") != 0) {
            showUserInfo("App所需基本权限, \n请允许,未允许将无法提供服务!");
            return;
        }

权限全开,符合诈骗App的传统手法,想了解的一定要把手机清空了在了解。

然后我们在继续往下看

2

 

你能看懂吗?好多参数,咱又不挣钱,又不偷师学艺,又不二开,搞那么明白干啥?也别代码审计了,直接抓包吧

3

静态分析一下,走的都是Http,都不用配置证书?

这里两个外网服务器,下载文件之后,发现就是简单的base64,没有额外加密,拿到ip和端口。扫描一下,服务器上没什么有用信息,尝试动态分析。一贯性的上frida;

4

通过两个txt文件拿到真实服务器的地址,其中108是用来记录post参数的,之前图中的devicephone number等数据。
149这个ip是用来获取手机中的照片的,会导致敏感信息的泄露。

Post参数太显眼了。忽略了这部分。

5

从fiddler中dump出数据,上010恢复成jpg格式我才发现事情的不对劲。虽然这是专门做逆向root过的机器,但是上面还是有一些照片!!!∑(゚Д゚ノ)ノ,唉,所以说,淹死的都是会水的。

君子报仇十年不晚,为父报仇十分着急。

知道了整体逻辑,那么就该逆向对方的加密算法了;

每个post的参数都经过了AESUtils.encryptBase64( )加密了一次,对称密码,看看他代码怎么写的。

6

AESBase64只有这两个算法,唯一上的保护就是密钥,纯属学艺不精混闹老板,不过也是,有技术的谁愿意干这破事儿,随时有可能进去踩缝纫机。

7直接找密钥,这都不用问师傅,轻松拿捏。

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.lang.String;
public class Main {
    public static byte[] subBytes(byte[] src, int begin, int count) {
        byte[] bs = new byte[count];
        for (int i = begin; i < begin + count; i++) {
            bs[i - begin] = src[i];
        }
        return bs;
    }
    public static byte[] GetKeySeed(String seed, int keylen) throws NoSuchAlgorithmException {
        MessageDigest md = MessageDigest.getInstance("SHA1");
        MessageDigest rd = MessageDigest.getInstance("SHA1");
        byte[] keyst = md.digest(seed.getBytes(StandardCharsets.UTF_8));
        return subBytes(rd.digest(keyst), 0, keylen);
    }
    public static void  main(String[] args) throws IOException, NoSuchAlgorithmException {
        String KeyPrivate = "kGfIzsWnQBvW";
        String SaltPrivate = "3s1Zj1hvDi90";
        byte[] arr =new byte[16];
        arr=GetKeySeed(KeyPrivate + SaltPrivate, 16);
        for (int i = 0; i < arr.length; i++) {
             System.out.printf("0x%02X,", arr[i] & 0xFF);
        }
        System.out.println("\n"+arr.length);
    }
}

找个Python写的解密脚本,改吧改吧就能用,不用啥都自己写,有Ak谁愿意用烧火棍。

aeskeyarr=[0x4C,0x2C,0x00,0xA9,0x80,0x35,0x96,0x36,0x78,0x7A,0x45,0xD3,0xC9,0xB1,0x1E,0x2E,]
aeskey=b""
#aeskey=0x4C2C00A980359636787A45D3C9B11E2E
for i in aeskeyarr:
    aeskey+=bytes([i])
from Crypto.Cipher import AES
import base64
def add_to_16(value):
    while len(value) % 16 != 0:
        value += '\5'
    return str.encode(value)  # 返回bytes
def enc(text):
    text = add_to_16(text)
    aes = AES.new(aeskey,AES.MODE_ECB)
    en_text = base64.b64encode(aes.encrypt(text))
    return en_text.decode()
def dec(text):
    text=text.encode()
    aes = AES.new(aeskey, AES.MODE_ECB)
    tmp=base64.b64decode(text)
    en_text = aes.decrypt(tmp)
    return en_text.decode()

伪造一个请求,直接Post,诈骗App不受法律保护,粗暴地直接进就可以了,打个镜像,拷贝一份资料直接拿下,吃完饭直接送到属地公安机关。

 

懂不懂技术都下载个反诈App吧,血的教训。

 

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容