miércoles, 22 de febrero de 2017

Entender lo que es un SOCKS Proxy.

Antes de empezar a ver ejemplos de código, creo que es interesante entender bien que es lo que nos puede aportar la utilización de un SOCKS Proxy. En la gran mayoría de entornos para acceder a toda la electrónica de red se utiliza una servidor de salto que tiene visibilidad a las distintas redes de gestión (OOB) que tengamos disponibles. Desde dicho servidor se puede acceder por SSH, telnet a los distintos dispositivos para acceder a la consola y gestionarlos.

Para desarrollar  una aplicación que tenga que gestionar, despegar configuración o recogerlas es necesario acceder a las consolas de los dispositivos. Lo primero que tenemos que tener un es un túnel al servidor de salto y redirigir todas las peticiones para que sean lanzadas desde allí. Para poner en marcha esto explicaré primero como hacerlo con SecureCRT.


Para configurar SecureCRT de tal forma que podamos añadir una sesión cliente de cualquier dispositivo que queramos acceder hay que tener esencialmente:

- Un túnel SSH desde nuestro ordenador al servidor de salto.
- Un Proxy Sock5 local con o sin autenticación.

Lo primero un (Túnel SSH)  es una sesión normal SSH que tendrá permanecer abierta, lo guardamos y lo renombramos con [Túnel]. El segundo paso importante es crear el proxy sock (Tipo sock5) y definir un puerto de escucha. Por último todas las sesiones nueva que crearemos especificaremos que haga el uso del proxy creado desde SecurCRT.

Configuración del túnel:

SecureCRT Túnel SSH + Proxy Sock5.
 - Creación del túnel:

Creamos una sesión normal que al final lo guardaremos como túnel. Se puede crear varios túnel con varios servidores de salto y varios proxy sock5 el único requisito que este último no coincidan los puertos.




SecureCRT Túnel SSH + Proxy Sock5.
  - Creación del túnel:




IP del servidor de salto.

Se trata de la sesión túnel dejamos vacío el desplegable de Firewall.




Creamos el Proxy Sock (tipo sock5):


SecureCRT Túnel SSH + Proxy Sock5.
 - Creamos el Proxy Sock5





En la misma sesión que estamos creado para el túnel SSH añadimos la configuración del proxy Sock.



SecureCRT Túnel SSH + Proxy Sock5.
  - Creamos el Proxy Sock5



Podemos el nombre para identificarlo y escogemos el puerto. Este puerto recibirá las peticiones que redirecionará al servidor de salto.

Importante escoger le opción Dynamic Port Forwarding que nos permitirá conectar a distintos dispositivos a la vez.








SecureCRT Túnel SSH + Proxy Sock5.
   - Creamos el Proxy Sock5


Resultado una vez creado.





SecureCRT Túnel SSH + Proxy Sock5.
  - Creación del túnel:

Es opcional pero si queremos mantener la sesión SSH abierta y que no sea cerrada por inactividad o  "Timeout".

Podemos habilitar el protocolo no-op que será enviado cada cierto tiempo siempre cuando el servidor tenga la opción habilitada.

La otra opción y que nunca falla es enviar un carácter en este caso un espacio en blanco cada x tiempo. No olvidar poner el espacio en blanco como carácter para que sea enviado.






SecureCRT Túnel SSH + Proxy Sock5.
 - Configuración global (SecureCRT)

Damos de alta el servicio para la escuche de peticiones.





SecureCRT Túnel SSH + Proxy Sock5.
   - Configuración global (SecureCRT)


Añadimos el servicio a nivel local.


SecureCRT Túnel SSH + Proxy Sock5.
  - Configuración global (SecureCRT)

Damos de alta el servicio para la escuche de peticiones.

- Ponemos un nombre.
- IP: 127.0.0.1
- Puerto: 10022




Ahora creamos una sesión para acceder al router1 por ejemplo:


SecureCRT Túnel SSH + Proxy Sock5.
 - Creamos una nueva sesión (cliente)


Este será un nueva sesión para acceder a al dispositivo usando el túnel que previamente hemos creado.

- IP del dispositivo al cual queremos acceder.

- Firewall: Especificamos para esta sesión la utilización del proxy que previamente hemos creado. En cada nueva sesión se tendrá que hacer lo mismo.




SecureCRT Túnel SSH + Proxy Sock5.
  - Creamos una nueva sesión (cliente)

Es opcional podemos especificar un script en este caso en Vbs para que autenticarse de forma automática.

Facilito el código del fichero Autologin.vbs al final de este documento.


Fichero: Autologin.vbs

 #$language = "VBScript"
#$interface = "1.0"

' Script Autorellenar el usuario/contraseña.
' Version = 1.5

Option Explicit

crt.Screen.Synchronous = True

' Declare standard global variables
Dim strUName, strUPwd, objFSO, objFile

Const ForReading = 1
Const Pathlocation = "C:\Blog\Scripts"
Const CiscoIosPrompt = "Username: "
Const CiscoIosPrompt2 = "username: "
Const DellChassisPrompt = "User Name:"

Sub Main
' Create file object
Set objFSO = CreateObject("Scripting.FileSystemObject")

' Call to Procedure to see if credentials are known
Call checkCred(strUName, strUPwd, objFSO)
' return terminal session screen back to nondisruptive
crt.Screen.Synchronous = False

' Clear out file object
Set objFSO = Nothing
End Sub

Sub checkCred(strUName, strUPwd, objFSO)
' Declare procecure variables
Dim intKnown, intFileExist
intKnown = 0
intFileExist = 0
' Check if data file exist
If objFSO.FileExists(Pathlocation) Then intFileExist = 1

' Conditional check if credentials are known 
If strUName = "" Then intKnown = intKnown + 1
If strUPwd = "" Then intKnown = intKnown + 1
If (intKnown > 0) And (intFileExist = 1) Then 
Call readInInfo (strUName, strUPwd, objFSO, objFile)
Else
Call userCred(strUName, strUPwd)
End If
' Credentials should be known now call userLogin
Call userLogin(strUName, strUPwd)
End Sub

Sub readInInfo (strUName, strUPwd, objFSO, objFile)
' Declare procecure variables
Dim strTxtData, arrTxtData
' Open text file for reading
Set objFile = objFSO.OpenTextFile(Pathlocation, ForReading)
' Read in data from text file 
strTxtData = objFile.ReadAll
' Close out text file
objFile.Close
' Break out long string using split on delimiter of carriage return
arrTxtData = Split(strTxtData, vbCrLf)
' Place data in String from Array elements
strUName = arrTxtData(0)
strUPwd = arrTxtData(1)
End Sub

Sub userCred(strUName, strUPwd)
  ' Dialog prompts to collect the access credentials used in this script
   strUName = crt.Dialog.Prompt("Enter Username:", "Username - TACACS or LOCAL", "", False )
   strUPwd = crt.Dialog.Prompt("Enter Password:", "Password - TACACS or LOCAL", "", True )


End Sub



Sub userLogin(strUName, strUPwd)
' Declare procecure variables
Dim intLogin
  ' Login using provided credentials, check for different prompts
  ' WaitForStrings returns index of string as result, 
  ' used to check prompt response selections or 0 = timeout
  ' 
  intLogin = crt.Screen.WaitForStrings(CiscoIosPrompt, DellChassisPrompt, CiscoIosPrompt2, 3)
  If intLogin > 3 Then
MsgBox "No se puede detectar el tipo de prompt!"
Exit Sub
ElseIf intLogin = 0 Then
MsgBox "Timeout!, prompt no detectado :-)"
Exit Sub
Else
   'crt.Sleep 3000
   crt.Screen.WaitForString "Username: ", 1
crt.Screen.Send strUName & chr(13)
crt.Sleep 2000
crt.Screen.WaitForString "assword: ", 1
crt.Screen.Send strUPwd & chr(13)
crt.Sleep 2000
crt.Screen.WaitForString "username: ", 1
crt.Screen.Send strUPwd & chr(13)
End If
' Use condition to see if enable access is available, otherwise enable
If (crt.Screen.WaitForString("#", 1)) Or (crt.Screen.WaitForString("(enable)", 1)) Or (crt.Screen.WaitForString("*", 1))  Then
crt.Window.Activate()
Else
        'crt.Sleep 3000
crt.Screen.WaitForString "Username: "
   crt.Screen.Send strUName & chr(13)
crt.Sleep 2000
crt.Screen.WaitForString "assword: ", 1
crt.Screen.Send strUPwd & chr(13)
crt.Screen.WaitForString "#", 1
End If

End Sub




Estructura del fichero password.txt:

usuario-servidor de salto.
contraseña-servidor de salto.
usuario dispositivo-router1
contraseña dispositivo-router1 


Guardamos los usuarios y contraseña respetado la estructura con carro de retorno al finalizara cada línea.


No hay comentarios:

Publicar un comentario