20 KiB
소스 코드 검토 / SAST 도구
{% hint style="success" %}
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 Discord 그룹 또는 텔레그램 그룹에 참여하거나 Twitter 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 팁을 공유하세요.
가이드 및 도구 목록
- https://owasp.org/www-community/Source_Code_Analysis_Tools
- https://github.com/analysis-tools-dev/static-analysis
다국어 도구
Naxus - AI-Gents
PR 검토를 위한 무료 패키지가 있습니다.
Semgrep
오픈 소스 도구입니다.
지원 언어
카테고리 | 언어 |
---|---|
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 · |
빠른 시작
{% 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 %}
또한 semgrep VSCode Extension을 사용하여 VSCode 내에서 결과를 확인할 수 있습니다.
SonarQube
설치 가능한 무료 버전이 있습니다.
빠른 시작
{% 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
설치 가능한 무료 버전이 있지만 라이센스에 따르면 오픈 소스 프로젝트에서만 무료 codeQL 버전을 사용할 수 있습니다.
설치
{% 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 %}
빠른 시작 - 데이터베이스 준비
{% hint style="success" %} 가장 먼저 해야 할 일은 데이터베이스를 준비하는 것 (코드 트리 생성)으로, 이후 쿼리가 이 위에서 실행됩니다. {% endhint %}
- codeql이 리포의 언어를 자동으로 식별하고 데이터베이스를 생성하도록 허용할 수 있습니다.
{% 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" %} 이 는 일반적으로 오류를 발생시킵니다. 여러 언어가 지정되었다고 (또는 자동으로 감지되었다고) 말합니다. 다음 옵션을 확인하여 이를 수정하세요! {% endhint %}
- 당신은 수동으로 repo와 언어를 지정할 수 있습니다 (언어 목록)
{% 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 %}
- 만약 당신의 레포가 1개 이상의 언어를 사용하고 있다면, 각 언어를 나타내는 언어별 1개의 DB를 생성할 수도 있습니다.
{% 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 %}
codeql
이 모든 언어를 식별하고 언어별로 DB를 생성하도록 허용할 수 있습니다. GITHUB_TOKEN을 제공해야 합니다.
{% 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/*
{% endcode %}
빠른 시작 - 코드 분석
{% hint style="success" %} 이제 드디어 코드를 분석할 시간입니다. {% endhint %}
여러 언어를 사용했다면, 언어별 DB가 지정한 경로에 생성되었음을 기억하세요.
{% 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
빠른 시작 - 스크립트 기반
{% 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 %}
발견된 내용을 https://microsoft.github.io/sarif-web-component/에서 시각화하거나 VSCode 확장 프로그램 SARIF viewer를 사용하여 시각화할 수 있습니다.
또한 VSCode 확장 프로그램을 사용하여 VSCode 내에서 발견된 내용을 확인할 수 있습니다. 데이터베이스를 수동으로 생성해야 하지만, 이후에는 파일을 선택하고 Right Click
-> CodeQL: Run Queries in Selected Files
를 클릭할 수 있습니다.
Snyk
설치 가능한 무료 버전이 있습니다.
빠른 시작
# 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
You can also use the snyk VSCode Extension to get findings inside VSCode.
Insider
It's Open Source, but looks unmaintained.
Supported Languages
Java (Maven 및 Android), Kotlin (Android), Swift (iOS), .NET Full Framework, C#, 및 Javascript (Node.js).
Quick Start
# 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
공개 저장소에 대해 무료입니다.
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
- nodejsscan: Node.js 애플리케이션을 위한 정적 보안 코드 스캐너(SAST)로 libsast와 semgrep로 구동됩니다.
# Install & run
docker run -it -p 9090:9090 opensecurity/nodejsscan:latest
# Got to localhost:9090
# Upload a zip file with the code
- RetireJS: Retire.js의 목표는 알려진 취약점이 있는 JS 라이브러리 버전의 사용을 감지하는 데 도움을 주는 것입니다.
# Install
npm install -g retire
# Run
cd /path/to/repo
retire --colors
Electron
- electronegativity: Electron 기반 애플리케이션의 잘못된 구성 및 보안 안티 패턴을 식별하는 도구입니다.
Python
- Bandit: Bandit는 Python 코드에서 일반적인 보안 문제를 찾기 위해 설계된 도구입니다. 이를 위해 Bandit는 각 파일을 처리하고, 그로부터 AST를 구축하며, AST 노드에 대해 적절한 플러그인을 실행합니다. Bandit가 모든 파일 스캔을 완료하면 보고서를 생성합니다.
# Install
pip3 install bandit
# Run
bandit -r <path to folder>
- safety: Safety는 알려진 보안 취약점에 대해 Python 종속성을 검사하고 발견된 취약점에 대한 적절한 수정 사항을 제안합니다. Safety는 개발자 머신, CI/CD 파이프라인 및 프로덕션 시스템에서 실행할 수 있습니다.
# Install
pip install safety
# Run
safety check
Pyt: 유지 관리되지 않음.
.NET
# dnSpy
https://github.com/0xd4d/dnSpy
# .NET compilation
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe test.cs
RUST
# Install
cargo install cargo-audit
# Run
cargo audit
#Update the Advisory Database
cargo audit fetch
자바
# 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
작업 | 명령어 |
---|---|
Jar 실행 | java -jar [jar] |
Jar 압축 해제 | unzip -d [output directory] [jar] |
Jar 생성 | jar -cmf META-INF/MANIFEST.MF [output jar] * |
Base64 SHA256 | sha256sum [file] | cut -d' ' -f1 | xxd -r -p | base64 |
서명 제거 | rm META-INF/.SF META-INF/.RSA META-INF/*.DSA |
Jar에서 삭제 | zip -d [jar] [file to remove] |
클래스 디컴파일 | procyon -o . [path to class] |
Jar 디컴파일 | procyon -jar [jar] -o [output directory] |
클래스 컴파일 | javac [path to .java file] |
Go
https://github.com/securego/gosec
PHP
Wordpress Plugins
https://www.pluginvulnerabilities.com/plugin-security-checker/
Solidity
JavaScript
Discovery
- Burp:
- Spider 및 콘텐츠 발견
- Sitemap > 필터
- Sitemap > 도메인 우클릭 > Engagement tools > Find scripts
waybackurls <domain> |grep -i "\.js" |sort -u
Static Analysis
Unminimize/Beautify/Prettify
- https://prettier.io/playground/
- https://beautifier.io/
- 아래 'Deobfuscate/Unpack'에서 언급된 도구들도 확인하세요.
Deobfuscate/Unpack
Note: 완전한 디오브퓨스케이션이 불가능할 수 있습니다.
- .map 파일 찾기 및 사용:
- .map 파일이 노출되면 쉽게 디오브퓨스케이션할 수 있습니다.
- 일반적으로 foo.js.map은 foo.js에 매핑됩니다. 수동으로 찾아보세요.
- JS Miner를 사용하여 찾아보세요.
- 활성 스캔이 수행되도록 하세요.
- 'Tips/Notes'를 읽어보세요.
- 발견되면 Maximize를 사용하여 디오브퓨스케이션하세요.
- .map 파일 없이 JSnice 시도:
- 참조: http://jsnice.org/ & https://www.npmjs.com/package/jsnice
- 팁:
- jsnice.org를 사용하는 경우 "Nicify JavaScript" 버튼 옆의 옵션 버튼을 클릭하고 "Infer types"의 선택을 해제하여 코드에 주석으로 혼란을 줄이세요.
- 스크립트 앞에 빈 줄을 남기지 않도록 하세요. 이는 디오브퓨스케이션 과정에 영향을 미쳐 부정확한 결과를 초래할 수 있습니다.
- JSNice의 더 현대적인 대안으로는 다음을 확인할 수 있습니다:
- https://github.com/pionxzh/wakaru
-
Javascript 디컴파일러, 언팩커 및 언미니파이 툴킷
Wakaru는 현대 프론트엔드를 위한 Javascript 디컴파일러입니다. 번들 및 트랜스파일된 소스에서 원래 코드를 복원합니다.
- https://github.com/j4k0xb/webcrack
-
obfuscator.io 디오브퓨스케이션, 언미니파이 및 번들 자바스크립트 언팩
- https://github.com/jehna/humanify
-
ChatGPT를 사용하여 Javascript 코드를 언미니파이
이 도구는 대형 언어 모델(예: ChatGPT 및 llama2)과 기타 도구를 사용하여 Javascript 코드를 언미니파이합니다. LLM은 구조적 변경을 수행하지 않으며, 변수 및 함수 이름을 바꾸기 위한 힌트만 제공합니다. 무거운 작업은 Babel이 AST 수준에서 수행하여 코드가 1-1 동등성을 유지하도록 합니다.
- https://thejunkland.com/blog/using-llms-to-reverse-javascript-minification.html
-
LLM을 사용하여 JavaScript 변수 이름 미니피케이션을 역전
console.log()
사용:
- 끝에서 반환 값을 찾아
console.log(<packerReturnVariable>);
로 변경하여 디오브퓨스케이션된 js가 실행되는 대신 출력되도록 합니다. - 그런 다음 수정된(여전히 디오브퓨스케이션된) js를 https://jsconsole.com/에 붙여넣어 디오브퓨스케이션된 js가 콘솔에 기록되는 것을 확인합니다.
- 마지막으로 디오브퓨스케이션된 출력을 https://prettier.io/playground/에 붙여넣어 분석을 위해 아름답게 만듭니다.
- Note: 여전히 패킹된(하지만 다른) js가 보인다면, 재귀적으로 패킹되었을 수 있습니다. 과정을 반복하세요.
References
- YouTube: DAST - Javascript Dynamic Analysis
- https://blog.nvisium.com/angular-for-pentesters-part-1
- https://blog.nvisium.com/angular-for-pentesters-part-2
- devalias's GitHub Gists:
- Obfuscated Web App Code 디오브퓨스케이션 / 언미니파이
- Webpack 앱 리버스 엔지니어링
- 기타
Tools
Less Used References
- https://cyberchef.org/
- https://olajs.com/javascript-prettifier
- https://jshint.com/
- https://github.com/jshint/jshint/
{% hint style="success" %}
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 Discord 그룹 또는 텔레그램 그룹에 참여하거나 Twitter 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud GitHub 리포지토리에 PR을 제출하여 해킹 팁을 공유하세요.