La méthode que j’avais utilisé était de faire un script Perl modifiant directement /etc/passwd ou /etc/shadow (pour ma défense, c’était en 2000). Pas terrible d’un point de vue sécurité je pense. Je te livre une version brute de décoffrage. Le script doit être suid_root.
[code]#!/usr/bin/perl
use Time::Local;
use File::Copy;
print “Content-type: text/html\n\n”;
read(STDIN, $buffer, $ENV{‘CONTENT_LENGTH’});
@pairs = split(/&/, $buffer);
foreach $pair (@pairs)
{
($name, $value) = split(/=/, $pair);
# Un-Webify plus signs and %-encoding
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack(“C”, hex($1))/eg;
$FORM{$name} = $value;
}
$RACINE="/etc/";
suivant où sont les mots de passe
#$PASS = “shadow”;
#$PASS_TMP = “shadow1”;
$PASS=“passwd”;
$PASS_TMP = “passwd1”;
$user = $FORM{‘user’};
Mettre un aléa sur “LL”
$new_pwd = crypt($FORM{‘new_pwd’}, “LL”);
$old_pwd = $FORM{‘old_pwd’};
print “”;
print “”;
print "Conclusion ";
print “”;
print “”;
print “”;
print “
”;
print “Utilisateur = $user
\n”;
#print “Ancien mot = $old_pwd
\n”;
#print “Nouveau mot = $FORM{‘new_pwd’}
\n”;
print “
”;
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”);
2) on y va
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() {
if (m/^$user:/) {
$ligne = $_;
($qui , $mot ,$fin) = ($ligne =~ /([^:]+):([^:]+):(.*)/);
print “
”,$qui;
cas d’un changement de mot de passe
$heure = localtime();
if (($mot ne "!") && ($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 "!")|| ($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 “
Si il y a eu changement de mot de passe, cela est ecrit ci-dessus sinon refaire la manoeuvre
”;
close(FIN);
close(DEB);
affichage environnement
open(LOG,">>/var/log/motdepasse.log");
print LOG $logger;
close(LOG);
#print “
”;
#while (($key,$val) = each %ENV) {
print “
$key =$val
\n”;}
print “
”;
unlink ($RACINE.$PASS.".old");
copy ($RACINE.$PASS , $RACINE.$PASS.".old");
rename $RACINE.$PASS_TMP , $RACINE.$PASS;
chown 0,0,$RACINE.$PASS;
#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 “
$key =$val
\n”;}
#print “
”;
chdir “/var/yp”;
system (“make > /dev/null”);
OK, c’est bon
unlink “/tmp/__script_pwd”;
$ENV{“PATH”} = $ex_path;
print “”;
print “”;
print “”;
[/code]