XOR प्रमाणीकरण बाईपास के साथ शेल पार्सर

हाल ही में, SMS \ e-mail के माध्यम से संचालन की आगे की अधिसूचना के लिए एक बैंक कार्ड के इंटरनेट खाते के पार्सर की आवश्यकता थी। इसे एक त्वरित शेल स्क्रिप्ट में करने का निर्णय लिया गया था, जो क्रोन में नौकरी का उपयोग करके एक निश्चित आवृत्ति के साथ खाते के साथ पृष्ठ को पार्स करेगा, और यदि खाता संतुलन बदलता है, तो मोबाइल फोन या ई-मेल पर एक संदेश भेजें। पहली नज़र में कुछ भी जटिल नहीं है, लेकिन लेखन प्रक्रिया के दौरान मुझे कुछ कठिनाइयों को हल करना पड़ा जिसे आप कट के तहत पढ़ सकते हैं।

पार्सिंग के लिए, मानक यूनिक्स उपयोगिताओं - कर्ल, ग्रीप, सेड का उपयोग करने का निर्णय लिया गया। यह https सर्वर को पोस्ट-रिक्वेस्ट का उपयोग करके प्रमाणित करने वाला था, और फिर, हमेशा की तरह - नियमित अभिव्यक्ति का उपयोग करते हुए, पेज से वांछित जानकारी खींचें। लेकिन यहां मुख्य समस्या का पता चला था - प्रमाणीकरण के दौरान डेटा (अधिक सटीक रूप से, पासवर्ड) एन्क्रिप्टेड रूप में सर्वर को भेजा गया था। आपको याद दिला दूं कि बैंकिंग पेज https पर लिया गया था, अर्थात यह तंत्र, टीएलएस के अलावा, केवल स्थानीय स्निफर्स से सुरक्षा के कारण है।

पोस्ट
भेजने से पहले, यूनिकोड की सर्वश्रेष्ठ परंपराओं में, चित्रलिपि को हेक्स में एन्कोड किया गया है

जाहिर है, ग्राहक पक्ष पर एन्क्रिप्शन का उपयोग किया गया था, लेकिन एक कुंजी के बिना इस प्रक्रिया की कल्पना करना मुश्किल है, जिसे मैंने खोजा था।
सबसे पहले, सोच, और क्यों नहीं, कुकीज़ की जांच की गई, ज़ाहिर है, कुंजी जारी करने वाले किसी भी निर्भरता का पता नहीं लगाया गया था। जल्दी से एक पटकथा लिखने और अपनी बात जारी रखने की योजना, धीरे-धीरे उखड़ने लगी। साइट को jQuery में लिखा गया था, जिसने मेरी स्थिति को और उदास कर दिया । डीबगर का उपयोग करते हुए, घटनाओं में एक एम्बेडेड स्क्रिप्ट का पता लगाया गया था:
function () { var context = $(this).parents("#loginParamsWrapper"); var authMode = $("#AuthMode", context).val(); var form = $("#frm" + authMode, context); if (!TWIB.validForm(form)) { return false; } var data = form.formToArray(); data.push({name: "AuthMode", value: authMode}); if (authMode == "TBId") { var pan = $("#name", form).val(); var prefix = "9129120000000000"; if (prefix != "" && prefix.length > pan.length) { pan = prefix.substring(0, prefix.length - pan.length) + pan; } data.push({name: "PAN", value: pan}); } data.push({name: "PIN", value: TWIB.xorString($("#password", form).val(), "3734")}); ... } 
हमने पार्सिंग के दौरान संसाधनों को बचाने के मद्देनजर साइट के पीडीए संस्करण का विश्लेषण किया, प्रमाणीकरण तंत्र में, मुख्य संस्करण के साथ कोई विशेष अंतर नहीं पाया गया।

जैसा कि आप कोड से देख सकते हैं, उपसर्ग 912912 डिजिटल लॉगिन में जोड़ा गया है (मेरे मामले में, दस-अंक), जाहिरा तौर पर स्थिर, जिसे http-headers देखते समय खोजा गया था। लेकिन अंतिम पंक्ति बहुत रुचि की है, जो बताती है कि पासवर्ड मूल्य को xorString फ़ंक्शन और डायनामिक की वैल का उपयोग करके एन्क्रिप्ट किया गया है, इस मामले में, 3734। आइए फ़ंक्शन की बॉडी को अन्य स्क्रिप्ट्स में ही देखें।

फ़ायरबग

यह कोड विखंडन मोडुलो 2 स्ट्रिंग स्ट्रिंग (कूटशब्द) के प्रत्येक वर्ण को पूरे स्ट्रिंग वैल (कुंजी संयोजन) के साथ जोड़ता है, String.fromCharCode विधि वर्णों को उनके प्राप्त दशमलव कोड द्वारा प्रदर्शित करती है, और स्ट्रिंग पुनः लौटा दी जाती है, जो बाद में पासवर्ड के बजाय प्रेषित होती है- प्रमाणीकरण अनुरोध।
रक्षा तंत्र की समग्र तस्वीर पहले से ही है, यह पता लगाना बाकी है कि कुंजी संयोजन कहां से आता है।

लेकिन यह काफी सरल निकला। जब पृष्ठ खोला जाता है, सत्र पहचानकर्ता कुकीज़ में दर्ज किया जाता है, तो कार्रवाईपराम: लॉगऑन को अजाक्स अनुरोध (एक्सएनआर) द्वारा भेजा जाता है (जो, वैसे, पिछले क्रोम में निर्मित डिबगर पहले नहीं देखा गया था, और कुंजी संयोजन के साथ एक स्क्रिप्ट को प्रतिक्रिया में पृष्ठ में डाला गया है, जो सत्र आईडी के साथ जुड़ा हुआ है।

हमारे पार्सर को वांछित पृष्ठ पर लाने में सक्षम होने के लिए, इसे निम्नलिखित कार्य करना होगा:

1. एक पेज का अनुरोध करें, सत्र कुकीज़ प्राप्त करें
2. प्राप्त कुकीज़ का उपयोग करके, पोस्ट-अनुरोध भेजें, एक एम्बेडेड स्क्रिप्ट के साथ एक पृष्ठ प्राप्त करें
3. प्राप्त json में पार्स वह कुंजी है जो XOR एन्क्रिप्शन के लिए उपयोग की जाएगी
4. एक प्रमुख संयोजन के साथ प्रत्येक पासवर्ड चरित्र के मॉड्यूल 2 जोड़
4.1। पासवर्ड वर्णों को असुका से दशमलव कोड में परिवर्तित करें
4.2। एक XOR ऑपरेशन करें
4.3। दशमलव से हेक्साडेसिमल में परिवर्तित करें
4.4। कोड मानों से यूनिकोड वर्ण प्राप्त करें
5. प्राप्त स्ट्रिंग का उपयोग करके, साइट पर प्रमाणित करें

प्रमाणीकरण के लिए एन्क्रिप्टेड पासवर्ड प्राप्त करना केवल कठिन है। आरंभ करने के लिए, हमें वह कुंजी मिलती है जिसके साथ हम आगे की जोड़तोड़ करेंगे:
 curl -s -b "PDAVersion=true" -A "$ua" "$site" -c "cookies" > /dev/null 

 key=$(curl -s -b "cookies" -b "PDAVersion=true" -e "$site" -A "$ua" "$site/getData.jsp?actionParam=Logon&appendTransactions=true&format=html" | grep -om 1 "val(), '[0-9]*'" | sed "s/val(), //;s/'//g") 

वादा किए गए प्रमुख जोड़तोड़:
 #ascii char -> dec char code -> xor -> hex char code -> unicode char #     dec () { for i in `echo $1 | sed 's/./&\n/g'`; do printf '%d\n' "'$i"; done } #    2   xor () { for i in $*; do echo $(($i ^$key)); done } #  xor  dec  hex hex () { for i in $*; do printf '%X\n' "$i"; done } #       unicode () { for i in $*; do printf "\u$i"; done } dec=`dec "$pass"` xor=`xor $dec` hex=`hex $xor` char=`unicode $hex` echo $char > /dev/null 

आउटपुट पर, हमें एक एन्क्रिप्टेड पासवर्ड मिलता है, जिसे हम साइट पर पोस्ट अनुरोध का उपयोग करके प्रमाणित करते हैं:
 curl -s -b "cookies" -e "$site" -A "$ua" "$site/getData.jsp" -d AuthMode=TBId -d PAN=912912$login --data-urlencode PIN=$char -d actionParam=GetPANRq -d appendParams=true -d format=json -c cookies > /dev/null 


सुरक्षा
किसी गलत उपयोगकर्ता आईडी के बारे में जानकारी देना असुरक्षित है, यह देखते हुए कि सैद्धांतिक रूप से डेटाबेस में डिजिटल आईडी की अधिकतम संख्या 10 10 है , और डिजिटल पासवर्ड केवल 10 6 हैं
  बस क्रूर रूप से क्रूरता का उपयोग करने की इच्छा में माउस को न खींचें, आपको मालिक और स्थानान्तरण के बारे में जानकारी के अलावा कुछ भी "स्वादिष्ट" नहीं मिलेगा;  98.76% खातों में वित्तीय लेनदेन की पहुंच नहीं है, मैं गारंटी देता हूं) 

अब आप पृष्ठ से आवश्यक डेटा प्राप्त कर सकते हैं, मेरे मामले में, खाते में राशि:
 cash=$(curl -s -b "cookies" -b "twebank_authmode=TBId" -e "$site" -A "$ua" "$site/getData.jsp?actionParam=AcctsMenu&appendTransactions=true&format=html" | grep -o 'unt">.*<b' | sed 's/unt">//;s/\.[0-9][0-9]<b//;s/\ //g') 

खैर, अब हम राशि में बदलाव के बारे में सूचित करने के लिए एक छोटी सी स्क्रिप्ट लिखकर अपनी योजना को पूरा करेंगे:
 if [ -s "$HOME/cashlog" ] then if [ `cat $HOME/cashlog` = `cat $HOME/cashlog | sed 's/[^0-9]//g'` ] then cashlog=$(<$HOME/cashlog) if [ "$cash" -gt "$cashlog" ] #if [ $(echo "$cashlog < $cash"|bc) -eq 1 ] then a=`expr $cash - $cashlog` in=$(echo "$a rub added to your account. Now you have $cash rub") echo $in python $HOME/sms_send.py -n "+79999999999" -t "$in" -l "some@mail.ru" -p "pass" echo "$cash" > "$HOME/cashlog" elif [ "$cash" -lt "$cashlog" ] then z=`expr $cashlog - $cash` out=$(echo "Exchanged $z rub, you have $cash rub") echo $out python $HOME/sms_send.py -n "+79999999999" -t "$out" -l "some@mail.ru" -p "pass" echo "$cash" > "$HOME/cashlog" #else echo "No changes, you have $cash rub" fi else echo "$cash" > "$HOME/cashlog" echo "Cash log was updated" fi else echo "$cash" > "$HOME/cashlog" echo "Cash log was created" fi 

Mail.ru एजेंट की सेवाओं के माध्यम से एसएमएस भेजने के लिए, एक छोटी अजगर स्क्रिप्ट का उपयोग किया जाता है, जो इंटरनेट पर पाई जाती है।
मैंने विशेष रूप से ई-मेल पर एक संदेश भेजने के लिए लागू नहीं किया, क्योंकि इसे क्रोन द्वारा लागू किया जाएगा।

Crontab का उपयोग करते हुए, एक रिकॉर्ड जोड़ें
*/10 * * * * /path/to/script/ca.sh
ताकि स्क्रिप्ट हर दस मिनट पर चले।

यह स्क्रिप्ट की शुरुआत में MAILTO=your@mail.net के रूप में प्रवेश करने लायक भी है। MAILTO=your@mail.net , Sendmail को सही तरीके से कॉन्फ़िगर करने (या इसके एनालॉग) के साथ, क्रोन स्क्रिप्ट के आउटपुट के साथ निर्दिष्ट साबुन को संदेश भेजेगा।

आप पूरी स्क्रिप्ट यहां देख सकते हैं , बैश पर परीक्षण किया गया।

मैं मानता हूं, कार्यान्वयन लालित्य के साथ चमकता नहीं है, लेकिन मुख्य बात, जैसा कि वे कहते हैं, परिणाम है। स्क्रिप्ट को जल्दबाजी में लिखा गया था, विचारों के साथ "अच्छी तरह से, इसे काम करने दो, मुख्य बात", इसलिए ऐसे क्षण हैं जो स्पष्ट रूप से अन्यथा लागू करने के लिए थे। मुझे बाद में फिर से लिखने की उम्मीद है, आप इसे उसी लिंक पर पा सकते हैं। थोड़ा समायोजन के साथ, इस तरह की प्रमाणीकरण योजना का उपयोग करके किसी भी साइट के साथ काम करना चाहिए। लेख का मुख्य लक्ष्य है, उदाहरण के लिए, मानक यूनिक्स टूल का उपयोग करके ऐसी समस्याओं को कैसे हल किया जाए। मुझे उम्मीद है कि यह लेख किसी के लिए उपयोगी था।

अद्यतन: यह पता चला है कि बैंकिंग के पुराने संस्करण में कोई अतिरिक्त सुरक्षा नहीं है, अर्थात्। इस तरह की स्क्रिप्ट इसकी पार्सिंग के लिए पर्याप्त होगी।

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


All Articles