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ÖÐÖ´ÐÐËÁÒâ´úÂë¡£
OG¶«·½ÌüADLab°²È«×êÑÐÈËÔ±ÔڶԸ÷ì϶½øÐÐ×êÑеĹý³ÌÖз¢ÏÖĿǰÁ÷´«µÄһЩ·ì϶·ÖÎö´æÔÚijЩÎÊÌ⣬£¬£¬Òò¶ø¶Ô¸Ã·ì϶½øÐÐÁËÉî¿ÌµÄ·ÖÎö£¬£¬£¬²¢ÔÚWindows 10ϵͳÉϽøÐÐÁ˸´ÏÖ¡£
·ì϶¸´ÏÖ
ѡȡWindows 10 1903°æ±¾½øÐи´ÏÖ¡£ÔÚ·ì϶ÀûÓú󣬣¬£¬ÑéÖ¤·¨Ê½ÌáȨʵÏÖºó´´½¨ÁËÒ»¸ösystemȨÏÞµÄcmd shell£¬£¬£¬Èçͼ1Ëùʾ¡£
ͼ1 CVE-2020-0796±¾µØÌáȨ
·ì϶¸ù»ùµÀÀí
CVE-2020-0796·ì϶´æÔÚÓÚÊÜÓ°Ïì°æ±¾µÄWindowsÇý¶¯srv2.sysÖС£Windows SMB v3.1.1 °æ±¾Ôö³¤Á˶ÔѹËõÊý¾ÝµÄÖ§³Ö¡£Í¼2ËùʾΪ´øÑ¹ËõÊý¾ÝµÄSMBÊý¾Ý±¨ÎĵÄ×é³É¡£
ͼ2 ´øÑ¹ËõÊý¾ÝµÄSMBÊý¾Ý±¨ÎĽṹ
ƾ¾Ý΢ÈíMS-SMB2ºÍ̸Îĵµ£¬£¬£¬SMB Compression Transform HeaderµÄ½á¹¹Èçͼ3Ëùʾ¡£
ͼ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ÀàÐÍ£©¡£
ͼ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Ëùʾ¡£
ͼ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¡£
ͼ6 SrvNetAllocateBufferÄÚ´æ·ÖÅä¹ý³Ì
ÓÉÓÚ´«¸øSrvNetAllocateBufferµÄ²ÎÊýΪ0xf£¬£¬£¬Æ¾¾ÝSrvNetAllocateBufferµÄ´¦ÖÃÁ÷³Ì¿ÉÖª£¬£¬£¬¸ÃÒªÇóÄڴ潫´ÓSrvNetBufferLookasides±íÖзÖÅä¡£ÕâÀï±ØÒª°ÑÎȵÄÊÇ£¬£¬£¬±äÁ¿SrvDisableNetBufferLookAsideList¸ú×¢²á±íÏîÓйأ¬£¬£¬ÏµÍ³Ä¬ÈÏ״̬ÏÂSrvDisableNetBufferLookAsideListΪ0¡£
ͼ7 SrvDisableNetBufferLookAsideList±äÁ¿³õʼ»¯¹ý³Ì
SrvNetBufferLookasides±íͨ¹ýº¯ÊýSrvNetCreateBuffer³õʼ»¯£¬£¬£¬ÏÖʵSrvNetCreateBufferÑ»·Å²ÓÃÁËSrvNetBufferLookasideAllocate·ÖÅäÄڴ棬£¬£¬Å²ÓÃSrvNetBufferLookasideAllocateµÄ²ÎÊý±ðÀëΪ[¡®0x1100¡¯, ¡®0x2100¡¯, ¡®0x4100¡¯, ¡®0x8100¡¯, ¡®0x10100¡¯, ¡®0x20100¡¯, ¡®0x40100¡¯, ¡®0x80100¡¯, ¡®0x100100¡¯]¡£ÔÚÕâÀ£¬£¬ÄÚ´æ·ÖÅä²ÎÊýΪ0xf£¬£¬£¬¶ÔÓ¦µÄlookaside±íΪ0x1100¾ÞϸµÄ±íÏî¡£
ͼ8 SrvNetCreateBuffer·´±àÒë´úÂë
SrvNetBufferLookasideAllocateº¯ÊýÏÖʵÊÇŲÓÃSrvNetAllocateBufferFromPoolÀ´·ÖÅäÄڴ棬£¬£¬Èçͼ9Ëùʾ¡£
ͼ9 SrvNetBufferLookasideAllocate·´±àÒë´úÂë
ÔÚº¯ÊýSrvNetAllocateBufferFromPoolÖУ¬£¬£¬¶ÔÓÚÓû§ÒªÇóµÄÄÚ´æ·ÖÅä´óС£¬£¬£¬ÄÚ²¿Í¨¹ýExAllocatePoolWithTagº¯Êý·ÖÅäµÄÄÚ´æÏÖʵҪ´óÓÚÒªÇóÖµ£¨¶à³ö²¿ÃÅÓÃÓÚ´æ´¢²¿ÃÅÄÚ´æÓйØÊý¾Ý½á¹¹£©¡£ÒÔÒªÇó·ÖÅä0x1100¾ÞϸΪÀý£¬£¬£¬¾¹ýһϵÁÐÅжϺ󣬣¬£¬×îºó·ÖÅäµÄÄÚ´æ¾Þϸallocate_size = 0x1100 + E8 + 2*(MmSizeOfMdl + 8)¡£
ͼ10 SrvNetAllocateBufferFromPoolº¯Êý·´±àÒë´úÂë
ÄÚ´æ·ÖÅä½áÊøÖ®ºó£¬£¬£¬SrvNetAllocateBufferFromPoolº¯Êý»¹¶Ô·ÖÅäµÄÄÚ´æ½øÐÐÁËһϵÁгõʼ»¯²Ù×÷£¬£¬£¬×îºó·µ»ØÁËÒ»¸öÄÚ´æÐÅÏ¢½á¹¹ÌåÖ¸Õë×÷Ϊº¯ÊýµÄ·µ»ØÖµ¡£
ͼ11 SrvNetAllocateBufferFromPool³õʼ»¯ÄÚ´æÊý¾Ý
ÕâÀï±ØÒª°ÑÎÈÈçϵÄÊý¾Ý¹ØÏµ£ºSrvNetAllocateBufferFromPoolº¯Êý·µ»ØÖµreturn_bufferÖ¸ÏòÒ»¸öÄÚ´æÊý¾Ý½á¹¹£¬£¬£¬¸ÃÄÚ´æÊý¾Ý½á¹¹ÕØÊ¼µØÖ·Í¬ÏÖʵ·ÖÅäÄڴ棨º¯ÊýExAllocatePoolWithTag·ÖÅäµÄÄÚ´æ£©ÕØÊ¼µØÖ·µÄµÄÆ«ÒÆÎª0x1150£»return_buffer+0x18µØÎ»Ö¸ÏòÁËÏÖʵ·ÖÅäÄÚ´æÕØÊ¼µØÖ·Æ«ÒÆ0x50µØÎ»´¦£¬£¬£¬¶ø×îÖÕreturn_buffer»á×÷Ϊº¯ÊýSrvNetAllocateBufferµÄ·µ»ØÖµ¡£ÆäÄÚ´æ²¼¾Ö¹ØÏµÈçͼ12¡£
ͼ12 SrvNetAllocateBuffer£¨0xf)·µ»ØµÄÄÚ´æÊý¾Ý²¼¾Ö
·ì϶ÄÚ´æ·ÛËé·ÖÎö
»Øµ½·ì϶½âѹº¯ÊýSrv2DecompressData£¬£¬£¬ÔÚ½øÐÐÄÚ´æ·ÖÅäÖ®ºó£¬£¬£¬Srv2DecompressDataŲÓú¯ÊýSmbCompressionDecompressÆðÍ·½âѹ±»Ñ¹ËõµÄÊý¾Ý¡£Æäº¯ÊýÂß¼Èçͼ13Ëùʾ¡£
ͼ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Ëùʾ¡£
ͼ14 ½âѹ¿½±´¹ý³Ì
ͼ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Ëùʾ¡£
ͼ16 Srv2DecompressData²é³Ñ¹ËõÊý¾Ý¾Þϸ
°´ÀíÀ´ËµÏÖʵ½âѹºóµÄÊý¾Ý¾ÞϸΪ0x1100£¬£¬£¬²»µÈÓÚÊý¾Ý°üÖеÄÔʼѹËõÊý¾Ý¾Þϸ0xffffffff£¬£¬£¬ÕâÀïÓ¦¸Ã½øÈëµ½ºóÃæÄڴ濪Ê͵ÄÁ÷³Ì¡£È»¶ø£¬£¬£¬ÏÖʵÉÏÔÚº¯ÊýSmbCompressionDecompressÖУ¬£¬£¬Å²ÓÃRtlDecompressBufferEx2³É¹¦ºó»áÖ±½Ó½«OriginalCompressedSegmentSize¸³Öµ¸øFinalUnCompressedSize¡£ÕâÒ²ÊǸ÷ì϶¹ØÓÚËÁÒâµØÖ·Ð´Èë³É¹¦µÄ¹Ø¼üÖ®Ò»¡£
ͼ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


¾©¹«Íø°²±¸11010802024551ºÅ