capa scanner start
This commit is contained in:
		
							parent
							
								
									7a3bc3bd75
								
							
						
					
					
						commit
						d3407351af
					
				
					 9 changed files with 102 additions and 0 deletions
				
			
		
							
								
								
									
										24
									
								
								scanners/capa/Dockerfile
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								scanners/capa/Dockerfile
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,24 @@
 | 
				
			||||||
 | 
					FROM python:3-alpine
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Set environment variables (these can be overridden in `docker-compose.yml` or `docker run`)
 | 
				
			||||||
 | 
					ENV FILE_DIRECTORY="/mnt/storage/files/"
 | 
				
			||||||
 | 
					ENV HOST="127.0.0.1"
 | 
				
			||||||
 | 
					ENV PORT="5001"
 | 
				
			||||||
 | 
					ENV DEBUG="True"
 | 
				
			||||||
 | 
					ENV WORKERS="4"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Expose the port Flask will run on
 | 
				
			||||||
 | 
					EXPOSE 5000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WORKDIR /opt/capa
 | 
				
			||||||
 | 
					COPY . .
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RUN apk --no-cache add wget unzip
 | 
				
			||||||
 | 
					RUN pip install  --no-cache --upgrade pip
 | 
				
			||||||
 | 
					RUN pip install --no-cache -r requirements.txt
 | 
				
			||||||
 | 
					RUN wget https://github.com/mandiant/capa-rules/archive/refs/tags/v4.0.0.zip
 | 
				
			||||||
 | 
					RUN unzip v4.0.0.zip
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Start the Flask app
 | 
				
			||||||
 | 
					#CMD ["python", "app.py"]
 | 
				
			||||||
 | 
					CMD ["sh", "-c", "gunicorn -w $WORKERS -b $HOST:$PORT app:app"]
 | 
				
			||||||
							
								
								
									
										16
									
								
								scanners/capa/app.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								scanners/capa/app.py
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,16 @@
 | 
				
			||||||
 | 
					#!/usr/bin/env python3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from flask import Flask
 | 
				
			||||||
 | 
					from routes.capa import capa_bp
 | 
				
			||||||
 | 
					from config import Config
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					app = Flask(__name__)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Apply config settings
 | 
				
			||||||
 | 
					app.config.from_object(Config)
 | 
				
			||||||
 | 
					# Register Blueprints (Modules)
 | 
				
			||||||
 | 
					app.register_blueprint(oleid_bp, url_prefix='/oleid')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if __name__ == '__main__':
 | 
				
			||||||
 | 
					    app.run(host=Config.HOST, port=Config.PORT, debug=Config.DEBUG)
 | 
				
			||||||
							
								
								
									
										12
									
								
								scanners/capa/config.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								scanners/capa/config.py
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,12 @@
 | 
				
			||||||
 | 
					import os
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Config:
 | 
				
			||||||
 | 
					    # Read values from environment variables or use defaults
 | 
				
			||||||
 | 
					    FILE_DIRECTORY = os.environ.get("FILE_DIRECTORY", "/mnt/storage/files")
 | 
				
			||||||
 | 
					    HOST = os.environ.get("HOST", "127.0.0.1")
 | 
				
			||||||
 | 
					    PORT = int(os.environ.get("PORT", 5000))
 | 
				
			||||||
 | 
					    DEBUG = os.environ.get("DEBUG", "False").lower() in ("true", "1")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Ensure upload directory exists
 | 
				
			||||||
 | 
					if not os.path.exists(Config.FILE_DIRECTORY):
 | 
				
			||||||
 | 
					    os.makedirs(Config.FILE_DIRECTORY)
 | 
				
			||||||
							
								
								
									
										3
									
								
								scanners/capa/requirements.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								scanners/capa/requirements.txt
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,3 @@
 | 
				
			||||||
 | 
					gunicorn
 | 
				
			||||||
 | 
					flask
 | 
				
			||||||
 | 
					flare-capa
 | 
				
			||||||
							
								
								
									
										0
									
								
								scanners/capa/routes/__init__.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								scanners/capa/routes/__init__.py
									
										
									
									
									
										Normal file
									
								
							
							
								
								
									
										31
									
								
								scanners/capa/routes/capa.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								scanners/capa/routes/capa.py
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,31 @@
 | 
				
			||||||
 | 
					from logging import log
 | 
				
			||||||
 | 
					import logging
 | 
				
			||||||
 | 
					from flask import Blueprint, request, jsonify, abort
 | 
				
			||||||
 | 
					from os import path
 | 
				
			||||||
 | 
					import config
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					capa_bp = Blueprint('capa', __name__)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@capa_bp.route('/analyze', methods=['GET'])
 | 
				
			||||||
 | 
					def analyze_mraptor():
 | 
				
			||||||
 | 
					    file = request.args.get('file', '')
 | 
				
			||||||
 | 
					    if file == '':
 | 
				
			||||||
 | 
					        abort(400)
 | 
				
			||||||
 | 
					    filepath = path.join(config.Config.FILE_DIRECTORY, file)
 | 
				
			||||||
 | 
					    # Analyze with olevba
 | 
				
			||||||
 | 
					    vbaparser = olevba.VBA_Parser(filepath)
 | 
				
			||||||
 | 
					    if vbaparser.detect_vba_macros():
 | 
				
			||||||
 | 
					        vba_code = ''
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
 | 
					            vba_code = vbaparser.get_vba_code_all_modules()
 | 
				
			||||||
 | 
					        except Exception as e:
 | 
				
			||||||
 | 
					            logging.error(e)
 | 
				
			||||||
 | 
					            abort(500)
 | 
				
			||||||
 | 
					        raptor = mraptor.MacroRaptor(vba_code)
 | 
				
			||||||
 | 
					        raptor.scan()
 | 
				
			||||||
 | 
					        if raptor.suspicious:
 | 
				
			||||||
 | 
					            return jsonify({'filename': file, 'result': mraptor.Result_Suspicious, 'flags': raptor.get_flags(), 'matches': raptor.matches})
 | 
				
			||||||
 | 
					        else: 
 | 
				
			||||||
 | 
					            return jsonify({'filename': file, 'result': mraptor.Result_MacroOK, 'flags': raptor.get_flags(), 'matches': raptor.matches})
 | 
				
			||||||
 | 
					    else:
 | 
				
			||||||
 | 
					        return jsonify({'filename': file, 'result': mraptor.Result_NoMacro})
 | 
				
			||||||
							
								
								
									
										0
									
								
								scanners/capa/utils/__init__.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								scanners/capa/utils/__init__.py
									
										
									
									
									
										Normal file
									
								
							
							
								
								
									
										14
									
								
								scanners/capa/utils/file_handler.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								scanners/capa/utils/file_handler.py
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,14 @@
 | 
				
			||||||
 | 
					import os
 | 
				
			||||||
 | 
					from flask import current_app
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def allowed_file(filename):
 | 
				
			||||||
 | 
					    return '.' in filename and filename.rsplit('.', 1)[1].lower() in {'doc', 'xls', 'ppt', 'pps', 'bin'}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def save_file(file):
 | 
				
			||||||
 | 
					    filepath = os.path.join(current_app.config['UPLOAD_FOLDER'], file.filename)
 | 
				
			||||||
 | 
					    file.save(filepath)
 | 
				
			||||||
 | 
					    return filepath
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def delete_file(filepath):
 | 
				
			||||||
 | 
					    os.remove(filepath)
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
| 
						 | 
					@ -3,6 +3,7 @@
 | 
				
			||||||
from flask import Flask
 | 
					from flask import Flask
 | 
				
			||||||
from routes.oleid import oleid_bp
 | 
					from routes.oleid import oleid_bp
 | 
				
			||||||
from routes.olevba import olevba_bp
 | 
					from routes.olevba import olevba_bp
 | 
				
			||||||
 | 
					from routes.mraptor import mraptor_bp
 | 
				
			||||||
from config import Config
 | 
					from config import Config
 | 
				
			||||||
 | 
					
 | 
				
			||||||
app = Flask(__name__)
 | 
					app = Flask(__name__)
 | 
				
			||||||
| 
						 | 
					@ -13,6 +14,7 @@ app.config.from_object(Config)
 | 
				
			||||||
app.register_blueprint(oleid_bp, url_prefix='/oleid')
 | 
					app.register_blueprint(oleid_bp, url_prefix='/oleid')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
app.register_blueprint(olevba_bp, url_prefix='/olevba')
 | 
					app.register_blueprint(olevba_bp, url_prefix='/olevba')
 | 
				
			||||||
 | 
					app.register_blueprint(mraptor_bp, url_prefix='/mraptor')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if __name__ == '__main__':
 | 
					if __name__ == '__main__':
 | 
				
			||||||
    app.run(host=Config.HOST, port=Config.PORT, debug=Config.DEBUG)
 | 
					    app.run(host=Config.HOST, port=Config.PORT, debug=Config.DEBUG)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue