【JS逆向】新浪二手房登录RSA | 每日JS

已迁移平台:segmentfault,搜索 erma0
换平台了,简书发什么都锁定,广告一堆,趁早倒闭吧。

第四天

JavaScript逆向练习4

0x01 目标网址

http://j.esf.leju.com/ucenter/login

0x02 定位JS

1. 随便输入账号密码(经纪人账号登录),点击登录,查看提交的参数

1.png

可以看到,在登录包http://j.esf.leju.com/ucenter/login里有加密过 的password参数。这个就是下面要找的加密。

这个包还有一个参数ckey,是在网页源码里生成的,每次请求都会更新这个值,做登录的话,每次都去取一下就行了。

2. Ctrl+Shift+F调出搜索面板,搜索password,结果中稍作分析,发现有前面几个结果都不是目标域名下的js文件,剩下两个打开看看。

2.png

在所有可疑的地方都下断点,当然,自信一点可以直接定位到图中这个地方,毕竟一眼可以看到$("#password"),找到这是用来取明文密码的值,而且还有RSA这样的关键字。

3. 直接在可疑的地方都下断点,重新输入账号密码验证码,点击登录,JS被断了下来(就是上图中的位置)。

var t = $("#password")
    , i = $.trim(t.val());
if (i.length < 100) {
    (0,
        l.setMaxDigits)(129);
    var n = new c.RSAKeyPair("10001", "", $("#pubkey").val())
        , s = (0,
            c.encryptedString)(n, i);
    $("input[name='password']").val(s)

加密函数就是encryptedString,两个参数,第一个是RSAKeyPair返回的对象,第二个是明文密码。

而前一行的RSAKeyPair参数$("#pubkey").val()就是公钥了,直接console里输出一下,复制出来。

F11跟进,再或者鼠标悬停在断点处函数名RSAKeyPair上,点击弹出的内容,也能跳转进去。

3.png

加密函数的核心就是在这里,把这段整个290函数全部拿走。

4. 上一步进去之后,发现同时调用了291217两个函数,直接在这里搜数字+冒号,就能定位到这两个函数定义处,全部拿走就完事儿了。

0x03 改写JS

1. 仿照图2的位置,写一个调用函数。

function test() {
    setMaxDigits(129);
    var n = RSAKeyPair("10001", "", "BC087C7C00848CE8A349C9072C3229E0D595F817EDDE9ABF6FC72B41942A759E97956CE9CB7D1F2E99399EADBACC0531F16EAE8EFCB68553DE0E125B2231ED955ADBF5208E65DC804237C93EB23C83E7ECDA0B586ECF31839038EE6B640E0EEC5FF17D219FDEA33E730F287F0D384C74A53DFE1F91ACC63C7C92039A43AC6E97")
    //第三个参数就是上文提的公钥,console里输出复制来的,直接替换在这了。
    var enPass = encryptedString(n, pass);
    return enPass
}

2. 把扣出来的290、291、217三个函数放到调试工具里,再开始改写。

先把三个函数改成标准的函数定义的格式。

function i_217(e, t, i) {
***
代码
***
}
function i_291(e, t, i) {
***
代码
***
}
function i_290(e, t, i) {
***
代码
***
}

同时把每个函数内部的

        "use strict";
        Object.defineProperty(t, "__esModule", {
            value: !0
        }),

这段代码删掉。

其中290里有217 291的调用、291里有217的调用,改成正常格式。

//290里的
var m = i_217(e, t, i)
    , s = i_291(e, t, i)
//291里的
var c = i_217(e, t, i);

3. 此时加载运算,会出现各种未定义和对象不存在,因为现在的代码里并没有调用加密代码,而且抠下来的3个函数都没有返回值。

所以先给每个函数加一个返回值:在函数尾部加上return t(因为函数都是在操作t

再在一开始写的调用函数里,调用290,因为没有参数可以传,所以顺手把290的参数给删掉。

function i_290() {
    t = this
    e = ""
    i = ""
    //其他代码
}

function test(pass) {
    t=i_290()//调用加密核心:290
    //往下的所有函数、对象的调用,都是对象`t`里面的了
    t.setMaxDigits(129);
    var n = t.RSAKeyPair("10001", "", "BC087C7C00848CE8A349C9072C3229E0D595F817EDDE9ABF6FC72B41942A759E97956CE9CB7D1F2E99399EADBACC0531F16EAE8EFCB68553DE0E125B2231ED955ADBF5208E65DC804237C93EB23C83E7ECDA0B586ECF31839038EE6B640E0EEC5FF17D219FDEA33E730F287F0D384C74A53DFE1F91ACC63C7C92039A43AC6E97")
    var enPass = t.encryptedString(t, pass);//这里如果传入n的话,会提示'chunkSize' 为 null 或不是对象
    //传入t的话就OK了,因为所有函数、属性都在`t`里面,同时上面的`var n =`也可以删掉了,因为没有调用,当然不删也没有影响,慢慢熟悉JS语法。
    return enPass
}

此时就能正常运行了

4. 调试结果

0x04 Python代码

PS. 其实可以尝试直接调用Python的RSA加密库,如果这个JS没改过,结果应该是能用的(也就是另一个思路:JS功能可以通过所使用的语言直接实现)。

# -*- encoding: utf-8 -*-
'''
@File    :   0x04-j.esf.leju.com.py
@Time    :   2019/12/10 20:19:22
@Author  :   独孤孤独嘟咕噜犊子
@Version :   1.0
@Link    :   https://www.jianshu.com/u/6a4c6ef97be7
@Desc    :   新浪二手房登录rsa
'''

# start

import execjs
import requests

# 初始化参数
HEADERS = {
    'User-Agent':
    'Mozilla/5.0 (Linux; Android 8.0; DUK-AL20 Build/HUAWEIDUK-AL20; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.132 MQQBrowser/6.2 TBS/044353 Mobile Safari/537.36 MicroMessenger/6.7.3.1360(0x26070333) NetType/WIFI Language/zh_CN Process/tools'
}
s = requests.Session()
s.headers.update(HEADERS)
loginURL = 'http://j.esf.leju.com/ucenter/login'

# 登录参数
username = '15555555555'
password = 'ermao6@qq.com'

# 加载js
with open('js/0x04-j.esf.leju.com.js') as f:  # 坑0x01 相对路径前面不带/,带/不报错但读不出数据
    jscode = f.read()
ctx = execjs.compile(jscode)  # execjs载入js代码


def get_ckey():
    url = 'http://j.esf.leju.com/ucenter/login'
    res = s.get(url).text
    ckey = res.split('name="ckey" value="')[1].split('" />')[0]
    return ckey


def login(user, password):
    enPass = ctx.call('test', password)  # 通过call调用js代码里的函数
    ckey = get_ckey()
    data = {
        'username': username,
        'password': enPass,
        'imgcode': '',
        'ckey': ckey
    }
    result = s.post(loginURL, data=data).json()
    print(result)
    return result


if __name__ == "__main__":
    login(username, password)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,039评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,223评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,916评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,009评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,030评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,011评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,934评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,754评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,202评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,433评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,590评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,321评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,917评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,568评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,738评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,583评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,482评论 2 352

推荐阅读更多精彩内容