Ir al contenido

Herramientas, automatización y NSE para Rsync

Por

Madurezreviewed
Última revisión
Publicado
Última actualización

El workflow de Rsync separa el daemon en TCP 873 de rsync sobre SSH. El cliente nativo es la referencia principal porque negocia el protocolo y aplica sus filtros.

Ncat confirma el saludo del daemon sin interpretar módulos:

Ventana de terminal
ncat -nv TARGET_IP 873

El cliente lista módulos con dos formas equivalentes:

Ventana de terminal
rsync rsync://TARGET_IP/
rsync TARGET_IP::

--list-only recorre un módulo sin transferir:

Ventana de terminal
rsync --list-only rsync://TARGET_IP/MODULE/

Añade --recursive solo cuando el listado superficial ya funciona. Un árbol amplio puede generar muchas entradas y atravesar rutas que el módulo expone mediante enlaces o filtros.

--password-file evita la contraseña interactiva. El archivo debe contener solo el secreto y tener permisos restrictivos:

Ventana de terminal
chmod 600 PASSWORD_FILE
rsync --password-file=PASSWORD_FILE \
rsync://USERNAME@TARGET_IP/MODULE/

No publiques el archivo ni su contenido. El usuario efectivo del módulo puede ser distinto del nombre usado en autenticación.

rsync-list-modules consulta la lista pública:

Ventana de terminal
sudo nmap -sV -n -Pn -p 873 \
--script rsync-list-modules TARGET_IP

Valida el resultado con rsync TARGET_IP::. NSE no prueba lectura, escritura ni filtros internos.

Cuando la URL no usa rsync:// y se especifica una ruta remota, el transporte suele ser SSH:

Ventana de terminal
rsync -e 'ssh -p PORT' \
USERNAME@FQDN:/REMOTE/PATH/ LOCAL_PATH/

En este caso, la enumeración depende de SSH, shell remota y permisos del sistema de archivos. TCP 873 puede no participar.

Usa --dry-run para observar selección y --itemize-changes para registrar lo que cambiaría:

Ventana de terminal
rsync --dry-run --itemize-changes \
LOCAL_FILE rsync://USERNAME@TARGET_IP/MODULE/PATH

Un dry run no demuestra escritura efectiva. Si la validación exige crear un objeto, usa un nombre único, confirma el contenido y retíralo.

--contimeout=SECONDS limita la conexión inicial con un daemon. No aplica a rsync sobre SSH. --timeout=SECONDS limita periodos sin actividad de E/S durante la transferencia. --bwlimit=RATE limita el caudal medio y acepta sufijos como K o M. --log-file=FILE conserva el registro de rsync separado del contenido transferido:

Transferencia de control con límites y log
rsync \
--contimeout=5 \
--timeout=20 \
--bwlimit=2M \
--dry-run \
--itemize-changes \
--log-file=evidence/rsync.log \
rsync://USERNAME@TARGET_IP/MODULE/PATH \
LOCAL_PATH/

El comando lista qué cambiaría sin escribir archivos. El límite de ancho de banda modifica duración, no permisos ni selección. Si el daemon corta por timeout, compara el momento con una captura y con el log del cliente.

Para una descarga que deba poder continuar, --partial-dir=DIR conserva bloques incompletos dentro del directorio indicado. El directorio parcial es estado local y puede contener datos sensibles:

Conservar parciales en un directorio controlado
rsync \
--contimeout=5 \
--timeout=30 \
--partial-dir=.rsync-partial \
--itemize-changes \
--log-file=evidence/rsync-download.log \
rsync://USERNAME@TARGET_IP/MODULE/PATH/FILE \
LOCAL_PATH/

Antes de reanudar, confirma que tamaño, mtime y origen remoto corresponden al mismo archivo. Elimina .rsync-partial al cerrar si no se necesita para recuperación.

Un listado vacío puede significar que el módulo existe y no contiene entradas visibles, que un filtro oculta su contenido o que la cuenta ha alcanzado una vista distinta. Compáralo con un nombre inexistente y conserva el mensaje exacto. @ERROR: auth failed, @ERROR: Unknown module y un cierre sin respuesta pertenecen a estados diferentes.

Si Ncat obtiene el saludo pero el cliente no lista módulos, revisa primero la versión anunciada, el terminador de línea y si el daemon permite el listado global. Si --list-only funciona y una transferencia falla, la conexión ya ha superado transporte y selección del módulo. La causa se busca después en autenticación, filtros de inclusión o exclusión, permisos efectivos, espacio y ruta.

En rsync sobre SSH, un error puede proceder del salto SSH, de la ejecución remota del binario o del acceso al sistema de archivos. Añade verbosidad a SSH y a rsync por separado. Cambiar al mismo tiempo el transporte, el usuario y la ruta elimina la posibilidad de atribuir la diferencia.