
Filtra y deduplica grandes listas de URLs eliminando extensiones estáticas, palabras clave no deseadas, IDs, variantes de idioma y parámetros, produciendo conjuntos de endpoints limpios para el reconocimiento web.
Esta es una herramienta utilizada para depurar una lista de URLs. Como punto de partida, tomé la increíble herramienta uro de Somdev Sangwan. Pero quería cambiar algunas cosas, hacer algunas mejoras (como lidiar con GUIDs) y hacerla más personalizable.
urless es compatible con Python 3.
Instala urless en el entorno de Python por defecto (global).
pip install urless
O
pip install git+https://github.com/xnl-h4ck3r/urless.git -v
Puedes actualizarlo con
pip install --upgrade urless
Configuración rápida en un entorno de Python aislado usando pipx
pipx install git+https://github.com/xnl-h4ck3r/urless.git
Básicamente pasas una lista de URLs (desde un archivo, o canalizada desde STDIN), y obtienes un archivo depurado de URLs de salida. Pero, ¿de qué manera se depuran? Te lo explicaré a continuación, pero primero estos son algunos términos que se usarán:
-fe, especificadas con FILTER_EXTENSIONS en config.yml, o si no existe ninguna de esas, una lista predeterminada de .css,.ico,.jpg,.jpeg,.png,.bmp,.svg,.img,.gif,.mp4,.flv,.ogv,.webm,.webp,.mov,.mp3,.m4a,.m4p,.scss,.tif,.tiff,.ttf,.otf,.woff,.woff2,.bmp,.ico,.eot,.htc,.rtf,.swf,.image.-fk, especificadas con FILTER_KEYWORDS en config.yml, o si no existe ninguna de esas, una lista predeterminada de blog,article,news,bootstrap,jquery,captcha,node_modules.LANGUAGE en config.yml, o si no existe, una lista predeterminada de los códigos más comunes en,en-us,en-gb,fr,de,pl,nl,fi,sv,it,es,pt,ru,pt-br,es-mx,zh-tw,js.ko.Esto es lo que sucede:
-dp/--disregard-params:
REMOVE_PARAMS (o anulados con el argumento -rp/--remove-params), se eliminarán de todas las URLs antes del procesamiento.-rcid/--regex-custom-id y la ruta de la URL contiene un ID personalizado, solo se incluirá una coincidencia con la regex del ID personalizado si hay múltiples URLs donde esa es la única diferencia.-lang y la URL contiene un código de idioma (p. ej. ), solo se incluirá uno de los códigos de idioma si hay múltiples URLs donde el código de idioma es diferente.cat target_urls.txt | urless
o
urless -i target_urls.txt
cat target_urls.txt | urless > output.txt
o
urless -i target_urls.txt -o output.txt
El archivo config.yml tiene las claves que se pueden actualizar según tus necesidades:
FILTER_KEYWORDS - Una lista de palabras clave separadas por comas (p. ej. blog,article,news, etc.) contra las que se verifican las URLs en ciertas circunstancias.FILTER_EXTENSIONS - Una lista de extensiones de archivo separadas por comas (p. ej. .css,.jpg,.jpeg, etc.) contra las que se verifican todas las URLs. Si una URL incluye alguna de las cadenas, se excluirá de la salida.LANGUAGE - Una lista de códigos de idioma separados por comas (p. ej. en-gb,fr,nl, etc.) contra los que se verifican todas las URLs cuando se pasa el argumento -lang. Si hay múltiples URLs con diferentes códigos de idioma, solo se generará una versión de la URL.REMOVE_PARAMS - Una lista de nombres de parámetros separados por comas sensibles a mayúsculas (p. ej. cachebuster,cacheBuster) que se eliminarán de todas las URLs antes del procesamiento.Actualmente hay comprobaciones automáticas de regex para que una parte de la ruta sea un Identificador Único Global (GUID) o un ID entero, pero el argumento -rcid / --regex-custom-id te permite proporcionar una expresión regular para identificar un ID personalizado. Por ejemplo, si un objetivo tiene un formato de ID específico (que no es un GUID ni un entero), entonces puedes especificar una expresión regex para él, y solo se devolverá uno de esos en la salida si el resto de la URL es igual. Por ejemplo:
U-65241Xhttps://target.com/blah/U-61723A/settings
https://target.com/blah/U-63352B/settings
https://target.com/blah/U-61351A/profile
https://target.com/blah/U-61723A/settings
https://target.com/blah/U-64135C/profile
urless y pasar -rcid 'U-[0-9]{5}[A-Z]', entonces la salida sería:
https://target.com/blah/U-61723A/settings
https://target.com/blah/U-64135C/profile
NOTAS IMPORTANTES SOBRE LA REGEX:
-rcid.[^(\?|\/|#|$)]* al final de tu regex, lo que significará TODOS los demás caracteres hasta el final de la parte de la ruta.^ al principio y $ al final de tu regex para asegurar que representa toda la parte de una ruta entre barras. Sin embargo, se añadirán automáticamente si los omites.cat input.txt | grep -E 'U-[0-9]{5}[A-Z]', por ejemplo, y ver si tu expresión parece correcta (debería resaltar solo lo que te interesa y resaltar toda la parte de la ruta que es el ID personalizado).https://target.com/blah/xnl/settings donde xnl es un nombre de usuario, no podrás crear una regex para el nombre de usuario porque no es un formato lo suficientemente único como para distinguirlo de otros posibles valores de ruta.Si te encuentras con cualquier problema, o tienes ideas para mejoras, no dudes en abrir un issue en Github. Si hay un problema, será útil que proporciones el comando exacto que ejecutaste y una descripción detallada del problema. Si es posible, ejecuta con -v para reproducir el problema y hazme saber los mensajes de error que se muestren.
Ninguno - no dudes en abrir un issue en Github para sugerir mejoras.
¡Buena suerte y buena caza! Si de verdad te encanta la herramienta (o cualquiera de las otras), o te ayudaron a encontrar un bounty increíble, considera ¡INVITARME UN CAFÉ! ☕ (¡me vendría bien la cafeína!).
🤘 /XNL-h4ck3r
| Argumento | Argumento Largo | Descripción |
|---|
| -i | --input | Un archivo de URLs a depurar. |
| -o | --output | El archivo de salida que contendrá la lista depurada de URLs (por defecto: output.txt). Si se canaliza a otro programa, la salida se escribirá en STDOUT. |
| -fk | --filter-keywords | Una lista de palabras clave separadas por comas para excluir enlaces (si no hay parámetros). Esto anulará la lista FILTER_KEYWORDS especificada en config.yml |
| -fe | --filter-extensions | Una lista de extensiones de archivo separadas por comas para excluir. Esto anulará la lista FILTER_EXTENSIONS especificada en config.yml |
| -rp | --remove-params | Una lista separada por comas de parámetros sensibles a mayúsculas para eliminar de TODAS las URLs. Esto anulará la lista REMOVE_PARAMS especificada en config.yml. Esto puede ser útil para eliminar parámetros de cache buster, por ejemplo.** |
| -ks | --keep-slash | Una barra diagonal final al final de una URL de entrada no se eliminará. Por lo tanto, puede haber URLs idénticas en la salida, una con y otra sin barra diagonal final. |
| -khw | --keep-human-written | Por defecto, cualquier URL con una parte de la ruta que contenga más de 3 guiones (-) se elimina porque se asume que es contenido escrito por humanos (por ejemplo, una entrada de blog), y no es interesante. Pasar este argumento las mantendrá en la salida. |
| -kym | --keep-yyyymm | Por defecto, cualquier URL con una ruta que contenga /YYYY/MM (donde YYYY es un año y MM el mes) se elimina porque se asume que es contenido de blog/noticias, y no es interesante. Pasar este argumento las mantendrá en la salida. |
| -rcid | --regex-custom-id | ¡ÚSALO CON PRECAUCIÓN! Expresión regular (regex) para un ID personalizado que usa tu objetivo. Asegúrate de pasar el valor entre comillas. Consulta la sección siguiente para más detalles. |
| -iq | --ignore-querystring | Elimina la cadena de consulta (incluyendo los fragmentos de URL #) para que la salida contenga solo rutas únicas. |
| -fnp | --fragment-not-param | No trates los fragmentos de URL # de la misma manera que los parámetros, p. ej. si un enlace tiene una palabra clave de filtro y un fragmento (o parámetro), el enlace normalmente se conserva, pero si se pasa este argumento y un enlace tiene una palabra de filtro y un fragmento, el enlace se eliminará. Además, si se pasa este argumento y se usa -iq / --ignore-querystring, el fragmento NO se eliminará de los enlaces si no hay una cadena de consulta en el enlace. |
| -lang | --language | Si se pasa y hay múltiples URLs con diferentes códigos de idioma como parte de la ruta, solo se generará una versión de la URL. Los códigos se especifican en la sección LANGUAGE de config.yml. |
| -c | --config | Ruta al archivo de configuración YML. Si no se pasa, busca el archivo config.yml en el directorio de configuración predeterminado, p. ej. ~/.config/urless/. |
| -dp | --disregard-params | Hay cierto filtrado que no se realiza si las URLs tienen parámetros, porque por defecto queremos ver todos los parámetros posibles. Si se pasa este argumento, entonces se realizará el filtrado, independientemente de la existencia de parámetros. |
| -nb | --no-banner | Oculta el banner de la herramienta en la salida (está oculto por defecto si canalizas la entrada a urless). |
| --version | Muestra el número de versión actual. | |
| -v | --verbose | Salida detallada. |
-), PERO no es un GUID. Esto implica contenido escrito por humanos, p. ej. how-to-hack-the-planet. Si se pasa el argumento -khw, esto no se eliminará./YYYY/MM/, p. ej. un año, mes. Esto suele ser contenido estático como un blog. Si se pasa el argumento -kym, esto no se eliminará.en-gb#) Y el argumento -dp/--disregard-params NO se pasó: