Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

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

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

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
Snaffler — 一个帮助渗透测试人员寻找美味糖果的工具,由 @l0ss 和 @Sh3r4 开发(Twitter: @/mikeloss 和 @/sh3r4_hax) | Kitploit
工具/GitHubGitHub/snaffcon/snaffler
侦察持久化机制横向移动信息收集后渗透利用渗透测试红队横向移动 分类第 8 名持久化机制 分类第 20 名后渗透利用 分类第 13 名
2.9k283126个月前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 之类的内容,通过匹配文件名包含子字符串 、、、、 等的文件。

真正的答案:

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.

root@kitploit:~
"\\\\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.

root@kitploit:~
这个规则则会查看文件扩展名,并立即丢弃任何我们不喜欢的文件。

在这种情况下,我主要丢弃字体、图片、CSS等。```toml
[[ClassifierRules]]
EnumerationScope = "FileEnumeration" # We're looking at the actual files, not the shares or dirs or whatever.
RuleName = "DiscardExtExact" # just a name
MatchAction = "Discard" # We're discarding these
MatchLocation = "FileExtension" # This time we're only looking at the file extension part of the file's name.
WordListType = "Exact" # and we only want exact matches. 
WordList = [".bmp", ".eps", ".gif", ".ico", ".jfi", ".jfif", ".jif", ".jpe", ".jpeg", ".jpg", ".png", ".psd", ".svg", ".tif", ".tiff", ".webp", ".xcf", ".ttf", ".otf", ".lock", ".css", ".less"] # list of file extensions.

这里有一个非常简单的规则示例,适用于我们喜欢并希望保留的内容。```toml [[ClassifierRules]] EnumerationScope = "FileEnumeration" # Still looking at files RuleName = "KeepExtExactBlack" # Just a name MatchAction = "Snaffle" # This time we are 'snaffling' these. This usually just means send it to the output, # but if you turn on the appropriate option it will also grab a copy. MatchLocation = "FileExtension" # We're looking at file extensions again WordListType = "Exact" # With Exact Matches WordList = [".kdbx", ".kdb", ".ppk", ".vmdk", ".vhdx", ".ova", ".ovf", ".psafe3", ".cscfg", ".kwallet", ".tblk", ".ovpn", ".mdf", ".sdf", ".sqldump"] # and a bunch of fun file extensions. Triage = "Black" # these are all big wins if we find them, so we're giving them the most severe rating.

root@kitploit:~
这个基本上是一样的,但我们现在看的是完整的文件名。很简单!```toml
[[ClassifierRules]]
EnumerationScope = "FileEnumeration"
RuleName = "KeepFilenameExactBlack"
MatchAction = "Snaffle"
MatchLocation = "FileName"
WordListType = "Exact"
WordList = ["id_rsa", "id_dsa", "NTDS.DIT", "shadow", "pwd.db", "passwd"]
Triage = "Black"

这个有点巧妙,来看看……```toml [[ClassifierRules]] EnumerationScope = "FileEnumeration" # we're looking for files... RuleName = "KeepCertContainsPrivKeyRed" MatchLocation = "FileExtension" # specifically, ones with certain file extensions... WordListType = "Exact" WordList = [".der", ".pfx"] # specifically these ones... MatchAction = "CheckForKeys" # and any that we find, we're going to parse them as x509 certs, and see if the file includes a private key! Triage = "Red" # cert files aren't very sexy, and you'll get huge numbers of them in most wintel environments, but this check gives us a way better SNR!

root@kitploit:~
好的,这里就是强大功能登场的地方。我们有一对规则形成了一条链。

扩展名匹配第一个规则的文件会被发送到第二个规则,第二个规则会“grep”(即 String.Contains())它们,检查是否包含特定词汇表中的内容。

你可以随心所欲地将这些规则串联起来,不过我想如果你玩得太过“盗梦空间”式的话,可能会开始遇到一些性能问题。```toml
[[ClassifierRules]]
EnumerationScope = "FileEnumeration" # this one looks at files...
RuleName = "ConfigGrepExtExact"
MatchLocation = "FileExtension" # specifically the extensions...
WordListType = "Exact"
WordList = [".yaml", ".xml", ".json", ".config", ".ini", ".inf", ".cnf", ".conf"] # these ones.
MatchAction = "Relay" # Then any files that match are handed downstream...
RelayTargets = ["KeepConfigGrepContainsRed"] # To the rule with this RuleName! This can also be an array of RuleNames if you want to get real wild and start writing branching rulesets.

[[ClassifierRules]]
RuleName = "KeepConfigGrepContainsRed" # Anyway, this is the target rule. Following a naming convention really helps to make sure you're using the right targets.
EnumerationScope = "ContentsEnumeration" # this one looks at file content!
MatchAction = "Snaffle" # it keeps files that match
MatchLocation = "FileContentAsString" # it's looking at the contents as a string (rather than a byte array)
WordListType = "Contains" # it's using simple matching
WordList = ["password=", " connectionString=\"", "sqlConnectionString=\"", "validationKey=", "decryptionKey=", "NVRAM config last updated"]
Triage = "Red"

希望这能传达这个想法。我建议拿一些默认规则来调试,直到你觉得掌握得差不多了。

什么是"UltraSnaffler"???

很多人希望能够查看不仅是纯文本的文件格式内部,比如Word文档、PDF、.eml等。不幸的是,实现该功能最简单的库让Snaffler.exe的最终文件大小膨胀了约1200%,这对于许多流行的内存执行技术来说很糟糕,因为那些技术对可使用的文件大小有上限。

解决方案是UltraSnaffler,它只是第二个.sln文件,启用了所需的库和相关代码。构建UltraSnaffler.sln,得到UltraSnaffler。

警告:Snaffler的默认规则不包含任何会查看Office文档或PDF内部的规则,因为我们发现很难编写出在典型企业环境中不会花费数年才能完成扫描的规则。请注意,查看这些文档的内部比查看传统纯文本文件要慢得多,而且典型环境中会有大量的低价值Office文档和PDF。

配置文件是如何工作的?

实际上,我认为这个功能非常棒。

如果你在Snaffler命令行末尾添加-z generate,Snaffler会将配置对象(包括通过参数设置的任何配置方面)序列化为一个.toml配置文件,然后你可以相当容易地手动编辑(或不编辑),并在空闲时重复使用。

例如,如果你执行:

Snaffler.exe -s -o C:\mydir\snaffler.log -v trace -i \\host.lol.domain\share -p C:\users\someguy\myrules -z generate

Snaffler将解析你的许多参数,将它们转换为配置对象,然后将该配置对象序列化为以下.toml配置文件:```toml PathTargets = ["\\host.lol.domain\share"] ComputerTargetsLdapFilter = "(objectClass=computer)" ScanSysvol = true ScanNetlogon = true ScanFoundShares = true InterestLevel = 0 DfsOnly = false DfsShareDiscovery = false DfsNamespacePaths = [] CurrentUser = "l0sslab\l0ss" RuleDir = "C:\users\someguy\myrules" MaxThreads = 60 ShareThreads = 20 TreeThreads = 20 FileThreads = 20 MaxFileQueue = 200000 MaxTreeQueue = 0 MaxShareQueue = 0 LogToFile = true LogFilePath = "C:\mydir\snaffler.log" LogType = "Plain" LogTSV = false Separator = 32 LogToConsole = true LogLevelString = "trace" ShareFinderEnabled = false LogDeniedShares = false DomainUserRules = false DomainUserMinLen = 6 DomainUserNameFormats = ["sAMAccountName"] DomainUserMatchStrings = ["sql", "svc", "service", "backup", "ccm", "scom", "opsmgr", "adm", "adcs", "MSOL", "adsync", "thycotic", "secretserver", "cyberark", "configmgr"] DomainUsersWordlistRules = ["KeepConfigRegexRed"] MaxSizeToGrep = 1000000 Snaffle = false MaxSizeToSnaffle = 10000000 MatchContextBytes = 200

root@kitploit:~
你可能注意到这里有很多你没有传参的项目。这些是默认配置项,有些只能在源码或配置文件中方便地编辑,通常是因为不值得为它们添加参数。

## 这很烂,你们有计划让它不那么烂吗?

不,它不烂,你才烂。

是的,我们确实有计划。

我们还将:
 - 添加对归档文件的解析,理想情况下将它们视为另一个目录,在其中寻找好东西。
 - 继续完善规则和正则表达式。**词表需要更多词!`string[]`为`string`王座加冕!**

![一个关于词表的冷笑话。](https://assets.kitploit.com/production/public/readmes/5041/ac1d2a65e3759820b6eaaf47c893ec06661ce5db74c26d60eb424fabfe29a11f.png)

## 你们从谁那里偷了代码?

共享枚举部分是从SharpShares中偷来的(看到我做了什么吗?),它是由非常有用的Dwight Hohnstein编写的。(https://github.com/djhohnstein/SharpShares/)
Dwight的GitHub个人资料就像五金店那条令人惊叹的后排过道,那里有一大堆工具让你觉得“天哪,我等不及要找个借口真正试一试这个了...”,你一定要去看看。

虽然没有拿任何代码(主要是因为它用的是Ruby),但我们确实从`plunder2`(http://joshstone.us/plunder2/)那里偷了不少巧妙的想法。

词表也是从其他类似工具中精选的,如trufflehog、shhgit、gitrobber和graudit。

## 它OPSEC安全吗?(这他妈是什么意思)

噗,不。它他妈的吵死了。

这么说吧...如果是在那种你会有信心在默认模式下运行BloodHound的环境里,那么嗯,是的...它真的很隐蔽。

## 我以為你們在紅隊任務中用了這個東西?

*叹气* 好吧,我给你真正的答案。

在默认模式下,Snaffler在很多方面看起来非常像SharpHound。它大量与AD进行LDAP通信,然后出去尝试与域中的每台Windows机器进行SMB通信。这种行为几乎肯定会让你在那些有哪怕一点点组织性的机构里被逮到。

然而...

Snaffler更针对性的选项(特别是`-i`)触发检测的可能性要**小得多**。

我特别喜欢在刚被入侵的服务器或工作站上运行`Snaffler.exe -s -i C:\`,而且我还没看到这种行为被发现。至少目前还没有。

## 我如何提供帮助或获得帮助?

如果你想通过Slack讨论,可以在BloodHound Slack上找我们(@l0ss 或 @Sh3r4),加入链接是https://bloodhoundgang.herokuapp.com/,或者在#snaffler频道与一群贡献者聊天。

你也可以在Twitter上找我们 - @mikeloss 和 @sh3r4_hax

否则就提交一个issue;我们会尽力。
下载工具
passw
handover
secret
secure
as-built
  • 还有跳过清单,用于跳过所有具有某些扩展名的文件,或任何路径包含给定字符串的文件。