systemadmin.es > Curiosidades > Uso de /dev/tcp para establecer conexiones TCP desde bash

Uso de /dev/tcp para establecer conexiones TCP desde bash

Mediante la shell bash podemos establecer conexiones TCP refiriéndonos al /dev. Vamos a ver como hacer una petición GET HTTP mediante un simple script en bash.

Para establecer una conexión TCP a un host y puerto deberemos hacerlo con la siguiente sintaxi:

  • /dev/tcp/: Indicamos que queremos una conexión TCP
  • /host/: Indicamos el host a conectar como primer parámetro
  • /puerto: Indicamos el puerto a conectar como segundo parámetro

Si indicamos:

echo "aa" > /dev/tcp/localhost/80

Estamos mandando “aa” a localhost:80 pero cerramos la conexión sin esperar respuesta. Para establecer una conexión bidireccional, deberemos abrir un socket para enviar y recibir datos mediante exec. Deberemos usar un descriptor de fichero que no este en uso:

$ exec 666<> /dev/tcp/systemadmin.es/80

Mediante el /proc podemos ver que se ha abierto una conexión:

$ file /proc/$$/fd/*
/proc/12816/fd/0:   symbolic link to `/dev/pts/1'
/proc/12816/fd/1:   symbolic link to `/dev/pts/1'
/proc/12816/fd/2:   symbolic link to `/dev/pts/1'
/proc/12816/fd/255: symbolic link to `/dev/pts/1'
/proc/12816/fd/3:   ERROR: cannot open `/proc/12816/fd/3' (No such file or directory)
/proc/12816/fd/666: broken symbolic link to `socket:[3550480]'

Con lsof podemos ver la conexión TCP:

$ lsof -p $$ 
COMMAND   PID   USER   FD   TYPE  DEVICE  SIZE/OFF    NODE NAME
(...)
bash    12816 jprats  666u  IPv4 3571511       0t0     TCP pica:37197->1.2.3.4:http (ESTABLISHED)

A continuación podemos mandar la petición GET al descriptor de fichero con un simple echo:

$ echo -e "GET / HTTP/1.1\nHost: systemadmin.es\n\n" >&3

Y mediante cat obtendremos la respuesta del servidor:

$ cat <&3
HTTP/1.1 404 Not Found
Date: Mon, 11 Jun 2012 06:03:58 GMT
Server: Apache
Vary: Accept-Encoding
Content-Length: 202
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /nono was not found on this server.</p>
</body></html>

5 comments to “Uso de /dev/tcp para establecer conexiones TCP desde bash”

  1. El problema de hacerlo así es que no soporta proxy , al contrario que netcat, wget o socat

  2. En realidad no, simplemente te conectas al proxy y realizas la petición con el Host header que harías al servidor destino. El proxy ya se encarga de resolover la IP y realizar la conexión

  3. 🙂

    Gracias.

  4. Estamos mandando “aa” a localhost:80 pero cerramos la conexión sin esperar respuesta

    Linda manera de hacer un DoS no?

  5. Interesante y curioso.
    Me ha gustao!!

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>