[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Hacker de la red, ¿quien esta enviando/reciviendo paquetes en mi PC?



On Sun, 2003-02-02 at 07:13, Borxa Varela wrote:

> > Lo único que se me ocurre es que (1) realmente eres parte de un
> > LAN, y no nos lo habías dicho, y estás ruteando ese LAN a través
> > de tu conexión PPP o algo así (en cuyo caso mi recomendación del
> > netstat aplicaría para todas las máquinas del LAN).  O (2), tu
> > proveedor de acceso te está enviando tráfico que no es para ti.
>
> Me inclino por la 2? No puede ser que otros usuarios a los que se le
> asignó la ip que me asignan a mi ahora, usasen el mldondkey (u
> otros), y ahora me llegan a mi los paquetes que en teoría serían
> para su conexión... aunque la cosa dura siempre, y supongo que si
> tengo el mldondkey apagado, con el paso del tiempo ya no tedría más.

No, no creo que sea eso.  Si estuvieras recibiendo paquetes del burro,
dirigidos a quien antes estaba en tu IP, verías en el log paquetes de
muchas máquinas dirigidos a una sola dirección (la tuya), y resets de
tu máquina al exterior, porque no estás escuchando en ese puerto.  Eso
no es lo que estás viendo.  Me parece que estás viendo conversaciones
establecidas, en progreso, entre otras máquinas.

> "wanadoo por RTB" es algo así como France Telecom por linea
> telefonica basica, un modem 56k, que es lo único que tenemos aquí

Lo cual es aún más extraño.  Si estuvieras en una conexión por cable,
no me extrañaría tanto... pero jamás he visto algo como ésto en una
conexión por modem.

> > Si en efecto tienes ese problema, quizá la razón por la que tu
> > pppd no parece caerse a pesar de tu "active-filter" es porque
> > estás recibiendo los queries de DNS de otras máquinas.  ...
>
> No, porque eschuco con tcpdump -i ppp0 'port 53 or port 80' y no
> llegan paquetes, para la opción demand si funciona el filtro, pero
> para la idle no, lo cual es otro misterio para mi.

Creo que no me supe dar a entender.  Mi teoría es que el filtro
funciona tanto en demand como en idle.  El problema es que, cuando te
conectas, empiezas a recibir paquetes generados por otras máquinas,
dirigidos a otras máquinas, que reinician el contador de inactividad
aunque tú no estés haciendo nada.  Y por eso pppd no se muere nunca.

Me pregunto si alguien tiene una mejor teoría que explique qué caraxo
está pasando.  La mía se me hace demasiado difícil de tragar.

> > P.D. ¿Sería mucho problema apagar el HTML en tu cliente de correo?
> > El mío se hace camotes al citar tus mensajes cuando los respondo.
>
> Creo que ya lo he apagado.

No, aún no :-/

Al menos no en el mensaje que estoy respondiendo.

> Referente al apagado, como suelen decir "es mejor hacerlo tu que
> pedir que te lo hagan", he hecho un programa que si funciona, estoy
> en proceso de optimizado... pero me gustaría que lo hiciesen los
> programas que vienen con la distribución, por lo de mantener un poco
> de orden en el sistema.

Según yo, pppd podría hacerlo, si pudieras poner en el active-filter
algo como "src 123.123.123.123 && dst port 53", donde 123.123.123.123
sería la dirección local de tu interfaz PPP.  Eso ignoraría paquetes
generados por otras máquinas, y sólo usaría los tuyos para reiniciar
el conteo de inactividad.

El problema es que tu dirección es dinámica.  La asigna el servidor
ppp después de que te conectas, cuando ya es demasiado tarde para
alterar la configuración de pppd.

Leí tu programa, y sí, me parece que funciona.  El inconveniente obvio
es que requiere un archivo en disco, que puede crecer arbitrariamente.
Adicionalmente, requires varios procesos, lo cual consume memoria
innecesariamente.

Respetuosamente me permito incluir en este mensaje una versión
alternativa, que en vez de usar un archivo en disco captura ella misma
los paquetes.

La idea es dejar que pppd se levante solo, usando demand, y hacer que
pppd invoque a un script en "/etc/ppp/ip-up.d" para levantar este
programa.  Los scripts invocados por pppd reciben variables de
ambiente con los datos de la conexión (mira en /etc/ppp/ip-up).  Un
script para levantar el programa podría verse así:

------------------------------------------------------------------------
#!/bin/sh
# /etc/ppp/ip-up.d/matappp - levanta matappp al establecer conexion

TIMEOUT=360

exec /usr/local/bin/matappp $PPP_IFACE "src $PPP_LOCAL && dst port 53" \
 "/usr/bin/poff $PPP_IFACE" $TIMEOUT
------------------------------------------------------------------------

El exec debería evitar tener un shell adicional corriendo durante tu
conexión ppp.  El fuente de ese programa "matappp" lo encuentras al
final de este mensaje.  Es un hack rápido, apenas probado en mi propia
máquina, de forma que es sano esperar que le salgan sapos.  Necesitas
dar un 'apt-get install libpcap-dev' para compilarlo, con algo como
"gcc -O2 -o matappp matappp.c -lpcap"

Que te sea leve.

 -CR

------------------------------------------------------------------------
/* matappp.c - Un programa que ejecuta a otro cuando detecta un tiempo
 *             de inactividad en el tráfico de red.
 *
 * Uso: matappp <interfaz> <filtro> <comando> <timeout>
 * Ejemplo: matappp ppp0 "port 53" "/sbin/ifconfig ppp0 down" 60
 * Autor: Cesar Rincon <crincon@et.com.mx>
 * Licencia: Este programa está en el dominio público.  Haz lo que
 *           quieras con él.
 */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <syslog.h>
#include <sys/time.h>
#include <sys/types.h>
#include <netinet/ip.h>
#include <pcap.h>

#define SYSLOG_IDENT "matappp"
/* XXX - quitar LOG_PERROR cuando se compile una version para
"produccion".
#define SYSLOG_OPTIONS LOG_PERROR | LOG_PID
#define SYSLOG_FACILITY LOG_USER

int main(int argc, char* argv[])
{
  int e, capfd, segs, r = 0;
  pcap_t* pcap;
  char errbuf[PCAP_ERRBUF_SIZE];
  char* interfaz, * filtro, * comando;
  bpf_u_int32 net, mask;
  struct bpf_program bpfprog;
  struct pcap_pkthdr header;
  fd_set rdfs;
  struct timeval to;

  openlog(SYSLOG_IDENT, SYSLOG_OPTIONS, SYSLOG_FACILITY);

  if(argc != 5) {
    syslog(LOG_ERR, "parametros incorrectos");
    exit(1);
  }

  interfaz = argv[1];
  filtro = argv[2];
  comando = argv[3];
  segs = atoi(argv[4]);
  if(segs < 1)
    segs = 360;

  /* XXX - caplen podria ser menor?  los vamos a tirar a la basura, de
     cualquier forma... */
  pcap = pcap_open_live(interfaz, -1, 1, sizeof(struct iphdr), errbuf);
  if(NULL != pcap) {
    int e = pcap_lookupnet(interfaz, &net, &mask, errbuf);
    if(-1 != e) {
      e = pcap_compile(pcap, &bpfprog, filtro, 1, mask);
      if(-1 != e) {
        e = pcap_setfilter(pcap, &bpfprog);
        if(-1 != e) {
          pcap_freecode(&bpfprog);
          capfd = pcap_fileno(pcap);

          for(;;) {
            FD_ZERO(&rdfs);
            FD_SET(capfd, &rdfs);
            to.tv_sec = segs;
            to.tv_usec = 0;
            e = select(capfd+1, &rdfs, NULL, NULL, &to);
            if(e <= 0) {
              if(e)
                syslog(LOG_ERR, "error, terminando");
              else {
                syslog(LOG_NOTICE, "inactividad detectada, ejecutando
'%s'",
                       comando);
                system(comando);
              }
              break;
            }

            (void)pcap_next(pcap, &header);
          }
        }
        else {
          pcap_freecode(&bpfprog);
          syslog(LOG_ERR, "no puedo activar el filtro '%s' - %s",
                 filtro, pcap_geterr(pcap));
          r = 1;
        }
      }
      else {
        syslog(LOG_ERR, "no puedo compilar el filtro '%s' - %s",
               filtro, pcap_geterr(pcap));
        r = 1;
      }
    }
    else {
      syslog(LOG_ERR, "no puedo obtener informacion de '%s' - %s",
             interfaz, errbuf);
      r = 1;
    }

    pcap_close(pcap);
  }
  else {
    syslog(LOG_ERR, "no puedo capturar paquetes - %s", errbuf);
    r = 1;
  }

  return r;
}
------------------------------------------------------------------------




Reply to: