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

11 KiB
Raw Blame History

3260 - Pentesting ISCSI

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}

Informações Básicas

De Wikipedia:

Em computação, iSCSI é um acrônimo para Internet Small Computer Systems Interface, um padrão de rede de armazenamento baseado em Protocolo de Internet (IP) para conectar instalações de armazenamento de dados. Ele fornece acesso em nível de bloco a dispositivos de armazenamento, transportando comandos SCSI por uma rede TCP/IP. iSCSI é usado para facilitar transferências de dados sobre intranets e para gerenciar armazenamento a longas distâncias. Pode ser usado para transmitir dados sobre redes de área local (LANs), redes de área ampla (WANs) ou a Internet e pode permitir armazenamento e recuperação de dados independentes de localização.

O protocolo permite que clientes (chamados iniciadores) enviem comandos SCSI (CDBs) para dispositivos de armazenamento (alvos) em servidores remotos. É um protocolo de rede de área de armazenamento (SAN), permitindo que organizações consolidem armazenamento em matrizes de armazenamento, enquanto fornecem aos clientes (como servidores de banco de dados e web) a ilusão de discos SCSI conectados localmente. Ele compete principalmente com Fibre Channel, mas ao contrário do Fibre Channel tradicional, que geralmente requer cabeamento dedicado, o iSCSI pode ser executado a longas distâncias usando a infraestrutura de rede existente.

Porta padrão: 3260

PORT     STATE SERVICE VERSION
3260/tcp open  iscsi?

Enumeração

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

Este script indicará se a autenticação é necessária.

Força bruta

Montar ISCSI no Linux

Nota: Você pode descobrir que, quando seus alvos são descobertos, eles estão listados sob um endereço IP diferente. Isso tende a acontecer se o serviço iSCSI estiver exposto via NAT ou um IP virtual. Em casos como esses, iscsiadmin falhará ao tentar se conectar. Isso requer duas alterações: uma no nome do diretório do nó criado automaticamente por suas atividades de descoberta e uma no arquivo default contido dentro deste diretório.

Por exemplo, você está tentando se conectar a um alvo iSCSI em 123.123.123.123 na porta 3260. O servidor que expõe o alvo iSCSI está na verdade em 192.168.1.2, mas exposto via NAT. isciadm registrará o endereço interno em vez do endereço público:

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 criará um diretório no seu sistema de arquivos assim:

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

Dentro do diretório, há um arquivo padrão com todas as configurações necessárias para se conectar ao alvo.

  1. Renomeie /etc/iscsi/nodes/iqn.1992-05.com.emc:fl1001433000190000-3-vnxe/192.168.1.2\,3260\,1/ para /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, altere a configuração node.conn[0].address para apontar para 123.123.123.123 em vez de 192.168.1.2. Isso pode ser feito com um 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

Você pode agora montar o alvo conforme as instruções no link.

Montar ISCSI no Windows

Enumeração manual

sudo apt-get install open-iscsi

Exemplo da documentação do iscsiadm:

Primeiro de tudo, você precisa descobrir os nomes dos alvos por trás do 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

Note que ele mostrará o IP e a porta das interfaces onde você pode alcançar esses alvos. Ele pode até mostrar IPs internos ou IPs diferentes do que você usou.

Então você pega a 2ª parte da string impressa de cada linha (iqn.1992-05.com.emc:fl1001433000190000-3-vnxe da primeira linha) e tenta fazer login:

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.

Então, você pode logout 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 mais informações sobre isso apenas usando sem nenhum 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

Há um script para automatizar o processo básico de enumeração de sub-rede disponível em iscsiadm

Shodan

  • port:3260 AuthMethod

Referências

{% hint style="success" %} Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}