تقريبا OCR للحصول على كلمة مرور VPNBook. PHP + Mikrotik

في الآونة الأخيرة ، بدأ VPNBook في نشر كلمة مرور بدلاً من النص العادي كصورة. فكرت "حسنًا ، كيف" ، وبدأت في البحث عن طرق لحل هذه المشكلة. نحن نتعرف على كلمة مرور "صورة" VPNBook في PHP. وبالطبع سيناريو Mikrotik.

لفترة طويلة ، قمت بإعداد نفق PPTP VPN مجاني تلقائيًا من VPNBook.com على جهاز التوجيه الخاص بي (Mikrotik) واستخدمته بنجاح حتى وقت قريب. لن أخوض في التفاصيل ، فهي موصوفة في مقالة " تكوين الاستلام التلقائي لكلمة مرور VPN على Mikrotik ". قبل المشكلة ، يمكن ببساطة استخراج كلمة مرور VPNBook من صفحة html ، على سبيل المثال ، على النحو التالي:

preg_match('/Password: <strong>([^<]+)/', $homepage, $matches); print($matches[1]) 

وفي الآونة الأخيرة ، أصبحت كلمة المرور "صورة". والفكرة الأولى كانت استخدام التعرف البصري على النص. بدأت في تجربة خدمات OCR عبر الإنترنت وغير المتصلة بالإنترنت ، والتي يمكنها التعرف على كلمة المرور. أرسل تحياتي إلى ويناند ، الذي تحدثنا معه حول هذا الموضوع. بشكل عام ، كان آخر اختبار OCR أخطأت فيه هو Tesseract ، والذي حدد كلمة المرور من خارج الصندوق ، ولكن مع وجود أخطاء. لكن يمكن تعليمه خطوطًا جديدة ، والتي كنت سأفعلها. عندما التقطت خطًا يشبه "خط الصورة" ، ظهرت فكرة أنه كان شيئًا بسيطًا ، على الرغم من أنه بدا وكأنه رمزي من Windows أو خط نهاية من Linux. و voila - اتضح أنه مجرد خط PHP مدمج مع الرقم (الحجم) 5. بعد ذلك ، تخليت عن OCR وكتبت نص PHP الذي يبحث عن أحرف كلمة مرور "الصورة" في القاموس الذي تم إنشاؤه. القاموس عبارة عن مجموعة من الصور التي تحتوي على أحرف كلمات مرور محتملة من نفس اللون والحجم. يتم البحث عن طريق مطابقة الصور. هنا هندسة عكسية بسيطة. أفترض أن الإصدار الحالي للصورة على VPNBook لن يستمر طويلًا ، نظرًا لبدائيته.

البرنامج النصي Vpnbook.php


إرجاع Sprite سلسلة كلمة مرور.

 <?php //   $wchar = 9; $hchar = 13; $strDict = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 '; $imgDict = imagecreatetruecolor(2 + strlen($strDict)* $wchar, $hchar); $bg = imagecolorallocate($imgDict, 0xF6, 0xF6, 0xF6); $textcolor = imagecolorallocate($imgDict, 0x4C, 0x4C, 0x4C); imagefill($imgDict, 0, 0, $bg); imagestring($imgDict, 5, 2, 0, $strDict, $textcolor); //  cURL $ch = curl_init(); //  url,      curl_setopt($ch, CURLOPT_URL, 'https://www.vpnbook.com/password.php'); //  ,      string curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); // also, this seems wise considering output is image. //   $output = curl_exec($ch); //  cURL curl_close($ch); $imgOCR = imagecreatefromstring($output); // $imgOCR = imageCreateFromPng('password.png'); //      10  . 2 + 10*9 = 92 < 100 $maxchar = floor((imagesx($imgOCR) - 2) / 9); $imgBox = imagecreatetruecolor($wchar, $hchar); $hashDict = Array(); //   for ($k = 0; $k < strlen($strDict) ; $k++) { imagecopy($imgBox, $imgDict, 0, 0, 2 + $k * $wchar, 0, $wchar, $hchar); $hashStr = ""; for($y = 0; $y < $hchar ; $y++) for($x = 0; $x < $wchar; $x++) $hashStr .= (imagecolorat($imgBox, $x, $y) != 0xF6F6F6)? '1': '0'; $hashDict[$hashStr] = $strDict[$k]; } //     for ($k = 0; $k < $maxchar ; $k++) { imagecopy($imgBox, $imgOCR, 0, 0, 2 + $k * $wchar, 0, $wchar, $hchar); $hashStr = ""; for($y = 0; $y < $hchar ; $y++) for($x = 0; $x < $wchar; $x++) $hashStr .= (imagecolorat($imgBox, $x, $y) != 0xF6F6F6)? '1': '0'; $tempchar = $hashDict[$hashStr]; if ($tempchar==' ') break; print($tempchar); } /*header('Content-type: image/png'); imagepng($imgOCR); */ //var_dump($hashDict); imagedestroy($imgDict); imagedestroy($imgOCR); imagedestroy($imgBox); ?> 


الخطة ب. كلمة المرور من تويتر


باستخدام موجه vvsvic ، أقدم تطبيقًا بسيطًا لبرنامج نصي بديل لاسترداد كلمة مرور من TwitterBook على Twitter (https://twitter.com/vpnbook/)
 <?php function url_get_html($url) { //  cURL $ch = curl_init(); //  url      curl_setopt($ch, CURLOPT_URL, $url); //        string curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //   $output = curl_exec($ch); //  cURL curl_close($ch); //   return $output; } $homepage = url_get_html('https://twitter.com/vpnbook'); preg_match('/Password: ([^<]+)/', $homepage, $matches); // Print the entire match result // var_dump($matches); print($matches[1]) // print_r($matches); ?> 


البرنامج النصي Mikrotik VPNBook


يجب استدعاء البرنامج النصي كل دقيقة من sheduler. يراقب البرنامج النصي حالة اتصال PPTP ، وعند قطع الاتصال ، يستدعي الإجراء بالكامل لطلب كلمة مرور جديدة ، لذلك لن يقوم Mikrotik "بغمر محاولات فتح الاتصال لعدة ساعات بكلمة مرور خاطئة ، ويتم إعادة الاتصال خلال دقيقة واحدة. كما أنه يراقب أخطاء عند الخطأ للحصول على الجلب ويحصل الملف بشكل أكثر دقة على أنه تم استلام كلمة مرور.

 # VPNBookScript v2 :global VPNBookpIfName "pptp-out1" :global VPNBookServerAddresses {"euro217.vpnbook.com";"euro214.vpnbook.com";"us1.vpnbook.com";"us2.vpnbook.com";"ca1.vpnbook.com";"de233.vpnbook.com";"fr1.vpnbook.com"} #:if ([:typeof $VPNBookServerAddresses] != "array") do={ # :set VPNBookServerAddresses {"euro217.vpnbook.com";"euro214.vpnbook.com";"us1.vpnbook.com";"us2.vpnbook.com";"ca1.vpnbook.com";"de233.vpnbook.com"} #} :global VPNBookErr false :global VPNBookPassFile "VPNBookPass.txt" :global VPNBookPass :global VPNBookRun #:global TToken "4.....................2" #:global TChatId "2342432...9" :global VPNBookServerIndex :if ([:typeof $VPNBookServerIndex] != "num") do={:set VPNBookServerIndex 0} :if ([/interface pptp-client get $VPNBookpIfName running]) do={ :set VPNBookRun true } else { :if (!$VPNBookRun) do={ :set VPNBookServerIndex ($VPNBookServerIndex + 1) :if ($VPNBookServerIndex>=[:len $VPNBookServerAddresses]) do={:set VPNBookServerIndex 0} } else { :set VPNBookRun false } :if (![/interface pptp-client get $VPNBookpIfName disabled]) do={/interface pptp-client set $VPNBookpIfName disabled=yes} :do {/tool fetch url="http://server/vpnbookpass.php" dst-path=$VPNBookPassFile} on-error={:set VPNBookErr true} :delay 2 :do {:set VPNBookPass [/file get $VPNBookPassFile contents]} on-error={:set VPNBookErr true} :if (!$VPNBookErr) do={ :if ([/interface pptp-client get $VPNBookpIfName password] != $VPNBookPass) do={/interface pptp-client set $VPNBookpIfName password=$VPNBookPass} :if ([/interface pptp-client get $VPNBookpIfName connect-to] != $VPNBookServerAddresses->$VPNBookServerIndex) do={/interface pptp-client set $VPNBookpIfName connect-to=($VPNBookServerAddresses->$VPNBookServerIndex)} :log info ("VPNBook: Attempt to connect to: ".($VPNBookServerAddresses->$VPNBookServerIndex).". Password: $VPNBookPass") # /tool fetch url=("https://api.telegram.org/bot$TToken/sendmessage\?chat_id=$TChatId&text=VPNBook: Attempt to connect to: ".($VPNBookServerAddresses->$VPNBookServerIndex).". Password: $VPNBookPass") keep-result=no /interface pptp-client set $VPNBookpIfName disabled=no } } 

أوصي أيضًا بإضافة قطع الاتصال لواجهة PPTP للانفصال (حدث متقطع) في ملف تعريف PPP بحيث لا تتدفق إعادة الاتصال على الإطلاق حتى خلال دقيقة واحدة.

وفقًا لذلك ، فإن النص الأساسي في غضون دقيقة واحدة في حالة استلام كلمة مرور جديدة بنجاح سيؤدي إلى رفع اتصال pptp-out1.

 add change-tcp-mss=yes name=VPNBook on-down=\ ":if (![/interface pptp-client get pptp-out1 disabled]) do={\r\ \n /interface pptp-client set pptp-out1 disabled=yes\r\ \n}" only-one=yes use-compression=yes use-encryption=required use-ipv6=no use-mpls=no use-upnp=no 

Source: https://habr.com/ru/post/ar420373/


All Articles