python渗透测试---第一章:基础

第一章——入门

一、变量

python常见的变量有:数字、布尔值、字符串、列表、元组、字典、集合。
在这里插入图片描述

字符串

python的string模块提供处理字符串的方法,在http://docs.python.org/library/string.html中可以查看。
四个方法:upper()大写输出、lower()小写输出、replace()替换、find()查找
在这里插入图片描述

列表

append()方法向列表添加元素、index()返回元素的索引、remove()删除元素、sort()排序、len()返回列表长度
在这里插入图片描述

词典

常用于扫描指定TCP端口。
keys()返回词典中所有键的列表、items()返回词典中所有项的完整信息的列表
在这里插入图片描述

网络

导入实例化socket类的新变量s,我们用connect()方法建立于指定ip地址和端口的网络建立连接,一旦建立连接,就可以通过套接字进行读写操作。revc(1024)方法将读取套接字中接下来的1024B数据。
在这里插入图片描述
相关知识:
socket.setdefaulttimeout(t)
t:代表经过t秒后,如果还未下载成功,自动跳入下一次操作,此次下载失败。
python程序根据url从互联网上批量下载图片时,设置HTTP或Socket超时,来防止爬虫爬取某个页面时间过长,导致程序卡置不前。

条件选择语句

if 表达式1:
    语句
    if 表达式2:
        语句
    elif 表达式3:
        语句
    else:
        语句
elif 表达式4:
    语句
else:
    语句

异常处理

try/except语句进行异常处理,可以将异常存储到变量e中以便打印出来,同时还要调用str()将e转换成一个字符串
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

函数

通过def()关键字定义,示例中定义扫描FTP banner信息的函数:

import socket  

def retBanner(ip,port):  
    try:  
        socket.setdefaulttimeout(2)  
        s = socket.socket()  
        s.connect((ip,port))  
        banner = s.recv(1024)  
        return banner  
    except:  
        return  
  
def checkVulns(banner):  
    if 'vsFTPd' in banner:  
        print '[+] vsFTPd is vulnerable.'  
    elif 'FreeFloat Ftp Server' in banner:  
        print '[+] FreeFloat Ftp Server is vulnerable.'  
    else:  
        print '[-] FTP Server is not vulnerable.'  
    return  
  
def main():  
    ips = ['192.168.43.20','192.168.200.1']  
    port = 21  
    banner1 = retBanner(ips[0],port)  
    if banner1:  
        print '[+] ' + ips[0] + ": " + banner1.strip('\n')  
        checkVulns(banner1)  
    banner2 = retBanner(ips[1],port)  
    if banner2:  
        print '[+] ' + ips[1] + ": " + banner2.strip('\n')  
        checkVulns(banner2)  
  
if __name__ == '__main__':  
    main()  

在这里插入图片描述
相关知识:
1、banner
banner即连上服务器后,服务器的第一条欢迎语句。
通常banner会标识正在运行的服务器,显示服务名称和版本号。

2、什么是套接字:
socket完成的是网络通信功能。网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
在Unix/Linux中,一切皆文件。那对于这两个操作系统而言,“端点”就是一个特殊的文件,也就是说Socket实际上就是文件。既然Socket是文件,那就可以用“打开open –> 读写write/read –> 关闭close”模式来操作它,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)
  
3、Python strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。
注意:该方法只能删除开头或是结尾的字符,不能删除中间部分的字符。
语法:str.strip([chars]);

4、python获取banner基本代码

import socket
socket.setdefaulttimeout(2)
s=socket.socket
s.connet("192.168.80.30",21)
ans=s.recv(1024)
s.close()
print ans

第一行,导入socket模块。
第二行,设置超时时间,如果两秒之内无法建立联系,就超时退出。
第三行,定义了一个s对象,表示引用socket模块中的socket方法来建立一个socket。
第四行,s.connect表示调用socket模块中connect方法来连接目标主机。
第五行,接受返回信息中的前1024B数据。
第六行,关闭连接。
第七行,输出接收到的信息。

迭代

for语句

portList=[21,22,25,80,110]
for x in range(1,255):
    for port in portList:
        print("[+] checking 192.168.95."+str(x)+":" +str(port))

两个for循环可以可以打印出ip地址和端口号信息。

import socket  
  
def retBanner(ip,port):  
    try:  
        socket.setdefaulttimeout(2)  
        s = socket.socket()  
        s.connect((ip,port))  
        banner = s.recv(1024)  
        return banner  
    except:  
        return  
  
def checkVulns(banner):  
    if 'vsFTPd' in banner:  
        print '[+] vsFTPd is vulnerable.'  
    elif 'FreeFloat Ftp Server' in banner:  
        print '[+] FreeFloat Ftp Server is vulnerable.'  
    else:  
        print '[-] FTP Server is not vulnerable.'  
    return  
  
def main():  
    portList = [21,22,25,80,110,443]  
    ip = '10.10.10.128'  
    for port in portList:  
        banner = retBanner(ip,port)  
        if banner:  
            print '[+] ' + ip + ':' + str(port) + '--' + banner  
            if port == 21:  
                checkVulns(banner)  
  
if __name__ == '__main__':  
    main()  

在这里插入图片描述

文件输入/输出

open()打开文件,r只读,r+读写,w新建(会覆盖原有文件),a追加,b二进制文件
同一目录中:
在这里插入图片描述
不同目录中:
从当前目录开始往下查找,前面加上.

f=open("./home/liu/1.txt","r")
for text in f.readlines():
	print(text.strip())

在这里插入图片描述

或者是绝对路径则不用加.号表示从当前目录开始

sys模块

内置的sys模块让我们能够访问到由python解释器使用或维护的对象,可用的模块,标准输入,输出,错误的位置,以及调用解析器的命令行参数。
例如:解析命令行参数
如果我们想把一个文本文件的文件名作为命令行参数传递进来如何办?
sys.argv列表中含有所有的命令行参数,sys.argv[0]为Python脚本的名称,其余的都是命令行参数,如果我们传递一个额外的参数,sys.argv就因该包含两个元素。

import sys 
if len(sys.argv)==2: 
        filename=sys.argv[1] 
        print  "read vulne form :"+filename

在这里插入图片描述

OS模块

这个模块允许程序独立地于操作系统环境,文件系统,用户数据库以及权限进行交互。上个例子我们将文件作为参数传递进来,我们来检查一下当前用户是否有权限读取文件.

import sys  
import os  
if len(sys.argv) == 2:  
    filename = sys.argv[1]  
    if not os.path.isfile(filename):  
        print '[-] ' + filename + ' does not exit.'  
        exit(0)  
    if not os.access(filename,os.R_OK):  
        print '[-] ' + filename + ' access denied.'  
        exit(0)  
    print '[+] Reading From: ' + filename  

在这里插入图片描述
在这里插入图片描述
相关知识:
1、os.path.isfile()检查该文件是否存在、os.access()判断当前用户是否有权限读取该文件

2、exit(0):无错误退出、exit(1):有错误退出
退出代码是告诉解释器的(或操作系统)
sys.argv[0]是代表当前所执行的脚本
sys.argv[1] 脚本第一个参数
所以len(sys.argv)==2代表当前脚本含有1个参数。

3、python sys.argv是什么?
sys.argv 是获取运行python文件的时候命令行参数,且以list形式存储参数。
sys.argv[0] 代表当前module的名字。
下面的代码文件是a.py,当我不用IDE工具,只用命令行窗口运行的时候,进入文件所在目录,输入:python a.py 输出结果如下

a=sys.argv
b=len(sys.argv)
print(a)
print(b)

输出:
['a.py']
1

还是上面的代码,当我运行时候输入:python a.py zhang 输出如下

['a.py', 'zhang']
2

继续运行时候输入:python a.py zhang kang 输出如下

['a.py', 'zhang', 'kang']
3

现在分别获取输入的参数值:
python a.py zhang kang

#encoding=utf-8
import sys
a=sys.argv[0]
b=sys.argv[1]
c=sys.argv[2]
print("filename:",a)
print("param1:",b)
print("param2:",c)

输出:
('filename:', 'a.py')
('param1:', 'zhang')
('param2:', 'kang')

banner信息的扫描

将上述各个模块整合起来,实现对目标主机的端口及其banner信息的扫描:

import socket  
import sys  
import os  
  
def retBanner(ip,port):  
    try:  
        socket.setdefaulttimeout(2)  
        s = socket.socket()  
        s.connect((ip,port))  
        banner = s.recv(1024)  
        return banner  
    except:  
        return  
  
def checkVulns(banner,filename):  
    f = open(filename, 'r')  
    for line in f.readlines():  
        if line.strip('\n') in banner:  
            print '[+] Server is vulnerable: ' + banner.strip('\n')  
  
def main():  
  
    if len(sys.argv) == 2:  
  
        filename = sys.argv[1]  
        if not os.path.isfile(filename):  
            print '[-] ' + filename + ' does not exit.'  
            exit(0)  
  
        if not os.access(filename,os.R_OK):  
            print '[-] ' + filename + ' access denied.'  
            exit(0)  
  
        print '[+] Reading From: ' + filename  
    else:  
        print '[-] Usage: ' + str(sys.argv[0]) + ' <vuln filename>'  
        exit(0)  
  
    portList = [21,22,25,80,110,443]  
    ip = '192.168.43.20'  
    for port in portList:  
        banner = retBanner(ip,port)  
        if banner:  
            print '[+] ' + ip + ':' + str(port) + '--' + banner  
            if port == 21:  
                checkVulns(banner,filename)  
  
if __name__ == '__main__':  
    main()  

运行结果:

在这里插入图片描述
相关知识:
readlines() 方法:用于读取所有行(直到结束符 EOF)并返回列表,该列表可以由 Python 的 for… in … 结构进行处理。
如果碰到结束符 EOF 则返回空字符串
readlines() 方法语法如下:
fileObject.readlines( );
参数 无。
返回值 返回列表,包含所有的行。

#打开文件
fo = open("runoob.txt", "r")
print "文件名为: ", fo.name
 
for line in fo.readlines():               #依次读取每行  
    line = line.strip()                 #去掉每行头尾空白  
    print "读取的数据为: %s" % (line)
#关闭文件
fo.close()
文件名为:  runoob.txt
读取的数据为: 1:www.runoob.com
读取的数据为: 2:www.runoob.com
读取的数据为: 3:www.runoob.com
读取的数据为: 4:www.runoob.com
读取的数据为: 5:www.runoob.com
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值