Page suivante Page précédente Table des matières

7. Outils de développement

7.1 Debogage

Afin de pouvoir suivre le fonctionnement du module, un certain nombre d'informations de debogage peuvent être imprimées dans le buffer de messages du noyau au fer et à mesure de l'analyse et de la modification des paquets. Par défaut les messages de debogage sont désactivés, mais peuvent être activés par un sysctl, via le fichier /proc/sys/net/ipv4/ip_personality_debug.

Le niveau de debogage est réglé par la valeur numérique associée à ce paramètre : Chaque bit correspond à un des sous modules ce qui permet de sélectionner finement les messages à afficher en combinant les bits voulus comme ci après :

Exemple :

  echo 35 > /proc/sys/net/ipv4/ip_personality_debug

7.2 Osdet

Osdet est un outil de test tentant de découvrir le système d'exploitation utilisé. Il a été développé à partir des sources de nmap. Il effectue les mêmes tests que nmap, mais ce de manière séquentielle en affichant pour chaque test le paquet envoyé et la réponse éventuelle reçue (code adapté de tcpdump). Ceci permet d'analyser finemement le comportement de la pile IP et de constater le bon fonctionnement ou non du code noyau produit.

Exemple d'utilisation :

dse1:~# osdet -h
usage: osdet [-t n[-N],...] [-p port] [-P port] [-S ip] [-h] host
  -p port    Sets openport (defaults to 23 (telnet)).
  -P port    Sets closedport (defaults to a random high port).
  -S ip      Sets source Ip for scans if multihomed.
  -t ...     Selects a subset of tests to perform.

dse1:~# osdet -p 23 -P 234 dse2
OSDET v0.3 [using nmap backend version 2.53]

Trying to detect remote os of dse2 [172.20.30.2].
(assuming port 23 is open and port 234 is closed)
Using pcap filter: (icmp and dst host 172.20.30.1) or
 (tcp and src host 172.20.30.2 and dst host 172.20.30.1)

* Test 1 (TCP to open port, SYN and BOGUS)
  Sending packet... ok:
    172.20.30.1.50925 > 172.20.30.2.23: S 26F7D60A:26F7D60A(0) win 3072
     <wscale 10,nop,mss 265,timestamp 3F3F3F3F 0,eol> (ttl 54, id 36252)
  Waiting for answer... ok:
    172.20.30.2.23 > 172.20.30.1.50925: S 6ECE0057:6ECE0057(0) ack 26F7D60B
    win 7950 <mss 266> (ttl 255, id 59900)

* Test 2 (TCP to open port, NULL)
  Sending packet... ok:
    172.20.30.1.50926 > 172.20.30.2.23: . win 3072 <wscale 10,nop,mss
    265, timestamp 3F3F3F3F 0,eol> (ttl 54, id 27188)
  Waiting for answer... no reply.

* Test 3 (TCP to open port, SYN, FIN, URG and PUSH)
  Sending packet... ok:
    172.20.30.1.50927 > 172.20.30.2.23: SFP 26F7D60A:26F7D60A(0) win
    3072 urg 0 <wscale 10,nop,mss 265,timestamp 3F3F3F3F 0,eol> (ttl 54, id 28956)
  Waiting for answer... ok:
    172.20.30.2.23 > 172.20.30.1.50927: . ack 2 win 7950 (ttl 255, id 60156)

* Test 4 (TCP to open port, ACK 0)
  Sending packet... ok:
    172.20.30.1.50928 > 172.20.30.2.23: . ack 0 win 3072 <wscale
    10,nop,mss 265,timestamp 3F3F3F3F 0,eol> (ttl 54, id 7360)
  Waiting for answer... ok:
    172.20.30.2.23 > 172.20.30.1.50928: R 0:0(0) win 8192 (ttl 255, id 60412)

* Test 5 (TCP to closed port, SYN)
  Sending packet... ok:
    172.20.30.1.50929 > 172.20.30.2.234: S 26F7D60A:26F7D60A(0) win
    3072 <wscale 10,nop,mss 265,timestamp 3F3F3F3F 0,eol> (ttl 54, id 49268)
  Waiting for answer... ok:
    172.20.30.2.234 > 172.20.30.1.50929: R 0:0(0) ack 26F7D60B win 0 (ttl 255, id 60668)

* Test 6 (TCP to closed port, ACK 0)
  Sending packet... ok:
    172.20.30.1.50930 > 172.20.30.2.234: . ack 0 win 3072 <wscale
    10,nop,mss 265,timestamp 3F3F3F3F 0,eol> (ttl 54, id 53356)
  Waiting for answer... ok:
    172.20.30.2.234 > 172.20.30.1.50930: R 0:0(0) win 0 (ttl 255, id 60924)

* Test 7 (TCP to closed port, FIN, PUSH and URG)
  Sending packet... ok:
    172.20.30.1.50931 > 172.20.30.2.234: FP 26F7D60A:26F7D60A(0) win
    3072 urg 0 <wscale 10,nop,mss 265,timestamp 3F3F3F3F 0,eol> (ttl 54, id 60119)
  Waiting for answer... ok:
    172.20.30.2.234 > 172.20.30.1.50931: R 0:0(0) ack 26F7D60A win 0 (ttl 255, id 61180)

* Test 8 (UDP to closed port, expecting ICMP unreach)
  Sending packet... ok:
    172.20.30.1.50932 > 172.20.30.2.234: udp 300 (ttl 60, id 36334)
  Waiting for answer... ok:
    172.20.30.2 > 172.20.30.1: icmp: 172.20.30.2 udp port 234 unreachable (ttl 255, id 61436)

* Test 9 (Initial Sequence Number)
  Sending paquets... 26F7D60B 26F7D60C 26F7D60D 26F7D60E 26F7D60F 26F7D610; last is:
    172.20.30.1.50939 > 172.20.30.2.23: S 26F7D610:26F7D610(0) win 3072 (ttl 54, id 777)
  Waiting for answers... 9D128940[1] 9D138340[2] 9D147D40[3] 9D157740[4] 9D167140[5]
    9D176B40[6]; last is:
    172.20.30.2.23 > 172.20.30.1.50939: S 9D176B40:9D176B40(0) ack
    26F7D611 win 32120 <mss 1460> (DF) (ttl 64, id 0)

* Nmap OS Fingerprint:
  TSeq(Class=64K)
  T1(Resp=Y%DF=N%W=1F0E%ACK=S++%Flags=AS%Ops=M)
  T2(Resp=N)
  T3(Resp=Y%DF=N%W=1F0E%ACK=O%Flags=A%Ops=)
  T4(Resp=Y%DF=N%W=2000%ACK=O%Flags=R%Ops=)
  T5(Resp=Y%DF=N%W=0%ACK=S++%Flags=AR%Ops=)
  T6(Resp=Y%DF=N%W=0%ACK=O%Flags=R%Ops=)
  T7(Resp=Y%DF=N%W=0%ACK=S%Flags=AR%Ops=)
  PU(Resp=Y%DF=N%TOS=0%IPLEN=38%RIPTL=15C%RID=E%RIPCK=0%UCK=0%ULEN=134%DAT=E)

  TCP Sequence Prediction: Class=64K rule
  Difficulty=1 (Trivial joke)

* Remote OS Guess: AmigaOS AmiTCP/IP 4.3

7.3 Perscc

La bibliothèque dynamique qui s'ajoute à iptables réalise l'analyse du fichier de configuration et la compilation du code en pseudo-code pour la machine virtuelle. Afin d'être sûr que l'interprétation de la configuration du code, et que le code généré était correct, nous avons réalisé un interprêteur de fichier de configuration et un compilateur/désassembleur de code. Cet outil peut également être utilisé pour simplement vérifier la bonne syntaxe d'un fichier de configuration ou tester la longueur d'un code compilé.

Exemple d'utilisation :

dse2:~# percc example.conf
=== config ===
id: Example
isn initialized: yes, value=877764155
isn type: true-random
rewrite way: ingoing outgoing
keep unknown options: yes
keep unused options: yes
max window: 0
change options for isolated packets: yes
udp-unreach:
  reply: yes
  df: yes
  max-len: 500
  tos: 0
  ip-len: 0
  ip-id: same
  ip-csum: same
  udp-len: 0
  udp-csum: same
  udp-data: mangle

=== interpreted code #0 ===
if (flags(syn)) {
  if (option(sackOK)) {
    copy(sackOK);
  } else {
    copy(nop);
    copy(nop);
  }
  copy(timestamp);
  copy(mss);
} else {
  if (option(sack)) {
    copy(sack);
  } else {
    copy(nop);
    copy(nop);
  }
  copy(timestamp);
}
code: 15 instructions.

=== compiled code #0 ===
0000:  [01100002]  TEST    tcp_flags, syn
0001:  [0200000B]  JMP     000B
0002:  [01000004]  TEST    tcp_option, sackOK
0003:  [02000006]  JMP     0006
0004:  [03000004]  PUT     sackOK (copy)
0005:  [02000008]  JMP     0008
0006:  [03000001]  PUT     nop (copy)
0007:  [03000001]  PUT     nop (copy)
0008:  [03000008]  PUT     timestamp (copy)
0009:  [03000002]  PUT     mss (copy)
000A:  [02000012]  JMP     0012
000B:  [01000005]  TEST    tcp_option, sack
000C:  [0200000F]  JMP     000F
000D:  [03000005]  PUT     sack (copy)
000E:  [02000011]  JMP     0011
000F:  [03000001]  PUT     nop (copy)
0010:  [03000001]  PUT     nop (copy)
0011:  [03000008]  PUT     timestamp (copy)
asm: 18 instructions.

=== interpreted code #1 ===
if (option(mss)) {
  set(df, 0);
  if (listen) {
    if (flags(syn&ece)) {
      set(win, 7950);
      set(ack, this + 1);
      set(flags, syn|ack);
      insert(mss, this + 1);
      reply;
    } 
    if (flags(null)) {
      drop;
    } 
    if (flags(fin&syn&urg&push)) {
      set(win, 7950);
      set(ack, 2);
      set(flags, ack);
      reply;
    } 
    if ((ack(0) && flags(ack)) && !flags(syn|urg|push|rst)) {
      set(win, 8192);
      set(ack, 2);
      set(flags, rst);
      reply;
    } 
  } else {
    set(win, 0);
    if (flags(syn) && !flags(ack)) {
      set(ack, this + 1);
      set(flags, ack|rst);
      reply;
    } 
    if ((ack(0) && flags(ack)) && !flags(syn|urg|push|rst)) {
      set(ack, 2);
      set(flags, rst);
      reply;
    } 
    if (flags(fin&urg&push)) {
      set(ack, this + 0);
      set(flags, ack|rst);
      reply;
    } 
  }
} 
code: 53 instructions.

=== compiled code #1 ===
0000:  [01000002]  TEST    tcp_option, mss
0001:  [0200003A]  JMP     003A
0002:  [04200000]  SET     df, 0
0003:  [01400000]  TEST    listen
0004:  [02000022]  JMP     0022
0005:  [01200042]  TEST    tcp_flags, syn&ece
0006:  [0200000D]  JMP     000D
0007:  [04301F0E]  SET     win, 7950
0008:  [04900001]  SET     ack, this + 1
0009:  [04000012]  SET     flags, syn|ack
000A:  [04C00001]  SET     mss, this + 1
000B:  [03100002]  PUT     mss (insert)
000C:  [05000003]  RET     reply
000D:  [01100000]  TEST    tcp_flags, null
000E:  [02000010]  JMP     0010
000F:  [05000002]  RET     drop
0010:  [0120002B]  TEST    tcp_flags, fin&syn&urg&push
0011:  [02000016]  JMP     0016
0012:  [04301F0E]  SET     win, 7950
0013:  [04100002]  SET     ack, 2
0014:  [04000010]  SET     flags, ack
0015:  [05000003]  RET     reply
0016:  [01300000]  TEST    ack, 0
0017:  [0200003A]  JMP     003A
0018:  [01100010]  TEST    tcp_flags, ack
0019:  [0200003A]  JMP     003A
001A:  [0110002E]  TEST    tcp_flags, syn|urg|push|rst
001B:  [0200001D]  JMP     001D
001C:  [0200003A]  JMP     003A
001D:  [04302000]  SET     win, 8192
001E:  [04100002]  SET     ack, 2
001F:  [04000004]  SET     flags, rst
0020:  [05000003]  RET     reply
0021:  [0200003A]  JMP     003A
0022:  [04300000]  SET     win, 0
0023:  [01100002]  TEST    tcp_flags, syn
0024:  [0200002B]  JMP     002B
0025:  [01100010]  TEST    tcp_flags, ack
0026:  [02000028]  JMP     0028
0027:  [0200002B]  JMP     002B
0028:  [04900001]  SET     ack, this + 1
0029:  [04000014]  SET     flags, ack|rst
002A:  [05000003]  RET     reply
002B:  [01300000]  TEST    ack, 0
002C:  [02000035]  JMP     0035
002D:  [01100010]  TEST    tcp_flags, ack
002E:  [02000035]  JMP     0035
002F:  [0110002E]  TEST    tcp_flags, syn|urg|push|rst
0030:  [02000032]  JMP     0032
0031:  [02000035]  JMP     0035
0032:  [04100002]  SET     ack, 2
0033:  [04000004]  SET     flags, rst
0034:  [05000003]  RET     reply
0035:  [01200029]  TEST    tcp_flags, fin&urg&push
0036:  [0200003A]  JMP     003A
0037:  [04900000]  SET     ack, this + 0
0038:  [04000014]  SET     flags, ack|rst
0039:  [05000003]  RET     reply
asm: 58 instructions.


Page suivante Page précédente Table des matières