web-dev-qa-db-fra.com

Qu'est-ce qui définit un langage de programmation comme utile pour le piratage?

Je sais que les langages de script ( Perl , Ruby , Python , javascript et même Lua !!!) sont les plus appropriés pour le piratage et les tests de pénétration .

Ma question est: Qu'est-ce qui rend ces langues appropriées? D'après ce que je sais, elles sont plus lentes que les autres langues et fonctionnent à un niveau d'abstraction plus élevé , ce qui signifie qu'ils sont trop éloignés du matériel. La seule raison pour laquelle je pourrais penser est à cause de leurs capacités avancées de manipulation de chaînes, mais je crois que d'autres langages ont de telles capacités.

32
NlightNFotis

Les langues sont utiles pour faire des choses. Le type de choses pour lequel il convient dépend complètement du type de langage, des frameworks disponibles, des OS/interprètes/compilateurs, etc.

Regardons ceux que vous avez mentionnés:

  • Perl
    • Langage de script
    • Usage général
    • Disponible sur la plupart des OS * nix depuis les années 90.
    • Idéal pour les hacks rapides et les scripts courts.
  • Rubis
    • Langage de script
    • Usage général
    • Multiplateforme
    • Orienté objet
    • Réfléchissant (peut voir sa propre structure et son propre code)
    • Bon pour les cadres dynamiques
  • Python
    • Langage de script
    • Usage général
    • Multiplateforme
    • Conçu pour un code source clair et lisible
    • Grand cadre de bibliothèques
  • JavaScript
    • Langage de script
    • Basé sur le Web
    • Multiplateforme (disponible sur tous les principaux navigateurs)

Alors, qu'est-ce qui les rend particulièrement bons pour le pentesting? Eh bien, la plupart des pentesting consistent à rédiger des outils de mise au rebut rapide pour effectuer un travail spécifique pour un test spécifique. Écrire un tel outil en C ou C++ chaque fois que vous voulez faire un travail rapide est lourd et prend du temps. De plus, ils ont tendance à produire des fichiers binaires ou des sources spécifiques à la plate-forme qui nécessitent une compilation spécifique à la plate-forme, plutôt que des scripts multiplateformes qui exécutent simplement. Les langages de script vous offrent la flexibilité de produire de tels outils rapidement et facilement.

Par exemple, Ruby et Python sont populaires pour les tâches plus complexes car elles ont des bibliothèques complètes, tandis que Perl est populaire pour les hacks de traitement rapide des données. JavaScript est couramment utilisé) comme un langage simple basé sur un navigateur auquel tout le monde a accès. D'autres langues telles que C ont tendance à être utilisées pour des tâches de plus bas niveau qui s'interfacent avec le système d'exploitation.

Maintenant, l'autre côté de la médaille est les langues utilisées comme charges utiles. C'est là que la ligne devient floue, car les exigences sont très variées. Pour attaquer les boîtes Windows, toute charge utile qui n'a aucune dépendance en dehors de ce que le système d'exploitation fournit est utile. Cela peut être C, C++, VBScript, x86 asm, C #/VB.NET (.NET 2.0 est sur la plupart des machines de nos jours), etc. Pour attaquer des boîtes Linux, vous pouvez utiliser C, C++, des scripts bash ou Perl. Java est également courant pour les attaques multiplates-formes.

À la fin de la journée, choisissez la langue que vous trouvez la meilleure pour le travail!

30
Polynomial

Voici une excellente réponse que j'ai trouvée sur une question de débordement de pile dans un contexte similaire par @tqbf: (J'ai copié cette réponse ici, car je pense qu'elle donne des raisons valables pour lesquelles elles peuvent être préférées, donc cela pourrait être utile aux futurs lecteurs)

Vous voulez probablement Ruby, car c'est la langue maternelle de Metasploit, qui est le cadre de test de pénétration open source standard de facto. Ruby va vous donner:

  • Metasploit's framework, bases de données opcode et shellcode

  • Liaisons Ruby lorcon de Metasploit pour le travail 802.11 brut

  • Liaisons KARMA de Metasploit pour la redirection côté client 802.11

  • Libcurl et net/http pour l'écriture d'outils web

  • EventMachine pour le proxy Web et le travail de fuzzing (ou RFuzz, qui étend le serveur Web bien connu de Mongrel)

  • Metasm pour la génération de shellcode

  • Distorm pour le démontage x86

  • BinData pour le fuzzing de format de fichier binaire.

La deuxième place revient ici à Python. Il y a plus de bibliothèques de pentesting disponibles dans Python que dans Ruby (mais pas assez pour compenser Metasploit). Les outils commerciaux ont également tendance à prendre en charge Python --- si vous êtes un client Immunity CANVAS ou CORE Impact, vous voulez Python. Python vous donne:

  • Twisted pour l'accès au réseau

  • PaiMei pour le suivi des programmes et le débogage programmable

  • Support CANVAS et Impact

  • Dornseif's bibliothèques firewire pour le débogage à distance

  • Intégration prête avec WinDbg pour le débogage à distance du noyau Windows (il n'y a toujours pas de bonne réponse dans Ruby pour le débogage du noyau, c'est pourquoi j'utilise encore occasionnellement Python).

  • Peach Fuzzer et Sully pour le fuzzing

  • SpikeProxy pour les tests de pénétration Web (aussi, OWASP Pantera ).

Sans surprise, beaucoup de travaux Web utilisent des outils Java. L'outil standard de pentest web de facto est Burp Suite, qui est une application swing Java. Ruby et Python ont tous deux Java des variantes que vous pouvez utiliser pour accéder à des outils comme celui-ci. De plus, Ruby et Python offrent:

  • Intégration directe avec libpcap pour le travail de paquets bruts

  • Liaisons OpenSSL pour la cryptographie

  • Extensions IDA Pro

  • Interfaces de fonction étrangère C matures (ou au moins raisonnables) pour l'accès à l'API

  • WxWindows pour le travail de l'interface utilisateur et des piles Web décentes pour les interfaces utilisateur Web

Vous n'allez pas vous tromper avec l'une ou l'autre langue, bien que pour le travail pentest traditionnel, Metasploit contourne probablement tous les avantages Python, et pour le moment, pour le travail d'inversion x86, les interfaces de débogage supérieures de Python bordent tous les Ruby avantages.

Aussi: c'est 2008. Ce ne sont pas des "langages de script". Ce sont des langages de programmation. ;)

16
NlightNFotis

Les bibliothèques, le temps d'écrire du code, la compatibilité multiplateforme sont essentiels ici. J'ai trouvé qu'en utilisant Python j'ai pu proposer des exploits de preuve de concept en très peu de temps avec un minimum de lignes de code. Ceci est possible en raison de la vaste bibliothèque standard et des bibliothèques supplémentaires que vous pouvez également télécharger. Je pense que c'est la plus grande force de python à utiliser pour le pentesting et le piratage.

Ex. vous avez besoin d'une chaîne de 1000 caractères/1000 octets de long.

En python:

print "A"*1000

En C:

for(i=0;i<1000;i++)printf("A");`

(En dehors de tout ce qui inclut le mumbo jumbo et le compiler)

Ce n'est qu'un exemple simple. Mais comme vous pouvez le voir, le temps pris pour une tâche aussi triviale est beaucoup plus simple en python.

La différence peut être encore plus accentuée lorsque vous souhaitez envoyer des requêtes http, etc. à partir de votre code. Avec urllib, httplib, etc. pour python, vous pouvez le faire en 2 lignes de code.

7
sudhacker

Quelques bonnes réponses déjà à celle-ci mais je fournirai une autre perspective. L'une des raisons pour lesquelles les langages de script ont tendance à être utilisés pour le piratage est qu'ils optimisent la vitesse (et la facilité) de développement, ce qui est probablement un facteur clé.

Par exemple, pour les scripts de test de pénétration, j'utilise Ruby. Il a un certain nombre de bonnes bibliothèques pour des choses comme HTTP, ce qui signifie que je n'ai pas à me soucier des détails de bas niveau et l'écriture d'un script rapide est très rapide car il y a peu de "formalité" requise dans un Ruby = script (par exemple, déclarations de méthode/variable) par rapport à des langages comme Java.

L'un des inconvénients de ces langages peut être qu'ils sont plus lents au moment de l'exécution, mais pour de nombreux travaux de piratage qui ne sont pas un problème, la vitesse de développement est plus importante.

6
Rory McCune

Je pense que ce qui définit un langage adapté au piratage, c'est:

  1. tilisation de la langue.
  2. Prise en charge multiplateforme.

Prenons un exemple de Java. Il fonctionne sur toutes les plates-formes et est installé sur de nombreux systèmes. Cela garantit une probabilité assez élevée que le code des pirates puisse s'exécuter et que le langage est installé sur le système qu'il cible.

La communauté de langage de programmation très utilisé, trouve également occasionnellement des vulnérabilités dans le langage, ce qui a permis aux pirates de cibler cette vulnérabilité, et ont un changement très élevé de la frapper, en raison de la forte distribution du langage.

6
Kao

Je n'ai aucune connaissance dans ces domaines, mais les langages de programmation mentionnés permettent tous une programmation rapide, c'est-à-dire que l'on pourrait essayer un nombre beaucoup plus grand d'idées différentes dans un laps de temps donné qu'avec les plus efficaces à l'exécution mais inefficaces pour la programmation (et le débogage) langages de programmation comme C etc. Cela pourrait être un point.

6
Mok-Kong Shen

Mes deux centimes:

Exécutez bash (ou autre Shell ) en premier !!

La rapidité de la langue n'a pas d'importance lorsque vous êtes en pleine brainstorming!

L'un des termes les plus utiles et les plus puissants pour ce type d'opération semble avoir été oublié dans votre question.

Je voudrais parler de bash comme environnement de piratage. Oui Shell tire son nom du Shell qui peut contenir beaucoup d'autres choses.

Sous Un * x, vous êtes principalement connecté à une console Shell , pour pouvoir exécuter d'autres outils.

Si c'est l'un des plus lents langue:

$ time for ((i=1000000;i--;));do :;done
real    0m4.755s
user    0m4.628s
sys     0m0.124s

time Perl -e 'map{1}(0..1000000)' 
real    0m0.199s
user    0m0.112s
sys     0m0.060s

$ time python -c 'for a in range(1000000): 1==1
real    0m0.119s
user    0m0.096s
sys     0m0.020s

Oui! Plus de 4 secondes pour une boucle d'un million d'étapes est très lent, mais une fois connecté à une console de ligne de commande ...

Avantage principal à considérer:

  • historique Vous pouvez sauvegarder/copier votre historique afin de pouvoir les consulter ultérieurement ou de construire un script
  • log En utilisant des outils comme script et scriptreplay vous pouvez garder une trace très précise de tout votre travail
  • Cut'n paste En utilisant x-terminal ou des outils comme screen, vous pouvez jouer avec des tâches parallèles, sur une console séparée et partager entrées/sorties entre chacun d'eux.
  • fifo En fusionnant des outils simples mais puissants comme nc |sed |ssh |python ...

Échantillon pratique

vous pouvez partir de:

$ mkdir /tmp/hackingGoogle
$ cd $_

que

$ nc google.com 80 <<<$'HEAD /fonts/ HTTP/1.0\r\n\r'
HTTP/1.0 200 OK
Content-Type: text/html; charset=utf-8
...

De là, vous pouvez utiliser tous les outils de votre choix, comme ping, traceroute, openssl, nmap, etc ...

$ openssl s_client -connect google.com:443 -ign_eof \
      <<< $'HEAD / HTTP/1.0\r\n\r' 2>&1 | \
    openssl x509 -in /dev/stdin -out certfile
$ openssl x509 -in certfile -noout -fingerprint
SHA1 Fingerprint=67:1B:98:92:48:86:FF:E1:C5:02:44:C5:9F:F3:96:78:08:F5:0A:45
$ openssl x509 -in certfile -noout -subject
subject= /C=US/ST=California/L=Mountain View/O=Google Inc/CN=*.google.com

Si SSL vous intéresse, un exemple de script supplémentaire

ou...

$ wget https://www.google.com/fonts/
$ vi index.html
$ wget https://www.google.com/fonts/webfonts.nocache.js
$ smjs < <(sed < webfonts.nocache.js 's/Window....')
...

pour jouer avec javascript ...

Environnement utile pour stocker des variables:

$ ip=();ANS=false;while read -a line;do if [[ "$line" = ";;" ]];then [[ 
   "${line[1]}" = "ANSWER" ]] && ANS=true || ANS=false; fi ; $ANS && [[
   "${line[2]}" == "IN" ]] && ip+=(${line[4]});done < <(Dig www.google.com)
$ printf "%s\n" ${ip[@]}
173.194.116.51
173.194.116.52
173.194.116.48
173.194.116.49
173.194.116.50

Selon ce que vous recherchez, vous pouvez utiliser largement tous vos outils dans toutes les combinaisons.

$ grep ^64 < <(for Host in ${ip[@]};do ping -c2 $Host&done;wait)|sort -t. -nk4
64 bytes from 173.194.113.112: icmp_req=1 ttl=54 time=45.4 ms
64 bytes from 173.194.113.112: icmp_req=2 ttl=54 time=47.8 ms
64 bytes from 173.194.113.113: icmp_req=1 ttl=54 time=41.4 ms
64 bytes from 173.194.113.113: icmp_req=2 ttl=54 time=40.2 ms
64 bytes from 173.194.113.114: icmp_req=1 ttl=54 time=43.1 ms
64 bytes from 173.194.113.114: icmp_req=2 ttl=54 time=39.0 ms
64 bytes from 173.194.113.115: icmp_req=1 ttl=54 time=47.0 ms
64 bytes from 173.194.113.115: icmp_req=2 ttl=54 time=42.1 ms
64 bytes from 173.194.113.116: icmp_req=1 ttl=54 time=43.9 ms
64 bytes from 173.194.113.116: icmp_req=2 ttl=54 time=39.0 ms

Cela pourrait être réécrit:

Mini script à partir de là:

Avec cela, vous ferez deux ping, parallélisés (cela ne prendra normalement que 1 seconde) sur ~ 5 hôtes:

ip=()
ANS=false
while read -a line;do
    if [[ "$line" = ";;" ]] ;then
        [[ "${line[1]}" = "ANSWER" ]] && ANS=true || ANS=false
    fi
    $ANS && [[ "${line[2]}" == "IN" ]] &&
        ip+=(${line[4]})
  done < <(Dig www.google.com)
grep ^64 < <(
    for Host in ${ip[@]};do
        ping -c2 $Host &
    done
    wait
  ) |
  sort -t. -nk4

Autres langues (plus efficaces)

Une fois l'objectif fixé, après beaucoup de brainf @ # @ ing, commun hacker exécutera son éditeur préféré et stockera son exploit comme script pour automatiser la prochaine exécution.

Le choix de la langue utilisée dépendra principalement des préférences du pirate. (Si ce n'est pas requis par son patron.)

Et avant de réinventer la roue ...

Il existe déjà de nombreux outils dédiés au pentesting, au scan, à la recherche et à l'analyse. Si vous utilisez debian vous pouvez voir Debian Forensics Environment ...

Quoi qu'il en soit, le meilleur environnement pour tester et enregistrer chaque étape de ce type de travail est un Shell (comme bash ;-)

3
F. Hauri