Contents

OverTheWire:Bandit

https://overthewire.org/wargames/是一个学习linux命令的WarGame,通过闯关的模式,不断的学习新的命令,对于学习安全和Linux的朋友是一个很好的练习游戏。

0x00 Level0

用MobaXterm设置ssh连接

输入bandit0密码登录

0x01 level0->level1

0x02 level1-> level2

修改用户名为后,重新连接ssh,密码为boJ9jbbUNNfktd78OOpsqOltutMc3MY1

0x03 level2-> level3

0x04 level3-> level4

0x05 level4-> level5

file命令可以用于辨识文件类型

0x06 level5->level6

Linux find 命令用来在指定目录下查找文件。

Usage: find [-H] [-L] [-P] [-Olevel] [-D debugopts] [path…] [expression]

一些参数说明

-mount, -xdev : 只检查和指定目录在同一个文件系统下的文件,避免列出其它文件系统中的文件

-amin n : 在过去 n 分钟内被读取过

-anewer file : 比文件 file 更晚被读取过的文件

-atime n : 在过去n天内被读取过的文件

-cmin n : 在过去 n 分钟内被修改过

-cnewer file :比文件 file 更新的文件

-ctime n : 在过去n天内被修改过的文件

-empty : 空的文件-gid n or -group name : gid 是 n 或是 group 名称是 name

-ipath p, -path p : 路径名称符合 p 的文件,ipath 会忽略大小写

-name name, -iname name : 文件名称符合 name 的文件。iname 会忽略大小写

-size n : 文件大小 是 n 单位,b 代表 512 位元组的区块,c 表示字元数,k 表示 kilo bytes,w 是二个位元组。

-type c : 文件类型是 c 的文件。
d: 目录
c: 字型装置文件
b: 区块装置文件
p: 具名贮列
f: 一般文件
l: 符号连结
s: socket

-pid n : process id 是 n 的文件

0x07 level6->level7

后查阅资料发现,报错可用2>/dev/null隐藏。Linux系统预留可三个文件描述符:0——标准输入(stdin)、1——标准输出(stdout)和2标准错误(stderr)。>是重定向。/dev/null是一个特殊的设备文件,这个文件接收到任何数据都会被丢弃。这个设备通常也被称为位桶(bit bucket)或黑洞。

0x08 level7->level8

0x09 level8->level9

uniq参数

-c或--count 在每列旁边显示该行重复出现的次数。

-d或--repeated 仅显示重复出现的行列。

-f<栏位>或--skip-fields=<栏位> 忽略比较指定的栏位。

-s<字符位置>或--skip-chars=<字符位置> 忽略比较指定的字符。

-u或--unique 仅显示出一次的行列。

-w<字符位置>或--check-chars=<字符位置> 指定要比较的字符。

--help 显示帮助。

--version 显示版本信息。

0x0A level9->level10

0x0B level10->level11

0x0C level11->level12

ROT13加密

0x0D level12->level13

xxd [options] [infile [outfile]]

xxd -r[evert] [options] [infile [outfile]]

xxd 命令用于用二进制或十六进制显示文件的内容,如果没有指定outfile参数,则把结果显示在屏幕上,如果指定了outfile则把结果输出到 outfile中;如果infile参数为 – 或则没有指定infile参数,则默认从标准输入读入。

-r 逆向操作: 把xxd的十六进制输出内容转换回原文件的二进制内容。

发现文件是gzip格式,mv为.gz文件后,gzip -d解压缩。

发现文件是bzip2格式,mv为.bz2文件后,bzip2 -d解压缩。

接着是嵌套的解压缩

0x0E level13->level14

发现存在ssh的私钥文件。

usage: ssh [-1246AaCfGgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]
           [-D [bind_address:]port] [-E log_file] [-e escape_char]
           [-F configfile] [-I pkcs11] [-i identity_file]
           [-J [user@]host[:port]] [-L address] [-l login_name] [-m mac_spec]
           [-O ctl_cmd] [-o option] [-p port] [-Q query_option] [-R address]
           [-S ctl_path] [-W host:port] [-w local_tun[:remote_tun]]
           [user@]hostname [command]

0x0F level14->level15

Usage: telnet [-4] [-6] [-8] [-E] [-L] [-a] [-d] [-e char] [-l user]
        [-n tracefile] [ -b addr ] [-r] [host-name [port]]

0x10 level15->level16

s_client为一个SSL/TLS客户端程序,与s_server对应,它不仅能与s_server进行通信,也能与任何使用ssl协议的其他服务程序进行通信。使用命令openssl s_client远程连接。

-connect host:port - who to connect to (default is localhost:4433)

0x11 level16->level17

使用nmap -sV localhost -p 31000-32000,-sV 显示详情,-p指定端口。

发现两个可疑目标,开始测试ssl连接。得到一段ssh私钥文件。

提示权限问题

修改权限后再次连接,chmod 600 ssh.priv

0x12 level17->level18

0x13 level18->level19

无法直接使用密码登录。可以用命令直接读取文件。也可以使用ssh bandit18@localhost -T禁用伪终端方式登录。

0x14 level19->level20

id命令用于显示用户的ID,以及所属群组的ID。

0x15 level20->level21

nc是netcat的简写,可以用来取代telnet进行某些服务端口的检测工作。

服务端:nc -l 端口号 > 文件名
客户端:nc 主机的ip或域名 端口号 < 文件名

常用参数:
-l:用于指定nc将处于侦听模式。指定该参数,则意味着nc被当作server
-s:指定发送数据的源IP地址,适用于多网卡机
-u:指定nc使用UDP协议,默认为TCP
-v:输出交互或出错信息,新手调试时尤为有用
-w:超时秒数,后面跟数字
-z:表示zero,表示扫描时不发送任何数据

使用 & 号将下面这个命令放到后台运行

0x16 level21->level22

在LINUX中,周期执行的任务一般由cron这个守护进程来处理。cron读取一个或多个配置文件,这些配置文件中包含了命令行及其调用时间。cron的配置文件称为“crontab”,是“cron table”的简写。

在crontab文件中如何输入需要执行的命令和时间。该文件中每行都包括六个域,其中前五个域是指定命令被执行的时间,最后一个域是要被执行的命令。每个域之间使用空格或者制表符分隔。格式如下: 
minute hour day-of-month month-of-year day-of-week commands&nbsp;
合法值 00-59 00-23 01-31 01-12 0-6 (0 is sunday) 
除了数字还有几个个特殊的符号就是"*"、"/“和”-"、",",*代表所有的取值范围内的数字,"/“代表每的意思,"/5"表示每5个单位,”-“代表从某个数字到某个数字,”,“分开几个离散的数字。

0x17 level22->level23

0x18 level23->level24

stat命令主要用于显示文件或文件系统的详细信息。

语法:stat [option] file

option参数说明:

-L, --dereference 显示符号链接 
-f, --file-system 显示文件系统状态而不是文件状态
-c  --format=FORMAT 自定义输出格式,结尾有换行 
--printf=FORMAT
          如同 --format, 但是解释反斜杠转义,而不是
          输出强制性的换行符; 如果你想换行,
          在FORMAT中包含\n

-t, --terse 以简洁的形式打印信息
--显示此帮助并退出
--version 输出版本信息并退出

其中format可以自定义个数数组的有:

%a     八进制表示的访问权限
%A     可读格式表示的访问权限
%b     分配的块数(参见 %B)
%B     %b 参数显示的每个块的字节数
%d     十进制表示的设备号
%D     十六进制表示的设备号
%f     十六进制表示的 Raw 模式
%F     文件类型
%g     属主的组 ID
%G     属主的组名
%h     硬连接数
%i     Inode 号
%n     文件名
%N     如果是符号链接,显示器所链接的文件名
%o     I/O 块大小
%s     全部占用的字节大小
%t     十六进制的主设备号
%T     十六进制的副设备号
%u     属主的用户 ID
%U     属主的用户名
%x     最后访问时间
%X     最后访问时间,自 Epoch 开始的秒数
%y     最后修改时间
%Y     最后修改时间,自 Epoch 开始的秒数
%z     最后改变时间
%Z     最后改变时间,自 Epoch 开始的秒数

针对文件系统还有如下格式选项:
%a     普通用户可用的块数
%b     文件系统的全部数据块数
%c     文件系统的全部文件节点数
%d     文件系统的可用文件节点数
%f     文件系统的可用节点数
%C     SELinux 的安全上下文
%i     十六进制表示的文件系统 ID
%l     文件名的最大长度
%n     文件系统的文件名
%s     块大小(用于更快的传输)
%S     基本块大小(用于块计数)
%t     十六进制表示的文件系统类型
%T     可读格式表示的文件系统类型

这里参考了大佬的博客,/var/spool/cron/ 这个目录下存放的是每个用户包括root的crontab任务,每个任务以创建者的名字命名,一般一个用户最多只有一个crontab文件。在/var/spool/bandit24目录下就可以运行bandit24的定时任务。

创建脚本,写入cat /etc/bandit_pass/bandit24 > /tmp/bandit24pass

0x19 level24->level25

做出字典,然后执行nc localhost 30002 < 1.txt

for i in {1000..9999}
  do
    echo "UoMYTrfrBFHyQXmg6gzctqAwOmw1IohZ $i " >> 1.txt
  done

0x1A level25->level26

发现存在密钥,执行ssh -i bandit26.sshkey bandit26@localhost,返回失败。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
账号名称:即登陆时的用户名

密码:早期UNIX系统的密码是放在这个文件中的,但因为这个文件的特性是所有程序都能够读取,所以,这样很容易造成数据被窃取,因此后来就将这个字段的密码数据改放到/etc/shadow中了

UID:用户ID,每个账号名称对应一个UID,通常UID=0表示root管理员

GID:组ID,与/etc/group有关,/etc/group与/etc/passwd差不多,是用来规范用户组信息的

用户信息说明栏: 用来解释这个账号是干什么的

家目录:home目录,即用户登陆以后跳转到的目录,以root用户为例,/root是它的家目录,所以root用户登陆以后就跳转到/root目录这里

Shell:用户使用的shell,通常使用/bin/bash这个shell,这也就是为什么登陆Linux时默认的shell是bash的原因,就是在这里设置的,如果要想更改登陆后使用的shell,可以在这里修改。另外一个很重要的东西是有一个shell可以用来替代让账号无法登陆的命令,那就是/sbin/nologin。

将终端对话框缩放小,这样可以自动执行more

在exit 0前,按v进入vim编辑模式,通过:e file,可以导入文件到编辑器内,执行

:e  /etc/bandit_pass/bandit26

0x1B level26->level27

将终端对话框缩放小,以bandit26登录

vim模式下
:set shell=/bin/sh
:sh

0x1C level27->level28

0x1D level28->level29

git clone后查看文件

0x1E level29->level30

git branch -a查看分支,一般dev是development开发者的分支,git checkout切换分支

0x1F level30->level31

git show-ref显示本地存储库中可用的引用以及关联的提交ID。

0x20 level31->level32

0x21 level32->level33

linux shell下的特殊用法及参数的说明:

$$      Shell本身的PID(ProcessID)
$!      Shell最后运行的后台Process的PID
$?      最后运行的命令的结束代码(返回值)
$-      使用Set命令设定的Flag一览
$*      所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$@      所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
$#      添加到Shell的参数个数
$0      Shell本身的文件名
$1~$n  添加到Shell的各参数值。$1是第1参数、$2是第2参数…。

0x22 level33->level34