DEV Community

Cover image for Nuclei unleashed - writing first exploit
Grzegorz Piechnik
Grzegorz Piechnik

Posted on

Nuclei unleashed - writing first exploit

When conducting penetration tests, it happens that we use multiple tools simultaneously. To make writing more exploits for known vulnerabilities consistent, it is necessary to use a single format. One framework that has such a task is nuclei.

What is nuclei?

In simple terms, it is a network vulnerability framework that performs the appropriate operations based on defined templates in yaml format. It is these templates that we will talk about today. With their help we can scan various network protocols such as TCP, DNS, HTTP, SSL, File or many more.

Let's write our first template

To start with, let's choose a template type. In order not to go into more detailed examples, let's assume that we will create a template of type osint (white intelligence) in which we will check if a user with a given name (or page) exists. This is important because it is now possible on your Facebook page to define a custom name. For private accounts, there is no such possibility.

Let's start by defining the basic information of the template.

id: facebook-page

info:
  name: Facebook.com page Name Information - Detect
  author: gpiechnik2
  description: Facebook.com page name information check was conducted.
  severity: info
  classification:
    cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:N
    cvss-score: 0.0
    cwe-id: CWE-200
  tags: osint,osint-business,osint-social
  metadata:
    max-request: 1
Enter fullscreen mode Exit fullscreen mode

The next step is to define the corresponding request and two assertions - based on the status and the response. The response is interesting in that we perform it on the header and status itself. Facebook handles statuses relatively well, so we used that. The same is true of the "Link" header. It is specific and quite stable.

self-contained: true
http:
  - raw:
    - |
      GET https://facebook.com/{{user}} HTTP/2
      Host: www.facebook.com
      User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.5672.127 Safari/537.36
      Sec-Fetch-Mode: navigate
      Accept-Language: en-US,en;q=0.9

    matchers-condition: and
    matchers:
      - type: status
        status:
          - 200

      - type: word
        part: header
        words:
          - "Link: <https://www.facebook.com/{{user}}>"
Enter fullscreen mode Exit fullscreen mode

We had to add the appropriate headers, because without them we would be blocked or receive a response in a different language than we should.

The full scenario is as follows:

id: facebook-page

info:
  name: Facebook.com page Name Information - Detect
  author: gpiechnik2
  description: Facebook.com page name information check was conducted.
  severity: info
  classification:
    cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:N
    cvss-score: 0.0
    cwe-id: CWE-200
  tags: osint,osint-business,osint-social
  metadata:
    max-request: 1

self-contained: true
http:
  - raw:
    - |
      GET https://facebook.com/{{user}} HTTP/2
      Host: www.facebook.com
      User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.5672.127 Safari/537.36
      Sec-Fetch-Mode: navigate
      Accept-Language: en-US,en;q=0.9

    matchers-condition: and
    matchers:
      - type: status
        status:
          - 200

      - type: word
        part: header
        words:
          - "Link: <https://www.facebook.com/{{user}}>"
Enter fullscreen mode Exit fullscreen mode

Getting started

The first step is to validate the script to check that everything is properly defined inside it.

figaro@pop-os ~/> nuclei -validate facebook-page.yaml
                     __     _
   ____  __  _______/ /__  (_)
  / __ \/ / / / ___/ / _ \/ /
 / / / / /_/ / /__/ /  __/ /
/_/ /_/\__,_/\___/_/\___/_/   v2.9.1

        projectdiscovery.io

[INF] All templates validated successfully
Enter fullscreen mode Exit fullscreen mode

When we get a message on the screen that everything is OK, we can move on to running the target script. First, let's check the operation on an existing user profile.

figaro@pop-os ~/> nuclei -t facebook-page.yaml -var user=grzesiek.piechnik.9
                     __     _
   ____  __  _______/ /__  (_)
  / __ \/ / / / ___/ / _ \/ /
 / / / / /_/ / /__/ /  __/ /
/_/ /_/\__,_/\___/_/\___/_/   v2.9.1

        projectdiscovery.io

[INF] Using Nuclei Engine 2.9.1 (latest)
[INF] Using Nuclei Templates 9.4.2 (latest)
[INF] Templates added in last update: 78
[INF] Templates loaded for scan: 1
[facebook-page] [http] [info] https://facebook.com/grzesiek.piechnik.9
Enter fullscreen mode Exit fullscreen mode

As you can see above, it has been found. So let's try to check some company website. Let's make it a Twitter page (TwitterInc).

figaro@pop-os ~/> nuclei -t facebook-page.yaml -var user=TwitterInc
                     __     _
   ____  __  _______/ /__  (_)
  / __ \/ / / / ___/ / _ \/ /
 / / / / /_/ / /__/ /  __/ /
/_/ /_/\__,_/\___/_/\___/_/   v2.9.1

        projectdiscovery.io

[INF] Using Nuclei Engine 2.9.1 (latest)
[INF] Using Nuclei Templates 9.4.2 (latest)
[INF] Templates added in last update: 78
[INF] Templates loaded for scan: 1
[facebook-page] [http] [info] https://facebook.com/TwitterInc
Enter fullscreen mode Exit fullscreen mode

We received again a positive response nuclei in the console. What happens when we enter a page name that does not exist?

figaro@pop-os ~/> nuclei -t facebook-page.yaml -var user=TwitterIncDoesNotExist
                     __     _
   ____  __  _______/ /__  (_)
  / __ \/ / / / ___/ / _ \/ /
 / / / / /_/ / /__/ /  __/ /
/_/ /_/\__,_/\___/_/\___/_/   v2.9.1

        projectdiscovery.io

[INF] Using Nuclei Engine 2.9.1 (latest)
[INF] Using Nuclei Templates 9.4.2 (latest)
[INF] Templates added in last update: 78
[INF] Templates loaded for scan: 1
[INF] No results found. Better luck next time!
Enter fullscreen mode Exit fullscreen mode

As you can see, everything works correctly. Remember that you can add the created templatey to the remote repository.

Top comments (0)