此工具的目的是实现在目标主机上的文件传输,控制命令行的功能,主要逻辑依靠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的更多相关文章

  1. Python渗透测试工具合集

    摘自:http://www.freebuf.com/tools/94777.html 如果你热爱漏洞研究.逆向工程或者渗透测试,我强烈推荐你使用 Python 作为编程语言.它包含大量实用的库和工具, ...

  2. python渗透测试工具集合

    作者:一起学习Python 原文链接:https://zhuanlan.zhihu.com/p/21803985 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 在进行漏洞研究. ...

  3. python渗透测试工具包

    网络 Scapy, Scapy3k: 发送,嗅探,分析和伪造网络数据包.可用作交互式包处理程序或单独作为一个库.pypcap, Pcapy, pylibpcap: 几个不同 libpcap 捆绑的py ...

  4. Python 渗透测试编程技术方法与实践 ------全书整理

    1.整个渗透测试的工作阶段 ( 1 )前期与客户的交流阶段.( 2 )情报的收集阶段.( 3 )威胁建模阶段.( 4 )漏洞分析阶段.( 5 )漏洞利用阶段.( 6 )后渗透攻击阶段.( 7 )报告阶 ...

  5. python渗透测试入门——基础的网络编程工具

    <Python黑帽子--黑客与渗透测试编程之道学习>这本书是我在学习安全的过程中发现的在我看来十分优秀的一本书,业内也拥有很高的评价,所以在这里将自己的学习内容分享出来. 1.基础的网络编 ...

  6. Python渗透测试工具库

    漏洞及渗透练习平台 WebGoat漏洞练习平台: https://github.com/WebGoat/WebGoat webgoat-legacy漏洞练习平台: https://github.com ...

  7. 我的python渗透测试工具之主机嗅探

    嗅探工具的主要目标是基于UDP发现目标网络中的存活主机,选择UDP的原因是UDP访问过程开销小. 由于很多的操作系统在处理UDP端口的闭合时都会存在一个共性,我们也正是利用这个共性来开展确定此IP上是 ...

  8. python渗透测试工具集

    下载地址:https://github.com/githubmaidou/tools

  9. python渗透测试入门——取代netcat

    1.代码及代码讲解. 实验环境:windows10下的linux子系统+kali虚拟机 import argparse import socket import shlex import subpro ...

随机推荐

  1. 【爆料】-《亚伯大学毕业证书》Aber一模一样原件

    ☞亚伯大学毕业证书[微/Q:865121257◆WeChat:CC6669834]UC毕业证书/联系人Alice[查看点击百度快照查看][留信网学历认证&博士&硕士&海归&am ...

  2. Word2Vec总结

    摘要: 1.算法概述 2.算法要点与推导 3.算法特性及优缺点 4.注意事项 5.实现和具体例子 6.适用场合 内容: 1.算法概述 Word2Vec是一个可以将语言中的字词转换为向量表达(Vecto ...

  3. MFC多语言程序版本,在不同的windows系统上的使用

    如何使MFC程序界面支持多国语言?这次使用后给自己做一个总结. 我们使用vc6.0的版本来试验 1. 切换到资源视图,右键Dialog->Insert Copy 2. ok后,会出来一个语言的选 ...

  4. JavaScript使用闭包实现单例模式

    闭包是JS的一种特性,其中一点就是:可以将外部函数的变量保存在内存中,利用这一特性,我们可以用来实现类的单例模式. 首先需要了解何为单例模式: 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问 ...

  5. Android编译自己的程序到/system/bin

    背景 有时候我们想创建一个程序,放在系统中,供其他APP执行.我们知道,在生成system.img的时候,编译系统会将out/target/product/[product]/system/bin目录 ...

  6. C#开发APP,ToolBar控件在Smobiler中的使用方式【附案例源码】——Smobiler移动开发平台

    控件说明 底部工具栏控件. 效果演示 其他效果 该界面为仿淘宝UI制作的一个简单的UI模板,源码获取方式请拉至文章末尾. 特色属性 属性 属性说明 Direction(相对布局) 容器主轴方向. Fl ...

  7. Dynamics 365 CE的插件/自定义工作流活动中调用Web API示例代码

    微软动态CRM专家罗勇 ,回复325或者20190428可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me! 现在Web API越来越流行,有时候为了程序更加健壮,需要在插件 ...

  8. svn统计代码行数(增量)

    转载请标明出处,维权必究:https://www.cnblogs.com/tangZH/p/10770296.html android代码,两个版本之间,代码行数增加了多少,怎么得出呢? 1.安装To ...

  9. June 29th. 2018, Week 26th. Friday

    Real love is always worth waiting for. 真爱永远值得等待. From Westworld. Real love is rare, but it does exis ...

  10. Sitecore® 8.2 Professional Developer考试心得

    因工作原因入了Sitecore的坑.. 不了解Sitecore认证考试的同学请移步: http://www.cnblogs.com/edisonchou/archive/2018/08/17/9488 ...