417 lines
17 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
{{#include ../../banners/hacktricks-training.md}}
## 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 |
| Eksperymentalne| Bash · C · C++ · Clojure · Dart · Dockerfile · Elixir · HTML · Julia · Jsonnet · Lisp · |
#### Szybki start
```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
```
Możesz również użyć [**semgrep VSCode Extension**](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
```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>
```
### CodeQL
Istnieje **darmowa wersja do zainstalowania**, ale zgodnie z licencją możesz **używać darmowej wersji codeQL tylko w projektach Open Source**.
#### Instalacja
```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
```
#### Szybki start - Przygotuj bazę danych
> [!TIP]
> Pierwszą rzeczą, którą musisz zrobić, to **przygotować bazę danych** (utworzyć drzewo kodu), aby później zapytania mogły być na niej uruchamiane.
- Możesz pozwolić codeql na automatyczne zidentyfikowanie języka repozytorium i utworzenie bazy danych.
```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
```
> [!CAUTION]
> To **zwykle spowoduje błąd** mówiący, że określono więcej niż jeden język (lub został automatycznie wykryty). **Sprawdź następne opcje**, aby to naprawić!
- 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))
```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
```
- Jeśli twoje repozytorium używa **więcej niż 1 języka**, możesz również stworzyć **1 bazę danych na język**, wskazując każdy język.
```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/*
```
- Możesz również pozwolić `codeql`, aby **zidentyfikował wszystkie języki** za Ciebie i stworzył bazę danych dla każdego języka. Musisz podać **GITHUB_TOKEN**.
```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/*
```
#### Szybki start - Analiza kodu
> [!TIP]
> Teraz w końcu nadszedł czas na analizę kodu
Pamiętaj, że jeśli użyłeś kilku języków, **baza danych na każdy język** zostanie utworzona w podanej przez Ciebie ścieżce.
```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
```
#### Szybki start - Skryptowany
```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
```
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)
Darmowe dla **publicznych repozytoriów**.
## NodeJS
- **`yarn`**
```bash
# 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`**
```bash
# Install
npm install -g pnpm
# Run
cd /path/to/repo
pnpm install
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 działania naprawcze 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): Nieutrzymywany.
## .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).
### Wtyczki 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
### Odkrywanie
1. Burp:
- Spider i odkrywanie treści
- 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`
### Analiza statyczna
#### 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 je znaleźć.
- 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/) i [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ć bałagan w kodzie z komentarzami.
- Upewnij się, że nie zostawiasz pustych linii przed skryptem, ponieważ może to wpłynąć na proces deobfuskacji i dać niedokładne wyniki.
3. Dla niektórych nowoczesnych 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 nowoczesnego frontend. 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.
#### Odnośniki
- [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)
#### Narzędzia
- [https://portswigger.net/burp/documentation/desktop/tools/dom-invader](https://portswigger.net/burp/documentation/desktop/tools/dom-invader)
#### Mniej używane odnośniki
- [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/)
{{#include ../../banners/hacktricks-training.md}}