# Przegląd kodu źródłowego / Narzędzia SAST
Dowiedz się, jak hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)! Inne sposoby wsparcia HackTricks: * Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)! * Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com) * Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family) * **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.** * **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
## Wskazówki i listy 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/) Dostępny jest **darmowy pakiet do przeglądu PR**. ### [**Semgrep**](https://github.com/returntocorp/semgrep) To jest **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 | | Experimental | 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 dla VSCode**](https://marketplace.visualstudio.com/items?itemName=Semgrep.semgrep), aby otrzymać wyniki wewnątrz VSCode. ### [**SonarQube**](https://www.sonarsource.com/products/sonarqube/downloads/) Dostępna jest bezpłatna wersja instalacyjna. #### 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= \ -Dsonar.sources=. \ -Dsonar.host.url=http://localhost:9000 \ -Dsonar.token= ``` {% endcode %} ### CodeQL Istnieje **darmowa wersja instalacyjna**, ale zgodnie z licencją można jej używać **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ć, jest **przygotowanie bazy danych** (utworzenie drzewa kodu), aby później można było na niej wykonywać zapytania. {% endhint %} * Możesz pozwolić codeql automatycznie zidentyfikować język repozytorium i utworzyć bazę danych {% code overflow="wrap" %} ```bash codeql database create --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 **zazwyczaj spowoduje błąd**, który mówi, że określono więcej niż jeden język (lub wykryto je automatycznie). **Sprawdź następujące opcje**, aby to naprawić! {% endhint %} * Możesz to zrobić **ręcznie wskazując** **repozytorium** 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 --language --source-root # 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ęzyka**, 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 --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 --db-cluster --source-root # 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" %} Nadszedł wreszcie czas na analizę kodu {% endhint %} Pamiętaj, że jeśli użyłeś kilku języków, **baza danych dla każdego języka** została utworzona w podanej ścieżce. {% code overflow="wrap" %} ```bash # Default analysis codeql database analyze --format= --output= # 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 \ --sarif-category= \ --sarif-add-baseline-file-info \ --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 ``` {% code overflow="wrap" %} #### Szybki start - Skryptowany {% endcode %} ```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 zwizualizować wyniki na stronie [**https://microsoft.github.io/sarif-web-component/**](https://microsoft.github.io/sarif-web-component/) lub za pomocą 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 Klik` -> `CodeQL: Uruchom zapytania w wybranych plikach` ### [**Snyk**](https://snyk.io/product/snyk-code/) Dostępna jest **darmowa wersja instalacyjna**. #### 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 dla VSCode**](https://marketplace.visualstudio.com/items?itemName=snyk-security.snyk-vulnerability-scanner), aby otrzymać wyniki wewnątrz VSCode. ### [Insider](https://github.com/insidersec/insider) Jest to **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 ``` ### [**DeepSource**](https://deepsource.com/pricing) Darmowe dla **repozytoriów publicznych**. ## 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)**:** Statyczne narzędzie skanujące kod źródłowy (SAST) dla aplikacji Node.js, oparte na [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 pomóc w wykrywaniu użycia wersji bibliotek JS znanymi podatnościami. ```bash # Install npm install -g retire # Run cd /path/to/repo retire --colors ``` ## Electron * [**electronegativity**](https://github.com/doyensec/electronegativity)**:** Jest to narzędzie służące do identyfikacji błędnych konfiguracji i antywzorców bezpieczeństwa w aplikacjach opartych na Electron. ## Python * [**Bandit**](https://github.com/PyCQA/bandit)**:** Bandit to narzędzie zaprojektowane do wykrywania powszechnych problemów związanych 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. Po zakończeniu skanowania wszystkich plików Bandit generuje raport. ```bash # Install pip3 install bandit # Run bandit -r ``` * [**safety**](https://github.com/pyupio/safety): Safety sprawdza zależności Pythona pod kątem znanych podatności bezpieczeństwa i sugeruje odpowiednie naprawy dla wykrytych podatności. Safety można uruchamiać na maszynach programistów, w potokach CI/CD oraz na systemach produkcyjnych. ```bash # Install pip install safety # Run safety check ``` * [~~**Pyt**~~](https://github.com/python-security/pyt): Nieaktualizowane. ## .NET ```bash # dnSpy https://github.com/0xd4d/dnSpy # .NET compilation C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe test.cs ``` ## RUST Rust is a systems programming language that focuses on safety, speed, and concurrency. It is designed to be memory safe and thread safe, making it a good choice for building reliable and efficient software. Rust's syntax is similar to C++, but it includes modern features such as pattern matching, type inference, and ownership semantics. ### Code Review Tools When performing a code review in Rust, there are several tools that can help identify potential vulnerabilities and improve code quality. Here are some commonly used code review tools for Rust: - **Clippy**: Clippy is a linter for Rust that provides helpful suggestions and warnings to improve code quality. It can catch common mistakes, enforce best practices, and identify potential bugs. - **Rustfmt**: Rustfmt is a tool for formatting Rust code according to the official Rust style guidelines. It helps maintain consistent code formatting across projects and makes code easier to read and understand. - **Cargo-audit**: Cargo-audit is a tool that checks Rust dependencies for known vulnerabilities. It scans the Cargo.lock file and compares it against a database of known vulnerabilities, providing a report of any insecure dependencies. - **Rust-analyzer**: Rust-analyzer is an integrated development environment (IDE) extension that provides code analysis and navigation features for Rust. It offers features such as code completion, documentation lookup, and refactoring support. - **Rustdoc**: Rustdoc is a tool for generating documentation from Rust source code. It can be used to automatically generate API documentation for libraries and projects, making it easier for developers to understand and use the code. These tools can be integrated into the development workflow to ensure code quality and security in Rust projects. By using these tools, developers can catch potential issues early on and improve the overall reliability and maintainability of their code. ```bash # Install cargo install cargo-audit # Run cargo audit #Update the Advisory Database cargo audit fetch ``` ## Java Java jest popularnym językiem programowania, który jest szeroko stosowany w tworzeniu aplikacji internetowych. Podczas przeglądania kodu źródłowego aplikacji Java istnieje kilka narzędzi, które mogą pomóc w identyfikacji potencjalnych luk w zabezpieczeniach. Poniżej przedstawiamy kilka popularnych narzędzi do przeglądu kodu Java: ### 1. FindBugs FindBugs jest narzędziem statycznego analizatora kodu, które wykrywa potencjalne błędy i problemy z wydajnością w kodzie Java. Może również pomóc w identyfikacji podatności związanych z bezpieczeństwem, takich jak nieprawidłowe zarządzanie pamięcią, niebezpieczne operacje na plikach i nieprawidłowe użycie kryptografii. ### 2. PMD PMD to kolejne narzędzie statycznego analizatora kodu, które może pomóc w identyfikacji potencjalnych problemów w kodzie Java. PMD sprawdza kod pod kątem zgodności z najlepszymi praktykami programistycznymi i wykrywa potencjalne błędy, takie jak nieprawidłowe użycie zmiennych, nieprawidłowe formatowanie kodu i niebezpieczne operacje na plikach. ### 3. Checkstyle Checkstyle jest narzędziem, które sprawdza kod Java pod kątem zgodności z określonymi regułami stylu kodowania. Może pomóc w utrzymaniu spójności i czytelności kodu, a także w identyfikacji potencjalnych problemów z bezpieczeństwem, takich jak nieprawidłowe użycie kryptografii i niebezpieczne operacje na plikach. ### 4. SonarQube SonarQube to platforma do kontroli jakości kodu, która może być używana do przeglądu kodu Java. SonarQube analizuje kod pod kątem potencjalnych błędów, problemów z wydajnością, zgodności z najlepszymi praktykami programistycznymi i zabezpieczeniami. Może również generować raporty i metryki dotyczące jakości kodu. ### 5. FindSecBugs FindSecBugs jest narzędziem specjalnie zaprojektowanym do wykrywania podatności związanych z bezpieczeństwem w kodzie Java. Wykorzystuje on statyczną analizę kodu, aby zidentyfikować potencjalne luki w zabezpieczeniach, takie jak nieprawidłowe uwierzytelnianie, nieprawidłowe zarządzanie sesją i niebezpieczne operacje na plikach. Przy przeglądzie kodu źródłowego aplikacji Java warto skorzystać z tych narzędzi, aby zidentyfikować potencjalne problemy z bezpieczeństwem i poprawić jakość kodu. ```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 \[katalog docelowy] \[jar] | | Utwórz Jar | jar -cmf META-INF/MANIFEST.MF \[jar docelowy] \* | | Base64 SHA256 | sha256sum \[plik] \| cut -d' ' -f1 \| xxd -r -p \| base64 | | Usuń podpis | rm META-INF/_.SF META-INF/_.RSA META-INF/\*.DSA | | Usuń z Jar | zip -d \[jar] \[plik do usunięcia] | | Dekompiluj klasę | procyon -o . \[ścieżka do klasy] | | Dekompiluj Jar | procyon -jar \[jar] -o \[katalog docelowy] | | Skompiluj klasę | javac \[ścieżka do pliku .java] | ## Przejdź do ```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 odkryj zawartość * Sitemap > filtr * Sitemap > kliknij prawym przyciskiem na domenę > Narzędzia zaangażowania > Znajdź skrypty 2. [WaybackURLs](https://github.com/tomnomnom/waybackurls): * `waybackurls |grep -i "\.js" |sort -u` ### Statyczna analiza #### Odminifikuj/Upiększ/Upiększ * [https://prettier.io/playground/](https://prettier.io/playground/) * [https://beautifier.io/](https://beautifier.io/) #### Deobfuskacja/Odpakowanie **Uwaga**: Może być niemożliwe pełne odblokowanie. 1. Znajdź i użyj plików .map: * Jeśli pliki .map są ujawnione, można je łatwo odblokować. * Najczęściej, foo.js.map mapuje na foo.js. Ręcznie je wyszukaj. * Użyj [JS Miner](https://github.com/PortSwigger/js-miner), aby je znaleźć. * Upewnij się, że przeprowadzono skanowanie aktywne. * Przeczytaj '[Wskazówki/Notatki](https://github.com/minamo7sen/burp-JS-Miner/wiki#tips--notes)' * Jeśli zostaną znalezione, użyj [Maximize](https://www.npmjs.com/package/maximize), aby je odblokować. 2. Bez plików .map, spróbuj JSnice: * Odwołania: http://jsnice.org/ & https://www.npmjs.com/package/jsnice * Wskazówki: * Jeśli korzystasz z jsnice.org, kliknij przycisk opcji obok przycisku "Nicify JavaScript" i odznacz "Infer types", aby zmniejszyć zanieczyszczenie kodu komentarzami. * Upewnij się, że nie zostawiasz pustych linii przed skryptem, ponieważ może to wpłynąć na proces odblokowywania i dawać nieprecyzyjne wyniki. 3. Użyj console.log(); * Znajdź wartość zwracaną na końcu i zmień ją na `console.log();`, aby zamiast wykonywania, wydrukować odblokowany js. * Następnie wklej zmodyfikowany (i nadal zaszyfrowany) js do https://jsconsole.com/, aby zobaczyć odblokowany js zapisany w konsoli. * Na koniec, wklej odblokowany wynik do https://prettier.io/playground/, aby upiększyć go do analizy. * **Uwaga**: Jeśli nadal widzisz spakowany (ale inny) js, może być rekurencyjnie spakowany. Powtórz proces. Odwołania * 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 Narzędzia * https://portswigger.net/burp/documentation/desktop/tools/dom-invader #### Mniej używane odwołania * https://cyberchef.org/ * https://olajs.com/javascript-prettifier * https://jshint.com/ * https://github.com/jshint/jshint/
Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)! Inne sposoby wsparcia HackTricks: * Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLAN SUBSKRYPCJI**](https://github.com/sponsors/carlospolop)! * Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com) * Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family) * **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.** * **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.