我有一个Web服务器(IIS 7),上面有大约400,000个文件。 其中80,000是.cfm文件。 我相信其中一个文件允许利用文件可以上传到wwwroot中的任何地方。
我认为这是因为我启用了Windows审核,并且看到生成的文件有一个事件日志,指定JRun.exe为罪魁祸首。它绝对是由Jrun写入磁盘的。
我需要知道确定在Jrun的单个实例中运行的哪个coldfusion脚本导致文件写入磁盘的最佳方法。
我即将覆盖 java.io 名称空间,,除非此处有人有更好的主意。是的,我运行PowerGREP实用程序来扫描所有文件的文件写入字符串,例如:
我看到的漏洞出现在数字中:http://pastebin.com/sNGycNZS 通过内容进行简单的谷歌搜索就可以了。
答案 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?和*。类):
最常见的文件:
袭击的目标:
我希望将源代码附加到我所说的.class,但似乎无法在此网站上找到该选项。无论如何,我可能不会分享它的来源。
感谢所有人的帮助:)