
مستودع لأدوات تشغيل Shellcode لنظام ويندوز والأدوات المساعدة. تقوم التطبيقات بتحميل وتنفيذ Shellcode باستخدام استدعاءات API مختلفة أو تقنيات.
go-shellcode هو مستودع لمشغلات شيلكود (Shellcode runners) لنظام ويندوز وأدوات مساعدة. تقوم التطبيقات بتحميل وتنفيذ الشيلكود باستخدام استدعاءات API أو تقنيات مختلفة.
مشغلات الشيلكود المتاحة تشمل:
يستخدم هذا التطبيق دالة ويندوز CreateFiber من Kernel32.dll لتنفيذ الشيلكود داخل عملية هذا التطبيق. هذا مفيد عندما تريد تجنب الحقن في عملية بعيدة وتجنب استدعاء CreateThread. هذا التطبيق لا يستخدم دوال من حزمة golang.org/x/sys/windows. الفرق الأكثر أهمية هو أن هذا التطبيق يقوم بتحميل جميع ملفات DLL والإجراءات اللازمة بنفسه ويستخدم دالة Call() الخاصة بالإجراء.
ملاحظة: لم أكتشف طريقة لجعل العملية تخرج، وسيتعين عليك إنهاؤها يدويًا.
يمكن تجميع التطبيق باستخدام الأمر التالي على مضيف ويندوز من الدليل الجذر للمشروع:
set GOOS=windows GOARCH=amd64;go build -o CreateFiber.exe .\cmd\CreateFiber\main.go
يستخدم هذا التطبيق دالة ويندوز CreateProcess من Kernel32.dll. يتم إنشاء العملية في حالة معلقة (suspended)، ثم يتم تحديث AddressOfEntryPoint في بنية IMAGE_OPTIONAL_HEADER لتنفيذ الشيلكود في العملية الفرعية، ثم يتم استئناف العملية. هذا نوع من تجويف العملية (process hollowing) ولكن ملف PE الموجود لا يتم إلغاء تعيينه (unmapped) وThreadContext لا يتم تحديثه. يجب أن تتطابق بنية الشيلكود المقدمة (مثل x86 أو x64) مع بنية العملية الفرعية.
يمكن تجميع التطبيق باستخدام الأمر التالي على مضيف ويندوز من الدليل الجذر للمشروع:
set GOOS=windows GOARCH=amd64;go build -o CreateProcess.exe .\cmd\CreateProcess\main.go
يستخدم هذا التطبيق دالة ويندوز CreateProcess من Kernel32.dll. يتم إنشاء العملية في حالة معلقة (suspended)، ثم يتم تحديث AddressOfEntryPoint في بنية IMAGE_OPTIONAL_HEADER لتنفيذ الشيلكود في العملية الفرعية، ثم يتم استئناف العملية. هذا نوع من تجويف العملية (process hollowing) ولكن ملف PE الموجود لا يتم إلغاء تعيينه (unmapped) وThreadContext لا يتم تحديثه. يجب أن تتطابق بنية الشيلكود المقدمة (مثل x86 أو x64) مع بنية العملية الفرعية.
يختلف هذا التطبيق عن CreateProcess لأنه سيجمع أي بيانات مكتوبة إلى STDOUT أو STDERR في العملية الفرعية ويعيدها إلى العملية الأم. يتم جمع البيانات باستخدام دالة CreatePipe لإنشاء أنبوب مجهول (anonymous pipe) تتواصل من خلاله العمليات الأم والفرعية. هذا مفيد عند استخدام أدوات مثل Donut لتنفيذ تجميع .NET في عملية فرعية كشيلكود واسترجاع مخرجات البرنامج المنفذ. يمكن استخدام الأمر التالي لإنشاء شيلكود مستقل عن الموقع (position-independent) لتشغيل Seatbelt باستخدام Donut v0.9.3:
.\donut.exe -o donut_v0.9.3_Seatbelt.bin -x 2 -c Seatbelt.Program -m Main -p "ARPTable" Seatbelt.exe
يمكن تجميع التطبيق باستخدام الأمر التالي على مضيف ويندوز من الدليل الجذر للمشروع:
set GOOS=windows GOARCH=amd64;go build -o CreateProcessWithPipe.exe .\cmd\CreateProcessWithPipe\main.go
يستخدم هذا التطبيق دالة ويندوز CreateRemoteThread من Kernel32.dll لتنفيذ الشيلكود في عملية بعيدة. يتطلب التطبيق أن تكون العملية المستهدفة قيد التشغيل بالفعل. يمكن تقدير (PID) العملية المستهدفة في وقت التشغيل للاختبار باستخدام علامة سطر الأوامر -pid. قم بترميز PID ثابت في سطر الكود التالي للاستخدام العملي عن طريق استبدال 0 بـ PID المستهدف:
pid := flag.Int("pid", 0, "Process ID to inject shellcode into")
يستخدم هذا التطبيق دوال من حزمة golang.org/x/sys/windows، حيثما أمكن، مثل windows.OpenProcess(). يمكن تجميع التطبيق باستخدام الأمر التالي على مضيف ويندوز من الدليل الجذر للمشروع:
set GOOS=windows GOARCH=amd64;go build -o CreateRemoteThread.exe .\cmd\CreateRemoteThread\main.go
يستخدم هذا التطبيق دالة ويندوز CreateRemoteThread من Kernel32.dll لتنفيذ الشيلكود في عملية بعيدة. يتطلب التطبيق أن تكون العملية المستهدفة قيد التشغيل بالفعل. يمكن تقدير (PID) العملية المستهدفة في وقت التشغيل للاختبار باستخدام علامة سطر الأوامر -pid. قم بترميز PID ثابت في سطر الكود التالي للاستخدام العملي عن طريق استبدال 0 بـ PID المستهدف:
pid := flag.Int("pid", 0, "Process ID to inject shellcode into")
هذا التطبيق لا يستخدم دوال من حزمة golang.org/x/sys/windows. الفرق الأكثر أهمية هو أن هذا التطبيق يقوم بتحميل جميع ملفات DLL والإجراءات اللازمة بنفسه ويستخدم دالة Call() الخاصة بالإجراء. يمكن تجميع التطبيق باستخدام الأمر التالي على مضيف ويندوز من الدليل الجذر للمشروع:
set GOOS=windows GOARCH=amd64;go build -o CreateRemoteThreadNative.exe .\cmd\CreateRemoteThreadNative\main.go
يستخدم هذا التطبيق دالة ويندوز CreateThread من Kernel32.dll لتنفيذ الشيلكود داخل عملية هذا التطبيق. هذا مفيد عندما تريد تجنب حقن العملية البعيدة. يستخدم هذا التطبيق دوال من حزمة golang.org/x/sys/windows، حيثما أمكن، مثل windows.VirtualAlloc(). يمكن تجميع التطبيق باستخدام الأمر التالي على مضيف ويندوز من الدليل الجذر للمشروع:
set GOOS=windows GOARCH=amd64;go build -o CreateThread.exe .\cmd\CreateThread\main.go
يستخدم هذا التطبيق دالة ويندوز CreateThread من Kernel32.dll لتنفيذ الشيلكود داخل عملية هذا التطبيق. هذا مفيد عندما تريد تجنب حقن العملية البعيدة. هذا التطبيق لا يستخدم دوال من حزمة golang.org/x/sys/windows. الفرق الأكثر أهمية هو أن هذا التطبيق يقوم بتحميل جميع ملفات DLL والإجراءات اللازمة بنفسه ويستخدم دالة Call() الخاصة بالإجراء. يمكن تجميع التطبيق باستخدام الأمر التالي على مضيف ويندوز من الدليل الجذر للمشروع:
set GOOS=windows GOARCH=amd64;go build -o CreateThreadNative.exe .\cmd\CreateThreadNative\main.go
يستخدم التطبيق دالة ويندوز CreateProcess لإنشاء عملية في حالة معلقة (suspended). بمجرد تعليق العملية الفرعية، يتم استخدام دالة ويندوز QueueUserAPC لإضافة UserAPC إلى العملية الفرعية يشير إلى الشيلكود المخصص. بعد ذلك، يتم استدعاء ResumeThread، والذي يقوم بدوره باستدعاء الدالة غير الموثقة NtTestAlert التي ستنفذ UserAPC الذي تم إنشاؤه وبالتالي الشيلكود. هذا مفيد لأن الشيلكود سيتم تنفيذه قبل أن تتمكن برامج مكافحة الفيروسات / EDR من ربط الدوال لدعم الكشف. مرجع New 'Early Bird' Code Injection Technique Discovered. يمكن تجميع التطبيق باستخدام الأمر التالي على مضيف ويندوز من الدليل الجذر للمشروع:
export GOOS=windows GOARCH=amd64;go build -o goEarlyBird.exe cmd\EarlyBird\main.go
يستخدم هذا التطبيق دالة ويندوز EtwpCreateEtwThread من ntdll.dll لتنفيذ الشيلكود داخل عملية هذا التطبيق. العمل الأصلي بواسطة TheWover. هذا مفيد عندما تريد تجنب حقن العملية البعيدة. هذا التطبيق لا يستخدم دوال من حزمة golang.org/x/sys/windows. الفرق الأكثر أهمية هو أن هذا التطبيق يقوم بتحميل جميع ملفات DLL والإجراءات اللازمة بنفسه ويستخدم دالة Call() الخاصة بالإجراء. يمكن تجميع التطبيق باستخدام الأمر التالي على مضيف ويندوز من الدليل الجذر للمشروع:
set GOOS=windows GOARCH=amd64;go build -o EtwpCreateEtwThread.exe .\cmd\EtwpCreateEtwThread\main.go
يستخدم هذا التطبيق الدالة غير الموثقة NtQueueApcThreadEx لإنشاء "User APC خاص" (Special User APC) في الخيط الحالي للعملية الحالية لتنفيذ الشيلكود. نظرًا لأن الشيلكود يتم تحميله وتنفيذه في العملية الحالية، فهو "محلي". يمكن استخدام هذه التقنية نفسها لعملية بعيدة. ملاحظة: هذا سيعمل فقط على ويندوز 7 أو الأحدث. مرجع APC Series: User APC API.
export GOOS=windows GOARCH=amd64;go build -o goNtQueueApcThreadEx-Local.exe cmd\NtQueueApcThreadEx-Local\main.go
يستخدم هذا التطبيق دالة ويندوز RtlCreateUserThread من ntdll.dll لتنفيذ الشيلكود في عملية بعيدة. يتطلب التطبيق أن تكون العملية المستهدفة قيد التشغيل بالفعل. يمكن تقدير (PID) العملية المستهدفة في وقت التشغيل للاختبار باستخدام علامة سطر الأوامر -pid. قم بترميز PID ثابت في سطر الكود التالي للاستخدام العملي عن طريق استبدال 0 بـ PID المستهدف:
pid := flag.Int("pid", 0, "Process ID to inject shellcode into")
هذا التطبيق لا يستخدم دوال من حزمة golang.org/x/sys/windows. الفرق الأكثر أهمية هو أن هذا التطبيق يقوم بتحميل جميع ملفات DLL والإجراءات اللازمة بنفسه ويستخدم دالة Call() الخاصة بالإجراء. يمكن تجميع التطبيق باستخدام الأمر التالي على مضيف ويندوز من الدليل الجذر للمشروع:
set GOOS=windows GOARCH=amd64;go build -o RtlCreateUserThread.exe .\cmd\RtlCreateUserThread\main.go
ينفذ هذا التطبيق شيلكود في العملية الجارية الحالية عن طريق إجراء استدعاء نظامي (Syscall) على نقطة دخول الشيلكود. هذا التطبيق لا يستخدم دوال من حزمة golang.org/x/sys/windows. يمكن تجميع التطبيق باستخدام الأمر التالي على مضيف ويندوز من الدليل الجذر للمشروع:
set GOOS=windows GOARCH=amd64;go build -o Syscall.exe .\cmd\Syscall\main.go
يستخدم هذا التطبيق دالة ويندوز UuidFromStringA لتحميل الشيلكود إلى عنوان ذاكرة ثم يستدعي دالة EnumSystemLocalesA لتنفيذ الشيلكود. تم اشتقاق هذه الطريقة لتحميل وتنفيذ الشيلكود من مقال nccgroup RIFT: Analysing a Lazarus Shellcode Execution Method. بالنسبة لهذا التطبيق، يتم تخصيص الذاكرة على الكومة (heap) ولا يستخدم VirtualAlloc. يمكن تجميع التطبيق باستخدام الأمر التالي على مضيف ويندوز من الدليل الجذر للمشروع:
set GOOS=windows GOARCH=amd64;go build -o UuidFromString.exe .\cmd\UuidFromString\main.go
يستخدم هذا التطبيق لتحويل ملفات الشيلكود الثنائية. يعتمد البرنامج على أن ملف الإدخال هو ملف ثنائي (.bin) يحتوي على وحدات البايت السداسية (hex bytes) للشيلكود. يمكن لـ ShellcodeUtils ترميز ملف الإدخال باستخدام base64 فقط، أو تشفيره باستخدام XOR أو RC4 أو AES256-GCM. يمكن أيضًا استخدام الأدوات لفك تشفير الملفات.
قائمة مساعدة ShellcodeUtils:
-base64
ترميز الإخراج باستخدام Base64. يمكن استخدامه مع أو بدون تشفير
-i string
مسار ملف الإدخال الثنائي
-key string
مفتاح التشفير
-mode string
وضع العملية التي سيتم تنفيذها على ملف الإدخال [encrypt,decrypt] (الافتراضي "encrypt")
-nonce string
Nonce، بصيغة سداسية عشرية، يستخدم لفك تشفير ملف إدخال AES256. يُستخدم فقط أثناء فك التشفير
-o string
مسار ملف الإخراج
-salt string
Salt، بصيغة سداسية عشرية، يستخدم لإنشاء مفتاح AES256 بحجم 32 بايت عبر Argon2. يُستخدم فقط أثناء فك التشفير
-type string
نوع التشفير الذي سيتم استخدامه [xor, aes256, rc4, null]
-v تفعيل الإخراج المفصل
مثال على ترميز ملف الإدخال باستخدام Base64 فقط وحفظه كملف نصي:
PS C:\Users\bob> .\ShellcodeUtils.exe -i C:\Users\bob\calc.bin -o C:\Users\bob\calc.b64.txt -base64 -v
[-]Output directory: C:\Users\bob\
[-]Output file name: calc.b64.txt
[-]File contents (hex): 505152535657556a605a6863616c6354594883ec2865488b32488b7618488b761048ad488b30488b7e3003573c8b5c17288b741f204801fe8b541f240fb72c178d5202ad813c0757696e4575ef8b741f1c4801fe8b34ae4801f799ffd74883c4305d5f5e5b5a5958c3
[-]No encryption type provided, continuing on...
[+]Output (string):
UFFSU1ZXVWpgWmhjYWxjVFlIg+woZUiLMkiLdhhIi3YQSK1IizBIi34wA1c8i1wXKIt0HyBIAf6LVB8kD7csF41SAq2BPAdXaW5Fde+LdB8cSAH+izSuSAH3mf/XSIPEMF1fXltaWVjD
[+] encrypt input and wrote 140 bytes to: C:\Users\bob\calc.b64.txt
مثال على تشفير ملف الإدخال باستخدام XOR بمفتاح Sh3!1z وترميز الإخراج باستخدام Base64 أيضًا:
PS C:\Users\bob> .\ShellcodeUtils.exe -i C:\Users\bob\calc.bin -o C:\Users\bob\calc.xor.b64.txt -mode encrypt -type xor -key Sh3!1z -v
[-]Output directory: C:\Users\bob\
[-]Output file name: calc.xor.b64.txt
[-]File contents (hex): 505152535657556a605a6863616c6354594883ec2865488b32488b7618488b761048ad488b30488b7e3003573c8b5c17288b741f204801fe8b541f240fb72c178d5202ad813c0757696e4575ef8b741f1c4801fe8b34ae4801f799ffd74883c4305d5f5e5b5a5958c3
[-]XOR encrypting input file with key: Sh3!1z
[+]Output (hex):
03396172672d0602537b5919320450756832d0841b4479f16120b8572932d81e23699c32d8587baa4f4a503f0faa6d6d7be3473e11325296b8752e5e5cdf1f36bc2851c5b21d362d3a067654def127772f693084d85c9d69308dca97e469b2be63356c7f6a200a30f0
[+]xor encrypt input and wrote 105 bytes to: C:\Users\bob\calc.xor.b64.txt
مثال على تشفير ملف الإدخال باستخدام AES256-GCM بكلمة مرور Sh3!1z دون ترميز الإخراج باستخدام Base64:
PS C:\Users\bob> .\ShellcodeUtils.exe -i C:\Users\bob\calc.bin -o C:\Users\bob\calc.aes.bin -mode encrypt -type aes256 -key Sh3!1z -v
[-]Output directory: C:\Users\bob\
[-]Output file name: calc.aes.bin
[-]File contents (hex): 505152535657556a605a6863616c6354594883ec2865488b32488b7618488b761048ad488b30488b7e3003573c8b5c17288b741f204801fe8b541f240fb72c178d5202ad813c0757696e4575ef8b741f1c4801fe8b34ae4801f799ffd74883c4305d5f5e5b5a5958c3
[-]AES256 encrypting input file
[+]Argon2 salt (hex): db6126d3ac640f8aaa67cda74b8cf1d2c54513db7bf4fbe3422d1b276af1367e
[+]AES256 key (32-bytes) derived from input password Sh3!1z (hex): 096a40f1aef38dd9b5d63284acc19727c4420dd98f21ea052112bef63eb7d94a
[+]AES256 nonce (hex): 13802153c4b2fb6a3e545ff4
[+]Output (hex):
44a974233e37b460dc2181b16846f265e8e3a07959abf9c8760f7d0ac8029575e67571ea5b313bc8b011739db57c690ec156a4b0bba4e4d632c35c1490aeaac24f5ae05e90934adf57798ee3c702a3c27073fe976fbcc6ee5db355da186c1add58913e41a8c5716a0fcfc27371f0cae906e50e680366496a00
[+]aes256 encrypt input and wrote 121 bytes to: C:\Users\bob\calc.aes.bin
يتطلب AES256 مفتاحًا بحجم 32 بايت. يستخدم هذا البرنامج خوارزمية Argon2 ID لأخذ كلمة المرور المقدمة مع معامل الإدخال -key لاشتقاق مفتاح بحجم 32 بايت مع استخدام salt يتم إنشاؤه عشوائيًا. ستحتاج إلى نفس كلمة مرور الإدخال و salt المستخدم مع خوارزمية Argon2 ونفس nonce المستخدم مع خوارزمية AES256 لفك تشفير الملف بنجاح. بدلاً من ذلك، يمكن تحديث وظيفة فك التشفير لاستخدام مفتاح Argon2 بحجم 32 بايت فقط بدلاً من كلمة مرور الإدخال و salt.
ملاحظة: الأمر متروك للمشغل ليقرر ما إذا كان سيستخدم مفتاح Argon2 المُنشأ فقط أو ساستخدام كلمة المرور و salt المستخدمين لإنشاء المفتاح.
مثال على فك تشفير ملف إدخال AES256:
PS C:\Users\bob> .\ShellcodeUtils.exe -i C:\Users\bob\calc.aes.bin -o C:\Users\bob\calc.aes.decrypted.bin -mode decrypt -type aes256 -key Sh3!1z -nonce 13802153c4b2fb6a3e545ff4 -salt db6126d3ac640f8aaa67cda74b8cf1d2c54513db7bf4fbe3422d1b276af1367e -v
[-]Output directory: C:\Users\bob\
[-]Output file name: calc.aes.decrypted.bin
[-]File contents (hex): 44a974233e37b460dc2181b16846f265e8e3a07959abf9c8760f7d0ac8029575e67571ea5b313bc8b011739db57c690ec156a4b0bba4e4d632c35c1490aeaac24f5ae05e90934adf57798ee3c702a3c27073fe976fbcc6ee5db355da186c1add58913e41a8c5716a0fcfc27371f0cae906e50e680366496a00
[-]AES256 decrypting input file
[-]Argon2 salt (hex): db6126d3ac640f8aaa67cda74b8cf1d2c54513db7bf4fbe3422d1b276af1367e
[-]AES256 key (hex): 096a40f1aef38dd9b5d63284acc19727c4420dd98f21ea052112bef63eb7d94a
[-]AES256 nonce (hex): 13802153c4b2fb6a3e545ff4
[+]Output (hex):
505152535657556a605a6863616c6354594883ec2865488b32488b7618488b761048ad488b30488b7e3003573c8b5c17288b741f204801fe8b541f240fb72c178d5202ad813c0757696e4575ef8b741f1c4801fe8b34ae4801f799ffd74883c4305d5f5e5b5a5958c3
[+]aes256 decrypt input and wrote 105 bytes to: C:\Users\bob\calc.aes.decrypted.bin
يمكن تجميع التطبيق باستخدام الأمر التالي على مضيف ويندوز من الدليل الجذر للمشروع:
set GOOS=windows GOARCH=amd64;go build -o ShellcodeUtils.exe .\cmd\ShellcodeUtils\main.go