web-dev-qa-db-fra.com

Envoi d'une demande CURL avec une adresse IP personnalisée

Cela ne devrait-il pas être possible? Supposons que je n'ai pas besoin de réponse, je veux simplement envoyer une demande. Ne devrions-nous pas être en mesure de modifier les en-têtes TCP/IP, car notre ordinateur les envoie? Il me manque probablement quelque chose, vraiment curieux, en apprenant à ce sujet à l'université.

20
tmm

Vous pouvez utiliser le -H/--header argument:

Vous pouvez usurper votre adresse IP:

curl --header "X-Forwarded-For: 192.168.0.2" http://example.com

Exemple:
client

$ curl http://webhost.co.uk  

Web Host

$ tailf access.log | grep 192.168.0.54   
192.168.0.54 - - [10/Nov/2014:15:56:09 +0000] "GET / HTTP/1.1" 200 14328 "-"   
"curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3   
libidn/1.18 libssh2/1.4.2"

le client avec l'adresse IP a changé

$ curl --header "X-Forwarded-For: 192.168.0.99" http://webhost.co.uk   

Web Host

$ tailf access.log | grep 192.168.0.99  
192.168.0.99 - - [10/Nov/2014:15:56:43 +0000] "GET / HTTP/1.1" 200  
14328 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0  
zlib/1.2.3 libidn/1.18 libssh2/1.4.2"  

man curl

 -H/--header <header>
              (HTTP)  Extra header to use when getting a web page. You may
              specify any number of extra headers. Note that if you should add
              a custom header that has the same name as one of the internal
              ones curl would use, your externally set header  will  be  used
              instead  of the internal one. This allows you to make even
              trickier stuff than curl would normally do. You should not
              replace internally set headers without knowing perfectly well
              what you’re doing. Remove an internal header by  giving  a
              replacement without content on the right side of the colon,
              as in: -H "Host:".

Références:

Modify_method_and_headers

27
geedoubleya

Je pense que la réponse acceptée ne vous aidera pas vraiment à usurper complètement votre adresse IP. Vous ne pouvez pas vraiment usurper votre IP source à moins d'avoir accès à des routeurs proches de la machine cible.

TCP fonctionne sur un mécanisme de prise de contact à 3 voies. Vous ne pourrez pas terminer cette poignée de main car la réponse de la poignée de main de la machine cible ira à votre adresse IP usurpée et non à la vôtre (sauf si, comme dit précédemment, vous contrôlez ses routeurs à proximité et redirigez la réponse vers vous-même).

P.S .: Vous pourrez peut-être envoyer un message UDP, mais je ne l'ai pas essayé.

4
looneyGod

Il est possible de modifier l'adresse IP source, si votre interface réseau locale a plusieurs adresses IP.

Supposons que vous ayez un serveur qui possède 2 adresses IP, 1.1.1.10 et 2.2.2.20:

$ ip route
default via 1.1.1.193 dev eth0 
1.1.1.192/27 via 1.1.1.193 dev eth0 
1.1.1.192/27 dev eth0  proto kernel  scope link  src 1.1.1.10
2.2.2.20 via 2.2.2.20 dev eth0  scope link

Vous pouvez vérifier votre adresse IP publique actuelle avec le service Web génial ifconfig.co :

$ curl -4 ifconfig.co
1.1.1.10

Pour accéder au service Web ifconfig.co à l'aide de l'autre adresse IP (2.2.2.20), vous pouvez créer un itinéraire basé sur l'adresse IP du serveur cible. Utilisez Dig pour trouver les adresses IP cibles à partir des enregistrements DNS A:

$ Dig ifconfig.co
...
ifconfig.co.            39      IN      A       104.28.18.94
ifconfig.co.            39      IN      A       104.28.19.94
...

Ajoutez maintenant des itinéraires personnalisés pour ces adresses IP:

$ ip route add 104.28.18.94/32 via 1.1.1.193 dev eth0 src 2.2.2.20
$ ip route add 104.28.19.94/32 via 1.1.1.193 dev eth0 src 2.2.2.20

En exécutant à nouveau curl, vous voyez que vous utilisez l'autre adresse IP source:

$ curl -4 ifconfig.co
2.2.2.20

De plus, vos informations de routage sont mises à jour:

$ ip route
default via 1.1.1.193 dev eth0 
1.1.1.192/27 via 1.1.1.193 dev eth0 
1.1.1.192/27 dev eth0  proto kernel  scope link  src 1.1.1.10
2.2.2.20 via 2.2.2.20 dev eth0  scope link
104.28.18.94 via 1.1.1.193 dev eth0  src 2.2.2.20
104.28.19.94 via 1.1.1.193 dev eth0  src 2.2.2.20

Remarque: cela ne fonctionne que si l'adresse IP source peut être résolue sur votre serveur, sinon la TCP prise de contact à 3 voies échouera, comme indiqué ici .

1
pymkin