tutoriale photoshop, brushes, patterns, gradient
Site afiliat proiectului Wtricks.com
   
   
  REGULAMENT | Search | Members | Calendar | Help  
 


Post Reply  Post Thread 
WebShell Detector
Author Message
Agkelos
Designer
******


Posts: 362
Group: Registered
Joined: Apr 2007
Status: Offline
Reputation: 3
Lei: 1559.13
Post: #1
WebShell Detector

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:

Code:
#! /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
                }
         }
      }
   }
}
?>


Trebuie rulat din consola ca root (neaparat ca root). In cazul in care nu sunteti obisnuiti cu asta intrati pe server prin ssh, va faceti super-user (su root sau sudo su - daca e implementat), dati drept de executie scriptului salvat cu numele script.php (chmod +x script.php) iar apoi il rulati (./script.php). La cum l-am facut o sa dureze cateva ore daca aveti cateva sute de utilizatori cu site-uri respectabile. Se poate face sa fie mai rapid dar am preferat sa pun un delay la fiecare iteratie ca sa nu creasca load-ul serverului si sa apara neplaceri.

$startdir e variabila care pastreaza numele directorului in care sunt pastrate directoarele userilor. De obicei e /home si nu e nevoie sa o schimbati.

$cautare e string-ul care se cauta in fisiere. Pentru c99shell, 'c99sh_updateurl' e un string potrivit. Se gaseste in orice versiune de c99. Daca vreti sa scanati dupa r57, puneti $cautare = 'temp_r57_table'; (asta o stiu de la Shocker)

$startid  e numarul de la care incep ID-urile utilizatorilor. cPanel/WHM isi pune ca default userii incepand cu 32000. Puteti schimba asta daca doriti. Daca puneti o valoare mai mica, in cel mai nefericit caz o sa primiti niste mesaje de genul "No home directory".

Sper sa il gasiti util. Daca aveti nelamuriri va stau la dispozitie.


IP Troubleshooter • Curs valutar • Blogu' meu • SkullBox Forum
06-08-2007 04:45 AM
Visit this users website Find all posts by this user Quote this message in a reply
Post Reply  Post Thread 

View a Printable Version
Send this Thread to a Friend
Subscribe to this Thread | Add Thread to Favorites

Forum Jump:

 

 Invatam Net
Esti nou pe aici? Vorbeste-ne despre tine.
Citeste articole si tutoriale unice.
Ai un site? Iti putem oferi un review.

  Parteneri

  

  

  UNIX, Linux, Programare si Scripting pentru incepatori

  

-->