最近朋友的一個網(wǎng)站被掛了黑鏈,被叫去做技術(shù)支持==!
簡單介紹一下具體情況:
訪問網(wǎng)站:www.xinsanwen.cn顯示的是黑鏈地址,通過審查元素可以清晰的看到這些被加密過的文件。如果你看不懂這些符號沒關(guān)系,我們可以通過JS機(jī)密基本看到一些信息。
記錄一次帝國CMS模板被木馬入侵后清理的過程,其他CMS類似【大佬勿噴】
記錄一次帝國CMS模板被木馬入侵后清理的過程,其他CMS類似【大佬勿噴】
可能很多小伙伴沒辦法審查元素,因?yàn)槟阋淮蜷_網(wǎng)址就跳轉(zhuǎn)走了,不要慌,知道君教你們一個簡單的辦法。【其他網(wǎng)站類似】
1、先隨便打開一個網(wǎng)址:我一般打開百度,鼠標(biāo)右鍵查看源碼,然后把我們的域名復(fù)制過去就可以看到網(wǎng)站的html了。
記錄一次帝國CMS模板被木馬入侵后清理的過程,其他CMS類似【大佬勿噴】
記錄一次帝國CMS模板被木馬入侵后清理的過程,其他CMS類似【大佬勿噴】
2、把html中的快照劫持代碼清除,【像這種代碼,一般存在模板中】
記錄一次帝國CMS模板被木馬入侵后清理的過程,其他CMS類似【大佬勿噴】
有小伙伴可能覺得把這個刪除就OK了,那你就大錯特錯,刪除這里只是第一步,你還得繼續(xù)找到核心的木馬文件,這種后門文件可能是一個,也可能是N個,在不借助外來工具的情況下,我們就需要一步步一個個文件夾去查看。當(dāng)然如果你有其他工具配合使用當(dāng)然更好。我一般使用D盾,如果是像織夢這樣的文件比較少的我會直接找,但是今天我朋友這個是帝國的,文件稍微有點(diǎn)多,一個個找太費(fèi)時間了,所以選擇D盾。
3、將網(wǎng)站源碼下載到本地的一個文件夾內(nèi)。放哪都無所謂,一會好找就行。
4、下載D盾,并解壓,打開。
記錄一次帝國CMS模板被木馬入侵后清理的過程,其他CMS類似【大佬勿噴】
5、自定義掃描(選中我們剛剛下載的源碼)
記錄一次帝國CMS模板被木馬入侵后清理的過程,其他CMS類似【大佬勿噴】
6、細(xì)觀察這個圖,上面第一列是木馬文件的路徑,級別越高,危害越大。后面有說明。
記錄一次帝國CMS模板被木馬入侵后清理的過程,其他CMS類似【大佬勿噴】
對于已知后門,直接刪除
對于不確定的,我們可以拿帝國CMS源程序比對。
刪除完畢。
7、將本地文件打包上傳會網(wǎng)站。
8、清除模板中的快照劫持代碼
記錄一次帝國CMS模板被木馬入侵后清理的過程,其他CMS類似【大佬勿噴】
這個文件夾下面,大家自行檢查。里面如果有被放的代碼,可以直接清除或是拿原來的模板覆蓋。
對了,最后一步差點(diǎn)忘記了,記得去各個搜索引擎提交更新快照。怎么更新快照這邊就不繼續(xù)延展了,后面有時間再繼續(xù)。
以上就是網(wǎng)站入侵后清除木馬方法。下面講下清除木馬后或是未掛馬之前防范方法。
(1)建議修改后臺路徑,將e/admin修改成任意一個你喜歡的名字。
(2)修改默認(rèn)用戶名和密碼
(3)刪除e/install等不用文件夾
(3)網(wǎng)上下載的程序或者模板建議先好好檢查下
(4)不要被免費(fèi)的外殼所蒙蔽
(5)平時多總結(jié)經(jīng)驗(yàn),這樣才能防范于未然
以上,如果不更新的話,知道就建議可以將網(wǎng)站權(quán)限設(shè)為只讀!更安全!
華社北京11月20日電 為有效應(yīng)對網(wǎng)絡(luò)安全威脅和風(fēng)險(xiǎn),保障網(wǎng)絡(luò)運(yùn)行安全,國家互聯(lián)網(wǎng)信息辦公室20日就《網(wǎng)絡(luò)安全威脅信息發(fā)布管理辦法(征求意見稿)》公開征求社會意見,對發(fā)布網(wǎng)絡(luò)安全威脅信息的行為作出規(guī)范。
國家網(wǎng)信辦有關(guān)負(fù)責(zé)人表示,當(dāng)前,網(wǎng)絡(luò)安全產(chǎn)業(yè)迅猛發(fā)展,許多網(wǎng)絡(luò)安全研究者和網(wǎng)絡(luò)安全企業(yè)出于提高公民網(wǎng)絡(luò)安全意識、交流網(wǎng)絡(luò)安全技術(shù)等目的,積極向社會發(fā)布網(wǎng)絡(luò)安全威脅信息,為維護(hù)國家網(wǎng)絡(luò)空間安全作出貢獻(xiàn)。但是,網(wǎng)絡(luò)安全威脅信息的發(fā)布仍存在很多問題。為進(jìn)一步規(guī)范網(wǎng)絡(luò)安全威脅信息發(fā)布行為,國家網(wǎng)信辦會同公安部等有關(guān)部門依據(jù)職責(zé)制定了這一辦法的征求意見稿。
根據(jù)征求意見稿,網(wǎng)絡(luò)安全威脅信息包括對可能威脅網(wǎng)絡(luò)正常運(yùn)行的行為,用于描述其意圖、方法、工具、過程、結(jié)果等的信息;以及可能暴露網(wǎng)絡(luò)脆弱性的信息。
征求意見稿明確,發(fā)布的網(wǎng)絡(luò)安全威脅信息不得包含計(jì)算機(jī)病毒、木馬、勒索軟件等惡意程序的源代碼和制作方法;專門用于從事侵入網(wǎng)絡(luò)、干擾網(wǎng)絡(luò)正常功能、破壞網(wǎng)絡(luò)防護(hù)措施或竊取網(wǎng)絡(luò)數(shù)據(jù)等危害網(wǎng)絡(luò)活動的程序、工具;能夠完整復(fù)現(xiàn)網(wǎng)絡(luò)攻擊、網(wǎng)絡(luò)侵入過程的細(xì)節(jié)信息;數(shù)據(jù)泄露事件中泄露的數(shù)據(jù)內(nèi)容本身以及其他可能被直接用于危害網(wǎng)絡(luò)正常運(yùn)行的內(nèi)容等。
“上述網(wǎng)絡(luò)安全威脅信息容易被惡意分子或網(wǎng)絡(luò)黑產(chǎn)從業(yè)人員直接利用,降低了網(wǎng)絡(luò)攻擊的門檻,因此從維護(hù)網(wǎng)絡(luò)安全的角度,要求發(fā)布網(wǎng)絡(luò)安全威脅信息時不得包含上述內(nèi)容。”國家網(wǎng)信辦有關(guān)負(fù)責(zé)人表示,網(wǎng)絡(luò)安全從業(yè)者、愛好者仍可通過多種方式加強(qiáng)原理和技術(shù)研究,提高網(wǎng)絡(luò)安全能力水平。
征求意見稿要求,發(fā)布網(wǎng)絡(luò)和信息系統(tǒng)被攻擊破壞、非法侵入等網(wǎng)絡(luò)安全事件信息前,應(yīng)向該事件發(fā)生所在地地市級以上公安機(jī)關(guān)報(bào)告。未經(jīng)政府部門批準(zhǔn)和授權(quán),任何企業(yè)、社會組織和個人發(fā)布網(wǎng)絡(luò)安全威脅信息時,標(biāo)題中不得含有“預(yù)警”字樣。
park-Submit 提交命令
啟動進(jìn)程 SparkSubmit: (SparkSubmit.scala)
--> main //啟動進(jìn)程
--> SparkSubmitArguments() //首先通過此類獲取 Spark-Submit參數(shù)
--> 通過SparkSubmitArguments類屬性action判斷 Spark-Submit 操作(默認(rèn)為SUBMIT)
--> submit() //action為SUBMIT
--> prepareSubmitEnvironment() //準(zhǔn)備提交環(huán)境
--> childMainClass=args.mainClass //deployMode==CLIENT
--> childMainClass=YARN_CLUSTER_SUBMIT_CLASS
//deployMode==Cluster ("org.apache.spark.deploy.yarn.YarnClusterApplication")
Scala val (childArgs, childClasspath, sparkConf, childMainClass)=prepareSubmitEnvironment(args) //函數(shù)返回的是個Tuple,此處用到了一個模式匹配 |
--> 判斷是否是standalone模式:
--> doRunMain() //會先判斷傳入?yún)?shù)代理用戶 proxyUser
--> runMain(childArgs, childClasspath, sparkConf, childMainClass, args.verbose)
//將之前準(zhǔn)備的參數(shù)傳遞給此函數(shù)
--> Thread.currentThread.setContextClassLoader(loader) //默認(rèn)使用當(dāng)前線程的類加載器,然后從類加載器中讀取 jar包等數(shù)據(jù),然后設(shè)定一些參數(shù)。
--> mainClass=Utils.classForName(childMainClass) //然后反射加載類,獲取到了mainClass
--> new JavaMainApplication(mainClass) //根據(jù)mainClass創(chuàng)建app對象
--> app.start(childArgs.toArray, sparkConf) //判斷類中有沒有main方法,還要判斷main方法是否是static
--> mainMethod.invoke(null, args) //調(diào)用main方法
Client
--> YarnClusterApplication (org.apache.spark.deploy.yarn.Client.scala)
--> new Client(new ClientArguments(args), conf)
--> private val yarnClient =YarnClient.createYarnClient
--> YarnClient client=new YarnClientImpl()
--> AM 相關(guān)配置
-->client.run()
--> this.appId =submitApplication() //會返回一個全局 app id
--> launcherBackend.connect() //創(chuàng)建后臺鏈接
--> yarnClient.init(hadoopConf)
--> serviceInit(config); //overwrite了抽象類AbstractService的serviceInit函數(shù) (YarnClientImpl extends YarnClient extends AbstractService)
--> timelineDTRenewer=getTimelineDelegationTokenRenewer(conf);
--> renewer=SecurityUtil.getServerPrincipal(rmPrincipal, rmHost);
--> yarnClient.start() //啟動與Yarn服務(wù)器之間的鏈接
// Get a new application from our RM
--> val newApp=yarnClient.createApplication()
--> val newAppResponse=newApp.getNewApplicationResponse() //獲取返回信息
--> appId=newAppResponse.getApplicationId() //獲取appID
// Set up the appropriate contexts to launch our AM
--> val containerContext=createContainerLaunchContext(newAppResponse)
//This sets up the launch environment, java options, and the command for launching the AM (封裝一個command對象amContainer傳給Yarn,進(jìn)而Yarn就會知道應(yīng)該執(zhí)行什么指令)
//封裝的指令 command=bin/java -server org.apache.spark.deploy.yarn.ApplicationMaster (Cluster)
//封裝的指令 command=bin/java -server org.apache.spark.deploy.yarn.ExecutorLauncher (Client)
--> val appContext=createApplicationSubmissionContext(newApp, containerContext)
--> yarnClient.submitApplication(appContext) //通過yarn客戶端向RM提交應(yīng)用 (實(shí)質(zhì)提交的是指令,創(chuàng)建了一個AM進(jìn)程)
ApplicationMaster(AM)
--> main
--> val amArgs=new ApplicationMasterArguments(args) //參數(shù)對象封裝
--> master =new ApplicationMaster(amArgs) //創(chuàng)建應(yīng)用管理器對象
--> private val client =doAsUser { new YarnRMClient() } //ApplicationMaster對象中有一個RM客戶端屬性;AM是在Yarn的NM中,但還是要跟RM鏈接申請資源。
--> master.run()
--> runImpl()
--> runDriver() //Cluster
--> startUserApplication() //啟動用戶應(yīng)用,也就是--calss 指定的類
Scala val mainMethod=userClassLoader.loadClass(args.userClass) .getMethod("main", classOf[Array[String]]) //利用類加載器,加載用戶定義的類,然后獲取main方法 |
--> val userThread=new Thread{....} //創(chuàng)建一個用戶線程
--> userThread.setName("Driver") //給線程命名
--> userThread.start() //啟動Driver線程 (在AM上),執(zhí)行的就是剛才獲取到的用戶類中的main方法
// AM 和 RM 是做資源調(diào)度的,而 Driver線程 是用來做計(jì)算的;資源 和 計(jì)算 沒有直接鏈接,為了降低耦合性 資源 跟 計(jì)算 之間加了 AM;所以說 AM 是一個中間的對象,既能跟RM資源交互,又能夠跟 Driver 計(jì)算交互。
--> registerAM(sc.getConf, rpcEnv, driverRef, sc.ui.map(_.webUrl)) //注冊 AM
--> val driverUrl=RpcEndpointAddress(.....) //RPC鏈接需要終端地址,此處是Driver端的地址
--> allocator =client.register(....) //此處的client是YarnRMClient對象,就是為了向RM申請資源用的; allocator是YarnAllocator類對象。
--> allocator.allocateResources() // AM 與 RM 建立鏈接之后,開始分配資源
--> handleAllocatedContainers(allocatedContainers.asScala) //分配到容器資源之后,就開始處理容器資源
--> 本地化操作:(優(yōu)先位置:移動數(shù)據(jù)不如移動計(jì)算;當(dāng)需要發(fā)送計(jì)算給Executor時,最好發(fā)送到其數(shù)據(jù)所在的節(jié)點(diǎn)。)如果不能保證優(yōu)先位置,也可以保證節(jié)點(diǎn)本地化(node-local),但是同一臺節(jié)點(diǎn)也可能資源不夠,可以保證 機(jī)架本地化(rack-local)
--> runAllocatedContainers(containersToUse) //處理好Container之后,就開始運(yùn)行這些Container
--> launcherPool.execute //這里用到一個 緩沖的守護(hù)線程池 launcherPool,它是ThreadUtils.newDaemonCachedThreadPool類對象。
--> new ExecutorRunnable(.....).run
--> var nmClient: NMClient=_ //ExecutorRunnable對象中包括一個nmClient成員,用來供AM與NM之間建立鏈接
--> startContainer()
--> val commands=prepareCommand() //又在準(zhǔn)備command對象:command=/bin/java -server org.apache.spark.executor.CoarseGrainedExecutorBackend
// 說明 AM 向 其他NM 發(fā)送一個指令,在其他 NM 上創(chuàng)建了一個java進(jìn)程(也就是Executor的后臺程序)。
--> userClassThread.join() //將Driver線程進(jìn)行join操作,表示Driver線程如果不執(zhí)行完,邏輯不會往下走的;join 是把另外一個線程加入到當(dāng)前線程中,目的是保證被加入的線程能夠執(zhí)行完。
CoarseGrainedExecutorBackend(Executor)
--> main
--> run(driverUrl, executorId, hostname, cores, appId, workerUrl, userClassPath)
--> env.rpcEnv.awaitTermination() //等待環(huán)境配置好 ;Executor要與其他進(jìn)程進(jìn)行交互,就需要配置終端
--> env.rpcEnv.setupEndpoint("Executor", new CoarseGrainedExecutorBackend(
env.rpcEnv, driverUrl, executorId, hostname, cores, userClassPath, env))
--> var executor: Executor //在后臺程序CoarseGrainedExecutorBackend類中又一個Executor的成員對象 ;所以接下來的任務(wù)實(shí)際是發(fā)送給后臺程序的,然后由其成員對象Executor執(zhí)行計(jì)算;
//后臺程序CoarseGrainedExecutorBackend類繼承了ThreadSafeRpcEndpoint終端類,此類描述如下:
Scala * An end point for the RPC that defines what functions to trigger given a message. * It is guaranteed that `onStart`, `receive` and `onStop` will be called in sequence. * The life-cycle of an endpoint is: * {@code constructor -> onStart -> receive* -> onStop} |
//由上可看出,后臺程序CoarseGrainedExecutorBackend類也是一個終端類,也會有終端的生命周期 constructor -> onStart -> receive* -> onStop。
--> onStart()
--> ref.ask[Boolean](RegisterExecutor(executorId, self, hostname, cores, extractLogUrls)) //它向Driver 反向注冊
--> recevie()
--> case RegisteredExecutor //當(dāng)接收到 Driver返回的“注冊完成”,則表示注冊成功,緊接著創(chuàng)建Executor對象
--> case LaunchTask(data) //當(dāng)收到LauchTask表示要啟動任務(wù)
*請認(rèn)真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。