软件工程 第四周的博客
简要概述 CTF OverTheWire Bandit Level 25
题目
从
bandit25
登录到bandit26
,用户bandit26
的shell
不是/bin/bash
,而是其他东西。找出它是什么,它是如何工作的,以及如何打破它。
先利用ssh
连接到bandit.labs.overthewire.org
的服务器,端口号2220
,为此我们需要bandit25
的密码。
1 | ssh bandit25@bandit.labs.overthewire.org -p 2220 |
以bandit25
进入 Level 25 之后先列举/home/bandit25
有什么可以帮助通关的东西:
1 | find . -maxdepth 1 -exec file {} 2>/dev/null \; |
.: directory
./.bash_logout: ASCII text
./.bashrc: ASCII text
./bandit26.sshkey: PEM RSA private key
./.profile: ASCII text
./.pin: ASCII text, with no line terminators
./.bandit24.password: ASCII text
find
: 查找指令
.
-maxdepth 1
: 类似于lodash.js
中的flattenDepth
的功能,用于拓展平铺树状结构,1
代表一层
-exec <...> \;
: 代表执行,和ps
,kill
,id
,stat
属于一类指令,多用于管理系统进程,这里我图方便用来替代for
用一下。注意一定要在运行完<...>
用;
结束进程,;
前面用\
取消原本的意义
file
: 查询文件类型,{}
是placeholder
,和 HTML 里的那个placeholder
一个意思
2>/dev/null
:2
是报错信息的status code
,/dev/null
是系统的bit dump
,因此这句的完整的意思就是不让报错信息输出到stdout
很明显bandit26.sshkey
有用,是bandit26
的 SSH 密钥。
我们就用它来连接bandit26
:
1 | ssh -i bandit26.sshkey -p 2220 bandit26@localhost |
-i
代表identifier
,就是身份验证
接着,在handshake
阶段选’yes’
然后,我们就被踢出来了。。。
_ _ _ _ ___ __ | | | (_) | |__ \ / / | |__ __ _ _ __ __| |_| |_ ) / /_ | '_ \ / _` | '_ \ / _` | | __| / / '_ \ | |_) | (_| | | | | (_| | | |_ / /| (_) | |_.__/ \__,_|_| |_|\__,_|_|\__|____\___/ Connection to localhost closed.
不急,去看看bandit26
的用户信息。
在类Unix系统中(包括GNU - GNU’s Not Unix,也就是Linux),用户信息在系统文件
/etc/passwd
里 - 这是常识,要记住!
1 | cat /etc/passwd | grep "bandit26" |
先不用管别的,我们要找的是最后一列,也就是代表每个用户的初始shell
。
一开始有说过,bandit26
用的shell
不是bash
,是别的东西。众所周知,因为shell
负责翻译所有的指令成机码并输出给kernel
执行,所以shell
是开启终端进程时运行的第一个程序。因此,我们登陆不上bandit26
肯定和这个用户修改了他的default shell
有关。
先cat /usr/bin/showtext
看一下他的初始shell
是什么。
1 |
|
好家伙,改了个参数,打印了个图标就退出了,怪不得登录不上。
不过因为bandit26
用的是more
指令,而more
指令如果在一个窗口里打印不出文本就会卡壳,我们可以钻这个漏洞,就是把窗口缩到特别小,然后再尝试登陆。
完美,它卡了。。。
1 | # |
我们可以在more
的窗口里用!
加任何指令开启一个subshell
,也可以直接v
打开vim
编辑器。
我们选择后者。
进入vim
之后按老规矩先ESC
进入普通模式,然后按:
键,跟在后面输入指令就可以改shell
了
1 | set shell=/bin/bash |
我们现在应该是以bandit26
的身份登陆了。
然后需要做的就是去取下一关的密码了。
1 | cat /etc/bandit_pass/bandit26 |