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

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

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

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


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

Python的脚本结构:

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

开始 我们通过“#!/usr/bin/env python”来告诉操作系统(OS)使用哪个编译器(interpreter) 。
然后,我们声明一个主功能 "def main()" 和最后2行代码来让 main()先运行。您可以在脚本中定义的其他功能,使代码更容易理解和修改:

#!/usr/bin/python
import <module1>,<module2>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 sysscript = 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)" 内 提供的各种功能。

【原文:0x0-python-tutorials-getting-started-pt2 && 0×1 – Port Scanner 翻译:安全脉搏Dim7  转载请注明来自安全脉搏 分享技术 悦享品质】

转载于:https://www.cnblogs.com/dongchi/p/4793724.html

从零单排之玩转Python安全编程(II)相关推荐

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

    转自:http://www.secpulse.com/archives/35893.html 都说Python大法好,作为一名合格的安全从业人员,不会几门脚本语言都不好意思说自己是从事安全行业的. 而 ...

  2. python循环从0到x_Python3 从零单排0_变量格式化输出流程控制循环

    1.Python从零单排简介 第一次接触python是前年,那次偶遇并没有发生什么有趣的故事.后来越发觉得计算机语言对于IT从事着来说是必不可少的技能,语言都不会可不敢妄称自己是IT行业从事者,所以后 ...

  3. python安装idle_Python从零单排之Python环境及IDLE安装

    相信从<从零单排Python我来了-入门篇>过来的小伙伴一定是满心激动得来到第二节内容,那我们话不多说赶紧进入正题吧.所有的解释性编程语言的执行都要依赖于解释器,那么python的解释器有 ...

  4. python从零单排

    文章目录 前言 起步 变量与数据类型 前言 从零单排python,目标把小飞机抄完,可以简单实用excel等实用办公软件 起步 感谢叫兽的图书,感谢叫兽解决的环境,第一章暂且算跳过 变量与数据类型 今 ...

  5. Cocos2dx从零单排游戏开发(一)环境搭建

    今天晚上搭建起来开发环境了,因为我只有android手机,大屌丝一个也买不起苹果,所以我自然就只是试了试搭建起android的环境. 我的系统是win7 64位版,我年前有试着玩过cocos2dx 2 ...

  6. 他在 B 站有 178 万粉丝,今天免费带你玩转 Python

    近几年,编程越来越火,网上也是铺天盖地的免费教程,中小学生都开始投入到学习中,编程学习从娃娃抓起. 甚至有些小学生都做起了 UP 主,教大家学编程. 光从编程的难易度来说,Python 简单& ...

  7. python 输出一个 5*5的 三角形_GitHub标星3W+,80个Python案例,带你轻松玩转Python学习!...

    在Python学习过程中,案例是我们绝对绕不开的一部分.它不光能够帮助我们加深对基础知识的理解,也能进一步提升我们的编程能力. 今天给大家整理的这份80份Python精选案例,来自GitHub热门项目 ...

  8. JAVA从零单排之前因

    本人,男,21岁,普通院校本科,计算机专业.大学之前对计算机编程没有一点涉及.大学学计算机专业也是个偶然.因为当初高考的成绩不好,结果都是我父亲帮我报的学校和专业. 上了大学之后,大一都是在新奇中度过 ...

  9. JAVA从零单排0-----前因

    本人,男,21岁,普通院校本科,计算机专业.大学之前对计算机编程没有一点涉及.大学学计算机专业也是个偶然.因为当初高考的成绩不好,结果都是我父亲帮我报的学校和专业. 上了大学之后,大一都是在新奇中度过 ...

最新文章

  1. 主要元素(超过一半元素)
  2. 用IComparable和IComparableT接口实现两个类对象的比较大小.
  3. E. Party Company(树上问题)
  4. 宁波Uber优步司机奖励政策(12月14日到12月20日)
  5. linux下ssh安装教程,linux安装ssh
  6. VS2010提示asp.net v4.0 尚未在web服务器上注册
  7. 泛微E8使用 xlsx.core.js 导入页面数据
  8. GB28181的NAT穿透
  9. Python 情人节超强技能 导出微信聊天记录生成词云
  10. 幼儿园进行计算机培训心得体会,幼儿园教师课堂培训心得感悟五篇
  11. 'javac'不是内部或外部命令,也不是可运行的程序或批处理文件.
  12. 三位数的茎叶图怎么看_如何看懂茎叶图
  13. java+url+空格转码_Web里URL空格的转换方法
  14. Leetcode 1345 跳跃游戏 IV
  15. 【英语词组】恋恋不忘Day4-7
  16. 魏则西事件与百度医疗竞价排名引发的伦理与道德问题
  17. 带分数 100 可以表示为带分数的形式:100 = 3 + 69258 / 714
  18. Jmeter模拟selenium操作浏览器
  19. NetBPM工作流QA
  20. 佛教信仰是什么(1)

热门文章

  1. 干货 | 应用性能提升 70%,探究 mPaaS 全链路压测的实现原理和实施路径
  2. 重磅 | 数据库自治服务DAS论文入选全球顶会SIGMOD
  3. 使用率激增250%,这份报告再次将 Serverless 推向幕前
  4. Java应用全链路启动速度提升至15s,阿里云SAE能力再升级
  5. 钉钉猛增40倍流量压力,阿里云DBA如何应对?
  6. 前端性能优化:当页面渲染遇上边缘计算
  7. 在阿里,我们如何管理代码分支?
  8. 云数据库RDS_MySQL购买流程_以及购买步骤的建议
  9. RMAN SET NEWNAME
  10. 自己也遇到了-db_recovery_file_dest_size 修改大一点