# Ανασκόπηση Πηγαίου Κώδικα / Εργαλεία SAST {{#include ../../banners/hacktricks-training.md}} ## Κατευθύνσεις και Λίστες Εργαλείων - [**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) ## Πολυγλωσσικά Εργαλεία ### [Naxus - AI-Gents](https://www.naxusai.com/) Υπάρχει ένα **δωρεάν πακέτο για ανασκόπηση PRs**. ### [**Semgrep**](https://github.com/returntocorp/semgrep) Είναι ένα **εργαλείο Ανοιχτού Κώδικα**. #### Υποστηριζόμενες Γλώσσες | Κατηγορία | Γλώσσες | | ------------ | ----------------------------------------------------------------------------------------------------- | | GA | C# · Go · Java · JavaScript · JSX · JSON · PHP · Python · Ruby · Scala · Terraform · TypeScript · TSX | | Beta | Kotlin · Rust | | Πειραματική | Bash · C · C++ · Clojure · Dart · Dockerfile · Elixir · HTML · Julia · Jsonnet · Lisp · | #### Γρήγορη Έναρξη ```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 ``` Μπορείτε επίσης να χρησιμοποιήσετε την [**επέκταση semgrep VSCode**](https://marketplace.visualstudio.com/items?itemName=Semgrep.semgrep) για να αποκτήσετε τα ευρήματα μέσα στο VSCode. ### [**SonarQube**](https://www.sonarsource.com/products/sonarqube/downloads/) Υπάρχει μια εγκαταστάσιμη **δωρεάν έκδοση**. #### Γρήγορη Εκκίνηση ```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= ``` ### CodeQL Υπάρχει μια **εγκαταστάσιμη δωρεάν έκδοση** αλλά σύμφωνα με την άδεια μπορείτε να **χρησιμοποιείτε μόνο τη δωρεάν έκδοση του codeQL σε έργα Ανοιχτού Κώδικα**. #### Εγκατάσταση ```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 ``` #### Γρήγορη Εκκίνηση - Προετοιμάστε τη βάση δεδομένων > [!TIP] > Το πρώτο πράγμα που πρέπει να κάνετε είναι να **προετοιμάσετε τη βάση δεδομένων** (δημιουργήστε το δέντρο κώδικα) ώστε αργότερα οι ερωτήσεις να εκτελούνται πάνω σε αυτή. - Μπορείτε να επιτρέψετε στο codeql να αναγνωρίσει αυτόματα τη γλώσσα του repo και να δημιουργήσει τη βάση δεδομένων ```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 ``` > [!CAUTION] > Αυτό **συνήθως θα προκαλέσει ένα σφάλμα** που λέει ότι έχει καθοριστεί περισσότερη από μία γλώσσα (ή ανιχνεύθηκε αυτόματα). **Ελέγξτε τις επόμενες επιλογές** για να το διορθώσετε! - Μπορείτε να το κάνετε αυτό **χειροκίνητα υποδεικνύοντας** το **repo** και τη **γλώσσα** ([λίστα γλωσσών](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 --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 ``` - Αν το repo σας χρησιμοποιεί **περισσότερες από 1 γλώσσα**, μπορείτε επίσης να δημιουργήσετε **1 DB ανά γλώσσα** υποδεικνύοντας κάθε γλώσσα. ```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/* ``` - Μπορείτε επίσης να επιτρέψετε στο `codeql` να **αναγνωρίσει όλες τις γλώσσες** για εσάς και να δημιουργήσει μια βάση δεδομένων ανά γλώσσα. Πρέπει να του δώσετε ένα **GITHUB_TOKEN**. ```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/* ``` #### Γρήγορη Εκκίνηση - Ανάλυση του κώδικα > [!TIP] > Τώρα είναι επιτέλους η ώρα να αναλύσετε τον κώδικα Θυμηθείτε ότι αν χρησιμοποιήσατε πολλές γλώσσες, **μια βάση δεδομένων ανά γλώσσα** θα είχε δημιουργηθεί στον δρόμο που καθορίσατε. ```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 ``` #### Γρήγορη Εκκίνηση - Σενάριο ```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 ``` Μπορείτε να οπτικοποιήσετε τα ευρήματα στο [**https://microsoft.github.io/sarif-web-component/**](https://microsoft.github.io/sarif-web-component/) ή χρησιμοποιώντας την επέκταση VSCode [**SARIF viewer**](https://marketplace.visualstudio.com/items?itemName=MS-SarifVSCode.sarif-viewer). Μπορείτε επίσης να χρησιμοποιήσετε την [**επέκταση VSCode**](https://marketplace.visualstudio.com/items?itemName=GitHub.vscode-codeql) για να αποκτήσετε τα ευρήματα μέσα στο VSCode. Θα χρειαστεί να δημιουργήσετε μια βάση δεδομένων χειροκίνητα, αλλά στη συνέχεια μπορείτε να επιλέξετε οποιαδήποτε αρχεία και να κάνετε κλικ στο `Δεξί Κλικ` -> `CodeQL: Run Queries in Selected Files` ### [**Snyk**](https://snyk.io/product/snyk-code/) Υπάρχει μια **εγκαταστάσιμη δωρεάν έκδοση**. #### Γρήγορη Εκκίνηση ```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 ``` Μπορείτε επίσης να χρησιμοποιήσετε την [**snyk VSCode Extension**](https://marketplace.visualstudio.com/items?itemName=snyk-security.snyk-vulnerability-scanner) για να αποκτήσετε ευρήματα μέσα στο VSCode. ### [Insider](https://github.com/insidersec/insider) Είναι **Ανοιχτού Κώδικα**, αλλά φαίνεται **μη συντηρούμενο**. #### Υποστηριζόμενες Γλώσσες Java (Maven και Android), Kotlin (Android), Swift (iOS), .NET Full Framework, C#, και Javascript (Node.js). #### Γρήγορη Εκκίνηση ```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) Δωρεάν για **δημόσια αποθετήρια**. ## 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)**:** Στατικός σαρωτής ασφαλείας κώδικα (SAST) για εφαρμογές Node.js που υποστηρίζεται από [libsast](https://github.com/ajinabraham/libsast) και [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)**:** Ο στόχος του Retire.js είναι να σας βοηθήσει να ανιχνεύσετε τη χρήση εκδόσεων βιβλιοθηκών JS με γνωστές ευπάθειες. ```bash # Install npm install -g retire # Run cd /path/to/repo retire --colors ``` ## Electron - [**electronegativity**](https://github.com/doyensec/electronegativity)**:** Είναι ένα εργαλείο για την αναγνώριση κακών ρυθμίσεων και προτύπων ασφαλείας σε εφαρμογές που βασίζονται σε Electron. ## Python - [**Bandit**](https://github.com/PyCQA/bandit)**:** Ο Bandit είναι ένα εργαλείο σχεδιασμένο για να βρίσκει κοινά ζητήματα ασφαλείας στον κώδικα Python. Για να το κάνει αυτό, ο Bandit επεξεργάζεται κάθε αρχείο, δημιουργεί ένα AST από αυτό και εκτελεί κατάλληλα plugins στους κόμβους του AST. Μόλις ο Bandit ολοκληρώσει τη σάρωση όλων των αρχείων, δημιουργεί μια αναφορά. ```bash # Install pip3 install bandit # Run bandit -r ``` - [**safety**](https://github.com/pyupio/safety): Το Safety ελέγχει τις εξαρτήσεις Python για γνωστές ευπάθειες ασφαλείας και προτείνει τις κατάλληλες διορθώσεις για τις ανιχνευθείσες ευπάθειες. Το Safety μπορεί να εκτελείται σε μηχανές προγραμματιστών, σε CI/CD pipelines και σε παραγωγικά συστήματα. ```bash # Install pip install safety # Run safety check ``` - [~~**Pyt**~~](https://github.com/python-security/pyt): Μη συντηρούμενο. ## .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 ``` ## Τζάβα ```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 ``` | Task | Command | | --------------- | --------------------------------------------------------- | | Execute Jar | java -jar \[jar] | | Unzip Jar | unzip -d \[output directory] \[jar] | | Create Jar | jar -cmf META-INF/MANIFEST.MF \[output jar] \* | | Base64 SHA256 | sha256sum \[file] \| cut -d' ' -f1 \| xxd -r -p \| base64 | | Remove Signing | rm META-INF/_.SF META-INF/_.RSA META-INF/\*.DSA | | Delete from Jar | zip -d \[jar] \[file to remove] | | Decompile class | procyon -o . \[path to class] | | Decompile Jar | procyon -jar \[jar] -o \[output directory] | | Compile class | javac \[path to .java file] | ## Πηγαίνετε ```bash https://github.com/securego/gosec ``` ## PHP [Psalm](https://phpmagazine.net/2018/12/find-errors-in-your-php-applications-with-psalm.html) και [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 και ανακάλυψη περιεχομένου - Sitemap > φίλτρο - Sitemap > δεξί κλικ στο domain > Engagement tools > Βρείτε scripts 2. [WaybackURLs](https://github.com/tomnomnom/waybackurls): - `waybackurls |grep -i "\.js" |sort -u` ### Static Analysis #### Unminimize/Beautify/Prettify - [https://prettier.io/playground/](https://prettier.io/playground/) - [https://beautifier.io/](https://beautifier.io/) - Δείτε μερικά από τα εργαλεία που αναφέρονται στο 'Deobfuscate/Unpack' παρακάτω επίσης. #### Deobfuscate/Unpack **Σημείωση**: Ίσως να μην είναι δυνατόν να γίνει πλήρης αποσυμπίεση. 1. Βρείτε και χρησιμοποιήστε αρχεία .map: - Αν τα αρχεία .map είναι εκτεθειμένα, μπορούν να χρησιμοποιηθούν για εύκολη αποσυμπίεση. - Συνήθως, το foo.js.map αντιστοιχεί στο foo.js. Αναζητήστε τα χειροκίνητα. - Χρησιμοποιήστε [JS Miner](https://github.com/PortSwigger/js-miner) για να τα αναζητήσετε. - Βεβαιωθείτε ότι διεξάγεται ενεργή σάρωση. - Διαβάστε '[Tips/Notes](https://github.com/minamo7sen/burp-JS-Miner/wiki#tips--notes)' - Αν βρεθούν, χρησιμοποιήστε [Maximize](https://www.npmjs.com/package/maximize) για να αποσυμπιέσετε. 2. Χωρίς αρχεία .map, δοκιμάστε το JSnice: - Αναφορές: [http://jsnice.org/](http://jsnice.org/) & [https://www.npmjs.com/package/jsnice](https://www.npmjs.com/package/jsnice) - Συμβουλές: - Αν χρησιμοποιείτε jsnice.org, κάντε κλικ στο κουμπί επιλογών δίπλα στο κουμπί "Nicify JavaScript" και αποεπιλέξτε "Infer types" για να μειώσετε την ακαταστασία στον κώδικα με σχόλια. - Βεβαιωθείτε ότι δεν αφήνετε κενές γραμμές πριν από το script, καθώς μπορεί να επηρεάσει τη διαδικασία αποσυμπίεσης και να δώσει ανακριβή αποτελέσματα. 3. Για μερικές πιο σύγχρονες εναλλακτικές στο JSNice, μπορείτε να δείτε τα εξής: - [https://github.com/pionxzh/wakaru](https://github.com/pionxzh/wakaru) - > Javascript decompiler, unpacker και unminify toolkit Wakaru είναι ο Javascript decompiler για σύγχρονα frontend. Επαναφέρει τον αρχικό κώδικα από μια συσκευασμένη και μεταγλωττισμένη πηγή. - [https://github.com/j4k0xb/webcrack](https://github.com/j4k0xb/webcrack) - > Deobfuscate obfuscator.io, unminify και unpack bundled javascript - [https://github.com/jehna/humanify](https://github.com/jehna/humanify) - > Un-minify Javascript code χρησιμοποιώντας ChatGPT Αυτό το εργαλείο χρησιμοποιεί μεγάλα γλωσσικά μοντέλα (όπως ChatGPT & llama2) και άλλα εργαλεία για να αποσυμπιέσει τον κώδικα Javascript. Σημειώστε ότι τα LLMs δεν εκτελούν καμία δομική αλλαγή – παρέχουν μόνο υποδείξεις για την μετονομασία μεταβλητών και συναρτήσεων. Η βαριά εργασία γίνεται από το Babel σε επίπεδο AST για να διασφαλιστεί ότι ο κώδικας παραμένει 1-1 ισοδύναμος. - [https://thejunkland.com/blog/using-llms-to-reverse-javascript-minification.html](https://thejunkland.com/blog/using-llms-to-reverse-javascript-minification.html) - > Χρησιμοποιώντας LLMs για να αντιστρέψετε την ελαχιστοποίηση ονομάτων μεταβλητών Javascript 3. Χρησιμοποιήστε `console.log()`; - Βρείτε την τιμή επιστροφής στο τέλος και αλλάξτε την σε `console.log();` ώστε ο αποσυμπιεσμένος js να εκτυπώνεται αντί να εκτελείται. - Στη συνέχεια, επικολλήστε τον τροποποιημένο (και ακόμα αποσυμπιεσμένο) js στο [https://jsconsole.com/](https://jsconsole.com/) για να δείτε τον αποσυμπιεσμένο js να καταγράφεται στην κονσόλα. - Τέλος, επικολλήστε την αποσυμπιεσμένη έξοδο στο [https://prettier.io/playground/](https://prettier.io/playground/) για να την ομορφύνετε για ανάλυση. - **Σημείωση**: Αν εξακολουθείτε να βλέπετε συσκευασμένο (αλλά διαφορετικό) js, μπορεί να είναι αναδρομικά συσκευασμένο. Επαναλάβετε τη διαδικασία. #### 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/) {{#include ../../banners/hacktricks-training.md}}