#!/usr/bin/suidperl -U # ####### alter_pwd.cgi ####### # ------------------------------ # Desenvolvido por Cau Guanabara # em 24 de setembro de 2003. # copyleft � 2003 Cau Guanabara # Licen�a: GNU-GPL # Contato: caugb@netflash.com.br # ------------------------------ # # Script para modificar valores no arquivo passwd do linux. # --------------------------------------------------------- # Pode-se mudar o ID do usu�rio ou do grupo, # o nome, a pasta home e o shell do usu�rio. # # >> Este script aceita par�metros via GET ou POST. # ------------------------------------------------- # Mande por GET os par�metros 'user', 'param' e 'value', assim: # .../alter_pwd.cgi?user=username¶m=shell&value=/sbin/nologin # ou chame o script sem enviar par�metros e use o # formul�rio (via POST) que ele mostrar�. # # Para usar: # ---------- # Como este script grava em um arquivo administrativo do linux, # precisamos rod�-lo com permiss�es de root. # Para isso salve o arquivo na sua pasta cgi-bin e execute: # chmod 755 alter_pwd.cgi # chown root.root alter_pwd.cgi # chmod a+s alter_pwd.cgi # ####### ###### ###### ####### use CGI qw(param()); use strict; print "Content-type: text/html\n\n"; print qq! <html><head> <title>Alterar parâmetros do usuário</title> </head><body> !; my $in = ""; my $file = "/etc/passwd"; if(param("user") && param("param") && param("value")) { &troca(param("user"),param("param"),param("value")); } else { &form(); } sub form { print qq! <b>Alterar parâmetros do usuário no passwd</b><br><br> <form action="http://$ENV{'HTTP_HOST'}$ENV{'SCRIPT_NAME'}" method="post" name="altera"> Login:<input name="user" type="text" id="user"><br> parâmetro<select name="param" id="param"> <option value="uid">uid</option><option value="gid">gid</option> <option value="name">nome</option><option value="home">home</option> <option value="shell">shell</option></select><br> Novo valor:<input name="value" type="text" id="value"><br> <input type="submit" value="Alterar"></form> !; exit; } sub troca { my $usuario = $_[0]; my $par = $_[1]; my $val = $_[2]; print "Modificando par�metro para o usu�rio '$usuario'<br>\n"; my $saida = `grep ^$usuario: $file`; if ($saida !~ /[A-Z]/i) { print "O usu�rio '$usuario' n�o existe no sistema!<br>\n"; print "</body></html>"; exit; } if($par ne "uid" && $par ne "gid" && $par ne "name" && $par ne "home" && $par ne "shell") { print "O par�metro '$par' n�o foi reconhecido...<br>\n"; print "</body></html>"; exit; } open(R,$file); while (<R>) { if ($_ =~ /^$usuario:/) { my @parts = split(/:/,$_); if($par eq 'uid') { $parts[2] = $val; } if($par eq 'gid') { $parts[3] = $val; } if($par eq 'name') { $parts[4] = $val; } if($par eq 'home') { $parts[5] = $val; } if($par eq 'shell') { $parts[6] = $val; } $in .= join(":",@parts); } else { $in .= $_; } } close(R); open(W,"> $file"); print W $in; close(W); my $test = `grep ^$usuario: $file`; if ($test !~ /^$usuario:.*$val.*$/) { print "O par�metro '$par' n�o foi modificado, houve um erro...<br>\n"; } else { print "O par�metro '$par' foi modificado para '$val' com sucesso.<br>\n"; } print "<hr align=left noshade width=400>"; &form(); } print "</body></html>"; exit;