Debido a que habitualmente las URL’s son muy largas, nos vemos obligados a acortarlas, sobre todo si queremos añadirlas en ciertas redes sociales u otros servicios que tienen una estricta limitación en el número de caracteres disponibles. Dada esta necesidad, nacen los llamados acortadores de URL, que no es más que un simple servicio online con un dominio corto que se encarga de redirigir a la URL larga que le especifiquemos.
Además de ese buen uso que solemos dar a los acortadores de URL, también existe ciertos usos malintencionados, como por ejemplo para anonimizar las consultas a sitios web, realizar phishing u ocultar cualquier clase de malware. Como administradores de sistemas, la existencia de estas malas prácticas nos pueden llevar a la necesidad de prevenir y descubrir qué URL real se encuentra detrás de cada URL acortada por estos servicios.
Este sencillo script en PowerShell utiliza la API del servicio online de untiny.com, el cual soporta más de 240 servicios de acortadores de URL!, entre los que cabe destacar los populares bit.ly, Tiny.cc, goo.gl ó t.co
Este es mi código, el cual también podéis descargar desde el Centro de scripts de Microsoft TechNet Gallery.
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 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
cls #Esta parte del script sólo es una barra de progreso. function progressbar{ $array = 'Conectando...', 'Consultando...', 'Recibiendo resultados...', 'Comprobando conectividad con los resultados...' $count = 0 $start = Get-Date [nullable[double]]$secondsRemaining = $null foreach ($item in $array) { $count++ $percentComplete = ($count / $array.Count) * 100 $progressParameters = @{ Activity = "Tiempo transcurrido [$($count)/$($array.Count)] $($secondsElapsed.ToString('hh\:mm\:ss'))" Status = 'Procesando URL´s cortas!' CurrentOperation = "$item" PercentComplete = $percentComplete } if ($secondsRemaining) { $progressParameters.SecondsRemaining = $secondsRemaining } Write-Progress @progressParameters Start-Sleep -Milliseconds (Get-Random -Minimum 700 -Maximum 2000) $secondsElapsed = (Get-Date) - $start $secondsRemaining = ($secondsElapsed.TotalSeconds / $count) * ($array.Count - $count) } } #Esta es la función principal del script, la cual se encarga de descubrir la URL original. Function untiny { Param( [Parameter( Mandatory = $true, HelpMessage = 'La URL corta ha sido expandida', ValueFromPipeline = $true, Position = 0 )] [ValidateNotNullOrEmpty()] [string[]] $URL ) Begin{ } Process { Foreach($Item in $URL){ try { progressbar [PSCustomObject]@{ ShortURL = $Item LongURL = Invoke-WebRequest -Uri "http://untiny.me/api/1.0/extract?url=$Item&format=text" -ErrorAction Stop |` ForEach-Object Content } } catch { $_.exception.Message } } } End{ } } |
Para utilizarlo una vez descargado y ejecutado, sólo tenemos que utrilizar el comando untiny -url seguido de la/las URLs que queramos expandir. Por ejemplo:
1 |
untiny -URL http://bit.ly/1OVDHWY, https://goo.gl/oLKfpu |
Y en pocos segundos obtendremos el resultado de nuestra consulta.