!c99Shell v. 1.0 pre-release build #16!

Software: Apache/2.2.3 (CentOS). PHP/5.1.6 

uname -a: Linux mx-ll-110-164-51-230.static.3bb.co.th 2.6.18-194.el5PAE #1 SMP Fri Apr 2 15:37:44
EDT 2010 i686
 

uid=48(apache) gid=48(apache) groups=48(apache) 

Safe-mode: OFF (not secure)

/usr/libexec/webmin/init/   drwxr-xr-x
Free 50.94 GB of 127.8 GB (39.86%)
Home    Back    Forward    UPDIR    Refresh    Search    Buffer    Encoder    Tools    Proc.    FTP brute    Sec.    SQL    PHP-code    Update    Feedback    Self remove    Logout    


Viewing file:     hostconfig-lib.pl (8.53 KB)      -rwxr-xr-x
Select action/file-type:
(+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
#!/usr/bin/perl
# hostconfig-lib.pl

# These are functions specific to the hostconfig file
# used by darwin

# written by Michael A. Peters <mpeters@mac.com>

sub hostconfig_settings
{
####
#
# This subroutine reads the hostconfig file into an array
# and outputs a second array containing matched pairs of
# the startup action and what the startup action is set to
#
####
local($conffile, @hconf);
$conffile = "$config{'hostconfig'}";
open(LOCAL, $conffile);
@conf = <LOCAL>;
close(LOCAL);
@conf = grep /^\w/, @conf;
while (<@conf>) {
    push @hconf, [ split /=/ ];
    }
return @hconf;
}

sub hostconfig_gather
{
####
#
# Gathers information about an action item that is set in the hostconfig
# file.
#
# It takes one arguement- the type of info wanted (description or 
# scriptname)
#
# It outputs a hash where the action item is the key, and what was 
# requested is the value.
#
# Thus, we can use the hash to find out what startup script is 
# associated with the MAILSERVER action or what description goes with 
# that action.
#
# Originally I wanted to output an array with two elements where the 
# first was one type of hash, and the second element was the second type # of hash, but I couldn't get that to work (array of hashes)
#
####
local ($hash_type, @startupdir, $plist, @action_to_description, @action_to_script, @sec_action_to_description, @sec_action_to_script, $element, @ls, @script, $a, $action_name, @param, $description);

my($hash_type) = @_;
@startupdir = ();
@startupdir = split (/:/, $config{'startup_dirs'});
$plist = $config{'plist'};
@action_to_description = ();
@action_to_script = ();
@sec_action_to_description = ();
@sec_action_to_script = ();

foreach $element (@startupdir) {
    if ( -d "$element" ) {
        opendir (LOCAL, $element);
        @ls = readdir LOCAL;
        closedir LOCAL;
        shift @ls; shift @ls;
        foreach $a (@ls) {
            #we need BOTH an executable and a plist- or its useless.
            #executable script has to be in a directory of the same
            #name for some reason
            if (( -x "$element/$a/$a") && ( -e "$element/$a/$plist")) {
                #Get the startup action associated with script
                open (SCRIPT, "$element/$a/$a");
                @script = <SCRIPT>;
                close SCRIPT;
                @script = grep /:=/, @script;
                #  we are looking at a line in the script that looks like:
                #if [ "${WEBMIN:=-NO-}" = "-YES-" ]; then
                #  and we want to extract the WEBMIN part as the action_name
                if ( $script[0] =~ /\$\{(.*):/ ) {
                    $action_name = $1;
                    }
                else {
                    #shouldn't happen
                    $action_name = "";
                    }
                open (PLIST, "$element/$a/$plist");
                @param = <PLIST>;
                close PLIST;
                @param = grep /Description[ \t]*=/, @param;
                #  we are looking at a line in the plist that looks like:
                #\t\tDescription\t\t= "Webmin System Administration Daemon";
                #  and we want to extract the contents of the quotes
                if ( $param[0] =~ /\"(.*)\"/ ) {
                    $description = $1;
                    }
                else {
                    $description = "";
                    }
                # make the primary hash
                if ( $action_name ne "" ) {
                    $action_to_description{$action_name} = "$description";
                    $action_to_script{$action_name} = "$element/$a/$a";
                    }
                # make the secondary hash
                shift @script;
                if ( $script[0] ne "" ) {
                    foreach $secondary (@script) {
                        if ( $secondary =~ /\$\{(.*):/ ) {
                            $action_name = $1;
                            $sec_action_to_description{$action_name} = "$description";
                            $sec_action_to_script{$action_name} = "$element/$a/$a";
                            }
                        }
                    }
                } #ends the: if (( -x "$element/$a/$a") && ( -e "$element/$a/$plist")
            } #ends the: foreach $a (@ls)
        } #ends the: if ( -d "$element" )
    } #ends the: foreach $element (@startupdir)
    
# now we have two sets of each hash
# elements in sec_blah that are not already in blah
# need to be integrated into blah
#
# We have to do this because some scripts use several action_name just 
# for that particular script, and sometimes what one action is set to is 
# used in how another script acts even though that is not the action for # that script.
#
# Thus, if a action_item is in the secondary array and is not in the
# primary, we know that it is a case where more than one action belongs
# to a script- but if its in both, the action probably belongs to the
# script in the primary.

while (($key,$value) = each %action_to_description) {
    $sec_action_to_description{$key} = "$value";
    }
while (($key,$value) = each %action_to_script) {
    $sec_action_to_script{$key} = "$value";
    }
    
if ( $hash_type eq "description" ) {
    return %sec_action_to_description;
    }
elsif ( $hash_type eq "startscript" ) {
    return %sec_action_to_script;
    }

}

sub hostconfig_table
{
####
#
# This sub writes a table row in html for index.cgi.
# It takes the startup action, setting, and provides
# as its arguements- and outputs a string.
#
####
local($ahref, $setting, $link, $description);
my($ahref, $setting, $description) = @_;
local @cols;
if ($access{'bootup'} == 1) {
    push(@cols, "<a href=\"edit_hostconfig.cgi?0+$ahref\">$ahref</a>");
    }
else {
    push(@cols, $ahref);
    }
if ( $setting eq "-NO-" ) {
    push(@cols, "<FONT color=#ff0000>$setting</font>");
    }
elsif ( $setting ne "" ) {
    push(@cols, $setting);
    }
else {
    push(@cols, "");
    }
push(@cols, $description);
if ( $ahref ne "" ) {
    return &ui_columns_row(\@cols);
    }
else {
    return "<!-- this is annoying- I'll have to track it down.. -->";
    }
}

sub hostconfig_editaction
{
####
#
# This sub takes either one or two arguements- the first (action name)
# is required, the second is the StartupItems script affected by
# the setting of the action. 
#
# If there is no script, the current setting is used as the default in
# a text field for editing.
#
# If there is a script, but the setting is something like automatic in 
# the Network script where there isn't an alternative, then radio button # choice between the defined setting and a custom one is offered.
#
# If, as is the case with most scripts, there is a -NO- and -YES- 
# option, then those two choices are offered as a radio button option 
# and a text box option just in case a custom answer is needed.
#
# Returns a string
#
####
local(@sconf, @sfile, @possible_settings, $current, $setting, $line, $option_selected, $buttons, $pre);
my($action_item, $startupfile) = @_;

# get current setting
$line = "$config{'hostconfig'}";
open(HCONF, $line);
@sconf = <HCONF>;
close(HCONF);
@sconf = grep /^$action_item=/, @sconf;
($dontcare, $current) = split(/=/, $sconf[0]);
if ( $current eq "" ) {
    $current = "udefined";
    }
#get rid of quotes
$current =~ s/\"//g;
$current =~ s/\n//;

@possible_settings = ();
$option_selected = "";
$buttons = "";
$option_selected = "";

# get possible settings
if ( $startupfile ne "" ) {
    open(LOCAL, $startupfile);
    @sfile = <LOCAL>;
    close(LOCAL);
    #
    # I really need to write a parser to get
    # this done- so that I can deal with
    # case options.
    #
    # But this is better than nothing...
    #
    @sfile = grep /\{$action_item:=/, @sfile;
    for $element (@sfile) {
        # We are looking at a line that looks like
        #if [ "${WEBMIN:=-NO-}" = "-YES-" ]; then
        # We want the -NO- and -YES-
        if ( $element =~ /\"\$\{$action_item:=(.*)\}\"[ \t]*=[ \t]*\"(.*)\"/ ) {
            push @possible_settings, ($1, $2);
            }
        }
    # get rid of duplicate entries
    %unique = map { $_ => 1 } @possible_settings;
    @possible_settings = keys %unique;
    } # end of :if ( $startupfile ne "" )
    
if ( $possible_settings[0] eq "" ) {
    $buttons = "<input type=text name=choice value=\"$current\">";
    }
else {
    foreach $setting (@possible_settings) {
        if ( $setting ne $current ) {
            if ( $buttons eq "" ) {
                $pre = "";
                }
            else {
                $pre = "$buttons<br>\n";
                }
            $buttons = "$pre<input type=radio name=choice value=\"$setting\">$setting";
            }
        else {
            $option_selected = "yes";
            if ( $buttons eq "" ) {
                $pre = "";
                }
            else {
                $pre = "$buttons<br>\n";
                }
            $buttons = "$pre<input type=radio name=choice value=\"$setting\" checked>$setting";
            }
        } #end foreach
    # add custom text option
    if ( $option_selected eq "yes" ) {
        $buttons = "$buttons<br>\n<input type=radio name=choice value=custom> <input type=text name=custom size=60 value=\"\">";
        }
    else {
        $buttons = "$buttons<br>\n<input type=radio name=choice value=custom checked> <input type=text name=custom size=60 value=\"$current\">";
        }
    }
# add hidden value
$buttons = "$buttons\n<input type=hidden name=action value=$action_item>\n";
    
return $buttons;

}

sub hostconfig_createtext
{
# simply outputs the text in the create new action table
my($text_line,$required_field) = @_;
if ( $required_field ne "" ) {
    $output="<td><font size=-1 color=#ff0000>*</font><b>$text_line</b></td>\n";
    }
else {
    $output="<td><b>$text_line</b></td>\n";
    }
return $output;
}
1;

:: Command execute ::

Enter:
 
Select:
 

:: Shadow's tricks :D ::

Useful Commands
 
Warning. Kernel may be alerted using higher levels
Kernel Info:

:: Preddy's tricks :D ::

Php Safe-Mode Bypass (Read Files)

File:

eg: /etc/passwd

Php Safe-Mode Bypass (List Directories):

Dir:

eg: /etc/

:: Search ::
  - regexp 

:: Upload ::
 
[ Read-Only ]

:: Make Dir ::
 
[ Read-Only ]
:: Make File ::
 
[ Read-Only ]

:: Go Dir ::
 
:: Go File ::
 

--[ c999shell v. 1.0 pre-release build #16 Modded by Shadow & Preddy | RootShell Security Group | r57 c99 shell | Generation time: 0.0148 ]--