软件工程 第四周的博客
简要概述 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  |