Rechercher dans ce blog

mercredi 9 décembre 2015

Secret SSH

Secret SSH 



SecretSSH est un petit programme en perl qui permet juste de montrer la
faisabilité d'une idée amusante : cacher sshd et l'activer à distance à
la demande.

Il permet de répondre à ma manière aux personnes qui ont peur du
débordement de buffer ou de la trappe dans un serveur SSH ;-)

L'activation de sshd se fait sur la réception d'un paquet TCP possédant des
caractéristiques particulières. Ainsi, le démon sshd n'est pas toujours en
écoute sur le réseau et à distance il est impossible (?) de le trouver.

Il est possible d'envisager un tel programme pour administrer une machine
aidant à la détection d'intrusion avec SNORT par exemple. Il est alors
possible de fermer tous les services sur cette machine même le port 22/tcp.

Le programme suivant n'est qu'une illustration permettant de montrer ce qui
est faisable mais il est fourni sans aucune garantie.

Pour tester secretssh (fourni ci-dessous) :

. Sur le serveur (en tant que root) : ./secretssh.pl

. Sur le client (en tant que root) : ./secretssh.pl [login@]server

secretssh nécessite perl RawIP qui peut être téléchargé à l'adresse :
http://quake.skif.net/RawIP/files/Net-RawIP-0.09c.tar.gz

Dans la configuration initiale, le client envoi un paquet SYN tcp sur le
port 80 du serveur avec le champ id, l'adresse ip source, le port source et
le numéro de séquence fixés à certaines valeurs. A la réception de ce paquet
le serveur lance sshd en mode debug sur le port 2222/tcp. Le client se connecte
ensuite via ssh sur le port 2222/tcp du serveur. Ce port n'est accessible sur
le serveur que pour une seule connexion ssh.


#------------------------------------------------------------------------------
#!/usr/local/bin/perl
# secretssh - sa/hsc

# RawIP homepage: http://quake.skif.net/RawIP/files/Net-RawIP-0.09c.tar.gz
use Net::RawIP;
## CONF (you should edit all these params) #####
my $key_port_dst = '80';
my $key_ip_src = '192.168.66.66';
my $key_port_src = '1666';
my $key_ip_id = '666';
my $key_tcp_seq = '66666666';
my $verbose = 0;
my $bindport = 2222;
my $SSH = '/usr/local/bin/ssh';
my $SSHD = '/usr/local/sbin/sshd';
## MAIN ########################################
print " --== Secret SSH - sa/hsc ==--\n";
$a = new Net::RawIP;
my $remote = shift || "";
if( $remote=~/\S/ ) { #client
my $login="";
if($remote=~/^(\S+@)(\S+)$/) {$login=$1; $remote=$2;}
$a->set({ip=>{id=>$key_ip_id,saddr=>$key_ip_src,daddr =>$remote},
tcp=>{dest=>$key_port_dst,source=>$key_port_src,syn=>1,seq=>$key_tcp_seq}});
$a->send;
$verbose ? exec "$SSH", '-v', '-p', "$bindport", "${login}${remote}"
: exec "$SSH", '-p', "$bindport", "${login}${remote}";
}
else { #server
my $dev = Net::RawIP::lookupdev($tout);
print "Server using $dev and port $bindport ...\n" if($verbose);
$pcap=$a->pcapinit($dev,"tcp and src host $key_ip_src and src port $key_port_src".
" and ip[4:2] = $key_ip_id and ip[24:4] = $key_tcp_seq",1500,30);
loop $pcap,-1,\&Bindsshd,\@a;
}
## FUNC #########################################
sub Bindsshd { system "$SSHD", '-d', '-p', "$bindport"; }
## EOF ##########################################
#------------------------------------------------------------------------------

Aucun commentaire:

Enregistrer un commentaire