Windows SMB Ghost£¨CVE-2020-0796£©·ì϶·ÖÎö

°ä²¼¹¦·ò 2020-04-09

·ì϶½éÉÜ


2020Äê3ÔÂ10ÈÕ£¬Î¢ÈíÔÚÆä¹Ù·½SRC°ä²¼ÁËCVE-2020-0796µÄ°²È«²¼¸æ£¨ADV200005£¬Microsoft Guidance for Disabling SMBv3 Compression£©,²¼¸æ°µÊ¾ÔÚWindows SMBv3°æ±¾µÄ¿Í»§¶ËºÍ·þÎñ¶Ë´æÔÚÔ¶³Ì´úÂëÖ´Ðзì϶¡£Í¬Ê±Ö¸³ö¸Ã·ì϶´æÔÚÓÚMicroSoft Server Message Block 3.1.1ºÍ̸´¦ÖÃÌØ¶¨ÒªÇó°üµÄÖ°ÄÜÖУ¬¹¥»÷ÕßÀûÓø÷ì϶¿ÉÔÚÖ¸±êSMB Server»òÕßClientÖÐÖ´ÐÐËÁÒâ´úÂë¡£


GA»Æ½ð¼×ADLab°²È«×êÑÐÈËÔ±ÔڶԸ÷ì϶½øÐÐ×êÑеĹý³ÌÖз¢ÏÖĿǰÁ÷´«µÄһЩ·ì϶·ÖÎö´æÔÚijЩÎÊÌ⣬Òò¶ø¶Ô¸Ã·ì϶½øÐÐÁËÉî¿ÌµÄ·ÖÎö£¬²¢ÔÚWindows 10ϵͳÉϽøÐÐÁ˸´ÏÖ¡£



·ì϶¸´ÏÖ


ѡȡWindows 10 1903°æ±¾½øÐи´ÏÖ¡£ÔÚ·ì϶ÀûÓúó£¬ÑéÖ¤·¨Ê½ÌáȨʵÏÖºó´´½¨ÁËÒ»¸ösystemȨÏÞµÄcmd shell£¬Èçͼ1Ëùʾ¡£


GA»Æ½ð¼×¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾

ͼ1 CVE-2020-0796±¾µØÌáȨ


·ì϶¸ù»ùµÀÀí


CVE-2020-0796·ì϶´æÔÚÓÚÊÜÓ°Ïì°æ±¾µÄWindowsÇý¶¯srv2.sysÖС£Windows SMB v3.1.1 °æ±¾Ôö³¤Á˶ÔѹËõÊý¾ÝµÄÖ§³Ö¡£Í¼2ËùʾΪ´øÑ¹ËõÊý¾ÝµÄSMBÊý¾Ý±¨ÎĵÄ×é³É¡£


GA»Æ½ð¼×¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾

ͼ2 ´øÑ¹ËõÊý¾ÝµÄSMBÊý¾Ý±¨ÎĽṹ


ƾ¾Ý΢ÈíMS-SMB2ºÍ̸Îĵµ£¬SMB Compression Transform HeaderµÄ½á¹¹Èçͼ3Ëùʾ¡£


GA»Æ½ð¼×¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾

ͼ3 SMB Compression Transform HeaderÊý¾Ý½á¹¹


ProtocolId£º4×Ö½Ú£¬¹Ì¶¨Îª0x424D53FC

OriginalComressedSegmentSize£º4×Ö½Ú£¬Ô­Ê¼µÄδѹËõÊý¾Ý´óÓ×

CompressionAlgorithm£º2×Ö½Ú£¬Ñ¹ËõËã·¨

Flags £º2×Ö½Ú£¬Ïê¼ûºÍ̸Îĵµ

Offset/Length£ºÆ¾¾ÝFlagsµÄȡֵΪOffset»òÕßLength£¬Offset°µÊ¾Êý¾Ý°üÖÐѹËõÊý¾ÝÏà¶ÔÓÚµ±Ç°½á¹¹µÄÆ«ÒÆ

srv2.sysÖд¦ÖÃSMBv3ѹËõÊý¾Ý°üµÄ½âѹº¯ÊýSrv2DecompressDataδÑϸñУÑéÊý¾Ý°üÖÐOriginalCompressedSegmentSizeºÍOffset/Length×ֶεĺϷ¨ÐÔ¡£¶øÕâÁ½¸ö×Ö¶ÎÓ°ÏìÁËSrv2DecompressDataÖÐÄÚ´æ·ÖÅ亯ÊýSrvNetAllocateBufferµÄ²ÎÊý¡£Èçͼ4ËùʾµÄSrv2DecompressDataº¯Êý·´±àÒë´úÂ룬SrvNetAllocateBufferÏÖʵµÄ²ÎÊýΪOriginalCompressedSegmentSize+Offset¡£ÕâÁ½¸ö²ÎÊý¶¼Ö±½ÓÆðÔ´ÓÚÊý¾Ý°üÖÐSMB Compression Transform HeaderÖеÄ×ֶΣ¬¶øº¯Êý²¢Î´ÅжÏÕâÁ½¸ö×Ö¶ÎÊÇ·ñºÏ·¨£¬¾ÍÖ±½Ó½«ÆäÏà¼Óºó×÷ΪÄÚ´æ·ÖÅäµÄ²ÎÊý(unsigned intÀàÐÍ£©¡£


GA»Æ½ð¼×¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾

ͼ4 Srv2DecompressDataº¯ÊýµÄ¹Ø¼ü´úÂë


ÕâÀOriginalCompressedSegmentSize+Offset¿ÉÄÜÓ×ÓÚÏÖʵ±ØÒª·ÖÅäµÄÄÚ´æ´óÓ×£¬´Ó¶øÔÚºóÐøÅ²Óýâѹº¯ÊýSmbCompressionDecompress¹ý³ÌÖдæÔÚÔ½½ç¶ÁÈ¡»òÕßдÈëµÄ·çÏÕ¡£


ÌáÈ¨ÊÆÓùý³Ì


ĿǰÒѹ«¿ªµÄÕë¶Ô¸Ã·ì϶µÄ±¾µØÌáÈ¨ÊÆÓÃÔ̺¬ÈçϵÄÖØÒª¹ý³Ì£º

£¨1£©ÑéÖ¤·¨Ê½Æð³õ´´½¨µ½SMS serverµÄ»á»°Ïνӣ¨¼ÇΪsession£©¡£

£¨2£©ÑéÖ¤·¨Ê½»ñÈ¡×ÔÉítokenÊý¾Ý½á¹¹ÖÐprivilege³ÉÔ±ÔÚÄÚºËÖеĵØÖ·£¨¼ÇtokenAddr£©¡£

£¨3£©ÑéÖ¤·¨Ê½Í¨¹ýsession·¢ËÍ»ûÐÎѹËõÊý¾Ý£¨¼ÇΪevilData£©¸øSMB server´¥·¢·ì϶¡£ÆäÖУ¬evilDataÔ̺¬tokenAddr¡¢È¨ÏÞÊý¾Ý¡¢Òç³öռλÊý¾Ý¡£

£¨4£©SMS serverÊÕµ½evilDataºó´¥·¢·ì϶£¬²¢Åú¸ÄtokenAddrµØÖ·´¦µÄȨÏÞÊý¾Ý£¬´Ó¶øÌáÉýÑéÖ¤·¨Ê½µÄȨÏÞ¡£

£¨5£©ÑéÖ¤·¨Ê½»ñȡȨÏÞºó¶Ôwinlogon½øÐнÚÔ죬À´´´½¨systemÓû§shell¡£


·ì϶ÄÚ´æ·ÖÅä·ÖÎö


Ê×ÏÈ£¬¿´Ò»ÏÂÒѹ«¿ªÀûÓõÄevilDataÊý¾Ý°üµÄÄÚÈÝ£¬Èçͼ5Ëùʾ¡£


GA»Æ½ð¼×¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾

ͼ5 ÌáȨpoc·¢Ë͵ĴøÑ¹ËõÊý¾ÝµÄSMBÊý¾Ý°ü


Êý¾Ý°üµÄÄÚÈݺܵ¥Ò»£¬ÆäÖм¸¸ö¹Ø¼ü×Ö¶ÎÊý¾ÝÈçÏ£º

OriginalSize£º0xffffffff

Offset£º0x10

Real compressed data£º13×Ö½ÚµÄѹËõÊý¾Ý£¬½âѹºóӦΪ1108×Ö½Ú¡¯A¡¯¼Ó8×Ö½ÚµÄtokenµØÖ·¡£

SMB3 raw data£ºÏÖʵÉÏÊÇÓÉ2¸ö8×Ö½ÚµÄ0x1FF2FFFFBC£¨×ܳ¤0x10)¼ÓÉÏ0x13×Ö½ÚµÄѹËõÊý¾Ý×é³É¡£

´ÓÉÏÃæµÄ·ì϶µÀÀí·ÖÎö¿ÉÖª£¬·ì϶³ÉÒòÊÇSrv2DecompressDataº¯Êý¶Ô±¨ÎÄ×ֶβ»×ãºÏ·¨ÐÔÅжÏÔì³ÉÄÚ´æ·ÖÅä²»µ±¡£Ôڸ÷ì϶Êý¾Ý°üÖУ¬OriginalSize ÊÇÒ»¸ö»ûÐÎÖµ¡£OriginalSize + Offset = 0xffffffff + 0x10 = 0xf ÊÇÒ»¸öºÜÓ×µÄÖµ£¬Æä½«»á´«µÝ¸øSrvNetAllocateBuffer½øÐÐŲÓã¬ÏÂÃæ¾ßÌå·ÖÎöÄÚ´æ·ÖÅäÇé¿ö¡£SrvNetAllocateBufferµÄ·´±àÒë´úÂëÈçͼ6¡£


GA»Æ½ð¼×¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾

ͼ6 SrvNetAllocateBufferÄÚ´æ·ÖÅä¹ý³Ì


ÓÉÓÚ´«¸øSrvNetAllocateBufferµÄ²ÎÊýΪ0xf£¬Æ¾¾ÝSrvNetAllocateBufferµÄ´¦ÖÃÁ÷³Ì¿ÉÖª£¬¸ÃÒªÇóÄڴ潫´ÓSrvNetBufferLookasides±íÖзÖÅä¡£ÕâÀï±ØÒª°ÑÎȵÄÊÇ£¬±äÁ¿SrvDisableNetBufferLookAsideList¸ú×¢²á±íÏîÓйØ£¬ÏµÍ³Ä¬ÈÏ״̬ÏÂSrvDisableNetBufferLookAsideListΪ0¡£


GA»Æ½ð¼×¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾

ͼ7 SrvDisableNetBufferLookAsideList±äÁ¿³õʼ»¯¹ý³Ì


SrvNetBufferLookasides±íͨ¹ýº¯ÊýSrvNetCreateBuffer³õʼ»¯£¬ÏÖʵSrvNetCreateBufferÑ­»·Å²ÓÃÁËSrvNetBufferLookasideAllocate·ÖÅäÄڴ棬ŲÓÃSrvNetBufferLookasideAllocateµÄ²ÎÊý±ðÀëΪ[¡®0x1100¡¯, ¡®0x2100¡¯, ¡®0x4100¡¯, ¡®0x8100¡¯, ¡®0x10100¡¯, ¡®0x20100¡¯, ¡®0x40100¡¯, ¡®0x80100¡¯, ¡®0x100100¡¯]¡£ÔÚÕâÀÄÚ´æ·ÖÅä²ÎÊýΪ0xf£¬¶ÔÓ¦µÄlookaside±íΪ0x1100´óÓ׵ıíÏî¡£


GA»Æ½ð¼×¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾

ͼ8 SrvNetCreateBuffer·´±àÒë´úÂë


SrvNetBufferLookasideAllocateº¯ÊýÏÖʵÊÇŲÓÃSrvNetAllocateBufferFromPoolÀ´·ÖÅäÄڴ棬Èçͼ9Ëùʾ¡£


GA»Æ½ð¼×¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾

ͼ9 SrvNetBufferLookasideAllocate·´±àÒë´úÂë


ÔÚº¯ÊýSrvNetAllocateBufferFromPoolÖУ¬¶ÔÓÚÓû§ÒªÇóµÄÄÚ´æ·ÖÅä´óÓ×£¬ÄÚ²¿Í¨¹ýExAllocatePoolWithTagº¯Êý·ÖÅäµÄÄÚ´æÏÖʵҪ´óÓÚÒªÇóÖµ£¨¶à³ö²¿ÃÅÓÃÓÚ´æ´¢²¿ÃÅÄÚ´æÓйØÊý¾Ý½á¹¹£©¡£ÒÔÒªÇó·ÖÅä0x1100´óÓ×ΪÀý£¬¾­¹ýһϵÁÐÅжϺó£¬×îºó·ÖÅäµÄÄÚ´æ´óÓ×allocate_size = 0x1100 + E8 + 2*(MmSizeOfMdl + 8)¡£


GA»Æ½ð¼×¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾

ͼ10 SrvNetAllocateBufferFromPoolº¯Êý·´±àÒë´úÂë


ÄÚ´æ·ÖÅä½áÊøÖ®ºó£¬SrvNetAllocateBufferFromPoolº¯Êý»¹¶Ô·ÖÅäµÄÄÚ´æ½øÐÐÁËһϵÁгõʼ»¯²Ù×÷£¬×îºó·µ»ØÁËÒ»¸öÄÚ´æÐÅÏ¢½á¹¹ÌåÖ¸Õë×÷Ϊº¯ÊýµÄ·µ»ØÖµ¡£


GA»Æ½ð¼×¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾

ͼ11  SrvNetAllocateBufferFromPool³õʼ»¯ÄÚ´æÊý¾Ý


ÕâÀï±ØÒª°ÑÎÈÈçϵÄÊý¾Ý¹ØÏµ£ºSrvNetAllocateBufferFromPoolº¯Êý·µ»ØÖµreturn_bufferÖ¸ÏòÒ»¸öÄÚ´æÊý¾Ý½á¹¹£¬¸ÃÄÚ´æÊý¾Ý½á¹¹ÕØÊ¼µØÖ·Í¬ÏÖʵ·ÖÅäÄڴ棨º¯ÊýExAllocatePoolWithTag·ÖÅäµÄÄÚ´æ£©ÕØÊ¼µØÖ·µÄµÄÆ«ÒÆÎª0x1150£»return_buffer+0x18µØÎ»Ö¸ÏòÁËÏÖʵ·ÖÅäÄÚ´æÕØÊ¼µØÖ·Æ«ÒÆ0x50µØÎ»´¦£¬¶ø×îÖÕreturn_buffer»á×÷Ϊº¯ÊýSrvNetAllocateBufferµÄ·µ»ØÖµ¡£ÆäÄÚ´æ²¼¾Ö¹ØÏµÈçͼ12¡£


GA»Æ½ð¼×¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


ͼ12 SrvNetAllocateBuffer£¨0xf)·µ»ØµÄÄÚ´æÊý¾Ý²¼¾Ö


·ì϶ÄÚ´æ·ÛËé·ÖÎö


»Øµ½·ì϶½âѹº¯ÊýSrv2DecompressData£¬ÔÚ½øÐÐÄÚ´æ·ÖÅäÖ®ºó£¬Srv2DecompressDataŲÓú¯ÊýSmbCompressionDecompressÆðÍ·½âѹ±»Ñ¹ËõµÄÊý¾Ý¡£Æäº¯ÊýÂß¼­Èçͼ13Ëùʾ¡£


GA»Æ½ð¼×¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾

ͼ13 Srv2DecompressData½âѹѹËõÊý¾Ý


ÏÖʵÉÏ£¬¸Ãº¯ÊýŲÓÃÁËWindows¿âº¯ÊýRtlDecompressBufferEx2À´ÊµÏÖ½âѹ£¬Æ¾¾ÝRtlDecompressBufferEx2µÄº¯ÊýÔ­ÐÍÀ´¶ÔÓ¦·ÖÎöSmbCompressionDecompressº¯ÊýµÄ¸÷¸ö²ÎÊý¡£


SmbCompressionDecompress(CompressAlgo£¬//ѹËõËã·¨

Compressed_buf£¬//Ö¸ÏòÊý¾Ý°üÖеÄѹËõÊý¾Ý  

Compressed_size£¬//Êý¾Ý°üÖÐѹËõÊý¾Ý´óÓ×£¬ÍÆËãµÃµ½  

UnCompressedBuf,//½âѹºóµÄÊý¾Ý´æ´¢µØÖ·£¬*(alloc_buffer+0x18)+0x10    

UnCompressedSize,//ѹËõÊý¾Ýԭʼ´óÓ×,Ô´ÓÚÊý¾Ý°üOriginalCompressedSegmentSize  

FinalUnCompressedSize)//×îÖÕ½âѹºóÊý¾Ý´óÓ×


´Ó·´±àÒë´úÂëÄܹ»¿´³ö£¬º¯ÊýSmbCompressionDecompressÖб£Áô½âѹºóÊý¾ÝµÄµØÖ·Îª*(alloc_buffer+0x18)+0x10µÄµØÎ»£¬Æ¾¾ÝÄÚ´æ·ÖÅä¹ý³Ì·ÖÎö£¬alloc_buffer + 0x18Ö¸ÏòÁËÏÖʵÄÚ´æ·ÖÅäÕØÊ¼µØÎ»Æ«ÒÆ0x50´¦£¬ËùÒÔ¿½±´Ö÷ÕŵØÖ·ÎªÏÖʵÄÚ´æ·ÖÅäÕØÊ¼µØÖ·Æ«ÒÆ0x60µØÎ»´¦¡£


ÔÚ½âѹ¹ý³ÌÖУ¬Ñ¹ËõÊý¾Ý½âѹºó½«´æ´¢µ½Õâ¸öµØÖ·Ö¸ÏòµÄÄÚ´æÖС£Æ¾¾ÝevilDataÊý¾ÝµÄ»ú¹Ø¹ý³Ì£¬½âѹºóµÄÊý¾ÝΪռ¿ÓÊý¾ÝºÍtokenAddr¡ £¿½±´µ½¸Ã´¦µØÖ·ºó£¬tokenAddr½«¸²¸ÇÔ­ÄÚ´æÊý¾Ý½á¹¹ÖÐalloc_buffer+0x18´¦µÄÊý¾Ý¡£Ò²¾ÍÊǽâѹËõº¯ÊýSmbCompressionDecompress·µ»Øºó£¬alloc_buffer+0x18½«Ö¸ÏòÑéÖ¤·¨Ê½µÄtokenAddrÄں˵ØÖ·¡ £¿½±´¹ý³ÌÈçͼ14ºÍ15Ëùʾ¡£


GA»Æ½ð¼×¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾

ͼ14 ½âѹ¿½±´¹ý³Ì


GA»Æ½ð¼×¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾

ͼ15½âѹʵÏÖºóÄÚ´æ²¼¾Ö


³ÖÐø¿´Srv2DecompressDataµÄºóÐø´¦ÖÃÁ÷³Ì£¬½âѹ³É¹¦ºó£¬º¯ÊýÅжÏoffsetµÄÁ˾ֲ»Îª0¡£²»Îª0Ôò½øÐÐÄÚ´æÒƶ¯£¬Äڴ濽±´µÄ²ÎÊýÈçÏ£º


memmove(*(alloc_buffer+0x18)£¬SMB_payload£¬offset)

´Ëʱ£¬alloc_buffer+0x18ÒѾ­Ö¸ÏòÑéÖ¤·¨Ê½µÄtokenAddrÄں˵ØÖ·£¬¶øSMB_payload´ËʱָÏòevilDataÖеÄȨÏÞÊý¾Ý£¬offsetÔòΪ0x10¡£Òò¶ø£¬Õâ¸öÄÚ´æÒƶ¯ÊµÏÖºó£¬È¨ÏÞÊý¾Ý½«Ð´ÈëtokenAddr´¦¡£ÕâÒâζ×Å£¬SMS Server³É¹¦Åú¸ÄÁËÑéÖ¤·¨Ê½µÄȨÏÞ£¬´Ó¶øÊµÏÖÁËÑéÖ¤·¨Ê½µÄÌáȨ£¡


»¹ÓÐÒ»¸öϸ½Ú±ØÒª°ÑÎÈ£¬ÔÚ½âѹʱ£¬Srv2DecompressDataº¯Êý»áÅжÏÏÖʵµÄ½âѹºóÊý¾Ý´óÓ×FinalUnCompressedSizeÊÇ·ñºÍÊý¾Ý°üÖÐԭʼÊý¾Ý´óÓ×OriginalCompressedSegmentSizeÒ»Ö£¬Èçͼ16Ëùʾ¡£


GA»Æ½ð¼×¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


ͼ16 Srv2DecompressData²é³­Ñ¹ËõÊý¾Ý´óÓ×


°´ÀíÀ´ËµÏÖʵ½âѹºóµÄÊý¾Ý´óÓ×Ϊ0x1100£¬²»µÅ×ÚÊý¾Ý°üÖеÄԭʼѹËõÊý¾Ý´óÓ×0xffffffff£¬ÕâÀïÓ¦¸Ã½øÈëµ½ºóÃæÄڴ濪Ê͵ÄÁ÷³Ì¡£È»¶ø£¬ÏÖʵÉÏÔÚº¯ÊýSmbCompressionDecompressÖУ¬Å²ÓÃRtlDecompressBufferEx2³É¹¦ºó»áÖ±½Ó½«OriginalCompressedSegmentSize¸³Öµ¸øFinalUnCompressedSize¡£ÕâÒ²ÊǸ÷ì϶¹ØÓÚËÁÒâµØÖ·Ð´Èë³É¹¦µÄ¹Ø¼üÖ®Ò»¡£


GA»Æ½ð¼×¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾

ͼ17 SmbCompressionDecompres¸³ÖµFinalUnCompressedSize


·ì϶½¨¸´½¨Òé


CVE-2020-0796ÊÇÄÚ´æ·ÛËé·ì϶£¬¾«ÐÄÀûÓÿɵ¼ÖÂÔ¶³Ì´úÂëÖ´ÐУ¬Í¬Ê±ÍøÂçÉÏÒѾ­³öÏָ÷ì϶µÄ±¾µØÌáÈ¨ÊÆÓôúÂë¡£ÔÚ´Ë£¬½¨ÒéÊÜÓ°Ïì°æ±¾WindowsÓû§ÊµÊ±Æ¾¾Ý΢Èí¹Ù·½·ì϶·À»¤²¼¸æ¶Ô¸Ã·ì϶½øÐзÀ»¤¡£


²Î¿¼Á´½Ó£º

1.https://fortiguard.com/encyclopedia/ips/48773

2.https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/ADV200005

3.https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2020-0796

4.https://www.catalog.update.microsoft.com/Search.aspx?q=KB4551762

5.https://github.com/danigargu/CVE-2020-0796

6.https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-smb2/5606ad47-5ee0-437a-817e-70c366052962

7.https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/nf-ntifs-rtldecompressbufferex2