Posts tagged: system

Bash port scanner

Stavo facendo qualche esperimento con la shell, e leggendo un pò a caso in rete, ho provato a realizzare un semplice port scanner in bash scripting. Molti degli elementi su Linux funzionano come dei file, ovvero è possibile accedere in lettura per ottenere informazioni e in scrittura per aggiornare il loro stato. Un esempio è il file /dev/tcp/host/port, in particolare scrivendo su questo file speciale viene aperta una connessione TCP verso host:port. Se la scrittura su file ha successo allora la porta viene aperta, altrimenti la porta è chiusa. That's the trick !

for port in {1..65535}; do
  echo >/dev/tcp/devme.it/$port &&
    echo "Yes, I found that port $port is open" ||
    echo "Ops, I found that port $port is closed"
done

Il codice di sopra funziona esattamente come un port scanner con l'unico problema che se la porta risulta chiusa, la shell la rileva dopo circa un paio di minuti, il che rende in pratica poco utilizzabile lo script di sopra. La soluzione che ho trovato in rete è quella di realizzare una sorta di allarme che interrompe lo script se il tempo impiegato per analizzare una porta supera un certo limite, passato come parametro. Riporto il codice per completezza:

alarm() {
  perl -e  '
    eval {
      $SIG{ALRM} = sub { die };
      alarm shift;
      system(@ARGV);
    };
    if ($@) { exit 1 }
   ' "$@";
}

Volendo scrivere un comando completo, il tutto diventa:

scanme() {
  if [[ -z $1 || -z $2 ]]; then
    echo "Usage: $0 <host> <port> <port-range>"
    return
  fi
 
  local host=$1
  local ports=()
  case $2 in
    *-*)
      IFS=- read start end <<< "$2"
      for ((port=start; port <= end; port++)); do
        ports+=($port)
      done
      ;;
    *,*)
      IFS=, read -ra ports <<< "$2"
      ;;
    *)
      ports+=($2)
      ;;
  esac
 
 
  for port in "${ports[@]}"; do
    alarm 1 "echo >/dev/tcp/$host/$port" &&
    echo "Yes, I found that port $port is open" ||
    echo "Ops, I found that port $port is closed"
  done
}

Testando il comando di sopra si ha: scanme devme.it 80-92

#$> scan scanme 80-92 
Yes, I found that port 80 is open
Ops, I found that port 81 is closed
Ops, I found that port 82 is closed

Esiste poi un comando di sistema che consente di lanciare un comando con un time limit, timeout. Con questo comando il tutto diventa molto più semplice:

#$> timeout 1 bash -c "echo >/dev/tcp/$host/$port" &&
    echo "Yes, I found that port $port is open" ||
    echo "Ops, I found that port $port is closed"

Stay tuned!

Linux command cheat sheet

penguinBuon 2011 a tutti !!
Navigando per la rete ho trovato un interessante insieme di siti i quali elencavano alcune liste dei più diffusi comandi di linux. Ho pensato di raccoglierli e di creare il mio primo cheat sheet, in formato HTML, da pubblicare come articolo sulle pagine del mio blog…sai mai che possa interessare a qualcuno. Ci sono alcuni comandi di uso comune molto chiari, altri molto interessanti da usare solo se la tastiera è la naturale continuazione della proprio mani!

 

Commando Descrizione
apropos whereis Visualizza una descrizione sul comando indicato
man -t man | ps2pdf – > devme_man.pdf Crea un pdf dalla pagina del manuale richiesta
which ls Visualizza il percorso completo del comando
time make Calcola e visualizza il tempo impiego dall’esecuzione del comando
time cat Misura il tempo impiegato per la digitazione (es. scrittura di un testo)
Navigazione delle directory
cd - Vai alla directory precedente
cd Vai alla $HOME directory
(cd dir && command) Vai alla directory indicata, esegui il comando e ritorna alla directory corrente
pushd . Aggiungi allo stack la directory corrent.
pop Estrae dallo stack il percorso dell’ultima directory inserita e ci si sposta
Ricerca dei file
alias l=’ls -al –color=auto’ Elenca le directory facendo l’highlithing degli elementi
ls -lrt Elenca i file per data
find -name ‘*.[ch]‘ | xargs grep -E ‘devme’ Ricerca ‘devme’ a partire dalla directory corrente
find -type f -print0 | xargs -r0 grep -F ‘devme’ Ricerca i soli file che hanno al loro interno la stringa ‘devme’ a partire dalla directory corrente
find -maxdepth 1 -type f | xargs grep -F ‘devme’ Ricerca i soli file che hanno al loro interno la stringa ‘devme’ solo nella directory corrente
find -maxdepth 1 -type d | while read dir; do echo $dir; echo cmd2; done Elabora ciascuna directory trovata a partire dalla directory corrente, ed esegui i comandi contenuti all’interno del ciclo per ciascun elemento
find -type f ! -perm -444 Cerca i file non leggibili da tutti
find -type d ! -perm -111 Cerca i file non accessibili da tutti
locate -r ‘file[^/]*\.txt’ Cerca all’interno della cache tutti i file il cui nome fa match con: *file*.txt
Archiviazione e compressione
gpg -c file Critta il file di input
gpg file.gpg Decritta il file
tar -c dir/ | bzip2 > dir.tar.bz2 Crea un archivio compresso della directory dir/
bzip2 -dc dir.tar.bz2 | tar -x Estrae l’archivio usando gzip al posto di bzip2
tar -c dir/ | gzip | gpg -c | ssh user@remote ‘dd of=dir.tar.gz.gpg’ Crea un archivio compresso crittato della directory dir/ e lo invia sulla macchina remota
find dir/ -name ‘*.txt’ | tar -c –files-from=- | bzip2 > dir_txt.tar.bz2 Crea un archivio del contenuto di dir/
find dir/ -name ‘*.txt’ | xargs cp -a –target-directory=dir_txt/ –parents Crea una copia del contenuto della directory dir/
( tar -c /dir/to/copy ) | ( cd /target/ && tar -x -p ) Copia (preservando i permessi) la directory sorgente nella directory target
( tar -c /dir/to/copy ) | ssh -C user@remote ‘cd /target/ && tar -x -p’ Copia preservando i permessi copy/ dir to remote:/target/ dir
dd bs=1M if=/dev/sda | gzip | ssh user@remote ‘dd of=sda.gz’ Effettua il backup dell’hardisk sulla macchina remota
rsync
rsync -P rsync://rsync.server.com/target/file file Ottieni le differenze
rsync –bwlimit=1000 fromfile tofile Copia localmente fissando un limite del trasferimento. Ottimo per le operazioni di I/O
rsync -az -e ssh –delete ~/public_html/ remote.com:’~/public_html’ Effettua un mirron di un sito web (usa compressione e crittazione)
rsync -auz -e ssh remote:/dir/ . && rsync -auz -e ssh . remote:/dir/ Sincronizza la directory corrente con una remota
SSH
ssh $USER@$HOST command Esegui il comando command su $HOST come $USER (default command=shell)
ssh -f -Y $USER@$HOSTNAME xeyes Esegui un comando grafico (GUI) su $HOSTNAME come $USER
scp -p -r $USER@$HOST: file dir/ Copia preservando i permessi dalla home di $USER su $HOST in dir/
ssh -g -L 8080:localhost:80 root@$HOST Crea un tunnel SSH sulla porta locale 8080 verso la porta 80 remota
ssh -R 1434:imap:143 root@$HOST Crea un reverse tunnel SSH sulla porta locale 1434 verso la porta 143 remota
ssh-copy-id $USER@$HOST Installa la chiave pubblica di $USER su $HOST per effettuare login senza autenticazione
wget
(cd dir/ && wget -nd -pHEKk http://www.devme.it/downloadme.html) Scarica una versione navigabile della pagina nella directory corrente
wget -c http://www.devme.it/large.bin Effettua il resume di una risorsa scaricata precedentemente
wget -r -nd -np -l1 -A ‘*.jpg’ http://www.devme.it/dir/ Scarica l’insieme dei file indicati nella directory corrente
wget -q -O- http://www.devme.it/links.html | grep ‘a href’ | head Elabora l’output scaricato
echo ‘wget url’ | at 01:00 Scarica l’url alle 13 nella directory corrente
wget –limit-rate=20k url Effettua una download a bassa priorità
wget -nv –spider –force-html -i bookmarks.html Verifica i link all’interno del file
wget –mirror http://www.devme.it/ Aggiorna la copia locale di un sito web
Networking
ethtool eth0 Visualizza lo stato dell’interfaccia di rete eth0
ethtool –change eth0 autoneg off speed 100 duplex full Imposta manualmente la velocità dell’interfaccia di rete
iwconfig eth1 Visualizza lo stato dell’interfaccia wireless eth1
iwconfig eth1 rate 1Mb/s fixed Imposta manualmente la velocità dell’interfaccia di rete wireless
iwlist scan Elenca le reti wireless trovate
ip link show Visualizza l’elenco delle interfacce di rete
ip link set dev eth0 name wan Rinomia l’interfaccia eth0 in wan
ip link set dev eth0 up Attiva/Disattiva(down) l’interfaccia di rete
ip addr show Elenca gli indirizzi delle interfacce di rete
ip addr add 1.2.3.4/24 brd + dev eth0 Aggiunge o elimina (del) ip e la maschera (255.255.255.0)
ip route show Elenca la tabella di routing
ip route add default via 1.2.3.4 Imposta il default gateway
host www.devme.it Interroga il DNS per ottenere l’ip del dominio
hostname -i Ottiene l’indirizzo ip locale
whois pixelbeat.org Interroga il whois per ottenere le informazioni sull’hostname o l’indirizzo ip
netstat -tupl Elenca i servizi attivi sul sistema
netstat -tup Elenca le connessioni attive da/sul sistema

Stay tuned!

WordPress Themes