├── .obsidian ├── hotkeys.json ├── app.json ├── appearance.json ├── core-plugins.json ├── core-plugins-migration.json └── workspace.json ├── docs ├── .obsidian │ ├── app.json │ ├── appearance.json │ ├── core-plugins.json │ ├── core-plugins-migration.json │ └── workspace.json ├── Screenshots │ ├── logo.jpg │ ├── cors_principle.png │ ├── site-vs-origin.png │ ├── Pasted image 20210430045738.png │ ├── Pasted image 20210601024533.png │ ├── Pasted image 20210601024542.png │ ├── Pasted image 20210602032329.png │ ├── Pasted image 20210602032331.png │ ├── Pasted image 20210714150123.png │ ├── Pasted image 20210714150824.png │ ├── Pasted image 20210714152052.png │ ├── Pasted image 20210908125508.png │ ├── Pasted image 20210908171828.png │ ├── Pasted image 20210908172235.png │ ├── Pasted image 20210914115012.png │ ├── Pasted image 20220613024231.png │ ├── Pasted image 20220613035310.png │ ├── Pasted image 20220613064613.png │ ├── Pasted image 20220613064710.png │ ├── Pasted image 20220613064746.png │ ├── Pasted image 20220624225346.png │ ├── Pasted image 20220624225408.png │ ├── Pasted image 20220624225411.png │ ├── Pasted image 20220624230949.png │ ├── Pasted image 20220625173823.png │ ├── Pasted image 20220625173837.png │ ├── Pasted image 20220927163823.png │ ├── Pasted image 20221106172409.png │ ├── Pasted image 20221114134636.png │ ├── Pasted image 20221114134659.png │ ├── Pasted image 20221114134714.png │ ├── Pasted image 20221114134728.png │ ├── Pasted image 20221114135220.png │ ├── Pasted image 20221114155030.png │ ├── Pasted image 20221115232336.png │ ├── Pasted image 20221116095454.png │ ├── Pasted image 20221121022359.png │ ├── Pasted image 20221121032232.png │ ├── Pasted image 20221121032506.png │ ├── Pasted image 20221121032510.png │ ├── Pasted image 20221121032603.png │ ├── Pasted image 20221121032807.png │ ├── Pasted image 20221121033705.png │ ├── Pasted image 20221121033707.png │ ├── Pasted image 20221121033946.png │ ├── Pasted image 20221121034243.png │ ├── Pasted image 20221121034501.png │ ├── Pasted image 20221121034513.png │ ├── Pasted image 20221121034720.png │ ├── Pasted image 20221127231859.png │ ├── Pasted image 20221128001432.png │ ├── Pasted image 20221128001435.png │ ├── Pasted image 20221128001440.png │ ├── Pasted image 20221128104955.png │ ├── Pasted image 20221128105057.png │ ├── Pasted image 20221128105131.png │ ├── Pasted image 20221128105146.png │ ├── Pasted image 20221128105212.png │ ├── Pasted image 20221128105317.png │ ├── Pasted image 20221128105341.png │ ├── Pasted image 20221128105358.png │ ├── Pasted image 20221128105435.png │ ├── Pasted image 20221218132248.png │ ├── Pasted image 20221218132634.png │ ├── Pasted image 20221218132736.png │ ├── Pasted image 20221218132854.png │ ├── Pasted image 20230104034321.png │ ├── Pasted image 20230105000757.png │ ├── Pasted image 20230105004025.png │ ├── Pasted image 20230105004506.png │ ├── Pasted image 20230105005514.png │ ├── Pasted image 20230105005557.png │ ├── Pasted image 20230105005604.png │ ├── Pasted image 20230105005651.png │ ├── Pasted image 20230105010230.png │ ├── Pasted image 20230105010301.png │ ├── Pasted image 20230105010536.png │ ├── Pasted image 20230106095903.png │ ├── Pasted image 20230110102541.png │ ├── Pasted image 20230113102539.png │ ├── Pasted image 20230131135245.png │ ├── Pasted image 20230212164002.png │ ├── Pasted image 20230212164259.png │ ├── Pasted image 20230213100804.png │ ├── Pasted image 20230213100821.png │ ├── Pasted image 20230213101222.png │ ├── Pasted image 20230213104013.png │ ├── Pasted image 20230213105043.png │ ├── Pasted image 20230304222120.png │ ├── Pasted image 20230304222203.png │ ├── Pasted image 20230304223501.png │ ├── Pasted image 20230304223739.png │ ├── Pasted image 20230304223830.png │ ├── Pasted image 20230305125710.png │ ├── Pasted image 20230305125950.png │ ├── Pasted image 20230305130044.png │ ├── Pasted image 20230305130045.png │ ├── Pasted image 20230305132328.png │ ├── Pasted image 20230305132329.png │ ├── Pasted image 20230305132438.png │ ├── Pasted image 20230305132655.png │ ├── Pasted image 20230305132836.png │ ├── Pasted image 20230305133044.png │ ├── Pasted image 20230305133317.png │ ├── Pasted image 20230305133318.png │ ├── Pasted image 20230305133319.png │ ├── Pasted image 20230305133849.png │ ├── Pasted image 20230305140050.png │ ├── Pasted image 20230305140357.png │ ├── Pasted image 20230305152606.png │ ├── Pasted image 20230312104334.png │ ├── Pasted image 20230312104728.png │ ├── Pasted image 20230524114625.png │ ├── Pasted image 20230601164558.png │ ├── Pasted image 20230601165047.png │ ├── Pasted image 20230608122953.png │ ├── Pasted image 20230608123618.png │ ├── Pasted image 20230608130242.png │ ├── Pasted image 20230608141442.png │ ├── Pasted image 20230610212955.png │ ├── Pasted image 20230610213155.png │ ├── Pasted image 20230803164141.png │ ├── Pasted image 20230804150855.png │ ├── Pasted image 20230804150922.png │ ├── Pasted image 20230804155041.png │ ├── Pasted image 20230804155700.png │ ├── Pasted image 20230804155907.png │ ├── Pasted image 20230828205850.png │ ├── Pasted image 20230829095441.png │ ├── Pasted image 20230905160139.png │ ├── Pasted image 20230905160150.png │ ├── Pasted image 20230910181425.png │ ├── Pasted image 20230910183343.png │ ├── Pasted image 20230910183410.png │ ├── Pasted image 20230910183541.png │ ├── Pasted image 20230910183604.png │ ├── Pasted image 20230910194154.png │ ├── Pasted image 20231121050659.png │ ├── Pasted image 20240226121218.png │ ├── Pasted image 20240226121244.png │ ├── Pasted image 20240226121305.png │ ├── Pasted image 20240226121320.png │ ├── Pasted image 20240226121335.png │ ├── Pasted image 20240226121348.png │ ├── Pasted image 20240226121359.png │ ├── Pasted image 20240226121403.png │ ├── Pasted image 20240302203650.png │ ├── Pasted image 20240302203654.png │ ├── Pasted image 20240302203713.png │ ├── Pasted image 20240302205703.png │ ├── Pasted image 20240302215658.png │ ├── Pasted image 20240312153730.png │ ├── Pasted image 20240319133711.png │ ├── Pasted image 20240326055213.png │ ├── Pasted image 20240330044011.png │ ├── Pasted image 20240330044636.png │ ├── Pasted image 20240330044653.png │ ├── Pasted image 20240330044705.png │ ├── Pasted image 20240330045057.png │ ├── Pasted image 20240401001239.png │ ├── Pasted image 20240401001257.png │ ├── Pasted image 20240401001320.png │ ├── Pasted image 20240401001444.png │ ├── Pasted image 20240401001708.png │ ├── Pasted image 20240402032750.png │ ├── Pasted image 20240403010106.png │ ├── Pasted image 20240403011227.png │ ├── Pasted image 20240403012157.png │ ├── Pasted image 20240403023830.png │ ├── Pasted image 20240403025011.png │ ├── Pasted image 20240403025127.png │ ├── Pasted image 20240403025349.png │ ├── Pasted image 20240403025518.png │ ├── Pasted image 20240403031400.png │ └── bugbounty_pentestbook.six2dez.png ├── README.md ├── appsec │ ├── Secrets Management.md │ ├── Supply Chain.md │ ├── CI-CD Security.md │ ├── Docker.md │ └── DevSecOps Tooling.md ├── pentest │ ├── Mobile Application Testing │ │ ├── Extract IPA From AppStore Application.md │ │ ├── React Native.md │ │ ├── Xamarin - Android.md │ │ ├── Apache Cordova.md │ │ └── Xamarin - iOS.md │ ├── Web Application testing │ │ ├── Salesforce Testing.md │ │ └── OSINT.md │ └── Desktop Application Testing │ │ ├── Frida - Windows.md │ │ └── C++ Win32 Applications.md ├── AI & LLMS.md ├── IAM, AuthN & AuthZ.md ├── Cloud │ └── Azure Assessment Checklist.md └── Segmentation Testing.md ├── custom_theme ├── assets │ ├── favicon.ico │ └── particles.json ├── js │ ├── app.js │ └── particles.js ├── css │ └── styles.css └── main.html ├── .github └── workflows │ └── github-actions-demo.yml └── mkdocs.yml /.obsidian/hotkeys.json: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /docs/.obsidian/app.json: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /.obsidian/app.json: -------------------------------------------------------------------------------- 1 | { 2 | "useMarkdownLinks": true 3 | } -------------------------------------------------------------------------------- /.obsidian/appearance.json: -------------------------------------------------------------------------------- 1 | { 2 | "accentColor": "" 3 | } -------------------------------------------------------------------------------- /docs/.obsidian/appearance.json: -------------------------------------------------------------------------------- 1 | { 2 | "accentColor": "" 3 | } -------------------------------------------------------------------------------- /docs/Screenshots/logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/logo.jpg -------------------------------------------------------------------------------- /custom_theme/assets/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/custom_theme/assets/favicon.ico -------------------------------------------------------------------------------- /docs/Screenshots/cors_principle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/cors_principle.png -------------------------------------------------------------------------------- /docs/Screenshots/site-vs-origin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/site-vs-origin.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20210430045738.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20210430045738.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20210601024533.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20210601024533.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20210601024542.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20210601024542.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20210602032329.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20210602032329.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20210602032331.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20210602032331.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20210714150123.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20210714150123.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20210714150824.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20210714150824.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20210714152052.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20210714152052.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20210908125508.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20210908125508.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20210908171828.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20210908171828.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20210908172235.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20210908172235.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20210914115012.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20210914115012.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20220613024231.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20220613024231.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20220613035310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20220613035310.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20220613064613.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20220613064613.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20220613064710.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20220613064710.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20220613064746.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20220613064746.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20220624225346.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20220624225346.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20220624225408.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20220624225408.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20220624225411.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20220624225411.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20220624230949.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20220624230949.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20220625173823.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20220625173823.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20220625173837.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20220625173837.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20220927163823.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20220927163823.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20221106172409.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20221106172409.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20221114134636.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20221114134636.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20221114134659.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20221114134659.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20221114134714.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20221114134714.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20221114134728.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20221114134728.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20221114135220.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20221114135220.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20221114155030.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20221114155030.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20221115232336.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20221115232336.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20221116095454.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20221116095454.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20221121022359.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20221121022359.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20221121032232.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20221121032232.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20221121032506.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20221121032506.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20221121032510.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20221121032510.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20221121032603.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20221121032603.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20221121032807.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20221121032807.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20221121033705.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20221121033705.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20221121033707.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20221121033707.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20221121033946.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20221121033946.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20221121034243.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20221121034243.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20221121034501.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20221121034501.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20221121034513.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20221121034513.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20221121034720.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20221121034720.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20221127231859.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20221127231859.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20221128001432.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20221128001432.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20221128001435.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20221128001435.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20221128001440.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20221128001440.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20221128104955.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20221128104955.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20221128105057.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20221128105057.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20221128105131.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20221128105131.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20221128105146.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20221128105146.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20221128105212.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20221128105212.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20221128105317.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20221128105317.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20221128105341.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20221128105341.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20221128105358.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20221128105358.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20221128105435.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20221128105435.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20221218132248.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20221218132248.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20221218132634.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20221218132634.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20221218132736.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20221218132736.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20221218132854.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20221218132854.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230104034321.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230104034321.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230105000757.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230105000757.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230105004025.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230105004025.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230105004506.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230105004506.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230105005514.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230105005514.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230105005557.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230105005557.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230105005604.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230105005604.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230105005651.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230105005651.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230105010230.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230105010230.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230105010301.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230105010301.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230105010536.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230105010536.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230106095903.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230106095903.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230110102541.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230110102541.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230113102539.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230113102539.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230131135245.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230131135245.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230212164002.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230212164002.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230212164259.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230212164259.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230213100804.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230213100804.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230213100821.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230213100821.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230213101222.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230213101222.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230213104013.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230213104013.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230213105043.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230213105043.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230304222120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230304222120.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230304222203.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230304222203.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230304223501.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230304223501.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230304223739.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230304223739.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230304223830.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230304223830.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230305125710.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230305125710.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230305125950.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230305125950.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230305130044.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230305130044.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230305130045.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230305130045.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230305132328.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230305132328.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230305132329.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230305132329.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230305132438.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230305132438.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230305132655.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230305132655.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230305132836.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230305132836.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230305133044.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230305133044.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230305133317.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230305133317.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230305133318.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230305133318.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230305133319.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230305133319.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230305133849.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230305133849.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230305140050.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230305140050.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230305140357.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230305140357.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230305152606.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230305152606.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230312104334.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230312104334.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230312104728.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230312104728.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230524114625.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230524114625.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230601164558.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230601164558.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230601165047.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230601165047.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230608122953.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230608122953.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230608123618.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230608123618.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230608130242.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230608130242.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230608141442.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230608141442.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230610212955.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230610212955.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230610213155.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230610213155.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230803164141.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230803164141.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230804150855.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230804150855.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230804150922.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230804150922.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230804155041.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230804155041.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230804155700.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230804155700.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230804155907.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230804155907.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230828205850.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230828205850.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230829095441.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230829095441.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230905160139.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230905160139.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230905160150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230905160150.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230910181425.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230910181425.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230910183343.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230910183343.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230910183410.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230910183410.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230910183541.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230910183541.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230910183604.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230910183604.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20230910194154.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20230910194154.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20231121050659.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20231121050659.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20240226121218.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20240226121218.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20240226121244.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20240226121244.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20240226121305.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20240226121305.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20240226121320.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20240226121320.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20240226121335.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20240226121335.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20240226121348.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20240226121348.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20240226121359.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20240226121359.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20240226121403.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20240226121403.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20240302203650.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20240302203650.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20240302203654.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20240302203654.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20240302203713.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20240302203713.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20240302205703.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20240302205703.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20240302215658.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20240302215658.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20240312153730.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20240312153730.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20240319133711.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20240319133711.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20240326055213.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20240326055213.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20240330044011.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20240330044011.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20240330044636.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20240330044636.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20240330044653.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20240330044653.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20240330044705.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20240330044705.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20240330045057.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20240330045057.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20240401001239.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20240401001239.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20240401001257.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20240401001257.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20240401001320.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20240401001320.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20240401001444.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20240401001444.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20240401001708.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20240401001708.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20240402032750.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20240402032750.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20240403010106.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20240403010106.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20240403011227.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20240403011227.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20240403012157.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20240403012157.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20240403023830.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20240403023830.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20240403025011.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20240403025011.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20240403025127.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20240403025127.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20240403025349.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20240403025349.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20240403025518.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20240403025518.png -------------------------------------------------------------------------------- /docs/Screenshots/Pasted image 20240403031400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/Pasted image 20240403031400.png -------------------------------------------------------------------------------- /docs/Screenshots/bugbounty_pentestbook.six2dez.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akenofu/HackAllTheThings/HEAD/docs/Screenshots/bugbounty_pentestbook.six2dez.png -------------------------------------------------------------------------------- /custom_theme/js/app.js: -------------------------------------------------------------------------------- 1 | /* particlesJS.load(@dom-id, @path-json, @callback (optional)); */ 2 | particlesJS.load('particles-js', '/assets/particles.json', function() { 3 | console.log('callback - particles.js config loaded'); 4 | }); -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | # Hack All The Things 2 | 3 | Meticulously curated security notes with Emphasis on Application Security, DevSecOps, Cloud Computing, and Penetration Testing. 4 | 5 | **Markdown book is hosted at [https://notes.akenofu.me](https://notes.akenofu.me)** -------------------------------------------------------------------------------- /.obsidian/core-plugins.json: -------------------------------------------------------------------------------- 1 | [ 2 | "file-explorer", 3 | "global-search", 4 | "switcher", 5 | "graph", 6 | "backlink", 7 | "canvas", 8 | "outgoing-link", 9 | "tag-pane", 10 | "page-preview", 11 | "daily-notes", 12 | "templates", 13 | "note-composer", 14 | "command-palette", 15 | "editor-status", 16 | "bookmarks", 17 | "outline", 18 | "word-count", 19 | "file-recovery" 20 | ] -------------------------------------------------------------------------------- /docs/.obsidian/core-plugins.json: -------------------------------------------------------------------------------- 1 | [ 2 | "file-explorer", 3 | "global-search", 4 | "switcher", 5 | "graph", 6 | "backlink", 7 | "canvas", 8 | "outgoing-link", 9 | "tag-pane", 10 | "page-preview", 11 | "daily-notes", 12 | "templates", 13 | "note-composer", 14 | "command-palette", 15 | "editor-status", 16 | "bookmarks", 17 | "outline", 18 | "word-count", 19 | "file-recovery" 20 | ] -------------------------------------------------------------------------------- /.github/workflows/github-actions-demo.yml: -------------------------------------------------------------------------------- 1 | name: remote ssh command 2 | on: [push] 3 | jobs: 4 | 5 | build: 6 | name: Build 7 | runs-on: ubuntu-latest 8 | steps: 9 | - name: executing remote ssh commands using password 10 | uses: appleboy/ssh-action@v0.1.10 11 | with: 12 | host: ${{ secrets.HOST }} 13 | username: ${{ secrets.USERNAME }} 14 | key: ${{ secrets.KEY }} 15 | port: ${{ secrets.PORT }} 16 | script_stop: true 17 | script: | 18 | ./flush.sh 19 | ./update.sh -------------------------------------------------------------------------------- /custom_theme/css/styles.css: -------------------------------------------------------------------------------- 1 | /* ---- reset ---- */ 2 | 3 | /* body { 4 | margin: 0; 5 | font:normal 75% Arial, Helvetica, sans-serif; 6 | } 7 | */ 8 | 9 | canvas { 10 | display: block; 11 | } 12 | 13 | /* ---- particles.js container ---- */ 14 | 15 | #particles-js { 16 | transform: translate3d(0, 0, 0); 17 | backface-visibility: hidden; 18 | top: 0; 19 | bottom: 0; 20 | left: 75%; 21 | /* left: 0%; */ 22 | position: fixed; 23 | z-index: -1; 24 | position: absolute; 25 | overflow: hidden; 26 | 27 | } 28 | -------------------------------------------------------------------------------- /docs/appsec/Secrets Management.md: -------------------------------------------------------------------------------- 1 | # Secrets Management 2 | ## Canary Tokens 3 | - Generate [Canarytokens](https://www.canarytokens.org/generate) 4 | - [TruffleHog Now Detects AWS Canaries without setting them off ◆ Truffle Security Co.](https://trufflesecurity.com/blog/canaries?utm_source=tldrsec.com&utm_medium=referral&utm_campaign=tl-dr-sec-220-detecting-manual-aws-actions-ai-threat-models-living-off-the-false-positive) 5 | 6 | ## Where can you store source code? 7 | From bad to okay to amazing practices 8 | - Source Code 9 | - Environment Variables 10 | - Configuration management vaults, i.e, ansible vault 11 | - Secrets Management Solution 12 | 13 | ## Components of Secrets Management Solutions 14 | - secrets backend 15 | - auth backend 16 | - audit backend -------------------------------------------------------------------------------- /.obsidian/core-plugins-migration.json: -------------------------------------------------------------------------------- 1 | { 2 | "file-explorer": true, 3 | "global-search": true, 4 | "switcher": true, 5 | "graph": true, 6 | "backlink": true, 7 | "canvas": true, 8 | "outgoing-link": true, 9 | "tag-pane": true, 10 | "properties": false, 11 | "page-preview": true, 12 | "daily-notes": true, 13 | "templates": true, 14 | "note-composer": true, 15 | "command-palette": true, 16 | "slash-command": false, 17 | "editor-status": true, 18 | "bookmarks": true, 19 | "markdown-importer": false, 20 | "zk-prefixer": false, 21 | "random-note": false, 22 | "outline": true, 23 | "word-count": true, 24 | "slides": false, 25 | "audio-recorder": false, 26 | "workspaces": false, 27 | "file-recovery": true, 28 | "publish": false, 29 | "sync": false 30 | } -------------------------------------------------------------------------------- /docs/.obsidian/core-plugins-migration.json: -------------------------------------------------------------------------------- 1 | { 2 | "file-explorer": true, 3 | "global-search": true, 4 | "switcher": true, 5 | "graph": true, 6 | "backlink": true, 7 | "canvas": true, 8 | "outgoing-link": true, 9 | "tag-pane": true, 10 | "properties": false, 11 | "page-preview": true, 12 | "daily-notes": true, 13 | "templates": true, 14 | "note-composer": true, 15 | "command-palette": true, 16 | "slash-command": false, 17 | "editor-status": true, 18 | "bookmarks": true, 19 | "markdown-importer": false, 20 | "zk-prefixer": false, 21 | "random-note": false, 22 | "outline": true, 23 | "word-count": true, 24 | "slides": false, 25 | "audio-recorder": false, 26 | "workspaces": false, 27 | "file-recovery": true, 28 | "publish": false, 29 | "sync": false 30 | } -------------------------------------------------------------------------------- /docs/pentest/Mobile Application Testing/Extract IPA From AppStore Application.md: -------------------------------------------------------------------------------- 1 | # Extract IPA From AppStore Application 2 | ## Manual 3 | > I am using a jailbroken device ,and a Debian VM 4 | 5 | ```bash 6 | ssh 192.168.114.153 7 | 8 | cd /var/containers/Bundle/Application 9 | 10 | # Identify Bundle Id 11 | ls * | grep -b 2 12 | 13 | cd 14 | 15 | cp -r .app Payload/ 16 | 17 | zip -r /var/root/.ipa Payload 18 | 19 | cp root@192.168.114.153:/var/root/Chess.ipa . 20 | ``` 21 | 22 | [How to extract iPA from iDevice manually. - Security Workbook on Pentesting (securityboat.in)](https://workbook.securityboat.in/resources/ios-app-pentest/how-to-extract-ipa-from-idevice-manually.) 23 | 24 | ## Automated 25 | - use [GitHub - AloneMonkey/frida-ios-dump: pull decrypted ipa from jailbreak device](https://github.com/AloneMonkey/frida-ios-dump) -------------------------------------------------------------------------------- /docs/appsec/Supply Chain.md: -------------------------------------------------------------------------------- 1 | # Supply Chain 2 | ## Supply Chain Attacks 3 | ### GitHub repo-jacking 4 | From: [How to stay safe from repo-jacking - The GitHub Blog](https://github.blog/2024-02-21-how-to-stay-safe-from-repo-jacking/) 5 | #### Concept 6 | GitHub were to change its account name to `gh`[1](https://github.blog/2024-02-21-how-to-stay-safe-from-repo-jacking/?utm_source=tldrsec.com&utm_medium=referral&utm_campaign=tl-dr-sec-223-ai-auto-fixes-mapping-cloudtrail-to-incidents-vs-code-extensions-for-security#fn-76655-1 "Read footnote."). Then, a repository such as [https://github.com/github/cmark-gfm](https://github.com/github/cmark-gfm) would be renamed to [https://github.com/gh/cmark-gfm](https://github.com/github/cmark-gfm). Now, imagine that an attacker manages to register a new GitHub account with the newly available username `github`. Then, they could create a repository named `cmark-gfm` and start serving malware to developers who are still downloading their software from the original address. 7 | #### Targets 8 | 1. You’re using [GitHub Actions](https://docs.github.com/actions). 9 | 2. You’re using the [Go programming language](https://go.dev/). 10 | 3. You’re using [git submodules](https://git-scm.com/docs/git-submodule). 11 | 12 | -------------------------------------------------------------------------------- /docs/pentest/Mobile Application Testing/React Native.md: -------------------------------------------------------------------------------- 1 | # React Native 2 | ## Identification 3 | - Look for clues to the words react or Facebook in the decompiled APK. 4 | ## Special Bugs to look for 5 | - MFA bypass due to caching the OAuth login session for a long time. 6 | ## Decompile the Hermes byte code 7 | - Unzip the APK 8 | - navigate to `.\assets\index.android.bundle` 9 | - identify if the bundle is indeed Hermes bytecode using `file index.android.bundle` 10 | ![](Pasted%20image%2020240312153730.png) 11 | - If the concerned file is indeed an Hermes JavaScript bytecode file, you may then decode most of its file headers using the following utility (which output may not be stable over time): 12 | 13 | ```bash 14 | # https://github.com/P1sec/hermes-dec 15 | hbc-file-parser assets/index.android.bundle 16 | ``` 17 | 18 | - You may then disassemble the contents of the React Native bytecode file to the `/tmp/my_output_file.hasm` output file using the following command (leave out the second parameter in order to send the disassembled content to the standard output): 19 | 20 | ```bash 21 | # https://github.com/P1sec/hermes-dec 22 | hbc-disassembler index.android.bundle disassembly.hasm 23 | ``` 24 | 25 | - And perform the decomplication to pseudo-code (which is not valid JavaScript yet as it does not retranscribe loop/conditional structures) using the following command: 26 | 27 | ```bash 28 | # https://github.com/P1sec/hermes-dec 29 | hbc-decompiler index.android.bundle decomplied.js 30 | ``` 31 | -------------------------------------------------------------------------------- /mkdocs.yml: -------------------------------------------------------------------------------- 1 | site_name: akenofu 2 | dev_addr: "127.0.0.1:3000" 3 | site_url: 'https://notes.akenofu.me' 4 | repo_url: 'https://github.com/akenofu/HackAllTheThings' 5 | edit_uri: 'https://github.com/akenofu/HackAllTheThings/tree/master/docs/' 6 | site_description: 'This repo is my personal repertoire of technology and security-related notes since day one in the field. It is also my attempt to give back to the infosec community. It has all the references, checklists, cheat sheets, and notes I use daily. I forgot to say, I am very forgetful 🙋‍♂️. So, I am probably the person who uses this the most 👀' 7 | site_author: 'Karim Mohamed @akenofu' 8 | watch: ['docs', 'mkdocs.yml', 'custom_theme'] 9 | plugins: 10 | - search: 11 | indexing: 'full' 12 | 13 | markdown_extensions: 14 | - pymdownx.highlight: 15 | anchor_linenums: true 16 | - pymdownx.inlinehilite 17 | - pymdownx.keys 18 | - pymdownx.superfences 19 | - tables 20 | - toc 21 | - pymdownx.tasklist: 22 | custom_checkbox: true 23 | clickable_checkbox: true 24 | - footnotes 25 | 26 | theme: 27 | name: material 28 | site_url: 'https://notes.akenofu.me' 29 | highlightjs: true 30 | github_url: https://github.com/akenofu/HackAllTheThings 31 | navigation_depth: 4 32 | titles_only: true 33 | sticky_navigation: true 34 | collapse_navigation: true 35 | custom_dir: custom_theme 36 | theme: 37 | logo: Screenshots/logo.jpg 38 | favicon: Screenshots/logo.jpg 39 | palette: 40 | # Palette toggle for dark mode 41 | - scheme: slate 42 | toggle: 43 | icon: material/brightness-4 44 | name: Switch to light mode 45 | # Palette toggle for light mode 46 | - scheme: default 47 | toggle: 48 | icon: material/brightness-7 49 | name: Switch to dark mode 50 | 51 | 52 | -------------------------------------------------------------------------------- /docs/appsec/CI-CD Security.md: -------------------------------------------------------------------------------- 1 | # CI/CD Security 2 | ## IAM 3 | ### Concepts 4 | - Create an AWS account for each CI/CD environment 5 | - [For Critical Business Services] Create an AWS account and role for each service within that business critical environment. 6 | ### Resources 7 | - [How to secure CI/CD roles without burning production to the ground | theburningmonk.com](https://theburningmonk.com/2024/02/how-to-secure-ci-cd-roles-without-burning-production-to-the-ground/) 8 | - [CI CD Security - OWASP Cheat Sheet Series](https://cheatsheetseries.owasp.org/cheatsheets/CI_CD_Security_Cheat_Sheet.html#pipeline-and-execution-enviornment) 9 | - [Security - Hardening Your GitLab Instance | GitLab](https://about.gitlab.com/security/hardening/) 10 | ## Offensive CI/CD 11 | - [GitHub - cider-security-research/cicd-goat: A deliberately vulnerable CI/CD environment. Learn CI/CD security through multiple challenges.](https://github.com/cider-security-research/cicd-goat) 12 | - [CICD-Goat Setup and Easy Challenge walkthrough (WhiteRabbit, MadHatter, Duchess) - Offensive Research (philkeeble.com)](https://philkeeble.com/automation/cicd/CICD-Goat-Walkthrough-Part-1/) 13 | - [LOTP - Living Off the Pipeline (boostsecurityio.github.io)](https://boostsecurityio.github.io/lotp/) 14 | - [Git-Rotate: Leveraging GitHub Actions to Bypass Microsoft Entra Smart lockout · Aura Research Division (aurainfosec.io)](https://research.aurainfosec.io/pentest/git-rotate/) 15 | - [Poisoned Pipeline Execution Attacks: A Look at CI-CD… | Bishop Fox](https://bishopfox.com/blog/poisoned-pipeline-attack-execution-a-look-at-ci-cd-environments?utm_source=tldrsec.com&utm_medium=referral&utm_campaign=tl-dr-sec-224-google-on-beyondcorp-threat-modeling-aws-cross-account-attacks) 16 | - [Playing with Fire – How We Executed a Critical Supply Chain Attack on PyTorch – John Stawinski IV](https://johnstawinski.com/2024/01/11/playing-with-fire-how-we-executed-a-critical-supply-chain-attack-on-pytorch/) 17 | -------------------------------------------------------------------------------- /custom_theme/main.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {%- block site_meta %} 3 | 4 | {{ super() }} 5 | 6 | {%- endblock %} 7 | 8 | {% block extrahead %} 9 | {% set title = config.site_name %} 10 | {% if page and page.meta and page.meta.title %} 11 | {% set title = title ~ " - " ~ page.meta.title %} 12 | {% elif page and page.title and not page.is_homepage %} 13 | {% set title = title ~ " - " ~ page.title %} 14 | {% endif %} 15 | 16 | 17 | 18 | 19 | 20 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | {% endblock %} 37 | 38 | 39 | {% block libs %} 40 | {{ super() }} 41 | 43 | 44 | 45 | {% endblock %} 46 | 47 | {% block content %} 48 |
49 | 50 | 51 | 52 | 59 | 60 | 61 | {{ super() }} 62 | {% endblock %} 63 | 64 | 65 | -------------------------------------------------------------------------------- /custom_theme/assets/particles.json: -------------------------------------------------------------------------------- 1 | { 2 | "particles": { 3 | "number": { 4 | "value": 20, 5 | "density": { 6 | "enable": true, 7 | "value_area": 800 8 | } 9 | }, 10 | "color": { 11 | "value": "#ffffff" 12 | }, 13 | "shape": { 14 | "type": "circle", 15 | "stroke": { 16 | "width": 0, 17 | "color": "#000000" 18 | }, 19 | "polygon": { 20 | "nb_sides": 5 21 | }, 22 | "image": { 23 | "src": "img/github.svg", 24 | "width": 100, 25 | "height": 100 26 | } 27 | }, 28 | "opacity": { 29 | "value": 0.3867006542343723, 30 | "random": false, 31 | "anim": { 32 | "enable": false, 33 | "speed": 0.1, 34 | "opacity_min": 0.1, 35 | "sync": false 36 | } 37 | }, 38 | "size": { 39 | "value": 3, 40 | "random": true, 41 | "anim": { 42 | "enable": false, 43 | "speed": 40, 44 | "size_min": 0.1, 45 | "sync": false 46 | } 47 | }, 48 | "line_linked": { 49 | "enable": true, 50 | "distance": 150, 51 | "color": "#FFFFFF", 52 | "opacity": 0.4, 53 | "width": 1 54 | }, 55 | "move": { 56 | "enable": true, 57 | "speed": 3, 58 | "direction": "none", 59 | "random": false, 60 | "straight": false, 61 | "out_mode": "out", 62 | "bounce": false, 63 | "attract": { 64 | "enable": false, 65 | "rotateX": 600, 66 | "rotateY": 1200 67 | } 68 | } 69 | }, 70 | "interactivity": { 71 | "detect_on": "window", 72 | "events": { 73 | "onhover": { 74 | "enable": true, 75 | "mode": "repulse" 76 | }, 77 | "onclick": { 78 | "enable": false, 79 | "mode": "push" 80 | }, 81 | "resize": true 82 | }, 83 | "modes": { 84 | "grab": { 85 | "distance": 400, 86 | "line_linked": { 87 | "opacity": 1 88 | } 89 | }, 90 | "bubble": { 91 | "distance": 400, 92 | "size": 40, 93 | "duration": 2, 94 | "opacity": 8, 95 | "speed": 1 96 | }, 97 | "repulse": { 98 | "distance": 200, 99 | "duration": 0.4 100 | }, 101 | "push": { 102 | "particles_nb": 4 103 | }, 104 | "remove": { 105 | "particles_nb": 2 106 | } 107 | } 108 | }, 109 | "retina_detect": true 110 | } -------------------------------------------------------------------------------- /docs/AI & LLMS.md: -------------------------------------------------------------------------------- 1 | # AI & LLMS 2 | 3 | ## Use cases & Tooling 4 | ### Coding Assistants 5 | - [AI Code Generator - Amazon CodeWhisperer - AWS](https://aws.amazon.com/codewhisperer/) 6 | - [GitHub Copilot X: The AI-powered developer experience | The GitHub Blog](https://github.blog/2023-03-22-github-copilot-x-the-ai-powered-developer-experience/) 7 | 8 | ### Image Generation 9 | - [Midjourney](https://www.midjourney.com/home/?callbackUrl=%2Fapp%2F) 10 | 11 | ### Misc 12 | - [GitHub - Significant-Gravitas/Auto-GPT: An experimental open-source attempt to make GPT-4 fully autonomous.](https://github.com/Significant-Gravitas/Auto-GPT) 13 | - [GitHub - referefref/gitdoorcheck: Static code analyser for backdoors and malicious code in git repos using OpenAI compatible LLM APIs](https://github.com/referefref/gitdoorcheck?utm_source=tldrsec.com&utm_medium=referral&utm_campaign=tl-dr-sec-222-nsa-s-top-10-cloud-security-strategies-secure-by-design-claude-3-fuzzing) 14 | 15 | ### Deepfake 16 | - [GitHub - sensity-ai/dot: The Deepfake Offensive Toolkit](https://github.com/sensity-ai/dot) 17 | 18 | ## Blogs 19 | - [Foundation Model 101 — Is Large Context Window A Trend? | by Chelsy Ma | Medium](https://medium.com/@machangsha/foundation-model-101-is-large-context-window-a-trend-22e352201099#:~:text=The%20context%20window%20of%20large,when%20generating%20responses%20to%20prompts.) 20 | 21 | ## Attacking LLMS 22 | - [OWASP-Top-10-for-LLMs-2023-v09.pdf](https://owasp.org/www-project-top-10-for-large-language-model-applications/assets/PDF/OWASP-Top-10-for-LLMs-2023-v09.pdf) 23 | - [Hacking Artificial Intelligence - YouTube](https://www.youtube.com/playlist?list=PLhixgUqwRTjzerY4bJgwpxCLyfqNYwDVB) 24 | - [Hugging Face works with Wiz to strengthen AI cloud security | Wiz Blog](https://www.wiz.io/blog/wiz-and-hugging-face-address-risks-to-ai-infrastructure) 25 | - [ChatGPT Account Takeover - Wildcard Web Cache Deception | Harel Security Research (nokline.github.io)](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html) 26 | - [Analyzing AI Application Threat Models | NCC Group Research Blog | Making the world safer and more secure](https://research.nccgroup.com/2024/02/07/analyzing-ai-application-threat-models/) 27 | - [Web LLM attacks | Web Security Academy (portswigger.net)](https://portswigger.net/web-security/llm-attacks) 28 | - [TensorFlow Threat Model and Security Guidelines Update - Google Bug Hunters](https://bughunters.google.com/blog/5160301538967552/tensorflow-threat-model-and-security-guidelines-update) 29 | - [GitHub - BishopFox/llm-testing-findings: LLM Testing Findings Templates](https://github.com/BishopFox/llm-testing-findings) -------------------------------------------------------------------------------- /docs/pentest/Mobile Application Testing/Xamarin - Android.md: -------------------------------------------------------------------------------- 1 | # Xamarin - Android 2 | 3 | ## Reverse Engineering 4 | 1. Unpack the apk 5 | ```bash 6 | apktool b com.vulnapp.apk 7 | ``` 8 | 2. Inside the unkown assemblies folder use [tools/Xamarin_XALZ_decompress.py at master · x41sec/tools · GitHub](https://github.com/x41sec/tools/blob/master/Mobile/Xamarin/Xamarin_XALZ_decompress.py) to parse the headers from XLZ to PE so you can decrypt it with DnSpy 9 | 10 | 11 | ## Traffic Interception 12 | ### One technique to rule them all 13 | > AVD does not utilise the built in proxy settings of Android Devices, it utilises some magic under the hood to proxy traffic. **Works on non-proxy aware applications** 14 | 1. Set up an Pixel 3a XL android emulated device (needs to have SDK < 29). 15 | 2. Use Android Studio Virtual Device Manager with the following command line args. 16 | 3. Drag and drop the APK to the device to install it. 17 | 4. Install burp certificate on the device by following the guide: https://secabit.medium.com/how-to-configure-burp-proxy-with-an-android-emulator-31b483237053 18 | ```powershell 19 | # -list-avds : List virtual devices 20 | C:\Users\Karim\AppData\Local\Android\Sdk\emulator\emulator.exe -list-avds 21 | 22 | 23 | # --writeable : start as root 24 | # --http-proxy 25 | C:\Users\Karim\AppData\Local\Android\Sdk\emulator\emulator.exe -avd 'Pixel_3a_XL_API_28' -http-proxy 127.0.0.1:8080 -writable-system 26 | ``` 27 | 28 | Alternatively, if the device requires Google Play services: 29 | 1. Root an Android build with Google Play services using [GitHub - newbit1/rootAVD: Script to root AVDs running with QEMU Emulator from Android Studio](https://github.com/newbit1/rootAVD) 30 | 2. Follow the same steps described above, but don't use the `-writable-system` flag when starting the device. 31 | 32 | ### Intercept Traffic using tooling 33 | - Use [ProxyDroid – Apps on Google Play](https://play.google.com/store/apps/details?id=org.proxydroid&hl=en_GB&gl=US) and Burp NoPE 34 | - [Intercepting Non-HTTP Request Using Burp Suite + Extension (NoPE Proxy) | by #Ujan | Medium](https://medium.com/@juan.tirtayana/intercepting-non-http-request-using-burp-suite-extension-8c264b3c41d1) 35 | ### SSL Unpinning 36 | - [GoSecure/frida-xamarin-unpin: A Frida script to bypass Xamarin certificate pinning implementations (github.com)](https://github.com/GoSecure/frida-xamarin-unpin) 37 | 38 | ## Resources 39 | - [Intercepting Xamarin Mobile App Traffic (triskelelabs.com)](https://www.triskelelabs.com/blog/intercepting-xamarin-mobile-app-traffic-2) 40 | - https://deepsec.net/docs/Slides/2021/Intercepting_Mobile_App_Network_Traffic_aka_%E2%80%9CThe_Squirrel_in_the_Middle%E2%80%9D_Sven_Schleier%20.pdf 41 | - [Invisible proxying - PortSwigger](https://portswigger.net/burp/documentation/desktop/tools/proxy/invisible) 42 | - [GitHub - helviojunior/xamarin_sslunpinning](https://github.com/helviojunior/xamarin_sslunpinning) 43 | - [GitHub - GoSecure/frida-xamarin-unpin: A Frida script to bypass Xamarin certificate pinning implementations](https://github.com/GoSecure/frida-xamarin-unpin) 44 | - [How To Capture Non-Proxy Aware Mobile Application Traffic (IOS & Android) Xamarin/Flutter -Pentesting | by salman syed | Medium](https://slmnsd552.medium.com/how-to-capture-non-proxy-aware-mobile-application-traffic-ios-android-xamarin-flutter-924fe044facf) -------------------------------------------------------------------------------- /docs/pentest/Mobile Application Testing/Apache Cordova.md: -------------------------------------------------------------------------------- 1 | # Apache Cordova 2 | ## Basics 3 | - [Effortless Pentesting of Apache Cordova Applications - Payatu](https://payatu.com/blog/effortless-pentesting-of-apache-cordova-applications/) 4 | ## Config 5 | After unpacking the apk, the apache Cordova config file is located in `./res/xml/config.xml` . 6 | ## Local Storage 7 | Cordova uses [google/leveldb](https://github.com/google/leveldb) for Local Storage of data. On Android, LevelDB is located at `/data/data//app_webview/Default/Local\ Storage/leveldb/Storage/leveldb/` 8 | ## Remote Debugging Cordova Apps in Chrome 9 | 1. Hook `android.webkit.WebView` to enable debugging 10 | 2. Create a frida script to patch WebViews to be debuggable. 11 | ```js 12 | Java.perform(function () { 13 | var Webview = Java.use("android.webkit.WebView") 14 | Webview.loadUrl.overload("java.lang.String").implementation = function (url) { 15 | console.log("\n[+]Loading URL from", url); 16 | console.log("[+]Setting the value of setWebContentsDebuggingEnabled() to TRUE"); 17 | this.setWebContentsDebuggingEnabled(true); 18 | this.loadUrl.overload("java.lang.String").call(this, url); 19 | } 20 | }); 21 | ``` 22 | 3. Start the application with hooking in place 23 | `frida -U -l hookWebViews.js -f ` 24 | 5. Inside chrome, navigate to `chrome://inspect` 25 | 26 | From: [Debugging Cordova Applications (appknox.com)](https://www.appknox.com/security/debugging-cordova-applications) 27 | 28 | ## Checklist 29 | - [ ] Check JavaScript includes and iframes for resources fetched remotely[^1] 30 | - [ ] HSTS configured? 31 | - [ ] CSP Policy? 32 | - [ ] Are allows lists enabled? [^4] 33 | - [ ] Overly permissive origin allow list? 34 | - [ ] Network Request Allow List? 35 | - [ ] Navigation Allow List? 36 | - [ ] Intent Allow List? 37 | - [ ] Is data encrypted at rest? [^2] 38 | - [ ] Is InAppBrowser used to render links outside of the website [^3] 39 | - [ ] is Certificate pinning implemented? 40 | - [ ] Check for traditional SSL Issues [^3] 41 | - [ ] is RootDetection implemented? 42 | - [ ] Check for XSS issues. Cordova translates JavaScript calls to native Android Calls. XSS in a Cordova app could lead to a complete compromise of the application. 43 | - [ ] Check for un-safe use of eval in custom code 44 | - [ ] Check Installed Plugins 45 | 46 | ## Resources 47 | - [Security problems of Apache Cordova - steal the entire contents of the phone's memory card with one XSS - research.securitum.com](https://research.securitum.com/security-problems-of-apache-cordova-steal-the-entire-contents-of-the-phone_s-memory-card-with-one-xss/) 48 | - [cordova-docs/cordova-security-data.md at master · MicrosoftDocs/cordova-docs · GitHub](https://github.com/MicrosoftDocs/cordova-docs/blob/master/articles/cordova-security/cordova-security-data.md) 49 | 50 | [^1]: [Security problems of Apache Cordova - steal the entire contents of the phone's memory card with one XSS - research.securitum.com](https://research.securitum.com/security-problems-of-apache-cordova-steal-the-entire-contents-of-the-phone_s-memory-card-with-one-xss/) 51 | [^2]: [cordova-docs/cordova-security-data.md at master · MicrosoftDocs/cordova-docs · GitHub](https://github.com/MicrosoftDocs/cordova-docs/blob/master/articles/cordova-security/cordova-security-data.md) 52 | [^3]: [Security Guide - Apache Cordova](https://cordova.apache.org/docs/en/11.x/guide/appdev/security/) 53 | [^4]: [Allow List Guide - Apache Cordova](https://cordova.apache.org/docs/en/11.x/guide/appdev/allowlist/index.html) -------------------------------------------------------------------------------- /docs/pentest/Web Application testing/Salesforce Testing.md: -------------------------------------------------------------------------------- 1 | # Salesforce Testing 2 | ## Testing Write-ups 3 | - [Pen-Testing Salesforce Apps: Part 1 (Concepts) | by Praveen Kanniah | InfoSec Write-ups (infosecwriteups.com)](https://infosecwriteups.com/in-simple-words-pen-testing-salesforce-saas-application-part-1-the-essentials-ffae632a00e5) 4 | - [Pen-Testing Salesforce Apps: Part 2 (Fuzz & Exploit) | by Praveen Kanniah | InfoSec Write-ups (infosecwriteups.com)](https://infosecwriteups.com/in-simple-words-pen-testing-salesforce-saas-application-part-2-fuzz-exploit-eefae11ba5ae) 5 | - [Hacking Salesforce-backed WebApps - Hypn.za.net](https://www.hypn.za.net/blog/2022/11/12/Hacking-Salesforce-backed-WebApps/) 6 | - [Abusing Privilege Escalation in Salesforce Using APEX (cloudsecurityalliance.org)](https://cloudsecurityalliance.org/blog/2020/07/16/abusing-privilege-escalation-in-salesforce-using-apex/) 7 | - [Salesforce Lightning - An in-depth look at exploitation vectors for the everyday community - Enumerated - gigminds](https://blog.gigminds.com/salesforce-lightning-an-in-depth-look-at-exploitation-vectors-for-the-everyday-community-enumerated_1602201600000/) 8 | 9 | ## Code analysis Checklist 10 | - [ ] Search for SOQL Injection using the following regex 11 | ```regex 12 | \[.*SELECT.**[+] .* 13 | ``` 14 | - [ ] Search for unsanitized rendered output, look for 15 | ``` 16 | escape="false" 17 | ``` 18 | Reference: [apex:outputText escape="false“ keyword by passing Security ? - Salesforce Developer Community](https://developer.salesforce.com/forums/?id=9062I000000IRXaQAO) 19 | - [ ] Check if developer console is accessible 20 | ```http 21 | https://.my.salesforce.com/_ui/common/apex/debug/ApexCSIPage 22 | ``` 23 | 24 | - [ ] Abuse `search in files` functionality to leak source code, passwords, tokens, etc. 25 | - [ ] SOQL Queries to leak data that might not be accessible and protected by Apex classes sharing permissions. 26 | 27 | ## Tools 28 | - [Ophion-Security/sret: Salesforce Recon and Exploitation Toolkit (github.com)](https://github.com/Ophion-Security/sret) 29 | - [moniik/poc_salesforce_lightning: Academic purposes only. Attack against 30 | Salesforce lightning with guest privilege. (github.com)](https://github.com/moniik/-poc_salesforce_lightning) 31 | 32 | ## VSCode 33 | - [Salesforce Extension Pack (Expanded) - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=salesforce.salesforcedx-vscode-expanded) 34 | - [Set Up Visual Studio Code Unit | Salesforce Trailhead](https://trailhead.salesforce.com/content/learn/projects/quick-start-lightning-web-components/set-up-visual-studio-code) 35 | 36 | ## Learning Resources 37 | - [Access Modifiers | Apex Developer Guide | Salesforce Developers](https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_classes_access_modifiers.htm) 38 | - [Using the with sharing, without sharing, and inherited sharing Keywords | Apex Developer Guide | Salesforce Developers](https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_classes_keywords_sharing.htm) 39 | - [Understanding With Sharing and Without Sharing In Salesforce - Brian Cline (brcline.com)](https://www.brcline.com/blog/understanding-with-sharing-and-without-sharing-in-salesforce) 40 | - [Salesforce DX - App Cloud for Developers - Salesforce India](https://www.salesforce.com/in/products/platform/products/salesforce-dx/) 41 | 42 | ## Interesting reads 43 | [VF Remoting Exploit - Salesforce Developer Community](https://developer.salesforce.com/forums/?id=9062I000000XvqIQAS) 44 | ## Burp Extensions 45 | - [GitHub - akenofu/lightning-burp](https://github.com/akenofu/lightning-burp) 46 | ## Tips and tricks 47 | - Look at the security settings page -------------------------------------------------------------------------------- /docs/IAM, AuthN & AuthZ.md: -------------------------------------------------------------------------------- 1 | # IAM, AuthN & AuthZ 2 | ## IAM 3 | ### Enforcing least privilege 4 | - [Access: A New Portal for Managing Internal Authorization (discord.com)](https://discord.com/blog/access-a-new-portal-for-managing-internal-authorization?utm_source=tldrsec.com&utm_medium=referral&utm_campaign=tl-dr-sec-225-xz-backdoor-github-cso-interview-specterops-con) A premier on authorization and access management 5 | - The product we ended up using should be designed to decrease risks associated with long-standing, elevated, and sometimes no-longer-needed permissions to protect our systems and customer data. 6 | 7 | - **We wanted an intuitive user experience that didn’t require staff to have deep knowledge of the access control tool or the systems being managed**. This would help ensure the tool’s adoption within the company 8 | 9 | - team members likely would not have enough context to make informed decisions about access and end up ‘rubber stamping’ requests. By delegating access approvals to application owners and people leads with the most understanding about the application or role and permissions being requested, we could reduce risk while distributing the load. 10 | 11 | - Users should be able to see what access they or their teammates have, what resources are controlled by the system, what permissions they had in the past but have since expired, and they should be able to request access to resources freely. This would empower employees to troubleshoot their own permissions and solve issues through access requests. 12 | ### Fundamentals 13 | - [What is an identity provider (IdP)? | Cloudflare](https://www.cloudflare.com/en-gb/learning/access-management/what-is-an-identity-provider/) 14 | - [What is identity and access management (IAM)? | Cloudflare](https://www.cloudflare.com/en-gb/learning/access-management/what-is-identity-and-access-management/) 15 | - [What is Identity Access Management (IAM)? | Microsoft Security](https://www.microsoft.com/en-gb/security/business/security-101/what-is-identity-access-management-iam#:~:text=Identity%20and%20access%20management%20is,who%20need%20access%20have%20access.) 16 | - [What Is Attribute-Based Access Control (ABAC)? | Okta](https://www.okta.com/blog/2020/09/attribute-based-access-control-abac/) 17 | - [RBAC vs. ABAC: Definitions & When to Use | Okta](https://www.okta.com/identity-101/role-based-access-control-vs-attribute-based-access-control/) 18 | 19 | ## AuthN & AuthZ 20 | ### Kerberos 21 | - [Quick Overview of Kerberos Authentication | by Nairuz Abulhul | R3d Buck3T | Medium](https://medium.com/r3d-buck3t/quick-overview-of-kerberos-authentication-318f4918b15) 22 | ![](/Screenshots/Pasted%20image%2020230910194154.png) 23 | > Note that the account passwords in the previous diagram refers to the NTLM hash of the user password, not the clear-text password - as those are not stored on-desk in clear-text. 24 | ### SAML 25 | - [What is SAML and how does SAML Authentication Work (auth0.com)](https://auth0.com/blog/how-saml-authentication-works/) 26 | - [SAML AuthnRequest Examples | SAMLTool.com](https://www.samltool.com/generic_sso_req.php) 27 | 28 | ![](/Screenshots/Pasted%20image%2020230910181425.png) 29 | 30 | ### OAuth 31 | - [OAuth grant types | Web Security Academy (portswigger.net)](https://portswigger.net/web-security/oauth/grant-types) 32 | - [What are the trade-offs between implicit grant flow and authorization code flow? (linkedin.com)](https://www.linkedin.com/advice/0/what-trade-offs-between-implicit-grant-flow-authorization) 33 | #### Authorization Code Grant 34 | ![](/Screenshots/Pasted%20image%2020230910183343.png) 35 | #### Implicit Grant 36 | ![](/Screenshots/Pasted%20image%2020230910183410.png) 37 | ### Resources 38 | - [Things to Know about Authentication/Authorization protocols! | by umang goel | Medium](https://medium.com/@surfd1001/things-to-know-about-authentication-authorization-protocols-addff3654d97) 39 | 40 | -------------------------------------------------------------------------------- /docs/pentest/Mobile Application Testing/Xamarin - iOS.md: -------------------------------------------------------------------------------- 1 | # Xamarin - iOS 2 | ## Hooking 3 | - [A brief on AOT Compiled iOS Xamarin Apps - Hacking Xamarin Apps on iOS (appknox.com)](https://www.appknox.com/security/hacking-xamarin-apps-on-ios) 4 | - [Notes From Reverse Engineering A Mono AOT Compiled App On iOS | Rafael Rivera (withinrafael.com)](https://withinrafael.com/2019/07/09/notes-from-reverse-engineering-a-mono-aot-compiled-app-on-ios/) 5 | ## Traffic Interception 6 | ### Resources 7 | - [Intercepting Xamarin Mobile App Traffic (triskelelabs.com)](https://www.triskelelabs.com/blog/intercepting-xamarin-mobile-app-traffic-2#:~:text=For%20an%20attacker%20to%20intercept,settings%20to%20use%20this%20proxy.) **(Recommended)** 8 | - [Capturing HTTP Requests from a non-proxy-aware Mobile Application | bhavukjain1](https://bhavukjain.com/blog/2023/02/19/capturing-requests-non-proxy-aware-application) 9 | - [SSL Pinning Bypass for Android & iPhone Users | Appknox](https://www.appknox.com/blog/bypass-ssl-pinning-in-ios-app) 10 | 11 | The following is outdated, but I opted to keep it in the notes for reference: 12 | - [How To Capture Non-Proxy Aware Mobile Application Traffic (IOS & Android) Xamarin/Flutter -Pentesting | by salman syed | Medium](https://slmnsd552.medium.com/how-to-capture-non-proxy-aware-mobile-application-traffic-ios-android-xamarin-flutter-924fe044facf) 13 | More on IP tables at: 14 | - [iptables Demystified - Port Redirection and Forwarding HTTP Traffic to another machine (part 1) - YouTube](https://www.youtube.com/watch?v=NAdJojxENEU) 15 | ### Steps 16 | 1. Follow the steps in the [How To Capture Non-Proxy Aware Mobile Application Traffic (IOS & Android) Xamarin/Flutter -Pentesting | by salman syed | Medium](https://slmnsd552.medium.com/how-to-capture-non-proxy-aware-mobile-application-traffic-ios-android-xamarin-flutter-924fe044facf) blog to set up OpenVPN. 17 | > Ensure OpenVPN is set to use TCP 18 | 3. Delete all `iptable` rules, refer to [iptables(8) - Linux man page (die.net)](https://linux.die.net/man/8/iptables) for full context. 19 | ```bash 20 | # Flush filter rules i.e: FOWARD, INPUT, OUTPUT 21 | iptables -F 22 | 23 | # Allow all inbound traffic 24 | sudo iptables -P INPUT ACCEPT 25 | sudo iptables -P OUTPUT ACCEPT 26 | sudo iptables -P FORWARD ACCEPT 27 | 28 | # [optional] Get NAT rule number 29 | sudo iptables -t nat -v -L -n --line-number 30 | 31 | # [optional] Flush nat rule i.e: PREROUTING, POSTROUTING 32 | sudo iptables -t nat -D PREROUTING 33 | ``` 34 | 3. Route traffic from your VPN interface and redirect to your host (Burp Suite) 35 | ```bash 36 | # To forward to local port 8888 37 | iptables -t nat -A PREROUTING -i tun0 -p tcp --dport 443 -j REDIRECT --to-port 8888 38 | 39 | # [optional] if you delete OpenVPN's NATing rule by accident, restore it with 40 | sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o ens33 -j MASQUERADE # , where ens33 is the interface connected to the internet 41 | ``` 42 | 4. Enable IP Forwarding 43 | ```bash 44 | # Enable 45 | sysctl -w net.ipv4.ip_forward=1 46 | 47 | # [optional] Validate it works 48 | cat /proc/sys/net/ipv4/ip_forward 49 | ``` 50 | > If you don't see traffic in Burp, checkout Burp's Dashboard - sometimes it's an SSL pinning issue. 51 | > ![](/Screenshots/Pasted%20image%2020230803164141.png) 52 | 53 | ### Bypass SSL pinning 54 | - Login to the application without intercepting the traffic 55 | - Download Burp Certificate by navigating to `http://burp:8080`. 56 | - Find the Bundle path on the device using objection 57 | ![](/Screenshots/Pasted%20image%2020230804155041.png) 58 | - Find the certificate using `find` and `grep` 59 | ```bash 60 | find . | grep -E "cer|der" 61 | ``` 62 | ![](/Screenshots/Pasted%20image%2020230804155700.png) 63 | - Replace the certificate with Burp's certificate. You may need to convert `der` certificate format to `.cer`. To do so, follow this blog: [Install Burpsuite’s or any CA certificate to system store in Android 10,11 and Kali linux. | by n00🔑 | Medium](https://pswalia2u.medium.com/install-burpsuites-or-any-ca-certificate-to-system-store-in-android-10-and-11-38e508a5541a) -------------------------------------------------------------------------------- /docs/pentest/Web Application testing/OSINT.md: -------------------------------------------------------------------------------- 1 | # OSINT 2 | ## Asset Discovery & Reconnaissance 3 | ### Manual Techniques 4 | - Scrap Stackoverflow posts for secrets: 5 | [ Stack Exchange Data Dump ](https://archive.org/details/stackexchange) 6 | [Baking Flask cookies with your secrets](https://blog.paradoxis.nl/defeating-flasks-session-management-65706ba9d3ce) 7 | - Search the internet: Google, Shodan, GitHub, APIs.Guru and ProgrammableWeb 8 | - Google Dorking 9 | [Google Hacking Database (GHDB) - Google Dorks, OSINT, Recon (exploit-db.com)](https://www.exploit-db.com/google-hacking-database) 10 | - Search GitHub: 11 | - API Keys 12 | - Pull Requests 13 | - Issues 14 | - Fingerprint TLS using JARM 15 | - [JARM: A Solid Fingerprinting Tool for Detecting Malicious Servers ](https://securitytrails.com/blog/jarm-fingerprinting-tool) 16 | - [D2 COMMSEC - JARM Randomizer Evading JARM Fingerprinting](https://conference.hitb.org/hitbsecconf2021ams/materials/D2%20COMMSEC%20-%20JARM%20Randomizer%20Evading%20JARM%20Fingerprinting%20-%20Dagmawi%20Mulugeta.pdf) 17 | - [Identify Domains registered by a person](https://www.labnol.org/internet/find-websites-of-someone/20550/) 18 | - Reverse Whois Lookups with Google 19 | - Perform Reverse IP Lookups 20 | - Reverse Google AdSense Lookups 21 | - Reverse Google Analytics Lookups 22 | - Reverse Google tag lookup 23 | ### Tools 24 | #### Recon Domains 25 | - [OSINT.SH - All in one Information Gathering Tools](https://osint.sh/) 26 | - [Search for a list of websites by content inside their HTML such as: google tag ID, ad sense ID, etc. - NerdyData]([Search for a list of G-LJTF7R1QRG websites - NerdyData](https://www.nerdydata.com/reports/new?search={%22all%22:[{%22type%22:%22code%22,%22value%22:%22G-LJTF7R1QRG%22}],%22any%22:[],%22none%22:[]})) 27 | - [DNSdumpster.com - dns recon and research, find and lookup dns records](https://dnsdumpster.com/) 28 | - [GitHub - edoardottt/csprecon: Discover new target domains using Content Security Policy](https://github.com/edoardottt/csprecon?utm_source=tldrsec.com&utm_medium=referral&utm_campaign=tl-dr-sec-225-xz-backdoor-github-cso-interview-specterops-con) 29 | - [GitHub - g0ldencybersec/gungnir: A Golang CLI tool for continuously monitoring certificate transparency (CT) logs for newly issued SSL/TLS certificates. Supports filtering down to monitor specific root domains.](https://github.com/g0ldencybersec/gungnir?utm_source=tldrsec.com&utm_medium=referral&utm_campaign=tl-dr-sec-225-xz-backdoor-github-cso-interview-specterops-con) 30 | - [GitHub - yousseflahouifi/moniorg: moniorg is a tool that leverages crt.sh website to monitor domains of a target](https://github.com/yousseflahouifi/moniorg?utm_source=tldrsec.com&utm_medium=referral&utm_campaign=tl-dr-sec-225-xz-backdoor-github-cso-interview-specterops-con) 31 | #### Recon URLS 32 | - [GitHub - lc/gau: Fetch known URLs from AlienVault's Open Threat Exchange, the Wayback Machine, and Common Crawl.](https://github.com/lc/gau) 33 | - [GitHub - projectdiscovery/katana: A next-generation crawling and spidering framework.](https://github.com/projectdiscovery/katana) 34 | #### Multi purpose Recon Tools 35 | - [six2dez/reconftw: reconFTW is a tool designed to perform automated recon on a target domain ](https://github.com/six2dez/reconftw) 36 | - [yogeshojha/rengine: reNgine is an automated reconnaissance framework for web applications ](https://github.com/yogeshojha/rengine) 37 | - [OWASP/Amass: In-depth Attack Surface Mapping and Asset Discovery (github.com)](https://github.com/OWASP/Amass) 38 | - [darkoperator/dnsrecon: DNS Enumeration Script (github.com)](https://github.com/darkoperator/dnsrecon) 39 | - [pry0cc/axiom:Distribute the workload of many different scanning tools with ease, including nmap, ffuf, masscan, nuclei, meg and many more! (github.com)](https://github.com/pry0cc/axiom) 40 | 41 | ### Cheatsheet 42 | ```bash 43 | dnsrecon -d facebook.com -r 157.240.221.35/24 #Using facebooks dns 44 | dnsrecon -r 157.240.221.35/24 -n 8.8.8.8 #Using google dns 45 | 46 | # Follow the installation instructions in the reconftw wiki to build the image 47 | # -p Passive - Perform only passive steps 48 | # -n OSINT - Performs an OSINT scan (no subdomain enumeration and attacks) 49 | # -s Subdomains - Perform only subdomain enumeration, web probing, subdomain takeovers 50 | sudo docker run -it --rm -v "${PWD}/reconftw.cfg":'/reconftw/reconftw.cfg' -v "${PWD}/Recon/":'/reconftw/Recon/' -l /reconftw/Recon/domains.txt -spn -o /reconftw/Recon/output 51 | 52 | 53 | python3 cloud_enum.py -k -t 10 54 | 55 | python3.11 theHarvester.py -d -b all 56 | ``` -------------------------------------------------------------------------------- /docs/Cloud/Azure Assessment Checklist.md: -------------------------------------------------------------------------------- 1 | # Azure Assessment Checklist 2 | ## Manual Checks 3 | - Check domains for subdomain takeovers 4 | - [Prevent subdomain takeovers with Azure DNS alias records and Azure App Service's custom domain verification | Microsoft Learn](https://learn.microsoft.com/en-us/azure/security/fundamentals/subdomain-takeover) 5 | - Check for Azure resources using released elastic IPs 6 | - [Monitoring Your Assets in the Face of Emerging Cloud-Squatting Attacks | TikTok for Developers](https://developers.tiktok.com/blog/cloudsquatting-attack-explanation-and-mitigation-system-design) 7 | - Check for applications loading resources that are no longer controlled by us 8 | - [Monitoring Your Assets in the Face of Emerging Cloud-Squatting Attacks | TikTok for Developers](https://developers.tiktok.com/blog/cloudsquatting-attack-explanation-and-mitigation-system-design) 9 | - Check for App Service Redirect URI takeover 10 | - [Azure Redirect URI Takeover Vulnerability | Secureworks](https://www.secureworks.com/research/azure-redirect-uri-takeover-vulnerability) 11 | - Check Function/Logic apps for second order SQLi and not so subtle bugs 12 | - Check teams and internal wiki for secrets 13 | - Check SharePoint sites and their security settings 14 | - Check Azure DevOps for CI/CD attacks 15 | - Map resources that are use by both production and test environments; These could be a security issue as the environments are not isolated enough - lateral movement may be possible. 16 | - Check Microsoft SharePoint sites, teams and OneDrive settings for guest users 17 | [Governance of Teams guest users - Azure Architecture Center | Microsoft Learn](https://learn.microsoft.com/en-us/azure/architecture/example-scenario/governance/governance-teams-guest-users) 18 | - Review conditional Access Policy from Entra Id 19 | - [What is Conditional Access in Microsoft Entra ID? - Microsoft Entra ID | Microsoft Learn](https://learn.microsoft.com/en-us/entra/identity/conditional-access/overview) 20 | - If not set, is device code phishing applicable? [Protect your users from Device Code Flow abuse - Cloudbrothers](https://cloudbrothers.info/en/protect-users-device-code-flow-abuse/) 21 | - Review public blob storage in a public storage account that has everything else as private 22 | - Review who has access to BitLocker keys (Help Desk Support, Security Readers, etc...) 23 | - Check for overly-permissive consent settings in https://entra.microsoft.com/#view/Microsoft_AAD_IAM/ConsentPoliciesMenuBlade/~/UserSettings. 24 | - Check for overly-permissive guest settings in https://entra.microsoft.com/#view/Microsoft_AAD_UsersAndTenants/UserSettings.ReactView. 25 | 26 | ## Automated Checks: 27 | 28 | - CIS Benchmarks for configuring resources securely, i.e, 29 | - Public Storage Containers 30 | - Overly permissive Network Security Group rules 31 | - Lack of secret vault use and hardcoded secrets 32 | - IAM Misconfigurations 33 | - Check nested business groups 34 | 35 | ** Tools ** 36 | 37 | - [BloodHoundAD/AzureHound: Azure Data Exporter for BloodHound (github.com)](https://github.com/BloodHoundAD/AzureHound) 38 | - [nccgroup/ScoutSuite: Multi-Cloud Security Auditing Tool (github.com)](https://github.com/nccgroup/ScoutSuite) 39 | - [prowler-cloud/prowler: Prowler is an Open Source Security tool for AWS, Azure, GCP)](https://github.com/prowler-cloud/prowler) 40 | #### Useful URLs 41 | 42 | - https://portal.azure.com (Azure) 43 | - https://aad.portal.azure.com/ (Entra ID formerly Azure AD) 44 | - https://portal.office.com/Adminportal/Home (SharePoint Sites) 45 | - https://www.office.com/signin (Office365) 46 | - https://teams.microsoft.com/_?culture=en-us&country=ww (Microsoft Teams) 47 | 48 | ## Enumerate your permissions (The Lazy way) 49 | 1. Checking logged in User's self permissions 50 | 51 | You can ask the relevant user to Log into the Azure portal -> Click on the User logo on the top right corner of the screen -> select the elipsis (...) -> select "My permissions". [![enter image description here](https://i.stack.imgur.com/2dnLb.png)](https://i.stack.imgur.com/2dnLb.png) 52 | This will list all the permissions that user has in the Azure portal. 53 | 54 | 2. Checking Access Control (IAM) in the resource or resource group / subscription level. 55 | 56 | see : [https://learn.microsoft.com/en-us/azure/role-based-access-control/check-access#step-2-check-access-for-a-user](https://learn.microsoft.com/en-us/azure/role-based-access-control/check-access#step-2-check-access-for-a-user) 57 | [![enter image description here](https://i.stack.imgur.com/Rx0V0.png)](https://i.stack.imgur.com/Rx0V0.png) 58 | 59 | 1. Entra ID -> check your groups, check active assignments from the side blade 60 | -------------------------------------------------------------------------------- /docs/appsec/Docker.md: -------------------------------------------------------------------------------- 1 | # Docker 2 | ## Docker Concepts 3 | - [Dockerfile ENTRYPOINT: Everything You Need To Know (kinsta.com)](https://kinsta.com/blog/dockerfile-entrypoint/) 4 | - [Docker image vs container: What are the differences? | CircleCI](https://circleci.com/blog/docker-image-vs-container/#:~:text=An%20image%20is%20a%20snapshot,efficiently%20from%20producer%20to%20consumer.) 5 | - [Running a Docker container as a non-root user | by Lucas Wilson-Richter | Redbubble | Medium](https://medium.com/redbubble/running-a-docker-container-as-a-non-root-user-7d2e00f8ee15) 6 | - [Docker ENTRYPOINT and CMD : Differences & Examples (spacelift.io)](https://spacelift.io/blog/docker-entrypoint-vs-cmd) 7 | - [dockerfile - denied: requested access to the resource is denied: docker - Stack Overflow](https://stackoverflow.com/questions/41984399/denied-requested-access-to-the-resource-is-denied-docker) 8 | - [Static vulnerability scanning | Docker Docs](https://docs.docker.com/docker-hub/vulnerability-scanning/#:~:text=This%20page%20describes%20the%20legacy%20static%20vulnerability%20scanning,requires%20a%20Docker%20Pro%2C%20Team%2C%20or%20Business%20subscription.) 9 | - [Docker Scout | Docker Docs](https://docs.docker.com/scout/) 10 | - [Set up Automated Builds | Docker Docs](https://docs.docker.com/docker-hub/builds/) 11 | ## Docker Fundamentals 12 | - [Lesson 1: Understand Docker from a security perspective - Practical DevSecOps (practical-devsecops.com)](https://www.practical-devsecops.com/lesson-1-understand-docker-from-a-security-perspective/) 13 | - [Lesson 2: Docker Images, Docker Layers, and Registry - Practical DevSecOps (practical-devsecops.com)](https://www.practical-devsecops.com/lesson-2-docker-images-docker-layers-and-registry/) 14 | - [Lesson #3: Container reconnaissance techniques for beginners - Practical DevSecOps (practical-devsecops.com)](https://www.practical-devsecops.com/lesson-3-container-reconnaissance-techniques-for-beginners/) 15 | ## Docker Hacking 16 | - [Lesson 4: Hacking Containers Like A Boss - Practical DevSecOps (practical-devsecops.com)](https://www.practical-devsecops.com/lesson-4-hacking-containers-like-a-boss/) 17 | - [Lesson 5: Hacking Containers Like A Boss - Part 2 - Practical DevSecOps (practical-devsecops.com)](https://www.practical-devsecops.com/lesson-5-hacking-containers-like-a-boss-part-2/) 18 | 19 | ## Docker Hardening 20 | - [Lesson 6: Defending container Infrastructure - Practical DevSecOps (practical-devsecops.com)](https://www.practical-devsecops.com/lesson-6-defending-container-infrastructure/) 21 | 22 | 23 | ## Build Image locally 24 | ```bash 25 | # Build the image 26 | docker build -t : . 27 | 28 | # Build image from file path 29 | docker build -t : -f .\docker\Dockerfile . 30 | ``` 31 | 32 | ## Run images in a docker network 33 | ```bash 34 | # Create docker network 35 | docker network create -d bridge my-nat 36 | 37 | # Run the image in a custom NAT with port mapping and volume mapping 38 | docker run --name=server -p 80:8000 -v $(pwd):/app --network=my-nat -itd build 39 | 40 | # Get a shell on container 41 | docker run -it --network=my-nat test /bin/bash 42 | ``` 43 | ## Push image to Docker Registry 44 | ```bash 45 | # Generate your PAT from https://hub.docker.com/settings/security 46 | docker login -u 47 | 48 | # tag image to dockerhub 49 | # docker tag mylocalimage:latest darlin/dockerhub:myfirstimagepush 50 | docker tag sslyze:1.0 akenofu/sslyze:1.0 51 | 52 | # Push image 53 | # user/image:tag 54 | docker push akenofu/sslyze:1.0 55 | ``` 56 | 57 | ## Fix Docker Security issues 58 | Once a list of vulnerabilities have been identified, there are a couple of actions you can take to remediate the vulnerabilities. For example, you can: 59 | 60 | 1. Specify an updated base image in the Dockerfile, check your application-level dependencies, rebuild the Docker image, and then push the new image to Docker Hub. 61 | 2. Rebuild the Docker image, run an update command on the OS packages, and push a newer version of image to Docker Hub. 62 | 3. Edit the Dockerfile to manually remove or update specific libraries that contain vulnerabilities, rebuild the image, and push the new image to Docker Hub 63 | 64 | Docker Scout can provide you with concrete and contextual remediation steps for improving image security. For more information, see [Docker Scout](https://docs.docker.com/scout/). 65 | ``` 66 | # Display Recommendations 67 | docker scout recommendations 68 | 69 | # Find only high issues in a nice format 70 | docker scout cves --only-severity high --format only-packages --only-vuln-packages akenofu/sslyze:1.0 71 | ``` 72 | CI/CD Integration available at: [GitHub - docker/scout-cli: Docker Scout CLI](https://github.com/docker/scout-cli) -------------------------------------------------------------------------------- /docs/Segmentation Testing.md: -------------------------------------------------------------------------------- 1 | # Segmentation Testing 2 | 3 | ## Introduction 4 | Network segments are now a part of any organization or business’s infrastructure. Network segmentation is the splitting of a computer network within the infrastructure according to business requirements. 5 | 6 | Segmentation of a network serves many purposes. It helps in avoiding congestion in the overall network and isolates crucial segments (those that have critical data) from other segments. Every organization follows their own segmentation process and procedures depending upon their business requirements. 7 | 8 | ## Terms that you need to be aware of 9 | 10 | There are various terms which might confuse us and need to be understood before performing segmentation penetration testing. 11 | 12 | **CDE in-scope**: VLANs which fall under CDE in-scope are the VLANs which store, hold, process and transmit cardholder data. It should be truly isolated from the external world and should have a high level of security on each host that falls under CDE in-scope. 13 | 14 | **Non-CDE in-scope**: VLANs which fall under non-CDE in-scope are the VLANs which do not store, hold, process and transmit cardholder data but having dependencies from CDE in-scope. As we already know that CDE in-scope has the limitation of being not exposed to the external world, non-CDE in-scope provides exclusive services and external resources to CDE in-scope. CDE in-scope has certain dependencies which need to be fulfilled by non-CDE in-scope. For instance, patch servers (from non-CDE in-scope) provide patches and update to CDE in-scope hosts. The antivirus server provides antivirus solutions to CDE in-scope. It truly depends on infrastructure-to-infrastructure and business requirements. 15 | 16 | **Non-CDE out-of-scope**: VLANs which fall under non-CDE out-of-scope are the VLANs which do not store, hold, process and transmit cardholder data and or have any kind of dependencies from CDE in-scope. They should not be allowed to communicate with CDE in-scope in any case. 17 | 18 | ![Pasted image 20210714150824.png](/Screenshots/Pasted%20image%2020210714150824.png) 19 | 20 | ### Example 21 | ![Pasted image 20210714152052.png](/Screenshots/Pasted%20image%2020210714152052.png) 22 | 23 | ## Segmentation penetration testing 24 | Generally, each host in a PCI in-scope segment and all 65535 ports (for TCP and UDP) should be scanned from PCI out-of-scope. It is always considered best practice to initiate the scan in batches, as it is efficient, and we get results more frequently. We should perform the scan from PCI in-scope to PCI out-of-scope and vice versa. 25 | 26 | ```bash 27 | # Grab IP from cmd 28 | ip=`ip a s | grep eth0 | grep inet | grep -oP '[0-9]+[.][0-9]+[.][0-9]+[.][0-9]+/[0-9]' | cut -d "/" -f 1` ; echo $ip 29 | ``` 30 | 31 | ```bash 32 | # My go-to all ports tcp scan 33 | sudo ./nmap -p- -n -v -oN control_10.1.1.2-to-pci_10.1.4.0.nmap -Pn -T4 10.1.4.0/25 --min-rate 10000 34 | 35 | # Nmap All ports 36 | sudo ./nmap -p- -n -v -oN control_10.1.1.2-to-pci_10.1.4.0.nmap -Pn -T4 10.1.4.0/24 37 | 38 | # All ports UDP 39 | sudo nmap -sU -sV -T4 -v -n -Pn –top-ports 10000 -oN udpbatch1intoout.txt -oN udpbatch1intoout.out 10.10.10.1-50 40 | ``` 41 | 42 | ```bash 43 | sudo ./masscan 10.1.4.0/25 --rate 100000 -p 0-65535 --banners -oL $ip-to-pci_10.1.4.0.massscan 44 | ``` 45 | 46 | ### Open|Filtered Ports 47 | ![Pasted image 20210714150123.png](/Screenshots/Pasted%20image%2020210714150123.png) 48 | 49 | If you encounter an `open|filtered` port. Use netcat to connect to the port 50 | `nc 10.130.31.24 3130` 51 | 52 | > Checkout [[Infrastructure Pen test/Port Scan#Manual Firewall Enumeration]] for more how to manually enumerate the firewall using wireshark and netcat. 53 | 54 | ## Deciding out-of scope 55 | Remember that improper scoping (deciding something is out of scope without proper verification) can put a business at risk. To be effective, scoping and segmentation require careful planning, design, implementation, and monitoring. Many compromises have occurred via systems and networks incorrectly determined to be out of scope, where the breached entity placed false reliance on segmentation, only to find out after the breach that those controls were not effectively protecting its networks. It is therefore critical that entities focus on the security of their entire environment rather than solely on what is required by PCI DSS in order to minimize the risks to their organizations 56 | 57 | ## References 58 | [Segmentation penetration testing for PCI compliance - Infosec Resources (infosecinstitute.com)](https://resources.infosecinstitute.com/topic/segmentation-penetration-testing-for-pci-compliance/) 59 | 60 | [Guidance-PCI-DSS-Scoping-and-Segmentation_v1.pdf (pcisecuritystandards.org)](https://www.pcisecuritystandards.org/documents/Guidance-PCI-DSS-Scoping-and-Segmentation_v1.pdf) -------------------------------------------------------------------------------- /docs/.obsidian/workspace.json: -------------------------------------------------------------------------------- 1 | { 2 | "main": { 3 | "id": "bd0233df3464c39b", 4 | "type": "split", 5 | "children": [ 6 | { 7 | "id": "d468d840079657fe", 8 | "type": "tabs", 9 | "children": [ 10 | { 11 | "id": "ebdfb7ec4f4e02c8", 12 | "type": "leaf", 13 | "state": { 14 | "type": "markdown", 15 | "state": { 16 | "file": "README.md", 17 | "mode": "preview", 18 | "source": false 19 | } 20 | } 21 | } 22 | ] 23 | } 24 | ], 25 | "direction": "vertical" 26 | }, 27 | "left": { 28 | "id": "12071816311108fe", 29 | "type": "split", 30 | "children": [ 31 | { 32 | "id": "3587718923c6aaf6", 33 | "type": "tabs", 34 | "children": [ 35 | { 36 | "id": "ca75b9d08412015a", 37 | "type": "leaf", 38 | "state": { 39 | "type": "file-explorer", 40 | "state": { 41 | "sortOrder": "alphabetical" 42 | } 43 | } 44 | }, 45 | { 46 | "id": "e59373f12b968d1a", 47 | "type": "leaf", 48 | "state": { 49 | "type": "search", 50 | "state": { 51 | "query": "", 52 | "matchingCase": false, 53 | "explainSearch": false, 54 | "collapseAll": false, 55 | "extraContext": false, 56 | "sortOrder": "alphabetical" 57 | } 58 | } 59 | }, 60 | { 61 | "id": "49f5244416855d1b", 62 | "type": "leaf", 63 | "state": { 64 | "type": "bookmarks", 65 | "state": {} 66 | } 67 | } 68 | ] 69 | } 70 | ], 71 | "direction": "horizontal", 72 | "width": 300 73 | }, 74 | "right": { 75 | "id": "45510b4a6f75935e", 76 | "type": "split", 77 | "children": [ 78 | { 79 | "id": "92c2a856a48bdb69", 80 | "type": "tabs", 81 | "children": [ 82 | { 83 | "id": "9512dc39c820d7f8", 84 | "type": "leaf", 85 | "state": { 86 | "type": "backlink", 87 | "state": { 88 | "file": "README.md", 89 | "collapseAll": false, 90 | "extraContext": false, 91 | "sortOrder": "alphabetical", 92 | "showSearch": false, 93 | "searchQuery": "", 94 | "backlinkCollapsed": false, 95 | "unlinkedCollapsed": true 96 | } 97 | } 98 | }, 99 | { 100 | "id": "819f43598467301d", 101 | "type": "leaf", 102 | "state": { 103 | "type": "outgoing-link", 104 | "state": { 105 | "file": "README.md", 106 | "linksCollapsed": false, 107 | "unlinkedCollapsed": true 108 | } 109 | } 110 | }, 111 | { 112 | "id": "af7154919073c35c", 113 | "type": "leaf", 114 | "state": { 115 | "type": "tag", 116 | "state": { 117 | "sortOrder": "frequency", 118 | "useHierarchy": true 119 | } 120 | } 121 | }, 122 | { 123 | "id": "a51abda8728f7ce5", 124 | "type": "leaf", 125 | "state": { 126 | "type": "outline", 127 | "state": { 128 | "file": "README.md" 129 | } 130 | } 131 | } 132 | ] 133 | } 134 | ], 135 | "direction": "horizontal", 136 | "width": 300, 137 | "collapsed": true 138 | }, 139 | "left-ribbon": { 140 | "hiddenItems": { 141 | "switcher:Open quick switcher": false, 142 | "graph:Open graph view": false, 143 | "canvas:Create new canvas": false, 144 | "daily-notes:Open today's daily note": false, 145 | "templates:Insert template": false, 146 | "command-palette:Open command palette": false 147 | } 148 | }, 149 | "active": "ebdfb7ec4f4e02c8", 150 | "lastOpenFiles": [ 151 | "Segmentation Testing.md", 152 | "IAM, AuthN & AuthZ.md", 153 | "Pentest/Mobile Application Testing/Xamarin - iOS.md", 154 | "AppSec/Secrets Management.md", 155 | "Cloud/Azure Assessment Checklist.md", 156 | "Pentest/Mobile Application Testing/React Native.md", 157 | "Pentest/Mobile Application Testing/Xamarin - Android.md" 158 | ] 159 | } -------------------------------------------------------------------------------- /docs/appsec/DevSecOps Tooling.md: -------------------------------------------------------------------------------- 1 | # DevSecOps Tooling 2 | ### SAST 3 | - [returntocorp/semgrep: Lightweight static analysis for many languages. Find bug variants with patterns that look like source code. (github.com)](https://github.com/returntocorp/semgrep) 4 | - [GitHub - bridgecrewio/checkov: Prevent cloud misconfigurations and find vulnerabilities during build-time in infrastructure as code, container images and open source packages with Checkov by Bridgecrew.](https://github.com/bridgecrewio/checkov) 5 | - [Code Quality, Security & Static Analysis Tool with SonarQube | Sonar (sonarsource.com)](https://www.sonarsource.com/products/sonarqube/) 6 | - [GitHub - aquasecurity/trivy: Find vulnerabilities, misconfigurations, secrets, SBOM in containers, Kubernetes, code repositories, clouds and more](https://github.com/aquasecurity/trivy) 7 | - [GitHub - tenable/terrascan: Detect compliance and security violations across Infrastructure as Code to mitigate risk before provisioning cloud native infrastructure.](https://github.com/tenable/terrascan) 8 | - [GitHub - aquasecurity/tfsec: Security scanner for your Terraform code](https://github.com/aquasecurity/tfsec) 9 | 10 | tools that I did not try: 11 | 12 | - [microsoft/DevSkim: DevSkim is a set of IDE plugins and rules that provide security "linting" capabilities. (github.com)](https://github.com/microsoft/DevSkim) 13 | - [pmd/pmd: An extensible multilanguage static code analyzer. (github.com)](https://github.com/pmd/pmd) 14 | #### SAST AI Integrations 15 | - [10x your AppSec program with Semgrep Assistant](https://semgrep.dev/blog/2024/assistant-ga-launch/?utm_source=tldrsec.com&utm_medium=referral&utm_campaign=tl-dr-sec-223-ai-auto-fixes-mapping-cloudtrail-to-incidents-vs-code-extensions-for-security) 16 | - Triaging and Fixing Bugs: [Fixing security vulnerabilities with AI - The GitHub Blog](https://github.blog/2024-02-14-fixing-security-vulnerabilities-with-ai/?utm_source=tldrsec.com&utm_medium=referral&utm_campaign=tl-dr-sec-223-ai-auto-fixes-mapping-cloudtrail-to-incidents-vs-code-extensions-for-security) 17 | 18 | ### IAST 19 | - [Contrast Security | Application Security Software Platform](https://www.contrastsecurity.com/) 20 | ### Secret Scanning 21 | - [trufflesecurity/trufflehog: Find credentials all over the place (github.com)](https://github.com/trufflesecurity/trufflehog) 22 | 23 | tools that I did not try: 24 | 25 | - [thoughtworks/talisman: Using a pre-commit hook, Talisman validates the outgoing changeset for things that look suspicious — such as tokens, passwords, and private keys. (github.com)](https://github.com/thoughtworks/talisman) 26 | 27 | ### Container Scanning: 28 | #### DockerFile 29 | - [GitHub - hadolint/hadolint: Dockerfile linter, validate inline bash, written in Haskell](https://github.com/hadolint/hadolint) 30 | 31 | #### Docker Images 32 | - [GitHub - aquasecurity/trivy: Find vulnerabilities, misconfigurations, secrets, SBOM in containers, Kubernetes, code repositories, clouds and more](https://github.com/aquasecurity/trivy) 33 | - [GitHub - goodwithtech/dockle: Container Image Linter for Security, Helping build the Best-Practice Docker Image, Easy to start](https://github.com/goodwithtech/dockle) 34 | - [GitHub - anchore/grype: A vulnerability scanner for container images and filesystems](https://github.com/anchore/grype) 35 | - [Docker Scout | Docker Docs](https://docs.docker.com/scout/) 36 | ### Supply Chain/SCA 37 | - [Snyk | Top SAST & SCA Considerations](https://go.snyk.io/202212-sast-sca-considerations-guide.html) 38 | - [GitHub - chainguard-dev/bincapz: enumerate binary capabilities, including malicious behaviors](https://github.com/chainguard-dev/bincapz?utm_source=tldrsec.com&utm_medium=referral&utm_campaign=tl-dr-sec-223-ai-auto-fixes-mapping-cloudtrail-to-incidents-vs-code-extensions-for-security) 39 | - [Dependabot - The GitHub Blog](https://github.blog/2020-06-01-keep-all-your-packages-up-to-date-with-dependabot/) 40 | 41 | ### Secrets Management 42 | - [GitHub - hashicorp/vault: A tool for secrets management, encryption as a service, and privileged access management](https://github.com/hashicorp/vault) 43 | tools that I did not try:: 44 | - [GitHub - Infisical/infisical: ♾ Infisical is the open-source secret management platform: Sync secrets across your team/infrastructure and prevent secret leaks.](https://github.com/Infisical/infisical?utm_source=tldrsec.com&utm_medium=referral&utm_campaign=tl-dr-sec-220-detecting-manual-aws-actions-ai-threat-models-living-off-the-false-positive) 45 | ### System Hardening 46 | - Golden Packer Images (AMIs & Base Containers) 47 | - ansible scripts on prod machines/containers/pods 48 | - Scan docker daemon on machines: [GitHub - docker/docker-bench-security: The Docker Bench for Security is a script that checks for dozens of common best-practices around deploying Docker containers in production.](https://github.com/docker/docker-bench-security) 49 | 50 | ### AI Model Scanning 51 | - [Pickle Scanning (huggingface.co)](https://huggingface.co/docs/hub/security-pickle#what-we-have-now) 52 | ### Threat Modelling as Code 53 | - [GitHub - yevh/TaaC-AI: AI-driven Threat modeling-as-a-Code (TaaC-AI)](https://github.com/yevh/TaaC-AI) 54 | - [Irius Risk | Automated Threat Modeling Tool](https://www.iriusrisk.com/) 55 | ## Resources 56 | - [DSOMM (owasp.org)](https://dsomm.owasp.org/) 57 | - [GitHub - hysnsec/awesome-threat-modelling: A curated list of threat modeling resources (Books, courses - free and paid, videos, tools, tutorials and workshops to practice on ) for learning Threat modeling and initial phases of security review.](https://github.com/hysnsec/awesome-threat-modelling) -------------------------------------------------------------------------------- /.obsidian/workspace.json: -------------------------------------------------------------------------------- 1 | { 2 | "main": { 3 | "id": "72798818096929e3", 4 | "type": "split", 5 | "children": [ 6 | { 7 | "id": "e5f5edab5fb401ee", 8 | "type": "tabs", 9 | "children": [ 10 | { 11 | "id": "efca4fcf7ed90b53", 12 | "type": "leaf", 13 | "state": { 14 | "type": "markdown", 15 | "state": { 16 | "file": "docs/AppSec/Secrets Management.md", 17 | "mode": "source", 18 | "source": false 19 | } 20 | } 21 | } 22 | ] 23 | } 24 | ], 25 | "direction": "vertical" 26 | }, 27 | "left": { 28 | "id": "51281137b6590fd2", 29 | "type": "split", 30 | "children": [ 31 | { 32 | "id": "81a58eabb6cef1cf", 33 | "type": "tabs", 34 | "children": [ 35 | { 36 | "id": "8756c34569a2e865", 37 | "type": "leaf", 38 | "state": { 39 | "type": "file-explorer", 40 | "state": { 41 | "sortOrder": "alphabetical" 42 | } 43 | } 44 | }, 45 | { 46 | "id": "8ddfb27e1f977660", 47 | "type": "leaf", 48 | "state": { 49 | "type": "search", 50 | "state": { 51 | "query": "brutefor", 52 | "matchingCase": false, 53 | "explainSearch": false, 54 | "collapseAll": false, 55 | "extraContext": false, 56 | "sortOrder": "alphabetical" 57 | } 58 | } 59 | }, 60 | { 61 | "id": "cadfc81666e2ab61", 62 | "type": "leaf", 63 | "state": { 64 | "type": "bookmarks", 65 | "state": {} 66 | } 67 | } 68 | ] 69 | } 70 | ], 71 | "direction": "horizontal", 72 | "width": 300 73 | }, 74 | "right": { 75 | "id": "56e8672b14d59957", 76 | "type": "split", 77 | "children": [ 78 | { 79 | "id": "6d521b2892ab4aa4", 80 | "type": "tabs", 81 | "children": [ 82 | { 83 | "id": "bfd6764ebea5f0c7", 84 | "type": "leaf", 85 | "state": { 86 | "type": "backlink", 87 | "state": { 88 | "file": "docs/AppSec/Secrets Management.md", 89 | "collapseAll": false, 90 | "extraContext": false, 91 | "sortOrder": "alphabetical", 92 | "showSearch": false, 93 | "searchQuery": "", 94 | "backlinkCollapsed": false, 95 | "unlinkedCollapsed": true 96 | } 97 | } 98 | }, 99 | { 100 | "id": "0442f2e4d4b59299", 101 | "type": "leaf", 102 | "state": { 103 | "type": "outgoing-link", 104 | "state": { 105 | "file": "docs/AppSec/Secrets Management.md", 106 | "linksCollapsed": false, 107 | "unlinkedCollapsed": true 108 | } 109 | } 110 | }, 111 | { 112 | "id": "b00e53792debe49b", 113 | "type": "leaf", 114 | "state": { 115 | "type": "tag", 116 | "state": { 117 | "sortOrder": "frequency", 118 | "useHierarchy": true 119 | } 120 | } 121 | }, 122 | { 123 | "id": "1cf5fc7f0f8640a4", 124 | "type": "leaf", 125 | "state": { 126 | "type": "outline", 127 | "state": { 128 | "file": "docs/AppSec/Secrets Management.md" 129 | } 130 | } 131 | } 132 | ] 133 | } 134 | ], 135 | "direction": "horizontal", 136 | "width": 300, 137 | "collapsed": true 138 | }, 139 | "left-ribbon": { 140 | "hiddenItems": { 141 | "switcher:Open quick switcher": false, 142 | "graph:Open graph view": false, 143 | "canvas:Create new canvas": false, 144 | "daily-notes:Open today's daily note": false, 145 | "templates:Insert template": false, 146 | "command-palette:Open command palette": false 147 | } 148 | }, 149 | "active": "efca4fcf7ed90b53", 150 | "lastOpenFiles": [ 151 | "docs/Pentest/Web Application testing/OSINT.md", 152 | "docs/Pentest/Web Application testing/Salesforce Testing.md", 153 | "docs/AppSec/Secrets Management.md", 154 | "docs/AppSec/Supply Chain.md", 155 | "docs/Cloud/Azure Assessment Checklist.md", 156 | "docs/Pentest/Mobile Application Testing/Xamarin - iOS.md", 157 | "docs/Pentest/Mobile Application Testing/Xamarin - Android.md", 158 | "docs/Pentest/Mobile Application Testing/Extract IPA From AppStore Application.md", 159 | "docs/Pentest/Mobile Application Testing/Apache Cordova.md", 160 | "docs/Pentest/Desktop Application Testing/Frida - Windows.md", 161 | "docs/Pentest/Desktop Application Testing/C++ Win32 Applications.md", 162 | "docs/AppSec/DevSecOps Tooling.md", 163 | "docs/AppSec/CI-CD Security.md", 164 | "docs/AppSec/Threat Modeling.md", 165 | "docs/Case Studies.md", 166 | "docs/AppSec/Docker.md", 167 | "docs/Server Administration/VPNs.md", 168 | "docs/AppSec", 169 | "docs/Web Applications testing/X-Frame-Options.md", 170 | "docs/Third-Party Security.md", 171 | "Pasted image 20240226121218.png", 172 | "Pasted image 20240226121305.png", 173 | "docs/Web Applications testing/Attacks/Web cache poisoning.md", 174 | "docs/Evasion/World Writable Directories.md", 175 | "Pasted image 20240226121403.png", 176 | "Pasted image 20240226121359.png", 177 | "Pasted image 20240226121348.png", 178 | "Pasted image 20240226121335.png", 179 | "Pasted image 20240226121320.png", 180 | "Pasted image 20240226121244.png", 181 | "docs/Web Applications testing/Attacks/XSLT Engines.md", 182 | "docs/Web Applications testing/Attacks/OAuth.md", 183 | "docs/Web Applications testing/Attacks/Deserialization.md" 184 | ] 185 | } -------------------------------------------------------------------------------- /docs/pentest/Desktop Application Testing/Frida - Windows.md: -------------------------------------------------------------------------------- 1 | # Frida Windows 2 | ## CLI Options 3 | 4 | ```bash 5 | # CLI Options 6 | -f : Spanws a process at given path in an paused state 7 | -l : Load an instrumentation script 8 | -s : Include debug symbols 9 | --no-pause : automatically resume after instrumentation is applied 10 | --runtime=qjs : Using QuickJS 11 | --runtime=v8 : Use JavaScript V8 Engine 12 | --pause : Start application paused 13 | ``` 14 | 15 | ## CLI 16 | 17 | One of the important details of Frida's CLI tools is that parameters are _case sensitive_ in most cases, it is important to take this into consideration. An example is that _lowercase_ parameters are used for functions and _uppercase_ parameters for modules, be it inclusions or exclusions. 18 | 19 | Frida-Trace Hooks into a function and generate boiler plate stubs that can be modified for a quick and easy way to hook functions. 20 | 21 | ```bash 22 | # attach to process by id or name 23 | frida notepad.exe 24 | frida 1234 25 | 26 | # Resumes execution inside Frida's REPL 27 | %resume 28 | 29 | # Instrument All calls to CreateFileW in all modules 30 | frida-trace -i "CreateFileW" notepad.exe 31 | 32 | # Instrument All calls that begin with CreateFile 33 | frida-trace -i "CreateFile*" notepad.exe 34 | 35 | # Instruments only `KERNEL32.DLL!CreateFileW` 36 | frida-trace -i "CreateFileW" -I "KERNEL32.DLL" notepad.exe 37 | 38 | # Instruments all CreateFileW calls that are not in Kernerl32.dll 39 | frida-trace -i "CreateFileW" -X "KERNEL32.DLL" notepad.exe 40 | 41 | # Intrument Function call at specific offset 42 | frida-trace -a "customLib.DLL!0x1234" notepad.exe 43 | 44 | # Instrucment Functions calls with regex 45 | frida-trace -i '*Etw*' notepad.exe 46 | 47 | # Run the binary specifying the full path and load the instrumentation script 48 | frida -l .\instrumentation.js -f '.\Reading a WinAPI UTF16 string parameter.exe' 49 | ``` 50 | 51 | ## Code Snippets 52 | Frida's enviroment after you execute any of the Frida-CLI tools is usually refered to as Frida's REPL (read–eval–print loop). 53 | Declare variable without `let`,`const` or `var` inside the REPL. 54 | ### Reading a WinAPI UTF16 string parameter 55 | ```js 56 | const searchPathPtr = Module.getExportByName("KERNELBASE.DLL", "SearchPathW"); 57 | Interceptor.attach(searchPathPtr, { 58 |     onEnter(args) { 59 |         console.log("Output: " + args[1].readUtf16String()) 60 |     } 61 | }); 62 | ``` 63 | 64 | ### Undoing instrumentation 65 | ```js 66 | const redirectString = Memory.allocUtf8String("/bin/foobar"); 67 | const statPtr = Module.getExportByName(null, "stat$INODE64"); 68 | 69 | let statListener = Interceptor.attach(statPtr, { 70 | onEnter(args) { 71 | this.removeHook = false; 72 | let statArg = args[0].readUtf8String(); 73 | console.log("stat is checking: " + args[0].readUtf8String()); 74 | if (statArg.indexOf("bin/ls") != -1) { 75 | args[0] = redirectString; 76 | this.removeHook = true; 77 | } 78 | 79 | console.log("final stat path?: " + args[0].readUtf8String()); 80 | }, 81 | 82 | onLeave(retval) { 83 | if (this.removeHook) { 84 | console.log("Removing stat instrumentation..."); 85 | statListener.detach(); 86 | } 87 | } 88 | }); 89 | ``` 90 | 91 | ### General-Purpose Snippets 92 | Inside REPL 93 | ```js 94 | // Resume execution 95 | %resume 96 | 97 | // Enumerate Modules Loaded 98 | Process.enumerateModulesSync() 99 | 100 | // Find baseAddress of module, Returns a pointer 101 | myBaseAddr = Module.findBaseAddress('myLib.so'); 102 | 103 | // Allocate Memory 104 | allocatedMemoryPtr = Memory.allocUtf16String("Some String") 105 | 106 | // Read the string, 1024 charchters from string (Can be left empty and frida will auto try and guess where the string ends) 107 | allocatedMemoryPtr.readCString(1024) 108 | 109 | // Clear the memory 110 | allocatedMemoryPtr = null 111 | 112 | // Overwrite the data at an address with the int value of 12 113 | allocatedMemoryPtr.writeInt(12) 114 | 115 | // Allocate empty memory and write to it 116 | t = Memory.alloc(32); 117 | t.writeUtf8String('frida frida rockssssssss') 118 | 119 | // Show data in int32 format instead of hexx 120 | Interceptor.attach(addPtr, { 121 |   onEnter(args) { 122 |     console.log("a: " + args[0].toInt32()); 123 |   }}); 124 | 125 | 126 | // Read Pointer struct 127 | args[5].readPointer(); 128 | 129 | // Get base address and add an offset to it 130 | myBaseAddr = Module.findBaseAddress('myLib.so'); 131 | myOffsetPtr = myBaseAddr.add(ptr('0x76E')) 132 | 133 | // Get pointer to array buffer 134 | myOffsetPtr = myBaseAddr.add(ptr('0x76E')) 135 | test.unwrap() 136 | 137 | // HexDump data at address in pretty format 138 | console.log(hexdump(myOffsetPtr)) 139 | 140 | // To expose a variable in REPL, inside your script add 141 | const CreateFileWPtr = Module.getExportByName('kernelbase.dll', 'CreateFileW') 142 | (global).CreateFileWPtr = CreateFileWPtr 143 | 144 | 145 | // Call Native function 146 | mkdir = Module.getExportByName(null,'mkdir') 147 | folderName = Memory.allocUtf8String('testingNativeFunctions') 148 | frida_mkdir = new NativeFunction(mkdir,'int',['pointer']) 149 | frida_mkdir(folderName) 150 | ``` 151 | 152 | ## Control Scripts 153 | Very useful for RPC exchange of messages between frida and the instrumentation script and child-gating. 154 | 155 | ### Simple Control Script 156 | Almost boiler plate code 157 | ```python 158 | import os 159 | import sys 160 | 161 | import frida 162 | 163 | _SCRIPT_FILENAME = 'agent.js' 164 | 165 | def on_message(message, date): 166 | """Print received messages.""" 167 | print(message) 168 | 169 | def main(process_name): 170 | with open(_SCRIPT_FILENAME, 'r') as script_file: 171 | code = script_file.read() 172 | 173 | device = frida.get_local_device() 174 | pid = device.spawn(process_name) 175 | print('pid: %d' % pid) 176 | 177 | session = device.attach(pid) 178 | 179 | script = session.create_script(code) 180 | script.on('message', on_message) 181 | script.load() 182 | 183 | device.resume(pid) 184 | 185 | print('Press CTRL-Z to stop execution.') 186 | sys.stdin.read() 187 | session.detach() 188 | 189 | if __name__ == '__main__': 190 | main(sys.argv[1]) 191 | ``` 192 | 193 | ### Child-gating control script Linux 194 | 195 | ![](/Screenshots/Pasted%20image%2020221106172409.png) 196 | Boiler plate code from https://raw.githubusercontent.com/frida/frida-python/master/examples/child_gating.py 197 | ```python 198 | # -*- coding: utf-8 -*- 199 | from __future__ import print_function 200 | 201 | import threading 202 | 203 | import frida 204 | from frida_tools.application import Reactor 205 | 206 | 207 | class Application(object): 208 | def __init__(self): 209 | self._stop_requested = threading.Event() 210 | self._reactor = Reactor(run_until_return=lambda reactor: self._stop_requested.wait()) 211 | 212 | self._device = frida.get_local_device() 213 | self._sessions = set() 214 | 215 | self._device.on("child-added", lambda child: self._reactor.schedule(lambda: self._on_child_added(child))) 216 | self._device.on("child-removed", lambda child: self._reactor.schedule(lambda: self._on_child_removed(child))) 217 | self._device.on("output", lambda pid, fd, data: self._reactor.schedule(lambda: self._on_output(pid, fd, data))) 218 | 219 | def run(self): 220 | self._reactor.schedule(lambda: self._start()) 221 | self._reactor.run() 222 | 223 | def _start(self): 224 | argv = ["/bin/sh", "-c", "cat /etc/hosts"] 225 | env = { 226 | "BADGER": "badger-badger-badger", 227 | "SNAKE": "mushroom-mushroom", 228 | } 229 | print("✔ spawn(argv={})".format(argv)) 230 | pid = self._device.spawn(argv, env=env, stdio='pipe') 231 | self._instrument(pid) 232 | 233 | def _stop_if_idle(self): 234 | if len(self._sessions) == 0: 235 | self._stop_requested.set() 236 | 237 | def _instrument(self, pid): 238 | print("[*] attach(pid={})".format(pid)) 239 | session = self._device.attach(pid) 240 | session.on("detached", lambda reason: self._reactor.schedule(lambda: self._on_detached(pid, session, reason))) 241 | print("[*] enable_child_gating()") 242 | session.enable_child_gating() 243 | print("[*] create_script()") 244 | script = session.create_script("""\ 245 | Interceptor.attach(Module.getExportByName(null, 'open'), { 246 | onEnter(args) { 247 | send({ 248 | type: 'open', 249 | path: Memory.readUtf8String(args[0]) 250 | }); 251 | } 252 | }); 253 | """) 254 | script.on("message", lambda message, data: self._reactor.schedule(lambda: self._on_message(pid, message))) 255 | print("[*] load()") 256 | script.load() 257 | print("[*] resume(pid={})".format(pid)) 258 | self._device.resume(pid) 259 | self._sessions.add(session) 260 | 261 | def _on_child_added(self, child): 262 | print("[+] child_added: {}".format(child)) 263 | self._instrument(child.pid) 264 | 265 | def _on_child_removed(self, child): 266 | print("[-] child_removed: {}".format(child)) 267 | 268 | def _on_output(self, pid, fd, data): 269 | print("[*] output: pid={}, fd={}, data={}".format(pid, fd, repr(data))) 270 | 271 | def _on_detached(self, pid, session, reason): 272 | print("[-] detached: pid={}, reason='{}'".format(pid, reason)) 273 | self._sessions.remove(session) 274 | self._reactor.schedule(self._stop_if_idle, delay=0.5) 275 | 276 | def _on_message(self, pid, message): 277 | print("[*] message: pid={}, payload={}".format(pid, message["payload"])) 278 | 279 | 280 | app = Application() 281 | app.run() 282 | ``` 283 | 284 | 285 | # Resources 286 | [Frida basics - Frida HandBook (learnfrida.info)](https://learnfrida.info/basic_usage/) -------------------------------------------------------------------------------- /docs/pentest/Desktop Application Testing/C++ Win32 Applications.md: -------------------------------------------------------------------------------- 1 | # C++ Win32 Applications 2 | ### Static Analysis 3 | - Check If binary is signed 4 | ```powershell 5 | # Using sysinternals sigcheck check all files in folder 6 | .\sigcheck.exe -s "C:\Program Files (x86)\Cisco Systems\Cisco Example Application" > 'C:\work\telecom\Cisco Example Application\sigcheck.txt' 7 | 8 | # Using Powershell, More checks than sigcheck but provides 9 | # Less verbosity 10 | Get-ChildItem "C:\Program Files (x86)\Cisco Systems\Cisco Example Application" -Recurse | ForEach-object {Get-AuthenticodeSignature $_.FullName -erroraction 'silentlycontinue'} | Where-Object {$_.status -ne "Valid" -and $_.status -ne "UnknownError"} | fl * 11 | ``` 12 | - Check if proper hardening has been applied to binary 13 | [NetSPI/PESecurity: PowerShell module to check if a Windows binary (EXE/DLL) has been compiled with ASLR, DEP, SafeSEH, StrongNaming, and Authenticode. (github.com)](https://github.com/NetSPI/PESecurity) 14 | ```powershell 15 | # Import module 16 | Import-Module .\Get-PESecurity.psm1 17 | 18 | # Check a directory for DLLs & EXEs recrusively 19 | Get-PESecurity -directory "C:\Program Files (x86)\Cisco Systems\Cisco Example Application" -recursive | Export-Csv PESecurity.csv 20 | 21 | # Txt file output 22 | Get-PESecurity -directory "C:\Program Files (x86)\Cisco Systems\Cisco Example Application" -recursive > .\PESecurity.txt 23 | 24 | # Bulk Get POCs for files 25 | Get-PESecurity -directory "C:\Program Files (x86)\Cisco Systems\Cisco Example Application" -Recursive | Where-Object {$_.ControlFlowGuard -ne "True" } | ForEach-Object {write-output $_.FileName} > 'C:\work\telecom\Cisco Example Application\ControlFlowGuardModules.txt' 26 | ``` 27 | 28 | **Intersting Stuff to search for during static and dynamic analysis** 29 | 30 | - Currently logged in user's token, password, or username in memory. 31 | - Any intersting endpoints and urls (check the regexes below for some inspiration) 32 | - Mentions of passwords, secerets, tokens etc... 33 | - Local Servers spinned up by thick client for interprocess comunciation or external communication. 34 | 35 | ```bash 36 | # Identify Local Servers spinned up by the thick client 37 | grep -oa -RiP '(tcp|udp|pipe|local|port)[a-zA-Z0-9_]{0,20}[:"=][^0\Wa-zA-Z_\-][\d]{2,5}[^\d]' . 38 | ``` 39 | 40 | **Check for Misconfigured Directory Permissions using icacls** 41 | ```powershell 42 | # This should show if any folder/file has a unique permission for both the Built in users and authenticated user groups. 43 | # A correctly configured folder/file permissions should be 44 | # Access : NT AUTHORITY\Authenticated Users Allow ReadAndExecute, Synchronize 45 | # BUILTIN\Users Allow ReadAndExecute, Synchronize 46 | # BUILTIN\Users Allow -1610612736 47 | dir '.\Windows\DummyApplication' -Recurse | Get-Acl | fl | findstr 'Users'| select -Unique 48 | ``` 49 | 50 | --- 51 | 52 | 53 | ### Analysis 54 | 55 | - Dump Memory and search for data using Windows Task Manager, right click the process and click create dump file. 56 | 57 | ![](/Screenshots/Pasted%20image%2020210914115012.png) 58 | If the applications spawn multiple sub processes, use the below powershell script to create an array of those subprocess ids and dump their memory. 59 | 60 | ```powershell 61 | function Dump-ProcessesMemoryByName($regex) { 62 | $ids = (Get-Process -Name $regex | ForEach-Object id) 63 | New-Item -Name "dump" -ItemType "directory" 64 | foreach($id in $ids) { 65 | .\procdump.exe $id -accepteula -ma "dump\$id" 66 | } 67 | } 68 | 69 | Dump-ProcessesMemoryByName('*edge*') 70 | ``` 71 | 72 | - Check Loaded DLLs using [Process Explorer - Windows Sysinternals | Microsoft Docs](https://docs.microsoft.com/en-us/sysinternals/downloads/process-explorer) 73 | - Identify Handles to open files 74 | - Command Line arguments/Working directory 75 | - Monitor Win32 API calls & Windows Events using [API Monitor: Spy on API Calls and COM Interfaces (Freeware 32-bit and 64-bit Versions!) | rohitab.com](http://www.rohitab.com/apimonitor) 76 | - Monitor Windows Events using [Process Monitor - Windows Sysinternals | Microsoft Docs](https://docs.microsoft.com/en-us/sysinternals/downloads/procmon) 77 | 78 | > Utilize filters to hone down on intersting events such as read/write events to files that are used during/after authentication/authorization. 79 | 80 | 81 | - Check registry for clear-text registry writes using [regshot | SourceForge.net](https://sourceforge.net/projects/regshot/) 82 | 1. Use regshot to snapshot the registry before and after any operation that might have written to the registry. 83 | 2. Compare both snapshots for registry changes. 84 | 85 | 86 | ### In Disk/Memory Manipulation 87 | - Modify the binary using [HxD - Freeware Hex Editor and Disk Editor | mh-nexus](https://mh-nexus.de/en/hxd/) 88 | 89 | 90 | ### Fuzzing 91 | Fuzz the application using WinAFL for memory corruption vulnerabilities. 92 | - [googleprojectzero/winafl: A fork of AFL for fuzzing Windows binaries (github.com)](https://github.com/googleprojectzero/winafl) 93 | - [[Fuzzing With WinAFL] How to fuzz a simple C program with WinAFL - YouTube](https://www.youtube.com/watch?v=Va_Wtxf3DMc&t=760s) 94 | - [BB-1011 Fuzzing WinAFL - YouTube](https://www.youtube.com/watch?v=m7tJkeW6H58) 95 | - [Fuzzing with WinAFL Writing Harness for a DLL and fuzzing it with WinAFL - YouTube](https://www.youtube.com/watch?v=XeN3M0sK9GA) 96 | 97 | > Writing harness functions might be time-consuming. However, very rewarding once you learn how to do so quickly. 98 | 99 | 100 | ### Traffic Interception 101 | - Is clear text traffic transferred? 102 | - Can you manipulate traffic? 103 | 104 | > You can use one or many of these techniques in conjuncture to read/manipulate network traffic. My personal favorite is fiddler to intercept the traffic and forward it to Burp Suite in combination with Burp Suite custom proxy rules to narrow down the traffic to the application specific traffic as much as possible without the noise generated by the OS and other random applications on the host. 105 | 106 | 107 | #### Important Proxying Notes 108 | **Windows Global System Proxy** 109 | Fidler isn't a sniffer - it's a proxy. Unless you can get the offending application to use a proxy none of its traffic is going to run through Fiddler. Java applications don't use the operating system's SSL "stack", so interception utilities that shim into the Windows SSL stack aren't going to be helpful either. Presumably the remote servers aren't running an SSL stack that's easy to snoop inside (since you say they're running Tomcat, and also not likely using the OS SSL stack). 110 | 111 | [windows - Log an Application's Network Activity with Process Monitor and/or Fiddler or something else - Server Fault](https://serverfault.com/questions/241879/log-an-applications-network-activity-with-process-monitor-and-or-fiddler-or-som) 112 | 113 | **AppContainers** 114 | Some metro style applications run run inside isolated processes known as "**AppContainers.**" By default, AppContainers are forbidden from sending network traffic to the local computer (loopback). This is, of course, problematic when debugging with Fiddler, as Fiddler is a proxy server which runs on the local computer. Fiddler has a GUI tool that allows you to very easily reconfigure an AppContainer to enable loopback traffic. 115 | 116 | [AppContainer Isolation - Win32 apps | Microsoft Learn](https://learn.microsoft.com/en-us/windows/win32/secauthz/appcontainer-isolation) 117 | [Revisiting Fiddler and Win8+ Immersive applications – Fiddler Web Debugger (archive.org)](https://web.archive.org/web/20171109101204/https://blogs.msdn.microsoft.com/fiddler/2011/12/10/revisiting-fiddler-and-win8-immersive-applications/) 118 | 119 | 120 | #### WireShark 121 | > This can be also used for WinShark 122 | 123 | [Decrypt SSL with Wireshark - HTTPS Decryption: Step-by-Step Guide (comparitech.com)](https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/) 124 | 125 | #### WinShark 126 | It's possible to use WireShark to filter network traffic by process ID using the WinShark plugin. In the simplest terms this plugin corelates ETW events with the traffic produced. 127 | 128 | > WinShark Makes filtering traffic by process ID possible. Use the `winshark.header.ProcessId == 1234` filter. Also, make sure to always run wireshark as admininstrator after installing WinShark 129 | 130 | You can find the installation instructions in the README on their github: 131 | [airbus-cert/Winshark: A wireshark plugin to instrument ETW (github.com)](https://github.com/airbus-cert/Winshark) 132 | 133 | 134 | 135 | **Script to generate a wireshark filters for all subprocess of a process** 136 | ```powershell 137 | # N.b. if application keep spawning processes this is rendered useless as your filters list is outdated. 138 | 139 | function Get-ChildProcesses ($ParentProcessId) { 140 | $filter = "parentprocessid = '$($ParentProcessId)'" 141 | Get-CIMInstance -ClassName win32_process -filter $filter | Foreach-Object { 142 | $_ 143 | if ($_.ParentProcessId -ne $_.ProcessId) { 144 | Get-ChildProcesses $_.ProcessId 145 | } 146 | } 147 | } 148 | 149 | function Generate-WinSharkFilters($ParentProcessId){ 150 | $pids = (Get-ChildProcesses($ParentProcessId) | ForEach-Object { $_.ProcessId } ) 151 | $pids += $ParentProcessId 152 | $StrPids = $pids -join '|' 153 | write-host "string(winshark.header.ProcessId) matches '$StrPids'" 154 | } 155 | 156 | Generate-WinSharkFilters('5473') 157 | ``` 158 | 159 | 160 | **Usage** 161 | 162 | 1. To capture network traffic using Winshark , you have to simply activate network tracing through netsh: 163 | ```batch 164 | netsh.exe trace start capture=yes report=no correlation=no 165 | ``` 166 | 167 | 2. And then create an ETW session associated with the Microsoft-Windows-NDIS-PacketCapture provider: 168 | ```batch 169 | logman start Winshark-PacketCapture -p "Microsoft-Windows-NDIS-PacketCapture" -rt -ets 170 | ``` 171 | 172 | 3. Then launch Wireshark with **administrator privileges** and select the `Winshark-PacketCapture` interface. 173 | 174 | #### Fiddler 175 | 176 | ```VBSCRIPT 177 | public static function IsInternalHost(oSession: Session) : Boolean 178 | { 179 | var hostname = oSession.hostname; 180 | if(!String.IsNullOrWhiteSpace(hostname)){ 181 | try{ 182 | var testIp = System.Net.Dns.GetHostEntry(hostname).AddressList[0]; 183 | 184 | //oSession.RequestHeaders.Add("debugme",testIp.ToString()); 185 | if(System.Net.IPAddress.IsLoopback(testIp) || hostname.Equals("::1")) return true; 186 | 187 | var ip = testIp.GetAddressBytes(); 188 | 189 | switch (ip[0]) 190 | { 191 | case 10: 192 | case 127: 193 | return true; 194 | case 172: 195 | return ip[1] >= 16 && ip[1] < 32; 196 | case 192: 197 | return ip[1] == 168; 198 | } 199 | }catch(error){ 200 | 201 | } 202 | } 203 | 204 | return false; 205 | } 206 | 207 | 208 | static function OnBeforeRequest(oSession: Session) { 209 | if ( oSession.HostnameIs("burp") || 210 | oSession.hostname.ToLower().EndsWith("victim.com") || oSession.hostname.ToLower().EndsWith("attacker.com") || 211 | oSession.hostname.ToLower().EndsWith("wow.cc") || oSession.hostname.ToLower().EndsWith("awesome.cc") || 212 | IsInternalHost(oSession) || 213 | Uri.CheckHostName(oSession.hostname) == null || Uri.CheckHostName(oSession.hostname).Equals(UriHostNameType.Unknown) || 214 | oSession.hostname.ToLower().Contains("target.net") 215 | ) 216 | { 217 | oSession["X-OverrideGateway"] = "127.0.0.1:8080"; 218 | } 219 | 220 | ``` 221 | 222 | #### MITM Proxy 223 | TBD 224 | 225 | #### Windows HTTP Proxy 226 | - [How to Set Up a Proxy in Windows 10 - dummies](https://www.dummies.com/computers/operating-systems/windows-10/how-to-set-up-a-proxy-in-windows-10/) 227 | - [Burp Suite - Application Security Testing Software - PortSwigger](https://portswigger.net/burp) 228 | 229 | ### Debuggers 230 | - [IDA Pro – Hex Rays (hex-rays.com)](https://hex-rays.com/ida-pro/) 231 | - [Debugging Using WinDbg Preview - Windows drivers | Microsoft Docs](https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/debugging-using-windbg-preview#:~:text=WinDbg%20Preview%20is%20the%20latest,data%20model%20front%20and%20center.) 232 | 233 | ### Decompilers 234 | - [NationalSecurityAgency/ghidra: Ghidra is a software reverse engineering (SRE) framework (github.com)](https://github.com/NationalSecurityAgency/ghidra) 235 | 236 | 237 | --- 238 | ## Learning Resources 239 | 240 | - [Practical thick client application penetration testing using damn vulnerable thick client app: An introduction - Infosec Resources (infosecinstitute.com)](https://resources.infosecinstitute.com/topic/practical-thick-client-application-penetration-testing-using-damn-vulnerable-thick-client-app-part-1/) 241 | - [Introduction to Hacking Thick Clients: Part 1 - the GUI (netspi.com)](https://www.netspi.com/blog/technical/thick-application-penetration-testing/introduction-to-hacking-thick-clients-part-1-the-gui/) 242 | - [secvulture/dvta: Damn Vulnerable Thick Client App (github.com)](https://github.com/secvulture/dvta) 243 | - [Breaking Docker Named Pipes SYSTEMatically: Docker Desktop Privilege Escalation – Part 1 (cyberark.com)](https://www.cyberark.com/resources/threat-research-blog/breaking-docker-named-pipes-systematically-docker-desktop-privilege-escalation-part-1) -------------------------------------------------------------------------------- /custom_theme/js/particles.js: -------------------------------------------------------------------------------- 1 | /* ----------------------------------------------- 2 | /* Author : Vincent Garreau - vincentgarreau.com 3 | /* MIT license: http://opensource.org/licenses/MIT 4 | /* Demo / Generator : vincentgarreau.com/particles.js 5 | /* GitHub : github.com/VincentGarreau/particles.js 6 | /* How to use? : Check the GitHub README 7 | /* v2.0.0 8 | /* ----------------------------------------------- */ 9 | 10 | var pJS = function(tag_id, params){ 11 | 12 | var canvas_el = document.querySelector('#'+tag_id+' > .particles-js-canvas-el'); 13 | 14 | /* particles.js variables with default values */ 15 | this.pJS = { 16 | canvas: { 17 | el: canvas_el, 18 | w: canvas_el.offsetWidth, 19 | h: canvas_el.offsetHeight 20 | }, 21 | particles: { 22 | number: { 23 | value: 400, 24 | density: { 25 | enable: true, 26 | value_area: 800 27 | } 28 | }, 29 | color: { 30 | value: '#fff' 31 | }, 32 | shape: { 33 | type: 'circle', 34 | stroke: { 35 | width: 0, 36 | color: '#ff0000' 37 | }, 38 | polygon: { 39 | nb_sides: 5 40 | }, 41 | image: { 42 | src: '', 43 | width: 100, 44 | height: 100 45 | } 46 | }, 47 | opacity: { 48 | value: 1, 49 | random: false, 50 | anim: { 51 | enable: false, 52 | speed: 2, 53 | opacity_min: 0, 54 | sync: false 55 | } 56 | }, 57 | size: { 58 | value: 20, 59 | random: false, 60 | anim: { 61 | enable: false, 62 | speed: 20, 63 | size_min: 0, 64 | sync: false 65 | } 66 | }, 67 | line_linked: { 68 | enable: true, 69 | distance: 100, 70 | color: '#fff', 71 | opacity: 1, 72 | width: 1 73 | }, 74 | move: { 75 | enable: true, 76 | speed: 2, 77 | direction: 'none', 78 | random: false, 79 | straight: false, 80 | out_mode: 'out', 81 | bounce: false, 82 | attract: { 83 | enable: false, 84 | rotateX: 3000, 85 | rotateY: 3000 86 | } 87 | }, 88 | array: [] 89 | }, 90 | interactivity: { 91 | detect_on: 'canvas', 92 | events: { 93 | onhover: { 94 | enable: true, 95 | mode: 'grab' 96 | }, 97 | onclick: { 98 | enable: true, 99 | mode: 'push' 100 | }, 101 | resize: true 102 | }, 103 | modes: { 104 | grab:{ 105 | distance: 100, 106 | line_linked:{ 107 | opacity: 1 108 | } 109 | }, 110 | bubble:{ 111 | distance: 200, 112 | size: 80, 113 | duration: 0.4 114 | }, 115 | repulse:{ 116 | distance: 200, 117 | duration: 0.4 118 | }, 119 | push:{ 120 | particles_nb: 4 121 | }, 122 | remove:{ 123 | particles_nb: 2 124 | } 125 | }, 126 | mouse:{} 127 | }, 128 | retina_detect: false, 129 | fn: { 130 | interact: {}, 131 | modes: {}, 132 | vendors:{} 133 | }, 134 | tmp: {} 135 | }; 136 | 137 | var pJS = this.pJS; 138 | 139 | /* params settings */ 140 | if(params){ 141 | Object.deepExtend(pJS, params); 142 | } 143 | 144 | pJS.tmp.obj = { 145 | size_value: pJS.particles.size.value, 146 | size_anim_speed: pJS.particles.size.anim.speed, 147 | move_speed: pJS.particles.move.speed, 148 | line_linked_distance: pJS.particles.line_linked.distance, 149 | line_linked_width: pJS.particles.line_linked.width, 150 | mode_grab_distance: pJS.interactivity.modes.grab.distance, 151 | mode_bubble_distance: pJS.interactivity.modes.bubble.distance, 152 | mode_bubble_size: pJS.interactivity.modes.bubble.size, 153 | mode_repulse_distance: pJS.interactivity.modes.repulse.distance 154 | }; 155 | 156 | 157 | pJS.fn.retinaInit = function(){ 158 | 159 | if(pJS.retina_detect && window.devicePixelRatio > 1){ 160 | pJS.canvas.pxratio = window.devicePixelRatio; 161 | pJS.tmp.retina = true; 162 | } 163 | else{ 164 | pJS.canvas.pxratio = 1; 165 | pJS.tmp.retina = false; 166 | } 167 | 168 | pJS.canvas.w = pJS.canvas.el.offsetWidth * pJS.canvas.pxratio; 169 | pJS.canvas.h = pJS.canvas.el.offsetHeight * pJS.canvas.pxratio; 170 | 171 | pJS.particles.size.value = pJS.tmp.obj.size_value * pJS.canvas.pxratio; 172 | pJS.particles.size.anim.speed = pJS.tmp.obj.size_anim_speed * pJS.canvas.pxratio; 173 | pJS.particles.move.speed = pJS.tmp.obj.move_speed * pJS.canvas.pxratio; 174 | pJS.particles.line_linked.distance = pJS.tmp.obj.line_linked_distance * pJS.canvas.pxratio; 175 | pJS.interactivity.modes.grab.distance = pJS.tmp.obj.mode_grab_distance * pJS.canvas.pxratio; 176 | pJS.interactivity.modes.bubble.distance = pJS.tmp.obj.mode_bubble_distance * pJS.canvas.pxratio; 177 | pJS.particles.line_linked.width = pJS.tmp.obj.line_linked_width * pJS.canvas.pxratio; 178 | pJS.interactivity.modes.bubble.size = pJS.tmp.obj.mode_bubble_size * pJS.canvas.pxratio; 179 | pJS.interactivity.modes.repulse.distance = pJS.tmp.obj.mode_repulse_distance * pJS.canvas.pxratio; 180 | 181 | }; 182 | 183 | 184 | 185 | /* ---------- pJS functions - canvas ------------ */ 186 | 187 | pJS.fn.canvasInit = function(){ 188 | pJS.canvas.ctx = pJS.canvas.el.getContext('2d'); 189 | }; 190 | 191 | pJS.fn.canvasSize = function(){ 192 | 193 | pJS.canvas.el.width = pJS.canvas.w; 194 | pJS.canvas.el.height = pJS.canvas.h; 195 | 196 | if(pJS && pJS.interactivity.events.resize){ 197 | 198 | window.addEventListener('resize', function(){ 199 | 200 | pJS.canvas.w = pJS.canvas.el.offsetWidth; 201 | pJS.canvas.h = pJS.canvas.el.offsetHeight; 202 | 203 | /* resize canvas */ 204 | if(pJS.tmp.retina){ 205 | pJS.canvas.w *= pJS.canvas.pxratio; 206 | pJS.canvas.h *= pJS.canvas.pxratio; 207 | } 208 | 209 | pJS.canvas.el.width = pJS.canvas.w; 210 | pJS.canvas.el.height = pJS.canvas.h; 211 | 212 | /* repaint canvas on anim disabled */ 213 | if(!pJS.particles.move.enable){ 214 | pJS.fn.particlesEmpty(); 215 | pJS.fn.particlesCreate(); 216 | pJS.fn.particlesDraw(); 217 | pJS.fn.vendors.densityAutoParticles(); 218 | } 219 | 220 | /* density particles enabled */ 221 | pJS.fn.vendors.densityAutoParticles(); 222 | 223 | }); 224 | 225 | } 226 | 227 | }; 228 | 229 | 230 | pJS.fn.canvasPaint = function(){ 231 | pJS.canvas.ctx.fillRect(0, 0, pJS.canvas.w, pJS.canvas.h); 232 | }; 233 | 234 | pJS.fn.canvasClear = function(){ 235 | pJS.canvas.ctx.clearRect(0, 0, pJS.canvas.w, pJS.canvas.h); 236 | }; 237 | 238 | 239 | /* --------- pJS functions - particles ----------- */ 240 | 241 | pJS.fn.particle = function(color, opacity, position){ 242 | 243 | /* size */ 244 | this.radius = (pJS.particles.size.random ? Math.random() : 1) * pJS.particles.size.value; 245 | if(pJS.particles.size.anim.enable){ 246 | this.size_status = false; 247 | this.vs = pJS.particles.size.anim.speed / 100; 248 | if(!pJS.particles.size.anim.sync){ 249 | this.vs = this.vs * Math.random(); 250 | } 251 | } 252 | 253 | /* position */ 254 | this.x = position ? position.x : Math.random() * pJS.canvas.w; 255 | this.y = position ? position.y : Math.random() * pJS.canvas.h; 256 | 257 | /* check position - into the canvas */ 258 | if(this.x > pJS.canvas.w - this.radius*2) this.x = this.x - this.radius; 259 | else if(this.x < this.radius*2) this.x = this.x + this.radius; 260 | if(this.y > pJS.canvas.h - this.radius*2) this.y = this.y - this.radius; 261 | else if(this.y < this.radius*2) this.y = this.y + this.radius; 262 | 263 | /* check position - avoid overlap */ 264 | if(pJS.particles.move.bounce){ 265 | pJS.fn.vendors.checkOverlap(this, position); 266 | } 267 | 268 | /* color */ 269 | this.color = {}; 270 | if(typeof(color.value) == 'object'){ 271 | 272 | if(color.value instanceof Array){ 273 | var color_selected = color.value[Math.floor(Math.random() * pJS.particles.color.value.length)]; 274 | this.color.rgb = hexToRgb(color_selected); 275 | }else{ 276 | if(color.value.r != undefined && color.value.g != undefined && color.value.b != undefined){ 277 | this.color.rgb = { 278 | r: color.value.r, 279 | g: color.value.g, 280 | b: color.value.b 281 | } 282 | } 283 | if(color.value.h != undefined && color.value.s != undefined && color.value.l != undefined){ 284 | this.color.hsl = { 285 | h: color.value.h, 286 | s: color.value.s, 287 | l: color.value.l 288 | } 289 | } 290 | } 291 | 292 | } 293 | else if(color.value == 'random'){ 294 | this.color.rgb = { 295 | r: (Math.floor(Math.random() * (255 - 0 + 1)) + 0), 296 | g: (Math.floor(Math.random() * (255 - 0 + 1)) + 0), 297 | b: (Math.floor(Math.random() * (255 - 0 + 1)) + 0) 298 | } 299 | } 300 | else if(typeof(color.value) == 'string'){ 301 | this.color = color; 302 | this.color.rgb = hexToRgb(this.color.value); 303 | } 304 | 305 | /* opacity */ 306 | this.opacity = (pJS.particles.opacity.random ? Math.random() : 1) * pJS.particles.opacity.value; 307 | if(pJS.particles.opacity.anim.enable){ 308 | this.opacity_status = false; 309 | this.vo = pJS.particles.opacity.anim.speed / 100; 310 | if(!pJS.particles.opacity.anim.sync){ 311 | this.vo = this.vo * Math.random(); 312 | } 313 | } 314 | 315 | /* animation - velocity for speed */ 316 | var velbase = {} 317 | switch(pJS.particles.move.direction){ 318 | case 'top': 319 | velbase = { x:0, y:-1 }; 320 | break; 321 | case 'top-right': 322 | velbase = { x:0.5, y:-0.5 }; 323 | break; 324 | case 'right': 325 | velbase = { x:1, y:-0 }; 326 | break; 327 | case 'bottom-right': 328 | velbase = { x:0.5, y:0.5 }; 329 | break; 330 | case 'bottom': 331 | velbase = { x:0, y:1 }; 332 | break; 333 | case 'bottom-left': 334 | velbase = { x:-0.5, y:1 }; 335 | break; 336 | case 'left': 337 | velbase = { x:-1, y:0 }; 338 | break; 339 | case 'top-left': 340 | velbase = { x:-0.5, y:-0.5 }; 341 | break; 342 | default: 343 | velbase = { x:0, y:0 }; 344 | break; 345 | } 346 | 347 | if(pJS.particles.move.straight){ 348 | this.vx = velbase.x; 349 | this.vy = velbase.y; 350 | if(pJS.particles.move.random){ 351 | this.vx = this.vx * (Math.random()); 352 | this.vy = this.vy * (Math.random()); 353 | } 354 | }else{ 355 | this.vx = velbase.x + Math.random()-0.5; 356 | this.vy = velbase.y + Math.random()-0.5; 357 | } 358 | 359 | // var theta = 2.0 * Math.PI * Math.random(); 360 | // this.vx = Math.cos(theta); 361 | // this.vy = Math.sin(theta); 362 | 363 | this.vx_i = this.vx; 364 | this.vy_i = this.vy; 365 | 366 | 367 | 368 | /* if shape is image */ 369 | 370 | var shape_type = pJS.particles.shape.type; 371 | if(typeof(shape_type) == 'object'){ 372 | if(shape_type instanceof Array){ 373 | var shape_selected = shape_type[Math.floor(Math.random() * shape_type.length)]; 374 | this.shape = shape_selected; 375 | } 376 | }else{ 377 | this.shape = shape_type; 378 | } 379 | 380 | if(this.shape == 'image'){ 381 | var sh = pJS.particles.shape; 382 | this.img = { 383 | src: sh.image.src, 384 | ratio: sh.image.width / sh.image.height 385 | } 386 | if(!this.img.ratio) this.img.ratio = 1; 387 | if(pJS.tmp.img_type == 'svg' && pJS.tmp.source_svg != undefined){ 388 | pJS.fn.vendors.createSvgImg(this); 389 | if(pJS.tmp.pushing){ 390 | this.img.loaded = false; 391 | } 392 | } 393 | } 394 | 395 | 396 | 397 | }; 398 | 399 | 400 | pJS.fn.particle.prototype.draw = function() { 401 | 402 | var p = this; 403 | 404 | if(p.radius_bubble != undefined){ 405 | var radius = p.radius_bubble; 406 | }else{ 407 | var radius = p.radius; 408 | } 409 | 410 | if(p.opacity_bubble != undefined){ 411 | var opacity = p.opacity_bubble; 412 | }else{ 413 | var opacity = p.opacity; 414 | } 415 | 416 | if(p.color.rgb){ 417 | var color_value = 'rgba('+p.color.rgb.r+','+p.color.rgb.g+','+p.color.rgb.b+','+opacity+')'; 418 | }else{ 419 | var color_value = 'hsla('+p.color.hsl.h+','+p.color.hsl.s+'%,'+p.color.hsl.l+'%,'+opacity+')'; 420 | } 421 | 422 | pJS.canvas.ctx.fillStyle = color_value; 423 | pJS.canvas.ctx.beginPath(); 424 | 425 | switch(p.shape){ 426 | 427 | case 'circle': 428 | pJS.canvas.ctx.arc(p.x, p.y, radius, 0, Math.PI * 2, false); 429 | break; 430 | 431 | case 'edge': 432 | pJS.canvas.ctx.rect(p.x-radius, p.y-radius, radius*2, radius*2); 433 | break; 434 | 435 | case 'triangle': 436 | pJS.fn.vendors.drawShape(pJS.canvas.ctx, p.x-radius, p.y+radius / 1.66, radius*2, 3, 2); 437 | break; 438 | 439 | case 'polygon': 440 | pJS.fn.vendors.drawShape( 441 | pJS.canvas.ctx, 442 | p.x - radius / (pJS.particles.shape.polygon.nb_sides/3.5), // startX 443 | p.y - radius / (2.66/3.5), // startY 444 | radius*2.66 / (pJS.particles.shape.polygon.nb_sides/3), // sideLength 445 | pJS.particles.shape.polygon.nb_sides, // sideCountNumerator 446 | 1 // sideCountDenominator 447 | ); 448 | break; 449 | 450 | case 'star': 451 | pJS.fn.vendors.drawShape( 452 | pJS.canvas.ctx, 453 | p.x - radius*2 / (pJS.particles.shape.polygon.nb_sides/4), // startX 454 | p.y - radius / (2*2.66/3.5), // startY 455 | radius*2*2.66 / (pJS.particles.shape.polygon.nb_sides/3), // sideLength 456 | pJS.particles.shape.polygon.nb_sides, // sideCountNumerator 457 | 2 // sideCountDenominator 458 | ); 459 | break; 460 | 461 | case 'image': 462 | 463 | function draw(){ 464 | pJS.canvas.ctx.drawImage( 465 | img_obj, 466 | p.x-radius, 467 | p.y-radius, 468 | radius*2, 469 | radius*2 / p.img.ratio 470 | ); 471 | } 472 | 473 | if(pJS.tmp.img_type == 'svg'){ 474 | var img_obj = p.img.obj; 475 | }else{ 476 | var img_obj = pJS.tmp.img_obj; 477 | } 478 | 479 | if(img_obj){ 480 | draw(); 481 | } 482 | 483 | break; 484 | 485 | } 486 | 487 | pJS.canvas.ctx.closePath(); 488 | 489 | if(pJS.particles.shape.stroke.width > 0){ 490 | pJS.canvas.ctx.strokeStyle = pJS.particles.shape.stroke.color; 491 | pJS.canvas.ctx.lineWidth = pJS.particles.shape.stroke.width; 492 | pJS.canvas.ctx.stroke(); 493 | } 494 | 495 | pJS.canvas.ctx.fill(); 496 | 497 | }; 498 | 499 | 500 | pJS.fn.particlesCreate = function(){ 501 | for(var i = 0; i < pJS.particles.number.value; i++) { 502 | pJS.particles.array.push(new pJS.fn.particle(pJS.particles.color, pJS.particles.opacity.value)); 503 | } 504 | }; 505 | 506 | pJS.fn.particlesUpdate = function(){ 507 | 508 | for(var i = 0; i < pJS.particles.array.length; i++){ 509 | 510 | /* the particle */ 511 | var p = pJS.particles.array[i]; 512 | 513 | // var d = ( dx = pJS.interactivity.mouse.click_pos_x - p.x ) * dx + ( dy = pJS.interactivity.mouse.click_pos_y - p.y ) * dy; 514 | // var f = -BANG_SIZE / d; 515 | // if ( d < BANG_SIZE ) { 516 | // var t = Math.atan2( dy, dx ); 517 | // p.vx = f * Math.cos(t); 518 | // p.vy = f * Math.sin(t); 519 | // } 520 | 521 | /* move the particle */ 522 | if(pJS.particles.move.enable){ 523 | var ms = pJS.particles.move.speed/2; 524 | p.x += p.vx * ms; 525 | p.y += p.vy * ms; 526 | } 527 | 528 | /* change opacity status */ 529 | if(pJS.particles.opacity.anim.enable) { 530 | if(p.opacity_status == true) { 531 | if(p.opacity >= pJS.particles.opacity.value) p.opacity_status = false; 532 | p.opacity += p.vo; 533 | }else { 534 | if(p.opacity <= pJS.particles.opacity.anim.opacity_min) p.opacity_status = true; 535 | p.opacity -= p.vo; 536 | } 537 | if(p.opacity < 0) p.opacity = 0; 538 | } 539 | 540 | /* change size */ 541 | if(pJS.particles.size.anim.enable){ 542 | if(p.size_status == true){ 543 | if(p.radius >= pJS.particles.size.value) p.size_status = false; 544 | p.radius += p.vs; 545 | }else{ 546 | if(p.radius <= pJS.particles.size.anim.size_min) p.size_status = true; 547 | p.radius -= p.vs; 548 | } 549 | if(p.radius < 0) p.radius = 0; 550 | } 551 | 552 | /* change particle position if it is out of canvas */ 553 | if(pJS.particles.move.out_mode == 'bounce'){ 554 | var new_pos = { 555 | x_left: p.radius, 556 | x_right: pJS.canvas.w, 557 | y_top: p.radius, 558 | y_bottom: pJS.canvas.h 559 | } 560 | }else{ 561 | var new_pos = { 562 | x_left: -p.radius, 563 | x_right: pJS.canvas.w + p.radius, 564 | y_top: -p.radius, 565 | y_bottom: pJS.canvas.h + p.radius 566 | } 567 | } 568 | 569 | if(p.x - p.radius > pJS.canvas.w){ 570 | p.x = new_pos.x_left; 571 | p.y = Math.random() * pJS.canvas.h; 572 | } 573 | else if(p.x + p.radius < 0){ 574 | p.x = new_pos.x_right; 575 | p.y = Math.random() * pJS.canvas.h; 576 | } 577 | if(p.y - p.radius > pJS.canvas.h){ 578 | p.y = new_pos.y_top; 579 | p.x = Math.random() * pJS.canvas.w; 580 | } 581 | else if(p.y + p.radius < 0){ 582 | p.y = new_pos.y_bottom; 583 | p.x = Math.random() * pJS.canvas.w; 584 | } 585 | 586 | /* out of canvas modes */ 587 | switch(pJS.particles.move.out_mode){ 588 | case 'bounce': 589 | if (p.x + p.radius > pJS.canvas.w) p.vx = -p.vx; 590 | else if (p.x - p.radius < 0) p.vx = -p.vx; 591 | if (p.y + p.radius > pJS.canvas.h) p.vy = -p.vy; 592 | else if (p.y - p.radius < 0) p.vy = -p.vy; 593 | break; 594 | } 595 | 596 | /* events */ 597 | if(isInArray('grab', pJS.interactivity.events.onhover.mode)){ 598 | pJS.fn.modes.grabParticle(p); 599 | } 600 | 601 | if(isInArray('bubble', pJS.interactivity.events.onhover.mode) || isInArray('bubble', pJS.interactivity.events.onclick.mode)){ 602 | pJS.fn.modes.bubbleParticle(p); 603 | } 604 | 605 | if(isInArray('repulse', pJS.interactivity.events.onhover.mode) || isInArray('repulse', pJS.interactivity.events.onclick.mode)){ 606 | pJS.fn.modes.repulseParticle(p); 607 | } 608 | 609 | /* interaction auto between particles */ 610 | if(pJS.particles.line_linked.enable || pJS.particles.move.attract.enable){ 611 | for(var j = i + 1; j < pJS.particles.array.length; j++){ 612 | var p2 = pJS.particles.array[j]; 613 | 614 | /* link particles */ 615 | if(pJS.particles.line_linked.enable){ 616 | pJS.fn.interact.linkParticles(p,p2); 617 | } 618 | 619 | /* attract particles */ 620 | if(pJS.particles.move.attract.enable){ 621 | pJS.fn.interact.attractParticles(p,p2); 622 | } 623 | 624 | /* bounce particles */ 625 | if(pJS.particles.move.bounce){ 626 | pJS.fn.interact.bounceParticles(p,p2); 627 | } 628 | 629 | } 630 | } 631 | 632 | 633 | } 634 | 635 | }; 636 | 637 | pJS.fn.particlesDraw = function(){ 638 | 639 | /* clear canvas */ 640 | pJS.canvas.ctx.clearRect(0, 0, pJS.canvas.w, pJS.canvas.h); 641 | 642 | /* update each particles param */ 643 | pJS.fn.particlesUpdate(); 644 | 645 | /* draw each particle */ 646 | for(var i = 0; i < pJS.particles.array.length; i++){ 647 | var p = pJS.particles.array[i]; 648 | p.draw(); 649 | } 650 | 651 | }; 652 | 653 | pJS.fn.particlesEmpty = function(){ 654 | pJS.particles.array = []; 655 | }; 656 | 657 | pJS.fn.particlesRefresh = function(){ 658 | 659 | /* init all */ 660 | cancelRequestAnimFrame(pJS.fn.checkAnimFrame); 661 | cancelRequestAnimFrame(pJS.fn.drawAnimFrame); 662 | pJS.tmp.source_svg = undefined; 663 | pJS.tmp.img_obj = undefined; 664 | pJS.tmp.count_svg = 0; 665 | pJS.fn.particlesEmpty(); 666 | pJS.fn.canvasClear(); 667 | 668 | /* restart */ 669 | pJS.fn.vendors.start(); 670 | 671 | }; 672 | 673 | 674 | /* ---------- pJS functions - particles interaction ------------ */ 675 | 676 | pJS.fn.interact.linkParticles = function(p1, p2){ 677 | 678 | var dx = p1.x - p2.x, 679 | dy = p1.y - p2.y, 680 | dist = Math.sqrt(dx*dx + dy*dy); 681 | 682 | /* draw a line between p1 and p2 if the distance between them is under the config distance */ 683 | if(dist <= pJS.particles.line_linked.distance){ 684 | 685 | var opacity_line = pJS.particles.line_linked.opacity - (dist / (1/pJS.particles.line_linked.opacity)) / pJS.particles.line_linked.distance; 686 | 687 | if(opacity_line > 0){ 688 | 689 | /* style */ 690 | var color_line = pJS.particles.line_linked.color_rgb_line; 691 | pJS.canvas.ctx.strokeStyle = 'rgba('+color_line.r+','+color_line.g+','+color_line.b+','+opacity_line+')'; 692 | pJS.canvas.ctx.lineWidth = pJS.particles.line_linked.width; 693 | //pJS.canvas.ctx.lineCap = 'round'; /* performance issue */ 694 | 695 | /* path */ 696 | pJS.canvas.ctx.beginPath(); 697 | pJS.canvas.ctx.moveTo(p1.x, p1.y); 698 | pJS.canvas.ctx.lineTo(p2.x, p2.y); 699 | pJS.canvas.ctx.stroke(); 700 | pJS.canvas.ctx.closePath(); 701 | 702 | } 703 | 704 | } 705 | 706 | }; 707 | 708 | 709 | pJS.fn.interact.attractParticles = function(p1, p2){ 710 | 711 | /* condensed particles */ 712 | var dx = p1.x - p2.x, 713 | dy = p1.y - p2.y, 714 | dist = Math.sqrt(dx*dx + dy*dy); 715 | 716 | if(dist <= pJS.particles.line_linked.distance){ 717 | 718 | var ax = dx/(pJS.particles.move.attract.rotateX*1000), 719 | ay = dy/(pJS.particles.move.attract.rotateY*1000); 720 | 721 | p1.vx -= ax; 722 | p1.vy -= ay; 723 | 724 | p2.vx += ax; 725 | p2.vy += ay; 726 | 727 | } 728 | 729 | 730 | } 731 | 732 | 733 | pJS.fn.interact.bounceParticles = function(p1, p2){ 734 | 735 | var dx = p1.x - p2.x, 736 | dy = p1.y - p2.y, 737 | dist = Math.sqrt(dx*dx + dy*dy), 738 | dist_p = p1.radius+p2.radius; 739 | 740 | if(dist <= dist_p){ 741 | p1.vx = -p1.vx; 742 | p1.vy = -p1.vy; 743 | 744 | p2.vx = -p2.vx; 745 | p2.vy = -p2.vy; 746 | } 747 | 748 | } 749 | 750 | 751 | /* ---------- pJS functions - modes events ------------ */ 752 | 753 | pJS.fn.modes.pushParticles = function(nb, pos){ 754 | 755 | pJS.tmp.pushing = true; 756 | 757 | for(var i = 0; i < nb; i++){ 758 | pJS.particles.array.push( 759 | new pJS.fn.particle( 760 | pJS.particles.color, 761 | pJS.particles.opacity.value, 762 | { 763 | 'x': pos ? pos.pos_x : Math.random() * pJS.canvas.w, 764 | 'y': pos ? pos.pos_y : Math.random() * pJS.canvas.h 765 | } 766 | ) 767 | ) 768 | if(i == nb-1){ 769 | if(!pJS.particles.move.enable){ 770 | pJS.fn.particlesDraw(); 771 | } 772 | pJS.tmp.pushing = false; 773 | } 774 | } 775 | 776 | }; 777 | 778 | 779 | pJS.fn.modes.removeParticles = function(nb){ 780 | 781 | pJS.particles.array.splice(0, nb); 782 | if(!pJS.particles.move.enable){ 783 | pJS.fn.particlesDraw(); 784 | } 785 | 786 | }; 787 | 788 | 789 | pJS.fn.modes.bubbleParticle = function(p){ 790 | 791 | /* on hover event */ 792 | if(pJS.interactivity.events.onhover.enable && isInArray('bubble', pJS.interactivity.events.onhover.mode)){ 793 | 794 | var dx_mouse = p.x - pJS.interactivity.mouse.pos_x, 795 | dy_mouse = p.y - pJS.interactivity.mouse.pos_y, 796 | dist_mouse = Math.sqrt(dx_mouse*dx_mouse + dy_mouse*dy_mouse), 797 | ratio = 1 - dist_mouse / pJS.interactivity.modes.bubble.distance; 798 | 799 | function init(){ 800 | p.opacity_bubble = p.opacity; 801 | p.radius_bubble = p.radius; 802 | } 803 | 804 | /* mousemove - check ratio */ 805 | if(dist_mouse <= pJS.interactivity.modes.bubble.distance){ 806 | 807 | if(ratio >= 0 && pJS.interactivity.status == 'mousemove'){ 808 | 809 | /* size */ 810 | if(pJS.interactivity.modes.bubble.size != pJS.particles.size.value){ 811 | 812 | if(pJS.interactivity.modes.bubble.size > pJS.particles.size.value){ 813 | var size = p.radius + (pJS.interactivity.modes.bubble.size*ratio); 814 | if(size >= 0){ 815 | p.radius_bubble = size; 816 | } 817 | }else{ 818 | var dif = p.radius - pJS.interactivity.modes.bubble.size, 819 | size = p.radius - (dif*ratio); 820 | if(size > 0){ 821 | p.radius_bubble = size; 822 | }else{ 823 | p.radius_bubble = 0; 824 | } 825 | } 826 | 827 | } 828 | 829 | /* opacity */ 830 | if(pJS.interactivity.modes.bubble.opacity != pJS.particles.opacity.value){ 831 | 832 | if(pJS.interactivity.modes.bubble.opacity > pJS.particles.opacity.value){ 833 | var opacity = pJS.interactivity.modes.bubble.opacity*ratio; 834 | if(opacity > p.opacity && opacity <= pJS.interactivity.modes.bubble.opacity){ 835 | p.opacity_bubble = opacity; 836 | } 837 | }else{ 838 | var opacity = p.opacity - (pJS.particles.opacity.value-pJS.interactivity.modes.bubble.opacity)*ratio; 839 | if(opacity < p.opacity && opacity >= pJS.interactivity.modes.bubble.opacity){ 840 | p.opacity_bubble = opacity; 841 | } 842 | } 843 | 844 | } 845 | 846 | } 847 | 848 | }else{ 849 | init(); 850 | } 851 | 852 | 853 | /* mouseleave */ 854 | if(pJS.interactivity.status == 'mouseleave'){ 855 | init(); 856 | } 857 | 858 | } 859 | 860 | /* on click event */ 861 | else if(pJS.interactivity.events.onclick.enable && isInArray('bubble', pJS.interactivity.events.onclick.mode)){ 862 | 863 | 864 | if(pJS.tmp.bubble_clicking){ 865 | var dx_mouse = p.x - pJS.interactivity.mouse.click_pos_x, 866 | dy_mouse = p.y - pJS.interactivity.mouse.click_pos_y, 867 | dist_mouse = Math.sqrt(dx_mouse*dx_mouse + dy_mouse*dy_mouse), 868 | time_spent = (new Date().getTime() - pJS.interactivity.mouse.click_time)/1000; 869 | 870 | if(time_spent > pJS.interactivity.modes.bubble.duration){ 871 | pJS.tmp.bubble_duration_end = true; 872 | } 873 | 874 | if(time_spent > pJS.interactivity.modes.bubble.duration*2){ 875 | pJS.tmp.bubble_clicking = false; 876 | pJS.tmp.bubble_duration_end = false; 877 | } 878 | } 879 | 880 | 881 | function process(bubble_param, particles_param, p_obj_bubble, p_obj, id){ 882 | 883 | if(bubble_param != particles_param){ 884 | 885 | if(!pJS.tmp.bubble_duration_end){ 886 | if(dist_mouse <= pJS.interactivity.modes.bubble.distance){ 887 | if(p_obj_bubble != undefined) var obj = p_obj_bubble; 888 | else var obj = p_obj; 889 | if(obj != bubble_param){ 890 | var value = p_obj - (time_spent * (p_obj - bubble_param) / pJS.interactivity.modes.bubble.duration); 891 | if(id == 'size') p.radius_bubble = value; 892 | if(id == 'opacity') p.opacity_bubble = value; 893 | } 894 | }else{ 895 | if(id == 'size') p.radius_bubble = undefined; 896 | if(id == 'opacity') p.opacity_bubble = undefined; 897 | } 898 | }else{ 899 | if(p_obj_bubble != undefined){ 900 | var value_tmp = p_obj - (time_spent * (p_obj - bubble_param) / pJS.interactivity.modes.bubble.duration), 901 | dif = bubble_param - value_tmp; 902 | value = bubble_param + dif; 903 | if(id == 'size') p.radius_bubble = value; 904 | if(id == 'opacity') p.opacity_bubble = value; 905 | } 906 | } 907 | 908 | } 909 | 910 | } 911 | 912 | if(pJS.tmp.bubble_clicking){ 913 | /* size */ 914 | process(pJS.interactivity.modes.bubble.size, pJS.particles.size.value, p.radius_bubble, p.radius, 'size'); 915 | /* opacity */ 916 | process(pJS.interactivity.modes.bubble.opacity, pJS.particles.opacity.value, p.opacity_bubble, p.opacity, 'opacity'); 917 | } 918 | 919 | } 920 | 921 | }; 922 | 923 | 924 | pJS.fn.modes.repulseParticle = function(p){ 925 | 926 | if(pJS.interactivity.events.onhover.enable && isInArray('repulse', pJS.interactivity.events.onhover.mode) && pJS.interactivity.status == 'mousemove') { 927 | 928 | var dx_mouse = p.x - pJS.interactivity.mouse.pos_x, 929 | dy_mouse = p.y - pJS.interactivity.mouse.pos_y, 930 | dist_mouse = Math.sqrt(dx_mouse*dx_mouse + dy_mouse*dy_mouse); 931 | 932 | var normVec = {x: dx_mouse/dist_mouse, y: dy_mouse/dist_mouse}, 933 | repulseRadius = pJS.interactivity.modes.repulse.distance, 934 | velocity = 100, 935 | repulseFactor = clamp((1/repulseRadius)*(-1*Math.pow(dist_mouse/repulseRadius,2)+1)*repulseRadius*velocity, 0, 50); 936 | 937 | var pos = { 938 | x: p.x + normVec.x * repulseFactor, 939 | y: p.y + normVec.y * repulseFactor 940 | } 941 | 942 | if(pJS.particles.move.out_mode == 'bounce'){ 943 | if(pos.x - p.radius > 0 && pos.x + p.radius < pJS.canvas.w) p.x = pos.x; 944 | if(pos.y - p.radius > 0 && pos.y + p.radius < pJS.canvas.h) p.y = pos.y; 945 | }else{ 946 | p.x = pos.x; 947 | p.y = pos.y; 948 | } 949 | 950 | } 951 | 952 | 953 | else if(pJS.interactivity.events.onclick.enable && isInArray('repulse', pJS.interactivity.events.onclick.mode)) { 954 | 955 | if(!pJS.tmp.repulse_finish){ 956 | pJS.tmp.repulse_count++; 957 | if(pJS.tmp.repulse_count == pJS.particles.array.length){ 958 | pJS.tmp.repulse_finish = true; 959 | } 960 | } 961 | 962 | if(pJS.tmp.repulse_clicking){ 963 | 964 | var repulseRadius = Math.pow(pJS.interactivity.modes.repulse.distance/6, 3); 965 | 966 | var dx = pJS.interactivity.mouse.click_pos_x - p.x, 967 | dy = pJS.interactivity.mouse.click_pos_y - p.y, 968 | d = dx*dx + dy*dy; 969 | 970 | var force = -repulseRadius / d * 1; 971 | 972 | function process(){ 973 | 974 | var f = Math.atan2(dy,dx); 975 | p.vx = force * Math.cos(f); 976 | p.vy = force * Math.sin(f); 977 | 978 | if(pJS.particles.move.out_mode == 'bounce'){ 979 | var pos = { 980 | x: p.x + p.vx, 981 | y: p.y + p.vy 982 | } 983 | if (pos.x + p.radius > pJS.canvas.w) p.vx = -p.vx; 984 | else if (pos.x - p.radius < 0) p.vx = -p.vx; 985 | if (pos.y + p.radius > pJS.canvas.h) p.vy = -p.vy; 986 | else if (pos.y - p.radius < 0) p.vy = -p.vy; 987 | } 988 | 989 | } 990 | 991 | // default 992 | if(d <= repulseRadius){ 993 | process(); 994 | } 995 | 996 | // bang - slow motion mode 997 | // if(!pJS.tmp.repulse_finish){ 998 | // if(d <= repulseRadius){ 999 | // process(); 1000 | // } 1001 | // }else{ 1002 | // process(); 1003 | // } 1004 | 1005 | 1006 | }else{ 1007 | 1008 | if(pJS.tmp.repulse_clicking == false){ 1009 | 1010 | p.vx = p.vx_i; 1011 | p.vy = p.vy_i; 1012 | 1013 | } 1014 | 1015 | } 1016 | 1017 | } 1018 | 1019 | } 1020 | 1021 | 1022 | pJS.fn.modes.grabParticle = function(p){ 1023 | 1024 | if(pJS.interactivity.events.onhover.enable && pJS.interactivity.status == 'mousemove'){ 1025 | 1026 | var dx_mouse = p.x - pJS.interactivity.mouse.pos_x, 1027 | dy_mouse = p.y - pJS.interactivity.mouse.pos_y, 1028 | dist_mouse = Math.sqrt(dx_mouse*dx_mouse + dy_mouse*dy_mouse); 1029 | 1030 | /* draw a line between the cursor and the particle if the distance between them is under the config distance */ 1031 | if(dist_mouse <= pJS.interactivity.modes.grab.distance){ 1032 | 1033 | var opacity_line = pJS.interactivity.modes.grab.line_linked.opacity - (dist_mouse / (1/pJS.interactivity.modes.grab.line_linked.opacity)) / pJS.interactivity.modes.grab.distance; 1034 | 1035 | if(opacity_line > 0){ 1036 | 1037 | /* style */ 1038 | var color_line = pJS.particles.line_linked.color_rgb_line; 1039 | pJS.canvas.ctx.strokeStyle = 'rgba('+color_line.r+','+color_line.g+','+color_line.b+','+opacity_line+')'; 1040 | pJS.canvas.ctx.lineWidth = pJS.particles.line_linked.width; 1041 | //pJS.canvas.ctx.lineCap = 'round'; /* performance issue */ 1042 | 1043 | /* path */ 1044 | pJS.canvas.ctx.beginPath(); 1045 | pJS.canvas.ctx.moveTo(p.x, p.y); 1046 | pJS.canvas.ctx.lineTo(pJS.interactivity.mouse.pos_x, pJS.interactivity.mouse.pos_y); 1047 | pJS.canvas.ctx.stroke(); 1048 | pJS.canvas.ctx.closePath(); 1049 | 1050 | } 1051 | 1052 | } 1053 | 1054 | } 1055 | 1056 | }; 1057 | 1058 | 1059 | 1060 | /* ---------- pJS functions - vendors ------------ */ 1061 | 1062 | pJS.fn.vendors.eventsListeners = function(){ 1063 | 1064 | /* events target element */ 1065 | if(pJS.interactivity.detect_on == 'window'){ 1066 | pJS.interactivity.el = window; 1067 | }else{ 1068 | pJS.interactivity.el = pJS.canvas.el; 1069 | } 1070 | 1071 | 1072 | /* detect mouse pos - on hover / click event */ 1073 | if(pJS.interactivity.events.onhover.enable || pJS.interactivity.events.onclick.enable){ 1074 | 1075 | /* el on mousemove */ 1076 | pJS.interactivity.el.addEventListener('mousemove', function(e){ 1077 | 1078 | if(pJS.interactivity.el == window){ 1079 | var pos_x = e.clientX, 1080 | pos_y = e.clientY; 1081 | } 1082 | else{ 1083 | var pos_x = e.offsetX || e.clientX, 1084 | pos_y = e.offsetY || e.clientY; 1085 | } 1086 | 1087 | pJS.interactivity.mouse.pos_x = pos_x; 1088 | pJS.interactivity.mouse.pos_y = pos_y; 1089 | 1090 | if(pJS.tmp.retina){ 1091 | pJS.interactivity.mouse.pos_x *= pJS.canvas.pxratio; 1092 | pJS.interactivity.mouse.pos_y *= pJS.canvas.pxratio; 1093 | } 1094 | 1095 | pJS.interactivity.status = 'mousemove'; 1096 | 1097 | }); 1098 | 1099 | /* el on onmouseleave */ 1100 | pJS.interactivity.el.addEventListener('mouseleave', function(e){ 1101 | 1102 | pJS.interactivity.mouse.pos_x = null; 1103 | pJS.interactivity.mouse.pos_y = null; 1104 | pJS.interactivity.status = 'mouseleave'; 1105 | 1106 | }); 1107 | 1108 | } 1109 | 1110 | /* on click event */ 1111 | if(pJS.interactivity.events.onclick.enable){ 1112 | 1113 | pJS.interactivity.el.addEventListener('click', function(){ 1114 | 1115 | pJS.interactivity.mouse.click_pos_x = pJS.interactivity.mouse.pos_x; 1116 | pJS.interactivity.mouse.click_pos_y = pJS.interactivity.mouse.pos_y; 1117 | pJS.interactivity.mouse.click_time = new Date().getTime(); 1118 | 1119 | if(pJS.interactivity.events.onclick.enable){ 1120 | 1121 | switch(pJS.interactivity.events.onclick.mode){ 1122 | 1123 | case 'push': 1124 | if(pJS.particles.move.enable){ 1125 | pJS.fn.modes.pushParticles(pJS.interactivity.modes.push.particles_nb, pJS.interactivity.mouse); 1126 | }else{ 1127 | if(pJS.interactivity.modes.push.particles_nb == 1){ 1128 | pJS.fn.modes.pushParticles(pJS.interactivity.modes.push.particles_nb, pJS.interactivity.mouse); 1129 | } 1130 | else if(pJS.interactivity.modes.push.particles_nb > 1){ 1131 | pJS.fn.modes.pushParticles(pJS.interactivity.modes.push.particles_nb); 1132 | } 1133 | } 1134 | break; 1135 | 1136 | case 'remove': 1137 | pJS.fn.modes.removeParticles(pJS.interactivity.modes.remove.particles_nb); 1138 | break; 1139 | 1140 | case 'bubble': 1141 | pJS.tmp.bubble_clicking = true; 1142 | break; 1143 | 1144 | case 'repulse': 1145 | pJS.tmp.repulse_clicking = true; 1146 | pJS.tmp.repulse_count = 0; 1147 | pJS.tmp.repulse_finish = false; 1148 | setTimeout(function(){ 1149 | pJS.tmp.repulse_clicking = false; 1150 | }, pJS.interactivity.modes.repulse.duration*1000) 1151 | break; 1152 | 1153 | } 1154 | 1155 | } 1156 | 1157 | }); 1158 | 1159 | } 1160 | 1161 | 1162 | }; 1163 | 1164 | pJS.fn.vendors.densityAutoParticles = function(){ 1165 | 1166 | if(pJS.particles.number.density.enable){ 1167 | 1168 | /* calc area */ 1169 | var area = pJS.canvas.el.width * pJS.canvas.el.height / 1000; 1170 | if(pJS.tmp.retina){ 1171 | area = area/(pJS.canvas.pxratio*2); 1172 | } 1173 | 1174 | /* calc number of particles based on density area */ 1175 | var nb_particles = area * pJS.particles.number.value / pJS.particles.number.density.value_area; 1176 | 1177 | /* add or remove X particles */ 1178 | var missing_particles = pJS.particles.array.length - nb_particles; 1179 | if(missing_particles < 0) pJS.fn.modes.pushParticles(Math.abs(missing_particles)); 1180 | else pJS.fn.modes.removeParticles(missing_particles); 1181 | 1182 | } 1183 | 1184 | }; 1185 | 1186 | 1187 | pJS.fn.vendors.checkOverlap = function(p1, position){ 1188 | for(var i = 0; i < pJS.particles.array.length; i++){ 1189 | var p2 = pJS.particles.array[i]; 1190 | 1191 | var dx = p1.x - p2.x, 1192 | dy = p1.y - p2.y, 1193 | dist = Math.sqrt(dx*dx + dy*dy); 1194 | 1195 | if(dist <= p1.radius + p2.radius){ 1196 | p1.x = position ? position.x : Math.random() * pJS.canvas.w; 1197 | p1.y = position ? position.y : Math.random() * pJS.canvas.h; 1198 | pJS.fn.vendors.checkOverlap(p1); 1199 | } 1200 | } 1201 | }; 1202 | 1203 | 1204 | pJS.fn.vendors.createSvgImg = function(p){ 1205 | 1206 | /* set color to svg element */ 1207 | var svgXml = pJS.tmp.source_svg, 1208 | rgbHex = /#([0-9A-F]{3,6})/gi, 1209 | coloredSvgXml = svgXml.replace(rgbHex, function (m, r, g, b) { 1210 | if(p.color.rgb){ 1211 | var color_value = 'rgba('+p.color.rgb.r+','+p.color.rgb.g+','+p.color.rgb.b+','+p.opacity+')'; 1212 | }else{ 1213 | var color_value = 'hsla('+p.color.hsl.h+','+p.color.hsl.s+'%,'+p.color.hsl.l+'%,'+p.opacity+')'; 1214 | } 1215 | return color_value; 1216 | }); 1217 | 1218 | /* prepare to create img with colored svg */ 1219 | var svg = new Blob([coloredSvgXml], {type: 'image/svg+xml;charset=utf-8'}), 1220 | DOMURL = window.URL || window.webkitURL || window, 1221 | url = DOMURL.createObjectURL(svg); 1222 | 1223 | /* create particle img obj */ 1224 | var img = new Image(); 1225 | img.addEventListener('load', function(){ 1226 | p.img.obj = img; 1227 | p.img.loaded = true; 1228 | DOMURL.revokeObjectURL(url); 1229 | pJS.tmp.count_svg++; 1230 | }); 1231 | img.src = url; 1232 | 1233 | }; 1234 | 1235 | 1236 | pJS.fn.vendors.destroypJS = function(){ 1237 | cancelAnimationFrame(pJS.fn.drawAnimFrame); 1238 | canvas_el.remove(); 1239 | pJSDom = null; 1240 | }; 1241 | 1242 | 1243 | pJS.fn.vendors.drawShape = function(c, startX, startY, sideLength, sideCountNumerator, sideCountDenominator){ 1244 | 1245 | // By Programming Thomas - https://programmingthomas.wordpress.com/2013/04/03/n-sided-shapes/ 1246 | var sideCount = sideCountNumerator * sideCountDenominator; 1247 | var decimalSides = sideCountNumerator / sideCountDenominator; 1248 | var interiorAngleDegrees = (180 * (decimalSides - 2)) / decimalSides; 1249 | var interiorAngle = Math.PI - Math.PI * interiorAngleDegrees / 180; // convert to radians 1250 | c.save(); 1251 | c.beginPath(); 1252 | c.translate(startX, startY); 1253 | c.moveTo(0,0); 1254 | for (var i = 0; i < sideCount; i++) { 1255 | c.lineTo(sideLength,0); 1256 | c.translate(sideLength,0); 1257 | c.rotate(interiorAngle); 1258 | } 1259 | //c.stroke(); 1260 | c.fill(); 1261 | c.restore(); 1262 | 1263 | }; 1264 | 1265 | pJS.fn.vendors.exportImg = function(){ 1266 | window.open(pJS.canvas.el.toDataURL('image/png'), '_blank'); 1267 | }; 1268 | 1269 | 1270 | pJS.fn.vendors.loadImg = function(type){ 1271 | 1272 | pJS.tmp.img_error = undefined; 1273 | 1274 | if(pJS.particles.shape.image.src != ''){ 1275 | 1276 | if(type == 'svg'){ 1277 | 1278 | var xhr = new XMLHttpRequest(); 1279 | xhr.open('GET', pJS.particles.shape.image.src); 1280 | xhr.onreadystatechange = function (data) { 1281 | if(xhr.readyState == 4){ 1282 | if(xhr.status == 200){ 1283 | pJS.tmp.source_svg = data.currentTarget.response; 1284 | pJS.fn.vendors.checkBeforeDraw(); 1285 | }else{ 1286 | console.log('Error pJS - Image not found'); 1287 | pJS.tmp.img_error = true; 1288 | } 1289 | } 1290 | } 1291 | xhr.send(); 1292 | 1293 | }else{ 1294 | 1295 | var img = new Image(); 1296 | img.addEventListener('load', function(){ 1297 | pJS.tmp.img_obj = img; 1298 | pJS.fn.vendors.checkBeforeDraw(); 1299 | }); 1300 | img.src = pJS.particles.shape.image.src; 1301 | 1302 | } 1303 | 1304 | }else{ 1305 | console.log('Error pJS - No image.src'); 1306 | pJS.tmp.img_error = true; 1307 | } 1308 | 1309 | }; 1310 | 1311 | 1312 | pJS.fn.vendors.draw = function(){ 1313 | 1314 | if(pJS.particles.shape.type == 'image'){ 1315 | 1316 | if(pJS.tmp.img_type == 'svg'){ 1317 | 1318 | if(pJS.tmp.count_svg >= pJS.particles.number.value){ 1319 | pJS.fn.particlesDraw(); 1320 | if(!pJS.particles.move.enable) cancelRequestAnimFrame(pJS.fn.drawAnimFrame); 1321 | else pJS.fn.drawAnimFrame = requestAnimFrame(pJS.fn.vendors.draw); 1322 | }else{ 1323 | //console.log('still loading...'); 1324 | if(!pJS.tmp.img_error) pJS.fn.drawAnimFrame = requestAnimFrame(pJS.fn.vendors.draw); 1325 | } 1326 | 1327 | }else{ 1328 | 1329 | if(pJS.tmp.img_obj != undefined){ 1330 | pJS.fn.particlesDraw(); 1331 | if(!pJS.particles.move.enable) cancelRequestAnimFrame(pJS.fn.drawAnimFrame); 1332 | else pJS.fn.drawAnimFrame = requestAnimFrame(pJS.fn.vendors.draw); 1333 | }else{ 1334 | if(!pJS.tmp.img_error) pJS.fn.drawAnimFrame = requestAnimFrame(pJS.fn.vendors.draw); 1335 | } 1336 | 1337 | } 1338 | 1339 | }else{ 1340 | pJS.fn.particlesDraw(); 1341 | if(!pJS.particles.move.enable) cancelRequestAnimFrame(pJS.fn.drawAnimFrame); 1342 | else pJS.fn.drawAnimFrame = requestAnimFrame(pJS.fn.vendors.draw); 1343 | } 1344 | 1345 | }; 1346 | 1347 | 1348 | pJS.fn.vendors.checkBeforeDraw = function(){ 1349 | 1350 | // if shape is image 1351 | if(pJS.particles.shape.type == 'image'){ 1352 | 1353 | if(pJS.tmp.img_type == 'svg' && pJS.tmp.source_svg == undefined){ 1354 | pJS.tmp.checkAnimFrame = requestAnimFrame(check); 1355 | }else{ 1356 | //console.log('images loaded! cancel check'); 1357 | cancelRequestAnimFrame(pJS.tmp.checkAnimFrame); 1358 | if(!pJS.tmp.img_error){ 1359 | pJS.fn.vendors.init(); 1360 | pJS.fn.vendors.draw(); 1361 | } 1362 | 1363 | } 1364 | 1365 | }else{ 1366 | pJS.fn.vendors.init(); 1367 | pJS.fn.vendors.draw(); 1368 | } 1369 | 1370 | }; 1371 | 1372 | 1373 | pJS.fn.vendors.init = function(){ 1374 | 1375 | /* init canvas + particles */ 1376 | pJS.fn.retinaInit(); 1377 | pJS.fn.canvasInit(); 1378 | pJS.fn.canvasSize(); 1379 | pJS.fn.canvasPaint(); 1380 | pJS.fn.particlesCreate(); 1381 | pJS.fn.vendors.densityAutoParticles(); 1382 | 1383 | /* particles.line_linked - convert hex colors to rgb */ 1384 | pJS.particles.line_linked.color_rgb_line = hexToRgb(pJS.particles.line_linked.color); 1385 | 1386 | }; 1387 | 1388 | 1389 | pJS.fn.vendors.start = function(){ 1390 | 1391 | if(isInArray('image', pJS.particles.shape.type)){ 1392 | pJS.tmp.img_type = pJS.particles.shape.image.src.substr(pJS.particles.shape.image.src.length - 3); 1393 | pJS.fn.vendors.loadImg(pJS.tmp.img_type); 1394 | }else{ 1395 | pJS.fn.vendors.checkBeforeDraw(); 1396 | } 1397 | 1398 | }; 1399 | 1400 | 1401 | 1402 | 1403 | /* ---------- pJS - start ------------ */ 1404 | 1405 | 1406 | pJS.fn.vendors.eventsListeners(); 1407 | 1408 | pJS.fn.vendors.start(); 1409 | 1410 | 1411 | 1412 | }; 1413 | 1414 | /* ---------- global functions - vendors ------------ */ 1415 | 1416 | Object.deepExtend = function(destination, source) { 1417 | for (var property in source) { 1418 | if (source[property] && source[property].constructor && 1419 | source[property].constructor === Object) { 1420 | destination[property] = destination[property] || {}; 1421 | arguments.callee(destination[property], source[property]); 1422 | } else { 1423 | destination[property] = source[property]; 1424 | } 1425 | } 1426 | return destination; 1427 | }; 1428 | 1429 | window.requestAnimFrame = (function(){ 1430 | return window.requestAnimationFrame || 1431 | window.webkitRequestAnimationFrame || 1432 | window.mozRequestAnimationFrame || 1433 | window.oRequestAnimationFrame || 1434 | window.msRequestAnimationFrame || 1435 | function(callback){ 1436 | window.setTimeout(callback, 1000 / 60); 1437 | }; 1438 | })(); 1439 | 1440 | window.cancelRequestAnimFrame = ( function() { 1441 | return window.cancelAnimationFrame || 1442 | window.webkitCancelRequestAnimationFrame || 1443 | window.mozCancelRequestAnimationFrame || 1444 | window.oCancelRequestAnimationFrame || 1445 | window.msCancelRequestAnimationFrame || 1446 | clearTimeout 1447 | } )(); 1448 | 1449 | function hexToRgb(hex){ 1450 | // By Tim Down - http://stackoverflow.com/a/5624139/3493650 1451 | // Expand shorthand form (e.g. "03F") to full form (e.g. "0033FF") 1452 | var shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i; 1453 | hex = hex.replace(shorthandRegex, function(m, r, g, b) { 1454 | return r + r + g + g + b + b; 1455 | }); 1456 | var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); 1457 | return result ? { 1458 | r: parseInt(result[1], 16), 1459 | g: parseInt(result[2], 16), 1460 | b: parseInt(result[3], 16) 1461 | } : null; 1462 | }; 1463 | 1464 | function clamp(number, min, max) { 1465 | return Math.min(Math.max(number, min), max); 1466 | }; 1467 | 1468 | function isInArray(value, array) { 1469 | return array.indexOf(value) > -1; 1470 | } 1471 | 1472 | 1473 | /* ---------- particles.js functions - start ------------ */ 1474 | 1475 | window.pJSDom = []; 1476 | 1477 | window.particlesJS = function(tag_id, params){ 1478 | 1479 | //console.log(params); 1480 | 1481 | /* no string id? so it's object params, and set the id with default id */ 1482 | if(typeof(tag_id) != 'string'){ 1483 | params = tag_id; 1484 | tag_id = 'particles-js'; 1485 | } 1486 | 1487 | /* no id? set the id to default id */ 1488 | if(!tag_id){ 1489 | tag_id = 'particles-js'; 1490 | } 1491 | 1492 | /* pJS elements */ 1493 | var pJS_tag = document.getElementById(tag_id), 1494 | pJS_canvas_class = 'particles-js-canvas-el', 1495 | exist_canvas = pJS_tag.getElementsByClassName(pJS_canvas_class); 1496 | 1497 | /* remove canvas if exists into the pJS target tag */ 1498 | if(exist_canvas.length){ 1499 | while(exist_canvas.length > 0){ 1500 | pJS_tag.removeChild(exist_canvas[0]); 1501 | } 1502 | } 1503 | 1504 | /* create canvas element */ 1505 | var canvas_el = document.createElement('canvas'); 1506 | canvas_el.className = pJS_canvas_class; 1507 | 1508 | /* set size canvas */ 1509 | canvas_el.style.width = "100%"; 1510 | canvas_el.style.height = "100%"; 1511 | 1512 | /* append canvas */ 1513 | var canvas = document.getElementById(tag_id).appendChild(canvas_el); 1514 | 1515 | /* launch particle.js */ 1516 | if(canvas != null){ 1517 | pJSDom.push(new pJS(tag_id, params)); 1518 | } 1519 | 1520 | }; 1521 | 1522 | window.particlesJS.load = function(tag_id, path_config_json, callback){ 1523 | 1524 | /* load json config */ 1525 | var xhr = new XMLHttpRequest(); 1526 | xhr.open('GET', path_config_json); 1527 | xhr.onreadystatechange = function (data) { 1528 | if(xhr.readyState == 4){ 1529 | if(xhr.status == 200){ 1530 | var params = JSON.parse(data.currentTarget.response); 1531 | window.particlesJS(tag_id, params); 1532 | if(callback) callback(); 1533 | }else{ 1534 | console.log('Error pJS - XMLHttpRequest status: '+xhr.status); 1535 | console.log('Error pJS - File config not found'); 1536 | } 1537 | } 1538 | }; 1539 | xhr.send(); 1540 | 1541 | }; --------------------------------------------------------------------------------