linux命令行bandit使用练习实战

 更新时间:2023年08月18日 10:19:03   作者:goblin_pitcher  
这篇文章主要为大家介绍了linux命令行bandit使用练习实战,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

linux命令很久没用了,最近重新复习一下,找到了一个wargames系列游戏,可以按照要求进行相关命令行操作,从而通关游戏,先从Bandit开始

Level 0~3 (ls)

按要求连接bandit.labs.overthewire.org,端口号2220

ssh bandit0@bandit.labs.overthewire.org -p 2220
 password: bandit0

Level 1~2仅需cd到对应文件夹,cat查看即可,Level3需要查看隐藏文件,ls -a找到隐藏文件即可。

密码如下:

lv1: NH2SXQwcBdpmTEzi3bvBHMM9H66vVXjL
lv2: rRGizSaX8Mk1RTb1CNQoXTcYZWU6lgzi
lv3: aBZ0W5EmUfAf7kHTQeOwd8bauFJ2lAiG
lv4: 2EW7BBsr6aMMoJ2HjW067dm8EgX26xNe

Level 4~7 (grep + find)

Level 4 查找 human-readable文件

这里密码是/^[0-9a-zA-Z]$/格式,因此grep过滤内容,命令如下:

grep -rE "^[0-9a-zA-Z]+$" ./inhere/

Level 5~7条件查找过滤

level5条件如下:

  • human-readable
  • 1033 bytes in size
  • not executable

按过滤的效率,先对比size,再过滤不能执行的,最后用grep过滤内容,命令如下:

find ./inhere/ -type f -size 1033c ! -executable -exec grep -rE "^[0-9a-zA-Z]+$" {} +

level6过滤条件如下:

owned by user bandit7

owned by group bandit6

33 bytes in size

命令如下(因为是练习题,所以换成管道的写法,实际上这里用这种写法效率并不高):

find / -type f -size 33c -user bandit7 -group bandit6 | xargs -I{} grep -rE "^[0-9a-zA-Z]+$" {}

但这样又有一个问题,打印内容中大量Permission denied,这是因为find从根目录开始找,会找到很多无权访问的文件,因此需要将错误重定向,写法如下:

find / -type f 2>>/dev/null -size 33c -user bandit7 -group bandit6 | xargs -I{} grep -rE "^[0-9a-zA-Z]+$" {}

这里2>>/dev/null 是一种重定向操作符,它将标准错误(stderr)输出重定向到 /dev/null 设备。 /dev/null 是一个特殊设备文件,它会将所有写入它的数据丢弃掉,不做任何处理,如果指向的是具体的文件,错误将会被写入该文件中,可用于错误日志。

level7过滤条件如下:

  • in data.txt
  • next to the word millionth

直接上手,写的命令如下

grep "millionth.*" ./data.txt

但这种写法输出是millionth xxxxx,虽然可以得到密码,但我们其实仅需要密码部分,更精准的写法如下:

grep "millionth.*" ./data.txt | cut -f 2
# or
grep -oP "millionth\s+\K.+" ./data.txt

前一种写法代表将查找结果分割,获取第二列。后一种写法是获取正则的捕获组,grep -E的正则貌似没法获取捕获内容,而-p采用Perl的正则语法,\K获取捕获组,配合-o输出捕获组

lv5: lrIWWI6bB37kxfiCQZqUdOIYfr6eEeqR
Lv6: P4L4vucdmLnm8I7Vl7jG1ApGSfjYKqJU
lv7: z7WtoNQU2XfjmMtWA8u5rN4vzqu4v99S
lv8: TESKZC0XvTetK0S9xNwm25STk5iWrBvP

Level8~ 12(awk uniq sort tr..)

level8 查找不重复的行

题目要求在data.txt中找到唯一不重复的行。

因为linux命令不熟,所以一上手就想着用awk解决问题,思路比较简单,先用一个cache统计每行字段的出现次数,再从cache中找到count为1的字段,代码如下:

awk '{
    cache[$0] = cache[$0] + 1;
} END {
  for(s in cache) {
    if(cache[s]==1) {
      print s
      exit
    }
  }
}' ./data.txt

但看题目下面的提示,提到了uniqsort,查看uniq文档,虽然uniq可以统计词频,甚至直接显示仅出现一次的行,但当重复的行并不相邻时,uniq 命令是不起作用的,这样设计很好理解,若uniq可以处理不相邻的重复字段,那必然需要对整个文件字段进行缓存,这种操作显然是不太有利于流文件的处理,这种原子级的命令应优先考虑性能,功能可以通过命令之间的组合实现。因此要先用sort去对内容进行排序,最终代码如下:

sort ./data.txt | uniq -u

level9 在文件中密码

密码的条件:

  • 密码前面有几个"="
  • 密码是human readable的

不难写出如下代码:

grep -aoP "={2,}\s*\K[0-9a-zA-Z]+" ./data.txt

这里先要给grep加上-a指令符,因为data.txt中有二进制内容

Level 10密码经过了base64加密

base64 -d ./data.txt

Level 11 内容解码

这里题目比较难理解,所有字母旋转了13个位置,但通过cat ./data.txt查看文档,会发现文档内容如下:

Gur cnffjbeq vf WIAOOSFzMjXXBC0KoSKBbJ8puQm5lIEi

根据前面几题的结果,比较容易猜测前三个单词是The password is, 数字对的上,那么规则也比较好猜了,就是将a-z形成一个环形链表,这里的旋转指的是旋转环形链表的位置,注意这里说的是字母而非数字

用awk实现,代码如下:

awk '
  BEGIN {
    for(i=65;i<=122;i++) {
      ord[sprintf("%c", i)]=i
    }
  }
  function transform(str, offset) {
    cache=""
    len=length(str);
    for(i=1;i<=len;i++) {
      w=substr(str,i,1);
      word=w
      if(match(w,/[a-zA-Z]/)){
        n=ord[w]
        start=97;
        end=122;
        if(n>=65 && n<=90) {
          start=65;
          end=90;
        }
        count=n - offset;
        if(count<start) {
          count=end + (count-start + 1)
        }
        word=sprintf("%c", count)
      }
      cache=sprintf("%s%s", cache, word)
    }
    return cache
  }
  {
    offset=13;
    str=$0;
    transStr=transform(str, offset)
} END {
  print transStr
}' ./data.txt

awklinux命令不熟悉的人比较友好,但这么实现实在太长了。。。

关于awk脚本

一开始实现这段脚本的时候,以为awk后面接的脚本字符串,被awk解释器解析完之后会转换成shell或者c语言执行,所以下意识感觉sprintf基本规则和printf类似,因此字母转ASCII码想着通过word=sprintf("%d", "a")实现,但最后打印出来word是0。仔细一想awk解释器之所以是解释器,而不是编译器,是因为它并不会走完整的解析->遍历->编译的流程,应该是边解析边执行的,遇到sprintf或许会将其解析为printf行为,但遇到参数%d后,下一个参数走的应该是走的整数类型的解析,或许就是这里将非整数类型的对象直接转换成0了。

tr命令

用命令的话,tr命令可进行替换,思路差不多,先获取偏移后的字符串,再进行替换。。

cache=$(echo {a..z} | tr -d " ");
printf -v cache "${cache:13}${cache:0:13}";
cacheUpper=$(echo $cache | tr 'a-z' 'A-Z');
tr "[a-z][A-Z]" "[$cache][$cacheUpper]" < ./data.txt;

 lv9: EN632PlfYiZbn3PhVK3XOGSlNInNE00t
lv10: G7w8LIi6J3kTb8A7j9LgrywtEUlyyp6s
lv11: 6zPeziLdR2RKNdNYFNb6nVCKzphlXHBM
lv12: JVNBBFSmZwKKOP0XbFXOoW8chDz5yVRv

以上就是linux命令行bandit使用练习实战的详细内容,更多关于linux命令行bandit的资料请关注脚本之家其它相关文章!

相关文章

  • Shell脚本编程中常用的数学运算实例

    Shell脚本编程中常用的数学运算实例

    这篇文章主要介绍了Shell脚本编程中常用的数学运算实例,包含最基本的加减乘除,还有质数、偶数的判断等,需要的朋友可以参考下
    2014-06-06
  • rhel5.7下安装gearmand及启动的方法

    rhel5.7下安装gearmand及启动的方法

    这篇文章主要介绍了rhel5.7下安装gearmand及启动的方法,需要的朋友可以参考下
    2014-07-07
  • Shell中特殊字符的用法总结大全

    Shell中特殊字符的用法总结大全

    这篇文章主要给大家总结了关于Shell中特殊字符的相关资料,文中包括分好、&、#、!、$、大于号、单双引号等等一系列特殊字符的用法,通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-08-08
  • Shell脚本中if条件判断的写法实例

    Shell脚本中if条件判断的写法实例

    在写shell脚本的过程中,用到了if else的写法,突然有多个参数需要判断,那么就想到了if else if的用法,这篇文章主要给大家介绍了关于Shell脚本中if条件判断写法的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-01-01
  • shell模糊匹配与正则详解

    shell模糊匹配与正则详解

    这篇文章主要介绍了shell模糊匹配与正则详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • linux 中的atq命令

    linux 中的atq命令

    atq命令显示系统中待执行的任务列表,也就是列出当前用户的at任务列表。下面通过本文给大家分享linux 中的atq命令,感兴趣的朋友一起看看吧
    2017-09-09
  • bash脚本中$符号的具体使用

    bash脚本中$符号的具体使用

    $符号主要用于访问变量的值、参数扩展、算术运算以及命令替换等,本文主要介绍了bash脚本中$符号的具体使用,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • ubuntu修改terminal终端的主机名的实现方法

    ubuntu修改terminal终端的主机名的实现方法

    这篇文章主要介绍了ubuntu修改terminal终端的主机名的实现方法的相关资料,希望通过本文能帮助大家,需要的朋友可以参考下
    2017-08-08
  • Linux中mysqldump命令实例详解

    Linux中mysqldump命令实例详解

    mysqldump是mysql数据库中备份工具,用于将MYSQL服务器中的数据库以标准的sql语言的方式导出,并保存到文件中。今天通过本文给大家介绍mysqldump命令实例详解,一起看看吧
    2016-12-12
  • Spark-shell批量命令执行脚本的方法

    Spark-shell批量命令执行脚本的方法

    今天小编就为大家分享一篇Spark-shell批量命令执行脚本的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06

最新评论