Wargames与bash知识12
Bandit20
关卡提示:
主目录中有一个setuid二进制文件,它执行以下操作:它在您指定为命令行参数的端口上连接到localhost。然后,它从连接中读取一行文本,并将其与前一级别的密码(bandit20)进行比较。如果密码正确,它将传输下一级别(bandit21)的密码。
注意:试着连接到您自己的网络守护程序,看看它是否如您所想的那样工作
推荐命令:
ssh, nc, cat, bash, screen, tmux, Unix ‘job control’ (bg, fg, jobs, &, CTRL-Z, …)
有没有觉得的这个关卡有点眼熟:某个关卡我们使用nc给一个端口(好像是30000)发送一个字符串,然后服务器给回复一个密码。这个关卡是展现服务器端是如何实现的吧,不过细究的还有有很大的区别:那个关卡回复是自动的,但在这个关卡我们需要手动运行一个程序才能实现。
Nc的命令前面已经谈过了,就不再复述。
解决这个问题需要使用两个终端,咱们继续使用windows的wls2子系统unbuntu来做演示。
使用ssh登录服务器
g
yj@guyanjun:~$ ssh -l bandit20 -p 2220 bandit.labs.overthewire.org
The authenticity of host '[bandit.labs.overthewire.org]:2220 ([51.20.13.48]:2220)' can't be established.
ECDSA key fingerprint is SHA256:IJ7FrX0mKSSHTJ63ezxjqtnOE0Hg116Aq+v5mN0+HdE.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[bandit.labs.overthewire.org]:2220,[51.20.13.48]:2220' (ECDSA) to the list of known hosts.
_ _ _ _
| |__ __ _ _ __ __| (_) |_
| '_ \ / _` | '_ \ / _` | | __|
| |_) | (_| | | | | (_| | | |_
|_.__/ \__,_|_| |_|\__,_|_|\__|
This is an OverTheWire game server.
More information on http://www.overthewire.org/wargames
………
运行命令获得相关信息:
bandit20@bandit:~$ ./suconnect
Usage: ./suconnect <portnumber>
This program will connect to the given port on localhost using TCP. If it receives the correct password from the other side, the next password is transmitted back.
使用左边的终端向端口11000发送字符串(端口可以自行指定,注意不要使用知名端口),使用右边的终端运行./suconnect 11000命令获得所需密码
现在尝试发送一个错误是字符串看看会有什么报错
如果不喜欢使用的两个终端,可以尝试将nc放入后台
b
andit20@bandit:~$ nc -l 11000 <<< "VxCazJaVykI6W36BkBU0mJTCM8rR95XT" &
[1] 383771
bandit20@bandit:~$ ./suconnect 11000
Read: VxCazJaVykI6W36BkBU0mJTCM8rR95XT
Password matches, sending next password
NvEJF7oVjkddltPSrdKEFOllh9V1IBcq
[1]+ Done nc -l 11000 <<< "VxCazJaVykI6W36BkBU0mJTCM8rR95XT"
bandit20@bandit:~$
将linux命令放入后台的方法很简单,直接在命令结尾添加一个 & 符号。为演示效果,我使用while做了一个死循环。
gyj@guyanjun:~$ while true ; do sleep 200; done &
[1] 693
返回的信息:1 是任务后 693是进程号
可以使用jobs 查看后台运行的命令
gyj@guyanjun:~$ jobs
[1]+ 运行中 while true; do
sleep 200;
done &
可以使用kill %1或者 kill 693 “杀死”后台进程
gyj@guyanjun:~$ kill %1
gyj@guyanjun:~$ jobs
[1]+ 已终止 while true; do
sleep 200;
done
使用fg 任务号将命令放回前台
gyj@guyanjun:~$ fg
while true; do
sleep 200;
done
使用crtl-z 将命令暂停且放入后台
gyj@guyanjun:~$ fg
while true; do
sleep 200;
done
^Z
[1]+ 已停止 while true; do
sleep 200;
done
使用bg %1 恢复后台暂停的命令,使其在后台运行
gyj@guyanjun:~$ bg %1
[1]+ while true; do
sleep 200;
done &
这个技巧可以解决命令忘记放入后台的情况。
使用&将命令放入后台,如果关闭了shell终端,后台的命令也会退出。为了解决这个问题,可以使用 nohup命令
gyj@guyanjun:~$ nohup sleep 2000 &
[2] 1261
gyj@guyanjun:~$ nohup: 忽略输入并把输出追加到'nohup.out'
gyj@guyanjun:~$ nohup sleep 3000 >aa.out &
[3] 1264
gyj@guyanjun:~$ nohup: 忽略输入重定向错误到标准输出端
gyj@guyanjun:~$ nohup sleep 3000 &>aa.out &
[4] 1265
gyj@guyanjun:~$ jobs
[1] 运行中 while true; do
sleep 200;
done &
[2] 运行中 nohup sleep 2000 &
[3]- 运行中 nohup sleep 3000 > aa.out &
[4]+ 运行中 nohup sleep 3000 &> aa.out &
gyj@guyanjun:~$
请注意使用nohup需要将后台的进程的输出处理一下,shell退出以后,后台程序原本输出到屏幕的输出就无处可去了。