Cracker une page http

Bon, je ne sais pas si le titre est assez évocateur de ce que je veux faire ^^

J’ai un site qui est hébergé par orange ou on me demande mon identifiant et mon mot de passe dans une fenêtre pop up.
Et je me demande si on peut faire un test via le terminal pour savoir si le mot de passe est juste ou faux. Pour ensuite avoir la possibilité d’automatiser le tout avec une clef qui sera constitue de 4 mots avec les lettre de l’alphabet {a,b,c,d}. (je pensais faire un programme qui genere un fichier texte avec tout les cas possibles et ensuite on testerait le tout)

Je précise que je fais juste ca pour apprendre et apprendre seulement :mrgreen: (et pouvoir faire des test de rapidité de sécurité grandeur nature)

Un peu ce que fait le plugin “fireforce” de firefox en fait, sauf que j’aimerai faire ca moi-même

Tu dis faire ça pour apprendre, je veux bien et je fais confiance à ton honnêteté mais si on te donne une réponse ici, tu ne seras pas seul à pouvoir la lire, alors conclue toi-même …
Je préfère que ce post en reste là mais il t’est toujours possible de contacter en MP un ou plusieurs membres qui sont habitués à répondre ici.
Je ne verrouille pas ce fil mais je demande à ce qu’il ne soit pas répondu en direct.

J’ai pas pris le temps de répondre à ma première lecture.
Je n’ai pas compris ce que tu cherche, générer tout les cas possible de mot de passe (print -l {a,b,c,d}{a,b,c,d}{a,b,c,d}{a,b,c,d} > fichier dans un terminal me les donne) ou faire une tentative avec chacun d’eux ?

@ricardo > L’énorme majorité des sites ont déjà des parades pour ce genre de chose (X échecs => blocage temporaire de la session HTTP/le coockies/l’IP), ceux qui ne le font pas se font attaquer par une foule de personnes parce que ça se trouve sans dificulté (et ça se programme sans difficulté non plus).

Personnellement, pour faire de la soumission de formulaire http automatisé je commencerais par en soumettre un et “dumper” ce qui est envoyé avec tcpdump. Une fois dans la trace la requête http trouvé, tu peut facilement la rejouer avec un outil simple comme netcat. Pour faire les tentatives il suffit de rendre paramétriques des parties de la requête.

Par contre ricardo, je suis d’accord de ne pas parler des techniques d’attaques sans parler des solutions de protection. Personnellement je pense que la toute première protection c’est de bloquer à x secondes le temps entre 2 tentatives de connexion quoi qu’il arrive. Ensuite il y a la technique de retarder le message d’erreur (c’est ce qui est fait sous unix/linux lorsque l’on se logue).

Edit: il ne faut pas repondre directement a ce sujet ??? :think:

[quote=“ricardo”]Tu dis faire ça pour apprendre, je veux bien et je fais confiance à ton honnêteté mais si on te donne une réponse ici, tu ne seras pas seul à pouvoir la lire, alors conclue toi-même …
Je préfère que ce post en reste là mais il t’est toujours possible de contacter en MP un ou plusieurs membres qui sont habitués à répondre ici.
Je ne verrouille pas ce fil mais je demande à ce qu’il ne soit pas répondu en direct.[/quote]

De deux choses l’une : soit ça se trouve sans difficulté auquel cas Tristan n’a pas cherché par lui-même, soit il a cherché mais ça ne se trouve pas si facilement que ça.
Dans les deux cas j’estime que c’est une raison suffisante pour ne pas fournir ce type d’information.

Effectivement, ça se programme sans aucune difficulté. Raison de plus pour ne pas expliquer comment faire : n’importe qui avec quelques connaissances en programmation est capable de le faire par lui-même, s’il ne sait pas par où commencer c’est qu’il n’est pas au niveau.
Je suis capable (tout comme toi je pense) de faire pas mal de trucs pas très nets si l’envie m’en prenait, mais ça ne me viendrait pas à l’idée d’encourager quelqu’un dans cette direction : on a acquis ces connaissances là parce qu’on en a besoin pour programmer correctement (connaître l’ennemi), pas pour s’amuser, et je suis persuadé que ça change énormément la manière de voir les choses et ce qu’on en fait.
Bref, t’auras compris mon point de vue, et pourquoi je n’ai apporté aucune réponse même avant le message initial de ricardo… Tu veux apprendre à sécuriser ton code / ton système ? Je ne vois aucun problème à partager mes connaissances (et si tu sais ce que tu fais, rien ni personne ne pourra t’empêcher de comprendre au passage comment exploiter ça contre les autres). Mais si ton but est d’apprendre des techniques “grises” pour les utiliser directement (même si c’est dans un but auto-proclamé “éducatif”) alors démerde toi, je n’approuve pas la diffusion de ces informations sous cette forme là. Ça permet d’éviter que des skiddies ne récupèrent une information qu’ils seraient autrement infoutus de trouver par eux-mêmes…

[quote=“ricardo”]
Je ne verrouille pas ce fil mais je demande à ce qu’il ne soit pas répondu en direct.[/quote]
J’ai édité mon post…

Oula du calme. Je n’ai donné que des pistes. Si quelqu’un voudrait les utiliser il lui faudrait apprendre pas mal de choses sur les divers outils que j’ai cité. Si j’explique que pour faire une attaque par DDOS le mieux c’est d’utiliser un botnet et d’utiliser LOIC ou HOIC, vous pensez vraiment que j’ai donné des informations à un cracker pour qu’il attaque google ?

(au passage : Je pleins franchement le script kiddy qui arriverait à faire quelque chose d’illégale avec mes explications parce qu’il se ferrait prendre la main dans le sac à sa première tentative)

De plus je ne vois pas comment parler des techniques de sécurisation sans parler de comment sont effectuer les attaques.

Si c’est réellement la volonté de tous je n’interviendrais plus sur ce genre de question, mais ça me paraîtrait réellement ridicule.

Oh tu sais, moi j’ai pas de volonté ici, juste un avis… (même si j’hésite pas à l’exprimer clairement) :wink:

Je ne suis pas d’accord avec ça. Dans la plupart des cas, tu n’as pas besoin de savoir implémenter une attaque pour comprendre comment elle fonctionne et savoir t’en protéger.

Un exemple tout con : un buffer overflow. Rien de plus facile à comprendre le concept (la mémoire se retrouve écrasée, si c’est dans le tas ça va provoquer un plantage à un moment donné, mais si c’est sur la pile on peut réécrire l’adresse de retour et exécuter du code arbitraire), facile à éviter (je vais pas détailler hein :stuck_out_tongue:), mais beaucoup plus délicat à implémenter correctement (il ne suffit plus d’avoir une vague compréhension de comment un ordinateur fonctionne, mais d’être capable de coder en assembleur PIC, savoir retrouver les points d’entrée des libs système, etc).
Du XSS, de l’injection SQL ? Même principe, mais qui font appel à des connaissances différentes.
Dans le cas présent, aucun besoin de connaître comment fonctionne réellement le protocole d’authentification pour pouvoir se protéger d’un brute force.

La vaste majorité des attaques suit ce modèle : principe simple à comprendre, contre-mesures simples à mettre en œuvre, mais implémentation de l’attaque elle-même pas si facile que ça (comparativement).
Du coup j’en reviens à ce que je disais : quand tu as les connaissances adéquates, une fois que tu as compris le principe d’une attaque ce n’est pas bien difficile de la reproduire. Mais quand tu n’as pas ces connaissances, ce n’est pas parce que tu n’es pas capable de l’implémenter que tu ne peux pas en comprendre le principe et t’en protéger. Et j’estime que moins il y a de gens qui savent lancer une attaque donnée, mieux c’est pour tout le monde.
:006

Non, je partage ton avis, je trouve toutes les infos concernant les exploits, les différentes forme de tests de pénétration, ethical hacking, administration de système et de réseau, recherches légales, récupération de données…Et j’t’en passe !..

Mais je suis aussi d’avis que ce forum n’est dedié à ça, (google est là pour ça) d’ou la suppression de mon post.

Edit: mais alors dans programmation, pas toute la programmation, ou bien le titre est trop direct… :think:

@syam > D’une part je ne suis pas rentré bien plus en détail que ce que tu as dis pour le buffer overflow, c’est juste que ça paraît plus car l’attaque est plus simple. D’autre part au moins pour un certains nombres d’attaques il faut avoir une vision un peu plus large que simplement savoir grosso modo comment ça se comporte pour deux raisons :
[ul]
[li]comprendre l’enjeu de la sécurité[/li]
[li]être en mesure de savoir si ta contre-mesure fonctionne (en principe tu es censé reproduire le bug pour pouvoir savoir si tu le corrige)[/li][/ul]

Wow ! Moi je voulais juste faire un test rapide pour avoir une estimation experimentale d’une brute force. C’etait juste une question que je me posais comme ça en passant ^^

Et en effet la generation de tout les cas possible ne me genait pas, le seul problème que j’avais pour lancer ce test c’était de rentrer le login et le mot de passe via le shell. Donc je me demandais juste comment faire

Pour information quant au démarche qui m’ont amené à vouloir faire ça. Avant j’ai codé en Caml (un langage assez proche du C je trouve) un programme simple qui répond “false” si on ne lui donne pas le bon mot de passe, et “true” si on lui donne le bon et j’ai lancé mon programme.
Et j’ai quelque chose d’assez rapide … Et je me demandais juste si c’était aussi rapide pour un protocole simple, genre une connection par http ou si le fait qu’on passe par la carte réseau ne limitait pas grandement la vitesse et si oui d’environ combien ?

Si jamais ca peut intéresser quelqu’un voici mon code CaML (je ne crois pas que ca aidera quiconque pour hacker quelque chose…)

[code](Le mot de passe est un entier pour faciliter le code, on aurait pu tout aussi bien mettre un alphabet mais cela aurait compliqué les chose pour, au final, pas grand chose (j’ai conscience qu’il y a bcp plus de choix avec les lettres qu’avec des chiffres))

let login a = (a=9999);; (ici le programme qui repond vrai ssi on donne le bon mdp)

let crack prgm =
let a1= ref 0 in
while (not prgm !a1) do incr a1 done; (tant que le test rend faux, on incremente de chiffre)
!a1;;
(la boucle peut être infini si le mot de passe est un entier négatif … mais on peut mettre un condition d’arrêt après un certain nombre de test)

#open “sys”;;
let t = ref(time()) in
let mdp = crack login in
print_float (time()-. !t); mdp;;[/code]

Pour un mot de passe à 4 chiffres j’ai 0.0sec
Pour un mot de passe à 6 chiffres j’ai 0.1sec
Pour un mot de passe à 7 chiffres j’ai 1.5sec
Pour un mot de passe à 9 chiffres j’ai 151.5sec

Donc la je vois bien que la complexité théorique et expérimental se rejoigne (et heureusement) car quand on augmente un chiffre on multiplie la complexité temporelle par 10.

J’ai aussi testé avec des conditions du style : si on sait que le mot est un mot du dictionnaire, etc…

Quant au réel test de hacking et de sécurité je pense m’y intéresser ces grandes vacances (vu que je compte m’intéresse au serveur et co pour que mon serveur personnel chez moi me soit accessible quand je serais loin) … donc c’est pas pour tout de suite. La c’est plus une question de complexité plus qu’autre chose

let crack prgm = let rec boucle a = if (prgm a) then a else (boucle (a+1)) in boucle;;

est plus dans l’esprit de Caml. Dire que Caml est proche du C est surprenant: ils sont diamétralement opposés…

En considérant uniquement le temps de trajet des paquets (ce qui est loin d’être réaliste) et en partant du principe que tu fais naïvement tes essais en série (tu attends d’avoir la réponse avant d’envoyer l’essai suivant), je te laisse faire le calcul avec un ping de 50ms (c’est pas énorme pour un serveur distant) et 10000 essais (4 chiffres)… Ça fait long hein ? :wink: Et à chaque chiffre que tu rajoutes, tu multiplies encore par 10. :mrgreen:
À ça il faut bien entendu rajouter le temps de traitement dû au protocole lui-même, aussi bien côté client que côté serveur, qu’on ne peut connaître qu’en mesurant (mais franchement, vu les chiffres que le réseau donne, je ne pense pas que le temps de calcul ait une grosse importance).

Je crois que ça répond à ta question, non ? :stuck_out_tongue:

[quote=“fran.b”]

let crack prgm = let rec boucle a = if (prgm a) then a else (boucle (a+1)) in boucle 0;;[/quote]

Je ne comprends pas en quoi c’est plus dans l’esprit de CaML de faire du récursif ? Il comprend mieux le récursif que l’itératif ?
J’avais fait le choix de l’itératif pour n’avoir qu’une seule référence tout le temps :think: . Ca me semblait plus approprié.

Personnellement j’ai pas trop touché au C, j’ai juste suivit des cours d’algorithmiques et les exemples était en C et niveau syntaxe ça avait l’air de coller …

Petit test de comparaison, il n’y a pas une très grosse différence mais l’itératif semble être plus rapide que le récursif :

fran.b : 16.5833333333 s Tristan.T : 13.2166666667 s mot de passe trouvé par fran.b :99999999 mot de passe trouvé par Tristan.T :99999999-
D’ailleurs est-ce-que c’est un cas général ? Et dans ce cas là quand on a le choix (quand on ne travaille pas avec des structures faites pour le récursif telle que les listes) mieux faut-il privilégier l’itératif ?
Après je suis d’accord qu’ici, la différence est vraiment infime mais c’est juste pour savoir parce que j’ai fait un TIPE sur des algorithmes de métaheuristique et l’algo génétique, une différence de une ou deux heures ca peut être cool ^^

En considérant uniquement le temps de trajet des paquets (ce qui est loin d’être réaliste) et en partant du principe que tu fais naïvement tes essais en série (tu attends d’avoir la réponse avant d’envoyer l’essai suivant), je te laisse faire le calcul avec un ping de 50ms (c’est pas énorme pour un serveur distant) et 10000 essais (4 chiffres)… Ça fait long hein ? :wink: Et à chaque chiffre que tu rajoutes, tu multiplies encore par 10. :mrgreen:
À ça il faut bien entendu rajouter le temps de traitement dû au protocole lui-même, aussi bien côté client que côté serveur, qu’on ne peut connaître qu’en mesurant (mais franchement, vu les chiffres que le réseau donne, je ne pense pas que le temps de calcul ait une grosse importance).

Je crois que ça répond à ta question, non ? :stuck_out_tongue:[/quote]

En effet ^^.

Haaaaa…Merci, j’aime bien rire :slightly_smiling:

bon le titre n’a rien a voir par contre…

[quote=“Tristan.T”][quote=“fran.b”]

let crack prgm = let rec boucle a = if (prgm a) then a else (boucle (a+1)) in boucle 0;;[/quote]

Je ne comprends pas en quoi c’est plus dans l’esprit de CaML de faire du récursif ? Il comprend mieux le récursif que l’itératif ?
J’avais fait le choix de l’itératif pour n’avoir qu’une seule référence tout le temps :think: . Ca me semblait plus approprié.[/quote]
Caml est un langage fonctionnel, pas impératif. Comme tu le dis, tu as fait du C avec Caml, les références dans les langages ML sont en général évitées. Ça n’empêche pas que ton programme fonctionne. La fonction boucle est récursive terminale donc immédiatement dérecursifée par le compilateur. Le code obtenu est équivalent. Camllight n’est pas adapté pour faire des tests de rapidité, prend plutôt Ocaml. Mais tu as raison qu’il est certin q’un programme en langage impératif © est plus facile à compiler de manière efficace qu’un programme en langage fonctionnel (Caml).

Ben ouais =/ … Mais j’avais pas d’idée de titre qui montrait ce que je voulais faire …

@fran.b … Ca dépasse mes compétences informatiques qui sont déjà pas très grandes … Jusqu’ici je me suis surtout intéressé à l’algorithmique en fait :think: . Pourquoi est-ce qu’Ocaml est plus approprié que Caml-light pour des tests de comparaison ? J’ai fait tout mes test de comparaison pour mon TIPE en caml-light … est-ce que je devrais refaire tout les calculs ?

parce qu’au debut je pensais plus a ceci : affection.org/forum-suivant_9424.htm

par contre bien aimer le cam(e)l, ca me rappel le basic