
在德国混沌计算机俱乐部(CCC),我们联合其他研究员发起了一项调查,核心目标是探究黑客群体在实际工作中最常使用哪些编程语言。本文将跟进这项调查,并将其结果与来自 Exploit-DB(漏洞利用数据库)的客观数据分析进行对比。读者不仅能了解设置分析环境的具体步骤,还能获得关于网络安全领域编程生态的深入洞察。
调查概览
作为欧洲最大的黑客协会,CCC 为我们研究该领域的编程语言偏好提供了绝佳的样本基础。2021年5月,我们向俱乐部成员发送了在线问卷。结果显示,受访者在进行安全研究或渗透测试时,主要使用 Shell(如 Bash、PowerShell)和 Python。另一个有趣的发现是,他们的语言偏好会随着时间的推移而改变。不过,多数参与者认为,对于黑客活动而言,编程语言的选择并非最关键的因素。当然,由于调查对象仅限于 CCC 成员,结果可能存在一定的偏差。因此,本文将通过分析更广泛的公开数据源——Exploit-DB 来交叉验证这些发现。
关于漏洞利用数据库
巧合的是,在 CCC 调查进行的同一年,一个影响巨大的零日漏洞引发了全球关注:流行的日志框架 Log4j 被发现存在严重安全缺陷。用于利用此类漏洞的脚本或程序,就被称为“漏洞利用”(Exploit)。Exploit-DB 正如其名,是一个公开的漏洞利用档案库,同时也关联了存在漏洞的软件信息。该平台的主要用户是渗透测试人员和安全研究员,可以通过其官方网站或集成在 Kali Linux 中的工具集进行访问。
截至撰稿时,Exploit-DB 已收录了来自超过 9,000 名作者的 45,000 多个漏洞利用条目。每个条目都包含 ID、作者、类型和发布日期等元数据,并关联着一个包含实际利用脚本或程序的文件。在 Kali Linux 中,可以通过执行 exploitdb 命令找到数据库的根目录。该目录下包含一个记录所有漏洞利用的 CSV 文件 (files_exploits.csv),以及存放实际脚本的 exploits/ 子目录。

本文所进行的比较分析,基于 2022年11月22日的数据库快照,于 2023年1月13日完成。分析所使用的快照数据及全部源代码均可在 GitHub 上找到。
设置和数据转换
要复现分析环境,第一步是克隆对应的 GitHub 项目。所有必需文件都存放在其根目录下。实现基于 Anaconda Python 发行版,需要预先安装在本地机器上。在项目根目录下执行以下命令即可创建并激活 Conda 环境:
conda env create -f environment.yml
conda activate exploits
待分析的数据库快照以 CSV 文件形式存放在 data/ 文件夹中。它从 Kali Linux 中获取,并使用脚本 execute_transformer.py 进行转换。快照的获取时间和转换时间都记录在 timestamp 文件中。如果需要更新快照,可以在 Kali 的终端中运行:
cp -p /usr/share/exploitdb/files_exploits.csv data/
python execute_transformer.py
转换脚本的核心功能之一是整理数据并提取编程语言信息。我们使用了 Pygments 库来完成语言检测。虽然 Pygments 主要用于语法高亮,但它也提供了根据文件内容猜测编程语言的能力。
除了 Pygments,我们也测试了其他方案,例如基于深度学习的 Guesslang。但将其集成到 Conda 环境中较为困难,且处理耗时远超 Pygments。由于并未带来更优的结果,我们最终选择了 Pygments。以下函数展示了如何将其集成到数据转换脚本中:
import pygments
from pygments.lexers import guess_lexer_for_filename
def _parse_exploit_file(file_name):
with open(file_name, encoding="UTF-8") as file:
lines = file.readlines()
text = "\n".join(lines)
line_count = len(lines)
try:
lang_guessed = guess_lexer_for_filename(file_name, text).name
except pygments.util.ClassNotFound:
lang_guessed = None
return line_count, lang_guessed
这段 Python 代码读取特定文件,计算其行数,并使用 guess_lexer_for_filename 函数来检测编程语言。Pygments 通过一系列词法分析器来实现这一功能。有些文件扩展名有唯一的对应关系(如 .py 对应 Python),而有些则存在歧义(如 .pl 可能对应 Perl 或 Prolog)。函数会返回最匹配的词法分析器,其名称即为检测到的编程语言。下文讨论的发现主要来自 comparison.ipynb 笔记本的分析。GitHub 项目中还提供了其他笔记本来探索 Exploit-DB 的更多维度。
结果讨论
CCC 调查的核心问题是参与者在过去一年中使用了哪些编程语言进行安全研究。受访者可以选择多个答案。下图将 CCC 成员提到的前十种语言,与同期(2020/21年)Exploit-DB 作者使用的语言进行了对比,揭示出相似性与差异性。

首先,样本量存在显著差距。共有 48 名 CCC 成员参与了调查。相比之下,在 2020/21 年间,有超过 900 位独立作者在 Exploit-DB 发布了 2,500 多个文件。为避免重复统计,每个作者-语言组合在 Exploit-DB 中仅计数一次。这期间产生了 1,134 次语言引用,其中 1,116 次属于前十名。而在 CCC 调查中,参与者共提名了 140 次前十名语言。
CCC 成员主要使用 Shell(Bash/Shell/PowerShell)和 Python,其次是 C、JavaScript 和 HTML/CSS。这些技术也都出现在了 Exploit-DB 的榜单中。整体来看,语言选择的重合度很高,两个列表中有六种技术是相同的。Python 在两个榜单中都稳居第二,充分显示了其在网络安全领域的普及程度。当然,图表两侧也各有一些对方没有的语言。
一个主要区别在于 Exploit-DB 中语言的分布极不均衡。超过一半的提交被识别为“Text only”(纯文本)。这里 Pygments 给出的名称具有误导性:Exploit-DB 中的文本文件通常包含漏洞描述,但也常常夹杂着 Shell 命令甚至其他语言的脚本片段。因此,某些技术(例如在 CCC 调查中排名第一的 Shell 脚本)在结果中可能被低估了。这是我们采用方法的一个局限性,Pygments 等框架在处理混合了多种语言的文件时存在困难。如何克服这个问题,将是后续研究的一个有趣方向。
让我们将视线从 2020/21 年移开,纵观 Exploit-DB 的整个历史。下图显示了数据库中所有时间排名前十的语言(同样,每个作者-语言组合仅计数一次)。

根据图表,Exploit-DB 有史以来排名前十的语言依次是 Text、Python、C、HTML 和 Perl。这与 CCC 成员的选择仍有相当大的交集。令人稍感意外的是 Prolog 出现在榜单后半段,这可能源于对扩展名 .pl 文件的错误分类。无论如何,Perl 相对较高的历史排名值得注意,因为它在 2020/21 年的对比图中并未出现。这恰好与 CCC 调查的另一发现相呼应:大多数参与者(77.5%)报告他们的语言偏好随时间发生了变化。为了验证这一点,我们可以观察下图。该图表直观展示了过去 25 年间,Exploit-DB 中排名前十的语言所占百分比份额的变化趋势(每年对每个作者-语言组合计算一次)。研究期间,我们总共从 9,592 位独立作者处获得了 16,422 条语言引用。

图表显示,Exploit-DB 中文本文件的百分比份额保持得相当稳定。选取 25 年跨度是因为此前的数据量相对较少。除了文本的持续主导地位,图表清晰地揭示了对其他语言偏好的变迁。最明显的趋势是从 C 语言向 Python 的转移。CCC 研究中提到的一个原因可能可以解释这种现象:参与者认为编程语言的选择对黑客活动并不至关重要。因此,Python 使用量的增加,可能只是反映了其在近年来整个编程社区的普遍流行。
顺着这个逻辑,随着技术的发展,语言偏好在未来应该会继续演变。例如,Rust 被引入作为 Linux 内核开发的第二语言,就可能会在未来引发新的趋势。这一预测是否成真,让我们拭目以待。对这类趋势的持续追踪和分析,正是像 云栈社区 这样的技术社区所关注和探讨的议题。
结论
总而言之,本文的对比分析揭示了 CCC 成员与 Exploit-DB 作者在语言使用上存在高度重叠。两个数据源都共同印证了 Python 在网络安全领域的统治级地位。同时,两者也都表明,语言偏好会随着时间的推移而发生显著变化。
CCC 研究指出了一个可能的原因:从业者并不视编程语言为黑客技术的核心。如果这一解释成立,那么我们可以预期,语言偏好将持续伴随整体技术的进步而流动。本次 Exploit-DB 分析的一个主要局限在于语言检测方法。由于多语言文件带来的干扰,某些技术(如 Shell)的代表性可能被低估。如何更精准地分析混合代码文件,将是后续研究的一个有趣课题。
毫无疑问,Exploit-DB 为数据科学家和安全专家提供了一个极其丰富的数据集。关于黑客技术与渗透艺术的奥秘,仍有大量内容等待我们去挖掘和学习。