如何搭建TCP代理(三)

来源:岁月联盟 编辑:猪蛋儿 时间:2020-03-24
                    qd = packet.qd,
                    an = dns_answer
                )
 
            print("Resolved DNS request for %s to %s for %s" %
                    (queried_host, resolved_ip, ip.src))
 
            # Use scapy to send our response back to your phone.
            scapy.send(dns_response, iface=iface)
        else:
            print("Ignoring unrecognized packet from %s" % ip.src)
 
    return handle_packet
 
 
def _get_local_ip(iface):
    ni.ifaddresses(iface)
    return ni.ifaddresses(iface)[ni.AF_INET][0]['addr']
 
 
def run(iface, local_ip, sniff_filter, spoof_domains):
    print("#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#")
    print("-#-#-#-#-#-RUNNING DNS SPOOFER-#-#-#-#-#-")
    print("#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#")
    print("Interface:/t/t/t%s" % iface)
    print("Resolving to IP:/t/t%s" % local_ip)
    print("Spoof domains:/t/t%s" % ', '.join(spoof_domains))
    print("BPF sniff filter:/t/t%s" % sniff_filter)
    print("")
    print("Waiting for DNS requests...")
    print("(Make sure the device you are targeting is set to use"/
            "your local IP (%s) as its DNS server)" % local_ip)
 
    scapy.sniff(iface=iface,
                filter=sniff_filter,
                prn=handle_packet_fn(iface, local_ip, spoof_domains))
 
 
IFACE= 'en0'
local_ip = _get_local_ip(IFACE)
# The local IP of your phone
client_ip = '192.168.42.74'
 
SPOOF_DOMAINS = ['nonhttps.com', 'www.nonhttps.com']
SNIFF_FILTER = ("udp port 53 && dst %s && src %s" %
    (local_ip, client_ip))
 
run(IFACE, local_ip, SNIFF_FILTER, SPOOF_DOMAINS)
启动DNS服务器后,请确保如上所述将智能手机的DNS服务器仍设置为笔记本电脑。在智能手机上访问一些网站,然后回头查看终端,你应该看到DNS请求来自你的智能手机,并被我们的DNS服务器记录。
我们服务器的行为取决于DNS请求所针对的主机名,如果请求的是我们的目标主机名(当前在脚本中设置为nonhttps.com,因为我们还不需要担心HTTPS),则我们的服务器将使用你笔记本电脑的本地IP地址进行响应。对于所有其他的,它会向一个真正的DNS服务器发出自己的真正的DNS请求,并使用真实答案以真相响应你的智能手机
这意味着你的智能手机现在可以使用我们伪造的DNS服务器,针对除目标以外的所有主机名,将主机名准确解析为IP地址。除了我们当前的目标nonhttps.com之外,它的连网状态应该刚刚恢复。
我们已经证实,在智能手机上访问nonhttps.com。你应该看到我们的DNS服务器日志,它已经欺骗了DNS响应,并返回了笔记本电脑的本地IP地址。

然后,你的智能手机应尝试将其对nonhttps.com的HTTP请求发送到便携式计算机,而不是真正的nonhttps.com服务器。虽然,页面应该无法加载,但已经是个明显的进步了。
通过使用Wireshark,我们确认这确实是刚刚发生的事情。使用数据包筛选器tcp端口80 && dst $ YOUR_LAPTOPS_LOCAL_IP运行Wireshark,在智能手机上重新加载nonhttps.com,然后回头看Wireshark。你应该会看到智能手机尝试通过端口80上的TCP连接到笔记本电脑。TCP连接的“目标IP”应设置为笔记本电脑的本地IP,其“源IP”应设置为智能手机的IP。这证明我们已成功说服你的智能手机将其对nonhttps.com的TCP请求发送到你的笔记本电脑!

代码解析
现在,我们的DNS服务器正在工作,让我们仔细看看它的代码,你可能会发现在GitHub中打开代码很有用。
我们的服务器会监视所有通过笔记本电脑wi-fi接口的数据包,并对那些看起来像DNS请求的数据包运行一个回调函数。回调函数构建一个DNS响应,并将其发送回你的智能手机

上一页  [1] [2] [3] [4]  下一页