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

477 lines
20 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Przegląd kodu źródłowego / Narzędzia SAST
{% hint style="success" %}
Ucz się i ćwicz Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Ucz się i ćwicz Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Wsparcie dla HackTricks</summary>
* Sprawdź [**plany subskrypcyjne**](https://github.com/sponsors/carlospolop)!
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Podziel się trikami hackingowymi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repozytoriów github.
</details>
{% endhint %}
## Wskazówki i lista narzędzi
* [**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)
## Narzędzia wielojęzyczne
### [Naxus - AI-Gents](https://www.naxusai.com/)
Jest **darmowy pakiet do przeglądania PR-ów**.
### [**Semgrep**](https://github.com/returntocorp/semgrep)
To **narzędzie open source**.
#### Obsługiwane języki
| Kategoria | Języki |
| --------------| --------------------------------------------------------------------------------------------------- |
| GA | C# · Go · Java · JavaScript · JSX · JSON · PHP · Python · Ruby · Scala · Terraform · TypeScript · TSX |
| Beta | Kotlin · Rust |
| Eksperymentalny | Bash · C · C++ · Clojure · Dart · Dockerfile · Elixir · HTML · Julia · Jsonnet · Lisp · |
#### Szybki start
{% 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 %}
Możesz również użyć [**rozszerzenia semgrep VSCode**](https://marketplace.visualstudio.com/items?itemName=Semgrep.semgrep), aby uzyskać wyniki wewnątrz VSCode.
### [**SonarQube**](https://www.sonarsource.com/products/sonarqube/downloads/)
Istnieje instalowalna **darmowa wersja**.
#### Szybki start
{% 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
Istnieje **darmowa wersja do zainstalowania**, ale zgodnie z licencją możesz **używać darmowej wersji codeQL tylko w projektach Open Source**.
#### Instalacja
{% 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 %}
#### Szybki start - Przygotuj bazę danych
{% hint style="success" %}
Pierwszą rzeczą, którą musisz zrobić, to **przygotować bazę danych** (utworzyć drzewo kodu), aby później zapytania mogły być na niej uruchamiane.
{% endhint %}
* Możesz pozwolić codeql na automatyczne zidentyfikowanie języka repozytorium i utworzenie bazy danych
{% 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" %}
To **zwykle spowoduje błąd**, mówiący, że określono więcej niż jeden język (lub automatycznie wykryto). **Sprawdź następne opcje**, aby to naprawić!
{% endhint %}
* Możesz to zrobić **ręcznie wskazując** **repo** i **język** ([lista języków](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 %}
* Jeśli twoje repozytorium używa **więcej niż 1 język**, możesz również utworzyć **1 bazę danych na język**, wskazując każdy język.
{% 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 %}
* Możesz również pozwolić `codeql` na **identyfikację wszystkich języków** za Ciebie i utworzenie bazy danych dla każdego języka. Musisz podać **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 %}
#### Szybki start - Analiza kodu
{% hint style="success" %}
Teraz w końcu nadszedł czas na analizę kodu
{% endhint %}
Pamiętaj, że jeśli użyłeś kilku języków, **baza danych na każdy język** zostanie utworzona w ścieżce, którą określiłeś.
{% 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 %}
#### Szybki start - Skryptowany
{% 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 %}
Możesz wizualizować wyniki w [**https://microsoft.github.io/sarif-web-component/**](https://microsoft.github.io/sarif-web-component/) lub używając rozszerzenia VSCode [**SARIF viewer**](https://marketplace.visualstudio.com/items?itemName=MS-SarifVSCode.sarif-viewer).
Możesz również użyć [**rozszerzenia VSCode**](https://marketplace.visualstudio.com/items?itemName=GitHub.vscode-codeql), aby uzyskać wyniki wewnątrz VSCode. Nadal będziesz musiał ręcznie utworzyć bazę danych, ale potem możesz wybrać dowolne pliki i kliknąć `Prawy przycisk myszy` -> `CodeQL: Uruchom zapytania w wybranych plikach`
### [**Snyk**](https://snyk.io/product/snyk-code/)
Istnieje **darmowa wersja do zainstalowania**.
#### Szybki start
```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
```
Możesz również użyć [**rozszerzenia snyk VSCode**](https://marketplace.visualstudio.com/items?itemName=snyk-security.snyk-vulnerability-scanner), aby uzyskać wyniki wewnątrz VSCode.
### [Insider](https://github.com/insidersec/insider)
Jest **Open Source**, ale wygląda na **nieutrzymywane**.
#### Obsługiwane języki
Java (Maven i Android), Kotlin (Android), Swift (iOS), .NET Full Framework, C# i Javascript (Node.js).
#### Szybki start
```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;
Darmowe dla **publicznych repozytoriów**.
## 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)**:** Statyczny skaner bezpieczeństwa kodu (SAST) dla aplikacji Node.js zasilany przez [libsast](https://github.com/ajinabraham/libsast) i [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)**:** Celem Retire.js jest pomoc w wykrywaniu użycia wersji bibliotek JS z znanymi lukami.
```bash
# Install
npm install -g retire
# Run
cd /path/to/repo
retire --colors
```
## Electron
* [**electronegativity**](https://github.com/doyensec/electronegativity)**:** To narzędzie do identyfikacji błędnych konfiguracji i wzorców antybezpieczeństwa w aplikacjach opartych na Electronie.
## Python
* [**Bandit**](https://github.com/PyCQA/bandit)**:** Bandit to narzędzie zaprojektowane do znajdowania powszechnych problemów z bezpieczeństwem w kodzie Pythona. Aby to zrobić, Bandit przetwarza każdy plik, buduje z niego AST i uruchamia odpowiednie wtyczki na węzłach AST. Gdy Bandit zakończy skanowanie wszystkich plików, generuje raport.
```bash
# Install
pip3 install bandit
# Run
bandit -r <path to folder>
```
* [**safety**](https://github.com/pyupio/safety): Safety sprawdza zależności Pythona pod kątem znanych luk w zabezpieczeniach i sugeruje odpowiednie rozwiązania dla wykrytych luk. Safety można uruchomić na maszynach deweloperów, w pipeline'ach CI/CD oraz na systemach produkcyjnych.
```bash
# Install
pip install safety
# Run
safety check
```
* [~~**Pyt**~~](https://github.com/python-security/pyt): Nieutrzymywane.
## .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
```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
```
| Zadanie | Komenda |
| --------------- | -------------------------------------------------------- |
| Wykonaj Jar | java -jar \[jar] |
| Rozpakuj Jar | unzip -d \[output directory] \[jar] |
| Utwórz Jar | jar -cmf META-INF/MANIFEST.MF \[output jar] \* |
| Base64 SHA256 | sha256sum \[file] \| cut -d' ' -f1 \| xxd -r -p \| base64 |
| Usuń podpis | rm META-INF/_.SF META-INF/_.RSA META-INF/\*.DSA |
| Usuń z Jara | zip -d \[jar] \[file to remove] |
| Dekompiluj klasę| procyon -o . \[path to class] |
| Dekompiluj Jar | procyon -jar \[jar] -o \[output directory] |
| Skompiluj klasę | javac \[path to .java file] |
## Idź
```bash
https://github.com/securego/gosec
```
## PHP
[Psalm](https://phpmagazine.net/2018/12/find-errors-in-your-php-applications-with-psalm.html) i [PHPStan](https://phpmagazine.net/2020/09/phpstan-pro-edition-launched.html).
### Wordpress Plugins
[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
### Discovery
1. Burp:
* Spider i odkryj zawartość
* Sitemap > filtr
* Sitemap > kliknij prawym przyciskiem na domenę > Narzędzia zaangażowania > Znajdź skrypty
2. [WaybackURLs](https://github.com/tomnomnom/waybackurls):
* `waybackurls <domain> |grep -i "\.js" |sort -u`
### Static Analysis
#### Unminimize/Beautify/Prettify
* [https://prettier.io/playground/](https://prettier.io/playground/)
* [https://beautifier.io/](https://beautifier.io/)
* Zobacz niektóre z narzędzi wymienionych w 'Deobfuscate/Unpack' poniżej.
#### Deobfuscate/Unpack
**Uwaga**: Może nie być możliwe pełne deobfuskowanie.
1. Znajdź i użyj plików .map:
* Jeśli pliki .map są dostępne, można je wykorzystać do łatwego deobfuskowania.
* Zwykle foo.js.map mapuje do foo.js. Ręcznie ich szukaj.
* Użyj [JS Miner](https://github.com/PortSwigger/js-miner), aby ich szukać.
* Upewnij się, że przeprowadzono aktywne skanowanie.
* Przeczytaj '[Tips/Notes](https://github.com/minamo7sen/burp-JS-Miner/wiki#tips--notes)'
* Jeśli znajdziesz, użyj [Maximize](https://www.npmjs.com/package/maximize), aby deobfuskować.
2. Bez plików .map, spróbuj JSnice:
* Odnośniki: [http://jsnice.org/](http://jsnice.org/) & [https://www.npmjs.com/package/jsnice](https://www.npmjs.com/package/jsnice)
* Wskazówki:
* Jeśli używasz jsnice.org, kliknij przycisk opcji obok przycisku "Nicify JavaScript" i odznacz "Infer types", aby zredukować zaśmiecanie kodu komentarzami.
* Upewnij się, że nie zostawiasz pustych linii przed skryptem, ponieważ może to wpłynąć na proces deobfuskacji i dać niedokładne wyniki.
4. Dla niektórych nowocześniejszych alternatyw dla JSNice, możesz spojrzeć na następujące:
* [https://github.com/pionxzh/wakaru](https://github.com/pionxzh/wakaru)
* > Javascript decompiler, unpacker i unminify toolkit
> Wakaru to dekompilator Javascript dla nowoczesnych frontendów. Przywraca oryginalny kod z zbundlowanego i transpilego źródła.
* [https://github.com/j4k0xb/webcrack](https://github.com/j4k0xb/webcrack)
* > Deobfuscate obfuscator.io, unminify i unpack bundled javascript
* [https://github.com/jehna/humanify](https://github.com/jehna/humanify)
* > Un-minify Javascript code using ChatGPT
> To narzędzie wykorzystuje duże modele językowe (jak ChatGPT i llama2) oraz inne narzędzia do un-minify Javascript code. Zauważ, że LLM nie dokonują żadnych zmian strukturalnych tylko dostarczają wskazówki do zmiany nazw zmiennych i funkcji. Ciężka praca wykonywana jest przez Babel na poziomie AST, aby zapewnić, że kod pozostaje 1-1 równoważny.
* [https://thejunkland.com/blog/using-llms-to-reverse-javascript-minification.html](https://thejunkland.com/blog/using-llms-to-reverse-javascript-minification.html)
* > Używanie LLM do odwracania minifikacji nazw zmiennych JavaScript
3. Użyj `console.log()`;
* Znajdź wartość zwracaną na końcu i zmień ją na `console.log(<packerReturnVariable>);`, aby deobfuskowany js był drukowany zamiast wykonywany.
* Następnie wklej zmodyfikowany (i nadal obfuskowany) js do [https://jsconsole.com/](https://jsconsole.com/), aby zobaczyć deobfuskowany js zalogowany w konsoli.
* Na koniec wklej deobfuskowany wynik do [https://prettier.io/playground/](https://prettier.io/playground/), aby go upiększyć do analizy.
* **Uwaga**: Jeśli nadal widzisz spakowany (ale inny) js, może być rekurencyjnie spakowany. Powtórz proces.
#### References
* [YouTube: DAST - Javascript Dynamic Analysis](https://www.youtube.com/watch?v=_v8r_t4v6hQ)
* [https://blog.nvisium.com/angular-for-pentesters-part-1](https://web.archive.org/web/20221226054137/https://blog.nvisium.com/angular-for-pentesters-part-1)
* [https://blog.nvisium.com/angular-for-pentesters-part-2](https://web.archive.org/web/20230204012439/https://blog.nvisium.com/angular-for-pentesters-part-2)
* [devalias](https://twitter.com/_devalias)'s [GitHub Gists](https://gist.github.com/0xdevalias):
* [Deobfuscating / Unminifying Obfuscated Web App Code](https://gist.github.com/0xdevalias/d8b743efb82c0e9406fc69da0d6c6581#deobfuscating--unminifying-obfuscated-web-app-code)
* [Reverse Engineering Webpack Apps](https://gist.github.com/0xdevalias/8c621c5d09d780b1d321bfdb86d67cdd#reverse-engineering-webpack-apps)
* [etc](https://gist.github.com/search?q=user:0xdevalias+javascript)
#### Tools
* [https://portswigger.net/burp/documentation/desktop/tools/dom-invader](https://portswigger.net/burp/documentation/desktop/tools/dom-invader)
#### Less Used References
* [https://cyberchef.org/](https://cyberchef.org/)
* [https://olajs.com/javascript-prettifier](https://olajs.com/javascript-prettifier)
* [https://jshint.com/](https://jshint.com/)
* [https://github.com/jshint/jshint/](https://github.com/jshint/jshint/)
{% hint style="success" %}
Ucz się i ćwicz Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Ucz się i ćwicz Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Wsparcie HackTricks</summary>
* Sprawdź [**plany subskrypcyjne**](https://github.com/sponsors/carlospolop)!
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegram**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Podziel się trikami hackingowymi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repozytoriów github.
</details>
{% endhint %}