HTTPS
这里先简单的说明一下https协议,简单地说一下什么是对称加密与非对称.
对称加密
这个其实很简单,说一句人话就是两个人在对话的时候使用某一种加密手段对聊天地内容进行加密,防止第三方获取.具体到案例中就是,我们先前写的HTTP服务器一样,在传输过程中,客户端和服务端传输的时候都是直接使用二进制进行传输的.那么对称加密其实就是在对那些二进制数据进行加密(你可以这样理解,那么我们同时使用的一套加密手段就叫对称加密,这个过程中我们都同时拥有(客户端与服务端)加密与解密的手段.那么我们通过的这种方式(加密,解密)加做公钥.
那么这样一来问题就来了,公钥大家都有,那么黑客就可以直接获取公钥拦截数据解密.
非对称加密
举个例子,打开一扇门需要两把钥匙,但是你只有一把,然而你的伙伴却有两把,那么这样一来就有非对称性,自然而然我们叫做非对称加密.最为典型的就是ssh连接.具体的方式可以从下面的简化图来看:
这样一来由于不知道服务器公钥,黑客无法直接对拦截后的数据解密,因为不知道公钥就意味着无法获取私钥从而解密.除非去攻击服务器获得公钥.
然而这样依然存在问题.
证书
此时虽然无法获得服务器的公钥,那么黑客依然可以伪造服务器公钥来获取你的私钥从而的到你的解密数据.(比如通过DNS劫持,当然哪有这样垃圾的肉鸡)
所有为了保证安全,https网站都会有一个证书,这个证书不仅含有密钥同时是由第三方机构认证的,可信度高.因此此时我们客户端访问的就是证书.
那么这样也就可以解释为什么在对https抓包是需要配置软件证书.
js调试
这里直接举一个实例获取stream的密码加密方式
打开F12进入调试
使用调试工具
现在我们大致发现了是哪个函数加密的,但是还是不知道这个函数具体和别的函数是否有关联,所以这个时候我们依然需要进行调试.这里我们先构造一个方法
function getpassword(password){
var mod="";
var exp="";
var pubKey = RSA.getPublicKey(mod,exp);//这里对函数做了简化
var encryptedPassword = RSA.encrypt(password, pubKey);
return encryptedPassword;
}
现在进行调试,我们继续通过查找再来找出RSA函数,这里直接全局搜素那么就不在演示了
拿到结果
python运行js
这里的话需要使用到execjs这个库
具体代码如下
node = execjs.get()
ctx = node.compile(jscode) 这里传入的是字符串
funname = "getpassword('{}')".format('123456')
pwd = ctx.eval(funname)
print(pwd)
此时就可以得到结果.