417 lines
22 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.

# Ανασκόπηση Πηγαίου Κώδικα / Εργαλεία 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=<project-name> \
-Dsonar.sources=. \
-Dsonar.host.url=http://localhost:9000 \
-Dsonar.token=<sonar_project_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 <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]
> Αυτό **συνήθως θα προκαλέσει ένα σφάλμα** που λέει ότι έχει καθοριστεί περισσότερη από μία γλώσσα (ή ανιχνεύθηκε αυτόματα). **Ελέγξτε τις επόμενες επιλογές** για να το διορθώσετε!
- Μπορείτε να το κάνετε αυτό **χειροκίνητα υποδεικνύοντας** το **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 <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
```
- Αν το repo σας χρησιμοποιεί **περισσότερες από 1 γλώσσα**, μπορείτε επίσης να δημιουργήσετε **1 DB ανά γλώσσα** υποδεικνύοντας κάθε γλώσσα.
```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/*
```
- Μπορείτε επίσης να επιτρέψετε στο `codeql` να **αναγνωρίσει όλες τις γλώσσες** για εσάς και να δημιουργήσει μια βάση δεδομένων ανά γλώσσα. Πρέπει να του δώσετε ένα **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/*
```
#### Γρήγορη Εκκίνηση - Ανάλυση του κώδικα
> [!TIP]
> Τώρα είναι επιτέλους η ώρα να αναλύσετε τον κώδικα
Θυμηθείτε ότι αν χρησιμοποιήσατε πολλές γλώσσες, **μια βάση δεδομένων ανά γλώσσα** θα είχε δημιουργηθεί στον δρόμο που καθορίσατε.
```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
```
#### Γρήγορη Εκκίνηση - Σενάριο
```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 <projectfolder>
```
### [**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 <path to folder>
```
- [**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 <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/)
- Δείτε μερικά από τα εργαλεία που αναφέρονται στο '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(<packerReturnVariable>);` ώστε ο αποσυμπιεσμένος 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}}