hacktricks/network-services-pentesting/pentesting-web/code-review-tools.md

483 lines
19 KiB
Markdown

# Outils d'examen de code source / SAST
<details>
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Expert Red Team AWS de HackTricks)</strong></a><strong>!</strong></summary>
Autres façons de soutenir HackTricks :
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
* Découvrez [**La famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez-nous** sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Partagez vos astuces de piratage en soumettant des PR aux** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) dépôts GitHub.
</details>
## Conseils et listes d'outils
* [**https://owasp.org/www-community/Source\_Code\_Analysis\_Tools**](https://owasp.org/www-community/Source\_Code\_Analysis\_Tools)
* [**https://github.com/analysis-tools-dev/static-analysis**](https://github.com/analysis-tools-dev/static-analysis)
## Outils multi-langages
### [Naxus - AI-Gents](https://www.naxusai.com/)
Il existe un **forfait gratuit pour examiner les PR**.
### [**Semgrep**](https://github.com/returntocorp/semgrep)
C'est un **outil Open Source**.
#### Langages pris en charge
| Catégorie | Langages |
| ------------ | ----------------------------------------------------------------------------------------------------- |
| GA | C# · Go · Java · JavaScript · JSX · JSON · PHP · Python · Ruby · Scala · Terraform · TypeScript · TSX |
| Beta | Kotlin · Rust |
| Experimental | Bash · C · C++ · Clojure · Dart · Dockerfile · Elixir · HTML · Julia · Jsonnet · Lisp · |
#### Démarrage rapide
{% code overflow="wrap" %}
```bash
# 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
```
{% endcode %}
Vous pouvez également utiliser l'[**extension VSCode semgrep**](https://marketplace.visualstudio.com/items?itemName=Semgrep.semgrep) pour obtenir les résultats dans VSCode.
### [**SonarQube**](https://www.sonarsource.com/products/sonarqube/downloads/)
Il existe une **version gratuite** installable.
#### Démarrage rapide
{% code overflow="wrap" %}
```bash
# 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>
```
{% endcode %}
### 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**.
#### Installation
{% code overflow="wrap" %}
```bash
# 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
```
{% endcode %}
#### Démarrage rapide - Préparer la base de données
{% hint style="success" %}
La première chose à faire est de **préparer la base de données** (créer l'arborescence du code) afin que les requêtes puissent être exécutées dessus ultérieurement.
{% endhint %}
* Vous pouvez permettre à codeql d'identifier automatiquement le langage du dépôt et de créer la base de données
{% code overflow="wrap" %}
```bash
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
```
{% endcode %}
{% hint style="danger" %}
Cela déclenchera généralement une erreur indiquant que plus d'une langue a été spécifiée (ou détectée automatiquement). Vérifiez les options suivantes pour corriger cela!
{% endhint %}
* Vous pouvez le faire manuellement en indiquant le **dépôt** et la **langue** ([liste des langues](https://docs.github.com/en/code-security/codeql-cli/getting-started-with-the-codeql-cli/preparing-your-code-for-codeql-analysis#running-codeql-database-create))
{% code overflow="wrap" %}
```bash
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
```
{% endcode %}
* Si votre dépôt utilise **plus d'une langue**, vous pouvez également créer **1 BD par langue** en indiquant chaque langue.
{% code overflow="wrap" %}
```bash
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/*
```
{% endcode %}
* Vous pouvez également permettre à `codeql` d'**identifier toutes les langues** pour vous et de créer une base de données par langue. Vous devez lui donner un **GITHUB\_TOKEN**.
{% code overflow="wrap" %}
```bash
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/*
```
{% endcode %}
#### Démarrage rapide - Analyser le code
{% hint style="success" %}
Maintenant, il est enfin temps d'analyser le code
{% endhint %}
N'oubliez pas que si vous avez utilisé plusieurs langues, **une base de données par langue** aurait été créée dans le chemin que vous avez spécifié.
{% code overflow="wrap" %}
```bash
# 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
```
{% endcode %}
#### Démarrage rapide - Scripté
{% code overflow="wrap" %}
```bash
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
```
{% endcode %}
Vous pouvez visualiser les résultats sur [**https://microsoft.github.io/sarif-web-component/**](https://microsoft.github.io/sarif-web-component/) ou en utilisant l'extension VSCode [**SARIF viewer**](https://marketplace.visualstudio.com/items?itemName=MS-SarifVSCode.sarif-viewer).
Vous pouvez également utiliser l'extension [**VSCode**](https://marketplace.visualstudio.com/items?itemName=GitHub.vscode-codeql) pour obtenir les résultats dans VSCode. Vous devrez toujours créer une base de données manuellement, mais ensuite vous pourrez sélectionner n'importe quel fichier et cliquer sur `Clic droit` -> `CodeQL: Exécuter les requêtes dans les fichiers sélectionnés`
### [**Snyk**](https://snyk.io/product/snyk-code/)
Il existe une **version gratuite installable**.
#### Démarrage rapide
```bash
# 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 VSCode Snyk**](https://marketplace.visualstudio.com/items?itemName=snyk-security.snyk-vulnerability-scanner) pour obtenir des résultats à l'intérieur de VSCode.
### [Insider](https://github.com/insidersec/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
```bash
# 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**](https://deepsource.com/pricing)&#x20;
Gratuit pour les **dépôts publics**.
## NodeJS
* **`yarn`**
```bash
# Install
brew install yarn
# Run
cd /path/to/repo
yarn audit
npm audit
```
* **`pnpm`**
```bash
# Install
npm install -g pnpm
# Run
cd /path/to/repo
pnpm audit
```
* [**nodejsscan**](https://github.com/ajinabraham/nodejsscan)**:** Outil d'analyse statique de code de sécurité (SAST) pour les applications Node.js alimenté par [libsast](https://github.com/ajinabraham/libsast) et [semgrep](https://github.com/returntocorp/semgrep).
```bash
# Install & run
docker run -it -p 9090:9090 opensecurity/nodejsscan:latest
# Got to localhost:9090
# Upload a zip file with the code
```
* [**RetireJS**](https://github.com/RetireJS/retire.js)**:** 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.
```bash
# Install
npm install -g retire
# Run
cd /path/to/repo
retire --colors
```
## Electron
* [**electronegativity**](https://github.com/doyensec/electronegativity)**:** C'est un outil pour identifier les mauvaises configurations et les anti-patterns de sécurité dans les applications basées sur Electron.
## Python
* [**Bandit**](https://github.com/PyCQA/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 AST. Une fois que Bandit a terminé de scanner tous les fichiers, il génère un rapport.
```bash
# Install
pip3 install bandit
# Run
bandit -r <path to folder>
```
* [**safety**](https://github.com/pyupio/safety): Safety vérifie les dépendances Python à la recherche de vulnérabilités de sécurité connues et suggère les correctifs appropriés pour les vulnérabilités détectées. Safety peut être exécuté sur les machines des développeurs, dans les pipelines CI/CD et sur les systèmes de production.
```bash
# Install
pip install safety
# Run
safety check
```
* [~~**Pyt**~~](https://github.com/python-security/pyt): Non maintenu.
## .NET
```bash
# dnSpy
https://github.com/0xd4d/dnSpy
# .NET compilation
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe test.cs
```
## RUST
```bash
# Install
cargo install cargo-audit
# Run
cargo audit
#Update the Advisory Database
cargo audit fetch
```
## Java
### FindBugs
FindBugs est un outil d'analyse statique qui peut être utilisé pour rechercher des bogues dans le code Java. Il peut détecter un large éventail de problèmes de programmation, tels que les fuites de ressources, les erreurs de synchronisation, les erreurs de gestion de la mémoire, etc.
Pour exécuter FindBugs sur un projet Java, vous pouvez utiliser l'interface utilisateur graphique FindBugs ou l'intégrer dans votre processus de build en utilisant des plugins Maven ou Ant.
Pour lancer FindBugs en ligne de commande, vous pouvez utiliser la commande suivante :
```bash
findbugs -textui <chemin_vers_le_fichier_jar>
```
### PMD
PMD est un autre outil d'analyse statique pour le code Java. Il peut être utilisé pour rechercher des erreurs de codage, des pratiques de programmation douteuses, des performances inefficaces, etc.
Pour exécuter PMD sur un projet Java, vous pouvez utiliser l'interface utilisateur graphique PMD ou l'intégrer dans votre processus de build en utilisant des plugins Maven ou Ant.
Pour lancer PMD en ligne de commande, vous pouvez utiliser la commande suivante :
```bash
pmd -d <chemin_vers_le_dossier_contenant_le_code_source> -f text
```
```bash
# 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ézipper Jar | unzip -d \[répertoire de sortie] \[jar] |
| Créer Jar | jar -cmf META-INF/MANIFEST.MF \[jar de sortie] \* |
| Base64 SHA256 | sha256sum \[fichier] \| cut -d' ' -f1 \| xxd -r -p \| base64 |
| Supprimer Signature | rm META-INF/_.SF META-INF/_.RSA META-INF/\*.DSA |
| Supprimer du Jar | zip -d \[jar] \[fichier à supprimer] |
| Décompiler classe | procyon -o . \[chemin de la classe] |
| Décompiler Jar | procyon -jar \[jar] -o \[répertoire de sortie] |
| Compiler classe | javac \[chemin du fichier .java] |
## Go
```bash
https://github.com/securego/gosec
```
## PHP
[Psalm](https://phpmagazine.net/2018/12/find-errors-in-your-php-applications-with-psalm.html) et [PHPStan](https://phpmagazine.net/2020/09/phpstan-pro-edition-launched.html).
### Extensions Wordpress
[https://www.pluginvulnerabilities.com/plugin-security-checker/](https://www.pluginvulnerabilities.com/plugin-security-checker/)
## Solidity
* [https://www.npmjs.com/package/solium](https://www.npmjs.com/package/solium)
## JavaScript
### Découverte
1. Burp:
* Spider et découvrir le contenu
* Sitemap > filtre
* Sitemap > clic droit sur le domaine > Outils d'engagement > Trouver des scripts
2. [WaybackURLs](https://github.com/tomnomnom/waybackurls):
* `waybackurls <domain> |grep -i "\.js" |sort -u`
### Analyse statique
#### Désobfusquer/Embellez
* [https://prettier.io/playground/](https://prettier.io/playground/)
* [https://beautifier.io/](https://beautifier.io/)
#### Désembrouiller/Dépaqueter
**Remarque**: Il peut ne pas être possible de désembrouiller complètement.
1. Trouver et utiliser les fichiers .map:
* Si les fichiers .map sont exposés, ils peuvent être utilisés pour désembrouiller facilement.
* Couramment, foo.js.map correspond à foo.js. Recherchez-les manuellement.
* Utilisez [JS Miner](https://github.com/PortSwigger/js-miner) pour les rechercher.
* Assurez-vous qu'une analyse active est effectuée.
* Lisez '[Conseils/Notes](https://github.com/minamo7sen/burp-JS-Miner/wiki#tips--notes)'
* Si trouvés, utilisez [Maximize](https://www.npmjs.com/package/maximize) pour désembrouiller.
2. 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ésembrouillage et donner des résultats inexactes.
3. Utilisez console.log();
* Trouvez la valeur de retour à la fin et changez-la en `console.log(<packerReturnVariable>);` pour que le js désembrouillé soit affiché au lieu d'être exécuté.
* Ensuite, collez le js modifié (et toujours embrouillé) dans https://jsconsole.com/ pour voir le js désembrouillé affiché dans la console.
* Enfin, collez la sortie désembrouillé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
* https://www.youtube.com/watch?v=\_v8r\_t4v6hQ
* https://blog.nvisium.com/angular-for-pentesters-part-1
* https://blog.nvisium.com/angular-for-pentesters-part-2
Outils
* https://portswigger.net/burp/documentation/desktop/tools/dom-invader
#### Références Moins Utilisées
* https://cyberchef.org/
* https://olajs.com/javascript-prettifier
* https://jshint.com/
* https://github.com/jshint/jshint/
<details>
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Autres façons de soutenir HackTricks:
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
* Découvrez [**La famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** nous sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Partagez vos astuces de piratage en soumettant des PR aux** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>