web-dev-qa-db-fra.com

Comment créer un défi de piratage qui utilise XSS?

Les conférences de sécurité ont souvent des problèmes de piratage. Mes collègues et moi en avons construit un nombre . Nous n'en avons pas encore fait une qui inclut une vulnérabilité de script intersite.

J'ai vu des défis qui font cela. Une approche était qu'une certaine page (vulnérable aux XSS stockés) était demandée par un navigateur sur une base périodique (toutes les 10s je pense). Après une attaque réussie, votre charge utile a fonctionné dans ce navigateur et le défi était d'extraire le cookie.

Un problème avec cette approche est que lorsque plusieurs personnes travaillent simultanément sur le défi, elles interfèrent les unes avec les autres - et vous pouvez voler les idées des autres. Une autre idée était d'avoir uniquement XSS réfléchissant et une page où vous pouvez soumettre un lien vers le site, que l'administrateur examinera avant sa mise en ligne.

La durée pendant laquelle le navigateur reste ouvert est un choix intéressant. S'il reste ouvert un certain temps (environ 60 ans), les gens peuvent utiliser des outils comme BeEF, ce qui le rend un peu plus facile. S'il n'est ouvert que pendant 2 secondes, vous devez scénariser l'attaque.

Il y a un certain nombre de détails qui affectent la façon dont le défi fonctionnera dans la pratique. Je préfère les réponses de personnes ayant une expérience des défis de piratage XSS qui ont bien fonctionné. Mais à défaut, je me contenterai d'une spéculation éclairée.

Si cela aide, nous avons tendance à assister à des conférences techniques au Royaume-Uni, par exemple B-Sides Manchester, SteelCon, SecuriTay.

De plus, toute indication sur la défense du navigateur contre les exploits JavaScript serait la bienvenue!

15
paj28

L'approche la plus courante que j'ai vue consiste à exécuter un bot navigateur sans tête qui obtient des liens vulnérables via un système de soumission. Il visite ensuite chacun de ces liens pendant quelques secondes avec un ensemble de cookies magiques.

Un exemple peut être trouvé dans l'article " Comment ajouter un bot compatible XSS à votre CTF " où le bot est implémenté comme une instance sans tête PhantomJS . De même, le jeu hackxor utilise HtmlUnit pour simuler une victime de navigation et ce défi XSS utilise une instance de Zombie.js =.

Il y a en effet plusieurs raisons d'éviter les XSS stockés: non seulement les joueurs apprendraient les méthodes des autres et éventuellement interféreraient avec leurs charges utiles, mais les gens pourraient commencer à ennuyer les autres avec des redirections ou des boucles infinies qui vous occuperaient à tout nettoyer.

Au lieu de cela, je suggérerais une vulnérabilité XSS reflétée avec un système de soumission simple où les joueurs peuvent fournir des liens qui sont ensuite visités par le bot. Selon le scénario, la soumission peut être placée dans le contexte d'un formulaire de contact, d'un simple écouteur de socket, n message privé IRC , ou, si vous le souhaitez , un compte e-mail où les liens des e-mails entrants sont extraits et visités.

J'éviterais certainement un système qui nécessite une interaction manuelle. Sinon, les gens demanderont constamment si leur charge utile a déjà fonctionné, si elle peut être visitée à nouveau, etc. En fonction de l'agressivité des joueurs, vous devriez également penser à un moyen de limiter les soumissions. (Un CAPTCHA pour le formulaire de contact correspondrait bien au scénario.)

15
Arminius

Je recommanderais des environnements de conteneurs individuels pour séparer les conflits entre les concurrents.

Par exemple: consultez le CTF d'une heure de SANS sur https://www.onehourctf.com - Le CtF d'une heure utilise Docker et Guacamole pour fournir un environnement d'apprentissage partagé rapide. Guacamole fournit l'interface visuelle (VNC/RDP/SSH) aux conteneurs Docker.

Pour une méthode simple pour enseigner les vulnérabilités de script intersite, vous pouvez envisager une simulation instruite de l'attaque avec du code personnalisé. D'après les attaquants perspicaces, c'est légitime, mais le back-end simule les résultats visuels.

3
Kamic

C'est clairement formidable de se restreindre avec une approche systématique de développement des FFC. Cela pourrait être fait via des référentiels de connaissances qui contiennent un vecteur d'attaque similaire.

Par exemple, dans votre FFC - vous avez l'intention de vous concentrer sur code injections - les variantes liées à code injection les attaques sont absolument liées à l'exploitation des scripts côté client . Pour le réduire, utilisez la fonction de l'ingrédient clé abusée. Dans ce cas particulier, principalement JavaScript et c'est JS Engines sont vulnérables. Par conséquent, votre équipe devrait être en mesure de rassembler des informations concernant ce dire JS Vuln DB peut vous récupérer CVE + c'est POC pour commencer!

Prenons un autre scénario. Supposons que vous fassiez des fichiers CTF qui sont destinés aux vecteurs 'File Include`, des exemples pourraient être [~ # ~] lfi [~ # ~] , [~ # ~] rfi [~ # ~] , [~ # ~] ssi [~ # ~] , etc. vous pouvez utiliser l'API fournie par cve-search puis éventuellement mapper tous les CVE afin que ce soit plus facile.

L'idée est de centraliser et pourtant d'isoler les séances d'entraînement dans un environnement sécurisé si vous faites partie de l'équipe bleue. Deuxièmement, je suggère peut-être qu'un réglage fin ou un tampon supplémentaire basé sur le contexte pourrait fonctionner après avoir tordu les originaux. C'est de là que tu pars. Le premier problème lié au vol d'idées de cookies, vous pouvez facilement les corriger via l'utilisation de différents bacs à sable parallèles. Je suppose qu'il y a des fournisseurs qui ont ce genre de configuration. Découvrez CTF365 .

1
Shritam Bhowmick

Si tout ce dont vous avez besoin est que votre serveur visite une URL donnée, alors plutôt que d'avoir des robots et des threads, etc., la solution la plus simple serait de visiter immédiatement (dès que l'URL est soumise) l'URL en utilisant une bibliothèque (comme les demandes en python) qui permet également d'analyser la réponse. Comme si un administrateur ou un autre robot l'avait visité pour de vrai, dans son propre navigateur.

MISE À JOUR:

Voici une explication plus détaillée (comme demandé). Dès que l'entrée utilisateur est reçue (dans ce cas, par exemple, une URL), passez-la simplement à la fonction suivante:

def simulate_admin_visits(url):
try:
    #initialise with empty cookies
    jar = requests.cookies.RequestsCookieJar()
    #visit the page that allows the admin to login 
    #and collect the cookies from the response
    response = requests.post(LOGIN_URL, data={'uname': ADMIN_UNAME, 'password': ADMIN_PASSWORD}, cookies=jar)
    jar.update(response.cookies)
    #visit the user-submitted content using the just-collected cookies
    #here the exploit/ctf_challenge-solution is allowed to work
    <parse the submitted content>
    #have the admin logout
    requests.get(LOGOUT_URL, cookies=jar)
except ConnectionError:
    print 'Could not connect to ' + url
0
iammyr