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

时间:2015-04-06 14:53:25

标签: coldfusion coldfusion-9 exploit

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

我认为这是因为我启用了Windows审核,并且看到生成的文件有一个事件日志,指定JRun.exe为罪魁祸首。它绝对是由Jrun写入磁盘的。

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

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

  • CFIDE.componentutils.cfcexplorer
  • action =“upload”(+单引号,=“写”)
  • java.io
  • 的BufferedWriter 等

我看到的漏洞出现在数字中:http://pastebin.com/sNGycNZS 通过内容进行简单的谷歌搜索就可以了。

1 个答案:

答案 0 :(得分:1)

好吧,所以我最终在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$2.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中的残余脚本。不知道他们如何访问它,因为它超出了公共可访问文档的范围。 您必须拥有VPN访问权限和远程桌面,才能访问CFIDE。

无论如何,所以我通过删除文件解决了这个问题。 还请注意,我使用相同的方法来跟踪写入上述文件的内容,并确定它是Coldfusion classes / cache文件夹中的已编译的coldfusion类。 E:\ ColdFusion9 \ wwwroot的\ WEB-INF \ cfclasses \

我删除它是安全的,尽管在反编译时代码看起来很温顺。 我还建议每个人检查他们系统的预定任务,以及coldfusion的预定任务,以及任何cf探测器。

为了帮助其他人查找此内容,以下是谷歌的一些字符串(按受感染文件中的出现频率排序---扫描 .php, .cf?和*。类):

  • S?bastien Denis
  • CFIDE.componentutils.cfcexplorer
  • 爱马仕
  • 沉默是金色的

最常见的文件:

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

袭击的目标:

我希望将源代码附加到我所说的.class,但似乎无法在此网站上找到该选项。无论如何,我可能不会分享它的来源。

感谢所有人的帮助:)