Code Monkey home page Code Monkey logo

sentrypeer / sentrypeer Goto Github PK

View Code? Open in Web Editor NEW
149.0 12.0 17.0 2.43 MB

Protect your SIP Servers from bad actors at https://sentrypeer.org

Home Page: https://sentrypeer.org

License: Other

Perl 2.96% JavaScript 2.59% Pug 1.32% SCSS 0.07% Makefile 2.63% Shell 1.57% M4 3.59% C 79.47% CMake 2.92% Roff 1.16% Dockerfile 0.99% HCL 0.67% Rust 0.06%
sip voip security-tools honeypot peer-to-peer p2p machine-learning fraud-detection fraud fraud-prevention

sentrypeer's Introduction

Protect your SIP Servers from bad actors

SentryPeer Logo

Stability: Active GitHub release (latest SemVer) Docker Hub Coverity Scan Build Status Build and Test CodeQL Clang Static Analysis CII Best Practices gitleaks

Special thanks to Deutsche Telekom Security GmbH for sponsoring us! Very kind!

Why not give us a star and follow us on Twitter!

Table of Contents

Introduction

SentryPeer® is a fraud detection tool. It lets bad actors try to make phone calls and saves the IP address they came from and number they tried to call. Those details can then be used to raise notifications at the service providers network and the next time a user/customer tries to call a collected number, you can act anyway you see fit.

For example:

Let's say you are running your own VoIP PBX on site. What SentryPeer will allow you to do in this context, is dip into the list of phone numbers (using the RESTful API) when your users are making outbound calls. If you get a hit, you'll get a heads-up that potentially a device within your network is trying to call known probing phone numbers that have either been:

  1. Numbers collected by SentryPeer nodes you are running yourself
  2. Numbers seen by other SentryPeer nodes which have been replicated to your node via the peer to peer network

This would allow you to generate a notification from your monitoring systems before you rack up any expensive calls or something worse happens.

What would lead to this scenario?

  1. Potential voicemail fraud. This can happen if you allow calling an inbound number (your DID/DDI) to get to your voicemail system, then prompt for a PIN. This PIN is weak and the voicemail system allows you to press '*' to call back the Caller ID that left a voicemail. The attacker has left a voicemail, and they then guess your PIN and call it back. The CLI is a known number that SentryPeer has seen. You can alert on it.
  2. A device has been hijacked and/or a softphone or similar is using the credentials they stole off the phone's GUI and is trying to register to your system and make calls to a number seen by SentryPeer.
  3. An innocent user is calling a phishing number or known expensive number etc. that SentryPeer has seen before.

Traditionally, this data is shipped to a central place, so you don't own the data you've collected. This project is all about Peer to Peer sharing of that data. The user owning the data and various Service Provider / Network Provider related feeds of the data is the key bit for me. I'm sick of all the services out there that keep it and sell it. If you've collected it, you should have the choice to keep it and/or opt in to share it with other SentryPeer community members via p2p methods.

Overview

SentryPeer Node

Here we are using Mermaid Sequence diagrams to show the flow of data from a SentryPeer node to SentryPeerHQ.

sequenceDiagram
    actor A as Attacker
    participant S as SentryPeer Node
    participant DS as Data Store
    participant W as WebHook <br/>Endpoint
    Note over DS: sqlite/json log/syslog <br/>(if enabled)
    Note over W: if enabled
    A->>S: SIP probe OPTIONS/REGISTER/etc
    S->>DS: Save event
    S->>W: Send event
    W->>S: 200 OK
    S->>A: 200 OK
    A->>S: INVITE sip:00046500729221@

SentryPeer Node to SentryPeerHQ

sequenceDiagram
    actor A as Attacker
    participant S as SentryPeer Node
    participant DS as Data Store
    participant HQ as SentryPeerHQ
    Note over DS: sqlite/json log/syslog (if enabled)
    Note over HQ: OAuth2 creds required.<br/> if using https://sentrypeer.com
    A->>S: SIP probe OPTIONS/REGISTER/etc
    S->>DS: Save event
    S->>HQ: Send event
    HQ->>S: 201 Created
    S->>A: 200 OK
    A->>S: INVITE sip:00046500729221@

Using the SentryPeer Node and SentryPeerHQ API

sequenceDiagram
    Actor U as User
    participant S as SentryPeer Node/HQ API
    Note over S: if enabled
    U->>S: GET /numbers
    S->>U: 200 OK Return all Phone numbers seen in database

Integrating with your own systems

sequenceDiagram
    participant D as Device
    participant P as PBX/ITSP/Carrier
    participant HQ as SentryPeer Node/HQ API
    participant N as NOC
    Note over P: Integration with <br/>SentryPeer needed
    Note over N: Consumes alerts
    Note over HQ: OAuth2 creds required<br/> if using SentryPeerHQ
    Note over P,HQ: API rate limiting if using SentryPeerHQ
    D->>P: SIP INVITE
    P->>HQ: Have you seen attackers call this number?
    HQ->>P: Yes, this has been seen on SentryPeer Nodes
    HQ->>N: WebHook/Email/Slack
    Note over HQ,N: Only if using SentryPeerHQ
    P->>D: I'm blocking this call. Sorry

🚧 Features

  • All code Free/Libre and Open Source Software
  • FAST
  • User owns their data
  • User can submit their own data if they want to (you need to enable p2p mode - -p)
  • User gets other users' data ONLY IF they opt in to submit their data to the pool
  • Embedded Distributed Hash Table (DHT) node using OpenDHT (-p cli option)
  • Peer to Peer sharing of collected bad_actors using OpenDHT (default off)
  • Peer to Peer data replication to receive collected bad_actors using OpenDHT (default off)
  • Set your own DHT bootstrap node (-b cli option)
  • Multithreaded
  • UDP transport
  • TCP transport
  • TLS transport
  • JSON logging to a file
  • SIP mode can be disabled. This allows you to run SentryPeer in API mode or DHT mode only etc. i.e. not as a honeypot, but as a node in the SentryPeer community or to just serve replicated data
  • SIP responsive mode can be enabled to collect data - cli / env flag
  • Local data copy for fast access - cli / env db location flag
  • Local API for fast access - cli / env flag
  • WebHook for POSTing bad actor json to a central location - cli / env flag
  • Integration with SentryPeerHQ via OAuth2 bearer token
  • Query API for IP addresses of bad actors
  • Query API for IPSET of bad actors
  • Query API for a particular IP address of a bad actor
  • Query API for attempted phone numbers called by bad actors
  • Query API for an attempted phone number called by a bad actor
  • Fail2Ban support via syslog as per feature request
  • Local sqlite database - feature / cli flag
  • Analytics - opt in
  • SDKs/libs for external access - CGRateS to start with or our own firewall with nftables
  • Small binary size for IoT usage
  • Cross-platform
  • Firewall options to use distributed data in real time
  • Container on Docker Hub for latest build
  • BGP agent to peer with for blackholing collected IP addresses (similar to Team Cymru Bogon Router Server Project)
  • SIP agent to return 404 or default destination for SIP redirects

Talks

Adoption

Matrix slack SentryPeer on Twitter

Design

I started this because I wanted to do C network programming as all the projects I use daily are in C like PostgreSQL, OpenLDAP, FreeSWITCH, OpenSIPS, Asterisk etc. See Episode 414: Jens Gustedt on Modern C for why C is a good choice. For those interested, see my full podcast show list (https://www.se-radio.net/team/gavin-henry/) for Software Engineering Radio

Docker

You can run the latest version of SentryPeer with Docker. The latest version is available from Docker Hub. Or build yourself:

sudo docker build --no-cache -t sentrypeer .
sudo docker run -d -p 5050:5060/tcp -p 5060:5060/udp -p 8082:8082 -p 4222:4222/udp sentrypeer:latest

Then you can check at http://localhost:8082/ip-addresses and http://localhost:8082/health-check to see if it's running.

Environment Variables

ENV SENTRYPEER_DB_FILE=/my/location/sentrypeer.db
ENV SENTRYPEER_API=1
ENV SENTRYPEER_WEBHOOK=1
ENV SENTRYPEER_WEBHOOK_URL=https://my.webhook.url/events
ENV SENTRYPEER_OAUTH2_CLIENT_ID=1234567890
ENV SENTRYPEER_OAUTH2_CLIENT_SECRET=1234567890
ENV SENTRYPEER_SIP_RESPONSIVE=1
ENV SENTRYPEER_SIP_DISABLE=1
ENV SENTRYPEER_SYSLOG=1
ENV SENTRYPEER_PEER_TO_PEER=1
ENV SENTRYPEER_BOOTSTRAP_NODE=mybootstrapnode.com
ENV SENTRYPEER_JSON_LOG=1
ENV SENTRYPEER_JSON_LOG_FILE=/my/location/sentrypeer_json.log
ENV SENTRYPEER_VERBOSE=1
ENV SENTRYPEER_DEBUG=1

Either set these in the Dockerfile or in your Dockerfile.env file or docker run command.

Settings any of these to 0 will also enable the feature. We don't care what you set it to, just that it's set.

Installation

Debian or Fedora packages are always available from the release page for the current version of SentryPeer:

https://github.com/SentryPeer/SentryPeer/releases

Homebrew (macOS or Linux):

We have a Homebrew Tap for this project (until we get more popular):

brew tap sentrypeer/sentrypeer
brew install sentrypeer

Alpine Linux:

SentryPeer is in testing on Alpine Linux, so you can install it with the following command:

apk -U add --no-cache -X https://dl-cdn.alpinelinux.org/alpine/edge/testing sentrypeer

Ubuntu Package

You can install SentryPeer from our Ubuntu PPD which is currently for Ubuntu 20 LTS (Focal Fossa):

sudo apt install software-properties-common
sudo add-apt-repository ppa:gavinhenry/sentrypeer
sudo apt-get update

This PPA can be added to your system manually by copying the lines below and adding them to your system's software sources:

deb https://ppa.launchpadcontent.net/gavinhenry/sentrypeer/ubuntu focal main 
deb-src https://ppa.launchpadcontent.net/gavinhenry/sentrypeer/ubuntu focal main

Then you can install SentryPeer:

sudo apt-get install sentrypeer

Building from source

You have two options for installation from source. CMake or autotools. Autotools is recommended at the moment. A release is an autotools build.

If you are a Fedora user, you can install this via Fedora copr:

https://copr.fedorainfracloud.org/coprs/ghenry/SentryPeer/

If you are going to build from this repository, you will need to have the following installed:

  • git, autoconf, automake and autoconf-archive (Debian/Ubuntu)
  • libosip2-dev (Debian/Ubuntu) or libosip2-devel (Fedora)
  • libsqlite3-dev (Debian/Ubuntu) or sqlite-devel (Fedora)
  • uuid-dev (Debian/Ubuntu) or libuuid-devel (Fedora)
  • libmicrohttpd-dev (Debian/Ubuntu) or libmicrohttpd-devel (Fedora)
  • libjansson-dev (Debian/Ubuntu) or jansson-devel (Fedora)
  • libpcre2-dev (Debian/Ubuntu) or pcre2-devel (Fedora)
  • libcurl-dev (Debian/Ubuntu) or libcurl-devel (Fedora)
  • libcmocka-dev (Debian/Ubuntu) or libcmocka-devel (Fedora) - for unit tests

Debian/Ubuntu:

sudo apt-get install git build-essential autoconf-archive autoconf automake libosip2-dev libsqlite3-dev \
libcmocka-dev uuid-dev libcurl4-openssl-dev libpcre2-dev libjansson-dev libmicrohttpd-dev 

Fedora:

sudo dnf install git autoconf automake autoconf-archive libosip2-devel libsqlite3-devel libcmocka-devel \
libuuid-devel libmicrohttpd-devel jansson-devel libcurl-devel pcre2-devel

macOS:

brew install git autoconf automake autoconf-archive libosip cmocka libmicrohttpd jansson curl pcre2

then (make check is highly recommended):

./bootstrap.sh
./configure
make
make check
make install

CMake:

cmake -S . -B build -DUNIT_TESTING=ON
cmake --build build
ctest --test-dir build
cmake --install build

Running SentryPeer

Once built, you can run like so to start in debug mode, respond to SIP probes, enable the RESTful API, enable WebHooks and enable syslog logging (use a package if you want systemd):

./sentrypeer -draps
SentryPeer node id: e5ac3a88-3d52-4e84-b70c-b2ce83992d02
Starting sentrypeer...
API mode enabled, starting http daemon...
SIP mode enabled...
Peer to Peer DHT mode enabled...
Starting peer to peer DHT mode using OpenDHT-C lib version '2.4.0'...
Configuring local address...
Creating sockets...
Binding sockets to local address...
Listening for incoming UDP connections...
SIP responsive mode enabled. Will reply to SIP probes...
Listening for incoming TCP connections...
Peer to peer DHT mode started.
DHT InfoHash for key 'bad_actors' is: 14d30143330e2e0e922ed4028a60ff96a59800ad
Bootstrapping the DHT
Waiting 5 seconds for bootstrapping to bootstrap.sentrypeer.org...
Listening for changes to the bad_actors DHT key

when you get a probe request, you can see something like the following in the terminal:

Received (411 bytes): OPTIONS sip:[email protected] SIP/2.0
Via: SIP/2.0/UDP 91.223.3.152:5173;branch=z9hG4bK-515761064;rport
Content-Length: 0
From: "sipvicious"<sip:[email protected].1>;tag=6434396633623535313363340131363131333837383137
Accept: application/sdp
User-Agent: friendly-scanner
To: "sipvicious"<sip:[email protected].1>
Contact: sip:[email protected]:5173
CSeq: 1 OPTIONS
Call-ID: 679894155883566215079442
Max-Forwards: 70


read_packet_buf size is: 1024: 
read_packet_buf length is: 468: 
bytes_received size is: 411: 

Bad Actor is:
Event Timestamp: 2021-11-23 20:13:36.427515810
Event UUID: fac3fa20-8c2c-445b-8661-50a70fa9e873
SIP Message: OPTIONS sip:[email protected] SIP/2.0
Via: SIP/2.0/UDP 91.223.3.152:5173;branch=z9hG4bK-515761064;rport
From: "sipvicious" <sip:[email protected].1>;tag=6434396633623535313363340131363131333837383137
To: "sipvicious" <sip:[email protected].1>
Call-ID: 679894155883566215079442
CSeq: 1 OPTIONS
Contact: <sip:[email protected]:5173>
Accept: application/sdp
User-agent: friendly-scanner
Max-forwards: 70
Content-Length: 0


Source IP: 193.107.216.27
Called Number: 100
SIP Method: OPTIONS
Transport Type: UDP
User Agent: friendly-scanner
Collected Method: responsive
Created by Node Id: fac3fa20-8c2c-445b-8661-50a70fa9e873
SentryPeer db file location is: sentrypeer.db
Destination IP address of UDP packet is: xx.xx.xx.xx

You can see the data in the sqlite3 database called sentrypeer.db using sqlitebrowser or sqlite3 command line tool.

Here's a screenshot of the database opened using sqlitebrowser (it's big, so I'll just link to the image):

sqlitebrowser exploring the sentrypeer.db

WebHook

There is a WebHook to POST a JSON Log Format payload to SentryPeerHQ or your own WebHook endpoint. The WebHook is not enabled by default. You can configure the WebHook URL via -w or set the SENTRYPEER_WEBHOOK_URL env variable.

If using SentryPeer SaaS you need to get your client id and client secret from the Dashboard and set the SENTRYPEER_OAUTH2_CLIENT_ID and SENTRYPEER_OAUTH2_CLIENT_SECRET env variables or use the -i and -c flags.

RESTful API

The RESTful API is complete for the current use cases. Please click the Watch button to be notified when more things come out :-)

Endpoint /health-check

Query the API to see if it's alive:

curl -v -H "Content-Type: application/json" http://localhost:8082/health-check

* Connected to localhost (127.0.0.1) port 8082 (#0)
> GET /health-check HTTP/1.1
> Host: localhost:8082
> User-Agent: curl/7.79.1
> Accept: */*
> Content-Type: application/json
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Date: Mon, 24 Apr 2022 11:16:25 GMT
< Content-Type: application/json
< Access-Control-Allow-Origin: *
< X-Powered-By: SentryPeer
< X-SentryPeer-Version: 1.4.0
< Content-Length: 81
< 
{
  "status": "OK",
  "message": "Hello from SentryPeer!",
  "version": "1.0.0"
}

Endpoint /ip-addresses

List all the IP addresses that have been seen by SentryPeer:

curl -v -H "Content-Type: application/json" http://localhost:8082/ip-addresses

* Connected to localhost (127.0.0.1) port 8082 (#0)
> GET /ip-addresses HTTP/1.1
> Host: localhost:8082
> User-Agent: curl/7.79.1
> Accept: */*
> Content-Type: application/json
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Date: Mon, 24 Jan 2022 11:17:05 GMT
< Content-Type: application/json
< Access-Control-Allow-Origin: *
< X-Powered-By: SentryPeer
< X-SentryPeer-Version: 1.0.0
< Content-Length: 50175
< 
{
  "ip_addresses_total": 396,
  "ip_addresses": [
    {
      "ip_address": "193.107.216.27",
      "seen_last": "2022-01-11 13:30:48.703603359",
      "seen_count":	"1263"
    },
    {
      "ip_address": "193.46.255.152"
      "seen_last": "2022-01-11 13:28:27.348926406",
      "seen_count": "3220"      
    }
    ...
  ]
}

Endpoint /ip-addresses/{ip-address}

Query a single IP address:

curl -v -H "Content-Type: application/json" http://localhost:8082/ip-addresses/8.8.8.8

* Connected to localhost (127.0.0.1) port 8082 (#0)
> GET /ip-addresses/8.8.8.8 HTTP/1.1
> Host: localhost:8082
> User-Agent: curl/7.79.1
> Accept: */*
> Content-Type: application/json
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 404 Not Found
< Date: Mon, 24 Jan 2022 11:17:57 GMT
< Content-Type: application/json
< Access-Control-Allow-Origin: *
< X-Powered-By: SentryPeer
< X-SentryPeer-Version: 1.0.0
< Content-Length: 33
< 
* Connection #0 to host localhost left intact
{
  "message": "No bad actor found"
}

Endpoint /numbers

List all the called numbers that have been seen by SentryPeer:

curl -v -H "Content-Type: application/json" http://localhost:8082/numbers

* Connected to localhost (127.0.0.1) port 8082 (#0)
> GET /numbers HTTP/1.1
> Host: localhost:8082
> User-Agent: curl/8.0.1
> Accept: */*
> Content-Type: application/json
< Date: Thu, 27 Jul 2023 11:10:35 GMT
< Content-Type: application/json
< Access-Control-Allow-Origin: *
< X-Powered-By: SentryPeer
< X-SentryPeer-Version: 4.0.0
< Content-Length: 31746258


 {
  "called_numbers_total": 244850,
  "called_numbers": [
    {
      "called_number": "981046500729221",
      "seen_last": "2023-07-27 12:06:59.388055505",
      "seen_count": "451"
    },
    {
      "called_number": "81046500729221",
      "seen_last": "2023-07-27 12:05:19.206442003",
      "seen_count": "453"
    },
    {
      "called_number": "100",
      "seen_last": "2023-07-27 11:59:57.679798597",
      "seen_count": "17335"
    },
    ....

Endpoint /numbers/{phone-number}

Query a phone number a bad actor tried to call with optional + prefix:

curl -v -H "Content-Type: application/json" http://localhost:8082/numbers/8784946812410967

* Connected to localhost (127.0.0.1) port 8082 (#0)
> GET /numbers/8784946812410967 HTTP/1.1
> Host: localhost:8082
> User-Agent: curl/7.79.1
> Accept: */*
> Content-Type: application/json
> 
< HTTP/1.1 200 OK
< Date: Mon, 24 Jan 2022 11:19:53 GMT
< Content-Type: application/json
< Access-Control-Allow-Origin: *
< X-Powered-By: SentryPeer
< X-SentryPeer-Version: 1.0.0
< Content-Length: 46
< 
{
  "phone_number_found": "8784946812410967"
}

Syslog and Fail2ban

With sentrypeer -s, you parse syslog and use Fail2Ban to block the IP address of the bad actor:

Nov 30 21:32:16 localhost.localdomain sentrypeer[303741]: Source IP: 144.21.55.36, Method: OPTIONS, Agent: sipsak 0.9.7

JSON Log Format

With sentrypeer -j, you can produce a JSON log file of the bad actor's IP address and the phone number they tried to call plus other metadata (set a custom log file location with -l):

{
   "app_name":"sentrypeer",
   "app_version":"v1.4.0",
   "event_timestamp":"2022-02-22 11:19:15.848934346",
   "event_uuid":"4503cc92-26cb-4b3e-bb33-69a83fa09321",
   "created_by_node_id":"4503cc92-26cb-4b3e-bb33-69a83fa09321",
   "collected_method":"responsive",
   "transport_type":"UDP",
   "source_ip":"45.134.144.128",
   "destination_ip":"XX.XX.XX.XX",
   "called_number":"0046812118532",
   "sip_method":"OPTIONS",
   "sip_user_agent":"friendly-scanner",
   "sip_message":"full SIP message"
}

Command Line Options

./sentrypeer -h
Usage: sentrypeer [-h] [-V] [-w https://api.example.com/events] [-j] [-p] [-b bootstrap.example.com] [-i OAuth_2_Client_ID] [-c OAuth_2_Client_Secret] [-f fullpath for sentrypeer.db] [-l fullpath for sentrypeer_json.log] [-r] [-R] [-a] [-s] [-v] [-d]

Options:
  -h,      Print this help
  -V,      Print version
  -f,      Set 'sentrypeer.db' location or use SENTRYPEER_DB_FILE env
  -j,      Enable json logging or use SENTRYPEER_JSON_LOG env
  -p,      Enable Peer to Peer mode or use SENTRYPEER_PEER_TO_PEER env
  -b,      Set Peer to Peer bootstrap node or use SENTRYPEER_BOOTSTRAP_NODE env
  -i,      Set OAuth 2 client ID or use SENTRYPEER_OAUTH2_CLIENT_ID env to get a Bearer token for WebHook
  -c,      Set OAuth 2 client secret or use SENTRYPEER_OAUTH2_CLIENT_SECRET env to get a Bearer token for WebHook
  -a,      Enable RESTful API mode or use SENTRYPEER_API env
  -w,      Set WebHook URL for bad actor json POSTs or use SENTRYPEER_WEBHOOK_URL env
  -r,      Enable SIP responsive mode or use SENTRYPEER_SIP_RESPONSIVE env
  -R,      Disable SIP mode completely or use SENTRYPEER_SIP_DISABLE env
  -l,      Set 'sentrypeer_json.log' location or use SENTRYPEER_JSON_LOG_FILE env
  -s,      Enable syslog logging or use SENTRYPEER_SYSLOG env
  -v,      Enable verbose logging or use SENTRYPEER_VERBOSE env
  -d,      Enable debug mode or use SENTRYPEER_DEBUG env

Report bugs to https://github.com/SentryPeer/SentryPeer/issues

See https://sentrypeer.org for more information.

IPv6 Multicast Address

The project has an IANA IPv6 multicast address for the purpose of sending messages between SentryPeer peers.

Addresses: FF0X:0:0:0:0:0:0:172
Description: SentryPeer
Contact: Gavin Henry <ghenry at sentrypeer.org>
Registration Date: 2022-01-26

Please see http://www.iana.org/assignments/ipv6-multicast-addresses

The assigned variable-scope address -- which can also be listed as "FF0X::172" for short -- the "X" denotes any possible scope.

License

AGPLv3

Great reading - How to choose a license for your own work

This work is dual-licensed under GPL 2.0 and GPL 3.0.

SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only

Contributing

See CONTRIBUTING

Project Website

https://sentrypeer.org

Trademark

SENTRYPEER is a registered trademark of Gavin Henry

Questions, Bug reports, Feature Requests

New issues can be raised at:

https://github.com/SentryPeer/SentryPeer/issues

It's okay to raise an issue to ask a question.

Special Thanks

Special thanks to:

Sponsorship

Special thanks to Deutsche Telekom Security GmbH for sponsoring us! Very kind!

sentrypeer's People

Contributors

davidtmiller avatar dependabot[bot] avatar ghenry avatar joejag avatar kerleyt00 avatar snyk-bot avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

sentrypeer's Issues

openwrt

Just wanted to give you a thumbs up.

An openwrt package would be nice. Also despite sqlite being nice there are other database engines that might be more efficient, like good ole berkeley db.

Peer to Peer mode questions

Hello,

I follow the instruction 'Building from source' but do not see that p2p mode is started.
May be I should configure with some options ?

health-check is fine but I do not see any bad actors ip addresses.

In console:
'Failed to prepare statement: no such table: honey'

sentrypeer -drawps

SentryPeer node id: 5d9c4356-4471-402a-af0c-93b0bb1fcda8
Starting sentrypeer...
API mode enabled, starting http daemon...
Web GUI mode enabled...
SIP mode enabled...
Configuring local address...
Creating UDP socket...
Binding socket to local address...
Listening for incoming connections...
SIP responsive mode enabled. Will reply to SIP probes...

GET /ip-addresses from Client IP: 127.0.0.1
Checking url: /ip-addresses, against route: /health-check
Checking url: /ip-addresses, against route: /
Checking url: /ip-addresses, against route: /ip-addresses
Route is an exact match.
Failed to prepare statement: no such table: honey
Failed to select bad actors from database

Fail2ban Integration via syslog

I am new to SentryPeer, but not to honeypots, firewalls etc.

My favorite tools are netfilter and fail2ban. I would like SentryPeer to work easily with fail2ban. That should be simple. Just syslog() the attackes, let syslog add the date stamp.

A typical one line log might look like:

sentrypeer: fromip: 192.168.1.1 type: UDP message: {REGISTER|OPTIONS} agent: sipvicious

With that I can write a fail2ban rule, block them, and report them, automagically.

Bug: Issue in documentation - Incorrect port used in docker URL

The URL found in the readme file is incorrect for docker. Running CURL with the provided URL will produce a Connection refused error.

Expected Behaviour

When running the command curl to check that the system is working. We should see the following:

<html><body><h1>Hello from SentryPeer!</h1><h2>All is well!</h2></body></html>

Current Behaviour

Currently the documentation for docker lists the following URLs for checking that the system is working. However the URL will produce the following:

curl: (7) Failed to connect to localhost port 5060: Connection refused

Possible Solution

Change URL to http://localhost:8082/health-check from http://localhost:5060/health-check

Steps to Reproduce (for bugs)

  1. The docker command has no mention of TCP ports on 5060.
  2. Running curl will produce a: "connection refused" error when running the command
  3. Linux troubleshooting will not show the TCP5060 port being open.

###Output from the docker command

ddc8e7bd1dee   sentrypeer/sentrypeer             "./sentrypeer -rawps…"   13 minutes ago   Up 13 minutes          0.0.0.0:4222->4222/udp, :::4222->4222/udp, 0.0.0.0:5060->5060/udp, :::5060->5060/udp, 0.0.0.0:8082->8082/tcp, :::8082->8082/tcp   infallible_hertz

`

###Output from Netstat not showing any TCP ports open on 5060

udp        0      0 0.0.0.0:5060            0.0.0.0:*
udp6       0      0 :::5060                 :::*

Context

Was attempting to confirm that the system was working in a docker container

Record dest_ip and being bound to multiple IPs

Consider supporting multiple IPs being bound to the SentryPeer instance.

Either many IPs bound to eth0, or bound to the loopback and routed to the instance. Record the IP the bad actor connected to in a new dest_ip column.

This would allow someone to route a subnet, such as a /29 or /26 to an instance and watch actors scan the subnet.

Bug: /numbers resource doesn't return JSON if non-numbers have made their way into db

e.g. as we're saving username in To: header. We either return numbers only from SQL search OR only allow numbers to be saved in the db:

called_number: humtum*d
called_number: 4229
called_number: locext126
called_number: 7452679
called_number: eduardobatista
called_number: daniel
called_number: 9046386187
called_number: )ƒ�P…
called_number: 88707154
called_number: 4565040
called_number: 320611861
called_number: 09701138
called_number: strenia
called_number: edrixa
called_number: nexistelecom
called_number: 975456
called_number: 294321
called_number: 7914
called_number: 902129550060
called_number: father
called_number: saty*Salemsaty
called_number: BILAL
called_number: mahbub
called_number: 8ub–q
called_number: 88812
called_number: 460/
called_number: 358136313
called_number: 4286
called_number: �8'
Failed to append called_number to json array

Enhancement: support for Arch Linux

Is your feature request related to a problem? Please describe.
It could be very nice if SentryPeer could support Arch Linux in order to be used on distros as BlackArch or Athena OS. Is it possible to build it from source? Which are the right dependencies to install on Arch Linux for building SentryPeer?

Currently I built it by using the following dependencies:

'autoconf' 'autoconf-archive' 'automake' 'cmocka' 'curl' 'git' 'jansson' 'libmicrohttpd' 'libosip2 (AUR)' 'opendht' 'pcre2' 'sqlite' 'uuid'

The main problem is the usage of OpenDHT because I see that SentyPeer uses opendht/opendht_c.h header file, while opendht Arch Linux package provides opendht.h Do they contain the same code? On OpenGHT project I cannot find the file opendht_c.h on the source files.

Furthermore, configure.ac checks for opendht-c package, while on Arch Linux the package name is opendht (see:

PKG_CHECK_MODULES([OPENDHT_C], [opendht-c], [
).

If I try to build with all these changes for enabling OpenDHT, I get the error:

gcc -DHAVE_CONFIG_H -I.    -Wall -Werror -Wextra -Wpedantic -pedantic -Wformat=2 -Wno-unused-parameter -Wshadow -Wwrite-strings -Wstrict-prototypes -Wold-style-definition -Wnested-externs -Wmissing-include-dirs -Wredundant-decls -std=c18 -D_FORTIFY_SOURCE=2 -fpie -fpic -g3 -O2 -fstack-protector-strong -grecord-gcc-switches -Werror=format-security -Werror=implicit-function-declaration -Wmisleading-indentation  -g -O2 -pthread -I/usr/include/p11-kit-1  -MT src/regex_match.o -MD -MP -MF $depbase.Tpo -c -o src/regex_match.o src/regex_match.c &&\
mv -f $depbase.Tpo $depbase.Po
In file included from /usr/include/opendht/infohash.h:22,
                 from /usr/include/opendht/dhtrunner.h:24,
                 from /usr/include/opendht.h:21,
                 from src/conf.h:28,
                 from src/http_daemon.c:14:
/usr/include/opendht/rng.h:21:10: fatal error: random: No such file or directory
   21 | #include <random>
      |          ^~~~~~~~
compilation terminated.
make[1]: *** [Makefile:1097: src/http_daemon.o] Error 1
make[1]: *** Waiting for unfinished jobs....
In file included from /usr/include/opendht/infohash.h:22,
                 from /usr/include/opendht/dhtrunner.h:24,
                 from /usr/include/opendht.h:21,
                 from src/conf.h:28,
                 from src/regex_match.c:22:

and I'm not sure if #include <random> works by gcc or only by g++ with -std=c++11 param. Where I can switch from gcc to g++?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.