par Michael Driscoll fenris@lightspeed.net
Ce hack est similaire au hack 11, mais il diffère en la méthode employée. Alors que le hack 11 implique l'utilisation d'un accès ftp vers le serveur http de votre FAI pour mettre à jour la page, celui ci accède à un CGI sur le serveur pour mettre en place la page elle-même.
Pour utiliser ce script, vous allez devoir convaincre votre l'administrateur de votre FAI de mettre ce CGI sur le serveur. Il est tout à fait possible qu'ils vous demandent de l'argent pour vérifier la sécurité de ce script, puisque cela va leur demander du temps, et c'est pour eux l'assurance que le script ne présentera pas de risques une fois mis en place (je vais faire de mon mieux pour qu'il soit le plus 'sûr' possible). Par exemple, mon FAI (lightspeed.net) me demande $50 par script pour le vérifier.
Attention : Non seulement ce script est totalement nouveau et (largement) non testé, mais en plus, je l'écris à 3 heures du matin car je n'ai pas envie de faire ma philosophie. Si vous ne connaissez rien aux CGI ni comment les rendre sûr, alors, je vous suggère d'attendre que les quelques bugs soient retirés avant de l'envoyer à votre pauvre administrateur système.
Note : Bon, cela fait maintenant deux mois que j'ai écrit ce message, et je n'ai rien entendu à propos de la sécurité de ce CGI, ni pour, ni contre. Alors, soit-il est sur et personne ne me l'a fait savoir, soit personne ne l'utilise :-) Par conséquent, je vous conseille de faire attention.
A la base, tout ce que vous avez à faire, c'est de prendre le script et de remplir quelques endroits.
Dans le script, on va essayer de :
dynip.pl
)
#!/usr/bin/perl
# Ecrit par Michael Driscoll <fenris@lightspeed.net>
# Les suggestions sont les bienvenues
require 5; # Requiert perl5
use CGI; # Ceci est le module CGI.pm, disponible sur tous les sites CPAN tels
# ftp://ftp.cdrom.com/pub/perl/CPAN/modules/by-module/CGI
# Remplir les trucs qui suivent
$givendomain = "domain.net"; # Mettez le domaine de votre FAI
# (Pour l'instant, ce sont les deux
# premières parties, mais cela peut
# être change en dessous avec le
# split())
$givenpassword = "potrzebie"; # Mettez le mot de passe à utiliser
$filename = "/some/path/to/my/index.html"; # Demandez à votre admin de mettre
# ici la page à mettre à jour
# Note à l'administrateur :
# le fichier devra avoir les
# droits en écriture pour l'uid
# de httpd, à moins que vous
# utilisiez la méthode suid
# d'Apache ou un autre truc
# (mais c'est pas recommandé)
# Ce qui suit joue avec les IP en utilisant la forme aaa.bbb.ccc.ddd
$higha = "255"; # Mettez ici le plus grand numéro de la partie aaa
# de votre FAI.
$lowa = "0"; # De même pour le plus petit numéro de la partie aaa.
# probablement la même que $higha vu que la majorité des
# FAI ne prennent pas plus qu'un domaine de classe A :-)
$highb = "255"; # Mettez la borne supérieure pour bbb.
$lowb = "0"; # La borne inférieure de bbb.
$highc = "255"; # Vous avez compris.
$lowc = "0"; #
$highd = "255"; #
$lowd = "0"; #
# on fait un lien entre $query et le module cgi.pm
$query = new CGI;
# $newip est la nouvelle IP du paramètre newip
$newip = $query->param("newip");
# $trypassword est la tentative de mot de passe à confronter avec $givenpassword
$trypassword = $query->param("password");
# $hostname est le nom d'hote à confronter avec $givendomain
$hostname = $query->remote_host;
# Verifier le mot de passe avant tout
unless ("$trypassword" eq "$givenpassword") {
print "Content-type: text/plain\n\n";
print "Sorry, wrong password\n";
exit;
}
# On découpe l'IP dans @IP
# On vire d'abord les caractères non numériques sauf le '.'
# on le splice() pour supprimer les trucs après les quatre premier points
# (Comment c'est arrivé là ?? De toute façon, j'essaye de le rendre aussi
# peu craquable que possible).
$newip =~ s/[^\d\.]//g;
@IP = split /\./, $newip;
splice(@IP, 4);
# On vérifie que l'IP est dans les bornes
unless (($lowa <= $IP[0]) &&
($lowb <= $IP[1]) &&
($lowc <= $IP[2]) &&
($lowd <= $IP[3]) &&
($higha >= $IP[0]) &&
($highb >= $IP[1]) &&
($highc >= $IP[2]) &&
($highd >= $IP[3])) {
print "Content-type: text/plain\n\n";
print "Sorry, that IP address doesn't seem to be within bounds\n";
exit;
}
# Maintenant, on vérifie le nom de l'hôte
# On le découpe dans @hostnamearray
@hostnamearray = split /\./, $hostname;
$dompart2 = pop @hostnamearray;
$dompart1 = pop @hostnamearray;
# On le vérifie
unless (("$dompart1"."\.$dompart2" eq "$givendomain") ||
("$hostname" eq "localhost")) {
# On affiche une erreur
print "Content-type: text/plain\n\n";
print "Sorry, you don't seem to have the right domain\n";
exit;
}
# Tout à l'air d'être OK, on va donc mettre en place la page
# Prenez garde aux trucs dans le style de #, \, $, @, %, et '
open(FILE, ">$filename") ||
die "dynip.pl cannot open $filename to write: $!";
flock(FILE, 2);
# Ici commence le HTML. $newip est notre nouvelle adresse IP.
print FILE "<html><head><title>Title etc.</title></head>\n\n";
print FILE "<body><h1>body here</h1><hr>\n";
print FILE "<p>blah blah blah\n";
print FILE "<p>And <a href=telnet://$newip>here</a> is a link to my ";
print FILE "current IP address.\n";
print FILE "</body></html>\n";
flock(FILE, 8);
close(FILE);
# On dit que tout s'est bien passé
print "Content-type: text/plain\n\n";
print "Setup was successful\n";
# Fin
Accéder au CGI quand la connection s'établis
Maintenant, tout ce que nous avons à faire est y accéder avec lynx dans notre /etc/ppp/ip-up
. La ligne suivante devrait le faire, utilisant le $4 de /etc/ppp/ip-up
comme nouvelle IP :
lynx -dump \
'http://www.votre-FAI.net/cgi-bin/dynip.pl?newip=$4&password=potrzebie' \
>> /etc/ppp/lynxlog
Mettez le mot de passe que vous avez choisis à la place de 'potrzebie'
, bien sur. Et assurez-vous de bien faire chmod 700 /etc/ppp/ip-up
quand c'est Ok, car il y a des informations sensibles dedans.
(Au fait, les \ sont juste utilisés pour que la commande tienne en 80 colonnes. Ils ne font qu'escaper les retours à la ligne pour que ce soit considéré comme une seule commande)
De plus, videz périodiquement le /etc/ppp/lynxlog
sinon, il va être très gros après quelque temps :-)
Voilà... C'est fait !