最近朋友的一个网站被挂了黑链,被叫去做技术支持==!
简单介绍一下具体情况:
访问网站:www.xinsanwen.cn显示的是黑链地址,通过审查元素可以清晰的看到这些被加密过的文件。如果你看不懂这些符号没关系,我们可以通过JS机密基本看到一些信息。
记录一次帝国CMS模板被木马入侵后清理的过程,其他CMS类似【大佬勿喷】
记录一次帝国CMS模板被木马入侵后清理的过程,其他CMS类似【大佬勿喷】
可能很多小伙伴没办法审查元素,因为你一打开网址就跳转走了,不要慌,知道君教你们一个简单的办法。【其他网站类似】
1、先随便打开一个网址:我一般打开百度,鼠标右键查看源码,然后把我们的域名复制过去就可以看到网站的html了。
记录一次帝国CMS模板被木马入侵后清理的过程,其他CMS类似【大佬勿喷】
记录一次帝国CMS模板被木马入侵后清理的过程,其他CMS类似【大佬勿喷】
2、把html中的快照劫持代码清除,【像这种代码,一般存在模板中】
记录一次帝国CMS模板被木马入侵后清理的过程,其他CMS类似【大佬勿喷】
有小伙伴可能觉得把这个删除就OK了,那你就大错特错,删除这里只是第一步,你还得继续找到核心的木马文件,这种后门文件可能是一个,也可能是N个,在不借助外来工具的情况下,我们就需要一步步一个个文件夹去查看。当然如果你有其他工具配合使用当然更好。我一般使用D盾,如果是像织梦这样的文件比较少的我会直接找,但是今天我朋友这个是帝国的,文件稍微有点多,一个个找太费时间了,所以选择D盾。
3、将网站源码下载到本地的一个文件夹内。放哪都无所谓,一会好找就行。
4、下载D盾,并解压,打开。
记录一次帝国CMS模板被木马入侵后清理的过程,其他CMS类似【大佬勿喷】
5、自定义扫描(选中我们刚刚下载的源码)
记录一次帝国CMS模板被木马入侵后清理的过程,其他CMS类似【大佬勿喷】
6、细观察这个图,上面第一列是木马文件的路径,级别越高,危害越大。后面有说明。
记录一次帝国CMS模板被木马入侵后清理的过程,其他CMS类似【大佬勿喷】
对于已知后门,直接删除
对于不确定的,我们可以拿帝国CMS源程序比对。
删除完毕。
7、将本地文件打包上传会网站。
8、清除模板中的快照劫持代码
记录一次帝国CMS模板被木马入侵后清理的过程,其他CMS类似【大佬勿喷】
这个文件夹下面,大家自行检查。里面如果有被放的代码,可以直接清除或是拿原来的模板覆盖。
对了,最后一步差点忘记了,记得去各个搜索引擎提交更新快照。怎么更新快照这边就不继续延展了,后面有时间再继续。
以上就是网站入侵后清除木马方法。下面讲下清除木马后或是未挂马之前防范方法。
(1)建议修改后台路径,将e/admin修改成任意一个你喜欢的名字。
(2)修改默认用户名和密码
(3)删除e/install等不用文件夹
(3)网上下载的程序或者模板建议先好好检查下
(4)不要被免费的外壳所蒙蔽
(5)平时多总结经验,这样才能防范于未然
以上,如果不更新的话,知道就建议可以将网站权限设为只读!更安全!
华社北京11月20日电 为有效应对网络安全威胁和风险,保障网络运行安全,国家互联网信息办公室20日就《网络安全威胁信息发布管理办法(征求意见稿)》公开征求社会意见,对发布网络安全威胁信息的行为作出规范。
国家网信办有关负责人表示,当前,网络安全产业迅猛发展,许多网络安全研究者和网络安全企业出于提高公民网络安全意识、交流网络安全技术等目的,积极向社会发布网络安全威胁信息,为维护国家网络空间安全作出贡献。但是,网络安全威胁信息的发布仍存在很多问题。为进一步规范网络安全威胁信息发布行为,国家网信办会同公安部等有关部门依据职责制定了这一办法的征求意见稿。
根据征求意见稿,网络安全威胁信息包括对可能威胁网络正常运行的行为,用于描述其意图、方法、工具、过程、结果等的信息;以及可能暴露网络脆弱性的信息。
征求意见稿明确,发布的网络安全威胁信息不得包含计算机病毒、木马、勒索软件等恶意程序的源代码和制作方法;专门用于从事侵入网络、干扰网络正常功能、破坏网络防护措施或窃取网络数据等危害网络活动的程序、工具;能够完整复现网络攻击、网络侵入过程的细节信息;数据泄露事件中泄露的数据内容本身以及其他可能被直接用于危害网络正常运行的内容等。
“上述网络安全威胁信息容易被恶意分子或网络黑产从业人员直接利用,降低了网络攻击的门槛,因此从维护网络安全的角度,要求发布网络安全威胁信息时不得包含上述内容。”国家网信办有关负责人表示,网络安全从业者、爱好者仍可通过多种方式加强原理和技术研究,提高网络安全能力水平。
征求意见稿要求,发布网络和信息系统被攻击破坏、非法侵入等网络安全事件信息前,应向该事件发生所在地地市级以上公安机关报告。未经政府部门批准和授权,任何企业、社会组织和个人发布网络安全威胁信息时,标题中不得含有“预警”字样。
park-Submit 提交命令
启动进程 SparkSubmit: (SparkSubmit.scala)
--> main //启动进程
--> SparkSubmitArguments() //首先通过此类获取 Spark-Submit参数
--> 通过SparkSubmitArguments类属性action判断 Spark-Submit 操作(默认为SUBMIT)
--> submit() //action为SUBMIT
--> prepareSubmitEnvironment() //准备提交环境
--> 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) //函数返回的是个Tuple,此处用到了一个模式匹配 |
--> 判断是否是standalone模式:
--> doRunMain() //会先判断传入参数代理用户 proxyUser
--> runMain(childArgs, childClasspath, sparkConf, childMainClass, args.verbose)
//将之前准备的参数传递给此函数
--> Thread.currentThread.setContextClassLoader(loader) //默认使用当前线程的类加载器,然后从类加载器中读取 jar包等数据,然后设定一些参数。
--> mainClass=Utils.classForName(childMainClass) //然后反射加载类,获取到了mainClass
--> new JavaMainApplication(mainClass) //根据mainClass创建app对象
--> app.start(childArgs.toArray, sparkConf) //判断类中有没有main方法,还要判断main方法是否是static
--> mainMethod.invoke(null, args) //调用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 相关配置
-->client.run()
--> this.appId =submitApplication() //会返回一个全局 app id
--> launcherBackend.connect() //创建后台链接
--> yarnClient.init(hadoopConf)
--> serviceInit(config); //overwrite了抽象类AbstractService的serviceInit函数 (YarnClientImpl extends YarnClient extends AbstractService)
--> timelineDTRenewer=getTimelineDelegationTokenRenewer(conf);
--> renewer=SecurityUtil.getServerPrincipal(rmPrincipal, rmHost);
--> yarnClient.start() //启动与Yarn服务器之间的链接
// 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,进而Yarn就会知道应该执行什么指令)
//封装的指令 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提交应用 (实质提交的是指令,创建了一个AM进程)
ApplicationMaster(AM)
--> main
--> val amArgs=new ApplicationMasterArguments(args) //参数对象封装
--> master =new ApplicationMaster(amArgs) //创建应用管理器对象
--> private val client =doAsUser { new YarnRMClient() } //ApplicationMaster对象中有一个RM客户端属性;AM是在Yarn的NM中,但还是要跟RM链接申请资源。
--> master.run()
--> runImpl()
--> runDriver() //Cluster
--> startUserApplication() //启动用户应用,也就是--calss 指定的类
Scala val mainMethod=userClassLoader.loadClass(args.userClass) .getMethod("main", classOf[Array[String]]) //利用类加载器,加载用户定义的类,然后获取main方法 |
--> val userThread=new Thread{....} //创建一个用户线程
--> userThread.setName("Driver") //给线程命名
--> userThread.start() //启动Driver线程 (在AM上),执行的就是刚才获取到的用户类中的main方法
// AM 和 RM 是做资源调度的,而 Driver线程 是用来做计算的;资源 和 计算 没有直接链接,为了降低耦合性 资源 跟 计算 之间加了 AM;所以说 AM 是一个中间的对象,既能跟RM资源交互,又能够跟 Driver 计算交互。
--> 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) //分配到容器资源之后,就开始处理容器资源
--> 本地化操作:(优先位置:移动数据不如移动计算;当需要发送计算给Executor时,最好发送到其数据所在的节点。)如果不能保证优先位置,也可以保证节点本地化(node-local),但是同一台节点也可能资源不够,可以保证 机架本地化(rack-local)
--> runAllocatedContainers(containersToUse) //处理好Container之后,就开始运行这些Container
--> launcherPool.execute //这里用到一个 缓冲的守护线程池 launcherPool,它是ThreadUtils.newDaemonCachedThreadPool类对象。
--> new ExecutorRunnable(.....).run
--> var nmClient: NMClient=_ //ExecutorRunnable对象中包括一个nmClient成员,用来供AM与NM之间建立链接
--> startContainer()
--> val commands=prepareCommand() //又在准备command对象:command=/bin/java -server org.apache.spark.executor.CoarseGrainedExecutorBackend
// 说明 AM 向 其他NM 发送一个指令,在其他 NM 上创建了一个java进程(也就是Executor的后台程序)。
--> userClassThread.join() //将Driver线程进行join操作,表示Driver线程如果不执行完,逻辑不会往下走的;join 是把另外一个线程加入到当前线程中,目的是保证被加入的线程能够执行完。
CoarseGrainedExecutorBackend(Executor)
--> main
--> run(driverUrl, executorId, hostname, cores, appId, workerUrl, userClassPath)
--> env.rpcEnv.awaitTermination() //等待环境配置好 ;Executor要与其他进程进行交互,就需要配置终端
--> env.rpcEnv.setupEndpoint("Executor", new CoarseGrainedExecutorBackend(
env.rpcEnv, driverUrl, executorId, hostname, cores, userClassPath, env))
--> var executor: Executor //在后台程序CoarseGrainedExecutorBackend类中又一个Executor的成员对象 ;所以接下来的任务实际是发送给后台程序的,然后由其成员对象Executor执行计算;
//后台程序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 //当接收到 Driver返回的“注册完成”,则表示注册成功,紧接着创建Executor对象
--> case LaunchTask(data) //当收到LauchTask表示要启动任务
*请认真填写需求信息,我们会在24小时内与您取得联系。