
CVE-2018-15473 기반의 OpenSSH 사용자 열거 도구로, 포트 스캔, 핑거프린팅, 병렬 실행을 지원하여 원격 SSH 서버에서 사용자 존재 여부를 확인합니다.
Opensshenum은 OpenSsh 사용자 열거 도구로, 임의의 사용자 이름 목록을 OpenSsh 서버에 대해 확인하여 해당 원격 머신에 실제로 존재하는 사용자를 알 수 있게 해줍니다. 이 프로그램은 2018년 7월에 수정된 버그를 악용하며, 적어도 2000년 11월에 출시된 OpenSSH 2.3.0부터 효과가 입증되었습니다.
저는 Tssh에서 시작하여 이 exploit을 작성했습니다. Tssh는 제가 RFC를 기반으로 C++11로 처음부터 작성한 SSH 2 클라이언트입니다.
자세한 정보는 여기에서 읽어보세요:
http://seclists.org/oss-sec/2018/q3/124
이 문제는 CVE-2018-15473으로 지정되었습니다.
이 코드는 정보 및 교육 목적으로 게시되었습니다. 소유자의 허가 없이 시스템이나 서비스에 침입하는 것은 불법입니다. 이 저장소의 정보와 소프트웨어를 오용하면 범죄자에 대한 형사 고발이 제기될 수 있습니다. 이 Git 저장소에 포함된 자료와 관련된 모든 행위나 활동은 전적으로 귀하의 책임입니다. 저자는 이 웹사이트의 정보나 소프트웨어를 불법적으로 사용하여 법을 위반하는 개인에 대해 형사 고발이 제기되는 경우 책임을 지지 않습니다.
이 프로그램은 *nix 환경에서 사용하도록 설계되었으며 다양한 Linux 배포판과 OS X에서 테스트되었습니다:
컴파일러로 다음 목록 중 하나를 사용합니다:
그리고 ssh 서버로 다음 중 하나를 사용합니다:
유일한 외부 종속성은 암호화 기능에 사용되는 OpenSSL 라이브러리입니다. 향후 버전에서는 OpenSSL의 대안을 도입할 수 있습니다. 이 프로그램은 OpenSSL 버전이 다음 이상인 환경에서 사용하도록 설계되었습니다:
(즉, OS X에서는 업그레이드가 필수입니다.)
프로그램을 컴파일하려면 다음 도구/라이브러리가 필요합니다:
파이프로 전달된 사용자 목록을 처리합니다. 예:
cat user.txt | ./opensshenum -i dummy_cert target_addr
xxx:NOK
gabriel:OK
여기서 user.txt는 각 줄에 하나씩 사용자 목록이 포함된 파일이고, dummy_cert는 OpenSsh의 ssh-keygen 명령으로 생성된 키입니다. (기본적으로 키 디렉토리는 ~/.ssh입니다.)
다음과 같이 프로그램을 사용하여 목록을 생성할 수도 있습니다:
printf "xxx\ngabriel" | ./src/opensshenum -i dummy_rsa localhost
xxx:NOK
gabriel:OK
이 릴리스에 포함된 매뉴얼 페이지를 참조하세요.
SSH 포트 스캐너 기능 추가: 이제 opensshenum은 주소와 연결된 모든 포트를 스캔하여 22번 포트가 아닌 다른 포트에서 수신 중인 SSH 인스턴스를 찾아 검증된 포트에만 exploit을 수행할 수 있습니다. 이 기능은 독립적으로 사용할 수 있으며, 공격을 실행하지 않고 SSH와 관련된 포트 목록만 얻을 수 있습니다.
예:
opensshenum -s -n -t2 -m22221 -M22225 -r'.*OpenSSH' -idummy_rsa my_imaginary_website.com
는 포트 22221과 22225 사이(포함)의 포트를 스캔하고(-s), 스캔만 수행하며(-n), 타임아웃 2초(-t), hello 문자열에 OpenSSH가 포함될 것으로 예상하고(-r), idummy_rsa라는 공개 키를 사용하며(-i, 이러한 작업에만 사용할 키를 생성하는 것을 권장), 대상으로 my_imaginary_website.com을 사용합니다. 자세한 내용은 매뉴얼 페이지를 참조하세요.
GNU Parallel을 사용하는 알파 스크립트(parallenum.sh)가 포함되어 있습니다. 이는 스캔할 포트 범위를 하위 범위로 분할하여 각각 특정 프로세스에 할당함으로써 달성할 수 있는 스캔 시간 단축의 개념 증명입니다. 이는 분명히 많은 노이즈를 생성합니다. 노이즈를 줄이기 위해 -t 매개변수를 사용할 수 있습니다.
핑거프린트 기능은 OS 유형(예: "hello" 문자열이 생략된 경우)과 서비스를 사용자/사용자 조합의 데이터베이스로 자동 식별하는 데 유용합니다. 데이터베이스는 디렉토리에 수집된 *.lst 파일로부터 생성됩니다. 각 *.lst 파일의 이름은 <os_name_or_service>.lst 형식입니다. 예:
ubuntu_17_10.lst aix.lst proprietary_ftp.lst
데이터베이스는 csv 파일이며 형식은 다음과 같습니다:
user_1;os_or_service_1; ... ;os_or_service_n ... user_m;os_or_service_1; ... ;os_or_service_n
데이터베이스는 ./utils 디렉토리에 있는 createdb 유틸리티를 사용하여 *.lst 파일에서 생성할 수 있습니다. *.lst 디렉토리를 지정합니다. 예:
cd utils make ./createdb ../lists/
핑거프린팅을 요청하려면 -F 옵션과 데이터베이스 파일을 사용합니다. 예:
cat test/scan.sample | opensshenum -p22 -idummy_rsa -Futils/opensshenum.db localhost