Ένα πολύ απλό honeypot

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
Άβαταρ μέλους
mrpc
WebDev Moderator
Δημοσιεύσεις: 3393
Εγγραφή: 03 Μάιος 2000 03:00
Τοποθεσία: Εξάρχεια
Επικοινωνία:

Ένα πολύ απλό honeypot

Δημοσίευση από mrpc » 01 Μάιος 2011 15:35

Σε αυτό το βοήθημα θα δούμε ένα πολύ απλό τρικ για να αποφεύγουμε τους "περίεργους" από το site μας. Δεν θα μας σώσει από κάποιο σοβαρό hacker, αλλά πιθανόν από διάφορα script kiddies ή άτομα που απλά προσπαθούν να μαντέψουν τον κωδικό της διαχείρισης.
Παρατηρώντας τα log του site μου, βλέπω ανά διαστήματα κόσμο να προσπαθεί να βρει κενά στο σύστημα, ή να μπει στα εργαλεία διαχείρισης, δοκιμάζοντας διάφορα url, π.χ.
http:// το site σας /admin
http:// το site σας /phpmyadmin
κ.τ.λ.
Σε αυτές τις περιπτώσεις συνήθως η απάντηση είναι ban της συγκεκριμένης ip, αν και αυτό βέβαια δεν λύνει πολλά προβλήματα, ειδικά αν γίνει κάποιες ώρες αργότερα που ο χρήστης θα έχει αλλάξει ήδη την ip του.

Μια κλασική λύση για αυτό είναι η χρήση ενός honeypot. Με άλλα λόγια μια σελίδα που δείχνει κάποιο "admin login" ή ψεύτικο περιβάλλον διαχείρισης για να κρατήσει απασχολημένο το χρήστη, ενώ στην ουσία είναι παγίδα που καταγράφει την ip του.

Σκοπός είναι να κρατήσει ένα log του πότε έγινε η "επίθεση" και από ποιον, ώστε αργότερα να γίνει ban από τον server. Σε πιο εξελιγμένη μορφή, μπορεί να κάνει και το ban αυτόματα.

Για αρχή, δημιουργούμε μια απλή login σελίδα, την οποία γράφουμε σε ένα αρχείο admin.php στο root folder του site μας:

Κώδικας: Επιλογή όλων

<html>
    <head>
        <title>Admin Login</title>
    </head>

    <body>

        <form method='post' action='#' name='form1'>
            <table width="50%" border="0" align="center" cellpadding="6" cellspacing="0" style="border&#58;1px solid black">
                <tr bgcolor="#FF9999">
                    <td colspan="3">
                        <div align="center"> Admin Login </div>
                    </td>
                </tr>
                <tr>
                    <td colspan="3" height="2" > <br>
                        <table width="80%" border="0" align="center">
                            <tr>
                                <td width="28%">User ID</td>
                                <td width="0%">&#58;</td>
                                <td width="72%">
                                    <input type="text" name="ID" maxlength="8">
                                </td>
                            </tr>
                            <tr>
                                <td width="28%">Password</td>
                                <td width="0%">&#58;</td>
                                <td width="72%">
                                    <input type="password" name="Pass" maxlength="8">
                                </td>
                            </tr>
                        </table>
                        <br>
                    </td>
                </tr>
                <tr bgcolor="#FF9999">
                    <td colspan="3" height="2">
                        <div align="center">
                            <input type="submit" name="Submit" value="Login">
                            <input type="reset" name="Submit2" value="Reset">
                        </div>
                    </td>
                </tr>
            </table>
        </form>
    </body>
</html>
Απλό και πειστικό. Δεν χρειάζεται να στέλνει πουθενά αυτά τα στοιχεία, μην ξεχνάμε ότι είναι ψεύτικο.

Για να είμαστε σίγουροι ότι θα το δουν όλοι οι περίεργοι, μπορούμε να προσθέσουμε μερικές εντολές στο .htaccess:

Κώδικας: Επιλογή όλων

RewriteEngine on 
RewriteRule ^admin$ admin.php &#91;L&#93;
RewriteRule ^phpmyadmin$ admin.php &#91;L&#93;
RewriteRule ^administrator$ admin.php &#91;L&#93;
RewriteRule ^database$ admin.php &#91;L&#93;
RewriteRule ^db$ admin.php &#91;L&#93;
Μπορείτε να βάλετε όσα rewriterules θέλετε, συμβουλευτείτε και τα log σας. Προσοχή μόνο να μην κάνετε overwrite κάτι που όντως υπάρχει στο site (π.χ. το πραγματικό admin panel).

Μέχρι τώρα καταφέραμε να στείλουμε όσους σκανάρουν, ώστε να πέσουν στη συγκεκριμένη σελίδα. Τώρα πρέπει και να τους καταγράψουμε.
Εισάγουμε λοιπόν στο admin.php τα παρακάτω:

Κώδικας: Επιλογή όλων

<?php
$ip = $_SERVER&#91;'REMOTE_ADDR'&#93;; //Παίρνουμε την ip address του χρήστη που άνοιξε τη σελίδα
$file_handle = fopen&#40;'honey_log.txt', 'a+'&#41;; //ανοίγουμε &#40;ή δημιουργούμε&#41; το αρχείο honey_log.txt που καταγράφει όλες τις επισκέψεις
if &#40;$file_handle&#41; &#123;
    $output = $ip . " -- " . $_SERVER&#91;"HTTP_USER_AGENT"&#93; . " -- " . date&#40;"d&#58;m&#58;Y H&#58;i&#58;s"&#41; . "\n"; //μορφοποιούμε την πληροφορία, προσθέτοντας ημερομηνία/ώρα/agent ή ότι άλλο θέλουμε
    fwrite&#40;$file_handle, $output&#41;; //γράφουμε στο αρχείο
    fclose&#40;$file_handle&#41;; //το κλείνουμε
&#125;
?>
και έτσι έχουμε ένα ωραιότατο log που καταγράφει όποιον πέφτει στην παγίδα. Μπορούμε κάθε μερικές μέρες να το ελέγχουμε και να κάνουμε ban όποιες ip έχουν προστεθεί.
Αν θέλουμε, μπορούμε επίσης να βάλουμε το αρχείο να κόβει την πρόσβαση αυτόματα μέσω του .htaccess, κάνοντας append σε αυτό εντολές όπως:
deny from χχχ.χχχ.χχχ.χχχ
(αντικαταστήστε τα χ με την ip address)
Αυτό προϋποθέτει όμως ότι το .htaccess είναι εγγράψιμο από την php, πράγμα που συνήθως δεν είναι καλή ιδέα (ή μπορείτε να κάνετε κάτι ποιο σύνθετο, χρησιμοποιώντας ftp functions).

Κάτι πιο απλό που μπορείτε να κάνετε, είναι να αρνηθείτε την πρόσβαση στο πραγματικό admin panel ή στο Website σε όσες ip είναι στη λίστα μας.
Για παράδειγμα, δημιουργούμε ένα αρχείο honey_ip.txt, στο οποίο έχουμε όλες τις ip χωρισμένες με κενό.
Στην αρχή της πραγματικής μας εφαρμογής βάζουμε αυτό:

Κώδικας: Επιλογή όλων

/**
 * IP Address Protection
 */
$ips = file_get_contents&#40;'honey_ip.txt'&#41;;
$ips = explode&#40;" ", $ips&#41;;
foreach &#40;$ips as $ipaddress&#41; &#123;
    if &#40;$ipaddress == $_SERVER&#91;'REMOTE_ADDR'&#93;&#41; &#123;
        die&#40;'Το site μας είναι προσωρινά μη διαθέσιμο λόγω τεχνικού προβλήματος.'&#41;;
    &#125;
&#125;
Με λίγα λόγια, διαβάζουμε το αρχείο, δημιουργούμε ένα array με όλες τις ip και συγκρίνουμε με την ip του επισκέπτη. Αν είναι ίδια, η εφαρμογή σταματάει, με ένα παραπλανητικό μήνυμα.
Αυτό το αρχείο μπορούμε να το συμπληρώνουμε αυτόματα, μέσα από το honeypot. Απλά συμπληρώνουμε στο admin.php:

Κώδικας: Επιλογή όλων

//Αρχικά ελέγχουμε αν η συγκεκριμένη ip υπάρχει ήδη στο αρχείο, για να μην κάνουμε περιττούς ελέγχους αργότερα.
$ips = @file_get_contents&#40;'honey_ip.txt'&#41;;
$ips = explode&#40;" ", $ips&#41;;
$detected = false;
foreach &#40;$ips as $ipaddress&#41; &#123;
    if &#40;$ipaddress == $_SERVER&#91;'REMOTE_ADDR'&#93;&#41; &#123;
        $detected = true;
        break;
    &#125;
&#125;
if &#40;$detected == false&#41; &#123;
    $file_handle = fopen&#40;'honey_ip.txt', 'a+'&#41;;
    if &#40;$file_handle&#41; &#123;
        $output = $ip . " ";
        fwrite&#40;$file_handle, $output&#41;;
        fclose&#40;$file_handle&#41;;
    &#125;
&#125;
Απλά και γρήγορα.

Με λίγη φαντασία μπορείτε να κάνετε κι άλλα πραγματάκια (π.χ. να κρατάτε τα username/password που δοκιμάζουν ή να δημιουργήσετε κάποιο ψεύτικο admin registration (:p) ώστε να τσιμπάτε και τα email τους).

Άβαταρ μέλους
cordis
Administrator, [F|H]ounder, [C|S]EO
Δημοσιεύσεις: 27629
Εγγραφή: 09 Οκτ 1999 03:00
Τοποθεσία: Greece
Επικοινωνία:

Ένα πολύ απλό honeypot

Δημοσίευση από cordis » 02 Μάιος 2011 14:32

πολύ ωραίο! :D
Δεν απαντάω σε προσωπικά μηνύματα με ερωτήσεις που καλύπτονται από τις ενότητες του forum. Για ο,τι άλλο είμαι εδώ για εσάς.
- follow me @twitter

Άβαταρ μέλους
c0d3punk
Honorary Member
Δημοσιεύσεις: 1076
Εγγραφή: 15 Σεπ 2008 22:32
Τοποθεσία: Puerto pollo
Επικοινωνία:

Ένα πολύ απλό honeypot

Δημοσίευση από c0d3punk » 02 Μάιος 2011 18:35

mrpc έγραψε: Με λίγη φαντασία μπορείτε να κάνετε κι άλλα πραγματάκια (π.χ. να κρατάτε τα username/password που δοκιμάζουν ή να δημιουργήσετε κάποιο ψεύτικο admin registration (:p) ώστε να τσιμπάτε και τα email τους).
αυτό ήταν το πρώτο που σκέφτηκα μόλις το είδα! χεχεχεχε

με αυτό τον τρόπο δημιουργείς και μια λίστα με τα πιο συνηθισμένα passes που δοκιμάζονται και τους κάνεις ένα interactive login Failure με μηνύματα του στυλ "Είσαι κοντά! άλλαξε κάνα δύο ψηφία ακόμα από το pass και είσαι μέσα!", "Λες να έβαζα την λέξη password για κωδικό?" ή "Δεν είναι αυτή η ημερομηνία γεννήσεώς μου!" :kaloe: :lol:

Μπράβο κύριε pc! πλάκα έχει :-)
like ants in a colony we do our share
but there's so many other f****' insects out there || Ανανεωμένα Παρτάλια || biZfind.gr

Άβαταρ μέλους
SoUpEr_PiLaS
Δημοσιεύσεις: 428
Εγγραφή: 07 Δεκ 2007 22:37
Τοποθεσία: Αθήνα, Νίκαια
Επικοινωνία:

Ένα πολύ απλό honeypot

Δημοσίευση από SoUpEr_PiLaS » 02 Μάιος 2011 19:41

Πολύ ενδιαφέρον....! Ίσως φανεί χρήσιμο αυτό ;) Thank you mrpc!!!
Εικόνα

ibizakias
Δημοσιεύσεις: 154
Εγγραφή: 23 Απρ 2008 11:34

Ένα πολύ απλό honeypot

Δημοσίευση από ibizakias » 05 Ιουν 2014 14:29

Το παρακάτω κομμάτι κώδικα μπαίνει στο admin.php ; Αν ναι σε ποιο σημείο;

Κώδικας: Επιλογή όλων

/** 
 * IP Address Protection 
 */ 
$ips = file_get_contents&#40;'honey_ip.txt'&#41;; 
$ips = explode&#40;" ", $ips&#41;; 
foreach &#40;$ips as $ipaddress&#41; &#123; 
    if &#40;$ipaddress == $_SERVER&#91;'REMOTE_ADDR'&#93;&#41; &#123; 
        die&#40;'Το site μας είναι προσωρινά μη διαθέσιμο λόγω τεχνικού προβλήματος.'&#41;; 
    &#125; 
&#125; 
Σε ποιο σημείο του admin.php μπαίνει αυτό το κομμάτι κώδικα;

Κώδικας: Επιλογή όλων

//Αρχικά ελέγχουμε αν η συγκεκριμένη ip υπάρχει ήδη στο αρχείο, για να μην κάνουμε περιττούς ελέγχους αργότερα. 
$ips = @file_get_contents&#40;'honey_ip.txt'&#41;; 
$ips = explode&#40;" ", $ips&#41;; 
$detected = false; 
foreach &#40;$ips as $ipaddress&#41; &#123; 
    if &#40;$ipaddress == $_SERVER&#91;'REMOTE_ADDR'&#93;&#41; &#123; 
        $detected = true; 
        break; 
    &#125; 
&#125; 
if &#40;$detected == false&#41; &#123; 
    $file_handle = fopen&#40;'honey_ip.txt', 'a+'&#41;; 
    if &#40;$file_handle&#41; &#123; 
        $output = $ip . " "; 
        fwrite&#40;$file_handle, $output&#41;; 
        fclose&#40;$file_handle&#41;; 
    &#125; 
&#125;
Ευχαριστώ.
Εικόνα

Άβαταρ μέλους
mrpc
WebDev Moderator
Δημοσιεύσεις: 3393
Εγγραφή: 03 Μάιος 2000 03:00
Τοποθεσία: Εξάρχεια
Επικοινωνία:

Ένα πολύ απλό honeypot

Δημοσίευση από mrpc » 05 Ιουν 2014 14:50

ibizakias έγραψε:Το παρακάτω κομμάτι κώδικα μπαίνει στο admin.php ; Αν ναι σε ποιο σημείο;
Όχι. Μπαίνει στην κανονική εφαρμογή.
mrpc έγραψε:Στην αρχή της πραγματικής μας εφαρμογής βάζουμε αυτό:
ibizakias έγραψε:Σε ποιο σημείο του admin.php μπαίνει αυτό το κομμάτι κώδικα;
Δεν έχει ιδιαίτερη σημασία.

Άβαταρ μέλους
DataHellas
Δημοσιεύσεις: 39
Εγγραφή: 24 Μάιος 2005 08:57
Τοποθεσία: Αθήνα
Επικοινωνία:

Ένα πολύ απλό honeypot

Δημοσίευση από DataHellas » 05 Ιουν 2014 22:47

Η συγκεκριμένη μέθοδος δεν νομίζω να βοηθήσει ιδιαίτερα. Δεν θα σας σώσει από σκαναρίσματα που γίνονται μέσω του google για συγκεκριμένες τρύπες σε συγκεκριμένο λογισμικό. Με τη συγκεκριμένη μέθοδο πιστεύω ότι ξεκινάνε το 99.9% των επιθέσεων σε ένα site. Επίσης το brute force attack (μαντεψιά κωδικού) είναι παλαιολιθική μέθοδος, δεν θα σας χακέψουν από την login σελίδα. Αν έχετε ένα cms εγκατεστημένο, που η πλειοψηφία έχει, δεν θα καταφέρετε τίποτα. Στην καλύτερη μπορείτε μόνο να κρύψετε την διαχείριση αν το υποστηρίζει το cms σας αν και το cms είναι ακόμα εκεί και περιμένει τις επιθέσεις και τα scans μέσω google ή bad robots. Αν για παράδειγμα έχετε έναν WYSIWYG editor εγκατεστημένο αυτός θα είναι σε συγκεκριμένη διαδρομή, δεν μπορείτε να τον κρύψετε. Αν αυτός έχει bug και καταφέρει ο επιτιθέμενος να ανεβάσει ένα αρχείο εκμεταλευόμενος το bug, το site έχει τελειώσει. Δεν χρειάζεται να ξέρει τα στοιχεία πρόσβασης, στο αρχείο που ανεβάζει γράφει ότι κώδικα θέλει και διαβάζει ότι θέλει από το site.

Αυτό που προτείνω είναι ένα σύστημα φιλτραρίσματος των request ώστε τουλάχιστον οι πιο κοινές επιθέσεις να μην φτάνουν στο site σας και ο επιτιθέμενος να λαμβάνει ένα μήνυμα forbidden ή not found ώστε να βαρεθεί ή να μην ξαναπροσπαθήσει και να φύγει. Υπάρχουν ορισμένα έτοιμα τέτοια σκριπτάκια στο internet που μπορείτε να ενσωματώσετε με ένα απλό include στο site σας αλλά το καλύτερο είναι να αναλύσετε τα logs του site σας και να βάλετε συγκεκριμένα φίλτρα που θα κόψουν τα bad requests που φτάνουν στο δικό σας site. Και φυσικά τα τετριμμένα: προσέχουμε πως χρησιμοποιούμε το Internet, κάνουμε αναβαθμίσεις, δεν εγκαθιστούμε ύποπτο ή "ερασιτεχνικό" λογισμικό, κλπ.

Άβαταρ μέλους
mrpc
WebDev Moderator
Δημοσιεύσεις: 3393
Εγγραφή: 03 Μάιος 2000 03:00
Τοποθεσία: Εξάρχεια
Επικοινωνία:

Ένα πολύ απλό honeypot

Δημοσίευση από mrpc » 06 Ιουν 2014 00:19

DataHellas όλα όσα λες ισχύουν 100%.
Ο λόγος που έκανα αυτό το script ήταν πιο πολύ ο προσωπικός πειραματισμός. Παρ' όλα αυτά, η αλήθεια είναι ότι έχει πιάσει αρκετά πράγματα, και συνεχίζει ακόμα. Μπορεί αυτός που θα μπει στο site μου να δοκιμάσει το "admin/admin" να είναι θεωρητικά ακίνδυνος, αλλά εγώ προτιμώ να τον κρατήσω εκτός. Έστω και για λόγους ψυχικής ηρεμίας.
Όσο για το brute force attack, μην το υποτιμάς καθόλου. Το ότι υπάρχουν καλύτεροι τρόποι να γίνει μια επίθεση, δεν σημαίνει ότι σταματάνε οι κλασικοί. Υπάρχουν bots που κάνουν οργανωμένα brute force attack σε scripts - το τελευταίο διάστημα το αντιμετώπιζα πολύ συχνά με wordpress. Ένα τέτοιο honeypot δεν κάνει και πολλά σε αυτή την περίπτωση γιατί πρακτικά μόλις το bot αντιληφθεί ότι έχει φάει ban, δοκιμάζει από άλλη ip. Μπορεί να κάνει όμως τη διαφορά σε κάτι άλλο, καθυστερώντας την επίθεση μπορείς αποτρέψεις μια τέτοια επίθεση από να λειτουργήσει σαν ddos attack. Σ.σ. στο wordpress δεν χρησιμοποιώ αυτό εδώ, υπάρχουν έτοιμα script που κάνουν ban μετά από χ αποτυχημένα login. Ανάλογα plugins υπάρχουν για τα περισσότερα script και πολλά έχουν και ενσωματωμένες τέτοιες λειτουργίες.

Κατά τα άλλα, οι συμβουλές που έδωσες είναι η καλύτερη λύση. Και ένας καλός server administrator.

Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

Ένα πολύ απλό honeypot

Δημοσίευση από cpulse » 06 Ιουν 2014 08:58

Μια απλή πρόσθεση στο script σου είναι μια χρονοκαθυστέρηση. Όταν τα bot ψάχνουν για αδύναμους κρίκους στο web ένα τους μεγάλο πρόβλημα είναι να αποφύγουν προβληματικούς servers. Αν βάλεις ένα απλό sleep(3); για παράδειγμα, κάνεις τον server σου να μοιάζει σαν κακορυθμισμένο ή υπερφορτωμένο. Αν προσπαθήσουν να σου κάνουν brute force attack θα τους πάρει πολύ ώρα να κάνουν τις δοκιμές τους, και ίσως να σε σβήσουν από πιθανό στόχο γιατί ίσως σε θεωρήσουν άχρηστο server.

Αυτά που λέει ο DataHellas είναι σωστά μεν, αλλά και το script σου έχει πιθανότητες να κάνει bots να σε παρατήσουν, άρα η προσπάθεια σου είναι χρήσιμη. Εγώ θα σου προσθέσω το να προσαρμήσεις το HTML για να μοιάζει σαν γνωστά CMS ώστε να έχεις περισσότερες πιθανότητες να τους μπερδέψεις.

Άβαταρ μέλους
mrpc
WebDev Moderator
Δημοσιεύσεις: 3393
Εγγραφή: 03 Μάιος 2000 03:00
Τοποθεσία: Εξάρχεια
Επικοινωνία:

Ένα πολύ απλό honeypot

Δημοσίευση από mrpc » 06 Ιουν 2014 17:46

cplulse σωστός!

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης