web-dev-qa-db-fra.com

IPTABLE String Match ne fonctionne pas lorsque l'option --o est <52

quand je saisi la règle iptables qui correspondent à la chaîne et à la --to option est >= 52

exemple

iptables -I FORWARD 1 -m string --string anypattern --algo bm --to 100 -j DROP

Le ci-dessus fonctionne correctement et bloquez les paquets IP qui contiennent une chaîne "AnyPattern".

Maintenant si je change le --to à une valeur < 52 alors ça ne fonctionnera pas

iptables -I FORWARD 1 -m string --string anypattern --algo bm --to 50 -j DROP

Et les paquets IP ne seront pas bloqués!

Est-ce que je manque quelque chose? ou ceci est un problème d'IPTABLES?

Exemple :

    linux:~$ Sudo iptables -I OUTPUT 1 -m string --algo bm --string 7oula --to 52 -j DROP
    linux:~$ echo 7oulaaaaaaaaaaa | nc  212.227.247.109 80
    ^C  #<---- Blocked here
    linux:~$ Sudo iptables -I OUTPUT 1 -m string --algo bm --string coula --to 51 -j DROP
    linux:~$ echo coulaaaaaaaaaaa | nc  212.227.247.109 80
    HTTP/1.1 400 Bad Request
    Server: nginx
    Date: Sun, 26 Jan 2020 15:35:55 GMT
    Content-Type: text/html
    Content-Length: 150
    Connection: close

    <html>
    <head><title>400 Bad Request</title></head>
    <body>
    <center><h1>400 Bad Request</h1></center>
    <hr><center>nginx</center>
    </body>
    </html>
2
Mohamed KALLEL

Gardez en nature que le décalage ne soit pas relatif au début de la partie de charge utile du paquet, mais comprend la partie d'en-tête du paquet. Voici une capture de TCPDumM de l'un des exemples de paquets, c'est-à-dire

echo zoulaaaaaaaaaaa | nc  192.168.111.1 80

résultant en:

2020-01-26 11:51:10.606417 IP 192.168.111.122.43372 > 192.168.111.1.80: Flags [P.], seq 1:17, ack 1, win 502, options [nop,nop,TS val 3518227831 ecr 86824426], length 16: HTTP
    0x0000:  4500 0044 048c 4000 4006 d65b c0a8 6f7a  E..D..@.@..[..oz
                                           src-ip--
    0x0010:  c0a8 6f01 a96c 0050 8a87 b04c 40e2 7841  [email protected]
             dst-ip--  spt  dpt
    0x0020:  8018 01f6 ad1e 0000 0101 080a d1b3 e577  ...............w
    0x0030:  052c d5ea 7a6f 756c 6161 6161 6161 6161  .,..zoulaaaaaaaa
                       ^
                       |_ Offset 52
    0x0040:  6161 610a                                aaa.

En modifiant vos règles d'IPTABLES expérimentales à ceci:

$ Sudo iptables -I OUTPUT 1 -m string --algo bm --string boula --from 46 --to 51 -j DROP
$ Sudo iptables -I OUTPUT 1 -m string --algo bm --string coula --from 47 --to 52 -j DROP
$ Sudo iptables -I OUTPUT 1 -m string --algo bm --string doula --from 48 --to 53 -j DROP
$ Sudo iptables -I OUTPUT 1 -m string --algo bm --string eoula --from 49 --to 54 -j DROP
$ Sudo iptables -I OUTPUT 1 -m string --algo bm --string foula --from 50 --to 55 -j DROP
$ Sudo iptables -I OUTPUT 1 -m string --algo bm --string goula --from 51 --to 56 -j DROP
$ Sudo iptables -I OUTPUT 1 -m string --algo bm --string houla --from 52 --to 57 -j DROP
$ Sudo iptables -I OUTPUT 1 -m string --algo bm --string ioula --from 53 --to 58 -j DROP
$ Sudo iptables -v -x -n -L
Chain INPUT (policy ACCEPT 23 packets, 1800 bytes)
 pkts      bytes target     prot opt in     out     source               destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts      bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 11 packets, 1816 bytes)
pkts      bytes target     prot opt in     out     source               destination
   0        0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            STRING match  "ioula" ALGO name bm FROM 53 TO 58
   0        0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            STRING match  "houla" ALGO name bm FROM 52 TO 57
   0        0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            STRING match  "goula" ALGO name bm FROM 51 TO 56
   0        0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            STRING match  "foula" ALGO name bm FROM 50 TO 55
   0        0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            STRING match  "eoula" ALGO name bm FROM 49 TO 54
   0        0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            STRING match  "doula" ALGO name bm FROM 48 TO 53
   0        0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            STRING match  "coula" ALGO name bm FROM 47 TO 52
   0        0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            STRING match  "boula" ALGO name bm FROM 46 TO 51

Nous pouvons essayer de mieux comprendre l'interprétation des paramètres to et from:

doug@rpi01:~ $ echo boulaaaaaaaaaaa | nc  192.168.111.1 80
Worked...
doug@rpi01:~ $ echo coulaaaaaaaaaaa | nc  192.168.111.1 80
^C  HTTP packet blocked
doug@rpi01:~ $ echo doulaaaaaaaaaaa | nc  192.168.111.1 80
^C HTTP packet blocked
doug@rpi01:~ $ echo eoulaaaaaaaaaaa | nc  192.168.111.1 80
^C HTTP packet blocked
doug@rpi01:~ $ echo foulaaaaaaaaaaa | nc  192.168.111.1 80
^C HTTP packet blocked
doug@rpi01:~ $ echo goulaaaaaaaaaaa | nc  192.168.111.1 80
^C HTTP packet blocked
doug@rpi01:~ $ echo houlaaaaaaaaaaa | nc  192.168.111.1 80
^C HTTP packet blocked
doug@rpi01:~ $ echo ioulaaaaaaaaaaa | nc  192.168.111.1 80
Worked...
doug@rpi01:~ $ Sudo iptables -v -x -n -L
Chain INPUT (policy ACCEPT 742 packets, 71452 bytes)
    pkts      bytes target     prot opt in     out     source               destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
    pkts      bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 509 packets, 59196 bytes)
    pkts      bytes target     prot opt in     out     source               destination
       0        0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            STRING match  "ioula" ALGO name bm FROM 53 TO 58
      11      748 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            STRING match  "houla" ALGO name bm FROM 52 TO 57
      11      748 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            STRING match  "goula" ALGO name bm FROM 51 TO 56
      11      748 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            STRING match  "foula" ALGO name bm FROM 50 TO 55
      11      748 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            STRING match  "eoula" ALGO name bm FROM 49 TO 54
      11      748 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            STRING match  "doula" ALGO name bm FROM 48 TO 53
      11      748 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            STRING match  "coula" ALGO name bm FROM 47 TO 52
       0        0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            STRING match  "boula" ALGO name bm FROM 46 TO 51

De la pages de l'homme:

   --from offset
          Set the offset from which it starts looking for any matching. If not passed, default is 0.

   --to offset
          Set the offset up to which should be scanned. That is, byte offset-1 (counting from 0) is the last one that is scanned.  If not passed, default is the packet size.

J'ai supposé que to signifiait le dernier octet du paquet qui serait vérifié. Donc, j'aurais attendu qu'un seul de ces paquets bloqués, pas 6. Cependant, et sur la base de la description de la page man, puis les résultats ont le sens, lorsque l'octet 52, le caractère de démarrage de la chaîne, est inclus dans la fenêtre de match. . Cependant, cette ligne:

  11      748 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            STRING match  "coula" ALGO name bm FROM 47 TO 52

N'a pas de sens, car l'octet 52 aurait dû être exclu comme un octet de démarrage de modèle.

EDIT: J'ai enquêté. L'exemple de ma réponse provient d'un noyau de version pré-52. Cela semble avoir été fixé à partir du noyau 5.2-RC1 et que la ligne ci-dessus ne bloque pas les paquets.

2
Doug Smythies