hacktricks/network-services-pentesting/3260-pentesting-iscsi.md

11 KiB
Raw Blame History

3260 - Pentesting ISCSI

Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Información Básica

En informática, iSCSI es un acrónimo de Internet Small Computer Systems Interface, un estándar de red de almacenamiento basado en el Protocolo de Internet (IP) para conectar instalaciones de almacenamiento de datos. Proporciona acceso a nivel de bloque a dispositivos de almacenamiento transportando comandos SCSI a través de una red TCP/IP. iSCSI se utiliza para facilitar transferencias de datos a través de intranets y para gestionar almacenamiento a larga distancia. Puede usarse para transmitir datos a través de redes de área local (LAN), redes de área amplia (WAN) o Internet y puede permitir el almacenamiento y recuperación de datos independiente de la ubicación.

El protocolo permite a los clientes (llamados iniciadores) enviar comandos SCSI (CDBs) a dispositivos de almacenamiento (objetivos) en servidores remotos. Es un protocolo de red de área de almacenamiento (SAN), que permite a las organizaciones consolidar el almacenamiento en matrices de almacenamiento mientras proporciona a los clientes (como servidores de bases de datos y web) la ilusión de discos SCSI conectados localmente. Principalmente compite con Fibre Channel, pero a diferencia del Fibre Channel tradicional que generalmente requiere cableado dedicado, iSCSI puede funcionar a largas distancias utilizando la infraestructura de red existente.

Puerto predeterminado: 3260

PORT     STATE SERVICE VERSION
3260/tcp open  iscsi?

Enumeración

nmap -sV --script=iscsi-info -p 3260 192.168.xx.xx

Este script indicará si se requiere autenticación.

Fuerza bruta

Montar ISCSI en Linux

Nota: Puede que encuentres que cuando tus objetivos son descubiertos, están listados bajo una dirección IP diferente. Esto tiende a suceder si el servicio iSCSI está expuesto a través de NAT o una IP virtual. En casos como estos, iscsiadmin fallará al conectar. Esto requiere dos ajustes: uno al nombre del directorio del nodo creado automáticamente por tus actividades de descubrimiento, y otro al archivo default contenido dentro de este directorio.

Por ejemplo, estás intentando conectarte a un objetivo iSCSI en 123.123.123.123 en el puerto 3260. El servidor que expone el objetivo iSCSI está realmente en 192.168.1.2 pero expuesto a través de NAT. isciadm registrará la dirección interna en lugar de la dirección pública:

iscsiadm -m discovery -t sendtargets -p 123.123.123.123:3260
192.168.1.2:3260,1 iqn.1992-05.com.emc:fl1001433000190000-3-vnxe
[...]

Este comando creará un directorio en tu sistema de archivos de la siguiente manera:

/etc/iscsi/nodes/iqn.1992-05.com.emc:fl1001433000190000-3-vnxe/192.168.1.2\,3260\,1/

Dentro del directorio, hay un archivo predeterminado con todas las configuraciones necesarias para conectarse al objetivo.

  1. Renombra /etc/iscsi/nodes/iqn.1992-05.com.emc:fl1001433000190000-3-vnxe/192.168.1.2\,3260\,1/ a /etc/iscsi/nodes/iqn.1992-05.com.emc:fl1001433000190000-3-vnxe/123.123.123.123\,3260\,1/
  2. Dentro de /etc/iscsi/nodes/iqn.1992-05.com.emc:fl1001433000190000-3-vnxe/123.123.123.123\,3260\,1/default, cambia la configuración de node.conn[0].address para que apunte a 123.123.123.123 en lugar de 192.168.1.2. Esto se puede hacer con un comando como sed -i 's/192.168.1.2/123.123.123.123/g' /etc/iscsi/nodes/iqn.1992-05.com.emc:fl1001433000190000-3-vnxe/123.123.123.123\,3260\,1/default

Ahora puedes montar el objetivo siguiendo las instrucciones en el enlace.

Montar ISCSI en Windows

Enumeración manual

sudo apt-get install open-iscsi

Primero necesitas descubrir el nombre del objetivo detrás de la IP:

iscsiadm -m discovery -t sendtargets -p 123.123.123.123:3260
123.123.123.123:3260,1 iqn.1992-05.com.emc:fl1001433000190000-3-vnxe
[2a01:211:7b7:1223:211:32ff:fea9:fab9]:3260,1 iqn.2000-01.com.synology:asd3.Target-1.d0280fd382
[fe80::211:3232:fab9:1223]:3260,1 iqn.2000-01.com.synology:Oassdx.Target-1.d0280fd382

Tenga en cuenta que mostrará la IP y el puerto de las interfaces donde puede llegar a esos objetivos. Incluso puede mostrar IPs internas o diferentes IPs de la que utilizó.

Luego capture la 2da parte de la cadena impresa de cada línea (iqn.1992-05.com.emc:fl1001433000190000-3-vnxe de la primera línea) e intente iniciar sesión:

iscsiadm -m node --targetname="iqn.1992-05.com.emc:fl1001433000190000-3-vnxe" -p 123.123.123.123:3260 --login
Logging in to [iface: default, target: iqn.1992-05.com.emc:fl1001433000190000-3-vnxe, portal: 123.123.123.123,3260] (multiple)
Login to [iface: default, target: iqn.1992-05.com.emc:fl1001433000190000-3-vnxe, portal: 123.123.123.123,3260] successful.

Entonces, puedes cerrar sesión usando logout

iscsiadm -m node --targetname="iqn.1992-05.com.emc:fl1001433000190000-3-vnxe" -p 123.123.123.123:3260 --logout
Logging out of session [sid: 6, target: iqn.1992-05.com.emc:fl1001433000190000-3-vnxe, portal: 123.123.123.123,3260]
Logout of [sid: 6, target: iqn.1992-05.com.emc:fl1001433000190000-3-vnxe, portal: 123.123.123.123,3260] successful.

Podemos encontrar más información al respecto simplemente usando sin ningún parámetro --login/--logout

iscsiadm -m node --targetname="iqn.1992-05.com.emc:fl1001433000190000-3-vnxe" -p 123.123.123.123:3260
# BEGIN RECORD 2.0-873
node.name = iqn.1992-05.com.emc:fl1001433000190000-3-vnxe
node.tpgt = 1
node.startup = manual
node.leading_login = No
iface.hwaddress = <empty>
iface.ipaddress = <empty>
iface.iscsi_ifacename = default
iface.net_ifacename = <empty>
iface.transport_name = tcp
iface.initiatorname = <empty>
iface.bootproto = <empty>
iface.subnet_mask = <empty>
iface.gateway = <empty>
iface.ipv6_autocfg = <empty>
iface.linklocal_autocfg = <empty>
iface.router_autocfg = <empty>
iface.ipv6_linklocal = <empty>
iface.ipv6_router = <empty>
iface.state = <empty>
iface.vlan_id = 0
iface.vlan_priority = 0
iface.vlan_state = <empty>
iface.iface_num = 0
iface.mtu = 0
iface.port = 0
node.discovery_address = 192.168.xx.xx
node.discovery_port = 3260
node.discovery_type = send_targets
node.session.initial_cmdsn = 0
node.session.initial_login_retry_max = 8
node.session.xmit_thread_priority = -20
node.session.cmds_max = 128
node.session.queue_depth = 32
node.session.nr_sessions = 1
node.session.auth.authmethod = None
node.session.auth.username = <empty>
node.session.auth.password = <empty>
node.session.auth.username_in = <empty>
node.session.auth.password_in = <empty>
node.session.timeo.replacement_timeout = 120
node.session.err_timeo.abort_timeout = 15
node.session.err_timeo.lu_reset_timeout = 30
node.session.err_timeo.tgt_reset_timeout = 30
node.session.err_timeo.host_reset_timeout = 60
node.session.iscsi.FastAbort = Yes
node.session.iscsi.InitialR2T = No
node.session.iscsi.ImmediateData = Yes
node.session.iscsi.FirstBurstLength = 262144
node.session.iscsi.MaxBurstLength = 16776192
node.session.iscsi.DefaultTime2Retain = 0
node.session.iscsi.DefaultTime2Wait = 2
node.session.iscsi.MaxConnections = 1
node.session.iscsi.MaxOutstandingR2T = 1
node.session.iscsi.ERL = 0
node.conn[0].address = 192.168.xx.xx
node.conn[0].port = 3260
node.conn[0].startup = manual
node.conn[0].tcp.window_size = 524288
node.conn[0].tcp.type_of_service = 0
node.conn[0].timeo.logout_timeout = 15
node.conn[0].timeo.login_timeout = 15
node.conn[0].timeo.auth_timeout = 45
node.conn[0].timeo.noop_out_interval = 5
node.conn[0].timeo.noop_out_timeout = 5
node.conn[0].iscsi.MaxXmitDataSegmentLength = 0
node.conn[0].iscsi.MaxRecvDataSegmentLength = 262144
node.conn[0].iscsi.HeaderDigest = None
node.conn[0].iscsi.DataDigest = None
node.conn[0].iscsi.IFMarker = No
node.conn[0].iscsi.OFMarker = No
# END RECORD

Existe un script para automatizar el proceso básico de enumeración de subredes disponible en iscsiadm

Shodan

  • port:3260 AuthMethod

Referencias

{% embed url="https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html" %}

Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks: