보안되지 않은 MySQL ‘root’@ ‘localhost’계정이 원격으로 액세스 되었습니까? (!!)없이 실행 중이고 외부

약간의 배경 : 우리는 방금 PBX 시스템을 해킹했습니다. 서버 자체는 안전 해 보이지만 (로그인 된 무단 콘솔 액세스-SSH 등은 아님) 해커들은 PBX 소프트웨어 (FreePBX, MySQL 지원)에 새로운 관리자를 주입 할 수있었습니다. Apache 로그는 해커가 웹 인터페이스 (또는 웹 인터페이스의 악용)를 사용하지 않고 사용자를 추가했음을 의미합니다.

이제는 MySQL이 루트 비밀번호 (!!)없이 실행 중이고 외부 IP 주소에 공개적으로 바인딩되어 있음을 발견했습니다 (분명히이 문제를 해결했습니다). 그러나 MySQL의 유일한 루트 수준 사용자는 'root'@'localhost''root'@'127.0.0.1'이며 둘 다 로컬에서만 액세스 할 수 있어야합니다.

그래서 내 질문은 이것입니다 :

다른 익스플로잇을 로컬로 실행하지 않고 원격 IP 주소에서 ‘root’@ ‘localhost’사용자에 연결할 수 있도록 MySQL 연결을 스푸핑하는 방법이 있습니까?

참고로이 상자는 Mysql 5.0.95를 실행하는 Centos 5 (Linux 2.6.10)입니다.



답변

아니.

로컬 시스템에서 오지 않으면 MySQL은 localhost또는 127.0.0.1호스트 사양 의 사용자에게 로그인 하지 않습니다. 여기에는 인증 우회 취약점 CVE 2012-2122도 포함됩니다. 암호 비교는 속일 수 있지만 호스트 비교는 그렇지 않습니다.

소스 호스트 검사를 “트릭”하기 위해 프록시에서 시스템에 무언가가 필요합니다. phpmyadmin과 같은 것, 또는 MySQL TCP 포트 앞에서 실행되는 HAProxy와 같은로드 밸런서가 떠 오릅니다.


답변

이름 root은 기본적으로 생성되며 잘 알려져 있습니다. 리터럴 값 root는 MySQL 권한 시스템에서 의미가 없습니다. 따라서 사용자 이름을 계속 사용할 필요가 없습니다 root.

root외부 세계가 쉽게 식별 할 수 없도록 사용자 이름을 다른 이름으로 변경해야 합니다. 이렇게하면 해킹 시도가 줄어 듭니다.

예를 들어, 모든 사용자에게 root@ localhost로 알려진 사용자가있는 경우 해커가 사용자를 연결하려고하면 보안을 강화하기 위해 admin_db_name@ 와 같은 특정으로 변경해야합니다 localhost.

MySQL 서버에 대한 연결 Aborted_connects을 알기 위해 주기적으로 호출되는 상태 변수를 모니터링 Refused하십시오. Flush status;명령 후 0이어야하며 더 이상 증가해서는 안됩니다.

‘Aborted_connects’와 같은 상태를 표시합니다.


답변

실시하지 않습니다 “무단 액세스 기록” 시도한다을 로그인 실패 포함? 그렇지 않은 경우 CVE 2012-2122 일 수 있습니다 .

[…] memcmp 함수의 특정 구현으로 특정 환경에서 실행할 때, (MySQL)은 원격 공격자가 동일한 잘못된 암호로 반복적으로 인증함으로써 인증을 우회 할 수 있습니다. 반환 값.