社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

网络安全自学篇(十四)| Python攻防之基础常识、正则表达式、Web编程和套接字通信(一)

渗透云笔记 • 5 年前 • 487 次点击  



免责声明:本公众号发布的文章均转载自互联网或经作者投稿授权的原创,文末已注明出处,其内容和图片版权归原网站或作者本人所有,并不代表安全+的观点,若有无意侵权或转载不当之处请联系我们处理,谢谢合作! 

欢迎各位添加微信号:qinchang_198231  

 加入安全+ 交流群 和大佬们一起交流安全技术





作者介绍:杨秀璋


自幼受贵州大山的熏陶,养成了诚实质朴的性格。经过寒窗苦读,考入BIT,为完成自己的教师梦,放弃IT、航天等工作,成为贵财一名大学教师,并想把自己所学所感真心传授给自己的学生,帮助更多陌生人。


一.为什么使用Python做网络攻防


网络攻防通常包括七个步骤:(图源自张超大神)


侦查: 漏洞挖掘

武器制作:攻击、载荷

分发:垃圾邮件等

利用:漏洞利用

安装:恶意代码、网页

远程控制:僵尸网络

行动:窃密、破坏、跳板

为什选择Python作为开发工具呢?

真正厉害的安全工程师都会自己去制作所需要的工具,而Python语言就是这样一个利器。Python开发的平台包括Seebug、TangScan、BugScan等。在广度上,Python可以进行蜜罐部署、沙盒、Wifi中间人、Scrapy网络爬虫、漏洞编写、常用小工具等;在深度上,Python可以实现SQLMAP这样一款强大的SQL注入工具,实现mitmproxy中间人攻击神器等。由于Python具有简单、易学习、免费开源、高级语言、可移植、可扩展、丰富的第三方库函数特点,Python几行代码就能实现Java需要大量代码的功能,并且Python是跨平台的,Linux和Windows都能使用,它能快速实现并验证我们的网络攻防想法,所以选择它作为我们的开发工具。


那么,我们又可以用Python做什么呢?


目录扫描:Web+多线程(requests+threading+Queue),后台、敏感文件(svn|upload)、敏感目录(phpmyadmin)。

信息搜集:Web+数据库,中间件(Tomcat | Jboss)、C段Web信息、搜集特点程序。例如:搜索某个论坛上的所有邮箱,再进行攻击。

信息匹配&SQL注入:Web+正则,抓取信息(用户名|邮箱)、SQL注入。

反弹shell:通过添加代码获取Shell及网络信息。

接下来我们开始学习Python正则表达式、Python Web编程和Python网络编程。建议读者做好以下准备:


1.选择一个自己喜欢顺手的编辑器

2.至少看一本关于Python的书籍

3.会使用Python自带的一些功能,学习阅读源代码

4.阅读官方文档,尤其是常用的库

5.多练习,多实战

举个简单Python示例,通过import导入扩展包base64,它是将字符串base64加解码的模块, 通过print dir(base64)、help(base64)可以查看相关功能。

输出结果如下图所示,包括查看源代码文件位置和“eastmount”转码。


二.Python正则表达式


(一) 正则表达式基础


在使用正则表达式之前,我们需要基本了解Python基础知识、HTTP协议,熟悉使用BurpSuite、SQLMAP工具。Python正则表达式被广泛应用在爬虫开发、多线程、网络编程中,而hacker应用也会涉及到正则表示式相关知识,比如扫描、爆破、POC等。


正则表达式(RegEx)使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。例如,如果想获取里面的ip地址,就需要使用正则表达式实现。Python通过re模块提供正则表达式的支持,其基本步骤如下:


先将正则表达式的字符串形式编译我Pattern实例(compile)

使用Pattern实例处理文本并获得匹配结果(match find findall)

使用实例获得信息,进行其他的操作( 匹配结果)

举一个简单例子:

输出结果为:

1.点(.)表示匹配任意换行符“\n”以外的字符。

输出结果为:[‘tt’, ‘tm’, ‘t.’, ‘th’],依次匹配t加任意字符的两个字符。

2.斜杠(\)表示匹配转义字符 如果需要匹配点的话,必须要\转义字符。


输出结果为:[’.’, ‘.’, ‘.’]。


3.[…] 中括号是对应位置可以是字符集中任意字符。

字符集中的字符可以逐个列出,也可以给出范围,如[abc]或[a-c],第一个字符如果是^表示取反,如 [ ^ abc]表示不是abc的其他字符。例如:a[bcd]e 能匹配到 abe、ace、ade。


4.匹配数字和非数字案例。

输出结果如下图所示:

正则表达式较为难理解,更推荐读者真正使用的时候学会去百度相关的规则,会使用即可。同时,更多正则表达式的使用方法建议读者下来之后自行学习,常见表如下图所示。

(二) 常用正则表达式规则

下面讲解比较常见的正则表达式规则,这些规则可能会对我们的网络攻防有一定帮助。

1.获取数字

输出结果为:
[‘1.45’, ‘5’, ‘6.45’, ‘8.82’]

2.抓取标签间的内容


输出结果为:

3.抓取超链接标签间的内容

输出结果部分内容如下所示,这里如果采用“print u”或“print t”语句直接输出结果,可能会是中文乱码,则需要调用函数unicode(u,‘utf-8’)转换为utf-8编码,正确显示中文。

4.抓取超链接标签的url

获取的超链接输出结果如下图所示:

5.抓取图片超链接标签的url和图片名称

在HTML中,我们可以看到各式各样的图片,其图片标签的基本格式为“< img src=图片地址 />”,只有通过抓取了这些图片的原地址,才能下载对应的图片至本地。那么究竟怎么获取图片标签中的原图地址呢?下面这段代码就是获取图片链接地址的方法。

其中图片对应的原图地址为“http://www.yangxiuzhang.com/eastmount.jpg”,它对应一张图片,该图片是存储在“www.yangxiuzhang.com”网站服务器端的,最后一个“/”后面的字段为图片名称,即为“eastmount.jpg”。那么如何获取url中最后一个参数呢?

更多正则表达式的

用法,读者结合实际情况进行复现。


三.Python Web编程


这里的Web编程并不是利用Python开发Web程序,而是用Python与Web交互,获取Web信息。主要内容包括:


urllib、urllib2、requests

爬虫介绍

利用Python开发一个简单的爬虫

(一) urllib\urllib2


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返回一个类文件对象。

该段调用调用urllib.urlopen(url)函数打开百度链接,并输出消息头、url、http状态码等信息,如下图所示。

urlretrieve(url, filename=None, reporthook=None, data=None)

urlretrieve方法是将远程数据下载到本地,参数filename指定了保存到本地的路径,如果省略该参数,urllib会自动生成一个临时文件来保存数据;参数reporthook是一个回调函数,当连接上服务器,相应的数据块传输完毕时会触发该回调,通常使用该回调函数来显示当前的下载进度;参数data指传递到服务器的数据。下

它将百度Logo图片下载至本地。

urllib2中调用的方法为:urllib2.urlopen()、urllib2.requests()。


(二) requests


requests模块是用Python语言编写的、基于urllib的第三方库,采用Apache2 Licensed开源协议的http库。它比urllib更加方便,既可以节约大量的工作,又完全满足http测试需求。requests是一个很实用的Python http客户端库,编写爬虫和测试服务器响应数据时经常会用到。推荐大家从 requests官方网站 进行学习,这里只做简单介绍。


假设读者已经使用“pip install requests”安装了requests模块,下面讲解该模块的基本用法。


1.发送网络请求

2.为URL传递参数

输出结果如下图所示,将参数进行了拼接。

3.响应内容

4.二进制响应内容

5.定制请求头

注意:headers中可以加入cookies

6.复杂的POST请求

7.响应状态码和响应头

8.Cookies

9.超时

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),如下图所示。

传统的爬虫代码会被网站拦截,从而无法获取相关信息。

右键审查元素(按F12),在Network中获取Headers值。headers中有很多内容,主要常用的就是user-agent 和 host,它们是以键对的形式展现出来,如果user-agent 以字典键对形式作为headers的内容,就可以反爬成功。

代码如下:

有部分网站会返回Json格式的数据,我们可以通过json模块进行处理。核心代码如下:

2.提交数据请求

部分网站如果涉及到翻页,需要获取所有页码的信息,最传统的方法是定义一个函数,然后设计一个循环,一次遍历不同页面的内容实现。核心代码如下:

但如果URL始终保持不变,就需要我们深入地分析,或通过Selenium模拟浏览器抓取,这里提供一个技巧性比较强的方法。


正如 博客园zhaof大佬 的文章,我们想爬取上海人民法院的开庭公开信息,但通过翻页发现这个页面的url地址是不变的,所以这里我们大致就可以判断出,中间表格的数据是通过js动态加载的,我们可以通过分析抓包,找到真实的请求地址。

目标网址:http://www.hshfy.sh.cn/shfy/gweb2017/ktgg_search.jsp

通过审查元素可以发现有个pagesnum变量,它标记为我们的页码,所以这里需要通过requests提交变量数据,就能实现翻页。

核心代码如下:


四.Python套接字通信


(一) 什么是C/S架构呢?


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。


套接字分两种:基于文件型和基于网络的


第一个套接字家族为AF_UNIX,表示地址家族:UNIX。包括Python在内的大多数流行平台上都使用术语“地址家族”及其缩写AF。由于两个进程都运行在同一台机器上,而且这些套接字是基于文件的,所以它们的底层结构是由文件系统来支持的。可以理解为同一台电脑上,文件系统确实是不同的进程都能进行访问的。

第二个套接字家族为AF_INET,表示地址家族:Internet。还有一种地址家族AF_INET6被用于网际协议IPv6寻址。Python 2.5中加入了一种Linux套接字的支持:AF_NETLINK(无连接)套接字家族,让用户代码与内核代码之间的IPC可以使用标准BSD套接字接口,这种方法更为精巧和安全。

如果把套接字比作电话的查看——即通信的最底层结构,那主机与端口就相当于区号和电话号码的一对组合。一个因特网地址由网络通信必须的主机与端口组成。而且另一端一定要有人接听才行,否则会提示“对不起,您拨打的电话是空号,请查询后再拨”。同样你也可能会遇到如“不能连接该服务器、服务器无法响应”等。合法的端口范围是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(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。

(五) TCP通信实例

1.服务器 tcpSerSock.py
核心操作如下:

2.客户端 tcpCliSock.py
核心操作如下:

由于服务器被动地无限循环等待连接,所以需要先运行服务器,再开客户端。又因为我的Python总会无法响应,所以采用cmd运行服务器Server程序,Python IDLE运行客户端进行通信。运行结果如下图所示:

如果出现错误[Error] Bad file descriptor表示服务器关闭客户端连接了,删除即可。建议:创建线程来处理客户端请求。SocketServer模块是一个基于socket模块的高级别的套接字通信模块,支持新的线程或进程中处理客户端请求。同时建议在退出和调用服务器close()函数时使用try-except语句。


那么,如何反弹shell程序呢?

使用 from subprocess import Popen, PIPE 导入库,调用系统命令实现。核心代码如下:


五.总结


希望这篇文章对你有所帮助,这是Python网络攻防非常基础的一篇博客,后续作者也将继续深入学习,制作一些常用的小工具供大家交流。最近CSDN博客排名正在改版,突然发现自己排到第6名,也谈谈我的看法。


每一位博主都值得尊重,每一篇博客都是我们的劳动果实。这一路走来,无数大佬、前辈让CSDN发展壮大,包括算法的July大神、Android的郭霖和罗升阳大神、图像视频的雷神、考入清北的两位女大神、还有七八十岁的老一辈wzz老师,还有各个板块的各种大神和前辈。就我而言,写博客最早的初衷就是为了记录当下,同时分享些知识给有用的读者,现如今,每当看到一个“对我有帮助”的评论,看到一句“谢谢”仍然非常开心,觉得这篇文章值了。八年过来,中间也有段时间很看重排名,但写着写着就淡了,更期盼系统地撰写些专栏,分享总结些互联网上资料较少的技术。尤其是成为教师之后,更是品尝到了分享知识的魅力和学生们的感恩,也鼓舞很多学生开始在CSDN撰写了自己的博客。我所说的这一切也不意味着排名不重要,但更希望博友们能看淡些,真诚地总结好知识、分享好文章、帮助更多人,才是我们的初衷啊!而且CSDN也一直在进步,这些技术人员和工作人员一直在朝好的方向改进,这个排名算法也会陆续优化,感恩有你,感恩CSDN,一路同行!加油。



Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/56706
 
487 次点击