├── server ├── certificates │ └── README.md ├── .dockerignore ├── requirements.txt ├── controllers │ ├── TopSitesController.js │ ├── FaviconsController.js │ ├── db_operations.js │ ├── LoginDataController.js │ ├── VolumesController.js │ ├── WebDataController.js │ ├── SuspectProfile.js │ ├── HistoryController.js │ └── CacheController.js ├── .gitignore ├── routers │ ├── topsites.js │ ├── cache.js │ ├── favicons.js │ ├── logindata.js │ ├── evidence.js │ ├── webdata.js │ ├── volumes.js │ ├── user.js │ ├── bookmarks.js │ ├── profile.js │ └── history.js ├── db │ └── mongoose.js ├── models │ ├── evidence.js │ └── user.js ├── middleware │ └── auth.js ├── package.json ├── server.js ├── app.js ├── Dockerfile └── utils │ └── predictor │ └── url-class.py ├── .gitignore ├── teardown.sh ├── data └── README.md ├── client ├── public │ ├── robots.txt │ ├── favicon.ico │ ├── logo192.png │ ├── logo512.png │ ├── manifest.json │ └── index.html ├── src │ ├── layout │ │ ├── CenteredWrapper │ │ │ ├── forest.jpeg │ │ │ ├── CenteredWrapper.js │ │ │ └── CenteredWrapper.css │ │ ├── ContentWrapper │ │ │ └── ContentWrapper.js │ │ ├── TopBar │ │ │ ├── TopBar.css │ │ │ └── TopBar.js │ │ └── Sidemenu │ │ │ ├── Sidemenu.css │ │ │ └── Sidemenu.js │ ├── views │ │ ├── favicons │ │ │ ├── FaviconsContainer.css │ │ │ ├── components │ │ │ │ └── FaviconModal.js │ │ │ └── FaviconsContainer.js │ │ ├── dashboard │ │ │ ├── components │ │ │ │ ├── Profile │ │ │ │ │ ├── Profile.css │ │ │ │ │ └── Profile.js │ │ │ │ ├── BrowsingActivity │ │ │ │ │ ├── react-calendar-heatmap.css │ │ │ │ │ └── BrowsingActivity.js │ │ │ │ ├── TopSites │ │ │ │ │ └── TopSites.js │ │ │ │ ├── SystemSpecs │ │ │ │ │ └── SystemSpecs.js │ │ │ │ ├── UserActivity │ │ │ │ │ └── UserActivity.js │ │ │ │ ├── RadarWidget │ │ │ │ │ └── RadarWidget.js │ │ │ │ └── LoginPie │ │ │ │ │ └── LoginPie.js │ │ │ └── DashboardContainer.js │ │ ├── history │ │ │ ├── components │ │ │ │ ├── AvgVisitChart │ │ │ │ │ └── AvgVisitChart.js │ │ │ │ └── HistoryTable │ │ │ │ │ └── HistoryTable.js │ │ │ └── HistoryContainer.js │ │ ├── webdata │ │ │ ├── components │ │ │ │ ├── GoogleMaps.js │ │ │ │ └── WebDataTable.js │ │ │ └── WebDataContainer.js │ │ ├── downloads │ │ │ ├── components │ │ │ │ └── DownloadsTable.js │ │ │ └── DownloadsContainer.js │ │ ├── volumes │ │ │ └── VolumesContainer.js │ │ ├── bookmarks │ │ │ └── BookmarksContainer.js │ │ ├── database │ │ │ └── DatabaseContainer.js │ │ ├── logindata │ │ │ └── LoginDataContainer.js │ │ └── cache │ │ │ └── CacheContainer.js │ ├── setupTests.js │ ├── App.test.js │ ├── axios-api.js │ ├── index.css │ ├── common │ │ ├── Logo │ │ │ └── Logo.js │ │ └── SaveEvidenceModal │ │ │ └── SaveEvidenceModal.js │ ├── volumeMenu │ │ ├── VolumeMenu.css │ │ ├── Volume.js │ │ └── VolumeMenu.js │ ├── login │ │ ├── Login.css │ │ └── Login.js │ ├── store │ │ ├── reducers │ │ │ ├── auth.js │ │ │ └── appData.js │ │ └── actions │ │ │ ├── auth.js │ │ │ └── appData.js │ ├── index.js │ ├── App.js │ └── serviceWorker.js ├── certificates │ └── README.md ├── Dockerfile ├── .gitignore ├── server.js ├── package.json └── README.md ├── .gitattributes ├── startup.sh ├── install.sh ├── docker-compose.yml ├── LICENSE ├── download-model.sh └── README.md /server/certificates/README.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | mongo-volume/ 2 | .idea/ 3 | data/ -------------------------------------------------------------------------------- /server/.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | npm-debug.log -------------------------------------------------------------------------------- /teardown.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | docker-compose down 4 | docker system prune -------------------------------------------------------------------------------- /data/README.md: -------------------------------------------------------------------------------- 1 | Placeholder for content of Google Chrome /Default directory. 2 | -------------------------------------------------------------------------------- /client/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | server/utils/predictor/finalized_model.sav filter=lfs diff=lfs merge=lfs -text 2 | -------------------------------------------------------------------------------- /client/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChmaraX/forensix/HEAD/client/public/favicon.ico -------------------------------------------------------------------------------- /client/public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChmaraX/forensix/HEAD/client/public/logo192.png -------------------------------------------------------------------------------- /client/public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChmaraX/forensix/HEAD/client/public/logo512.png -------------------------------------------------------------------------------- /startup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | docker-compose up -d 4 | 5 | echo "All containers are up and running." -------------------------------------------------------------------------------- /client/src/layout/CenteredWrapper/forest.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChmaraX/forensix/HEAD/client/src/layout/CenteredWrapper/forest.jpeg -------------------------------------------------------------------------------- /client/src/views/favicons/FaviconsContainer.css: -------------------------------------------------------------------------------- 1 | .favicon-tab:hover { 2 | cursor: pointer; 3 | background-color: rgba(215, 237, 255, 0.449); 4 | } 5 | -------------------------------------------------------------------------------- /client/certificates/README.md: -------------------------------------------------------------------------------- 1 | ## Certificates 2 | 3 | #### Generate server certificate and key: 4 | 5 | ```bash 6 | openssl req -nodes -new -x509 -keyout server.key -out server.cert 7 | ``` 8 | -------------------------------------------------------------------------------- /install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | if [ "$1" == "-b" ] 3 | then 4 | docker-compose build --no-cache 5 | else 6 | docker-compose pull 7 | fi 8 | 9 | echo "All images have been successfully built." 10 | -------------------------------------------------------------------------------- /client/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:16.14-bullseye-slim 2 | 3 | # Create app directory 4 | WORKDIR /app 5 | 6 | # Install app dependencies 7 | COPY . . 8 | 9 | RUN npm install -qy 10 | RUN npm run build 11 | 12 | EXPOSE 3000 13 | CMD [ "sh", "-c", "node server.js"] -------------------------------------------------------------------------------- /client/src/layout/CenteredWrapper/CenteredWrapper.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import "./CenteredWrapper.css"; 3 | 4 | function CenteredWrapper(props) { 5 | return
19 | Please set REACT_APP_GOOGLE_MAPS_API_KEY in your environment variables.
20 |
21 | Create a .env file in the client directory with:
22 |
23 | REACT_APP_GOOGLE_MAPS_API_KEY=your_api_key_here
24 |
No volumes available
49 | )} 50 |41 | Selected records will be stored in shared database with other 42 | investigators. 43 |
44 | 50 |
42 |
44 | Integrity:
45 | {fetching ? (
46 |
73 | Google Chrome forensics tool 74 |
75 |
89 |
107 |
Google Chrome forensic tool
3 | 4 | 7 | 8 |Forensic tool for processing, analyzing and visually presenting Google Chrome artifacts.
9 | 10 |  11 | 12 | ## Features 13 | * Mounting of volume with Google Chrome data and preserving integrity trough manipulation process 14 | - read only 15 | - hash checking 16 | * Suspect profile and behavior estimations including: 17 | - personal information (emails, phone nums, date of birth, gender, nation, city, adress...) 18 | - Chrome metadata 19 | - Accounts 20 | - Version 21 | - Target system metadata 22 | - Operating system 23 | - Display resolution 24 | - Mobile Devices 25 | - Browsing history URL category classification using ML model 26 | - Login data frequency (most used emails and credentials) 27 | - Browsing activity during time periods (heatmap, barchart) 28 | - Most visited websites 29 | * Browsing history 30 | - transition types 31 | - visit durations 32 | - avg. visit duration for most common sites 33 | * Login data (including parsed metadata) 34 | * Autofills 35 | - estimated cities and zip codes 36 | - estimated phone number 37 | - other possible addresses 38 | - geolocation API (needed to be registered to Google) 39 | * Downloads (including default download directory, download statistics...) 40 | - default download directory 41 | - download statistics 42 | * Bookmarks 43 | * Favicons (including all subdomains used for respective favicon) 44 | * Cache 45 | - URLs 46 | - content types 47 | - payloads (images or base64) 48 | - additional parsed metadata 49 | * Volume 50 | - volume structure data (visual, JSON) 51 | * Shared database to save potential evidence found by investigators 52 | 53 | 54 | ## Installation 55 | 56 | ### Requirements 57 | 58 | - [Docker](https://docs.docker.com/install/) 59 | - [Docker Compose](https://docs.docker.com/compose/install/) 60 | 61 | ### Quick Start 62 | 63 | 1. **Clone the repository:** 64 | ```bash 65 | git clone https://github.com/ChmaraX/forensix.git 66 | cd forensix 67 | ``` 68 | 69 | 2. **Prepare your browser data:** 70 | Copy your Chrome/Brave browser data to the `data` directory: 71 | ```bash 72 | # For Chrome (replace with your actual profile path) 73 | cp -r "/Users/username/Library/Application Support/Google/Chrome/Default/." ./data/ 74 | 75 | # For Brave (replace with your actual profile path) 76 | cp -r "/Users/username/Library/Application Support/BraveSoftware/Brave-Browser/Profile 2/." ./data/ 77 | ``` 78 | 79 | 3. **Build and start the application:** 80 | ```bash 81 | docker-compose up --build 82 | ``` 83 | 84 | **That's it!** The Docker setup will automatically: 85 | - Build all services from source code 86 | - Install Node.js and Python dependencies 87 | - Download the ML model (~700MB) for URL classification 88 | - Start all services 89 | 90 | **Note:** The first build may take several minutes due to downloading dependencies and the ML model. 91 | 92 | ### Manual Installation (Alternative) 93 | 94 | If you prefer to run without Docker: 95 | 96 | 1. **Install Python dependencies:** 97 | ```bash 98 | pip install -r requirements.txt 99 | ``` 100 | 101 | 2. **Download the ML model:** 102 | ```bash 103 | ./download-model.sh 104 | ``` 105 | 106 | 3. **Install and start services manually:** 107 | ```bash 108 | # Server 109 | cd server 110 | npm install 111 | npm start 112 | 113 | # Client (in another terminal) 114 | cd client 115 | npm install 116 | npm start 117 | ``` 118 | 119 | The runninng services are listenning on: 120 | 121 | - ForensiX UI => http://localhost:3000 122 | - ForensiX Server => http://localhost:3001 123 | - MongoDB => http://localhost:27017 124 | 125 | ## HTTPS/SSL 126 | 127 | If you want to use `HTTPS` for communication between on UI or Server side, place key and certificate into `/certificates` directory in either `/server` or `/client` directory. 128 | 129 | To generate self-signed keys: 130 | 131 | ```bash 132 | openssl req -nodes -new -x509 -keyout server.key -out server.cert 133 | ``` 134 | 135 | Change `baseURL` protocol to https in `/client/src/axios-api.js`, 136 | then rebuild the specific changed image: 137 | 138 | ```bash 139 | docker-compose build
127 | ForensiX - Digital Forensics Tool
128 | Browser Artifact Analysis & Investigation
129 | Open Source Forensic Software
130 |
48 | Hosting: {securityModal?.data?.site?.hosting?.[0]} 49 |
50 |51 | IPs:{" "} 52 | {securityModal?.data?.site?.ip?.map((ip) => ( 53 |
{ip}
54 | ))} 55 | 56 |57 | TLS cert. expires: {securityModal?.data?.tls?.cert_expires} 58 |
59 |60 | Servers:{" "} 61 | {securityModal?.data?.software?.server?.map((server) => ( 62 |
63 | {server.name} / {server.version} 64 |
65 | ))} 66 | 67 |69 | TLS: {securityModal?.data?.ratings?.tls?.rating} 70 |
71 |72 | Total: {securityModal?.data?.ratings?.total?.rating} 73 |
74 |75 | Domain: {securityModal?.data?.ratings?.domain?.rating} 76 |
77 |78 | Security: {securityModal?.data?.ratings?.security?.rating} 79 |
80 |
78 | gender:{" "}
79 | {profile.birthday.gender === 1
80 | ? "male"
81 | : profile.birthday.gender === 2
82 | ? "female"
83 | : "unknown"}{" "}
84 |
96 | nation: {profile.nation.country.substring(0, 15)}{" "}
97 |
98 | birthday: {profile.birthday.birthyear || "unknown"}
99 |
101 | address: {profile.probableAddress || "unknown"}
102 |
103 | city: {profile.probableCity || "unknown"}
104 | phone: {profile.phone || "unknown"}
105 |
No accounts found.
112 | ) : ( 113 |
121 | email: {acc.email}
122 | locale: {acc.locale}
123 |
125 | adv. protection:{" "}
126 | {acc.is_under_advanced_protection.toString()}
127 | child account: {acc.is_child_account.toString()}
128 |