Modification de ASAOS pour faire fonctionner ASDM en émulation

Un petit tuto pour patcher asaos afin de faire fonctionner ASDM en émulation. Les manipulation seront à faire sous linux.

Testé avec la version 8.0.2

Pour ceux qui ne sont pas bidouilleurs, j’ai mis une version patchée de la VM citée dans un précédent post, c’est par ici:

http://dl.free.fr/qQK1wuZDn

Extraction de l’OS

Ouvrir le fichier bin avec un editeur hexadecimal, ou generer un dump avec la comande:

#hexdump -C asa802.bin > asa802.hd

Chercher ensuite la chaine « 1f 8b 08 00 1d » dans ce dump avec la commande:

#grep "1f 8b 08 00 1d" asa802.hd

On obtiens quelque chose comme ça:

001228b0: 1f 8b 08 00 1d 3d 73 46 - 00 03 ec 3a 6d 54 14 57

Cela veut dire que l’occurence est trouvé à l’octet 001228B0 du fichier. Cette séquence de caractère délimite le fichier avec une en tête qu’il faut enlever. Pour cela, nous allons juste prendre la taille du fichier en octet, auquel on va soustraire cette valeur, précédemment convertie en décimale (hexdump nous donne des adresses… Hexadécimales.).

On peut utiliser PERL pour le faire simplement. On copiera ensuite le fichier sans cette entête, en utilisant la commande tail.

# ls -la asa802-k8.bin
-rw-r--r--  1 ftp  wheel  14524416  9 Aug 09:25 asa802-k8.bin
# perl -e '$x=14524416-0x1228b0;print "$x\n"'
13334352
# tail -c 13334352 asa802.bin > asa802.gz

Ensuite on dézippes extrait l’archive avec CPIO. Je vais créer un dossier uncompressed et copier les fichiers dedans:

#gzip -d asa802.gz
#mkdir uncompressed
#cd uncompressed
#sudo cpio -id --no-absolute-filenames < ../asa802

A partir d’ici vous avez un système de fichier linux complet, qui correspond a ASAOS (oui ça se base sur linux). Vous pouvez modifier le script rcS qui correspond au script de lancement, mais ici nous allons nous intéressé à l’executable lina qui se trouve dans asa/bin.

Cet exécutable est en gros le shell de asaos, c’est lui qui parse les commandes. Lorsque l’on lance ASDM, il va effectuer un show version afin de vérifier si ASDM est compatible avec le modèle de l’ASA. Etant donné que l’on émule l’ASA, le show version ne retourne rien. On va donc modifier lina afin de faire afficher le modèle que l’on souhaite. J’ai utilisé GHex, mais n’importe quel autre outil fait l’affaire.

Voici donc les étapes à suivre:

1) Edition lina

hexedit Lina et chercher la seconde occurence de « Hardware: » On trouve ceci:

 Hardware:   %s, %d MB RAM,

2) Trouver une chaine à modifier

Trouver une chaine de caractère dans l’éxécutable plus longue et qui n’est pas utile, on la remplacera par notre chaine à nous.
strings -n 30 lina
3)Je vais utiliser la chaine « pager_main() – Unable to create the pager initialization thread », donc dans GHex, je cherche « pager_main », afin de la localiser

4) Remplacer la chaine

Je remplace cette chaine avec la chaine suivante, en effacant ce qui reste avec des 00 (partie hexadécimale)

 "Hardware:   ASA5520, 128 MB RAM, CPU Pentium II 2000 MHz"

Avant:

pager_main() - Unable to create the pager initialization.....thread

Après:

Hardware:   ASA5520, 128 MB RAM, CPU Pentium II 2000 MHz..................thread

(Fill the old string with 00 hex, to not change exe structure, and don’t forget the ,).

Après un test, je me suis aperçu qu’il y avait un C en trop lors du show ver:

Hardware:   ASA5520, 128 RAM,  CPU Pentium II 2000 MHzc

Cela est du à la fonction qui est censée récupéré le nom du processeur.
Si on retourne à la chaine Hardware: initiale, on remarque ceci:

Hardware:   %s, %d MB RAM, .cpuid.c.CPU %s .%d MHz. reg%d: 0x%x..c....

Il y a 2 C, on les remplace par des 00 (partie Hexa), et c’est bon.

5) Désassemblage

J’ai désassemblé lina avec IDA Pro. Une fois l’analyse complète, cliquer dans views/open subviews, strings, et quand les chaines sont affichée, chercher (ALT+T) la chaine remplacée, qui contient le modèle de l’asa (il se peut qu’il faille sélectionner les octet, et la convertir en string depuis le menu edit). Notez ensuite les adresses dans le fichier (file offset), et l’adresse d’exécution

Dans mon cas j’avais:

File offset:0x01280BD8
Adress:0x092C8BD8
Offset name: aHardware5515SD

Chercher la chaine originale, et faire la même chose

File offset:0x014AFB8F8
Adress:0x094F7BF8
Offset name:aHardware5520DM

6)Patching

Faire un clique droit sur la chaine originale, et un click sur « jump xrefs to operand », cliquez sur OK, et on doit être amené à l’offset fichier:
0x01024C30
Sélectionner le nom de l’offset (dans mon cas aHardware5520DM), et cliquer sur l’onglet hexview.
On remarque :

F8 7B 4F 09

Qui correspond à 094F7BF8 (l’adresse d’éxécution de la chaine) inversé.
On va donc remplacer cette adresse avec celle de notre chaine:
09 2C 8B D8 (adresse nouvelle chaine) devient

D8 8B 2C 09

Dans notre editeur hexadecimal, aller à l’adresse 0x01024C30 et changer F8 7B 4F 09 par D8 8B 2C 09

7) Repack

Sauvegarder lina, assurer vous qu’il est en chmod 755, et recréer l’os comme suit:

bastien@bastien-laptop:~/asaemu/asa802-k8_1/uncompressed$ find . | cpio -o -H newc > ../asa802_cpio
61038 blocks
bastien@bastien-laptop:~/asaemu/asa802-k8_1/uncompressed$ cd ..
bastien@bastien-laptop:~/asaemu/asa802-k8_1$ gzip -9 asa802_cpio

Et si tout est niquel, quand on boot on peut avoir ça:

ciscoasa# sh ver
Cisco Adaptive Security Appliance Software Version 8.0(2)
Compiled on Fri 15-Jun-07 19:29 by builders
System image file is "Unknown, monitor mode tftp booted image"
Config file at boot was "startup-config"
ciscoasa up 3 secs
Hardware:   ASA5520, 128 RAM,  CPU Pentium II 2000 MHz

Pour infos, voici ma chaine de lancement QEmu:

qemu -hda ./asa802-k8_1/FLASH -m 256 -kernel ./asa802-k8_1/uncompressed/vmlinuz -initrd ./asa802-k8_1/asa802_cpio.gz \
 --no-kqemu -nographic -append "auto console=ttyS0,9600 bigphysarea=16384 ide1=noprobe" \
-net nic,vlan=1,macaddr=00:aa:00:00:02:01,model=pcnet -net tap,vlan=1,ifname=tap0

Voilà, j’ai plus d’excuses pour pas bosser à fond SNAF 😀

To unpack/repack, see http://ers.msk.ru/cisco/pix7-asa8.html

1) hexedit Lina and find Hardware:, 2nd occurence:
Hardware: %s, %d MB RAM,
2) Find a string longer than this, in the linux shell, type:
strings -n 30 lina
3) Search this string in the hex editor, I’ll take « pager_main() – Unable to create the pager initialization thread », so I’m looking for « pager_main », for example

4)Replace this string and end with 0s:
« Hardware: 5515, 128 MB RAM, CPU Pentium II 2000 MHz »
You can let the %s,%d or hard writting it, that what i’ll do because otherwise couln’t have the CPU name…
Before:
pager_main() – Unable to create the pager initialization…..thread
After:
Hardware: ASA5520, 128 MB RAM, CPU Pentium II 2000 MHz………………thread
(Fill the old string with 00 hex, to not change exe structure, and don’t forget the ,).

Well, I repacked it and try, but the show ver gave me:
Hardware: 5520, 128 RAM, CPU Pentium II 2000 MHzc
Notice the final C… It is due to the CPU Fetch function, so what yo uhave to do, is to go back to the original string in your hex editor:
Notice the string:
Hardware: %s, %d MB RAM, .cpuid.c.CPU %s .%d MHz. reg%d: 0x%x..c….
There are two damned C(after cpuid, and at the end of the line), well, replace it with 00 hex and it’s cool.
5) Disassemble lina with IDA Pro (wait the analysis to complete, long time), then click views, open subviews, string, and search(ALT+T) for the string you’ve written, with the 5515 or whatever you’ve put, and note the file offset, string address, and offset name. (you may have to select and right click and then select string to convert it to string)
In my case it is:
File offset:0x01280BD8
Adress:0x092C8BD8
Offset name: aHardware5515SD

then look for the original Hardware: %s, %d… string in the strings window Click on it
Note same infos as above
File offset:0x014AFB8F8
Adress:0x094F7BF8
Offset name:aHardware5520DM

6)Right click on the offset name and click jump to xrefs to operand and click ok. Note the file offset:
0x01024C30
Select aHardware5520DM and go to hex view.
You’ll notice:
BB F8 7B 4F 09
That is 094F7BF8 reversed.
Then it’s here you have to replace with your address!
So 09 2C 8B D8 would become
D8 8B 2C 09.
Return to your hex editor, go to the file offset 0x01024C30 and write down the new address of your edited string

7)Save the lina executable, and repack the IOS, then launch n prey
ciscoasa# sh ver

Cisco Adaptive Security Appliance Software Version 8.0(2)

Compiled on Fri 15-Jun-07 19:29 by builders
System image file is « Unknown, monitor mode tftp booted image »
Config file at boot was « startup-config »

ciscoasa up 3 secs

Hardware: ASA5520, 128 RAM, CPU Pentium II 2000 MHz

WHOOOHOOO

Let’s try ASDM

Recent Entries

7 Responses to “Modification de ASAOS pour faire fonctionner ASDM en émulation”

  1. wolverine Says:

    bonjour,

    j’ai télécharger ta VM patché

    je la démarre avec vmware workstation6 mais il y a un message d’erreur concernant le port série —> » serial0: Unable to create the server-side instance of the « asaconsole » named pipe: Syntaxe du nom de fichier, de répertoire ou de volume incorrecte. »

    pourrai tu m’aider en m’expliquant comment je doit procéder pour me connecter
    à la machine virtuelle

    en te remerciant par avance

  2. Bastien Migette Says:

    Salut, es tu sous linux ou windows ? Je penses que le chemin pour le pipe est pas bon… Modifie les propriétés de ta VM. Pour plus d’info, regarde mon autre post sur la VM ASA

  3. wolverine Says:

    salut merci de ta reponse

    je suis sous windows , dans les propriétés du port serial de la VM

    Use named pipe:

    asaconsole
    This end is the server.
    The other end is an application

    ce sont je pense les paramètres preconfigurés de la VM
    et sa ne fonctionne pas

  4. wolverine Says:

    en modifiant le nom du pipe par \\.\pipe\asaconsole
    je ne recoit pas de message d’erreure

    par contre

    je lance start_gw.bat
    puis je me connecte en hyperterminal

    en tcp/ip

    sur localhost port 567

    je réussie à me connecter mais j’ai rien sur le terminal

  5. Bastien Migette Says:

    Salut, suis la procédure ici:
    http://bmigette.fr/2008/11/30/asa-emulation-part-2/

  6. max Says:

    bonjour

    j’ai tenter de reproduire ton opération mais je bloque à l’étape
    5) Désassemblage

    je ne voie pas où est -> le fichier (file offset)

    File offset:0x01280BD8
    Adress:0x092C8BD8
    Offset name: aHardware5515SD

    pour faire la modif est ce que c’est un onglet dans IDA PRO

    merci

  7. Bastien Migette Says:

    Salut, le file offset, c’est simplement l’instruction à l’adresse du fichier en octet, ce qui diffère de l’adresse d’exécution. Dans les menu, tu dois voir jump to file offset, ou quelque chose comme cela.

Leave a Reply

Le temps imparti est dépassé. Merci de recharger le CAPTCHA.