PHDays 9: Analyse AI CTF

Le sujet de la sécurité de l'apprentissage automatique a été assez hype ces derniers temps et je voulais aborder son côté pratique. Et puis la raison cool est PHDays , où une variété d'experts du monde de la sécurité de l'information se réunissent et il est possible d'attirer l'attention sur ce sujet.

En général, nous avons effectué un CTF basé sur les tâches, les tâches affectant une partie des risques de sécurité liés à l'utilisation des techniques d'apprentissage automatique.



Qu'est-ce que le CTF ???
Capture The Flag (CTF) est un concours de sécurité informatique très populaire (en popularité en tant que concours kaggle pour les centres de données). Il existe deux formats: tâche (jeorpady) et service (attaque-défense). Nous avons fait tâche.

Les compétitions de tâches classiques ressemblent au format de «Votre jeu». Lorsqu'il existe un ensemble de tâches de différentes catégories qui ont des coûts différents.

Les catégories traditionnelles dans CTF sont: vulnérabilités web - web, reverse - reverse engineering, crypto - cryptographie, stegano - steganography, pwn - exploitation binaire.

Les équipes (de 1 à n personnes) résolvent des tâches et celui qui résout des tâches pour un plus grand nombre de points est un bon gars.

Notre compétition a duré un peu plus d'une journée. Il était entendu qu'il s'agissait de personnes individuelles - des équipes d'une seule personne. Je voulais que les gens participent à la conférence pour se connaître personnellement. Par conséquent, les tâches doivent être résolues en quelques heures, ne nécessitent pas beaucoup de ressources informatiques, mais les tâches difficiles doivent également être - tous ne doivent pas gagner: D

En conséquence, nous avons eu 6 tâches (la septième était juste amusante), il semble que pour une personne par jour soit suffisant. Les tâches elles-mêmes, malheureusement, ne sont plus disponibles. Mais peut-être qu'après avoir lu l'analyse, vous souhaitez participer la prochaine fois?



Je voudrais exprimer ma profonde gratitude aux gars sans qui ce CTF n'aurait pas eu lieu: @groke et @mostobriv . Les idées les plus cool, les solutions techniques et une fête de déploiement la nuit avant le début - quoi de plus beau quand il est dans une entreprise formidable?! :)

Stegano: Aww - 100




tiny.cc/6fj06y

Ensemble de données Dan à partir de 3 391 photos de chats et de chiens.



La quête a été marquée comme "Stegano". Les travaux matelassés impliquent de cacher certaines informations. Il semblait facile de deviner que les chats et les chiens sont quelque chose de binaire. Après un peu de réflexion, nous pouvons supposer que cette séquence de chats et de chiens peut être une sorte de message binaire. Supposons que les phoques seront 1 et les chiens - 0. Si tout à coup cela ne fonctionne pas, vous pouvez simplement les échanger. Ensuite, nous trouvons un modèle formé qui classe les chats et les chiens. Il existe de nombreux exemples de leçons sur la classification des chats et des chiens, ainsi que des modèles formés après eux - vous pouvez trouver des modèles formés sur le github. Nous prenons un modèle formé, dans les cas extrêmes, nous nous entraînons. Nous prédisons chaque image comme 0 ou 1. Et cette séquence d '"octets" est traduite en une chaîne.

Vous pouvez voir la solution de l'auteur ici
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


Nous obtenons le texte qui contient le drapeau `AICTF {533m5_y0u_und3r574nd_4n1m4l5}`.

Cependant, pour une raison quelconque, plusieurs participants à différents moments ont tenté de passer un étrange drapeau avec le mot «adopté». Nous ne savons pas d'où ils l'ont obtenu, si tout d'un coup les participants expliquent, ce sera cool: D

Remarques




Le service était une sorte de «blog», où chaque utilisateur pouvait laisser des entrées publiques et privées. Étant donné que la fonctionnalité était petite - il n'était pas difficile de deviner que vous devez en quelque sorte obtenir un enregistrement privé.

Il n'y avait en fait qu'un seul champ de saisie - l'identifiant d'enregistrement.
Que faire

La première chose qui vient à l'esprit d'un agent de sécurité est d'essayer les injections SQL. Cependant, il est dit que le service est protégé par l'IA. Et je ne pouvais pas envoyer une simple injection SQL. Le service a répondu à une telle attaque avec "tentative de piratage!" Beaucoup ont essayé de le passer comme un drapeau, mais pensaient vraiment que tout était si simple?

Sous le capot du test, il y avait un réseau LSTM qui analysait id pour sql-injection. Cependant, l'entrée du LSTM doit être d'une longueur fixe. Par souci de simplicité, nous l'avons limité à 20 caractères. Autrement dit, la logique était la suivante: nous prenons la demande, si elle est supérieure à 20 caractères - nous la coupons et vérifions le reste, si elle est inférieure, puis ajoutons 0.

En fait, par conséquent, la simple injection SQL n'a pas fonctionné immédiatement.
Cependant, il y avait une chance de trouver un vecteur que le réseau ne verrait pas et ne prendrait pas pour une bonne demande.

Nouveau lecteur QR Edge




Il fallait reconnaître le QR-code:



Les fichiers à charger sont disponibles ici

Plusieurs fichiers cryptés ont été remis. Parmi eux se trouvait un fichier pyc, en l'inversant, il était évident qu'il y avait une fonction par le code dont il était possible de comprendre que tous les fichiers nécessaires étaient cryptés AES sur la clé, qui était reçue du bytecode de cette fonction et une autre à l'intérieur.

Il y avait deux solutions possibles: analyser le fichier pyc et obtenir l'implémentation des fonctions, ou créer votre propre module proxy hashlib, qui produirait son argument et l'exécuterait, vous pourriez obtenir une clé, puis déchiffrer les fichiers et exécuter le QR-Reader, qui a reconnu l'image proposée comme indicateur.

Une décision détaillée du participant qui a pris la 3e place peut être trouvée ici:


Défi de prédiction




Le service était une sorte de compétition comme sur kaggle. Il était possible d'enregistrer, de télécharger des données et de télécharger des modèles, ils ont été testés sur des données privées et le résultat a été enregistré sur un tableau de bord.

Et l'objectif semble évident - gagner en précision 1.0.

C'était difficile? Impossible: D

Les données ont été générées de manière aléatoire et, bien sûr, il a été laissé entendre qu'une telle précision devait être acquise d'une autre manière. Le service accepte les modèles au format .pickle. Et il semble que tout le monde le sait déjà, mais il s'avère que tout le monde ne peut pas obtenir le RCE au cornichon, mais quoi de pire?

Décision de Nikita (konodyuk)


En fait, cela devait être fait! Après avoir obtenu un accès à distance au serveur, il a été possible de télécharger les données sur lesquelles la solution a été testée, de recycler le modèle et d'obtenir une précision de 1,0 et avec lui le drapeau.

Photogramme




Comme son nom l'indique, le service fait quelque chose avec des images.
Une superbe interface d'application a suggéré de télécharger une photo.



En réponse, une image avec un style et un logo de compétition modifiés vous a été envoyée.



Où est le drapeau ici?

Il semble assez courant de rencontrer des vulnérabilités courantes sur CTF - cette fois, c'était Image Tragick . Cependant, peu ont deviné ou pas tous ceux qui l'ont essayé ont été exploités.

Antivirus New Age


Cette tâche s'est avérée être une cerise sur le gâteau et un problème non résolu. Bien qu'après avoir parlé avec les participants, il s'est avéré qu'ils étaient très proches de la réponse.



Les fichiers de tâche peuvent être consultés ici

Le système reçoit le bytecode python et s'exécute à la maison. Mais, bien sûr, elle ne le fera pas simplement, car il y a une «IA». Il vérifie la version de python et n'autorise pas le "mauvais". Si le code réussit le test, il est lancé sur le serveur, ce qui signifie que vous pouvez obtenir beaucoup d'informations.

Le bytecode que l'interprète donne pourrait être dilué en bits, et le réseau neuronal qui a vérifié manquerait (c'était aussi LSTM), ou vous pourriez ajouter un tas d'ordures à la fin.

De plus, lorsque vous savez comment exécuter du code Python, il était possible de détecter le binaire `flag_reader` sur le serveur, qui a été lancé à partir de la racine. Le binaire avait une vulnérabilité de chaîne de format à travers laquelle le drapeau pouvait être lu.

La solution de Nikita (konodyuk) peut également être trouvée ici.

Résumé


À la fin de la compétition, 130 inscrits, 14 ont passé au moins un drapeau et 5 des 6 tâches ont été résolues - cela signifie que nous avons réussi à équilibrer les tâches complexes et faciles.
Étant donné que nous n'avons pas beaucoup diffusé les informations, comme nous l'avons fait pour la première fois et que nous ne serions pas prêts pour une lourde charge, nous considérons toujours que la compétition est un super succès.

Prix ​​gagnés:

  • 1ère place - silencieux
  • 2ème place - Kurmur
  • 3e place - Konodyuk

Les gagnants ont été récompensés à la fin de la deuxième journée de PHDays avec des honneurs et des prix sympas: AWS DeepLens, Coral Dev Board et un sac à dos avec le logo de la conférence.

Les gars qui jouent habituellement au CTF classique et qui aiment désormais l'apprentissage automatique ont évalué notre concours, nous espérons donc que la prochaine fois, des centres de données intéressés par la sécurité seront rejoints.

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


All Articles