È possibile eseguire la scansione di un eseguibile per le chiamate alle funzioni vulnerabili di glibc ghost?

1

La vulnerabilità dei ghost ha il potenziale per essere vulnerabile a molte molte parti del software che chiamano le funzioni gethostbyname () e gethostbyname2 (). C'è un modo semplice per eseguire la scansione di un file eseguibile per determinare se utilizza una di queste due funzioni vulnerabili? Anche se questo non ti direbbe se un programma fosse vulnerabile, può dirti se NON è vulnerabile.

Per utilizzare una di queste funzioni, credo che l'eseguibile (o la libreria di terze parti) debba collegarsi ad esso. Mi sembra che dovresti essere in grado di scansionare l'eseguibile per un collegamento alla libreria condivisa.

    
posta Steve Sether 30.01.2015 - 22:44
fonte

2 risposte

1

Per scoprire se queste chiamate sono utilizzate, puoi semplicemente fare un

strings -a /bin/ip | grep gethost

Un altro approccio che restituisce più informazioni è

readelf --dyn-syms /bin/ip | grep gethost
    
risposta data 31.01.2015 - 21:08
fonte
0

Sì, ci sono alcuni modi per ottenere le informazioni, nm e objdump sono i tuoi amici.

Demo

Per scopi dimostrativi, ho utilizzato un PoC sviluppato dall'Università di Chicago per verificare se un sistema è vulnerabile o meno alla vulnerabilità Ghost .

Ecco il codice:

/*
 * GHOST vulnerability check
 * http://www.openwall.com/lists/oss-security/2015/01/27/9
 * Usage: gcc GHOST.c -o GHOST && ./GHOST
 */ 

#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#define CANARY "in_the_coal_mine"

struct {
  char buffer[1024];
  char canary[sizeof(CANARY)];
} temp = { "buffer", CANARY };

int main(void) {
  struct hostent resbuf;
  struct hostent *result;
  int herrno;
  int retval;

  /*** strlen (name) = size_needed - sizeof (*host_addr) - sizeof (*h_addr_ptrs) - 1; ***/
  size_t len = sizeof(temp.buffer) - 16*sizeof(unsigned char) - 2*sizeof(char *) - 1;
  char name[sizeof(temp.buffer)];
  memset(name, '0', len);
  name[len] = '
$ gcc GHOST.c -o ghost
'; retval = gethostbyname_r(name, &resbuf, temp.buffer, sizeof(temp.buffer), &result, &herrno); if (strcmp(temp.canary, CANARY) != 0) { puts("vulnerable"); exit(EXIT_SUCCESS); } if (retval == ERANGE) { puts("not vulnerable"); exit(EXIT_SUCCESS); } puts("should not happen"); exit(EXIT_FAILURE); }

Quindi compilare il codice per generare il file binario:

/*
 * GHOST vulnerability check
 * http://www.openwall.com/lists/oss-security/2015/01/27/9
 * Usage: gcc GHOST.c -o GHOST && ./GHOST
 */ 

#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#define CANARY "in_the_coal_mine"

struct {
  char buffer[1024];
  char canary[sizeof(CANARY)];
} temp = { "buffer", CANARY };

int main(void) {
  struct hostent resbuf;
  struct hostent *result;
  int herrno;
  int retval;

  /*** strlen (name) = size_needed - sizeof (*host_addr) - sizeof (*h_addr_ptrs) - 1; ***/
  size_t len = sizeof(temp.buffer) - 16*sizeof(unsigned char) - 2*sizeof(char *) - 1;
  char name[sizeof(temp.buffer)];
  memset(name, '0', len);
  name[len] = '
$ gcc GHOST.c -o ghost
'; retval = gethostbyname_r(name, &resbuf, temp.buffer, sizeof(temp.buffer), &result, &herrno); if (strcmp(temp.canary, CANARY) != 0) { puts("vulnerable"); exit(EXIT_SUCCESS); } if (retval == ERANGE) { puts("not vulnerable"); exit(EXIT_SUCCESS); } puts("should not happen"); exit(EXIT_FAILURE); }

Verifica se un binario non cancellato contiene simboli gethostbyname* : %codice% ... e sicuramente lo fa.

Ora, è anche possibile che il file binario sia stato rimosso dai simboli di debug:

$ nm ghost | grep gethost U gethostbyname_r@@GLIBC_2.2.5

In questo caso, puoi utilizzare # stripping away debug symbols $ strip -o ghost-stripped ghost $ nm ghost-stripped nm: ghost-stripped: no symbols : objdump

... filtro solo per quello che stiamo cercando: $ objdump -T ghost-stripped ghost-stripped: file format elf64-x86-64 DYNAMIC SYMBOL TABLE: ... 0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 gethostbyname_r ...

    
risposta data 01.02.2015 - 21:27
fonte

Leggi altre domande sui tag