Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

订阅源联系隐私© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
Snaffler — 一个帮助渗透测试人员寻找美味糖果的工具,由 @l0ss 和 @Sh3r4 开发(Twitter: @/mikeloss 和 @/sh3r4_hax) | Kitploit
工具/GitHubGitHub/snaffcon/snaffler
侦察持久化机制横向移动信息收集后渗透利用渗透测试红队横向移动 分类第 8 名持久化机制 分类第 20 名后渗透利用 分类第 13 名
2.9k283317个月前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享
GitHubsnaffcon/snaffler

Snaffler

一个帮助渗透测试人员寻找美味糖果的工具,由 @l0ss 和 @Sh3r4 开发(Twitter: @/mikeloss 和 @/sh3r4_hax)

查看仓库

Snaffler

ko-fi

一张关于“snaffle”的字典定义。

它的用途是什么?

Snaffler 是一款面向渗透测试人员和红队成员的工具,旨在帮助在大量乏味讨厌的干草堆(庞大的 Windows/AD 环境)中找到美味的糖果针(主要是凭据,但也很灵活)。

它也可能对其他做其他事情的人有用,但明确来说,它并非设计为“审计”工具。

我不想读所有这些!!!

呃,好吧。但我们不对结果负责。我们为你写了所有这些,不过没关系。我们不生气,只是失望。

snaffler.exe -s -o snaffler.log

它是做什么的?

广义上讲 - 它从 Active Directory 获取 Windows 计算机列表,然后将其 snaffly 触手伸向所有计算机,找出哪些有文件共享,以及你是否能读取它们。

然后更多的 snaffly 触手枚举这些共享中的所有文件,并使用 LEARNED ARTIFACTUAL INTELLIGENCE for MACHINES 来判断哪些是像你这样肮脏的小黑客可能想要的。

实际上它并不做任何机器学习的东西,因为正确做需要训练数据,那会需要大量我们没有的时间。相反,像所有好的“机器学习”项目一样,它只是使用了大量的 if 语句和正则表达式。

它长什么样?

像这样!

我如何使用它?

如果你“直接在一台加入域的机器上以域用户身份运行 EXE”(正如人们在使用 Grouper2 时被指示的那样,然后他们立即打开了所有详细/调试开关,导致工具吐出了数百兆的堆栈跟踪信息),它基本上什么也不会做。这是我们给那些不看 README 文件的用户开的一个玩笑TM,因为我们是怪物。

然而……如果你添加正确的咒语,它将启用前面提到的 L.A.I.M.,并且可能含有糖果的文件路径就会显现出来。

关键的咒语是:

-o 启用将结果输出到文件。如果你没有使用 -s,你可能需要这个。例如 -o C:\users\thing\snaffler.log

-s 启用将结果输出到 stdout(一旦找到就输出)。如果你没有使用 -o,你可能需要这个。

-v 控制详细级别,选项包括 Trace(最详细)、Degub(较少详细,较少毛病)、Info(更少详细,默认)和 Data(仅结果)。例如 -v debug

-m 启用并为 snaffler 分配一个输出目录,用于自动复制(或 Snaffle……如果你愿意)任何它喜欢的文件。

-l 要 Snaffle 的文件的最大大小(字节)。默认为 10000000,大约 10MB。

-i 禁用计算机和共享发现,需要提供一个目录路径来执行文件发现。

-n 禁用计算机发现,接受逗号分隔的主机列表或输入文件来执行共享和文件发现。请注意,如果提供文件,输入需要是一个路径,例如 C:\targets.txt 或 .\targets.txt。

-y 以 TSV 格式输出。

-b 跳过那些发现不太有趣内容的 LAIM 规则,用 0 到 3 之间的数字调整。

-f 限制 Snaffler 通过 DFS(分布式文件系统)查找文件共享——这应该比默认方式更隐蔽,同时仍然覆盖许多组织中最大的文件共享。

-a 跳过文件枚举,仅提供目标主机上可列出共享的列表。

-u 让 Snaffler 从 AD 拉取账户名列表,选择看起来最有趣的,并在搜索规则中使用它们。

-d 要搜索计算机的域,以便在这些计算机上搜索共享,进而搜索文件。很简单。

-c 用于查询域计算机列表的域控制器。

-r 搜索内部有趣字符串的最大文件大小(字节)。默认为 500k。

-j 在文件中找到的字符串两侧显示多少字节的上下文,例如 -j 200

-z 定义以上所有内容以及更多内容的配置文件路径!详见下文。使用 -z generate 生成一个名为 .\default.toml 的示例配置文件。

-t 你想要输出的日志类型。当前支持的选项为 plain 和 JSON。默认值为 plain。

-x 使用的最大线程数。不要将其设置低于 4,否则会出问题。

-p 包含 .toml 格式规则的目录路径。Snaffler 将加载所有这些规则以替代默认规则集。

这些日志输出是什么意思?

希望这个带注释的例子能有所帮助:

这条日志条目大致应该从左到右理解如下:

  • 在 7:37 左右
  • Snaffler 发现了一个它认为值得你关注的文件
  • 它被评为“Red”,第二有趣的级别
  • 它匹配了一个名为“KeepConfigRegexRed”的规则
  • 你可以读取它,但不能修改它
  • 匹配到的确切正则表达式是红色框中的那些内容
  • 它大小为 208kB
  • 最后修改时间是 2020 年 1 月 10 日下午差一刻四点。
  • 文件可在紫色路径中找到

……该行剩余部分(灰色)是文件中匹配处的一小段上下文。

在这个例子中,我们找到了 ASP.NET 的 validationKey 和 decryptionKey 值,这可能让我们通过某些反序列化攻击对 Web 应用进行 RCE。太棒了!

注意:在截取此截图后,Sh3r4 添加了一个功能,即在每行前面加上当前用户和主机名。但我不想重新截图。

它如何决定哪些文件好哪些文件无聊?

一个“简单到几乎像是谎言”的答案:

每种 L.A.I.M. 神秘的文件查找方法都做类似的事情:

  • 通过精确的文件扩展名匹配搜索,这意味着任何扩展名与相关单词列表匹配的文件都将被返回。这适用于几乎总是含有糖果的文件扩展名,例如 .kdbx、.vmdk、.ppk 等。

  • 通过(不区分大小写)精确文件名匹配搜索。这适用于几乎总是含有糖果的文件名,例如 id_rsa、shadow、NTDS.DIT 等。

  • 通过精确的文件扩展名匹配(又一个单词列表)搜索,然后对任何匹配文件的内容进行“grep”,查找某些关键词(又一个单词列表)。这适用于有时含有糖果但你知道可能有大量琐碎内容的文件扩展名。例如,web.config 有时包含数据库凭据,但通常也包含无聊的 IIS 配置废话且没有密码。此方法会(例如)查找所有以 .config 结尾的文件,然后在其内容中 grep 查找包括但不限于以下字符串:connectionString、password、PRIVATE KEY 等。

  • 通过部分文件名匹配搜索(哦,更多单词列表)。这主要用于查找 Jeff 的密码文件 2019(副本).docx 或 特权访问管理系统设计 - 竣工版.docx 之类的内容,通过匹配文件名包含子字符串 passw、handover、secret、secure、as-built 等的文件。

  • 还有跳过清单,用于跳过所有具有某些扩展名的文件,或任何路径包含给定字符串的文件。

真正的答案:

Snaffler 使用一个“分类器”系统,每个分类器检查共享、文件夹、文件或文件内容,将一些项目传递给下游的下一个分类器,并丢弃其他项目。每个分类器使用一组规则来决定如何处理它所分类的项目。

这些规则可以非常简单,例如“如果文件的扩展名是 .kdbx,就通知我”,或者“如果路径包含 windows\sxs,则停止查看该路径内的子目录和文件”。

规则也可以使用正则表达式,这允许相对复杂的模式匹配。这在检查文件内容时特别有用,但应注意避免对性能有重大影响的正则表达式。在大型环境中,这些规则可能被检查数百万次,因此微小的性能问题可能会被显著放大。

真正的力量在于 Snaffler 能够将多个规则链在一起,甚至创建分支链。这使我们能够使用“便宜”的规则(如检查文件名和扩展名)来决定何时使用“昂贵”的规则(如对文件内容运行正则表达式、解析证书以查看它们是否包含私钥等)。这就是为什么 Snaffler 能够在需要时对文件进行相当深入的检查,同时对于一个用 C# 这样的高级语言编写的工具来说速度快得惊人。

例如,一个非常简单的规则集可能包含:

  • 一个规则,丢弃所有扩展名与图像文件关联的文件
  • 一个规则,查找所有具有 .dmp 文件扩展名的文件并 snaffle 它们
  • 一个规则链,其中:
    • 第一个规则查找具有 .ps1 文件扩展名的文件,并将所有匹配文件发送给第二个和第三个规则。
    • 第二个规则使用旨在查找 PowerShell 代码中硬编码凭据的正则表达式检查文件内部。
    • 第三个规则使用旨在查找 cmd.exe 命令中硬编码凭据的正则表达式检查文件内部(类似于可能在 .bat 或 .cmd 文件中找到的凭据),因为这些也常在 PowerShell 脚本中使用。

这种方法还使我们能够保持相对可管理和可读的规则集,并且也使最终用户(你)更容易自定义默认规则或开发自己的规则集。

我不想写规则,那听起来又难又无聊。

你说得对,确实如此。

Snaffler 在 .exe 中内置了一组默认规则。你可以在 ./Snaffler/SnaffRules/DefaultRules 中查看它们。

我是一个无聊的巨人,日常琐事的大师,我想编写自己的规则集。

没问题,你这个巨大的怪人。你有两个选择。

  1. 编辑或替换 DefaultRules 目录中的规则,然后构建一个新的 Snaffler。该目录中的 .toml 文件将被嵌入 .exe 作为资源,并在运行时加载(当你没有指定其他规则时)。
  2. 创建一个目录,在里面放一堆你自己的规则文件,然后运行 Snaffler 并加上 -p .\path\to\rules。Snaffler 将解析该目录中的所有 .toml 文件,并使用得到的规则集。如果你把它们都放在一个大的 .toml 文件中也可以。

以下是几个带注释的例子,希望能帮助更好地解释一切。如果这看起来很难,你可以直接使用我们的规则,它们很可能帮你找到一些好东西。

这是一个规则示例,它会让 Snaffler 忽略某个名称的目录下的所有文件和子目录。```toml [[ClassifierRules]] EnumerationScope = "DirectoryEnumeration" # This defines which phase of the discovery process we're going to apply the rule. # In this case, we're looking at directories. # Valid values include ShareEnumeration, DirectoryEnumeration, FileEnumeration, ContentsEnumeration RuleName = "DiscardLargeFalsePosDirs" # This can be whatever you want. We've been following a rough naming scheme, but you can call it "Stinky" if you want. ¯_(ツ)_/¯ MatchAction = "Discard"# What to do with things that match the rule. In this case, we want to discard anything that matches this rule. # Valid options include: Snaffle (keep), Discard, Relay (example of this below), and CheckForKeys (example below) Description = "File paths that will be skipped entirely." # Not used in the code, just a place for notes really. MatchLocation = "FilePath" # What part of the file/dir/share to look at to check for a match. In this case we're looking at the whole path. # Valid options include: ShareName, FilePath, FileName, FileExtension, FileContentAsString, FileContentAsBytes, # although obviously not all of these will apply in all EnumerationScopes. WordListType = "Contains" # What matching logic to apply, valid options are: Exact, Contains, EndsWith, StartsWith, or Regex. # Under the hood these all get turned into regexen one way or another. MatchLength = 0 WordList = [

A list of strings or regex patterns to use to match. If using regex patterns, WordListType must be Regex.

"\\\\puppet\\\\share\\\\doc",
"\\\\lib\\\\ruby",
"\\\\lib\\\\site-packages",
"\\\\usr\\\\share\\\\doc",
"node_modules",
"vendor\\\\bundle",
"vendor\\\\cache",
"\\\\doc\\\\openssl",
"Anaconda3\\\\Lib\\\\test",
"WindowsPowerShell\\\\Modules",
"Python27\\\\Lib"

] Triage = "Green" # If we find a match, what severity rating should we give it. Valid values are Black, Red, Yellow, Green. This value is ignored for Discard MatchActions.

这个规则则会查看文件扩展名,并立即丢弃任何我们不喜欢的文件。
下载工具