Créer des mots de passe Administrateurs unique par poste

From Deimos.fr / Bloc Notes Informatique
Jump to: navigation, search

1 Introduction

Dans ma boite, j'ai des personnes mal intentionnées qui avaient les droits admin de leur machine. Le problème c'est qu'avec ça ils peuvent en faire des conneries...

Pour palier à ce problème, on les a mis en utilisateurs. Et pour ne pas que si quelqu'un trouve le mot de passe admin, qu'il puisse se connecter sur n'importe quel ordinateur pour prendre des informations, il faut un mot de passe unique par ordinateur.

J'ai donc développé un outil en Perl permettant de récupérer le numéro de série de la machine, de concaténer celui ci avec un mot de passe ou phrase unique (qui ne doit jamais changer), créer un hash de cette concaténation, puis récupérer les x premiers caractères qui correspondront au mot de passe admin de la machine.

Ceci a pour avantage d'avoir un mot de passe unique par machine et de pouvoir récupérer ce mot de passe juste en exécutant cet exe sur la machine. Par expérience, je sais que ce .exe arrivera un jour ou l'autre a se balader sur le réseau c'est pourquoi j'y ai ajouté 2 petites sécurités :

  • Un mot de passe principale pour afficher le mot de passe admin
  • Une suppression automatique de ce .exe après exécution.

J'ai donc écrit ceci en Perl puis ai compilé un exécutable. Vous aurez donc besoin de cette documentation pour générer l'exe.

2 Code

Voici le code source permettant générer le mot de passe :

Configuration File adminpassgen.pl
# Admin_password_generator v0.2
# Made by Pierre Mavro
 
use strict;
use Cwd 'abs_path';
use Digest::MD5 qw(md5_hex);
use Term::ReadKey;
 
my $main_password='primary_password';
# Do not change this one if you don't know what you are doing
my $additional_pass='The_Passphrase_or_password_to_concatenate';
 
# Get machine serial number
sub get_serial
{
	my $serialnum;
	my @serial = `wmic bios get serialnumber`;
 
	foreach (@serial)
	{
		chomp $_;
		unless (/^SerialNumber/)
		{
			$serialnum="$_";
			last;
		}
	}
	return $serialnum;
}
 
# Generate password
sub gen_passwd
{
	my $serialnum=shift;
 
	# Set final password
	my $clear_password = $serialnum . $additional_pass;
 
	# Calculate MD5
	my $md5 = Digest::MD5->new;
	$md5->add("$clear_password");
	my $digest = $md5->hexdigest;
	# Get 12 first chars
	$digest = substr($digest, 0, 12);
 
	return $digest;
}
 
# Delete exe
sub delete_exe
{
	my $del_exe = "$ENV{'SystemRoot'}\\Temp\\delexe.vbs";
	my $del_bat = "$ENV{'SystemRoot'}\\Temp\\delall.bat";
 
	# Can't use unlink because of Windows error on an open file
	# Create temporary vbs and bat to delete main exe
	open (DELVBS, ">$del_exe");
	print DELVBS "WScript.Sleep(2000)\n";
	print DELVBS "Set WshShell = CreateObject(\"WScript.Shell\")\n";
	print DELVBS "WshShell.Run chr(34) & \"$del_bat\" & Chr(34), 0\n";
	print DELVBS "Set WshShell = Nothing\n";
	close(DELVBS);
 
	open (DELBAT, ">$del_bat");
	print DELBAT "del $del_exe\n";
	print DELBAT "del \"$0\"\n";
	print DELBAT "del $del_bat\n";
	close(DELBAT);
 
	# Launch to delete exe
	system(1, "$del_exe");
}
 
# Verify if this user can connect
sub ask_passwd
{
	my $main_passwd=shift;
	my $ans='';
	my $counter=0;
 
	while ($ans ne $main_passwd)
	{
		if ($counter >= 3)
		{
			delete_exe;
			die "Sorry but you don't have the good password.\n";
		}
		print "Please enter password :\n";
		ReadMode 2;
		chomp($ans = <STDIN>);
		ReadMode 0;
		$counter++;
	}
	ReadMode 0;
}
 
ask_passwd($main_password);
my $serialnum = get_serial;
my $password = gen_passwd($serialnum);
 
print "\nAdmin password is $password\n";
 
print "\nHit enter to continue\n"; 
<STDIN>;
delete_exe;

Vous aurez besoin également des modules indiqué au début du scirpt, la plus part étant déjà intégrés de base dans Perl, la mission sera facile :-)