From 683d52dfb8bdcac5e8276c9250a295428a3bad9e Mon Sep 17 00:00:00 2001 From: Terrtia Date: Mon, 5 Jun 2023 16:14:29 +0200 Subject: [PATCH] chg: [doc] add AIL v5.0 + objects + Importers + sync --- HOWTO.md | 67 +- README.md | 19 + doc/README.md | 1510 ++++++------------------------------ doc/ail_modules_queues.png | Bin 0 -> 146017 bytes doc/api.md | 1295 +++++++++++++++++++++++++++++++ 5 files changed, 1539 insertions(+), 1352 deletions(-) create mode 100644 doc/ail_modules_queues.png create mode 100644 doc/api.md diff --git a/HOWTO.md b/HOWTO.md index b7ebd1bf..695da97e 100644 --- a/HOWTO.md +++ b/HOWTO.md @@ -1,73 +1,18 @@ # Feeding, adding new features and contributing +## [Documentation AIL Importers](./doc/README.md#ail-importers) + +[Documentation AIL Importers](./doc/README.md#ail-importers) + ## How to feed the AIL framework -Currently, there are three different ways to feed data into AIL: - -1. Be a collaborator of CIRCL and ask to access our feed. It will be sent to the static IP you are using for AIL. - -2. You can setup [pystemon](https://github.com/cvandeplas/pystemon) and use the custom feeder provided by AIL (see below). - -3. You can feed your own data using the [./tool/file_dir_importer.py](./tool/file_dir_importer.py) script. - -### Feeding AIL with pystemon - AIL is an analysis tool, not a collector! However, if you want to collect some pastes and feed them to AIL, the procedure is described below. Nevertheless, moderate your queries! -Feed data to AIL: +1. [AIL Importers](./doc/README.md#ail-importers) -1. Clone the [pystemon's git repository](https://github.com/cvandeplas/pystemon): - ``` - git clone https://github.com/cvandeplas/pystemon.git - ``` - -2. Edit configuration file for pystemon ```pystemon/pystemon.yaml```: - - Configure the storage section according to your needs: - ``` - storage: - archive: - storage-classname: FileStorage - save: yes - save-all: yes - dir: "alerts" - dir-all: "archive" - compress: yes - - redis: - storage-classname: RedisStorage - save: yes - save-all: yes - server: "localhost" - port: 6379 - database: 10 - lookup: no - ``` - - Adjust the configuration for paste-sites based on your requirements (remember to throttle download and update times). - -3. Install python dependencies inside the virtual environment: - ```shell - cd ail-framework/ - . ./AILENV/bin/activate - cd pystemon/ - pip install -U -r requirements.txt - ``` -4. Edit the configuration file ```ail-framework/configs/core.cfg```: - - Modify the "pystemonpath" path accordingly. - -5. Launch ail-framework, pystemon and PystemonImporter.py (all within the virtual environment): - - Option 1 (recommended): - ``` - ./ail-framework/bin/LAUNCH.py -l #starts ail-framework - ./ail-framework/bin/LAUNCH.py -f #starts pystemon and the PystemonImporter.py - ``` - - Option 2 (may require two terminal windows): - ``` - ./ail-framework/bin/LAUNCH.py -l #starts ail-framework - ./pystemon/pystemon.py - ./ail-framework/bin/importer/PystemonImporter.py - ``` +2. ZMQ: Be a collaborator of CIRCL and ask to access our feed. It will be sent to the static IP you are using for AIL. ## How to create a new module diff --git a/README.md b/README.md index 178ab9a2..7b5818fc 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,25 @@ AIL is a modular framework to analyse potential information leaks from unstructu ![Finding webshells with AIL](./doc/screenshots/webshells.gif?raw=true "Finding webshells with AIL") +## AIL V5.0 Version: + +AIL v5.0 introduces significant improvements and new features: + +- **Codebase Rewrite**: The codebase has undergone a substantial rewrite, +resulting in enhanced performance and speed improvements. +- **Database Upgrade**: The database has been migrated from ARDB to Kvrocks. +- **New Correlation Engine**: AIL v5.0 introduces a new powerful correlation engine with two new correlation types: CVE and Title. +- **Enhanced Logging**: The logging system has been improved to provide better troubleshooting capabilities. +- **Tagging Support**: [AIL objects](./doc/README.md#ail-objects) now support tagging, +allowing users to categorize and label extracted information for easier analysis and organization. +- **Trackers**: Improved objects filtering, PGP and decoded tracking added. +- **UI Content Visualization**: The user interface has been upgraded to visualize extracted and tracked information. +- **New Crawler Lacus**: improve crawling capabilities. +- **Modular Importers and Exporters**: New importers (ZMQ, AIL Feeders) and exporters (MISP, Mail, TheHive) modular design. +Allow easy creation and customization by extending an abstract class. +- **Module Queues**: improved the queuing mechanism between detection modules. +- **New Object CVE and Title**: Extract an correlate CVE IDs and web page titles. + ## Features - Modular architecture to handle streams of unstructured or structured information diff --git a/doc/README.md b/doc/README.md index 366f4146..d6b707e8 100644 --- a/doc/README.md +++ b/doc/README.md @@ -1,1295 +1,223 @@ -# API DOCUMENTATION -## General -### Automation key +# AIL objects + +AIL is using different types of objects to classify, correlate and describe extracted information: + +- **Cryptocurrency**: Represents extracted cryptocurrency addresses. + - bitcoin + - bitcoin-cash + - dash + - ethereum + - litecoin + - monero + - zcash +- **Cve**: Represents extracted CVE (Common Vulnerabilities and Exposures) IDs. +- **Decoded**: Represents information that has been decoded from an encoded format, such as base64. +- **Domain**: Represents crawled domains and includes metadata related to them. +- **Item**: Represents a piece of text that has been processed by AIL. It can include various types of extracted information. +- **Pgp**: Represents PGP key/block metadata. + - key: PGP key IDs + - mail: email addresses associated with PGP keys + - name: names associated with PGP keys. +- **Screenshot**: Represents screenshots captured from crawled domains. +- **Title**: Represents the HTML title extracted from web pages. +- **Username**: + - telegram: telegram username handles + - twitter: twitter username handles + - jabber: Jabber (XMPP) username handles + + +# AIL Importers + +AIL Importers play a crucial role in the AIL ecosystem, +enabling the import of various types of data into the framework. + +These importers are located in the `/bin/importer` directory. +The modular design of importers allows for easy expansion and customization, +ensuring that AIL can adapt to new types of data. + +Available Importers: +- [AIL Feeders](#ail-feeders): Extract and feed JSON data from external sources via The API. +- ZMQ +- [pystemon](https://github.com/cvandeplas/pystemon) +- File: Import files and directories. +(Manually Feed File/Dir: [./tool/file_dir_importer.py](./tool/file_dir_importer.py)). + +[//]: # (### ZMQ Importer:) + +### pystemon: + +1. Clone the [pystemon's git repository](https://github.com/cvandeplas/pystemon): + ``` + git clone https://github.com/cvandeplas/pystemon.git + ``` + +2. Edit configuration file for pystemon ```pystemon/pystemon.yaml```: + - Configure the storage section according to your needs: + ``` + storage: + archive: + storage-classname: FileStorage + save: yes + save-all: yes + dir: "alerts" + dir-all: "archive" + compress: yes + + redis: + storage-classname: RedisStorage + save: yes + save-all: yes + server: "localhost" + port: 6379 + database: 10 + lookup: no + ``` + - Adjust the configuration for paste-sites based on your requirements (remember to throttle download and update times). + +3. Install python dependencies inside the virtual environment: + ```shell + cd ail-framework/ + . ./AILENV/bin/activate + cd pystemon/ + pip install -U -r requirements.txt + ``` +4. Edit the configuration file ```ail-framework/configs/core.cfg```: + - Modify the "pystemonpath" path accordingly. + +5. Launch ail-framework, pystemon and PystemonImporter.py (all within the virtual environment): + - Option 1 (recommended): + ``` + ./ail-framework/bin/LAUNCH.py -l #starts ail-framework + ./ail-framework/bin/LAUNCH.py -f #starts pystemon and the PystemonImporter.py + ``` + - Option 2 (may require two terminal windows): + ``` + ./ail-framework/bin/LAUNCH.py -l #starts ail-framework + ./pystemon/pystemon.py + ./ail-framework/bin/importer/PystemonImporter.py + ``` + +### File Importer `importer/FileImporter.py`: + +Manually import File and Directory with the [./tool/file_dir_importer.py](./tool/file_dir_importer.py) script: + +- Import Files: + ```shell + . ./AILENV/bin/activate + cd tools/ + ./file_dir_importer.py -f MY_FILE_PAT + ``` + +- Import Dirs: + ```shell + . ./AILENV/bin/activate + cd tools/ + ./file_dir_importer.py -d MY_DIR_PATH + ``` + +### Create a New Importer: + +```python +from importer.abstract_importer import AbstractImporter +from modules.abstract_module import AbstractModule + +class MyNewImporter(AbstractImporter): + + def __init__(self): + super().__init__() + # super().__init__(queue=True) # if it's an one-time run importer + self.logger.info(f'Importer {self.name} initialized') + + def importer(self, my_var): + # Process my_var and get content to import + content = GET_MY_CONTENT_TO_IMPORT + # if content is not gzipped and/or not b64 encoded, + # set gzipped and/or b64 to False + message = self.create_message(item_id, content, b64=False, gzipped=False) + return message + # if it's an one-time run, otherwise create an AIL Module + # self.add_message_to_queue(message) + +class MyNewModuleImporter(AbstractModule): + def __init__(self): + super().__init__() + # init module ... + self.importer = MyNewImporter() + + def get_message(self): + return self.importer.importer() + + def compute(self, message): + self.add_message_to_queue(message) + +if __name__ == '__main__': + module = MyNewModuleImporter() + module.run() + + # if it's an one-time run: + # importer = MyImporter() + # importer.importer(my_var) +``` + +## AIL Feeders + +AIL Feeders are a special type of Importer within AIL, specifically designed +to *extract* and *feed* data from external sources into the framework. + +- **Extract Data**: AIL Feeders extract data from external sources, such as APK files, +certificate transparency logs, GitHub archives, repositories, ActivityPub sources, +leaked files, Atom/RSS feeds, JSON logs, Discord, and Telegram, ... +- **Run Independently**: Feeders can run on separate systems or infrastructure, +providing flexibility and scalability. They operate independently from the core AIL framework. +- **Internal Logic**: Each feeder can implement its own custom logic and processing +to extract and transform data and metadata from the source into JSON. +- **Push to AIL API**: The generated JSON is then pushed to the AIL API +for ingestion and further analysis within the AIL framework. + +[//]: # (- Customize medata parsing) + + +### AIL Feeders List: +- [ail-feeder-apk](https://github.com/ail-project/ail-feeder-apk): Pushes annotated APK to an AIL instance for yara detection. +- [ail-feeder-ct](https://github.com/ail-project/ail-feeder-ct): AIL feeder for certificate transparency. +- [ail-feeder-github-gharchive](https://github.com/ail-project/ail-feeder-gharchive): extract informations +from GHArchive, collect and feed AIL +- [ail-feeder-github-repo](https://github.com/ail-project/ail-feeder-github-repo): Pushes github repositories to AIL. +- [ail-feeder-activity-pub](https://github.com/ail-project/ail-feeder-activity-pub) ActivityPub feeder. +- [ail-feeder-leak](https://github.com/ail-project/ail-feeder-leak): Automates the process of feeding files to AIL, using data chunking to handle large files. +- [ail-feeder-atom-rss](https://github.com/ail-project/ail-feeder-atom-rss) Atom and RSS feeder for AIL. +- [ail-feeder-jsonlogs](https://github.com/ail-project/ail-feeder-jsonlogs) Aggregate JSON log lines and pushes them to AIL. +- [ail-feeder-discord](https://github.com/ail-project/ail-feeder-discord) Discord Feeder. +- [ail-feeder-telegram](https://github.com/ail-project/ail-feeder-telegram) Telegram Channels and User Feeder. + +#### Example: Feeding AIL with Conti leaks + +```python +from pyail import PyAIL +pyail = PyAIL(URL, API_KEY, ssl=verifycert) + +#. . . imports +#. . . setup code + +for content in sys.stdin: + elm = json.loads(content) + tmp = elm['body'] + meta = {} + meta['jabber:to'] = elm['to'] + meta['jabber:from'] = elm['from'] + meta['jabber:ts]' = elm['ts'] + pyail.feed_json_item(tmp , meta, feeder_name, feeder_uuid) +``` + +# AIL SYNC + +The synchronisation mechanism allow the sync from one AIL instance to another AIL using a standard WebSocket +using [AIL JSON protocol](https://github.com/ail-project/ail-exchange-format/blob/main/ail-stream.md). +The synchronisation allows to filter and sync specific collected items including crawled items or +specific tagged items matching defined rules. +This feature can be very useful to limit the scope of analysis in specific fields or resource intensive activity. +This sync can be also used to share filtered streams with other partners. -The authentication of the automation is performed via a secure key available in the AIL UI interface. Make sure you keep that key secret. It gives access to the entire database! The API key is available in the ``Server Management`` menu under ``My Profile``. - -The authorization is performed by using the following header: - -~~~~ -Authorization: YOUR_API_KEY -~~~~ -### Accept and Content-Type headers - -When submitting data in a POST, PUT or DELETE operation you need to specify in what content-type you encoded the payload. This is done by setting the below Content-Type headers: - -~~~~ -Content-Type: application/json -~~~~ - -Example: - -~~~~ -curl --header "Authorization: YOUR_API_KEY" --header "Content-Type: application/json" https://AIL_URL/ -~~~~ - -## Item management - -### Get item: `api/v1/get/item/default` - -#### Description -Get item default info. - -**Method** : `POST` - -#### Parameters -- `id` - - item id - - *str - relative item path* - - mandatory - -#### JSON response -- `content` - - item content - - *str* -- `id` - - item id - - *str* -- `date` - - item date - - *str - YYMMDD* -- `tags` - - item tags list - - *list* - -#### Example -``` -curl https://127.0.0.1:7000/api/v1/get/item/default --header "Authorization: iHc1_ChZxj1aXmiFiF1mkxxQkzawwriEaZpPqyTQj " -H "Content-Type: application/json" --data @input.json -X POST -``` - -#### input.json Example -```json - { - "id": "submitted/2019/07/26/3efb8a79-08e9-4776-94ab-615eb370b6d4.gz" - } -``` - -#### Expected Success Response -**HTTP Status Code** : `200` - -```json - { - "content": "item content test", - "date": "20190726", - "id": "submitted/2019/07/26/3efb8a79-08e9-4776-94ab-615eb370b6d4.gz", - "tags": - [ - "misp-galaxy:backdoor=\"Rosenbridge\"", - "infoleak:automatic-detection=\"pgp-message\"", - "infoleak:automatic-detection=\"encrypted-private-key\"", - "infoleak:submission=\"manual\"", - "misp-galaxy:backdoor=\"SLUB\"" - ] - } -``` - -#### Expected Fail Response - -**HTTP Status Code** : `400` -```json - {"status": "error", "reason": "Mandatory parameter(s) not provided"} -``` -**HTTP Status Code** : `404` -```json - {"status": "error", "reason": "Item not found"} -``` - - - - -### Get item content: `api/v1/get/item/content` - -#### Description -Get a specific item content. - -**Method** : `POST` - -#### Parameters -- `id` - - item id - - *str - relative item path* - - mandatory - -#### JSON response -- `content` - - item content - - *str* -- `id` - - item id - - *str* - -#### Example -``` -curl https://127.0.0.1:7000/api/v1/get/item/content --header "Authorization: iHc1_ChZxj1aXmiFiF1mkxxQkzawwriEaZpPqyTQj " -H "Content-Type: application/json" --data @input.json -X POST -``` - -#### input.json Example -```json - { - "id": "submitted/2019/07/26/3efb8a79-08e9-4776-94ab-615eb370b6d4.gz" - } -``` - -#### Expected Success Response -**HTTP Status Code** : `200` - -```json - { - "content": "item content test", - "id": "submitted/2019/07/26/3efb8a79-08e9-4776-94ab-615eb370b6d4.gz" - } -``` - -#### Expected Fail Response - -**HTTP Status Code** : `400` -```json - {"status": "error", "reason": "Mandatory parameter(s) not provided"} -``` -**HTTP Status Code** : `404` -```json - {"status": "error", "reason": "Item not found"} -``` - - - -### Get item content: `api/v1/get/item/tag` - -#### Description -Get all tags from an item. - -**Method** : `POST` - -#### Parameters -- `id` - - item id - - *str - relative item path* - - mandatory - -#### JSON response -- `content` - - item content - - *str* -- `tags` - - item tags list - - *list* - -#### Example -``` -curl https://127.0.0.1:7000/api/v1/get/item/tag --header "Authorization: iHc1_ChZxj1aXmiFiF1mkxxQkzawwriEaZpPqyTQj " -H "Content-Type: application/json" --data @input.json -X POST -``` - -#### input.json Example -```json - { - "id": "submitted/2019/07/26/3efb8a79-08e9-4776-94ab-615eb370b6d4.gz" - } -``` - -#### Expected Success Response -**HTTP Status Code** : `200` - -```json - { - "id": "submitted/2019/07/26/3efb8a79-08e9-4776-94ab-615eb370b6d4.gz", - "tags": - [ - "misp-galaxy:backdoor=\"Rosenbridge\"", - "infoleak:automatic-detection=\"pgp-message\"", - "infoleak:automatic-detection=\"encrypted-private-key\"", - "infoleak:submission=\"manual\"", - "misp-galaxy:backdoor=\"SLUB\"" - ] - } -``` - -#### Expected Fail Response - -**HTTP Status Code** : `400` -```json - {"status": "error", "reason": "Mandatory parameter(s) not provided"} -``` -**HTTP Status Code** : `404` -```json - {"status": "error", "reason": "Item not found"} -``` - - - -### Advanced Get item: `api/v1/get/item` - -#### Description -Get item. Filter requested field. - -**Method** : `POST` - -#### Parameters -- `id` - - item id - - *str - relative item path* - - mandatory -- `date` - - get item date - - *boolean* - - default: `true` -- `tags` - - get item tags - - *boolean* - - default: `true` -- `content` - - get item content - - *boolean* - - default: `false` -- `size` - - get item size - - *boolean* - - default: `false` -- `lines` - - get item lines info - - *boolean* - - default: `false` -- `cryptocurrency` - - `bitcoin` - - get item bitcoin adress - - *boolean* - - default: `false` -- `pgp` - - `key` - - get item pgp key - - *boolean* - - default: `false` - - `mail` - - get item pgp mail - - *boolean* - - default: `false` - - `name` - - get item pgp name - - *boolean* - - default: `false` - - -#### JSON response -- `content` - - item content - - *str* -- `id` - - item id - - *str* -- `date` - - item date - - *str - YYMMDD* -- `tags` - - item tags list - - *list* -- `size` - - item size (Kb) - - *int* -- `lines` - - item lines info - - *{}* - - `max_length` - - line max length line - - *int* - - `nb` - - nb lines item - - *int* -- `cryptocurrency` - - `bitcoin` - - item bitcoin adress - - *list* -- `pgp` - - `key` - - item pgp keys - - *list* - - `mail` - - item pgp mails - - *list* - - `name` - - item pgp name - - *list* - - -#### Example -``` -curl https://127.0.0.1:7000/api/v1/get/item --header "Authorization: iHc1_ChZxj1aXmiFiF1mkxxQkzawwriEaZpPqyTQj " -H "Content-Type: application/json" --data @input.json -X POST -``` - -#### input.json Example -```json -{ - "id": "submitted/2019/07/26/3efb8a79-08e9-4776-94ab-615eb370b6d4.gz", - "content": true, - "lines_info": true, - "tags": true, - "size": true -} -``` - -#### Expected Success Response -**HTTP Status Code** : `200` -```json - { - "content": "dsvcdsvcdsc vvvv", - "cryptocurrency": { - "bitcoin": [ - "132M1aGTGodHkQNh1augLeMjEXH51wgoCc" - ] - }, - "date": "20190726", - "id": "submitted/2019/07/26/3efb8a79-08e9-4776-94ab-615eb370b6d4.gz", - "lines": { - "max_length": 19, - "nb": 1 - }, - "pgp": { - "key": [ - "0x5180D21F4C20F975" - ], - "mail": [ - "mail@test.test" - ], - "name": [ - "user_test" - ] - }, - "size": 0.03, - "tags": [ - "misp-galaxy:stealer=\"Vidar\"", - "infoleak:submission=\"manual\"" - ] - } -``` - -#### Expected Fail Response -**HTTP Status Code** : `400` -```json - {"status": "error", "reason": "Mandatory parameter(s) not provided"} -``` -**HTTP Status Code** : `404` -```json - {"status": "error", "reason": "Item not found"} -``` - - - - - -### Add item tags: `api/v1/add/item/tag` - -#### Description -Add tags to an item. - -**Method** : `POST` - -#### Parameters -- `id` - - item id - - *str - relative item path* - - mandatory -- `tags` - - list of tags - - *list* - - default: `[]` -- `galaxy` - - list of galaxy - - *list* - - default: `[]` - -#### JSON response -- `id` - - item id - - *str - relative item path* -- `tags` - - list of item tags added - - *list* - -#### Example -``` -curl https://127.0.0.1:7000/api/v1/import/item --header "Authorization: iHc1_ChZxj1aXmiFiF1mkxxQkzawwriEaZpPqyTQj " -H "Content-Type: application/json" --data @input.json -X POST -``` - -#### input.json Example -```json - { - "id": "submitted/2019/07/26/3efb8a79-08e9-4776-94ab-615eb370b6d4.gz", - "tags": [ - "infoleak:analyst-detection=\"private-key\"", - "infoleak:analyst-detection=\"api-key\"" - ], - "galaxy": [ - "misp-galaxy:stealer=\"Vidar\"" - ] - } -``` - -#### Expected Success Response -**HTTP Status Code** : `200` - -```json - { - "id": "submitted/2019/07/26/3efb8a79-08e9-4776-94ab-615eb370b6d4.gz", - "tags": [ - "infoleak:analyst-detection=\"private-key\"", - "infoleak:analyst-detection=\"api-key\"", - "misp-galaxy:stealer=\"Vidar\"" - ] - } -``` - -#### Expected Fail Response -**HTTP Status Code** : `400` - -```json - {"status": "error", "reason": "Item id not found"} - {"status": "error", "reason": "Tags or Galaxy not specified"} - {"status": "error", "reason": "Tags or Galaxy not enabled"} -``` - - - - -### Delete item tags: `api/v1/delete/item/tag` - -#### Description -Delete tags from an item. - -**Method** : `DELETE` - -#### Parameters -- `id` - - item id - - *str - relative item path* - - mandatory -- `tags` - - list of tags - - *list* - - default: `[]` - -#### JSON response -- `id` - - item id - - *str - relative item path* -- `tags` - - list of item tags deleted - - *list* - -#### Example -``` -curl https://127.0.0.1:7000/api/v1/delete/item/tag --header "Authorization: iHc1_ChZxj1aXmiFiF1mkxxQkzawwriEaZpPqyTQj " -H "Content-Type: application/json" --data @input.json -X DELETE -``` - -#### input.json Example -```json - { - "id": "submitted/2019/07/26/3efb8a79-08e9-4776-94ab-615eb370b6d4.gz", - "tags": [ - "infoleak:analyst-detection=\"private-key\"", - "infoleak:analyst-detection=\"api-key\"", - "misp-galaxy:stealer=\"Vidar\"" - ] - } -``` - -#### Expected Success Response -**HTTP Status Code** : `200` - -```json - { - "id": "submitted/2019/07/26/3efb8a79-08e9-4776-94ab-615eb370b6d4.gz", - "tags": [ - "infoleak:analyst-detection=\"private-key\"", - "infoleak:analyst-detection=\"api-key\"", - "misp-galaxy:stealer=\"Vidar\"" - ] - } -``` - -#### Expected Fail Response -**HTTP Status Code** : `400` - -```json - {"status": "error", "reason": "Item id not found"} - {"status": "error", "reason": "No Tag(s) specified"} -``` - - - - - - -## Tag management - - -### Get all AIL tags: `api/v1/get/tag/all` - -#### Description -Get all tags used in AIL. - -**Method** : `GET` - -#### JSON response -- `tags` - - list of tag - - *list* -#### Example -``` -curl https://127.0.0.1:7000/api/v1/get/tag/all --header "Authorization: iHc1_ChZxj1aXmiFiF1mkxxQkzawwriEaZpPqyTQj " -H "Content-Type: application/json" -``` - -#### Expected Success Response -**HTTP Status Code** : `200` -```json - { - "tags": [ - "misp-galaxy:backdoor=\"Rosenbridge\"", - "infoleak:automatic-detection=\"pgp-private-key\"", - "infoleak:automatic-detection=\"pgp-signature\"", - "infoleak:automatic-detection=\"base64\"", - "infoleak:automatic-detection=\"encrypted-private-key\"", - "infoleak:submission=\"crawler\"", - "infoleak:automatic-detection=\"binary\"", - "infoleak:automatic-detection=\"pgp-public-key-block\"", - "infoleak:automatic-detection=\"hexadecimal\"", - "infoleak:analyst-detection=\"private-key\"", - "infoleak:submission=\"manual\"", - "infoleak:automatic-detection=\"private-ssh-key\"", - "infoleak:automatic-detection=\"iban\"", - "infoleak:automatic-detection=\"pgp-message\"", - "infoleak:automatic-detection=\"certificate\"", - "infoleak:automatic-detection=\"credential\"", - "infoleak:automatic-detection=\"cve\"", - "infoleak:automatic-detection=\"google-api-key\"", - "infoleak:automatic-detection=\"phone-number\"", - "infoleak:automatic-detection=\"rsa-private-key\"", - "misp-galaxy:backdoor=\"SLUB\"", - "infoleak:automatic-detection=\"credit-card\"", - "misp-galaxy:stealer=\"Vidar\"", - "infoleak:automatic-detection=\"private-key\"", - "infoleak:automatic-detection=\"api-key\"", - "infoleak:automatic-detection=\"mail\"" - ] - } -``` - - - - -### Get tag metadata: `api/v1/get/tag/metadata` - -#### Description -Get tag metadata. - -**Method** : `POST` - -#### Parameters -- `tag` - - tag name - - *str* - - mandatory - -#### JSON response -- `tag` - - tag name - - *str* -- `first_seen` - - date: first seen - - *str - YYYYMMDD* -- `last_seen` - - date: last seen - - *str - YYYYMMDD* -#### Example -``` -curl https://127.0.0.1:7000/api/v1/get/tag/metadata --header "Authorization: iHc1_ChZxj1aXmiFiF1mkxxQkzawwriEaZpPqyTQj " -H "Content-Type: application/json" --data @input.json -X POST -``` - -#### input.json Example -```json - { - "tag": "infoleak:submission=\"manual\"" - } -``` - -#### Expected Success Response -**HTTP Status Code** : `200` -```json - { - "first_seen": "20190605", - "last_seen": "20190726", - "tag": "infoleak:submission=\"manual\"" - } -``` - -#### Expected Fail Response -**HTTP Status Code** : `404` -```json - {"status": "error", "reason": "Tag not found"} -``` - - - - -## Cryptocurrency - - - -### Get bitcoin metadata: `api/v1/get/cryptocurrency/bitcoin/metadata` - -#### Description -Get all metdata from a bitcoin address. - -**Method** : `POST` - -#### Parameters -- `bitcoin` - - bitcoin address - - *str* - - mandatory - -#### JSON response -- `bitcoin` - - bitcoin address - - *str* -- `first_seen` - - date: first seen - - *str - YYYYMMDD* -- `last_seen` - - date: last seen - - *str - YYYYMMDD* -#### Example -``` -curl https://127.0.0.1:7000/api/v1/get/cryptocurrency/bitcoin/metadata --header "Authorization: iHc1_ChZxj1aXmiFiF1mkxxQkzawwriEaZpPqyTQj " -H "Content-Type: application/json" --data @input.json -X POST -``` - -#### input.json Example -```json - { - "bitcoin": "3DZfm5TQaJKcJm9PsuaWmSz9XmHMLxVv3y" - } -``` - -#### Expected Success Response -**HTTP Status Code** : `200` -```json - { - "bitcoin": "3DZfm5TQaJKcJm9PsuaWmSz9XmHMLxVv3y", - "first_seen": "20190605", - "last_seen": "20190726" - } -``` - -#### Expected Fail Response -**HTTP Status Code** : `404` -```json - {"status": "error", "reason": "Item not found"} -``` - - - -### Get bitcoin metadata: `api/v1/get/cryptocurrency/bitcoin/item` - -#### Description -Get all items related to a bitcoin address. - -**Method** : `POST` - -#### Parameters -- `bitcoin` - - bitcoin address - - *str* - - mandatory - -#### JSON response -- `bitcoin` - - bitcoin address - - *str* -- `items` - - list of item id - - *list* -#### Example -``` -curl https://127.0.0.1:7000/api/v1/get/cryptocurrency/bitcoin/item --header "Authorization: iHc1_ChZxj1aXmiFiF1mkxxQkzawwriEaZpPqyTQj " -H "Content-Type: application/json" --data @input.json -X POST -``` - -#### input.json Example -```json - { - "bitcoin": "3DZfm5TQaJKcJm9PsuaWmSz9XmHMLxVv3y" - } -``` - -#### Expected Success Response -**HTTP Status Code** : `200` -```json - { - "bitcoin": "3DZfm5TQaJKcJm9PsuaWmSz9XmHMLxVv3y", - "items": [ - "archive/2019/08/26/test_bitcoin001", - "archive/2019/08/26/test_bitcoin002", - "submitted/2019/07/26/3efb8a79-08e9-4776-94ab-615eb370b6d4.gz" - ] - } -``` - -#### Expected Fail Response -**HTTP Status Code** : `404` -```json - {"status": "error", "reason": "Item not found"} -``` - - - - - - - -## Tracker - - - -### Add term tracker: `api/v1/add/tracker` - -#### Description -Create a new tracker (word, set, regex). - -You need to use a regex if you want to use one of the following special characters [<>~!?@#$%^&*|()_-+={}\":;,.\'\n\r\t]/\\ - - -**Method** : `POST` - -#### Parameters -- `term` - - term to add - - *str - word(s)* - - mandatory -- `nb_words` - - number of words in set - - *int* - - default: `1` -- `type` - - term type - - *str* - - mandatory: `word`, `set`, `regex` -- `tags` - - list of tags - - *list* - - default: `[]` -- `mails` - - list of mails to notify - - *list* - - default: `[]` -- `level` - - tracker visibility - - *int - 0: user only, 1: all users* - - default: `1` -- `description` - - tracker description - - *str* - -#### JSON response -- `uuid` - - import uuid - - *uuid4* - -#### Example -``` -curl https://127.0.0.1:7000/api/v1/add/tracker --header "Authorization: iHc1_ChZxj1aXmiFiF1mkxxQkzawwriEaZpPqyTQj " -H "Content-Type: application/json" --data @input.json -X POST -``` - -#### input.json Example -```json - { - "term": "test test2 test3", - "type": "set", - "nb_words": 2, - "tags": [ - "mytags", - "othertags" - ], - "mails": [ - "mail@mail.test", - "othermail@mail.test" - ], - "level": 1 - } -``` - -#### Expected Success Response -**HTTP Status Code** : `200` - -```json - { - "uuid": "6a16b06e-38e5-41e1-904d-3960610647e8" - } -``` - -#### Expected Fail Response -**HTTP Status Code** : 400 - -```json - {"status": "error", "reason": "Term not provided"} - {"status": "error", "reason": "Term type not provided"} - {"status": "error", "reason": "special character not allowed", "message": "Please use a regex or remove all special characters"} - {"status": "error", "reason": "Incorrect type"} -``` -**HTTP Status Code** : 409 - -```json - {"status": "error", "reason": "Term already tracked"} -``` - - - -### Delete term tracker: `api/v1/delete/tracker` - -#### Description -Delete a tracker - -**Method** : `DELETE` - -#### Parameters -- `uuid` - - tracked term uuid - - *uuid4* - - mandatory - -#### JSON response -- `uuid` - - deleted uuid - - *uuid4* - -#### Example -``` -curl https://127.0.0.1:7000/api/v1/delete/tracker --header "Authorization: iHc1_ChZxj1aXmiFiF1mkxxQkzawwriEaZpPqyTQj " -H "Content-Type: application/json" --data @input.json -X POST -``` - -#### input.json Example -```json - { - "uuid": "6a16b06e-38e5-41e1-904d-3960610647e8" - } -``` - -#### Expected Success Response -**HTTP Status Code** : `200` - -```json - { - "uuid": "6a16b06e-38e5-41e1-904d-3960610647e8" - } -``` - -#### Expected Fail Response -**HTTP Status Code** : `400` - -```json - {"status": "error", "reason": "Invalid uuid"} - -``` - -**HTTP Status Code** : `404` - -```json - ({"status": "error", "reason": "Unknown uuid"} - -``` - - -### Delete term tracker: `api/v1/get/tracker/item` - -#### Description -Get tracked items by date-range - -**Method** : `POST` - -#### Parameters -- `uuid` - - tracked term uuid - - *uuid4* - - mandatory -- `date_from` - - date from - - *str - YYMMDD* - - default: last tracked items date -- `date_to` - - date to - - *str - YYMMDD* - - default: `None` - -#### JSON response -- `uuid` - - term uuid - - *uuid4* -- `date_from` - - date from - - *str - YYMMDD* -- `date_to` - - date to - - *str - YYMMDD* -- `items` - - list of item id - - *list* - -#### Example -``` -curl https://127.0.0.1:7000/api/v1/get/tracker/item --header "Authorization: iHc1_ChZxj1aXmiFiF1mkxxQkzawwriEaZpPqyTQj " -H "Content-Type: application/json" --data @input.json -X POST -``` - -#### input.json Example -```json - { - "uuid": "6a16b06e-38e5-41e1-904d-3960610647e8", - "date_from": "20190823", - "date_to": "20190829", - "items": [ - { - "id": "submitted/2019/08/25/4f929998-3921-4be3-b448-be3bf1722d6b.gz", - "date": 20190825, - "tags": [ - "infoleak:automatic-detection=\"credential\"", - "mytags", - "othertags", - ] - } - ] - } -``` - -**HTTP Status Code** : `400` - -```json - {"status": "error", "reason": "Invalid uuid"} - -``` - -**HTTP Status Code** : `404` - -```json - ({"status": "error", "reason": "Unknown uuid"} - -``` - - - -## Domain - - -### Get min domain metadata: `api/v1/get/crawled/domain/list` - -#### Description -Get crawled domain by date-range and status (default status = *UP*) - -**Method** : `POST` - -#### Parameters -- `domain_type` - - domain type: *onion* or *regular* - - *str* - - default: *regular* -- `date_from` - - date from - - *str - YYYYMMDD* - - mandatory -- `date_to` - - date to - - *str - YYYYMMDD* - - mandatory - -#### JSON response -- `domain_type` - - domain type: *onion* or *regular* - - *str* -- `date_from` - - date from - - *str - YYYYMMDD* -- `date_to` - - date to - - *str - YYYYMMDD* -- `domains` - - list of domains - - *list - list of domains* - -#### Example -``` -curl https://127.0.0.1:7000/api/v1/get/crawled/domain/list --header "Authorization: iHc1_ChZxj1aXmiFiF1mkxxQkzawwriEaZpPqyTQj " -H "Content-Type: application/json" --data @input.json -X POST -``` - -#### input.json Example -```json - { - "date_from": "20191001", - "date_to": "20191222", - "domain_type": "onion" - } -``` - -#### Expected Success Response -**HTTP Status Code** : `200` - -```json - { - "date_from": "20191001", - "date_to": "20191222", - "domain_status": "UP", - "domain_type": "onion", - "domains": [ - "2222222222222222.onion" - ] - } -``` - - - - -### Get min domain metadata: `api/v1/get/domain/status/minimal` - -#### Description -Get min domain metadata - -**Method** : `POST` - -#### Parameters -- `domain` - - domain name - - *str* - - mandatory - -#### JSON response -- `domain` - - domain - - *str* -- `first_seen` - - domain first up time - - *epoch* -- `last_seen` - - domain last up time - - *epoch* - -#### Example -``` -curl https://127.0.0.1:7000/api/v1/get/domain/status/minimal --header "Authorization: iHc1_ChZxj1aXmiFiF1mkxxQkzawwriEaZpPqyTQj " -H "Content-Type: application/json" --data @input.json -X POST -``` - -#### input.json Example -```json - { - "domain": "2222222222222222.onion", - } -``` - -#### Expected Success Response -**HTTP Status Code** : `200` - -```json - { - "domain": "2222222222222222.onion", - "first_seen": 1571314000, - "last_seen": 1571314000 - } -``` - -**HTTP Status Code** : `404` - -```json - ({"status": "error", "reason": "Domain not found"} - -``` - - - -## Import management - - - -### Import item (currently: text only): `api/v1/import/item` - -#### Description -Allows users to import new items. asynchronous function. - -**Method** : `POST` - -#### Parameters -- `type` - - import type - - *str* - - default: `text` -- `text` - - text to import - - *str* - - mandatory if type = text -- `default_tags` - - add default import tag - - *boolean* - - default: True -- `tags` - - list of tags - - *list* - - default: `[]` -- `galaxy` - - list of galaxy - - *list* - - default: `[]` - -#### JSON response -- `uuid` - - import uuid - - *uuid4* - -#### Example -``` -curl https://127.0.0.1:7000/api/v1/import/item --header "Authorization: iHc1_ChZxj1aXmiFiF1mkxxQkzawwriEaZpPqyTQj " -H "Content-Type: application/json" --data @input.json -X POST -``` - -#### input.json Example -```json - { - "type": "text", - "tags": [ - "infoleak:analyst-detection=\"private-key\"" - ], - "text": "text to import" - } -``` - -#### Expected Success Response -**HTTP Status Code** : `200` - -```json - { - "uuid": "0c3d7b34-936e-4f01-9cdf-2070184b6016" - } -``` - -#### Expected Fail Response -**HTTP Status Code** : `400` - -```json - {"status": "error", "reason": "Malformed JSON"} - {"status": "error", "reason": "No text supplied"} - {"status": "error", "reason": "Tags or Galaxy not enabled"} - {"status": "error", "reason": "Size exceeds default"} -``` - - - - - -### GET Import item info: `api/v1/get/import/item/` - -#### Description - -Get import status and all items imported by uuid - -**Method** : `POST` - -#### Parameters - -- `uuid` - - import uuid - - *uuid4* - - mandatory - -#### JSON response - -- `status` - - import status - - *str* - - values: `in queue`, `in progress`, `imported` -- `items` - - list of imported items id - - *list* - - The full list of imported items is not complete until `status` = `"imported"` - -#### Example - -``` -curl -k https://127.0.0.1:7000/api/v1/get/import/item --header "Authorization: iHc1_ChZxj1aXmiFiF1mkxxQkzawwriEaZpPqyTQj " -H "Content-Type: application/json" --data @input.json -X POST -``` - -#### input.json Example -```json - { - "uuid": "0c3d7b34-936e-4f01-9cdf-2070184b6016" - } -``` - -#### Expected Success Response - -**HTTP Status Code** : `200` - -```json - { - "items": [ - "submitted/2019/07/26/b20a69f1-99ad-4cb3-b212-7ce24b763b50.gz" - ], - "status": "imported" - } -``` - -#### Expected Fail Response - -**HTTP Status Code** : `400` - -```json - {"status": "error", "reason": "Invalid uuid"} - {"status": "error", "reason": "Unknown uuid"} -``` - - - - -# FUTURE endpoints - -
-Endpoints - -### Submit a domain to crawl TODO -##### ``api/add/crawler/task`` POST - -### Create a term/set/regex/yara tracker -##### ``api/add/tracker/`` POST - -### Get tracker -##### ``api/get/tracker`` POST - ------ - - - -### Get domain tags -##### ``api/get/domain/tags/`` POST - -### Get domain history -##### ``api/get/domain/history/`` POST - ------ - -### Get decoded item metadata -### Check if a decoded item exists (via sha1) -##### ``api/get/decoded/metadata/`` POST - ------ - - ------ -##### ``api/get/cryptocurrency`` POST - -### Check if a cryptocurrency address (bitcoin, ..) exists -##### ``api/get/cryptocurrency/`` POST - -### Get cryptocurrency address metadata -##### ``api/get/cryptocurrency/metadata/`` POST - ------ - -### Object correlation (1 depth) -##### ``api/get/correlation/`` POST - -### Create MISP event from object -##### ``api/export/misp`` POST - -
- ------ diff --git a/doc/ail_modules_queues.png b/doc/ail_modules_queues.png new file mode 100644 index 0000000000000000000000000000000000000000..66a082dd3bef7e3d51d1b9b396f50571548e7b34 GIT binary patch literal 146017 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%0A_P!p^Xf`p@;yzGVE*L1G>|pZz)W&M;WZT_-)|c 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 + +#### Description +Get item default info. + +**Method** : `POST` + +#### Parameters +- `id` + - item id + - *str - relative item path* + - mandatory + +#### JSON response +- `content` + - item content + - *str* +- `id` + - item id + - *str* +- `date` + - item date + - *str - YYMMDD* +- `tags` + - item tags list + - *list* + +#### Example +``` +curl https://127.0.0.1:7000/api/v1/get/item/default --header "Authorization: iHc1_ChZxj1aXmiFiF1mkxxQkzawwriEaZpPqyTQj " -H "Content-Type: application/json" --data @input.json -X POST +``` + +#### input.json Example +```json + { + "id": "submitted/2019/07/26/3efb8a79-08e9-4776-94ab-615eb370b6d4.gz" + } +``` + +#### Expected Success Response +**HTTP Status Code** : `200` + +```json + { + "content": "item content test", + "date": "20190726", + "id": "submitted/2019/07/26/3efb8a79-08e9-4776-94ab-615eb370b6d4.gz", + "tags": + [ + "misp-galaxy:backdoor=\"Rosenbridge\"", + "infoleak:automatic-detection=\"pgp-message\"", + "infoleak:automatic-detection=\"encrypted-private-key\"", + "infoleak:submission=\"manual\"", + "misp-galaxy:backdoor=\"SLUB\"" + ] + } +``` + +#### Expected Fail Response + +**HTTP Status Code** : `400` +```json + {"status": "error", "reason": "Mandatory parameter(s) not provided"} +``` +**HTTP Status Code** : `404` +```json + {"status": "error", "reason": "Item not found"} +``` + + + + +### Get item content: `api/v1/get/item/content` + +#### Description +Get a specific item content. + +**Method** : `POST` + +#### Parameters +- `id` + - item id + - *str - relative item path* + - mandatory + +#### JSON response +- `content` + - item content + - *str* +- `id` + - item id + - *str* + +#### Example +``` +curl https://127.0.0.1:7000/api/v1/get/item/content --header "Authorization: iHc1_ChZxj1aXmiFiF1mkxxQkzawwriEaZpPqyTQj " -H "Content-Type: application/json" --data @input.json -X POST +``` + +#### input.json Example +```json + { + "id": "submitted/2019/07/26/3efb8a79-08e9-4776-94ab-615eb370b6d4.gz" + } +``` + +#### Expected Success Response +**HTTP Status Code** : `200` + +```json + { + "content": "item content test", + "id": "submitted/2019/07/26/3efb8a79-08e9-4776-94ab-615eb370b6d4.gz" + } +``` + +#### Expected Fail Response + +**HTTP Status Code** : `400` +```json + {"status": "error", "reason": "Mandatory parameter(s) not provided"} +``` +**HTTP Status Code** : `404` +```json + {"status": "error", "reason": "Item not found"} +``` + + + +### Get item content: `api/v1/get/item/tag` + +#### Description +Get all tags from an item. + +**Method** : `POST` + +#### Parameters +- `id` + - item id + - *str - relative item path* + - mandatory + +#### JSON response +- `content` + - item content + - *str* +- `tags` + - item tags list + - *list* + +#### Example +``` +curl https://127.0.0.1:7000/api/v1/get/item/tag --header "Authorization: iHc1_ChZxj1aXmiFiF1mkxxQkzawwriEaZpPqyTQj " -H "Content-Type: application/json" --data @input.json -X POST +``` + +#### input.json Example +```json + { + "id": "submitted/2019/07/26/3efb8a79-08e9-4776-94ab-615eb370b6d4.gz" + } +``` + +#### Expected Success Response +**HTTP Status Code** : `200` + +```json + { + "id": "submitted/2019/07/26/3efb8a79-08e9-4776-94ab-615eb370b6d4.gz", + "tags": + [ + "misp-galaxy:backdoor=\"Rosenbridge\"", + "infoleak:automatic-detection=\"pgp-message\"", + "infoleak:automatic-detection=\"encrypted-private-key\"", + "infoleak:submission=\"manual\"", + "misp-galaxy:backdoor=\"SLUB\"" + ] + } +``` + +#### Expected Fail Response + +**HTTP Status Code** : `400` +```json + {"status": "error", "reason": "Mandatory parameter(s) not provided"} +``` +**HTTP Status Code** : `404` +```json + {"status": "error", "reason": "Item not found"} +``` + + + +### Advanced Get item: `api/v1/get/item` + +#### Description +Get item. Filter requested field. + +**Method** : `POST` + +#### Parameters +- `id` + - item id + - *str - relative item path* + - mandatory +- `date` + - get item date + - *boolean* + - default: `true` +- `tags` + - get item tags + - *boolean* + - default: `true` +- `content` + - get item content + - *boolean* + - default: `false` +- `size` + - get item size + - *boolean* + - default: `false` +- `lines` + - get item lines info + - *boolean* + - default: `false` +- `cryptocurrency` + - `bitcoin` + - get item bitcoin adress + - *boolean* + - default: `false` +- `pgp` + - `key` + - get item pgp key + - *boolean* + - default: `false` + - `mail` + - get item pgp mail + - *boolean* + - default: `false` + - `name` + - get item pgp name + - *boolean* + - default: `false` + + +#### JSON response +- `content` + - item content + - *str* +- `id` + - item id + - *str* +- `date` + - item date + - *str - YYMMDD* +- `tags` + - item tags list + - *list* +- `size` + - item size (Kb) + - *int* +- `lines` + - item lines info + - *{}* + - `max_length` + - line max length line + - *int* + - `nb` + - nb lines item + - *int* +- `cryptocurrency` + - `bitcoin` + - item bitcoin adress + - *list* +- `pgp` + - `key` + - item pgp keys + - *list* + - `mail` + - item pgp mails + - *list* + - `name` + - item pgp name + - *list* + + +#### Example +``` +curl https://127.0.0.1:7000/api/v1/get/item --header "Authorization: iHc1_ChZxj1aXmiFiF1mkxxQkzawwriEaZpPqyTQj " -H "Content-Type: application/json" --data @input.json -X POST +``` + +#### input.json Example +```json +{ + "id": "submitted/2019/07/26/3efb8a79-08e9-4776-94ab-615eb370b6d4.gz", + "content": true, + "lines_info": true, + "tags": true, + "size": true +} +``` + +#### Expected Success Response +**HTTP Status Code** : `200` +```json + { + "content": "dsvcdsvcdsc vvvv", + "cryptocurrency": { + "bitcoin": [ + "132M1aGTGodHkQNh1augLeMjEXH51wgoCc" + ] + }, + "date": "20190726", + "id": "submitted/2019/07/26/3efb8a79-08e9-4776-94ab-615eb370b6d4.gz", + "lines": { + "max_length": 19, + "nb": 1 + }, + "pgp": { + "key": [ + "0x5180D21F4C20F975" + ], + "mail": [ + "mail@test.test" + ], + "name": [ + "user_test" + ] + }, + "size": 0.03, + "tags": [ + "misp-galaxy:stealer=\"Vidar\"", + "infoleak:submission=\"manual\"" + ] + } +``` + +#### Expected Fail Response +**HTTP Status Code** : `400` +```json + {"status": "error", "reason": "Mandatory parameter(s) not provided"} +``` +**HTTP Status Code** : `404` +```json + {"status": "error", "reason": "Item not found"} +``` + + + + + +### Add item tags: `api/v1/add/item/tag` + +#### Description +Add tags to an item. + +**Method** : `POST` + +#### Parameters +- `id` + - item id + - *str - relative item path* + - mandatory +- `tags` + - list of tags + - *list* + - default: `[]` +- `galaxy` + - list of galaxy + - *list* + - default: `[]` + +#### JSON response +- `id` + - item id + - *str - relative item path* +- `tags` + - list of item tags added + - *list* + +#### Example +``` +curl https://127.0.0.1:7000/api/v1/import/item --header "Authorization: iHc1_ChZxj1aXmiFiF1mkxxQkzawwriEaZpPqyTQj " -H "Content-Type: application/json" --data @input.json -X POST +``` + +#### input.json Example +```json + { + "id": "submitted/2019/07/26/3efb8a79-08e9-4776-94ab-615eb370b6d4.gz", + "tags": [ + "infoleak:analyst-detection=\"private-key\"", + "infoleak:analyst-detection=\"api-key\"" + ], + "galaxy": [ + "misp-galaxy:stealer=\"Vidar\"" + ] + } +``` + +#### Expected Success Response +**HTTP Status Code** : `200` + +```json + { + "id": "submitted/2019/07/26/3efb8a79-08e9-4776-94ab-615eb370b6d4.gz", + "tags": [ + "infoleak:analyst-detection=\"private-key\"", + "infoleak:analyst-detection=\"api-key\"", + "misp-galaxy:stealer=\"Vidar\"" + ] + } +``` + +#### Expected Fail Response +**HTTP Status Code** : `400` + +```json + {"status": "error", "reason": "Item id not found"} + {"status": "error", "reason": "Tags or Galaxy not specified"} + {"status": "error", "reason": "Tags or Galaxy not enabled"} +``` + + + + +### Delete item tags: `api/v1/delete/item/tag` + +#### Description +Delete tags from an item. + +**Method** : `DELETE` + +#### Parameters +- `id` + - item id + - *str - relative item path* + - mandatory +- `tags` + - list of tags + - *list* + - default: `[]` + +#### JSON response +- `id` + - item id + - *str - relative item path* +- `tags` + - list of item tags deleted + - *list* + +#### Example +``` +curl https://127.0.0.1:7000/api/v1/delete/item/tag --header "Authorization: iHc1_ChZxj1aXmiFiF1mkxxQkzawwriEaZpPqyTQj " -H "Content-Type: application/json" --data @input.json -X DELETE +``` + +#### input.json Example +```json + { + "id": "submitted/2019/07/26/3efb8a79-08e9-4776-94ab-615eb370b6d4.gz", + "tags": [ + "infoleak:analyst-detection=\"private-key\"", + "infoleak:analyst-detection=\"api-key\"", + "misp-galaxy:stealer=\"Vidar\"" + ] + } +``` + +#### Expected Success Response +**HTTP Status Code** : `200` + +```json + { + "id": "submitted/2019/07/26/3efb8a79-08e9-4776-94ab-615eb370b6d4.gz", + "tags": [ + "infoleak:analyst-detection=\"private-key\"", + "infoleak:analyst-detection=\"api-key\"", + "misp-galaxy:stealer=\"Vidar\"" + ] + } +``` + +#### Expected Fail Response +**HTTP Status Code** : `400` + +```json + {"status": "error", "reason": "Item id not found"} + {"status": "error", "reason": "No Tag(s) specified"} +``` + + + + + + +## Tag management + + +### Get all AIL tags: `api/v1/get/tag/all` + +#### Description +Get all tags used in AIL. + +**Method** : `GET` + +#### JSON response +- `tags` + - list of tag + - *list* +#### Example +``` +curl https://127.0.0.1:7000/api/v1/get/tag/all --header "Authorization: iHc1_ChZxj1aXmiFiF1mkxxQkzawwriEaZpPqyTQj " -H "Content-Type: application/json" +``` + +#### Expected Success Response +**HTTP Status Code** : `200` +```json + { + "tags": [ + "misp-galaxy:backdoor=\"Rosenbridge\"", + "infoleak:automatic-detection=\"pgp-private-key\"", + "infoleak:automatic-detection=\"pgp-signature\"", + "infoleak:automatic-detection=\"base64\"", + "infoleak:automatic-detection=\"encrypted-private-key\"", + "infoleak:submission=\"crawler\"", + "infoleak:automatic-detection=\"binary\"", + "infoleak:automatic-detection=\"pgp-public-key-block\"", + "infoleak:automatic-detection=\"hexadecimal\"", + "infoleak:analyst-detection=\"private-key\"", + "infoleak:submission=\"manual\"", + "infoleak:automatic-detection=\"private-ssh-key\"", + "infoleak:automatic-detection=\"iban\"", + "infoleak:automatic-detection=\"pgp-message\"", + "infoleak:automatic-detection=\"certificate\"", + "infoleak:automatic-detection=\"credential\"", + "infoleak:automatic-detection=\"cve\"", + "infoleak:automatic-detection=\"google-api-key\"", + "infoleak:automatic-detection=\"phone-number\"", + "infoleak:automatic-detection=\"rsa-private-key\"", + "misp-galaxy:backdoor=\"SLUB\"", + "infoleak:automatic-detection=\"credit-card\"", + "misp-galaxy:stealer=\"Vidar\"", + "infoleak:automatic-detection=\"private-key\"", + "infoleak:automatic-detection=\"api-key\"", + "infoleak:automatic-detection=\"mail\"" + ] + } +``` + + + + +### Get tag metadata: `api/v1/get/tag/metadata` + +#### Description +Get tag metadata. + +**Method** : `POST` + +#### Parameters +- `tag` + - tag name + - *str* + - mandatory + +#### JSON response +- `tag` + - tag name + - *str* +- `first_seen` + - date: first seen + - *str - YYYYMMDD* +- `last_seen` + - date: last seen + - *str - YYYYMMDD* +#### Example +``` +curl https://127.0.0.1:7000/api/v1/get/tag/metadata --header "Authorization: iHc1_ChZxj1aXmiFiF1mkxxQkzawwriEaZpPqyTQj " -H "Content-Type: application/json" --data @input.json -X POST +``` + +#### input.json Example +```json + { + "tag": "infoleak:submission=\"manual\"" + } +``` + +#### Expected Success Response +**HTTP Status Code** : `200` +```json + { + "first_seen": "20190605", + "last_seen": "20190726", + "tag": "infoleak:submission=\"manual\"" + } +``` + +#### Expected Fail Response +**HTTP Status Code** : `404` +```json + {"status": "error", "reason": "Tag not found"} +``` + + + + +## Cryptocurrency + + + +### Get bitcoin metadata: `api/v1/get/cryptocurrency/bitcoin/metadata` + +#### Description +Get all metdata from a bitcoin address. + +**Method** : `POST` + +#### Parameters +- `bitcoin` + - bitcoin address + - *str* + - mandatory + +#### JSON response +- `bitcoin` + - bitcoin address + - *str* +- `first_seen` + - date: first seen + - *str - YYYYMMDD* +- `last_seen` + - date: last seen + - *str - YYYYMMDD* +#### Example +``` +curl https://127.0.0.1:7000/api/v1/get/cryptocurrency/bitcoin/metadata --header "Authorization: iHc1_ChZxj1aXmiFiF1mkxxQkzawwriEaZpPqyTQj " -H "Content-Type: application/json" --data @input.json -X POST +``` + +#### input.json Example +```json + { + "bitcoin": "3DZfm5TQaJKcJm9PsuaWmSz9XmHMLxVv3y" + } +``` + +#### Expected Success Response +**HTTP Status Code** : `200` +```json + { + "bitcoin": "3DZfm5TQaJKcJm9PsuaWmSz9XmHMLxVv3y", + "first_seen": "20190605", + "last_seen": "20190726" + } +``` + +#### Expected Fail Response +**HTTP Status Code** : `404` +```json + {"status": "error", "reason": "Item not found"} +``` + + + +### Get bitcoin metadata: `api/v1/get/cryptocurrency/bitcoin/item` + +#### Description +Get all items related to a bitcoin address. + +**Method** : `POST` + +#### Parameters +- `bitcoin` + - bitcoin address + - *str* + - mandatory + +#### JSON response +- `bitcoin` + - bitcoin address + - *str* +- `items` + - list of item id + - *list* +#### Example +``` +curl https://127.0.0.1:7000/api/v1/get/cryptocurrency/bitcoin/item --header "Authorization: iHc1_ChZxj1aXmiFiF1mkxxQkzawwriEaZpPqyTQj " -H "Content-Type: application/json" --data @input.json -X POST +``` + +#### input.json Example +```json + { + "bitcoin": "3DZfm5TQaJKcJm9PsuaWmSz9XmHMLxVv3y" + } +``` + +#### Expected Success Response +**HTTP Status Code** : `200` +```json + { + "bitcoin": "3DZfm5TQaJKcJm9PsuaWmSz9XmHMLxVv3y", + "items": [ + "archive/2019/08/26/test_bitcoin001", + "archive/2019/08/26/test_bitcoin002", + "submitted/2019/07/26/3efb8a79-08e9-4776-94ab-615eb370b6d4.gz" + ] + } +``` + +#### Expected Fail Response +**HTTP Status Code** : `404` +```json + {"status": "error", "reason": "Item not found"} +``` + + + + + + + +## Tracker + + + +### Add term tracker: `api/v1/add/tracker` + +#### Description +Create a new tracker (word, set, regex). + +You need to use a regex if you want to use one of the following special characters [<>~!?@#$%^&*|()_-+={}\":;,.\'\n\r\t]/\\ + + +**Method** : `POST` + +#### Parameters +- `term` + - term to add + - *str - word(s)* + - mandatory +- `nb_words` + - number of words in set + - *int* + - default: `1` +- `type` + - term type + - *str* + - mandatory: `word`, `set`, `regex` +- `tags` + - list of tags + - *list* + - default: `[]` +- `mails` + - list of mails to notify + - *list* + - default: `[]` +- `level` + - tracker visibility + - *int - 0: user only, 1: all users* + - default: `1` +- `description` + - tracker description + - *str* + +#### JSON response +- `uuid` + - import uuid + - *uuid4* + +#### Example +``` +curl https://127.0.0.1:7000/api/v1/add/tracker --header "Authorization: iHc1_ChZxj1aXmiFiF1mkxxQkzawwriEaZpPqyTQj " -H "Content-Type: application/json" --data @input.json -X POST +``` + +#### input.json Example +```json + { + "term": "test test2 test3", + "type": "set", + "nb_words": 2, + "tags": [ + "mytags", + "othertags" + ], + "mails": [ + "mail@mail.test", + "othermail@mail.test" + ], + "level": 1 + } +``` + +#### Expected Success Response +**HTTP Status Code** : `200` + +```json + { + "uuid": "6a16b06e-38e5-41e1-904d-3960610647e8" + } +``` + +#### Expected Fail Response +**HTTP Status Code** : 400 + +```json + {"status": "error", "reason": "Term not provided"} + {"status": "error", "reason": "Term type not provided"} + {"status": "error", "reason": "special character not allowed", "message": "Please use a regex or remove all special characters"} + {"status": "error", "reason": "Incorrect type"} +``` +**HTTP Status Code** : 409 + +```json + {"status": "error", "reason": "Term already tracked"} +``` + + + +### Delete term tracker: `api/v1/delete/tracker` + +#### Description +Delete a tracker + +**Method** : `DELETE` + +#### Parameters +- `uuid` + - tracked term uuid + - *uuid4* + - mandatory + +#### JSON response +- `uuid` + - deleted uuid + - *uuid4* + +#### Example +``` +curl https://127.0.0.1:7000/api/v1/delete/tracker --header "Authorization: iHc1_ChZxj1aXmiFiF1mkxxQkzawwriEaZpPqyTQj " -H "Content-Type: application/json" --data @input.json -X POST +``` + +#### input.json Example +```json + { + "uuid": "6a16b06e-38e5-41e1-904d-3960610647e8" + } +``` + +#### Expected Success Response +**HTTP Status Code** : `200` + +```json + { + "uuid": "6a16b06e-38e5-41e1-904d-3960610647e8" + } +``` + +#### Expected Fail Response +**HTTP Status Code** : `400` + +```json + {"status": "error", "reason": "Invalid uuid"} + +``` + +**HTTP Status Code** : `404` + +```json + ({"status": "error", "reason": "Unknown uuid"} + +``` + + +### Delete term tracker: `api/v1/get/tracker/item` + +#### Description +Get tracked items by date-range + +**Method** : `POST` + +#### Parameters +- `uuid` + - tracked term uuid + - *uuid4* + - mandatory +- `date_from` + - date from + - *str - YYMMDD* + - default: last tracked items date +- `date_to` + - date to + - *str - YYMMDD* + - default: `None` + +#### JSON response +- `uuid` + - term uuid + - *uuid4* +- `date_from` + - date from + - *str - YYMMDD* +- `date_to` + - date to + - *str - YYMMDD* +- `items` + - list of item id + - *list* + +#### Example +``` +curl https://127.0.0.1:7000/api/v1/get/tracker/item --header "Authorization: iHc1_ChZxj1aXmiFiF1mkxxQkzawwriEaZpPqyTQj " -H "Content-Type: application/json" --data @input.json -X POST +``` + +#### input.json Example +```json + { + "uuid": "6a16b06e-38e5-41e1-904d-3960610647e8", + "date_from": "20190823", + "date_to": "20190829", + "items": [ + { + "id": "submitted/2019/08/25/4f929998-3921-4be3-b448-be3bf1722d6b.gz", + "date": 20190825, + "tags": [ + "infoleak:automatic-detection=\"credential\"", + "mytags", + "othertags", + ] + } + ] + } +``` + +**HTTP Status Code** : `400` + +```json + {"status": "error", "reason": "Invalid uuid"} + +``` + +**HTTP Status Code** : `404` + +```json + ({"status": "error", "reason": "Unknown uuid"} + +``` + + + +## Domain + + +### Get min domain metadata: `api/v1/get/crawled/domain/list` + +#### Description +Get crawled domain by date-range and status (default status = *UP*) + +**Method** : `POST` + +#### Parameters +- `domain_type` + - domain type: *onion* or *regular* + - *str* + - default: *regular* +- `date_from` + - date from + - *str - YYYYMMDD* + - mandatory +- `date_to` + - date to + - *str - YYYYMMDD* + - mandatory + +#### JSON response +- `domain_type` + - domain type: *onion* or *regular* + - *str* +- `date_from` + - date from + - *str - YYYYMMDD* +- `date_to` + - date to + - *str - YYYYMMDD* +- `domains` + - list of domains + - *list - list of domains* + +#### Example +``` +curl https://127.0.0.1:7000/api/v1/get/crawled/domain/list --header "Authorization: iHc1_ChZxj1aXmiFiF1mkxxQkzawwriEaZpPqyTQj " -H "Content-Type: application/json" --data @input.json -X POST +``` + +#### input.json Example +```json + { + "date_from": "20191001", + "date_to": "20191222", + "domain_type": "onion" + } +``` + +#### Expected Success Response +**HTTP Status Code** : `200` + +```json + { + "date_from": "20191001", + "date_to": "20191222", + "domain_status": "UP", + "domain_type": "onion", + "domains": [ + "2222222222222222.onion" + ] + } +``` + + + + +### Get min domain metadata: `api/v1/get/domain/status/minimal` + +#### Description +Get min domain metadata + +**Method** : `POST` + +#### Parameters +- `domain` + - domain name + - *str* + - mandatory + +#### JSON response +- `domain` + - domain + - *str* +- `first_seen` + - domain first up time + - *epoch* +- `last_seen` + - domain last up time + - *epoch* + +#### Example +``` +curl https://127.0.0.1:7000/api/v1/get/domain/status/minimal --header "Authorization: iHc1_ChZxj1aXmiFiF1mkxxQkzawwriEaZpPqyTQj " -H "Content-Type: application/json" --data @input.json -X POST +``` + +#### input.json Example +```json + { + "domain": "2222222222222222.onion", + } +``` + +#### Expected Success Response +**HTTP Status Code** : `200` + +```json + { + "domain": "2222222222222222.onion", + "first_seen": 1571314000, + "last_seen": 1571314000 + } +``` + +**HTTP Status Code** : `404` + +```json + ({"status": "error", "reason": "Domain not found"} + +``` + + + +## Import management + + + +### Import item (currently: text only): `api/v1/import/item` + +#### Description +Allows users to import new items. asynchronous function. + +**Method** : `POST` + +#### Parameters +- `type` + - import type + - *str* + - default: `text` +- `text` + - text to import + - *str* + - mandatory if type = text +- `default_tags` + - add default import tag + - *boolean* + - default: True +- `tags` + - list of tags + - *list* + - default: `[]` +- `galaxy` + - list of galaxy + - *list* + - default: `[]` + +#### JSON response +- `uuid` + - import uuid + - *uuid4* + +#### Example +``` +curl https://127.0.0.1:7000/api/v1/import/item --header "Authorization: iHc1_ChZxj1aXmiFiF1mkxxQkzawwriEaZpPqyTQj " -H "Content-Type: application/json" --data @input.json -X POST +``` + +#### input.json Example +```json + { + "type": "text", + "tags": [ + "infoleak:analyst-detection=\"private-key\"" + ], + "text": "text to import" + } +``` + +#### Expected Success Response +**HTTP Status Code** : `200` + +```json + { + "uuid": "0c3d7b34-936e-4f01-9cdf-2070184b6016" + } +``` + +#### Expected Fail Response +**HTTP Status Code** : `400` + +```json + {"status": "error", "reason": "Malformed JSON"} + {"status": "error", "reason": "No text supplied"} + {"status": "error", "reason": "Tags or Galaxy not enabled"} + {"status": "error", "reason": "Size exceeds default"} +``` + + + + + +### GET Import item info: `api/v1/get/import/item/` + +#### Description + +Get import status and all items imported by uuid + +**Method** : `POST` + +#### Parameters + +- `uuid` + - import uuid + - *uuid4* + - mandatory + +#### JSON response + +- `status` + - import status + - *str* + - values: `in queue`, `in progress`, `imported` +- `items` + - list of imported items id + - *list* + - The full list of imported items is not complete until `status` = `"imported"` + +#### Example + +``` +curl -k https://127.0.0.1:7000/api/v1/get/import/item --header "Authorization: iHc1_ChZxj1aXmiFiF1mkxxQkzawwriEaZpPqyTQj " -H "Content-Type: application/json" --data @input.json -X POST +``` + +#### input.json Example +```json + { + "uuid": "0c3d7b34-936e-4f01-9cdf-2070184b6016" + } +``` + +#### Expected Success Response + +**HTTP Status Code** : `200` + +```json + { + "items": [ + "submitted/2019/07/26/b20a69f1-99ad-4cb3-b212-7ce24b763b50.gz" + ], + "status": "imported" + } +``` + +#### Expected Fail Response + +**HTTP Status Code** : `400` + +```json + {"status": "error", "reason": "Invalid uuid"} + {"status": "error", "reason": "Unknown uuid"} +``` + + + + +# FUTURE endpoints + +
+Endpoints + +### Submit a domain to crawl TODO +##### ``api/add/crawler/task`` POST + +### Create a term/set/regex/yara tracker +##### ``api/add/tracker/`` POST + +### Get tracker +##### ``api/get/tracker`` POST + +----- + + + +### Get domain tags +##### ``api/get/domain/tags/`` POST + +### Get domain history +##### ``api/get/domain/history/`` POST + +----- + +### Get decoded item metadata +### Check if a decoded item exists (via sha1) +##### ``api/get/decoded/metadata/`` POST + +----- + + +----- +##### ``api/get/cryptocurrency`` POST + +### Check if a cryptocurrency address (bitcoin, ..) exists +##### ``api/get/cryptocurrency/`` POST + +### Get cryptocurrency address metadata +##### ``api/get/cryptocurrency/metadata/`` POST + +----- + +### Object correlation (1 depth) +##### ``api/get/correlation/`` POST + +### Create MISP event from object +##### ``api/export/misp`` POST + +
+ +----- +