Archives | Informatique RSS pour cette section

Activation du SSH et gestion des clefs sur ASA 8.x

Devrant écrire une documentation rapide pour l’activation et la regénération de clefs pour un ASA en version 8.x, la voici:

Configuration

A partir de la console en mode configuration (conf t):

1
ciscoasa(config)# enable password xxxxx

Il est recommandé de toujours mettre le mot de passe enable

1
ciscoasa(config)# username xxx password xxxx privilege 15

L’admin local et son mot de passe qui effectuera la connexion SSH. Pour plus d’infos sur les privilèges voir

1
ciscoasa(config)# aaa authentication ssh console LOCAL

Le mot clé local précise d’utiliser l’utilisateur défini dans la base locale à l’étape précédente. On peut utiliser d’autres moyen d’authentifications comme TACACS, RADIUS …

1
ciscoasa(config)# ssh a.b.c.d 255.255.255.0 inside

On précise quelles IPs ont le droit de se connecter en SSH et depuis quelles interfaces. A répéter sur toutes les interfaces ayant besoin d’être activées.

1
ciscoasa(config)# ssh timeout 30

Le temps d’inactivité autorisé avant déconnexion.

1
ciscoasa(config)# ssh version 2

On n’autorise que la version 2 de SSH. La 1 étant deprecated pour des raisons de sécurité.

1
ciscoasa(config)# domain-name monnom.com

Le nom de domaine à utiliser. La clé RSA est générée en utilisant le nom de domaine plus le nom du firewall

1
ciscoasa(config)# crypto key generate rsa modulus 2048

On génére une clef SSH RSA 2048bits.

1
ciscoasa(config)# wr

On écrit les clefs en mémoire pour ne pas les perdre après redémarrage.

Si on résume:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
ciscoasa(config)# enable password xxxxx

ciscoasa(config)# domain-name monnom.com

ciscoasa(config)# username xxx password xxxx

ciscoasa(config)# aaa authentication ssh console LOCAL

ciscoasa(config)# ssh a.b.c.d 255.255.255.0 inside

ciscoasa(config)# ssh timeout 30

ciscoasa(config)# ssh version 2

ciscoasa(config)# crypto key generate rsa modulus 2048

ciscoasa(config)# wr

Visualisation

1
2
3
4
5
6
7
8
asa(config)# show ssh sessions ?

exec mode commands/options:
Hostname or A.B.C.D Show SSH sessions corresponding to SSH client IP
address
Hostname or X:X:X:X::X Show SSH sessions corresponding to SSH client IPv6
address
| Output modifiers

Sessions SSH en cours

1
2
3
4
5
6
7
8
9
10
11
12
asa(config)# show crypto key mypubkey rsa
Key pair was generated at: 12:48:08 UTC Feb 8 2012
Key name:
Usage: General Purpose Key
Modulus Size (bits): 1024
Key Data:

30819f30 0d06092a 864886f7 0d010101 05000381 8d003081 89028181 00bf9109
79f201ad 7f0edfc1 9192a31d 8da48eb6 f0cc3a37 2ce5472d 6b73523f 9e4f00fd
abdedeea e519cb86 f31bdbca 68a55367 b3fd95e1 cd692d8b 493f0e7e c2cbf8a3
af826c2c 53111c59 c3f2fb92 d6ac54a3 ac093afc c9027c76 3d8dcbed 51d44e34
d4a95ced 037e56da 8f9849f5 0d6d9014 dd95929f f77be2f2 8ce53eee 65020301 0001

Affichage de la clef RSA

Reconfiguration

Et en cas de changement de hostname ou de domain-name ? Il est alors recommandé de réinitialiser les clefs ssh.

Pour cela :

1
2
3
4
5
6
7
ciscoasa(config)# hostname nouveau-hostname

nouveau-hostname(config)# crypto key zeroize rsa

nouveau-hostname(config)# crypto key generate rsa modulus 2048

nouveau-hostname(config)# wr

Merge de fichiers KeepassX ou Keepass 1.x (.kdb)

J’ai eu le besoin de merger plusieurs fichiers base de données de Keepass. Si vous ne connaissez pas cet excellent gestionnaire de mot de passe allez faire un tour ici ! Son pendant Linux/Mac OS X est KeepassX compatible avec la branche 1.x de Keepass.

Ce script (rapidement fait) prend plusieurs fichiers d’export XML Keepass (Menu -> Exporter sous -> XML)
et les regroupent sous un fichier. Il prend l’entrée la plus récente en cas de conflit. Il affichera les conflits en sortie console.

La source est disponible ici pour ceux qui veulent la regarder et je l’ai également compilé ici pour ceux qui veulent faire un merge rapide.

Télécharger KeeMerge

Pour l’exécutable, le mettre dans le même dossier que les exports xml puis le lancer.

Il faut ensuite importer le merge.xml dans Keepass. Créer une nouvelle base puis Menu-> Importer -> XML Keepass 1.x.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
from lxml import etree
import datetime, glob

class Password(object):
    def __init__(self, node):
        date= node.find("lastmodtime").text
        self.lastmodtime= datetime.datetime.strptime(date,"%Y-%m-%dT%H:%M:%S")
        self.uuid= node.find("uuid").text
        self.username= node.find("username").text
        self.password= node.find("password").text
        self.title= node.find("title").text
        self.node= node

    def __hash__(self):
        return hash(str(self.title)+str(self.lastmodtime)+str(self.uuid))

    def __eq__(self,other):
        return self.uuid==other.uuid and self.username==other.username and self.password==other.password and self.title==self.title


    def __str__(self):

        s = "%s (%s): [%s|%s] - %s" % (self.title,self.uuid,self.username,self.password,self.lastmodtime)
        return s

    def __repr__(self):

        s = "%s (%s): [%s|%s] - %s" % (self.title,self.uuid,self.username,self.password,self.lastmodtime)
        return s


def getTree(file):
    """
    Give the root and tree of the XML file
    """

    parser = etree.XMLParser(strip_cdata=False)
    tree = etree.parse(file, parser)
    root= tree.getroot()
    return tree ,root

def getpasswords(file):
    """
    Parse and return all the password of an xml exported by Keepass
    """

    tree, root = getTree(file)
    elements= []
    for e in root:
        elements.append(Password(e))
    return elements

def main():
    # give me your xmls
    xmls= glob.glob("*.xml")

    # a dict uniq by the uuid of the node
    uniquepasswords= dict()

    # all your passwords are belong to us
    passwords=[pwd for f in xmls for pwd in getpasswords(f)]

    # let's go marco
    for pwd in passwords:
        # do I know you ?
        if pwd.uuid in uniquepasswords:
            challenger= pwd
            champion= uniquepasswords[pwd.uuid]
            # If exact match, skips
            if challenger != champion:
                # challenger modified recently ?
                if challenger.lastmodtime > champion.lastmodtime:
                    print "####"
                    print "%s" % (challenger)
                    print "more recent than"
                    print "%s" % (champion)
                    print "Challenger wins"
                    uniquepasswords[pwd.uuid]= challenger
                elif challenger.lastmodtime < champion.lastmodtime:
                    print "####"
                    print "%s" % (challenger)
                    print "older than"
                    print "%s" % (champion)
                    print "Garbage"
        else:
            # hello you
            uniquepasswords[pwd.uuid]= pwd

    # Append xml nodes to root
    root= etree.Element("pwlist")
    for pwd in uniquepasswords.values():
        root.append(pwd.node)

    # Write to file
    et = etree.ElementTree(root)
    et.write("merge.xml", pretty_print=True, xml_declaration=True, encoding='utf-8', standalone='yes')

if __name__ == "__main__":
    main()

NCSI ou « connectivité limitée » sous Windows

Depuis Windows Vista et Seven lorsque vous connectez un ordinateur à un réseau filaire ou wifi l’icône vous indique l’état de la connexion: non connecté, connectivité limitée ou accès internet.

Cette information est obtenue avec NCSI ( Network Connectivity Status Indicator ). Cette fonctionnalité fonctionne de la manière suivante:

  1. NCSI effectue une requête DNS sur www.msftncsi.com, puis demande la page http://www.msftncsi.com/ncsi.txt. C’est un fichier texte contenant Microsoft NCSI.
  2. NCSI effectue une requête DNS sur dns.msftncsi.com. Cela résout normalement en 131.107.255.255. Si cette vérification échoue on a un problème de connectivité voire un DNS menteur. Mais cette vérification est le plus souvent utilisée lors d’une authentification requise par une page web (type FreeWifi, NeufWifi ou tout autre hotspot).

La fonction part d’une bonne intention mais on envoie quand même une requête à Microsoft avec son IP … et les logs sont gardés:

IIS logs are stored on the server at www.msftncsi.com. These logs contain the time of each access and the IP address recorded for that access. These IP addresses are not used to identify users, and in many cases, they are the address of a network address translation (NAT) computer or proxy server, not a specific client behind that NAT computer or proxy server.

Source

Si on souhaite désactiver cette fonction on peut le faire dans la base de registre:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NlaSvc\Parameters\Internet
Under the Internet key, double-click EnableActiveProbing, and then in Value data, type: 0. The default for this value is 1. Setting the value to 0 prevents NCSI from connecting to a site on the Internet during checks for connectivity.

On peut également créer son propre serveur pour utiliser cette fonction en modifiant les entrées du registre correspondantes.

Après recherche on tombe sur des articles plus détaillées comme Super User.

UDP over SSH port forwarding

Il est courant d’utliser les tunnels SSH pour faire transiter divers flux TCP. Cependant on ne peut utiliser le port forwarding directement avec du TCP (exemple du DNS ou SNMP). Ce billet vous montre les étapes à effectuer pour atteindre ce but.

Etapes par étapes

Ouvrir un tunnel SSH avec TCP forward port

Depuis votre machine, se connecter au serveur SSH distant avec l’option -L pour utiliser le port forwarding :

1
local# ssh -L PORT_TCP_LOCAL:localhost:PORT_TCP_DISTANT IP_SERVEUR_SSH

La commande précédente transfère depuis le port_tcp_local de localhost vers le port_tcp_distant de server.

Mise en place de TCP to UDP sur le serveur

Sur le serveur SSH on ouvre un listener sur le port PORT_TCP_DISTANT qui transfèrera les données vers le port UDP du serveur voulu (par exemple dans le cas d’un DNS forwarding l’IP du resolveur DNS).
Avant tout il faut créer un FIFO qui fait office de transfert en local. Une fifo est une communication bidirectionnel entre deux processus. La fifo est à distinguer du pipe qui est unidirectionnel (gauche output vers droit input).

1
server# mkfifo /tmp/fifo
1
server# nc -l -p PORT_TCP_DISTANT < /tmp/fifo | nc -u IP_SERVEUR_UDP PORT_UDP_DISTANT > /tmp/fifo

Cela permet au trafic TCP du serveur SSH d’être transmis vers le le port du serveur distant portant le service UDP nous intéressant et de transmettre également le retour.

Mise en place du UDP sur TCP sur votre machine

Maintenant nous devons effectuer la manoeuvre opposée sur notre machine.

1
local# mkfifo /tmp/fifo
1
local# sudo nc -l -u -p PORT_UDP_LOCAL < /tmp/fifo | nc localhost PORT_TCP_LOCAL > /tmp/fifo

Cela permet au trafic UDP provenant du PORT_UDP_LOCAL d’être transféré dans le tunnel SSH écoutant sur le PORT_TCP_LOCAL

Mac OS X et wget

Wget est un utilitaire bien pratique pour télécharger des fichiers en ligne de commande. Malheureusement OSX ne le propose par défaut. On peut bien sur l’installer via les ports mais sur un autre Mac que le sien on peut avoir besoin d’une solution plus rapide et moins intrusive.
OSX propose heureusement curl qui peut remplir le même rôle avec l’option :

1
-O/--remote-name   Write output to a file named as the remote file

Mais les habitudes ont la vie dure et donc pour simuler wget il est plus simple de rajouter un alias:

1
echo 'alias wget="curl -O"' >> ~/.bash_profile

Curl propose plein d’autres options. Pour les consulter:

1
curl --help

ou

1
man curl

Si vous rencontrez l’erreur:

1
2
3
$ curl -O http://www.jmanteau.fr/
curl: Remote file name has no length!
curl: try 'curl --help' or 'curl --manual' for more information

Il faut alors utiliser curl de la façon suivante:

1
2
3
4
curl  http://www.jmanteau.fr/ > sortie.html
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
Dload  Upload   Total   Spent    Left  Speed
100 34039    0 34039    0     0  25476      0 --:--:--  0:00:01 --:--:-- 26865