====== Astuces dans la pratique de Reverse avec outils embarqués pour OSINT ======
La **rétro-ingénierie** est la pratique de chercher à comprendre ce que contient un fichier, ce que fait un logiciel, ou les clés d'entrée dans un système, dont l'information, le code source n'est pas clairement disponible. La rétro-ingénierie ne pas donner tous les détails exacts du fichier, du logiciel, ou sur un système. Mais vous pourrez comprendre assez précisément comment un système, logiciel a été implémenté.
La rétro-ingénierie comprend quatre étapes de base suivantes :
* Rassembler l'information
* Déterminer le comportement du programme
* Interception des appels de librairie
* Définir des points clés d'entrée
L'**investigation par source ouverte**, ou [[wp>fr:Renseignement_d'origine_source_ouverte|renseignement]] par source ouverte, comprend « les activités et méthodes de collecte et d'analyse de l'information de sources ouvertes, c'est-à-dire des informations accessibles publiquement »
Nous entendons ici « outils embarqués » comme ceux fournis de //base// dans une distribution Linux ainsi que certains autres de conception légère téléchargeable, donc embarquables, configurables et utilisables via un terminal puis utilisables hors connexion internet.
===== Commandes Basiques =====
==== cat ====
La commande ''[[wp>fr:Cat_(Unix)|cat]]'' pour concatener un ou des fichiers sur une [[https://xavcc.frama.io/introduction-stream | sortie standard]]
Peut être, par exemple, utilisée dans ''∕etc''
cat passwd
root:x:0:0:root:/root:/bin/bash
[...]
> ''[[wp>fr:Less_(Unix)|less]]'' pagine le fichier et permet la recherche. Combiner ''cat'' avec //[[wp>fr:Tube_(shell)|pipe]]// ''|'' la commande ''less'' permet de paginer la sortie. Ceci est utile avec beaucoup des manipulation suivantes.
==== paste ====
> cat test_leak.txt
ID:Jean
password:1234
ID:Pierre
password:5678
ID:Pernault
password:9012
> paste - - -d, < test_leak.txt
ID:Jean ,password:1234
ID:Pierre ,password:5678
ID:Pernault,password:9012
Voir également : https://www.quennec.fr/trucs-astuces/syst%C3%A8mes/gnulinux/programmation-shell-sous-gnulinux/les-commandes-filtres/traitement-de-donn%C3%A9es/paste
==== comm & sort ====
Déterminer les lignes et contenu que deux fichiers différents ont en commun.
> comm -12 <(sort names1.txt) <(sort names2.txt)
Aussi possible
> cat names1.txt names2.txt | sort | uniq -c
==== file ====
''[[wp>fr:File_(Unix)|file]]'' permet de regarder un fichier et aide à deviner ce qu'il contient. La méthode qu'il utilise est simple. ''file'' fera la différence entre un fichier compréssé et un fichier.jpg lorsque vous n'avez pas d'extension. Il vous indiquera également l'architecture d'un binaire [[wp>fr:Executable_and_Linkable_Format|ELF]].
''file'' permet de voir les propriétés exécutables, à savoir :
* l'architecture qu'il cible ;
* l'OS ;
* s'ils sont liés dynamiquement ou statiquement ;
* si compilé avec les informations de débogage ou non.
* image
> file Figure_1-1.png
Figure_1-1.png: PNG image data, 1299 x 679, 8-bit/color RGBA, non-interlaced
dépôt de fichiers utilisables en exercice : https://github.com/ianare/exif-samples/tree/master/jpg
Prenons par exemple dans cette liste le ''Pentax_K10D.jpg''
> file Pentax_K10D.jpg
Pentax_K10D.jpg: JPEG image data, JFIF standard 1.01, resolution (DPI),
density 350x350, segment length 16, Exif Standard: [TIFF image data, little-endian,
direntries=19, manufacturer=PENTAX Corporation , model=PENTAX K10D
, orientation=upper-left, xresolution=282, yresolution=290, resolutionunit=2, software=GIMP 2.4.5, datetime=2008:07:31 15:56:49,
copyright=Laitche (This file is in the public domain.)], baseline, precision 8, 100x72, components 3
Nous pouvons enlever l'extension ''.jpg'' puis voir que nous allons obtenir le même résultat.
> file Pentax_K10D
Pentax_K10D: JPEG image data, JFIF standard 1.01, resolution (DPI), density 350x350,
segment length 16, Exif Standard: [TIFF image data, little-endian, direntries=19, manufacturer=PENTAX Corporation , model=PENTAX K10D
, orientation=upper-left, xresolution=282, yresolution=290, resolutionunit=2,
software=GIMP 2.4.5, datetime=2008:07:31 15:56:49,
copyright=Laitche (This file is in the public domain.)], baseline, precision 8, 100x72, components 3
Pour les question des EXFI : https://www.media.mit.edu/pia/Research/deepview/exif.html
* tar.gz
> file libgraph-1.0.2.tar.gz
libgraph-1.0.2.tar.gz: gzip compressed data, last modified: Wed Apr 5 18:25:15 2006, max compression, from Unix
* zip
> file indigo-gh-pages.zip
indigo-gh-pages.zip: Zip archive data, at least v1.0 to extract
**Exemples**
> file busybox
busybox: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux),
statically linked, for GNU/Linux 3.2.0,
BuildID[sha1]=⋅⋅⋅⋅⋅********************⋅⋅⋅⋅⋅⋅⋅, stripped
Lorsque ''data'' est rendu en sortie, c'est que ''file'' ne sait pas de quoi il s'agit
> file /opt/duniter/snapshot_blob.bin
/opt/duniter/snapshot_blob.bin: data
**sur une micro-image** d'un enregistruer de vidéo surveillance
https://support.zositech.com/hc/en-us/articles/360006626692-08ZN-M-V1-4-5-Upgrade-file-rootfs-3520dv300
> file rootfs-3520dv300
rootfs-3520dv300: u-boot legacy uImage, hirootfs, Linux/ARM, Filesystem Image (any type) (Not compressed),
8698364 bytes, Thu Mar 7 02:55:43 2019,
Load Address: 0x00000000, Entry Point: 0x00000000,
Header CRC: 0xB8071B27, Data CRC: 0x86BA3C18
==== stat ====
Affiche l'état d'un fichier ou d'un système de fichiers.
> stat perroquet
Fichier : perroquet
Taille : 8512 Blocs : 24 Blocs d'E/S : 4096 fichier
Périphérique : 804h/2052d Inœud : 2231065 Liens : 1
Accès : (0777/-rwxrwxrwx) UID : ( 1000/ x) GID : ( 998/ wheel)
Accès : 2020-11-01 11:21:14.140197000 +0100
Modif. : 2019-04-06 14:26:52.000000000 +0200
Changt : 2020-11-01 11:21:14.140197342 +0100
Créé : 2020-11-01 11:21:14.140197342 +0100
''stat --help''
==== strings ====
[[wp>fr:Strings|strings]] écrit chaque chaîne de texte //printable// à partir d'un fichier binaire vers la sortie standard ''sdout''
Il trouvera toutes les chaînes ASCII contiguës dans un fichier et les imprimera. C'est un bon moyen de voir ce que fait un binaire et de découvrir les API //endpoints//, les mots de passe codés en dur, etc.
> Si trop de données, utilisez l'option ''d'' sur les chaînes pour ne filtrer que les données initialisées et chargées, ce qui réduit à 24 le nombre d'options pour le mot de passe enregistré.
> man strings
[...]
-d
--data
Only print strings from initialized, loaded data sections in the
file. This may reduce the amount of garbage in the output, but it
also exposes the strings program to any security flaws that may be
present in the BFD library used to scan and load sections. Strings
can be configured so that this option is the default behaviour. In
such cases the -a option can be used to avoid using the BFD library
and instead just print all of the strings found in the file.
''strings'' peut être utile pour visualiser des messages d'erreur textuels qui donnent des indications sur les fonctionnalités binaires. C'est aussi un moyen simple pour détecter les binaires compressés comme dans l'exemple (fréquent avec les binaires malveillants) :
> strings exe_file
UPX!
...
PROT_EXEC|PROT_WRITE failed.
$Info: This file is packed with the UPX executable packer http://upx.sf.net $
$Id: UPX 3.91 Copyright (C) 1996-2013 the UPX Team. All Rights Reserved. $
...
UPX!
disons que nous cherchons une informations dans l'APk d'un application android
> strings ICI-RENNES_v1.0.6_apkpure.com.apk | less | grep user
HH545060458628-5ibshj43h14g53d9q2ukvmlh14jmb31h.apps.googleusercontent.com
==== ldd ====
''[[wp>fr:Ldd_(Unix)|ldd]]'' « certaines versions de ldd tentent d'obtenir les bibliothèques logicielles partagées du programme en l'exécutant. Ainsi, la page de manuel de ldd recommande de ne jamais employer ldd sur des exécutables non-sûrs. Le manuel propose l'alternative suivante, utilisant les utilitaires objdump et grep »
==== objdump ====
''[[wp>Objdump|objdump]]'' produit la liste de désassemblage d'un exécutable ELF
Soit, pour exemple, un programme ''[[pages:norae:si:dev_note-form-2#ecire_un_programme_qui_repete_une_entree_standard|perroquet]]'' en langage C qui répète ce qui est écrit en entrée
> ./perroquet
Entrez une ligne et validez avec Entrée
chante, chante...
Vous avez écrit : 'chante, chante...'
Nous aurons avec l'option ''d'' pour désassembler :
> objdump -d perroquet
perroquet: format de fichier elf64-x86-64
Déassemblage de la section .init :
00000000000005d0 <_init>:
5d0: 48 83 ec 08 sub $0x8,%rsp
5d4: 48 8b 05 0d 0a 20 00 mov 0x200a0d(%rip),%rax # 200fe8 <__gmon_start__>
5db: 48 85 c0 test %rax,%rax
5de: 74 02 je 5e2 <_init+0x12>
5e0: ff d0 callq *%rax
5e2: 48 83 c4 08 add $0x8,%rsp
5e6: c3 retq
Déassemblage de la section .plt :
00000000000005f0 <.plt>:
5f0: ff 35 b2 09 20 00 pushq 0x2009b2(%rip) # 200fa8 <_GLOBAL_OFFSET_TABLE_+0x8>
5f6: ff 25 b4 09 20 00 jmpq *0x2009b4(%rip) # 200fb0 <_GLOBAL_OFFSET_TABLE_+0x10>
5fc: 0f 1f 40 00 nopl 0x0(%rax)
0000000000000600 :
600: ff 25 b2 09 20 00 jmpq *0x2009b2(%rip) # 200fb8
606: 68 00 00 00 00 pushq $0x0
60b: e9 e0 ff ff ff jmpq 5f0 <.plt>
0000000000000610 :
610: ff 25 aa 09 20 00 jmpq *0x2009aa(%rip) # 200fc0
616: 68 01 00 00 00 pushq $0x1
61b: e9 d0 ff ff ff jmpq 5f0 <.plt>
0000000000000620 :
620: ff 25 a2 09 20 00 jmpq *0x2009a2(%rip) # 200fc8
626: 68 02 00 00 00 pushq $0x2
62b: e9 c0 ff ff ff jmpq 5f0 <.plt>
0000000000000630 :
630: ff 25 9a 09 20 00 jmpq *0x20099a(%rip) # 200fd0
636: 68 03 00 00 00 pushq $0x3
63b: e9 b0 ff ff ff jmpq 5f0 <.plt>
Déassemblage de la section .plt.got :
0000000000000640 <__cxa_finalize@plt>:
640: ff 25 b2 09 20 00 jmpq *0x2009b2(%rip) # 200ff8 <__cxa_finalize@GLIBC_2.2.5>
646: 66 90 xchg %ax,%ax
Déassemblage de la section .text :
0000000000000650 <_start>:
650: 31 ed xor %ebp,%ebp
652: 49 89 d1 mov %rdx,%r9
655: 5e pop %rsi
656: 48 89 e2 mov %rsp,%rdx
659: 48 83 e4 f0 and $0xfffffffffffffff0,%rsp
65d: 50 push %rax
65e: 54 push %rsp
65f: 4c 8d 05 4a 02 00 00 lea 0x24a(%rip),%r8 # 8b0 <__libc_csu_fini>
666: 48 8d 0d d3 01 00 00 lea 0x1d3(%rip),%rcx # 840 <__libc_csu_init>
66d: 48 8d 3d 6c 01 00 00 lea 0x16c(%rip),%rdi # 7e0
674: ff 15 66 09 20 00 callq *0x200966(%rip) # 200fe0 <__libc_start_main@GLIBC_2.2.5>
67a: f4 hlt
67b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1)
0000000000000680 :
680: 48 8d 3d 89 09 20 00 lea 0x200989(%rip),%rdi # 201010
687: 55 push %rbp
688: 48 8d 05 81 09 20 00 lea 0x200981(%rip),%rax # 201010
68f: 48 39 f8 cmp %rdi,%rax
692: 48 89 e5 mov %rsp,%rbp
695: 74 19 je 6b0
697: 48 8b 05 3a 09 20 00 mov 0x20093a(%rip),%rax # 200fd8 <_ITM_deregisterTMCloneTable>
69e: 48 85 c0 test %rax,%rax
6a1: 74 0d je 6b0
6a3: 5d pop %rbp
6a4: ff e0 jmpq *%rax
6a6: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1)
6ad: 00 00 00
6b0: 5d pop %rbp
6b1: c3 retq
6b2: 0f 1f 40 00 nopl 0x0(%rax)
6b6: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1)
6bd: 00 00 00
00000000000006c0 :
6c0: 48 8d 3d 49 09 20 00 lea 0x200949(%rip),%rdi # 201010
6c7: 48 8d 35 42 09 20 00 lea 0x200942(%rip),%rsi # 201010
6ce: 55 push %rbp
6cf: 48 29 fe sub %rdi,%rsi
6d2: 48 89 e5 mov %rsp,%rbp
6d5: 48 c1 fe 03 sar $0x3,%rsi
6d9: 48 89 f0 mov %rsi,%rax
6dc: 48 c1 e8 3f shr $0x3f,%rax
6e0: 48 01 c6 add %rax,%rsi
6e3: 48 d1 fe sar %rsi
6e6: 74 18 je 700
6e8: 48 8b 05 01 09 20 00 mov 0x200901(%rip),%rax # 200ff0 <_ITM_registerTMCloneTable>
6ef: 48 85 c0 test %rax,%rax
6f2: 74 0c je 700
6f4: 5d pop %rbp
6f5: ff e0 jmpq *%rax
6f7: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1)
6fe: 00 00
700: 5d pop %rbp
701: c3 retq
702: 0f 1f 40 00 nopl 0x0(%rax)
706: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1)
70d: 00 00 00
0000000000000710 <__do_global_dtors_aux>:
710: 80 3d 01 09 20 00 00 cmpb $0x0,0x200901(%rip) # 201018
717: 75 2f jne 748 <__do_global_dtors_aux+0x38>
719: 48 83 3d d7 08 20 00 cmpq $0x0,0x2008d7(%rip) # 200ff8 <__cxa_finalize@GLIBC_2.2.5>
720: 00
721: 55 push %rbp
722: 48 89 e5 mov %rsp,%rbp
725: 74 0c je 733 <__do_global_dtors_aux+0x23>
727: 48 8b 3d da 08 20 00 mov 0x2008da(%rip),%rdi # 201008 <__dso_handle>
72e: e8 0d ff ff ff callq 640 <__cxa_finalize@plt>
733: e8 48 ff ff ff callq 680
738: c6 05 d9 08 20 00 01 movb $0x1,0x2008d9(%rip) # 201018
73f: 5d pop %rbp
740: c3 retq
741: 0f 1f 80 00 00 00 00 nopl 0x0(%rax)
748: f3 c3 repz retq
74a: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1)
0000000000000750 :
750: 55 push %rbp
751: 48 89 e5 mov %rsp,%rbp
754: 5d pop %rbp
755: e9 66 ff ff ff jmpq 6c0
000000000000075a :
75a: 55 push %rbp
75b: 48 89 e5 mov %rsp,%rbp
75e: 48 83 ec 20 sub $0x20,%rsp
762: 48 89 7d e8 mov %rdi,-0x18(%rbp)
766: 89 75 e4 mov %esi,-0x1c(%rbp)
769: 48 8b 15 a0 08 20 00 mov 0x2008a0(%rip),%rdx # 201010
770: 8b 4d e4 mov -0x1c(%rbp),%ecx
773: 48 8b 45 e8 mov -0x18(%rbp),%rax
777: 89 ce mov %ecx,%esi
779: 48 89 c7 mov %rax,%rdi
77c: e8 9f fe ff ff callq 620
781: 8b 45 e4 mov -0x1c(%rbp),%eax
784: 48 98 cltq
786: 48 8d 50 ff lea -0x1(%rax),%rdx
78a: 48 8b 45 e8 mov -0x18(%rbp),%rax
78e: 48 01 d0 add %rdx,%rax
791: c6 00 00 movb $0x0,(%rax)
794: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%rbp)
79b: eb 2a jmp 7c7
79d: 8b 45 fc mov -0x4(%rbp),%eax
7a0: 48 63 d0 movslq %eax,%rdx
7a3: 48 8b 45 e8 mov -0x18(%rbp),%rax
7a7: 48 01 d0 add %rdx,%rax
7aa: 0f b6 00 movzbl (%rax),%eax
7ad: 3c 0a cmp $0xa,%al
7af: 75 12 jne 7c3
7b1: 8b 45 fc mov -0x4(%rbp),%eax
7b4: 48 63 d0 movslq %eax,%rdx
7b7: 48 8b 45 e8 mov -0x18(%rbp),%rax
7bb: 48 01 d0 add %rdx,%rax
7be: c6 00 00 movb $0x0,(%rax)
7c1: eb 18 jmp 7db
7c3: 83 45 fc 01 addl $0x1,-0x4(%rbp)
7c7: 8b 45 fc mov -0x4(%rbp),%eax
7ca: 48 63 d0 movslq %eax,%rdx
7cd: 48 8b 45 e8 mov -0x18(%rbp),%rax
7d1: 48 01 d0 add %rdx,%rax
7d4: 0f b6 00 movzbl (%rax),%eax
7d7: 84 c0 test %al,%al
7d9: 75 c2 jne 79d
7db: 8b 45 fc mov -0x4(%rbp),%eax
7de: c9 leaveq
7df: c3 retq
00000000000007e0 :
7e0: 55 push %rbp
7e1: 48 89 e5 mov %rsp,%rbp
7e4: 48 83 ec 60 sub $0x60,%rsp
7e8: 64 48 8b 04 25 28 00 mov %fs:0x28,%rax
7ef: 00 00
7f1: 48 89 45 f8 mov %rax,-0x8(%rbp)
7f5: 31 c0 xor %eax,%eax
7f7: 48 8d 3d ca 00 00 00 lea 0xca(%rip),%rdi # 8c8 <_IO_stdin_used+0x8>
7fe: e8 fd fd ff ff callq 600
803: 48 8d 45 a0 lea -0x60(%rbp),%rax
807: be 50 00 00 00 mov $0x50,%esi
80c: 48 89 c7 mov %rax,%rdi
80f: e8 46 ff ff ff callq 75a
814: 48 8d 45 a0 lea -0x60(%rbp),%rax
818: 48 89 c6 mov %rax,%rsi
81b: 48 8d 3d cf 00 00 00 lea 0xcf(%rip),%rdi # 8f1 <_IO_stdin_used+0x31>
822: b8 00 00 00 00 mov $0x0,%eax
827: e8 e4 fd ff ff callq 610
82c: bf 00 00 00 00 mov $0x0,%edi
831: e8 fa fd ff ff callq 630
836: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1)
83d: 00 00 00
0000000000000840 <__libc_csu_init>:
840: 41 57 push %r15
842: 41 56 push %r14
844: 49 89 d7 mov %rdx,%r15
847: 41 55 push %r13
849: 41 54 push %r12
84b: 4c 8d 25 4e 05 20 00 lea 0x20054e(%rip),%r12 # 200da0 <__frame_dummy_init_array_entry>
852: 55 push %rbp
853: 48 8d 2d 4e 05 20 00 lea 0x20054e(%rip),%rbp # 200da8 <__init_array_end>
85a: 53 push %rbx
85b: 41 89 fd mov %edi,%r13d
85e: 49 89 f6 mov %rsi,%r14
861: 4c 29 e5 sub %r12,%rbp
864: 48 83 ec 08 sub $0x8,%rsp
868: 48 c1 fd 03 sar $0x3,%rbp
86c: e8 5f fd ff ff callq 5d0 <_init>
871: 48 85 ed test %rbp,%rbp
874: 74 20 je 896 <__libc_csu_init+0x56>
876: 31 db xor %ebx,%ebx
878: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
87f: 00
880: 4c 89 fa mov %r15,%rdx
883: 4c 89 f6 mov %r14,%rsi
886: 44 89 ef mov %r13d,%edi
889: 41 ff 14 dc callq *(%r12,%rbx,8)
88d: 48 83 c3 01 add $0x1,%rbx
891: 48 39 dd cmp %rbx,%rbp
894: 75 ea jne 880 <__libc_csu_init+0x40>
896: 48 83 c4 08 add $0x8,%rsp
89a: 5b pop %rbx
89b: 5d pop %rbp
89c: 41 5c pop %r12
89e: 41 5d pop %r13
8a0: 41 5e pop %r14
8a2: 41 5f pop %r15
8a4: c3 retq
8a5: 90 nop
8a6: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1)
8ad: 00 00 00
00000000000008b0 <__libc_csu_fini>:
8b0: f3 c3 repz retq
Déassemblage de la section .fini :
00000000000008b4 <_fini>:
8b4: 48 83 ec 08 sub $0x8,%rsp
8b8: 48 83 c4 08 add $0x8,%rsp
8bc: c3 retq
Afficher le contenu de l'en-tête du fichier global à l'aide de l'option ''-f''
> objdump -f perroquet
perroquet: format de fichier elf64-x86-64
architecture: i386:x86-64, fanions 0x00000150:
HAS_SYMS, DYNAMIC, D_PAGED
adresse de départ 0x0000000000000650
Avec l'option ''-p''
> objdump -p perroquet
perroquet: format de fichier elf64-x86-64
En-tête de programme:
PHDR off 0x0000000000000040 vaddr 0x0000000000000040 paddr 0x0000000000000040 align 2**3
filesz 0x00000000000001f8 memsz 0x00000000000001f8 flags r--
INTERP off 0x0000000000000238 vaddr 0x0000000000000238 paddr 0x0000000000000238 align 2**0
filesz 0x000000000000001c memsz 0x000000000000001c flags r--
LOAD off 0x0000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**21
filesz 0x0000000000000a78 memsz 0x0000000000000a78 flags r-x
LOAD off 0x0000000000000da0 vaddr 0x0000000000200da0 paddr 0x0000000000200da0 align 2**21
filesz 0x0000000000000270 memsz 0x0000000000000280 flags rw-
DYNAMIC off 0x0000000000000db0 vaddr 0x0000000000200db0 paddr 0x0000000000200db0 align 2**3
filesz 0x00000000000001f0 memsz 0x00000000000001f0 flags rw-
NOTE off 0x0000000000000254 vaddr 0x0000000000000254 paddr 0x0000000000000254 align 2**2
filesz 0x0000000000000044 memsz 0x0000000000000044 flags r--
EH_FRAME off 0x000000000000090c vaddr 0x000000000000090c paddr 0x000000000000090c align 2**2
filesz 0x0000000000000044 memsz 0x0000000000000044 flags r--
STACK off 0x0000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**4
filesz 0x0000000000000000 memsz 0x0000000000000000 flags rw-
RELRO off 0x0000000000000da0 vaddr 0x0000000000200da0 paddr 0x0000000000200da0 align 2**0
filesz 0x0000000000000260 memsz 0x0000000000000260 flags r--
Section dynamique:
NEEDED libc.so.6
INIT 0x00000000000005d0
FINI 0x00000000000008b4
INIT_ARRAY 0x0000000000200da0
INIT_ARRAYSZ 0x0000000000000008
FINI_ARRAY 0x0000000000200da8
FINI_ARRAYSZ 0x0000000000000008
GNU_HASH 0x0000000000000298
STRTAB 0x00000000000003c8
SYMTAB 0x00000000000002c0
STRSZ 0x000000000000009a
SYMENT 0x0000000000000018
DEBUG 0x0000000000000000
PLTGOT 0x0000000000200fa0
PLTRELSZ 0x0000000000000060
PLTREL 0x0000000000000007
JMPREL 0x0000000000000570
RELA 0x0000000000000498
RELASZ 0x00000000000000d8
RELAENT 0x0000000000000018
FLAGS 0x0000000000000008
FLAGS_1 0x0000000008000001
VERNEED 0x0000000000000478
VERNEEDNUM 0x0000000000000001
VERSYM 0x0000000000000462
RELACOUNT 0x0000000000000003
Références de version:
requis par libc.so.6:
0x09691a75 0x00 02 GLIBC_2.2.5
''objdump'' permet aussi de connaître le compilateur utilisé pour compiler l'exécutable binaire et l'OS dans lequel cette opération a eu lieu :
> objdump -s --section .comment perroquet
perroquet: format de fichier elf64-x86-64
Contenu de la section .comment :
0000 4743433a 20285562 756e7475 20372e33 GCC: (Ubuntu 7.3
0010 2e302d32 37756275 6e747531 7e31382e .0-27ubuntu1~18.
0020 30342920 372e332e 3000 04) 7.3.0.
==== readelf ====
[[wp>Readelf|readelf]] est un programme permettant d'afficher diverses informations sur les fichiers objets sur les systèmes de type Unix tels que objdump. Il fait partie des binutils de GNU.
''readelf -x .rodata exe_file'' : lists static strings
''readelf -h exe_file'' gets ELF header information
''readelf -s exe''_file displays symbols
> ''readelf'' affiche des informations sur un ou plusieurs fichiers objets au format ELF. Les options contrôlent les informations particulières à afficher.
Les fichiers ELF 32 bits et 64 bits sont supportés, tout comme les archives contenant des fichiers ELF
==== binwalk ====
* [[https://github.com/ReFirmLabs/binwalk|binwalk]], un outil permettant de rechercher dans un binaire donné des fichiers intégrés et du code exécutable, notamment pour identifier les fichiers et le code incorporés dans les images de microprogrammes.
Binwalk utilise la bibliothèque [[https://github.com/threatstack/libmagic|libmagic]], il est donc compatible avec les signatures créées pour l'utilitaire de fichiers Unix.
Il comprend également un fichier de signature //magic// personnalisé qui contient des signatures améliorées pour les fichiers que l'on trouve couramment dans les microprogrammes tels que les fichiers compressés/archivés, les en-têtes de microprogrammes, les noyaux Linux, les chargeurs d'amorçage, les systèmes de fichiers, etc.
> binwalk Pentax_K10D.jpg
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 JPEG image data, JFIF standard 1.01
30 0x1E TIFF image data, little-endian offset of first image directory: 8
802 0x322 JPEG image data, JFIF standard 1.01
7399 0x1CE7 Copyright string: "Copyright (c) 1998 Hewlett-Packard Company"
==== hexdump ====
''[[wp>Hex_dump|hexdump]]'' vous montrera une représentation hexadécimale d'un fichier. Utile pour voir la structure. Le paramètre ''-C'' montre également la représentation ASCII.
(~/.cache/gstreamer-1.0)
`--> hexdump -C registry.x86_64.bin | less | grep keys
00039a40 69 67 61 74 69 6f 6e 5c 20 6b 65 79 73 5c 20 6c |igation\ keys\ l|
Reprenons notre exemple depuis la photo ''Pentax_K10D'' dans la section file ci-avant
$ hexdump Pentax 1 ↵
0000000 d8ff e0ff 1000 464a 4649 0100 0101 5e01
0000010 5e01 0000 e1ff 5108 7845 6669 0000 4949
0000020 002a 0008 0000 0013 010f 0002 0014 0000
0000030 00f2 0000 0110 0002 0014 0000 0106 0000
0000040 0112 0003 0001 0000 0001 0000 011a 0005
0000050 0001 0000 011a 0000 011b 0005 0001 0000
0000060 0122 0000 0128 0003 0001 0000 0002 0000
0000070 0131 0002 000b 0000 012a 0000 0132 0002
0000080 0014 0000 0136 0000 8298 0002 002d 0000
0000090 014a 0000 8769 0004 0001 0000 0198 0000
00000a0 9c9d 0001 0020 0000 0178 0000 a401 0003
00000b0 0001 0000 0000 0000 a402 0003 0001 0000
------SNIP------
0002f20 54d6 ab21 ced3 a25d b6e4 ff7f 00d9
0002f2d
Une information intéressante, parmi d'autres, dans [[https://www.media.mit.edu/pia/Research/deepview/exif.html|l'ensemble des spécifications]] est que les "marqueurs" commencent par ''0xFF''. Il existe plusieurs marqueurs statiques connus, tels que
- le marqueur "Start of Image" (SOI) : 0xFFD8, ''0000000 d8ff'' ici en début de sortie de donnée
- le marqueur "Fin d'image" (EOI) : 0xFFD9 ''00d9'' ici en fin de sortie de données
- Marqueur APP1 : ''0xFFE1''
- Marqueurs génériques : ''0xFFXX''
==== hexdiff ====
''[[https://www.man-linux-magique.net/man1/hexdiff.html|hexdiff]]'' permet de comparer à des fichiers au niveau de l'octet.
> « hexdiff affiche, après le lancement, deux fenêtres montrant un dump hexadécimal et ascii du début des deux fichiers. Deux barres d’état donnent le nom du fichier, sa taille et l’offset courant. La fenêtre courante est marquée par ''%%**%%'' à gauche de l’écran. A l’aide de diverses touches du clavier, vous pouvez vous déplacer simultanément dans les deux fichiers, et le dump vous montrera alors, en vidéo inverse, les octets qui sont différents entre les deux fichiers. »
> hexdiff file1.bin file2.bin
Téléchargeons deux pdf censés identiques à un court instant d'interval depuis le site du ministère de l'intérieur de France https://www.interieur.gouv.fr/Actualites/L-actu-du-Ministere/Attestation-de-deplacement-derogatoire-et-justificatif-de-deplacement-professionnel
Puis
> hexdiff attestation-deplacement-fr.pdf attestation-deplacement-fr1.pdf
Ensuite ''I'' pour afficher les données ''fstat'' des documents en parallèle
La touche ''?'' ouvre une popup d'aide expliquant les commandes de base.
la touche ''n'' pour se rendre à la prochaine différence entre les deux fichiers.
{{test-hexdiff-1_2020-04-07_16-06-06.png}}
==== diff ====
pour vérifier si un différence existe ou n'existe pas on peut utiliser la commande ''diff''. (qui est en quelque sorte l'inverse de ''comm'' vue ci-dessus)
toujours avec nous 2 pdf en exemple
> diff -y <(xxd attestation-deplacement-fr.pdf) <(xxd attestation-deplacement-fr\(1\).pdf) | colordiff
- ''-y'' montre les différences côte à côte
- ''xxd'' une commande pour créer une sortie hexadump du fichier binaire
- ''colordiff'' va coloriser la sortie ''diff'', nous connectons ''diff'' et ''colordiff'' grâce un pipe ''|''.
- Si les fichiers sont //trop// longs, ajouter une limite (par exemple, ''-l 1000'' ou ''-l 10000'' ) pour chaque ''xxd''
> exemple de fin de sorti de données pour la commande prescrite ci-avant
{{end-output-diff-tests.png}}
==== find ====
''[[wp>fr:Find|find]]'' « commande UNIX permettant de chercher des fichiers dans un ou plusieurs répertoires selon des critères définis par l'utilisateur. » est utilisée pour rechercher des fichiers par nom, autorisations, etc.
La commande suivante recherche dans le répertoire courant (.) les fichiers correspondant au nom insensible à la casse de ''*.sh''
> find . -iname '*.sh'
[...]
./Esp8266-Arduino-Makefile/esp8266-2.5.2/tests/build6.sh
./Esp8266-Arduino-Makefile/esp8266-2.5.2/tests/debug.sh
./Esp8266-Arduino-Makefile/esp8266-2.5.2/tests/build.sh
./Esp8266-Arduino-Makefile/esp8266-2.5.2/tests/restyle.sh
./Esp8266-Arduino-Makefile/esp8266-2.5.2/tests/restyle-all.sh
./Esp8266-Arduino-Makefile/esp8266-2.5.2/tests/build1.sh
./Esp8266-Arduino-Makefile/esp8266-2.5.2/tests/ci/build_package.sh
./Esp8266-Arduino-Makefile/esp8266-2.5.2/tests/ci/host_test.sh
./Esp8266-Arduino-Makefile/esp8266-2.5.2/tests/ci/style_check.sh
./Esp8266-Arduino-Makefile/esp8266-2.5.2/tests/ci/build_boards.sh
./Esp8266-Arduino-Makefile/esp8266-2.5.2/tests/ci/install_astyle.sh
./Esp8266-Arduino-Makefile/esp8266-2.5.2/tests/ci/build_docs.sh
./Esp8266-Arduino-Makefile/esp8266-2.5.2/tests/run_CI_locally.sh
./Esp8266-Arduino-Makefile/esp8266-2.5.2/tests/common.sh
./Esp8266-Arduino-Makefile/esp8266-2.5.2/tests/platformio.sh
[...]
Ou autre exemple
> find ~/ -iname '*eric*.jpg' -mtime -365
Pour trouver dans un sytème de fichiers Où est la photo contenant le nom //Eric//. Utilisez ''-iname'' pour les recherches de noms de fichiers insensibles à la casse. Utilisez ''-mtime -365'' pour les fichiers modifiés il y a moins d'un an.
==== grep ====
''[[wp>fr:Grep|grep]]'' programme en ligne de commande de recherche de chaînes de caractères, est utilisé pour rechercher le contenu des fichiers. Option ''-r'' signifie recherche récursive dans les répertoires, et ''-i'' signifie recherche insensible à la casse.
Ici, On cherche n'importe quel fichier contenant le mot « password ».
//pour cet exemple nous allons dans ''[[https://github.com/davidtavarez/pwndb|pwndb]]''//
(~/pwndb)
`--> grep -ri password * | less
[...]
chu.gml:_sub_ds1[? "password"] = "ambrinebel99";
chu.gml:_sub_ds2[? "password"] = "pierre";
chu.gml:_sub_ds3[? "password"] = "IDJVVEOZ";
chu.gml:_sub_ds4[? "password"] = "hugo5";
chu.gml:_sub_ds5[? "password"] = "JMRAFUPK";
chu.gml:_sub_ds6[? "password"] = "leguerrier007";
chu.gml:_sub_ds7[? "password"] = "086603685cb18746e05c";
chu.gml:_sub_ds8[? "password"] = "086603685cb18746e05c29244f524123";
chu.gml:_sub_ds9[? "password"] = "giraffes";
chu.gml:_sub_ds10[? "password"] = "54139464";
chu.gml:_sub_ds11[? "password"] = "chouchoune";
chu.gml:_sub_ds12[? "password"] = "cesson1";
[...]
==== agrep ====
[[https://linux.die.net/man/1/agrep|agrep]] ''grep'' par approximation.
En se basant sur les distances de Levenshtein((La distance de Levenshtein est une distance, au sens mathématique du terme, donnant une mesure de la différence entre deux chaînes de caractères. Elle est égale au nombre minimal de caractères qu'il faut supprimer, insérer ou remplacer pour passer d’une chaîne à l’autre. [[wp>fr:Distance_de_Levenshtein]])), il est possible de rechercher des mots ou une chaîne de caractères qui se ressemblent.
.-(~/pwndb)-----------------------------------------------------
`--> agrep -1 086603685 pwndb_dump.json
"password": "086603685cb18746e05c"
"password": "086603685cb18746e05c29244f524123"
> ''-1'' retourne les résultats avec 1 différence par rapport à la recherchce demandée
> ''-2'', résultats avec 2 différences
.-(~/pwndb)----------------------------------------------------
`--> agrep -2 08660 pwndb_dump.json
"password": "086603685cb18746e05c"
"password": "086603685cb18746e05c29244f524123"
"password": "860452932746608"
> ''-l'' : N'imprime que le nom de chaque fichier d'entrée qui contient au moins une correspondance, en supprimant la sortie normale. L'analyse de chaque fichier s'arrêtera à la première correspondance.
__voir également__
* ''[[https://linux.die.net/man/1/ding|ding]]'', Graphical dictionary lookup program for Unix (Tk)
* ''[[https://packages.debian.org/sid/glimpse|glimpse]]'' search quickly through entire file systems
* libagrep-ocaml, algorithme Wu-Manber pour la recherche de chaînes avec erreurs
* tre-agrep, utilitaire grep approximatif https://pkgs.org/download/tre-agrep
Pour des enjeux sur [[wp>Edit distance]]
> tre-agrep -s -9 -w ACTGGGTAAACTA dna.file
4:ACTGGGAAAATAAACTA
4:ACTAAACTA
0:ACTGGGTAAACTA
-s, --show-cost print match cost with output
--colour, --color use markers to distinguish the matching strings
--show-position prefix each output record with start and end
position of the first match within the record
* [[https://github.com/taleinat/fuzzysearch | fuzzysearch]] librairie en python
from fuzzysearch import find_near_matches
with open('path/to/file', 'r') as f:
data = f.read()
# 1. search allowing up to 3 substitutions
matches = find_near_matches("ACTGGGTAAACTA", data, max_substitutions=3)
# 2. also allow insertions and deletions, i.e. allow an edit distance
# a.k.a. Levenshtein distance of up to 3
matches = find_near_matches("ACTGGGTAAACTA", data, max_l_dist=3)
==== dmesg ====
[[wp>fr:Dmesg|dmesg]] « (pour l'anglais "display message", "afficher message" en français) est une commande sur les systèmes d'exploitation de type Unix qui affiche la mémoire tampon de message du noyau. »
Là on peut voir si les périphériques USB ont été correctement énumérés, et comment ils sont appelés. Sur un périphérique, le tampon de messages peut contenir beaucoup d'informations utiles - cartes mémoire, matériel supporté, et bien plus.
> « La quantité d'indications données par ''dmes''g peut requérir plus que la taille de l'écran, aussi pour cette raison la sortie de ''dmesg'' est généralement consultée par des outils de manipulation de texte comme ''less'', ''[[wp>fr:Tail_(Unix)|tail]]'' ou ''grep''. Les sorties de dmesg sont également souvent conservées de manière permanente dans des fichiers de log à l'aide de daemon comme syslog. » Wikipedia
> dmesg
[...]
[44252.790090] ata1: SATA link up 3.0 Gbps (SStatus 123 SControl 300)
[44252.792550] ata1.00: configured for UDMA/133
[44255.311810] usb 2-1.4: USB disconnect, device number 9
[44255.317649] IPv6: ADDRCONF(NETDEV_UP): wlp2s0: link is not ready
[44255.438525] ACPI: \_SB_.PCI0.PEG0.PEGP: failed to evaluate _DSM
[44255.534190] usb 2-1.4: new full-speed USB device number 10 using ehci-pci
[44260.668407] usb 2-1.4: New USB device found, idVendor=0cf3, idProduct=3004
[44260.668413] usb 2-1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[44260.668417] usb 2-1.4: Product: Bluetooth USB Host Controller
[44260.668420] usb 2-1.4: Manufacturer: Atheros Communications
[44260.668423] usb 2-1.4: SerialNumber: Alaska Day 2006
[44266.484676] IPv6: ADDRCONF(NETDEV_UP): enp3s0: link is not ready
[44266.623978] r8169 0000:03:00.0 enp3s0: link down
[...]
* firmwares chargés et leur état ''dmesg | grep -i firmware''
* pourrait aussi être utile ''dmesg | head'' (([[wp>fr:Head_(Unix)|head]]))
==== Les empreintes de hash d'un fichier ====
''[[https://www.howtoforge.com/linux-md5sum-command/|md5sum]]'', sha1sum, sha256sum, sha224sum, sha384sum et sha512sum
> md5sum monfichier.pdf
le format du fichier peut aussi être ''.bin'' ou tout autre
__Voir aussi__ [[https://github.com/TheGroundZero/HIBP-checker|Have I Been Pwned Checker]] Check if a password (hash) is present in the HIBP database
__exemple possible de mitigation par charge utile__
> « Les signatures basées sur la charge utile détectent des modèles dans le contenu du fichier plutôt que des attributs, tels qu'un hachage, ce qui leur permet d'identifier et de traiter fichiers intègres ou modifiés, pouvant possiblement contenir des actions malveillantes. »
> sha1sum fichier-1.bin
38762cf7f55934b34d179ae6a4c80cadccbb7f0a fichier-1.bin
> sha1sum fichier-2.bin
38762cf7f55934b34d179ae6a4c80cadccbb7f0a fichier-2.bin
> echo "payload" > payload
> cat playload fichier-1.bin | sha1sum
02f7808168af17eece0d9cd9d69846c51a65f395 -
> cat playload fichier-2.bin | sha1sum
02f7808168af17eece0d9cd9d69846c51a65f395 -
> cat playload fichier-1.bin | sha1sum
41c418591ea08fa9c535bf71efb3b902a7928d53 -
> cat palyload chichier-2.bin | sha1sum
6820b0b4dd1dcbaa79a5b1155be98ee6ca5b8203 -
Le hash seul ne permet pas forcément de prouver que deux fichiers sont identiques dans le cas où l'algorithme de hash a été compromis.
Par conséquent changer l’algorithme de hash ou ajouter un payload sûr « avant » le fichier permet de vérifier si le hash a été compromis ou non
==== Les récentes actions dans une section user ====
> loginctl session-status | tee session.status
===== Déterminer le comportement d'un programme =====
==== ltrace ====
''[[wp>Ltrace|ltrace]]'' trace les appels à la fonction de bibliothèque. Elle exécute le programme dans ce processus.
> « ''ltrace'' est un utilitaire de débogage sous Linux, utilisé pour afficher les appels qu'une application en espace utilisateur fait aux bibliothèques partagées. Il fait cela en se connectant au système de chargement dynamique, lui permettant d'insérer des cales qui affichent les paramètres que l'application utilise lors de l'appel, et la valeur de retour que l'appel à la bibliothèque rapporte. ''ltrace'' peut aussi tracer les appels système sous Linux. Parce qu'il utilise le mécanisme d'accrochage dynamique des bibliothèques, ''ltrace'' ne peut pas tracer les appels aux bibliothèques qui sont statiquement liées directement au binaire cible. Depuis la version 0.7.3, ltrace peut aussi tracer les appels aux bibliothèques qui sont chargées en utilisant ''dlopen()''. » wikipedia
setlocale(LC_TIME, nil) = "fr_FR.UTF-8"
utmpxname(0x557dcdcfcf74, 0x7fffbd7f4ed8, 0x7fffbd7f4ee0, 1) = 0
setutxent(0x557dcdcfcf74, 0x7f7b7452cf20, 0, 1) = 1
getutxent(3, 0, 0x7f7b7475c720, 0x7f7b74482217) = 0x557dcf9d4400
realloc(0, 384) = 0x557dcf9d4590
getutxent(0x557dcf9d4710, 0x557dcf9d4580, 0, 0) = 0x557dcf9d4400
realloc(0x557dcf9d4590, 768) = 0x557dcf9d4590
getutxent(0x557dcf9d4890, 0x557dcf9d4580, 0, 0) = 0x557dcf9d4400
kill(1940, 0) = 0
realloc(0x557dcf9d4590, 1536) = 0x557dcf9d4590
getutxent(0x557dcf9d4a10, 0x557dcf9d4580, 0, 0) = 0
endutxent(14, 0x7fffbd7f4b40, 0, 0) = 0x7f7b7475c6e0
[...]
Nous avons comme information intéressante : langue et horodatage de la machine
vous trouverez également le nom d'utilist⋅rice⋅eur enregistré pour la session machine inspectée
[...]
strlen("bob :0 2019-12-20"...) = 47
puts("bob :0 2019-12-20"...) = 44
Vous pouvez observer qu'il existe un ensemble d'appels à ''[[https://linux.die.net/man/3/getutxent|getutxent]]'' et sa famille de fonction de bibliothèque. Vous pouvez également noter que ltrace donne les résultats dans l'ordre dans lequel les fonctions sont appelées dans le programme.
Maintenant nous savons que la commande ''who'',qui permet d'avoir des informations sur les différents utilisat⋅rices⋅eurs connecté⋅e⋅s, fonctionne en appelant le ''getutxent'' et sa famille de fonctions pour obtenir la liste utilisat⋅rices⋅eurs connecté⋅e⋅s.
> « la glibc sous Linux n’utilise pas de fichier utmpx en parallèle car sa structure utmp est déjà assez grande. Les fonctions ''getutxent()'' etc. sont des alias pour ''getutent()'' etc. » [[https://www.man-linux-magique.net/man3/getutxent.html|source]]
==== strace ====
La commande ''[[wp>fr:Strace|strace]]'', outil de débogage, utilisée pour tracer les appels système effectués par le programme. Si un programme n'utilise aucune fonction de bibliothèque et qu'il n'utilise que des appels système, alors en utilisant ''ltrace'' simplement nous ne pouvons pas retracer l'exécution du programme.
> strace /usr/bin/who
.
.
.
brk(NULL) = 0x558fed465000
.
.
.
brk(NULL) = 0x558fed465000
brk(0x558fed486000) = 0x558fed486000
openat(AT_FDCWD, "/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=4270640, ...}) = 0
mmap(NULL, 4270640, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f2699494000
close(3) = 0
access("/var/run/utmpx", F_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/var/run/utmp", O_RDONLY|O_CLOEXEC) = 3
lseek(3, 0, SEEK_SET) = 0
alarm(0) = 0
.
.
.
fcntl(3, F_SETLKW, {l_type=F_RDLCK, l_whence=SEEK_SET, l_start=0, l_len=0}) = 0
read(3, "\7\0\0\0\224[...]"..., 384) = 384
fcntl(3, F_SETLKW, {l_type=F_UNLCK, l_whence=SEEK_SET, l_start=0, l_len=0}) = 0
vous pouvez observer que chaque fois qu'une fonction [[wp>fr:Malloc|malloc]]((Description des mécanismes d'allocation dynamique de mémoire en langage C https://rperrot.developpez.com/articles/c/allocationC/)) est appelée, elle effectue l'[[wp>fr:Appel_système|appel système]] ''brk()''. La fonction de la bibliothèque ''getutxent'' fait l'appel système ''open'' pour ouvrir ''/var/run/utmp'' et met un verrou en lecture et lit le contenu puis libère les verrous.
Maintenant nous avons confirmé que la commande qui lit le fichier ''utmp'' pour afficher la sortie ''sdout''
''strace'' et ''ltrace'' ont tous deux un ensemble de bonnes options qui peuvent être utilisées.
* ''-p '' : S'attache au pid spécifié. Utile si le programme est déjà en cours d'exécution et que vous voulez connaître son comportement.
* ''-n 2'' : Indente chaque appel imbriqué de 2 espaces.
* ''-f'' : Suivre le fork
===== déboguer, désassembler, fuite de données et mémoire, Retracer l'histoirique =====
==== Gdb + peda + voltron ====
Nous vous proposons ici de une composition sur la base de [[https://www.gnu.org/software/gdb/|GNU Project Debugger]] avec [[https://github.com/longld/peda | PEDA - Python Exploit Development Assistance for GDB]] pour moins vous abimer les yeux, et enfin [[https://github.com/snare/voltron|Voltron is an extensible debugger UI toolkit written in Python.]]
{{dgb-et-peda_test.png}}
{{gdb-et-voltron.png}}
**Exemple**
//Un exercice et une proposition de défi seront rédigés prochainement//
Voir également [[https://apoorvaj.io/hitchhikers-guide-to-the-gdb/|Hitchikers Guide To The GDB]]
==== Radare 2 ===
- Voir la [[https://notecc.frama.wiki/norae:biologicus:biohacking_note-reverse-1#radare_radare2|page dédiée]]
- par exemple, usage de {{norae:si:mozilla.pdf|radre2 in bioinfo}}
- [[Exercice de découverte de désassemblage avec radare2]]
===== Intercepter de l'information =====
Ces outils embarqués ou embarquables peuvent servir à l'analyse de données sur réseaux. Internet n'étant pas le seul et unique réseau, Internet étant un réseau de réseaux.
https://github.com/linux-can/can-utils
==== Can-utils ===
> CAN est un protocole de réseau basé sur des messages, conçu pour les véhicules, créé à l'origine par Robert Bosch GmbH. SocketCAN est un ensemble de pilotes CAN à source ouverte et une pile de réseau. //Contribution par la recherche Volkswagen au noyau Linux.//
https://github.com/linux-can/can-utils
=== candump ===
''candump'' permet de sniffer les paquets CAN d'une ou plusieurs interfaces CAN avec de nombreuses autres options utiles pour filtrer, rediriger les messages, etc.
Exemple :
$ candump vcan0
vcan0 123 [4] 01 AA BB 22
vcan0 123 [4] 01 AA BB 23
vcan0 123 [4] 01 AA BB 24
=== cansniffer ===
''cansniffer'' est un outil qui organise les informations sur les CAN par ID d'arbitrage et permet de déterminer les valeurs qui changent. Par défaut, si un ID d'arbitrage ne reçoit pas d'informations « différentes » dans le paquet après 5 secondes, les données seront effacées de l'écran.
''$ cansniffer can0''
==== hping ====
==== netstat ====
==== nmap ====
==== tcpdump ====
==== xprobe2 ====
==== wireshark ====
==== mitmproxy ====
====== Aller plus loin =====
===== Exemples d'exercice =====
- https://github.com/Tipi-Hack/tipi-hack.github.io/blob/master/_posts/2020-04-06-AUCTF-20-Bash.md
- https://github.com/Tipi-Hack/tipi-hack.github.io/blob/master/_posts/2020-04-06-AUCTF-20-Animal_Crossing.md
{{linux_investigation.jpg}}
//source : https://web.archive.org/web/20200225023508/https://www.brendangregg.com/index.html //
===== Pages liées =====
__retro-ingé sur logiciel__
* [[pages:norae:biologicus:biohacking_note-reverse-1|Premiers pas sur le Reverse Engineering]]
* [[pages:norae:si:dev_note-form-2|Note de préparation d'atelier pour débuter en langage C/C++]]
* [[pages:norae:si:dev_note-form_4|les rudiments de la programmation en C en 27 courtes sessions]]. De “Hello, World !” Jusqu'à terminer par un cas pratique de sécurité de l'information (rootkit).
* Radare 2
* GNU debugger project (gdb) et Peda (https://mamot.fr/@XavCC/102989902429089282)
====== Sources ======
* Pen Test Partners https://archive.md/Rc9MJ
* Linux Strings Command Examples (Search Text in UNIX Binary Files). by Sasikala on November 2, 2010 https://www.thegeekstuff.com/2010/11/strings-command-examples
* Understanding what a Linux binary is doing, Unix & Linux stack exchange https://archive.md/6p2v5#selection-567.0-567.42
* objdump, wikipedia, https://en.wikipedia.org/wiki/Objdump
* 7 Strace Examples to Debug the Execution of a Program in Linux by Balakrishnan Mariyappan on November 23, 2011 https://www.thegeekstuff.com/2011/11/strace-examples/
* Reversing a real-world 249 bytes backdoor! Aneesh Dogra https://archive.md/YWi1I
* Reverse Engineering x64 for Beginners – GDB https://niiconsulting.com/checkmate/2018/04/reverse-engineering-x64-for-beginners-linux/
* Débuter en CrackMe: contourner l’authentification en 3 méthodes https://www.kali-linux.fr/hacking/debuter-en-crackme-avec-gdb
* Strace outil de dépannage Linux / debugging, 5 mai 2014, par Nadir Soualem https://archive.md/UYLPY
====== Remerciements ======
* Darks
* Ciriaco
* FipAddict