Spaces:
Runtime error
Runtime error
Upload 17 files
Browse files- Dockerfile +25 -0
- LICENSE +21 -0
- README.md +335 -0
- app.py +601 -0
- c2_dashboard.py +148 -0
- code_analysis_report.txt +95 -0
- conversation-small-cll5buey.css +1 -0
- devcontainer.json +7 -0
- file_structure.txt +39 -0
- logo.png +0 -0
- main.py +34 -0
- manifest-5de69407.js +1 -0
- requirements.txt +12 -0
- root-erhliqbe.css +0 -0
- settings.py +426 -0
- user_setup.py +45 -0
- utils.py +631 -0
Dockerfile
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Use a slim Python base image
|
| 2 |
+
FROM python:3.9-slim
|
| 3 |
+
|
| 4 |
+
# Set the working directory
|
| 5 |
+
WORKDIR /app
|
| 6 |
+
|
| 7 |
+
# Create a non-root user and switch to it
|
| 8 |
+
RUN useradd -m appuser
|
| 9 |
+
USER appuser
|
| 10 |
+
|
| 11 |
+
# Copy project files
|
| 12 |
+
COPY . /app
|
| 13 |
+
|
| 14 |
+
# Install dependencies
|
| 15 |
+
RUN pip install --no-cache-dir -r requirements.txt
|
| 16 |
+
|
| 17 |
+
# Expose the Gradio default port
|
| 18 |
+
EXPOSE 7860
|
| 19 |
+
|
| 20 |
+
# Set environment variables for API keys
|
| 21 |
+
ENV OPENAI_API_KEY=${OPENAI_API_KEY}
|
| 22 |
+
ENV HUGGINGFACE_API_KEY=${HUGGINGFACE_API_KEY}
|
| 23 |
+
|
| 24 |
+
# Command to start the Gradio app
|
| 25 |
+
CMD ["python", "src/frontend/archive_gui.py"]
|
LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
MIT License
|
| 2 |
+
|
| 3 |
+
Copyright (c) 2025 DEFENSE INTELLIGENCE AGENCY • PROJECT RED SWORD
|
| 4 |
+
|
| 5 |
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
| 6 |
+
of this software and associated documentation files (the "Software"), to deal
|
| 7 |
+
in the Software without restriction, including without limitation the rights
|
| 8 |
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
| 9 |
+
copies of the Software, and to permit persons to whom the Software is
|
| 10 |
+
furnished to do so, subject to the following conditions:
|
| 11 |
+
|
| 12 |
+
The above copyright notice and this permission notice shall be included in all
|
| 13 |
+
copies or substantial portions of the Software.
|
| 14 |
+
|
| 15 |
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
| 16 |
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
| 17 |
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
| 18 |
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
| 19 |
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
| 20 |
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
| 21 |
+
SOFTWARE.
|
README.md
ADDED
|
@@ -0,0 +1,335 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
license: mit
|
| 3 |
+
sdk: docker
|
| 4 |
+
emoji: 🚀
|
| 5 |
+
colorFrom: red
|
| 6 |
+
colorTo: green
|
| 7 |
+
pinned: true
|
| 8 |
+
thumbnail: >-
|
| 9 |
+
https://cdn-uploads.huggingface.co/production/uploads/670eca1fff5c46c7f23c32cd/LYKAb16YcsterJNlegp7j.png
|
| 10 |
+
short_description: Advanced Automated Cybersecurity Framewor
|
| 11 |
+
---
|
| 12 |
+
|
| 13 |
+
# Classified Materials Warning
|
| 14 |
+
|
| 15 |
+
**WARNING: This repository contains classified materials. Unauthorized access, use, disclosure, or dissemination of the information contained herein is strictly prohibited and may result in severe legal consequences.**
|
| 16 |
+
|
| 17 |
+
**DISCLAIMER: All users must adhere to the handling and usage guidelines for classified materials as outlined by the relevant authorities. Failure to comply with these guidelines may result in disciplinary action, including termination of access and legal prosecution.**
|
| 18 |
+
|
| 19 |
+
**NOTICE: Unauthorized access or misuse of classified information is a violation of federal law and may result in criminal prosecution. All activities within this repository are monitored and logged.**
|
| 20 |
+
|
| 21 |
+
# Project Red Sword: Cybersecurity Framework
|
| 22 |
+
|
| 23 |
+
Project Red Sword is an advanced cybersecurity framework designed to address and mitigate modern cyber threats. It integrates a wide variety of security tools, including advanced attack strategies, threat intelligence sources, and AI-driven techniques for proactive defense and post-exploitation. This repository aims to provide cutting-edge techniques, automation, and integrations for both offensive and defensive cybersecurity tasks.
|
| 24 |
+
|
| 25 |
+
## Project Overview
|
| 26 |
+
|
| 27 |
+
The Red Sword framework combines powerful cybersecurity tools and techniques into a single integrated platform. Some of the features include:
|
| 28 |
+
- AI-driven attack simulations and threat detection.
|
| 29 |
+
- A wide range of post-exploitation modules.
|
| 30 |
+
- Real-time attack and exploit automation.
|
| 31 |
+
- AI-powered fuzzing, exploit generation, and vulnerability scanning.
|
| 32 |
+
- Integration with major intelligence and FOIA sources.
|
| 33 |
+
- Full integration with tools like Sn1per, Empire, and custom modules for advanced penetration testing.
|
| 34 |
+
- Real-time threat intelligence and monitoring.
|
| 35 |
+
- Advanced data exfiltration techniques.
|
| 36 |
+
- Polymorphic and encrypted exploit payloads.
|
| 37 |
+
|
| 38 |
+
## Setup
|
| 39 |
+
|
| 40 |
+
This framework requires Python 3.8+ and the following dependencies. It can be deployed easily in Hugging Face Spaces or similar environments.
|
| 41 |
+
|
| 42 |
+
### Install Requirements
|
| 43 |
+
|
| 44 |
+
You can install the necessary requirements using the provided `requirements.txt` file.
|
| 45 |
+
|
| 46 |
+
```bash
|
| 47 |
+
pip install -r requirements.txt
|
| 48 |
+
```
|
| 49 |
+
|
| 50 |
+
### Environment Variables
|
| 51 |
+
|
| 52 |
+
Some modules may require environment-specific credentials. You can set them up by creating a `.env` file or exporting them directly to your environment.
|
| 53 |
+
|
| 54 |
+
Example:
|
| 55 |
+
```bash
|
| 56 |
+
OPENAI_API_KEY=your-openai-api-key
|
| 57 |
+
HUGGINGFACE_API_KEY=your-huggingface-api-key
|
| 58 |
+
```
|
| 59 |
+
|
| 60 |
+
### Deploying on Hugging Face Spaces
|
| 61 |
+
|
| 62 |
+
This project is designed to be deployed within Hugging Face Spaces, providing a seamless platform for model integration and AI-powered attack simulations.
|
| 63 |
+
|
| 64 |
+
1. **Clone the repository:**
|
| 65 |
+
|
| 66 |
+
```bash
|
| 67 |
+
git clone https://huggingface.co/spaces/your-username/project-red-sword
|
| 68 |
+
cd project-red-sword
|
| 69 |
+
```
|
| 70 |
+
|
| 71 |
+
2. **Run the Space:**
|
| 72 |
+
|
| 73 |
+
After cloning, you can launch the project directly using the Hugging Face Space interface.
|
| 74 |
+
|
| 75 |
+
### Features and Modules
|
| 76 |
+
|
| 77 |
+
The framework includes a wide array of functionalities:
|
| 78 |
+
|
| 79 |
+
1. **AI-Driven Attack and Defense**: Integrates with OpenAI and custom models for AI-powered cybersecurity operations.
|
| 80 |
+
2. **Real-Time Threat Detection and Evasion**: Implements automated detection and evasion strategies.
|
| 81 |
+
3. **Post-Exploitation Modules**: Includes advanced tools like keylogging, data exfiltration, and system persistence.
|
| 82 |
+
4. **Web Scraping and Reconnaissance**: Collects intelligence from public repositories and sources like FOIA.
|
| 83 |
+
5. **Penetration Testing Modules**: Integrates with Sn1per, Metasploit, and other tools for comprehensive testing.
|
| 84 |
+
|
| 85 |
+
### Key Modules:
|
| 86 |
+
|
| 87 |
+
- **AI Model Integrations**: For attack prediction and threat intelligence.
|
| 88 |
+
- **Post-Exploitation**: Keylogging, privilege escalation, system persistence.
|
| 89 |
+
- **Exploit Discovery**: Zero-day and zero-click exploit generation.
|
| 90 |
+
- **Custom Tools**: Including a custom script generator for Hak5 devices and other third-party platforms.
|
| 91 |
+
- **Real-Time Threat Intelligence**: Provides up-to-date threat data and analysis.
|
| 92 |
+
- **Real-Time Monitoring**: Monitors data exfiltration and detects anomalies.
|
| 93 |
+
- **Data Exfiltration**: Secure data extraction techniques.
|
| 94 |
+
- **Exploit Payloads**: Polymorphic and encrypted payload generation.
|
| 95 |
+
|
| 96 |
+
### Example Usage
|
| 97 |
+
|
| 98 |
+
```python
|
| 99 |
+
# Example of using a custom exploit generation module
|
| 100 |
+
from red_sword.modules.exploits import exploit_generator
|
| 101 |
+
|
| 102 |
+
# Generate a custom exploit for a vulnerability
|
| 103 |
+
exploit_code = exploit_generator(target='target_system')
|
| 104 |
+
print(exploit_code)
|
| 105 |
+
```
|
| 106 |
+
|
| 107 |
+
### Testing
|
| 108 |
+
|
| 109 |
+
The framework includes various tests, both unit and integration, to ensure everything works smoothly.
|
| 110 |
+
|
| 111 |
+
To run tests, you can use:
|
| 112 |
+
|
| 113 |
+
```bash
|
| 114 |
+
pytest
|
| 115 |
+
```
|
| 116 |
+
|
| 117 |
+
This will run all available tests in the `tests` directory and check for any issues.
|
| 118 |
+
|
| 119 |
+
### Contributing
|
| 120 |
+
|
| 121 |
+
We welcome contributions to Project Red Sword. If you'd like to contribute, please follow these steps:
|
| 122 |
+
|
| 123 |
+
1. Fork the repository.
|
| 124 |
+
2. Clone your fork locally.
|
| 125 |
+
3. Create a new branch.
|
| 126 |
+
4. Make your changes and commit them.
|
| 127 |
+
5. Push your changes to your fork.
|
| 128 |
+
6. Open a pull request with a description of the changes you've made.
|
| 129 |
+
|
| 130 |
+
### License
|
| 131 |
+
|
| 132 |
+
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
|
| 133 |
+
|
| 134 |
+
---
|
| 135 |
+
|
| 136 |
+
## Deployment
|
| 137 |
+
|
| 138 |
+
You can deploy this framework to Hugging Face Spaces by following the Hugging Face documentation and deploying the Space via the Hugging Face platform.
|
| 139 |
+
|
| 140 |
+
1. Go to [Hugging Face Spaces](https://huggingface.co/spaces).
|
| 141 |
+
2. Click on **Create New Space**.
|
| 142 |
+
3. Choose your preferred environment and language.
|
| 143 |
+
4. Upload the repository files.
|
| 144 |
+
5. Run and test the framework.
|
| 145 |
+
|
| 146 |
+
## Security Considerations
|
| 147 |
+
|
| 148 |
+
This framework contains advanced attack and penetration testing features, including exploit generation and post-exploitation modules. It should only be used in controlled environments for ethical and legal testing purposes. Always ensure compliance with local laws and regulations regarding cybersecurity.
|
| 149 |
+
|
| 150 |
+
---
|
| 151 |
+
|
| 152 |
+
### References:
|
| 153 |
+
|
| 154 |
+
- **OpenAI API**: [https://beta.openai.com/docs](https://beta.openai.com/docs)
|
| 155 |
+
- **Hugging Face Spaces**: [https://huggingface.co/spaces](https://huggingface.co/spaces)
|
| 156 |
+
- **Project Red Sword**: This framework is a continuation of best practices in cybersecurity, focusing on automation, AI integration, and exploit management.
|
| 157 |
+
|
| 158 |
+
---
|
| 159 |
+
|
| 160 |
+
If you encounter any issues or need further support, please open an issue on the GitHub repository or reach out to us via the Hugging Face Space contact form.
|
| 161 |
+
|
| 162 |
+
---
|
| 163 |
+
|
| 164 |
+
### Detailed Setup and Usage Instructions
|
| 165 |
+
|
| 166 |
+
#### Prerequisites
|
| 167 |
+
|
| 168 |
+
- Python 3.8+
|
| 169 |
+
- Docker (for containerized deployment)
|
| 170 |
+
- AWS CLI, Azure CLI, Google Cloud SDK, or DigitalOcean CLI (for cloud deployment)
|
| 171 |
+
|
| 172 |
+
#### Installation
|
| 173 |
+
|
| 174 |
+
1. **Clone the repository:**
|
| 175 |
+
|
| 176 |
+
```bash
|
| 177 |
+
git clone https://github.com/your-repo/project-red-sword.git
|
| 178 |
+
cd project-red-sword
|
| 179 |
+
```
|
| 180 |
+
|
| 181 |
+
2. **Install Python dependencies:**
|
| 182 |
+
|
| 183 |
+
```bash
|
| 184 |
+
pip install -r requirements.txt
|
| 185 |
+
```
|
| 186 |
+
|
| 187 |
+
3. **Set up environment variables:**
|
| 188 |
+
|
| 189 |
+
Create a `.env` file in the root directory and add your API keys:
|
| 190 |
+
|
| 191 |
+
```bash
|
| 192 |
+
OPENAI_API_KEY=your-openai-api-key
|
| 193 |
+
HUGGINGFACE_API_KEY=your-huggingface-api-key
|
| 194 |
+
```
|
| 195 |
+
|
| 196 |
+
#### Running the Application
|
| 197 |
+
|
| 198 |
+
To run the application locally, use the following command:
|
| 199 |
+
|
| 200 |
+
```bash
|
| 201 |
+
python app.py
|
| 202 |
+
```
|
| 203 |
+
|
| 204 |
+
#### Docker Deployment
|
| 205 |
+
|
| 206 |
+
1. **Build the Docker image:**
|
| 207 |
+
|
| 208 |
+
```bash
|
| 209 |
+
docker build -t project-red-sword .
|
| 210 |
+
```
|
| 211 |
+
|
| 212 |
+
2. **Run the Docker container:**
|
| 213 |
+
|
| 214 |
+
```bash
|
| 215 |
+
docker run -p 7860:7860 project-red-sword
|
| 216 |
+
```
|
| 217 |
+
|
| 218 |
+
#### Cloud Deployment
|
| 219 |
+
|
| 220 |
+
##### AWS Deployment
|
| 221 |
+
|
| 222 |
+
1. **Build the Docker image:**
|
| 223 |
+
|
| 224 |
+
```bash
|
| 225 |
+
docker build -t project-red-sword .
|
| 226 |
+
```
|
| 227 |
+
|
| 228 |
+
2. **Push the Docker image to AWS ECR:**
|
| 229 |
+
|
| 230 |
+
```bash
|
| 231 |
+
aws ecr get-login-password --region YOUR_AWS_REGION | docker login --username AWS --password-stdin YOUR_AWS_ACCOUNT_ID.dkr.ecr.YOUR_AWS_REGION.amazonaws.com
|
| 232 |
+
aws ecr create-repository --repository-name project-red-sword || echo "Repository already exists."
|
| 233 |
+
docker tag project-red-sword:latest YOUR_AWS_ACCOUNT_ID.dkr.ecr.YOUR_AWS_REGION.amazonaws.com/project-red-sword
|
| 234 |
+
docker push YOUR_AWS_ACCOUNT_ID.dkr.ecr.YOUR_AWS_REGION.amazonaws.com/project-red-sword
|
| 235 |
+
```
|
| 236 |
+
|
| 237 |
+
3. **Deploy to AWS Elastic Beanstalk:**
|
| 238 |
+
|
| 239 |
+
```bash
|
| 240 |
+
eb init -p docker project-red-sword --region YOUR_AWS_REGION
|
| 241 |
+
eb create project-red-sword-env
|
| 242 |
+
```
|
| 243 |
+
|
| 244 |
+
##### Azure Deployment
|
| 245 |
+
|
| 246 |
+
1. **Build the Docker image:**
|
| 247 |
+
|
| 248 |
+
```bash
|
| 249 |
+
docker build -t project-red-sword .
|
| 250 |
+
```
|
| 251 |
+
|
| 252 |
+
2. **Push the Docker image to Azure ACR:**
|
| 253 |
+
|
| 254 |
+
```bash
|
| 255 |
+
az acr login --name YOUR_AZURE_ACR_NAME
|
| 256 |
+
az acr create --resource-group YOUR_RESOURCE_GROUP --name YOUR_AZURE_ACR_NAME --sku Basic || echo "Registry already exists."
|
| 257 |
+
docker tag project-red-sword:latest YOUR_AZURE_ACR_NAME.azurecr.io/project-red-sword
|
| 258 |
+
docker push YOUR_AZURE_ACR_NAME.azurecr.io/project-red-sword
|
| 259 |
+
```
|
| 260 |
+
|
| 261 |
+
3. **Deploy to Azure App Service:**
|
| 262 |
+
|
| 263 |
+
```bash
|
| 264 |
+
az webapp create --resource-group YOUR_RESOURCE_GROUP --plan YOUR_APP_SERVICE_PLAN --name YOUR_APP_NAME --deployment-container-image-name YOUR_AZURE_ACR_NAME.azurecr.io/project-red-sword:latest
|
| 265 |
+
```
|
| 266 |
+
|
| 267 |
+
##### Google Cloud Deployment
|
| 268 |
+
|
| 269 |
+
1. **Build the Docker image:**
|
| 270 |
+
|
| 271 |
+
```bash
|
| 272 |
+
docker build -t project-red-sword .
|
| 273 |
+
```
|
| 274 |
+
|
| 275 |
+
2. **Push the Docker image to Google Container Registry:**
|
| 276 |
+
|
| 277 |
+
```bash
|
| 278 |
+
gcloud auth configure-docker
|
| 279 |
+
docker tag project-red-sword gcr.io/YOUR_PROJECT_ID/project-red-sword
|
| 280 |
+
docker push gcr.io/YOUR_PROJECT_ID/project-red-sword
|
| 281 |
+
```
|
| 282 |
+
|
| 283 |
+
3. **Deploy to Google Kubernetes Engine:**
|
| 284 |
+
|
| 285 |
+
```bash
|
| 286 |
+
kubectl apply -f google-k8s.yaml
|
| 287 |
+
```
|
| 288 |
+
|
| 289 |
+
##### DigitalOcean Deployment
|
| 290 |
+
|
| 291 |
+
1. **Build the Docker image:**
|
| 292 |
+
|
| 293 |
+
```bash
|
| 294 |
+
docker build -t project-red-sword .
|
| 295 |
+
```
|
| 296 |
+
|
| 297 |
+
2. **Deploy to DigitalOcean:**
|
| 298 |
+
|
| 299 |
+
```bash
|
| 300 |
+
doctl auth init
|
| 301 |
+
doctl apps create --spec digitalocean-app.yaml
|
| 302 |
+
```
|
| 303 |
+
|
| 304 |
+
## Recent Updates and Changes
|
| 305 |
+
|
| 306 |
+
### New Dashboards and Functionalities
|
| 307 |
+
|
| 308 |
+
We have recently added several new dashboards and functionalities to the Project Red Sword framework. These updates include:
|
| 309 |
+
|
| 310 |
+
1. **Advanced Connection Methods**: Added a new dashboard for managing advanced connection methods, including reverse shells and other advanced techniques.
|
| 311 |
+
2. **Real-Time Threat Intelligence**: Enhanced the real-time threat intelligence dashboard with new visualizations and data sources.
|
| 312 |
+
3. **Predictive Analytics**: Added a new dashboard for predictive analytics, utilizing machine learning algorithms to predict potential threats and vulnerabilities.
|
| 313 |
+
4. **Automated Incident Response**: Developed a new dashboard for automated incident response, allowing for quick response and containment of security incidents.
|
| 314 |
+
5. **AI Red Teaming**: Integrated AI-powered red teaming capabilities into a new dashboard, enabling advanced attack simulations and vulnerability identification.
|
| 315 |
+
6. **Blockchain Logger**: Added a new dashboard for blockchain-based logging, providing immutable logs and audit trails for security events and incidents.
|
| 316 |
+
7. **Advanced Decryption**: Developed a new dashboard for advanced decryption capabilities, allowing for secure decryption of sensitive data.
|
| 317 |
+
8. **Advanced Malware Analysis**: Enhanced the advanced malware analysis dashboard with new tools and techniques for analyzing and reverse engineering malware.
|
| 318 |
+
9. **Advanced Social Engineering**: Added a new dashboard for advanced social engineering attacks, including phishing, spear phishing, and whaling attacks.
|
| 319 |
+
10. **Alerts and Notifications**: Developed a new dashboard for managing alerts and notifications, providing real-time updates on security events and incidents.
|
| 320 |
+
11. **APT Simulation**: Added a new dashboard for simulating advanced persistent threats (APTs), allowing for comprehensive testing of the framework's defenses.
|
| 321 |
+
12. **Cloud Exploitation**: Enhanced the cloud exploitation dashboard with new tools and techniques for exploiting vulnerabilities in cloud environments.
|
| 322 |
+
13. **Custom Dashboards**: Developed customizable dashboards to provide tailored security insights and metrics.
|
| 323 |
+
14. **Dark Web Scraper**: Added a new dashboard for scraping and indexing the dark web, providing valuable intelligence on emerging threats and vulnerabilities.
|
| 324 |
+
15. **Data Exfiltration**: Enhanced the data exfiltration dashboard with new techniques for secure data extraction.
|
| 325 |
+
16. **Data Visualization**: Developed new visualizations for data analysis, including charts, graphs, and status indicators.
|
| 326 |
+
17. **Device Fingerprinting**: Added a new dashboard for device fingerprinting, allowing for the collection and analysis of device information.
|
| 327 |
+
18. **Exploit Payloads**: Enhanced the exploit payloads dashboard with new techniques for generating polymorphic and encrypted payloads.
|
| 328 |
+
19. **Fuzzing Engine**: Added a new dashboard for the fuzzing engine, allowing for comprehensive fuzz testing of targets.
|
| 329 |
+
20. **IoT Exploitation**: Enhanced the IoT exploitation dashboard with new tools and techniques for exploiting vulnerabilities in IoT devices.
|
| 330 |
+
21. **Machine Learning AI**: Developed a new dashboard for machine learning AI, providing advanced capabilities for threat detection and analysis.
|
| 331 |
+
22. **MITM Stingray**: Added a new dashboard for managing MITM Stingray operations, including interception and analysis of network traffic.
|
| 332 |
+
23. **Network Exploitation**: Enhanced the network exploitation dashboard with new tools and techniques for exploiting network vulnerabilities.
|
| 333 |
+
24. **Vulnerability Scanner**: Added a new dashboard for the vulnerability scanner, providing comprehensive scanning and reporting of vulnerabilities.
|
| 334 |
+
25. **Wireless Exploitation**: Enhanced the wireless exploitation dashboard with new tools and techniques for exploiting wireless vulnerabilities.
|
| 335 |
+
26. **Zero Day Exploits**: Added a new dashboard for managing zero-day exploits, including identification and deployment of exploits.
|
app.py
ADDED
|
@@ -0,0 +1,601 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import io
|
| 2 |
+
import random
|
| 3 |
+
import logging
|
| 4 |
+
from typing import List, Tuple
|
| 5 |
+
import re
|
| 6 |
+
import os
|
| 7 |
+
|
| 8 |
+
import aiohttp
|
| 9 |
+
import panel as pn
|
| 10 |
+
from PIL import Image
|
| 11 |
+
from transformers import CLIPModel, CLIPProcessor
|
| 12 |
+
|
| 13 |
+
from modules.real_time_threat_intelligence import RealTimeThreatIntelligence
|
| 14 |
+
from modules.real_time_monitoring import RealTimeMonitoring
|
| 15 |
+
from modules.threat_intelligence import ThreatIntelligence
|
| 16 |
+
from modules.predictive_analytics import PredictiveAnalytics
|
| 17 |
+
from modules.automated_incident_response import AutomatedIncidentResponse
|
| 18 |
+
from modules.ai_red_teaming import AIRedTeaming
|
| 19 |
+
from modules.apt_simulation import APTSimulation
|
| 20 |
+
from modules.machine_learning_ai import MachineLearningAI
|
| 21 |
+
from modules.data_visualization import DataVisualization
|
| 22 |
+
from modules.blockchain_logger import BlockchainLogger
|
| 23 |
+
from modules.cloud_exploitation import CloudExploitation
|
| 24 |
+
from modules.iot_exploitation import IoTExploitation
|
| 25 |
+
from modules.quantum_computing import QuantumComputing
|
| 26 |
+
from modules.edge_computing import EdgeComputing
|
| 27 |
+
from modules.serverless_computing import ServerlessComputing
|
| 28 |
+
from modules.microservices_architecture import MicroservicesArchitecture
|
| 29 |
+
from modules.cloud_native_applications import CloudNativeApplications
|
| 30 |
+
from modules.advanced_decryption import AdvancedDecryption
|
| 31 |
+
from modules.advanced_malware_analysis import AdvancedMalwareAnalysis
|
| 32 |
+
from modules.advanced_social_engineering import AdvancedSocialEngineering
|
| 33 |
+
from modules.alerts_notifications import AlertsNotifications
|
| 34 |
+
from modules.device_fingerprinting import DeviceFingerprinting
|
| 35 |
+
from modules.exploit_payloads import ExploitPayloads
|
| 36 |
+
from modules.fuzzing_engine import FuzzingEngine
|
| 37 |
+
from modules.mitm_stingray import MITMStingray
|
| 38 |
+
from modules.network_exploitation import NetworkExploitation
|
| 39 |
+
from modules.vulnerability_scanner import VulnerabilityScanner
|
| 40 |
+
from modules.wireless_exploitation import WirelessExploitation
|
| 41 |
+
from modules.zero_day_exploits import ZeroDayExploits
|
| 42 |
+
|
| 43 |
+
from modules.device_control import DeviceControl
|
| 44 |
+
from modules.windows_control import WindowsControl
|
| 45 |
+
from modules.macos_control import MacOSControl
|
| 46 |
+
from modules.linux_control import LinuxControl
|
| 47 |
+
from modules.android_control import AndroidControl
|
| 48 |
+
from modules.ios_control import iOSControl
|
| 49 |
+
from modules.advanced_device_control import AdvancedDeviceControl
|
| 50 |
+
|
| 51 |
+
from backend.code_parser import CodeParser
|
| 52 |
+
from backend.pipeline_manager import PipelineManager
|
| 53 |
+
|
| 54 |
+
import pika
|
| 55 |
+
from kafka import KafkaProducer, KafkaConsumer
|
| 56 |
+
|
| 57 |
+
from modules.otp_interceptor import OTPInterceptor
|
| 58 |
+
|
| 59 |
+
pn.extension(design="bootstrap", sizing_mode="stretch_width")
|
| 60 |
+
|
| 61 |
+
ICON_URLS = {
|
| 62 |
+
"brand-github": "https://github.com/holoviz/panel",
|
| 63 |
+
"brand-twitter": "https://twitter.com/Panel_Org",
|
| 64 |
+
"brand-linkedin": "https://www.linkedin.com/company/panel-org",
|
| 65 |
+
"message-circle": "https://discourse.holoviz.org/",
|
| 66 |
+
"brand-discord": "https://discord.gg/AXRHnJU6sP",
|
| 67 |
+
}
|
| 68 |
+
|
| 69 |
+
# Configure logging
|
| 70 |
+
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
|
| 71 |
+
|
| 72 |
+
|
| 73 |
+
async def random_url(_):
|
| 74 |
+
retries = 3
|
| 75 |
+
for _ in range(retries):
|
| 76 |
+
try:
|
| 77 |
+
pet = random.choice(["cat", "dog"])
|
| 78 |
+
api_url = f"https://api.the{pet}api.com/v1/images/search"
|
| 79 |
+
async with aiohttp.ClientSession() as session:
|
| 80 |
+
async with session.get(api_url) as resp:
|
| 81 |
+
resp.raise_for_status()
|
| 82 |
+
return (await resp.json())[0]["url"]
|
| 83 |
+
except aiohttp.ClientError as e:
|
| 84 |
+
logging.error(f"API request failed: {e}")
|
| 85 |
+
except Exception as e:
|
| 86 |
+
logging.error(f"Unexpected error: {e}")
|
| 87 |
+
return None
|
| 88 |
+
|
| 89 |
+
|
| 90 |
+
@pn.cache
|
| 91 |
+
def load_processor_model(
|
| 92 |
+
processor_name: str, model_name: str
|
| 93 |
+
) -> Tuple[CLIPProcessor, CLIPModel]:
|
| 94 |
+
processor = CLIPProcessor.from_pretrained(processor_name)
|
| 95 |
+
model = CLIPModel.from_pretrained(model_name)
|
| 96 |
+
return processor, model
|
| 97 |
+
|
| 98 |
+
|
| 99 |
+
async def open_image_url(image_url: str) -> Image:
|
| 100 |
+
retries = 3
|
| 101 |
+
for _ in range(retries):
|
| 102 |
+
try:
|
| 103 |
+
async with aiohttp.ClientSession() as session:
|
| 104 |
+
async with session.get(image_url) as resp:
|
| 105 |
+
resp.raise_for_status()
|
| 106 |
+
return Image.open(io.BytesIO(await resp.read()))
|
| 107 |
+
except aiohttp.ClientError as e:
|
| 108 |
+
logging.error(f"HTTP request failed: {e}")
|
| 109 |
+
except Exception as e:
|
| 110 |
+
logging.error(f"Unexpected error: {e}")
|
| 111 |
+
return None
|
| 112 |
+
|
| 113 |
+
|
| 114 |
+
def get_similarity_scores(class_items: List[str], image: Image) -> List[float]:
|
| 115 |
+
processor, model = load_processor_model(
|
| 116 |
+
"openai/clip-vit-base-patch32", "openai/clip-vit-base-patch32"
|
| 117 |
+
)
|
| 118 |
+
inputs = processor(
|
| 119 |
+
text=class_items,
|
| 120 |
+
images=[image],
|
| 121 |
+
return_tensors="pt", # pytorch tensors
|
| 122 |
+
)
|
| 123 |
+
outputs = model(**inputs)
|
| 124 |
+
logits_per_image = outputs.logits_per_image
|
| 125 |
+
class_likelihoods = logits_per_image.softmax(dim=1).detach().numpy()
|
| 126 |
+
return class_likelihoods[0]
|
| 127 |
+
|
| 128 |
+
|
| 129 |
+
async def process_inputs(class_names: List[str], image_url: str):
|
| 130 |
+
"""
|
| 131 |
+
High level function that takes in the user inputs and returns the
|
| 132 |
+
classification results as panel objects.
|
| 133 |
+
"""
|
| 134 |
+
try:
|
| 135 |
+
main.disabled = True
|
| 136 |
+
if not image_url:
|
| 137 |
+
yield "##### ⚠️ Provide an image URL"
|
| 138 |
+
return
|
| 139 |
+
|
| 140 |
+
# Check if image_url is a valid URL
|
| 141 |
+
if not re.match(r'^(http|https)://', image_url):
|
| 142 |
+
yield "##### ⚠️ Invalid URL provided"
|
| 143 |
+
return
|
| 144 |
+
|
| 145 |
+
if not class_names:
|
| 146 |
+
yield "##### ⚠️ Provide class names"
|
| 147 |
+
return
|
| 148 |
+
|
| 149 |
+
yield "##### ⚙ Fetching image and running model..."
|
| 150 |
+
try:
|
| 151 |
+
pil_img = await open_image_url(image_url)
|
| 152 |
+
if pil_img is None:
|
| 153 |
+
yield "##### 😔 Something went wrong, please try a different URL!"
|
| 154 |
+
return
|
| 155 |
+
img = pn.pane.Image(pil_img, height=400, align="center")
|
| 156 |
+
except Exception as e:
|
| 157 |
+
logging.error(f"Error processing image URL: {e}")
|
| 158 |
+
yield f"##### 😔 Something went wrong, please try a different URL!"
|
| 159 |
+
return
|
| 160 |
+
|
| 161 |
+
class_items = class_names.split(",")
|
| 162 |
+
class_likelihoods = get_similarity_scores(class_items, pil_img)
|
| 163 |
+
|
| 164 |
+
# build the results column
|
| 165 |
+
results = pn.Column("##### 🎉 Here are the results!", img)
|
| 166 |
+
|
| 167 |
+
for class_item, class_likelihood in zip(class_items, class_likelihoods):
|
| 168 |
+
row_label = pn.widgets.StaticText(
|
| 169 |
+
name=class_item.strip(), value=f"{class_likelihood:.2%}", align="center"
|
| 170 |
+
)
|
| 171 |
+
row_bar = pn.indicators.Progress(
|
| 172 |
+
value=int(class_likelihood * 100),
|
| 173 |
+
sizing_mode="stretch_width",
|
| 174 |
+
bar_color="secondary",
|
| 175 |
+
margin=(0, 10),
|
| 176 |
+
design=pn.theme.Material,
|
| 177 |
+
)
|
| 178 |
+
results.append(pn.Column(row_label, row_bar))
|
| 179 |
+
yield results
|
| 180 |
+
finally:
|
| 181 |
+
main.disabled = False
|
| 182 |
+
|
| 183 |
+
|
| 184 |
+
# create widgets
|
| 185 |
+
randomize_url = pn.widgets.Button(name="Randomize URL", align="end")
|
| 186 |
+
|
| 187 |
+
image_url = pn.widgets.TextInput(
|
| 188 |
+
name="Image URL to classify",
|
| 189 |
+
value=pn.bind(random_url, randomize_url),
|
| 190 |
+
)
|
| 191 |
+
class_names = pn.widgets.TextInput(
|
| 192 |
+
name="Comma separated class names",
|
| 193 |
+
placeholder="Enter possible class names, e.g. cat, dog",
|
| 194 |
+
value="cat, dog, parrot",
|
| 195 |
+
)
|
| 196 |
+
|
| 197 |
+
input_widgets = pn.Column(
|
| 198 |
+
"##### 😊 Click randomize or paste a URL to start classifying!",
|
| 199 |
+
pn.Row(image_url, randomize_url),
|
| 200 |
+
class_names,
|
| 201 |
+
)
|
| 202 |
+
|
| 203 |
+
# add interactivity
|
| 204 |
+
interactive_result = pn.panel(
|
| 205 |
+
pn.bind(process_inputs, image_url=image_url, class_names=class_names),
|
| 206 |
+
height=600,
|
| 207 |
+
)
|
| 208 |
+
|
| 209 |
+
# add footer
|
| 210 |
+
footer_row = pn.Row(pn.Spacer(), align="center")
|
| 211 |
+
for icon, url in ICON_URLS.items():
|
| 212 |
+
href_button = pn.widgets.Button(icon=icon, width=35, height=35)
|
| 213 |
+
href_button.js_on_click(code=f"window.open('{url}')")
|
| 214 |
+
footer_row.append(href_button)
|
| 215 |
+
footer_row.append(pn.Spacer())
|
| 216 |
+
|
| 217 |
+
# create dashboard
|
| 218 |
+
main = pn.WidgetBox(
|
| 219 |
+
input_widgets,
|
| 220 |
+
interactive_result,
|
| 221 |
+
footer_row,
|
| 222 |
+
)
|
| 223 |
+
|
| 224 |
+
title = "Panel Demo - Image Classification"
|
| 225 |
+
pn.template.BootstrapTemplate(
|
| 226 |
+
title=title,
|
| 227 |
+
main=main,
|
| 228 |
+
main_max_width="min(50%, 698px)",
|
| 229 |
+
header_background="#F08080",
|
| 230 |
+
).servable(title=title)
|
| 231 |
+
|
| 232 |
+
# Initialize real-time threat intelligence and monitoring modules
|
| 233 |
+
try:
|
| 234 |
+
threat_intelligence = RealTimeThreatIntelligence(api_key=os.getenv("REAL_TIME_THREAT_INTELLIGENCE_API_KEY"))
|
| 235 |
+
monitoring = RealTimeMonitoring(threat_intelligence_module=threat_intelligence)
|
| 236 |
+
except Exception as e:
|
| 237 |
+
logging.error(f"Error initializing real-time threat intelligence and monitoring modules: {e}")
|
| 238 |
+
|
| 239 |
+
# Initialize and integrate new modules in the main function
|
| 240 |
+
try:
|
| 241 |
+
advanced_threat_intelligence = ThreatIntelligence()
|
| 242 |
+
predictive_analytics = PredictiveAnalytics()
|
| 243 |
+
automated_incident_response = AutomatedIncidentResponse()
|
| 244 |
+
ai_red_teaming = AIRedTeaming()
|
| 245 |
+
apt_simulation = APTSimulation()
|
| 246 |
+
machine_learning_ai = MachineLearningAI()
|
| 247 |
+
data_visualization = DataVisualization()
|
| 248 |
+
blockchain_logger = BlockchainLogger()
|
| 249 |
+
cloud_exploitation = CloudExploitation()
|
| 250 |
+
iot_exploitation = IoTExploitation()
|
| 251 |
+
quantum_computing = QuantumComputing()
|
| 252 |
+
edge_computing = EdgeComputing()
|
| 253 |
+
serverless_computing = ServerlessComputing()
|
| 254 |
+
microservices_architecture = MicroservicesArchitecture()
|
| 255 |
+
cloud_native_applications = CloudNativeApplications()
|
| 256 |
+
advanced_decryption = AdvancedDecryption()
|
| 257 |
+
advanced_malware_analysis = AdvancedMalwareAnalysis()
|
| 258 |
+
advanced_social_engineering = AdvancedSocialEngineering()
|
| 259 |
+
alerts_notifications = AlertsNotifications(smtp_server="smtp.example.com", smtp_port=587, smtp_user="user@example.com", smtp_password="password")
|
| 260 |
+
device_fingerprinting = DeviceFingerprinting()
|
| 261 |
+
exploit_payloads = ExploitPayloads()
|
| 262 |
+
fuzzing_engine = FuzzingEngine()
|
| 263 |
+
mitm_stingray = MITMStingray(interface="wlan0")
|
| 264 |
+
network_exploitation = NetworkExploitation()
|
| 265 |
+
vulnerability_scanner = VulnerabilityScanner()
|
| 266 |
+
wireless_exploitation = WirelessExploitation()
|
| 267 |
+
zero_day_exploits = ZeroDayExploits()
|
| 268 |
+
device_control = DeviceControl()
|
| 269 |
+
windows_control = WindowsControl()
|
| 270 |
+
macos_control = MacOSControl()
|
| 271 |
+
linux_control = LinuxControl()
|
| 272 |
+
android_control = AndroidControl()
|
| 273 |
+
ios_control = iOSControl()
|
| 274 |
+
advanced_device_control = AdvancedDeviceControl()
|
| 275 |
+
code_parser = CodeParser("sample_code")
|
| 276 |
+
pipeline_manager = PipelineManager()
|
| 277 |
+
otp_interceptor = OTPInterceptor(
|
| 278 |
+
email_config={
|
| 279 |
+
'host': 'your_email_host',
|
| 280 |
+
'username': 'your_email_username',
|
| 281 |
+
'password': 'your_email_password'
|
| 282 |
+
},
|
| 283 |
+
twilio_config={
|
| 284 |
+
'account_sid': 'your_twilio_account_sid',
|
| 285 |
+
'auth_token': 'your_twilio_auth_token'
|
| 286 |
+
}
|
| 287 |
+
)
|
| 288 |
+
except Exception as e:
|
| 289 |
+
logging.error(f"Error initializing modules: {e}")
|
| 290 |
+
|
| 291 |
+
# Integrate the ThreatIntelligence module with RealTimeMonitoring
|
| 292 |
+
try:
|
| 293 |
+
monitoring.threat_intelligence_module = advanced_threat_intelligence
|
| 294 |
+
except Exception as e:
|
| 295 |
+
logging.error(f"Error integrating ThreatIntelligence module with RealTimeMonitoring: {e}")
|
| 296 |
+
|
| 297 |
+
# Add real-time threat data analysis using the ThreatIntelligence module
|
| 298 |
+
async def analyze_threat_data():
|
| 299 |
+
try:
|
| 300 |
+
threat_data = await advanced_threat_intelligence.get_threat_intelligence()
|
| 301 |
+
analyzed_data = advanced_threat_intelligence.process_data(threat_data)
|
| 302 |
+
return analyzed_data
|
| 303 |
+
except Exception as e:
|
| 304 |
+
logging.error(f"Error analyzing threat data: {e}")
|
| 305 |
+
|
| 306 |
+
# Update the RealTimeThreatIntelligence initialization to include the ThreatIntelligence module
|
| 307 |
+
try:
|
| 308 |
+
threat_intelligence_module = RealTimeThreatIntelligence(api_key="YOUR_API_KEY")
|
| 309 |
+
threat_intelligence_module.threat_intelligence = advanced_threat_intelligence
|
| 310 |
+
except Exception as e:
|
| 311 |
+
logging.error(f"Error updating RealTimeThreatIntelligence initialization: {e}")
|
| 312 |
+
|
| 313 |
+
# Add real-time threat data monitoring using the ThreatIntelligence module
|
| 314 |
+
async def monitor_threat_data():
|
| 315 |
+
try:
|
| 316 |
+
threat_data = await advanced_threat_intelligence.get_threat_intelligence()
|
| 317 |
+
for threat in threat_data:
|
| 318 |
+
if threat["severity"] > 0.8:
|
| 319 |
+
monitoring.trigger_alert(threat)
|
| 320 |
+
except Exception as e:
|
| 321 |
+
logging.error(f"Error monitoring threat data: {e}")
|
| 322 |
+
|
| 323 |
+
# Integrate the AutomatedIncidentResponse module with RealTimeMonitoring
|
| 324 |
+
try:
|
| 325 |
+
monitoring.automated_incident_response = automated_incident_response
|
| 326 |
+
except Exception as e:
|
| 327 |
+
logging.error(f"Error integrating AutomatedIncidentResponse module with RealTimeMonitoring: {e}")
|
| 328 |
+
|
| 329 |
+
# Integrate the AIRedTeaming module with RealTimeMonitoring
|
| 330 |
+
try:
|
| 331 |
+
monitoring.ai_red_teaming = ai_red_teaming
|
| 332 |
+
except Exception as e:
|
| 333 |
+
logging.error(f"Error integrating AIRedTeaming module with RealTimeMonitoring: {e}")
|
| 334 |
+
|
| 335 |
+
# Integrate the APTSimulation module with RealTimeMonitoring
|
| 336 |
+
try:
|
| 337 |
+
monitoring.apt_simulation = apt_simulation()
|
| 338 |
+
except Exception as e:
|
| 339 |
+
logging.error(f"Error integrating APTSimulation module with RealTimeMonitoring: {e}")
|
| 340 |
+
|
| 341 |
+
# Integrate the PredictiveAnalytics module with RealTimeMonitoring
|
| 342 |
+
try:
|
| 343 |
+
monitoring.predictive_analytics = predictive_analytics
|
| 344 |
+
except Exception as e:
|
| 345 |
+
logging.error(f"Error integrating PredictiveAnalytics module with RealTimeMonitoring: {e}")
|
| 346 |
+
|
| 347 |
+
# Integrate the MachineLearningAI module with RealTimeMonitoring
|
| 348 |
+
try:
|
| 349 |
+
monitoring.machine_learning_ai = machine_learning_ai
|
| 350 |
+
except Exception as e:
|
| 351 |
+
logging.error(f"Error integrating MachineLearningAI module with RealTimeMonitoring: {e}")
|
| 352 |
+
|
| 353 |
+
# Integrate the DataVisualization module with RealTimeMonitoring
|
| 354 |
+
try:
|
| 355 |
+
monitoring.data_visualization = data_visualization
|
| 356 |
+
except Exception as e:
|
| 357 |
+
logging.error(f"Error integrating DataVisualization module with RealTimeMonitoring: {e}")
|
| 358 |
+
|
| 359 |
+
# Integrate the CloudExploitation module with RealTimeMonitoring
|
| 360 |
+
try:
|
| 361 |
+
monitoring.cloud_exploitation = cloud_exploitation
|
| 362 |
+
except Exception as e:
|
| 363 |
+
logging.error(f"Error integrating CloudExploitation module with RealTimeMonitoring: {e}")
|
| 364 |
+
|
| 365 |
+
# Integrate the IoTExploitation module with RealTimeMonitoring
|
| 366 |
+
try:
|
| 367 |
+
monitoring.iot_exploitation = iot_exploitation
|
| 368 |
+
except Exception as e:
|
| 369 |
+
logging.error(f"Error integrating IoTExploitation module with RealTimeMonitoring: {e}")
|
| 370 |
+
|
| 371 |
+
# Integrate the QuantumComputing module with RealTimeMonitoring
|
| 372 |
+
try:
|
| 373 |
+
monitoring.quantum_computing = quantum_computing
|
| 374 |
+
except Exception as e:
|
| 375 |
+
logging.error(f"Error integrating QuantumComputing module with RealTimeMonitoring: {e}")
|
| 376 |
+
|
| 377 |
+
# Integrate the EdgeComputing module with RealTimeMonitoring
|
| 378 |
+
try:
|
| 379 |
+
monitoring.edge_computing = edge_computing
|
| 380 |
+
except Exception as e:
|
| 381 |
+
logging.error(f"Error integrating EdgeComputing module with RealTimeMonitoring: {e}")
|
| 382 |
+
|
| 383 |
+
# Integrate the ServerlessComputing module with RealTimeMonitoring
|
| 384 |
+
try:
|
| 385 |
+
monitoring.serverless_computing = serverless_computing
|
| 386 |
+
except Exception as e:
|
| 387 |
+
logging.error(f"Error integrating ServerlessComputing module with RealTimeMonitoring: {e}")
|
| 388 |
+
|
| 389 |
+
# Integrate the MicroservicesArchitecture module with RealTimeMonitoring
|
| 390 |
+
try:
|
| 391 |
+
monitoring.microservices_architecture = microservices_architecture
|
| 392 |
+
except Exception as e:
|
| 393 |
+
logging.error(f"Error integrating MicroservicesArchitecture module with RealTimeMonitoring: {e}")
|
| 394 |
+
|
| 395 |
+
# Integrate the CloudNativeApplications module with RealTimeMonitoring
|
| 396 |
+
try:
|
| 397 |
+
monitoring.cloud_native_applications = cloud_native_applications
|
| 398 |
+
except Exception as e:
|
| 399 |
+
logging.error(f"Error integrating CloudNativeApplications module with RealTimeMonitoring: {e}")
|
| 400 |
+
|
| 401 |
+
# Integrate the DeviceControl module with RealTimeMonitoring
|
| 402 |
+
try:
|
| 403 |
+
monitoring.device_control = device_control
|
| 404 |
+
except Exception as e:
|
| 405 |
+
logging.error(f"Error integrating DeviceControl module with RealTimeMonitoring: {e}")
|
| 406 |
+
|
| 407 |
+
# Integrate the WindowsControl module with RealTimeMonitoring
|
| 408 |
+
try:
|
| 409 |
+
monitoring.windows_control = windows_control
|
| 410 |
+
except Exception as e:
|
| 411 |
+
logging.error(f"Error integrating WindowsControl module with RealTimeMonitoring: {e}")
|
| 412 |
+
|
| 413 |
+
# Integrate the MacOSControl module with RealTimeMonitoring
|
| 414 |
+
try:
|
| 415 |
+
monitoring.macos_control = macos_control
|
| 416 |
+
except Exception as e:
|
| 417 |
+
logging.error(f"Error integrating MacOSControl module with RealTimeMonitoring: {e}")
|
| 418 |
+
|
| 419 |
+
# Integrate the LinuxControl module with RealTimeMonitoring
|
| 420 |
+
try:
|
| 421 |
+
monitoring.linux_control = linux_control
|
| 422 |
+
except Exception as e:
|
| 423 |
+
logging.error(f"Error integrating LinuxControl module with RealTimeMonitoring: {e}")
|
| 424 |
+
|
| 425 |
+
# Integrate the AndroidControl module with RealTimeMonitoring
|
| 426 |
+
try:
|
| 427 |
+
monitoring.android_control = android_control
|
| 428 |
+
except Exception as e:
|
| 429 |
+
logging.error(f"Error integrating AndroidControl module with RealTimeMonitoring: {e}")
|
| 430 |
+
|
| 431 |
+
# Integrate the iOSControl module with RealTimeMonitoring
|
| 432 |
+
try:
|
| 433 |
+
monitoring.ios_control = ios_control
|
| 434 |
+
except Exception as e:
|
| 435 |
+
logging.error(f"Error integrating iOSControl module with RealTimeMonitoring: {e}")
|
| 436 |
+
|
| 437 |
+
# Integrate the AdvancedDeviceControl module with RealTimeMonitoring
|
| 438 |
+
try:
|
| 439 |
+
monitoring.advanced_device_control = advanced_device_control
|
| 440 |
+
except Exception as e:
|
| 441 |
+
logging.error(f"Error integrating AdvancedDeviceControl module with RealTimeMonitoring: {e}")
|
| 442 |
+
|
| 443 |
+
# Add tool tips and advanced help options for all functions
|
| 444 |
+
def add_tool_tips():
|
| 445 |
+
tool_tips = {
|
| 446 |
+
"advanced_threat_intelligence": "Provides advanced threat intelligence capabilities.",
|
| 447 |
+
"predictive_analytics": "Utilizes predictive analytics for threat detection.",
|
| 448 |
+
"automated_incident_response": "Automates incident response processes.",
|
| 449 |
+
"ai_red_teaming": "AI-driven red teaming for security testing.",
|
| 450 |
+
"apt_simulation": "Simulates advanced persistent threats.",
|
| 451 |
+
"machine_learning_ai": "Machine learning-based AI for threat detection.",
|
| 452 |
+
"data_visualization": "Visualizes data for better insights.",
|
| 453 |
+
"blockchain_logger": "Logs data using blockchain technology.",
|
| 454 |
+
"cloud_exploitation": "Exploits vulnerabilities in cloud environments.",
|
| 455 |
+
"iot_exploitation": "Exploits vulnerabilities in IoT devices.",
|
| 456 |
+
"quantum_computing": "Utilizes quantum computing for security.",
|
| 457 |
+
"edge_computing": "Secures edge computing environments.",
|
| 458 |
+
"serverless_computing": "Secures serverless computing environments.",
|
| 459 |
+
"microservices_architecture": "Secures microservices architectures.",
|
| 460 |
+
"cloud_native_applications": "Secures cloud-native applications.",
|
| 461 |
+
"advanced_decryption": "Advanced decryption capabilities.",
|
| 462 |
+
"advanced_malware_analysis": "Analyzes and detects advanced malware.",
|
| 463 |
+
"advanced_social_engineering": "Detects and prevents social engineering attacks.",
|
| 464 |
+
"alerts_notifications": "Sends alerts and notifications.",
|
| 465 |
+
"device_fingerprinting": "Identifies devices using fingerprinting.",
|
| 466 |
+
"exploit_payloads": "Manages exploit payloads.",
|
| 467 |
+
"fuzzing_engine": "Fuzzing engine for vulnerability detection.",
|
| 468 |
+
"mitm_stingray": "Manages MITM Stingray attacks.",
|
| 469 |
+
"network_exploitation": "Exploits network vulnerabilities.",
|
| 470 |
+
"vulnerability_scanner": "Scans for vulnerabilities.",
|
| 471 |
+
"wireless_exploitation": "Exploits wireless vulnerabilities.",
|
| 472 |
+
"zero_day_exploits": "Manages zero-day exploits.",
|
| 473 |
+
"device_control": "Controls various device functions.",
|
| 474 |
+
"windows_control": "Controls Windows devices.",
|
| 475 |
+
"macos_control": "Controls macOS devices.",
|
| 476 |
+
"linux_control": "Controls Linux devices.",
|
| 477 |
+
"android_control": "Controls Android devices.",
|
| 478 |
+
"ios_control": "Controls iOS devices.",
|
| 479 |
+
"advanced_device_control": "Provides advanced device control features.",
|
| 480 |
+
"code_parser": "Parses and analyzes code.",
|
| 481 |
+
"pipeline_manager": "Manages pipelines for various tasks."
|
| 482 |
+
}
|
| 483 |
+
return tool_tips
|
| 484 |
+
|
| 485 |
+
tool_tips = add_tool_tips()
|
| 486 |
+
|
| 487 |
+
# Add a continue button for the AI chatbot to continue incomplete responses
|
| 488 |
+
continue_button = pn.widgets.Button(name="Continue", button_type="primary")
|
| 489 |
+
|
| 490 |
+
# Add a download icon button for downloading zip files of projects
|
| 491 |
+
download_button = pn.widgets.Button(name="Download .zip", button_type="primary", icon="download")
|
| 492 |
+
|
| 493 |
+
# Update the dashboard to display real-time insights and analytics
|
| 494 |
+
dashboard = pn.Column(
|
| 495 |
+
"### Advanced Capabilities Dashboard",
|
| 496 |
+
pn.pane.Markdown("Welcome to the Advanced Capabilities Dashboard. Here you can monitor and manage advanced security features."),
|
| 497 |
+
advanced_threat_intelligence.render(),
|
| 498 |
+
predictive_analytics.render(),
|
| 499 |
+
automated_incident_response.render(),
|
| 500 |
+
ai_red_teaming.render(),
|
| 501 |
+
apt_simulation.render(),
|
| 502 |
+
machine_learning_ai.render(),
|
| 503 |
+
data_visualization.render(),
|
| 504 |
+
blockchain_logger.render(),
|
| 505 |
+
cloud_exploitation.render(),
|
| 506 |
+
iot_exploitation.render(),
|
| 507 |
+
quantum_computing.render(),
|
| 508 |
+
edge_computing.render(),
|
| 509 |
+
serverless_computing.render(),
|
| 510 |
+
microservices_architecture.render(),
|
| 511 |
+
cloud_native_applications.render(),
|
| 512 |
+
advanced_decryption.render(),
|
| 513 |
+
advanced_malware_analysis.render(),
|
| 514 |
+
advanced_social_engineering.render(),
|
| 515 |
+
alerts_notifications.render(),
|
| 516 |
+
device_fingerprinting.render(),
|
| 517 |
+
exploit_payloads.render(),
|
| 518 |
+
fuzzing_engine.render(),
|
| 519 |
+
mitm_stingray.render(),
|
| 520 |
+
network_exploitation.render(),
|
| 521 |
+
vulnerability_scanner.render(),
|
| 522 |
+
wireless_exploitation.render(),
|
| 523 |
+
zero_day_exploits.render(),
|
| 524 |
+
device_control.render(),
|
| 525 |
+
windows_control.render(),
|
| 526 |
+
macos_control.render(),
|
| 527 |
+
linux_control.render(),
|
| 528 |
+
android_control.render(),
|
| 529 |
+
ios_control.render(),
|
| 530 |
+
advanced_device_control.render(),
|
| 531 |
+
code_parser.render(),
|
| 532 |
+
pipeline_manager.render(),
|
| 533 |
+
otp_interceptor.intercept_email_otp(),
|
| 534 |
+
otp_interceptor.intercept_sms_otp(),
|
| 535 |
+
continue_button,
|
| 536 |
+
download_button
|
| 537 |
+
)
|
| 538 |
+
|
| 539 |
+
main.append(dashboard)
|
| 540 |
+
|
| 541 |
+
# Implement best practices for integrating message queues
|
| 542 |
+
def setup_message_queue():
|
| 543 |
+
try:
|
| 544 |
+
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
|
| 545 |
+
channel = connection.channel()
|
| 546 |
+
channel.queue_declare(queue='task_queue', durable=True)
|
| 547 |
+
return channel
|
| 548 |
+
except Exception as e:
|
| 549 |
+
logging.error(f"Error setting up message queue: {e}")
|
| 550 |
+
return None
|
| 551 |
+
|
| 552 |
+
message_queue_channel = setup_message_queue()
|
| 553 |
+
|
| 554 |
+
def send_message_to_queue(message):
|
| 555 |
+
try:
|
| 556 |
+
if message_queue_channel:
|
| 557 |
+
message_queue_channel.basic_publish(
|
| 558 |
+
exchange='',
|
| 559 |
+
routing_key='task_queue',
|
| 560 |
+
body=message,
|
| 561 |
+
properties=pika.BasicProperties(
|
| 562 |
+
delivery_mode=2, # make message persistent
|
| 563 |
+
))
|
| 564 |
+
logging.info(f"Sent message to queue: {message}")
|
| 565 |
+
else:
|
| 566 |
+
logging.error("Message queue channel is not available.")
|
| 567 |
+
except Exception as e:
|
| 568 |
+
logging.error(f"Error sending message to queue: {e}")
|
| 569 |
+
|
| 570 |
+
# Example usage of sending a message to the queue
|
| 571 |
+
send_message_to_queue("Test message")
|
| 572 |
+
|
| 573 |
+
def setup_kafka():
|
| 574 |
+
try:
|
| 575 |
+
producer = KafkaProducer(bootstrap_servers='localhost:9092')
|
| 576 |
+
consumer = KafkaConsumer('my_topic', bootstrap_servers='localhost:9092', auto_offset_reset='earliest', enable_auto_commit=True, group_id='my-group')
|
| 577 |
+
return producer, consumer
|
| 578 |
+
except Exception as e:
|
| 579 |
+
logging.error(f"Error setting up Kafka: {e}")
|
| 580 |
+
return None, None
|
| 581 |
+
|
| 582 |
+
def send_message_to_kafka(producer, topic, message):
|
| 583 |
+
try:
|
| 584 |
+
producer.send(topic, message.encode('utf-8'))
|
| 585 |
+
producer.flush()
|
| 586 |
+
logging.info(f"Sent message to Kafka topic {topic}: {message}")
|
| 587 |
+
except Exception as e:
|
| 588 |
+
logging.error(f"Error sending message to Kafka: {e}")
|
| 589 |
+
|
| 590 |
+
def receive_message_from_kafka(consumer):
|
| 591 |
+
try:
|
| 592 |
+
for message in consumer:
|
| 593 |
+
logging.info(f"Received message from Kafka: {message.value.decode('utf-8')}")
|
| 594 |
+
except Exception as e:
|
| 595 |
+
logging.error(f"Error receiving message from Kafka: {e}")
|
| 596 |
+
|
| 597 |
+
if __name__ == "__main__":
|
| 598 |
+
producer, consumer = setup_kafka()
|
| 599 |
+
if producer and consumer:
|
| 600 |
+
send_message_to_kafka(producer, 'my_topic', 'Test Kafka message')
|
| 601 |
+
receive_message_from_kafka(consumer)
|
c2_dashboard.py
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import panel as pn
|
| 2 |
+
from database.models import DocumentAnalysis
|
| 3 |
+
from sqlalchemy import create_engine
|
| 4 |
+
from sqlalchemy.orm import sessionmaker
|
| 5 |
+
from modules.data_visualization import DataVisualization
|
| 6 |
+
from modules.advanced_device_control import AdvancedDeviceControl
|
| 7 |
+
from modules.real_time_monitoring import RealTimeMonitoring
|
| 8 |
+
|
| 9 |
+
DATABASE_URL = "sqlite:///document_analysis.db"
|
| 10 |
+
engine = create_engine(DATABASE_URL)
|
| 11 |
+
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
|
| 12 |
+
|
| 13 |
+
class C2Dashboard:
|
| 14 |
+
def render(self):
|
| 15 |
+
return pn.Column(
|
| 16 |
+
"### Command and Control Dashboard",
|
| 17 |
+
pn.pane.Markdown("Welcome to the C2 Dashboard. Here you can manage and monitor your operations."),
|
| 18 |
+
pn.pane.Markdown("#### Detailed Metrics and Insights"),
|
| 19 |
+
pn.widgets.DataFrame(name="Metrics Data"),
|
| 20 |
+
pn.pane.Markdown("#### Visualizations"),
|
| 21 |
+
pn.widgets.DataFrame(name="Assets Data"),
|
| 22 |
+
pn.pane.Markdown("#### Message Boards"),
|
| 23 |
+
pn.widgets.DataFrame(name="Message Board Data"),
|
| 24 |
+
pn.pane.Markdown("#### Announcements"),
|
| 25 |
+
pn.widgets.DataFrame(name="Announcements Data"),
|
| 26 |
+
pn.pane.Markdown("#### Latest News on Exploits"),
|
| 27 |
+
pn.widgets.DataFrame(name="Latest News Data"),
|
| 28 |
+
pn.pane.Markdown("#### AI Interface"),
|
| 29 |
+
pn.widgets.DataFrame(name="AI Interface Data"),
|
| 30 |
+
pn.pane.Markdown("#### System Connections"),
|
| 31 |
+
pn.widgets.DataFrame(name="System Connections Data"),
|
| 32 |
+
pn.pane.Markdown("#### Logs"),
|
| 33 |
+
pn.widgets.DataFrame(name="Logs Data"),
|
| 34 |
+
pn.pane.Markdown("#### System Status"),
|
| 35 |
+
pn.widgets.DataFrame(name="System Status Data"),
|
| 36 |
+
pn.pane.Markdown("#### System Settings"),
|
| 37 |
+
pn.widgets.DataFrame(name="System Settings Data"),
|
| 38 |
+
pn.pane.Markdown("#### Attack Simulations"),
|
| 39 |
+
pn.widgets.DataFrame(name="Attack Simulations Data"),
|
| 40 |
+
pn.pane.Markdown("#### Fuzzing"),
|
| 41 |
+
pn.widgets.DataFrame(name="Fuzzing Data"),
|
| 42 |
+
pn.pane.Markdown("#### Asset Control"),
|
| 43 |
+
pn.widgets.DataFrame(name="Asset Control Data"),
|
| 44 |
+
pn.pane.Markdown("#### Reverse Shell Settings"),
|
| 45 |
+
pn.widgets.DataFrame(name="Reverse Shell Settings Data"),
|
| 46 |
+
pn.pane.Markdown("#### Advanced Connection Methods"),
|
| 47 |
+
pn.widgets.DataFrame(name="Advanced Connection Methods Data"),
|
| 48 |
+
pn.pane.Markdown("#### Real-Time Threat Intelligence"),
|
| 49 |
+
pn.widgets.DataFrame(name="Real-Time Threat Intelligence Data"),
|
| 50 |
+
pn.pane.Markdown("#### Predictive Analytics"),
|
| 51 |
+
pn.widgets.DataFrame(name="Predictive Analytics Data"),
|
| 52 |
+
pn.pane.Markdown("#### Automated Incident Response"),
|
| 53 |
+
pn.widgets.DataFrame(name="Automated Incident Response Data"),
|
| 54 |
+
pn.pane.Markdown("#### AI Red Teaming"),
|
| 55 |
+
pn.widgets.DataFrame(name="AI Red Teaming Data"),
|
| 56 |
+
pn.pane.Markdown("#### Blockchain Logger"),
|
| 57 |
+
pn.widgets.DataFrame(name="Blockchain Logger Data"),
|
| 58 |
+
pn.pane.Markdown("#### Advanced Decryption"),
|
| 59 |
+
pn.widgets.DataFrame(name="Advanced Decryption Data"),
|
| 60 |
+
pn.pane.Markdown("#### Advanced Malware Analysis"),
|
| 61 |
+
pn.widgets.DataFrame(name="Advanced Malware Analysis Data"),
|
| 62 |
+
pn.pane.Markdown("#### Advanced Social Engineering"),
|
| 63 |
+
pn.widgets.DataFrame(name="Advanced Social Engineering Data"),
|
| 64 |
+
pn.pane.Markdown("#### Alerts and Notifications"),
|
| 65 |
+
pn.widgets.DataFrame(name="Alerts and Notifications Data"),
|
| 66 |
+
pn.pane.Markdown("#### APT Simulation"),
|
| 67 |
+
pn.widgets.DataFrame(name="APT Simulation Data"),
|
| 68 |
+
pn.pane.Markdown("#### Cloud Exploitation"),
|
| 69 |
+
pn.widgets.DataFrame(name="Cloud Exploitation Data"),
|
| 70 |
+
pn.pane.Markdown("#### Custom Dashboards"),
|
| 71 |
+
pn.widgets.DataFrame(name="Custom Dashboards Data"),
|
| 72 |
+
pn.pane.Markdown("#### Dark Web Scraper"),
|
| 73 |
+
pn.widgets.DataFrame(name="Dark Web Scraper Data"),
|
| 74 |
+
pn.pane.Markdown("#### Data Exfiltration"),
|
| 75 |
+
pn.widgets.DataFrame(name="Data Exfiltration Data"),
|
| 76 |
+
pn.pane.Markdown("#### Data Visualization"),
|
| 77 |
+
pn.widgets.DataFrame(name="Data Visualization Data"),
|
| 78 |
+
pn.pane.Markdown("#### Device Fingerprinting"),
|
| 79 |
+
pn.widgets.DataFrame(name="Device Fingerprinting Data"),
|
| 80 |
+
pn.pane.Markdown("#### Exploit Payloads"),
|
| 81 |
+
pn.widgets.DataFrame(name="Exploit Payloads Data"),
|
| 82 |
+
pn.pane.Markdown("#### Fuzzing Engine"),
|
| 83 |
+
pn.widgets.DataFrame(name="Fuzzing Engine Data"),
|
| 84 |
+
pn.pane.Markdown("#### IoT Exploitation"),
|
| 85 |
+
pn.widgets.DataFrame(name="IoT Exploitation Data"),
|
| 86 |
+
pn.pane.Markdown("#### Machine Learning AI"),
|
| 87 |
+
pn.widgets.DataFrame(name="Machine Learning AI Data"),
|
| 88 |
+
pn.pane.Markdown("#### MITM Stingray"),
|
| 89 |
+
pn.widgets.DataFrame(name="MITM Stingray Data"),
|
| 90 |
+
pn.pane.Markdown("#### Network Exploitation"),
|
| 91 |
+
pn.widgets.DataFrame(name="Network Exploitation Data"),
|
| 92 |
+
pn.pane.Markdown("#### Vulnerability Scanner"),
|
| 93 |
+
pn.widgets.DataFrame(name="Vulnerability Scanner Data"),
|
| 94 |
+
pn.pane.Markdown("#### Wireless Exploitation"),
|
| 95 |
+
pn.widgets.DataFrame(name="Wireless Exploitation Data"),
|
| 96 |
+
pn.pane.Markdown("#### Zero Day Exploits"),
|
| 97 |
+
pn.widgets.DataFrame(name="Zero Day Exploits Data"),
|
| 98 |
+
pn.pane.Markdown("#### Settings Dashboards"),
|
| 99 |
+
pn.widgets.DataFrame(name="Settings Dashboards Data"),
|
| 100 |
+
pn.pane.Markdown("#### Tool Tips and Advanced Help Options"),
|
| 101 |
+
pn.widgets.DataFrame(name="Tool Tips and Advanced Help Options Data")
|
| 102 |
+
)
|
| 103 |
+
|
| 104 |
+
def save_dashboard_to_db(self, source, title, links, error):
|
| 105 |
+
session = SessionLocal()
|
| 106 |
+
try:
|
| 107 |
+
dashboard_result = DocumentAnalysis(
|
| 108 |
+
source=source,
|
| 109 |
+
title=title,
|
| 110 |
+
links=links,
|
| 111 |
+
error=error
|
| 112 |
+
)
|
| 113 |
+
session.add(dashboard_result)
|
| 114 |
+
session.commit()
|
| 115 |
+
except Exception as e:
|
| 116 |
+
print(f"Error saving dashboard to database: {e}")
|
| 117 |
+
finally:
|
| 118 |
+
session.close()
|
| 119 |
+
|
| 120 |
+
class MITMStingrayDashboard:
|
| 121 |
+
def __init__(self, mitm_stingray):
|
| 122 |
+
self.mitm_stingray = mitm_stingray
|
| 123 |
+
self.intercepted_data = []
|
| 124 |
+
|
| 125 |
+
def start_interception(self, event):
|
| 126 |
+
self.mitm_stingray.start()
|
| 127 |
+
self.intercepted_data.append("Interception started")
|
| 128 |
+
|
| 129 |
+
def stop_interception(self, event):
|
| 130 |
+
self.mitm_stingray.stop()
|
| 131 |
+
self.intercepted_data.append("Interception stopped")
|
| 132 |
+
|
| 133 |
+
def render(self):
|
| 134 |
+
return pn.Column(
|
| 135 |
+
"### MITM Stingray Dashboard",
|
| 136 |
+
pn.pane.Markdown("Monitor and manage MITM Stingray operations."),
|
| 137 |
+
pn.widgets.Button(name="Start Interception", button_type="primary", on_click=self.start_interception),
|
| 138 |
+
pn.widgets.Button(name="Stop Interception", button_type="danger", on_click=self.stop_interception),
|
| 139 |
+
pn.widgets.DataFrame(self.intercepted_data, name="Intercepted Data")
|
| 140 |
+
)
|
| 141 |
+
|
| 142 |
+
if __name__ == "__main__":
|
| 143 |
+
dashboard = C2Dashboard()
|
| 144 |
+
try:
|
| 145 |
+
dashboard.save_dashboard_to_db("c2_dashboard.py", "C2 Dashboard", "[]", None)
|
| 146 |
+
print("Dashboard saved to database.")
|
| 147 |
+
except Exception as e:
|
| 148 |
+
print(f"Error during dashboard operation: {e}")
|
code_analysis_report.txt
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Code Analysis Report for Project Red Sword
|
| 2 |
+
|
| 3 |
+
## Overview
|
| 4 |
+
|
| 5 |
+
This report provides a detailed analysis of the codebase for Project Red Sword, identifying potential errors and vulnerabilities, and suggesting fixes and improvements.
|
| 6 |
+
|
| 7 |
+
## Summary of Findings
|
| 8 |
+
|
| 9 |
+
1. **Error Handling**: Several functions lack proper error handling, which can lead to unhandled exceptions and application crashes.
|
| 10 |
+
2. **Input Validation**: There are instances where user inputs are not properly validated, which can lead to security vulnerabilities such as injection attacks.
|
| 11 |
+
3. **Logging**: The application lacks comprehensive logging, making it difficult to trace issues and monitor the application's behavior.
|
| 12 |
+
4. **Security**: Sensitive information such as API keys are hardcoded in the code, which is a security risk.
|
| 13 |
+
5. **Dependencies**: The project is missing some necessary dependencies in the `requirements.txt` file.
|
| 14 |
+
|
| 15 |
+
## Detailed Analysis
|
| 16 |
+
|
| 17 |
+
### 1. Error Handling
|
| 18 |
+
|
| 19 |
+
#### `random_url` Function
|
| 20 |
+
- **Issue**: The function does not handle API errors properly.
|
| 21 |
+
- **Fix**: Add error handling for API errors using `try-except` blocks.
|
| 22 |
+
|
| 23 |
+
#### `open_image_url` Function
|
| 24 |
+
- **Issue**: The function does not handle HTTP errors properly.
|
| 25 |
+
- **Fix**: Add error handling for HTTP errors using `try-except` blocks.
|
| 26 |
+
|
| 27 |
+
#### `process_inputs` Function
|
| 28 |
+
- **Issue**: The function does not log exceptions, making it difficult to trace issues.
|
| 29 |
+
- **Fix**: Add logging for exceptions using the `logging` module.
|
| 30 |
+
|
| 31 |
+
### 2. Input Validation
|
| 32 |
+
|
| 33 |
+
#### `process_inputs` Function
|
| 34 |
+
- **Issue**: The function does not check if `class_names` is empty.
|
| 35 |
+
- **Fix**: Add a check to ensure `class_names` is not empty.
|
| 36 |
+
- **Issue**: The function does not validate if `image_url` is a valid URL.
|
| 37 |
+
- **Fix**: Add a check to ensure `image_url` is a valid URL.
|
| 38 |
+
|
| 39 |
+
### 3. Logging
|
| 40 |
+
|
| 41 |
+
- **Issue**: The application lacks comprehensive logging.
|
| 42 |
+
- **Fix**: Configure logging using the `logging` module and add logging statements throughout the codebase.
|
| 43 |
+
|
| 44 |
+
### 4. Security
|
| 45 |
+
|
| 46 |
+
- **Issue**: Sensitive information such as API keys are hardcoded in the code.
|
| 47 |
+
- **Fix**: Use environment variables to store sensitive information and access them securely in the code.
|
| 48 |
+
|
| 49 |
+
### 5. Dependencies
|
| 50 |
+
|
| 51 |
+
- **Issue**: The project is missing some necessary dependencies in the `requirements.txt` file.
|
| 52 |
+
- **Fix**: Add the following dependencies to the `requirements.txt` file:
|
| 53 |
+
- `aiohttp`
|
| 54 |
+
- `Pillow`
|
| 55 |
+
- `transformers`
|
| 56 |
+
- `panel`
|
| 57 |
+
|
| 58 |
+
## Conclusion
|
| 59 |
+
|
| 60 |
+
By addressing the issues identified in this report, the Project Red Sword codebase will be more robust, secure, and maintainable. Proper error handling, input validation, logging, and secure handling of sensitive information are crucial for the application's reliability and security. Additionally, ensuring all necessary dependencies are included will prevent runtime errors and improve the development experience.
|
| 61 |
+
|
| 62 |
+
## Updates
|
| 63 |
+
|
| 64 |
+
### 1. Error Handling
|
| 65 |
+
|
| 66 |
+
#### `random_url` Function
|
| 67 |
+
- **Update**: Added error handling for API errors using `try-except` blocks.
|
| 68 |
+
|
| 69 |
+
#### `open_image_url` Function
|
| 70 |
+
- **Update**: Added error handling for HTTP errors using `try-except` blocks.
|
| 71 |
+
|
| 72 |
+
#### `process_inputs` Function
|
| 73 |
+
- **Update**: Added logging for exceptions using the `logging` module.
|
| 74 |
+
|
| 75 |
+
### 2. Input Validation
|
| 76 |
+
|
| 77 |
+
#### `process_inputs` Function
|
| 78 |
+
- **Update**: Added a check to ensure `class_names` is not empty.
|
| 79 |
+
- **Update**: Added a check to ensure `image_url` is a valid URL.
|
| 80 |
+
|
| 81 |
+
### 3. Logging
|
| 82 |
+
|
| 83 |
+
- **Update**: Configured logging using the `logging` module and added logging statements throughout the codebase.
|
| 84 |
+
|
| 85 |
+
### 4. Security
|
| 86 |
+
|
| 87 |
+
- **Update**: Used environment variables to store sensitive information and access them securely in the code.
|
| 88 |
+
|
| 89 |
+
### 5. Dependencies
|
| 90 |
+
|
| 91 |
+
- **Update**: Added the following dependencies to the `requirements.txt` file:
|
| 92 |
+
- `aiohttp`
|
| 93 |
+
- `Pillow`
|
| 94 |
+
- `transformers`
|
| 95 |
+
- `panel`
|
conversation-small-cll5buey.css
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
._prosemirror-parent_15ceg_1 .ProseMirror[contenteditable]{outline:2px solid transparent;outline-offset:2px;outline-width:0}._prosemirror-parent_15ceg_1 .ProseMirror{word-wrap:break-word;font-feature-settings:"liga" 0,none;font-variant-ligatures:none;margin-bottom:.5rem;margin-top:.5rem;padding-left:0;padding-right:0;white-space:pre-wrap;white-space:break-spaces}._prosemirror-parent_15ceg_1.ProseMirror br{line-height:normal}._prosemirror-parent_15ceg_1.default-browser .placeholder:after{--tw-content:attr(data-placeholder);color:var(--text-secondary);content:var(--tw-content);cursor:text;pointer-events:none;position:relative}._prosemirror-parent_15ceg_1.default-browser .placeholder .ProseMirror-trailingBreak{display:none!important}._prosemirror-parent_15ceg_1.firefox .placeholder:before{--tw-content:attr(data-placeholder);color:var(--text-secondary);content:var(--tw-content);cursor:text;pointer-events:none;position:absolute}._prosemirror-parent_15ceg_1 p{white-space:pre-wrap}._prosemirror-parent_15ceg_1 .ProseMirror-separator{display:none!important}@keyframes _add-top-shadow_9ia9b_1{0%{border-bottom:1px solid transparent}1%,to{border-bottom:1px solid var(--border-sharp)}}._leadingBar_9ia9b_1{animation-range:0 1px;animation:_add-top-shadow_9ia9b_1 linear both}._leadingBarScrollAnimation_9ia9b_17{animation-timeline:scroll()}._primary_9ia9b_21{background-color:var(--bar-background-color,var(--main-surface-primary))}
|
devcontainer.json
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"tasks": {
|
| 3 |
+
"test": "pytest",
|
| 4 |
+
"build": "pip install -r requirements.txt && bash setup.sh",
|
| 5 |
+
"launch": "pip install -r requirements.txt && python app.py"
|
| 6 |
+
}
|
| 7 |
+
}
|
file_structure.txt
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
modules/
|
| 2 |
+
advanced_decryption.py
|
| 3 |
+
advanced_device_control.py
|
| 4 |
+
advanced_malware_analysis.py
|
| 5 |
+
advanced_social_engineering.py
|
| 6 |
+
ai_red_teaming.py
|
| 7 |
+
alerts_notifications.py
|
| 8 |
+
android_control.py
|
| 9 |
+
apt_simulation.py
|
| 10 |
+
automated_incident_response.py
|
| 11 |
+
blockchain_logger.py
|
| 12 |
+
c2_dashboard.py
|
| 13 |
+
cloud_exploitation.py
|
| 14 |
+
cloud_native_applications.py
|
| 15 |
+
data_exfiltration.py
|
| 16 |
+
data_visualization.py
|
| 17 |
+
device_control.py
|
| 18 |
+
device_fingerprinting.py
|
| 19 |
+
edge_computing.py
|
| 20 |
+
exploit_payloads.py
|
| 21 |
+
fuzzing_engine.py
|
| 22 |
+
ios_control.py
|
| 23 |
+
iot_exploitation.py
|
| 24 |
+
linux_control.py
|
| 25 |
+
machine_learning_ai.py
|
| 26 |
+
macos_control.py
|
| 27 |
+
microservices_architecture.py
|
| 28 |
+
mitm_stingray.py
|
| 29 |
+
network_exploitation.py
|
| 30 |
+
predictive_analytics.py
|
| 31 |
+
quantum_computing.py
|
| 32 |
+
real_time_monitoring.py
|
| 33 |
+
real_time_threat_intelligence.py
|
| 34 |
+
serverless_computing.py
|
| 35 |
+
threat_intelligence.py
|
| 36 |
+
vulnerability_scanner.py
|
| 37 |
+
windows_control.py
|
| 38 |
+
wireless_exploitation.py
|
| 39 |
+
zero_day_exploits.py
|
logo.png
ADDED
|
main.py
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import subprocess
|
| 3 |
+
|
| 4 |
+
def start_all_services():
|
| 5 |
+
services = [
|
| 6 |
+
"cybersecurity_framework/advanced_attacks/attack_simulations/sql_injection.py",
|
| 7 |
+
"cybersecurity_framework/app_security/sast.py",
|
| 8 |
+
"cybersecurity_framework/app_security/dast.py",
|
| 9 |
+
"cybersecurity_framework/atp/sandbox.py",
|
| 10 |
+
"cybersecurity_framework/behavioral_analytics/uba.py",
|
| 11 |
+
"cybersecurity_framework/cloud_security/casb.py",
|
| 12 |
+
"cybersecurity_framework/deception_technology/honeypot.py",
|
| 13 |
+
"cybersecurity_framework/compliance/automated_reporting.py",
|
| 14 |
+
"cybersecurity_framework/network_security/firewall_rules.py",
|
| 15 |
+
"cybersecurity_framework/threat_hunting/hunt_for_iocs.py",
|
| 16 |
+
"cybersecurity_framework/threat_hunting/behavioral_hunting.py",
|
| 17 |
+
"cybersecurity_framework/edr/edr_agent.py",
|
| 18 |
+
"cybersecurity_framework/edr/edr_dashboard.py",
|
| 19 |
+
"cybersecurity_framework/forensics/memory_dump.py",
|
| 20 |
+
"cybersecurity_framework/forensics/disk_image.py",
|
| 21 |
+
"cybersecurity_framework/idps/network_monitor.py",
|
| 22 |
+
"cybersecurity_framework/idps/intrusion_prevention.py",
|
| 23 |
+
"cybersecurity_framework/malware_analysis/static_analysis.py",
|
| 24 |
+
"cybersecurity_framework/malware_analysis/dynamic_analysis.py",
|
| 25 |
+
"cybersecurity_framework/penetration_testing/reconnaissance.py",
|
| 26 |
+
"cybersecurity_framework/penetration_testing/exploit_execution.py",
|
| 27 |
+
"cybersecurity_framework/user_management/auth.py"
|
| 28 |
+
]
|
| 29 |
+
for service in services:
|
| 30 |
+
subprocess.Popen(["python", service])
|
| 31 |
+
print("All services started!")
|
| 32 |
+
|
| 33 |
+
if __name__ == "__main__":
|
| 34 |
+
start_all_services()
|
manifest-5de69407.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
window.__remixManifest={"entry":{"module":"https://cdn.oaistatic.com/assets/f9y8kwmiihb6rbcc.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/86unh0t1vof357vs.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css"]},"routes":{"root":{"id":"root","path":"","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":true,"module":"https://cdn.oaistatic.com/assets/ab4tosc0d9yb4pl4.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/86unh0t1vof357vs.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css"]},"routes/search.evals.permalink.$threadUserId.$threadId":{"id":"routes/search.evals.permalink.$threadUserId.$threadId","parentId":"routes/search","path":"evals/permalink/:threadUserId/:threadId","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/jj4ngcr9uw6pawy5.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css"]},"routes/c_.$conversationId.canmore.$canmoreId":{"id":"routes/c_.$conversationId.canmore.$canmoreId","parentId":"root","path":"c/:conversationId/canmore/:canmoreId","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":true,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/qarphnkmp7nm7jtn.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/m2xb5h49bu6lvq0z.js","https://cdn.oaistatic.com/assets/cmi3o55uo12g5b1n.js","https://cdn.oaistatic.com/assets/hmjswdi4wh596fl1.js","https://cdn.oaistatic.com/assets/d3g4a0hcwihawz3e.js","https://cdn.oaistatic.com/assets/ucoghk4z1rejef9i.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js","https://cdn.oaistatic.com/assets/kxwyftr8p9w7yc8v.js","https://cdn.oaistatic.com/assets/kn4kwfz3pcc0dh1y.js","https://cdn.oaistatic.com/assets/ip9uh04g30enj3b9.js","https://cdn.oaistatic.com/assets/ofvfxe9a1b2fhuri.js","https://cdn.oaistatic.com/assets/mslwg28fmsyi0i8b.js","https://cdn.oaistatic.com/assets/j47f1y1dfugxdi4c.js","https://cdn.oaistatic.com/assets/e0csq37aq7fsoatu.js","https://cdn.oaistatic.com/assets/f1wmn65au0ke9jk0.js","https://cdn.oaistatic.com/assets/i9e4j4zcx9a86onu.js","https://cdn.oaistatic.com/assets/l85aultbptwwqkjh.js","https://cdn.oaistatic.com/assets/f11hnjoh71zukblv.js","https://cdn.oaistatic.com/assets/fm123c2w7hxsrqz1.js","https://cdn.oaistatic.com/assets/neav6k36puk44vhv.js","https://cdn.oaistatic.com/assets/kl1di1ygk01ncha0.js","https://cdn.oaistatic.com/assets/dees1yidh14ps5a4.js","https://cdn.oaistatic.com/assets/o7gwkc6birigbyjy.js","https://cdn.oaistatic.com/assets/mf8aa04pcamvg3db.js","https://cdn.oaistatic.com/assets/kjnxb2s320ih2pof.js","https://cdn.oaistatic.com/assets/l48h3mdgj5xfyc0e.js","https://cdn.oaistatic.com/assets/o2246qj71dru3m9e.js","https://cdn.oaistatic.com/assets/nf6la2yi1otm0vo9.js","https://cdn.oaistatic.com/assets/eh2eng92zajjlxkp.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css","https://cdn.oaistatic.com/assets/conversation-small-cll5buey.css"]},"routes/search.evals.feather.completed-tasks":{"id":"routes/search.evals.feather.completed-tasks","parentId":"routes/search","path":"evals/feather/completed-tasks","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/jrqeuw84a4izxgt5.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css"]},"routes/search.evals.feather.regressions":{"id":"routes/search.evals.feather.regressions","parentId":"routes/search","path":"evals/feather/regressions","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/fimtznoacxdyze1u.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css"]},"routes/_conversation.c.$conversationId":{"id":"routes/_conversation.c.$conversationId","parentId":"routes/_conversation","path":"c/:conversationId","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/lr0bc7ws6ok3rbmo.js","imports":[],"css":[]},"routes/search.evals.batches.$batchId":{"id":"routes/search.evals.batches.$batchId","parentId":"routes/search","path":"evals/batches/:batchId","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/of5l24uitvhagxzi.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css"]},"routes/aip.$pluginId.oauth.callback":{"id":"routes/aip.$pluginId.oauth.callback","parentId":"root","path":"aip/:pluginId/oauth/callback","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/9il5ipdqqu4y5bgs.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css"]},"routes/ccc.$pluginId.oauth.callback":{"id":"routes/ccc.$pluginId.oauth.callback","parentId":"root","path":"ccc/:pluginId/oauth/callback","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/dxeuug0jvwibydrf.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css"]},"routes/g.$gizmoId.c.$conversationId":{"id":"routes/g.$gizmoId.c.$conversationId","parentId":"root","path":"g/:gizmoId/c/:conversationId","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/d12o0165k4d8mipp.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/l073i3o7wz5lnloz.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js","https://cdn.oaistatic.com/assets/d3g4a0hcwihawz3e.js","https://cdn.oaistatic.com/assets/m2xb5h49bu6lvq0z.js","https://cdn.oaistatic.com/assets/mf8aa04pcamvg3db.js","https://cdn.oaistatic.com/assets/mslwg28fmsyi0i8b.js","https://cdn.oaistatic.com/assets/ucoghk4z1rejef9i.js","https://cdn.oaistatic.com/assets/ip9uh04g30enj3b9.js","https://cdn.oaistatic.com/assets/j47f1y1dfugxdi4c.js","https://cdn.oaistatic.com/assets/kjnxb2s320ih2pof.js","https://cdn.oaistatic.com/assets/l48h3mdgj5xfyc0e.js","https://cdn.oaistatic.com/assets/o2246qj71dru3m9e.js","https://cdn.oaistatic.com/assets/e0csq37aq7fsoatu.js","https://cdn.oaistatic.com/assets/nf6la2yi1otm0vo9.js","https://cdn.oaistatic.com/assets/f1wmn65au0ke9jk0.js","https://cdn.oaistatic.com/assets/eh2eng92zajjlxkp.js","https://cdn.oaistatic.com/assets/k38f533rijdcqgn0.js","https://cdn.oaistatic.com/assets/ev2x16g8l9ld0mx0.js","https://cdn.oaistatic.com/assets/hqitv0sbw213sss9.js","https://cdn.oaistatic.com/assets/l8q6mtl17u7kkoap.js","https://cdn.oaistatic.com/assets/nbxponn7987qv6zb.js","https://cdn.oaistatic.com/assets/fs0687qtyw84v8q1.js","https://cdn.oaistatic.com/assets/lnpqnis7t2kel0cw.js","https://cdn.oaistatic.com/assets/kxwyftr8p9w7yc8v.js","https://cdn.oaistatic.com/assets/kn4kwfz3pcc0dh1y.js","https://cdn.oaistatic.com/assets/ofvfxe9a1b2fhuri.js","https://cdn.oaistatic.com/assets/obhqaj3zdb1rotq2.js","https://cdn.oaistatic.com/assets/c0l89ic47ub2421p.js","https://cdn.oaistatic.com/assets/hx0lipk659xndf71.js","https://cdn.oaistatic.com/assets/f62vqubb0r8xed1w.js","https://cdn.oaistatic.com/assets/nj8ushefqfuwoi4c.js","https://cdn.oaistatic.com/assets/mda38ewxonn8kvuj.js","https://cdn.oaistatic.com/assets/l2oo38vrfdv3orft.js","https://cdn.oaistatic.com/assets/d8l43kuu0o9ea9il.js","https://cdn.oaistatic.com/assets/buicxllnthhjkqpv.js","https://cdn.oaistatic.com/assets/ji0i2gthym3v2luf.js","https://cdn.oaistatic.com/assets/bld70ok0mq24oqdw.js","https://cdn.oaistatic.com/assets/hmjswdi4wh596fl1.js","https://cdn.oaistatic.com/assets/g233jbmgj8j86ygl.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css","https://cdn.oaistatic.com/assets/conversation-small-cll5buey.css"]},"routes/ca.$pluginId.oauth.callback":{"id":"routes/ca.$pluginId.oauth.callback","parentId":"root","path":"ca/:pluginId/oauth/callback","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/m4kvg7yphk4ipboo.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/m2xb5h49bu6lvq0z.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css","https://cdn.oaistatic.com/assets/conversation-small-cll5buey.css"]},"routes/search.evals.feather._index":{"id":"routes/search.evals.feather._index","parentId":"routes/search","path":"evals/feather","index":true,"hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/oqyr062av61b1081.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css"]},"routes/share.e.$shareId.($action)":{"id":"routes/share.e.$shareId.($action)","parentId":"root","path":"share/e/:shareId/:action?","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/g1svsww7bljz4qqi.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/l073i3o7wz5lnloz.js","https://cdn.oaistatic.com/assets/faczaiousfpcepem.js","https://cdn.oaistatic.com/assets/ucoghk4z1rejef9i.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js","https://cdn.oaistatic.com/assets/d3g4a0hcwihawz3e.js","https://cdn.oaistatic.com/assets/m2xb5h49bu6lvq0z.js","https://cdn.oaistatic.com/assets/mf8aa04pcamvg3db.js","https://cdn.oaistatic.com/assets/mslwg28fmsyi0i8b.js","https://cdn.oaistatic.com/assets/j47f1y1dfugxdi4c.js","https://cdn.oaistatic.com/assets/kjnxb2s320ih2pof.js","https://cdn.oaistatic.com/assets/l48h3mdgj5xfyc0e.js","https://cdn.oaistatic.com/assets/o2246qj71dru3m9e.js","https://cdn.oaistatic.com/assets/e0csq37aq7fsoatu.js","https://cdn.oaistatic.com/assets/nf6la2yi1otm0vo9.js","https://cdn.oaistatic.com/assets/f1wmn65au0ke9jk0.js","https://cdn.oaistatic.com/assets/eh2eng92zajjlxkp.js","https://cdn.oaistatic.com/assets/k38f533rijdcqgn0.js","https://cdn.oaistatic.com/assets/ip9uh04g30enj3b9.js","https://cdn.oaistatic.com/assets/ev2x16g8l9ld0mx0.js","https://cdn.oaistatic.com/assets/hqitv0sbw213sss9.js","https://cdn.oaistatic.com/assets/l8q6mtl17u7kkoap.js","https://cdn.oaistatic.com/assets/nbxponn7987qv6zb.js","https://cdn.oaistatic.com/assets/fs0687qtyw84v8q1.js","https://cdn.oaistatic.com/assets/lnpqnis7t2kel0cw.js","https://cdn.oaistatic.com/assets/kxwyftr8p9w7yc8v.js","https://cdn.oaistatic.com/assets/kn4kwfz3pcc0dh1y.js","https://cdn.oaistatic.com/assets/ofvfxe9a1b2fhuri.js","https://cdn.oaistatic.com/assets/obhqaj3zdb1rotq2.js","https://cdn.oaistatic.com/assets/c0l89ic47ub2421p.js","https://cdn.oaistatic.com/assets/hx0lipk659xndf71.js","https://cdn.oaistatic.com/assets/f62vqubb0r8xed1w.js","https://cdn.oaistatic.com/assets/nj8ushefqfuwoi4c.js","https://cdn.oaistatic.com/assets/mda38ewxonn8kvuj.js","https://cdn.oaistatic.com/assets/l2oo38vrfdv3orft.js","https://cdn.oaistatic.com/assets/d8l43kuu0o9ea9il.js","https://cdn.oaistatic.com/assets/buicxllnthhjkqpv.js","https://cdn.oaistatic.com/assets/ji0i2gthym3v2luf.js","https://cdn.oaistatic.com/assets/bld70ok0mq24oqdw.js","https://cdn.oaistatic.com/assets/hmjswdi4wh596fl1.js","https://cdn.oaistatic.com/assets/g233jbmgj8j86ygl.js","https://cdn.oaistatic.com/assets/c6zgb2lnq7ibqrw9.js","https://cdn.oaistatic.com/assets/od9zy3milg264no9.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css","https://cdn.oaistatic.com/assets/conversation-small-cll5buey.css"]},"routes/auth.ext_callback_refresh":{"id":"routes/auth.ext_callback_refresh","parentId":"root","path":"auth/ext_callback_refresh","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/fucityo4coahm481.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css"]},"routes/share.$shareId.($action)":{"id":"routes/share.$shareId.($action)","parentId":"root","path":"share/:shareId/:action?","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/imsbnb5fbn59z017.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/l073i3o7wz5lnloz.js","https://cdn.oaistatic.com/assets/m2xb5h49bu6lvq0z.js","https://cdn.oaistatic.com/assets/faczaiousfpcepem.js","https://cdn.oaistatic.com/assets/ucoghk4z1rejef9i.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js","https://cdn.oaistatic.com/assets/d3g4a0hcwihawz3e.js","https://cdn.oaistatic.com/assets/mf8aa04pcamvg3db.js","https://cdn.oaistatic.com/assets/mslwg28fmsyi0i8b.js","https://cdn.oaistatic.com/assets/j47f1y1dfugxdi4c.js","https://cdn.oaistatic.com/assets/kjnxb2s320ih2pof.js","https://cdn.oaistatic.com/assets/l48h3mdgj5xfyc0e.js","https://cdn.oaistatic.com/assets/o2246qj71dru3m9e.js","https://cdn.oaistatic.com/assets/e0csq37aq7fsoatu.js","https://cdn.oaistatic.com/assets/nf6la2yi1otm0vo9.js","https://cdn.oaistatic.com/assets/f1wmn65au0ke9jk0.js","https://cdn.oaistatic.com/assets/eh2eng92zajjlxkp.js","https://cdn.oaistatic.com/assets/k38f533rijdcqgn0.js","https://cdn.oaistatic.com/assets/ip9uh04g30enj3b9.js","https://cdn.oaistatic.com/assets/ev2x16g8l9ld0mx0.js","https://cdn.oaistatic.com/assets/hqitv0sbw213sss9.js","https://cdn.oaistatic.com/assets/l8q6mtl17u7kkoap.js","https://cdn.oaistatic.com/assets/nbxponn7987qv6zb.js","https://cdn.oaistatic.com/assets/fs0687qtyw84v8q1.js","https://cdn.oaistatic.com/assets/lnpqnis7t2kel0cw.js","https://cdn.oaistatic.com/assets/kxwyftr8p9w7yc8v.js","https://cdn.oaistatic.com/assets/kn4kwfz3pcc0dh1y.js","https://cdn.oaistatic.com/assets/ofvfxe9a1b2fhuri.js","https://cdn.oaistatic.com/assets/obhqaj3zdb1rotq2.js","https://cdn.oaistatic.com/assets/c0l89ic47ub2421p.js","https://cdn.oaistatic.com/assets/hx0lipk659xndf71.js","https://cdn.oaistatic.com/assets/f62vqubb0r8xed1w.js","https://cdn.oaistatic.com/assets/nj8ushefqfuwoi4c.js","https://cdn.oaistatic.com/assets/mda38ewxonn8kvuj.js","https://cdn.oaistatic.com/assets/l2oo38vrfdv3orft.js","https://cdn.oaistatic.com/assets/d8l43kuu0o9ea9il.js","https://cdn.oaistatic.com/assets/buicxllnthhjkqpv.js","https://cdn.oaistatic.com/assets/ji0i2gthym3v2luf.js","https://cdn.oaistatic.com/assets/bld70ok0mq24oqdw.js","https://cdn.oaistatic.com/assets/hmjswdi4wh596fl1.js","https://cdn.oaistatic.com/assets/g233jbmgj8j86ygl.js","https://cdn.oaistatic.com/assets/c6zgb2lnq7ibqrw9.js","https://cdn.oaistatic.com/assets/od9zy3milg264no9.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css","https://cdn.oaistatic.com/assets/conversation-small-cll5buey.css"]},"routes/payments.success-trial":{"id":"routes/payments.success-trial","parentId":"root","path":"payments/success-trial","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/l8e2rrspdnuojdnt.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/b532mnlcbgs4y9bh.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js","https://cdn.oaistatic.com/assets/m2xb5h49bu6lvq0z.js","https://cdn.oaistatic.com/assets/ip9uh04g30enj3b9.js","https://cdn.oaistatic.com/assets/iqkhqt8iadhgk3ss.js","https://cdn.oaistatic.com/assets/d3y72ugnrmac5z1v.js","https://cdn.oaistatic.com/assets/e7gmrmr0t5rvjmc6.js","https://cdn.oaistatic.com/assets/e9lafxuzyeh4418f.js","https://cdn.oaistatic.com/assets/kl1di1ygk01ncha0.js","https://cdn.oaistatic.com/assets/nf6la2yi1otm0vo9.js","https://cdn.oaistatic.com/assets/iej0cupg2dqkmejt.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css","https://cdn.oaistatic.com/assets/conversation-small-cll5buey.css"]},"routes/payments.success-team":{"id":"routes/payments.success-team","parentId":"root","path":"payments/success-team","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/dbluvbx0g53iyti1.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/b532mnlcbgs4y9bh.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js","https://cdn.oaistatic.com/assets/m2xb5h49bu6lvq0z.js","https://cdn.oaistatic.com/assets/ip9uh04g30enj3b9.js","https://cdn.oaistatic.com/assets/iqkhqt8iadhgk3ss.js","https://cdn.oaistatic.com/assets/d3y72ugnrmac5z1v.js","https://cdn.oaistatic.com/assets/e7gmrmr0t5rvjmc6.js","https://cdn.oaistatic.com/assets/e9lafxuzyeh4418f.js","https://cdn.oaistatic.com/assets/kl1di1ygk01ncha0.js","https://cdn.oaistatic.com/assets/nf6la2yi1otm0vo9.js","https://cdn.oaistatic.com/assets/iej0cupg2dqkmejt.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css","https://cdn.oaistatic.com/assets/conversation-small-cll5buey.css"]},"routes/workspace.deactivated":{"id":"routes/workspace.deactivated","parentId":"root","path":"workspace/deactivated","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/llgn4sybpxjesnv4.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/m2xb5h49bu6lvq0z.js","https://cdn.oaistatic.com/assets/e0csq37aq7fsoatu.js","https://cdn.oaistatic.com/assets/o2246qj71dru3m9e.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js","https://cdn.oaistatic.com/assets/j47f1y1dfugxdi4c.js","https://cdn.oaistatic.com/assets/ucoghk4z1rejef9i.js","https://cdn.oaistatic.com/assets/ip9uh04g30enj3b9.js","https://cdn.oaistatic.com/assets/mf8aa04pcamvg3db.js","https://cdn.oaistatic.com/assets/nf6la2yi1otm0vo9.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css","https://cdn.oaistatic.com/assets/conversation-small-cll5buey.css"]},"routes/_conversation._index":{"id":"routes/_conversation._index","parentId":"routes/_conversation","index":true,"hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":true,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/jjr9on9cxlrbskjq.js","imports":[],"css":[]},"routes/admin_.api-reference":{"id":"routes/admin_.api-reference","parentId":"root","path":"admin/api-reference","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/gs0s8vsvqjp9kyp4.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/m2xb5h49bu6lvq0z.js","https://cdn.oaistatic.com/assets/mzkxlhrlmxhntkvn.js","https://cdn.oaistatic.com/assets/e9lafxuzyeh4418f.js","https://cdn.oaistatic.com/assets/c3w1qjz8pnherad3.js","https://cdn.oaistatic.com/assets/joa8jajuiu4xqpzn.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css","https://cdn.oaistatic.com/assets/conversation-small-cll5buey.css"]},"routes/auth.open_in_desktop":{"id":"routes/auth.open_in_desktop","parentId":"root","path":"auth/open_in_desktop","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/88f06wmkagxwqc1b.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/b5bdoo7rz35s856u.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js","https://cdn.oaistatic.com/assets/e0csq37aq7fsoatu.js","https://cdn.oaistatic.com/assets/m2xb5h49bu6lvq0z.js","https://cdn.oaistatic.com/assets/j47f1y1dfugxdi4c.js","https://cdn.oaistatic.com/assets/ucoghk4z1rejef9i.js","https://cdn.oaistatic.com/assets/ip9uh04g30enj3b9.js","https://cdn.oaistatic.com/assets/l48h3mdgj5xfyc0e.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css","https://cdn.oaistatic.com/assets/conversation-small-cll5buey.css"]},"routes/invite.$referralCode":{"id":"routes/invite.$referralCode","parentId":"root","path":"invite/:referralCode","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/c1m4o7a78ujck6u8.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/hku0zt9rpj7w9u64.js","https://cdn.oaistatic.com/assets/m2xb5h49bu6lvq0z.js","https://cdn.oaistatic.com/assets/b5bdoo7rz35s856u.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js","https://cdn.oaistatic.com/assets/gp7lex0zqamxro5m.js","https://cdn.oaistatic.com/assets/ip9uh04g30enj3b9.js","https://cdn.oaistatic.com/assets/fsddy3bxlesj6ecw.js","https://cdn.oaistatic.com/assets/e0csq37aq7fsoatu.js","https://cdn.oaistatic.com/assets/j47f1y1dfugxdi4c.js","https://cdn.oaistatic.com/assets/ucoghk4z1rejef9i.js","https://cdn.oaistatic.com/assets/l48h3mdgj5xfyc0e.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css","https://cdn.oaistatic.com/assets/conversation-small-cll5buey.css"]},"routes/api.content.$fileId":{"id":"routes/api.content.$fileId","parentId":"root","path":"api/content/:fileId","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/fhogqbk67ffg1ijv.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css"]},"routes/gpts.editor.($slug)":{"id":"routes/gpts.editor.($slug)","parentId":"root","path":"gpts/editor/:slug?","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":true,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/jkzgrraemc3ry17m.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/m2xb5h49bu6lvq0z.js","https://cdn.oaistatic.com/assets/bzctgnw2j3qd7y8q.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js","https://cdn.oaistatic.com/assets/mslwg28fmsyi0i8b.js","https://cdn.oaistatic.com/assets/ucoghk4z1rejef9i.js","https://cdn.oaistatic.com/assets/ip9uh04g30enj3b9.js","https://cdn.oaistatic.com/assets/j47f1y1dfugxdi4c.js","https://cdn.oaistatic.com/assets/m5nl9fanqxhxp5j8.js","https://cdn.oaistatic.com/assets/e0csq37aq7fsoatu.js","https://cdn.oaistatic.com/assets/hqitv0sbw213sss9.js","https://cdn.oaistatic.com/assets/eh2eng92zajjlxkp.js","https://cdn.oaistatic.com/assets/kjnxb2s320ih2pof.js","https://cdn.oaistatic.com/assets/l48h3mdgj5xfyc0e.js","https://cdn.oaistatic.com/assets/fsddy3bxlesj6ecw.js","https://cdn.oaistatic.com/assets/f62vqubb0r8xed1w.js","https://cdn.oaistatic.com/assets/hg9oun43zu8s8jth.js","https://cdn.oaistatic.com/assets/mf8aa04pcamvg3db.js","https://cdn.oaistatic.com/assets/nf6la2yi1otm0vo9.js","https://cdn.oaistatic.com/assets/d3g4a0hcwihawz3e.js","https://cdn.oaistatic.com/assets/o2246qj71dru3m9e.js","https://cdn.oaistatic.com/assets/f1wmn65au0ke9jk0.js","https://cdn.oaistatic.com/assets/nj8ushefqfuwoi4c.js","https://cdn.oaistatic.com/assets/jbc1iteh05yod7ft.js","https://cdn.oaistatic.com/assets/fs0687qtyw84v8q1.js","https://cdn.oaistatic.com/assets/lnpqnis7t2kel0cw.js","https://cdn.oaistatic.com/assets/kxwyftr8p9w7yc8v.js","https://cdn.oaistatic.com/assets/kn4kwfz3pcc0dh1y.js","https://cdn.oaistatic.com/assets/ofvfxe9a1b2fhuri.js","https://cdn.oaistatic.com/assets/obhqaj3zdb1rotq2.js","https://cdn.oaistatic.com/assets/c0l89ic47ub2421p.js","https://cdn.oaistatic.com/assets/hx0lipk659xndf71.js","https://cdn.oaistatic.com/assets/mda38ewxonn8kvuj.js","https://cdn.oaistatic.com/assets/l2oo38vrfdv3orft.js","https://cdn.oaistatic.com/assets/d8l43kuu0o9ea9il.js","https://cdn.oaistatic.com/assets/buicxllnthhjkqpv.js","https://cdn.oaistatic.com/assets/ev2x16g8l9ld0mx0.js","https://cdn.oaistatic.com/assets/ji0i2gthym3v2luf.js","https://cdn.oaistatic.com/assets/bld70ok0mq24oqdw.js","https://cdn.oaistatic.com/assets/fbqgwj6qtlb9xtkk.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css","https://cdn.oaistatic.com/assets/conversation-small-cll5buey.css"]},"routes/load-page-with-auth":{"id":"routes/load-page-with-auth","parentId":"root","path":"load-page-with-auth","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/ipgqcesck3rgo6cw.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css"]},"routes/search.evals._index":{"id":"routes/search.evals._index","parentId":"routes/search","path":"evals","index":true,"hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/pd9smzpeomelavry.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css"]},"routes/auth.ext_callback":{"id":"routes/auth.ext_callback","parentId":"root","path":"auth/ext_callback","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/85cmc7hiodyizg2r.js","imports":["https://cdn.oaistatic.com/assets/m2xb5h49bu6lvq0z.js","https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js"],"css":["https://cdn.oaistatic.com/assets/conversation-small-cll5buey.css","https://cdn.oaistatic.com/assets/root-erhliqbe.css"]},"routes/continue_from_api":{"id":"routes/continue_from_api","parentId":"root","path":"continue_from_api","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/j47p7efqcmx2ratb.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css"]},"routes/g.$gizmoId._index":{"id":"routes/g.$gizmoId._index","parentId":"root","path":"g/:gizmoId","index":true,"hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/cwk79i1moxhqe7sp.js","imports":["https://cdn.oaistatic.com/assets/m83da3d8sxq6tgym.js","https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js","https://cdn.oaistatic.com/assets/l073i3o7wz5lnloz.js","https://cdn.oaistatic.com/assets/d3g4a0hcwihawz3e.js","https://cdn.oaistatic.com/assets/m2xb5h49bu6lvq0z.js","https://cdn.oaistatic.com/assets/mf8aa04pcamvg3db.js","https://cdn.oaistatic.com/assets/mslwg28fmsyi0i8b.js","https://cdn.oaistatic.com/assets/ucoghk4z1rejef9i.js","https://cdn.oaistatic.com/assets/ip9uh04g30enj3b9.js","https://cdn.oaistatic.com/assets/j47f1y1dfugxdi4c.js","https://cdn.oaistatic.com/assets/kjnxb2s320ih2pof.js","https://cdn.oaistatic.com/assets/l48h3mdgj5xfyc0e.js","https://cdn.oaistatic.com/assets/o2246qj71dru3m9e.js","https://cdn.oaistatic.com/assets/e0csq37aq7fsoatu.js","https://cdn.oaistatic.com/assets/nf6la2yi1otm0vo9.js","https://cdn.oaistatic.com/assets/f1wmn65au0ke9jk0.js","https://cdn.oaistatic.com/assets/eh2eng92zajjlxkp.js","https://cdn.oaistatic.com/assets/k38f533rijdcqgn0.js","https://cdn.oaistatic.com/assets/ev2x16g8l9ld0mx0.js","https://cdn.oaistatic.com/assets/hqitv0sbw213sss9.js","https://cdn.oaistatic.com/assets/l8q6mtl17u7kkoap.js","https://cdn.oaistatic.com/assets/nbxponn7987qv6zb.js","https://cdn.oaistatic.com/assets/fs0687qtyw84v8q1.js","https://cdn.oaistatic.com/assets/lnpqnis7t2kel0cw.js","https://cdn.oaistatic.com/assets/kxwyftr8p9w7yc8v.js","https://cdn.oaistatic.com/assets/kn4kwfz3pcc0dh1y.js","https://cdn.oaistatic.com/assets/ofvfxe9a1b2fhuri.js","https://cdn.oaistatic.com/assets/obhqaj3zdb1rotq2.js","https://cdn.oaistatic.com/assets/c0l89ic47ub2421p.js","https://cdn.oaistatic.com/assets/hx0lipk659xndf71.js","https://cdn.oaistatic.com/assets/f62vqubb0r8xed1w.js","https://cdn.oaistatic.com/assets/nj8ushefqfuwoi4c.js","https://cdn.oaistatic.com/assets/mda38ewxonn8kvuj.js","https://cdn.oaistatic.com/assets/l2oo38vrfdv3orft.js","https://cdn.oaistatic.com/assets/d8l43kuu0o9ea9il.js","https://cdn.oaistatic.com/assets/buicxllnthhjkqpv.js","https://cdn.oaistatic.com/assets/ji0i2gthym3v2luf.js","https://cdn.oaistatic.com/assets/bld70ok0mq24oqdw.js","https://cdn.oaistatic.com/assets/hmjswdi4wh596fl1.js","https://cdn.oaistatic.com/assets/g233jbmgj8j86ygl.js","https://cdn.oaistatic.com/assets/k8unjmts6g0tf1ka.js","https://cdn.oaistatic.com/assets/cz4z3pbu6ux6pmxn.js","https://cdn.oaistatic.com/assets/od9zy3milg264no9.js","https://cdn.oaistatic.com/assets/imwtt6z6av0di6t6.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css","https://cdn.oaistatic.com/assets/conversation-small-cll5buey.css"]},"routes/admin.connectors":{"id":"routes/admin.connectors","parentId":"routes/admin","path":"connectors","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/ic7y8k1e7l8whmn6.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/mlho74ggfr424i0r.js","https://cdn.oaistatic.com/assets/bmgyfq775pdwfzaw.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js","https://cdn.oaistatic.com/assets/nf6la2yi1otm0vo9.js","https://cdn.oaistatic.com/assets/e0csq37aq7fsoatu.js","https://cdn.oaistatic.com/assets/m2xb5h49bu6lvq0z.js","https://cdn.oaistatic.com/assets/mf8aa04pcamvg3db.js","https://cdn.oaistatic.com/assets/k38f533rijdcqgn0.js","https://cdn.oaistatic.com/assets/d3g4a0hcwihawz3e.js","https://cdn.oaistatic.com/assets/mslwg28fmsyi0i8b.js","https://cdn.oaistatic.com/assets/ucoghk4z1rejef9i.js","https://cdn.oaistatic.com/assets/ip9uh04g30enj3b9.js","https://cdn.oaistatic.com/assets/j47f1y1dfugxdi4c.js","https://cdn.oaistatic.com/assets/kjnxb2s320ih2pof.js","https://cdn.oaistatic.com/assets/l48h3mdgj5xfyc0e.js","https://cdn.oaistatic.com/assets/o2246qj71dru3m9e.js","https://cdn.oaistatic.com/assets/f1wmn65au0ke9jk0.js","https://cdn.oaistatic.com/assets/eh2eng92zajjlxkp.js","https://cdn.oaistatic.com/assets/ev2x16g8l9ld0mx0.js","https://cdn.oaistatic.com/assets/hvem6afa1bg3riwi.js","https://cdn.oaistatic.com/assets/cqcclz4v9p8d59in.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css","https://cdn.oaistatic.com/assets/conversation-small-cll5buey.css"]},"routes/auth.disable_mfa":{"id":"routes/auth.disable_mfa","parentId":"root","path":"auth/disable_mfa","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/i956xyjeqhsoi556.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css"]},"routes/g.$gizmoId.about":{"id":"routes/g.$gizmoId.about","parentId":"root","path":"g/:gizmoId/about","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/brpqtmcs830kkz5s.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/l88odlfdvsg4b2g6.js","https://cdn.oaistatic.com/assets/mslwg28fmsyi0i8b.js","https://cdn.oaistatic.com/assets/m2xb5h49bu6lvq0z.js","https://cdn.oaistatic.com/assets/m83da3d8sxq6tgym.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js","https://cdn.oaistatic.com/assets/e0csq37aq7fsoatu.js","https://cdn.oaistatic.com/assets/j47f1y1dfugxdi4c.js","https://cdn.oaistatic.com/assets/ucoghk4z1rejef9i.js","https://cdn.oaistatic.com/assets/ip9uh04g30enj3b9.js","https://cdn.oaistatic.com/assets/mf8aa04pcamvg3db.js","https://cdn.oaistatic.com/assets/nj8ushefqfuwoi4c.js","https://cdn.oaistatic.com/assets/f62vqubb0r8xed1w.js","https://cdn.oaistatic.com/assets/hx0lipk659xndf71.js","https://cdn.oaistatic.com/assets/d3g4a0hcwihawz3e.js","https://cdn.oaistatic.com/assets/kjnxb2s320ih2pof.js","https://cdn.oaistatic.com/assets/l48h3mdgj5xfyc0e.js","https://cdn.oaistatic.com/assets/o2246qj71dru3m9e.js","https://cdn.oaistatic.com/assets/nf6la2yi1otm0vo9.js","https://cdn.oaistatic.com/assets/f1wmn65au0ke9jk0.js","https://cdn.oaistatic.com/assets/eh2eng92zajjlxkp.js","https://cdn.oaistatic.com/assets/l073i3o7wz5lnloz.js","https://cdn.oaistatic.com/assets/k38f533rijdcqgn0.js","https://cdn.oaistatic.com/assets/ev2x16g8l9ld0mx0.js","https://cdn.oaistatic.com/assets/hqitv0sbw213sss9.js","https://cdn.oaistatic.com/assets/l8q6mtl17u7kkoap.js","https://cdn.oaistatic.com/assets/nbxponn7987qv6zb.js","https://cdn.oaistatic.com/assets/fs0687qtyw84v8q1.js","https://cdn.oaistatic.com/assets/lnpqnis7t2kel0cw.js","https://cdn.oaistatic.com/assets/kxwyftr8p9w7yc8v.js","https://cdn.oaistatic.com/assets/kn4kwfz3pcc0dh1y.js","https://cdn.oaistatic.com/assets/ofvfxe9a1b2fhuri.js","https://cdn.oaistatic.com/assets/obhqaj3zdb1rotq2.js","https://cdn.oaistatic.com/assets/c0l89ic47ub2421p.js","https://cdn.oaistatic.com/assets/mda38ewxonn8kvuj.js","https://cdn.oaistatic.com/assets/l2oo38vrfdv3orft.js","https://cdn.oaistatic.com/assets/d8l43kuu0o9ea9il.js","https://cdn.oaistatic.com/assets/buicxllnthhjkqpv.js","https://cdn.oaistatic.com/assets/ji0i2gthym3v2luf.js","https://cdn.oaistatic.com/assets/bld70ok0mq24oqdw.js","https://cdn.oaistatic.com/assets/hmjswdi4wh596fl1.js","https://cdn.oaistatic.com/assets/g233jbmgj8j86ygl.js","https://cdn.oaistatic.com/assets/k8unjmts6g0tf1ka.js","https://cdn.oaistatic.com/assets/cz4z3pbu6ux6pmxn.js","https://cdn.oaistatic.com/assets/od9zy3milg264no9.js","https://cdn.oaistatic.com/assets/imwtt6z6av0di6t6.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css","https://cdn.oaistatic.com/assets/conversation-small-cll5buey.css"]},"routes/payments.success":{"id":"routes/payments.success","parentId":"root","path":"payments/success","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/bchtw6xhl0b2zn3f.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/b532mnlcbgs4y9bh.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js","https://cdn.oaistatic.com/assets/m2xb5h49bu6lvq0z.js","https://cdn.oaistatic.com/assets/ip9uh04g30enj3b9.js","https://cdn.oaistatic.com/assets/iqkhqt8iadhgk3ss.js","https://cdn.oaistatic.com/assets/d3y72ugnrmac5z1v.js","https://cdn.oaistatic.com/assets/e7gmrmr0t5rvjmc6.js","https://cdn.oaistatic.com/assets/e9lafxuzyeh4418f.js","https://cdn.oaistatic.com/assets/kl1di1ygk01ncha0.js","https://cdn.oaistatic.com/assets/nf6la2yi1otm0vo9.js","https://cdn.oaistatic.com/assets/iej0cupg2dqkmejt.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css","https://cdn.oaistatic.com/assets/conversation-small-cll5buey.css"]},"routes/admin.analytics":{"id":"routes/admin.analytics","parentId":"routes/admin","path":"analytics","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/l8qqk008ej9i7e09.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/m2xb5h49bu6lvq0z.js","https://cdn.oaistatic.com/assets/mu0dnexuedxqt36h.js","https://cdn.oaistatic.com/assets/mlho74ggfr424i0r.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js","https://cdn.oaistatic.com/assets/k38f533rijdcqgn0.js","https://cdn.oaistatic.com/assets/e0csq37aq7fsoatu.js","https://cdn.oaistatic.com/assets/j47f1y1dfugxdi4c.js","https://cdn.oaistatic.com/assets/ucoghk4z1rejef9i.js","https://cdn.oaistatic.com/assets/ip9uh04g30enj3b9.js","https://cdn.oaistatic.com/assets/mf8aa04pcamvg3db.js","https://cdn.oaistatic.com/assets/d3g4a0hcwihawz3e.js","https://cdn.oaistatic.com/assets/mslwg28fmsyi0i8b.js","https://cdn.oaistatic.com/assets/kjnxb2s320ih2pof.js","https://cdn.oaistatic.com/assets/l48h3mdgj5xfyc0e.js","https://cdn.oaistatic.com/assets/o2246qj71dru3m9e.js","https://cdn.oaistatic.com/assets/nf6la2yi1otm0vo9.js","https://cdn.oaistatic.com/assets/f1wmn65au0ke9jk0.js","https://cdn.oaistatic.com/assets/eh2eng92zajjlxkp.js","https://cdn.oaistatic.com/assets/ev2x16g8l9ld0mx0.js","https://cdn.oaistatic.com/assets/hvem6afa1bg3riwi.js","https://cdn.oaistatic.com/assets/cqcclz4v9p8d59in.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css","https://cdn.oaistatic.com/assets/conversation-small-cll5buey.css"]},"routes/api.healthcheck":{"id":"routes/api.healthcheck","parentId":"root","path":"api/healthcheck","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/i6xqssnx6dlvqwfv.js","imports":[],"css":[]},"routes/auth.enroll_mfa":{"id":"routes/auth.enroll_mfa","parentId":"root","path":"auth/enroll_mfa","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/kxzy8fru2avvq2kf.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css"]},"routes/auth.login_with":{"id":"routes/auth.login_with","parentId":"root","path":"auth/login_with","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/nhc8fgpbbye45ddy.js","imports":["https://cdn.oaistatic.com/assets/m2xb5h49bu6lvq0z.js","https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js"],"css":["https://cdn.oaistatic.com/assets/conversation-small-cll5buey.css","https://cdn.oaistatic.com/assets/root-erhliqbe.css"]},"routes/g.$gizmoId.view":{"id":"routes/g.$gizmoId.view","parentId":"root","path":"g/:gizmoId/view","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":true,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/joyl35oo1bknrbhe.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/m2xb5h49bu6lvq0z.js","https://cdn.oaistatic.com/assets/f62vqubb0r8xed1w.js","https://cdn.oaistatic.com/assets/mslwg28fmsyi0i8b.js","https://cdn.oaistatic.com/assets/m5nl9fanqxhxp5j8.js","https://cdn.oaistatic.com/assets/mf8aa04pcamvg3db.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js","https://cdn.oaistatic.com/assets/ucoghk4z1rejef9i.js","https://cdn.oaistatic.com/assets/ip9uh04g30enj3b9.js","https://cdn.oaistatic.com/assets/j47f1y1dfugxdi4c.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css","https://cdn.oaistatic.com/assets/conversation-small-cll5buey.css"]},"routes/invite.accepted":{"id":"routes/invite.accepted","parentId":"root","path":"invite/accepted","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/mdsrbyyyuy8i0whd.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/m2xb5h49bu6lvq0z.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css","https://cdn.oaistatic.com/assets/conversation-small-cll5buey.css"]},"routes/search.feedback":{"id":"routes/search.feedback","parentId":"routes/search","path":"feedback","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/kgibed7roi4o4tnc.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css"]},"routes/account.cancel":{"id":"routes/account.cancel","parentId":"root","path":"account/cancel","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/f438ok3q4xaexldi.js","imports":[],"css":[]},"routes/account.manage":{"id":"routes/account.manage","parentId":"root","path":"account/manage","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/hc3ogh6atdn8rcoh.js","imports":[],"css":[]},"routes/admin.identity":{"id":"routes/admin.identity","parentId":"routes/admin","path":"identity","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/obhk7triyrukxe39.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/m2xb5h49bu6lvq0z.js","https://cdn.oaistatic.com/assets/jk8w36bsokizpx57.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js","https://cdn.oaistatic.com/assets/mlho74ggfr424i0r.js","https://cdn.oaistatic.com/assets/mf8aa04pcamvg3db.js","https://cdn.oaistatic.com/assets/bmgyfq775pdwfzaw.js","https://cdn.oaistatic.com/assets/k38f533rijdcqgn0.js","https://cdn.oaistatic.com/assets/e0csq37aq7fsoatu.js","https://cdn.oaistatic.com/assets/j47f1y1dfugxdi4c.js","https://cdn.oaistatic.com/assets/ucoghk4z1rejef9i.js","https://cdn.oaistatic.com/assets/ip9uh04g30enj3b9.js","https://cdn.oaistatic.com/assets/d3g4a0hcwihawz3e.js","https://cdn.oaistatic.com/assets/mslwg28fmsyi0i8b.js","https://cdn.oaistatic.com/assets/kjnxb2s320ih2pof.js","https://cdn.oaistatic.com/assets/l48h3mdgj5xfyc0e.js","https://cdn.oaistatic.com/assets/o2246qj71dru3m9e.js","https://cdn.oaistatic.com/assets/nf6la2yi1otm0vo9.js","https://cdn.oaistatic.com/assets/f1wmn65au0ke9jk0.js","https://cdn.oaistatic.com/assets/eh2eng92zajjlxkp.js","https://cdn.oaistatic.com/assets/ev2x16g8l9ld0mx0.js","https://cdn.oaistatic.com/assets/hvem6afa1bg3riwi.js","https://cdn.oaistatic.com/assets/cqcclz4v9p8d59in.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css","https://cdn.oaistatic.com/assets/conversation-small-cll5buey.css"]},"routes/admin.settings":{"id":"routes/admin.settings","parentId":"routes/admin","path":"settings","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/omzk95zgj8kxuitl.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/javg35sdg99x9tsv.js","https://cdn.oaistatic.com/assets/m2xb5h49bu6lvq0z.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js","https://cdn.oaistatic.com/assets/nf6la2yi1otm0vo9.js","https://cdn.oaistatic.com/assets/mlho74ggfr424i0r.js","https://cdn.oaistatic.com/assets/bmgyfq775pdwfzaw.js","https://cdn.oaistatic.com/assets/k38f533rijdcqgn0.js","https://cdn.oaistatic.com/assets/e0csq37aq7fsoatu.js","https://cdn.oaistatic.com/assets/j47f1y1dfugxdi4c.js","https://cdn.oaistatic.com/assets/ucoghk4z1rejef9i.js","https://cdn.oaistatic.com/assets/ip9uh04g30enj3b9.js","https://cdn.oaistatic.com/assets/mf8aa04pcamvg3db.js","https://cdn.oaistatic.com/assets/d3g4a0hcwihawz3e.js","https://cdn.oaistatic.com/assets/mslwg28fmsyi0i8b.js","https://cdn.oaistatic.com/assets/kjnxb2s320ih2pof.js","https://cdn.oaistatic.com/assets/l48h3mdgj5xfyc0e.js","https://cdn.oaistatic.com/assets/o2246qj71dru3m9e.js","https://cdn.oaistatic.com/assets/f1wmn65au0ke9jk0.js","https://cdn.oaistatic.com/assets/eh2eng92zajjlxkp.js","https://cdn.oaistatic.com/assets/ev2x16g8l9ld0mx0.js","https://cdn.oaistatic.com/assets/hvem6afa1bg3riwi.js","https://cdn.oaistatic.com/assets/cqcclz4v9p8d59in.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css","https://cdn.oaistatic.com/assets/conversation-small-cll5buey.css"]},"routes/search.machine":{"id":"routes/search.machine","parentId":"routes/search","path":"machine","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/doivpdv8rk2fpe9n.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css"]},"routes/search_._index":{"id":"routes/search_._index","parentId":"root","path":"search","index":true,"hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/f32b4yb61z9obuyk.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js","https://cdn.oaistatic.com/assets/acba7ryldzgc43lq.js","https://cdn.oaistatic.com/assets/m2xb5h49bu6lvq0z.js","https://cdn.oaistatic.com/assets/nv9hhwe1hyggyh87.js","https://cdn.oaistatic.com/assets/ip9uh04g30enj3b9.js","https://cdn.oaistatic.com/assets/efz9sxvbc2q7qqmm.js","https://cdn.oaistatic.com/assets/fbqgwj6qtlb9xtkk.js","https://cdn.oaistatic.com/assets/neav6k36puk44vhv.js","https://cdn.oaistatic.com/assets/kfioli7082e56f5c.js","https://cdn.oaistatic.com/assets/exg7058hf4ct7p8b.js","https://cdn.oaistatic.com/assets/gxzuje31a3a9dsut.js","https://cdn.oaistatic.com/assets/mf8aa04pcamvg3db.js","https://cdn.oaistatic.com/assets/ofvfxe9a1b2fhuri.js","https://cdn.oaistatic.com/assets/ucoghk4z1rejef9i.js","https://cdn.oaistatic.com/assets/kn4kwfz3pcc0dh1y.js","https://cdn.oaistatic.com/assets/983a0dy92b3ronpv.js","https://cdn.oaistatic.com/assets/bld70ok0mq24oqdw.js","https://cdn.oaistatic.com/assets/db4ckjfamsw1iore.js","https://cdn.oaistatic.com/assets/kqwdyvkaaavvn8k3.js","https://cdn.oaistatic.com/assets/gefdbxsemfkvs86p.js","https://cdn.oaistatic.com/assets/mslwg28fmsyi0i8b.js","https://cdn.oaistatic.com/assets/j47f1y1dfugxdi4c.js","https://cdn.oaistatic.com/assets/kl1di1ygk01ncha0.js","https://cdn.oaistatic.com/assets/nf6la2yi1otm0vo9.js","https://cdn.oaistatic.com/assets/hd80pjgig22v5kcv.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css","https://cdn.oaistatic.com/assets/conversation-small-cll5buey.css"]},"routes/_conversation":{"id":"routes/_conversation","parentId":"root","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":true,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/euh9lc9l55ehuxzg.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/l073i3o7wz5lnloz.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js","https://cdn.oaistatic.com/assets/d3g4a0hcwihawz3e.js","https://cdn.oaistatic.com/assets/m2xb5h49bu6lvq0z.js","https://cdn.oaistatic.com/assets/mf8aa04pcamvg3db.js","https://cdn.oaistatic.com/assets/mslwg28fmsyi0i8b.js","https://cdn.oaistatic.com/assets/ucoghk4z1rejef9i.js","https://cdn.oaistatic.com/assets/ip9uh04g30enj3b9.js","https://cdn.oaistatic.com/assets/j47f1y1dfugxdi4c.js","https://cdn.oaistatic.com/assets/kjnxb2s320ih2pof.js","https://cdn.oaistatic.com/assets/l48h3mdgj5xfyc0e.js","https://cdn.oaistatic.com/assets/o2246qj71dru3m9e.js","https://cdn.oaistatic.com/assets/e0csq37aq7fsoatu.js","https://cdn.oaistatic.com/assets/nf6la2yi1otm0vo9.js","https://cdn.oaistatic.com/assets/f1wmn65au0ke9jk0.js","https://cdn.oaistatic.com/assets/eh2eng92zajjlxkp.js","https://cdn.oaistatic.com/assets/k38f533rijdcqgn0.js","https://cdn.oaistatic.com/assets/ev2x16g8l9ld0mx0.js","https://cdn.oaistatic.com/assets/hqitv0sbw213sss9.js","https://cdn.oaistatic.com/assets/l8q6mtl17u7kkoap.js","https://cdn.oaistatic.com/assets/nbxponn7987qv6zb.js","https://cdn.oaistatic.com/assets/fs0687qtyw84v8q1.js","https://cdn.oaistatic.com/assets/lnpqnis7t2kel0cw.js","https://cdn.oaistatic.com/assets/kxwyftr8p9w7yc8v.js","https://cdn.oaistatic.com/assets/kn4kwfz3pcc0dh1y.js","https://cdn.oaistatic.com/assets/ofvfxe9a1b2fhuri.js","https://cdn.oaistatic.com/assets/obhqaj3zdb1rotq2.js","https://cdn.oaistatic.com/assets/c0l89ic47ub2421p.js","https://cdn.oaistatic.com/assets/hx0lipk659xndf71.js","https://cdn.oaistatic.com/assets/f62vqubb0r8xed1w.js","https://cdn.oaistatic.com/assets/nj8ushefqfuwoi4c.js","https://cdn.oaistatic.com/assets/mda38ewxonn8kvuj.js","https://cdn.oaistatic.com/assets/l2oo38vrfdv3orft.js","https://cdn.oaistatic.com/assets/d8l43kuu0o9ea9il.js","https://cdn.oaistatic.com/assets/buicxllnthhjkqpv.js","https://cdn.oaistatic.com/assets/ji0i2gthym3v2luf.js","https://cdn.oaistatic.com/assets/bld70ok0mq24oqdw.js","https://cdn.oaistatic.com/assets/hmjswdi4wh596fl1.js","https://cdn.oaistatic.com/assets/g233jbmgj8j86ygl.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css","https://cdn.oaistatic.com/assets/conversation-small-cll5buey.css"]},"routes/admin.billing":{"id":"routes/admin.billing","parentId":"routes/admin","path":"billing","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/e6mdy0jilaxpv2de.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/cqcclz4v9p8d59in.js","https://cdn.oaistatic.com/assets/m2xb5h49bu6lvq0z.js","https://cdn.oaistatic.com/assets/iej0cupg2dqkmejt.js","https://cdn.oaistatic.com/assets/l48h3mdgj5xfyc0e.js","https://cdn.oaistatic.com/assets/mf8aa04pcamvg3db.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js","https://cdn.oaistatic.com/assets/mlho74ggfr424i0r.js","https://cdn.oaistatic.com/assets/bmgyfq775pdwfzaw.js","https://cdn.oaistatic.com/assets/ucoghk4z1rejef9i.js","https://cdn.oaistatic.com/assets/ip9uh04g30enj3b9.js","https://cdn.oaistatic.com/assets/k38f533rijdcqgn0.js","https://cdn.oaistatic.com/assets/e0csq37aq7fsoatu.js","https://cdn.oaistatic.com/assets/j47f1y1dfugxdi4c.js","https://cdn.oaistatic.com/assets/d3g4a0hcwihawz3e.js","https://cdn.oaistatic.com/assets/mslwg28fmsyi0i8b.js","https://cdn.oaistatic.com/assets/kjnxb2s320ih2pof.js","https://cdn.oaistatic.com/assets/o2246qj71dru3m9e.js","https://cdn.oaistatic.com/assets/nf6la2yi1otm0vo9.js","https://cdn.oaistatic.com/assets/f1wmn65au0ke9jk0.js","https://cdn.oaistatic.com/assets/eh2eng92zajjlxkp.js","https://cdn.oaistatic.com/assets/ev2x16g8l9ld0mx0.js","https://cdn.oaistatic.com/assets/hvem6afa1bg3riwi.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css","https://cdn.oaistatic.com/assets/conversation-small-cll5buey.css"]},"routes/admin._index":{"id":"routes/admin._index","parentId":"routes/admin","index":true,"hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/dis44lehpch7785w.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/mf8aa04pcamvg3db.js","https://cdn.oaistatic.com/assets/e0csq37aq7fsoatu.js","https://cdn.oaistatic.com/assets/m2xb5h49bu6lvq0z.js","https://cdn.oaistatic.com/assets/iej0cupg2dqkmejt.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js","https://cdn.oaistatic.com/assets/mlho74ggfr424i0r.js","https://cdn.oaistatic.com/assets/o2246qj71dru3m9e.js","https://cdn.oaistatic.com/assets/j47f1y1dfugxdi4c.js","https://cdn.oaistatic.com/assets/ucoghk4z1rejef9i.js","https://cdn.oaistatic.com/assets/ip9uh04g30enj3b9.js","https://cdn.oaistatic.com/assets/k38f533rijdcqgn0.js","https://cdn.oaistatic.com/assets/d3g4a0hcwihawz3e.js","https://cdn.oaistatic.com/assets/mslwg28fmsyi0i8b.js","https://cdn.oaistatic.com/assets/kjnxb2s320ih2pof.js","https://cdn.oaistatic.com/assets/l48h3mdgj5xfyc0e.js","https://cdn.oaistatic.com/assets/f1wmn65au0ke9jk0.js","https://cdn.oaistatic.com/assets/eh2eng92zajjlxkp.js","https://cdn.oaistatic.com/assets/ev2x16g8l9ld0mx0.js","https://cdn.oaistatic.com/assets/hvem6afa1bg3riwi.js","https://cdn.oaistatic.com/assets/cqcclz4v9p8d59in.js","https://cdn.oaistatic.com/assets/nf6la2yi1otm0vo9.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css","https://cdn.oaistatic.com/assets/conversation-small-cll5buey.css"]},"routes/admin.groups":{"id":"routes/admin.groups","parentId":"routes/admin","path":"groups","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/gc0kx5q7t45405cf.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/m2xb5h49bu6lvq0z.js","https://cdn.oaistatic.com/assets/kbl35kx7h3ihgku0.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js","https://cdn.oaistatic.com/assets/mf8aa04pcamvg3db.js","https://cdn.oaistatic.com/assets/mlho74ggfr424i0r.js","https://cdn.oaistatic.com/assets/d3y72ugnrmac5z1v.js","https://cdn.oaistatic.com/assets/k38f533rijdcqgn0.js","https://cdn.oaistatic.com/assets/e0csq37aq7fsoatu.js","https://cdn.oaistatic.com/assets/j47f1y1dfugxdi4c.js","https://cdn.oaistatic.com/assets/ucoghk4z1rejef9i.js","https://cdn.oaistatic.com/assets/ip9uh04g30enj3b9.js","https://cdn.oaistatic.com/assets/d3g4a0hcwihawz3e.js","https://cdn.oaistatic.com/assets/mslwg28fmsyi0i8b.js","https://cdn.oaistatic.com/assets/kjnxb2s320ih2pof.js","https://cdn.oaistatic.com/assets/l48h3mdgj5xfyc0e.js","https://cdn.oaistatic.com/assets/o2246qj71dru3m9e.js","https://cdn.oaistatic.com/assets/nf6la2yi1otm0vo9.js","https://cdn.oaistatic.com/assets/f1wmn65au0ke9jk0.js","https://cdn.oaistatic.com/assets/eh2eng92zajjlxkp.js","https://cdn.oaistatic.com/assets/ev2x16g8l9ld0mx0.js","https://cdn.oaistatic.com/assets/hvem6afa1bg3riwi.js","https://cdn.oaistatic.com/assets/cqcclz4v9p8d59in.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css","https://cdn.oaistatic.com/assets/conversation-small-cll5buey.css"]},"routes/auth.logout":{"id":"routes/auth.logout","parentId":"root","path":"auth/logout","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/4b7uxdjo8j6nf2jf.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/m2xb5h49bu6lvq0z.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css","https://cdn.oaistatic.com/assets/conversation-small-cll5buey.css"]},"routes/gpts._index":{"id":"routes/gpts._index","parentId":"root","path":"gpts","index":true,"hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/dyrws8676ha3v7rs.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/exw0xe34rs2u8d52.js","https://cdn.oaistatic.com/assets/m2xb5h49bu6lvq0z.js","https://cdn.oaistatic.com/assets/imwtt6z6av0di6t6.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js","https://cdn.oaistatic.com/assets/mslwg28fmsyi0i8b.js","https://cdn.oaistatic.com/assets/ucoghk4z1rejef9i.js","https://cdn.oaistatic.com/assets/ip9uh04g30enj3b9.js","https://cdn.oaistatic.com/assets/j47f1y1dfugxdi4c.js","https://cdn.oaistatic.com/assets/e0csq37aq7fsoatu.js","https://cdn.oaistatic.com/assets/d3g4a0hcwihawz3e.js","https://cdn.oaistatic.com/assets/mf8aa04pcamvg3db.js","https://cdn.oaistatic.com/assets/kjnxb2s320ih2pof.js","https://cdn.oaistatic.com/assets/l48h3mdgj5xfyc0e.js","https://cdn.oaistatic.com/assets/o2246qj71dru3m9e.js","https://cdn.oaistatic.com/assets/nf6la2yi1otm0vo9.js","https://cdn.oaistatic.com/assets/f1wmn65au0ke9jk0.js","https://cdn.oaistatic.com/assets/eh2eng92zajjlxkp.js","https://cdn.oaistatic.com/assets/l88odlfdvsg4b2g6.js","https://cdn.oaistatic.com/assets/nj8ushefqfuwoi4c.js","https://cdn.oaistatic.com/assets/f62vqubb0r8xed1w.js","https://cdn.oaistatic.com/assets/hx0lipk659xndf71.js","https://cdn.oaistatic.com/assets/k8unjmts6g0tf1ka.js","https://cdn.oaistatic.com/assets/lnpqnis7t2kel0cw.js","https://cdn.oaistatic.com/assets/cz4z3pbu6ux6pmxn.js","https://cdn.oaistatic.com/assets/od9zy3milg264no9.js","https://cdn.oaistatic.com/assets/m5islwk76pkp5cyp.js","https://cdn.oaistatic.com/assets/hg9oun43zu8s8jth.js","https://cdn.oaistatic.com/assets/jbc1iteh05yod7ft.js","https://cdn.oaistatic.com/assets/l8q6mtl17u7kkoap.js","https://cdn.oaistatic.com/assets/nbxponn7987qv6zb.js","https://cdn.oaistatic.com/assets/hqitv0sbw213sss9.js","https://cdn.oaistatic.com/assets/k38f533rijdcqgn0.js","https://cdn.oaistatic.com/assets/ev2x16g8l9ld0mx0.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css","https://cdn.oaistatic.com/assets/conversation-small-cll5buey.css"]},"routes/admin.gpts":{"id":"routes/admin.gpts","parentId":"routes/admin","path":"gpts","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/b2p8q4e7tcmzuswh.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/m2xb5h49bu6lvq0z.js","https://cdn.oaistatic.com/assets/nf6la2yi1otm0vo9.js","https://cdn.oaistatic.com/assets/mlho74ggfr424i0r.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js","https://cdn.oaistatic.com/assets/javg35sdg99x9tsv.js","https://cdn.oaistatic.com/assets/hvem6afa1bg3riwi.js","https://cdn.oaistatic.com/assets/mslwg28fmsyi0i8b.js","https://cdn.oaistatic.com/assets/mf8aa04pcamvg3db.js","https://cdn.oaistatic.com/assets/f62vqubb0r8xed1w.js","https://cdn.oaistatic.com/assets/bzctgnw2j3qd7y8q.js","https://cdn.oaistatic.com/assets/oxj7j2p9i6mp62t0.js","https://cdn.oaistatic.com/assets/d3y72ugnrmac5z1v.js","https://cdn.oaistatic.com/assets/gupdaa0kze9c38sd.js","https://cdn.oaistatic.com/assets/bmgyfq775pdwfzaw.js","https://cdn.oaistatic.com/assets/k38f533rijdcqgn0.js","https://cdn.oaistatic.com/assets/e0csq37aq7fsoatu.js","https://cdn.oaistatic.com/assets/j47f1y1dfugxdi4c.js","https://cdn.oaistatic.com/assets/ucoghk4z1rejef9i.js","https://cdn.oaistatic.com/assets/ip9uh04g30enj3b9.js","https://cdn.oaistatic.com/assets/d3g4a0hcwihawz3e.js","https://cdn.oaistatic.com/assets/kjnxb2s320ih2pof.js","https://cdn.oaistatic.com/assets/l48h3mdgj5xfyc0e.js","https://cdn.oaistatic.com/assets/o2246qj71dru3m9e.js","https://cdn.oaistatic.com/assets/f1wmn65au0ke9jk0.js","https://cdn.oaistatic.com/assets/eh2eng92zajjlxkp.js","https://cdn.oaistatic.com/assets/ev2x16g8l9ld0mx0.js","https://cdn.oaistatic.com/assets/cqcclz4v9p8d59in.js","https://cdn.oaistatic.com/assets/m5nl9fanqxhxp5j8.js","https://cdn.oaistatic.com/assets/hqitv0sbw213sss9.js","https://cdn.oaistatic.com/assets/fsddy3bxlesj6ecw.js","https://cdn.oaistatic.com/assets/hg9oun43zu8s8jth.js","https://cdn.oaistatic.com/assets/nj8ushefqfuwoi4c.js","https://cdn.oaistatic.com/assets/jbc1iteh05yod7ft.js","https://cdn.oaistatic.com/assets/fs0687qtyw84v8q1.js","https://cdn.oaistatic.com/assets/lnpqnis7t2kel0cw.js","https://cdn.oaistatic.com/assets/kxwyftr8p9w7yc8v.js","https://cdn.oaistatic.com/assets/kn4kwfz3pcc0dh1y.js","https://cdn.oaistatic.com/assets/ofvfxe9a1b2fhuri.js","https://cdn.oaistatic.com/assets/obhqaj3zdb1rotq2.js","https://cdn.oaistatic.com/assets/c0l89ic47ub2421p.js","https://cdn.oaistatic.com/assets/hx0lipk659xndf71.js","https://cdn.oaistatic.com/assets/mda38ewxonn8kvuj.js","https://cdn.oaistatic.com/assets/l2oo38vrfdv3orft.js","https://cdn.oaistatic.com/assets/d8l43kuu0o9ea9il.js","https://cdn.oaistatic.com/assets/buicxllnthhjkqpv.js","https://cdn.oaistatic.com/assets/ji0i2gthym3v2luf.js","https://cdn.oaistatic.com/assets/bld70ok0mq24oqdw.js","https://cdn.oaistatic.com/assets/fbqgwj6qtlb9xtkk.js","https://cdn.oaistatic.com/assets/exw0xe34rs2u8d52.js","https://cdn.oaistatic.com/assets/l88odlfdvsg4b2g6.js","https://cdn.oaistatic.com/assets/k8unjmts6g0tf1ka.js","https://cdn.oaistatic.com/assets/cz4z3pbu6ux6pmxn.js","https://cdn.oaistatic.com/assets/od9zy3milg264no9.js","https://cdn.oaistatic.com/assets/m5islwk76pkp5cyp.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css","https://cdn.oaistatic.com/assets/conversation-small-cll5buey.css"]},"routes/auth.error":{"id":"routes/auth.error","parentId":"root","path":"auth/error","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/migkq6jv01sjlj7m.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/b5bdoo7rz35s856u.js","https://cdn.oaistatic.com/assets/luren98bagfjc1x2.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js","https://cdn.oaistatic.com/assets/e0csq37aq7fsoatu.js","https://cdn.oaistatic.com/assets/m2xb5h49bu6lvq0z.js","https://cdn.oaistatic.com/assets/j47f1y1dfugxdi4c.js","https://cdn.oaistatic.com/assets/ucoghk4z1rejef9i.js","https://cdn.oaistatic.com/assets/ip9uh04g30enj3b9.js","https://cdn.oaistatic.com/assets/l48h3mdgj5xfyc0e.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css","https://cdn.oaistatic.com/assets/conversation-small-cll5buey.css"]},"routes/auth.login":{"id":"routes/auth.login","parentId":"root","path":"auth/login","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/o9yqw6le1gz6f5w0.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/hku0zt9rpj7w9u64.js","https://cdn.oaistatic.com/assets/nk2qlv5c1cpbhd7r.js","https://cdn.oaistatic.com/assets/b5bdoo7rz35s856u.js","https://cdn.oaistatic.com/assets/m2xb5h49bu6lvq0z.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js","https://cdn.oaistatic.com/assets/fsddy3bxlesj6ecw.js","https://cdn.oaistatic.com/assets/ip9uh04g30enj3b9.js","https://cdn.oaistatic.com/assets/e0csq37aq7fsoatu.js","https://cdn.oaistatic.com/assets/j47f1y1dfugxdi4c.js","https://cdn.oaistatic.com/assets/ucoghk4z1rejef9i.js","https://cdn.oaistatic.com/assets/l48h3mdgj5xfyc0e.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css","https://cdn.oaistatic.com/assets/conversation-small-cll5buey.css"]},"routes/update-app":{"id":"routes/update-app","parentId":"root","path":"update-app","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/e6ljkm1k8egvh7jw.js","imports":[],"css":[]},"routes/gpts.mine":{"id":"routes/gpts.mine","parentId":"root","path":"gpts/mine","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":true,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/objj7ix9x9xjajhh.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/hqitv0sbw213sss9.js","https://cdn.oaistatic.com/assets/mslwg28fmsyi0i8b.js","https://cdn.oaistatic.com/assets/m5islwk76pkp5cyp.js","https://cdn.oaistatic.com/assets/buicxllnthhjkqpv.js","https://cdn.oaistatic.com/assets/m2xb5h49bu6lvq0z.js","https://cdn.oaistatic.com/assets/imwtt6z6av0di6t6.js","https://cdn.oaistatic.com/assets/d3g4a0hcwihawz3e.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js","https://cdn.oaistatic.com/assets/eh2eng92zajjlxkp.js","https://cdn.oaistatic.com/assets/kjnxb2s320ih2pof.js","https://cdn.oaistatic.com/assets/l48h3mdgj5xfyc0e.js","https://cdn.oaistatic.com/assets/ucoghk4z1rejef9i.js","https://cdn.oaistatic.com/assets/ip9uh04g30enj3b9.js","https://cdn.oaistatic.com/assets/e0csq37aq7fsoatu.js","https://cdn.oaistatic.com/assets/j47f1y1dfugxdi4c.js","https://cdn.oaistatic.com/assets/mf8aa04pcamvg3db.js","https://cdn.oaistatic.com/assets/f62vqubb0r8xed1w.js","https://cdn.oaistatic.com/assets/nj8ushefqfuwoi4c.js","https://cdn.oaistatic.com/assets/hg9oun43zu8s8jth.js","https://cdn.oaistatic.com/assets/ev2x16g8l9ld0mx0.js","https://cdn.oaistatic.com/assets/l8q6mtl17u7kkoap.js","https://cdn.oaistatic.com/assets/nbxponn7987qv6zb.js","https://cdn.oaistatic.com/assets/k38f533rijdcqgn0.js","https://cdn.oaistatic.com/assets/o2246qj71dru3m9e.js","https://cdn.oaistatic.com/assets/nf6la2yi1otm0vo9.js","https://cdn.oaistatic.com/assets/f1wmn65au0ke9jk0.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css","https://cdn.oaistatic.com/assets/conversation-small-cll5buey.css"]},"routes/sandbox":{"id":"routes/sandbox","parentId":"root","path":"sandbox","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/f73twjbkibp4h148.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/f11hnjoh71zukblv.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css"]},"routes/chat.$":{"id":"routes/chat.$","parentId":"root","path":"chat/*","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/o3rdtm3tuqjccluc.js","imports":[],"css":[]},"routes/search":{"id":"routes/search","parentId":"root","path":"search","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/mt85rtrnvo5qxp24.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css"]},"routes/status":{"id":"routes/status","parentId":"root","path":"status","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/lhc01mvxabmcjuag.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/nk2qlv5c1cpbhd7r.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js","https://cdn.oaistatic.com/assets/m2xb5h49bu6lvq0z.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css","https://cdn.oaistatic.com/assets/conversation-small-cll5buey.css"]},"routes/admin":{"id":"routes/admin","parentId":"root","path":"admin","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/erc9eabljm9ee4xw.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/mlho74ggfr424i0r.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js","https://cdn.oaistatic.com/assets/m2xb5h49bu6lvq0z.js","https://cdn.oaistatic.com/assets/k38f533rijdcqgn0.js","https://cdn.oaistatic.com/assets/e0csq37aq7fsoatu.js","https://cdn.oaistatic.com/assets/j47f1y1dfugxdi4c.js","https://cdn.oaistatic.com/assets/ucoghk4z1rejef9i.js","https://cdn.oaistatic.com/assets/ip9uh04g30enj3b9.js","https://cdn.oaistatic.com/assets/mf8aa04pcamvg3db.js","https://cdn.oaistatic.com/assets/d3g4a0hcwihawz3e.js","https://cdn.oaistatic.com/assets/mslwg28fmsyi0i8b.js","https://cdn.oaistatic.com/assets/kjnxb2s320ih2pof.js","https://cdn.oaistatic.com/assets/l48h3mdgj5xfyc0e.js","https://cdn.oaistatic.com/assets/o2246qj71dru3m9e.js","https://cdn.oaistatic.com/assets/nf6la2yi1otm0vo9.js","https://cdn.oaistatic.com/assets/f1wmn65au0ke9jk0.js","https://cdn.oaistatic.com/assets/eh2eng92zajjlxkp.js","https://cdn.oaistatic.com/assets/ev2x16g8l9ld0mx0.js","https://cdn.oaistatic.com/assets/hvem6afa1bg3riwi.js","https://cdn.oaistatic.com/assets/cqcclz4v9p8d59in.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css","https://cdn.oaistatic.com/assets/conversation-small-cll5buey.css"]},"routes/voice":{"id":"routes/voice","parentId":"root","path":"voice","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/opklwzbl8sft0i86.js","imports":[],"css":[]},"routes/$":{"id":"routes/$","parentId":"root","path":"*","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"https://cdn.oaistatic.com/assets/jlsqvqe95t5ka5ln.js","imports":["https://cdn.oaistatic.com/assets/p4yo0rzsteij4ihh.js","https://cdn.oaistatic.com/assets/hd436y4ydqidgeiu.js"],"css":["https://cdn.oaistatic.com/assets/root-erhliqbe.css"]}},"url":"https://cdn.oaistatic.com/assets/manifest-5de69407.js","version":"5de69407"};
|
requirements.txt
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
flask
|
| 2 |
+
gradio
|
| 3 |
+
openai
|
| 4 |
+
requests
|
| 5 |
+
cryptography
|
| 6 |
+
scapy
|
| 7 |
+
sqlalchemy
|
| 8 |
+
archive
|
| 9 |
+
aiohttp
|
| 10 |
+
Pillow
|
| 11 |
+
transformers
|
| 12 |
+
panel
|
root-erhliqbe.css
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
settings.py
ADDED
|
@@ -0,0 +1,426 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# noqa: E800
|
| 2 |
+
"""
|
| 3 |
+
Django settings for MobSF project.
|
| 4 |
+
|
| 5 |
+
MobSF and Django settings
|
| 6 |
+
"""
|
| 7 |
+
|
| 8 |
+
import imp
|
| 9 |
+
import logging
|
| 10 |
+
import os
|
| 11 |
+
|
| 12 |
+
from MobSF.utils import (find_java_binary, first_run,
|
| 13 |
+
get_mobsf_home)
|
| 14 |
+
|
| 15 |
+
logger = logging.getLogger(__name__)
|
| 16 |
+
|
| 17 |
+
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
| 18 |
+
# MOBSF CONFIGURATIONS
|
| 19 |
+
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
| 20 |
+
|
| 21 |
+
|
| 22 |
+
MOBSF_VER = 'v2.0.2 Beta'
|
| 23 |
+
|
| 24 |
+
BANNER = """
|
| 25 |
+
__ __ _ ____ _____ ____ ___
|
| 26 |
+
| \/ | ___ | |__/ ___|| ___| __ _|___ \ / _ \
|
| 27 |
+
| |\/| |/ _ \| '_ \___ \| |_ \ \ / / __) || | | |
|
| 28 |
+
| | | | (_) | |_) |__) | _| \ V / / __/ | |_| |
|
| 29 |
+
|_| |_|\___/|_.__/____/|_| \_/ |_____(_)___/
|
| 30 |
+
""" # noqa: W291
|
| 31 |
+
# ASCII Standard
|
| 32 |
+
# ==============================================
|
| 33 |
+
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
| 34 |
+
# ==========MobSF Home Directory=================
|
| 35 |
+
USE_HOME = False
|
| 36 |
+
|
| 37 |
+
# True : All Uploads/Downloads will be stored in user's home directory
|
| 38 |
+
# False : All Uploads/Downloads will be stored in MobSF root directory
|
| 39 |
+
# If you need multiple users to share the scan results set this to False
|
| 40 |
+
# ===============================================
|
| 41 |
+
|
| 42 |
+
MobSF_HOME = get_mobsf_home(USE_HOME)
|
| 43 |
+
# Logs Directory
|
| 44 |
+
LOG_DIR = os.path.join(MobSF_HOME, 'logs/')
|
| 45 |
+
# Download Directory
|
| 46 |
+
DWD_DIR = os.path.join(MobSF_HOME, 'downloads/')
|
| 47 |
+
# Screenshot Directory
|
| 48 |
+
SCREEN_DIR = os.path.join(MobSF_HOME, 'downloads/screen/')
|
| 49 |
+
# Upload Directory
|
| 50 |
+
UPLD_DIR = os.path.join(MobSF_HOME, 'uploads/')
|
| 51 |
+
# Database Directory
|
| 52 |
+
DB_DIR = os.path.join(MobSF_HOME, 'db.sqlite3')
|
| 53 |
+
# Tools Directory
|
| 54 |
+
TOOLS_DIR = os.path.join(BASE_DIR, 'DynamicAnalyzer/tools/')
|
| 55 |
+
# Secret File
|
| 56 |
+
SECRET_FILE = os.path.join(MobSF_HOME, 'secret')
|
| 57 |
+
|
| 58 |
+
# Database
|
| 59 |
+
# https://docs.djangoproject.com/en/dev/ref/settings/#databases
|
| 60 |
+
# Sqlite3 suport
|
| 61 |
+
|
| 62 |
+
DATABASES = {
|
| 63 |
+
'default': {
|
| 64 |
+
'ENGINE': 'django.db.backends.sqlite3',
|
| 65 |
+
'NAME': DB_DIR,
|
| 66 |
+
},
|
| 67 |
+
}
|
| 68 |
+
# End Sqlite3 support
|
| 69 |
+
|
| 70 |
+
# Postgres DB - Install psycopg2
|
| 71 |
+
"""
|
| 72 |
+
DATABASES = {
|
| 73 |
+
'default': {
|
| 74 |
+
'ENGINE': 'django.db.backends.postgresql_psycopg2',
|
| 75 |
+
'NAME': 'mobsf',
|
| 76 |
+
'USER': 'postgres',
|
| 77 |
+
'PASSWORD': '',
|
| 78 |
+
'HOST': 'localhost',
|
| 79 |
+
'PORT': '',
|
| 80 |
+
}
|
| 81 |
+
}
|
| 82 |
+
# End Postgres support
|
| 83 |
+
"""
|
| 84 |
+
# ===============================================
|
| 85 |
+
|
| 86 |
+
# ==========LOAD CONFIG FROM MobSF HOME==========
|
| 87 |
+
try:
|
| 88 |
+
# Update Config from MobSF Home Directory
|
| 89 |
+
if USE_HOME:
|
| 90 |
+
USER_CONFIG = os.path.join(MobSF_HOME, 'config.py')
|
| 91 |
+
sett = imp.load_source('user_settings', USER_CONFIG)
|
| 92 |
+
locals().update(
|
| 93 |
+
{k: v for k, v in list(sett.__dict__.items())
|
| 94 |
+
if not k.startswith('__')})
|
| 95 |
+
CONFIG_HOME = True
|
| 96 |
+
else:
|
| 97 |
+
CONFIG_HOME = False
|
| 98 |
+
except Exception:
|
| 99 |
+
logger.exception('Reading Config')
|
| 100 |
+
CONFIG_HOME = False
|
| 101 |
+
# ===============================================
|
| 102 |
+
|
| 103 |
+
# ===MOBSF SECRET GENERATION AND DB MIGRATION====
|
| 104 |
+
SECRET_KEY = first_run(SECRET_FILE, BASE_DIR, MobSF_HOME)
|
| 105 |
+
|
| 106 |
+
# =============================================
|
| 107 |
+
|
| 108 |
+
# =============ALLOWED EXTENSIONS================
|
| 109 |
+
ALLOWED_EXTENSIONS = {
|
| 110 |
+
'.txt': 'text/plain',
|
| 111 |
+
'.png': 'image/png',
|
| 112 |
+
'.zip': 'application/zip',
|
| 113 |
+
'.tar': 'application/x-tar',
|
| 114 |
+
}
|
| 115 |
+
# ===============================================
|
| 116 |
+
|
| 117 |
+
# =============ALLOWED MIMETYPES=================
|
| 118 |
+
|
| 119 |
+
APK_MIME = [
|
| 120 |
+
'application/octet-stream',
|
| 121 |
+
'application/vnd.android.package-archive',
|
| 122 |
+
'application/x-zip-compressed',
|
| 123 |
+
'binary/octet-stream',
|
| 124 |
+
]
|
| 125 |
+
IPA_MIME = [
|
| 126 |
+
'application/iphone',
|
| 127 |
+
'application/octet-stream',
|
| 128 |
+
'application/x-itunes-ipa',
|
| 129 |
+
'application/x-zip-compressed',
|
| 130 |
+
'binary/octet-stream',
|
| 131 |
+
]
|
| 132 |
+
ZIP_MIME = [
|
| 133 |
+
'application/zip',
|
| 134 |
+
'application/octet-stream',
|
| 135 |
+
'application/x-zip-compressed',
|
| 136 |
+
'binary/octet-stream',
|
| 137 |
+
]
|
| 138 |
+
APPX_MIME = [
|
| 139 |
+
'application/octet-stream',
|
| 140 |
+
'application/vns.ms-appx',
|
| 141 |
+
'application/x-zip-compressed',
|
| 142 |
+
]
|
| 143 |
+
|
| 144 |
+
# ===============================================
|
| 145 |
+
|
| 146 |
+
# ============DJANGO SETTINGS =================
|
| 147 |
+
DEBUG = True
|
| 148 |
+
DJANGO_LOG_LEVEL = DEBUG
|
| 149 |
+
ALLOWED_HOSTS = ['127.0.0.1', 'mobsf', '*']
|
| 150 |
+
# Application definition
|
| 151 |
+
INSTALLED_APPS = (
|
| 152 |
+
# 'django.contrib.admin',
|
| 153 |
+
'django.contrib.auth',
|
| 154 |
+
'django.contrib.contenttypes',
|
| 155 |
+
'django.contrib.sessions',
|
| 156 |
+
'django.contrib.messages',
|
| 157 |
+
'django.contrib.staticfiles',
|
| 158 |
+
'StaticAnalyzer',
|
| 159 |
+
'DynamicAnalyzer',
|
| 160 |
+
'MobSF',
|
| 161 |
+
'MalwareAnalyzer',
|
| 162 |
+
)
|
| 163 |
+
MIDDLEWARE_CLASSES = (
|
| 164 |
+
'django.middleware.security.SecurityMiddleware',
|
| 165 |
+
'whitenoise.middleware.WhiteNoiseMiddleware',
|
| 166 |
+
'django.contrib.sessions.middleware.SessionMiddleware',
|
| 167 |
+
'django.middleware.common.CommonMiddleware',
|
| 168 |
+
'django.middleware.csrf.CsrfViewMiddleware',
|
| 169 |
+
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
| 170 |
+
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
|
| 171 |
+
'django.contrib.messages.middleware.MessageMiddleware',
|
| 172 |
+
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
| 173 |
+
)
|
| 174 |
+
|
| 175 |
+
MIDDLEWARE = (
|
| 176 |
+
'MobSF.views.api.rest_api_middleware.RestApiAuthMiddleware',
|
| 177 |
+
)
|
| 178 |
+
ROOT_URLCONF = 'MobSF.urls'
|
| 179 |
+
WSGI_APPLICATION = 'MobSF.wsgi.application'
|
| 180 |
+
LANGUAGE_CODE = 'en-us'
|
| 181 |
+
TIME_ZONE = os.getenv('TIME_ZONE', 'UTC')
|
| 182 |
+
USE_I18N = True
|
| 183 |
+
USE_L10N = True
|
| 184 |
+
USE_TZ = True
|
| 185 |
+
TEMPLATES = [
|
| 186 |
+
{
|
| 187 |
+
'BACKEND': 'django.template.backends.django.DjangoTemplates',
|
| 188 |
+
'APP_DIRS': True,
|
| 189 |
+
'DIRS':
|
| 190 |
+
[
|
| 191 |
+
os.path.join(BASE_DIR, 'templates'),
|
| 192 |
+
],
|
| 193 |
+
'OPTIONS':
|
| 194 |
+
{
|
| 195 |
+
'debug': True,
|
| 196 |
+
},
|
| 197 |
+
},
|
| 198 |
+
]
|
| 199 |
+
MEDIA_ROOT = os.path.join(BASE_DIR, 'uploads')
|
| 200 |
+
MEDIA_URL = '/uploads/'
|
| 201 |
+
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
|
| 202 |
+
STATIC_URL = '/static/'
|
| 203 |
+
STATIC_ROOT = '/static/'
|
| 204 |
+
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
|
| 205 |
+
# 256MB
|
| 206 |
+
DATA_UPLOAD_MAX_MEMORY_SIZE = 268435456
|
| 207 |
+
|
| 208 |
+
# ===================
|
| 209 |
+
# USER CONFIGURATION
|
| 210 |
+
# ===================
|
| 211 |
+
|
| 212 |
+
if CONFIG_HOME:
|
| 213 |
+
logger.info('Loading User config from: %s', USER_CONFIG)
|
| 214 |
+
else:
|
| 215 |
+
"""
|
| 216 |
+
IMPORTANT
|
| 217 |
+
If 'USE_HOME' is set to True,
|
| 218 |
+
then below user configuration settings are not considered.
|
| 219 |
+
The user configuration will be loaded from
|
| 220 |
+
config.py in MobSF Home directory.
|
| 221 |
+
"""
|
| 222 |
+
# ^CONFIG-START^: Do not edit this line
|
| 223 |
+
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
| 224 |
+
# MOBSF USER CONFIGURATIONS
|
| 225 |
+
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
| 226 |
+
|
| 227 |
+
# -------------------------
|
| 228 |
+
# STATIC ANALYZER SETTINGS
|
| 229 |
+
# -------------------------
|
| 230 |
+
|
| 231 |
+
# ==========ANDROID SKIP CLASSES==========================
|
| 232 |
+
# Common third party classes that will be skipped during static analysis
|
| 233 |
+
SKIP_CLASSES = [
|
| 234 |
+
r'com[\\\/]{1}google[\\\/]{1}',
|
| 235 |
+
r'com[\\\/]{1}android[\\\/]{1}',
|
| 236 |
+
r'android[\\\/]{1}content[\\\/]{1}',
|
| 237 |
+
r'android[\\\/]{1}support[\\\/]{1}',
|
| 238 |
+
r'android[\\\/]{1}arch[\\\/]{1}',
|
| 239 |
+
r'kotlin[\\\/]{1}',
|
| 240 |
+
|
| 241 |
+
r'okhttp2[\\\/]{1}', r'okhttp3[\\\/]{1}',
|
| 242 |
+
r'com[\\\/]{1}squareup[\\\/]{1}okhttp[\\\/]{1}',
|
| 243 |
+
r'com[\\\/]{1}twitter[\\\/]{1}',
|
| 244 |
+
r'twitter4j[\\\/]{1}',
|
| 245 |
+
r'org[\\\/]{1}apache[\\\/]{1}',
|
| 246 |
+
r'oauth[\\\/]{1}signpost[\\\/]{1}',
|
| 247 |
+
r'org[\\\/]{1}chromium[\\\/]{1}',
|
| 248 |
+
r'com[\\\/]{1}facebook[\\\/]{1}',
|
| 249 |
+
r'org[\\\/]{1}spongycastle[\\\/]{1}',
|
| 250 |
+
]
|
| 251 |
+
|
| 252 |
+
# ==============================================
|
| 253 |
+
|
| 254 |
+
# ======WINDOWS STATIC ANALYSIS SETTINGS ===========
|
| 255 |
+
|
| 256 |
+
# Private key
|
| 257 |
+
WINDOWS_VM_SECRET = 'MobSF/windows_vm_priv_key.asc'
|
| 258 |
+
# IP and Port of the MobSF Windows VM
|
| 259 |
+
# example: WINDOWS_VM_IP = '127.0.0.1' ;noqa E800
|
| 260 |
+
WINDOWS_VM_IP = None
|
| 261 |
+
WINDOWS_VM_PORT = '8000'
|
| 262 |
+
# ==================================================
|
| 263 |
+
|
| 264 |
+
# ==============3rd Party Tools=================
|
| 265 |
+
"""
|
| 266 |
+
If you want to use a different version of 3rd party tools used by MobSF.
|
| 267 |
+
You can do that by specifying the path here. If specified, MobSF will run
|
| 268 |
+
the tool from this location.
|
| 269 |
+
"""
|
| 270 |
+
|
| 271 |
+
# Android 3P Tools
|
| 272 |
+
JADX_BINARY = ''
|
| 273 |
+
BACKSMALI_BINARY = ''
|
| 274 |
+
APKTOOL_BINARY = ''
|
| 275 |
+
ADB_BINARY = ''
|
| 276 |
+
|
| 277 |
+
# iOS 3P Tools
|
| 278 |
+
OTOOL_BINARY = ''
|
| 279 |
+
JTOOL_BINARY = ''
|
| 280 |
+
CLASSDUMPZ_BINARY = ''
|
| 281 |
+
CLASSDUMP_SWIFT_BINARY = ''
|
| 282 |
+
|
| 283 |
+
# COMMON
|
| 284 |
+
JAVA_DIRECTORY = ''
|
| 285 |
+
VBOXMANAGE_BINARY = ''
|
| 286 |
+
PYTHON3_PATH = ''
|
| 287 |
+
|
| 288 |
+
"""
|
| 289 |
+
Examples:
|
| 290 |
+
JAVA_DIRECTORY = 'C:/Program Files/Java/jdk1.7.0_17/bin/'
|
| 291 |
+
JAVA_DIRECTORY = '/usr/bin/'
|
| 292 |
+
VBOXMANAGE_BINARY = '/usr/bin/VBoxManage'
|
| 293 |
+
PYTHON3_PATH = 'C:/Users/Ajin/AppData/Local/Programs/Python/Python35-32/'
|
| 294 |
+
JADX_BINARY = 'C:/Users/Ajin/AppData/Local/Programs/jadx/bin/jadx.bat'
|
| 295 |
+
JADX_BINARY = '/Users/ajin/jadx/bin/jadx'
|
| 296 |
+
"""
|
| 297 |
+
# ==========================================================
|
| 298 |
+
# -------------------------
|
| 299 |
+
# DYNAMIC ANALYZER SETTINGS
|
| 300 |
+
# -------------------------
|
| 301 |
+
|
| 302 |
+
# =======ANDROID DYNAMIC ANALYSIS SETTINGS===========
|
| 303 |
+
ANALYZER_IDENTIFIER = ''
|
| 304 |
+
FRIDA_TIMEOUT = 4
|
| 305 |
+
# ==============================================
|
| 306 |
+
|
| 307 |
+
# ================HTTPS PROXY ===============
|
| 308 |
+
PROXY_PORT = 1337 # Proxy Port
|
| 309 |
+
ROOT_CA = '0025aabb.0'
|
| 310 |
+
# ===================================================
|
| 311 |
+
|
| 312 |
+
# ========UPSTREAM PROXY SETTINGS ==============
|
| 313 |
+
# If you are behind a Proxy
|
| 314 |
+
UPSTREAM_PROXY_ENABLED = False
|
| 315 |
+
UPSTREAM_PROXY_SSL_VERIFY = True
|
| 316 |
+
UPSTREAM_PROXY_TYPE = 'http'
|
| 317 |
+
UPSTREAM_PROXY_IP = '127.0.0.1'
|
| 318 |
+
UPSTREAM_PROXY_PORT = 3128
|
| 319 |
+
UPSTREAM_PROXY_USERNAME = ''
|
| 320 |
+
UPSTREAM_PROXY_PASSWORD = ''
|
| 321 |
+
# ==============================================
|
| 322 |
+
|
| 323 |
+
# --------------------------
|
| 324 |
+
# MALWARE ANALYZER SETTINGS
|
| 325 |
+
# --------------------------
|
| 326 |
+
DOMAIN_MALWARE_SCAN = True
|
| 327 |
+
APKID_ENABLED = False
|
| 328 |
+
# ==============================================
|
| 329 |
+
|
| 330 |
+
# -----External URLS--------------------------
|
| 331 |
+
MALWARE_DB_URL = 'http://www.malwaredomainlist.com/mdlcsv.php'
|
| 332 |
+
VIRUS_TOTAL_BASE_URL = 'https://www.virustotal.com/vtapi/v2/file/'
|
| 333 |
+
TRACKERS_URL = 'https://reports.exodus-privacy.eu.org'
|
| 334 |
+
TRACKERS_DB_URL = '{}/api/trackers'.format(TRACKERS_URL)
|
| 335 |
+
|
| 336 |
+
# ========DISABLED COMPONENTS===================
|
| 337 |
+
|
| 338 |
+
# ----------VirusTotal--------------------------
|
| 339 |
+
VT_ENABLED = False
|
| 340 |
+
VT_API_KEY = 'XXXXXXXXXXXXXX'
|
| 341 |
+
VT_UPLOAD = False
|
| 342 |
+
# Before setting VT_ENABLED to True,
|
| 343 |
+
# Make sure VT_API_KEY is set to your VirusTotal API key
|
| 344 |
+
# register at: https://www.virustotal.com/#/join-us
|
| 345 |
+
# You can get your API KEY from:
|
| 346 |
+
# https://www.virustotal.com/en/user/<username>/apikey/
|
| 347 |
+
# Files will be uploaded to VirusTotal
|
| 348 |
+
# if VT_UPLOAD is set to True.
|
| 349 |
+
# ==============================================
|
| 350 |
+
# ^CONFIG-END^: Do not edit this line
|
| 351 |
+
|
| 352 |
+
|
| 353 |
+
# ============JAVA SETTINGS======================
|
| 354 |
+
JAVA_BINARY = find_java_binary()
|
| 355 |
+
# ===============================================
|
| 356 |
+
|
| 357 |
+
# Better logging
|
| 358 |
+
LOGGING = {
|
| 359 |
+
'version': 1,
|
| 360 |
+
'disable_existing_loggers': True,
|
| 361 |
+
'formatters': {
|
| 362 |
+
'standard': {
|
| 363 |
+
'format': '[%(levelname)s] %(asctime)-15s - %(message)s',
|
| 364 |
+
'datefmt': '%d/%b/%Y %H:%M:%S',
|
| 365 |
+
},
|
| 366 |
+
'color': {
|
| 367 |
+
'()': 'colorlog.ColoredFormatter',
|
| 368 |
+
'format':
|
| 369 |
+
'%(log_color)s[%(levelname)s] %(asctime)-15s - %(message)s',
|
| 370 |
+
'datefmt': '%d/%b/%Y %H:%M:%S',
|
| 371 |
+
'log_colors': {
|
| 372 |
+
'DEBUG': 'cyan',
|
| 373 |
+
'INFO': 'green',
|
| 374 |
+
'WARNING': 'yellow',
|
| 375 |
+
'ERROR': 'red',
|
| 376 |
+
'CRITICAL': 'red,bg_white',
|
| 377 |
+
},
|
| 378 |
+
},
|
| 379 |
+
},
|
| 380 |
+
'handlers': {
|
| 381 |
+
'logfile': {
|
| 382 |
+
'level': 'DEBUG',
|
| 383 |
+
'class': 'logging.FileHandler',
|
| 384 |
+
'filename': os.path.join(MobSF_HOME, 'logs', 'debug.log'),
|
| 385 |
+
'formatter': 'standard',
|
| 386 |
+
},
|
| 387 |
+
'console': {
|
| 388 |
+
'level': 'DEBUG',
|
| 389 |
+
'class': 'logging.StreamHandler',
|
| 390 |
+
'formatter': 'color',
|
| 391 |
+
},
|
| 392 |
+
},
|
| 393 |
+
'loggers': {
|
| 394 |
+
'django': {
|
| 395 |
+
'handlers': ['console', 'logfile'],
|
| 396 |
+
'level': 'DEBUG',
|
| 397 |
+
'propagate': True,
|
| 398 |
+
},
|
| 399 |
+
'django.db.backends': {
|
| 400 |
+
'handlers': ['console', 'logfile'],
|
| 401 |
+
# DEBUG will log all queries, so change it to WARNING.
|
| 402 |
+
'level': 'INFO',
|
| 403 |
+
'propagate': False, # Don't propagate to other handlers
|
| 404 |
+
},
|
| 405 |
+
'MobSF': {
|
| 406 |
+
'handlers': ['console', 'logfile'],
|
| 407 |
+
'level': 'DEBUG',
|
| 408 |
+
'propagate': False,
|
| 409 |
+
},
|
| 410 |
+
'StaticAnalyzer': {
|
| 411 |
+
'handlers': ['console', 'logfile'],
|
| 412 |
+
'level': 'DEBUG',
|
| 413 |
+
'propagate': False,
|
| 414 |
+
},
|
| 415 |
+
'MalwareAnalyzer': {
|
| 416 |
+
'handlers': ['console', 'logfile'],
|
| 417 |
+
'level': 'DEBUG',
|
| 418 |
+
'propagate': False,
|
| 419 |
+
},
|
| 420 |
+
'DynamicAnalyzer': {
|
| 421 |
+
'handlers': ['console', 'logfile'],
|
| 422 |
+
'level': 'DEBUG',
|
| 423 |
+
'propagate': False,
|
| 424 |
+
},
|
| 425 |
+
},
|
| 426 |
+
}
|
user_setup.py
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# scripts/user_setup.py
|
| 2 |
+
|
| 3 |
+
import json
|
| 4 |
+
import os
|
| 5 |
+
|
| 6 |
+
def collect_api_keys():
|
| 7 |
+
"""Collect API keys from the user."""
|
| 8 |
+
api_keys = {}
|
| 9 |
+
services = ["Gemini", "OpenAI Codex", "OpenAI 3.5 Free Tier"]
|
| 10 |
+
|
| 11 |
+
for service in services:
|
| 12 |
+
count = int(input(f"How many API keys do you want to use for {service}? (max 5): "))
|
| 13 |
+
if count > 5:
|
| 14 |
+
print("You can only enter a maximum of 5 API keys.")
|
| 15 |
+
return
|
| 16 |
+
keys = [input(f"Enter API key {i + 1} for {service}: ") for i in range(count)]
|
| 17 |
+
api_keys[service] = keys
|
| 18 |
+
|
| 19 |
+
return api_keys
|
| 20 |
+
|
| 21 |
+
def collect_sms_provider():
|
| 22 |
+
"""Collect the SMS provider preference from the user."""
|
| 23 |
+
sms_provider = input("Which SMS provider do you want to use? (e.g., Twilio, Nexmo): ")
|
| 24 |
+
return sms_provider
|
| 25 |
+
|
| 26 |
+
def save_configuration(api_keys, sms_provider):
|
| 27 |
+
"""Save the collected configurations to a JSON file."""
|
| 28 |
+
config = {
|
| 29 |
+
"api_keys": api_keys,
|
| 30 |
+
"sms_provider": sms_provider
|
| 31 |
+
}
|
| 32 |
+
|
| 33 |
+
with open('config.json', 'w') as config_file:
|
| 34 |
+
json.dump(config, config_file, indent=4)
|
| 35 |
+
|
| 36 |
+
print("Configuration saved successfully.")
|
| 37 |
+
|
| 38 |
+
def main():
|
| 39 |
+
print("Welcome to the Corporate Device Security Audit Setup!")
|
| 40 |
+
api_keys = collect_api_keys()
|
| 41 |
+
sms_provider = collect_sms_provider()
|
| 42 |
+
save_configuration(api_keys, sms_provider)
|
| 43 |
+
|
| 44 |
+
if __name__ == "__main__":
|
| 45 |
+
main()
|
utils.py
ADDED
|
@@ -0,0 +1,631 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Common Utils."""
|
| 2 |
+
import ast
|
| 3 |
+
import hashlib
|
| 4 |
+
import io
|
| 5 |
+
import logging
|
| 6 |
+
import ntpath
|
| 7 |
+
import os
|
| 8 |
+
import platform
|
| 9 |
+
import random
|
| 10 |
+
import re
|
| 11 |
+
import shutil
|
| 12 |
+
import signal
|
| 13 |
+
import subprocess
|
| 14 |
+
import stat
|
| 15 |
+
import sys
|
| 16 |
+
import sqlite3
|
| 17 |
+
import unicodedata
|
| 18 |
+
import threading
|
| 19 |
+
from distutils.version import LooseVersion
|
| 20 |
+
|
| 21 |
+
import psutil
|
| 22 |
+
|
| 23 |
+
import requests
|
| 24 |
+
|
| 25 |
+
from django.shortcuts import render
|
| 26 |
+
|
| 27 |
+
from install.windows.setup import windows_config_local
|
| 28 |
+
|
| 29 |
+
from . import settings
|
| 30 |
+
|
| 31 |
+
logger = logging.getLogger(__name__)
|
| 32 |
+
ADB_PATH = None
|
| 33 |
+
|
| 34 |
+
|
| 35 |
+
class Color(object):
|
| 36 |
+
GREEN = '\033[92m'
|
| 37 |
+
ORANGE = '\033[33m'
|
| 38 |
+
RED = '\033[91m'
|
| 39 |
+
BOLD = '\033[1m'
|
| 40 |
+
END = '\033[0m'
|
| 41 |
+
|
| 42 |
+
|
| 43 |
+
def upstream_proxy(flaw_type):
|
| 44 |
+
"""Set upstream Proxy if needed."""
|
| 45 |
+
if settings.UPSTREAM_PROXY_ENABLED:
|
| 46 |
+
if not settings.UPSTREAM_PROXY_USERNAME:
|
| 47 |
+
proxy_port = str(settings.UPSTREAM_PROXY_PORT)
|
| 48 |
+
proxy_host = '{}://{}:{}'.format(
|
| 49 |
+
settings.UPSTREAM_PROXY_TYPE,
|
| 50 |
+
settings.UPSTREAM_PROXY_IP,
|
| 51 |
+
proxy_port)
|
| 52 |
+
proxies = {flaw_type: proxy_host}
|
| 53 |
+
else:
|
| 54 |
+
proxy_port = str(settings.UPSTREAM_PROXY_PORT)
|
| 55 |
+
proxy_host = '{}://{}:{}@{}:{}'.format(
|
| 56 |
+
settings.UPSTREAM_PROXY_TYPE,
|
| 57 |
+
settings.UPSTREAM_PROXY_USERNAME,
|
| 58 |
+
settings.UPSTREAM_PROXY_PASSWORD,
|
| 59 |
+
settings.UPSTREAM_PROXY_IP,
|
| 60 |
+
proxy_port)
|
| 61 |
+
proxies = {flaw_type: proxy_host}
|
| 62 |
+
else:
|
| 63 |
+
proxies = {flaw_type: None}
|
| 64 |
+
verify = bool(settings.UPSTREAM_PROXY_SSL_VERIFY)
|
| 65 |
+
return proxies, verify
|
| 66 |
+
|
| 67 |
+
|
| 68 |
+
def api_key():
|
| 69 |
+
"""Print REST API Key."""
|
| 70 |
+
if os.environ.get('MOBSF_API_KEY'):
|
| 71 |
+
logger.info('\nAPI Key read from environment variable')
|
| 72 |
+
return os.environ['MOBSF_API_KEY']
|
| 73 |
+
|
| 74 |
+
secret_file = os.path.join(settings.MobSF_HOME, 'secret')
|
| 75 |
+
if is_file_exists(secret_file):
|
| 76 |
+
try:
|
| 77 |
+
_api_key = open(secret_file).read().strip()
|
| 78 |
+
return gen_sha256_hash(_api_key)
|
| 79 |
+
except Exception:
|
| 80 |
+
logger.exception('Cannot Read API Key')
|
| 81 |
+
|
| 82 |
+
|
| 83 |
+
def print_version():
|
| 84 |
+
"""Print MobSF Version."""
|
| 85 |
+
logger.info(settings.BANNER)
|
| 86 |
+
ver = settings.MOBSF_VER
|
| 87 |
+
if platform.system() == 'Windows':
|
| 88 |
+
logger.info('Mobile Security Framework %s', ver)
|
| 89 |
+
print('REST API Key: ' + api_key())
|
| 90 |
+
else:
|
| 91 |
+
logger.info('\033[1m\033[34mMobile Security Framework %s\033[0m', ver)
|
| 92 |
+
print('REST API Key: ' + Color.BOLD + api_key() + Color.END)
|
| 93 |
+
logger.info('OS: %s', platform.system())
|
| 94 |
+
logger.info('Platform: %s', platform.platform())
|
| 95 |
+
if platform.dist()[0]:
|
| 96 |
+
logger.info('Dist: %s', str(platform.dist()))
|
| 97 |
+
find_java_binary()
|
| 98 |
+
check_basic_env()
|
| 99 |
+
thread = threading.Thread(target=check_update, name='check_update')
|
| 100 |
+
thread.start()
|
| 101 |
+
|
| 102 |
+
|
| 103 |
+
def check_update():
|
| 104 |
+
try:
|
| 105 |
+
logger.info('Checking for Update.')
|
| 106 |
+
github_url = ('https://raw.githubusercontent.com/'
|
| 107 |
+
'MobSF/Mobile-Security-Framework-MobSF/'
|
| 108 |
+
'master/MobSF/settings.py')
|
| 109 |
+
try:
|
| 110 |
+
proxies, verify = upstream_proxy('https')
|
| 111 |
+
except Exception:
|
| 112 |
+
logger.exception('Setting upstream proxy')
|
| 113 |
+
response = requests.get(github_url, timeout=5,
|
| 114 |
+
proxies=proxies, verify=verify)
|
| 115 |
+
html = str(response.text).split('\n')
|
| 116 |
+
local_version = settings.MOBSF_VER
|
| 117 |
+
for line in html:
|
| 118 |
+
if line.startswith('MOBSF_VER'):
|
| 119 |
+
remote_version = line.split('= ', 1)[1].replace('\'', '')
|
| 120 |
+
if LooseVersion(local_version) < LooseVersion(remote_version):
|
| 121 |
+
logger.warning('A new version of MobSF is available, '
|
| 122 |
+
'Please update to %s from master branch.',
|
| 123 |
+
remote_version)
|
| 124 |
+
else:
|
| 125 |
+
logger.info('No updates available.')
|
| 126 |
+
break
|
| 127 |
+
except requests.exceptions.HTTPError:
|
| 128 |
+
logger.warning('\nCannot check for updates..'
|
| 129 |
+
' No Internet Connection Found.')
|
| 130 |
+
return
|
| 131 |
+
except Exception:
|
| 132 |
+
logger.exception('Cannot Check for updates.')
|
| 133 |
+
|
| 134 |
+
|
| 135 |
+
def create_user_conf(mobsf_home):
|
| 136 |
+
try:
|
| 137 |
+
config_path = os.path.join(mobsf_home, 'config.py')
|
| 138 |
+
if not is_file_exists(config_path):
|
| 139 |
+
sample_conf = os.path.join(settings.BASE_DIR, 'MobSF/settings.py')
|
| 140 |
+
with open(sample_conf, 'r') as f:
|
| 141 |
+
dat = f.readlines()
|
| 142 |
+
config = []
|
| 143 |
+
add = False
|
| 144 |
+
for line in dat:
|
| 145 |
+
if '^CONFIG-START^' in line:
|
| 146 |
+
add = True
|
| 147 |
+
if '^CONFIG-END^' in line:
|
| 148 |
+
break
|
| 149 |
+
if add:
|
| 150 |
+
config.append(line.lstrip())
|
| 151 |
+
config.pop(0)
|
| 152 |
+
conf_str = ''.join(config)
|
| 153 |
+
with open(config_path, 'w') as f:
|
| 154 |
+
f.write(conf_str)
|
| 155 |
+
except Exception:
|
| 156 |
+
logger.exception('Cannot create config file')
|
| 157 |
+
|
| 158 |
+
|
| 159 |
+
def get_mobsf_home(use_home):
|
| 160 |
+
try:
|
| 161 |
+
mobsf_home = ''
|
| 162 |
+
if use_home:
|
| 163 |
+
mobsf_home = os.path.join(os.path.expanduser('~'), '.MobSF')
|
| 164 |
+
# MobSF Home Directory
|
| 165 |
+
if not os.path.exists(mobsf_home):
|
| 166 |
+
os.makedirs(mobsf_home)
|
| 167 |
+
create_user_conf(mobsf_home)
|
| 168 |
+
else:
|
| 169 |
+
mobsf_home = settings.BASE_DIR
|
| 170 |
+
# Logs Directory
|
| 171 |
+
log_dir = os.path.join(mobsf_home, 'logs/')
|
| 172 |
+
if not os.path.exists(log_dir):
|
| 173 |
+
os.makedirs(log_dir)
|
| 174 |
+
# Certs Directory
|
| 175 |
+
cert_dir = os.path.join(log_dir, 'certs/')
|
| 176 |
+
if not os.path.exists(cert_dir):
|
| 177 |
+
os.makedirs(cert_dir)
|
| 178 |
+
# Download Directory
|
| 179 |
+
dwd_dir = os.path.join(mobsf_home, 'downloads/')
|
| 180 |
+
if not os.path.exists(dwd_dir):
|
| 181 |
+
os.makedirs(dwd_dir)
|
| 182 |
+
# Screenshot Directory
|
| 183 |
+
screen_dir = os.path.join(dwd_dir, 'screen/')
|
| 184 |
+
if not os.path.exists(screen_dir):
|
| 185 |
+
os.makedirs(screen_dir)
|
| 186 |
+
# Upload Directory
|
| 187 |
+
upload_dir = os.path.join(mobsf_home, 'uploads/')
|
| 188 |
+
if not os.path.exists(upload_dir):
|
| 189 |
+
os.makedirs(upload_dir)
|
| 190 |
+
return mobsf_home
|
| 191 |
+
except Exception:
|
| 192 |
+
logger.exception('Creating MobSF Home Directory')
|
| 193 |
+
|
| 194 |
+
|
| 195 |
+
def make_migrations(base_dir):
|
| 196 |
+
"""Create Database Migrations."""
|
| 197 |
+
try:
|
| 198 |
+
manage = os.path.join(base_dir, 'manage.py')
|
| 199 |
+
args = [get_python(), manage, 'makemigrations']
|
| 200 |
+
subprocess.call(args)
|
| 201 |
+
args = [get_python(), manage, 'makemigrations', 'StaticAnalyzer']
|
| 202 |
+
subprocess.call(args)
|
| 203 |
+
except Exception:
|
| 204 |
+
logger.exception('Cannot Make Migrations')
|
| 205 |
+
|
| 206 |
+
|
| 207 |
+
def migrate(base_dir):
|
| 208 |
+
"""Migrate Database."""
|
| 209 |
+
try:
|
| 210 |
+
manage = os.path.join(base_dir, 'manage.py')
|
| 211 |
+
args = [get_python(), manage, 'migrate']
|
| 212 |
+
subprocess.call(args)
|
| 213 |
+
args = [get_python(), manage, 'migrate', '--run-syncdb']
|
| 214 |
+
subprocess.call(args)
|
| 215 |
+
except Exception:
|
| 216 |
+
logger.exception('Cannot Migrate')
|
| 217 |
+
|
| 218 |
+
|
| 219 |
+
def find_java_binary():
|
| 220 |
+
"""Find Java."""
|
| 221 |
+
# Respect user settings
|
| 222 |
+
if platform.system() == 'Windows':
|
| 223 |
+
jbin = 'java.exe'
|
| 224 |
+
else:
|
| 225 |
+
jbin = 'java'
|
| 226 |
+
if is_dir_exists(settings.JAVA_DIRECTORY):
|
| 227 |
+
if settings.JAVA_DIRECTORY.endswith('/'):
|
| 228 |
+
return settings.JAVA_DIRECTORY + jbin
|
| 229 |
+
elif settings.JAVA_DIRECTORY.endswith('\\'):
|
| 230 |
+
return settings.JAVA_DIRECTORY + jbin
|
| 231 |
+
else:
|
| 232 |
+
return settings.JAVA_DIRECTORY + '/' + jbin
|
| 233 |
+
if os.getenv('JAVA_HOME'):
|
| 234 |
+
java = os.path.join(
|
| 235 |
+
os.getenv('JAVA_HOME'),
|
| 236 |
+
'bin',
|
| 237 |
+
jbin)
|
| 238 |
+
if is_file_exists(java):
|
| 239 |
+
return java
|
| 240 |
+
return 'java'
|
| 241 |
+
|
| 242 |
+
|
| 243 |
+
def get_python():
|
| 244 |
+
"""Get Python Executable."""
|
| 245 |
+
return sys.executable
|
| 246 |
+
|
| 247 |
+
|
| 248 |
+
def run_process(args):
|
| 249 |
+
try:
|
| 250 |
+
proc = subprocess.Popen(
|
| 251 |
+
args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
| 252 |
+
dat = ''
|
| 253 |
+
while True:
|
| 254 |
+
line = proc.stdout.readline()
|
| 255 |
+
if not line:
|
| 256 |
+
break
|
| 257 |
+
dat += str(line)
|
| 258 |
+
return dat
|
| 259 |
+
except Exception:
|
| 260 |
+
logger.error('Finding Java path - Cannot Run Process')
|
| 261 |
+
return ''
|
| 262 |
+
|
| 263 |
+
|
| 264 |
+
def print_n_send_error_response(request,
|
| 265 |
+
msg,
|
| 266 |
+
api=False,
|
| 267 |
+
exp='Description'):
|
| 268 |
+
"""Print and log errors."""
|
| 269 |
+
logger.error(msg)
|
| 270 |
+
if api:
|
| 271 |
+
api_response = {'error': msg}
|
| 272 |
+
return api_response
|
| 273 |
+
else:
|
| 274 |
+
context = {
|
| 275 |
+
'title': 'Error',
|
| 276 |
+
'exp': exp,
|
| 277 |
+
'doc': msg,
|
| 278 |
+
}
|
| 279 |
+
template = 'general/error.html'
|
| 280 |
+
return render(request, template, context, status=500)
|
| 281 |
+
|
| 282 |
+
|
| 283 |
+
def filename_from_path(path):
|
| 284 |
+
head, tail = ntpath.split(path)
|
| 285 |
+
return tail or ntpath.basename(head)
|
| 286 |
+
|
| 287 |
+
|
| 288 |
+
def get_md5(data):
|
| 289 |
+
return hashlib.md5(data).hexdigest()
|
| 290 |
+
|
| 291 |
+
|
| 292 |
+
def find_between(s, first, last):
|
| 293 |
+
try:
|
| 294 |
+
start = s.index(first) + len(first)
|
| 295 |
+
end = s.index(last, start)
|
| 296 |
+
return s[start:end]
|
| 297 |
+
except ValueError:
|
| 298 |
+
return ''
|
| 299 |
+
|
| 300 |
+
|
| 301 |
+
def is_number(s):
|
| 302 |
+
try:
|
| 303 |
+
float(s)
|
| 304 |
+
return True
|
| 305 |
+
except ValueError:
|
| 306 |
+
pass
|
| 307 |
+
try:
|
| 308 |
+
unicodedata.numeric(s)
|
| 309 |
+
return True
|
| 310 |
+
except (TypeError, ValueError):
|
| 311 |
+
pass
|
| 312 |
+
return False
|
| 313 |
+
|
| 314 |
+
|
| 315 |
+
def python_list(value):
|
| 316 |
+
if not value:
|
| 317 |
+
value = []
|
| 318 |
+
if isinstance(value, list):
|
| 319 |
+
return value
|
| 320 |
+
return ast.literal_eval(value)
|
| 321 |
+
|
| 322 |
+
|
| 323 |
+
def python_dict(value):
|
| 324 |
+
if not value:
|
| 325 |
+
value = {}
|
| 326 |
+
if isinstance(value, dict):
|
| 327 |
+
return value
|
| 328 |
+
return ast.literal_eval(value)
|
| 329 |
+
|
| 330 |
+
|
| 331 |
+
def is_base64(b_str):
|
| 332 |
+
return re.match('^[A-Za-z0-9+/]+[=]{0,2}$', b_str)
|
| 333 |
+
|
| 334 |
+
|
| 335 |
+
def is_internet_available():
|
| 336 |
+
try:
|
| 337 |
+
proxies, verify = upstream_proxy('https')
|
| 338 |
+
except Exception:
|
| 339 |
+
logger.exception('Setting upstream proxy')
|
| 340 |
+
try:
|
| 341 |
+
requests.get('https://www.google.com', timeout=5,
|
| 342 |
+
proxies=proxies, verify=verify)
|
| 343 |
+
return True
|
| 344 |
+
except requests.exceptions.HTTPError:
|
| 345 |
+
try:
|
| 346 |
+
requests.get('https://www.baidu.com/', timeout=5,
|
| 347 |
+
proxies=proxies, verify=verify)
|
| 348 |
+
return True
|
| 349 |
+
except requests.exceptions.HTTPError:
|
| 350 |
+
return False
|
| 351 |
+
return False
|
| 352 |
+
|
| 353 |
+
|
| 354 |
+
def sha256(file_path):
|
| 355 |
+
blocksize = 65536
|
| 356 |
+
hasher = hashlib.sha256()
|
| 357 |
+
with io.open(file_path, mode='rb') as afile:
|
| 358 |
+
buf = afile.read(blocksize)
|
| 359 |
+
while buf:
|
| 360 |
+
hasher.update(buf)
|
| 361 |
+
buf = afile.read(blocksize)
|
| 362 |
+
return hasher.hexdigest()
|
| 363 |
+
|
| 364 |
+
|
| 365 |
+
def sha256_object(file_obj):
|
| 366 |
+
blocksize = 65536
|
| 367 |
+
hasher = hashlib.sha256()
|
| 368 |
+
buf = file_obj.read(blocksize)
|
| 369 |
+
while buf:
|
| 370 |
+
hasher.update(buf)
|
| 371 |
+
buf = file_obj.read(blocksize)
|
| 372 |
+
return hasher.hexdigest()
|
| 373 |
+
|
| 374 |
+
|
| 375 |
+
def gen_sha256_hash(msg):
|
| 376 |
+
"""Generate SHA 256 Hash of the message."""
|
| 377 |
+
hash_object = hashlib.sha256(msg.encode('utf-8'))
|
| 378 |
+
return hash_object.hexdigest()
|
| 379 |
+
|
| 380 |
+
|
| 381 |
+
def is_file_exists(file_path):
|
| 382 |
+
if os.path.isfile(file_path):
|
| 383 |
+
return True
|
| 384 |
+
# This fix situation where a user just typed "adb" or another executable
|
| 385 |
+
# inside settings.py
|
| 386 |
+
if shutil.which(file_path):
|
| 387 |
+
return True
|
| 388 |
+
else:
|
| 389 |
+
return False
|
| 390 |
+
|
| 391 |
+
|
| 392 |
+
def is_dir_exists(dir_path):
|
| 393 |
+
if os.path.isdir(dir_path):
|
| 394 |
+
return True
|
| 395 |
+
else:
|
| 396 |
+
return False
|
| 397 |
+
|
| 398 |
+
|
| 399 |
+
def get_random():
|
| 400 |
+
choice = 'abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*(-_=+)'
|
| 401 |
+
return ''.join([random.SystemRandom().choice(choice) for i in range(50)])
|
| 402 |
+
|
| 403 |
+
|
| 404 |
+
def zipdir(path, zip_file):
|
| 405 |
+
"""Zip a directory."""
|
| 406 |
+
try:
|
| 407 |
+
logger.info('Zipping')
|
| 408 |
+
# pylint: disable=unused-variable
|
| 409 |
+
# Needed by os.walk
|
| 410 |
+
for root, _sub_dir, files in os.walk(path):
|
| 411 |
+
for file_name in files:
|
| 412 |
+
zip_file.write(os.path.join(root, file_name))
|
| 413 |
+
except Exception:
|
| 414 |
+
logger.exception('Zipping')
|
| 415 |
+
|
| 416 |
+
|
| 417 |
+
def find_process_by(name):
|
| 418 |
+
"""Return a set of process path matching name."""
|
| 419 |
+
proc = set()
|
| 420 |
+
for p in psutil.process_iter(attrs=['name', 'exe', 'cmdline']):
|
| 421 |
+
if (name == p.info['name'] or p.info['exe']
|
| 422 |
+
and os.path.basename(p.info['exe']) == name
|
| 423 |
+
or p.info['cmdline'] and p.info['cmdline'][0] == name):
|
| 424 |
+
proc.add(p.info['exe'])
|
| 425 |
+
return proc
|
| 426 |
+
|
| 427 |
+
|
| 428 |
+
def get_device():
|
| 429 |
+
"""Get Device."""
|
| 430 |
+
if os.getenv('ANALYZER_IDENTIFIER'):
|
| 431 |
+
return os.getenv('ANALYZER_IDENTIFIER')
|
| 432 |
+
if settings.ANALYZER_IDENTIFIER:
|
| 433 |
+
return settings.ANALYZER_IDENTIFIER
|
| 434 |
+
else:
|
| 435 |
+
dev_id = ''
|
| 436 |
+
out = subprocess.check_output([get_adb(), 'devices']).splitlines()
|
| 437 |
+
if len(out) > 2:
|
| 438 |
+
dev_id = out[1].decode('utf-8').split('\t')[0]
|
| 439 |
+
return dev_id
|
| 440 |
+
logger.error('Is the Android VM running?\n'
|
| 441 |
+
'MobSF cannot identify device id.\n'
|
| 442 |
+
'Please set ANALYZER_IDENTIFIER in MobSF/settings.py')
|
| 443 |
+
|
| 444 |
+
|
| 445 |
+
def get_adb():
|
| 446 |
+
"""Get ADB binary path."""
|
| 447 |
+
try:
|
| 448 |
+
global ADB_PATH
|
| 449 |
+
if (len(settings.ADB_BINARY) > 0
|
| 450 |
+
and is_file_exists(settings.ADB_BINARY)):
|
| 451 |
+
ADB_PATH = settings.ADB_BINARY
|
| 452 |
+
return ADB_PATH
|
| 453 |
+
if ADB_PATH:
|
| 454 |
+
return ADB_PATH
|
| 455 |
+
if platform.system() == 'Windows':
|
| 456 |
+
adb_loc = find_process_by('adb.exe')
|
| 457 |
+
else:
|
| 458 |
+
adb_loc = find_process_by('adb')
|
| 459 |
+
if len(adb_loc) > 1:
|
| 460 |
+
logger.warning('Multiple ADB locations found. '
|
| 461 |
+
'Set adb path, ADB_BINARY in MobSF/settings.py'
|
| 462 |
+
' with same adb binary location used'
|
| 463 |
+
' by Genymotion VM/Android VM.')
|
| 464 |
+
logger.warning(adb_loc)
|
| 465 |
+
if adb_loc:
|
| 466 |
+
ADB_PATH = adb_loc.pop()
|
| 467 |
+
return ADB_PATH
|
| 468 |
+
except Exception:
|
| 469 |
+
logger.exception('Getting ADB Location')
|
| 470 |
+
finally:
|
| 471 |
+
if ADB_PATH:
|
| 472 |
+
os.environ['MOBSF_ADB'] = ADB_PATH
|
| 473 |
+
else:
|
| 474 |
+
os.environ['MOBSF_ADB'] = 'adb'
|
| 475 |
+
logger.warning('Dynamic Analysis related '
|
| 476 |
+
'functions will not work. '
|
| 477 |
+
'\nMake sure a Genymotion Android VM'
|
| 478 |
+
' is running before performing Dynamic Analyis.')
|
| 479 |
+
return 'adb'
|
| 480 |
+
|
| 481 |
+
|
| 482 |
+
def check_basic_env():
|
| 483 |
+
"""Check if we have basic env for MobSF to run."""
|
| 484 |
+
logger.info('MobSF Basic Environment Check')
|
| 485 |
+
try:
|
| 486 |
+
import http_tools # noqa F401
|
| 487 |
+
except ImportError:
|
| 488 |
+
logger.exception('httptools not installed!')
|
| 489 |
+
os.kill(os.getpid(), signal.SIGTERM)
|
| 490 |
+
try:
|
| 491 |
+
import lxml # noqa F401
|
| 492 |
+
except ImportError:
|
| 493 |
+
logger.exception('lxml is not installed!')
|
| 494 |
+
os.kill(os.getpid(), signal.SIGTERM)
|
| 495 |
+
if not is_file_exists(settings.JAVA_BINARY):
|
| 496 |
+
logger.error(
|
| 497 |
+
'JDK 8+ is not available. '
|
| 498 |
+
'Set JAVA_HOME environment variable'
|
| 499 |
+
' or JAVA_DIRECTORY in MobSF/settings.py')
|
| 500 |
+
logger.info('Current Configuration: '
|
| 501 |
+
'JAVA_DIRECTORY=%s', settings.JAVA_DIRECTORY)
|
| 502 |
+
logger.info('Example Configuration:'
|
| 503 |
+
'\nJAVA_DIRECTORY = "C:/Program Files/'
|
| 504 |
+
'Java/jdk1.7.0_17/bin/"'
|
| 505 |
+
'\nJAVA_DIRECTORY = "/usr/bin/"')
|
| 506 |
+
os.kill(os.getpid(), signal.SIGTERM)
|
| 507 |
+
get_adb()
|
| 508 |
+
|
| 509 |
+
|
| 510 |
+
def first_run(secret_file, base_dir, mobsf_home):
|
| 511 |
+
# Based on https://gist.github.com/ndarville/3452907#file-secret-key-gen-py
|
| 512 |
+
|
| 513 |
+
if is_file_exists(secret_file):
|
| 514 |
+
secret_key = open(secret_file).read().strip()
|
| 515 |
+
else:
|
| 516 |
+
try:
|
| 517 |
+
secret_key = get_random()
|
| 518 |
+
secret = open(secret_file, 'w')
|
| 519 |
+
secret.write(secret_key)
|
| 520 |
+
secret.close()
|
| 521 |
+
except IOError:
|
| 522 |
+
Exception('Secret file generation failed' % secret_file)
|
| 523 |
+
# Run Once
|
| 524 |
+
make_migrations(base_dir)
|
| 525 |
+
migrate(base_dir)
|
| 526 |
+
# Windows Setup
|
| 527 |
+
windows_config_local(mobsf_home)
|
| 528 |
+
return secret_key
|
| 529 |
+
|
| 530 |
+
|
| 531 |
+
def update_local_db(db_name, url, local_file):
|
| 532 |
+
"""Update Local DBs."""
|
| 533 |
+
update = None
|
| 534 |
+
inmemoryfile = None
|
| 535 |
+
try:
|
| 536 |
+
proxies, verify = upstream_proxy('http')
|
| 537 |
+
except Exception:
|
| 538 |
+
logger.exception('[ERROR] Setting upstream proxy')
|
| 539 |
+
try:
|
| 540 |
+
response = requests.get(url,
|
| 541 |
+
timeout=3,
|
| 542 |
+
proxies=proxies,
|
| 543 |
+
verify=verify)
|
| 544 |
+
resp = response.content
|
| 545 |
+
inmemoryfile = io.BytesIO(resp)
|
| 546 |
+
# Check1: SHA256 Change
|
| 547 |
+
if sha256_object(inmemoryfile) != sha256(local_file):
|
| 548 |
+
# Hash Changed
|
| 549 |
+
logger.info('%s Database is outdated!', db_name)
|
| 550 |
+
update = resp
|
| 551 |
+
else:
|
| 552 |
+
logger.info('%s Database is up-to-date', db_name)
|
| 553 |
+
return update
|
| 554 |
+
except Exception:
|
| 555 |
+
logger.exception('[ERROR] %s DB Update', db_name)
|
| 556 |
+
return update
|
| 557 |
+
finally:
|
| 558 |
+
if inmemoryfile:
|
| 559 |
+
inmemoryfile.truncate(0)
|
| 560 |
+
|
| 561 |
+
|
| 562 |
+
def read_sqlite(sqlite_file):
|
| 563 |
+
"""Sqlite Dump - Readable Text."""
|
| 564 |
+
logger.info('Reading SQLite db')
|
| 565 |
+
table_dict = {}
|
| 566 |
+
try:
|
| 567 |
+
con = sqlite3.connect(sqlite_file)
|
| 568 |
+
cur = con.cursor()
|
| 569 |
+
cur.execute('SELECT name FROM sqlite_master WHERE type=\'table\';')
|
| 570 |
+
tables = cur.fetchall()
|
| 571 |
+
for table in tables:
|
| 572 |
+
table_dict[table[0]] = {'head': [], 'data': []}
|
| 573 |
+
cur.execute('PRAGMA table_info(\'%s\')' % table)
|
| 574 |
+
rows = cur.fetchall()
|
| 575 |
+
for sq_row in rows:
|
| 576 |
+
table_dict[table[0]]['head'].append(sq_row[1])
|
| 577 |
+
cur.execute('SELECT * FROM \'%s\'' % table)
|
| 578 |
+
rows = cur.fetchall()
|
| 579 |
+
for sq_row in rows:
|
| 580 |
+
tmp_row = []
|
| 581 |
+
for each_row in sq_row:
|
| 582 |
+
tmp_row.append(str(each_row))
|
| 583 |
+
table_dict[table[0]]['data'].append(tmp_row)
|
| 584 |
+
except Exception:
|
| 585 |
+
logger.exception('Reading SQLite db')
|
| 586 |
+
return table_dict
|
| 587 |
+
|
| 588 |
+
|
| 589 |
+
def is_pipe_or_link(path):
|
| 590 |
+
"""Check for named pipe."""
|
| 591 |
+
return os.path.islink(path) or stat.S_ISFIFO(os.stat(path).st_mode)
|
| 592 |
+
|
| 593 |
+
|
| 594 |
+
def get_network():
|
| 595 |
+
"""Get Network IPs."""
|
| 596 |
+
ips = []
|
| 597 |
+
try:
|
| 598 |
+
for det in psutil.net_if_addrs().values():
|
| 599 |
+
ips.append(det[0].address)
|
| 600 |
+
except Exception:
|
| 601 |
+
logger.exception('Failed to enumerate network interfaces')
|
| 602 |
+
return ips
|
| 603 |
+
|
| 604 |
+
|
| 605 |
+
def get_proxy_ip(identifier):
|
| 606 |
+
"""Get Proxy IP."""
|
| 607 |
+
proxy_ip = None
|
| 608 |
+
try:
|
| 609 |
+
if not identifier:
|
| 610 |
+
return proxy_ip
|
| 611 |
+
ips = get_network()
|
| 612 |
+
if ':' not in identifier or not ips:
|
| 613 |
+
return proxy_ip
|
| 614 |
+
device_ip = identifier.split(':', 1)[0]
|
| 615 |
+
ip_range = device_ip.rsplit('.', 1)[0]
|
| 616 |
+
guess_ip = ip_range + '.1'
|
| 617 |
+
if guess_ip in ips:
|
| 618 |
+
return guess_ip
|
| 619 |
+
for ip_addr in ips:
|
| 620 |
+
to_check = ip_addr.rsplit('.', 1)[0]
|
| 621 |
+
if to_check == ip_range:
|
| 622 |
+
return ip_addr
|
| 623 |
+
except Exception:
|
| 624 |
+
logger.error('Error getting Proxy IP')
|
| 625 |
+
return proxy_ip
|
| 626 |
+
|
| 627 |
+
|
| 628 |
+
def is_safe_path(safe_root, check_path):
|
| 629 |
+
"""Detect Path Traversal."""
|
| 630 |
+
return os.path.commonprefix(
|
| 631 |
+
(os.path.realpath(check_path), safe_root)) == safe_root
|