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