ot Vladsun(30-10-2006)

reiting (27)   [ dobre ]  [ zle ]

Printer Friendly Variant za otpechatvane

TSelta na statiiata e da opishe nachin za distantsionno i otvariane/zatvariane na opredeleni portove pri tova s visoko nivo na sigurnost. Izpolzva se tehnika narechena v literaturata kato "port knocking", t.e. chrez strogo opredelena kombinatsiia ot opiti za vruzki kum opredeleni portove na otdalechenata mashina se promeniat pravilata na zashtitnata i stena, kato po tozi nachin se dava dostup do opredeleni survurni prilozheniia.
Po sushtestvo opisanata tehnika mozhe da se izpolzva za mnogo i razlichni tseli, no tuk shte razgledame prilozhenieto i za protivodeistvie sreshtu ataki nasocheni kum SSH prilozheniiata. Povecheto administratori vizhdat ogromni logove za neuspeshni (dai bozhe;) ) opiti za SSH login chrez izpolzvane na slabi paroli i chesto sreshtani potrebitelski imena. S uvelichavaneto na broia na potrebitelite, koito se nuzhdaiat ot SSH dostup do konzolata se uvelichava i veroiatnostta ot probiv. Nai-lesnoto reshenie bi bilo da se otkazva TCP vruzka na sluchainite potrebiteli (prim. po IP adres), no tova bi bilo svurzano s nedostatuchno dobra guvkavost na upravlenieto na potrebitelite. Poradi tova smiatam, che predlozhenoto tuk reshenie (ili po-skoro implementatsiia na reshenieto - ideiata ne e moia :) ) e dosta po-dobro po otnoshenie kakto na sigurnost, taka i na guvkavost. Vse pak, realizatsiiata sus sigurnost ne e idealna i podlezhi na promiana.

Sistemni iziskvaniia
Ideiata e realiziran chrez izpolzvane na Perl modulite i iptables s dobaven "recent match".

Instalirane i upotreba
Na otdalechenata mashina (kum koiato iskame da se svurzhem) se kopirat slednite dva Perl faila:

knockoff.pl
#!/usr/bin/perl
 
 $exist = `iptables -nL INPUT | grep SSH_KNOCK`;
 
 if ($exist ne '')
 {
         `iptables -D INPUT -m state --state NEW -p tcp -j SSH_KNOCK`;
         `iptables -F SSH_KNOCK`;
         `iptables -X SSH_KNOCK`;
         print "[+] Port knocking rules deactivated.\n";
 }
 else
 {
         print "[-] Port knocking rules have been already deactivated.\n";
 }


knockon.pl
#!/usr/bin/perl
 
 if (@ARGV < 1) {         
         print "Usage:\r\n";         
         print "Specify passkey! \r\n\r\n";
         exit(); 
 }   
 $port = 0;  
 srand($ARGV[0]);  
 $exist = `iptables -nL INPUT | grep SSH_KNOCK`;  
 if ($exist ne '') {   
         `iptables -F SSH_KNOCK`; 
 } else { 
         `iptables -N SSH_KNOCK`;
         `iptables -I INPUT -m state --state NEW -p tcp -j SSH_KNOCK`; 
 }  
 `iptables -A SSH_KNOCK -p tcp --dport 22 -m recent --rcheck --name SSHK -j ACCEPT`;
 `iptables -A SSH_KNOCK -m recent --rcheck --name SSHK -j RETURN`; 
 # A potential bug here - not checking if there are successive random generated port numbers 
 for ($i=0; $i<5; $i++) {         
         $port = int(rand(40000) + 1024);
         $prev_port = $port - 1;
         $next_port = $port + 1; 
         `iptables -A SSH_KNOCK -p tcp --dport $port -m recent --name SSHK --set -j DROP`;         
         `iptables -A SSH_KNOCK -p tcp --dport $prev_port -m recent --name SSHK --remove -j DROP`;         
         `iptables -A SSH_KNOCK -p tcp --dport $next_port -m recent --name SSHK --remove -j DROP`; 
 }
 `iptables -A SSH_KNOCK -p tcp --dport 22 -j DROP`;  
 print "[+] Port knocking rules activated.\n"; 


A na lokalnata mashina se kopira faila:

knock.pl
#!/usr/bin/perl
 
 use IO::Socket;
 
 if (@ARGV < 2) {         
         print "Usage:\r\n";         
         print "Specify host !\r\n";
         print "Specify passkey! \r\n\r\n";
         exit(); 
 }
 $serv = $ARGV[0];
 $serv =~ s/http:\/\///ge;
 $port = 0;
 srand($ARGV[1]);
 for ($i=0; $i<5; $i++) {
         $port = int(rand(40000)+1024);
         $sock = IO::Socket::INET->new(Proto=>"tcp", PeerAddr=>"$serv", PeerPort=>"$port", Timeout=>"1");
         close($sock);
 }
 
 print "[+] Port knocking finished.\n";
 
 $sock = IO::Socket::INET->new(Proto=>"tcp", PeerAddr=>"$serv", PeerPort=>"22")
 or die "[-] Port 22 - SSH NOT open.\n";
 close($sock);
 print "[+] Post 22 - SSH is now open.\n";


Za puskaneto na opisanata zashtitna sistema se izpulniava na otdalechenata mashina:

knockon.pl 12345
kudeto 12345 e poreditsa ot chisla, koiato shte se izpolzva za razreshavane na dostupa ot lokalnata mashina. Sled izpulniavaneto na tazi komanda port 22 pri skanirane se opredelia kato "filtriran" i SSH vruzka ne mozhe da se osushtestvi.

Za da se razreshi SSH dostupa ot lokalnata mashina se puska:

knock.pl 12345
TSifrovite nizove triabva da sa ednakvi za da se poluchi razreshenie.
S tova port 22 na otdalechenata mashina e otvoren pri tova samo za IP adresa, ot koito sme poiskali razreshenie za dostup. Za da aktivirame zashtitata otnovo e neobhodimo predi da izlezem ot shela da startirame pak:
knockon.pl 12345
Zashtitata e taka napravena, che pri posledovatelno skanirane na portove da ne se dava dostup. Pri skanirane sus sluchaino izbran red na portovete veroiatnostta za davane na dostup e izklyuchitelno malka.

Problemi za koito se znae:

1) Za da se startira zashtitata ot drug potrebitel osven root e neobhodimo da se dadat prava za izpulnenie na iptables kato root - prim. sus sudo ili chrez chmod 6755, koeto ne e dobre :(
2) Mozhe da se poluchi pripokrivane na razreshavashtite i zabraniavashtite portove pri generiraneto na psevdo-sluchainata poreditsa - izberete drug kod :)


<< Kak da formatirame Windows dialove | amaroK - next generation multimedia player >>