Powershell: Script para extraer metadatos fotos con ExifTool
Hoy os voy a enseñar una entrada de esas de laboratorio que no cubren una necesidad básica, pero permiten tener conciencia de lo vulnerable que son los datos que subimos a las redes sociales, por ejemplo…
La idea es utilizar la automatización para extraer los metadatos de una foto, algo que nos puede permitir saber la ubicación GPS de la misma, por ejemplo. Lo voy a hacer mediante Powershell, automatizando el trabajo con un script y utilizando la herramienta ExifTool.
ExifTool es una herramienta de línea de comandos poderosa para leer, escribir y editar metadatos de archivos multimedia, incluidas imágenes. Es compatible con una amplia gama de formatos de archivos y tipos de metadatos, lo que la convierte en una herramienta valiosa para fotógrafos, archivistas y profesionales de TI.
Lo usaré bajo Windows, pero está disponible para Linux y MacOS:
Instalar ExifTool en Windows
Descargamos el ejecutable de Windows desde la página oficial de ExifTool:
- Ve a la página de descargas de ExifTool:
- Descarga el archivo .zip y extrae el contenido
- Al ejecutar exiftool(-k).exe nos bloqueará Windows Defender su instalación, tendréis que forzarla (al final son herramientas de hacking):
Una vez desbloqueado ya podremos usarlo:
Para el ejemplo usaré una foto mía, porque entiendo que se puede entender lo que podemos hacer sin comprometer a nadie.
Hicimos hace unos días una excursión al Valle de los Colores – Labetxu, que está en Guipúzcoa (País Vasco – España), y sale de Jaizkibel. Se que la foto tiene datos de localización así que los voy a ver con la herramienta:
Así que lo intento con la herramienta, os dejo el comando más básico, que simplemente es el ejecutable y el nombre de la imagen como parámetro:
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 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 |
PS C:\Users\ELBLOGDENEGU\Downloads\exiftool> .\exiftool.exe .\IMG_5807.JPG ExifTool Version Number : 12.86 File Name : IMG_5807.JPG Directory : . File Size : 11 MB File Modification Date/Time : 2024:05:26 14:10:25+02:00 File Access Date/Time : 2024:06:08 10:51:48+02:00 File Creation Date/Time : 2024:06:08 10:50:54+02:00 File Permissions : -rw-rw-rw- File Type : JPEG File Type Extension : jpg MIME Type : image/jpeg JFIF Version : 1.01 Resolution Unit : None X Resolution : 72 Y Resolution : 72 Exif Byte Order : Big-endian (Motorola, MM) Make : Apple Camera Model Name : iPhone 15 Pro Orientation : Horizontal (normal) Software : 17.5.1 Modify Date : 2024:05:25 15:34:26 Tile Width : 1024 Tile Length : 576 Exposure Time : 1/1506 F Number : 2.2 ISO : 40 Exif Version : 0232 Date/Time Original : 2024:05:25 15:34:26 Create Date : 2024:05:25 15:34:26 Offset Time : +02:00 Offset Time Original : +02:00 Offset Time Digitized : +02:00 Shutter Speed Value : 1/1506 Aperture Value : 2.2 Brightness Value : 9.61744 Exposure Compensation : 0 Metering Mode : Multi-segment Flash : No Flash Focal Length : 2.2 mm Sub Sec Time Original : 163 Sub Sec Time Digitized : 163 Exif Image Width : 6136 Exif Image Height : 3922 Sensing Method : One-chip color area Scene Type : Directly photographed Custom Rendered : Panorama White Balance : Auto Focal Length In 35mm Format : 14 mm Lens Info : 2.220000029mm f/2.2 Lens Make : Apple Lens Model : iPhone 15 Pro back camera 2.22mm f/2.2 GPS Latitude Ref : North GPS Longitude Ref : West GPS Altitude Ref : Above Sea Level GPS Time Stamp : 13:34:26 GPS Speed Ref : km/h GPS Speed : 0.4195652098 GPS Img Direction Ref : True North GPS Img Direction : 69.16830436 GPS Dest Bearing Ref : True North GPS Dest Bearing : 69.16830436 GPS Date Stamp : 2024:05:25 GPS Horizontal Positioning Error: 4.737956864 m Compression : JPEG (old-style) Thumbnail Offset : 1104 Thumbnail Length : 5084 Current IPTC Digest : 8f44d5dc0bf0cbb9251d283a27c94393 Coded Character Set : UTF8 Application Record Version : 2 Digital Creation Time : 15:34:26 Digital Creation Date : 2024:05:25 Date Created : 2024:05:25 Time Created : 15:34:26 IPTC Digest : 8f44d5dc0bf0cbb9251d283a27c94393 Profile CMM Type : Apple Computer Inc. Profile Version : 4.0.0 Profile Class : Display Device Profile Color Space Data : RGB Profile Connection Space : XYZ Profile Date Time : 2022:01:01 00:00:00 Profile File Signature : acsp Primary Platform : Apple Computer Inc. CMM Flags : Not Embedded, Independent Device Manufacturer : Apple Computer Inc. Device Model : Device Attributes : Reflective, Glossy, Positive, Color Rendering Intent : Perceptual Connection Space Illuminant : 0.9642 1 0.82491 Profile Creator : Apple Computer Inc. Profile ID : ecfda38e388547c36db4bd4f7ada182f Profile Description : Display P3 Profile Copyright : Copyright Apple Inc., 2022 Media White Point : 0.96419 1 0.82489 Red Matrix Column : 0.51512 0.2412 -0.00105 Green Matrix Column : 0.29198 0.69225 0.04189 Blue Matrix Column : 0.1571 0.06657 0.78407 Red Tone Reproduction Curve : (Binary data 32 bytes, use -b option to extract) Chromatic Adaptation : 1.04788 0.02292 -0.0502 0.02959 0.99048 -0.01706 -0.00923 0.01508 0.75168 Blue Tone Reproduction Curve : (Binary data 32 bytes, use -b option to extract) Green Tone Reproduction Curve : (Binary data 32 bytes, use -b option to extract) Image Width : 6136 Image Height : 3922 Encoding Process : Baseline DCT, Huffman coding Bits Per Sample : 8 Color Components : 3 Y Cb Cr Sub Sampling : YCbCr4:2:0 (2 2) Aperture : 2.2 Image Size : 6136x3922 Megapixels : 24.1 Scale Factor To 35 mm Equivalent: 6.3 Shutter Speed : 1/1506 Create Date : 2024:05:25 15:34:26.163+02:00 Date/Time Original : 2024:05:25 15:34:26.163+02:00 Modify Date : 2024:05:25 15:34:26+02:00 Thumbnail Image : (Binary data 5084 bytes, use -b option to extract) GPS Altitude : 29.5 m Above Sea Level GPS Date/Time : 2024:05:25 13:34:26Z GPS Latitude : 43 deg 21' 50.72" N GPS Longitude : 1 deg 52' 15.82" W Date/Time Created : 2024:05:25 15:34:26 Digital Creation Date/Time : 2024:05:25 15:34:26 Circle Of Confusion : 0.005 mm Field Of View : 104.3 deg Focal Length : 2.2 mm (35 mm equivalent: 14.0 mm) GPS Position : 43 deg 21' 50.72" N, 1 deg 52' 15.82" W Hyperfocal Distance : 0.47 m Light Value : 14.2 Lens ID : iPhone 15 Pro back camera 2.22mm f/2.2 |
Si queremos saber la ubicación GPS de esa imagen, como veis no es un valor decimal, así que cuando haces un copy-paste en la web de Google Maps no funciona, y lo tenemos que tener en cuenta:
1 2 3 |
PS C:\Users\ELBLOGDENEGU\Downloads\exiftool> .\exiftool.exe -GPSLatitude -GPSLongitude .\IMG_5807.JPG GPS Latitude : 43 deg 21' 50.72" N GPS Longitude : 1 deg 52' 15.82" W |
Como esto, podremos filtrar el dato que nos interese.
Script para extraer metadatos foto Iphone
En mi caso, lo que quiero es automatizar el proceso con un script, donde:
- Generemos un HTML con ubicación GPS extraída con Google Maps, para saber si es verdad que coincide
- Tabla con los metadatos de la foto
- Meteremos como parámetro la ruta de la foto
- Necesitaremos una API KEY si queremos insertarla en en HTML
Os dejo el fichero ps1:
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 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
# RAUL UNZUE - ELBLOGDENEGU # Script PowerShell para extraer metadatos de una imagen usando ExifTool, convertir GPS a decimal y generar un fichero HTML con enlace a Google Maps #param ( #[string]$ImagePath, #[string]$OutputHtmlPath = "C:\Users\ELBLOGDENEGU\Downloads\exiftool\output.html" #) $ImagePath = "C:\Users\ELBLOGDENEGU\Downloads\exiftool\IMG_5807.JPG" $OutputHtmlPath = "C:\Users\ELBLOGDENEGU\Downloads\exiftool\output.html" # Función para convertir coordenadas GPS en formato decimal function Convert-GPSToDecimal { param ( [string]$coordinate, [string]$hemisphere ) # Elimina "°", "'", " y " y cualquier otra marca $coordinate = $coordinate -replace ' deg', '' $coordinate = $coordinate -replace '°', ' ' -replace "'", ' ' -replace '"', '' $parts = $coordinate -split "\s+" $degrees = [double]$parts[0] $minutes = [double]$parts[1] $seconds = [double]$parts[2] $decimal = $degrees + ($minutes / 60) + ($seconds / 3600) if ($hemisphere -match "[SsWw]") { $decimal = -$decimal } return [math]::Round($decimal, 6) } # Verifica si la ruta de la imagen fue proporcionada if (-not $ImagePath) { Write-Host "Uso: .\Get-ExifDataAndGenerateHtml.ps1 -ImagePath <ruta_a_la_imagen> [-OutputHtmlPath <ruta_del_html>]" exit } # Verifica si la imagen existe if (-not (Test-Path $ImagePath)) { Write-Host "La imagen especificada no se encontró: $ImagePath" exit } # Ejecuta ExifTool para extraer los metadatos de la imagen $exifData = & C:\Users\ELBLOGDENEGU\Downloads\exiftool\exiftool.exe $ImagePath | Out-String # Analiza los datos EXIF $metaData = @{} $exifData -split "`n" | ForEach-Object { $line = $_ -split ": " if ($line.Count -eq 2) { $metaData[$line[0].Trim()] = $line[1].Trim() } } # Muestra los datos en una tabla en la consola $metaData.GetEnumerator() | Format-Table -AutoSize # Crear el contenido HTML $htmlContent = @" <!DOCTYPE html> <html lang="es"> <head> <meta charset="UTF-8"> <title>Metadatos de la Imagen</title> </head> <body> <h1>Metadatos de la Imagen</h1> "@ # Añadir la tabla con la información destacada $htmlContent += "<table border='1'> <tr><th>Etiqueta</th><th>Valor</th></tr> <tr><td>Fecha y Hora de Captura</td><td>$($metaData['Date/Time Original'])</td></tr> <tr><td>Resolución</td><td>$($metaData['Image Width']) x $($metaData['Image Height'])</td></tr> </table>" # Añadir la tabla con el resto de metadatos $htmlContent += "<h2>Otros Metadatos</h2> <table border='1'> <tr><th>Etiqueta</th><th>Valor</th></tr> @" foreach ($key in $metaData.Keys) { if ($key -ne 'Date/Time Original' -and $key -ne 'Image Width' -and $key -ne 'Image Height') { $htmlContent += "<tr><td>$key</td><td>$($metaData[$key])</td></tr>`n" } } $htmlContent += "</table>" # Verifica si hay datos de GPS y añade el enlace y la imagen de Google Maps if ($metaData.ContainsKey("GPS Latitude") -and $metaData.ContainsKey("GPS Longitude")) { $latitude = $metaData["GPS Latitude"] $longitude = $metaData["GPS Longitude"] # Extraer el hemisferio de las coordenadas $latitudeHemisphere = $latitude[-1] $longitudeHemisphere = $longitude[-1] # Convertir las coordenadas a formato decimal $latitudeDecimal = Convert-GPSToDecimal -coordinate $latitude -hemisphere $latitudeHemisphere $longitudeDecimal = Convert-GPSToDecimal -coordinate $longitude -hemisphere $longitudeHemisphere # Verifica si la conversión es correcta Write-Host "Latitud Decimal: $latitudeDecimal" Write-Host "Longitud Decimal: $longitudeDecimal" # Actualizar los metadatos de la imagen con las nuevas coordenadas en formato decimal $updateResult = & C:\Users\ELBLOGDENEGU\Downloads\exiftool\exiftool.exe "-GPSLatitude=$latitudeDecimal" "-GPSLongitude=$longitudeDecimal" "-GPSLatitudeRef=" "-GPSLongitudeRef=" $ImagePath if ($updateResult -like "*1 image files updated*") { Write-Host "Los metadatos GPS de la imagen han sido actualizados a formato decimal." } else { Write-Host "Hubo un problema al actualizar los metadatos GPS de la imagen." } # Genera el enlace a Google Maps $googleMapsUrl = "https://www.google.com/maps/search/?api=1&query=$latitudeDecimal,$longitudeDecimal" $htmlContent += "<h2>Enlace a Google Maps</h2>" $htmlContent += "<a href='$googleMapsUrl' target='_blank'>Ver en Google Maps</a>" # Añadir la captura de imagen de Google Maps $mapImageUrl = "https://maps.googleapis.com/maps/api/staticmap?center=$latitudeDecimal,$longitudeDecimal&zoom=15&size=600x300&maptype=roadmap&markers=color:red%7C$latitudeDecimal,$longitudeDecimal&key=YOUR_API_KEY" $htmlContent += "<h2>Vista de Google Maps</h2>" $htmlContent += "<img src='$mapImageUrl' alt='Google Maps Image'>" # Añadir las coordenadas GPS formateadas $htmlContent += "<h2>Coordenadas GPS Originales</h2>" $htmlContent += "<p>Latitud: $latitude</p>" $htmlContent += "<p>Longitud: $longitude</p>" } else { $htmlContent += "<p>No se encontraron datos de GPS en la imagen.</p>" } $htmlContent += " </body> </html> @" # Guardar el contenido HTML en un fichero $htmlContent | Out-File -FilePath $OutputHtmlPath -Encoding utf8 Write-Host "El archivo HTML ha sido generado y guardado en: $OutputHtmlPath" |
Nos genera un enlace a las coordenadas de la imagen, y si habéis metido la API, la inserta en el fichero HTML:
Conclusión, cuidado al compartir imágenes… Os dejo algunos datos relevantes:
Datos que se pueden extraer de una foto publicada
- Metadatos EXIF:
- Fecha y hora: Indican cuándo se tomó la foto.
- Ubicación GPS: Coordenadas precisas de dónde se tomó la foto.
- Modelo de la cámara: Marca y modelo del dispositivo utilizado.
- Configuraciones de la cámara: Información técnica como apertura, velocidad de obturación, ISO, etc.
- Contenido Visual:
- Rostros: Pueden ser reconocidos por software de reconocimiento facial.
- Entorno: Puede revelar tu ubicación (por ejemplo, puntos de referencia, calles, edificios).
- Objetos: Pueden indicar tus intereses o posesiones (por ejemplo, autos, gadgets).
- Textos: Cualquier texto visible puede ser leído y analizado (por ejemplo, placas de matrícula, señales).
- Contexto Social:
- Personas etiquetadas: Información sobre tus amigos y conexiones.
- Comentarios y reacciones: Pueden revelar opiniones y relaciones.
Problemas Asociados
- Privacidad y Seguridad:
- Exposición de Ubicación: Los datos GPS pueden revelar tu ubicación exacta, lo que puede ser explotado por malintencionados para seguir tus movimientos o encontrar tu domicilio.
- Robo de Identidad: Información personal y técnica puede ser utilizada para suplantación de identidad.
- Acoso: La exposición de datos personales puede conducir a acoso en línea o en persona.
- Seguridad Física:
- Robo: Si revelas que estás de vacaciones, alguien podría aprovechar la oportunidad para robar en tu casa.
- Secuestro: Exposición de rutinas diarias y lugares frecuentados puede aumentar el riesgo de secuestro, especialmente para menores.
- Explotación Comercial:
- Publicidad Dirigida: Empresas pueden usar la información para crear perfiles detallados y bombardearte con anuncios personalizados.
- Reventa de Datos: Los datos extraídos pueden ser vendidos a terceros sin tu consentimiento.
- Problemas Legales:
- Violación de Privacidad: Involuntariamente puedes revelar información de terceros sin su consentimiento, lo que puede resultar en problemas legales.
- Regulaciones de Datos: No cumplir con regulaciones como el GDPR puede resultar en multas.
Te ha gustado la entrada SGUENOS EN TWITTER O INVITANOS A UN CAFE?