
กราม
เว็บไซต์ | เอกสาร | การตั้งค่า | Crawler Docker เริ่มต้นอย่างรวดเร็ว (ตัวอย่าง)
การใช้งานแบบโอเพ่นซอร์สการใช้งานต้นแบบของกราฟคุณสมบัติสำหรับ JavaScript ตามตัวแยกวิเคราะห์ ESPRIMA และ Estree Spidermonkey Spec กรามสามารถใช้สำหรับการวิเคราะห์ฝั่งไคลเอ็นต์ของเว็บแอปพลิเคชันและโปรแกรมที่ใช้ JavaScript
โครงการนี้ได้รับใบอนุญาตภายใต้ GNU AFFERO GENERAL PUBLIC LICENSE V3.0 ดูที่นี่สำหรับข้อมูลเพิ่มเติม
JAW มีเว็บไซต์ GitHub Pages ที่ https://soheilkhodayari.github.io/jaw/
หมายเหตุการวางจำหน่าย:
JAW-V2JAW-V1สถาปัตยกรรมของกรามแสดงด้านล่าง

กรามสามารถใช้ในสองวิธีที่แตกต่างกัน:
การวิเคราะห์ JavaScript โดยพลการ: ใช้กรามสำหรับการสร้างแบบจำลองและวิเคราะห์โปรแกรม JavaScript ใด ๆ โดยการระบุ path ระบบไฟล์ของโปรแกรม
การวิเคราะห์เว็บแอปพลิเคชัน: วิเคราะห์เว็บแอปพลิเคชันโดยให้ URL เมล็ดเดียว
ใช้ทรัพยากรเว็บที่รวบรวมเพื่อสร้างกราฟโปรแกรมไฮบริด (HPG) ซึ่งจะนำเข้าสู่ฐานข้อมูล NEO4J
เป็นทางเลือกจัดหาโมดูลการก่อสร้าง HPG ด้วยการทำแผนที่ประเภทความหมายให้กับโทเค็นภาษาจาวาสคริปต์ที่กำหนดเองอำนวยความสะดวกในการจัดหมวดหมู่ของฟังก์ชั่น JavaScript ตามวัตถุประสงค์ (เช่นฟังก์ชันการร้องขอ HTTP)
สอบถามฐานข้อมูลกราฟ Neo4j ที่สร้างขึ้นสำหรับการวิเคราะห์ต่างๆ JAW เสนอการสำรวจยูทิลิตี้สำหรับการวิเคราะห์การไหลของข้อมูลการวิเคราะห์การไหลของการควบคุมการวิเคราะห์ความสามารถในการเข้าถึงและการจับคู่รูปแบบ การสำรวจเหล่านี้สามารถใช้ในการพัฒนาการวิเคราะห์ความปลอดภัยที่กำหนดเอง
กรามยังรวมถึงการสำรวจในตัวสำหรับตรวจจับ CSRF ฝั่งไคลเอ็นต์, การปิดกั้น DOM และขอจี้ช่องโหว่
เอาต์พุตจะถูกเก็บไว้ในโฟลเดอร์เดียวกับอินพุต
สคริปต์การติดตั้งขึ้นอยู่กับข้อกำหนดเบื้องต้นดังต่อไปนี้:
npm package manager เวอร์ชันล่าสุด (Node JS)python 3.x เวอร์ชันที่เสถียรpip Package Managerหลังจากนั้นติดตั้งการพึ่งพาที่จำเป็นผ่าน:
$ ./install.sh สำหรับคำแนะนำการติดตั้ง detailed โปรดดูที่นี่
คุณสามารถเรียกใช้อินสแตนซ์ของไปป์ไลน์ในหน้าจอพื้นหลังผ่าน:
$ python3 -m run_pipeline --conf=config.yamlCLI มีตัวเลือกต่อไปนี้:
$ python3 -m run_pipeline -h
usage: run_pipeline.py [-h] [--conf FILE] [--site SITE] [--list LIST] [--from FROM] [--to TO]
This script runs the tool pipeline.
optional arguments:
-h, --help show this help message and exit
--conf FILE, -C FILE pipeline configuration file. (default: config.yaml)
--site SITE, -S SITE website to test; overrides config file (default: None)
--list LIST, -L LIST site list to test; overrides config file (default: None)
--from FROM, -F FROM the first entry to consider when a site list is provided; overrides config file (default: -1)
--to TO, -T TO the last entry to consider when a site list is provided; overrides config file (default: -1)
อินพุตกำหนดค่า: กรามคาดว่าไฟล์กำหนดค่า .yaml เป็นอินพุต ดู config.yaml สำหรับตัวอย่าง
คำใบ้. ไฟล์กำหนดค่าระบุบัตรผ่านที่แตกต่างกัน (เช่นการรวบรวมข้อมูลการวิเคราะห์แบบคงที่ ฯลฯ ) ซึ่งสามารถเปิดใช้งานหรือปิดใช้งานสำหรับแต่ละคลาสช่องโหว่ สิ่งนี้จะช่วยให้การเรียกใช้การสร้างเครื่องมือเป็นรายบุคคลหรือในลำดับที่แตกต่างกัน (เช่นรวบรวมข้อมูล webapps ทั้งหมดก่อนจากนั้นทำการวิเคราะห์ความปลอดภัย)
สำหรับการเรียกใช้ตัวอย่างด่วนสาธิตวิธีการสร้างกราฟคุณสมบัติและเรียกใช้การสืบค้น Cypher มากกว่าให้ทำ:
$ python3 -m analyses.example.example_analysis --input= $( pwd ) /data/test_program/test.jsโมดูลนี้รวบรวมข้อมูล (เช่นรหัส JavaScript และค่าสถานะของหน้าเว็บ) ที่จำเป็นสำหรับการทดสอบ หากคุณต้องการทดสอบไฟล์ Javascipt เฉพาะที่คุณมีอยู่แล้วในระบบไฟล์ของคุณคุณสามารถ ข้าม ขั้นตอนนี้ได้
JAW มีชุดรวบรวมข้อมูลตามซีลีเนียม (JAW-V1), Puppeteer (JAW-V2, V3) และนักเขียนบทละคร (JAW-V3) สำหรับคุณสมบัติที่ทันสมัยที่สุดขอแนะนำให้ใช้เวอร์ชัน Puppeteer- หรือ Playwright
Web Crawler นี้ใช้ Foxhound ซึ่งเป็นรุ่น Firefox ที่ใช้เครื่องมือเพื่อทำการติดตาม TAINT แบบไดนามิกในขณะที่นำทางผ่านหน้าเว็บ ในการเริ่มต้นการรวบรวมข้อมูลให้ทำ:
$ cd crawler
$ node crawler-taint.js --seedurl=https://google.com --maxurls=100 --headless=true --foxhoundpath= < optional-foxhound-executable-path > foxhoundpath ถูกตั้งค่าเป็นค่าเริ่มต้นเป็นไดเรกทอรีต่อไปนี้: crawler/foxhound/firefox ซึ่งมีเลขฐานสองชื่อ firefox
หมายเหตุ: คุณต้องมีการสร้าง Foxhound เพื่อใช้เวอร์ชันนี้ Ubuntu Build รวมอยู่ในการเปิดตัว JAW-V3
ในการเริ่มต้นการรวบรวมข้อมูลให้ทำ:
$ cd crawler
$ node crawler.js --seedurl=https://google.com --maxurls=100 --browser=chrome --headless=trueดูที่นี่สำหรับข้อมูลเพิ่มเติม
ในการเริ่มต้นการรวบรวมข้อมูลให้ทำ:
$ cd crawler/hpg_crawler
$ vim docker-compose.yaml # set the websites you want to crawl here and save
$ docker-compose build
$ docker-compose up -d โปรดดูเอกสารของ hpg_crawler ที่นี่สำหรับข้อมูลเพิ่มเติม
ในการสร้าง HPG สำหรับไฟล์ JavaScript (S) ที่กำหนดให้ทำ:
$ node engine/cli.js --lang=js --graphid=graph1 --input=/in/file1.js --input=/in/file2.js --output=$(pwd)/data/out/ --mode=csv
optional arguments:
--lang: language of the input program
--graphid: an identifier for the generated HPG
--input: path of the input program(s)
--output: path of the output HPG, must be i
--mode: determines the output format (csv or graphML)
หากต้องการนำเข้า HPG ภายในฐานข้อมูลกราฟ Neo4J (อินสแตนซ์ Docker) ทำ:
$ python3 -m hpg_neo4j.hpg_import --rpath=<path-to-the-folder-of-the-csv-files> --id=<xyz> --nodes=<nodes.csv> --edges=<rels.csv>
$ python3 -m hpg_neo4j.hpg_import -h
usage: hpg_import.py [-h] [--rpath P] [--id I] [--nodes N] [--edges E]
This script imports a CSV of a property graph into a neo4j docker database.
optional arguments:
-h, --help show this help message and exit
--rpath P relative path to the folder containing the graph CSV files inside the `data` directory
--id I an identifier for the graph or docker container
--nodes N the name of the nodes csv file (default: nodes.csv)
--edges E the name of the relations csv file (default: rels.csv)
ในการสร้างกราฟคุณสมบัติไฮบริดสำหรับเอาต์พุตของ hpg_crawler และนำเข้าภายในอินสแตนซ์ Neo4J ท้องถิ่นคุณสามารถทำได้:
$ python3 -m engine.api < path > --js= < program.js > --import= < bool > --hybrid= < bool > --reqs= < requests.out > --evts= < events.out > --cookies= < cookies.pkl > --html= < html_snapshot.html >ข้อมูลจำเพาะของพารามิเตอร์:
<path> : เส้นทางสัมบูรณ์ไปยังโฟลเดอร์ที่มีไฟล์โปรแกรมสำหรับการวิเคราะห์ (ต้องอยู่ภายใต้โฟลเดอร์ engine/outputs )--js=<program.js> : ชื่อของโปรแกรม JavaScript สำหรับการวิเคราะห์ (ค่าเริ่มต้น: js_program.js )--import=<bool> : ไม่ว่าจะเป็นกราฟคุณสมบัติที่สร้างขึ้นควรนำเข้าสู่ฐานข้อมูล Neo4J ที่ใช้งานอยู่หรือไม่ (ค่าเริ่มต้น: จริง)--hybrid=bool : เปิดใช้งานโหมดไฮบริด (ค่าเริ่มต้น: false ) นี่ก็หมายความว่าผู้ทดสอบต้องการเพิ่มประสิทธิภาพกราฟคุณสมบัติโดยการป้อนไฟล์สำหรับสแน็ปช็อต HTML ใด ๆ เหตุการณ์ที่ถูกยิงคำขอ HTTP และคุกกี้ตามที่รวบรวมโดย JAW Crawler--reqs=<requests.out> : สำหรับโหมดไฮบริดเท่านั้นชื่อของไฟล์ที่มีลำดับของคำขอเครือข่ายที่ไม่เคยมีมาก่อนให้ส่งสตริง false เพื่อยกเว้น (ค่าเริ่มต้น: request_logs_short.out )--evts=<events.out> : สำหรับโหมดไฮบริดเท่านั้นชื่อของไฟล์ที่มีลำดับของเหตุการณ์ที่ถูกยิงผ่านสตริง false เพื่อยกเว้น (ค่าเริ่มต้น: events.out )--cookies=<cookies.pkl> : สำหรับโหมดไฮบริดเท่านั้นชื่อของไฟล์ที่มีคุกกี้ส่งสตริง false ให้ยกเว้น (ค่าเริ่มต้น: cookies.pkl )--html=<html_snapshot.html> : สำหรับโหมดไฮบริดเท่านั้นชื่อของไฟล์ที่มี Snapshot ทรีทรีให้ส่งสตริง false ให้ยกเว้น (ค่าเริ่มต้น: html_rendered.html )สำหรับข้อมูลเพิ่มเติมคุณสามารถใช้ความช่วยเหลือ CLI ที่ให้มาพร้อมกับกราฟการก่อสร้าง API:
$ python3 -m engine.api -hHPG ที่สร้างขึ้นนั้นสามารถสอบถามได้โดยใช้ Cypher หรือ Neomodel ORM
คุณควรวางและเรียกใช้การสืบค้นของคุณใน analyses/<ANALYSIS_NAME>
คุณสามารถใช้ Neomodel ORM เพื่อสอบถาม HPG เพื่อเขียนคำถาม:
example_query_orm.py ในโฟลเดอร์ analyses/example $ python3 -m analyses.example.example_query_orm สำหรับข้อมูลเพิ่มเติมโปรดดูที่นี่
คุณสามารถใช้ Cypher เพื่อเขียนแบบสอบถามที่กำหนดเอง สำหรับสิ่งนี้:
example_query_cypher.py ในโฟลเดอร์ analyses/example $ python3 -m analyses.example.example_query_cypherสำหรับข้อมูลเพิ่มเติมโปรดดูที่นี่
ส่วนนี้อธิบายวิธีการกำหนดค่าและใช้ขากรรไกรเพื่อตรวจจับช่องโหว่และวิธีการตีความผลลัพธ์ กรามมีการสืบค้นที่มีอยู่ในตัวเองสำหรับการตรวจจับ CSRF ฝั่งไคลเอ็นต์และการปิดกั้น DOM
ขั้นตอนที่ 1. เปิดใช้งานส่วนประกอบการวิเคราะห์สำหรับคลาสช่องโหว่ในไฟล์อินพุต config.yaml:
request_hijacking :
enabled : true
# [...]
open_redirect :
enabled : false
# [...]
domclobbering :
enabled : false
# [...]
cs_csrf :
enabled : false
# [...]ขั้นตอนที่ 2. เรียกใช้อินสแตนซ์ของไปป์ไลน์ด้วย:
$ python3 -m run_pipeline --conf=config.yaml คำใบ้. คุณสามารถเรียกใช้หลายอินสแตนซ์ของไปป์ไลน์ภายใต้ screen ที่แตกต่างกัน s:
$ screen -dmS s1 bash -c ' python3 -m run_pipeline --conf=conf1.yaml; exec sh '
$ screen -dmS s2 bash -c ' python3 -m run_pipeline --conf=conf2.yaml; exec sh '
$ # [...] ในการสร้างไฟล์การกำหนดค่าแบบขนานโดยอัตโนมัติคุณสามารถใช้สคริปต์ generate_config.py
เอาต์พุตจะถูกเก็บไว้ในไฟล์ที่เรียกว่า sink.flows.out ในโฟลเดอร์เดียวกันกับของอินพุต สำหรับ CSRF ฝั่งไคลเอ็นต์ตัวอย่างเช่นสำหรับการร้องขอ HTTP แต่ละครั้งที่ตรวจพบกรามจะส่งออกรายการที่ทำเครื่องหมายชุดของประเภทความหมาย (aka, แท็กความหมายหรือป้ายกำกับ) ที่เกี่ยวข้องกับองค์ประกอบที่สร้างคำขอ (เช่นชิ้นโปรแกรม) ตัวอย่างเช่นคำขอ HTTP ที่ทำเครื่องหมายด้วยประเภทความหมาย ['WIN.LOC'] สามารถให้อภัยผ่าน window.location จุดฉีดตำแหน่ง อย่างไรก็ตามคำขอที่ทำเครื่องหมายด้วย ['NON-REACH'] ไม่ได้รับการอภัย
ตัวอย่างรายการเอาต์พุตแสดงด้านล่าง:
[*] Tags: ['WIN.LOC']
[*] NodeId: {'TopExpression': '86', 'CallExpression': '87', 'Argument': '94'}
[*] Location: 29
[*] Function: ajax
[*] Template: ajaxloc + "/bearer1234/"
[*] Top Expression: $.ajax({ xhrFields: { withCredentials: "true" }, url: ajaxloc + "/bearer1234/" })
1:['WIN.LOC'] variable=ajaxloc
0 (loc:6)- var ajaxloc = window.location.href
รายการนี้แสดงให้เห็นว่าในบรรทัดที่ 29 มีนิพจน์การโทร $.ajax และนิพจน์การโทรนี้ทำให้เกิดการร้องขอ ajax ด้วยค่าเทมเพลต URL ของ ajaxloc + "/bearer1234/ ซึ่งพารามิเตอร์ ajaxloc เป็นชิ้น ['WIN.LOC'] ที่อ่านค่าที่บรรทัดที่ 6 จาก window.location.href
เพื่อปรับปรุงขั้นตอนการทดสอบสำหรับกรามและตรวจสอบให้แน่ใจว่าการตั้งค่าของคุณถูกต้องเรามีเว็บแอปพลิ node.js ชันเว็บที่เรียบง่ายซึ่งคุณสามารถทดสอบขากรรไกรได้
ขั้นแรกให้ติดตั้งการพึ่งพาผ่าน:
$ cd tests/test-webapp
$ npm installจากนั้นเรียกใช้แอปพลิเคชันในหน้าจอใหม่:
$ screen -dmS jawwebapp bash -c ' PORT=6789 npm run devstart; exec sh 'สำหรับข้อมูลเพิ่มเติมโปรดเยี่ยมชมหน้า Wiki ของเราที่นี่ ด้านล่างเป็นสารบัญสำหรับการเข้าถึงอย่างรวดเร็ว
ยินดีรับคำขอดึงเสมอ โครงการนี้มีจุดประสงค์เพื่อเป็นพื้นที่ที่ปลอดภัยและเป็นมิตรและคาดว่าจะต้องปฏิบัติตามจรรยาบรรณของผู้สนับสนุน
หากคุณใช้ขากรรไกรเพื่อการวิจัยเชิงวิชาการเราขอแนะนำให้คุณอ้างถึงบทความต่อไปนี้:
@inproceedings{JAW,
title = {JAW: Studying Client-side CSRF with Hybrid Property Graphs and Declarative Traversals},
author= {Soheil Khodayari and Giancarlo Pellegrino},
booktitle = {30th {USENIX} Security Symposium ({USENIX} Security 21)},
year = {2021},
address = {Vancouver, B.C.},
publisher = {{USENIX} Association},
}
ขากรรไกรมาไกลและเราต้องการให้เสียงตะโกนที่สมควรได้รับที่นี่!
@tmbrbr, @c01gide, @jndre และ sepehr mirzaei