0×00起因

之前在一个服务器上做测试的时候需要从本地连到服务器上,但是服务器没有开ssh服务,但是有python环境,想着自己写一个脚本可以从自己本地连接到服务器,然后服务器端可以将处理完的请求结果返回到本地。

0×01设计的构图

        image.png

 0×02编码实现

① 服务器与本地实现通讯

首先我们编写在服务器端需要运行的程序,这个程序主要的功能就是接收传入的数据然后对传入的数据进行处理,再然后就是把处理完的结果发送出去。

image.png

大概用着这几个模块,然后定义几个全局的变量。

然后这里我们先编写一个用于提示的函数use()

image.png

然后编写我们的主函数

image.png

这里我们对之前的变量进行全局化,然后检测当脚本运行时是否携带命令,如果没有带命令参数则返回我们的提示信息。

接下来,我们开始写我们的功能函数,第一个功能就是能否对外发送信息,并接收到返回的信息。

image.png

这里我们定义一个函数,首先使用socket创建一个客户端,然后尝试连接指定的地址和端口,默认已经连接成功。然后这里判断该函数是否被传入了数据,如果传入的数据不为空,就将传入的数据发送到指定的地址。

接着我们要等待是否有返回包,对返回包进行接收:

image.png

这里首先测试一下,可以使用向百度发送一个get请求看是否会正常接收到返回的数据。

这里先将target设置为www.baidu.com  port设置为80 如下图

image.png

image.png

然后运行程序,可以看到有返回数据,证明这里的发送数据和接收数据的功能是成功的。

image.png

这里已经可以得到输入了,接下来就是我们要把得到的命令放在本地的操作系统中去运行。

这里我们定义一个run_command函数去执行我们的系统命令还有返回执行结果。

image.png

然后我们测试一下这个函数是否可以成功运行。

image.png

我们这里执行一个pwd的本地命令,看是否可以正常的运行并返回

image.png

然后我们写一个类似于服务端的程序,这个脚本运行在服务器端,必然不会主动去发送请求,必须先接收到命令,然后把命令执行再将命令执行的结果返回。

image.png

这里我们测试服务端是否可以正常使用,这里当服务端接收到数据之后,将数据打印出来,并且向客户端返回信息。

image.png

这里可以看到服务器端和我们本地的客户端已经可以正常通信了,我们把几个重要的函数都已经测试成功了,后续将把这些函数串联起来,并实现简单的shell反弹效果。

 本地执行简单的服务器命令

在服务器端代码中添加多线程函数,用于处理多个客户端连接的问题,首先我们在loop_server函数中加入多线程处理多个客户端连接的代码,这里的意思为每当传入一个端户端连接时启动一个新的线程去处理。

image.png

将主函数进行调整,把loop_server函数融入到main函数中,然后将主函数设置为首先启动的函数。

image.png

此时我们如果直接测试这个脚本的话,你会发现每当运行的时候就会直接退出了,也没有报错,我们分析一下就会发现,这里我们没有启动监听,自然就会退出了,这里我们要写上当没有监听时,我们将线程先阻塞掉,添加以下代码

image.png

这里可以看到需要两个参数,一个是target一个是port,我们设置成,这两个参数我们都在命令行中获取到,在主函数中添加以下代码:

image.png

这段代码的意思就是在命令行中读取相应的参数,读取到响应的参数之后就要按照不同的参数来启动不同的服务了

image.png

接下来就要开始写我们真正功能执行的函数了

image.png

这个函数就是为了接收客户端发来的命令,并且调用本地执行,然后将执行的结果返回给客户端。

我们直接来启动我们的服务器端的脚本:

image.png

L参数是给脚本说要启动监听,p参数是为了告诉脚本要运行在9999端口上,-c命令是说明我们要执行的是命令功能。

我们在客户端同样启动我们的脚本

image.png

T参数是为了告诉脚本我们要连接的目标,p就是我们要连接的目标的端口

按 ctrl+d键来告诉脚本接下来的命令要发送

image.png

按下之后服务器端会给你一个提示,说明已经准备好了,可以发送命令了

我们这里使用pwd命令来测试

image.png

这里服务器端返回了消息,这里我们就把一个简单的命令执行写完了,之后会往里添加文件上传等功能。这里提供一个完整的测试代码下载地址:链接: https://pan.baidu.com/s/1o76TH4e 密码: np3n 

*本文作者: sjy93812