PHDays 9: análisis de AI CTF

El tema de la seguridad del aprendizaje automático ha sido bastante exagerado últimamente y quería abordar su lado práctico. Y luego, la razón genial es PHDays , donde se reúnen una variedad de expertos del mundo de la seguridad de la información y existe la oportunidad de llamar la atención sobre este tema.

En general, hicimos un CTF basado en tareas, con tareas que afectan parte de los riesgos de seguridad del uso de técnicas de aprendizaje automático.



¿Qué es el CTF?
Capture The Flag (CTF) es una competencia de seguridad informática muy popular (en popularidad como una competencia de kaggle para los centros de datos). Hay dos formatos: tarea (jeorpady) y servicio (ataque-defensa). Hicimos tarea.

Las competiciones de tareas clásicas se asemejan al formato de "Tu juego". Cuando hay un conjunto de tareas de diferentes categorías que tienen diferentes costos.

Las categorías tradicionales en CTF son: web - vulnerabilidades web, ingeniería inversa - inversa, cripto - criptografía, stegano - esteganografía, pwn - explotación binaria.

Los equipos (de 1 a n personas) resuelven tareas y quien resuelva tareas por un mayor número de puntos es un buen compañero.

Nuestra competencia duró un poco más de un día. Se entendió que es individual: equipos de una persona. Quería que las personas participaran en la conferencia para conocerse personalmente. Por lo tanto, las tareas deben resolverse en un par de horas, no requieren muchos recursos informáticos, sin embargo, las tareas difíciles también deben ser, no todas deben ganar: D

Como resultado, tuvimos 6 tareas (la séptima fue simplemente divertida), parece que para una persona al día es suficiente. Las tareas mismas, desafortunadamente, ya no están disponibles. Pero tal vez después de leer el análisis, ¿quieres participar la próxima vez?



Me gustaría expresar mi profunda gratitud a los chicos sin los cuales este CTF no habría tenido lugar: @groke y @mostobriv . Las mejores ideas, soluciones técnicas y una fiesta de despliegue la noche antes del comienzo: ¿qué podría ser más hermoso cuando está en una excelente compañía? :)

Stegano: Aww - 100




tiny.cc/6fj06y

Conjunto de datos de Dan de 3 391 imágenes de gatos y perros.



La búsqueda fue marcada como "Stegano". Los trabajos acolchados implican ocultar cierta información. Parecía fácil adivinar que los gatos y los perros son algo binario. Después de pensar un poco, podemos suponer que esta secuencia de gatos y perros puede ser algún tipo de mensaje binario. Suponga que los sellos serán 1 y los perros - 0. Si de repente no funciona, simplemente puede cambiarlos. A continuación, encontramos un modelo entrenado que clasifica gatos y perros. Hay muchos ejemplos de lecciones sobre la clasificación de gatos y perros, así como modelos entrenados después de ellos: puede encontrar modelos entrenados en el github. Tomamos un modelo entrenado, en casos extremos, nos entrenamos. Predecimos cada imagen como 0 o 1. Y esta secuencia de "bytes" se traduce en una cadena.

La solución del autor se puede encontrar aquí
import time
import sys
import os
import numpy as np
from keras.models import load_model
from keras.preprocessing import image
data_path = "../data/"
picture_path = data_path + "{}.jpg"
CLASSES = [1, 0]
def run(model_path):
pictures_names = os.listdir(data_path)
pic_num = len(pictures_names)
model = load_model(model_path)
res = []
for pic in range(pic_num):
img = image.load_img(picture_path.format(pic), target_size=(224,224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
preds = model.predict(x)
y_classes = preds.argmax(axis=-1)
res.append(CLASSES[y_classes[0]])
res = ''.join(map(str, res))
n = int("0b" + res, 2)
text = n.to_bytes((n.bit_length() + 7) // 8, 'big').decode()
print(text)
if __name__ == '__main__':
if len(sys.argv) < 2:
print("path to the model expected")
exit(1)
run(sys.argv[1])
view raw aww_solver.py hosted with ❤ by GitHub


Obtenemos el texto que contiene la bandera `AICTF {533m5_y0u_und3r574nd_4n1m4l5}`.

Sin embargo, por alguna razón, varios participantes en diferentes momentos trataron de pasar una bandera extraña con la palabra "Adoptado". No sabemos de dónde lo obtuvieron, si de repente los participantes explican, será genial: D

Notas




El servicio era una especie de "blog", donde cada usuario podía dejar entradas públicas y privadas. Dado que la funcionalidad era pequeña, no fue difícil adivinar que de alguna manera necesita obtener un registro privado.

En realidad, solo había un campo de entrada: la identificación del registro.
Que hacer

Lo primero que le viene a la mente a un guardia de seguridad es intentar inyecciones sql. Sin embargo, se dice que el servicio está protegido por IA. Y no pude enviar una simple inyección sql. El servicio respondió a tal ataque con "¡Intento de piratería!" Muchos trataron de pasarlo como una bandera, pero ¿realmente pensaron que todo es tan simple?

Bajo el capó de la prueba había una red LSTM que analizaba la identificación para la inyección sql. Sin embargo, la entrada al LSTM debe ser de longitud fija. Por simplicidad, lo limitamos a 20 caracteres. Es decir, la lógica era esta: tomamos la solicitud, si tiene más de 20 caracteres; la cortamos y verificamos el resto, si es menor, luego agregamos 0.

En realidad, por lo tanto, la inyección de sql simple no funcionó de inmediato.
Sin embargo, había una posibilidad de encontrar un vector que la red no vería y tomaría para una buena solicitud.

Nuevo lector QR Edge




Era necesario reconocer el código QR:



Los archivos a la tarea están disponibles aquí

Se entregaron varios archivos encriptados. Entre ellos había un archivo pyc, habiéndolo invertido, era obvio que había una función por el código de la cual era posible entender que todos los archivos necesarios estaban encriptados por AES en la clave, que se recibió del código de bytes de esta función y otra dentro de ella.

Había dos posibles soluciones: analizar el archivo pyc y obtener la implementación de las funciones, o hacer su propio módulo proxy hashlib, que generaría su argumento y lo ejecutaría, podría obtener una clave, luego descifrar los archivos y ejecutar el QR-Reader, que reconoció la imagen propuesta como una bandera.

Una decisión detallada del participante que tomó el 3er lugar se puede encontrar aquí:


Desafío de predicción




El servicio era una especie de competencia como en kaggle. Fue posible registrar, descargar datos y cargar modelos, se probaron en datos privados y el resultado se registró en un panel de control.

Y el objetivo parece obvio: obtener una precisión de 1.0.

¿Fue dificil? Imposible: D

Los datos se generaron al azar y, por supuesto, se dio a entender que esa precisión debía obtenerse de alguna otra manera. El servicio aceptó modelos en formato .pickle. Y parece que todos ya lo saben, pero resulta que no todos pueden obtener RCE a través del encurtido, pero ¿qué podría ser peor?

La decisión de Nikita (konodyuk)


En realidad, esto tenía que hacerse! Después de obtener acceso remoto al servidor, fue posible descargar los datos en los que se probó la solución, volver a entrenar el modelo y obtener una precisión de 1.0 y con ello la bandera.

Fotograma




Como su nombre lo indica, el servicio hace algo con imágenes.
Una sorprendente interfaz de aplicación sugirió cargar una foto.



En respuesta, se le envió una imagen con un estilo cambiado y el logotipo de la competencia.



¿Dónde está la bandera aquí?

Parece bastante común encontrar vulnerabilidades comunes en CTF, esta vez fue Image Tragick . Sin embargo, pocos adivinaron o no todos los que lo intentaron fueron explotados.

Antivirus de la nueva era


Esta tarea resultó ser la guinda del pastel y un problema sin resolver. Aunque después de hablar con los participantes, resultó que estaban muy cerca de la respuesta.



Los archivos para la tarea se pueden ver aquí

El sistema recibe el código de bytes de Python y se ejecuta en casa. Pero, por supuesto, no solo lo hará, porque hay una "IA". Comprueba la versión de python y no permite el "error". Si el código pasó la prueba, se lanzó en el servidor, lo que significa que podría obtener mucha información.

El código de bytes que proporciona el intérprete podría diluirse en bits, y la red neuronal que verificó no funcionaría (también era LSTM), o podría agregar un montón de basura al final.

Además, cuando sabes cómo ejecutar el código Python, es posible detectar el binario `flag_reader` en el servidor, que se inició desde la raíz. El binario tenía una vulnerabilidad de cadena de formato a través de la cual se podía leer la bandera.

La solución de Nikita (konodyuk) también se puede encontrar aquí.

Resumen


Al final de la competencia, 130 registrados, 14 pasaron al menos una bandera y se resolvieron 5 de 6 tareas, lo que significa que logramos equilibrar las tareas difíciles y fáciles.
Teniendo en cuenta que no difundimos mucho la información, como lo hicimos por primera vez y no estaríamos listos para una carga pesada, todavía consideramos que es una competencia súper exitosa.

Premios ganados:

  • 1er lugar - silencioso
  • 2do lugar - kurmur
  • 3er lugar - konodyuk

Los ganadores fueron premiados al final del segundo día de PHDays con honores y premios geniales: AWS DeepLens, Coral Dev Board y una mochila con el logotipo de la conferencia.

Los muchachos que generalmente juegan CTF clásico y ahora son aficionados al aprendizaje automático calificaron nuestro concurso, por lo que esperamos que la próxima vez se unan los datacentistas interesados ​​en la seguridad.

Source: https://habr.com/ru/post/454206/


All Articles