mirror of
https://github.com/Lissy93/web-check.git
synced 2024-11-30 04:05:29 +01:00
72 lines
2.2 KiB
JavaScript
72 lines
2.2 KiB
JavaScript
|
const fetch = require('node-fetch');
|
||
|
|
||
|
|
||
|
const endpoints = {
|
||
|
dnsRecords: 'https://api.securitytrails.com/v1/domain/{address}',
|
||
|
subDomains: 'https://api.securitytrails.com/v1/domain/{address}/subdomains?include_inactive=true',
|
||
|
};
|
||
|
|
||
|
const apiKeys = {
|
||
|
shodan: process.env.SHODAN_API_KEY,
|
||
|
securityTrails: process.env.SECURITY_TRAILS_API_KEY,
|
||
|
};
|
||
|
|
||
|
const makeEndpoint = (endpoint, address) => endpoint.replace('{address}', address);
|
||
|
|
||
|
const errorObject = (msg, status) => {
|
||
|
return {
|
||
|
statusCode: status || 500,
|
||
|
body: JSON.stringify({ error: true, errorMsg: msg }),
|
||
|
}
|
||
|
};
|
||
|
|
||
|
/* Fetches list of DNS records for a given URL from SecurityTrails API */
|
||
|
const getDnsInfo = async (url) => {
|
||
|
const stOptions = {
|
||
|
method: 'GET',
|
||
|
headers: { Accept: 'application/json', APIKEY: apiKeys.securityTrails }
|
||
|
};
|
||
|
const dnsInfoRequest = await fetch(makeEndpoint(endpoints.dnsRecords, url), stOptions);
|
||
|
const dnsInfoResponse = await dnsInfoRequest.json();
|
||
|
if (dnsInfoResponse) return null;
|
||
|
return dnsInfoResponse?.current_dns;
|
||
|
};
|
||
|
|
||
|
/* Fetches a list of a domain's sub-domains from SecurityTrails API */
|
||
|
const getSubDomains = async (url) => {
|
||
|
const stOptions = {
|
||
|
method: 'GET',
|
||
|
headers: { Accept: 'application/json', APIKEY: apiKeys.securityTrails }
|
||
|
};
|
||
|
const subDomainRequest = await fetch(makeEndpoint(endpoints.subDomains, url), stOptions);
|
||
|
const subDomainResponse = await subDomainRequest.json();
|
||
|
if (!subDomainResponse.subdomains) return null;
|
||
|
return {
|
||
|
count: subDomainResponse?.subdomain_count,
|
||
|
list: subDomainResponse?.subdomains,
|
||
|
};
|
||
|
};
|
||
|
|
||
|
exports.handler = async (event, context) => {
|
||
|
const addressParam = event.queryStringParameters.address;
|
||
|
if (!addressParam) return errorObject('An address must be specified');
|
||
|
const address = decodeURIComponent(addressParam)
|
||
|
.replaceAll('https://', '')
|
||
|
.replaceAll('http://', '');
|
||
|
|
||
|
try {
|
||
|
const results = {};
|
||
|
if (apiKeys.securityTrails) {
|
||
|
results.dnsRecords = await getDnsInfo(address);
|
||
|
results.subDomains = await getSubDomains(address);
|
||
|
}
|
||
|
|
||
|
return {
|
||
|
statusCode: 200,
|
||
|
body: JSON.stringify(results),
|
||
|
};
|
||
|
} catch (error) {
|
||
|
return errorObject('Failed to fetch data');
|
||
|
}
|
||
|
};
|