我的python渗透测试工具箱之自制netcat
此工具的目的是实现在目标主机上的文件传输,控制命令行的功能,主要逻辑依靠python的subprocess模块、`sys`模块和`getopt`模块。
知识准备
studin和studut
studin和studout是用来获取标准输入输出的,它们是sys模块下的方法。
标准输入输出就是包括/n/t等特殊字符的输出,可以用来作为拆分的条件。
在python中调用print时,事实上调用了sys.stdout.write(obj+'\n'),调用input时则是调用了sys.studin.readline().strip('\n')
subprocess模块
subprocess模块主要是用来执行外部命令的模块,
1,subprocess.call(),执行命令,并返回执行状态,其中shell参数为False时,命令需要通过列表的方式传入,当shell为True时,可直接传入命令。
2,subprocess.check_call(),增加当返回值不为0时,直接抛出异常。。
3,在此脚本中,主要使用subprocess.check_output(),它会做两件事:
· 检查返回值,如果不为0则代表当前进程执行失败。
· 返回标准输出结果。
sys模块
sys模块是python和解释器交互的模块,较为容易理解,在这个脚本中我们主要用的是它的`sys.argv`。
sys.argv,它的作用是返回将执行脚本的路径和命令参数整合到一个list中返回,list的第一项是当前脚本的路径。

大家看到这可能会有疑问,sys.argv返回值的第一项确实是路径,这里显示文件名是因为我是在文件同级目录下运行的。
getopt模块
getopt模块大家可能见到的比较少,在网上各式各样的解释也让人眼花缭乱,这里说一下我的理解。
getopt模块有两个方法,这里主要介绍getopt.getopt()。它的作用其实两个字就能说明:匹配。
getopt.getopt会返回匹配到的命令行参数和参数值组成的元组。
有三个参数:
1,命令行参数,我们可以通过sys.argv[1:]来获取,把路径元素跳过。
2,短参数的匹配规则。短参数就是 -h,-l,-v这种的,加上 `:`就代表":"左右两边的参数有值。
3,长参数的匹配规则,长参数就是-help,-version,-command这种,加上`=`就代表该参数有值。
有两个返回值:
1,匹配到的命令行参数及其值 组成的元组 构成的列表。
2,未匹配到的命令行参数。
示例代码:

运行结果:

程序代码及讲解
import sys
import getopt
import socket
import subprocess
import threading #设置全局变量
listen = False
command = False
upload = False
execute = ""
host = ""
upload_path = ""
port = 0 def help():
'''
这里就是一些注释及使用方法说明,如果用中文怕不支持,英文我还不会
:param:null
:return: none
'''
print("knife tools")
print("-l --listen ")
print("-t --host ")
print("-c --command ")
print("-u --upload ")
sys.exit(0) #退出命令 #命令执行,通过suprocess.checkoutout
def run_command(command):
command = command.strip()
try:
output = subprocess.check_output(command, stderr=subprocess.STDOUT, shell=True)
except:
output = "Failed to execute command.\r\n"
return output def client_handler(client_socket):
'''
通过不同参数的长度来决定处理什么事务
:param client_socket:也就是服务端的我们习惯的conn
:return:
'''
#定义全局变量
global upload
global command #上传文件功能
if len(upload_path):
file_buffer = ""
while True:
data = client_socket.recv(1024)
if not data:
break
else:
file_buffer += data #简单的文件操作
try:
with open(upload_path, "wb") as f:
f.write(file_buffer)
client_socket.send("Successfully saved file to %s\r\n" % upload_path)
except:
client_socket.send("Failed to save file to %s\r\n" % upload_path) #执行命令
if command:
while True: #会夯住,客户端会模拟命令行输入
client_socket.send("<command:#> ")
cmd_buffer = ""
while "\n" not in cmd_buffer:
cmd_buffer += client_socket.recv(1024)
#返回命令执行结果
response = run_command(cmd_buffer)
client_socket.send(response) def client_sender(buffer):
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
client.connect((host, port)) if len(buffer):
client.send(buffer)
#接收数据并回传,以字符串大的形式储存到response中
while True:
recv_len = 1
response = ""
while recv_len:
data = client.recv(4096)
recv_len = len(data)
response += data
if recv_len < 4096:
break
print(response) #夯住,继续获取命令行输入并继续传输
buffer = input("")
buffer += "\n"
client.send(buffer)
except:
client.close() #通过socket创建服务端
def server_loop():
global host
global port
if not len(host):
host = "0.0.0.0"
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((host, port))
server.listen(5)
#建立多线程处理
while True:
client_socket, addr = server.accept()
client_thread = threading.Thread(target=client_handler, args=(client_socket,))
client_thread.start() def main():
'''
主函数
:param:null
'''
global listen
global port
global command
global upload_path
global host #判断命令行参数,如果个数为零,那么就输出错误信息并且退出
if not len(sys.argv[1:]):
help()
try:
opts,args = getopt.getopt(sys.argv[1:],"hl:t:p:cu",["help","listen","execute","host","port","command","upload"])
except getopt.GetoptError as err:
print(str(err)) #输出错误信息
help()
#通过if..else..来判断执行什么动作
for o, a in opts:
if o in ("-h", "--help"):
help()
elif o in ("-l", "--listen"):
listen = True
elif o in ("-c", "--commandshell"):
command = True
elif o in ("-u", "--upload"):
upload_destination = a
elif o in ("-t", "--host"):
host = a
elif o in ("-p", "--port"):
port = int(a)
else:
assert False, "Unhandled Option" if not listen and len(host) and port > 0:
#获取标准输入
buffer = sys.stdin.read()
client_sender(buffer) #listen为True则创建监听
if listen:
server_loop() main()
我的python渗透测试工具箱之自制netcat的更多相关文章
- Python渗透测试工具合集
摘自:http://www.freebuf.com/tools/94777.html 如果你热爱漏洞研究.逆向工程或者渗透测试,我强烈推荐你使用 Python 作为编程语言.它包含大量实用的库和工具, ...
- python渗透测试工具集合
作者:一起学习Python 原文链接:https://zhuanlan.zhihu.com/p/21803985 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 在进行漏洞研究. ...
- python渗透测试工具包
网络 Scapy, Scapy3k: 发送,嗅探,分析和伪造网络数据包.可用作交互式包处理程序或单独作为一个库.pypcap, Pcapy, pylibpcap: 几个不同 libpcap 捆绑的py ...
- Python 渗透测试编程技术方法与实践 ------全书整理
1.整个渗透测试的工作阶段 ( 1 )前期与客户的交流阶段.( 2 )情报的收集阶段.( 3 )威胁建模阶段.( 4 )漏洞分析阶段.( 5 )漏洞利用阶段.( 6 )后渗透攻击阶段.( 7 )报告阶 ...
- python渗透测试入门——基础的网络编程工具
<Python黑帽子--黑客与渗透测试编程之道学习>这本书是我在学习安全的过程中发现的在我看来十分优秀的一本书,业内也拥有很高的评价,所以在这里将自己的学习内容分享出来. 1.基础的网络编 ...
- Python渗透测试工具库
漏洞及渗透练习平台 WebGoat漏洞练习平台: https://github.com/WebGoat/WebGoat webgoat-legacy漏洞练习平台: https://github.com ...
- 我的python渗透测试工具之主机嗅探
嗅探工具的主要目标是基于UDP发现目标网络中的存活主机,选择UDP的原因是UDP访问过程开销小. 由于很多的操作系统在处理UDP端口的闭合时都会存在一个共性,我们也正是利用这个共性来开展确定此IP上是 ...
- python渗透测试工具集
下载地址:https://github.com/githubmaidou/tools
- python渗透测试入门——取代netcat
1.代码及代码讲解. 实验环境:windows10下的linux子系统+kali虚拟机 import argparse import socket import shlex import subpro ...
随机推荐
- HTTP 和 WebSocket的区别
有关http和WebSocket 的区别网上有很多的质料. 个人在此仅仅是记录以下自己的学习心得,自己的理解. 1. http协议是用在应用层的协议,他是基于tcp协议的,http协议建立链接也必须要 ...
- Bot Framework 搭建聊天机器人
这周我来跟大家分享的是在Microsoft Build 2016上发布的微软聊天机器人的框架. 现如今,各种人工智能充斥在我们的生活里.最典型的人工智能产品就是聊天机器人,它既可以陪我们聊天,也可以替 ...
- Spark学习之Spark调优与调试(一)
一.使用SparkConf配置Spark 对 Spark 进行性能调优,通常就是修改 Spark 应用的运行时配置选项.Spark 中最主要的配置机制是通过 SparkConf 类对 Spark 进行 ...
- BootStrap:轮播插件
前述 利用 BootStrap 实现图片轮播,包括 基本轮播.带标题的轮播.设置轮播速度的轮播.控制前后的轮播 实例 基本轮播 代码 1.引入bootstrap和jQuery文件 <!-- jQ ...
- 给女朋友讲解什么是Optional【JDK 8特性】
前言 只有光头才能变强 前两天带女朋友去图书馆了,随手就给她来了一本<与孩子一起学编程>的书,于是今天就给女朋友讲解一下什么是Optional类. 至于她能不能看懂,那肯定是看不懂的.(学 ...
- DS控件库 Win7链接列表框的仿Windows开始菜单样式
Win7链接列表框是依照Windows7的开始菜单开发的,同时进行了属性和功能的扩展. 效果图 项属性 控件属性 控件主要事件 点击项(Sender As Win7链接列表框, Itm As 链接项, ...
- Eclipse4JavaEE安装Gradle,并导入我们的Gradle项目
第一步:下载Gradle Gradle下载链接,如下图,下载最新版本即可.下载下来的zip包,解压到一个目录即可,如F盘 第二步:配置环境变量 首先添加GRADLE_HOME,如下图 然后在Path下 ...
- NumPy的基本用法
NumPy简介:NumPy是高性能科学计算和数据分析的基础包.是pandas等其他各种工具的基础NumPy主要功能:ndarray,一个多维数组结构,高效且节省空间无需循环对数组数据进行快速运算的数学 ...
- nginx 安装、启动、重启、关闭 (linux系统命令行)
前言: 最近在部署我的hexo静态博客到腾讯云服务器上,用到了很多nginx的知识,在此做下总结: 刚接触的linux服务器上,nginx配置乱的有点令人发指,就把老的卸载了重新装一下. 1.卸载 y ...
- 两篇文章带你走入.NET Core 世界:CentOS+Kestrel+Ngnix 虚拟机先走一遍(一)
背景: 上一篇:ASP.Net Core on Linux (CentOS7)共享第三方依赖库部署 已经交待了背景,这篇就省下背景了. 折腾的过程分两步: 第一步是:本机跑虚拟机部署试一下: 第二步是 ...