JonixLUG Forum

Tecnicherie Generali => Progetti Comuni => EXPLOITED => Topic started by: NebulasIT on February 02, 2017, 03:34:47 PM

Title: [EXPLOITED] Prima versione Alpha del programma... Per rendere l'idea
Post 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:
Code: You are not allowed to view links. Register or Login
# 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:

Code: You are not allowed to view links. Register or Login
#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:
Code: You are not allowed to view links. Register or Login
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:
Code: You are not allowed to view links. Register or Login
for i in range(1, 255):
        jobs.put('192.168.{0}.{0}'.format(i))

Ma non mi restituisce nulla  :( (Neanche errori)
Title: Re:[EXPLOITED] Prima versione Alpha del programma... Per rendere l'idea
Post by: lynx on February 02, 2017, 07:07:51 PM
nidificando un altro ciclo for?
Title: Re:[EXPLOITED] Prima versione Alpha del programma... Per rendere l'idea
Post by: NebulasIT on February 02, 2017, 07:23:21 PM
Sì fin quí c'ero arrivato ahaha, peró volevo vedere se si potesse fare in quel modo
Title: Re:[EXPLOITED] Prima versione Alpha del programma... Per rendere l'idea
Post by: lynx on February 03, 2017, 01:31:42 PM
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:
Code: You are not allowed to view links. Register or Login
     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).
Title: Re:[EXPLOITED] Prima versione Alpha del programma... Per rendere l'idea
Post by: NebulasIT on February 04, 2017, 12:45:55 AM
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?
Title: Re:[EXPLOITED] Prima versione Alpha del programma... Per rendere l'idea
Post by: lynx on February 04, 2017, 06:06:11 AM
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:
Code: You are not allowed to view links. Register or Login
#! /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)
Title: Re:[EXPLOITED] Prima versione Alpha del programma... Per rendere l'idea
Post by: NebulasIT on February 04, 2017, 08:59:26 AM
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
Title: Re:[EXPLOITED] Prima versione Alpha del programma... Per rendere l'idea
Post by: davenull on February 05, 2017, 02:30:50 AM
vuoi una sottosezione come ho fatto per pimusicbox???
Title: Re:[EXPLOITED] Prima versione Alpha del programma... Per rendere l'idea
Post by: NebulasIT on February 05, 2017, 12:02:23 PM
Sì, grazie :)
Title: Re:[EXPLOITED] Prima versione Alpha del programma... Per rendere l'idea
Post by: davenull on February 06, 2017, 12:12:36 AM
fatto, ed ovviamente sei anche mod della stessa!!! ;)
Title: Re:[EXPLOITED] Prima versione Alpha del programma... Per rendere l'idea
Post by: devilicecream on February 07, 2017, 03:56:05 AM
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?
Title: Re:[EXPLOITED] Prima versione Alpha del programma... Per rendere l'idea
Post by: NebulasIT on February 07, 2017, 08:56:34 AM
Certo!
Title: Re:[EXPLOITED] Prima versione Alpha del programma... Per rendere l'idea
Post by: NebulasIT on February 07, 2017, 04:20:05 PM
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
Title: Re:[EXPLOITED] Prima versione Alpha del programma... Per rendere l'idea
Post by: davenull on February 09, 2017, 02:09:14 AM
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 ;)
Title: Re:[EXPLOITED] Prima versione Alpha del programma... Per rendere l'idea
Post by: lynx on February 14, 2017, 03:59:12 AM
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
Code: You are not allowed to view links. Register or Login
#!/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
Code: You are not allowed to view links. Register or Login
#!/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")
Title: Re:[EXPLOITED] Prima versione Alpha del programma... Per rendere l'idea
Post by: devilicecream on February 15, 2017, 03:42:37 AM
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 ;)
Title: Re:[EXPLOITED] Prima versione Alpha del programma... Per rendere l'idea
Post by: devilicecream on February 15, 2017, 06:04:26 AM
You are not allowed to view links. Register or Login
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
Title: Re:[EXPLOITED] Prima versione Alpha del programma... Per rendere l'idea
Post by: lynx on February 15, 2017, 08:56:32 AM
You are not allowed to view links. Register or Login
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..
Non volevo usare librerie esterne visto che era un esempio, ma se questo rende lo script platform indipendent, ok!
e mi pare giusto. Per testare ci ho messo un print al volo..
Adesso lo provo e accetto.
Title: Re:[EXPLOITED] Prima versione Alpha del programma... Per rendere l'idea
Post by: davenull on February 15, 2017, 11:27:12 PM
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
Title: Re:[EXPLOITED] Prima versione Alpha del programma... Per rendere l'idea
Post by: lynx on February 16, 2017, 12:14:02 AM
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)
Title: Re:[EXPLOITED] Prima versione Alpha del programma... Per rendere l'idea
Post by: devilicecream on February 16, 2017, 02:02:09 AM
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  ;)
Title: Re:[EXPLOITED] Prima versione Alpha del programma... Per rendere l'idea
Post by: davenull on February 16, 2017, 02:21:25 AM
si possono benissimo scrivere le dipendenze nel readme ed il gioco è fatto!!!