|
|
@@ -0,0 +1,97 @@ |
|
|
|
#!/usr/bin/env python |
|
|
|
|
|
|
|
|
|
|
|
import socket |
|
|
|
import sys |
|
|
|
from Crypto.Cipher import AES |
|
|
|
import base64 |
|
|
|
import random |
|
|
|
import threading |
|
|
|
|
|
|
|
key="fhgjkleopmlk,hgj" |
|
|
|
enc = AES.new(key[:32]) |
|
|
|
chaine = 'abcdefghijklmnopqrstuvwxyz' |
|
|
|
fichier_zone = "/etc/bind/zones/db.debugo.fr.extra" |
|
|
|
change = 0 |
|
|
|
|
|
|
|
def encrypt(clear): |
|
|
|
temp = (str(clear) + (AES.block_size - len(str(clear)) % AES.block_size) * "\0") |
|
|
|
crypt = base64.b64encode(enc.encrypt(temp)) |
|
|
|
return crypt |
|
|
|
|
|
|
|
def decrypt(crypt): |
|
|
|
temp = enc.decrypt(base64.b64decode(crypt)) |
|
|
|
clear = temp.rstrip("\0") |
|
|
|
return clear |
|
|
|
|
|
|
|
class ClientThread(threading.Thread): |
|
|
|
def __init__(self, ip, port, clientsocket): |
|
|
|
threading.Thread.__init__(self) |
|
|
|
self.ip = ip |
|
|
|
self.port = port |
|
|
|
self.clientsocket = clientsocket |
|
|
|
|
|
|
|
def run(self): |
|
|
|
# print("Connection de %s sur le port %s" % (self.ip, self.port, )) |
|
|
|
# Random sur la chaine |
|
|
|
l = list(chaine) |
|
|
|
random.shuffle(l) |
|
|
|
random_chaine = ''.join(l) |
|
|
|
# Envoi de la chaine randomisee au client |
|
|
|
# print ("J'envoie la chaine randomise au client : %s" % (random_chaine)) |
|
|
|
self.clientsocket.send(encrypt(random_chaine)) |
|
|
|
# Choix d'un chiffre au hasard et d'une lettre en fonction |
|
|
|
random_indice = random.randint(1,26) |
|
|
|
random_carac = random_chaine[random_indice] |
|
|
|
self.clientsocket.send(encrypt(random_carac)) |
|
|
|
# print ("Je veux l'indice du caractere : %s" % (random_carac)) |
|
|
|
# print ("Le client doit donc me renvoyer : %s" % (random_indice)) |
|
|
|
# Reception |
|
|
|
r = decrypt(self.clientsocket.recv(2048)) |
|
|
|
# print ("Le client a envoye : %s" % (r)) |
|
|
|
if int(r) == int(random_indice): # Si le client a bien repondu |
|
|
|
fichier=open(fichier_zone, 'r') # on ouvre le fichier |
|
|
|
new_line=[] # on prepare une liste vide qui va contenir les changements |
|
|
|
for line in fichier: # on lit chaque ligne |
|
|
|
item = line.split() # chaque element de la ligne est mis dans une liste |
|
|
|
if "Serial" in item: # si un des items est le mot serial |
|
|
|
item[0] = int(item[0]) + 1 # on incremente |
|
|
|
item[0] = "\t"+str(item[0]) # on rajoute la tabulation devant |
|
|
|
s = "\t" |
|
|
|
line = s.join(item)+"\n" # on reforme la ligne |
|
|
|
if "home" in item: # si un des items est le mot home |
|
|
|
if item[3] != self.ip : # Si IP differente |
|
|
|
change = 1 |
|
|
|
item[3] = self.ip+"\n" |
|
|
|
s = "\t" |
|
|
|
line = s.join(item) |
|
|
|
new_line.append(line) |
|
|
|
if change == 1 : |
|
|
|
# deplacere l'ancien fichier en old |
|
|
|
# deplacer le nouveau fichier |
|
|
|
# relancer bind |
|
|
|
newfichier = open('/srv/new.txt', 'w') |
|
|
|
for nw in new_line : |
|
|
|
newfichier.write(nw) |
|
|
|
# Copie de l'ancien fichier vers un backup |
|
|
|
|
|
|
|
# Deplacer le nouveau fichier |
|
|
|
|
|
|
|
# Recharger Bind |
|
|
|
|
|
|
|
fichier.close |
|
|
|
else : |
|
|
|
error = 1 |
|
|
|
|
|
|
|
tcpsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) |
|
|
|
tcpsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) |
|
|
|
tcpsock.bind(("",79)) |
|
|
|
|
|
|
|
while True: |
|
|
|
tcpsock.listen(5) |
|
|
|
# print( "En ecoute") |
|
|
|
(clientsocket, (ip, port)) = tcpsock.accept() |
|
|
|
newthread = ClientThread(ip, port, clientsocket) |
|
|
|
newthread.start() |
|
|
|
|
|
|
|
tcpsock.close() |