PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fake Google DNS lookup



hardy
18.08.2019, 16:41
Hey,

ich frage mal in die runde, ob jemand eine idee hat, wie man eine DNS Abfrage über den Google DNS 8.8.8.8 lokal faken kann?

ich möchte folgendes erreichen:

nslookup domain 8.8.8.8
Server: dns.google
Address: 8.8.8.8

Non-authoritative answer:
Name: domain
Addresses: IP


Also der befehl nslookup domain 8.8.8.8 soll eine IP zurückgeben, welche ich lokal definieren kann. (Auf einem Windows System)

Hoffe jemand kann mir helfen ;)

4nn8
18.08.2019, 19:48
Ganz einfach!
Erst mal einen neuen Netzwerkadapter hinzufügen, damit 8.8.8.8 auf Localhost geroutet wird.
Dazu Geräte-Manager öffnen, irgendwas auswählen sonst fehlt die Aktion.
Dann Aktion -> Legacyhardware hinzufügen -> aus einer Liste wählen -> Netzwerkadapter -> Microsoft -> Microsoft Loopbackadapter.
Dann dem PC die 8.8.8.8 zuweisen unter Systemsteuerung -> Netzwerk- und Freigabecenter -> Adaptereinstellungen -> Rechtsklick auf den neu-erstellten Loopbackadapter -> Eigenschaften -> IPv4 -> Eigenschaften -> Folgende IP-Adresse verwenden: 8.8.8.8 und Subnetzmaske 255.255.255.255.

Und dann nur noch ein kleines Programm schreiben, z.B. mit Node.js.
Dazu verwende ich noch die Bibliothek dns-packet zum Parsen und Erstellen der DNS-Pakete. Zu installieren mit: npm i dns-packet.
Hier ein kleines Beispiel was zum A-Record von google.com die IP 1.2.3.4 zurückgibt:


let dgram = require('dgram')
let dnsPacket = require('dns-packet')

let gDns = dgram.createSocket('udp4')
let server = dgram.createSocket('udp4')

let id = 0
let map = new Map()

server.on('message', (msg, rinfo) => {
let packet
try {
packet = dnsPacket.decode(msg)
} catch (e) {
return
}
if (Array.isArray(packet.questions)) {
for (let question of packet.questions) {
if (question.name === 'google.com' && question.class === 'IN' && question.type === 'A') {
server.send(dnsPacket.encode({
type: 'response',
id: packet.id,
flags: dnsPacket.RECURSION_AVAILABLE | dnsPacket.RECURSION_DESIRED,
questions: packet.questions,
answers: [{
name: 'google.com',
type: 'A',
ttl: 248,
class: 'IN',
flush: false,
data: '1.2.3.4',
}],
}), rinfo.port, rinfo.address)
return
}
}
}
map.set(++id, { id: packet.id, rinfo })
packet.id = id
gDns.send(dnsPacket.encode(packet))
})
gDns.on('message', msg => {
let packet
try {
packet = dnsPacket.decode(msg)
} catch (e) {
return
}
let { id, rinfo } = map.get(packet.id)
if (rinfo) {
map.delete(packet.id)
packet.id = id
server.send(dnsPacket.encode(packet), rinfo.port, rinfo.address)
}
})
gDns.connect(53, '8.8.4.4', () => {
server.bind(53, '8.8.8.8')
})


Und wenn man jetzt die Datei startet (>node proxy.js) und nslookup macht:
https://www.szenebox.org/attachment.php?attachmentid=891&stc=1&d=1566153981