黑客案例——浏览器执行exe文件的探讨
作者:hackmaster 来源:赛迪网安全社区
一:真的能在浏览器中执行命令文件吗?
答案是肯定的。不过先别高兴,只能执行服务器端的,而且是必须经过授权的。否则服务器想黑你就太容易了,谁敢看我我就格式化谁。
二:他是如何实现的。是靠asp文件吗?
在服务器端执行文件是靠SSI来实现的,SSI时服务器端包含的意思(不是SSL),我们经常使用的#include就是服务器端包含的指令之一。不过,这次要介绍的就是——#exec。就是他可以实现服务器端执行指令。
不过,这次他不能用于.asp的文件。而只能用.stm、.shtm 和 .shtml这些扩展名。而能解释执行他们的就是Ssinc.dll。所以,你写好的代码必须保存成.stm等格式才能确保服务器能执行。
三:如何执行呢?
终于开始讨论实质性问题了。
它的语法是:
CommandType是参数,他有两个可选类型:
1.CGI 运行一个应用程序
如 CGI 脚本、ASP 或 ISAPI 应用程序。
CommandDes cription 参数是一个字符串。此字符串包含应用程序的虚拟路径,后跟一个问号以及传送给应用程序的任一参数,参数之间由加号分隔(+)。
他可是#exec命令最有用的参数,也是#exec命令存在的大部分理由。他可以处理已授权的CGI脚本,或Isapi应用程序。微软为了向下兼容一些早期的ISAPI应用程序,而创建了该项命令。我们知道,微软早期的WEB应用程序都是靠ISAPI解释的,而且也兼容CGI程序。你现在也可以在你的WEB根目录中找到CGI-BIN的目录。
我们可以用一下例子说明。
这种命令我们在一些UNIX主机上可以经常见到。现在,我们也可以在自己的.shtml中运用他了。当然,如果服务器允许的话。
还有一种类型的程序:
这种命令方式将启动一个进程外的程序来解释并动态输出信息到网页上。这种方式不常见。但你仍然可以在一些网站中见到。
2.CMD参数
他可是#exec命令中最可怕的参数,也是#exec命令禁止使用的大部分理由。他也是我们一些网友实现最终幻想的利器。可惜,要得到我们幻想的招数有些困难,也几乎是不可能的。
以下是微软关于CMD参数的说明,你一定要读明白再试!
CMD 运行 shell 命令。 CommandDes cription 参数是一个字符串,其中包含 shell命令程序的完整物理路径,后跟由空格分隔的任何命令行参数。如果没有指定全路经,Web 服务器将搜索系统路径。默认情况下,该指令是被禁用的,这是因为它会对 Web站点造成安全方面的危险;例如,用户可能使用 format 命令格式化您的硬盘。
我本人建议关闭,因为现在微软也不推荐用这个命令。不过,如果你是服务器的管理员,可以试一试。
你可以新建一个test.shtml的文件,然后在首行设置一个命令。
[an error occurred while processing this directive]
'NT中的一个帮助文件(没有危险)。
或试一试!
[an error occurred while processing thisdirective]
'window98下的显示内存的一个命令。(没有危险)
然后你在该虚拟目录中将其权限设为脚本,或可执行。
最后,你可以在浏览器中输入该地址http://localhost/xxx/test.shtml如果你看到浏览器中显示了他们的屏幕输入信息。那么,恭喜你。你试成功了。
四:最终幻想
如果我们想执行多的命令呢?那么闭上眼,往下看吧。
首先,你打开注册表编辑器(记住要先备份),然后找
KEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services \W3SVC4
'也可能是w3svc \Parameters
选择新建一个Dword值SSIEnableCmdDirective,它的两个值为0,1。下面是微软的说明。
服务器端的 #exec cmd 命令包括可执行外壳命令。安全意识强的站点希望通过将此值设置为 0 来关闭 #exec cmd命令,并以此作为外加的安全防范,尤其是在允许不受信任的使用者将文件放置到服务器时更是如此。默认状态下,注册表中不存在此值;要允许该命令执行外壳命令,必须先创建此值并将值设置为1。
还可以在添一个Dwordd值AllowSpecialCharsInShell它的两个值为0,1。下面是微软的说明。
范围:0,1 默认值:0 (禁用)
本值控制在运行批处理文件( .bat 和 .cmd 文件)时,是否允许在命令行使用[ | ( , ; % ] 等 Cmd.exe特殊字符。这些特殊字符可能引发严重的安全隐患。如果该项值设置为 1,心怀叵测的用户可以在服务器上随意执行命令。因此,强力推荐用户保留其默认设置0。默认情况下,这些特殊字符不能传递到脚本映射 CGI 程序。如果设置为 1,除了管道符号 | 和标准 I/O 重定向符()之外(这两类字符在命令处理器中具有特殊含义),这些特殊字符都能够传递到脚本映射 CGI 程序。
下面我就不详述了。不过你要执行一些你希望的命令可不是这么简单(如:[an error occurred while processing thisdirective])你不会成功的,如果死机不要怨我。
利用格式化字符串漏洞对系统发起攻击
作者:hackmaster 来源:赛迪网安全社区
【编者按:一个很小的疏忽,就会酿成危机系统安全的大患!】
什么是格式化字符串攻击?
格式化字符串漏洞同其他许多安全漏洞一样是由于程序员的懒惰造成的。当你正在阅读本文的时候,也许有个程序员正在编写代码,他的任务是:打印输出一个字符串或者把这个串拷贝到某缓冲区内。他可以写出如下的代码:
printf("%s", str);
但是为了节约时间和提高效率,并在源码中少输入6个字节,他会这样写:
printf(str);
为什么不呢?干嘛要和多余的printf参数打交道,干嘛要花时间分解那些愚蠢的格式?printf的第一个参数无论如何都会输出的!程序员在不知不觉中打开了一个安全漏洞,可以让攻击者控制程序的执行,这就是不能偷懒的原因所在。
为什么程序员写的是错误的呢?他传入了一个他想要逐字打印的字符串。实际上该字符串被printf函数解释为一个格式化字符串(format string)。函数在其中寻找特殊的格式字符比如"%d"。如果碰到格式字符,一个变量的参数值就从堆栈中取出。很明显,攻击者至少可以通过打印出堆栈中的这些值来偷看程序的内存。但是有些事情就不那么明显了,这个简单的错误允许向运行中程序的内存里写入任意值。
Printf中被忽略的东西
在说明如何为了自己的目的滥用printf之前,我们应该深入领会printf提供的特性。假定读者以前用过printf函数并且知道普通的格式化特性,比如如何打印整型和字符串,如何指定最大和最小字符串宽度等。除了这些普通的特性之外,还有一些深奥和鲜为人知的特性。在这些特性当中,下面介绍的对我们比较有用:
* 在格式化字符串中任何位置都可以得到输出字符的个数。当在格式化字符串中碰到"%n"的时候,在%n域之前输出的字符个数会保存到下一个参数里。例如,为了获取在两个格式化的数字之间空间的偏量:
int pos, x = 235, y = 93;
printf("%d %n%d\n", x, &pos, y);
printf("The offset was %d\n", pos);
* %n格式返回应该被输出的字符数目,而不是实际输出的字符数目。当把一个字符串格式化输出到一个定长缓冲区内时,输出字符串可能被截短。不考虑截短的影响,%n格式表示如果不被截短的偏量值(输出字符数目)。为了说明这一点,下面的代码会输出100而不是20:
char buf[20];
int pos, x = 0;
snprintf(buf, sizeof buf, "%.100d%n", x, &pos);
printf("position: %d\n", pos);
简单的例子
除了讨论抽象和复杂的理论,我们将会使用一个具体的例子来说明我们刚才讨论的原理。下面这个简单的程序能满足这个要求:
/*
* fmtme.c
* Format a value into a fixed-size buffer
*/
#include
int
main(int argc, char **argv)
{
char buf[100];
int x;
if(argc != 2)
exit(1);
x = 1;
snprintf(buf, sizeof buf, argv[1]);
buf[sizeof buf - 1] = 0;
printf("buffer (%d): %s\n", strlen(buf), buf);
printf("x is %d/%#x (@ %p)\n", x, x, &x);
return 0;
}
对这个程序有几点说明:第一,目的很简单:将一个通过命令行传递值格式化输出到一个定长的缓冲区里。并确保缓冲区的大小限制不被突破。在缓冲区格式化后,把它输出。除了把参数格式化,还设置了一个整型值随后输出。这个变量是随后我们攻击的目标。现在值得我们注意的是这个值应该始终为1。
本文中所有的例子都是在x86 BSD/OS 4.1机器上完成。如果你到莫桑比克执行任务超过20年时间可能会对x86不熟悉,这是一个little-endian机器。这决定在例子中多精度数字的表示方法。在这里使用的具体数值会因为系统的差异而不同,这些差异表现在不同体系结构、操作系统、环境甚至是命令行长度。经过简单调整,这些例子可以在其他x86平台上工作。通过努力也可以在其他体系结构的平台上工作。
用Format攻击
现在是我们戴上黑帽子开始以攻击者方式思考问题的时候了。我们现在手头有一个测试程序。知道这个程序有一个漏洞并且了解程序员是在哪里犯错误的(直接把用户输入的命令行参数作为snprintf的格式化参数)。我们还拥有关于printf函数深入的知识,知道如何运用这些知识。让我们开始修补我们的程序吧。
从简单的开始,我们通过简单的参数调用程序。看这儿:
% ./fmtme "hello world"
buffer (11): hello world
x is 1/0x1 (@ 0x804745c)
现在这儿还没有什么特别的事情发生。程序把我们输入的字符串格式化输出到缓冲区里,然后打印出它的长度和数值。程序还告诉我们变量x的值是1(以十进制和十六进制分别显示),x的存储地址是0x804745c。接下来我们试着使用一些格式指令。在下面的例子中我们打印出在格式化字符串之上栈堆中的整型数值:
% ./fmtme "%x %x %x %x"
buffer (15): 1 f31 1031 3133
x is 1/0x1 (@ 0x804745c)
对这个程序的快速分析可以揭示在调用snprintf函数时程序堆栈的规划:
Address Contents Description
fp+8 Buffer pointer 4-byte address
fp+12 Buffer length 4-byte integer
fp+16 &n
黑客攻击之用物理攻击来实现网络入侵
作者:许本新 来源:赛迪网安全社区
目前网络网络中最常用的攻击手段主要有以下几种:
1、社会工程学攻击
2、物理攻击
3、暴力攻击
4、利用Unicode漏洞攻击
5、利用缓冲区溢出漏洞进行攻击等技术。
在今天这篇文章中我将结合实际,介绍一些常用的的攻击工具的使用以及部分工具的代码实现。
下面首先给大家介绍一下社会工程学攻击,社会工程是使用计谋和假情报去获得密码和其他敏感信息的科学,研究一个站点的策略其中之一就是尽可能多的了解这个组织的个体,因此黑客不断试图寻找更加精妙的方法从他们希望渗透的组织那里获得信息。
举个例子:一组高中学生曾经想要进入一个当地的公司的计算机网络,他们拟定了一个表格,调查看上去显得是无害的个人信息,例如所有秘书和行政人员和他们的配偶、孩子的名字,这些从学生转变成的黑客说这种简单的调查是他们社会研究工作的一部分。利用这份表格这些学生能够快速的进入系统,因为网络上的大多数人是使用宠物和他们配偶名字作为密码。
一、社会工程学攻击
目前社会工程学攻击主要包括两种方式:打电话请求密码和伪造E-mail
1、打电话请求密码
尽管不像前面讨论的策略那样聪明,打电话寻问密码也经常奏效。在社会工程中那些黑客冒充失去密码的合法雇员,经常通过这种简单的方法重新获得密码。
2、伪造E-mail
使用telnet一个黑客可以截取任何一个身份证发送E-mail的全部信息,这样的Email消息是真的,因为它发自于一个合法的用户。在这种情形下这些信息显得是绝对的真实。黑客可以伪造这些。一个冒充系统管理员或经理的黑客就能较为轻松的获得大量的信息,黑客就能实施他们的恶意阴谋。
二、物理攻击之获取管理员密码
物理安全是保护一些比较重要的设备不被接触。物理安全比较难防,因为攻击者往往是来自能够接触到物理设备的用户。下面一案例来说明如何获得用户的管理员帐号。
如果你的电脑经常被别人接触,别人就有可能利用一些工具软件来获得你的管理员帐号,这样一来下次他就可以成功的登录你的计算机了。
一般来说我们自己使用的计算机的时候我们都是采用管理员登录的,而管理员帐号在登录后,所有的用户信息都存储在系统的一个进程中,这个进程是:“winlogon.exe”,物理攻击者就可以利用程序将当前登录用户的密码解码出来。
在这种情况下,如果你的计算机给别人使用的话,你虽然不安告诉别人你的计算机密码是多少,别人仍然可以使用软件解码出你的管理员的帐号和密码。比如说使用FindPass.exe如果是Windows Server 2003环境的话,还可以使用FindPass2003.exe等工具就可以对该进程进行解码,然后将当前用户的密码显示出来。具体使用的方法就是将FindPass.exe或者FindPass2003.exe拷贝到C盘根目录,在cmd下执行该程序,就可以获得当前用户得登录名。
所以在此告诫大家如果你的计算机中有非常重要的信息的话也不要轻易给别人使用,这也是很危险的。
三、物理攻击之提升用户权限
有时候,管理员为了安全,给其他用户建立一个普通用户帐号,认为这样就安全了。其实不然,用普通用户帐号登录后,可以利用工具GetAdmin.exe将自己加到管理员组或者新建一个具有管理员权限的用户。例如利用Hacker帐户登录系统,在系统中执行程序GetAdmin.exe,这样一来程序就会自动读取所有用户列表,在对话框中点击按钮“New”,在框中输入要新建的管理员组的用户名。
输入一个用户名“IAMHacker”,点击按钮“确定”以后,然后点击主窗口的按钮“OK”,出现添加成功的窗口。