Nu stiu daca e locul potrivit pentru ce vreau sa pun, avand in vedere ca e mai mare decat un snipet, dar e un script util care probabil v-ar ajuta pe multi. Daca e o sectiune mai potrivita rog un moderator/admin sa mute topicul.
Dupa cum probabil stiti, printre cele mai utilizate metode de atac a site-urilor web este RFI (Remote File Inclusion). In majoritatea cazurilor kidiotul uploadeaza undeva un c99shell sau r57 si cand gaseste un site vulnerabil RFI ii da calea catre shell care ii da niste drepturi in plus. Daca serverul web nu este configurat corect rezultatele pot fi chiar devastatoare. Daca nu este blocat accesul la functii precum exec() sau system() din PHP atacatorul poate printr-un webshell sa execute o aplicatie pe server cum ar fi un binder sau un exploit care ii ofera privilegii de super-user.
Anyway, daca va intereseaza mai mult cautati pe google si va lamuriti. Ideea cred ca ati prins-o: c99shell si r57 sunt scripturi periculoase si nu trebuie pastrate pe server pentru ca pot fi folosite la atacarea serverului sau la atacarea unui alt server.
Am facut pentru un amic care are o firma de webhosting un script care cauta in directoarele userilor fisiere php, phtml, php3 si txt care contin un sir de caractere specific unuia dintre shell-uri. Codul arata cam asa:
#! /usr/bin/php
<?php
// pornesc scriptul
$cautare = 'c99sh_updateurl';
echo "Starting WebShellDetector\n";
$startdir = '/home/';
echo "Reading users...";
$users = @file_get_contents('/etc/passwd'); // citesc userii din /etc/passwd
if( !$users ) die('Failed. Unable to read /etc/passwd');
else echo "OK\n";
$users = explode("\n",$users);
echo "Arranging users...";
$usrlist = array(); // aici pastrez userii care trebuie verificati
$startid = 32000; // ID-ul de la care incep userii normali
foreach( $users as $user ){
$user = explode(':',$user);
if( $user[2] > $startid ) array_push($usrlist,$user[0]);
}
unset($users);
if( count($usrlist) < 1 ) die('Failed. No users to check');
else echo "OK\n";
// aici incep sa cotrobai in directorul fiecarui user
echo ":: STARTING USER CHECK ::\n";
foreach( $usrlist as $user ){
echo "Checking $user...";
$dir = $startdir.$user;
if( !is_dir($dir) ){
echo "No home directory\n";
}else{
echo "\n";
check($dir);
usleep(500000);// delay de 0.5 secunde intre useri ca sa nu creasca loadul
}
}
echo "\n".count($usrlist)." users checked\n";
// aici declar functii si toate alea
// check() e de fapt un snipet postat de SmLex si modificat
// de mine, dar asta ramane intre noi ;-)
function check($folder){
global $cautare;
$open = opendir("$folder");
while ($obiect = readdir($open)){
if (($obiect != ".") AND ($obiect != "..")){
if (is_dir("$folder/$obiect")){
check("$folder/$obiect");
}else{
// aici ma apuc sa fac verificarile
// ma intereseaza doar fisierele php, phtml sau php3
if( ereg('^(.*)\.(php|phtml|php3|txt)$',$obiect) ){
$buf = file_get_contents("$folder/$obiect");
if( ereg($cautare,$buf) ) echo "\t$obiect\n";
usleep(100000); // delay de 0.1 secunde intre fisiere ca sa nu creasca loadul
}
}
}
}
}
?>