Python 制作 Netcat(2)

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

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

    556 引用 • 674 回帖
  • NetCAT
    7 引用 • 7 回帖
  • 渗透
    11 引用 • 11 回帖

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    245 引用 • 1338 回帖 • 1 关注
  • RabbitMQ

    RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种语言客户端,如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    49 引用 • 60 回帖 • 354 关注
  • Thymeleaf

    Thymeleaf 是一款用于渲染 XML/XHTML/HTML5 内容的模板引擎。类似 Velocity、 FreeMarker 等,它也可以轻易的与 Spring 等 Web 框架进行集成作为 Web 应用的模板引擎。与其它模板引擎相比,Thymeleaf 最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个 Web 应用。

    11 引用 • 19 回帖 • 382 关注
  • 酷鸟浏览器

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

    3 引用 • 59 回帖 • 45 关注
  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 174 关注
  • Netty

    Netty 是一个基于 NIO 的客户端-服务器编程框架,使用 Netty 可以让你快速、简单地开发出一个可维护、高性能的网络应用,例如实现了某种协议的客户、服务端应用。

    49 引用 • 33 回帖 • 32 关注
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    139 引用 • 269 回帖
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 678 关注
  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    52 引用 • 228 回帖
  • RemNote
    2 引用 • 16 回帖 • 9 关注
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 397 关注
  • 笔记

    好记性不如烂笔头。

    311 引用 • 796 回帖
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    12 引用 • 54 回帖 • 168 关注
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖 • 2 关注
  • HTML

    HTML5 是 HTML 下一个的主要修订版本,现在仍处于发展阶段。广义论及 HTML5 时,实际指的是包括 HTML、CSS 和 JavaScript 在内的一套技术组合。

    108 引用 • 295 回帖 • 2 关注
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    20 引用 • 23 回帖 • 735 关注
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    79 引用 • 431 回帖
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖
  • OpenStack

    OpenStack 是一个云操作系统,通过数据中心可控制大型的计算、存储、网络等资源池。所有的管理通过前端界面管理员就可以完成,同样也可以通过 Web 接口让最终用户部署资源。

    10 引用
  • 反馈

    Communication channel for makers and users.

    126 引用 • 929 回帖 • 266 关注
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 498 关注
  • frp

    frp 是一个可用于内网穿透的高性能的反向代理应用,支持 TCP、UDP、 HTTP 和 HTTPS 协议。

    20 引用 • 7 回帖
  • Firefox

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

    7 引用 • 30 回帖 • 398 关注
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 93 关注
  • 游戏

    沉迷游戏伤身,强撸灰飞烟灭。

    180 引用 • 821 回帖
  • 国际化

    i18n(其来源是英文单词 internationalization 的首末字符 i 和 n,18 为中间的字符数)是“国际化”的简称。对程序来说,国际化是指在不修改代码的情况下,能根据不同语言及地区显示相应的界面。

    8 引用 • 26 回帖
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1063 引用 • 3455 回帖 • 166 关注