一个类似 CTF 的练习 Linux 命令的网站
网站说不让剧透,包括写题解。我接下来说的东西我也不知道我在说什么。
对不上,对不上。
Level 8 → Level 9
目标
下一关的密码存放在 data.txt
文件中,并且是不重复的唯一一行。
解决这一关也许需要的命令
grep
, sort
, uniq
, strings
, base64
, tr
, tar
, gzip
, bzip2
, xxd
有帮助的阅读资料
我不知道我在说什么
这一关需要用到管道,将文件内容排序后去重即可
1$ cat data.txt | sort | uniq -u
其中 uniq -u
输出唯一的不重复的一行。
得到 flag
1UsvVyFSfZZWbi6wgC7dAFyFuR6jQQUhR
Level 9 → Level 10
目标
下一关的密码存储在文件 data.txt
中,是为数不多的可读字符串之一,前面有几个’=‘字符。
解决这一关也许需要的命令
grep
, sort
, uniq
, strings
, base64
, tr
, tar
, gzip
, bzip2
, xxd
我不知道我在说什么
这一关用 strings
命令,可将能阅读的字符串输出至标准输出。
1$ strings data.txt
之后很容易找到特征。
1...
2========== the*2i"4
3...
4========== password
5...
6Z)========== is
7...
8&========== truKLdjsbJ5g7yyJ2X2R0o3a5HQJFuLk
9...
所以,毫无疑问,答案就是这一串了。
1truKLdjsbJ5g7yyJ2X2R0o3a5HQJFuLk
Level 10 → Level 11
目标
下一关的密码存放在 data.txt
中,并且用 base64
方式加密。
解决这一关也许需要的命令
grep
, sort
, uniq
, strings
, base64
, tr
, tar
, gzip
, bzip2
, xxd
有帮助的阅读资料
我不知道我在说什么
这关只要解密 base64
即可
1$ base64 -d data.txt
用 -d
参数进行解密,否则默认是加密。
输出
1The password is IFukwKGsFW8MOq3IRFqrxE1hxTNEbUPR
显而易见,密码是
1IFukwKGsFW8MOq3IRFqrxE1hxTNEbUPR
Level 11 → Level 12
目标
下一关的密码存储在文件data.txt中,其中所有小写(a-z)和大写(A-Z)字母已经旋转了13个位置。
解决这一关也许需要的命令
grep
, sort
, uniq
, strings
, base64
, tr
, tar
, gzip
, bzip2
, xxd
有帮助的阅读资料
我不知道我在说什么
虽然这个题其实写个 C
或者用 Python
可能更方便那么一点点。。。
这个旋转13个位置实际上是一种简单的加密方法,指将前13个字母和后13个字母调换。
WikiPedia 甚至给出了解法,在 Linux 可以使用 tr
命令。
在此题中,将字母互相 map 出对应关系即可。
1# Map upper case A-Z to N-ZA-M and lower case a-z to n-za-m
2$ cat data.txt | tr 'A-Za-z' 'N-ZA-Mn-za-m'
输出
1The password is 5Te8Y4drgCRfCx8ugdwuEX8KFC6k2EUu
By the way,Wikipedia 中也给出了 Vim/Emacs 和 Python 的示例代码,将 Python 代码一并贴出
1import codecs
2a = "Gur cnffjbeq vf 5Gr8L4qetPEsPk8htqjhRK8XSP6x2RHh"
3print(codecs.decode(a, 'rot13'))
(我是 API Caller 我自豪)
Or
1#include <stdio.h>
2
3char* decodeRot13(const char* ori, char* ans)
4{
5 int i = 0;
6 while(ori[i] != '\0')
7 {
8 if(ori[i] >= 65 && ori[i] <= 77) // if character between A-M
9 // map to N-Z
10 ans[i] = ori[i] + 13;
11 else if(ori[i] >= 78 && ori[i] <= 90) //if between N-Z
12 // map to A-M
13 ans[i] = ori[i] - 13;
14 else if(ori[i] >= 97 && ori[i] <= 109) // if character between a-m
15 // map to n-z
16 ans[i] = ori[i] + 13;
17 else if(ori[i] >= 110 && ori[i] <= 122) //if between n-z
18 // map to a-m
19 ans[i] = ori[i] - 13;
20 else
21 {
22 ans[i] = ori[i];
23 }
24
25
26 i++;
27
28 }
29 ans[i] = '\0';
30 return ans;
31}
32
33int main()
34{
35 char ori[] = "Gur cnffjbeq vf 5Gr8L4qetPEsPk8htqjhRK8XSP6x2RHh";
36 char ans[100];
37 decodeRot13(ori,ans);
38
39 printf("%s\n",ans);
40 return 0;
41}
其实我不当 API Caller 也是可以的(
Anyway,密码是
15Te8Y4drgCRfCx8ugdwuEX8KFC6k2EUu
Level 12 → Level 13
目标
下一关的密码存储在文件data.txt中,这是一个经过反复压缩的文件的十六进制转储。对于这一关,在/tmp下创建一个目录可能是有用的,你可以使用mkdir
在其中工作。例如: mkdir /tmp/myname123
。然后用cp
复制数据文件,用mv
重命名它(请阅读手册!)
解决这一关也许需要的命令
grep
, sort
, uniq
, strings
, base64
, tr
, tar
, gzip
, bzip2
, xxd
, mkdir
, cp
, mv
, file
有帮助的阅读资料
我不知道我在说什么
按照说明,我们需要创建一个文件夹,Banner 中已经给出,用mktemp -d
1$ mktemp -d
2/tmp/tmp.0CC45KW14Z
首先给出的是一个 Hexdump 文本,用 xxd
命令将其重新打包为二进制文件
1$ xxd -r < data.txt > /tmp/tmp.0CC45KW14Z/output
然后我们看一下文件类型
1$ cd /tmp/tmp.0CC45KW14Z
2$ file output
显示为 gzip
压缩后的文件
1output: gzip compressed data, was "data2.bin", last modified: Thu May 7 18:14:30 2020, max compression, from Unix
再解压看看
1$ mv output data2.bin.gz
2$ gunzip data2.bin
还就那个套娃
1$ file data2.bin
2data2.bin: bzip2 compressed data, block size = 900k
3$ mv data2.bin data2.bin.bz2
4$ bunzip2 data2.bin.bz2
5$ file data2.bin
6data2.bin: bzip2 compressed data, block size = 900k
7$ mv data2.bin data2.bin.gz
8$ gunzip data2.bin.gz
9$ file data2.bin
10data2.bin: POSIX tar archive (GNU)
11$ mv data2.bin data2.tar
12$ tar -xvf data2.tar
13$ file data5.bin
14data5.bin: POSIX tar archive (GNU)
15$ tar -xvf data5.tar
16$ file data6.bin
17data6.bin: bzip2 compressed data, block size = 900k
18$ mv data6.bin data6.bin.bz2
19$ bunzip2 data6.bin.bz2
20$ file data6.bin
21data6.bin: POSIX tar archive (GNU)
22$ mv data6.bin data6.tar
23$ tar -xvf data6.tar
24$ file data8.bin
25data8.bin: gzip compressed data, was "data9.bin", last modified: Thu May 7 18:14:30 2020, max compression, from Unix
26$ mv data8.bin data8.bin.gz
27$ gunzip data8.bin.gz
28$ file data8.bin
29data8.bin: ASCII text
WOW! Finally!
1$ cat data8.bin
2The password is 8ZjyCRiBWFYkneahHwxCv3wb2a1ORpYL
单纯为这道题其实可以用脚本搞定,不过我懒,就不写了。
所以密码就是
18ZjyCRiBWFYkneahHwxCv3wb2a1ORpYL
Level 13 → Level 14
目标
下一层的密码存储在/etc/bandit_pass/bandit14
中,只有用户bandit14
才能读取。对于这一层,你不会得到下一层的密码,但你会得到一个私有的 SSH 密钥,可以用来登录下一层。注意:localhost是指你正在工作的机器的主机名。
解决这一关也许需要的命令
ssh
, telnet
, nc
, openssl
, s_client
, nmap
有帮助的阅读资料
我不知道我在说什么
总算来点不一样的东西了!
他直接把私钥给我们了。直接登录好了
把给的私钥复制到本机,然后登录
1$ vim sshkey.private
2$ chmod 600 sshkey.private
3$ ssh -i sshkey.private [email protected] -p 2220
登进来直接 cat
就好了
拿到 flag
14wcYUJFw0k0XLShlDzztnTBHiqxU3b3e
Level 14 → Level 15
目标
通过向localhost上的30000端口提交当前级别的密码,可以找回下一级别的密码。
解决这一关也许需要的命令
ssh
, telnet
, nc
, openssl
, s_client
, nmap
有帮助的阅读资料
- How the Internet works in 5 minutes (YouTube) (Not completely accurate, but good enough for beginners)
- IP Addresses
- IP Address on Wikipedia
- Localhost on Wikipedia
- Ports
- Port (computer networking) on Wikipedia
我不知道我在说什么
说到底,这一关要向上发一个数据包
单纯掌握 nc
命令罢了,对 CTF 但凡有一点点了解应该也知道这个
1$ echo 4wcYUJFw0k0XLShlDzztnTBHiqxU3b3e | nc localhost 30000
2Correct!
3BfMYroe26WYalil77FoDi9qh59eK5xNr
就这么简单,flag为
1BfMYroe26WYalil77FoDi9qh59eK5xNr
Level 15 → Level 16
目标
通过SSL加密向localhost上的30001端口提交当前级别的密码,可以找回下一级别的密码。
帮助说明:获得 HEARTBEATING
和 Read R BLOCK
?使用-ign_eof
并阅读man
手册中的 CONNECTED COMMANDS
部分。在 R
和 Q
旁边,B
命令在这个版本的命令中也可以使用……
解决这一关也许需要的命令
ssh
, telnet
, nc
, openssl
, s_client
, nmap
有帮助的阅读资料
我不知道我在说什么
其实提示已经给的太多了。
要用openssl
连接远端
1$ echo BfMYroe26WYalil77FoDi9qh59eK5xNr | openssl s_client -connect localhost:30001 -ign_eof
-ign_eof
指当远端发送 EOF
信号后自动断开连接
忽略一大堆输出之后,给了我们密码
1Correct!
2cluFn7wTiGryunymYOu4RcffSxQluehd
3
4closed
所以密码就是
1cluFn7wTiGryunymYOu4RcffSxQluehd
Level 16 → Level 17
目标
通过向 localhost
上 31000 到 32000 范围内的端口提交当前级别的密码,就可以获取下一级别的凭证。首先找出这些端口中哪些有服务器在监听。然后找出其中哪些使用SSL,哪些不使用。只有 1 台服务器会给出下一个凭证,其他服务器只会把你发给它的任何东西回传给你。
解决这一关也许需要的命令
ssh
, telnet
, nc
, openssl
, s_client
, nmap
有帮助的阅读资料
我不知道我在说什么
毫无疑问,这关要扫描端口了。终于该 nmap
出场了
1$ nmap -sV -p31000-32000 localhost
2
3Starting Nmap 7.40 ( https://nmap.org ) at 2020-12-02 16:11 CET
4Nmap scan report for localhost (127.0.0.1)
5Host is up (0.00032s latency).
6Not shown: 996 closed ports
7PORT STATE SERVICE VERSION
831046/tcp open echo
931518/tcp open ssl/echo
1031691/tcp open echo
1131790/tcp open ssl/unknown
1231960/tcp open echo
131 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
14SF-Port31790-TCP:V=7.40%T=SSL%I=7%D=12/2%Time=5FC7AEBB%P=x86_64-pc-linux-g
15SF:nu%r(GenericLines,31,"Wrong!\x20Please\x20enter\x20the\x20correct\x20cu
16SF:rrent\x20password\n")%r(GetRequest,31,"Wrong!\x20Please\x20enter\x20the
17SF:\x20correct\x20current\x20password\n")%r(HTTPOptions,31,"Wrong!\x20Plea
18SF:se\x20enter\x20the\x20correct\x20current\x20password\n")%r(RTSPRequest,
19SF:31,"Wrong!\x20Please\x20enter\x20the\x20correct\x20current\x20password\
20SF:n")%r(Help,31,"Wrong!\x20Please\x20enter\x20the\x20correct\x20current\x
21SF:20password\n")%r(SSLSessionReq,31,"Wrong!\x20Please\x20enter\x20the\x20
22SF:correct\x20current\x20password\n")%r(TLSSessionReq,31,"Wrong!\x20Please
23SF:\x20enter\x20the\x20correct\x20current\x20password\n")%r(Kerberos,31,"W
24SF:rong!\x20Please\x20enter\x20the\x20correct\x20current\x20password\n")%r
25SF:(FourOhFourRequest,31,"Wrong!\x20Please\x20enter\x20the\x20correct\x20c
26SF:urrent\x20password\n")%r(LPDString,31,"Wrong!\x20Please\x20enter\x20the
27SF:\x20correct\x20current\x20password\n")%r(LDAPSearchReq,31,"Wrong!\x20Pl
28SF:ease\x20enter\x20the\x20correct\x20current\x20password\n")%r(SIPOptions
29SF:,31,"Wrong!\x20Please\x20enter\x20the\x20correct\x20current\x20password
30SF:\n");
31
32Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
33Nmap done: 1 IP address (1 host up) scanned in 90.07 seconds
扫了好一会才结束
这样可以看出只有 31790 端口比较可疑
直接连接
1$ echo cluFn7wTiGryunymYOu4RcffSxQluehd | openssl s_client -connect localhost:31790 -ign_eof
1Correct!
2-----BEGIN RSA PRIVATE KEY-----
3MIIEogIBAAKCAQEAvmOkuifmMg6HL2YPIOjon6iWfbp7c3jx34YkYWqUH57SUdyJ
4imZzeyGC0gtZPGujUSxiJSWI/oTqexh+cAMTSMlOJf7+BrJObArnxd9Y7YT2bRPQ
5Ja6Lzb558YW3FZl87ORiO+rW4LCDCNd2lUvLE/GL2GWyuKN0K5iCd5TbtJzEkQTu
6DSt2mcNn4rhAL+JFr56o4T6z8WWAW18BR6yGrMq7Q/kALHYW3OekePQAzL0VUYbW
7JGTi65CxbCnzc/w4+mqQyvmzpWtMAzJTzAzQxNbkR2MBGySxDLrjg0LWN6sK7wNX
8x0YVztz/zbIkPjfkU1jHS+9EbVNj+D1XFOJuaQIDAQABAoIBABagpxpM1aoLWfvD
9KHcj10nqcoBc4oE11aFYQwik7xfW+24pRNuDE6SFthOar69jp5RlLwD1NhPx3iBl
10J9nOM8OJ0VToum43UOS8YxF8WwhXriYGnc1sskbwpXOUDc9uX4+UESzH22P29ovd
11d8WErY0gPxun8pbJLmxkAtWNhpMvfe0050vk9TL5wqbu9AlbssgTcCXkMQnPw9nC
12YNN6DDP2lbcBrvgT9YCNL6C+ZKufD52yOQ9qOkwFTEQpjtF4uNtJom+asvlpmS8A
13vLY9r60wYSvmZhNqBUrj7lyCtXMIu1kkd4w7F77k+DjHoAXyxcUp1DGL51sOmama
14+TOWWgECgYEA8JtPxP0GRJ+IQkX262jM3dEIkza8ky5moIwUqYdsx0NxHgRRhORT
158c8hAuRBb2G82so8vUHk/fur85OEfc9TncnCY2crpoqsghifKLxrLgtT+qDpfZnx
16SatLdt8GfQ85yA7hnWWJ2MxF3NaeSDm75Lsm+tBbAiyc9P2jGRNtMSkCgYEAypHd
17HCctNi/FwjulhttFx/rHYKhLidZDFYeiE/v45bN4yFm8x7R/b0iE7KaszX+Exdvt
18SghaTdcG0Knyw1bpJVyusavPzpaJMjdJ6tcFhVAbAjm7enCIvGCSx+X3l5SiWg0A
19R57hJglezIiVjv3aGwHwvlZvtszK6zV6oXFAu0ECgYAbjo46T4hyP5tJi93V5HDi
20Ttiek7xRVxUl+iU7rWkGAXFpMLFteQEsRr7PJ/lemmEY5eTDAFMLy9FL2m9oQWCg
21R8VdwSk8r9FGLS+9aKcV5PI/WEKlwgXinB3OhYimtiG2Cg5JCqIZFHxD6MjEGOiu
22L8ktHMPvodBwNsSBULpG0QKBgBAplTfC1HOnWiMGOU3KPwYWt0O6CdTkmJOmL8Ni
23blh9elyZ9FsGxsgtRBXRsqXuz7wtsQAgLHxbdLq/ZJQ7YfzOKU4ZxEnabvXnvWkU
24YOdjHdSOoKvDQNWu6ucyLRAWFuISeXw9a/9p7ftpxm0TSgyvmfLF2MIAEwyzRqaM
2577pBAoGAMmjmIJdjp+Ez8duyn3ieo36yrttF5NSsJLAbxFpdlc1gvtGCWW+9Cq0b
26dxviW8+TFVEBl1O4f7HVm6EpTscdDxU+bCXWkfjuRb7Dy9GOtt9JPsX8MBTakzh3
27vBgsyi/sN3RqRBcGU40fOoZyfAMT8s1m/uYv52O6IgeuZ/ujbjY=
28-----END RSA PRIVATE KEY-----
29
30closed
拿到了一个 SSH 私钥
嘛,也就相当于我们拿到密码了吧。
贴下面
1-----BEGIN RSA PRIVATE KEY-----
2MIIEogIBAAKCAQEAvmOkuifmMg6HL2YPIOjon6iWfbp7c3jx34YkYWqUH57SUdyJ
3imZzeyGC0gtZPGujUSxiJSWI/oTqexh+cAMTSMlOJf7+BrJObArnxd9Y7YT2bRPQ
4Ja6Lzb558YW3FZl87ORiO+rW4LCDCNd2lUvLE/GL2GWyuKN0K5iCd5TbtJzEkQTu
5DSt2mcNn4rhAL+JFr56o4T6z8WWAW18BR6yGrMq7Q/kALHYW3OekePQAzL0VUYbW
6JGTi65CxbCnzc/w4+mqQyvmzpWtMAzJTzAzQxNbkR2MBGySxDLrjg0LWN6sK7wNX
7x0YVztz/zbIkPjfkU1jHS+9EbVNj+D1XFOJuaQIDAQABAoIBABagpxpM1aoLWfvD
8KHcj10nqcoBc4oE11aFYQwik7xfW+24pRNuDE6SFthOar69jp5RlLwD1NhPx3iBl
9J9nOM8OJ0VToum43UOS8YxF8WwhXriYGnc1sskbwpXOUDc9uX4+UESzH22P29ovd
10d8WErY0gPxun8pbJLmxkAtWNhpMvfe0050vk9TL5wqbu9AlbssgTcCXkMQnPw9nC
11YNN6DDP2lbcBrvgT9YCNL6C+ZKufD52yOQ9qOkwFTEQpjtF4uNtJom+asvlpmS8A
12vLY9r60wYSvmZhNqBUrj7lyCtXMIu1kkd4w7F77k+DjHoAXyxcUp1DGL51sOmama
13+TOWWgECgYEA8JtPxP0GRJ+IQkX262jM3dEIkza8ky5moIwUqYdsx0NxHgRRhORT
148c8hAuRBb2G82so8vUHk/fur85OEfc9TncnCY2crpoqsghifKLxrLgtT+qDpfZnx
15SatLdt8GfQ85yA7hnWWJ2MxF3NaeSDm75Lsm+tBbAiyc9P2jGRNtMSkCgYEAypHd
16HCctNi/FwjulhttFx/rHYKhLidZDFYeiE/v45bN4yFm8x7R/b0iE7KaszX+Exdvt
17SghaTdcG0Knyw1bpJVyusavPzpaJMjdJ6tcFhVAbAjm7enCIvGCSx+X3l5SiWg0A
18R57hJglezIiVjv3aGwHwvlZvtszK6zV6oXFAu0ECgYAbjo46T4hyP5tJi93V5HDi
19Ttiek7xRVxUl+iU7rWkGAXFpMLFteQEsRr7PJ/lemmEY5eTDAFMLy9FL2m9oQWCg
20R8VdwSk8r9FGLS+9aKcV5PI/WEKlwgXinB3OhYimtiG2Cg5JCqIZFHxD6MjEGOiu
21L8ktHMPvodBwNsSBULpG0QKBgBAplTfC1HOnWiMGOU3KPwYWt0O6CdTkmJOmL8Ni
22blh9elyZ9FsGxsgtRBXRsqXuz7wtsQAgLHxbdLq/ZJQ7YfzOKU4ZxEnabvXnvWkU
23YOdjHdSOoKvDQNWu6ucyLRAWFuISeXw9a/9p7ftpxm0TSgyvmfLF2MIAEwyzRqaM
2477pBAoGAMmjmIJdjp+Ez8duyn3ieo36yrttF5NSsJLAbxFpdlc1gvtGCWW+9Cq0b
25dxviW8+TFVEBl1O4f7HVm6EpTscdDxU+bCXWkfjuRb7Dy9GOtt9JPsX8MBTakzh3
26vBgsyi/sN3RqRBcGU40fOoZyfAMT8s1m/uYv52O6IgeuZ/ujbjY=
27-----END RSA PRIVATE KEY-----
Level 17 → Level 18
目标
家目录中有2个文件:passwords.old和passwords.new。下一级的密码在 passwords.new 中,是 passwords.old 和 passwords.new 之间唯一被修改的一行。
注意:如果你解决了这一关,在尝试登录 bandit18 时看到’Byebye!’,这与下一关 bandit19 有关。
解决这一关也许需要的命令
cat
, grep
, ls
, diff
我不知道我在说什么
一个 diff
解决战斗
1$ diff passwords.new passwords.old
242c42
3< kfBf3eYk5BPBRzwjqutbbfE887SVc5Yd
4---
5> w0Yfolrc5bwjS4qw5mq1nnQi6mF03bii
得到 Key 为
1kfBf3eYk5BPBRzwjqutbbfE887SVc5Yd
Level 18 → Level 19
目标
下一级的密码存储在家目录里的readme文件中。不幸的是,有人修改了.bashrc
,当你用 SSH 登录时,会将你注销。
解决这一关也许需要的命令
ssh
, ls
, cat
我不知道我在说什么
SSH连接的时候是可以带上命令的,所以就很简单了
1$ ssh [email protected] -p 2220 cat readme
2This is a OverTheWire game server. More information on http://www.overthewire.org/wargames
3
4[email protected]'s password:
5IueksS7Ubh8G3DCwVzrTd8rAVOwq3M5x
得到 Key 为
1IueksS7Ubh8G3DCwVzrTd8rAVOwq3M5x
Level 19 → Level 20
目标
为了获得下一级别的访问权限,你应该使用家目录中的setuid
二进制文件。在没有参数的情况下执行它以了解如何使用它。在使用了setuid
二进制文件之后,可以在通常的地方 (/etc/bandit_pass) 找到这一层的密码。
有帮助的阅读资料
我不知道我在说什么
我们先执行一下
1$ ./bandit20-do
2Run a command as another user.
3 Example: ./bandit20-do id
很有意思,可以以其他用户身份执行命令
这里有一个知识点,setuid
setuid
和 setgid
是一种特殊权限,可以使用拥有者的权限去执行。
因此,./bandit20-do id
输出
1./bandit20-do id
2uid=11019(bandit19) gid=11019(bandit19) euid=11020(bandit20) groups=11019(bandit19)
因此可以轻松得到密码
1$ ./bandit20-do cat /etc/bandit_pass/bandit20
2GbKksEFF4yrVs6il55v6gwY5aVje5f0j
密码为
1GbKksEFF4yrVs6il55v6gwY5aVje5f0j
Level 20 → Level 21
目标
在家目录中有一个 setuid 二进制文件,它的作用是:在你指定的命令行参数的端口上与 localhost 建立一个连接。然后,它从连接中读取一行文本,并将其与上一级的密码 (bandit20) 进行比较。如果密码正确,它将传输下一级别的密码(bandit21)。
注意:尝试连接到你自己的网络守护进程,看看它是否如你所想的那样工作。
解决这一关也许需要的命令
ssh
nc
cat
bash
screen
tmux
Unix 'job control' (bg,fg,&,CTRL-Z)
我不知道我在说什么
这关挺有意思的
nc
命令可以充当服务器进行监听,但显然我们不能在同一个终端里开两个程序。所以我们需要一些辅助手段。
screen
命令可以轻松完成这个工作。当然也给出了 tmux
也是 OK 的。
关于这个命令我看过一篇非常好的文章,是 IBM Developer 上放出的Linux 技巧:使用 screen 管理你的远程会话,我当年是看这篇文章学会使用这个命令的。这篇文章现在不特地搜索的话已经不会出现在搜索引擎前几页了。虽然 tmux
真的很高端就是了……
Anyway,来看过程
我们需要新建一个会话来运行 nc
接收并发送数据。因此
1$ screen -S nc
打开一个新会话,然后运行 nc
1$ nc -l -p 33333
然后把上一关的密码粘贴进去
现在 C-a d
返回我们原来的会话,运行
1$ ./suconnect 33333
他读到了数据。
1bandit20@bandit:~$ ./suconnect 33333
2Read: GbKksEFF4yrVs6il55v6gwY5aVje5f0j
3Password matches, sending next password
进到我们创建的会话找密码吧
1$ screen -r nc
2$$ nc -l -p 33333
3GbKksEFF4yrVs6il55v6gwY5aVje5f0j
4gE269g2h3mw3pwgrj0Ha9Uoqen1c9DGr
得到密码!
1gE269g2h3mw3pwgrj0Ha9Uoqen1c9DGr
Level 21 → Level 22
目标
计划任务管理器 cron 每隔一段时间就会自动运行一个程序。在 /etc/cron.d/ 中查看配置,看看正在执行什么命令。
解决这一关也许需要的命令
cron
, crontab
, crontab(5)
(用 man 5 crontab
来查看)
我不知道我在说什么
说来惭愧,我知道 cron
计划任务很有用,但我真的从来没用过。
我眼前唯一能想到的就是写个脚本自动续证书,但是在服务器端用 Caddy
做反向代理之后连这个需求也没了。
其实这道题根本不需要对 cron
有什么了解,因为题目已经把需要的都告诉你了。
1bandit21@bandit:~$ ls -l /etc/cron.d/
2total 24
3-rw-r--r-- 1 root root 62 May 14 2020 cronjob_bandit15_root
4-rw-r--r-- 1 root root 62 Jul 11 15:56 cronjob_bandit17_root
5-rw-r--r-- 1 root root 120 May 7 2020 cronjob_bandit22
6-rw-r--r-- 1 root root 122 May 7 2020 cronjob_bandit23
7-rw-r--r-- 1 root root 120 May 14 2020 cronjob_bandit24
8-rw-r--r-- 1 root root 62 May 14 2020 cronjob_bandit25_root
9bandit21@bandit:~$ cat /etc/cron.d/cronjob_bandit22
10@reboot bandit22 /usr/bin/cronjob_bandit22.sh &> /dev/null
11* * * * * bandit22 /usr/bin/cronjob_bandit22.sh &> /dev/null
12bandit21@bandit:~$ cat /usr/bin/cronjob_bandit22.sh
13#!/bin/bash
14chmod 644 /tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv
15cat /etc/bandit_pass/bandit22 > /tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv
16bandit21@bandit:~$ cat /tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv
17Yk7owGAcWjwMVRwrTesJEwB7WVOiILLI
追查一路直接拿到密码。
1Yk7owGAcWjwMVRwrTesJEwB7WVOiILLI
Level 22 → Level 23
目标
计划任务管理器 cron
每隔一段时间就会自动运行一个程序。在 /etc/cron.d/ 中查看配置,看看正在执行什么命令。
注意:看别人写的shell脚本是一项非常有用的技能。本关的脚本是故意让人容易阅读的。如果你在理解它的作用方面有问题,可以试着执行它,看看它打印的调试信息。
解决这一关也许需要的命令
cron
, crontab
, crontab(5)
(用 man 5 crontab
来查看)
我不知道我在说什么
追查一路,发现一个脚本
1bandit22@bandit:~$ ls /etc/cron.d
2cronjob_bandit15_root cronjob_bandit22 cronjob_bandit24
3cronjob_bandit17_root cronjob_bandit23 cronjob_bandit25_root
4bandit22@bandit:~$ cat /etc/cron.d/cronjob_bandit23
5@reboot bandit23 /usr/bin/cronjob_bandit23.sh &> /dev/null
6* * * * * bandit23 /usr/bin/cronjob_bandit23.sh &> /dev/null
7bandit22@bandit:~$ cat /usr/bin/cronjob_bandit23.sh
8#!/bin/bash
9
10myname=$(whoami)
11mytarget=$(echo I am user $myname | md5sum | cut -d ' ' -f 1)
12
13echo "Copying passwordfile /etc/bandit_pass/$myname to /tmp/$mytarget"
14
15cat /etc/bandit_pass/$myname > /tmp/$mytarget
这就非常简单了,我们模拟一下好了,当然用户名字应该是 bandit23
1bandit22@bandit:~$ echo I am user bandit23 | md5sum | cut -d ' ' -f 1
28ca319486bfbbc3663ea0fbe81326349
3bandit22@bandit:~$ cat /tmp/8ca319486bfbbc3663ea0fbe81326349
4jc1udXuA1tiHqjIsL8yaapX5XIAI6i0n
直接到手!
1jc1udXuA1tiHqjIsL8yaapX5XIAI6i0n
Level 23 → Level 24
目标
基于时间的作业调度器cron每隔一段时间就会自动运行一个程序。在/etc/cron.d/中查看配置,看看正在执行什么命令。
注意:这一关需要你创建自己的第一个shell-script,这是一个非常大的步骤,你应该在/etc/cron.d/中查看配置,看看正在执行什么命令。这是非常重要的一步,当你通过这一关时,你应该为自己感到骄傲。
注意2: 记住你的shell脚本一旦执行就会被删除,所以你可能想保留一份副本……
解决这一关也许需要的命令
cron
, crontab
, crontab(5)
(用 man 5 crontab
来查看)
我不知道我在说什么
1bandit23@bandit:~$ cat /etc/cron.d/cronjob_bandit24
2@reboot bandit24 /usr/bin/cronjob_bandit24.sh &> /dev/null
3* * * * * bandit24 /usr/bin/cronjob_bandit24.sh &> /dev/null
4bandit23@bandit:~$ cat /usr/bin/cronjob_bandit24.sh
5#!/bin/bash
6
7myname=$(whoami)
8
9cd /var/spool/$myname
10echo "Executing and deleting all scripts in /var/spool/$myname:"
11for i in * .*;
12do
13 if [ "$i" != "." -a "$i" != ".." ];
14 then
15 echo "Handling $i"
16 owner="$(stat --format "%U" ./$i)"
17 if [ "${owner}" = "bandit23" ]; then
18 timeout -s 9 60 ./$i
19 fi
20 rm -f ./$i
21 fi
22done
23bandit23@bandit:~$ ls -ld /var/spool/bandit24
24drwxrwx-wx 43 root bandit24 4096 Dec 3 16:04 /var/spool/bandit24
最有意思的莫过于给写权限却不给读权限。
Anyway,这个必须写脚本。
目的是用脚本让 bandit24
用户执行脚本,就可以将密码输出给我了。
创建一个工作目录吧,然后脚本写起来。
1$ mktemp -d
2/tmp/tmp.vcwnLe4j7i
3$ cd /tmp/tmp.vcwnLe4j7i
创建一个脚本,以及一个输出文件
1$ touch password
2$ vim getpass.sh
3$ chmod 777 getpass.sh
4# change the directory permissions
5$ chmod 777 .
6$ cp getpass.sh /var/spool/bandit24
脚本如下
1#!/bin/bash
2
3cat /etc/bandit_pass/bandit24 > /tmp/tmp.vcwnLe4j7i/password
把密码输出
1$ cat password
2UoMYTrfrBFHyQXmg6gzctqAwOmw1IohZ
得到密码
1UoMYTrfrBFHyQXmg6gzctqAwOmw1IohZ
Level 24 → Level 25
目标
一个守护进程在端口30002上监听,如果给了bandit24的密码和一个秘密的4位数字密码,就会给你bandit25的密码。除了通过所有的10000个组合,也就是所谓的蛮力逼迫,是没有办法获取密码的。
评论