Bueno, como primicia les comento que estoy trabajando en metasploit desarrollando el meterpreter para Linux y *Bsd (posix). Y que hoy por primera vez le pudimos cargar una extension despues de un ida y vuelta de parches tremendo. (Estoy mas que contento de participar en el proyecto jaja)
El tema de este post es que para esa tarea tuvimos que debuggear conexiones SSL y no podiamos modificar el codigo existente por su complejidad. Asi que hice un "port forwarder" de ssl que pueden usar para debuggear conexiones o para hacer mitm.
Bueno, solamente les comento que corre con Python >= 2.6 y bueno, espero que les sirva.
sslfwd.py:
#!/usr/bin/python
import sys, thread
import socket, ssl
def main():
print("\nSSL Proxy dump (by Sebastian Fernandez)\n---------------------------------------")
if(len(sys.argv)!=4):
usage()
settings = (sys.argv[1],int(sys.argv[2]),int(sys.argv[3]))
server(settings)
def usage():
print("Usage:\n\tsslfwd.py [host] [dst port] [src port]")
exit()
def server(settings):
dock_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
dock_socket.bind(('', settings[2]))
dock_socket.listen(5)
print("Socket listening at "+str(settings[2]))
while True:
client_socket = dock_socket.accept()[0]
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#Create SSL wrappers
client_ssl = ssl.wrap_socket(client_socket,
certfile="certfile.crt",
keyfile="keyfile.key",
server_side=True,
ssl_version=ssl.PROTOCOL_TLSv1)
server_ssl = ssl.wrap_socket(server_socket,
ssl_version=ssl.PROTOCOL_TLSv1)
server_ssl.connect((settings[0], settings[1]))
#Start forwarding data
thread.start_new_thread(ssl_forward, (client_ssl, server_ssl))
thread.start_new_thread(ssl_forward, (server_ssl, client_ssl))
lock = thread.allocate_lock()
lock.acquire()
def ssl_forward(source, destination):
data=' '
while data:
try:
data = source.read()
except:
source.close()
destination.close()
return
if data:
work_data(data)
try:
destination.write(data)
except:
pass
finally:
pass
def work_data(data):
data = "DATA =================\n"+data+"\nEND=====================\n"
print(data)
fdump.write(data)
if __name__ == '__main__':
fdump = open('dump.dmp', 'w')
main()
fdump.close()
Necesitan el certificado y la clave para correr el programa, si quieren pueden usar estos que genere:
keyfile.key :
-----BEGIN RSA PRIVATE KEY-----
MIIBPAIBAAJBALpb4iX8d5Iy5eVh/7l8uj4Zii1YPXZcAElaYeE1A2kFYJhuxTdy
Ry+es9XF++hxO7Zoj+u5WA0eW+UgNdB7UjECAwEAAQJBAK522q7JPn+mGse2CRvz
gsAkVNHCrDekRbhmXv/hC4JCpsn2f7rldlFw4CIesSq1RrPBhjkSHeSTN4h/NtAl
tQkCIQDn6/4rwEvdjl/DAyqKCWR1wgf6478qQLcrpqk1mI2ZGwIhAM20691uBABF
MgQcuWPDKtfCMH1rrpxb0Nxk/ZvbC+KjAiAu7KTEnWe8MC5X+rAEtdnJqbSLosDu
/6EQB+x8l50uuQIhAKtInKVSOA6pj04RROUm24OwdIPaqBgV88GwbePa7viVAiEA
tkPhAfR44xvNHIeMUpI4860p4U4OiNzAcuaornLTnGs=
-----END RSA PRIVATE KEY-----
certfile.crt:
-----BEGIN RSA PRIVATE KEY-----
MIIBPAIBAAJBALpb4iX8d5Iy5eVh/7l8uj4Zii1YPXZcAElaYeE1A2kFYJhuxTdy
Ry+es9XF++hxO7Zoj+u5WA0eW+UgNdB7UjECAwEAAQJBAK522q7JPn+mGse2CRvz
gsAkVNHCrDekRbhmXv/hC4JCpsn2f7rldlFw4CIesSq1RrPBhjkSHeSTN4h/NtAl
tQkCIQDn6/4rwEvdjl/DAyqKCWR1wgf6478qQLcrpqk1mI2ZGwIhAM20691uBABF
MgQcuWPDKtfCMH1rrpxb0Nxk/ZvbC+KjAiAu7KTEnWe8MC5X+rAEtdnJqbSLosDu
/6EQB+x8l50uuQIhAKtInKVSOA6pj04RROUm24OwdIPaqBgV88GwbePa7viVAiEA
tkPhAfR44xvNHIeMUpI4860p4U4OiNzAcuaornLTnGs=
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIBfDCCASYCCQCMFXEk7hFlijANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJV
UzETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50ZXJuZXQgV2lkZ2l0
cyBQdHkgTHRkMB4XDTA5MDcyOTA4NDQ1NloXDTA5MDkyNzA4NDQ1NlowRTELMAkG
A1UEBhMCVVMxEzARBgNVBAgTClNvbWUtU3RhdGUxITAfBgNVBAoTGEludGVybmV0
IFdpZGdpdHMgUHR5IEx0ZDBcMA0GCSqGSIb3DQEBAQUAA0sAMEgCQQC6W+Il/HeS
MuXlYf+5fLo+GYotWD12XABJWmHhNQNpBWCYbsU3ckcvnrPVxfvocTu2aI/ruVgN
HlvlIDXQe1IxAgMBAAEwDQYJKoZIhvcNAQEFBQADQQATdEbtRAD4P+F8V/L472GI
pdWYEU7eomrpJTCH0BoWmqd+WkfCFVXuylJbHpM6QgtY3RxTozWtaETQ6VpeJ57f
-----END CERTIFICATE-----
Saludos,
Autor: snf