অন্য দিন আমি এমন একটি পরিষেবা দেখেছিলাম যা সার্ভারের দিকে অনুরোধের স্বাক্ষর যাচাই করে। এটি একটি ছোট অনলাইন ক্যাসিনো ছিল, যা প্রতিটি অনুরোধের জন্য ব্রাউজার থেকে ব্যবহারকারীর পাঠানো কিছু মান পরীক্ষা করে। আপনি ক্যাসিনোতে যা করছেন তা নির্বিশেষে: একটি বাজি রাখা বা একটি আমানত করা, প্রতিটি অনুরোধে একটি অতিরিক্ত প্যারামিটার ছিল "চিহ্ন" মান, যা আপাতদৃষ্টিতে এলোমেলো অক্ষরের একটি সেট নিয়ে গঠিত। এটি ছাড়া একটি অনুরোধ পাঠানো অসম্ভব ছিল - সাইটটি একটি ত্রুটি ফেরত দিয়েছে, এবং এটি আমাকে আমার নিজস্ব কাস্টম অনুরোধ পাঠাতে বাধা দিয়েছে৷
এই মান না থাকলে, আমি সেই মুহুর্তে সাইটটি ছেড়ে দিতাম এবং এটি আর কখনও ভাবতাম না। কিন্তু, সমস্ত প্রতিকূলতার বিপরীতে, এটি আমাকে উত্তেজিত করে তুলেছিল দ্রুত লাভের অনুভূতি নয়, বরং গবেষণার আগ্রহ এবং চ্যালেঞ্জ যা ক্যাসিনো আমাকে তার মূর্খ-প্রুফিং দিয়ে দিয়েছিল।
এই প্যারামিটারটি যোগ করার সময় বিকাশকারীরা যে উদ্দেশ্যটি মাথায় রেখেছিলেন তা নির্বিশেষে, এটি আমার কাছে সময় নষ্ট বলে মনে হয়। সর্বোপরি, স্বাক্ষর নিজেই ক্লায়েন্ট সাইডে তৈরি হয় এবং যেকোন ক্লায়েন্ট-সাইড অ্যাকশন রিভার্স-ইঞ্জিনিয়ারিং সাপেক্ষে হতে পারে।
এই নিবন্ধে, আমি আলোচনা করব কিভাবে আমি পরিচালনা করেছি:
এই নিবন্ধটি আপনাকে শেখাবে কীভাবে আপনার মূল্যবান সময় বাঁচাতে হবে এবং আপনি যদি একজন বিকাশকারী হন যিনি নিরাপদ প্রকল্পগুলি করতে আগ্রহী হন তবে অকেজো সমাধানগুলি প্রত্যাখ্যান করবেন। এবং যদি আপনি একজন পেন্টেস্টার হন, এই নিবন্ধটি পড়ার পরে, আপনি নিরাপত্তার সুইস ছুরির জন্য আপনার নিজস্ব এক্সটেনশনগুলি প্রোগ্রামিং করার পাশাপাশি ডিবাগিং সম্পর্কে কিছু দরকারী পাঠ শিখতে পারেন৷ সংক্ষেপে, সবাই প্লাস দিকে আছে।
যাক অবশেষে পয়েন্ট পেতে.
সুতরাং, পরিষেবাটি ক্লাসিক গেমগুলির একটি সেট সহ একটি অনলাইন ক্যাসিনো:
সার্ভারের সাথে মিথস্ক্রিয়া সম্পূর্ণরূপে HTTP অনুরোধের ভিত্তিতে কাজ করে। আপনি যে গেমটিই বেছে নিন না কেন, সার্ভারে প্রতিটি POST অনুরোধ অবশ্যই স্বাক্ষরিত হতে হবে - অন্যথায় সার্ভার একটি ত্রুটি তৈরি করবে৷ এই গেমগুলির প্রতিটিতে অনুরোধ স্বাক্ষর করা একই নীতিতে কাজ করে - আমি তদন্ত করার জন্য শুধুমাত্র একটি গেম নেব যাতে আমাকে একই কাজ দুবার করতে না হয়।
এবং আমি ড্রাগন অন্ধকূপ নামক একটি খেলা নিতে যাচ্ছি.
এই গেমের সারমর্ম হল একটি নাইটের ভূমিকায় ক্রমানুসারে দুর্গের দরজা বেছে নেওয়া। প্রতিটি দরজার পিছনে একটি ধন বা ড্রাগন লুকিয়ে থাকে। প্লেয়ার যদি দরজার পিছনে একটি ড্রাগন জুড়ে আসে, গেমটি বন্ধ হয়ে যায় এবং সে টাকা হারায়। যদি ধন পাওয়া যায় - প্রাথমিক বাজির পরিমাণ বৃদ্ধি পায় এবং যতক্ষণ পর্যন্ত না খেলোয়াড় জয়লাভ করে, হারায় বা সমস্ত স্তর অতিক্রম না করে ততক্ষণ পর্যন্ত খেলা চলতে থাকে।
খেলা শুরু করার আগে, খেলোয়াড়কে বাজির পরিমাণ এবং ড্রাগনের সংখ্যা উল্লেখ করতে হবে।
আমি যোগফল হিসাবে 10 নম্বরটি লিখি, একটি ড্রাগন ছেড়ে যে অনুরোধটি পাঠানো হবে তা দেখুন। এটি যে কোনও ব্রাউজারে বিকাশকারী সরঞ্জামগুলি থেকে করা যেতে পারে, ক্রোমিয়ামে নেটওয়ার্ক ট্যাব এর জন্য দায়ী।
এখানে আপনি দেখতে পারেন যে অনুরোধটি /srv/api/v1/dungeon
এন্ডপয়েন্টে পাঠানো হয়েছে।
পেলোড ট্যাব JSON ফর্ম্যাটে অনুরোধের বডিটি প্রদর্শন করে
প্রথম দুটি পরামিতি সুস্পষ্ট - আমি সেগুলিকে UI থেকে বেছে নিয়েছি; শেষটি, আপনি অনুমান করতে পারেন, timestamp
বা সময় যা 1 জানুয়ারী, 1970 থেকে মিলিসেকেন্ডের সাধারণ জাভাস্ক্রিপ্ট নির্ভুলতার সাথে অতিবাহিত হয়েছে।
এটি একটি অমীমাংসিত প্যারামিটার ছেড়ে যায় এবং, - এবং এটি নিজেই স্বাক্ষর। এটি কীভাবে গঠিত হয় তা বোঝার জন্য, আমি উত্স ট্যাবে যাই - এই স্থানে ব্রাউজারটি লোড করা পরিষেবার সমস্ত সংস্থান রয়েছে। জাভাস্ক্রিপ্ট সহ, যা সাইটের ক্লায়েন্ট অংশের সমস্ত যুক্তির জন্য দায়ী।
এই কোডটি বোঝা এত সহজ নয় - এটি ছোট করা হয়েছে। আপনি এটি সব ডিঅফসকেট করার চেষ্টা করতে পারেন - তবে এটি একটি দীর্ঘ এবং ক্লান্তিকর প্রক্রিয়া যা অনেক সময় নেবে (সোর্স কোডের পরিমাণ বিবেচনা করে), আমি এটি করতে প্রস্তুত নই।
দ্বিতীয় এবং সহজ বিকল্প হল একটি কীওয়ার্ড দ্বারা কোডের প্রয়োজনীয় অংশ খুঁজে বের করা এবং ডিবাগার ব্যবহার করা। আমি এটাই করব, কারণ পুরো সাইটটি কীভাবে কাজ করে তা আমার জানার দরকার নেই, আমাকে শুধু জানতে হবে কিভাবে স্বাক্ষর তৈরি হয়।
সুতরাং, কোড তৈরি করার জন্য দায়ী কোডের অংশ খুঁজে পেতে, আপনি CTRL+SHIFT+F
কী সংমিশ্রণ ব্যবহার করে সমস্ত উৎসের মাধ্যমে একটি অনুসন্ধান খুলতে পারেন এবং পাঠানো sign
কীটির একটি মান নির্ধারণ করতে পারেন। অনুরোধে
সৌভাগ্যবশত, শুধুমাত্র একটি ম্যাচ আছে, যার মানে আমি সঠিক পথে আছি।
আপনি যদি একটি মিলের উপর ক্লিক করেন, আপনি কোড বিভাগে যেতে পারেন যেখানে স্বাক্ষর নিজেই তৈরি হয়। কোডটি আগের মতো অস্পষ্ট, তাই এটি এখনও পড়া কঠিন।
কোডের লাইনের বিপরীতে আমি একটি ব্রেকপয়েন্ট রেখেছি, পৃষ্ঠাটি রিফ্রেশ করেছি এবং "ড্রাগনস" এ একটি নতুন বিড তৈরি করেছি - এখন স্ক্রিপ্টটি স্বাক্ষর গঠনের মুহুর্তে ঠিক তার কাজ বন্ধ করে দিয়েছে এবং আপনি কিছু ভেরিয়েবলের অবস্থা দেখতে পাচ্ছেন।
বলা ফাংশন একটি অক্ষর নিয়ে গঠিত, ভেরিয়েবলগুলিও - কিন্তু কোন সমস্যা নেই। আপনি কনসোলে যেতে পারেন এবং তাদের প্রতিটির মান প্রদর্শন করতে পারেন। পরিস্থিতি আরও পরিষ্কার হতে শুরু করে।
প্রথম মানটি আমি আউটপুট করি ভেরিয়েবল H
এর মান, যা একটি ফাংশন। আপনি কনসোল থেকে এটিতে ক্লিক করতে পারেন এবং কোডে যেখানে এটি ঘোষণা করা হয়েছে সেখানে যেতে পারেন, নীচে তালিকাটি রয়েছে।
এটি কোডের একটি বেশ বড় স্নিপেট যেখানে আমি একটি সূত্র দেখেছি - SHA256। এটি একটি হ্যাশিং অ্যালগরিদম। আপনি আরও দেখতে পারেন যে দুটি প্যারামিটার ফাংশনে পাস করা হয়েছে, যা ইঙ্গিত দেয় যে এটি শুধুমাত্র SHA256 নয়, HMAC SHA256 একটি গোপনীয়তার সাথে হতে পারে।
সম্ভবত এখানে পাস করা ভেরিয়েবল (এছাড়াও কনসোলে আউটপুট):
10;1;6693a87bbd94061678473bfb;1732817300080;gRdVWfmU-YR_RCuSkWFLCUTly_GZfDx3KEM8
- সরাসরি যে মানটিতে HMAC SHA256 অপারেশন প্রয়োগ করা হয়েছে।31754cff-be0f-446f-9067-4cd827ba8707
হল একটি স্থির ধ্রুবক যা একটি গোপন হিসাবে কাজ করে
এটি নিশ্চিত করার জন্য, আমি ফাংশন কল এবং অনুমান স্বাক্ষর পেতে
এখন আমি সেই সাইটে যাই যা HMAC SHA256 গণনা করে এবং এতে মান পাস করে।
এবং আমি বিড স্থাপন করার সময় যে অনুরোধ পাঠানো হয়েছিল তার সাথে তুলনা করা।
ফলাফলটি অভিন্ন, যার মানে আমার অনুমান সঠিক ছিল - এটি সত্যিই একটি স্ট্যাটিক গোপনীয়তার সাথে HMAC SHA256 ব্যবহার করে, যা হার, ড্রাগনের সংখ্যা এবং কিছু অন্যান্য পরামিতি সহ একটি বিশেষভাবে গঠিত স্ট্রিং পাস করা হয়, যা আমি আপনাকে আরও জানাব নিবন্ধের কোর্সে।
অ্যালগরিদম বেশ সহজ এবং সোজা। তবে এটি এখনও যথেষ্ট নয় - যদি দুর্বলতাগুলি খুঁজে বের করা পেন্টেস্টের জন্য একটি কাজের প্রকল্পের মধ্যে এটি একটি লক্ষ্য হয়, তবে আমাকে বার্প স্যুট ব্যবহার করে আমার নিজের প্রশ্নগুলি কীভাবে পাঠাতে হয় তা শিখতে হবে।
এবং এটি অবশ্যই অটোমেশন প্রয়োজন, যা আমি এখন সম্পর্কে কথা বলতে যাচ্ছি।
আমি স্বাক্ষর তৈরির অ্যালগরিদম বের করেছি। এখন অনুরোধ পাঠানোর সময় সমস্ত অপ্রয়োজনীয় জিনিসগুলিকে বিমূর্ত করার জন্য কীভাবে এটি স্বয়ংক্রিয়ভাবে তৈরি করা যায় তা শেখার সময় এসেছে৷
আপনি ZAP, Caido, Burp Suite, এবং অন্যান্য pentest টুল ব্যবহার করে অনুরোধ পাঠাতে পারেন। এই নিবন্ধটি বার্প স্যুটে ফোকাস করবে, কারণ আমি এটিকে সবচেয়ে ব্যবহারকারী-বান্ধব এবং প্রায় নিখুঁত বলে মনে করি। কমিউনিটি সংস্করণ অফিসিয়াল সাইট থেকে বিনামূল্যে ডাউনলোড করা যেতে পারে, এটি সমস্ত পরীক্ষার জন্য যথেষ্ট।
বাক্সের বাইরে Burp Suite কিভাবে HMAC SHA256 তৈরি করতে হয় তা জানে না। অতএব, এটি করার জন্য, আপনি বার্প স্যুটের কার্যকারিতা পরিপূরক এক্সটেনশনগুলি ব্যবহার করতে পারেন।
এক্সটেনশানগুলি উভয় সম্প্রদায়ের সদস্যদের দ্বারা এবং বিকাশকারীদের দ্বারা তৈরি করা হয়৷ এগুলি বিল্ট-ইন ফ্রি BApp স্টোর, গিথুব বা অন্যান্য সোর্স কোড রিপোজিটরির মাধ্যমে বিতরণ করা হয়।
আপনি নিতে পারেন দুটি পথ আছে:
এই পথের প্রতিটির সুবিধা এবং অসুবিধা রয়েছে, আমি আপনাকে উভয়ই দেখাব।
রেডিমেড এক্সটেনশন সহ পদ্ধতিটি সবচেয়ে সহজ। এটি BApp স্টোর থেকে ডাউনলোড করতে হবে এবং sign
প্যারামিটারের জন্য একটি মান তৈরি করতে এর বৈশিষ্ট্যগুলি ব্যবহার করতে হবে।
আমি যে এক্সটেনশনটি ব্যবহার করেছি তাকে হ্যাকভারটর বলা হয়। এটি আপনাকে সিনট্যাক্সের মতো XML ব্যবহার করতে দেয় যাতে আপনি গতিশীলভাবে এনকোড/ডিকোড, এনক্রিপ্ট/ডিক্রিপ্ট, বিভিন্ন ডেটা হ্যাশ করতে পারেন।
এটি ইনস্টল করার জন্য, Burp এর প্রয়োজন:
এক্সটেনশন ট্যাবে যান
অনুসন্ধানে Hackvertor টাইপ করুন
তালিকায় পাওয়া এক্সটেনশন নির্বাচন করুন
Install এ ক্লিক করুন
এটি ইনস্টল হয়ে গেলে, একই নামের একটি ট্যাব Burp-এ উপস্থিত হবে। আপনি এটিতে যেতে পারেন এবং এক্সটেনশনের ক্ষমতা এবং উপলব্ধ ট্যাগের সংখ্যা মূল্যায়ন করতে পারেন, যার প্রতিটি একে অপরের সাথে মিলিত হতে পারে।
একটি উদাহরণ দিতে, আপনি <@aes_encrypt('supersecret12356','AES/ECB/PKCS5PADDING')>MySuperSecretText<@/aes_encrypt>
ট্যাগ ব্যবহার করে সিমেট্রিক AES দিয়ে কিছু এনক্রিপ্ট করতে পারেন।
গোপনীয়তা এবং অ্যালগরিদম বন্ধনীতে রয়েছে এবং ট্যাগের মধ্যে টেক্সটটি এনক্রিপ্ট করা হবে। যেকোনো ট্যাগ রিপিটার, ইনট্রুডার এবং অন্যান্য বিল্ট-ইন Burp Suite টুলে ব্যবহার করা যেতে পারে।
হ্যাকভার্টার এক্সটেনশনের সাহায্যে আপনি ট্যাগ স্তরে একটি স্বাক্ষর কীভাবে তৈরি করা উচিত তা বর্ণনা করতে পারেন। আমি একটি বাস্তব অনুরোধের উদাহরণ এটি করতে যাচ্ছি.
তাই, আমি ড্রাগন অন্ধকূপে একটি বাজি রাখি, ইন্টারসেপ্ট প্রক্সি দিয়ে এই নিবন্ধের শুরুতে আমি যে অনুরোধ করেছিলাম সেই একই অনুরোধটি আটকে দিয়েছিলাম এবং এটি সম্পাদনা করতে এবং পুনরায় জমা দিতে সক্ষম হওয়ার জন্য এটিকে রিপিটারে চাপ দিই৷
এখন ae04afe621864f569022347f1d1adcaa3f11bebec2116d49c4539ae1d2c825fc
মানের জায়গায়, হ্যাক দ্বারা প্রদত্ত ট্যাগগুলি ব্যবহার করে HMAC SHA256 তৈরি করতে আমাদের অ্যালগরিদম প্রতিস্থাপন করতে হবে৷
ফরমুলা গেনেরাসিই у меня получилась следующая <@hmac_sha256('31754cff-be0f-446f-9067-4cd827ba8707')>10;1;6693a87bbd94061678473bfb;<@timestamp/>000;MDWpmNV9-j8tKbk-evbVLtwMsMjKwQy5YEs4<@/hmac_sha256>
.
সমস্ত পরামিতি বিবেচনা করুন:
10
- বাজি পরিমাণ1
- ড্রাগন সংখ্যা6693a87bbd94061678473bfb
- MongoDB ডাটাবেস থেকে অনন্য ব্যবহারকারী আইডি, আমি ব্রাউজার থেকে স্বাক্ষর বিশ্লেষণ করার সময় এটি দেখেছি, কিন্তু আমি তখন এটি সম্পর্কে লিখিনি। আমি Burp Suite-এ প্রশ্নের বিষয়বস্তু অনুসন্ধান করে এটি খুঁজে পেতে সক্ষম হয়েছি, এটি /srv/api/v1/profile/me
এন্ডপয়েন্ট ক্যোয়ারী থেকে ফিরে আসে।
<@timestamp/>000
- টাইমস্ট্যাম্প প্রজন্ম, শেষ তিনটি শূন্য সময়কে মিলিসেকেন্ডে পরিমার্জন করেMDWpmNV9-j8tKbk-evbVLtwMsMjKwQy5YEs4
- CSRF টোকেন, যা /srv/api/v1/csrf
এন্ডপয়েন্ট থেকে ফেরত দেওয়া হয় এবং প্রতিটি অনুরোধে X-Xsrf-Token
হেডারে প্রতিস্থাপিত হয়।<@hmac_sha256('31754cff-be0f-446f-9067-4cd827ba8707')>
এবং <@/hmac_sha256>
- প্রতিস্থাপিত মান থেকে HMAC SHA256 তৈরি করার জন্য ট্যাগ খোলা এবং বন্ধ করার জন্য একটি কনসট্যান্ট হিসাবে গোপন 31754cff-be0f-446f-9067-4cd827ba8707
।
নোট করা গুরুত্বপূর্ণ: পরামিতিগুলিকে একে অপরের সাথে সংযুক্ত থাকতে হবে এর মাধ্যমে ;
কঠোর ক্রমে, - অন্যথায় স্বাক্ষরটি ভুলভাবে তৈরি হবে - যেমন এই স্ক্রিনশটটিতে আমি হার এবং ড্রাগনের সংখ্যা পরিবর্তন করেছি
সেখানেই সব জাদু লুকিয়ে আছে।
এখন আমি একটি সঠিক ক্যোয়ারী করি, যেখানে আমি সঠিক ক্রমে প্যারামিটারগুলি নির্দিষ্ট করি এবং তথ্য পাই যে সবকিছু সফল হয়েছে এবং গেমটি শুরু হয়েছে - এর মানে হল যে হ্যাকভার্টার একটি সূত্রের পরিবর্তে একটি স্বাক্ষর তৈরি করেছে, এটি ক্যোয়ারীতে প্রতিস্থাপিত করেছে এবং সবকিছু কাজ করে .
যাইহোক, এই পদ্ধতির একটি উল্লেখযোগ্য অসুবিধা আছে - আপনি ম্যানুয়াল কাজ সম্পূর্ণরূপে পরিত্রাণ পেতে পারবেন না। প্রতিবার আপনি JSON-এ ড্রাগনের হার বা সংখ্যা পরিবর্তন করার সময়, আপনাকে তাদের সাথে মিল করার জন্য স্বাক্ষরে এটি পরিবর্তন করতে হবে।
এছাড়াও, আপনি যদি প্রক্সি ট্যাব থেকে ইনট্রুডার বা রিপিটারে একটি নতুন অনুরোধ পাঠান, তাহলে আপনাকে ফর্মুলাটি পুনরায় লিখতে হবে, যেটি খুব, খুব অসুবিধাজনক যখন আপনার বিভিন্ন পরীক্ষার ক্ষেত্রে অনেকগুলি ট্যাবের প্রয়োজন হয়৷
এই সূত্রটি অন্যান্য কোয়েরিতেও ব্যর্থ হবে যেখানে অন্যান্য প্যারামিটার ব্যবহার করা হয়।
তাই আমি এই অসুবিধাগুলি কাটিয়ে উঠতে আমার নিজের এক্সটেনশন লেখার সিদ্ধান্ত নিয়েছি।
আপনি জাভা এবং পাইথনে Burp Suite এর জন্য এক্সটেনশন লিখতে পারেন। আমি দ্বিতীয় প্রোগ্রামিং ভাষা ব্যবহার করব কারণ এটি সহজ এবং আরো ভিজ্যুয়াল। তবে আপনাকে আগে থেকেই নিজেকে প্রস্তুত করতে হবে: প্রথমে আপনাকে অফিসিয়াল ওয়েবসাইট থেকে জাইথন স্ট্যান্ডঅ্যালোন ডাউনলোড করতে হবে এবং তারপরে বার্প স্যুট সেটিংসে ডাউনলোড করা ফাইলটির পথ।
এর পরে, আপনাকে সোর্স কোড এবং এক্সটেনশন *.py
সহ একটি ফাইল তৈরি করতে হবে।
আমার কাছে ইতিমধ্যে একটি বিলেট আছে যা মৌলিক যুক্তি সংজ্ঞায়িত করে, এখানে এর বিষয়বস্তু রয়েছে:
সবকিছু স্বজ্ঞাতভাবে সহজ এবং সহজবোধ্য:
getActionName
- এই পদ্ধতিটি এক্সটেনশন দ্বারা সম্পাদিত কর্মের নাম প্রদান করে। এক্সটেনশনটি নিজেই একটি সেশন হ্যান্ডলিং নিয়ম যোগ করে যা যেকোনো অনুরোধে নমনীয়ভাবে প্রয়োগ করা যেতে পারে, কিন্তু পরবর্তীতে আরও কিছু। এটি জানা গুরুত্বপূর্ণ যে এই নামটি এক্সটেনশনের নামের থেকে আলাদা হতে পারে এবং এটি ইন্টারফেস থেকে নির্বাচনযোগ্য হবে৷performAction
- নিয়মের যুক্তি, যা নির্বাচিত অনুরোধগুলিতে প্রয়োগ করা হবে, এখানে বানান করা হবে
উভয় পদ্ধতি ISessionHandlingAction ইন্টারফেস অনুযায়ী ঘোষণা করা হয়।
এখন IBurpExtender ইন্টারফেসে। এটি শুধুমাত্র প্রয়োজনীয় পদ্ধতি registerExtenderCallbacks
ঘোষণা করে, যা এক্সটেনশনটি লোড করার সাথে সাথেই কার্যকর করা হয় এবং এটি কাজ করার জন্য প্রয়োজনীয়।
এখানে মৌলিক কনফিগারেশন করা হয়:
callbacks.setExtensionName(EXTENSION_NAME)
- সেশন পরিচালনা করার জন্য একটি ক্রিয়া হিসাবে বর্তমান এক্সটেনশন নিবন্ধন করেsys.stdout = callbacks.getStdout()
- স্ট্যান্ডার্ড আউটপুট (stdout) Burp Suite আউটপুট উইন্ডোতে পুনঃনির্দেশ করে ("এক্সটেনশন" প্যানেল)self.stderr = PrintWriter(callbacks.getStdout(), True)
- আউটপুট ত্রুটির জন্য একটি স্ট্রীম তৈরি করেself.stdout.println(EXTENSION_NAME)
- বার্প স্যুটে এক্সটেনশনের নাম প্রিন্ট করেself.callbacks = callbacks
- কলব্যাক অবজেক্টকে একটি স্ব-অ্যাট্রিবিউট হিসাবে সংরক্ষণ করে। এক্সটেনশন কোডের অন্যান্য অংশে Burp Suite API-এর পরবর্তী ব্যবহারের জন্য এটি প্রয়োজন।self.helpers = callbacks.getHelpers()
- এছাড়াও দরকারী পদ্ধতিগুলি পায় যা এক্সটেনশন চলার সাথে সাথে প্রয়োজন হবে
প্রাথমিক প্রস্তুতি সেরে ফেলেছে। এখন আপনি এক্সটেনশনটি লোড করতে পারেন এবং নিশ্চিত করুন যে এটি একেবারে কাজ করে। এটি করার জন্য, এক্সটেনশন ট্যাবে যান এবং যোগ করুন ক্লিক করুন।
প্রদর্শিত উইন্ডোতে, নির্দিষ্ট করুন
এবং Next ক্লিক করুন।
যদি সোর্স কোড ফাইলটি সঠিকভাবে ফরম্যাট করা হয়, কোন ত্রুটি ঘটতে হবে না এবং আউটপুট ট্যাব এক্সটেনশনের নাম প্রদর্শন করবে। এর মানে হল সবকিছু ঠিকঠাক কাজ করছে।
এক্সটেনশন লোড হয় এবং কাজ করে - তবে যা লোড করা হয়েছিল তা কোনও যুক্তি ছাড়াই একটি মোড়ক ছিল, এখন অনুরোধে স্বাক্ষর করার জন্য আমার সরাসরি কোডের প্রয়োজন। আমি ইতিমধ্যে এটি লিখেছি এবং এটি নীচের স্ক্রিনশটে দেখানো হয়েছে।
পুরো এক্সটেনশনটি যেভাবে কাজ করে তা হল সার্ভারে অনুরোধ পাঠানোর আগে, এটি আমার এক্সটেনশন দ্বারা সংশোধন করা হবে।
আমি প্রথমে অনুরোধটি গ্রহণ করি যে এক্সটেনশনটি আটকানো হয়েছে এবং এর শরীর থেকে হার এবং ড্রাগনের সংখ্যা পেতে
json_body = json.loads(message_body) amount_currency = json_body["amountCurrency"] dragons = json_body["dragons"]
এর পরে, আমি বর্তমান টাইমস্ট্যাম্প পড়ি এবং সংশ্লিষ্ট হেডার থেকে CSRF টোকেন পাই
currentTime = str(time.time()).split('.')[0]+'100' xcsrf_token = None for header in headers: if header.startswith("X-Xsrf-Token"): xcsrf_token = header.split(":")[1].strip()
এরপরে, অনুরোধটি নিজেই HMAC SHA256 ব্যবহার করে স্বাক্ষরিত হয়
hmac_sign = hmac_sha256(key, message=";".join([str(amount_currency), str(dragons), user_id, currentTime, xcsrf_token]))
ফাংশন নিজেই এবং ধ্রুবকগুলি গোপন এবং ব্যবহারকারী আইডি নির্দেশ করে শীর্ষে পূর্ব-ঘোষিত ছিল
def hmac_sha256(key, message): return hmac.new( key.encode("utf-8"), message.encode("utf-8"), hashlib.sha256 ).hexdigest() key = "434528cb-662f-484d-bda9-1f080b861392" user_id = "zex2q6cyc4ba3gvkyex5f80m"
তারপর মানগুলি অনুরোধের বডিতে লেখা হয় এবং JSON-এ রূপান্তরিত হয়
json_body["sign"] = hmac_sign json_body["t"] = currentTime message_body = json.dumps(json_body)
চূড়ান্ত পদক্ষেপ হল একটি স্বাক্ষরিত এবং পরিবর্তিত অনুরোধ তৈরি করা এবং এটি পাঠানো
httpRequest = self.helpers.buildHttpMessage(get_final_headers, message_body) baseRequestResponse.setRequest(httpRequest)
এই সব, সোর্স কোড লেখা হয়. এখন আপনি Burp Suite এ এক্সটেনশনটি পুনরায় লোড করতে পারেন (এটি প্রতিটি স্ক্রিপ্ট পরিবর্তনের পরে করা উচিত), এবং নিশ্চিত করুন যে সবকিছু কাজ করে।
কিন্তু প্রথমে আপনাকে অনুরোধ প্রক্রিয়াকরণের জন্য একটি নতুন নিয়ম যোগ করতে হবে। এটি করতে, সেটিংসে যান, সেশন বিভাগে যান। এখানে আপনি অনুরোধ পাঠানোর সময় ট্রিগার করা সমস্ত বিভিন্ন নিয়ম পাবেন।
নির্দিষ্ট ধরনের অনুরোধে ট্রিগার করে এমন একটি এক্সটেনশন যোগ করতে Add এ ক্লিক করুন।
প্রদর্শিত উইন্ডোতে, আমি সবকিছু যেমন আছে তেমনই রেখে দিই এবং অ্যাড ইন রুল অ্যাকশন নির্বাচন করুন
একটি ড্রপ-ডাউন তালিকা প্রদর্শিত হবে। এটিতে, একটি বার্প এক্সটেনশন আহ্বান করুন নির্বাচন করুন।
এবং এটির জন্য অনুরোধ পাঠানোর সময় যে এক্সটেনশনটি কল করা হবে তা নির্দিষ্ট করুন। আমার একটি আছে, এবং এটি Burp এক্সটেনশন.
এক্সটেনশন নির্বাচন করার পরে, আমি ঠিক আছে ক্লিক করুন. এবং আমি স্কোপ ট্যাবে যাই, যেখানে আমি উল্লেখ করি:
টুল স্কোপ - রিপিটার (রিপিটারের মাধ্যমে ম্যানুয়ালি অনুরোধ পাঠালে এক্সটেনশনটি ট্রিগার হওয়া উচিত)
URL স্কোপ - সমস্ত URL অন্তর্ভুক্ত করুন (যাতে এটি আমার পাঠানো সমস্ত অনুরোধে কাজ করে)।
এটি নীচের স্ক্রিনশটের মতো কাজ করা উচিত।
ঠিক আছে ক্লিক করার পরে, এক্সটেনশন নিয়মটি সাধারণ তালিকায় উপস্থিত হয়।
অবশেষে, আপনি কর্ম সবকিছু পরীক্ষা করতে পারেন! এখন আপনি কিছু ক্যোয়ারী পরিবর্তন করতে পারেন এবং দেখতে পারেন কিভাবে স্বাক্ষরটি গতিশীলভাবে আপডেট হবে। এবং যদিও ক্যোয়ারীটি ব্যর্থ হবে, এটি হবে কারণ আমি একটি নেতিবাচক হার বেছে নিয়েছি, এই কারণে নয় যে স্বাক্ষরে কিছু ভুল আছে (আমি শুধু অর্থ অপচয় করতে চাই না 😀)। এক্সটেনশন নিজেই কাজ করে এবং স্বাক্ষর সঠিকভাবে তৈরি হয়।
সবকিছু দুর্দান্ত, তবে তিনটি সমস্যা রয়েছে:
এটি সমাধান করার জন্য, আমাদের দুটি অতিরিক্ত অনুরোধ যোগ করতে হবে, যা বিল্ট-ইন Burp Suite লাইব্রেরি দ্বারা করা যেতে পারে, requests
পরিবর্তে যে কোনো তৃতীয় পক্ষের পরিবর্তে।
এটি করার জন্য, আমি প্রশ্নগুলিকে আরও সুবিধাজনক করতে কিছু স্ট্যান্ডার্ড লজিক মোড়ানো করেছি। Burp এর স্ট্যান্ডার্ড পদ্ধতির মাধ্যমে, প্রশ্নের সাথে মিথস্ক্রিয়া pleintext এ সম্পন্ন করা হয়।
def makeRequest(self, method="GET", path="/", headers=None, body=None): first_line = method + " " + path + " HTTP/1.1" headers[0] = first_line if body is None: body = "{}" http_message = self.helpers.buildHttpMessage(headers, body) return self.callbacks.makeHttpRequest(self.request_host, self.request_port, True, http_message)
এবং আমার প্রয়োজনীয় ডেটা বের করার জন্য দুটি ফাংশন যোগ করা হয়েছে, CSRF টোকেন এবং UserID।
def get_csrf_token(self, headers): response = self.makeRequest("GET", "/srv/api/v1/csrf", headers) message = self.helpers.analyzeRequest(response) raw_headers = str(message.getHeaders()) match = re.search(r'XSRF-TOKEN=([a-zA-Z0-9_-]+)', raw_headers) return match.group(1) def get_user_id(self, headers): raw_response = self.makeRequest("POST", "/srv/api/v1/profile/me", headers) response = self.helpers.bytesToString(raw_response) match = re.search(r'"_id":"([a-f0-9]{24})"', response) return match.group(1)
এবং পাঠানো হেডারে টোকেন নিজেই আপডেট করে
def update_csrf(self, headers, token): for i, header in enumerate(headers): if header.startswith("X-Xsrf-Token:"): headers[i] = "X-Xsrf-Token: " + token return headers
স্বাক্ষর ফাংশন এই মত দেখায়. এখানে এটা মনে রাখা গুরুত্বপূর্ণ যে আমি অনুরোধে প্রেরিত সমস্ত কাস্টম প্যারামিটার গ্রহণ করি, তাদের শেষে স্ট্যান্ডার্ড user_id
, currentTime
, csrf_token
যোগ করি এবং ;
একটি বিভাজক হিসাবে।
def sign_body(self, json_body, user_id, currentTime, csrf_token): values = [] for key, value in json_body.items(): if key == "sign": break values.append(str(value)) values.extend([str(user_id), str(currentTime), str(csrf_token)]) return hmac_sha256(hmac_secret, message=";".join(values))
মূল ফ্লুটি কয়েকটি লাইনে কমিয়ে দেওয়া হয়েছে:
OrderedDict
ব্যবহার করছি যা একটি কঠোর ক্রমানুসারে অভিধান তৈরি করে কারণ স্বাক্ষর করার সময় এটি সংরক্ষণ করা গুরুত্বপূর্ণ। csrf_token = self.get_csrf_token(headers) final_headers = self.update_csrf(final_headers, csrf_token) user_id = self.get_user_id(headers) currentTime = str(time.time()).split('.')[0]+'100' json_body = json.loads(message_body, object_pairs_hook=OrderedDict) sign = self.sign_body(json_body, user_id, currentTime, csrf_token) json_body["sign"] = sign json_body["t"] = currentTime message_body = json.dumps(json_body) httpRequest = self.helpers.buildHttpMessage(final_headers, message_body) baseRequestResponse.setRequest(httpRequest)
একটি স্ক্রিনশট, শুধু নিশ্চিত হতে
এখন, আপনি যদি অন্য কোনও গেমে যান যেখানে কাস্টম প্যারামিটারগুলি ইতিমধ্যে 2 এর পরিবর্তে 3 রয়েছে এবং একটি অনুরোধ পাঠান, আপনি দেখতে পারেন যে এটি সফলভাবে পাঠানো হবে। এর মানে হল যে আমার এক্সটেনশন এখন সর্বজনীন এবং সমস্ত অনুরোধের জন্য কাজ করে৷
অ্যাকাউন্ট পুনরায় পূরণের জন্য একটি অনুরোধ পাঠানোর উদাহরণ
এক্সটেনশনগুলি Burp Suite এর একটি অবিচ্ছেদ্য অংশ। প্রায়শই পরিষেবাগুলি কাস্টম কার্যকারিতা প্রয়োগ করে যা অন্য কেউ নয়, আপনি আগে থেকেই লিখবেন। এই কারণেই শুধুমাত্র রেডিমেড এক্সটেনশনগুলি ডাউনলোড করাই গুরুত্বপূর্ণ নয়, আপনার নিজের লেখাও গুরুত্বপূর্ণ, যা আমি এই নিবন্ধে আপনাকে শেখানোর চেষ্টা করেছি।
আপাতত এতটুকুই, নিজেকে উন্নত করুন এবং অসুস্থ হবেন না।
এক্সটেনশনের সোর্স কোডের লিঙ্ক: *ক্লিক* করুন ।