从零单排之玩转Python安全编程(I)

2015-07-09 10,249

都说Python大法好,作为一名合格的安全从业人员,不会几门脚本语言都不好意思说自己是从事安全行业的。而Python是最容易入门且使用最顺手的脚本语言,为了不引起程序员世界大战,我们不说Python是世界上最好的语言,没有之一。这是《从零单排之玩转Python安全编程》的第一篇。

python2

Python是门很强力的脚本语言,因为有InfoSec和SecPulse社区的支持。很多工具是用Python写的,譬如Bugscan,BeeBeetoo,安全脉搏神器等等此类的插件式都是Python代码构成,而且很多模块都是利用Python脚本来写的。

这些模块可以用几行代码就完成了复杂的任务,而且还可以迅速导入。

你可以使用Linux OS和Python 2.x版本开始编程。写Python代码的时候,可以在Python解释器里面直接输入,也可以存储到文件里面。很多人发现直接在Python解释器写他们的代码比存到文件里面逻辑和样式更清晰。

记住Python强制使用缩进,譬如你在定义函数的时候,使用循环的时候以及逻辑语句if/else等等。

The Python Interpreter:

在终端里面打入python

~$ python
Python 2.7.3
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>>

你可以直接在解释器里面输入了,下面我们来定义2个变量,使用type()功能来查看我们创建的数据类型是string还是integer型。

>>>
>>> ip = '8.8.8.8'
>>> port = 53
>>>
>>> type(ip)
<type 'str'>
>>>
>>> type(port)
<type 'int'>
>>>

也可以使用内置的help()函数去了解其他函数的特性。学习语言的更多特性的时候 要记住常常使用help()。

>>>
>>> help(type)
>>>

编程中经常要做的一件事就是连接变量,然后输出打印出来。这里,我们可以str()把int型的port转变为字符型string。

>>>
>>> print "The IP is: "+ip+" and the port is: "+str(port)
The IP is: 8.8.8.8 and the port is: 53
>>>

因为变量“IP”本来就是string,所以我们只需要转变 “port”变量。

你可以指定具体的偏移(offsets)Python字符串,也可以使用len()函数来查看字符串长度,在更复杂的字符串操作的时候十分有用:

>>>
>>> domain='primalsecurity.net'
>>> domain
'primalsecurity.net'
>>> domain[0]
'p'
>>> domain[0:3]
'pri'
>>> domain[1:]
'rimalsecurity.net'

>>> len(domain)
18

使用dir()函数就可以看到对ip这个变量 我们能够用到啥其他函数

>>>
>>> dir(ip)
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
>>>

你可以开始利用一些Python内置的函数了。使用help()函数可以了解更多其他函数功能。

>>>
>>> help(ip.split)
>>>
>>> string = ip+':'+str(port)
>>> string
'8.8.8.8:53'
>>>
>>> string.split(':')
['8.8.8.8', '53']

上面的split()函数用冒号:把string分割成了一个list型数据。这是一个非常有用的字符串函数,因为你可以分解一行来提取你感兴趣的部分。
譬如,我们想从列表里面把IP地址给提取出来,那么我们可以通过坐标的方式指定获取我们想要的部分。list列表的运算还有append(追加)和remove(移除)等等操作。

>>>
>>> list = string.split(':')
>>>
>>> list
['8.8.8.8', '53']
>>>
>>> list[0]
'8.8.8.8'
>>>
>>> list.append('google')
>>> list
['8.8.8.8', '53', 'google']
>>> list.remove('google')
>>> list
['8.8.8.8', '53']
>>> 

Python Modules:

如上所述,Python模块是一个非常有用的方法,它可以以更少的代码完成复杂的任务。Python有很多有用的内置模块 ,如os, subprocess, socket, urllib, httplib, re, sys等等,甚至有很多第三方模块如cymruwhois, scapy, dpkt, spider等。

想要使用一个模块很简单,输入import <moduleName>就可以了。你可以使用Python代码执行OS系统命令,所以os模块是非常有用的。

>>>
>>> import os
>>>
>>> dir(os)
['EX_CANTCREAT', 'EX_CONFIG', 'EX_DATAERR', 'EX_IOERR', 'EX_NOHOST', 'EX_NOINPUT', 'EX_NOPERM', 'EX_NOUSER', 'EX_OK', 'EX_OSERR', 'EX_OSFILE', 'EX_PROTOCOL', 'EX_SOFTWARE', 'EX_TEMPFAIL', 'EX_UNAVAILABLE', 'EX_USAGE', 'F_OK', 'NGROUPS_MAX', 'O_APPEND', 'O_ASYNC', 'O_CREAT', 'O_DIRECT', 'O_DIRECTORY', 'O_DSYNC', 'O_EXCL', 'O_LARGEFILE', 'O_NDELAY', 'O_NOATIME', 'O_NOCTTY', 'O_NOFOLLOW', 'O_NONBLOCK', 'O_RDONLY', 'O_RDWR', 'O_RSYNC', 'O_SYNC', 'O_TRUNC', 'O_WRONLY', 'P_NOWAIT', 'P_NOWAITO', 'P_WAIT', 'R_OK', 'SEEK_CUR', 'SEEK_END', 'SEEK_SET', 'ST_APPEND', 'ST_MANDLOCK', 'ST_NOATIME', 'ST_NODEV', 'ST_NODIRATIME', 'ST_NOEXEC', 'ST_NOSUID', 'ST_RDONLY', 'ST_RELATIME', 'ST_SYNCHRONOUS', 'ST_WRITE', 'TMP_MAX', 'UserDict', 'WCONTINUED', 'WCOREDUMP', 'WEXITSTATUS', 'WIFCONTINUED', 'WIFEXITED', 'WIFSIGNALED', 'WIFSTOPPED', 'WNOHANG', 'WSTOPSIG', 'WTERMSIG', 'WUNTRACED', 'W_OK', 'X_OK', '_Environ', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '_copy_reg', '_execvpe', '_exists', '_exit', '_get_exports_list', '_make_stat_result', '_make_statvfs_result', '_pickle_stat_result', '_pickle_statvfs_result', '_spawnvef', 'abort', 'access', 'altsep', 'chdir', 'chmod', 'chown', 'chroot', 'close', 'closerange', 'confstr', 'confstr_names', 'ctermid', 'curdir', 'defpath', 'devnull', 'dup', 'dup2', 'environ', 'errno', 'error', 'execl', 'execle', 'execlp', 'execlpe', 'execv', 'execve', 'execvp', 'execvpe', 'extsep', 'fchdir', 'fchmod', 'fchown', 'fdatasync', 'fdopen', 'fork', 'forkpty', 'fpathconf', 'fstat', 'fstatvfs', 'fsync', 'ftruncate', 'getcwd', 'getcwdu', 'getegid', 'getenv', 'geteuid', 'getgid', 'getgroups', 'getloadavg', 'getlogin', 'getpgid', 'getpgrp', 'getpid', 'getppid', 'getresgid', 'getresuid', 'getsid', 'getuid', 'initgroups', 'isatty', 'kill', 'killpg', 'lchown', 'linesep', 'link', 'listdir', 'lseek', 'lstat', 'major', 'makedev', 'makedirs', 'minor', 'mkdir', 'mkfifo', 'mknod', 'name', 'nice', 'open', 'openpty', 'pardir', 'path', 'pathconf', 'pathconf_names', 'pathsep', 'pipe', 'popen', 'popen2', 'popen3', 'popen4', 'putenv', 'read', 'readlink', 'remove', 'removedirs', 'rename', 'renames', 'rmdir', 'sep', 'setegid', 'seteuid', 'setgid', 'setgroups', 'setpgid', 'setpgrp', 'setregid', 'setresgid', 'setresuid', 'setreuid', 'setsid', 'setuid', 'spawnl', 'spawnle', 'spawnlp', 'spawnlpe', 'spawnv', 'spawnve', 'spawnvp', 'spawnvpe', 'stat', 'stat_float_times', 'stat_result', 'statvfs', 'statvfs_result', 'strerror', 'symlink', 'sys', 'sysconf', 'sysconf_names', 'system', 'tcgetpgrp', 'tcsetpgrp', 'tempnam', 'times', 'tmpfile', 'tmpnam', 'ttyname', 'umask', 'uname', 'unlink', 'unsetenv', 'urandom', 'utime', 'wait', 'wait3', 'wait4', 'waitpid', 'walk', 'write']
>>>

os模块有上面那么多功能。我经验使用 “os.system”,因为我们可以通过它执行的基本操作系统命令。 下面我们执行个系统命令:

>>>
>>> os.system("echo 'UHJpbWFsIFNlY3VyaXR5Cg==' | base64 -d")
Primal Security
>>>

Creating a File Object:

接下来,我们将演示几种使用Python读文件和创建文件的例子。下面演示了如何创建一个文件对象,并将数据读/写数据到对象。你经常会发现自己要从一个文件中读取输入,做一些逻辑,然后将输出写入文件:

>>>
>>> file = open('test.txt', 'w')
>>> file.write('Hello World')
>>> file.close()    
>>> file = open('test.txt', 'r')
>>> file.readlines()
['Hello World']
>>>

多在Python解释器里面实践这些概念,来巩固巩固,因为你将在后续的教程中遇到更复杂的例子。下一个教程将涵盖Python脚本,定义,类以及sys模块。

【原文:0x0 Python Tutorial: Getting Started 翻译:安全脉搏  转载请注明来自安全脉搏 分享技术 悦享品质】

本文作者:SP小编

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/34877.html

Tags:
评论  (2)
快来写下你的想法吧!
  • mtfly 2015-08-13 18:53:10

    接着翻译啊,不翻译我可自己翻译了啊

    • SP胖编 个人认证 2015-08-16 22:33:29

      @mtfly 前些时候比较忙碌 马上更新 你可以联系一下我 进行翻译事宜 多一个人多一份分享

SP小编

文章数:209 积分: 25

交流和分享以及愉快的玩耍

安全问答社区

安全问答社区

脉搏官方公众号

脉搏公众号