python编程书籍1020python编程书籍_从零单排之玩转Python安全编程(II)

转自:http://www.secpulse.com/archives/35893.html

都说Python大法好,作为一名合格的安全从业人员,不会几门脚本语言都不好意思说自己是从事安全行业的。

而Python是最容易入门且使用最顺手的脚本语言,为了不引起程序员世界大战,我们不说Python是世界上最好的语言,没有之一。

这是《从零单排之玩转Python安全编程》的第二篇。第一篇参见安全脉搏

本教程继续展示一些基本的Python脚本概念。我们把我们的代码转换成一个脚本、函数、类和系统模块。

Python的脚本结构:

下面是可用于启动Python脚本(script)。

开始 我们通过“#!/usr/bin/env python”来告诉操作系统(OS)使用哪个编译器(interpreter) 。

然后,我们声明一个主功能 "def main()" 和最后2行代码来让 main()先运行。您可以在脚本中定义的其他功能,使代码更容易理解和修改:

#!/usr/bin/python

import ,

def myFunction():

def main():

myFunction()

if __name__=="__main__":

main()

功能Functions:

利用函数的一种常用的方法是有一段代码执行一些动作和返回输出。下面是一些基本的代码演示这个概念:

# Declare function/setup logic

def MyFunction:

...do work...

return output

#Call the function from main:

def main():

output = MyFunction(input)

类(classes):

Python类(classes)一开始可能会显得混乱,因为它是一个不同的方式来设计你的代码。

如果你把握了定义的概念,那么你可以把类(class)当成的数据(data)和定义(definition)的逻辑分组(logical grouping)。

这样类将具有某些属性(attribute)和与之相关联的方法(method)。当你定义以后可以创建该类将继承的属性和与之关联的方法的对象类,这被称为面向对象编程(object-oriented programming)。

如果这个概念对于你来说很混乱,我建议你不要太在意类(classes)。你其实并不需要利用类(classes),但它可以使你的代码少冗余。

下面我们将使用“类”关键词来定义一类新的“域”(Domain) 。

有各种方法在类代码可供选择( various methods within the class code are available)当你需要一个Domain类型的对象(object of type Domain)。

>>> import os

>>> class Domain:

... def __init__(self, domain, port, protocol):

# Stores the variabled passed inside two variables

... self.domain=domain

... self.port=port

... self.protocol=protocol

# Defines a method to build a URL

... def URL(self):

... if self.protocol == 'https':

... URL = 'https://'+self.domain+':'+self.port+'/'

... if self.protocol == 'http':

... URL = 'http://'+self.domain+':'+self.port+'/'

... return URL

# Sets up a method to lookup resolve domain to IP using host command via os.system

... def lookup(self):

... os.system("host "+self.domain)

...

>>>

>>> domain=Domain('google.com', '443', 'https')

>>>

>>> dir(domain)

['URL', '__doc__', '__init__', '__module__', 'ip', 'lookup', 'port', 'protocol']

>>> domain.URL()

'https://8.8.8.8:443/'

>>> domain.ip

'8.8.8.8'

>>> domain.port

'443'

>>> domain.protocol

'https'

>>> domain.lookup()

google.com has address 74.125.228.233

google.com has address 74.125.228.227

google.com has address 74.125.228.232

如上图 你可以看到在实例化域名类的一个实例后,你能运行类中的方法。

同样,这个概念可以在第一会造成混淆,尤其是当你刚刚掌握Python和编程的时候。

你可以尝试在一个你已经写好的Python脚本里实现一个新的类,我发现这可能是开始把握概念的有效途径。

处理命令行参数“sys”:

这个介绍里的最后一个模块触及的是sys模块。这使您可以在读取 CLI 给定的参数(argument),并将其拉进变量(variable)在脚本中。

语法是非常简单的, sys.agrv[0]就是脚本名称,并在命令行(command line)中给定每个参数(argument)后,每个参数会被分配一个号码。

下面是一个简单的例子:

import sys

script = sys.argv[0]

ip = sys.argv[1]

port = sys.argv[2]

print "[+] The script name is: "+script

print "[+] The IP is: "+ip+" and the port is: "+port

当这种快速脚本调用在命令行中,加上几个参数就产生以下的输出:

~$ python sys.py 8.8.8.8 53

[+] The script name is: sys.py

[+] The IP is: 8.8.8.8 and the port is: 53

继续探索更多的Python模块和内置的功能,因为他们会允许你解决问题容易得多,你开始编写更复杂的代码。

-----------------------------------------------------------------------------------------

接下来的教程将介绍建立网络连接与Python通过构建一个基本的端口扫描器的概念。

在本教程中,我们将演示如何通过建立一个基本的端口扫描(port scanner)程序,使与Python的网络连接。

我们将做的是建立网络套接字连接一遍又一遍的使用IP/端口组合。为了做到这一点,我们将引入一个新的概念,循环(for loop):

>>>

>>> for port in range(1000,1024):

... print "[+] The port is: "+str(port)

...

[+] The port is: 1000

[+] The port is: 1001

[+] The port is: 1002

[+] The port is: 1003

[+] The port is: 1004

[+] The port is: 1005

[+] The port is: 1006

[+] The port is: 1007

[+] The port is: 1008

[+] The port is: 1009

[+] The port is: 1010

[+] The port is: 1011

[+] The port is: 1012

[+] The port is: 1013

[+] The port is: 1014

[+] The port is: 1015

[+] The port is: 1016

[+] The port is: 1017

[+] The port is: 1018

[+] The port is: 1019

[+] The port is: 1020

[+] The port is: 1021

[+] The port is: 1022

[+] The port is: 1023

请注意,for loop以上的代码片段有缩进。通常人们缩进2个空格或制表符,不过只要你在整个脚本一致这些都无所谓。

为了做一个简单的端口扫描程序(port scanner),我们将更换打印语句(print statement)为一个代码片段(code snippet)来建立套接字连接(socket connection)。

下面的代码演示了如何使用内置的socket 模块(built-in socket module)进行套接字连接(socket connection):

>>>

>>> import socket

>>>

>>> s = socket.socket()

>>> s.connect(('127.0.0.1', 22))

>>> s.send('Primal Security \n')

17

>>> banner = s.recv(1024)

>>> print banner

OpenSSH

上面我们导入了socket 模块(socket module)以及调用了connect()功能(function)来连接到给定的IP地址和端口号。

这将建立一个TCP连接( SYN / SYN - ACK / ACK ),我们实际上是使用send()功能(function)来将数据发送到指定的服务,并使用recv()来打印响应(response)。

现在,如果端口未打开socket 将抛出一个异常(exception):

>>>

>>> s.connect(('127.0.0.1', 23))

Traceback (most recent call last):

File "", line 1, in ?

File "", line 1, in connect

socket.error: (111, 'Connection refused')

这可以以多种方式来解决。现在,我们将用一种非常简单的方法,使用“尝试(try)/除外(except)”循环(loop),并通过异常(exception)。

>>>

>>> try:

... s.connect(('127.0.0.1', 23))

... except: pass

...

>>>

请注意没有“error!” 这是一个很好的方式来让你的代码看起来像是它们在工作O(∩_∩)O~。现在,让我们使用这些概念,并做出一个快速的环路(for loop)端口(port)扫描器(scanner):

>>>

>>> for port in range(20,25):

... try:

... print "[+] Attempting to connect to 127.0.0.1:"+str(port)

... s.connect(('127.0.0.1', port))

... s.send('Primal Security \n')

... banner = s.recv(1024)

... if banner:

... print "[+] Port "+str(port)+" open: "+banner

... s.close()

... except: pass

...

17

[+] Attempting to connect to 127.0.0.1:20

[+] Attempting to connect to 127.0.0.1:21

[+] Attempting to connect to 127.0.0.1:22

[+] Port 22 open: OpenSSH

[+] Attempting to connect to 127.0.0.1:23

[+] Attempting to connect to 127.0.0.1:24

[+] Attempting to connect to 127.0.0.1:25

上面我们展示的“试(try)/除外(except)”循环(loop)的基本用法来传递(pass) 端口(port)关闭时被socket (socket)抛出的异常(exception)。我们还展示了如何利用一个基本的条件语句 "if" 来只尝试打印开放的端口,如果该端口回应我们的探头(probe)。另一种方法来创建一个端口扫描器是 定义一个列表来包括你想用数组(array)来扫描的端口,然后循环(loop)通过这个数组(array):

>>>

>>> ports = [22, 445, 80, 443, 3389]

>>> for port in ports:

... print port

...

22

445

80

443

3389

>>>

如果我们想一次性处理多个主机(hosts),我们将利用一个嵌套循环(nested for loop)。这将涉及外层(outter layer)环路(for loop)来通过主机循环然后内循环(inner for loop)通过该端口(port)循环。下面是一个基本的例子来讲述如何利用嵌套for循环来建立一个稍微复杂一些的扫描器:

>>>

>>> hosts = ['127.0.0.1', '192.168.1.5', '10.0.0.1']

>>>

>>> ports = [22, 445, 80, 443, 3389]

>>>

>>> for host in hosts:

... for port in ports:

... try:

... print "[+] Connecting to "+host+":"+str(port)

... s.connect((host, port))

... s.send('Primal Security \n')

... banner = s.recv(1024)

... if banner:

... print "[+] Port "+str(port)+" open: "+banner

... s.close()

... except:pass

...

[+] Connecting to 127.0.0.1:22

[+] Port 22 open: OpenSSH

[+] Connecting to 127.0.0.1:445

[+] Connecting to 127.0.0.1:80

[+] Connecting to 127.0.0.1:443

[+] Connecting to 127.0.0.1:3389

[+] Connecting to 192.168.1.5:22

[+] Connecting to 192.168.1.5:445

[+] Connecting to 192.168.1.5:80

[+] Connecting to 192.168.1.5:443

[+] Connecting to 192.168.1.5:3389

[+] Connecting to 10.0.0.1:22

[+] Connecting to 10.0.0.1:445

[+] Connecting to 10.0.0.1:80

[+] Connecting to 10.0.0.1:443

[+] Connecting to 10.0.0.1:3389

正如你可以通过输出看到,它循环阵列的主机(hosts array),并尝试端口阵列(port array)中的每个端口然后再移动到下一个主机。对于最终的端口扫描器,你可能会想要要修改打印报表来只打印开放的那些端口。

在一天结束时,你会发现Nmap仍然是端口扫描一个更好的选择,但在以后的博客帖子内 我们将建立在这些概念来完成一些更实际的使用案例。花一些时间来探索socket 模块(socket module) "dir(socket)" 内 提供的各种功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/476514.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[导入][转]sap学习手册二

SAP学习手册二 作者:sunxufeng 有没有调整IDES4.6的中文包参数的步骤呢? 在导入中文包后直接手工修改有关参数,不要用CZ10去修改假定为D盘,路径为D:usrsapC11sysprofileC11_DVEBMGS00_cpa (后面CPA为我的计算机名),用NOTEPAD手动编辑该文件 SAPSYSTEMNAME C11 INS…

近几年车道线检测领域的SOTA论文复现代码数据集

自动驾驶近些年来大火。有读者朋友给我留言说想做自动驾驶,但是不知道怎么切入。今天就给大家分享一个好出文章的自动驾驶研究方向——车道线检测。车道线检测就是将计算机视觉应用到自动驾驶或辅助驾驶,本质上还是目标检测问题。但车道线检测又不同于目…

python多元线性回归实例_利用Python进行数据分析之多元线性回归案例

线性回归模型属于经典的统计学模型,该模型的应用场景是根据已知的变量(自变量)来预测某个连续的数值变量(因变量)。例如,餐厅根据每天的营业数据(包括菜谱价格、就餐人数、预定人数、特价菜折扣等)预测就餐规模或营业额;网站根据访问的历史数…

NTLM

NTLM HTTP认证 过程如下&#xff1a; 1: C --> S GET ... 2: C <-- S 401 Unauthorized WW-Authenticate: NTLM 3: C --> S GET ... Authorization: NTLM <base64-encoded type-1-message> 4: C <-- S 401 Unauthorized WWW-Authenticate: NTLM …

ChatGPT和DALLE-2级联后,输出效果震撼了…

源&#xff5c;机器之心 文&#xff5c;张倩、袁铭怿生成式 AI 正在变革内容的生产方式。在过去的一周&#xff0c;相信大家都被 ChatGPT 刷了屏。这个强大的对话 AI 仅用 5 天时间用户量就突破了 100 万。大家用各种方式测试着它的能力上限&#xff0c;其中一种测试方式就是让…

域用户频繁被锁定怎么解决_Oracle11g用户频繁锁定并且解锁后不允许登录

原因有可能是oracle的密码过期机制导致的&#xff1a;一、由于Oracle中默认在default概要文件中设置了“PASSWORD_LIFE_TIME180天”所导致。解决办法&#xff1a;1、查看用户用的哪种profile策略&#xff0c;一般是default&#xff1a;select username,profile from dba_users;…

LeetCode 1290. 二进制链表转整数

1. 题目 给你一个单链表的引用结点 head。 链表中每个结点的值不是 0 就是 1。 已知此链表是一个整数数字的二进制表示形式。 请你返回该链表所表示数字的 十进制值 。 示例 1&#xff1a; 输入&#xff1a;head [1,0,1] 输出&#xff1a;5 解释&#xff1a;二进制数 (101…

jmeter性能测试报告_用 JMeter 做接口测试的优劣浅析

2018年由软件质量报道做的调查报告表明&#xff0c;受调查的测试人员中约有40.67%的人使用JMeter作为接口测试的自动化测试工具(排在商业化或者开源工具中的第一)&#xff0c;剩下的为Postman(28%)&#xff0c;以及SoapUI(17.33%)。不过值得关注的是另外还有44.13%的采用了自研…

关于Hibernate

Hibernate是对象/关系映射&#xff08;ORM&#xff09;的解决方案。就是将java对象与对象关系映射至关系型数据库中的表格与表格之间的关系。 hibernate各个组件的关系 核心组件&#xff1a; Configuration类&#xff1a;用于读取Hibernian配置文件&#xff0c;并生成Sessio&am…

研究了一堆英语学习软件,发现了一个美国宝藏口语App,国内也能用!

图片来源&#xff1a;爱奇艺《一年一度喜剧大会》最近看《二喜》看到逗逗的这句话&#xff0c;我真的太同感了——一个人不知道做什么的时候&#xff0c;好像总会想到学英语这件事。“英语好”确实可以成为一剂强心针——更好的学业机会和更好的职业选择。《当代国人英语学习调…

jdbctemplate 开启事务_Spring(四):事务管理

事务首先&#xff0c;我们要知道事务是什么构成单一逻辑工作单元的操作集合称为事务事务的ACID特性原子性&#xff1a;不可分割的最小操作单位&#xff0c;要么同时成功&#xff0c;要么同时失败一致性&#xff1a;事务操作前后&#xff0c;数据总量不变隔离性&#xff1a;多个…

LeetCode 58. 最后一个单词的长度

1. 题目 给定一个仅包含大小写字母和空格 ’ ’ 的字符串 s&#xff0c;返回其最后一个单词的长度。 如果字符串从左向右滚动显示&#xff0c;那么最后一个单词就是最后出现的单词。 如果不存在最后一个单词&#xff0c;请返回 0 。 说明&#xff1a;一个单词是指仅由字母组…

prompt终于在机器人领域杀疯了

编&#xff5c;杜伟、陈萍源&#xff5c;机器之心谷歌机器人团队等在机器人领域构建了一个多任务 transformer 模型&#xff0c;显著改进了对新任务、环境和对象的零样本泛化。我们知道&#xff0c;机器学习&#xff08;ML&#xff09;多个子领域&#xff08;如 NLP 和 CV&…

python打开excel数据库_使用python导入excel文件中的mssql数据库数据

我试图用python导入excel文件中的mssql数据库数据。我的数据在excel表格中的顺序不正确。e、 g它显示第1列数据&#xff0c;然后是第3列&#xff0c;第2列&#xff0c;然后是第4列&#xff0c;依此类推。我使用以下脚本&#xff1a;import pyodbcimport csvconnection pyodbc.…

雷鸟安装的插件

lightning日历功能 同步lightning和google日历的插件&#xff1a;provider_for_google_calendar 使用可以参考&#xff1a;http://jackbin.blogspot.com/2008/02/lightning-5.html 导入OE邮件时用了ImportExportTools转载于:https://www.cnblogs.com/cerxp/archive/2008/09/28/…

LeetCode 66. 加一

1. 题目 给定一个由整数组成的非空数组所表示的非负整数&#xff0c;在该数的基础上加一。 最高位数字存放在数组的首位&#xff0c; 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外&#xff0c;这个整数不会以零开头。 示例 1: 输入: [1,2,3] 输出: [1,2,4] 解…

ChatGPT的前世今生

作者&#xff5c;符尧等整理&#xff5c;李rumor最近有幸看到了一篇十分深度剖析GPT系列模型的文章&#xff0c;读到后赶紧与作者联系&#xff0c;没想到他们很快就翻译成了中文&#xff0c;在这里分享给大家。英文原版:https://franxyao.github.io/blog.html作者&#xff1a;符…

文件管理(一)

文件是同一类型元素的有序集合&#xff0c;是内存与外设间传输数据的渠道。一些外设如显示器、键盘、打印机等都可以看作文件&#xff0c;但最常用的还是磁盘文件&#xff0c;这也是本章我们主要讨论的对象。 Delphi继承了Object Pascal的文件管理功能&#xff0c;并有很大的发…

LeetCode 95. 不同的二叉搜索树 II(递归)

1. 题目 给定一个整数 n&#xff0c;生成所有由 1 … n 为节点所组成的二叉搜索树。 示例: 输入: 3 输出: [[1,null,3,2],[3,2,null,1],[3,1,null,null,2],[2,1,3],[1,null,2,null,3] ] 解释: 以上的输出对应以下 5 种不同结构的二叉搜索树&#xff1a;1 3 3 …

离谱!以AI数据标注为名,偷拍女性上厕所?

源&#xff5c;新智元文&#xff5c;好困 David你绝对想不到&#xff0c;自己在家上厕所的「实时动态」&#xff0c;不仅被拿去给AI做了训练数据&#xff0c;而且还被发到了网上&#xff01;最近&#xff0c;《麻省理工科技评论》在一篇万字长文调查中&#xff0c;就曝光了这样…