Python编程–sys模块及OS模块简单用例
sys模块
内置的sys模块使我们能访问到由Python解释器使用或维护的对象,其中包括标志、版本、整型数的最大尺寸、可用的模块、hook路径、标准错误/输入/输出的位置,以及调用解释器的命令行参数。比如,我们或许想要在运行时解析命令行参数。比如,漏洞扫描器:如果我们想把一个文本文件的文件名作为命令参数传递进来该怎么办?sys.argv列表中含有所有的命令行参数。第一个sys.argv[0]元素中的是Python脚本名称,列表中的其余参数则记录了之后所有的命令行参数。如果我们只传递一个额外的参数,sys.argv中应该包含两个元素,也就是sys.argv列表的长度为2。
import sys
if len(sys.argv) == 2:
filename = sys.argv[1]
print(f"[+] Reading Vulnerabilities From: {filename}" )
运行这段代码,我们看到代码成功地解析了命令行参数,如下图所示:
OS模块
内置的OS模块提供了丰富的适用于Mac、NT或Posix的操作系统的函数。这个模块允许程序独立地与操作系统环境、文件系统、用户数据库以及权限进行交互。上面的例子中,把一个文本文件名(vuln-banners.txt)作为参数传递进来,先检查一下该文件是否存在、当前用户是否有权限读取该文件,或许很有价值。如果其中任一条件不满足,就向用户显示一条相应的错误信息是很有帮助的。示例代码如下:
import os, sys
if len(sys.argv) == 2: # 只传递一个文件名参数
filename = sys.argv[1] # 获取文件名,并赋值给filename
if not os.path.isfile(filename): # 判断文件是否存在
print(f'[-] {filename} does not exist.')
exit(0)
if not os.access(filename, os.R_OK): # 判断文件是否有访问权限
print(f'[-] {filename} access denied.')
exit(0)
print(f'[+] Reading Vulnerables From: {filename}')
为验证代码,先尝试读取一个不存在的文件,脚本提示错误信息后,创建一个特定的文件名并成功读取其中的内容。最后,限制权限,脚本则正确地提示拒绝访问(access-denied)
+] Reading Vulnerablities From: vuln-banners.txt
(base) liuxiaowei@MacBook-Air hacker_python % python test.py vuln-banne.txt
[-] vuln-banne.txt does not exist.
(base) liuxiaowei@MacBook-Air hacker_python % python test.py vuln-banners.txt
[+] Reading Vulnerables From: vuln-banners.txt
(base) liuxiaowei@MacBook-Air hacker_python % python test.py vuln-banners.txt
[-] vuln-banners.txt access denied.
现在整合这两个模块的应用,示例代码如下:
import socket
import os
import sys
# 定义返回banner函数,参数为(ip,port)
def retBanner(ip, port):
try:
socket.setdefaulttimeout(2)
s = socket.socket()
s.connect((ip, port))
banner = s.recv(1024)
return banner
except:
return
# 定义测试漏洞函数,参数为banner,filename
def checkVulns(banner, filename):
with open(filename, 'r') as f:
for line in f.readlines():
if line.strip('\r\n') in banner:
print(f'[+] Server is vulnerable: {banner.strip("\n")}')
def main():
if len(sys.argv) == 2:
filename = sys.argv[1]
if not os.path.isfile(filename):
print(f'[-] {filename} does not exist.')
exit(0)
if not os.access(filename, os.R_OK):
print(f'[-] {filename} access denied.')
exit(0)
else:
print('[-] Usage: ' + str(sys.argv[0]) + ' <vuln filename>')
exit(0)
portLst = [21, 22, 25, 80, 110, 443]
for i in range(147, 150):
ip = '192.168.31.' + str(i)
for port in portLst:
banner = retBanner((ip, port))
if banner:
print('[+] '+ ip + ': ' + banner)
checkVulns(banner, filename)
if __name__ == '__main__':
main()