Vuls

今天给大家介绍的是一款名叫Vuls的漏洞扫描工具,该工具采用Go语言编写,可帮助研究人员在无需安装任何代理工具的情况下实现对Linux/FreeBSD的漏洞扫描。

2.png

工具演示视频

视频地址:https://asciinema.org/a/3y9zrf950agiko7klg8abvyck

Vuls

工具介绍

对于系统管理员来说,每天的安全漏洞扫描以及软件更新任务肯定是非常繁重的.为了避免产品生产环境没有及时更新,很多管理员不会选择使用安装管理器所提供的自动更新选项,而是选择进行手动更新.这样就会导致下列问题出现:

1.    系统管理员不可能持续关注NVD(国家漏洞数据库)或类似数据库中更新的新漏洞;

2.    如果服务器端安装了大量的软件,那么系统管理员也不可能手动监控所有这些软件;

3.    对服务器端执行新型安全漏洞扫描和分析的花销非常的大

因此,Vuls这款工具就应运而生了,Vuls拥有以下几种特性:

1.    一旦数据库中新增了跟自己系统相关的漏洞时,告知管理员;

2.    服务器在受到漏洞影响时,通知管理员;

3.    自动执行漏洞检测,以防止管理员忽略某些应用;

4.    使用CRON或其他方法自动生成常规漏洞报告,以帮助管理员更好地管理漏洞

Vuls

主要功能

扫描Linux/FreeBSD服务器中的任意漏洞(支持主流Linux/FreeBSD平台)

-Alpine,Ubuntu, Debian, CentOS, Amazon Linux, RHEL, Oracle Linux, SUSE Enterprise Linux和Raspbian, FreeBSD;

-Cloud,on-premise, Docker

高质量的漏洞扫描

Vuls使用了多款漏洞数据库:

NVD

JVN(日本)

OVAL

RedHat

Debian

Ubuntu

SUSE

Oracle Linux

Alpine-secdb

Red Hat安全公告

Debian安全漏洞追踪库

支持命令(yum,zypper, pkg-audit)

RHSA/ALAS/ELSA/FreeBSD-SA

Exploit Database

US-CERT

JPCERT

快速扫描和深度扫描

快速扫描:

-无需root权限或任何依赖组件;

-几乎不会给目标服务器增加任何负载;

-支持断网环境下的离线扫描模式(Red Hat,CentOS, OracleLinux, Ubuntu, Debian)

快速Root扫描:

-使用root权限进行扫描;

-几乎不会给目标服务器增加任何负载;

-使用yun-ps检测受影响的进程(RedHat, CentOS, Oracle Linux和Amazon Linux);

-检测已更新但未重启的进程(Debian和Ubuntu);

-支持断网环境下的离线扫描模式(Red Hat,CentOS, OracleLinux, Ubuntu, Debian)

深度扫描

-使用root权限进行扫描;

-通过解析漏洞数据库中的CVE编号来检测服务器上的产品漏洞以及更新情况;

-某些情况下会给目标服务器增加一定的负载

远程扫描和本地扫描

远程扫描

-用户需搭建一台设备,并通过SSH与远程目标主机进行连接后方可进行扫描操作;

本地扫描

-如果你不想使用中央Vuls服务器来连接每一台目标服务器的话(通过SSH),你可以使用Vuls的本地模式;

Stargaers增长变化

6.png

项目地址

Vuls:【GitHub传送门

许可证协议

本项目遵循GNU许可证协议。

* 参考来源:future-architect,FB小编Alpha_h4ck编译,转载请注明来自FreeBuf.COM

DeepState是一个框架,它为C和c++开发人员提供了一个公共接口,用于各种符号执行和模糊引擎。用户可以使用类似于Google Test的API编写一个测试工具,然后使用多个后端执行它,而不必了解底层引擎的复杂性。它支持编写单元测试和API序列测试,以及自动测试生成。

使用DeepState,我们就可以编写一个红黑树(red-black tree)模糊器。之后只需付出较少的努力,就可以将其变成一个功能更加全面的测试生成器。 尽管DeepState模糊器不需要很多的编码工作,但它支持回归测试(regressiontest)的重放,以减少用于调试的测试用例的大小,以及多个数据生成后端,包括Manticore,angr,libFuzzer和AFL。使用符号执行,我们甚至发现了原始模糊忽略的人为引入的漏洞。

在此,我保证你阅读完本文后,可以完全在自己的API中进行一次高质量的自动化测试。

背景信息

2013年,犹他州大学计算机系的John Regehr撰写了一篇关于“如何实现ADT的模糊测试”的博客。John详细地讨论了一些一般性问题,比如代码覆盖率、测试代码和差异测试。如果你尚未阅读John的文章,那么我建议你现在就阅读。

一般性的模糊测试很简单,只需要有一个测试软件,利用John的方法就可以在测试对象上提供一组函数或方法。我们在这篇文章中的运行示例是一个红黑树,不过,AVL树、文件系统、内存存储,甚至密码库都可以达到类似的测试目的。由于我们的目标是对软件进行彻底的测试,而传统的单元测试方法则是编写一系列看起来像以下这样的小函数。

result1 = foo(3, "hello");
result2 = bar(result1, "goodbye")
assert(result2 == DONE);

也就是说,每个测试都会按着这样的步骤来进行:“先运行一些测试内容,然后检查它是否和预期的是一样的。”这种方法有两个问题。首先,工作量很大。其次,这项工作的测试效果并不像你想象的那样好,每个测试都只针对一个测试内容,如果测试的人没有提前把潜在的问题考虑进去,那么测试过程也就会忽略这些问题。

而在模糊测试中,用随机坏数据(也称做 fuzz)攻击一个程序,然后等着观察哪里遭到了破坏。模糊测试的技巧在于,它是不符合逻辑的:自动模糊测试不去猜测哪个数据会导致破坏(就像人工测试员那样),而是将尽可能多的杂乱数据投入程序中。由这个测试验证过的失败模式通常对程序员来说是个彻底的震撼,因为任何按逻辑思考的人都不会想到这种失败。模糊测试是一项简单的技术,但它却能揭示出程序中的重要漏洞。它能够验证出现实世界中的错误模式并在您的软件发货前对潜在的应当被堵塞的攻击渠道进行提示。

模糊测试通常被认为会生成文件或数据包,但它也可以生成测试软件库的API调用序列。

foo_result = NULL;
bar_result = NULL;
repeat LENGTH times:
   switch (choice):
      choose_foo:
         foo_result = foo(randomInt(), randomString());
         break;
      choose_bar:
         bar_result = bar(foo_result, randomString());
         break;
      choose_baz:
         baz_result = baz(foo_result, bar_result);
         break;
   checkInvariants();

也就是说,fuzzer先反复选择要调用的随机函数,然后调用所选择的函数,测试期间可能会存储结果,以便在以后的函数调用中使用。

John的帖子不仅提供一般性建议,还包含了红黑树的工作模糊器的链接。这个模糊器是有效的,它是一个很好的例子,说明了如何使用基于随机值生成的可靠测试工具来真正测试API。但是,它也不是一个完全实用的测试工具。它虽然会生成输入,并测试红黑树,但当模糊器发现漏洞时,它只会打印一个漏洞信息随即便崩溃。你没有学到任何东西,除了“你的代码有一个漏洞”这样的信息外,我们再也得不到任何有价值的信息。

理想情况下,模糊器会自动将失败的测试序列存储在一个文件中,最小化这些序列以简化调试,并且可以在回归套件中重放过去的失败测试。编写支持所有这些基础设施的代码很是枯燥(尤其是在C/ c++中),而且会显著增加测试工作所需的工作量。另外处理类似捕获断言违规和硬崩溃的现象,以便在终止之前将测试编写到文件系统,也很难做到。

AFL和其他常用的模糊器通常会提供这种功能,这使得模糊测试成为一种更实用的调试工具。不幸的是,这种模糊测试器并不便于测试API。它们通常会生成一个文件或字节缓冲区,并期望被测试的程序将该文件作为输入。将一系列字节转换为红黑树测试可能比重新编写更有趣,但工作量也很大。你真正想要的是一个像GoogleTest这样的单元测试框架,但它能够改变测试中使用的输入值。有很多很好的随机测试工具,包括TSTL,但很少有复杂的工具以C / C ++为目标,而且据我所知,没有一个工具允许你使用除了工具内置的随机测试器之外的任何测试生成方法。这就是我们想要的GoogleTest,它能够使用libFuzzer,AFL,HonggFuzz或生成数据。

DeepState

DeepState满足了我以上提到的所有测试要求,甚至更多。将John的模糊器转换为DeepState测试工具相对容易,可以在文件deepstate_harness.cpp中找到DeepState的主要更改项,总共5项:

1.删除main并用一个已经命名的test (test (RBTree, GeneralFuzzer))替换它;

1.1DeepState文件可以包含多个名为test的测试,但是只有一个测试是可以用的;

2.只需在每个测试中创建一个树,而不是使用一个外部循环来迭代每次影响单个树的调用:

2.1与模糊测试循环不同,我的测试更接近于非常一般化的单元测试,即每个测试都会执行一个有趣的API调用序列;

2.2DeepState将处理运行多个测试,模糊或符号执行引擎将提供“外部循环”;

3.将每个API调用序列的长度固定为固定值,而不是随机值。

3.1文件顶部的#define LENGTH 100控制我们在每个测试中调用的函数数量;

3.2在每次测试中,字节都在相同的位置,这对基于突变的模糊器很有帮助。注意:极长的测试将超出libFuzzer的默认字节长度。

3.3只要它们不消耗那么多字节使得模糊器或DeepState达到它们的极限,或者找不到要变异的正确字节,更长的测试通常比更短的测试更好。可能有一个长度为5的序列暴露了你的漏洞,但是DeepState的暴力模糊器甚至libFuzzer和AFL可能很难找到它,并且更容易生成相同问题的长度为45的版本。另一方面,符号执行可以找到任意长度的罕见序列。

3.4为简单起见,我在我的工具中使用了#define,但是也可以将这些测试参数定义为带有默认值的可选命令行参数,以便在测试中获得更大的灵活性。只需使用与DeepState相同的工具来定义自己的命令行选项(请参阅DeepState.cDeepState.h)。

4用DeepState_Int()、DeepState_Char()和DeepState_IntInRange(…)调用替换各种rand() % NNN调用。

4.1 DeepState提供调用来生成你想要的大多数基本数据类型,可以选择在受限制的范围内生成。

4.2实际上你可以使用rand()代替DeepState调用,如果你的调用包含DeepState并已定义DEEPSTATE_TAKEOVER_RAND,则所有rand调用都将转换为适当的DeepState函数。 easy_deepstate_fuzzer.cpp文件显示了它的工作原理,但它并不理想,因为它不提供任何记录来显示测试期间发生的情况。这通常是将现有模糊器转换为使用DeepState的最简单方法。注意:John的模糊器的变化很小,90%的工作只是更改了一些include和删除main。

5. 用DeepState的OneOf结构替换选择要进行API调用的switch语句:

5.1 OneOf获取C ++ lambda的列表,并选择一个执行;

5.2此更改并不是必须的,但使用OneOf可简化代码并允许优化选择和减少智能测试工作量;

5.3另一个版本的OneOf接受一个固定大小的数组作为输入,并返回一些值,例如,OneOf(“abcd”)将产生一个字符a,b,c或d。

除此之外,还有许多其他的修饰性(例如格式化,变量命名)更改,但底线就是确保模糊器的本质属性不被破坏。通过这些更改,模糊器除了不运行fuzz_rb可执行文件,几乎和以前一样。我将使用DeepState运行我们定义的测试并生成输入值,选择要进行的函数调用,什么值插入在红黑树,以及由DeepState_Int,OneOf和其他调用表示的所有其他决策:

int GetValue() {
  if (!restrictValues) {
    return DeepState_Int();
  } else {
    return DeepState_IntInRange(0, valueRange);
  }
}
...
  for (int n = 0; n < LENGTH; n++) {
    OneOf(
      [&] {
        int key = GetValue();
        int* ip = (int*)malloc(sizeof(int));
        *ip = key;
        if (!noDuplicates || !containerFind(*ip)) {
          void* vp = voidP();
          LOG(TRACE) << n << ": INSERT:" << *ip << " " << vp;
          RBTreeInsert(tree, ip, vp);
          containerInsert(*ip, vp);
        } else {
          LOG(TRACE) << n << ": AVOIDING DUPLICATE INSERT:" << *ip;
          free(ip);
        }
      },
      [&] {
        int key = GetValue();
        LOG(TRACE) << n << ": FIND:" << key;
        if ((node = RBExactQuery(tree, &key))) {
          ASSERT(containerFind(key)) << "Expected to find " << key;
        } else {
          ASSERT(!containerFind(key)) << "Expected not to find " << key;
        }
      },
...

DeepState的安装

DeepState GitHub存储库提供了很多详细信息和依赖项,但在我的MacBook Pro上,安装很简单。

git clone https://github.com/trailofbits/deepstate
cd deepstate
mkdir build
cd build
cmake ..
sudo make install

构建启用了libFuzzer的版本稍微复杂一些:

brew install [email protected]
git clone https://github.com/trailofbits/deepstate
cd deepstate
mkdir build
cd build
CC=/usr/local/opt/llvm\@7/bin/clang CXX=/usr/local/opt/llvm\@7/bin/clang++ BUILD_LIBFUZZER=TRUE cmake ..
sudo make install

AFL也可用于为DeepState生成输入,但大多数情况下,原始速度(由于不需要分叉),比较分解和值配置文件似乎为libFuzzer提供了这种API测试的优势。有关在DeepState中使用AFL和其他基于文件的模糊器的更多信息,请参阅DeepState文件

使用DeepState红黑树模糊器

安装DeepState后,构建红黑树模糊器的过程也就很简单了。

git clone https://github.com/agroce/rb_tree_demo
cd rb_tree_demo
make

make命令使用了我们能想到的所有杀毒软件(address、undefined和integer)编译所有内容,以便在模糊处理中捕获更多漏洞。虽然这样做会降低运行性能,但却很有价值。

如果你使用macOS并使用非Apple clang来获得libFuzzer支持,那么你需要做以下的事情。

CC=/usr/local/opt/llvm\@7/bin/clang CXX=/usr/local/opt/llvm\@7/bin/clang++ make

这样,你就能使用到正确的编译器版本,例如,homebrew-installed。

这将为你提供一些不同的可执行程序,一个是fuzz_rb,它只是John使用的模糊器,使用时长只有60秒,ds_rb可执行文件是DeepState可执行文件。你可以用一个简单的BF算法模糊器来模糊红黑树。

mkdir tests
./ds_rb --fuzz --timeout 60 --output_test_dir tests

如果要查看有关fuzzer正在执行的操作的更多信息,可以使用–log_level指定日志级别,以明确要查看的信息的重要性。 log_level为0,则代表包括所有信息,甚至包括调试信息,log_level为1时,代表的是来自被测系统的TRACE信息(例如,由上面显示的LOG(TRACE)代码产生的信息)。log_level为2时,代表的是来自DeepState本身的INFO,非关键信息(这是默认的,通常是合适的), log_level为3时,代表的是警告信息,依此类推。在模糊测试结束时,测试目录应为空,因为repo中的红黑树代码是没有漏洞的。如果将–fuzz_save_passing添加到选项中,你将在目录中得到大量用于传递测试的文件。

最后,我们可以使用libFuzzer生成测试。

mkdir corpus
./ds_rb_lf corpus -use_value_profile=1 -detect_leaks=0 -max_total_time=60

ds_rb_lf可执行文件是普通的libFuzzer可执行文件,具有与libFuzzer相同的命令行选项。它将运行libFuzzer 60秒,并将任何有趣的输入(包括测试失败)放在语料库目录中。如果发生崩溃,它将在当前目录中留下崩溃的文件。你可以通过确定测试使用的最大输入大小来调整它,以在某些情况下执行得更好,但这是一项非常重要的练习。在长度为100的情况下,最大大小和4096字节之间的差距不是非常大。

对于更复杂的代码,像libFuzzer或AFL这样的基于覆盖的且基于工具的模糊器将比John的模糊器或简单的DeepState模糊器的随机性更强。对于像红黑树这样的例子,这可能没有那么重要。随机性更强的模糊器也具有产生测试语料库的优势,这些测试可以产生有趣的代码覆盖。 DeepState允许你使用更快的模糊器进行快速运行,并使用更智能的工具进行更深入的测试。

我可以轻松地重放任何DeepState生成的测试(来自libFuzzer或DeepState的模糊测试器):

./ds_rb --input_test_file file

或者重放整个测试目录:

./ds_rb --input_test_files_dir dir

在重放整个目录时添加–exit_on_fail标志,可让你在遇到失败或崩溃测试时立即停止测试。这种方法可以很容易的用于将DeepState中发现的失败添加到自动回归测试中。

认为的添加一个漏洞

虽然一切都很顺利,但它没有让我对John的模糊或DeepState充满信心。即使我们更改了Makefile来查看代码覆盖率,也很容易编写一个不检查正确行为的模糊器。也就是说模糊测试涵盖了所有内容,除了出现崩溃之外没有发现任何漏洞。要查看正在运行的模糊器,以及DeepState提供给我们的更多信息,我可以主动添加一个漏洞。转到red_black_tree.c的第267行,将1改为0。新文件和原始文件的差异应该如下所示:

267c267
<   x->parent->parent->red=0;
---
>   x->parent->parent->red=1;

使用新的red_black_tree.c重建所有模糊器后,运行John的模糊器会立即引发崩溃。

time ./fuzz_rb
Assertion failed: (left_black_cnt == right_black_cnt), function checkRepHelper, file red_black_tree.c, line 702.
Abort trap: 6
 
real 0m0.100s
user 0m0.008s
sys 0m0.070s

使用DeepState模糊器可以快速生成模糊结果:

time ./ds_rb --fuzz --log_level 1 --exit_on_fail --output_test_dir tests
INFO: Starting fuzzing
WARNING: No seed provided; using 1546625762
WARNING: No test specified, defaulting to last test defined (RBTree_GeneralFuzzer)
TRACE: Running: RBTree_GeneralFuzzer from deepstate_harness.cpp(78)
TRACE: deepstate_harness.cpp(122): 0: DELETE:-747598508
TRACE: deepstate_harness.cpp(190): checkRep...
TRACE: deepstate_harness.cpp(192): RBTreeVerify...
TRACE: deepstate_harness.cpp(122): 1: DELETE:831257296
TRACE: deepstate_harness.cpp(190): checkRep...
TRACE: deepstate_harness.cpp(192): RBTreeVerify...
TRACE: deepstate_harness.cpp(134): 2: PRED:1291220586
TRACE: deepstate_harness.cpp(190): checkRep...
TRACE: deepstate_harness.cpp(192): RBTreeVerify...
TRACE: deepstate_harness.cpp(190): checkRep...
TRACE: deepstate_harness.cpp(192): RBTreeVerify...
TRACE: deepstate_harness.cpp(154): 4: SUCC:-1845067087
TRACE: deepstate_harness.cpp(190): checkRep...
TRACE: deepstate_harness.cpp(192): RBTreeVerify...
TRACE: deepstate_harness.cpp(190): checkRep...
TRACE: deepstate_harness.cpp(192): RBTreeVerify...
TRACE: deepstate_harness.cpp(113): 6: FIND:-427918646
TRACE: deepstate_harness.cpp(190): checkRep...
...
TRACE: deepstate_harness.cpp(192): RBTreeVerify...
TRACE: deepstate_harness.cpp(103): 44: INSERT:-1835066397 0x00000000ffffff9c
TRACE: deepstate_harness.cpp(190): checkRep...
TRACE: deepstate_harness.cpp(192): RBTreeVerify...
TRACE: deepstate_harness.cpp(190): checkRep...
TRACE: deepstate_harness.cpp(192): RBTreeVerify...
TRACE: deepstate_harness.cpp(154): 46: SUCC:-244966140
TRACE: deepstate_harness.cpp(190): checkRep...
TRACE: deepstate_harness.cpp(192): RBTreeVerify...
TRACE: deepstate_harness.cpp(190): checkRep...
TRACE: deepstate_harness.cpp(192): RBTreeVerify...
TRACE: deepstate_harness.cpp(103): 48: INSERT:1679127713 0x00000000ffffffa4
TRACE: deepstate_harness.cpp(190): checkRep...
Assertion failed: (left_black_cnt == right_black_cnt), function checkRepHelper, file red_black_tree.c, line 702.
ERROR: Crashed: RBTree_GeneralFuzzer
INFO: Saved test case to file `tests/6de8b2ffd42af6878875833c0cbfa9ea09617285.crash`
...
real 0m0.148s
user 0m0.011s
sys 0m0.131s

为了方便本文的阐述,我做了一些精简,上面的代码只是详细输出的一部分。DeepState保与John的模糊器的最大区别在于,它保存了一个测试用例。当然,保存的测试用例的名称会有所不同,因为每个已保存的测试都会生成唯一名称。重放测试如下所示:

./ds_rb --input_test_file tests/6de8b2ffd42af6878875833c0cbfa9ea09617285.crash

而且我会再次看到整个过程细节,如上所述,这一长串看似任意的操作并不是最有帮助的测试。此时,DeepState可以帮助我们找到有用的信息。

deepstate-reduce ./ds_rb tests/6de8b2ffd42af6878875833c0cbfa9ea09617285.crash minimized.crash
ORIGINAL TEST HAS 8192 BYTES
LAST BYTE READ IS 509
SHRINKING TO IGNORE UNREAD BYTES
ONEOF REMOVAL REDUCED TEST TO 502 BYTES
ONEOF REMOVAL REDUCED TEST TO 494 BYTES
...
ONEOF REMOVAL REDUCED TEST TO 18 BYTES
ONEOF REMOVAL REDUCED TEST TO 2 BYTES
BYTE RANGE REMOVAL REDUCED TEST TO 1 BYTES
BYTE REDUCTION: BYTE 0 FROM 168 TO 0
NO (MORE) REDUCTIONS FOUND
PADDING TEST WITH 49 ZEROS
 
WRITING REDUCED TEST WITH 50 BYTES TO minimized.crash

同样,我省略了减少测试的一些冗长过程,新的测试结果更容易理解。

./ds_rb --input_test_file minimized.crash
WARNING: No test specified, defaulting to last test defined (RBTree_GeneralFuzzer)
TRACE: Initialized test input buffer with data from `minimized.crash`
TRACE: Running: RBTree_GeneralFuzzer from deepstate_harness.cpp(78)
TRACE: deepstate_harness.cpp(103): 0: INSERT:0 0x0000000000000000
TRACE: deepstate_harness.cpp(190): checkRep...
TRACE: deepstate_harness.cpp(192): RBTreeVerify...
TRACE: deepstate_harness.cpp(103): 1: INSERT:0 0x0000000000000000
TRACE: deepstate_harness.cpp(190): checkRep...
TRACE: deepstate_harness.cpp(192): RBTreeVerify...
TRACE: deepstate_harness.cpp(103): 2: INSERT:0 0x0000000000000000
TRACE: deepstate_harness.cpp(190): checkRep...
Assertion failed: (left_black_cnt == right_black_cnt), function checkRepHelper, file red_black_tree.c, line 702.
ERROR: Crashed: RBTree_GeneralFuzzer

我们只需要在树中插入三个相同的值就可以发现其中存在的漏洞,在继续操作之前,请记得修复red_black_tree.c!

你可以点此链接,观看整个过程。

在第2部分中,我将对测试的结果进行评估,看看DeepState测试是否与John的模糊测试一样有效?看看这两种方法在查找某些潜在的漏洞方面是否同样有效?符号执行是否也有同样的效果呢?敬请关注。

研究人员发现一起针对韩国网站的钓鱼攻击活动,该攻击活动已成功入侵4家韩国网站,并通过注入伪造的登陆表单来窃取用户凭证。攻击活动使用了水坑攻击来注入恶意JS代码到网站中以加载浏览器漏洞利用或窃取金融信息,这种钓鱼活动很少见。

研究人员将该攻击活动标记为Soula,它通过韩国主流搜索引擎的伪造的登陆屏来收集信息。它会发送记录的凭证到攻击者的服务器,因此研究人员认为攻击者仍然在验证和信息收集阶段。

攻击链

图1. Soula攻击链

注入的脚本会对网站访问者进行化学,并在主页顶部加载钓鱼表格。它可以扫描HTTP referer header字符串,并检查其中是否含有与主流搜索引擎和社交媒体站点相关的关键字,来验证访问者是否是真实的。因为HTTP referer header会识别到请求的页面的源的地址页,因此检查可以让他识别访问者是否是真实的用户,并过滤机器爬虫或威胁引擎扫描器。

然后脚本会扫描HTTP User-Agent header看是否含有iPhone, iPad, iPod, iOS和Android等字符串来识别用户使用的设备是电脑还是移动设备,然后发送对应的钓鱼表单到受害者。移动用户在点击了任意被黑网站上的按钮就会看到弹出的伪造的登陆表单。为了隐藏恶意活动,只有受害者访问页面6次以上才会启用弹窗,会设置一个cookie来对访问次数进行计数。Cookie有效期会设置为上次弹窗后2小时。

图2. 检查HTTP Referer和HTTP User-Agent的注入脚本

如果设备没有前面列出的字符串,Soula会假定用户使用桌面计算机访问网站。用户会在被黑的网页顶部看到伪造的登陆表单,邀请用户输入用户名和密码后才能继续访问站点。用户信息会字节发送到攻击者的服务器。为了防止被网站发现,钓鱼脚本设定浏览器cookie为初次交互后的12小时。

研究人员发现注释使用的简体中文,并使用Cloudflare来保护域名,隐藏真实IP地址。研究人员联系了Cloudflare停止为恶意域名提供服务,但是攻击活动并没有停止。事实上,攻击者进一步加强了检测绕过的特征。攻击者对注入被黑的站点的JS脚本增加了混淆,将脚本和钓鱼页面移动到被黑的web服务器来绕过检测和防止域名被移除。

图3.中文注释


图4. 注入的脚本混淆前后对比

结论

考虑到被黑的站点之一是韩国访问量前300的站点,而且搜索引擎主机提供的服务对韩国用户来说是可信的,因此Soula对用户和企业来说都是一个很严重的威胁。攻击者搜索和连接的内容字符串说明了犯罪分子的潜在计划是影响全球更多用户的更大规模的攻击活动。

与社会工程钓鱼攻击相比,这种技术更难追踪,终端用户仍然可以通过多层防护方法来保护自己。研究人员建议用户启用2FA来增加额外的认证过程和步骤。同时要从合法厂商处及时下载更新,并启用内容安全策略来防止非授权的访问以及远程注入脚本的漏洞利用使用。

一、起因

在复现分析Wordpress-5.0.0 RCE 的时候,因为在写图片的过程中,根据图片的dirname创建目录,而后根据basename写入图片。在目录创建成功的前提下,应该是可以写入文件的。但是情况却不是如此,过程中我要在写目标图片前,必须还要再写一个辅助图片。其实这个辅助图片不是很重要,而重要的是这个辅助图片的目录创建。

此过程中例如需要写入目标文件为:

探究PHP中的Mkdir函数

首先需要先写一张

探究PHP中的Mkdir函数

为什么会这样?假设直接写目标文件,过程中会首先创建目录:

探究PHP中的Mkdir函数

其实这个过程是没有创建任何目录的,因为判断是directoryalready ,到下一步写入图片这里是Imagick::writeImage,在这里就会出问题。invaildfile path.报错。因为这里不存在 /var/www/html/wordpress/wp-content/uploads/2019/03/1.jpg? 这个目录,这涉及到系统调用,因系统的不同相对于的系统处理函数处理的方式也不同。

列如在kali 下 Imagick::writeImage写入 ./1?/../1.png  , ./1? 这个目录是会报错的。具体系统调用如下:

1.4.png

首先判断了这个文件的状态,而后调用openat 打开这个文件并不存在。AT_FDCWD 表示打开的文件位置相对于当前目录。这是我在做的时候遇到的情况。

但是在 WORDPRESS IMAGE 远程代码执行漏洞分析 一文中,甚至其他另一篇。都没提到两次写图片。难道因为window和linux的不同吗?就这个问题我进行了一次对mkdir的探究。发现其实有很有趣。

二、PHP内核 && 系统差异 之mkdir()

2.1 Linux &&PHP 7.3.2-3

mkdir(‘./1?/../1′,777 ,true)

mkdir(‘./1?/../1′,777 false)

当第三参数为$recursivetrue  时可以写目录,先说一下这个参数的含义$recursive用来循环创建目录。什么意思呢,当false时只能创建1级目录,即目录连接符最后的一个目录。而当true 时是可以创建多级目录至到最后一个目录。列如./a/b/c当abc都不存在时,会通过系统函数mkdir循环创建目录,abc都会被创建,但若为false 会因为走到a处目录不存在,则不回去创建最后一个c。

但是第一个mkdir即使为true却也没有创建1? 目录,这里我们从php内部mkdir执行情况和 系统 mkdir  执行情况来探究。

2.1.1PHP_FUNTCION(mkdir)

PHP内调过程如下图:

11111.png

我们在出现分支的地方细分 
/php-src/main/streams/plain_wrapper.c

2.1.png

2.1.1.1 $recursive =fasle

其中出现的分支的地方在判断$recursive 若是不需要循环创建则直接进入php_mkdir

/php-src/ext/standard/file.c

2.2.png

跟进php_mkdir_ex

2.3.png

首先会检查open_basedir,接着会进入VCWD_MKDIR ,VCWD_MKDIR是个宏命令,有三种不同定义:

2.4.png

在这里我刚开始并没有考虑太多,跟着gdb的流程走,直接执行mkdir(),会直接调用系统的_mkdir() . mkdir(“./1?/../1″, 01411) = - 1 ENOENT (No such file or directory)

会直接报错。在预料之类,linux系统下mkdir是不允许这样创建目录的,会效验每一层目录的有效性。回到第一次出现分叉的时候。

2.1.1.2 $recursive =true

2.5.png

这里会进入expand_filepath_with_mode,这里其实很熟悉,之前也是在看路径处理的时候看到过这个函数,它是一个展开函数,会通过递归的方式展开需要被创建的目录。在其过程会先把相对目录和当前脚本执行目录评价起来,若是绝对目录则忽略. 
其中我们的相对目录为 
./1?/../1 会变成 /var/www/html/WordPress/wp-content/themes/4/5/6/./1?/../1 
当前我所在的目录为 /var/www/html/WordPress/wp-content/themes/4/5/6  
然后通过递归的方式 去掉 .././  ,//.并且对应目录前移,会变成 /var/www/html/WordPress/wp-content/themes/4/5/6/1  
然后在传递给系统的mkdir函数。

在这个函数里面存在win32 和linux的不同分支,但在具体处理之前win32判断了目录名不能存在 *

2.6.png

注意一下此处! 

附上strace ,也是验证上诉分析过程

1.   mkdir(“/var/www/html/WordPress/wp-content/themes/4/5/6/1″, 01411) = 0

2.1.2 Mkdir In Linux

在linux中单纯的mkdir是会层层验证目录,而后在创建一级目录。mkdir 也可以带参 -p,代表系统层面循环的创建目录。 
当执行mkdir -p 时 :

 strace -f -e trace =mkdir  mkdir -./1 ?/../1

 mkdir(“1?”, 0777 )  = 0

mkdir(“1″, 0777 )   = 0

我们能看到它并不像php内部那样,展开而后处理 。它会层层按照输入的目录创建。

2.2 window&& PHP 7.0.12

这里是我为什么要探究的一个重要问题点所在,在前面我提到的那篇文章中作者在window下实验当$recursivefalse 才能创建成功,正好是反着的。作者的解释的false的时候不会去层层判断,但是真的是这样吗?

而后我也做了一个验证性的实验,在window 上用 php 5.6做了这个测试,但是结果让我疑惑了,无论在false还是 true 的情况都不会创建目录.而且报错也很有意思,在false的情况下报错 no error 但是就是无法创建。在true的情况下报错 invaild path。

难道是php-cli 问题?我又用cgi测了一遍,发现同样是这样。有意思,而后我通过邮件联系了那篇文章作者,询问其版本号。很快,得到了他的答复,php-7.0.12

于是下载php-7.0.12源码 重新编译加debug,此处省略1000字… 
在编译完成后我迫不及待的试了一下,同样如此和我的php5.6 一摸一样,无论在cli 模式 或者 cgi 模式下都是无法复现作者文中的情况。这到底问题出在哪呢?

先调了再说,VS调试php 网上基本上没有详细的介绍,有的都是Vscode。我不知道如何启动并调试,只好想了个attach的办法。在mkdir前面写上sleep(10) ,但是这样做,其实是有一点鸡肋的,php内核初始化过程你其实抓不到的,但是用在这里够了,还是在php_plain_files_mkdir这个地方下断,刷新页面,attach到启动的php-cgi 上。

2.2.1PHP_FUNCTION(mkdir)

2.2.1.1 $recursive== false

还是先分析false的情况,前面都一样,不同的是在php_mkdir_ex VCWD_MKDIR调用的函数不一样

2.7.png

这次走到不一样的调用上

2.8.png

跟进virtual_mkdir

2.9.png

同样调用了virtual_file_ex(),前面有一点没提到,在expand展开路径的过程中最后其实也是进入的这个函数,前面说过在处理的过程中若是win32的情况会判断路径存不存在 * ?.若是存在则会直接返回1,不会进入后面写路径。为什么那篇文章的作者会在false的情况下写成功呢?

2.2.1.1 $recursive== true

这里前面说过这里会进行expand过程,但是同样会判断路径名中存不存在*? ,会报错 Invaild Path。

2.2.2 mkdir inwindow

这里因为没有都没有执行到写目录。此处我们还无法探究window系统mkdir 函数是如何执行的。

三、程安全与非线程安全

重新梳理一下,现在是三种不一样的情况: 
 linux /true 可写 
 window/7.0.12 : 

 1. false 可写 
 2. true/false 都不可写

window 出现了两种情况。仔细在走一遍window/false的情况,现在我唯一没有考虑到是VCWD_MKDIR  选择情况。前面都是跟着调试流程走的,这是唯一可能出现分叉的地方,重新看一下它的两种种宏定义:

3.1.png

若非那片文章作者,是走的第二个define,于是我把第一个define先注释掉了,换上了第二个define,再重新编译一边,结果竟然出现了和那篇作者一样的情况。但是这里有一个小小不同,写入的目录是相对于php-cgi.exe解释器的,不是相对于WWW的网站根目录下的,当你看了下面的分析以后,应该会给你一个答案,那么很显然问题现在出现在 VIRTUAL_DIR  定义的情况,在它没有定义的情况下,才会走到第二个define,我看看VIRTUAL_DIR 

是在哪被定义的

/php-src/Zend/zend_virtual_cwd.h

3.2.png

熟悉php内核的朋友不会陌生ZTS,这是php 线程安全的标志。用来应对那些使用线程来处理并发请求的Web服务器,列如window下的IIS,worker_mpm模式下的apahce,生活在线程里面的php需要考虑线程间的读写同时也要保证线程间是安全,所以php需要自己提供ZTS层来管理线程间的操作。当定义了ZTS时候,就也同时定义了虚拟目录(VIRTUAL_DIR)。为什么会存在虚拟目录这一说法呢,其实很简单你通过对应virtual_file_ex() 可以看出来,这个函数的目的在于针对相对路径替换出完整的绝对路径。举很简单的例子,php脚本中写的相对路径,其相对路径一定是针对于该脚本的。在执行脚本的过程中,会进入相应的php 内核里面的php_execute_script(),其中有一步是VCWD_CHDIR_FILE(filename) ,这是用来根据要执行的脚本位置去切换当前目录,同样这个宏定义有两个不同的函数,一个是在虚拟目录下切换目录,一个是非线程安全环境下单线程切换目录,不同是在线程安全下切换目录,并不是直接调用系统的_chdir(), 而是将执行脚本的目录存储在TSRMG中,并给定一个cwd_globals_id,要用的时候再去取,比如创建目录,写文件。因为在多线程环境不能直接修改当前进程的目录,只能预定义一个变量保存各线程的当前目录。 可以看到在线程安全的模式下,若是给的相对路径,都会出现当前目录和相对目录的拼接。且都在win32的环境都会检测目录是否包含* ,? .

四、结论汇总

我有注意到那篇的文章作者是在window 上用的phpstudy,我也去看了一下phpstudy的是否有7.0.12的版本,存在一个 php-7.0.12-nts+Apache  确实也是非线程安全。也印证上面我修改php7.0.12 重新编译的结果,但是一个很有趣的东西是,window的系统调用API _mkdir() 是存在和php内部一样的路径展开功能,即他是允许这样写的./1?/../1  可以在当前目录下写入文件夹1的,这和linux不一样,linux的系统函数是逐层判断。在php7.1之后,改变了系统创建目录的API,从_mkdir  变成了CreateDirectoryW,但是不变的是还是可以存在路径展开的功能。即便你这样写:@@#@[email protected]#$^%$&&**/@!#@!$!%/../../evil 也是可以创建目录evil的,可以算是一个小技巧。但是条件是在windowphp非线程安全模式和PHP_FUNCTION(mkdir) 第三个参数为false的情况下是可以这样写目录的。可以算是一个小tips吧。结合相应的应用特点,是可以用到的,而且php版本一般都是非线程安全的,在nginx下都是多进程处理php,即非线程安全。apache只有在worker_mpm才是多线程的,一般也不常用。一般都是prefork_mpm + php_mod,即便是fastcgi也是多进程。利用环境还是比较常见的。

1.1.png *本文作者:alphalab,转载请注明来自FreeBuf.COM

概述

安天CERT(安全研究与应急处理中心)在2018年12月至今,捕获多例针对中国用户的恶意宏文档攻击样本。这些恶意文档通过在模糊的文字背景上伪装出杀毒软件的安全检测结果,诱导受害者启用恶意宏代码,向Word进程自身注入Shellcode,最终在内存中解密和运行后门程序。根据对该后门的深入分析,我们发现该样本来自海莲花[1]组织。

安天于2015年5月27日发布关于该组织的分析报告[1]引发业内对该组织的持续关注。鉴于安天在当时所捕获的攻击中,发现了攻击方使用了商用攻击平台Cobalt Strike,安天将其命名为APT-TOCS(即借助CS平台的APT攻击组织),但由于使用CS只是该攻击组织的一个特点,且缺乏组织命名的地缘特点,因此,我们后续采用了友商360的命名——“海莲花”。

本次发现样本与2018年12月ESET[2]曝光过的海莲花专用后门极为相似,而通过对后门样本的C2进行关联,我们发现了更多通过恶意自解压程序传播该后门的样本。其中部分样本针对中国,更多的样本则针对柬埔寨等多国。部分自解压样本传播的后门,其C2直接连接到了已知的海莲花组织的网络基础设施。

根据专用后门和网络基础设施这两方面的强关联性,我们有理由相信这些样本关联的攻击行动是海莲花APT组织所为。

样本分析

2.1 样本标签

相关攻击载荷均为Word文档,但并未使用漏洞。而是在其中嵌入恶意宏代码,通过宏代码触发后续恶意行为,最终向目标主机植入后门,这是一个阶段以来较为流行的方式。攻击者为使受害目标启用宏代码,在文档正文中通过一段欺骗性内容诱导用户点击“启用内容”从而触发恶意宏代码执行,我们从这批样本中列举其中两个的情报标签:

表2‑1 恶意文档1

病毒名称 Trojan/Win32.VB.dropper
原始文件名 2018年公司总结报告补充建议.doc
文件大小 2.03 MB (2,127,360 bytes)          
文件格式 Document/Microsoft.Word
创建时间 2018-12-26 03:53:00
最后修改时间 2018-12-26 03:53:00
文档创建主机名 Admin
代码页 Latin I
VT首次上传时间 2019-03-07 04:44:06
VT检测结果 10/55

表2‑2 恶意文档2

病毒名称 Trojan/Win32.VB.dropper
文件大小 2.94 MB (3,083,776 bytes)
文件格式 Document/Microsoft.Word
创建时间 2019-01-24 02:39:00
最后修改时间 2019-01-24 02:39:00
文档创建主机名 Admin
代码页 Latin I
VT首次上传时间 2019-03-08 06:47:27
VT检测结果 10/59

2.2 技术分析

相关文档样本采用了社会工程技巧,伪装出360杀软的安全检测结果,诱导受害者启用附带的恶意宏,其正文内容见图2-1、图2-2所示。

image.png

图2-1 恶意文档1截图

image.png

图2-2 恶意文档2截图

恶意样本中包含被混淆的vb脚本,解混淆后发现此脚本作用为:

1.复制当前文件到%temp%文件夹下。

2.获取并解密第二段脚本,试图写入注册表(”HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Word\Security\AccessVBOM”)。此注册表值为1时,允许对文档的vb模块进行访问和修改,如下图所示:

image.png

图2-3 读取并修改注册表

3.打开%temp%下已复制的文档,移除文档中已存在的vb模块,写入新模块(图2-4):

image.png

图2-4 修改已复制文件

4.打开已复制文档调用vb模块中的“x_N0th1ngH3r3”函数如下图所示,之后,恶意文档显示一个虚假消息,如图2-5、图2-6所示:

image.png

图2-5 调用vb函数

image.png

图2-6 虚假消息显示

第二段脚本与第一段脚本有颇多相似之处,解密第三段脚本,然后其通过设置注册表,获得对自身vb资源修改的能力,并在文档自身中加入第三段脚本:

image.png

图2-7 第二段脚本主要功能(脚本已反混淆)

第三段脚本解密出shellcode,并将其注入到winword.exe进程中。脚本入口函数仍然命名为“x_N0th1ngH3r3”,此函数会区分64位或32位进程,采用适当方式进行进程注入:

image.png

图2-8 64位进程注入的前期准备

image.png

图2-9 32位进程注入的前期准备

注入进程的代码有908 KB (929,792 字节),经过深入分析发现,这段注入的代码会引导运行最终的后门程序,该后门已于2018年12月被ESET曝光,为海莲花组织所开发使用[2]。

后门程序的原始名称为“{A96B020F-0000-466F-A96D-A91BBF8EAC96}.dll”,见下图:

image.png

图2-10 后门程序在内存中的信息

后门首先进行初始化,将资源节RCData加载至内存中,解密出配置数据和库文件:

image.png

图2-11 后门资源节包含的RC4加密数据

其解密出的数据内容:

image.png

图2-12 内存中解密的配置数据和库文件

图2-12中从上至下的内容依次代表:

1.注册表位置:

HKEY_CURRENT_USER\Software\App\AppX70162486c7554f7f80f481985d67586d\Application
HKEY_CURRENT_USER\Software\App\AppX70162486c7554f7f80f481985d67586d\DefaultIcon

这两处注册表的键值存放后门C2返回给受害主机的唯一UUID,作为session ID,以实际调试为例:32034d33-aecc-47d4-9dcd-f0e56063087f。

2.httpprov库文件,用于支持HTTP/HTTPS/SOCKS的方式同C2通信,与libcurl静态链接。

初始化完成后,后门开始通过HTTP协议POST方式,依次与C2列表中可用的C2通讯。HTTP通讯的User Agent为:’Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)’。

image.png

图2-13 后门同C2通讯的硬编码User Agent

3.后门会针对受害主机生成一个指纹,其支持的功能包括:进程操作、注册表操作、获取硬盘信息、本地文件操作、释放和执行程序、内存注入等,同之前ESET曝光的版本没有大的变化[2]。如下图所示,case 0×1 移动文件、case 0×3 获取硬盘信息、在case 0、2、4、5还包含:0xe 文件遍历、0xf 删除文件、0×12 创建文件夹、0×13删除文件夹。

image.png

图2-14 后门指令分支

本次捕获的海莲花样本较以往在技术手段上有了一定程度的提高,使用宏代码进行Shellcode注入,其投放载荷的全程无文件落地,可以看出海莲花组织仍然在积极更新自身攻击手法,试图使自己更加隐蔽,进而图谋更长久的潜伏于受害者机器。

三、关联分析

在分析后门C2唯一解析IP:45.122.***.***的时候,我们注意到了该IP曾被一个伪装成Adobe Reader主程序的恶意自解压程序“AcroRd32.exe”作为C2连接使用:

image.png

图3-1 后门C2关联到的自解压程序

该RAR自解压程序上传时的文件名为“李建香 (个人简历).exe”,最后修改时间同恶意文档1较为接近,图标伪装成AdobeReader。运行后通过“regsvr32”命令注册运行恶意控件,然后打开提示加密的中文PDF文档,由于当前未获取密码,未能知悉正文内容,但目前看来该PDF文档是无恶意行为的。

image.png

图3-2 C2关联到的2018年12月攻击中国的自解压样本

通过样本关联我们找到了更早的时间内,使用相同手法攻击柬埔寨等国的自解压样本:

image.png

图3-3 2018年7月相同手法攻击越南的样本

image.png

图3-4 2018年8月VirusTotal平台上与柬埔寨通过网页上传的相同手法的恶意样本

image.png

图3-5 2019年1月攻击目标未知的相同手法样本

目前发现的所有相关自解压样本,其图标都伪装成Adobe Reader、Office和图片等,部分样本的文件名还会伪装成诸如:“AcroRd32.exe”、“Excel.exe”、“WinWord.exe”等:

image.png

图3-6 自解压程序样本的图标伪装

它们包含的图片和Word文档也都是正常文件,作用是成功运行恶意载荷后分散受害者的注意力。

所有自解压样本中包含的恶意OCX控件的作用,是在内存中解密和调用最终的后门,我们将提取出的所有后门样本同第2节中恶意文档释放的后门进行代码比对,发现彼此都高度一致,基本能确认具有相同的来源。其中部分后门的C2连接到了已知的海莲花组织的网络基础设施:154.16.***.***该IP曾被多家安全厂商多次曝光[3],为海莲花组织长期维护和使用。

小结

通过以上分析,海莲花组织近期依然保持活跃。其针对中国乃至东南亚多国用户发动攻击,通过投放带有恶意宏的文档和自解压程序最终传播海莲花组织的专用后门达成对目标的长期控制和信息窃取。从使用的后门武器和网络基础设施(其中部分后门则直接连接上了已知的海莲花组织的网络基础设施)的特性分析,相关证据都能表明这些样本来自海莲花攻击组织。

如我们此前在“2018年网络威胁年报(预发布)”指出的一样,当前“通过分析曝光的方式迫使APT攻击组织行为收敛”的效果已经大打折扣,相关攻击方在C2基础设施地址已经暴露后,依然继续使用则是一个明证。这一方面可以使我们放弃简单的敲山震虎,就可以让敌人退避三舍的幻想;另一方面,也增加了一般化能力的高级威胁行为体,攻击行为的暴露面,为排查分析和进一步猎杀提供了一定的机会和条件。

安天的产品体系通过长期自主研发的AVL SDK“下一代反病毒引擎”实现全格式识别与深度解析、复合文档拆解、宏的抽取;智甲终端防御系统在主机侧多个防御点上实现检测和拦截;探海威胁检测系统在流量侧进行实现攻击行为检测、载荷捕获检测解析;各环节发现的未知文件均可联动追影沙箱进行分析,输出威胁情报规则,在部署于具有较好的可管理性网络体系中时,能较好的应对类似等级的攻击风险。安天现有产品客户可通过订阅“高级威胁追溯包”,进行进一步的风险追溯排查。但如应对更高水平的攻击,则进一步需要实战化运行的战术型态势感知平台实现全局指控,掌控敌情,协同响应。

附录一:参考资料

[1]安天:一例针对中方机构的准APT攻击中所使用的样本分析

https://www.antiy.com/response/APT-TOCS.html

[2]ESET:OceanLotus Old techniques, new backdoor

https://www.welivesecurity.com/wp-content/uploads/2018/03/ESET_OceanLotus.pdf

[3]疑似“海莲花”组织早期针对国内高校的攻击活动分析

https://ti.360.net/blog/articles/oceanlotus-targets-chinese-university/

*本文作者:antiylab,转载请注明来自FreeBuf.COM

本周梗概

本周BUF大事件还是为大家带来了新鲜有趣的安全新闻,说到UC浏览器,我想早期的智能机用户一定不会陌生,但是最近UC浏览器被曝中间人攻击漏洞;春招高峰期,你的简历或许已被卖到数据黑产链。想要了解详情,来看本周的BUF大事件吧!

观看视频

看不到视频点这里

* 本文作者:willhuang,FreeBuf视频组荣誉出品,转载须注明来自FreeBuf.COM

黑产团伙对整个互联网行业有稳定的监控渠道并能够探测企业风控强度,他们能够找到风控薄弱的平台进行快速攻击和变现。

但是绝大部分企业方通过自身的数据流量是很难看清黑灰产业链的全貌,导致企业在面对黑灰产攻击时非常被动。因此我们决定定期对黑灰产的攻击行为进行披露,提高整个行业的黑灰产攻防意识,增强企业攻防主动性。

TAG:话费充值活动、薅羊毛、自动化工具、攻击流量、黑产资源

日期:2019年3月28日

事件描述 

概要

威胁猎人TH-Karma业务情报监测平台发现,2019年3月11日起有黑产团伙针对电商平台云集“话费充值9.7折”的营销活动进行持续的“薅羊毛攻击”。攻击量于2019年3月24日达到顶峰,远超日常黑灰产攻击流量的阈值。

image.png

薅羊毛逻辑:

云集发布“话费充值9.7折”营销活动,每个帐号每天可享受一次9.7折话费充值的优惠(50元以上)。

于是,有黑灰产团伙利用接码平台批量注册云集帐号。然后通过代充平台(蜜蜂等)向正常用户发布提供9.85折充值话费的服务。接到代充平台订单后,再通过囤积的帐号在云集平台上以9.7折的价格进行话费代充。

也就是说,每充值100元话费,黑灰产团伙就可赚取1.5元差价。

image.pngimage.png图为:代充平台充值业务
image.png(据TH-Karma监测,某云集账号从3月18号起,每天为不同的手机号充值一次,金额从50元到500元不等)

自动化攻击手法:

据威胁猎人TH-Karma业务情报监测平台监测,活动开始没多久,网络中就已经出现针对该活动的自动化攻击工具,且工具名多为“云集注册”、“云集注册+蜜蜂抢单”、“云集抢单最新专用”等。该类软件集成了云集平台批量注册,代充平台自动抢单、代充等一整套流程,黑产利用此类工具即可快速、大批量进行薅羊毛变现。

image.png

此类工具的主要功能如下:

通过接码平台自动注册或扫号,批量获取可用的云集帐号;

自动保存帐号的登录信息,用于自动批量登录;

检测帐号的当天剩余充值优惠次数及充值记录;

自动发起通过云集平台给指定手机号充值的请求;

部分工具配套在蜜蜂等平台抢代充话费订单的功能。

攻击规模

威胁猎人TH-Karma业务情报监测平台显示,针对云集话费充值优惠活动的攻击从2019年3月11日开始,并于2019年3月24日达到峰值,日攻击总量达到73W+。

image.png

黑灰产的成本和获利

黑灰产是一个完全趋利的群体,据威胁猎人的不完整统计,黑灰产仅2019年3月24日的单日获利可达80~100万。

具体成本与获利数据如下:

获利:

单个云集账号:1.5元/天;

成本:

注册账号:0.1元/个;

购买工具:100~200元不等。

威胁指标(IOC)

1.部分恶意手机号(部分)

17081471191
13807464940
18458343749
18458247757
18874696498
13456733041
17858410831
14709230712
13486394970
18334359597
15724966686
17139987161
15824448359
17191774886
13486380381
17847553440
13807463242
18334376250
17187663800
18314870955
17187663792

2.攻击源IP地址(部分,均为ADSL动态IP)

IP地址 归属地
125.44.92.188 河南省漯河市
115.234.109.148 浙江省温州市
221.234.159.51 湖北省武汉市
183.202.17.8 山西省临汾市 

3.攻击工具(部分)

文件名 MD5
云集8.92_(修正).exe 460aa3894442525a0bde4e5fb45aefb2
云集注册登录 .exe 878bd8f43a5e5fa4e0fce2ade55d36cb
云集1.5.exe 97bae6f7bb4d0c97949fc4a8ed43eacf
智· 云集充值助手 v1.8.exe 920de167dc7999cc27f10712f83b5d2b
超级抢单_新接口20.云集最新专用.zip 4e6d04d6cbbea85f74f31298dfd5bdc5
云集APP半自动注册+蜜蜂抢单.exe 6a3597258104f0b8c96cfa7afed7a1d4

4.黑产资源——接码平台:

http://api.duomi01.com/api

http://api.ipadh.cn/do.php

http://api.jmyzm.com/http.do

http://huoyun888.cn/api/do.php

http://www.517orange.com:9000/devApi

http://www.cherryun.com:8000/doApi 

威胁猎人建议

1.补充外部风险数据标签,对注册账号进行风险识别。

2.做好业务流量监控,借助外部的情报能力,确保能及时发现黑灰产攻击动态,调整更新失效的风控策略。

关于我们

威胁猎人是一家以业务安全情报能力见长的创新型安全企业,旨在为客户提供业务攻防情报,从防控到打击的全方位业务安全解决方案。自成立始,公司投入大量资源,打造了一整套国内领先的业务安全情报监控与预警体系,形成强大的黑灰产布控能力,为客户提供黑灰产情报及业务风控解决方案。目前已为腾讯、百度、阿里、华为等互联网企业提供业务安全服务。

*本文作者:威胁猎人Threathunter,转载请注明来自FreeBuf.COM

北京时间3月28日早间消息,据美国科技媒体TechCrunch报道,一名信息安全研究员两个月前向华硕发出警告称,有华硕员工在GitHub代码库中错误地发布了密码。这些密码可以被用于访问该公司的企业内网。

其中一个密码出现在一名员工分享的代码库中。通过该密码,研究员可以访问内部开发者和工程师使用的电子邮件帐号,从而与计算机的使用者分享夜间构建的应用、驱动和工具。有问题的代码库来自华硕的一名工程师,他将电子邮件帐号密码公开已有至少一年时间。目前,尽管GitHub帐号仍然存在,但这个代码库已被清理。

这位网名为SchizoDuckie的研究员表示:“这是个每天发布自动构建版本的邮箱。”邮箱中的邮件包含存储驱动和文件的具体内网路径。研究员也分享了多张截图以证实他的发现。

该研究员没有测试,通过这个账号具体能获得哪些信息,但警告称进入企业内网会非常容易。他表示:“你所需要的就是发送一封带附件的电子邮件给任何一名收件人,进行鱼叉式钓鱼攻击。”

通过华硕专用的信息安全邮箱地址,该研究员向华硕发出了密码泄露的警告。6天后,他无法再登录该邮箱,并认为问题已经解决。

不过他随后又发现,在GitHub上,至少还有两起华硕工程师泄露公司密码的事件。

华硕总部的一名软件架构师在GitHub页面上留下了用户名和密码。另一名数据工程师在代码中也泄露了密码。这位研究员表示:“许多公司并不知道,他们的程序员在GitHub上用代码做了什么。”

在媒体向华硕告知此事的一天后,包含密码的代码库被下线并清理。不过华硕发言人表示,该公司“无法证实”研究员在邮件中的说法是正确的。“华硕正在积极调查所有系统,消除我们服务器和支持软件的所有已知风险,并确保没有数据泄露。”

今天给大家介绍的是一款名叫AutoRDPwn的隐蔽型攻击框架,实际上AutoRDPwn是一个PowerShell脚本,它可以实现对Windows设备的自动化攻击。这个漏洞允许远程攻击者在用户毫不知情的情况下查看用户的桌面,甚至还可以通过恶意请求来实现桌面的远程控制。

环境要求

PowerShell4.0或更高版本。

新版本v 4.8增加的功能

兼容PowerShell 4.0

自动复制粘贴剪切板中的内容(密码、哈希等)

自动屏蔽Windows Defender(采用了四种不同的方法)

无需密码即可利用PSexec、WMI和Invoke-Command实现远程代码执行

新增攻击方式:DCOM无密码执行

新增攻击模块:远程访问/Metasploit Web传送

新增攻击模块:远程VNC服务器(针对遗留环境)

自动填写主机名、用户名和密码域

可使用-noadmin参数在没有管理员权限的情况下运行攻击模块

工具使用

这款应用程序可以直接在本地使用,也可以远程使用,或者是在两台设备间使用。在引入了额外功能模块之后,该工具甚至还可以导出哈希或密码,获取远程Shell,上传或下载文件,甚至是破解无线网络的密码以及恢复RDP连接历史记录等等。

一行命令即可执行

powershell -ep bypass "cd $env:temp ; iwr https://darkbyte.net/autordpwn.php -outfileAutoRDPwn.ps1 ; .\AutoRDPwn.ps1"

2.png

我们可以在程序的主菜单中查看和选择需要使用或加载的攻击模块:

[1] –PsExec

[2] –Pass the Hash

[3] –Windows Management Instrumentation

[4] –Schedule Task / PSSession

[5] –Windows Remote Assistance

工具的详细使用文档:【传送门

工具截图

3.png4.png

项目地址

AutoRDPwn:【GitHub传送门

* 参考来源:arthastang,FB小编Alpha_h4ck编译,转载请注明来自FreeBuf.COM