Dangling DNS: Announcekit

Another service vulnerable to subdomain takeover

This post is the write-up about subdomain takeover vulnerable service Announcekit that I found. Although this is a paid service, It's possible to create PoC without having to purchase the service during trial period.

Announcekit.app

AnnounceKit is a user communication platform that helps you announce product updates to increase feature adoption.

Service Detection

CNAME record should be pointing to cname.announcekit.app

akit-tk.melbadry9.xyz. 42 IN CNAME cname.announcekit.app.

I use the following Nuclei template to check for possible candidates.

id: detect-announcekit
info:
name: Announcekit service detection
author: melbadry9
severity: info
tags: dns
dns:
- name: "{{FQDN}}"
type: CNAME
class: inet
recursion: true
retries: 2
matchers:
- type: word
words:
- "cname.announcekit.app"

Takeover Detection

To verify whether subdomain takeover may be possible we should see a similar error page.

Vulnerable Subdomain Error Page

Fingerprint

To detect vulnerable subdomain we use the following fingerprint based on HTTP response we confirm whether subdomain is vulnerable or not.

{
"status_code": 404,
"text": [
"Error 404 - AnnounceKit"
]
}

I use the following Nuclei template to check for vulnerable subdomain.

id: announcekit-takeover
info:
name: Announcekit Takeover Detection
author: melbadry9
severity: high
tags: takeover
reference: https://announcekit.app/docs/custom-host
requests:
- method: GET
raw:
- |
GET / HTTP/2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
redirects: true
max-redirects: 1
matchers-condition: and
matchers:
- type: word
words:
- 'Error 404 - AnnounceKit'
- type: status
status:
- 404

Takeover Steps

  • Register an account on AnnounceKit

  • Go to https://announcekit.app/dashboard/settings/feeds

  • Set Custom Hostname to subdomain we want to takeover akit-tk.melbadry9.xyz

Takeover Steps
  • Visit https://kit-tk.melbadry9.xyz

PoC

Can I takeover XYZ? - Issue

I have opened an issue on GitHub regarding this service: