[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Phénomène curieux, /etc/passwd réduit à 0



Le Thu, 20 Jan 2005 19:40:16 +0100
JusTiCe8 <justice8@wanadoo.fr> a écrit:

> Bonsoir,
> 
> François Boisson a écrit :
> 
> >Bonjour,
> >
> >
> >[...]
> >unlink ($RACINE.$PASS.".old");
> >rename $RACINE.$PASS , $RACINE.$PASS.".old";
> >rename $RACINE.$PASS_TMP , $RACINE.$PASS;
> >chown 0,0,$RACINE.$PASS;
> ># chmod 0600,$RACINE.$PASS;
> >chmod 0644,$RACINE.$PASS;
> >
> >où $RACINE = "/etc", $PASS="passwd" et $PASS_TMP="passwd1".
> >[...]
> >  
> >
> une idée comme ça :
> 
> si (justement) passwdl est vide (pour une raison lambda), le rename va
> agir comme ilf aut et donc, /etc/passwd sera... vide lui aussi. Ce qui
> expliquerai la "disparition" de passwd1.

Dans ce cas, le script aurait été utilisé et je l'aurais retrouvé dans
les logs d'apache, je rerecherche...

Bingo...!

172.207.33.240 - - [19/Jan/2005:17:50:49 +0100] "GET
/cgi-bin/script_pwd.cgi?user=default&old_pwd=default&new_pwd=http://www
.google.fr/search%3f<balisexss>%22%27&new_pwd_ver=default HTTP/1.1" 200
242

ça concorde, par contre je viens de reproduire tel que les différents
appels(il y en a eu 5) au script perl et n'ai eu aucune erreur. Donc
effectivement, l'erreur vient de là mais je ne vois pas comment elle a
pu arriver. (Le script est en fin de message pour les perlophiles)

> 
> Pour la pauvre machine ( ;) ) sauvagement éteinte, l'usage des magic 
> syskey aurait été plus appréciée par celle ci (si activées dans la
> conf noyau). Ou une extinction à distance.
> 

Pour l'extinction à distance, sans passwd, pas de connexion possible,
sinon j'aurai directement réglé le pbm. Quant aux magic syskey, je n'y
pense jamais au moment de la configuration du noyau mais c'est une bonne
idée.


François Boisson

---- script Perl pour les amateurs -----
use Time::Local;

print "Content-type: text/html\n\n";

# Get the input
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});

@pairs = split(/&/, $buffer);

foreach $pair (@pairs)
{
    ($name, $value) = split(/=/, $pair);
    $value =~ tr/+/ /;
    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

    $FORM{$name} = $value;
}
$RACINE="/etc/";
# $PASS = "shadow";
# $PASS_TMP = "shadow1";
$PASS="passwd";
$PASS_TMP = "passwd1";
$user = $FORM{'user'};
$new_pwd = crypt($FORM{'new_pwd'}, "FB");
$old_pwd = $FORM{'old_pwd'};

print "<HTML>";
print "<HEAD>";
print "<TITLE>Conclusion </TITLE>";
print "</HEAD>";
print "<BODY>";
print "<FONT SIZE=4>";
print "<HR>";

print "<LI>Utilisateur = $user<BR></LI>\n";
print "<HR>";
# attend une éventuelle fin
while (-e "/tmp/__script_pwd") {
}
#Path securité
$ex_path = $ENV{"PATH"};
$ENV{"PATH"} = "/bin:/usr/bin";

#let'sgo 1) drapeau
system("touch /tmp/__script_pwd");

open(FIN,">".$RACINE.$PASS_TMP) || die("M'enfin ! Y a un bug !");
open(DEB,$RACINE.$PASS);
$heure = localtime();
$logger = "Appel script_passwd a $heure\n";
open(LOG,">>/var/log/motdepasse.log");
print LOG $logger;
close(LOG);
$logger = "Appel sans succes\n";
while(<DEB>) {
    if (m/^$user:/) {
        $ligne = $_;
        ($qui , $mot ,$fin) = ($ligne =~ /([^:]+):([^:]+):(.*)/);
# print "<LI>",$qui;
# cas d'un changement de mot de passe
        $heure = localtime();
        if ($mot ne "!") {
        $cle = substr ($mot,0,2);
        print "<LI>",crypt($old_pwd,$cle),"<BR></LI>\n";
        $logger = "Changement pour $qui a $heure\n";
    }
# sinon utilisateur sans mot de passe
        else { print "<LI>Creation d'un mot de passe (circonstances
enregistrees)<BR></LI>\n"; 
          print "<LI> origine: machine $ENV{'REMOTE_ADDR'} heure
$heure<BR></LI>\n";
       $logger = "Creation pour $qui par$ENV{'REMOTE_ADDR'} a $heure\n";
              }
        if ((($mot eq crypt($old_pwd,$cle)) || ($mot eq"!")) && 
           ($FORM{'new_pwd'} eq $FORM{'new_pwd_ver'})) {       
    print "<LI>Changement de mot de passe de",$user,"<BR></LI>\n";      
     $logger = "OK: ".$logger;
            print FIN $qui,":",$new_pwd,":",$fin,"\n";
        }
        else { print FIN $ligne;}
    }
    else { print FIN };
}
print "<LI>Si il y a eu changement de mot de passe, cela est ecrit
ci-dessus sinon refaire la manoeuvre<BR></LI>";
 close(FIN);
close(DEB);
# affichage environnement
open(LOG,">>/var/log/motdepasse.log");
print LOG $logger;
close(LOG);
#print "<HR>";
#while (($key,$val) = each %ENV) {
#    print "<LI>$key =$val<BR></LI>\n";}

print "<HR>";
unlink ($RACINE.$PASS.".old");
rename $RACINE.$PASS , $RACINE.$PASS.".old";
rename $RACINE.$PASS_TMP , $RACINE.$PASS;
chown 0,0,$RACINE.$PASS;
# chmod 0600,$RACINE.$PASS;
chmod 0644,$RACINE.$PASS;
#$ex_path = $ENV{"PATH"};
#$ENV{"PATH"} = "/bin:/usr/bin";
#while (($key,$val) = each %ENV) {
#    print "<LI>$key =$val<BR></LI>\n";}

#print "<HR>";

chdir "/var/yp";
system ("make > /dev/null");
# OK, c'est bon
unlink "/tmp/__script_pwd";
$ENV{"PATH"} = $ex_path;
print "</FONT>";
print "</BODY>";
print "</HTML>";



Reply to: