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.
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:
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!
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. ;)
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.
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.
Je pense que ce qui définit un langage adapté au piratage, c'est:
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.
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.
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 ...
script
et scriptreplay
vous pouvez garder une trace très précise de tout votre travailscreen
, vous pouvez jouer avec des tâches parallèles, sur une console séparée et partager entrées/sorties entre chacun d'eux.nc
|sed
|ssh
|python
...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
$ 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 ...
$ 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:
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
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.)
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 ;-)