Espanso:跨平台文本替换利器,提升渗透测试效率

本文介绍了Espanso这一开源跨平台文本替换工具,详细讲解了其安装、基础匹配替换、变量使用、正则表达式、Shell命令集成等高级功能,并展示了如何应用于渗透测试场景,如自动生成邮件主题、编码转换和命令执行等。

Espanso:文本替换,简单高效

Espanso 是一款功能强大的跨平台开源文本替换(或文本扩展)工具。简单来说:它能将你输入的内容替换为其他内容。例如,想象一下只需输入三个字符,就能神奇地显示出完整的电子邮件地址?Microsoft Word 的自动更正和手机的智能补全功能可以实现部分类似操作,但 Espanso 结合高级功能(如运行 shell 命令)后,其能力将更加强大。

本文重点介绍在 Linux 上使用 Espanso(结合 shell 命令)来辅助渗透测试人员的常见任务,尽管它几乎可用于任何场景。

为何使用文本扩展工具?

虽然部分工作可能通过 LLM 实现自动化,但许多繁琐任务永远不会消失。发送电子邮件、编写命令、获取外部 IP 地址——甚至输入电话号码或邮寄地址——都是低效的时间浪费。此外,文本扩展工具可以减少因拼写错误导致的错误,并降低整体失误率。

安装

Espanso 官网提供 Windows、macOS 和 Linux 的安装包。也可通过 GitHub 上的源代码手动安装。安装后,程序使用配置文件和一个匹配文件;两者均为 YAML 格式,可根据需求轻松更新。

默认情况下,Espanso 无需过多配置即可成功运行。可以说,匹配规则才是核心所在。

匹配与替换

位于 Espanso 配置目录中的 base.yaml 文件包含匹配和替换规则。你也可以添加自己的 YAML 文件,以便更轻松地管理规则。

项目的详细文档说明了如何在系统中定位此文件,但 Espanso 本身包含一个便捷快捷方式,可用默认编辑器打开该文件。以下命令将打开文件进行编辑:

1
espanso edit

基本思路是匹配你输入的文本字符串(称为触发器),并将其替换为其他内容。一个简单示例如下:

1
2
- trigger: ":me"
  replace: "Chris"

在系统的几乎所有位置,如果我输入 :me,Espanso 会将其替换为 Chris

与 Espanso 的默认示例一样,我倾向于在触发器前使用冒号,因为这在英语中不常见。如果你像我一样是 vim 阵营的用户,请小心不要覆盖你需要的内容!

前面的示例仅节省了 5 个字符的输入,并不是非常有用。但写出完整的签名非常实用,所以我设置了以下内容(至少非常接近):

1
2
- trigger: ":me"
  replace: "Chris Sullo | sullo@example.com | 555-867-5309"

我为电话号码、地址、电子邮件地址等设置了简单的替换。即使是最基本的用法,Espanso 也能节省时间。但结合一些附加功能,它可以变得更强大。

关于 YAML 的重要说明:空格很重要(类似于 Python 😔)。如果你不熟悉该格式,只需复制并编辑现有行以保留缩进。

高级用法

变量

Espanso 可以使用内部变量使匹配更具动态性,而无需完全依赖 shell 命令。以下示例将 {{time}} 值替换为当前的小时和分钟。

1
2
3
4
5
6
7
- trigger: :now
  replace: It's {{time}}
  vars:
    - name: time
      type: date
      params:
        format: "%H:%M"

当我输入 :now 时,它会被替换为 It’s 15:53

提示输入值

如果你经常写相同的电子邮件——例如渗透测试开始通知——你可以将其添加到 Espanso 中,并让它提示你输入收件人姓名,然后拼写出你的文本。Espanso 团队有一个示例:

1
2
3
4
- trigger: :greet
  form: |
    Hey [[name]],
    Happy Birthday!

现在,在任何地方输入 :greet,Espanso 都会打开此对话框:

然后输出完整文本:

1
2
Hey Nikto,
Happy Birthday!

该命令可以有多个 [[]] 字符串,每个字符串在对话框中都有一个字段。

正则表达式值

提示功能很方便,但我不太喜欢对话框。幸运的是,Espanso 可以在触发器中使用正则表达式,并将你输入的内容捕获为变量。扩展文档中的示例,我们可以在输入时直接传递名称。

1
2
- regex: :greet\((?P<person>.*)\)
  replace: "Hey {{person}},\nHappy Birthday!"

要使用此功能,我现在可以输入 :greet(Nikto),它会获取传递的值并在输出中替换,结果如下:

1
2
Hey Nikto,
Happy Birthday!

如果多个值具有唯一名称(例如上例中的“person”),你可以传递多个值。

Shell 命令

Espanso 的另一个强大功能是能够运行 shell 命令。虽然作为安全人员,我们应该警惕让程序调用 shell,但在这种情况下,我们可以控制输入和输出以保持安全并使生活更轻松。(我们不要讨论这基本上是一个键盘记录器,好吗?如果你愿意,可以查看源代码并监视网络流量!)。

以下是我经常使用的一个示例,用于将外部 IP 地址添加到文档等中。

1
2
3
4
5
6
7
- trigger: :myip
  replace: "{{output}}"
  vars:
    - name: output
      type: shell
      params:
        cmd: "curl ifconfig.me"

现在,当我输入 :myip 时,它会向 http://ifconfig.me/ 网站发出 curl 请求,该网站仅返回源 IP 地址。

另一个 shell 命令用例(我发现使用 shell 比学习 Espanso 的内部变量更容易)是为状态报告编写电子邮件主题。

1
2
3
4
5
6
7
- trigger: :ps
  replace: "Pentest Status: {{output}}"
  vars:
    - name: output
      type: shell
      params:
        cmd: "date '+%B %d, %Y'"

现在,当我打开新电子邮件时,我将光标放在主题行中并输入 :ps 以写出:

1
Pentest Status: April 15, 2025

另一个方便的功能是编码——通过正则表达式匹配器和 shell 命令的组合,在任何地方对任何内容进行 base64 编码。

1
2
3
4
5
6
7
- regex: :b64\((?P<val>.*?)\)
  replace: "{{output}}"
  vars:
    - name: output
      type: shell
      params:
        cmd: "echo '{{val}}' | base64 | tr -d '\n'"

现在,无论我在 Burp、命令行还是任何地方,我都可以输入 :b64(text) 并获取替换后的版本,如 dGV4dAo=

其他用途

Espanso 可用于大量场景。我的常见用法包括:

  • 电子邮件主题
  • 电子邮件内容
  • 测试笔记模板
  • 联系信息
  • 长 shell 命令
  • 注入字符串
  • 等等……

实际上,有一个专门的网站分享用途,例如我的新最爱 :dadjoke。Nick Aliferopoulos 甚至分享了一系列渗透测试命令和字符串。

总结

Espanso 有许多未在此涵盖的功能,例如完整单词替换(在任何应用程序中自动更正拼写错误!)。对我来说一个方便的功能是,因为我总是拼错它:

1
2
3
- trigger: namp
  replace: nmap
  word: true

所以,现在我可以使用 nmap 扫描器,而不是不存在的 namp 扫描器。注意 word: true 元素确保它是完整的单词“namp”,而不是,比如说,当我写信给 NAMPA 关于我在冰箱里发现的一些奇怪霉菌时。

使用全局变量还可以帮助构建复杂的工作流程——这个看似简单的程序中内置了大量功能。

进一步探索这些功能,你可以随心所欲地自定义和自动化,节省大量时间。如果你添加了许多替换规则,甚至可以将它们拆分到不同的 YAML 文件中以便更轻松地管理。

祝你使用 :replacements 愉快!

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计