Post

Comando Curl

Índice

Definción

Curl, es un comando que nos permite realizar peticiones a páginas web, subir o descargar archivos tantos de servidores web como de servidores ftp, etc.

Instalación

En Debian, Ubuntu y derivadas

1
sudo apt-get install -y curl

En CentOS, RHEL y derivadas

1
sudo yum install -y curl

En Arch y derivadas

1
sudo pacman -Sy curl

En Mac OS

1
brew install curl

Párametros

  • -s o --silent ➜ Modo silencioso
  • -X o --request ➜ Nos permite realizar peticiones
  • -L o --location ➜ Aplica redirección
  • -w o --write-out ➜ Indicamos contenido a mostrar
  • -K o --insecure ➜ No aplicamos certificado SSL
  • -I o --head ➜ Vemos las cabezeras enviadas
  • -d o --data ➜ Nos permite enviar data a una dirección
  • -T o --upload-file ➜ Permite subir un archivo
  • -o o --output ➜ Permite almacenar el output
  • -H o --header ➜ Permite enviar una cabezera personalizada
  • -U o --user ➜ Indicamos el usuario y contraseña
  • -A o --user-agent ➜ Permite modificar el User-Agent
  • -x o --proxy ➜ Permite indicar la dirección de un proxy

Ejemplos

Ver codigo de estado de la página

1
curl -L -s -w "%{http_code}\n" -o /dev/null http://h4cktrick.github.io

Ver cabezeras enviadas

1
curl -I -L -s http://h4cktrick.github.io

Subir archivo a ftp anonimo

1
curl -s -T "secret.txt" ftp://127.0.0.1 --user anonymous:null

Descargar un archivo

1
curl -O https://h4cktrick.github.io/script.py

Enviar una header

1
curl -s https://h4cktrick.github.io/ -H "referer: google.es"

Output más legible y colorizado

1
curl -s -L http://natas5.natas.labs.overthewire.org/ -u natas5:xxx -H "Cookie: loggedin=1" | htmlq -p | batcat -l html

Pentesting

Ahora veremos pequeños scripts con curl, desarollados por mi, para realizar pentesting básico.

Fuzzing

Este script para descubrir directorios y archivos, por defecto utiliza un dicionario situado en la ruta /usr/share/rockyou.txt. Para que funcione solo es necesario indicar el host (-h) y el diccionario (-w).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/bin/bash
#Autor: Jose Conde
 
#Colours
Amarillo="\e[93m"
Normal="\e[m"
Verde="\e[32m"
Rojo="\e[91m"

#Exit ctrl + c 
trap ctrl_c INT

ctrl_c(){
	clear
	echo -e "${Amarillo}[-]${Rojo} Saliendo... ${Normal}"
	exit 1
}

#Parameters
while getopts "h:w:" opc; do
    case $opc in
        h) host=$OPTARG ;;
        w) dic=$OPTARG ;;
    esac
done
 
#Main
fuzz(){
echo -e "[+] Escaneando: ${Amarillo}$host${Normal}"
echo -e "[*] Dicionario: ${Amarillo}${dic-/usr/share/rockyou.txt}${Normal}\n"
for i in $(cat ${dic:-/usr/share/rockyou.txt}); do
    estado=$(curl -s -L -w "%{http_code}\n" http://$host/$i -o /dev/null &)
 
    if [[ $estado -eq 200 ]]; then
        echo -e "\t[*] ${Amarillo}$i${Normal} (Reply: ${Verde}$estado${Normal})"
    fi
    sleep 0.5
done }
 
#Help Panel
helpPanel(){
    echo -e "[?] Uso: $0 -h <host> -w <diccionary>"
    echo -e "\t-h) Host (ej. 127.0.0.1)"
    echo -e "\t-w) Diccionary (ej. /usr/share/worlist/rockyou.txt)"
    exit 0
}
 
#Arguments
[[ $# -eq 0 ]] && helpPanel || fuzz

Tambien podemos hacer lo mismo con python3, como podemos ver en el siguiente ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/usr/bin/python3
#Autor: Jose Conde 

#Variables
url = 'http://localhost/'
diccionario = open('fuzz.txt', 'r')

print("[*] Directorios encontrados: ")
for dir in diccionario.readlines():
	directory = dir.rstrip('\n')
	code = requests.get(url+directory)
	
	if code.status_code == 200: 
		print("\t[!] %s" % directory)

Subdominios

Ahora con otro script muy sencillo vamos a descubrir subdominios de un dominio que le indiquemos por parametro.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/bin/bash
#Autor: Jose Conde
 
#Colours
Amarillo="\e[93m"
Normal="\e[m"
Verde="\e[32m"
Rojo="\e[91m"

#Exit ctrl + c 
trap ctrl_c INT

ctrl_c(){
	clear
	echo -e "${Amarillo}[-]${Rojo} Saliendo... ${Normal}"
	exit 1
}

if [ $1 ] && [ $2 ]; then
    echo -e "[!] Escaneando: ${Amarillo}$1${Normal}"
    echo -e "[!] Diccionario: ${Amarillo}$2${Normal}"
    for p in "http://" "https://"; do
        for host in $(cat $2); do
            subdomain=$(curl -s -L -w "%{http_code}\n" "$p$host.$1" -o /dev/null -k)
            if [[ subdomain -eq 200 ]]; then
                echo -e "\n\t[+] ${Verde}$p$host.$1${Normal}"
            fi
        done
    done
else
    echo -e "Uso $0 <domain> <dicionario>"
fi
This post is licensed under CC BY 4.0 by the author.