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