ColdFusion 9 - 文件写入检测(反利用)

ColdFusion 9 - File Write detection (anti-exploit)

我有一个 Web 服务器 (IIS 7),上面有大约 400,000 个文件。 其中 80,000 个是 .cfm 文件。 我相信其中一个文件允许利用该漏洞可以将文件上传到 wwwroot 中的任何位置。

我认为这是因为我启用了 windows 审核,并且看到生成的文件有一个事件日志,其中指定 JRun.exe 作为罪魁祸首。肯定是Jrun写到磁盘的。

我需要知道确定 Jrun 的单一实例中哪个 coldfusion 脚本 运行 导致文件写入磁盘的最佳方法。

我即将覆盖 java.io 命名空间,除非这里有人有更好的主意。是的,我 运行 PowerGREP 实用程序扫描所有文件以查找文件写入字符串,例如:

我看到的漏洞是:http://pastebin.com/sNGycNZS 简单 google 按内容搜索即可。

好吧,所以我最终在 Coldfusion\runtime\jre\lib\rt.jar 中反编译了 java.io.FileOutputStream.class 并修补它以记录到执行 Write() 函数的每个函数的事件日志。

public FileOutputStream(String paramString)
throws FileNotFoundException{  // aka @override
    this(paramString != null ? new File(paramString) : null, false);
    DoEvent("_Single_", "FileOutputStream(" + paramString + "): ");
}

// my attempt at forcing line breaks in through command prompt were insufficient. So I used regex after-the-fact to replace %NL% with \r\n. :P
public static void DoEvent(String type, String description)  {
if (description.contains("wwwroot"))
{
  StackTraceElement[] stack = Thread.currentThread().getStackTrace();
  StringBuilder sz = new StringBuilder();
  String linefeed = "%NL%";
  for (StackTraceElement s : stack)
  {
    sz.append(s.toString());
    sz.append(linefeed + "-------------" + linefeed);
  }
  description = description + linefeed + sz.toString();
  String command = "cmd /c \"SET NLM=^\r\n\r\n && set NL=^^^%NLM%%NLM%^%NLM%%NLM% && ";
  command = command + "eventcreate  /l APPLICATION /so \"COLDFUSION FILE WRITE :: " + type + " " + "\"" + " /t " + "ERROR" + " /id " + new Random().nextInt(500) + " /d \"" + description + "\"";

  command = command + "\"";
  try
  {
    Runtime.getRuntime().exec(command);
  }
  catch (IOException e) {}
} 

产生的结果:

FileOutputStream(E:\.....\wwwroot\public\subdomain.site.com\images\veryver.cfm):
java.lang.Thread.getStackTrace(Thread.java:1479)
^--> java.io.FileOutputStream.DoEvent(FileOutputStream.java:26)
^--> java.io.FileOutputStream.<init>(FileOutputStream.java:75)
^--> java.io.FileOutputStream.<init>(FileOutputStream.java:60)
^--> coldfusion.vfs.VFSFileFactory.fetchOutputStream(VFSFileFactory.java:442)
^--> coldfusion.vfs.VFSFileFactory.getOutputStream(VFSFileFactory.java:283)
^--> coldfusion.tagext.io.FileUtils.copyFile(FileUtils.java:944)
^--> coldfusion.tagext.io.FileUtils.run(FileUtils.java:613)
^--> java.security.AccessController.doPrivileged(Native Method)
^--> coldfusion.tagext.io.FileUtils.uploadFile(FileUtils.java:609)
^--> coldfusion.tagext.io.FileTag.upload(FileTag.java:591)
^--> coldfusion.tagext.io.FileTag.doStartTag(FileTag.java:266)
^--> coldfusion.runtime.CfJspPage._emptyTcfTag(CfJspPage.java:2722)
^--> cftvb2ecfm60673673._factor26(E:\....\wwwroot\CFIDE\scripts\tvb.cfm:468)
^--> cftvb2ecfm60673673._factor27(E:\....\wwwroot\CFIDE\scripts\tvb.cfm:466)
^--> cftvb2ecfm60673673._factor28(E:\....\wwwroot\CFIDE\scripts\tvb.cfm:465)
^--> cftvb2ecfm60673673._factor29(E:\....\wwwroot\CFIDE\scripts\tvb.cfm:464)
^--> cftvb2ecfm60673673._factor121(E:\....\wwwroot\CFIDE\scripts\tvb.cfm:462)
^--> cftvb2ecfm60673673._factor124(E:\....\wwwroot\CFIDE\scripts\tvb.cfm:76)
^--> cftvb2ecfm60673673._factor125(E:\....\wwwroot\CFIDE\scripts\tvb.cfm:72)
^--> cftvb2ecfm60673673.runPage(E:\....\wwwroot\CFIDE\scripts\tvb.cfm:1)
^--> coldfusion.runtime.CfJspPage.invoke(CfJspPage.java:231)
^--> coldfusion.tagext.lang.IncludeTag.doStartTag(IncludeTag.java:416)
^--> coldfusion.filter.CfincludeFilter.invoke(CfincludeFilter.java:65)
^--> coldfusion.filter.ApplicationFilter.invoke(ApplicationFilter.java:387)
^--> coldfusion.filter.RequestMonitorFilter.invoke(RequestMonitorFilter.java:48)
^--> coldfusion.filter.MonitoringFilter.invoke(MonitoringFilter.java:40)
^--> coldfusion.filter.PathFilter.invoke(PathFilter.java:94)
^--> coldfusion.filter.ExceptionFilter.invoke(ExceptionFilter.java:70)
^--> coldfusion.filter.ClientScopePersistenceFilter.invoke(ClientScopePersistenceFilter.java:28)
^--> coldfusion.filter.BrowserFilter.invoke(BrowserFilter.java:38)
^--> coldfusion.filter.NoCacheFilter.invoke(NoCacheFilter.java:46)
^--> coldfusion.filter.GlobalsFilter.invoke(GlobalsFilter.java:38)
^--> coldfusion.filter.DatasourceFilter.invoke(DatasourceFilter.java:22)
^--> coldfusion.filter.CachingFilter.invoke(CachingFilter.java:62)
^--> coldfusion.filter.RequestThrottleFilter.invoke(RequestThrottleFilter.java:126)
^--> coldfusion.CfmServlet.service(CfmServlet.java:201)
^--> coldfusion.bootstrap.BootstrapServlet.service(BootstrapServlet.java:89)
^--> jrun.servlet.FilterChain.doFilter(FilterChain.java:86)
^--> coldfusion.monitor.event.MonitoringServletFilter.doFilter(MonitoringServletFilter.java:42)
^--> coldfusion.bootstrap.BootstrapFilter.doFilter(BootstrapFilter.java:46)
^--> jrun.servlet.FilterChain.doFilter(FilterChain.java:94)
^--> jrun.servlet.FilterChain.service(FilterChain.java:101)
^--> jrun.servlet.ServletInvoker.invoke(ServletInvoker.java:106)
^--> jrun.servlet.JRunInvokerChain.invokeNext(JRunInvokerChain.java:42)
^--> jrun.servlet.JRunRequestDispatcher.invoke(JRunRequestDispatcher.java:286)
^--> jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java:543)
^--> jrun.servlet.jrpp.JRunProxyService.invokeRunnable(JRunProxyService.java:203)
^--> jrunx.scheduler.ThreadPool$DownstreamMetrics.invokeRunnable(ThreadPool.java:320)
^--> jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(ThreadPool.java:428)
^--> jrunx.scheduler.ThreadPool$UpstreamMetrics.invokeRunnable(ThreadPool.java:266)
^--> jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)
^--> 

如您所见,这是一个位于 CFIDE 中的残余脚本。不确定他们是如何访问它的,因为它超出了 public 可访问文档的范围。 您必须具有 VPN 访问权限和远程桌面,才能访问 CFIDE。

无论如何,我通过删除文件解决了这个问题。 另请注意,我用同样的方法追踪了上面提到的文件的写入内容,并确定它是 Coldfusion classes/cache 文件夹中的已编译的 coldfusion class。 E:\ColdFusion9\wwwroot\WEB-INF\cfclasses\

为了保险起见我删掉了,虽然反编译后的代码看起来很温顺。 我还建议大家检查他们系统的计划任务,以及 coldfusion 的计划任务和任何 cf 探测器。

为了帮助其他人找到此内容,这里有一些 google 的字符串(按在受感染文件中出现的频率排序 --- 在 .php 中扫描,.cf?, and *.class):

  • S?巴斯蒂安丹尼斯
  • CFIDE.componentutils.cfcexplorer
  • 爱马仕
  • 沉默是金

最常见的文件:

  • veryver.cfm
  • img.cfm
  • co.cfm
  • as.cfm
  • good.cfm
  • z.txt

以及攻击目标:

我想附上源代码。class 我说过,但似乎无法在此站点上找到该选项。可能是为了更好,我还是不分享它的来源。

感谢大家的帮助:)