JonixLUG Forum
Tecnicherie Generali => Progetti Comuni => EXPLOITED => Topic started by: NebulasIT on February 02, 2017, 03:34:47 PM
-
Ragazzi, come richiesto ho fatto un profilo Git adatto,e ho postato il codice... Ho strutturato una base di quello che sarà Exploited... Un coltellino svizzero dell'IT.
Per ora presenta solo un ping sweep, successivamente con il tempo vorrei facesse Scanning dei servizi, Sniffing e Poi ricerca di Exploit... Insomma diciamo che vado fin dove la fantasia mi porti, nelle prime versioni reinventato la ruota ahah, giusto per capire veramente come funzionano tools più professionali ;), per poi avere le skills di crearne di mie, quindi prime versioni del programma per me sono una sfida, un motivo in più per essere più bravo, a capire come funzionano i tools e saperne creare all'esigenza. Dopo questa premessa ecco il Codice:
# main.py - PROGRAMMA PRINCIPALE
# Librerie definite dall'utente
import ping_sweep
# Librerie del Python3
import sys
import os
import time
import argparse
def wall():
os.system("clear")
print("""@@@@@@@@ @@@ @@@ @@@@@@@ @@@ @@@@@@ @@@ @@@@@@@ @@@@@@@@ @@@@@@@
@@@@@@@@ @@@ @@@ @@@@@@@@ @@@ @@@@@@@@ @@@ @@@@@@@ @@@@@@@@ @@@@@@@@
@@! @@! !@@ @@! @@@ @@! @@! @@@ @@! @@! @@! @@! @@@
!@! !@! @!! !@! @!@ !@! !@! @!@ !@! !@! !@! !@! @!@
@!!!:! !@@!@! @!@@!@! @!! @!@ !@! !!@ @!! @!!!:! @!@ !@!
!!!!!: @!!! !!@!!! !!! !@! !!! !!! !!! !!!!!: !@! !!!
!!: !: :!! !!: !!: !!: !!! !!: !!: !!: !!: !!!
:!: :!: !:! :!: :!: :!: !:! :!: :!: :!: :!: !:!
:: :::: :: ::: :: :: :::: ::::: :: :: :: :: :::: :::: ::
: :: :: : :: : : :: : : : : : : : : :: :: :: : :
\n\nWe will never be like the zombies of a botnet""")
def descr_wall():
print("""
////////////////////////////////////////
/ LIST OF PARAMETERS /
////////////////////////////////////////
/ /
/ -Ps -> Ping Sweep /
/ /
/ /
/ Work in Progress /
/ /
////////////////////////////////////////
\n\n""")
def main():
wall()
descr_wall()
# Chiamata a moduli Esterni (Caricati dall'utente)
parser = argparse.ArgumentParser()
parser.add_argument("-Ps", "--PingSweep",
help="Establish a range of IP addresses which map to live hosts.", action="store_true")
args = parser.parse_args()
if args.PingSweep:
ping_sweep.ping_sweepone()
if __name__ == '__main__':
main()
Ed ecco ora il modulo caricato del ping sweep:
#PING SWEEP MODULO
import multiprocessing
import subprocess
import os
def ping_sweepone():
pool_size = 255
jobs = multiprocessing.Queue()
results = multiprocessing.Queue()
pool = [multiprocessing.Process(target=pinger, args=(jobs, results))
for i in range(pool_size)]
for p in pool:
p.start()
for i in range(1, 255):
jobs.put('192.168.1.{0}'.format(i))
for p in pool:
jobs.put(None)
for p in pool:
p.join()
while not results.empty():
ip = results.get()
print(ip)
def pinger(job_q, results_q):
DEVNULL = open(os.devnull, 'w')
while True:
ip = job_q.get()
if ip is None:
break
try:
subprocess.check_call(['ping', '-c1', ip],
stdout=DEVNULL)
results_q.put(ip)
except:
pass
Codice Github: https://github.com/NebulasIT/EXPLOITED (https://github.com/NebulasIT/EXPLOITED)
Per chi mi volesse dare una mano, ho un paio di domande:
for i in range(1, 255):
jobs.put('192.168.1.{0}'.format(i))
In questo for effettuo la richiesta ICMP degli indirizzi 192.168.1...255, però come potrei fare per far in modo che sia 192.168.1...255.1...255?, ho provato con:
for i in range(1, 255):
jobs.put('192.168.{0}.{0}'.format(i))
Ma non mi restituisce nulla :( (Neanche errori)
-
nidificando un altro ciclo for?
-
Sì fin quí c'ero arrivato ahaha, peró volevo vedere se si potesse fare in quel modo
-
Non è che non restituisce nulla, sta elaborando più combinazioni, prova a mettere un range da 1 a 2 per le prove.. ma il metodo non è quello.
Se non hai trovato una soluzione, ci guardiamo meglio dopo.
Cmq se devi usare i parametri, sta male che se non li aggiungi ti chiude il programma in faccia,
dopo ti faccio un commit su github (speriamo che stavolta fanno almeno un backup :P).
basta aggiungere un else al ciclo if della riga 52 nel main.py tipo:
if args.PingSweep:
ping_sweep.ping_sweepone()
else:
print("""Please, add a parameter (E.g -Ps)""")
Poi specifica nel readme che verisone di python usare (anche se si capisce).
-
Vaa bene! Comunque pensavo di splittare l'ip,sarebbe piú comodo inserire l'ip manualmente, in alternativa si potrebbero mettere dei For con dei range prefissati, comunque si sto cambiando il codice sempre... Perchè voglio che sia veloce (perció usare: multiprocessing), comunque io ho ritmi abbastanza veloci e contrastanti... Non ho mai lavorato su un codice con qualcuno essenzialmente, non vorrei che lavorassi su qualcosa che ho giá cambiato nello stesso momento ahaha, Secondo te meglio se facciamo un ip da inserimento manuale? Oppure ping sweep automatico al lancio del comando? Nel senso che non specifichi l'ip ma esamina soltanto quelli che stanno nei range del codice, tipo : 192.169.*.* oppure 10.100.*.*, insomma queste cose, tu che dici?
-
Prima di scrivere codice, devi avere un algoritmo in testa, anche se poi viene stravolto durante la stesura.
Premetti che noi comunemente usiamo routers con LAN e indirizzi di classe C, che di solito hanno questa forma 192.168.x.y ma è solo una convenzione portata a standard.
Non è detto che tu debba usare il programma solo nel range della classe C di un router casalingo o d'ufficio, per cui sarebbe sensato (visto che per eseguirlo devi essere connesso) fare un'analisi della rete per trovare il tuo IP e la netmask per poi calcolare il CIDR (chiedi a davenull se ha già scritto qualcosa) e restringere esponenzialmente il range degli IP (visto che non vuoi fare rumore..).
Almeno così riesci a vedere gli instradamenti automatici, se poi c'è un router.. è un'altra storia.
Quindi..
Si, sarebbe meglio dividere l'ip(v4) in 4 ottetti e selezionare solo alcuni range.
No, non serve inserire manualmente l'ip se lo puoi trovare con python stesso..
Questo è un esempio per estrarre le informazioni necessarie:
#! /usr/bin/env python3
#Find local IP, netmask and hostname's IPs
#you must use superuser powers #
import itertools
import os
import re
def get_ip():
f = os.popen('ifconfig')
for iface in [' '.join(i) for i in iter(lambda: list(itertools.takewhile(lambda l: not l.isspace(),f)), [])]:
if re.findall('^(eth|wlan)[0-9]',iface) and re.findall('RUNNING',iface):
ip = re.findall('(?<=inet\saddr:)[0-9\.]+',iface)
if ip:
return ip[0]
return False
my_ip = get_ip()
print("""This is your local IP """)
print(my_ip)
def get_netmask():
f = os.popen('ifconfig')
for iface in [' '.join(i) for i in iter(lambda: list(itertools.takewhile(lambda l: not l.isspace(),f)), [])]:
if re.findall('^(eth|wlan)[0-9]',iface) and re.findall('RUNNING',iface):
nm = re.findall('(?<=Mask:)[0-9\.]+',iface)
if nm:
return nm[0]
return False
my_nm = get_netmask()
print("""This is your netmask """)
print(my_nm)
ips = os.popen('hostname --all-ip-addresses')
my_ips = ips.read()
print("""Those are your hostname's IPs """)
print(my_ips)
-
Giusto! Allora ora aggiungo l'auto detect dell'ip(v4), ne derivo la classe, divido in 4 blocchi, e in base ad essa faccio i range dell'ip
-
vuoi una sottosezione come ho fatto per pimusicbox???
-
Sì, grazie :)
-
fatto, ed ovviamente sei anche mod della stessa!!! ;)
-
Concordo con Dario sul problema di verificare prima lo spazio di indirizzi su cui andare a fare il ping sweep.
Modificando leggermente il codice che ha postato proprio Dario dovrebbe essere semplice integrare questa funzionalità.
Per quanto riguarda la tua paura di mettersi a lavorare in concorrenza sulle stesse features, su github ci sono varie maniere per gestire la cosa. La mia preferita (e una delle più utilizzate nei grandi progetti open source) è questa:
1. Chiunque identifichi una feature aggiuntiva o una falla, aggiunge una nuova issue (https://guides.github.com/features/issues/ (https://guides.github.com/features/issues/)).
2. Se ne discute sul topic dedicato, quindi si sceglie una persona che ci lavora su, che diventa assignee della issue.
3. L'assignee, e solo lui, forka l'intero repository e lavora sull'implementazione del bugfix/nuova feature. Tutte le comunicazioni riguardanti quel problema vengono fatte sul topic di quella issue su github.
4. Quando ha finito, l'assignee fa una pull request sul repo principale, aggiungendo nel commento una reference alla issue originale.
5. Se ci sono problemi nel merge automatico, o se si vogliono fare altre aggiunte, si ricomincia dalla 3. altrimenti si prosegue fa il merge della nuova feature/bugfix e si chiude la issue.
Ti apro una issue con il problema evidenziato da Dario, proviamo a seguire questo flow?
-
Certo!
-
Mi sto trovando un pò in difficoltà, allora la mia intenzione è di sviluppare il ping sweep così:
Esempio:
192.168.1.0 IP
255.255.0.0 SUBNETMASK
recuperati in automatico, quindi variano
splittare IP e Subnet
x1=192
x2=168
x3=1
x4=0
s1=255
s2=255
s3=0
s4=0
Confrontare se s3 e s4 sono 0: significa che i valori da incrementare fino a 255 sono x3 e x4,e ciò farlo in for.
E qui mi incasino :P
-
da qualche parte nel pc ho un mezzo progetto iniziato per il cidr calculator scritto in bash, devo trovarlo, commentarlo per bene e lo posto, così ti levi sta rogna ;)
-
Lascia stare gli ottetti, come ti scrivevo, bisogna ottenere il proprio indirizzo di rete ed elaborarlo seguendo alcuni accorgimenti.
Va calcolato il numero di host nella rete e bisogna escludere lo 0 e il 255. Non ha senso tentare di pingare indirizzi fuori dalla subnet.
Ma questo non rientra propriamente nel campo della programmazione, è lecito non saperlo, riguarda più i net-admins
(anche se saperlo può fare la differenza).
Per l'occasione ho fatto ping_network e netinfo:
https://github.com/dariolynx/ping_network.git (https://github.com/dariolynx/ping_network.git)
Puoi prendere spunto o usarli aggiungendo il multiprocessing,
oppure inserendoli nel progetto EXPLOITED se vuoi.. fai te.
Li ho fatti anche per @devilicecream che adesso, per supportarci, minimo ci deve mettere una stelletta :)
e aprire un sacco di issue per i bugs :-X
Questo è il codice di netinfo.py
#!/usr/bin/env python3
# Import builtin modules
import itertools
import os
import re
# Check super user privileges
if os.geteuid() != 0:
if not 'SUDO_UID' in os.environ.keys():
print("you must use super user powers, try sudo next")
exit(1)
# Functions
# Get local IP from ifconfig
def get_ip():
f = os.popen('ifconfig')
for iface in [' '.join(i) for i in iter(lambda: list(itertools.takewhile(lambda l: not l.isspace(),f)), [])]:
if re.findall('^(eth|wlan)[0-9]',iface) and re.findall('RUNNING',iface):
ip = re.findall('(?<=inet\saddr:)[0-9\.]+',iface)
if ip:
return ip[0]
else:
print("""Warning you are not connected""")
exit(0)
return False
# Example
#my_ip = get_ip()
#print("""This is your local IP """)
#print(my_ip)
# Get netmask from ifconfig
def get_netmask():
f = os.popen('ifconfig')
for iface in [' '.join(i) for i in iter(lambda: list(itertools.takewhile(lambda l: not l.isspace(),f)), [])]:
if re.findall('^(eth|wlan)[0-9]',iface) and re.findall('RUNNING',iface):
nm = re.findall('(?<=Mask:)[0-9\.]+',iface)
if nm:
return nm[0]
return False
# Example
#my_nm = get_netmask()
#print("""This is your netmask """)
#print(my_nm)
# Get broadcast IP froma ifconfig
def get_Bcast():
f = os.popen('ifconfig')
for iface in [' '.join(i) for i in iter(lambda: list(itertools.takewhile(lambda l: not l.isspace(),f)), [])]:
if re.findall('^(eth|wlan)[0-9]',iface) and re.findall('RUNNING',iface):
Bcast = re.findall('(?<=Bcast:)[0-9\.]+',iface)
if Bcast:
return Bcast[0]
return False
# Example
#my_Bcast = get_Bcast()
#print("""This is your broadcast """)
#print(my_Bcast)
# Get all IP from hostname
ips = os.popen('hostname --all-ip-addresses')
# Example
#my_ips = ips.read()
#print("""Those are your hostname's IPs """)
#print(my_ips)
Questo è il codice di ping_network.py
#!/usr/bin/env python3
# Import user's modules
from netinfo import *
# Import builtin modules
import subprocess
import ipaddress
# Returns an iterator over the usable hosts in the network.
# The usable hosts are all the IP addresses that belong to the network,
# except the network address itself and the network broadcast address.
all_hosts = list(ipaddress.IPv4Interface(get_ip() + '/' + get_netmask()).network.hosts())
# For each IP address in the subnet, run the ping command
for i in range(len(all_hosts)):
output = subprocess.Popen(['ping', '-c', '1', '-W 10', str(all_hosts[i])], stdout=subprocess.PIPE).communicate()[0]
if "Destination Host Unreachable" in output.decode('utf-8'):
pass
# print(str(all_hosts[i]), "is Offline -> Destination Host Unreachable")
elif "Request timed out" in output.decode('utf-8'):
print(str(all_hosts[i]), "is Offline -> Request timed out")
else:
print(str(all_hosts[i]), "is Online")
-
Mi piace quello che hai fatto Dario, e infatti la stelletta te l'ho messa! Ci sono un po' di cose da migliorare però, ci sto dando un'occhiata sulla mia VM ubuntu ;)
-
Per l'occasione ho fatto ping_network e netinfo:
https://github.com/dariolynx/ping_network.git (https://github.com/dariolynx/ping_network.git)
Puoi prendere spunto o usarli aggiungendo il multiprocessing,
oppure inserendoli nel progetto EXPLOITED se vuoi.. fai te.
Li ho fatti anche per @devilicecream che adesso, per supportarci, minimo ci deve mettere una stelletta :)
e aprire un sacco di issue per i bugs :-X
Aperto issue e pull request! :P
-
Mi piace quello che hai fatto Dario, e infatti la stelletta te l'ho messa! Ci sono un po' di cose da migliorare però, ci sto dando un'occhiata sulla mia VM ubuntu ;)
C'è sempre qualcosa da migliorare ;) grazie per il feedback.
Anzi, qua c'è da imparare!
Insomma, la creatura, diventa un programma..
- Using netifaces to improve platform independency
Non volevo usare librerie esterne visto che era un esempio, ma se questo rende lo script platform indipendent, ok!
- Checking ping return code instead of parsing the output
e mi pare giusto. Per testare ci ho messo un print al volo..
Adesso lo provo e accetto.
-
miraccomando, usate sempre i sottoprogrammi. vi semplificano la vita!!! sia nel debug e sia per fare un deploy di un tool standalone e non pieno di files.
sono per i programmi standalone se non l'avete capito!!! :D
-
Infatti, il primo script funzionante d'esempio, lo potevo mettere su un unico file con i sottoprogrammi e,
dato che sarebbe servito al raspi o su una distro basata su debian, bastava scrivere l'output in un file o elaborarlo direttamente (tanto ormai sono caricati i moduli per le chiamate di sistema e si è gia superuser).
Però giustamente una cosa fatta "ad arte" e con la portabilità su altri OS, a costo di usare una libreria esterna da allegare, è più completa.
Se si vuole far meglio si può usare il multiprocessing e il ping random invece che sequenziale.
Anzi, bisognerebbe prima fare uno schemino di quel che si vuole ottenere per trovare la via migliore. (ad esempio capire come "non fare rumore" e quali precauzioni prendere per non floodare e farsi sbattere fuori)
-
La soluzione aggiornata è portabilissima! La libreria aggiuntiva (è hostata su bitbucket) consiste in pratica di due file, uno in C e uno in python. Volendo si può tirare giù ed utilizzarla dal source code, senza basarsi su pip per gestire la dipendenza.
Il fatto che ora sia tutto in un modulo python rende la soluzione stessa un "sottoprogramma": una volta installato il pacchetto in una env, basta importare la funzione main per eseguire i ping, o la classe NetworkProperties da sola per ottenere un oggetto che contiene tutte le informazioni sulle interfacce di rete ;)
-
si possono benissimo scrivere le dipendenze nel readme ed il gioco è fatto!!!