Acquiro Systems, Inc. - Web Development & Graphic Design - Get a
free quote Interceptum - Create online surveys and intercepts.
Enregistrer | Pass?     
mIRC
ScriptsAddonsDLLsSnippetsTutorialsArticlesThemesMiscs
Aide FR
Interaction
Forums ScreenshotsFormulaireQueue ListTop D/L New  DéfisQuotesTipsTagX







Get Firefox!


Tutorial
Connexion socket en utilisant un proxy - kenji - 30 Août 2002Infos et Commentaires | Source XML


1. Introduction
2. Qu'est-ce qu'un serveur proxy ?
3. Pourquoi utiliser un relais de connexion ?
4. Comment utiliser un relais pour une connexion ?
5. Améliorations
6. Pour les paranos...
7. Conclusion






1. Introduction


sur internet, des serveurs proxy permettent de relayer des connexions de manière anonyme (sans avoir besoin de s'identifier auprès de ces serveur).

ce document va vous apprendre à vous connecter à un serveur en passant à travers un serveur relais type proxy http, en utilisant les sockets mirc.

pour la compréhension de cette technique, il est nécessaire de savoir déjà manipuler les sockets mirc. pour les autres, je leur conseille de lire un des nombreux tutoriaux qui existent sur la manipulation des sockets (on en trouve même en français).




2. Qu'est-ce qu'un serveur proxy ?


il existe plusieurs sortes de serveurs proxy, terme générique pour désigner un serveur permettant de relayer des connexions (on parle aussi de serveur wingate): pare-feu socks4, socks5, etc..
on va parler dans ce document des serveurs http utilisant une fonction décrite dans le document de HTTP/1.1 permettant le relais de connexion: ce sont les serveurs proxy-http.
selon leur fichier de configuration édité par leur administrateur, ces serveurs permettent le relais anonyme ou non des connexions.

on va supposer dans la suite de cet article que nous désirons relayer notre connexion à travers un serveur proxy-http anonyme.




3. Pourquoi utiliser un relais de connexion ?


les raisons de passer par l'intermédiaire d'un relais pour se connecter à une machine distante peuvent être multiples, justifiables comme moins justifiables: on peut ainsi atteindre une machine *interdite* par le règlement du réseau local en passant par un serveur relais qui est lui permis; on peut aussi dissimuler sa véritable identité à une machine distante, qui ne verra que celle du serveur relais utilisé, etc..

attention cependant pour ce type d'utilisation: l'anonymité ne peut pas être garantie à 100%, tout dépend du degré de confiance du serveur proxy.. mais je ne m'étendrais pas dessus, ne cautionnant pas ce type d'utilisation.




4. Comment utiliser un relais pour une connexion ?


comme on vient de le voir, un serveur proxy-http est avant tout un serveur http, c'est à dire un serveur web, avec lequel on communique suivant le protocole HTTP/1.1 (décrit dans la rfc2616). la plupart des serveur proxy-http sont spécialement dédiés au relais de connexions (wingate, squid, etc..)
on les trouve généralement derrière les ports 1080, 8080, mais aussi derrière les ports 3128 (serveur squid), ou autre ports non mis par défaut par le logiciel.

supposons que nous connaissons l'adresse et le port d'un serveur proxy-http:

ex: proxy.pouet.net sur le port 1080

on va se connecter au serveur proxy de la même manière qu'on se connecte à un serveur web:

exemple de code:

/sockopen mon_socket proxy.pouet.net 1080

dès la connexion établie, on envoie au serveur proxy les informations sur la destination de notre connexion:

ex: victime.com sur le port 80

on utilise pour celà, comme la commande GET de http pour demander un document, la commande CONNECT. elle utilise ce format:

CONNECT <addresse>:<port> HTTP/1.0

exemple de code:

on *:sockopen:mon_socket:{
  if $sockerr { echo *** connexion au proxy impossible | return }
  sockwrite -n $sockname CONNECT victime.com:80 HTTP/1.0
  sockwrite -n $sockname User-agent: Mozilla/5.0
  sockwrite -n $sockname $crlf
}

le serveur proxy renvoie alors une réponse suivant la réussite ou l'échec de la tentative de connexion à l'hôte, sous la forme suivante:

______________________________________
| HTTP/1.0 200 Connection established |
| ... |
| ... |
| <vide> |
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

les "..." sont d'éventuelles lignes contenant des informations non indispensables pour la suite de la connexion avec la cible. le code 200 indique que la connexion a été établie, le message qui suit le code le confirme d'ailleurs.. la fin de la réponse se termine comme toute réponse en http, par une ligne vide.

si un autre code que 200 apparait, une erreur s'est produite durant la tentative de connexion vers la cible victime.com: le relais ne peut donc s'effectuer.
par exemple, le code 407 indique qu'une autentification est nécessaire auprès du serveur proxy: ce n'est donc pas un serveur anonyme; le code 401 indique que l'on n'est pas autorisé à utiliser ce serveur proxy.. (consultez la rfc2616 sur le protocole HTTP/1.1 pour consulter les autres codes possibles)

exemple de code:

on *:sockread:mon_socket:{
  if $sockerr { return }
 
  sockread %data
  var %code = $gettok(%data,2,32)
  if %code != 200 { echo *** erreur: %data | sockclose $sockname }
  ; le code 200 a été reçu: la connexion est établie avec la cible
  else {
    ; on lit la fin du message de confirmation
    while $sockbr { sockread %data }
    echo *** connexion à la cible: établie.
   
    ; ci-dessous, les commandes que l'on désire envoyer
    ; à la cible, celles que l'on aurait mis dans on sockopen
    ; si on n'avait pas relayé la connexion à la cible via le
    ; serveur proxy.
   
  }
}

remarques importantes :

étant donné qu'on est connecté à la cible à travers le serveur proxy, il est important de souligner que toutes les informations renvoyées par l'identificateur $sock ($sock(..).ip et $sock(..).port) donnent des informations sur le serveur proxy et non sur le serveur cible.

une fois le code 200 reçu, la connexion avec la cible est donc établie: à partir de ce moment, toutes les données envoyées au socket (/sockwrite) parviendront de manière transparente directement à la cible.




5. Améliorations


on peut adapter ce système de relais de connexion à un addon que vous auriez déjà codé. pour ce faire, deux choses:

- on doit renommer le socket (/sockrename) dès la fin de la réception du code de confirmation de relais. ainsi, les évènements de socket que vous avez déjà écrit pourront se déclencher.
- tout ce que vous aviez mis dans votre on sockopen doit être copié après le commentaire qui l'indique (dans le code ci-dessus) afin de pouvoir être exécuté dès la fin de la réception du code de confirmation de relais.

ex: on a déjà écrit un code permettant de demander la page principale du site de mIRC (www.mirc.com) et de l'afficher en /echo.

code initial:

alias get_page { sockopen get_page www.mirc.com 80 }
on *:sockopen:get_page:{
  if $sockerr { return }
  sockwrite -n $sockname GET / HTTP/1.0
  sockwrite -n $sockname $crlf
}

on *:sockread:get_page:{
  if $sockerr { return }
  sockread %data
  while $sockbr {
    echo > %data
    sockread %data
  }
}

on veut utiliser ce code avec le système de relais, en passant à travers le serveur proxy d'adresse proxy.machin.net et de port 1080.

code modifié:

; on se connecte au proxy
alias get_page_proxy { sockopen proxy_get proxy.machin.net 1080 }
; on envoie au proxy la demande de relais
on *:sockopen:proxy_get:{
  if $sockerr { return }
  sockwrite -n $sockname CONNECT www.mirc.com:80 HTTP/1.0
  sockwrite -n $sockname User-agent: Mozilla/5.0
  sockwrite -n $sockname $crlf
}
; on traite la réponse du serveur proxy au sujet du relais demandé
on *:sockread:proxy_get:{
  if $sockerr { return }
  sockread %data
  var %code = $gettok(%data,2,32)
  if %code != 200 { echo *** erreur: %data | sockclose $sockname }
  else {
    ; on lit la fin du message de confirmation
    while $sockbr { sockread %data }
    ; le relais a été établi.
    echo *** www.mirc.com contacté.. requête de la page
   
    ; on renomme le socket avec le nom que l'on avait
    ; donné initialement
    sockrename $sockname get_page
   
    ; on envoie les commandes initialement mises dans le
    ; on sockopen
    sockwrite -n $sockname GET / HTTP/1.0
    sockwrite -n $sockname $crlf
  }
}

; on réutilise le bout de code concernant la lecture des données
; que l'on avait initialement écrit, tel quel.
on *:sockread:get_page:{
  if $sockerr { return }
  sockread %data
  while $sockbr {
    echo > %data
    sockread %data
  }
}





6. Pour les paranos...


imaginons maintenant que la cible que l'on désire contacter via le serveur proxy soit lui même un serveur proxy. on peut alors établir une connexion vers une cible, relayée par 2 serveurs proxy..!

on pourrait ainsi enchaîner plusieurs serveurs proxy qui seront autant de relais pour la connexion vers la cible.

je vous laisse le soin de coder un système qui fasse celà, en sachant qu'à chaque fois qu'on est connecté à un serveur proxy, on envoie la requête de connexion vers le prochain.

nb: en augmentant le nombre de relais, surtout si ceux-ci se situent sur divers points géographiques (en évitant si possible les serveurs proxy situés dans le même pays que vous..), on augmente grandement l'impossibilité de remonter jusqu'à vous.
mais l'anonymité à 100% n'existe pas... (certains serveurs proxy donnés dans des sites spécialisés sont parfois des pièges; ils logguent les connexions et il est dès lors plus facile de remonter à la source). le meilleur moyen est donc d'utiliser des serveurs proxy dont on est *sûr*..

nb2: comme de plus en plus d'individus utilisent ces serveurs proxy anonymes, certains serveurs (comme la plupart des grands réseaux irc) utilisent une méthode de scan de port afin de démasquer les connexions relayées. il faut savoir que ces scans ne portent que sur les ports habituels des serveurs proxy: 1080, 8080, 80, 3128, et peut être quelques autres.. l'idéal pour passer inaperçu est donc de passer par des serveurs proxy situés sur des ports *exotiques* (non habituels).




7. Conclusion


voilà. je pense vous avoir donné l'essentiel de cette technique. il est possible d'appliquer quasiment ce même principe pour les autres types de relayage (socks4, socks5, wingate, etc..): lisez donc les documents décrivant ces protocoles..

document réalisé par `kenji` <kenji-irc@altern.org> - 24/08/2002 france

 42 connectés (42 guests) v0.1.3 1.2261 sec | Disclaimer 
 4927876 visites (83 aujourd'hui) ScriptsDB.org © 2002-2006 ScriptsDB.org