Windows PrintDemonÌáȨ©¶´·ÖÎö
Ðû²¼Ê±¼ä 2020-05-211.©¶´¸ÅÊö
΢ÈíÔÚ5ÔÂ12ÈÕµÄÄþ¾²¸üÐÂÖйûÈ»ÁËÒ»¸öWindowsµ±µØÌáȡ©¶´£¨CVE-2020-1048£©£¬¸Ã©¶´µÄÃèÊöΪ£º
¡°Windows Print Spooler·þÎñ²»Ç¡µ±µØÔÊÐíÈÎÒâµÄÎļþϵͳдÈ룬´æÔÚÌØȨÌáÉý©¶´¡£¹¥»÷ÕßÀûÓôË©¶´Äܹ»ÓÃϵͳÌØȨÔËÐÐÈÎÒâ´úÂ룬´Ó¶øʵÏÖ£º·¨Ê½µÄ°²×°¡¢¼ì²ì¡¢¸ü¸Ä»òÊý¾Ýɾ³ý£¬ÒÔ¼°´´½¨¾ßÓÐÍêÕûȨÏÞµÄÕÊ»§¡£ÒªÀûÓôË©¶´£¬¹¥»÷Õß±ØÐëµÇ¼µ½ÊÜÓ°ÏìµÄϵͳ²¢ÔËÐÐÌض¨½Å±¾»òÓ¦Ó÷¨Ê½¡±¡£
¸Ã©¶´ÓÉÄþ¾²Ñо¿ÈËÔ±Alex IonescuºÍYarden Shafir·¢ÏÖ£¬²¢±»ÃüÃûΪPrintDemon¡£Print SpoolerÊÇϵͳ×Ô´øµÄ´òÓ¡ºǫ́´¦Ö÷þÎñ£¬¹ÜÀíËùÓе±µØºÍÍøÂç´òÓ¡ÐÐÁУ¬¿ØÖÆ×ÅËùÓдòÓ¡ÊÂÇé¡£Print SpoolerÔÚWindowsϵͳÖÐÒÑ´æÔÚ¶àÄ꣬´Ó΢ÈíÐû²¼µÄ²¹¶¡Ò³Ãæ¿ÉÖª¸Ã©¶´Ó°ÏìWindows7ÖÁWindows10 1909µÄ¼¸ºõËùÓа汾¡£
2.©¶´ÑéÖ¤
¶«Éƽ̨ADLabÄþ¾²Ñо¿Ô±¶Ô¸Ã©¶´½øÐÐÁË·ÖÎöºÍÑéÖ¤£¬ÊµÏÖÁËÔÚµÍȨÏ޵ij߶ÈÓû§ÏÂдÈëϵͳĿ¼£¬²âÊÔ²Ù×÷ϵͳΪWindows 10 x64ÆóÒµ°æ2016£¨ºã¾Ã·þÎñ°æ£©£¬²âÊÔ²½ÖèÈçÏ£º
£¨1£©ÔÚ²âÊÔϵͳÖд´½¨Ò»¸ö³ß¶ÈÓû§test£¬²¢Ê¹Óøó߶ÈÓû§µÇ¼ϵͳ¡£¼ì²ìÆäËùÊôÓû§×飬ȷÈÏÆä²»ÊǹÜÀíÔ±Óû§×é¡£
£¨2£©ÔÚtestÕË»§Ï£¬ÊµÑéÔÚϵͳĿ¼Ï´´½¨Îļþ¼Ð»òÕßдÈëÎļþ£¬¾ùʧ°Ü¡£
£¨3£©È»ºóÖ´ÐÐÈçÏÂPowerShellÃüÁÒÔÆÚÔÚϵͳĿ¼Ï´´½¨Îļþmyport.txt¡£
£¨4£©ÖØÆô²âÊÔϵͳ²¢µÇ¼testÓû§£¬¿ÉÒÔ¿´µ½ÔÚϵͳĿ¼ÏÂÒÑÉú³ÉÁËmyport.txtÎļþ£¬¼ì²ìÄÚÈÝȷʵ°üÂÞÁ˲âÊÔ×Ö·û´®¡£¸Ã½á¹û±íÃ÷£ºµÍȨÏÞµÄ testÓû§Í»ÆÆÁËÎÞ·¨ÐÞ¸Äϵͳ×ÊÔ´µÄÄþ¾²ÏÞÖÆ¡£
3.©¶´ÔÀí
¸Ã©¶´Éæ¼°µ½Windows´òÓ¡»úµÄÊÂÇé»úÖÆ£¬Îª¸üºÃµÄÀí½â©¶´³ÉÒò£¬Ê×Ïȼòµ¥½éÉÜ´òÓ¡»ú»ù´¡ÖªÊ¶£¬È»ºóÔÙ·ÖÎö©¶´³ÉÒò¡£
´òÓ¡»úÊÂÇé»úÖÆ
WindowsϵͳµÄ´òÓ¡»úÓÐÁ½¸öºËÐÄ×é¼þ£º´òÓ¡»úÇý¶¯ºÍ´òÓ¡»ú¶Ë¿Ú¡£
¡ö ´òÓ¡»úÇý¶¯
ÔÚÌí¼ÓÒ»¸ö´òÓ¡»úʱ£¬ÐèÒª°²×°´òÓ¡»úÇý¶¯¡£ÔÚMSDNÎĵµÃèÊöÖУ¬ÔçÆÚϵͳҪÇóÖ»Óо߱¸SeLoadDriverPrivilegeȨÏÞµÄÓû§²ÅÆø°²×°´òÓ¡Çý¶¯£¬µ«ÎªÁ˱ãÓڳ߶ÈÓû§°²×°Çý¶¯£¬´ÓWindows Vista¿ªÊ¼£¬Ö»Òª´òÓ¡»úÇý¶¯ÊÇÒѾ´æÔڵĿÉÁ¢¼´Ê¹ÓõÄÇý¶¯£¬¾Í²»ÐèÒªÈκÎÌØȨ¼´¿É°²×°¡£ÀýÈ磬ͨ¹ýÒ»ÌõPowerShellÃüÁî¼´¿É°²×°¡°Generic / Text-Only¡±Çý¶¯¡£
¡ö ´òÓ¡»ú¶Ë¿Ú
ÔÚÌí¼ÓÒ»¸ö´òÓ¡»úʱ£¬ÐèÒªÉèÖôòÓ¡»úµÄ¶Ë¿Ú¡£WindowsÖ§³Ö¶àÖÖÀàÐ͵ĴòÓ¡»ú¶Ë¿Ú£ºLPT1¶Ë¿Ú¡¢USB¶Ë¿Ú¡¢ÍøÂç¶Ë¿ÚºÍÎļþµÈ¡£Èç¹ûÉèÖö˿ÚΪÎļþ£¬ÔòÒâζ×Å´òÓ¡»ú½«Êý¾Ý´òÓ¡µ½Ö¸¶¨Îļþ¡£ÀýÈ磬ͨ¹ýÒ»ÌõPowerShellÃüÁî¼´¿ÉÌí¼ÓÒ»¸öÊä³öµ½Ö¸¶¨ÎļþµÄ´òÓ¡¶Ë¿Ú£º
Add-PrinterPort -Name "C:\windows\Temp\myport.txt"
ʵ¼ÊÉÏ£¬¸Ã²Ù×÷ÊÇÔÚ×¢²á±íÖÐÔö¼ÓÒ»¸öREG_SZÀàÐ͵ÄÖµ¡£
×¼±¸ºÃÇý¶¯ºÍ¶Ë¿Úºó£¬Í¨¹ýÒ»ÌõPowerShellÃüÁî¼´¿É´´½¨Ò»¸ö´òÓ¡»ú¡£
´òÓ¡»ú´´½¨Íê±Ïºó£¬Í¨¹ýÒ»ÌõPowerShellÃüÁî¼´¿É´òÓ¡Êý¾Ýµ½Ö¸¶¨¶Ë¿Ú£º
"PrintTest!" | Out-Printer -Name "PrintTest"
ÓÉÓÚPrintTest´òÓ¡»úµÄ¶Ë¿ÚÊÇÎļþc:\windows\Temp\myport.txt£¬Òò´Ë´òÓ¡ÃüÁîÖ´Ðкó£¬Êý¾Ý¡°Print Test!¡±½«»á±»Ð´È루¼´´òÓ¡£©µ½¸ÃÎļþ¡£
Õë¶Ô¶Ë¿ÚÊÇÎļþµÄ´òÓ¡¹ý³Ì£¬spooler´òÓ¡·þÎñ·¨Ê½ÒÔimpersonating·½Ê½À´Ä£Ä⵱ǰÓû§µÄÌØȨ½øÐÐÎļþдÈë¡£Òò´Ë£¬Èç¹û¶Ë¿ÚÎļþÔÚÊܱ£»¤µÄϵͳĿ¼£¨ÀýÈçC:\Windows\system32£©£¬ Ôò·Ç¹ÜÀíԱϵÄPowerShell´òÓ¡×÷Òµ¾Í»áʧ°Ü¡£
ÍÑ»ú´òÓ¡µÄ»úÖÆ
ÔÚWindowsϵͳÉÏ£¬Èç¹ûϵͳÅäÖÃÆôÓÃÁ˼ÙÍÑ»ú·þÎñ£¬ÔòËùÓеĴòÓ¡ÈÎÎñ¶¼²»ÊÇÁ¢¼´Ö´ÐС£Ïà·´£¬ÏµÍ³Ê¹ÓÃPrint SpoolerÀ´¹ÜÀíÍÑ»ú´òÓ¡ÈÎÎñ¡£¾ßÌåÀ´Ëµ£¬µ±Óû§µ÷ÓôòÓ¡²Ù×÷ºó£¬ÏµÍ³½«´òÓ¡×÷Òµ´æ´¢ÔÚÌض¨µÄ¼ÙÍÑ»úÎļþ¼ÐÖС£
ĬÈÏÇé¿öÏ£¬WindowsÉú³ÉµÄÍÑ»ú´òÓ¡ÈÎÎñÎļþΪ.SPLÎļþ£¬´ËÍâWindows»¹»á´´½¨ºó׺ÃûΪ.SHDµÄshadowÎļþ²¢Í¬SPLÎļþ×ö¹ØÁª¡£´´½¨shadowÎļþµÄÓÃ;ÊÇ£ºÔÚ´òÓ¡·¨Ê½·ºÆðÎÊÌâ»òÕß´òÓ¡ÈÎÎñ±»¹ÒÆðºó£¬PrintSpoolerÒÀÈ»¿ÉÒÔͨ¹ýSHDÎļþ»Ö¸´´òÓ¡ÈÎÎñ¡£
ÔÚWindowsϵͳÖØÆô»òPrint Spooler·þÎñÖØÆôÖ®ºó£¬.SHDºÍ.SPLÎļþ»á±»ÖØжÁÈ¡ÒÔ»Ö¸´´òÓ¡ÈÎÎñ¡£
´òÓ¡ÌáȨµÄÔÀí
ÍÑ»ú´òÓ¡»úÖÆʹµÃWindowsϵͳÔÚÖØÆôºó»á»Ö¸´¿ÉÄÜ´æÔÚµÄδִÐдòÓ¡ÈÎÎñ¡£µ«ÊÇ£¬ÖØÆôºóµÄPrinter Spooler·þÎñ·¨Ê½Ö±½ÓʹÓÃÁËSystemȨÏÞÀ´»Ö¸´Î´Ö´ÐеĴòÓ¡×÷Òµ¡£¶ÔÓÚ´òÓ¡»ú¶Ë¿ÚΪÎļþµÄ´òÓ¡ÈÎÎñ£¬´òÓ¡ÎļþµÄдÈëÒ²¾ÍÔÚSystemȨÏÞϱ»Ö´ÐС£Òò´Ë£¬ÏµÍ³ÖØÆôʹµÃÍÑ»ú´òÓ¡ÈÎÎñ¾ß±¸ÁËSystemȨÏÞµÄÈÎÒâÎļþдÈëÄÜÁ¦¡£
´òÓ¡»úµÄÉèÖóýPowerShell½Å±¾Í⣬ͨ¹ýϵͳ¿ØÖÆÃæ°åÒ²ÄÜÉèÖ᣾ßÌåÀ´Ëµ£¬Í¨¹ý¡°É豸ºÍ´òÓ¡»ú¡±ÄÜÌí¼Ó´òÓ¡»ú²¢ÉèÖö˿ڡ£
µ«Èç¹ûÉèÖôòÓ¡¶Ë¿ÚÃûΪ¡°C:\Windows\system32\myport.txt¡±£¬Ôò»áʧ°Ü¡£
ΪºÎÉèÖÃͬÑùÎļþÃûµÄ´òÓ¡»ú¶Ë¿Ú£¬Í¨¹ý¿ØÖÆÃæ°å»áʧ°Ü£¬¶øͨ¹ýPowerShell ÃüÁîÔò¿ÉÒÔÀÖ³ÉÄØ£¿Í¨¹ý·ÖÎöÕâÁ½ÖÖ·½Ê½¶Ôspooler·¨Ê½Ö´ÐÐÁ÷³ÌµÄÓ°Ï죬·¢ÏÖspooler·¨Ê½¶Ôͨ¹ýPowerShellÃüÁîÐÐÌí¼Ó´òÓ¡»ú¶Ë¿Ú·½Ê½È±·¦Äþ¾²Ð£Ñé¡£
¾ßÌåÀ´½²£¬Õë¶ÔPowerShellÃüÁîÌí¼Ó´òÓ¡»ú¶Ë¿Ú£¬spooler·¨Ê½Ö±½ÓÉèÖÃÁËÏàÓ¦µÄ´òÓ¡»ú¶Ë¿Ú×¢²á±íÏÕë¶Ô¿ØÖÆÃæ°åÌí¼Ó´òÓ¡»ú¶Ë¿Ú£¬spooler·¨Ê½»áÊ×ÏÈʵÑé´´½¨¸Ã¶Ë¿ÚÎļþ£¬´´½¨Ê§°Üºó¾Í²»»áÔÙÉèÖÃÏàÓ¦µÄ×¢²á±íÏî¡£
½øÒ»²½·ÖÎöÏà¹ØAPI·¢ÏÖ£¬WindowsϵͳÌṩÁËÁ½ÖÖÌí¼Ó´òÓ¡»ú¶Ë¿ÚµÄAPI£¬·Ö±ðÊÇAddPortº¯ÊýºÍXcvDataº¯Êý¡£ÆäÖÐMSDN¶ÔAddPortµÄÃèÊö£º
¡°AddPortº¯Êýä¯ÀÀÍøÂçÒÔ²éÕÒÏÖÓж˿ڣ¬²¢µ¯³ö¶Ô»°¿ò¹©Óû§Ñ¡Ôñ¡£AddPortº¯ÊýÓ¦¸Ãͨ¹ýµ÷ÓÃEnumPortsÀ´ÑéÖ¤Óû§ÊäÈëµÄ¶Ë¿ÚÃû³Æ£¬ÒÔÈ·±£²»´æÔÚÖظ´µÄÃû³Æ¡£AddPortº¯ÊýµÄµ÷Ó÷½±ØÐë¾ßÓзÃÎʶ˿ÚËùÁ¬½ÓµÄ·þÎñÆ÷µÄSERVER_ACCESS_ADMINISTERȨÏÞ¡£ÒªÌí¼Ó¶Ë¿Ú¶ø²»ÏÔʾ¶Ô»°¿ò£¬¿Éµ÷ÓÃXcvDataº¯Êý¶ø²»ÊÇAddPort ¡±¡£
ͨ¹ý¿ØÖÆÃæ°åÌí¼Ó´òÓ¡»úÔڵײãÊǵ÷ÓÃÁËAddPortº¯Êý£¬¸Ãº¯Êý»á´¥·¢spooler·¨Ê½¶Ô¶Ë¿ÚµÄºÏ·¨ÐÔУÑ顣ͨ¹ýPowerShellÃüÁîÌí¼Ó´òÓ¡»úÔڵײãÔòÊÇÖ±½Óµ÷ÓÃXcvDataº¯Êý£¬¸Ãº¯Êý²»»á´¥·¢spooler·¨Ê½¶ÔÓû§Ìí¼ÓµÄ¶Ë¿Ú½øÐÐÄþ¾²Ð£Ñé¡£Òò´Ë£¬²âÊÔ·¨Ê½AddPort.exeͨ¹ý¸Ãº¯ÊýÔڳ߶ÈÓû§È¨ÏÞÏÂÒ²ÄÜÉèÖôòÓ¡»ú¶Ë¿ÚΪÊܱ£»¤Ä¿Â¼ÖеÄÎļþ¡£
©¶´²¹¶¡µÄ·ÖÎö
·ÖÎö©¶´ÐÞ¸´ºóµÄ°æ±¾·¢ÏÖ£¬Î¢ÈíÔÚÒªº¦º¯ÊýLcmCreatePortEntry£¨×îÖÕ´´½¨´òÓ¡»ú¶Ë¿ÚµÄº¯Êý£©ÖÐÌí¼ÓÁËÏàÓ¦µÄ¶Ë¿ÚºÏ·¨ÐÔ¼ì²é´úÂë¡£ÏÂͼÊÇÒªº¦º¯ÊýLcmCreatePortEntryÔÚÐÞ¸´Ç°ºÍÐÞ¸´ºóµÄCall Graph¶Ô±È£¬¿ÉÒÔ¿´³ö£º²¹¶¡µÄºËÐÄÊÇͨ¹ýº¯ÊýPortIsValid¶Ô¶Ë¿Ú½øÐкϷ¨ÐÔ¼ì²é¡£
ƾ¾ÝÉÏÎĵķÖÎö¿ÉÖª£¬³ß¶ÈÓû§ÊÇÎÞ·¨ÔÚϵͳĿ¼Öд´½¨ÎļþµÄ£¬°Ñ¶Ë¿ÚÉèÖÃΪϵͳĿ¼ÏµÄÎļþ»áµ¼ÖÂPortIsValid¼ì²â²»µ½Ä¿±êÎļþ£¬´Ó¶øÅж¨ÒªÉèÖõĶ˿ÚÊÇ·Ç·¨µÄ¡£Òò´Ë£¬ÔÚ²¹¶¡ÐÞ¸´ºó£¬³ß¶ÈÓû§Ìí¼Ó´òÓ¡¶Ë¿ÚΪϵͳĿ¼ÏÂÎļþµÄ´òÓ¡»ú¾Í»áʼÖÕʧ°Ü£¬´Ó¶øÖÆÖ¹ÁËϵͳÖØÆôʱ»Ö¸´¶ñÒâµÄ´òÓ¡·þÎñ¡£
4.ÐÞ¸´½¨Òé
ÓÉÓڸ鶴ÄÜÓ°ÏìÖÚ¶àµÄWindowsϵͳ°æ±¾£¬¶øÇÒ¿ÉÒÔÔڳ߶ÈÓû§ÏÂÌᳫ©¶´¹¥»÷£¬½¨ÒéÊÜÓ°ÏìµÄÓû§¼°Ê±½øÐÐϵͳ¸üлò°²×°Â©¶´²¹¶¡¡£
´ËÍ⣬΢ÈíµÄÄþ¾²¸üÐÂÖ»ÊǶԴòÓ¡¶Ë¿ÚAPI½øÐÐÁ˸üÑϸñµÄУÑé¡£µ«ÊÇ£¬Èç¹û¶ñÒâÎļþ¶Ë¿ÚÔÚ©¶´ÐÞ¸´Ç°ÒѾ´´½¨£¬Ôò©¶´¹¥»÷ʵ¼ÊÒѾÉúЧ£¬´Ëʱ½øÐÐϵͳ¸üÐÂÈÔÈ»ÊDz»Äþ¾²µÄ¡£½¨ÒéÓû§ÏÈʹÓÃPowerShellÃüÁîGet-PrinterPortÀ´¼ì²éϵͳÖÐÊÇ·ñ´æÔÚ¿ÉÒɵĴòÓ¡»ú¶Ë¿Ú£¬ÔÚɾ³ý¿ÉÒɶ˿ںóÔÙʵʩϵͳ¸üС£
²Î¿¼Á´½Ó£º
[1]https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2020-1048
[2]https://docs.microsoft.com/en-us/windows/win32/printdocs/addport
[3]https://docs.microsoft.com/en-us/previous-versions/ff564255(v%3dvs.85)
[4]https://windows-internals.com/printdemon-cve-2020-1048/