Python 制作 Netcat(2)

本贴最后更新于 2470 天前,其中的信息可能已经沧海桑田

知道了 UDP 和 TCP 通信之后,我们现在正式的来设计一下 Python 版本的 NetCat。
首先指定编码以及引入必要的模块,全局变量。

#!/usr/bin/python #-*- coding:utf8 -*- import sys import socket import getopt import threading import subprocess listen = False command = False upload = False execute = "" target = "" upload_destination = "" port = 0

  由于博主很少用 Python,所以当时看书的时候没看懂 getopt 和 subprocess 这个模块,相信很多 Python 初学者应该也对这两个模块比较的陌生。

getopt

大部分学习 Python 语言的人应该都学过 C 语言,其中 C 语言中主函数的写法是这样的

#include <stdio.h> int main(int arg,char *argv[]) { printf("%d\n",arg); for(int i=0;i<arg;i++) { printf("%s\n",argv[i]); } return 0; }

博主使用的是 arch linux,使用 gcc 编译后输入

gcc a.c -o a ./a 1 2 3

得到的输出为

4 ./a 1 2 3

  所以可以发现,第一个变量 arg 就是数组 argv 的长度,而 argv 数组中 argv[0]是你运行时输入的那个东西(我也不知道怎么解释,你可以理解为文件名),其余的几个就是你输入的参数。
而在 Python 中也是差不多的意思。
getopt 模块中有两个函数,

getopt.getopt getopt.gnu_getopt

属性:

getopt.error getopt.GetoptError

这两个属性主要是用来抛出错误信息的,非常友好不是吗?

getopt.getopt(args, shortopts, longopts=[])

args 指的是当前脚本接收的参数,它是一个列表,可以通过 sys.argv 获得

shortopts 是短参数  啥是短参数啊?  类似于 这样:python test.py -h # 输出帮助信息 longopts 是长参数  啥是长参数啊?  类似于 这样:python test.py -help # 输出帮助信息

试着运行这个 Python 小例子,

import sys import getopt arg = getopt.getopt(sys.argv[0:],'-h',['help']) print(arg)
Python test.py 1 2

再试试吧 argv 中的 0 改成 1 看看。

可以发现,返回值是一个 list
假设我们需要匹配例如 python test.py -h 一类的应该怎么办呢?
试试下面这个小例子

import getopt import sys opts,args = getopt.getopt(sys.argv[1:],'-h-f:-v',['help','filename=','version']) for opt_name,opt_value in opts: if opt_name in ('-h','--help'): print("[*] Help info") exit() if opt_name in ('-v','--version'): print("[*] Version is 0.01 ") exit() if opt_name in ('-f','--filename'): fileName = opt_value print("[*] Filename is ",fileName) # do something exit()

试试

python test.py -h python test.py -f test

相信你做到现在,你已经明白了如何去与命令交互了。

来详细解释一下这几行代码
首先从短参数名开始。
我定义了'-h-f:-v' 大家发现没有,在-f 后面多了一个":"
这个":"代表了当前参数是有值的,是一个参数名 + 参数值的参数
如果我再加一个-o: 那么证明-o 后面是可以接收一个值,这个值就是-o 的参数值,将会保存到 opts 变量中。
长参数名的方式和短参数差不多,唯一的区别就是长参数如果要接收值,那必须得在后面加上一个"="

subprocess 模块稍微一搜,发现是一个对子进程管理的一个模块,秒懂。

与命令行的交互设计
首先设计一个函数,作为一个用户帮助函数。

def usage(): print "NetCat by TionchTy" print print print "Usage: NetCat.py -t target_host -p port" print print "-l --listen - listen on [host]:[port] for incoming connections" print "-e --execute=file_to_run - execute the govem file upon receiving a connection" print "-c --command - initialize a command shell" print "-u --upload=destination - upon receiving connection upload a file and write to [destination]" print print print "Exeamples:" print "NetCat.py -t 192.168.0.1 -p 5555 -l -c" print "NetCat.py -t 192.168.0.1 -p 5555 -l -u=C:\\target.exe" print "NetCat.py -t 192.168.0.1 -p 5555 -l -e=\"cat /etc/passwd\"" print "echo \"somethings\" | ./NetCat.py -t 192.168.11.12 -p 135"

很简单,只不过是一些输出罢了
设计一个主函数与命令行交互

def main(): global listen global port global execute global command global upload_destination global target if not len(sys.argv[1:]): usage() try: opts,args = getopt.getopt(sys.argv[1:],"hle:t:p:cu:",["help","listen","execute","target","port","command","upload"]) except getopt.GetoptError as err: print str(err) usage() for o,a in opts: if o in ("-h","--help"): usage() elif o in ("-l","--listen"): listen = True elif o in ("-e","--execute"): execute = a elif o in ("-c","--commandshell"): command = True elif o in ("-u","--upload"): upload_destination = a elif o in ("-t","--target"): target = a elif o in ("-p","--port"): port = int(a) else: assert False,"[!]Unhandled Option" if not listen and len(target) and port > 0: buffer = sys.stdin.read() client_sender(buffer) if listen: server_loop()

其中这里面 server_loop,client_sender 函数是自己写的,具体的我会在下一篇博客中详细的解释。

#Refrence

简书 Python 命令行:getopt 模块详解

  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    554 引用 • 675 回帖 • 1 关注
  • NetCAT
    7 引用 • 7 回帖
  • 渗透
    11 引用 • 11 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    6 引用 • 26 回帖 • 545 关注
  • danl
    181 关注
  • Word
    13 引用 • 41 回帖
  • 智能合约

    智能合约(Smart contract)是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于 1994 年由 Nick Szabo 首次提出。

    1 引用 • 11 回帖 • 2 关注
  • 酷鸟浏览器

    安全 · 稳定 · 快速
    为跨境从业人员提供专业的跨境浏览器

    3 引用 • 59 回帖 • 52 关注
  • GitBook

    GitBook 使您的团队可以轻松编写和维护高质量的文档。 分享知识,提高团队的工作效率,让用户满意。

    3 引用 • 8 回帖
  • Mobi.css

    Mobi.css is a lightweight, flexible CSS framework that focus on mobile.

    1 引用 • 6 回帖 • 767 关注
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    85 引用 • 324 回帖
  • FlowUs

    FlowUs.息流 个人及团队的新一代生产力工具。

    让复杂的信息管理更轻松、自由、充满创意。

    1 引用
  • 博客

    记录并分享人生的经历。

    273 引用 • 2389 回帖
  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 261 关注
  • Rust

    Rust 是一门赋予每个人构建可靠且高效软件能力的语言。Rust 由 Mozilla 开发,最早发布于 2014 年 9 月。

    59 引用 • 22 回帖 • 8 关注
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    730 引用 • 1284 回帖 • 1 关注
  • 尊园地产

    昆明尊园房地产经纪有限公司,即:Kunming Zunyuan Property Agency Company Limited(简称“尊园地产”)于 2007 年 6 月开始筹备,2007 年 8 月 18 日正式成立,注册资本 200 万元,公司性质为股份经纪有限公司,主营业务为:代租、代售、代办产权过户、办理银行按揭、担保、抵押、评估等。

    1 引用 • 22 回帖 • 800 关注
  • Firefox

    Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。

    7 引用 • 30 回帖 • 369 关注
  • FFmpeg

    FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

    23 引用 • 32 回帖 • 7 关注
  • OneNote
    1 引用 • 3 回帖
  • CSDN

    CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。

    14 引用 • 155 回帖 • 1 关注
  • 996
    13 引用 • 200 回帖 • 2 关注
  • 负能量

    上帝为你关上了一扇门,然后就去睡觉了....努力不一定能成功,但不努力一定很轻松 (° ー °〃)

    89 引用 • 1251 回帖 • 391 关注
  • Ubuntu

    Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的 Linux 操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu 的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。

    127 引用 • 169 回帖 • 1 关注
  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 726 关注
  • Ant-Design

    Ant Design 是服务于企业级产品的设计体系,基于确定和自然的设计价值观上的模块化解决方案,让设计者和开发者专注于更好的用户体验。

    17 引用 • 23 回帖 • 5 关注
  • H2

    H2 是一个开源的嵌入式数据库引擎,采用 Java 语言编写,不受平台的限制,同时 H2 提供了一个十分方便的 web 控制台用于操作和管理数据库内容。H2 还提供兼容模式,可以兼容一些主流的数据库,因此采用 H2 作为开发期的数据库非常方便。

    11 引用 • 54 回帖 • 671 关注
  • GraphQL

    GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。

    4 引用 • 3 回帖 • 4 关注
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    118 引用 • 54 回帖 • 5 关注
  • WordPress

    WordPress 是一个使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设自己的博客。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一个免费的开源项目,在 GNU 通用公共许可证(GPLv2)下授权发布。

    46 引用 • 114 回帖 • 167 关注