freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

摆脱Burpsuite的局限性——python调用jsDES加密
蚁景科技 2018-12-12 16:45:28 249289
所属地 湖南省



原创: 3s_NwGeek 合天智汇



目录

0x00  burpsuite的局限性 2

0x02  理解js中的“DES加密” 4

0x03  python DES加密模块——pydes 5

0x04  设计DES加密api 5

0x05  python 调用js——exeacjs 9

0x06  后话 9

0x00  burpsuite的局限性

今天的渗透工作中黑盒测试遇到一个DES加密的登陆方式,遇到了很多坑,最终是通过python调用js进行des加密入手了这个站。


图片.png

这次的情况是这样的,当我测试登陆的时候,发现发送登录请求时,验证码时可以复用的,原因是登陆失败时没有刷新session的值,导致图形验证码可以复用。测试验证码可复用的方法就是burpsuite抓取登陆请求包发送到repeater里面不断gogogogo,如果提示错误是验证码错误就说明漏洞不存在,但提示账号或密码错误就说明验证码可以复用。


图片.png

美滋滋可以暴力破解,但是看到post的数据是加密的,为什么我知道是DES加密。原因是仔细观察他的html页面源代码。发现这样一段javascript代码。

functionencryptByDES(message, key) {

  var keyHex = CryptoJS.enc.Utf8.parse(key);

  var encrypted = CryptoJS.DES.encrypt(message, keyHex, {

      mode: CryptoJS.mode.ECB,

      padding: CryptoJS.pad.Pkcs7

  });

  return encrypted.toString();

}

并且发现开发这把加密密钥也写进了html里面,看到发送登陆请求时调用这个des加密函数encryptByDES

图片.png

页面的js总是处处有惊喜。下面就进入正题说说我的pythondes加密爬坑记

首先第一反应我是想到使用burpsuite进行paylaod处理暴力破解。

以前遇到的一些md5加密,sha1都可以在这里处理payload,然后简单的就可以进行加密暴力破解了。

图片.png

但是在这里找不到DES、RSA、AES等加密方式,这就是burpsuite的局限性。我们再来看看有什么方法可以进行此加密密码。

0x02   理解js中的“DES加密”


图片.png

我们理解了他原本登陆的函数,我们可以在浏览器F12里的控制台,就直接可以调用他的加密函数。登陆加密的内容就是这个{"username":"admin","password":"12345678"}

encryptByDES('{"username":"admin","password":"12345678"}','232cb85*************cd354');


图片.png

发现跟登陆请求包的post参数是一样的。但暴力破解总不可能这样一次次输入的。

0x03  pythonDES加密模块——pydes

然后再想想了,看python有没有DES的加密模块的,有的。Pydes模块,这里有两个坑点。

这是pydes模块官方的使用模板

importbase64

frompyDes import *

Des_Key= "12345678" #Key

Des_IV= "" #自定IV向量

defDesEncrypt(str):

   k= des(Des_Key, CBC, Des_IV, pad=None, padmode=PAD_PKCS5)

   EncryptStr= k.encrypt(str)

   returnbase64.b64encode(EncryptStr) #转base64编码返回

第一个坑点,我发现这个模块只有des的ECB和CBC模式加密,并且填充方式只有pkcs5padding,和nomalpadding两种。我需要的是pkcs7padding!!!!

第二个坑点,正常des加密key固定是8位的,3des加密是16或者24位的。但是,页面源代码里给我的是64位!!!什么肥事!!!!无奈之下另外一个想法,去在线加密看看。

0x04  设计DES加密api

到了在线加密,找了三个网站,其他两个网站都报的是key位数错误,真的是要8位才行,但是唯独这个网站可以。之前再页面源代码中可以看到js代码DES加密方式是ECB模式的,并且是以pkcs7_padding的填充方式,加密过后是跟原来登陆请求包的加密数据是一样的。


图片.png

并且看到他的查询数据包,是post需要加密的内容并返回加密过后的密码的,所以打算使用python写个加密的api的http请求?然后提取密码再进行登陆的暴力破解。


图片.png

的确是可以这样加密暴力破解的。但是当我使用burpsuite快速的重放了这个数据包,就发现这方法不可行。


图片.png


图片.png

除非5秒请求一次。我在不知道账号不知道密码的情况下,还猜测不了用户存不存在的情况下,这种情况是不可取的。(如果存在的用户返回密码错误。用户不存在的时候返回账号不存在,可以根据登陆的返回结果来猜测用户存不存在)。

Api思路2

我们退一步回到该登陆页面再看看,当我们访问登陆页面的时候,一共额外加载了这几个js文件。

图片.png

进去看了下真正用于des加密的三个js是如下图

图片.png

我们可以点击它然后查看响应可以看到js的代码,都然后保存到本地,然后可以把他们写成自己的api。


图片.png

这是把他们加密的js保存下来再自己写的html页面(js顺序要正确)

<script src="core.js"></script>

<script src="tripledes"></script>

<script src="md5.js"></script>

<script src="mode-ecb.js"></script>

<script type="text/javascript">

function encryptByDES(message, key) {

var keyHex = CryptoJS.enc.Utf8.parse(key);

var encrypted = CryptoJS.DES.encrypt(message, keyHex, {

mode: CryptoJS.mode.ECB,

padding: CryptoJS.pad.Pkcs7

});

return encrypted.toString();

}

</script>

图片.png

于是可以写到自己网站的一个页面添加输入和输出的标签,我们直接可以输入输出加密结果了,但这还不是最优的解法,这样的话,还是要请求一次自己的网站再发一次登陆的请求。效率比直接再python加密再暴力破解低了一半!

0x05   python调用js——execjs

最后,我使用了一个python直接可以执行js代码的模块,相信除了登陆加密的用途外,其他地方都非常有用。

这个模块叫execjs,然后把三个加密的js按顺序叠加写到一个文件里就可以了。

首先加密的函数时这样的,首先读取加密的js。

defget_js():#这个是获取js的函数
  f= open('C:\Users\\3s_NwGeek\Desktop\\des.js','r')
  line = f.readline()
   htmlstr = ''
 
whileline:
      htmlstr = htmlstr+line
       line = f.readline()
  returnhtmlstr

这个是加密的函数。先获取js然后解析js代码再调用js的函数并传参就可以返回加密的密码了。
defDesEncrypt(str,key):#这个是des加密的函数

  jsstr= get_js()#获取js
  ctx= execjs.compile(jsstr)#解析js代码
 password=ctx.call('encryptByDES',str,key)#调用encryptByDES函数,并传参原文str和加密key
 password=(password.encode("unicode_escape").decode("string_escape")).decode('unicode-escape').encode('utf-8')#解码,解出来是unicode的
  returnpassword

使用原来的原文进行加密,返回的结果是跟原来的请求包一样的

{"username":"admin","password":"12345678"}

iKUJ1KTtfI4NqIHAf7QQha71W4vil4uLWR1YQREFkJLsx1W/aKLcnt9Ni7PalkpP

0x06 后话

tips最后直接使用协程进行暴力破解,其实事先,我把渗透调研表的联系人和负责人,还有整个部门的姓名信息,加了进去制作成一个用户字典。比如说,姓名叫张三丰,那么就会有,zhangsanfeng,zhang_sanfeng,zhang_sf,zsf。然后制作了16个用户再加常用的admin和root进行大字典的暴力破解。

排坑5小时,暴破5分钟。

最终激动的颤抖叫出来“yes!!!!!”了

图片.png

其实这个站每个月都会多家厂家做渗透,但也许看到密码加密了就pass这个方式了,但是当你肯比别人付出更多的耐心,就能比别人看到更多的风景,挖到更多的漏洞。

特别声明本文文章仅用于普及网络安全知识,提高小伙伴的安全意识的同时介绍常见漏洞的特征等,若读者因此作出危害网络安全的行为后果自负,与合天智汇以及原作者无关,特此声明

# 合天智汇
本文为 蚁景科技 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
渗透测试和实践
蚁景科技 LV.9
湖南蚁景科技有限公司主要从事在线教育平台技术研究及网络培训产品研发,专注网络空间安全实用型人才培养,全面提升用户动手实践能力。
  • 907 文章数
  • 675 关注者
蚁景科技荣膺双项殊荣,引领网络安全教育新潮流
2025-03-28
FlowiseAI 任意文件写入漏洞(CVE-2025–26319)
2025-03-27
路由器安全研究:D-Link DIR-823G v1.02 B05 复现与利用思路
2025-03-18