לנצל מערכת לבדיקת אמינות
מחבר:
Ashfaq אנסארי

נסקר על ידי:
דרוג:
5
על אפריל 1, 2015
השתנה לאחרונה:פברואר 6, 2017

תקציר:

לנצל מערכת לבדיקת אמינות מפותחת כדי לקבוע את האמינות של תוכנה לנצל ידי חישוב ספירת פגיעות של EIP = 0x41414141

מבוא

 
אחד חבר שלי ניגן עם "MS13-009” a השתמש לאחר חינם פגיעות ב Internet Explorer מה שמוביל ל ביצוע קוד מרחוק.

הוא ביקש ממני לעזור לו בכתב אמין לנצל לפגיעות זו.

ברגע שהתחלתי לחפש לפגיעות, הבינה שפגיעות זו אינה אמינה בשל העובדה כי קיים מאוד חלון קטן בין חופשי ושימוש באובייקט המשוחרר. וחשוב יותר, החופשי קרה רק כאשר הביצוע של כל SCRIPT בלוקים לקבל השלמה.

בגלל זה, היו לנו להסתמך על JScript של setTimeout() פונקציה להקצות מחדש את האובייקט המשוחרר.

כ, המשימה שלי הייתה לכתוב אמין לנצל לפגיעות זו, זה היה כואב להשיק Internet Explorer תחת WinDbg ולהקליט EIP לרשום את ערך בכל פעם.

מצב זה גרם לי מתוסכל והתחלתי לחשוב למה לא לכתוב תסריט קטן שעושה את משימה זו.

לנצל מערכת לבדיקת אמינות

 
כך, האמינות נקבעת על ידי ספירת מספר הפעמים שהוא מסוגל לנצל שליטה EIP להירשם בכתובה / הערך הרצוי.
זה תסריט מאוד פשוט ל Windows כדי לקבוע כמה לנצל הוא אמין. אני השתמשתי CDB.EXE כדי לזהות את ההתרסקות ולהקליט את מדינת האוגרים.

קוד מקור

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
# -*- קידוד: utf-8 -*-
"""

 /$$$$$$$$ /$$$$$$$  /$$$$$$$$ /$$$$$$
| $$_____ /| $$__ $$|__ $$ __ // $$ __ $$
| $$      | $$  \ $$   | $$  | $$  \__ /
| $$$$$   | $$$$$$$/   | $$  |  $$$$$$
| $$__ / | $$__ $$ | $$   \____ $$
| $$      | $$  \ $$   | $$   /$$  \ $$
| $$$$$$$$| $$  | $$   | $$  |  $$$$$$/
|________ /|__ /|__ / |__ / \______ /


זכות יוצרים (ג) 2010-2015 HackSys צוות

קובץ זה הוא חלק מניצול אמינות הבדיקה
מערכת.

מערכת לבדיקת אמינות לנצל משמשת לבדיקה
אמינות של להכות EIP = 0x41414141. מערכת זו
הוא מכוון למציאה כמה לנצל הוא אמין.

ראה הקובץ 'רישיון' רשות העתקה.

מחבר : Ashfaq אנסארי
צור קשר עם: ashfaq_ansari1989[ב]hotmail.com
אתר אינטרנט: http://hacksys.vfreaks.com

"""


__author__ = 'Ashfaq אנסארי'
__version__ = "1.0"

לייבא os
לייבא sys
לייבא shutil
לייבא subprocess
לייבא תִברוּג


כיתה ExploitReliabilityTestingSystem(חפץ):
    """
    מחלקה זו היא לב לבו של ניצול אמינות
    מערכת לבדיקה.
    """


    def __init__(עצמי, CDB, להיכנס, תכנית, ארגומנטים=''):
        """
        זהו הבנאי Erts

        :להפסיק CDB: נתיב cdb.exe
        :יומן param: יומן נתיב
        :תכנית param: תכנית להשיק
        :args פרמטר: טיעוני תכנית
        """

        # לאמת אם CDB, להיכנס ותכנית קיימת
        אם לא os.נתיב.קיים(CDB):
            להעלות AttributeError("אנא לאמת דרך CDB ')
        elif לא os.נתיב.קיים(להיכנס):
            לנסות:
                os.mkdir(os.נתיב.dirname(להיכנס))
            אלא OSERROR:
                להעלות AttributeError("אנא לאמת דרך LOG")
        elif לא os.נתיב.קיים(תכנית):
            להעלות AttributeError("אנא לאמת דרך תכנית ')

        עצמי.CDB = CDB
        עצמי.להיכנס = להיכנס
        עצמי.תכנית = תכנית
        עצמי.ארגומנטים = ארגומנטים
        עצמי.תהליך = אף אחד

    def לרוץ(עצמי, file_path, פסק זמן=60):
        """
        זה משמש כדי להפעיל את התהליך עם פסק זמן
        באמצעות השחלה

        :file_path param: להגיש נתיב לפתוח
        :פסק זמן param: פסק זמן בשניות
        """

        # לאמת args ופרמטר פסק זמן
        אם file_path הוא אף אחד:
            להעלות AttributeError("אנא לאמת filepath תכנית ')
        elif פסק זמן הוא אף אחד ו - סוג(פסק זמן) == str:
            להעלות AttributeError("אנא לאמת TIMEOUT ')

        def __launch_process():
            # להכין את טיעון התהליך
            process_args = עצמי.CDB + '' + "-g -G -o -c & Quot; .logopen ' + עצמי.להיכנס + \
                           ';r;.logclose;q" & Quot; ' + עצמי.תכנית + '" ' + עצמי.ארגומנטים + \
                           '' + file_path

            עצמי.תהליך = subprocess.האפיפיור(process_args,
                                            stdin=subprocess.PIPE,
                                            stdout=subprocess.PIPE,
                                            stderr=subprocess.PIPE)
            # לחכות לתהליך כדי לצאת
            עצמי.תהליך.לתקשר()

        # להכין את החוט כדי להפעיל את התהליך
        process_thread = תִברוּג.אשכול(היעד=__launch_process)

        # להתחיל את החוט
        process_thread.התחלה()

        # עכשיו מצטרף לחוט
        process_thread.להצטרף(פסק זמן=פסק זמן)

        # לבדוק אם החוט הוא עדיין בחיים
        אם process_thread.is_alive():
            # נראה כי התהליך לא לקרוס
            # בואו נהרוג את התהליך
            עצמי.תהליך.לסיים()

            # בואו לסיים את חוט הילד
            process_thread.להצטרף()

    def is_crash_reliable(עצמי, EIP):
        """
        זה משמש כדי לבדוק אם ההתרסקות הייתה אמינה
        על ידי בדיקת EIP מיומן ההתרסקות

        :param EIP: EIP לרשום את הערך כדי להשוות
        :לחזור: אמת / שקר
        """

        # לאמת EIP כמחרוזת
        אם סוג(EIP) != str:
            להעלות AttributeError("אנא לאמת EIP ')

        להיכנס = לפתוח(עצמי.להיכנס).לקרוא את()

        אם "EIP ={0}'.פורמט(EIP) בתוך להיכנס:
            לחזור נכון
        אחר:
            לחזור False


אם __name__ == "__main__":
    # קבועים
    HEADER = '' '

      /$$$$$$$$ /$$$$$$$  /$$$$$$$$ /$$$$$$
     | $$_____ /| $$__ $$|__ $$ __ // $$ __ $$
     | $$      | $$  \ $$   | $$  | $$  \__ /
     | $$$$$   | $$$$$$$/   | $$  |  $$$$$$
     | $$__ / | $$__ $$ | $$   \____ $$
     | $$      | $$  \ $$   | $$   /$$  \ $$
     | $$$$$$$$| $$  | $$   | $$  |  $$$$$$/
     |________ /|__ /|__ / |__ / \______ /

           לנצל מערכת אמינות
                 גרסה: {0}

    '' '
.פורמט(__version__)

    # לכוונן את הערכים הללו
    MAX_RUN = 10
    TIMEOUT = 60
    EIP = '41414141'
    File_path = "Http://localhost:8000/exploit.html '
    CDB_PATH = 'C:\\Program Files\\כלי איתור באגים עבור Windows (x86)\\cdb.exe '
    PROGRAM_PATH = 'C:\\Program Files\\Internet Explorer\\iexplore.exe "
    PROGRAM_ARGS = ''
    LOG_PATH = 'C:\\יומנים\' + os.path.basename(PROGRAM_PATH) + '.להיכנס'

    reliable_crash_count = 0
    אמינות = 0

    # פרטי יעד הדפסה
    HEADER הדפסה
    הדפסה '
היעד EIP: {0}".format(EIP)
    הדפסה '
היעד Application: {0}\n".format(os.path.basename(PROGRAM_PATH))

    # ליצור המופע של ניצול אמינות
    # כיתת TestingSystem
    Erts = ExploitReliabilityTestingSystem(CDB = CDB_PATH,
                                           להיכנס = LOG_PATH,
                                           תכנית = PROGRAM_PATH,
                                           args = PROGRAM_ARGS)

    # להפעיל את היישום ולספור את מספר הקריסות
    לi בטווח(0, MAX_RUN):
        # להפעיל את יישום היעד
        erts.run(file_path = file_path, פסק זמן = TIMEOUT)

        # עכשיו לבדוק אם ההתרסקות היא אמינה
        אם erts.is_crash_reliable(EIP EIP =):
            reliable_crash_count = 1

        # עכשיו לקבוע לנצל אמינות
        אמינות = (reliable_crash_count * 100) / MAX_RUN

        # להדפיס את המעמד על מסך
        sys.stdout.write("\r[{0}] דירוג אמינות בשידור חי: {1}%& Quot; .format(אני + 1, אמינות))
        sys.stdout.flush()

    # למחוק את ספריית היומן
    shutil.rmtree(נתיב = os.path.dirname(LOG_PATH))

    הדפסה '
\n'
    הדפסה '
לנצל אמינות דירוג: {0}%".format(אמינות)

 

הצהרה: נא לא להשתמש בקוד המקור הניתן כאן. תמיד ניתן למצוא את הגרסה העדכנית ביותר במאגר GitHub כדלקמן.

 

בפעולה

 

לנצל מערכת לבדיקת אמינות שהושלמה
לנצל ריצה מערכת לבדיקת אמינות

 

לנצל מערכת לבדיקת אמינות על GitHub

 


אני מקווה שזה עשוי להיות שימושי כדי לנצל מפתחים שרוצים לבדוק את האמינות של מעלליהם. אנא להעלות בעיה אם אתה מוצא את כל באג או אם יש לך הצעת שיפור.

12,429 סה"כ צפיות, 24 צפיות היום

שתי הכרטיסיות הבאות לשנות את התוכן בהמשך.

Ashfaq אנסארי

חוקר אבטחה
Ashfaq אנסארי הוא המייסד של HackSys צוות שם קוד "Panthera". הוא חוקר אבטחה עם ניסיון בהיבטים שונים של אבטחת המידע. הוא חיבר "נהג פגיע HackSys קיצוני" ו - "Shellcode מוות". הוא גם כתב ופרסם סקירות טכניות שונות על ניצול תוכנה ברמה נמוכה. עניין הליבה שלו טמון ב "ניצול רמה נמוך", "הנדסה הפוכה", "ניתוח תכנית" ו - "Fuzzing ההיברידית". הוא fanboy של בינה המלאכותית ומערכות לומדות. הוא הפרק להוביל ל null פונה.

ההודעות אחרונות על ידי Ashfaq אנסארי (לראות את כל)

השאר תגובה

כתובת הדוא"ל שלך לא תפורסם. שדות חובה מסומנים *