2 Přístup k API

2.1 Nastavení shellu

Získejte API token ve webovém rozhraní na stránce uživatelského profilu (User > Profile > API key > Generate). Nastavte shell prostředí pro přístup k API:

export APIKEY=""
export URL="https://sner-hub.flab.cesnet.cz"
alias snerapi='curl -s -H "X-API-KEY: $APIKEY"'

2.2 Dotaz na jednoho hostitele

Žádná služba by neměla být viditelná z veřejného Internetu na hlavních IdP nebo Directory serverech.

snerapi -XPOST \
  "$URL/api/v2/public/storage/host" \
  --json '{"address": "203.0.113.50"}' | jq
{
  "address": "203.0.113.50",
  "hostname": "dc1.example.org",
  "services": [
    {
      "info": "extrainfo: Anonymous bind OK",
      "notes": [
        {
          "data": "[\"cpe:/a:openldap:openldap\"]",
          "xtype": "cpe"
        },
        {
          "data": "{\"product\": \"OpenLDAP\", \"version\": \"2.2.X - 2.3.X\"}"
          "xtype": "nmap.banner_dict"
        }
      ],
      "port": 636,
      "proto": "tcp",
      "state": "open:syn-ack"
    }
  ]
}

2.3 Dotaz na více hostitelů

Zkontrolujte služby dostupné v segmentu sítě katedry.

snerapi -XPOST \
  "$URL/api/v2/public/storage/range" \
  --json '{"cidr": "203.0.113.0/26"}' | jq
[
  {
    "address": "203.0.113.3",
    "hostname": "dhcp-wk1.dept.example.org",
    "services": [
      {
        "info": "product: OpenSSH version: 8.4p1 Debian 5+deb11u1 extrainfo: protocol 2.0 ostype: Linux",
        "port": 443,
        "proto": "tcp",
        "state": "open:syn-ack"
      },
      {
        "port": 22,
        "proto": "tcp",
        "state": "open:syn-ack"
      }
    ]
  },
  {
    "address": "203.0.113.1",
    "hostname": "gw.dept.example.org",
    "services": [
      {
        "port": 179,
        "proto": "tcp",
        "state": "open:syn-ack"
      }
    ]
  }
]

2.4 Seznam služeb s filtrováním

Záložní infrastruktura by neměla být dostupná z veřejného Internetu. Podrobnou syntaxi filtru najdete ve specifikaci filtru.

snerapi -XPOST \
  "$URL/api/v2/public/storage/servicelist" \
  --json '{"filter": "Service.port==\"445\" AND Service.state ilike \"open:%\""}' | jq
[
  {
    "address": "2001:db8::71",
    "info": "product: Samba smbd version: 3.X - 4.X extrainfo: workgroup: UCN hostname: BACKUP-EXAMPLE",
    "port": 445,
    "proto": "tcp",
    "state": "open:syn-ack"
  }
]

2.5 Výpis endpointů s konkrétním produktem

Seznam populárních databázových systémů vystavených do veřejného Internetu.

snerapi -XPOST \
  "$URL/api/v2/public/storage/versioninfo" \
  --json '{"product":"mariadb"}' | jq
[
  {
    "host_address": "203.0.113.30",
    "host_hostname": "serverx.example.org",
    "service_port": 3306,
    "service_proto": "tcp",
    "product": "mariadb",
    "version": "10.3.38",
    "extra": {
      "full_version": "5.5.5-10.3.38-MariaDB-1:10.3.38+maria~ubu2004-log"
    }
  }
]

2.6 Přehled produktů podle hostitelů

snerapi -XPOST \
  "$URL/api/v2/public/storage/versioninfo" | jq -s \
  '.[] | map({product,host_address}) | group_by(.product) | map({product: .[0].product, host_address: map(.host_address)})'
[
  {
    "product": "mariadb",
    "host_address": [
      "203.0.113.30"
    ]
  },
  {
    "product": "zookeeper",
    "host_address": [
      "203.0.113.30",
      "2001:db8::30"
    ]
  }
]

2.7 Dotaz na zranitelnosti s filtrováním

Podrobnou syntaxi filtru najdete ve specifikaci filtru.

Získejte všechny zranitelnosti s alespoň střední závažností:

snerapi -XPOST \
  "$URL/api/v2/public/storage/vulnlist" \
  --json '{"filter": "Vuln.severity not_in [\"info\", \"low\"]"}' | jq
[
  {
    "address": "203.0.113.30",
    "data": "{\"template-id\": \"ftp-anonymous-login\", ... }",
    "descr": "## Popis\n\nAnonymní FTP přístup umožňuje komukoliv ...",
    "hostname": "example.scanned.test",
    "name": "FTP Anonymous Login",
    "port": 21,
    "proto": "tcp",
    "refs": [
      "URL-https://tools.ietf.org/html/rfc2577"
    ],
    "severity": "medium",
    "xtype": "nuclei.ftp-anonymous-login"
  }
]

Získejte všechny zranitelnosti na hostitelích v síti X:

snerapi -XPOST \
  "$URL/api/v2/public/storage/vulnlist" \
  --json '{"filter": "Host.address inet_in \"203.0.113.0/26\""}' | jq
[
  {
    "address": "203.0.113.11",
    "data": "{\"template-id\": \"openssh-detect\", ...",
    "descr": "## Popis\n\nDetekována služba OpenSSH...",
    "hostname": "example.scanned.test",
    "name": "OpenSSH Service - Detect",
    "port": 22,
    "proto": "tcp",
    "refs": [
      "URL-http://www.openwall.com/lists/oss-security/2016/08/01/2",
      "URL-http://www.openwall.com/lists/oss-security/2018/08/15/5",
      "URL-http://seclists.org/fulldisclosure/2016/Jul/51",
      "URL-https://nvd.nist.gov/vuln/detail/CVE-2016-6210",
      "URL-https://nvd.nist.gov/vuln/detail/CVE-2018-15473"
    ],
    "severity": "info",
    "via_target": "203.0.113.11",
    "xtype": "nuclei.openssh-detect"
  }
]
Task Runner