惊呆,使用john+GPU 破解pfx密钥,竟然可以这么快!

众所周知,GPU的计算能力在某些特定场景对比CPU会有数量级的差异。 在密码破解这块更是如此。

john是一个开源的离线密码解密工具,合理利用gpu算力可以大幅度加快爆破速度。官方支持通过opencl进行爆破解密。

pfx 是一种密码归档文件,一般用来存放 证书链、私钥等内容。我们的爆破主要是爆破私钥的密文。

硬件配置

在云计算的时代,我们自然优先考虑云上算力,随用随开,用完即走,而且配合使用竞价实例,物美价廉。

如下图所示,40C160G 2NVIDIA T4的机器,只要不到¥5.5/h,堪称网吧级定价,超算级享受。

john安装

购买完CVM,使用ssh登录后,可以看到贴心的腾讯云已经为我们安装好了Nvidia驱动和CUDA加速包。

使用 nvidia-smi指令可以查看硬件信息,我购置的是 1/4 T4显卡的机型。

ubuntu@VM-1-3-ubuntu:~/john/src$ nvidia-smi
Fri Jun 11 15:17:26 2021
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 450.80.02    Driver Version: 450.80.02    CUDA Version: 11.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  GRID T4-4C          On   | 00000000:00:08.0 Off |                    0 |
| N/A   N/A    P0    N/A /  N/A |    560MiB /  4096MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

因为john放弃掉了cuda的支持,采用了opencl进行加速,安装一下 opencl的开发包

sudo apt install ocl-icd-opencl-dev

接下来配置john

git clone https://hub.fastgit.org/openwall/john.git && cd ~/john/src/ && ./configure

不出意外的话可以看到OpenCL support ............................. yes,如果没有这个值的话则说明环境存在问题

image-20210611153819294

接下来 执行 make -j 4 && make install 就好了

安装完成之后,在 src 的同级目录可以看到 run文件夹

cd ../ && ./run/john

破解pfx密钥

下载测试pfx文件,先使用指令安装python依赖

sudo apt install python3-pip && pip3 install --user asn1crypto

执行 python3 run/pfx2john.py ./server.pfx > server.hash 将pfx文件转成john可识别的格式。

这个 pfx2john的脚本也很简单,把pfx密钥的加密格式、salt值等提取出来,用固定格式输出。

def parse_pkcs12(filename):
    data = open(filename, "rb").read()
    pfx = pkcs12.Pfx.load(data)

    auth_safe = pfx['auth_safe']
    if auth_safe['content_type'].native != 'data':
        raise ValueError(
            '''
            Only password-protected PKCS12 files are currently supported
            '''
        )

    mac_data = pfx['mac_data']
    if mac_data:
        mac_algo = mac_data['mac']['digest_algorithm']['algorithm'].native
        key_length = {
            'sha1': 20,
            'sha224': 28,
            'sha256': 32,
            'sha384': 48,
            'sha512': 64,
            'sha512_224': 28,
            'sha512_256': 32,
        }[mac_algo]

        salt = mac_data['mac_salt'].native
        iterations = mac_data['iterations'].native
        mac_algo_numeric = -1
        if mac_algo == "sha1":
            mac_algo_numeric = 1
        elif mac_algo == "sha224":
            mac_algo_numeric = 224
        elif mac_algo == "sha256":
            mac_algo_numeric = 256
        elif mac_algo == "sha384":
            mac_algo_numeric = 384
        elif mac_algo == "sha512":
            mac_algo_numeric = 512
        else:
            sys.stderr.write("mac_algo %s is not supported yet!\n" % mac_algo)
            return
        stored_hmac = mac_data['mac']['digest'].native
        data = auth_safe['content'].contents
        size = len(salt)
        sys.stdout.write("%s:$pfxng$%s$%s$%s$%s$%s$%s$%s:::::%s\n" %
                         (os.path.basename(filename), mac_algo_numeric,
                          key_length, iterations, size, binascii.hexlify(salt).decode(),
                          binascii.hexlify(data).decode(),
                          binascii.hexlify(stored_hmac).decode(), filename))

下载密码包

wget https://github.com/danielmiessler/SecLists/raw/master/Passwords/Common-Credentials/10-million-password-list-top-1000000.txt

接下来使用john进行破解

ubuntu@VM-1-3-ubuntu:~/john$ ./run/john ./server.hash --format=pfx-opencl --wordlist=./10-million-password-list-top-1000000.txt
Device 1: GRID T4-4C
Using default input encoding: UTF-8
Loaded 1 password hash (pfx-opencl, (.pfx, .p12) [PKCS#12 PBE (SHA1/SHA-256/512) OpenCL])
Cost 1 (iteration count) is 2048 for all loaded hashes
Cost 2 (mac-type [1:SHA1 256:SHA256 512:SHA512]) is 1 for all loaded hashes
LWS=128 GWS=10240 (80 blocks)
Press 'q' or Ctrl-C to abort, almost any other key for status
123456789        (server.pfx)
1g 0:00:00:06 DONE (2021-06-11 16:04) 0.1594g/s 1633p/s 1633c/s 1633C/s 123456..jesus123
Use the "--show" option to display all of the cracked passwords reliably
Session completed

可以看到,已经爆破成功啦~ 使用openssl工具可以查看信息

ubuntu@VM-1-3-ubuntu:~/john$ openssl pkcs12 -info -in ./server.pfx
Enter Import Password:
MAC: sha1, Iteration 2048
MAC length: 20, salt length: 8
PKCS7 Encrypted data: pbeWithSHA1And40BitRC2-CBC, Iteration 2048
Certificate bag
Bag Attributes
    localKeyID: 5C 5B 4B 74 27 F1 5F DF 23 9C D6 47 5B 67 B9 66 C8 7A 2C D6
subject=C = cn, OU = custer, O = custer, CN = localhost

issuer=C = cn, ST = shanghai, L = shanghai, O = cluster, OU = cluster, CN = localhost

参考链接

烦恼

我年轻的时候烦恼比较少,年轻的时候我觉得:没有什么是非做不可的,喜欢什么做什么就好了。

这种状态贯穿了我的整个大学生活。所有我大学挂了很多科,考研也只坚持了一个月,但是依旧乐此不疲,充满了生命力。

踏入社会快三年了,我感觉到烦恼又慢慢变多了。这个时候脑子里又冒出来一句话来:“钱多了,烦恼也就来了”。我现在感觉到我的烦恼都是一些看得见摸得着的东西。比如不知道怎么推近我的婚礼,不知道怎么开始邀请朋友,没有准备一场精心设计的求婚。。。等等等等

穷困潦倒的时候比较开心,赚了一点钱之后反而烦恼又多了。真是个复杂的世界…

这几天看到道哥在日更公众号,依稀我当年握住道哥的手:“道哥我以后要向你一样牛逼。”,道哥:“好的,你要加油。”。

要加油啊朋友们。

成都

今天加班上厕所时忽然听了一下《成都》这个歌。感觉生活少了很多诗意啊。

北方的村庄 住着一个南方的姑娘。(实际上:住在海淀区一个现代化小区里)

她总是穿着带花的裙子 站在路旁。 (实际上:北京最近很冷,空气也不好,屋里呆着吧还是)

她的话不多 但笑起来是那么平静优雅。(实际上:很久没关心过哪个姑娘笑起来是不是平静优雅了,老了老了。。。)

她柔弱的眼神了装的是什么 是思念的忧伤。(实际上:北漂要好好搬砖,天天思念天天忧伤,容易交不起房租。。)

除了关心张美丽、关心工作之外还要有点诗意才好啊。

站点迁移到hostinger.com

博客(Wordpress)在腾讯容器服务(k8s)上托管 了5个月之后,因为成本问题迁移到hostinger.com。

hostinger是一家专业的Wordpress托管商,近期有优惠活动,花费¥205一口气购买了四年的托管服务。这和一个月¥5不到,还是挺划算的。

之前使用的腾讯云的k8s成本过高,每个月需要花费大约¥200,会对钱包产生负担,暂时迁移走了。

除了Wordpress外,k8s平台还部署了一些蜜罐和靶场的服务

李志回归啦~

2019被封杀之后,2020年8月8日,李志在成都叁缺壹激情开唱,在开头说道:

“我在2018年的身体出了一点问题,后来我们决定要休息一下。过去一年多一直在调理身体,也在反省过去的一些事情,好的坏的。不过我现在的身体已经调理得很好了。我去医院又去体检了,医生说:“身体没问题,洞房都可以”。于是我就打起精神了,后面还有很多事情,但是希望大家配合我们。”

欢迎李志回来,这个世界会好的。

身体没问题,洞房都可以

理发店的小哥

到了理发店洗完头擦干坐下,过来一位和我年龄相仿的理发小哥,给我整好理发设备之后问道:“想剪什么样的头?”,我:“随便剪就行,剪个看起来帅一点的”。

理发小哥面露难色:“平时打理吗?”,我:“不打理,平时都太忙了,洗头发都够呛有时间。”

我在互联网行业上班,有些读者可能不知道,这个可能是当今社会加班最多的工种之一了,我想,这样和理发小哥说,应该可以理解了吧。

不曾想理发小哥面色严肃:“你就是不注意自己的形象,你这个发质不打理的话就是软塌塌的,帅不起来。”,我感觉有些尴尬:“嗨,这不是太忙了吗”。

不曾想理发小哥不仅不给我台阶下:“你平时又不打理,又想让我给你搞帅一点,我怎么搞嘛。对自己形象没追求,搞不了。”。

说完我们沉默了一分钟,我说:“那您就看着剪吧。”。小哥看了一下我,蹭蹭开剪。剪完之后抹上发胶,我一看,“嘿,还真不错!”。和之前进理发店生活简直判若两人,气质都有不同了。

然后我又想:“小哥其实说得对,虽然工作挺忙,但也没有忙到理个发、洗个头都没时间,整清爽一点自己舒服,别人看着也舒服,是得稍微打理下。”。

出门之后一想,这个发型怎么这么熟悉。又一想:

“嗨,原来是照着他的发型给我剪的?,我和理发小哥发型一样了。”

后来我成了理发店的常客,定期去理发店打理头发。

【最后】DHT告一段落

前面两个周末都在研究如何自动抓取、发现DHT网络中的内容,今天决定告一段落。

折腾成果:

实现了

  • 自动化发现每天的新增热门种子
  • 下载这些热门种子
  • 上传到GSuite,把文件存储下来

项目架构:

总结:

用了两个周末完成的这个事情,现在看起来:

没有任何意义

从P2P社区吸血、制造大量无用Traffic、滥用订阅的GSuite。不创造任何的价值。

在精力有限的情况下,要把时间花在有意义、有价值的事情上。下次周末投时间(人力)之前要问自己三个问题:

  1. 做这个有什么用?要花多长时间?投入产出比是否能够符合预期?
  2. 有更高优先级的事情可以做吗?
  3. 创造爱和快乐了吗?

【续集】看了一点DHT进阶的东西

这周末没有忍住,看了一点DHT进阶的东西。想出来一个无聊的主意:使用闲置的服务器,将DHT网络上的每日Top的热点种子下载下来保存到GoogleDrive中,做一个DHT Memory的项目。

类似这样的东西有

简单分下模块的话:

  1. 热门种子获取模块:通过定期抓取DHT网络中的数据,输出高热度的hash。
  2. 下载模块:接收待下载的hash,下载完成之后上传到GoogleDriver,之后删除本地文件。

热门种子获取

热门种子获取有两种方案:

  1. 自己抓取+热度分析。自动抓取可以使用之前说到过的 https://github.com/boramalper/magnetico,热度分析我写了一个小小的脚本 https://gist.github.com/imfht/71b5f27d78df5af8d68b2ca8976dca00
  2. 直接使用别人整理好的数据,比如 https://nyaa.si/提供的RSS服务

由于时间有限,1有点来不及,暂时没有做,使用2提供的RSS源简单过滤了下做种人数。

文件下载模块

文件下载我选用的是Aria2,实际上这个不是一个最优解,如果没有额外的脚本,Aria2无法做到自动上传文件到GoogleDriver。但是迫于时间有限,没有做更深入的研究了。

总结

如果想搬运DHT数据到GoogleDriver的话,可以:

  1. 直接用别人整理好的数据,直接走下载上传流程,可以省事很多。
  2. 换用一个支持下载临时目录和完成目录不同的网站,利用rclone挂载目录,也可以省事很多。

实现了一个非常beta的版本,基本流程都走通了,但是主要时间花在了如何使用dht-server获取用户做种数量上。

预计下周末来搞一个完整的版本。

看了一些DHT网络相关的东西

因为疫情的影响,今年端午一直没有出门,闲着无事看了一些DHT网络相关的东西。不求甚解,只图个好玩。

在说DHT网络之前,要先说P2P网络(Peer-To-Peer),P2P又叫做对等网络互联技术。在P2P网络中,各个节点都是平级的,没有客户端和服务端的概念。

BitTorrent是基于P2P网络的一种文件传输协议,运转原理:是:由中心化的Tracker服务器保存文件信息,当需要下载文件时候,由下载者向中心服务器询问文件在P2P网络中的位置信息(哪个IP拥有这个文件的哪些部分),然后下载机器通过P2P网络和其他机器进行文件传输。(这就是我们平时说的“种子”)。

上面提到的通信方式依赖于中心Tracker服务器,如果Tracker服务器存在网络问题或者宕机,会给整个BitTorrent带来毁灭性的打击(无法获取到文件在P2P网络中的信息,无法下载和交换文件),于是就诞生了DHT协议。

DHT的全称叫做分布式哈希表,通过定义infohash和nodehash、使用nodeid xor infohash来做距离判断。在发布文件的时候向infohash距离最近的Node广播文件(infohash)的信息,在在查找资源时使用同样的方法对距离最近的N个Node查找文件的信息。

原理说得差不多了,在玩儿的时候看到了一些好玩的东西在这里记录一下:

1. 基于DHT网络的爬虫

  1. https://github.com/shiyanhui/dht
  2. https://github.com/boramalper/magnetico

magnetico 自带了WebUI检索功能,推荐使用。

2. 1千万磁力链接

magnetico 使用SQLLite作为存储,在Issue中有人分享了自己的DHT爬虫数据,最多的DHT爬虫数据竟然有一千万条记录。

下载地址可见:https://tnt.maiti.info/dhtd/

3. 热心网友整理的Tracker

https://github.com/XIU2/TrackersListCollection

如果使用aria2的话还有一个小的脚本来更新aria2.conf的tracker列表

bash <(curl -fsSL git.io/tracker.sh) "/root/.aria2/aria2.conf"

如果文件不存在的话需要先创建文件

4. 一些磁力链接站

通过Google搜索磁力链接站可以获取到DHT网络的资源文件。

  • 通过搜索一些类似Final Cut Pro的关键词可以获得FinalCutPro的破解版,通过P2P网络下载,实测速度比百度网盘要块很多。
  • 通过搜索一些你懂的关键字,可以获得一些热心老司机整理的精彩合集,因为资源热门,下载起来也是十分方便。

最后:

因为一直有一点DataHoarder,如果有时间的话可以考虑改造一下爬虫,每天下载热度TopN的文件上传到不限流量的GoogleDriver里。(考虑到目前没有足够带宽的机器和时间,可能要很久很久之后才会做这个事情了