No primeiro post desta série, foi descrito como foi realizado o acesso na segurança de dispositivos médicos e foi realizado uma breve introdução ao DICOM. Dessa vez, mostraremos como você pode usar ferramentas de código aberto (ou até mesmo criar seus próprios scripts python) para obter dados do paciente durante compromissos de pentest. Este post é dividido em 5 seções:

  • Ferramentas e Bibliotecas
  • Obtendo dados do paciente
  • Extraindo imagens
  • Dispositivos médicos expostos
  • Conclusões

Ferramentas e Bibliotecas:

Aqui estão algumas das ferramentas e bibliotecas que foi usado durante a pesquisa:

Pydicom: Módulo Python para ler, modificar e gravar arquivos DICOM [2].
Pynetdicom3: implementação em Python do protocolo de rede DICOM [3].
Horos: Visualizador de imagens médicas de código aberto [4].
Radamsa: Fuzzer de uso geral [5].

Obtendo Dados de Pacientes:

Para obter dados do paciente com o DICOM, precisamos usar o serviço C-FIND. O C-FIND é um serviço simples de consulta / recuperação que podemos usar para procurar dados do paciente em um servidor DICOM (SCP). O C-FIND também nos permite usar filtros de pesquisa com base em atributos (por exemplo, Nome ou ID do paciente). A Figura 01 mostra um exemplo de uma solicitação C-FIND (C-FIND-RQ) capturada no Wireshark.

Figura 01: Exemplo de C-FIND-RQ

Uma resposta C-FIND (C-FIND-RSP) transporta os resultados para o pedido de pesquisa enviado na mensagem C-FIND-RQ. C-FIND-RSP geralmente contém informações confidenciais de pacientes e descrições de estudo. A Figura 02 mostra um exemplo de uma mensagem C-FIND-RSP.

Figura 02: Exemplo de C-FIND-RSP

Foi escrito um pequeno script python, usando o módulo pynetdicom, para conectar a um SCP e enviar solicitações C-FIND. Você pode até usar um caractere curinga (*) para obter dados de todos os pacientes (linha 15).

from pynetdicom3 import AE
from pydicom.dataset import Dataset
from pynetdicom3 import QueryRetrieveSOPClassList

ae = AE(scu_sop_class = QueryRetrieveSOPClassList)

ip = "IP ADDRESS HERE"
port = 104
association = ae.associate(ip, port)

if association.is_established:
	print('[+] Association established!')

	dataset = Dataset()
	dataset.PatientName = '*'
	dataset.PatientID = ''
	dataset.PatientSex = ''
	dataset.PatientBirthDate = ''
	dataset.StudyDescription = ''
	dataset.QueryRetrieveLevel = "PATIENT"

	results = association.send_c_find(dataset, query_model='P')

	for (status, dataset) in results:
		if status.status_type == 'Pending':
			print(dataset)
			print('')

	association.release()

Extraindo Imagens

Foi utilizado o Horos para extrair imagens de SCPs durante compromissos de pentest (parece mais fácil assim). Primeiro você deve informar o endereço IP e o número da porta do SCP (você pode encontrar isso em “Preferências> Locais”). Você também pode escolher o método de recuperação de imagem (por exemplo, C-GET).

Figura 03: Definindo o endereço e o número da porta do SCP

Uma vez que os parâmetros de localização estão definidos (Figura 03), você pode começar a extrair os dados do paciente do SCP (Figura 04). Horos também mostra alguns dados do paciente, como nome e data de nascimento. Assim que os registros dos pacientes estiverem listados, você pode simplesmente clicar duas vezes em qualquer registro para baixar as imagens (alguns estudos podem conter uma série de imagens).

Figura 04: Extraindo imagens de um SCP

Dispositivos médicos expostos

O Shodan pode ser usado para encontrar servidores DICOM expostos na Internet. Uma lista de dispositivos DICOM pode ser obtida com as seguintes consultas:

  • dicom porta:104
  • findscu porta:104

Figura 05: Exemplo de um dispositivo DICOM exposto encontrado no Shodan

A Figura 06 mostra um mapa global com 1294 dispositivos DICOM expostos (um grande volume de dispositivos pode ser encontrado na América do Norte, Europa e Brasil).

Figura 06: Mapa global de dispositivos DICOM expostos na Internet

Conclusão

Nesta série de publicações, foi compartilhado algumas pesquisas sobre segurança e experiência em dispositivos médicos com o DICOM. Apresentei alguns conceitos básicos do DICOM e descrevi como você pode usar ferramentas de código aberto durante execução de pentests para avaliar a segurança de dispositivos médicos.

Infelizmente, hospitais e clínicas médicas ainda têm níveis muito baixos (ou falta) de segurança de rede. Os dispositivos DICOM, se não estiverem bem protegidos, podem expor um grande volume de informações confidenciais. Embora o DICOM seja amplamente utilizado por dispositivos médicos, outros protocolos também podem ser encontrados em hospitais, como o HL7. Em conclusão, ainda há muito espaço para pesquisas no campo da medicina.

Texto Traduzido:

https://morphuslabs.com/how-i-got-into-hacking-ultrasound-machines-part-01-432fce2e3ca7

Referências:

https://github.com/pydicom/pydicom

https://github.com/pydicom/pynetdicom3

https://www.horosproject.org/

https://github.com/aoh/radamsa