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

19 KiB

Bronkode Oorsig / SAST Gereedskap

Leer AWS hak vanaf nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

Leiding en & Lys van gereedskap

Multi-Taal Gereedskap

Naxus - AI-Gents

Daar is 'n gratis pakket om PRs te oorsien.

Semgrep

Dit is 'n Open Source gereedskap.

Ondersteunde Tale

Kategorie Tale
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 ·

Vinnige Begin

{% code overflow="wrap" %}

# 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 %}

Jy kan ook die semgrep VSCode-uitbreiding gebruik om die bevindinge binne VSCode te kry.

SonarQube

Daar is 'n installeerbare gratis weergawe.

Vinnige Begin

{% code overflow="wrap" %}

# 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

Daar is 'n installeerbare gratis weergawe maar volgens die lisensie kan jy slegs die gratis CodeQL weergawe in Open Source projekte gebruik.

Installeer

{% code overflow="wrap" %}

# 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 %}

Vinnige Begin - Berei die databasis voor

{% hint style="success" %} Die eerste ding wat jy moet doen is om die databasis voor te berei (skep die kodeboom) sodat die navrae later daaroor uitgevoer kan word. {% endhint %}

  • Jy kan codeql toelaat om outomaties die taal van die bewaarplek te identifiseer en die databasis te skep

{% code overflow="wrap" %}

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" %} Dit sal gewoonlik 'n fout veroorsaak wat sê dat meer as een taal gespesifiseer was (of outomaties opgespoor is). Kyk na die volgende opsies om dit te reg te stel! {% endhint %}

  • Jy kan dit handmatig aandui deur die repo en die taal (lys van tale)

{% code overflow="wrap" %}

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 %}

  • As jou repo meer as 1 taal gebruik, kan jy ook 1 DB per taal skep wat elke taal aandui.

{% code overflow="wrap" %}

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 %}

  • Jy kan ook codeql toelaat om alle tale vir jou te identifiseer en 'n DB per taal te skep. Jy moet dit 'n GITHUB_TOKEN gee.

{% code overflow="wrap" %}

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/*

Vinnige Begin - Analiseer die kode

{% hint style="success" %} Nou is dit uiteindelik tyd om die kode te analiseer {% endhint %}

Onthou dat as jy verskeie tale gebruik het, 'n DB per taal sou geskep gewees het in die pad wat jy gespesifiseer het.

{% code overflow="wrap" %}

# 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

Vinnige Begin - Geskript

{% code overflow="wrap" %}

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 %}

Jy kan die bevindinge visualiseer op https://microsoft.github.io/sarif-web-component/ of deur die gebruik van die VSCode-uitbreiding SARIF viewer.

Jy kan ook die VSCode-uitbreiding gebruik om die bevindinge binne VSCode te kry. Jy sal steeds 'n databasis handmatig moet skep, maar daarna kan jy enige lêers kies en op Right Click -> CodeQL: Run Queries in Selected Files klik.

Snyk

Daar is 'n installeerbare gratis weergawe.

Vinnige Begin

# 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

Jy kan ook die snyk VSCode-uitbreiding gebruik om bevindinge binne VSCode te kry.

Insider

Dit is Oopbron, maar lyk ongeag.

Ondersteunde Tale

Java (Maven en Android), Kotlin (Android), Swift (iOS), .NET Volledige Raamwerk, C#, en Javascript (Node.js).

Vinnige Begin

# 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

Gratis vir openbare repos.

NodeJS

  • yarn
# Install
brew install yarn
# Run
cd /path/to/repo
yarn audit
npm audit
  • pnpm
# Install
npm install -g pnpm
# Run
cd /path/to/repo
pnpm audit
# Install & run
docker run -it -p 9090:9090 opensecurity/nodejsscan:latest
# Got to localhost:9090
# Upload a zip file with the code
  • RetireJS: Die doel van Retire.js is om jou te help om die gebruik van JS-biblioteekweergawes met bekende kwesbaarhede op te spoor.
# Install
npm install -g retire
# Run
cd /path/to/repo
retire --colors

Electron

  • electronegativity: Dit is 'n instrument om wanopsetlikhede en sekuriteitsantipatrone in Electron-gebaseerde toepassings te identifiseer.

Python

  • Bandit: Bandit is 'n instrument wat ontwerp is om algemene sekuriteitskwessies in Python-kode te vind. Om dit te doen, verwerk Bandit elke lêer, bou 'n AST daarvan, en hardloop toepaslike invoegtoepassings teen die AST-node. Sodra Bandit klaar is met die skandering van al die lêers, genereer dit 'n verslag.
# Install
pip3 install bandit

# Run
bandit -r <path to folder>
  • veiligheid: Safety toets Python afhanklikhede vir bekende sekuriteitskwessies en stel die regte regstellings vir opgespoorde kwessies voor. Safety kan op ontwikkelaar rekenaars, in CI/CD pyplyne en op produksie stelsels uitgevoer word.
# Install
pip install safety
# Run
safety check
  • Pyt: Nie onderhou nie.

.NET

# dnSpy
https://github.com/0xd4d/dnSpy

# .NET compilation
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe test.cs

ROES

Rust is 'n veilige, mededingende programmeertaal wat geskep is deur Mozilla. Dit is baie gewild vir sy sterkte en betroubaarheid.

# Install
cargo install cargo-audit

# Run
cargo audit

#Update the Advisory Database
cargo audit fetch

Java

FindBugs

FindBugs is 'n statiese bronanalise-instrument wat gebruik kan word om Java-bronkode te vind. Dit kan potensiële programmeerfoute, geheuelekasies en stileringsprobleme identifiseer.

PMD

PMD is 'n bronkode-analise-instrument wat gebruik kan word om potensiële programmeerprobleme in Java-bronkode te identifiseer. Dit kan help om bronkode te verbeter deur die identifisering van sleutelareas vir verbetering.

Checkstyle

Checkstyle is 'n raamwerk vir die implementering van statiese kode-analise om te verseker dat die Java-bronkode voldoen aan 'n spesifieke kodekonvensie. Dit kan help om konsistensie in die kodebasis te handhaaf en om potensiële programmeerfoute te verminder.

# 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
Taak Opdrag
Voer Jar uit java -jar [jar]
Ontpak Jar unzip -d [uitvoer gids] [jar]
Skep Jar jar -cmf META-INF/MANIFEST.MF [uitvoer jar] *
Base64 SHA256 sha256sum [lêer] | cut -d' ' -f1 | xxd -r -p | base64
Verwyder Ondertekening rm META-INF/.SF META-INF/.RSA META-INF/*.DSA
Verwyder van Jar zip -d [jar] [lêer om te verwyder]
Ontkompilieer klas procyon -o . [pad na klas]
Ontkompilieer Jar procyon -jar [jar] -o [uitvoer gids]
Kompilieer klas javac [pad na .java lêer]

Gaan

https://github.com/securego/gosec

PHP

Psalm en PHPStan.

Wordpress Inproppe

https://www.pluginvulnerabilities.com/plugin-security-checker/

Solidity

JavaScript

Ontdekking

  1. Burp:
  • Spider en ontdek inhoud
  • Sitemap > filter
  • Sitemap > klik met regterknoppie op domein > Betrokkenheidstools > Vind skripte
  1. WaybackURLs:
  • waybackurls <domein> |grep -i "\.js" |sort -u

Statische Analise

Ontminify/Verfraai

Deobfuscate/Unpack

Nota: Dit mag dalk nie moontlik wees om heeltemal te deobfuscate nie.

  1. Vind en gebruik .map-lêers:
  • As die .map-lêers blootgestel word, kan hulle gebruik word om maklik te deobfuscate.
  • Gewoonlik map foo.js.map na foo.js. Soek handmatig daarna.
  • Gebruik JS Miner om daarna te soek.
  • Maak seker dat 'n aktiewe skandering uitgevoer word.
  • Lees 'Wenke/Aantekeninge'
  • Indien gevind, gebruik Maximize om te deobfuscate.
  1. Sonder .map-lêers, probeer JSnice:
  • Verwysings: http://jsnice.org/ & https://www.npmjs.com/package/jsnice
  • Wenke:
  • As jy jsnice.org gebruik, klik op die opsies-knoppie langs die "Nicify JavaScript" knoppie, en skakel "Infer types" af om die kode nie met kommentaar te oorlaai nie.
  • Maak seker dat jy geen leë lyne voor die skripsie los nie, aangesien dit die deobfuscation-proses kan beïnvloed en onakkurate resultate kan gee.
  1. Vir 'n paar meer moderne alternatiewe vir JSNice, kan jy na die volgende kyk:

Wakaru is die Javascript-dekompiler vir moderne front-end. Dit bring die oorspronklike kode terug van 'n gebundelde en getranspileerde bron.

Hierdie gereedskap gebruik groot taalmodelle (soos ChatGPT & llama2) en ander gereedskappe om Javascript-kode te un-minify. Let daarop dat LLM's geen strukturele veranderinge aanbring nie - hulle verskaf net wenke om veranderlikes en funksies te hernoem. Die swaar ligging word deur Babel op AST-vlak gedoen om te verseker dat die kode 1-1-ekwivalent bly.

  1. Gebruik console.log();
  • Vind die terugvoerwaarde aan die einde en verander dit na console.log(<packerReturnVariable>); sodat die deobfuscated js afgedruk word in plaas van uitgevoer te word.
  • Plak dan die gewysigde (en steeds geobfuskeerde) js in https://jsconsole.com/ om die deobfuscated js gelog na die konsole te sien.
  • Plak uiteindelik die deobfuscated uitset in https://prettier.io/playground/ om dit te verfraai vir analise.
  • Nota: As jy steeds verpak (maar verskillende) js sien, kan dit herhaaldelik verpak wees. Herhaal die proses.

Verwysings

Gereedskappe

Minder Gebruikte Verwysings