Revue de code source / Outils SAST
Reading time: 13 minutes
tip
Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)
Soutenir HackTricks
- Vérifiez les plans d'abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PRs au HackTricks et HackTricks Cloud dépôts github.
Conseils et listes d'outils
- https://owasp.org/www-community/Source_Code_Analysis_Tools
- https://github.com/analysis-tools-dev/static-analysis
Outils Multi-Langues
Naxus - AI-Gents
Il existe un package gratuit pour examiner les PR.
Semgrep
C'est un outil Open Source.
Langues prises en charge
Catégorie | Langues |
---|---|
GA | C# · Go · Java · JavaScript · JSX · JSON · PHP · Python · Ruby · Scala · Terraform · TypeScript · TSX |
Bêta | Kotlin · Rust |
Expérimental | Bash · C · C++ · Clojure · Dart · Dockerfile · Elixir · HTML · Julia · Jsonnet · Lisp · |
Démarrage rapide
# Install https://github.com/returntocorp/semgrep#option-1-getting-started-from-the-cli
brew install semgrep
# Go to your repo code and scan
cd repo
semgrep scan --config auto
Vous pouvez également utiliser l'extension semgrep pour VSCode pour obtenir les résultats à l'intérieur de VSCode.
SonarQube
Il existe une version gratuite installable.
Démarrage rapide
# Run the paltform in docker
docker run -d --name sonarqube -e SONAR_ES_BOOTSTRAP_CHECKS_DISABLE=true -p 9000:9000 sonarqube:latest
# Install cli tool
brew install sonar-scanner
# Go to localhost:9000 and login with admin:admin or admin:sonar
# Generate a local project and then a TOKEN for it
# Using the token and from the folder with the repo, scan it
cd path/to/repo
sonar-scanner \
-Dsonar.projectKey=<project-name> \
-Dsonar.sources=. \
-Dsonar.host.url=http://localhost:9000 \
-Dsonar.token=<sonar_project_token>
CodeQL
Il existe une version gratuite installable mais selon la licence, vous ne pouvez utiliser la version gratuite de CodeQL que dans des projets Open Source.
Installer
# Download your release from https://github.com/github/codeql-action/releases
## Example
wget https://github.com/github/codeql-action/releases/download/codeql-bundle-v2.14.3/codeql-bundle-osx64.tar.gz
# Move it to the destination folder
mkdir ~/codeql
mv codeql-bundle* ~/codeql
# Decompress it
cd ~/codeql
tar -xzvf codeql-bundle-*.tar.gz
rm codeql-bundle-*.tar.gz
# Add to path
echo 'export PATH="$PATH:/Users/username/codeql/codeql"' >> ~/.zshrc
# Check it's correctly installed
## Open a new terminal
codeql resolve qlpacks #Get paths to QL packs
Démarrage rapide - Préparer la base de données
tip
La première chose que vous devez faire est de préparer la base de données (créer l'arborescence du code) afin que les requêtes puissent ensuite être exécutées dessus.
- Vous pouvez permettre à codeql d'identifier automatiquement la langue du dépôt et de créer la base de données.
codeql database create <database> --language <language>
# Example
codeql database create /path/repo/codeql_db --source-root /path/repo
## DB will be created in /path/repo/codeql_db
caution
Cela déclenchera généralement une erreur indiquant qu'une langue a été spécifiée (ou détectée automatiquement). Vérifiez les options suivantes pour corriger cela !
- Vous pouvez le faire manuellement en indiquant le repo et la langue (liste des langues)
codeql database create <database> --language <language> --source-root </path/to/repo>
# Example
codeql database create /path/repo/codeql_db --language javascript --source-root /path/repo
## DB will be created in /path/repo/codeql_db
- Si votre dépôt utilise plus d'une langue, vous pouvez également créer 1 base de données par langue en indiquant chaque langue.
export GITHUB_TOKEN=ghp_32849y23hij4...
codeql database create <database> --source-root /path/to/repo --db-cluster --language "javascript,python"
# Example
export GITHUB_TOKEN=ghp_32849y23hij4...
codeql database create /path/repo/codeql_db --source-root /path/to/repo --db-cluster --language "javascript,python"
## DBs will be created in /path/repo/codeql_db/*
- Vous pouvez également permettre à
codeql
d'identifier tous les langages pour vous et de créer une base de données par langage. Vous devez lui donner un GITHUB_TOKEN.
export GITHUB_TOKEN=ghp_32849y23hij4...
codeql database create <database> --db-cluster --source-root </path/to/repo>
# Example
export GITHUB_TOKEN=ghp_32849y23hij4...
codeql database create /tmp/codeql_db --db-cluster --source-root /path/repo
## DBs will be created in /path/repo/codeql_db/*
Démarrage rapide - Analyser le code
tip
Maintenant, il est enfin temps d'analyser le code
N'oubliez pas que si vous avez utilisé plusieurs langages, une DB par langage aurait été créée dans le chemin que vous avez spécifié.
# Default analysis
codeql database analyze <database> --format=<format> --output=</out/file/path>
# Example
codeql database analyze /tmp/codeql_db/javascript --format=sarif-latest --output=/tmp/graphql_results.sarif
# Specify QL pack to use in the analysis
codeql database analyze <database> \
<qls pack> --sarif-category=<language> \
--sarif-add-baseline-file-info \ --format=<format> \
--output=/out/file/path>
# Example
codeql database analyze /tmp/codeql_db \
javascript-security-extended --sarif-category=javascript \
--sarif-add-baseline-file-info --format=sarif-latest \
--output=/tmp/sec-extended.sarif
Démarrage rapide - Scripté
export GITHUB_TOKEN=ghp_32849y23hij4...
export REPO_PATH=/path/to/repo
export OUTPUT_DIR_PATH="$REPO_PATH/codeql_results"
mkdir -p "$OUTPUT_DIR_PATH"
export FINAL_MSG="Results available in: "
echo "Creating DB"
codeql database create "$REPO_PATH/codeql_db" --db-cluster --source-root "$REPO_PATH"
for db in `ls "$REPO_PATH/codeql_db"`; do
echo "Analyzing $db"
codeql database analyze "$REPO_PATH/codeql_db/$db" --format=sarif-latest --output="${OUTPUT_DIR_PATH}/$db).sarif"
FINAL_MSG="$FINAL_MSG ${OUTPUT_DIR_PATH}/$db.sarif ,"
echo ""
done
echo $FINAL_MSG
Vous pouvez visualiser les résultats dans https://microsoft.github.io/sarif-web-component/ ou en utilisant l'extension VSCode SARIF viewer.
Vous pouvez également utiliser l'extension VSCode pour obtenir les résultats dans VSCode. Vous devrez toujours créer une base de données manuellement, mais ensuite vous pouvez sélectionner n'importe quel fichier et cliquer sur Clic droit
-> CodeQL: Exécuter des requêtes dans les fichiers sélectionnés
Snyk
Il existe une version gratuite installable.
Démarrage rapide
# Install
sudo npm install -g snyk
# Authenticate (you can use a free account)
snyk auth
# Test for open source vulns & license issues
snyk test [--all-projects]
# Test for code vulnerabilities
## This will upload your code and you need to enable this option in: Settings > Snyk Code
snyk test code
# Test for vulns in images
snyk container test [image]
# Test for IaC vulns
snyk iac test
Vous pouvez également utiliser l'extension Snyk pour VSCode pour obtenir des résultats à l'intérieur de VSCode.
Insider
C'est Open Source, mais semble non maintenu.
Langages pris en charge
Java (Maven et Android), Kotlin (Android), Swift (iOS), .NET Full Framework, C#, et Javascript (Node.js).
Démarrage rapide
# Check the correct release for your environment
$ wget https://github.com/insidersec/insider/releases/download/2.1.0/insider_2.1.0_linux_x86_64.tar.gz
$ tar -xf insider_2.1.0_linux_x86_64.tar.gz
$ chmod +x insider
$ ./insider --tech javascript --target <projectfolder>
DeepSource
Gratuit pour les dépôts publics.
NodeJS
yarn
# Install
brew install yarn
# Run
cd /path/to/repo
yarn install
yarn audit # In lower versions
yarn npm audit # In 2+ versions
npm audit
pnpm
# Install
npm install -g pnpm
# Run
cd /path/to/repo
pnpm install
pnpm audit
- nodejsscan: Scanner de code de sécurité statique (SAST) pour les applications Node.js alimenté par libsast et semgrep.
# Install & run
docker run -it -p 9090:9090 opensecurity/nodejsscan:latest
# Got to localhost:9090
# Upload a zip file with the code
- RetireJS: L'objectif de Retire.js est de vous aider à détecter l'utilisation de versions de bibliothèques JS avec des vulnérabilités connues.
# Install
npm install -g retire
# Run
cd /path/to/repo
retire --colors
Electron
- electronegativity: C'est un outil pour identifier les erreurs de configuration et les anti-modèles de sécurité dans les applications basées sur Electron.
Python
- Bandit: Bandit est un outil conçu pour trouver des problèmes de sécurité courants dans le code Python. Pour ce faire, Bandit traite chaque fichier, construit un AST à partir de celui-ci et exécute des plugins appropriés contre les nœuds de l'AST. Une fois que Bandit a terminé de scanner tous les fichiers, il génère un rapport.
# Install
pip3 install bandit
# Run
bandit -r <path to folder>
- safety : Safety vérifie les dépendances Python pour des vulnérabilités de sécurité connues et suggère les remédiations appropriées pour les vulnérabilités détectées. Safety peut être exécuté sur des machines de développement, dans des pipelines CI/CD et sur des systèmes de production.
# Install
pip install safety
# Run
safety check
Pyt: Non maintenu.
.NET
# dnSpy
https://github.com/0xd4d/dnSpy
# .NET compilation
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe test.cs
RUST
# Install
cargo install cargo-audit
# Run
cargo audit
#Update the Advisory Database
cargo audit fetch
Java
# JD-Gui
https://github.com/java-decompiler/jd-gui
# Java compilation step-by-step
javac -source 1.8 -target 1.8 test.java
mkdir META-INF
echo "Main-Class: test" > META-INF/MANIFEST.MF
jar cmvf META-INF/MANIFEST.MF test.jar test.class
Tâche | Commande |
---|---|
Exécuter Jar | java -jar [jar] |
Décompresser Jar | unzip -d [output directory] [jar] |
Créer Jar | jar -cmf META-INF/MANIFEST.MF [output jar] * |
Base64 SHA256 | sha256sum [file] | cut -d' ' -f1 | xxd -r -p | base64 |
Supprimer la signature | rm META-INF/.SF META-INF/.RSA META-INF/*.DSA |
Supprimer du Jar | zip -d [jar] [file to remove] |
Décompiler la classe | procyon -o . [path to class] |
Décompiler Jar | procyon -jar [jar] -o [output directory] |
Compiler la classe | javac [path to .java file] |
Aller
https://github.com/securego/gosec
PHP
Plugins Wordpress
https://www.pluginvulnerabilities.com/plugin-security-checker/
Solidity
JavaScript
Découverte
- Burp:
- Spider et découvrir le contenu
- Sitemap > filtre
- Sitemap > clic droit sur le domaine > Outils d'engagement > Trouver des scripts
waybackurls <domain> |grep -i "\.js" |sort -u
Analyse Statique
Déminimiser/Beautifier/Prettify
- https://prettier.io/playground/
- https://beautifier.io/
- Voir certains des outils mentionnés dans 'Déobfusquer/Déballer' ci-dessous également.
Déobfusquer/Déballer
Remarque: Il peut ne pas être possible de déobfusquer complètement.
- Trouver et utiliser des fichiers .map:
- Si les fichiers .map sont exposés, ils peuvent être utilisés pour déobfusquer facilement.
- En général, foo.js.map correspond à foo.js. Cherchez-les manuellement.
- Utilisez JS Miner pour les rechercher.
- Assurez-vous qu'un scan actif est effectué.
- Lisez 'Conseils/Remarques'
- Si trouvés, utilisez Maximize pour déobfusquer.
- Sans fichiers .map, essayez JSnice:
- Références: http://jsnice.org/ & https://www.npmjs.com/package/jsnice
- Conseils:
- Si vous utilisez jsnice.org, cliquez sur le bouton d'options à côté du bouton "Nicify JavaScript", et désélectionnez "Infer types" pour réduire l'encombrement du code avec des commentaires.
- Assurez-vous de ne laisser aucune ligne vide avant le script, car cela peut affecter le processus de déobfuscation et donner des résultats inexacts.
- Pour quelques alternatives plus modernes à JSNice, vous pourriez aimer regarder les suivantes:
- https://github.com/pionxzh/wakaru
-
Wakaru est le décompilateur Javascript pour le frontend moderne. Il ramène le code original d'une source empaquetée et transpilée.
- https://github.com/j4k0xb/webcrack
-
Déobfusquer obfuscator.io, déminimiser et déballer le javascript empaqueté
- https://github.com/jehna/humanify
-
Dé-minimiser le code Javascript en utilisant ChatGPT Cet outil utilise de grands modèles de langage (comme ChatGPT & llama2) et d'autres outils pour dé-minimiser le code Javascript. Notez que les LLM ne font aucun changement structurel – ils fournissent seulement des indices pour renommer des variables et des fonctions. Le travail lourd est effectué par Babel au niveau AST pour garantir que le code reste équivalent 1-1.
- https://thejunkland.com/blog/using-llms-to-reverse-javascript-minification.html
-
Utiliser des LLM pour inverser la minimisation des noms de variables JavaScript
- Utilisez
console.log()
;
- Trouvez la valeur de retour à la fin et changez-la en
console.log(<packerReturnVariable>);
afin que le js déobfusqué soit imprimé au lieu d'être exécuté. - Ensuite, collez le js modifié (et toujours obfusqué) dans https://jsconsole.com/ pour voir le js déobfusqué enregistré dans la console.
- Enfin, collez la sortie déobfusquée dans https://prettier.io/playground/ pour l'embellir pour l'analyse.
- Remarque: Si vous voyez toujours du js empaqueté (mais différent), il peut être empaqueté de manière récursive. Répétez le processus.
Références
- YouTube: DAST - Javascript Dynamic Analysis
- https://blog.nvisium.com/angular-for-pentesters-part-1
- https://blog.nvisium.com/angular-for-pentesters-part-2
- devalias's GitHub Gists:
- Déobfusquer / Déminimiser le code d'application web obfusqué
- Ingénierie inverse des applications Webpack
- etc
Outils
Références moins utilisées
- https://cyberchef.org/
- https://olajs.com/javascript-prettifier
- https://jshint.com/
- https://github.com/jshint/jshint/
tip
Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)
Soutenir HackTricks
- Vérifiez les plans d'abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PRs au HackTricks et HackTricks Cloud dépôts github.