hacktricks/network-services-pentesting/3260-pentesting-iscsi.md
2024-02-10 21:30:13 +00:00

13 KiB
Raw Blame History

3260 - ISCSI 펜테스팅

htARTE (HackTricks AWS Red Team Expert)를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요!

HackTricks를 지원하는 다른 방법:

기본 정보

Wikipedia에서 가져온 내용:

컴퓨팅에서 iSCSIInternet Small Computer Systems Interface의 약자로, 데이터 저장 시설을 연결하는 IP 기반 스토리지 네트워킹 표준입니다. TCP/IP 네트워크를 통해 SCSI 명령을 전송하여 스토리지 장치에 블록 수준의 액세스를 제공합니다. iSCSI는 이너넷과 장거리 스토리지 관리를 위해 데이터 전송을 용이하게 합니다. 이는 로컬 영역 네트워크(LAN), 광역 네트워크(WAN) 또는 인터넷을 통해 데이터를 전송할 수 있으며 위치에 독립적인 데이터 저장 및 검색을 가능하게 할 수 있습니다.

이 프로토콜은 클라이언트(이니셔에이터)가 원격 서버의 스토리지 장치(타겟)에 SCSI 명령(CDB)을 보낼 수 있도록 합니다. 이는 스토리지 영역 네트워크(SAN) 프로토콜로, 조직이 스토리지를 스토리지 어레이로 통합할 수 있으면서 데이터베이스 및 웹 서버와 같은 클라이언트에게 로컬로 연결된 SCSI 디스크와 같은 환상을 제공합니다. 주로 Fibre Channel과 경쟁하지만 전통적인 Fibre Channel과 달리 전용 케이블이 필요한 경우가 많은 Fibre Channel과 달리 iSCSI는 기존 네트워크 인프라를 사용하여 장거리에서 실행할 수 있습니다.

기본 포트: 3260

PORT     STATE SERVICE VERSION
3260/tcp open  iscsi?

열거

iSCSI 서비스 확인

iSCSI 서비스는 TCP 포트 3260을 사용합니다. 따라서, 해당 포트가 열려 있는지 확인해야 합니다. 다음 명령어를 사용하여 포트 스캔을 수행할 수 있습니다.

nmap -p 3260 <target_ip>

iSCSI 서버 정보 수집

iSCSI 서버에 대한 정보를 수집하는 것은 중요합니다. 다음 명령어를 사용하여 iSCSI 서버의 정보를 확인할 수 있습니다.

iscsiadm -m discovery -t sendtargets -p <target_ip>

위 명령어를 실행하면 iSCSI 서버의 IP 주소와 포트 번호를 얻을 수 있습니다.

iSCSI 서버 연결

iSCSI 서버에 연결하기 위해 다음 명령어를 사용할 수 있습니다.

iscsiadm -m node -T <target_name> -p <target_ip> -l

위 명령어에서 <target_name>은 iSCSI 서버의 이름이고, <target_ip>는 iSCSI 서버의 IP 주소입니다.

iSCSI 서버 인증 우회

iSCSI 서버에 연결할 때 인증을 우회해야 하는 경우, 다음 명령어를 사용할 수 있습니다.

iscsiadm -m node -T <target_name> -p <target_ip> --op=update --name=node.session.auth.authmethod --value=None

위 명령어를 실행하면 인증 우회가 가능해집니다.

iSCSI 서버 마운트

iSCSI 서버에 연결한 후, 다음 명령어를 사용하여 iSCSI 볼륨을 마운트할 수 있습니다.

mount /dev/sdX /mnt

위 명령어에서 /dev/sdX는 iSCSI 디바이스의 경로이고, /mnt는 마운트할 디렉토리입니다.

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

이 스크립트는 인증이 필요한지 여부를 나타냅니다.

무차별 대입 공격

리눅스에서 ISCSI 마운트

참고: 대상이 발견되면 다른 IP 주소로 나열될 수 있습니다. 이는 iSCSI 서비스가 NAT 또는 가상 IP를 통해 노출되는 경우에 발생하는 경향이 있습니다. 이러한 경우 iscsiadmin은 연결에 실패합니다. 이를 해결하기 위해 두 가지 수정이 필요합니다. 하나는 발견 활동으로 자동으로 생성된 노드의 디렉토리 이름을 수정하는 것이고, 다른 하나는 이 디렉토리에 포함된 default 파일을 수정하는 것입니다.

예를 들어, 123.123.123.123의 3260 포트에서 iSCSI 대상에 연결하려고 합니다. iSCSI 대상을 노출하는 서버는 실제로 192.168.1.2에 있지만 NAT를 통해 노출됩니다. isciadm은 공용 주소 대신 내부 주소를 등록합니다.

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
[...]

이 명령은 다음과 같이 파일 시스템에 디렉토리를 생성합니다:

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

디렉토리 내에는 대상에 연결하기 위해 필요한 모든 설정이 포함된 기본 파일이 있습니다.

  1. /etc/iscsi/nodes/iqn.1992-05.com.emc:fl1001433000190000-3-vnxe/192.168.1.2\,3260\,1//etc/iscsi/nodes/iqn.1992-05.com.emc:fl1001433000190000-3-vnxe/123.123.123.123\,3260\,1/로 이름을 변경합니다.
  2. /etc/iscsi/nodes/iqn.1992-05.com.emc:fl1001433000190000-3-vnxe/123.123.123.123\,3260\,1/default 내에서 node.conn[0].address 설정을 192.168.1.2 대신 123.123.123.123으로 변경합니다. 다음과 같은 명령을 사용하여 이 작업을 수행할 수 있습니다. 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

이제 링크 안의 지침에 따라 대상을 마운트할 수 있습니다.

Windows에서 ISCSI 마운트

수동 열거

sudo apt-get install open-iscsi

다음은 iscsiadm 문서에서의 예시입니다:

먼저 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

참고로, 여기에서는 대상에 도달할 수 있는 인터페이스의 IP와 포트를 보여줍니다. 심지어 사용한 IP와는 다른 내부 IP나 다른 IP를 보여줄 수도 있습니다.

그런 다음 각 줄의 출력 문자열의 두 번째 부분을 잡아서 (첫 번째 줄에서는 iqn.1992-05.com.emc:fl1001433000190000-3-vnxe) 로그인을 시도합니다:

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.

그런 다음 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.

더 많은 정보를 얻기 위해선 --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

기본 서브넷 열거 프로세스를 자동화하는 스크립트가 iscsiadm 에서 사용 가능합니다.

Shodan

  • port:3260 AuthMethod

참고 자료

htARTE (HackTricks AWS Red Team Expert) 를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요!

HackTricks를 지원하는 다른 방법: